lightrace 0.1.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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/dist/client.d.ts +71 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +116 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/exporter.d.ts +31 -0
  8. package/dist/exporter.d.ts.map +1 -0
  9. package/dist/exporter.js +88 -0
  10. package/dist/exporter.js.map +1 -0
  11. package/dist/index.d.ts +6 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +4 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/integrations/langchain.d.ts +74 -0
  16. package/dist/integrations/langchain.d.ts.map +1 -0
  17. package/dist/integrations/langchain.js +337 -0
  18. package/dist/integrations/langchain.js.map +1 -0
  19. package/dist/observation.d.ts +58 -0
  20. package/dist/observation.d.ts.map +1 -0
  21. package/dist/observation.js +105 -0
  22. package/dist/observation.js.map +1 -0
  23. package/dist/security.d.ts +20 -0
  24. package/dist/security.d.ts.map +1 -0
  25. package/dist/security.js +46 -0
  26. package/dist/security.js.map +1 -0
  27. package/dist/tool-client.d.ts +32 -0
  28. package/dist/tool-client.d.ts.map +1 -0
  29. package/dist/tool-client.js +186 -0
  30. package/dist/tool-client.js.map +1 -0
  31. package/dist/trace.d.ts +25 -0
  32. package/dist/trace.d.ts.map +1 -0
  33. package/dist/trace.js +163 -0
  34. package/dist/trace.js.map +1 -0
  35. package/dist/types.d.ts +85 -0
  36. package/dist/types.d.ts.map +1 -0
  37. package/dist/types.js +17 -0
  38. package/dist/types.js.map +1 -0
  39. package/dist/utils.d.ts +7 -0
  40. package/dist/utils.d.ts.map +1 -0
  41. package/dist/utils.js +66 -0
  42. package/dist/utils.js.map +1 -0
  43. package/package.json +87 -0
@@ -0,0 +1,337 @@
1
+ /**
2
+ * LangChain/LangGraph integration for Lightrace.
3
+ *
4
+ * Extends `BaseCallbackHandler` from `@langchain/core` to automatically
5
+ * capture chains, LLM calls, tool invocations, and retriever operations
6
+ * as Lightrace trace observations.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { LightraceCallbackHandler } from "lightrace/integrations/langchain";
11
+ *
12
+ * const handler = new LightraceCallbackHandler({ userId: "user-123" });
13
+ * const result = await chain.invoke(inputs, { callbacks: [handler] });
14
+ * console.log(handler.lastTraceId);
15
+ * ```
16
+ */
17
+ import { BaseCallbackHandler } from "@langchain/core/callbacks/base";
18
+ import { generateId, jsonSerializable } from "../utils.js";
19
+ import { Lightrace } from "../client.js";
20
+ export class LightraceCallbackHandler extends BaseCallbackHandler {
21
+ name = "lightrace";
22
+ // Run tracking
23
+ runs = new Map();
24
+ runParents = new Map();
25
+ completionStartTimes = new Map();
26
+ rootRunId = null;
27
+ _traceId = null;
28
+ // Config
29
+ userId;
30
+ sessionId;
31
+ traceName;
32
+ rootMetadata;
33
+ // Exporter
34
+ exporter = null;
35
+ /** The trace ID from the most recently completed root run. */
36
+ lastTraceId = null;
37
+ constructor(opts) {
38
+ super();
39
+ this.userId = opts?.userId;
40
+ this.sessionId = opts?.sessionId;
41
+ this.traceName = opts?.traceName;
42
+ this.rootMetadata = opts?.metadata;
43
+ const client = opts?.client ?? Lightrace.getInstance();
44
+ this.exporter = client?.getExporter() ?? null;
45
+ }
46
+ // ── helpers ──────────────────────────────────────────────────────────
47
+ getParentObservationId(observationId) {
48
+ return this.runParents.get(observationId) ?? null;
49
+ }
50
+ emit(event) {
51
+ this.exporter?.enqueue(event);
52
+ }
53
+ emitObservation(run, endTime, output, level, statusMessage, extra) {
54
+ const eventTypeMap = {
55
+ span: "span-create",
56
+ generation: "generation-create",
57
+ event: "event-create",
58
+ tool: "tool-create",
59
+ chain: "chain-create",
60
+ };
61
+ const obsTypeMap = {
62
+ span: "SPAN",
63
+ generation: "GENERATION",
64
+ event: "EVENT",
65
+ tool: "TOOL",
66
+ chain: "CHAIN",
67
+ };
68
+ const body = {
69
+ id: run.observationId,
70
+ traceId: this._traceId,
71
+ type: obsTypeMap[run.type] ?? run.type,
72
+ name: run.name,
73
+ startTime: run.startTime.toISOString(),
74
+ endTime: endTime.toISOString(),
75
+ input: jsonSerializable(run.input),
76
+ output: jsonSerializable(output),
77
+ metadata: run.metadata ?? null,
78
+ model: run.model ?? null,
79
+ level,
80
+ statusMessage,
81
+ parentObservationId: this.getParentObservationId(run.observationId) ?? null,
82
+ ...extra,
83
+ };
84
+ this.emit({
85
+ id: generateId(),
86
+ type: eventTypeMap[run.type] ?? "span-create",
87
+ timestamp: run.startTime.toISOString(),
88
+ body,
89
+ });
90
+ }
91
+ extractModelName(serialized) {
92
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
93
+ const s = serialized;
94
+ return (s?.kwargs?.model_name ?? s?.kwargs?.model ?? s?.kwargs?.modelName ?? s?.name ?? undefined);
95
+ }
96
+ isAgent(serialized) {
97
+ const name = (serialized.id?.join("/") ?? "").toLowerCase();
98
+ const sName = (serialized.name ?? "").toLowerCase();
99
+ return name.includes("agent") || sName.includes("agent");
100
+ }
101
+ registerRun(runId, parentRunId, info) {
102
+ const isRoot = !this.rootRunId;
103
+ if (isRoot) {
104
+ this.rootRunId = runId;
105
+ this._traceId = generateId();
106
+ // Emit root trace-create event
107
+ this.emit({
108
+ id: generateId(),
109
+ type: "trace-create",
110
+ timestamp: info.startTime.toISOString(),
111
+ body: {
112
+ id: this._traceId,
113
+ name: this.traceName ?? info.name,
114
+ timestamp: info.startTime.toISOString(),
115
+ userId: this.userId,
116
+ sessionId: this.sessionId,
117
+ metadata: this.rootMetadata ?? null,
118
+ input: jsonSerializable(info.input),
119
+ },
120
+ });
121
+ }
122
+ const observationId = generateId();
123
+ const runInfo = { ...info, observationId, parentRunId };
124
+ this.runs.set(runId, runInfo);
125
+ this.runParents.set(observationId, parentRunId ? this.runs.get(parentRunId)?.observationId : undefined);
126
+ return runInfo;
127
+ }
128
+ endRun(runId, output, level = "DEFAULT", statusMessage = null, extra) {
129
+ const run = this.runs.get(runId);
130
+ if (!run)
131
+ return;
132
+ const endTime = new Date();
133
+ this.emitObservation(run, endTime, output, level, statusMessage, extra);
134
+ // If this is the root run completing, update the trace and reset
135
+ if (runId === this.rootRunId) {
136
+ // Emit trace-create with output (update)
137
+ this.emit({
138
+ id: generateId(),
139
+ type: "trace-create",
140
+ timestamp: run.startTime.toISOString(),
141
+ body: {
142
+ id: this._traceId,
143
+ name: this.traceName ?? run.name,
144
+ timestamp: run.startTime.toISOString(),
145
+ output: jsonSerializable(output),
146
+ userId: this.userId,
147
+ sessionId: this.sessionId,
148
+ metadata: this.rootMetadata ?? null,
149
+ },
150
+ });
151
+ this.lastTraceId = this._traceId;
152
+ this.rootRunId = null;
153
+ this._traceId = null;
154
+ this.runs.clear();
155
+ this.runParents.clear();
156
+ this.completionStartTimes.clear();
157
+ }
158
+ else {
159
+ this.runs.delete(runId);
160
+ }
161
+ }
162
+ // ── Chain callbacks ──────────────────────────────────────────────────
163
+ async handleChainStart(chain, inputs, runId, parentRunId, tags, metadata) {
164
+ const name = chain.name ??
165
+ chain.id?.[chain.id.length - 1] ??
166
+ "Chain";
167
+ const type = this.isAgent(chain) ? "chain" : "chain";
168
+ const mergedMetadata = { ...metadata, ...(tags?.length ? { tags } : {}) };
169
+ this.registerRun(runId, parentRunId, {
170
+ type,
171
+ name,
172
+ startTime: new Date(),
173
+ input: inputs,
174
+ metadata: Object.keys(mergedMetadata).length > 0 ? mergedMetadata : undefined,
175
+ });
176
+ }
177
+ async handleChainEnd(outputs, runId, _parentRunId) {
178
+ this.endRun(runId, outputs);
179
+ }
180
+ async handleChainError(error, runId, _parentRunId) {
181
+ // LangGraph GraphBubbleUp is a control flow error, not an actual error
182
+ if (error?.constructor?.name === "GraphBubbleUp" || error?.name === "GraphBubbleUp") {
183
+ this.endRun(runId, null, "DEFAULT", null);
184
+ return;
185
+ }
186
+ this.endRun(runId, null, "ERROR", error.message ?? String(error));
187
+ }
188
+ // ── LLM callbacks ───────────────────────────────────────────────────
189
+ async handleLLMStart(llm, prompts, runId, parentRunId, _extraParams, _tags, metadata) {
190
+ const model = this.extractModelName(llm);
191
+ const name = model ??
192
+ llm.name ??
193
+ llm.id?.[llm.id.length - 1] ??
194
+ "LLM";
195
+ this.registerRun(runId, parentRunId, {
196
+ type: "generation",
197
+ name,
198
+ startTime: new Date(),
199
+ input: prompts.length === 1 ? prompts[0] : prompts,
200
+ model,
201
+ metadata,
202
+ });
203
+ }
204
+ async handleChatModelStart(llm, messages, runId, parentRunId, _extraParams, _tags, metadata) {
205
+ const model = this.extractModelName(llm);
206
+ const name = model ??
207
+ llm.name ??
208
+ llm.id?.[llm.id.length - 1] ??
209
+ "ChatModel";
210
+ // Convert messages to a simpler role/content format
211
+ const formattedMessages = messages.map((msgGroup) => msgGroup.map((msg) => ({
212
+ role: msg._getType(),
213
+ content: msg.content,
214
+ ...(msg.name ? { name: msg.name } : {}),
215
+ })));
216
+ this.registerRun(runId, parentRunId, {
217
+ type: "generation",
218
+ name,
219
+ startTime: new Date(),
220
+ input: formattedMessages.length === 1 ? formattedMessages[0] : formattedMessages,
221
+ model,
222
+ metadata,
223
+ });
224
+ }
225
+ async handleLLMEnd(output, runId, _parentRunId) {
226
+ const extra = {};
227
+ // Extract token usage
228
+ const usage = output.llmOutput?.tokenUsage ?? output.llmOutput?.estimatedTokens ?? null;
229
+ if (usage) {
230
+ if (usage.promptTokens !== undefined)
231
+ extra.promptTokens = usage.promptTokens;
232
+ if (usage.completionTokens !== undefined)
233
+ extra.completionTokens = usage.completionTokens;
234
+ if (usage.totalTokens !== undefined)
235
+ extra.totalTokens = usage.totalTokens;
236
+ }
237
+ // Add TTFT if we have it
238
+ const ttftStart = this.completionStartTimes.get(runId);
239
+ const run = this.runs.get(runId);
240
+ if (ttftStart && run) {
241
+ const ttft = ttftStart.getTime() - run.startTime.getTime();
242
+ if (!run.metadata)
243
+ run.metadata = {};
244
+ run.metadata.timeToFirstToken = ttft;
245
+ }
246
+ // Extract output text
247
+ const generations = output.generations;
248
+ let outputText;
249
+ if (generations.length === 1 && generations[0].length === 1) {
250
+ const gen = generations[0][0];
251
+ // ChatGeneration has a `message` field, base Generation only has `text`
252
+ const genAny = gen;
253
+ outputText = genAny.message ?? gen.text;
254
+ }
255
+ else {
256
+ outputText = generations.map((g) => g.map((gg) => {
257
+ const ggAny = gg;
258
+ return ggAny.message ?? gg.text;
259
+ }));
260
+ }
261
+ this.endRun(runId, outputText, "DEFAULT", null, extra);
262
+ this.completionStartTimes.delete(runId);
263
+ }
264
+ async handleLLMNewToken(_token, _idx, runId) {
265
+ if (!this.completionStartTimes.has(runId)) {
266
+ this.completionStartTimes.set(runId, new Date());
267
+ }
268
+ }
269
+ async handleLLMError(error, runId, _parentRunId) {
270
+ this.endRun(runId, null, "ERROR", error.message ?? String(error));
271
+ this.completionStartTimes.delete(runId);
272
+ }
273
+ // ── Tool callbacks ──────────────────────────────────────────────────
274
+ async handleToolStart(tool, input, runId, parentRunId, _tags, metadata) {
275
+ const name = tool.name ??
276
+ tool.id?.[tool.id.length - 1] ??
277
+ "Tool";
278
+ // Try to parse input as JSON
279
+ let parsedInput = input;
280
+ try {
281
+ parsedInput = JSON.parse(input);
282
+ }
283
+ catch {
284
+ // keep as string
285
+ }
286
+ this.registerRun(runId, parentRunId, {
287
+ type: "tool",
288
+ name,
289
+ startTime: new Date(),
290
+ input: parsedInput,
291
+ metadata,
292
+ });
293
+ }
294
+ async handleToolEnd(output, runId, _parentRunId) {
295
+ // Try to parse output as JSON
296
+ let parsedOutput = output;
297
+ try {
298
+ parsedOutput = JSON.parse(output);
299
+ }
300
+ catch {
301
+ // keep as string
302
+ }
303
+ this.endRun(runId, parsedOutput);
304
+ }
305
+ async handleToolError(error, runId, _parentRunId) {
306
+ this.endRun(runId, null, "ERROR", error.message ?? String(error));
307
+ }
308
+ // ── Retriever callbacks ─────────────────────────────────────────────
309
+ async handleRetrieverStart(retriever, query, runId, parentRunId, _tags, metadata) {
310
+ const name = retriever.name ??
311
+ retriever.id?.[retriever.id.length - 1] ??
312
+ "Retriever";
313
+ this.registerRun(runId, parentRunId, {
314
+ type: "span",
315
+ name,
316
+ startTime: new Date(),
317
+ input: query,
318
+ metadata,
319
+ });
320
+ }
321
+ async handleRetrieverEnd(documents, runId, _parentRunId) {
322
+ const output = documents.map((doc) => ({
323
+ pageContent: doc.pageContent,
324
+ metadata: doc.metadata,
325
+ }));
326
+ this.endRun(runId, output);
327
+ }
328
+ async handleRetrieverError(error, runId, _parentRunId) {
329
+ this.endRun(runId, null, "ERROR", error.message ?? String(error));
330
+ }
331
+ // ── Accessors ───────────────────────────────────────────────────────
332
+ /** Get the current active trace ID (null if no run is active). */
333
+ get traceId() {
334
+ return this._traceId;
335
+ }
336
+ }
337
+ //# sourceMappingURL=langchain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langchain.js","sourceRoot":"","sources":["../../src/integrations/langchain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Imperative Observation handle for span / generation / event.
3
+ */
4
+ import type { UsageDetails } from "./types.js";
5
+ import type { BatchExporter } from "./exporter.js";
6
+ export interface ObservationOptions {
7
+ traceId: string;
8
+ type: "span" | "generation" | "event";
9
+ name: string;
10
+ exporter: BatchExporter | null;
11
+ startTime?: Date;
12
+ parentObservationId?: string;
13
+ input?: unknown;
14
+ model?: string;
15
+ metadata?: Record<string, unknown>;
16
+ usage?: UsageDetails;
17
+ }
18
+ export declare class Observation {
19
+ readonly id: string;
20
+ readonly traceId: string;
21
+ readonly type: "span" | "generation" | "event";
22
+ readonly name: string;
23
+ private readonly exporter;
24
+ private readonly startTime;
25
+ private readonly parentObservationId;
26
+ private input;
27
+ private output;
28
+ private model;
29
+ private metadata;
30
+ private usage;
31
+ private level;
32
+ private statusMessage;
33
+ private ended;
34
+ constructor(opts: ObservationOptions);
35
+ /**
36
+ * Update fields on the observation before ending it.
37
+ */
38
+ update(fields: {
39
+ output?: unknown;
40
+ metadata?: Record<string, unknown>;
41
+ usage?: UsageDetails;
42
+ level?: string;
43
+ statusMessage?: string;
44
+ }): this;
45
+ /**
46
+ * End the observation and emit the trace event.
47
+ */
48
+ end(): void;
49
+ /**
50
+ * Create a child span under this observation.
51
+ */
52
+ span(opts: {
53
+ name: string;
54
+ input?: unknown;
55
+ metadata?: Record<string, unknown>;
56
+ }): Observation;
57
+ }
58
+ //# sourceMappingURL=observation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observation.d.ts","sourceRoot":"","sources":["../src/observation.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,YAAY,CAAC;AAG3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,OAAO,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAED,qBAAa,WAAW;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,OAAO,CAAC;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAO;IACjC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAqB;IAEzD,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,KAAK,CAAS;gBAEV,IAAI,EAAE,kBAAkB;IAcpC;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE;QACb,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,KAAK,CAAC,EAAE,YAAY,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,GAAG,IAAI;IAWR;;OAEG;IACH,GAAG,IAAI,IAAI;IAyCX;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,WAAW;CAW/F"}
@@ -0,0 +1,105 @@
1
+ import { EVENT_TYPE_MAP, OBSERVATION_TYPE_ENUM } from "./types.js";
2
+ import { generateId, jsonSerializable } from "./utils.js";
3
+ export class Observation {
4
+ id;
5
+ traceId;
6
+ type;
7
+ name;
8
+ exporter;
9
+ startTime;
10
+ parentObservationId;
11
+ input;
12
+ output;
13
+ model;
14
+ metadata;
15
+ usage;
16
+ level = "DEFAULT";
17
+ statusMessage;
18
+ ended = false;
19
+ constructor(opts) {
20
+ this.id = generateId();
21
+ this.traceId = opts.traceId;
22
+ this.type = opts.type;
23
+ this.name = opts.name;
24
+ this.exporter = opts.exporter;
25
+ this.startTime = opts.startTime ?? new Date();
26
+ this.parentObservationId = opts.parentObservationId;
27
+ this.input = opts.input;
28
+ this.model = opts.model;
29
+ this.metadata = opts.metadata;
30
+ this.usage = opts.usage;
31
+ }
32
+ /**
33
+ * Update fields on the observation before ending it.
34
+ */
35
+ update(fields) {
36
+ if (fields.output !== undefined)
37
+ this.output = fields.output;
38
+ if (fields.metadata !== undefined) {
39
+ this.metadata = { ...this.metadata, ...fields.metadata };
40
+ }
41
+ if (fields.usage !== undefined)
42
+ this.usage = fields.usage;
43
+ if (fields.level !== undefined)
44
+ this.level = fields.level;
45
+ if (fields.statusMessage !== undefined)
46
+ this.statusMessage = fields.statusMessage;
47
+ return this;
48
+ }
49
+ /**
50
+ * End the observation and emit the trace event.
51
+ */
52
+ end() {
53
+ if (this.ended)
54
+ return;
55
+ this.ended = true;
56
+ const endTime = new Date();
57
+ const createType = EVENT_TYPE_MAP[this.type]?.[0] ?? "span-create";
58
+ const body = {
59
+ id: this.id,
60
+ traceId: this.traceId,
61
+ type: OBSERVATION_TYPE_ENUM[this.type] ?? this.type,
62
+ name: this.name,
63
+ startTime: this.startTime.toISOString(),
64
+ endTime: endTime.toISOString(),
65
+ input: jsonSerializable(this.input),
66
+ output: jsonSerializable(this.output),
67
+ metadata: this.metadata ?? null,
68
+ model: this.model ?? null,
69
+ level: this.level,
70
+ statusMessage: this.statusMessage ?? null,
71
+ parentObservationId: this.parentObservationId ?? null,
72
+ };
73
+ // Add usage fields for generations
74
+ if (this.usage) {
75
+ if (this.usage.promptTokens !== undefined)
76
+ body.promptTokens = this.usage.promptTokens;
77
+ if (this.usage.completionTokens !== undefined)
78
+ body.completionTokens = this.usage.completionTokens;
79
+ if (this.usage.totalTokens !== undefined)
80
+ body.totalTokens = this.usage.totalTokens;
81
+ }
82
+ const event = {
83
+ id: generateId(),
84
+ type: createType,
85
+ timestamp: this.startTime.toISOString(),
86
+ body,
87
+ };
88
+ this.exporter?.enqueue(event);
89
+ }
90
+ /**
91
+ * Create a child span under this observation.
92
+ */
93
+ span(opts) {
94
+ return new Observation({
95
+ traceId: this.traceId,
96
+ type: "span",
97
+ name: opts.name,
98
+ exporter: this.exporter,
99
+ input: opts.input,
100
+ metadata: opts.metadata,
101
+ parentObservationId: this.id,
102
+ });
103
+ }
104
+ }
105
+ //# sourceMappingURL=observation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observation.js","sourceRoot":"","sources":["../src/observation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Create HMAC-SHA256 signature for a tool invocation.
3
+ */
4
+ export declare function sign(sessionToken: string, nonce: string, tool: string, inputData: unknown): string;
5
+ /**
6
+ * Verify HMAC-SHA256 signature.
7
+ */
8
+ export declare function verify(sessionToken: string, nonce: string, tool: string, inputData: unknown, signature: string): boolean;
9
+ /**
10
+ * Tracks single-use nonces with TTL to prevent replay attacks.
11
+ */
12
+ export declare class NonceTracker {
13
+ private seen;
14
+ private ttlMs;
15
+ constructor(ttlSeconds?: number);
16
+ /** Returns true if the nonce is fresh (not seen before). Marks it as used. */
17
+ checkAndMark(nonce: string): boolean;
18
+ private cleanup;
19
+ }
20
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,IAAI,CAClB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,OAAO,GACjB,MAAM,CAIR;AAED;;GAEG;AACH,wBAAgB,MAAM,CACpB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,OAAO,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAOT;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,KAAK,CAAS;gBAEV,UAAU,SAAK;IAI3B,8EAA8E;IAC9E,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAOpC,OAAO,CAAC,OAAO;CAMhB"}
@@ -0,0 +1,46 @@
1
+ import { createHmac, timingSafeEqual } from "node:crypto";
2
+ /**
3
+ * Create HMAC-SHA256 signature for a tool invocation.
4
+ */
5
+ export function sign(sessionToken, nonce, tool, inputData) {
6
+ const payload = nonce + tool + JSON.stringify(inputData, Object.keys(inputData ?? {}).sort());
7
+ return createHmac("sha256", sessionToken).update(payload).digest("hex");
8
+ }
9
+ /**
10
+ * Verify HMAC-SHA256 signature.
11
+ */
12
+ export function verify(sessionToken, nonce, tool, inputData, signature) {
13
+ const expected = sign(sessionToken, nonce, tool, inputData);
14
+ try {
15
+ return timingSafeEqual(Buffer.from(expected, "hex"), Buffer.from(signature, "hex"));
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ }
21
+ /**
22
+ * Tracks single-use nonces with TTL to prevent replay attacks.
23
+ */
24
+ export class NonceTracker {
25
+ seen = new Map();
26
+ ttlMs;
27
+ constructor(ttlSeconds = 60) {
28
+ this.ttlMs = ttlSeconds * 1000;
29
+ }
30
+ /** Returns true if the nonce is fresh (not seen before). Marks it as used. */
31
+ checkAndMark(nonce) {
32
+ this.cleanup();
33
+ if (this.seen.has(nonce))
34
+ return false;
35
+ this.seen.set(nonce, Date.now());
36
+ return true;
37
+ }
38
+ cleanup() {
39
+ const cutoff = Date.now() - this.ttlMs;
40
+ for (const [nonce, time] of this.seen) {
41
+ if (time < cutoff)
42
+ this.seen.delete(nonce);
43
+ }
44
+ }
45
+ }
46
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D;;GAEG;AACH,MAAM,UAAU,IAAI,CAClB,YAAoB,EACpB,KAAa,EACb,IAAY,EACZ,SAAkB;IAElB,MAAM,OAAO,GACX,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAE,SAAoB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5F,OAAO,UAAU,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CACpB,YAAoB,EACpB,KAAa,EACb,IAAY,EACZ,SAAkB,EAClB,SAAiB;IAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,YAAY;IACf,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACjC,KAAK,CAAS;IAEtB,YAAY,UAAU,GAAG,EAAE;QACzB,IAAI,CAAC,KAAK,GAAG,UAAU,GAAG,IAAI,CAAC;IACjC,CAAC;IAED,8EAA8E;IAC9E,YAAY,CAAC,KAAa;QACxB,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,OAAO;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QACvC,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,IAAI,GAAG,MAAM;gBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,32 @@
1
+ export declare class ToolClient {
2
+ private host;
3
+ private publicKey;
4
+ private secretKey;
5
+ private sdkInstanceId;
6
+ private heartbeatInterval;
7
+ private maxReconnectDelay;
8
+ private sessionToken;
9
+ private nonceTracker;
10
+ private running;
11
+ private ws;
12
+ private reconnectTimer;
13
+ private heartbeatTimer;
14
+ constructor(options: {
15
+ host: string;
16
+ publicKey: string;
17
+ secretKey: string;
18
+ sdkInstanceId?: string;
19
+ heartbeatInterval?: number;
20
+ maxReconnectDelay?: number;
21
+ });
22
+ private get wsUrl();
23
+ start(): void;
24
+ stop(): void;
25
+ private connect;
26
+ private cleanup;
27
+ private handleMessage;
28
+ private registerTools;
29
+ private startHeartbeat;
30
+ private handleInvoke;
31
+ }
32
+ //# sourceMappingURL=tool-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-client.d.ts","sourceRoot":"","sources":["../src/tool-client.ts"],"names":[],"mappings":"AAUA,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,iBAAiB,CAAS;IAElC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,cAAc,CAA+C;gBAEzD,OAAO,EAAE;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B;IASD,OAAO,KAAK,KAAK,GAIhB;IAED,KAAK,IAAI,IAAI;IAQb,IAAI,IAAI,IAAI;IAUZ,OAAO,CAAC,OAAO;IAmCf,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,cAAc;YAQR,YAAY;CAsE3B"}