@tekdi/coding-analytics 1.0.2 → 1.0.4
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/analysis/analysis-prompt.d.ts +97 -0
- package/dist/analysis/analysis-prompt.d.ts.map +1 -0
- package/dist/analysis/analysis-prompt.js +312 -0
- package/dist/analysis/analysis-prompt.js.map +1 -0
- package/dist/analysis/feedback-aggregator.d.ts +15 -0
- package/dist/analysis/feedback-aggregator.d.ts.map +1 -0
- package/dist/analysis/feedback-aggregator.js +142 -0
- package/dist/analysis/feedback-aggregator.js.map +1 -0
- package/dist/analysis/llm-provider.d.ts +9 -0
- package/dist/analysis/llm-provider.d.ts.map +1 -0
- package/dist/analysis/llm-provider.js +23 -0
- package/dist/analysis/llm-provider.js.map +1 -0
- package/dist/analysis/providers/claude-provider.d.ts +11 -0
- package/dist/analysis/providers/claude-provider.d.ts.map +1 -0
- package/dist/analysis/providers/claude-provider.js +74 -0
- package/dist/analysis/providers/claude-provider.js.map +1 -0
- package/dist/analysis/providers/gemini-provider.d.ts +11 -0
- package/dist/analysis/providers/gemini-provider.d.ts.map +1 -0
- package/dist/analysis/providers/gemini-provider.js +58 -0
- package/dist/analysis/providers/gemini-provider.js.map +1 -0
- package/dist/analysis/providers/openai-provider.d.ts +11 -0
- package/dist/analysis/providers/openai-provider.d.ts.map +1 -0
- package/dist/analysis/providers/openai-provider.js +66 -0
- package/dist/analysis/providers/openai-provider.js.map +1 -0
- package/dist/analysis/providers/parse-helper.d.ts +7 -0
- package/dist/analysis/providers/parse-helper.d.ts.map +1 -0
- package/dist/analysis/providers/parse-helper.js +27 -0
- package/dist/analysis/providers/parse-helper.js.map +1 -0
- package/dist/analysis/session-analyzer.d.ts +8 -0
- package/dist/analysis/session-analyzer.d.ts.map +1 -0
- package/dist/analysis/session-analyzer.js +115 -0
- package/dist/analysis/session-analyzer.js.map +1 -0
- package/dist/analysis/session-builder.d.ts +19 -0
- package/dist/analysis/session-builder.d.ts.map +1 -0
- package/dist/analysis/session-builder.js +174 -0
- package/dist/analysis/session-builder.js.map +1 -0
- package/dist/analysis/types.d.ts +94 -0
- package/dist/analysis/types.d.ts.map +1 -0
- package/dist/analysis/types.js +3 -0
- package/dist/analysis/types.js.map +1 -0
- package/dist/artifact-extractor.d.ts +55 -0
- package/dist/artifact-extractor.d.ts.map +1 -0
- package/dist/artifact-extractor.js +146 -0
- package/dist/artifact-extractor.js.map +1 -0
- package/dist/claude-hooks-receiver.d.ts +20 -0
- package/dist/claude-hooks-receiver.d.ts.map +1 -1
- package/dist/claude-hooks-receiver.js +402 -12
- package/dist/claude-hooks-receiver.js.map +1 -1
- package/dist/cli.js +242 -0
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +18 -0
- package/dist/config.js.map +1 -1
- package/dist/heartbeat.d.ts +12 -0
- package/dist/heartbeat.d.ts.map +1 -0
- package/dist/heartbeat.js +33 -0
- package/dist/heartbeat.js.map +1 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +16 -8
- package/dist/logger.js.map +1 -1
- package/package.json +8 -2
|
@@ -1,16 +1,56 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.ClaudeHooksReceiver = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
4
39
|
const enricher_1 = require("./enricher");
|
|
5
40
|
const batcher_1 = require("./batcher");
|
|
6
41
|
const config_1 = require("./config");
|
|
7
42
|
const logger_1 = require("./logger");
|
|
8
43
|
const queue_1 = require("./queue");
|
|
44
|
+
const artifact_extractor_1 = require("./artifact-extractor");
|
|
9
45
|
class ClaudeHooksReceiver {
|
|
10
46
|
constructor() {
|
|
11
47
|
// Lazy — only created if handleEvent (direct send) is used
|
|
12
48
|
this.enricher = null;
|
|
13
49
|
this.batcher = null;
|
|
50
|
+
// Extra events (claude_agent_responded / claude_agent_thought) produced by
|
|
51
|
+
// ingestTranscript() during mapEvent(); flushed by queueEvent/handleEvent
|
|
52
|
+
// alongside the primary event. Reset at the start of each call.
|
|
53
|
+
this.pendingTranscriptEvents = [];
|
|
14
54
|
this.config = config_1.Config.load();
|
|
15
55
|
}
|
|
16
56
|
getEnricher() {
|
|
@@ -25,25 +65,38 @@ class ClaudeHooksReceiver {
|
|
|
25
65
|
}
|
|
26
66
|
/** Fast path: map → filter → queue. Exits in <5ms. No network, no git. */
|
|
27
67
|
async queueEvent(hookType, eventData) {
|
|
68
|
+
this.pendingTranscriptEvents = [];
|
|
28
69
|
const event = this.mapEvent(hookType, eventData);
|
|
29
70
|
if (!event) {
|
|
30
71
|
logger_1.logger.warn('Unknown Claude hook type', { hookType });
|
|
31
72
|
return;
|
|
32
73
|
}
|
|
33
|
-
new queue_1.Queue()
|
|
34
|
-
|
|
74
|
+
const queue = new queue_1.Queue();
|
|
75
|
+
for (const e of this.pendingTranscriptEvents) {
|
|
76
|
+
queue.append(this.applyPrivacyFilters(e));
|
|
77
|
+
}
|
|
78
|
+
queue.append(this.applyPrivacyFilters(event));
|
|
79
|
+
logger_1.logger.debug('Claude event queued', { hookType, extraEvents: this.pendingTranscriptEvents.length });
|
|
35
80
|
}
|
|
36
81
|
async handleEvent(hookType, eventData) {
|
|
37
82
|
try {
|
|
38
83
|
logger_1.logger.debug('Received Claude hook event', { hookType, eventData });
|
|
84
|
+
this.pendingTranscriptEvents = [];
|
|
39
85
|
const event = this.mapEvent(hookType, eventData);
|
|
40
86
|
if (!event) {
|
|
41
87
|
logger_1.logger.warn('Unknown Claude hook type', { hookType });
|
|
42
88
|
return;
|
|
43
89
|
}
|
|
90
|
+
const enricher = this.getEnricher();
|
|
91
|
+
const batcher = this.getBatcher();
|
|
92
|
+
for (const e of this.pendingTranscriptEvents) {
|
|
93
|
+
const filtered = this.applyPrivacyFilters(e);
|
|
94
|
+
const enriched = await enricher.enrich(filtered);
|
|
95
|
+
await batcher.add(enriched);
|
|
96
|
+
}
|
|
44
97
|
const filteredEvent = this.applyPrivacyFilters(event);
|
|
45
|
-
const enrichedEvent = await
|
|
46
|
-
await
|
|
98
|
+
const enrichedEvent = await enricher.enrich(filteredEvent);
|
|
99
|
+
await batcher.add(enrichedEvent);
|
|
47
100
|
logger_1.logger.debug('Claude event processed', { event: enrichedEvent.event });
|
|
48
101
|
}
|
|
49
102
|
catch (error) {
|
|
@@ -77,6 +130,13 @@ class ClaudeHooksReceiver {
|
|
|
77
130
|
: lastUserMsg.content?.[0]?.text ?? '')
|
|
78
131
|
: (data.prompt ?? '');
|
|
79
132
|
const promptsInSession = transcript.filter((m) => m.role === 'user').length;
|
|
133
|
+
// A typed slash command (e.g. "/explain-project …") is a skill invocation.
|
|
134
|
+
const slashCommand = this.config.capture.skills
|
|
135
|
+
? (0, artifact_extractor_1.extractSlashCommand)(promptText)
|
|
136
|
+
: null;
|
|
137
|
+
if (slashCommand)
|
|
138
|
+
this.recordArtifact(data.session_id, slashCommand);
|
|
139
|
+
const slashPlugin = slashCommand ? (0, artifact_extractor_1.pluginOf)(slashCommand) : null;
|
|
80
140
|
return {
|
|
81
141
|
type: 'claude_prompt_submitted',
|
|
82
142
|
data: {
|
|
@@ -86,12 +146,24 @@ class ClaudeHooksReceiver {
|
|
|
86
146
|
prompt: this.config.capture.prompts ? promptText : '[redacted]',
|
|
87
147
|
prompt_length: promptText.length,
|
|
88
148
|
prompts_in_session: promptsInSession,
|
|
149
|
+
...(slashCommand
|
|
150
|
+
? {
|
|
151
|
+
skill_name: slashCommand,
|
|
152
|
+
artifact_type: 'command',
|
|
153
|
+
...(slashPlugin ? { plugin_name: slashPlugin } : {}),
|
|
154
|
+
}
|
|
155
|
+
: {}),
|
|
89
156
|
},
|
|
90
157
|
timestamp,
|
|
91
158
|
provider: 'claude',
|
|
92
159
|
};
|
|
93
160
|
}
|
|
94
|
-
case 'PreToolUse':
|
|
161
|
+
case 'PreToolUse': {
|
|
162
|
+
// Extract from RAW tool_input so the skill/subagent name survives even
|
|
163
|
+
// when capture.prompts is off (a name is not a secret).
|
|
164
|
+
const artifact = this.config.capture.skills
|
|
165
|
+
? (0, artifact_extractor_1.extractArtifact)(data.tool_name, data.tool_input)
|
|
166
|
+
: null;
|
|
95
167
|
return {
|
|
96
168
|
type: 'claude_tool_pre_use',
|
|
97
169
|
data: {
|
|
@@ -99,11 +171,25 @@ class ClaudeHooksReceiver {
|
|
|
99
171
|
cwd: data.cwd,
|
|
100
172
|
tool_name: data.tool_name,
|
|
101
173
|
tool_input: this.config.capture.prompts ? data.tool_input : undefined,
|
|
174
|
+
...(artifact
|
|
175
|
+
? {
|
|
176
|
+
skill_name: artifact.name,
|
|
177
|
+
artifact_type: artifact.type,
|
|
178
|
+
...(artifact.plugin ? { plugin_name: artifact.plugin } : {}),
|
|
179
|
+
}
|
|
180
|
+
: {}),
|
|
102
181
|
},
|
|
103
182
|
timestamp,
|
|
104
183
|
provider: 'claude',
|
|
105
184
|
};
|
|
106
|
-
|
|
185
|
+
}
|
|
186
|
+
case 'PostToolUse': {
|
|
187
|
+
const artifact = this.config.capture.skills
|
|
188
|
+
? (0, artifact_extractor_1.extractArtifact)(data.tool_name, data.tool_input)
|
|
189
|
+
: null;
|
|
190
|
+
// Record on completion (PostToolUse) for the per-session rollup.
|
|
191
|
+
if (artifact)
|
|
192
|
+
this.recordArtifact(data.session_id, artifact.name);
|
|
107
193
|
return {
|
|
108
194
|
type: 'claude_tool_used',
|
|
109
195
|
data: {
|
|
@@ -113,10 +199,18 @@ class ClaudeHooksReceiver {
|
|
|
113
199
|
tool_input: this.config.capture.prompts ? data.tool_input : undefined,
|
|
114
200
|
// non-zero exit code signals an error
|
|
115
201
|
exit_code: data.tool_response?.exit_code ?? null,
|
|
202
|
+
...(artifact
|
|
203
|
+
? {
|
|
204
|
+
skill_name: artifact.name,
|
|
205
|
+
artifact_type: artifact.type,
|
|
206
|
+
...(artifact.plugin ? { plugin_name: artifact.plugin } : {}),
|
|
207
|
+
}
|
|
208
|
+
: {}),
|
|
116
209
|
},
|
|
117
210
|
timestamp,
|
|
118
211
|
provider: 'claude',
|
|
119
212
|
};
|
|
213
|
+
}
|
|
120
214
|
case 'SubagentStart':
|
|
121
215
|
return {
|
|
122
216
|
type: 'claude_subagent_started',
|
|
@@ -126,7 +220,11 @@ class ClaudeHooksReceiver {
|
|
|
126
220
|
timestamp,
|
|
127
221
|
provider: 'claude',
|
|
128
222
|
};
|
|
129
|
-
case 'SubagentStop':
|
|
223
|
+
case 'SubagentStop': {
|
|
224
|
+
if (this.config.capture.transcript && data.transcript_path) {
|
|
225
|
+
const { events } = this.ingestTranscript(data.session_id, data.cwd, data.transcript_path);
|
|
226
|
+
this.pendingTranscriptEvents.push(...events);
|
|
227
|
+
}
|
|
130
228
|
return {
|
|
131
229
|
type: 'claude_subagent_stopped',
|
|
132
230
|
data: {
|
|
@@ -135,18 +233,44 @@ class ClaudeHooksReceiver {
|
|
|
135
233
|
timestamp,
|
|
136
234
|
provider: 'claude',
|
|
137
235
|
};
|
|
236
|
+
}
|
|
138
237
|
case 'Stop': {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
const
|
|
238
|
+
// Distinct skills/subagents/commands used during this session, plus the
|
|
239
|
+
// distinct plugin namespaces they came from.
|
|
240
|
+
const skillsUsed = this.readAndClearArtifacts(data.session_id);
|
|
241
|
+
const pluginsUsed = [
|
|
242
|
+
...new Set(skillsUsed.map((n) => (0, artifact_extractor_1.pluginOf)(n)).filter((p) => !!p)),
|
|
243
|
+
];
|
|
244
|
+
// Prompt/response counts and token totals come from the transcript file
|
|
245
|
+
// (`data.transcript`, an inline array, is never sent by Claude Code —
|
|
246
|
+
// only `transcript_path` is; the old inline-array read always saw `[]`).
|
|
247
|
+
let totals = this.zeroTotals();
|
|
248
|
+
let meta = {};
|
|
249
|
+
if (this.config.capture.transcript && data.transcript_path) {
|
|
250
|
+
const result = this.ingestTranscript(data.session_id, data.cwd, data.transcript_path);
|
|
251
|
+
this.pendingTranscriptEvents.push(...result.events);
|
|
252
|
+
totals = result.totals;
|
|
253
|
+
meta = result.meta;
|
|
254
|
+
}
|
|
255
|
+
this.reapStaleSessions();
|
|
142
256
|
return {
|
|
143
257
|
type: 'claude_session_stopped',
|
|
144
258
|
data: {
|
|
145
259
|
session_id: data.session_id,
|
|
146
260
|
cwd: data.cwd,
|
|
147
261
|
stop_hook_active: data.stop_hook_active ?? false,
|
|
148
|
-
total_prompts:
|
|
149
|
-
total_responses:
|
|
262
|
+
total_prompts: totals.user_messages,
|
|
263
|
+
total_responses: totals.assistant_messages,
|
|
264
|
+
total_input_tokens: totals.input_tokens,
|
|
265
|
+
total_output_tokens: totals.output_tokens,
|
|
266
|
+
total_cache_read_tokens: totals.cache_read_tokens,
|
|
267
|
+
total_cache_creation_tokens: totals.cache_creation_tokens,
|
|
268
|
+
// Session type: 'cli' (Claude Code CLI) vs 'sdk-ts'/'sdk-py' (Agent SDK).
|
|
269
|
+
entrypoint: meta.entrypoint,
|
|
270
|
+
cc_version: meta.version,
|
|
271
|
+
user_type: meta.user_type,
|
|
272
|
+
skills_used: skillsUsed,
|
|
273
|
+
plugins_used: pluginsUsed,
|
|
150
274
|
},
|
|
151
275
|
timestamp,
|
|
152
276
|
provider: 'claude',
|
|
@@ -156,12 +280,278 @@ class ClaudeHooksReceiver {
|
|
|
156
280
|
return null;
|
|
157
281
|
}
|
|
158
282
|
}
|
|
283
|
+
// ── Per-session artifact accumulator ───────────────────────────────────────
|
|
284
|
+
// Skill/subagent/command names are appended to a tiny per-session JSONL file
|
|
285
|
+
// as they fire, then read + deduped + deleted on the Stop hook to produce the
|
|
286
|
+
// `skills_used` rollup. All IO is best-effort and never throws on the hot path.
|
|
287
|
+
sessionsDir() {
|
|
288
|
+
return path.join(config_1.Config.getDataDir(), 'sessions');
|
|
289
|
+
}
|
|
290
|
+
/** Path for a session's accumulator file, or null if session_id is unusable. */
|
|
291
|
+
sessionFile(sessionId) {
|
|
292
|
+
// Sanitize to a safe charset so a malformed/hostile id cannot escape the dir.
|
|
293
|
+
const safe = String(sessionId ?? '').replace(/[^A-Za-z0-9_-]/g, '');
|
|
294
|
+
if (!safe)
|
|
295
|
+
return null;
|
|
296
|
+
return path.join(this.sessionsDir(), `${safe}.jsonl`);
|
|
297
|
+
}
|
|
298
|
+
/** Append one artifact name for a session. Best-effort; never throws. */
|
|
299
|
+
recordArtifact(sessionId, name) {
|
|
300
|
+
try {
|
|
301
|
+
const file = this.sessionFile(sessionId);
|
|
302
|
+
if (!file)
|
|
303
|
+
return;
|
|
304
|
+
const dir = this.sessionsDir();
|
|
305
|
+
if (!fs.existsSync(dir))
|
|
306
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
307
|
+
// Append-only single line — atomic for small payloads, like the queue.
|
|
308
|
+
fs.appendFileSync(file, JSON.stringify({ name, ts: new Date().toISOString() }) + '\n', 'utf-8');
|
|
309
|
+
}
|
|
310
|
+
catch (err) {
|
|
311
|
+
logger_1.logger.debug('recordArtifact failed (ignored)', { err });
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
/** Read, dedupe, and delete a session accumulator. Never throws; returns []. */
|
|
315
|
+
readAndClearArtifacts(sessionId) {
|
|
316
|
+
try {
|
|
317
|
+
const file = this.sessionFile(sessionId);
|
|
318
|
+
if (!file || !fs.existsSync(file))
|
|
319
|
+
return [];
|
|
320
|
+
const content = fs.readFileSync(file, 'utf-8');
|
|
321
|
+
try {
|
|
322
|
+
fs.unlinkSync(file);
|
|
323
|
+
}
|
|
324
|
+
catch { /* ignore */ }
|
|
325
|
+
const seen = new Set();
|
|
326
|
+
for (const line of content.split('\n')) {
|
|
327
|
+
const t = line.trim();
|
|
328
|
+
if (!t)
|
|
329
|
+
continue;
|
|
330
|
+
try {
|
|
331
|
+
const obj = JSON.parse(t);
|
|
332
|
+
if (typeof obj?.name === 'string' && obj.name)
|
|
333
|
+
seen.add(obj.name);
|
|
334
|
+
}
|
|
335
|
+
catch { /* skip malformed line */ }
|
|
336
|
+
}
|
|
337
|
+
return [...seen]; // unique, insertion order preserved
|
|
338
|
+
}
|
|
339
|
+
catch (err) {
|
|
340
|
+
logger_1.logger.debug('readAndClearArtifacts failed (ignored)', { err });
|
|
341
|
+
return [];
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
/** Delete accumulator files from sessions that never reached Stop (>24h old). */
|
|
345
|
+
reapStaleSessions() {
|
|
346
|
+
// Sampled (~10%) so the synchronous Stop hook rarely pays for a dir scan.
|
|
347
|
+
if (Math.random() >= 0.1)
|
|
348
|
+
return;
|
|
349
|
+
try {
|
|
350
|
+
const dir = this.sessionsDir();
|
|
351
|
+
if (!fs.existsSync(dir))
|
|
352
|
+
return;
|
|
353
|
+
const cutoff = Date.now() - 24 * 60 * 60 * 1000;
|
|
354
|
+
for (const entry of fs.readdirSync(dir)) {
|
|
355
|
+
if (!entry.endsWith('.jsonl') && !entry.endsWith('.cursor.json'))
|
|
356
|
+
continue;
|
|
357
|
+
const full = path.join(dir, entry);
|
|
358
|
+
try {
|
|
359
|
+
if (fs.statSync(full).mtimeMs < cutoff)
|
|
360
|
+
fs.unlinkSync(full);
|
|
361
|
+
}
|
|
362
|
+
catch { /* ignore individual file errors */ }
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
catch (err) {
|
|
366
|
+
logger_1.logger.debug('reapStaleSessions failed (ignored)', { err });
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
// ── Transcript ingest ────────────────────────────────────────────────────
|
|
370
|
+
// Incrementally parses the Claude Code transcript_path JSONL file to recover
|
|
371
|
+
// what raw hook payloads never carry: assistant text, thinking, per-message
|
|
372
|
+
// token usage, and accurate message counts. Runs on Stop/SubagentStop, reads
|
|
373
|
+
// only the bytes appended since the last run (byte-offset cursor persisted
|
|
374
|
+
// in sessions/<id>.cursor.json), so cost stays O(delta) not O(session). See
|
|
375
|
+
// docs/06-transcript-ingest.md for the design.
|
|
376
|
+
zeroTotals() {
|
|
377
|
+
return {
|
|
378
|
+
user_messages: 0,
|
|
379
|
+
assistant_messages: 0,
|
|
380
|
+
input_tokens: 0,
|
|
381
|
+
output_tokens: 0,
|
|
382
|
+
cache_read_tokens: 0,
|
|
383
|
+
cache_creation_tokens: 0,
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
cursorFile(sessionId) {
|
|
387
|
+
const safe = String(sessionId ?? '').replace(/[^A-Za-z0-9_-]/g, '');
|
|
388
|
+
if (!safe)
|
|
389
|
+
return null;
|
|
390
|
+
return path.join(this.sessionsDir(), `${safe}.cursor.json`);
|
|
391
|
+
}
|
|
392
|
+
readCursor(sessionId) {
|
|
393
|
+
try {
|
|
394
|
+
const file = this.cursorFile(sessionId);
|
|
395
|
+
if (!file || !fs.existsSync(file))
|
|
396
|
+
return { offset: 0, totals: this.zeroTotals(), meta: {} };
|
|
397
|
+
const parsed = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
398
|
+
return {
|
|
399
|
+
offset: typeof parsed.offset === 'number' ? parsed.offset : 0,
|
|
400
|
+
totals: { ...this.zeroTotals(), ...parsed.totals },
|
|
401
|
+
meta: { ...(parsed.meta ?? {}) },
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
catch (err) {
|
|
405
|
+
logger_1.logger.debug('readCursor failed (ignored)', { err });
|
|
406
|
+
return { offset: 0, totals: this.zeroTotals(), meta: {} };
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
writeCursor(sessionId, cursor) {
|
|
410
|
+
try {
|
|
411
|
+
const file = this.cursorFile(sessionId);
|
|
412
|
+
if (!file)
|
|
413
|
+
return;
|
|
414
|
+
const dir = this.sessionsDir();
|
|
415
|
+
if (!fs.existsSync(dir))
|
|
416
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
417
|
+
fs.writeFileSync(file, JSON.stringify(cursor), 'utf-8');
|
|
418
|
+
}
|
|
419
|
+
catch (err) {
|
|
420
|
+
logger_1.logger.debug('writeCursor failed (ignored)', { err });
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Reads new transcript lines since the last cursor offset, emits
|
|
425
|
+
* claude_agent_responded/claude_agent_thought events, and folds token/message
|
|
426
|
+
* counts into the running totals. Best-effort; never throws on the hot path.
|
|
427
|
+
*/
|
|
428
|
+
ingestTranscript(sessionId, cwd, transcriptPath) {
|
|
429
|
+
const cursor = this.readCursor(sessionId);
|
|
430
|
+
try {
|
|
431
|
+
if (!fs.existsSync(transcriptPath))
|
|
432
|
+
return { events: [], totals: cursor.totals, meta: cursor.meta };
|
|
433
|
+
const buf = fs.readFileSync(transcriptPath);
|
|
434
|
+
let offset = cursor.offset;
|
|
435
|
+
if (buf.length < offset)
|
|
436
|
+
offset = 0; // rotation/truncation guard — reparse from scratch
|
|
437
|
+
if (offset >= buf.length)
|
|
438
|
+
return { events: [], totals: cursor.totals, meta: cursor.meta };
|
|
439
|
+
const slice = buf.subarray(offset);
|
|
440
|
+
const lastNewline = slice.lastIndexOf(10); // '\n' — only consume complete lines
|
|
441
|
+
if (lastNewline === -1)
|
|
442
|
+
return { events: [], totals: cursor.totals, meta: cursor.meta };
|
|
443
|
+
const text = slice.subarray(0, lastNewline).toString('utf-8');
|
|
444
|
+
const newOffset = offset + lastNewline + 1;
|
|
445
|
+
const totals = { ...cursor.totals };
|
|
446
|
+
const meta = { ...cursor.meta };
|
|
447
|
+
const events = [];
|
|
448
|
+
const timestamp = new Date().toISOString();
|
|
449
|
+
const sessionIdStr = String(sessionId ?? '');
|
|
450
|
+
for (const line of text.split('\n')) {
|
|
451
|
+
const t = line.trim();
|
|
452
|
+
if (!t)
|
|
453
|
+
continue;
|
|
454
|
+
let entry;
|
|
455
|
+
try {
|
|
456
|
+
entry = JSON.parse(t);
|
|
457
|
+
}
|
|
458
|
+
catch {
|
|
459
|
+
continue;
|
|
460
|
+
}
|
|
461
|
+
// Session-type signals live on every transcript entry; capture once.
|
|
462
|
+
// `entrypoint` = 'cli' for the CLI, 'sdk-ts'/'sdk-py' for the Agent SDK.
|
|
463
|
+
if (!meta.entrypoint && entry.entrypoint)
|
|
464
|
+
meta.entrypoint = String(entry.entrypoint);
|
|
465
|
+
if (!meta.version && entry.version)
|
|
466
|
+
meta.version = String(entry.version);
|
|
467
|
+
if (!meta.user_type && entry.userType)
|
|
468
|
+
meta.user_type = String(entry.userType);
|
|
469
|
+
if (entry.type === 'user') {
|
|
470
|
+
// A real prompt has string content; tool_result replies are arrays — skip those.
|
|
471
|
+
if (!entry.isMeta && typeof entry.message?.content === 'string')
|
|
472
|
+
totals.user_messages++;
|
|
473
|
+
continue;
|
|
474
|
+
}
|
|
475
|
+
if (entry.type !== 'assistant')
|
|
476
|
+
continue;
|
|
477
|
+
totals.assistant_messages++;
|
|
478
|
+
const message = entry.message ?? {};
|
|
479
|
+
const usage = message.usage ?? {};
|
|
480
|
+
const inputTokens = usage.input_tokens ?? 0;
|
|
481
|
+
const outputTokens = usage.output_tokens ?? 0;
|
|
482
|
+
const cacheReadTokens = usage.cache_read_input_tokens ?? 0;
|
|
483
|
+
const cacheCreationTokens = usage.cache_creation_input_tokens ?? 0;
|
|
484
|
+
totals.input_tokens += inputTokens;
|
|
485
|
+
totals.output_tokens += outputTokens;
|
|
486
|
+
totals.cache_read_tokens += cacheReadTokens;
|
|
487
|
+
totals.cache_creation_tokens += cacheCreationTokens;
|
|
488
|
+
const blocks = Array.isArray(message.content) ? message.content : [];
|
|
489
|
+
const textJoined = blocks.filter((b) => b?.type === 'text').map((b) => b.text ?? '').join('\n');
|
|
490
|
+
const thinkingJoined = blocks.filter((b) => b?.type === 'thinking').map((b) => b.thinking ?? '').join('\n');
|
|
491
|
+
const numToolCalls = blocks.filter((b) => b?.type === 'tool_use').length;
|
|
492
|
+
const base = {
|
|
493
|
+
session_id: sessionIdStr,
|
|
494
|
+
cwd,
|
|
495
|
+
message_uuid: entry.uuid,
|
|
496
|
+
model: message.model,
|
|
497
|
+
stop_reason: message.stop_reason,
|
|
498
|
+
is_sidechain: !!entry.isSidechain,
|
|
499
|
+
entrypoint: meta.entrypoint,
|
|
500
|
+
cc_version: meta.version,
|
|
501
|
+
user_type: meta.user_type,
|
|
502
|
+
};
|
|
503
|
+
if (textJoined) {
|
|
504
|
+
const capped = textJoined.slice(0, 10000);
|
|
505
|
+
events.push({
|
|
506
|
+
type: 'claude_agent_responded',
|
|
507
|
+
data: {
|
|
508
|
+
...base,
|
|
509
|
+
response: this.config.capture.responses ? capped : undefined,
|
|
510
|
+
response_length: capped.length,
|
|
511
|
+
num_tool_calls: numToolCalls,
|
|
512
|
+
input_tokens: inputTokens,
|
|
513
|
+
output_tokens: outputTokens,
|
|
514
|
+
cache_read_tokens: cacheReadTokens,
|
|
515
|
+
cache_creation_tokens: cacheCreationTokens,
|
|
516
|
+
},
|
|
517
|
+
timestamp,
|
|
518
|
+
provider: 'claude',
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
if (thinkingJoined) {
|
|
522
|
+
const capped = thinkingJoined.slice(0, 10000);
|
|
523
|
+
events.push({
|
|
524
|
+
type: 'claude_agent_thought',
|
|
525
|
+
data: {
|
|
526
|
+
...base,
|
|
527
|
+
thought: this.config.capture.agentThinking ? capped : undefined,
|
|
528
|
+
thought_length: capped.length,
|
|
529
|
+
},
|
|
530
|
+
timestamp,
|
|
531
|
+
provider: 'claude',
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
this.writeCursor(sessionId, { offset: newOffset, totals, meta });
|
|
536
|
+
return { events, totals, meta };
|
|
537
|
+
}
|
|
538
|
+
catch (err) {
|
|
539
|
+
logger_1.logger.debug('ingestTranscript failed (ignored)', { err });
|
|
540
|
+
return { events: [], totals: cursor.totals, meta: cursor.meta };
|
|
541
|
+
}
|
|
542
|
+
}
|
|
159
543
|
applyPrivacyFilters(event) {
|
|
160
544
|
if (!this.config.privacy.redactSecrets)
|
|
161
545
|
return event;
|
|
162
546
|
if (event.data.prompt) {
|
|
163
547
|
event.data.prompt = this.redactSecrets(event.data.prompt);
|
|
164
548
|
}
|
|
549
|
+
if (event.data.response) {
|
|
550
|
+
event.data.response = this.redactSecrets(event.data.response);
|
|
551
|
+
}
|
|
552
|
+
if (event.data.thought) {
|
|
553
|
+
event.data.thought = this.redactSecrets(event.data.thought);
|
|
554
|
+
}
|
|
165
555
|
return event;
|
|
166
556
|
}
|
|
167
557
|
redactSecrets(text) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-hooks-receiver.js","sourceRoot":"","sources":["../claude-hooks-receiver.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"claude-hooks-receiver.js","sourceRoot":"","sources":["../claude-hooks-receiver.ts"],"names":[],"mappings":"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"}
|