@itznexus/itznexus-cli 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/claude.d.ts +2 -0
- package/dist/commands/claude.js +142 -0
- package/dist/commands/claude.js.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/claude/normalize-events.d.ts +19 -0
- package/dist/lib/claude/normalize-events.js +158 -0
- package/dist/lib/claude/normalize-events.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { api } from "../lib/api.js";
|
|
4
|
+
import { printList, handleError } from "../lib/format.js";
|
|
5
|
+
import { normalizeClaudeEvents, } from "../lib/claude/normalize-events.js";
|
|
6
|
+
const BATCH_SIZE = 500;
|
|
7
|
+
// --- ingest ---
|
|
8
|
+
const ingestCommand = new Command("ingest")
|
|
9
|
+
.description("Ingest local Claude Code chat history into Nexus")
|
|
10
|
+
.option("--since <when>", "ISO date, duration like '24h', '7d', or 'last' (default). 'last' queries Nexus for the most recent event.", "last")
|
|
11
|
+
.option("--dry-run", "Normalize and count, do not push to API")
|
|
12
|
+
.option("--json", "Output as JSON")
|
|
13
|
+
.action(async (opts) => {
|
|
14
|
+
try {
|
|
15
|
+
const since = await resolveSince(opts.since);
|
|
16
|
+
if (!opts.json) {
|
|
17
|
+
console.log(chalk.dim(`Ingesting Claude Code events${since ? ` since ${since.toISOString()}` : " (full history)"}${opts.dryRun ? " [dry-run]" : ""}`));
|
|
18
|
+
}
|
|
19
|
+
let inserted = 0;
|
|
20
|
+
let skipped = 0;
|
|
21
|
+
let total = 0;
|
|
22
|
+
let batch = [];
|
|
23
|
+
const flush = async () => {
|
|
24
|
+
if (batch.length === 0)
|
|
25
|
+
return;
|
|
26
|
+
if (opts.dryRun) {
|
|
27
|
+
inserted += batch.length;
|
|
28
|
+
batch = [];
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const result = await api.post("/claude-events", { events: batch });
|
|
32
|
+
inserted += result.inserted;
|
|
33
|
+
skipped += result.skipped;
|
|
34
|
+
batch = [];
|
|
35
|
+
};
|
|
36
|
+
for await (const event of normalizeClaudeEvents({ since })) {
|
|
37
|
+
batch.push(event);
|
|
38
|
+
total++;
|
|
39
|
+
if (batch.length >= BATCH_SIZE) {
|
|
40
|
+
await flush();
|
|
41
|
+
if (!opts.json) {
|
|
42
|
+
process.stdout.write(chalk.dim(` pushed ${inserted}/${total}\r`));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
await flush();
|
|
47
|
+
const result = {
|
|
48
|
+
total,
|
|
49
|
+
inserted,
|
|
50
|
+
skipped,
|
|
51
|
+
dryRun: !!opts.dryRun,
|
|
52
|
+
since: since?.toISOString() ?? null,
|
|
53
|
+
};
|
|
54
|
+
if (opts.json) {
|
|
55
|
+
console.log(JSON.stringify(result, null, 2));
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
console.log(chalk.green("✓"), `${total} events normalized, ${inserted} inserted, ${skipped} skipped${opts.dryRun ? " (dry-run)" : ""}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
handleError(err);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
// --- events list ---
|
|
66
|
+
const eventsListCommand = new Command("list")
|
|
67
|
+
.description("List ingested Claude events")
|
|
68
|
+
.option("--session <claudeSessionId>", "Filter by Claude session ID")
|
|
69
|
+
.option("--project <projectTag>", "Filter by project tag")
|
|
70
|
+
.option("--since <iso>", "Filter to events occurred after this ISO date")
|
|
71
|
+
.option("--until <iso>", "Filter to events occurred before this ISO date")
|
|
72
|
+
.option("--limit <n>", "Max results (default 50, max 5000)", "50")
|
|
73
|
+
.option("--json", "Output as JSON")
|
|
74
|
+
.action(async (opts) => {
|
|
75
|
+
try {
|
|
76
|
+
const params = new URLSearchParams();
|
|
77
|
+
if (opts.session)
|
|
78
|
+
params.set("claudeSessionId", opts.session);
|
|
79
|
+
if (opts.project)
|
|
80
|
+
params.set("projectTag", opts.project);
|
|
81
|
+
if (opts.since)
|
|
82
|
+
params.set("since", opts.since);
|
|
83
|
+
if (opts.until)
|
|
84
|
+
params.set("until", opts.until);
|
|
85
|
+
params.set("limit", opts.limit);
|
|
86
|
+
const data = await api.get(`/claude-events?${params.toString()}`);
|
|
87
|
+
printList(data, [
|
|
88
|
+
{ key: "occurredAt", label: "When", width: 24 },
|
|
89
|
+
{ key: "eventType", label: "Type", width: 24 },
|
|
90
|
+
{ key: "projectTag", label: "Project", width: 18 },
|
|
91
|
+
{ key: "gitBranch", label: "Branch", width: 16 },
|
|
92
|
+
{ key: "claudeSessionId", label: "Session", width: 36 },
|
|
93
|
+
], opts);
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
handleError(err);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
const eventsGetCommand = new Command("get")
|
|
100
|
+
.description("Get a single Claude event")
|
|
101
|
+
.argument("<id>", "Claude event ID")
|
|
102
|
+
.option("--json", "Output as JSON")
|
|
103
|
+
.action(async (id, opts) => {
|
|
104
|
+
try {
|
|
105
|
+
const data = await api.get(`/claude-events/${id}`);
|
|
106
|
+
console.log(JSON.stringify(data, null, 2));
|
|
107
|
+
void opts;
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
handleError(err);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
const eventsCommand = new Command("events")
|
|
114
|
+
.description("Query ingested Claude events")
|
|
115
|
+
.addCommand(eventsListCommand)
|
|
116
|
+
.addCommand(eventsGetCommand);
|
|
117
|
+
// --- parent ---
|
|
118
|
+
export const claudeCommand = new Command("claude")
|
|
119
|
+
.description("Ingest and query Claude Code chat history")
|
|
120
|
+
.addCommand(ingestCommand)
|
|
121
|
+
.addCommand(eventsCommand);
|
|
122
|
+
// --- helpers ---
|
|
123
|
+
async function resolveSince(raw) {
|
|
124
|
+
if (raw === "last") {
|
|
125
|
+
// Ask Nexus for the most recent event we've already ingested.
|
|
126
|
+
const rows = await api.get("/claude-events?limit=1");
|
|
127
|
+
return rows.length > 0 ? new Date(rows[0].occurredAt) : undefined;
|
|
128
|
+
}
|
|
129
|
+
const durationMatch = raw.match(/^(\d+)([hdw])$/);
|
|
130
|
+
if (durationMatch) {
|
|
131
|
+
const n = Number(durationMatch[1]);
|
|
132
|
+
const unit = durationMatch[2];
|
|
133
|
+
const ms = unit === "h" ? 3600_000 : unit === "d" ? 86400_000 : 604800_000;
|
|
134
|
+
return new Date(Date.now() - n * ms);
|
|
135
|
+
}
|
|
136
|
+
const d = new Date(raw);
|
|
137
|
+
if (Number.isNaN(d.getTime())) {
|
|
138
|
+
throw new Error(`Invalid --since value: ${raw}. Use ISO date, '24h', '7d', or 'last'.`);
|
|
139
|
+
}
|
|
140
|
+
return d;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/commands/claude.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -21,6 +21,7 @@ import { pipelineCommand } from "./commands/pipeline.js";
|
|
|
21
21
|
import { userCommand } from "./commands/user.js";
|
|
22
22
|
import { schemaCommand } from "./commands/schema.js";
|
|
23
23
|
import { upworkCommand } from "./commands/agents/upwork.js";
|
|
24
|
+
import { claudeCommand } from "./commands/claude.js";
|
|
24
25
|
checkForUpdates();
|
|
25
26
|
const helpText = `ITzNexus CLI — operational commands for ITzAgency
|
|
26
27
|
|
|
@@ -39,6 +40,7 @@ CORE DOMAINS
|
|
|
39
40
|
page Manage pages (docs/notes)
|
|
40
41
|
pipeline View pipeline definitions
|
|
41
42
|
user Manage users
|
|
43
|
+
claude Ingest and query Claude Code chat history
|
|
42
44
|
|
|
43
45
|
AGENT DOMAINS
|
|
44
46
|
upwork Upwork agent commands
|
|
@@ -74,6 +76,7 @@ program.addCommand(interactionCommand);
|
|
|
74
76
|
program.addCommand(pageCommand);
|
|
75
77
|
program.addCommand(pipelineCommand);
|
|
76
78
|
program.addCommand(userCommand);
|
|
79
|
+
program.addCommand(claudeCommand);
|
|
77
80
|
// Agent domains
|
|
78
81
|
program.addCommand(upworkCommand);
|
|
79
82
|
// Base commands
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CACxE,CAAC;AACF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CACxE,CAAC;AACF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,eAAe,EAAE,CAAC;AAElB,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqChB,CAAC;AAEF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;KAC1B,IAAI,CAAC,UAAU,CAAC;KAChB,OAAO,CAAC,GAAG,CAAC,OAAiB,EAAE,eAAe,CAAC;KAC/C,aAAa,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AAEjD,eAAe;AACf,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;AACxC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;AACvC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,gBAAgB;AAChB,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,gBAAgB;AAChB,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type ClaudeEventInput = {
|
|
2
|
+
externalId: string;
|
|
3
|
+
eventType: "chat-message-user" | "chat-message-assistant" | "compact-boundary";
|
|
4
|
+
occurredAt: string;
|
|
5
|
+
projectTag: string | null;
|
|
6
|
+
cwd: string | null;
|
|
7
|
+
gitBranch: string | null;
|
|
8
|
+
claudeSessionId: string | null;
|
|
9
|
+
payload: unknown;
|
|
10
|
+
metadata: Record<string, unknown>;
|
|
11
|
+
};
|
|
12
|
+
export type NormalizeOptions = {
|
|
13
|
+
since?: Date;
|
|
14
|
+
onProgress?: (info: {
|
|
15
|
+
file: string;
|
|
16
|
+
events: number;
|
|
17
|
+
}) => void;
|
|
18
|
+
};
|
|
19
|
+
export declare function normalizeClaudeEvents(opts?: NormalizeOptions): AsyncGenerator<ClaudeEventInput>;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import readline from "node:readline";
|
|
5
|
+
const CLAUDE_PROJECTS_DIR = path.join(os.homedir(), ".claude", "projects");
|
|
6
|
+
const SLASH_CLEAR_PATTERN = /<command-name>\/clear<\/command-name>/;
|
|
7
|
+
function isSlashClearMessage(message) {
|
|
8
|
+
if (typeof message === "string")
|
|
9
|
+
return SLASH_CLEAR_PATTERN.test(message);
|
|
10
|
+
if (!message || typeof message !== "object")
|
|
11
|
+
return false;
|
|
12
|
+
const content = message.content;
|
|
13
|
+
if (typeof content === "string")
|
|
14
|
+
return SLASH_CLEAR_PATTERN.test(content);
|
|
15
|
+
if (Array.isArray(content)) {
|
|
16
|
+
return content.some((b) => {
|
|
17
|
+
if (typeof b === "string")
|
|
18
|
+
return SLASH_CLEAR_PATTERN.test(b);
|
|
19
|
+
if (b &&
|
|
20
|
+
typeof b === "object" &&
|
|
21
|
+
typeof b.text === "string") {
|
|
22
|
+
return SLASH_CLEAR_PATTERN.test(b.text);
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
function* walkJsonlFiles(dir) {
|
|
30
|
+
let entries;
|
|
31
|
+
try {
|
|
32
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
for (const entry of entries) {
|
|
38
|
+
const full = path.join(dir, entry.name);
|
|
39
|
+
if (entry.isDirectory()) {
|
|
40
|
+
yield* walkJsonlFiles(full);
|
|
41
|
+
}
|
|
42
|
+
else if (entry.isFile() && entry.name.endsWith(".jsonl")) {
|
|
43
|
+
yield full;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export async function* normalizeClaudeEvents(opts = {}) {
|
|
48
|
+
if (!fs.existsSync(CLAUDE_PROJECTS_DIR))
|
|
49
|
+
return;
|
|
50
|
+
for (const file of walkJsonlFiles(CLAUDE_PROJECTS_DIR)) {
|
|
51
|
+
let count = 0;
|
|
52
|
+
for await (const event of readJsonlFile(file, opts.since)) {
|
|
53
|
+
count++;
|
|
54
|
+
yield event;
|
|
55
|
+
}
|
|
56
|
+
if (opts.onProgress && count > 0) {
|
|
57
|
+
opts.onProgress({ file, events: count });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async function* readJsonlFile(file, since) {
|
|
62
|
+
const stream = fs.createReadStream(file, { encoding: "utf-8" });
|
|
63
|
+
const rl = readline.createInterface({ input: stream, crlfDelay: Infinity });
|
|
64
|
+
let yieldedAnyForSession = false;
|
|
65
|
+
for await (const line of rl) {
|
|
66
|
+
if (!line.trim())
|
|
67
|
+
continue;
|
|
68
|
+
let parsed;
|
|
69
|
+
try {
|
|
70
|
+
parsed = JSON.parse(line);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const isCompactBoundary = parsed.type === "system" && parsed.subtype === "compact_boundary";
|
|
76
|
+
const isChat = parsed.type === "user" || parsed.type === "assistant";
|
|
77
|
+
if (!isChat && !isCompactBoundary)
|
|
78
|
+
continue;
|
|
79
|
+
if (parsed.isMeta && !isCompactBoundary)
|
|
80
|
+
continue;
|
|
81
|
+
if (!parsed.uuid || !parsed.sessionId || !parsed.timestamp)
|
|
82
|
+
continue;
|
|
83
|
+
if (since && new Date(parsed.timestamp) < since)
|
|
84
|
+
continue;
|
|
85
|
+
if (!yieldedAnyForSession &&
|
|
86
|
+
parsed.type === "user" &&
|
|
87
|
+
isSlashClearMessage(parsed.message)) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const eventType = isCompactBoundary
|
|
91
|
+
? "compact-boundary"
|
|
92
|
+
: parsed.type === "user"
|
|
93
|
+
? "chat-message-user"
|
|
94
|
+
: "chat-message-assistant";
|
|
95
|
+
const payload = isCompactBoundary
|
|
96
|
+
? {
|
|
97
|
+
content: parsed.content ?? null,
|
|
98
|
+
logicalParentUuid: parsed.logicalParentUuid ?? null,
|
|
99
|
+
}
|
|
100
|
+
: {
|
|
101
|
+
message: parsed.message,
|
|
102
|
+
parentUuid: parsed.parentUuid ?? null,
|
|
103
|
+
promptId: parsed.promptId ?? null,
|
|
104
|
+
};
|
|
105
|
+
yieldedAnyForSession = true;
|
|
106
|
+
yield {
|
|
107
|
+
externalId: `claude:${parsed.sessionId}:${parsed.uuid}`,
|
|
108
|
+
eventType,
|
|
109
|
+
occurredAt: parsed.timestamp,
|
|
110
|
+
projectTag: deriveProjectTag(parsed.cwd),
|
|
111
|
+
cwd: parsed.cwd ?? null,
|
|
112
|
+
gitBranch: parsed.gitBranch && parsed.gitBranch !== "HEAD"
|
|
113
|
+
? parsed.gitBranch
|
|
114
|
+
: null,
|
|
115
|
+
claudeSessionId: parsed.sessionId,
|
|
116
|
+
payload: stripInvalidUnicode(payload),
|
|
117
|
+
metadata: stripInvalidUnicode({
|
|
118
|
+
version: parsed.version,
|
|
119
|
+
isSidechain: parsed.isSidechain ?? false,
|
|
120
|
+
userType: parsed.userType,
|
|
121
|
+
entrypoint: parsed.entrypoint,
|
|
122
|
+
sourceFile: path.basename(file),
|
|
123
|
+
}),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function deriveProjectTag(cwd) {
|
|
128
|
+
if (!cwd)
|
|
129
|
+
return null;
|
|
130
|
+
return path.basename(cwd) || null;
|
|
131
|
+
}
|
|
132
|
+
// Postgres jsonb cannot store NULL bytes (U+0000) in text — they cause
|
|
133
|
+
// "unsupported Unicode escape sequence" (22P05). Lone surrogates also break
|
|
134
|
+
// jsonb encoding. Strip both recursively before sending.
|
|
135
|
+
const NULL_BYTE = String.fromCharCode(0);
|
|
136
|
+
const NULL_BYTE_RE = new RegExp(NULL_BYTE, "g");
|
|
137
|
+
const LONE_HIGH_SURROGATE = /[\uD800-\uDBFF](?![\uDC00-\uDFFF])/g;
|
|
138
|
+
const LONE_LOW_SURROGATE = /(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g;
|
|
139
|
+
function stripInvalidUnicode(value) {
|
|
140
|
+
if (typeof value === "string") {
|
|
141
|
+
return value
|
|
142
|
+
.replace(NULL_BYTE_RE, "")
|
|
143
|
+
.replace(LONE_HIGH_SURROGATE, "")
|
|
144
|
+
.replace(LONE_LOW_SURROGATE, "");
|
|
145
|
+
}
|
|
146
|
+
if (Array.isArray(value)) {
|
|
147
|
+
return value.map(stripInvalidUnicode);
|
|
148
|
+
}
|
|
149
|
+
if (value && typeof value === "object") {
|
|
150
|
+
const out = {};
|
|
151
|
+
for (const [k, v] of Object.entries(value)) {
|
|
152
|
+
out[k] = stripInvalidUnicode(v);
|
|
153
|
+
}
|
|
154
|
+
return out;
|
|
155
|
+
}
|
|
156
|
+
return value;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=normalize-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-events.js","sourceRoot":"","sources":["../../../src/lib/claude/normalize-events.ts"],"names":[],"mappings":"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"}
|