@eggjs/agent-tracing 3.73.0-beta.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.
@@ -0,0 +1,448 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ClaudeAgentTracer = exports.TraceSession = void 0;
13
+ const node_crypto_1 = require("node:crypto");
14
+ const core_decorator_1 = require("@eggjs/core-decorator");
15
+ const tegg_types_1 = require("@eggjs/tegg-types");
16
+ const types_1 = require("./types");
17
+ /**
18
+ * TraceSession - Manages state for a single agent execution with streaming support.
19
+ * Allows processing messages one-by-one and logging them immediately.
20
+ */
21
+ class TraceSession {
22
+ constructor(tracer, sessionId) {
23
+ this.rootRun = null;
24
+ this.executionOrder = 2; // Start at 2, root is 1
25
+ this.pendingToolUses = new Map();
26
+ this.tracer = tracer;
27
+ this.traceId = sessionId || (0, node_crypto_1.randomUUID)();
28
+ this.rootRunId = (0, node_crypto_1.randomUUID)();
29
+ this.startTime = Date.now();
30
+ }
31
+ /**
32
+ * Process a single SDK message and log it immediately.
33
+ * Non-tracing message types (tool_progress, stream_event, status, etc.) are automatically ignored.
34
+ */
35
+ async processMessage(message) {
36
+ try {
37
+ const converted = this.tracer.convertSDKMessage(message);
38
+ if (!converted)
39
+ return;
40
+ if (converted.type === 'system' && converted.subtype === 'init') {
41
+ this.handleInit(converted);
42
+ }
43
+ else if (converted.type === 'assistant') {
44
+ this.handleAssistant(converted);
45
+ }
46
+ else if (converted.type === 'user') {
47
+ this.handleUser(converted);
48
+ }
49
+ else if (converted.type === 'result') {
50
+ this.handleResult(converted);
51
+ }
52
+ }
53
+ catch (e) {
54
+ this.tracer.logger.warn('[ClaudeAgentTracer] processMessage error:', e);
55
+ }
56
+ }
57
+ handleInit(message) {
58
+ this.traceId = message.session_id || this.traceId;
59
+ this.rootRun = this.tracer.createRootRunInternal(message, this.startTime, this.traceId, this.rootRunId);
60
+ this.tracer.logTrace(this.rootRun, types_1.RunStatus.START);
61
+ }
62
+ handleAssistant(message) {
63
+ var _a;
64
+ if (!this.rootRun) {
65
+ this.tracer.logger.warn('[ClaudeAgentTracer] Received assistant message before init');
66
+ return;
67
+ }
68
+ const content = ((_a = message.message) === null || _a === void 0 ? void 0 : _a.content) || [];
69
+ const hasToolUse = content.some(c => c.type === 'tool_use');
70
+ const hasText = content.some(c => c.type === 'text');
71
+ if (hasToolUse) {
72
+ const eventTime = Date.now();
73
+ // Create LLM run that initiated tool calls
74
+ const llmRun = this.tracer.createLLMRunInternal(message, this.rootRunId, this.traceId, this.executionOrder++, eventTime, true);
75
+ this.rootRun.child_runs.push(llmRun);
76
+ this.tracer.logTrace(llmRun, types_1.RunStatus.END);
77
+ // Create tool runs (will be completed when tool_result arrives)
78
+ for (const block of content) {
79
+ if (block.type === 'tool_use') {
80
+ const toolRun = this.tracer.createToolRunStartInternal(block, this.rootRunId, this.traceId, this.executionOrder++, eventTime);
81
+ this.rootRun.child_runs.push(toolRun);
82
+ this.pendingToolUses.set(block.id, toolRun);
83
+ this.tracer.logTrace(toolRun, types_1.RunStatus.START);
84
+ }
85
+ }
86
+ }
87
+ else if (hasText) {
88
+ // Text-only response
89
+ const llmRun = this.tracer.createLLMRunInternal(message, this.rootRunId, this.traceId, this.executionOrder++, Date.now(), false);
90
+ this.rootRun.child_runs.push(llmRun);
91
+ this.tracer.logTrace(llmRun, types_1.RunStatus.END);
92
+ }
93
+ }
94
+ handleUser(message) {
95
+ var _a;
96
+ if (!((_a = message.message) === null || _a === void 0 ? void 0 : _a.content))
97
+ return;
98
+ for (const block of message.message.content) {
99
+ if (block.type === 'tool_result') {
100
+ const toolRun = this.pendingToolUses.get(block.tool_use_id);
101
+ if (toolRun) {
102
+ this.tracer.completeToolRunInternal(toolRun, block, Date.now());
103
+ const status = block.is_error ? types_1.RunStatus.ERROR : types_1.RunStatus.END;
104
+ this.tracer.logTrace(toolRun, status);
105
+ this.pendingToolUses.delete(block.tool_use_id);
106
+ }
107
+ }
108
+ }
109
+ }
110
+ handleResult(message) {
111
+ if (!this.rootRun) {
112
+ this.tracer.logger.warn('[ClaudeAgentTracer] Received result message before init');
113
+ return;
114
+ }
115
+ // Complete any pending tool runs
116
+ for (const [toolUseId, toolRun] of this.pendingToolUses) {
117
+ this.tracer.logger.warn(`[ClaudeAgentTracer] Tool run ${toolUseId} did not receive result`);
118
+ toolRun.end_time = Date.now();
119
+ this.tracer.logTrace(toolRun, types_1.RunStatus.ERROR);
120
+ }
121
+ this.pendingToolUses.clear();
122
+ // Update and log root run end
123
+ this.rootRun.end_time = this.startTime + (message.duration_ms || 0);
124
+ this.rootRun.outputs = {
125
+ result: message.result,
126
+ is_error: message.is_error,
127
+ num_turns: message.num_turns,
128
+ };
129
+ if (message.usage || message.modelUsage) {
130
+ const cost = this.tracer.createRunCostInternal(message);
131
+ if (this.rootRun.outputs) {
132
+ this.rootRun.outputs.llmOutput = cost;
133
+ }
134
+ }
135
+ if (message.is_error) {
136
+ this.rootRun.error = message.result;
137
+ }
138
+ this.rootRun.child_execution_order = this.executionOrder - 1;
139
+ const status = message.is_error ? types_1.RunStatus.ERROR : types_1.RunStatus.END;
140
+ this.tracer.logTrace(this.rootRun, status);
141
+ }
142
+ /**
143
+ * Get current trace ID
144
+ */
145
+ getTraceId() {
146
+ return this.traceId;
147
+ }
148
+ }
149
+ exports.TraceSession = TraceSession;
150
+ /**
151
+ * ClaudeAgentTracer - Converts Claude SDK messages to LangChain Run format
152
+ * and logs them to the same remote logging system as LangGraphTracer.
153
+ *
154
+ * Supports both batch processing (processMessages) and streaming (createSession).
155
+ */
156
+ let ClaudeAgentTracer = class ClaudeAgentTracer {
157
+ constructor() {
158
+ this.name = 'ClaudeAgentTracer';
159
+ this.agentName = '';
160
+ }
161
+ /**
162
+ * Configure the tracer with agent name and service credentials.
163
+ */
164
+ configure(config) {
165
+ (0, types_1.applyTracerConfig)(this, config);
166
+ }
167
+ /**
168
+ * Create a new trace session for streaming message processing.
169
+ * Use this for real-time tracing where messages arrive one-by-one.
170
+ *
171
+ * @example
172
+ * const session = claudeTracer.createSession();
173
+ * for await (const message of agent.run('task')) {
174
+ * await session.processMessage(message);
175
+ * }
176
+ */
177
+ createSession(sessionId) {
178
+ return new TraceSession(this, sessionId);
179
+ }
180
+ /**
181
+ * Main entry point - convert SDK messages to Run trees and log them.
182
+ * Use this when you have all messages collected (batch processing).
183
+ * For real-time streaming, use createSession() instead.
184
+ *
185
+ * Non-tracing message types (tool_progress, stream_event, status, etc.) are automatically filtered out.
186
+ */
187
+ async processMessages(sdkMessages) {
188
+ try {
189
+ if (!sdkMessages || sdkMessages.length === 0) {
190
+ this.logger.warn('[ClaudeAgentTracer] No messages to process');
191
+ return;
192
+ }
193
+ // Pre-validate: ensure there is an init message before creating session
194
+ const hasInit = sdkMessages.some(m => m.type === 'system' && 'subtype' in m && m.subtype === 'init');
195
+ if (!hasInit) {
196
+ this.logger.warn('[ClaudeAgentTracer] No system/init message found');
197
+ return;
198
+ }
199
+ // Delegate to TraceSession for message processing
200
+ const session = this.createSession();
201
+ for (const msg of sdkMessages) {
202
+ await session.processMessage(msg);
203
+ }
204
+ }
205
+ catch (e) {
206
+ this.logger.warn('[ClaudeAgentTracer] processMessages error:', e);
207
+ }
208
+ }
209
+ /**
210
+ * @internal
211
+ * Convert an SDKMessage to internal ClaudeMessage format.
212
+ * Returns null for message types that are not relevant to tracing.
213
+ */
214
+ convertSDKMessage(msg) {
215
+ var _a;
216
+ // SDKSystemMessage (init)
217
+ if (msg.type === 'system' && 'subtype' in msg && msg.subtype === 'init') {
218
+ return msg;
219
+ }
220
+ // SDKAssistantMessage
221
+ if (msg.type === 'assistant' && 'message' in msg && 'parent_tool_use_id' in msg) {
222
+ return {
223
+ type: 'assistant',
224
+ uuid: msg.uuid,
225
+ session_id: msg.session_id,
226
+ message: msg.message,
227
+ parent_tool_use_id: msg.parent_tool_use_id,
228
+ };
229
+ }
230
+ // SDKUserMessage (tool results, not replay)
231
+ if (msg.type === 'user' && 'message' in msg && !('isReplay' in msg && msg.isReplay)) {
232
+ return {
233
+ type: 'user',
234
+ uuid: msg.uuid || (0, node_crypto_1.randomUUID)(),
235
+ session_id: msg.session_id,
236
+ message: msg.message,
237
+ parent_tool_use_id: msg.parent_tool_use_id,
238
+ };
239
+ }
240
+ // SDKResultMessage (success or error)
241
+ if (msg.type === 'result') {
242
+ const resultMsg = msg;
243
+ const isSuccess = resultMsg.subtype === 'success';
244
+ return {
245
+ type: 'result',
246
+ subtype: isSuccess ? 'success' : 'error',
247
+ is_error: resultMsg.is_error,
248
+ duration_ms: resultMsg.duration_ms,
249
+ duration_api_ms: resultMsg.duration_api_ms,
250
+ num_turns: resultMsg.num_turns,
251
+ result: isSuccess ? resultMsg.result : ((_a = resultMsg.errors) === null || _a === void 0 ? void 0 : _a.join('; ')) || 'Unknown error',
252
+ session_id: resultMsg.session_id,
253
+ total_cost_usd: resultMsg.total_cost_usd,
254
+ usage: resultMsg.usage,
255
+ modelUsage: resultMsg.modelUsage,
256
+ uuid: resultMsg.uuid,
257
+ };
258
+ }
259
+ // Ignore all other SDK message types (tool_progress, stream_event, status, hook, etc.)
260
+ return null;
261
+ }
262
+ /**
263
+ * @internal
264
+ * Create root run from init message (used by TraceSession)
265
+ */
266
+ createRootRunInternal(initMsg, startTime, traceId, rootRunId) {
267
+ const runId = rootRunId || initMsg.uuid || (0, node_crypto_1.randomUUID)();
268
+ return {
269
+ id: runId,
270
+ name: this.name,
271
+ run_type: 'chain',
272
+ inputs: {
273
+ tools: initMsg.tools || [],
274
+ model: initMsg.model,
275
+ session_id: initMsg.session_id,
276
+ mcp_servers: initMsg.mcp_servers,
277
+ agents: initMsg.agents,
278
+ slash_commands: initMsg.slash_commands,
279
+ },
280
+ outputs: undefined,
281
+ start_time: startTime,
282
+ end_time: undefined,
283
+ execution_order: 1,
284
+ child_execution_order: 1,
285
+ child_runs: [],
286
+ events: [],
287
+ trace_id: traceId,
288
+ parent_run_id: undefined,
289
+ tags: [],
290
+ extra: {
291
+ metadata: {
292
+ thread_id: initMsg.session_id,
293
+ },
294
+ apiKeySource: initMsg.apiKeySource,
295
+ claude_code_version: initMsg.claude_code_version,
296
+ output_style: initMsg.output_style,
297
+ permissionMode: initMsg.permissionMode,
298
+ },
299
+ };
300
+ }
301
+ /**
302
+ * @internal
303
+ * Create LLM run from assistant message (used by TraceSession)
304
+ */
305
+ createLLMRunInternal(msg, rootRunId, traceId, order, startTime, isToolCall) {
306
+ var _a, _b, _c;
307
+ const runId = msg.uuid || (0, node_crypto_1.randomUUID)();
308
+ const content = ((_a = msg.message) === null || _a === void 0 ? void 0 : _a.content) || [];
309
+ const textBlocks = content.filter(c => c.type === 'text');
310
+ const toolBlocks = content.filter(c => c.type === 'tool_use');
311
+ const inputs = {
312
+ messages: textBlocks.map(c => c.text).filter(Boolean),
313
+ };
314
+ const outputs = {};
315
+ if (isToolCall) {
316
+ outputs.tool_calls = toolBlocks.map(c => ({
317
+ id: c.id,
318
+ name: c.name,
319
+ input: c.input,
320
+ }));
321
+ }
322
+ else {
323
+ outputs.content = textBlocks.map(c => c.text).join('');
324
+ }
325
+ if ((_b = msg.message) === null || _b === void 0 ? void 0 : _b.usage) {
326
+ outputs.llmOutput = this.extractTokenUsage(msg.message.usage);
327
+ }
328
+ return {
329
+ id: runId,
330
+ name: 'LLM',
331
+ run_type: 'llm',
332
+ inputs,
333
+ outputs,
334
+ start_time: startTime,
335
+ end_time: startTime,
336
+ execution_order: order,
337
+ child_execution_order: order,
338
+ child_runs: [],
339
+ events: [],
340
+ trace_id: traceId,
341
+ parent_run_id: rootRunId,
342
+ tags: [],
343
+ extra: {
344
+ model: (_c = msg.message) === null || _c === void 0 ? void 0 : _c.model,
345
+ },
346
+ };
347
+ }
348
+ /**
349
+ * @internal
350
+ * Create tool run at start (before result, used by TraceSession)
351
+ */
352
+ createToolRunStartInternal(toolUseBlock, rootRunId, traceId, order, startTime) {
353
+ const toolUse = toolUseBlock;
354
+ const runId = (0, node_crypto_1.randomUUID)();
355
+ return {
356
+ id: runId,
357
+ name: toolUse.name || 'Tool',
358
+ run_type: 'tool',
359
+ inputs: {
360
+ tool_use_id: toolUse.id,
361
+ ...toolUse.input,
362
+ },
363
+ outputs: undefined,
364
+ start_time: startTime,
365
+ end_time: undefined,
366
+ execution_order: order,
367
+ child_execution_order: order,
368
+ child_runs: [],
369
+ events: [],
370
+ trace_id: traceId,
371
+ parent_run_id: rootRunId,
372
+ tags: [],
373
+ extra: {
374
+ tool_use_id: toolUse.id,
375
+ },
376
+ };
377
+ }
378
+ /**
379
+ * @internal
380
+ * Complete tool run with result (used by TraceSession)
381
+ */
382
+ completeToolRunInternal(toolRun, toolResultBlock, startTime) {
383
+ const result = toolResultBlock;
384
+ toolRun.end_time = startTime;
385
+ toolRun.outputs = {
386
+ content: result.content,
387
+ };
388
+ if (result.is_error) {
389
+ toolRun.error = typeof result.content === 'string' ? result.content : JSON.stringify(result.content);
390
+ }
391
+ }
392
+ /**
393
+ * Extract token usage from Claude SDK usage object into IRunCost format.
394
+ */
395
+ extractTokenUsage(usage) {
396
+ const result = {};
397
+ if (usage.input_tokens !== undefined) {
398
+ result.promptTokens = usage.input_tokens;
399
+ }
400
+ if (usage.output_tokens !== undefined) {
401
+ result.completionTokens = usage.output_tokens;
402
+ }
403
+ if (usage.cache_creation_input_tokens !== undefined) {
404
+ result.cacheCreationInputTokens = usage.cache_creation_input_tokens;
405
+ }
406
+ if (usage.cache_read_input_tokens !== undefined) {
407
+ result.cacheReadInputTokens = usage.cache_read_input_tokens;
408
+ }
409
+ const totalTokens = (usage.input_tokens || 0) + (usage.output_tokens || 0);
410
+ if (totalTokens > 0) {
411
+ result.totalTokens = totalTokens;
412
+ }
413
+ return result;
414
+ }
415
+ /**
416
+ * @internal
417
+ * Create run cost from result message (used by TraceSession)
418
+ */
419
+ createRunCostInternal(resultMsg) {
420
+ const cost = resultMsg.usage ? this.extractTokenUsage(resultMsg.usage) : {};
421
+ if (resultMsg.total_cost_usd !== undefined) {
422
+ cost.totalCost = resultMsg.total_cost_usd;
423
+ }
424
+ return cost;
425
+ }
426
+ /**
427
+ * @internal
428
+ * Log trace - delegates to TracingService (used by TraceSession)
429
+ */
430
+ logTrace(run, status) {
431
+ this.tracingService.logTrace(run, status, this.name, this.agentName);
432
+ }
433
+ };
434
+ exports.ClaudeAgentTracer = ClaudeAgentTracer;
435
+ __decorate([
436
+ (0, core_decorator_1.Inject)(),
437
+ __metadata("design:type", Object)
438
+ ], ClaudeAgentTracer.prototype, "logger", void 0);
439
+ __decorate([
440
+ (0, core_decorator_1.Inject)(),
441
+ __metadata("design:type", Function)
442
+ ], ClaudeAgentTracer.prototype, "tracingService", void 0);
443
+ exports.ClaudeAgentTracer = ClaudeAgentTracer = __decorate([
444
+ (0, core_decorator_1.SingletonProto)({
445
+ accessLevel: tegg_types_1.AccessLevel.PUBLIC,
446
+ })
447
+ ], ClaudeAgentTracer);
448
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xhdWRlQWdlbnRUcmFjZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvQ2xhdWRlQWdlbnRUcmFjZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXlDO0FBR3pDLDBEQUErRDtBQUMvRCxrREFBZ0Q7QUFLaEQsbUNBUWlCO0FBRWpCOzs7R0FHRztBQUNILE1BQWEsWUFBWTtJQVN2QixZQUFZLE1BQXlCLEVBQUUsU0FBa0I7UUFQakQsWUFBTyxHQUFlLElBQUksQ0FBQztRQUczQixtQkFBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtRQUM1QyxvQkFBZSxHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7UUFJL0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLElBQUksSUFBQSx3QkFBVSxHQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFBLHdCQUFVLEdBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFtQjtRQUN0QyxJQUFJLENBQUM7WUFDSCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxTQUFTO2dCQUFFLE9BQU87WUFFdkIsSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxTQUFTLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUNoRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdCLENBQUM7aUJBQU0sSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUMxQyxJQUFJLENBQUMs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
@@ -0,0 +1,28 @@
1
+ import { BaseTracer } from '@langchain/core/tracers/base';
2
+ import type { Run } from '@langchain/core/tracers/base';
3
+ import { type TracerConfig } from './types';
4
+ export declare class LangGraphTracer extends BaseTracer {
5
+ private tracingService;
6
+ name: string;
7
+ agentName: string;
8
+ /**
9
+ * Configure the tracer with agent name and service credentials.
10
+ */
11
+ configure(config: TracerConfig): void;
12
+ protected persistRun(_: Run): Promise<void>;
13
+ private logTrace;
14
+ onChainStart(run: Run): void | Promise<void>;
15
+ onChainEnd(run: Run): void | Promise<void>;
16
+ onChainError(run: Run): void | Promise<void>;
17
+ onToolStart(run: Run): void | Promise<void>;
18
+ onToolEnd(run: Run): void | Promise<void>;
19
+ onToolError(run: Run): void | Promise<void>;
20
+ onLLMStart(run: Run): void | Promise<void>;
21
+ onLLMEnd(run: Run): void | Promise<void>;
22
+ onLLMError(run: Run): void | Promise<void>;
23
+ onRetrieverStart(run: Run): void | Promise<void>;
24
+ onRetrieverEnd(run: Run): void | Promise<void>;
25
+ onRetrieverError(run: Run): void | Promise<void>;
26
+ onAgentAction(run: Run): void | Promise<void>;
27
+ onAgentEnd(run: Run): void | Promise<void>;
28
+ }
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.LangGraphTracer = void 0;
13
+ const core_decorator_1 = require("@eggjs/core-decorator");
14
+ const tegg_types_1 = require("@eggjs/tegg-types");
15
+ const base_1 = require("@langchain/core/tracers/base");
16
+ const types_1 = require("./types");
17
+ let LangGraphTracer = class LangGraphTracer extends base_1.BaseTracer {
18
+ constructor() {
19
+ super(...arguments);
20
+ this.name = 'LangGraphTracer';
21
+ this.agentName = '';
22
+ }
23
+ /**
24
+ * Configure the tracer with agent name and service credentials.
25
+ */
26
+ configure(config) {
27
+ (0, types_1.applyTracerConfig)(this, config);
28
+ }
29
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
30
+ persistRun(_) {
31
+ return Promise.resolve(undefined);
32
+ }
33
+ logTrace(run, status) {
34
+ this.tracingService.logTrace(run, status, this.name, this.agentName);
35
+ }
36
+ onChainStart(run) {
37
+ this.logTrace(run, types_1.RunStatus.START);
38
+ }
39
+ onChainEnd(run) {
40
+ this.logTrace(run, types_1.RunStatus.END);
41
+ }
42
+ onChainError(run) {
43
+ this.logTrace(run, types_1.RunStatus.ERROR);
44
+ }
45
+ onToolStart(run) {
46
+ this.logTrace(run, types_1.RunStatus.START);
47
+ }
48
+ onToolEnd(run) {
49
+ this.logTrace(run, types_1.RunStatus.END);
50
+ }
51
+ onToolError(run) {
52
+ this.logTrace(run, types_1.RunStatus.ERROR);
53
+ }
54
+ onLLMStart(run) {
55
+ this.logTrace(run, types_1.RunStatus.START);
56
+ }
57
+ onLLMEnd(run) {
58
+ this.logTrace(run, types_1.RunStatus.END);
59
+ }
60
+ onLLMError(run) {
61
+ this.logTrace(run, types_1.RunStatus.ERROR);
62
+ }
63
+ onRetrieverStart(run) {
64
+ this.logTrace(run, types_1.RunStatus.START);
65
+ }
66
+ onRetrieverEnd(run) {
67
+ this.logTrace(run, types_1.RunStatus.END);
68
+ }
69
+ onRetrieverError(run) {
70
+ this.logTrace(run, types_1.RunStatus.ERROR);
71
+ }
72
+ onAgentAction(run) {
73
+ this.logTrace(run, types_1.RunStatus.START);
74
+ }
75
+ onAgentEnd(run) {
76
+ this.logTrace(run, types_1.RunStatus.END);
77
+ }
78
+ };
79
+ exports.LangGraphTracer = LangGraphTracer;
80
+ __decorate([
81
+ (0, core_decorator_1.Inject)(),
82
+ __metadata("design:type", Function)
83
+ ], LangGraphTracer.prototype, "tracingService", void 0);
84
+ exports.LangGraphTracer = LangGraphTracer = __decorate([
85
+ (0, core_decorator_1.SingletonProto)({
86
+ accessLevel: tegg_types_1.AccessLevel.PUBLIC,
87
+ })
88
+ ], LangGraphTracer);
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGFuZ0dyYXBoVHJhY2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL0xhbmdHcmFwaFRyYWNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSwwREFBK0Q7QUFDL0Qsa0RBQWdEO0FBQ2hELHVEQUEwRDtBQUkxRCxtQ0FBMEU7QUFLbkUsSUFBTSxlQUFlLEdBQXJCLE1BQU0sZUFBZ0IsU0FBUSxpQkFBVTtJQUF4Qzs7UUFJTCxTQUFJLEdBQUcsaUJBQWlCLENBQUM7UUFFekIsY0FBUyxHQUFHLEVBQUUsQ0FBQztJQWlFakIsQ0FBQztJQS9EQzs7T0FFRztJQUNILFNBQVMsQ0FBQyxNQUFvQjtRQUM1QixJQUFBLHlCQUFpQixFQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsNkRBQTZEO0lBQ25ELFVBQVUsQ0FBQyxDQUFNO1FBQ3pCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU8sUUFBUSxDQUFDLEdBQVEsRUFBRSxNQUFpQjtRQUMxQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxZQUFZLENBQUMsR0FBUTtRQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxpQkFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxVQUFVLENBQUMsR0FBUTtRQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxpQkFBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFDRCxZQUFZLENBQUMsR0FBUTtRQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxpQkFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxXQUFXLENBQUMsR0FBUTtRQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxpQkFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxTQUFTLENBQUMsR0FBUTtRQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxpQkFBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxXQUFXLENBQUMsR0FBUTtRQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxpQkFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxVQUFVLENBQUMsR0FBUTtRQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxpQkFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxRQUFRLENBQUMsR0FBUTtRQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLGlCQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNELFVBQVUsQ0FBQyxHQUFRO1FBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLGlCQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELGdCQUFnQixDQUFDLEdBQVE7UUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsaUJBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsY0FBYyxDQUFDLEdBQVE7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsaUJBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsR0FBUTtRQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxpQkFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxhQUFhLENBQUMsR0FBUTtRQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxpQkFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxVQUFVLENBQUMsR0FBUTtRQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxpQkFBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7Q0FDRixDQUFBO0FBdkVZLDBDQUFlO0FBRWxCO0lBRFAsSUFBQSx1QkFBTSxHQUFFOzt1REFDOEI7MEJBRjVCLGVBQWU7SUFIM0IsSUFBQSwrQkFBYyxFQUFDO1FBQ2QsV0FBVyxFQUFFLHdCQUFXLENBQUMsTUFBTTtLQUNoQyxDQUFDO0dBQ1csZUFBZSxDQXVFM0IifQ==
@@ -0,0 +1,39 @@
1
+ import type { Logger } from '@eggjs/tegg-types';
2
+ import type { Run } from '@langchain/core/tracers/base';
3
+ import { RunStatus } from './types';
4
+ /**
5
+ * TracingService - Shared service for common tracing operations.
6
+ * Used by both LangGraphTracer and ClaudeAgentTracer to avoid code duplication.
7
+ */
8
+ export declare class TracingService {
9
+ readonly logger: Logger;
10
+ private backgroundTaskHelper;
11
+ private readonly ossClient;
12
+ private readonly logServiceClient;
13
+ /**
14
+ * Get the current environment (local, pre, prod, gray)
15
+ */
16
+ getEnv(): string;
17
+ /**
18
+ * Check if running in online environment (prod, pre, gray)
19
+ */
20
+ isOnlineEnv(): boolean;
21
+ /**
22
+ * Generate log info prefix for a run
23
+ */
24
+ getLogInfoPrefix(run: Run, status: RunStatus, name: string): string;
25
+ /**
26
+ * Upload content to OSS using the injected AbstractOssClient implementation.
27
+ * Gracefully skips if no AbstractOssClient is provided.
28
+ */
29
+ uploadToOss(key: string, fileContent: string): Promise<void>;
30
+ /**
31
+ * Sync local tracing logs to the injected AbstractLogServiceClient implementation.
32
+ * Silently skips if no AbstractLogServiceClient is registered.
33
+ */
34
+ syncLocalToLogService(log: string, agentName: string): Promise<void>;
35
+ /**
36
+ * Log trace run data with OSS upload for large fields
37
+ */
38
+ logTrace(run: Run, status: RunStatus, name: string, agentName: string): void;
39
+ }