agentlens-sdk 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.
package/README.md ADDED
@@ -0,0 +1,124 @@
1
+ # agentlens-sdk
2
+
3
+ TypeScript SDK for AgentLens — Agent observability that traces decisions, not just API calls.
4
+
5
+ [![npm version](https://img.shields.io/npm/v/agentlens-sdk.svg)](https://www.npmjs.com/package/agentlens-sdk)
6
+ [![license](https://img.shields.io/npm/l/agentlens-sdk.svg)](https://github.com/repi/agentlens/blob/main/LICENSE)
7
+
8
+ ## Install
9
+
10
+ ```bash
11
+ npm install agentlens-sdk
12
+ ```
13
+
14
+ ## Quick Start
15
+
16
+ ```typescript
17
+ import { init, TraceBuilder, shutdown } from "agentlens-sdk";
18
+
19
+ // Initialize the SDK
20
+ init({
21
+ apiKey: "your-api-key",
22
+ endpoint: "https://agentlens.vectry.tech/api",
23
+ });
24
+
25
+ // Create a trace
26
+ const trace = new TraceBuilder("agent-run-123", "My Agent Task");
27
+
28
+ // Add a span (tool call, LLM call, etc.)
29
+ trace.addSpan({
30
+ name: "search-documents",
31
+ type: "tool",
32
+ input: { query: "quarterly report" },
33
+ output: { results: 5 },
34
+ });
35
+
36
+ // Record a decision point
37
+ trace.addDecision({
38
+ name: "select-tool",
39
+ type: "tool_selection",
40
+ options: ["search", "calculate", "summarize"],
41
+ selected: "search",
42
+ reasoning: "User asked for document lookup",
43
+ });
44
+
45
+ // Finalize and send
46
+ await trace.end();
47
+
48
+ // Flush remaining data before exit
49
+ await shutdown();
50
+ ```
51
+
52
+ ## API Reference
53
+
54
+ ### Core Functions
55
+
56
+ | Function | Description |
57
+ |---|---|
58
+ | `init(options)` | Initialize the SDK with your API key and configuration. |
59
+ | `shutdown()` | Flush pending data and shut down the transport. |
60
+ | `flush()` | Manually flush the current batch without shutting down. |
61
+ | `getClient()` | Return the initialized client instance. |
62
+
63
+ ### TraceBuilder
64
+
65
+ The primary interface for constructing traces.
66
+
67
+ ```typescript
68
+ const trace = new TraceBuilder(traceId: string, name: string);
69
+
70
+ trace.addSpan(span: SpanPayload); // Add a span to the trace
71
+ trace.addDecision(decision: DecisionPointPayload); // Record a decision point
72
+ trace.end(): Promise<void>; // Finalize and send the trace
73
+ ```
74
+
75
+ ### Standalone Helpers
76
+
77
+ | Function | Description |
78
+ |---|---|
79
+ | `createDecision(decision)` | Create and send a standalone decision point outside a trace. |
80
+
81
+ ## Types
82
+
83
+ Core payload types used throughout the SDK:
84
+
85
+ - **`TracePayload`** — Top-level trace structure containing spans and metadata.
86
+ - **`SpanPayload`** — Individual unit of work (tool call, LLM request, retrieval, etc.).
87
+ - **`DecisionPointPayload`** — A recorded decision: what options existed, what was chosen, and why.
88
+ - **`EventPayload`** — Discrete event within a span or trace.
89
+ - **`JsonValue`** — Flexible JSON-compatible value type for inputs/outputs.
90
+
91
+ ## Enums
92
+
93
+ | Enum | Values |
94
+ |---|---|
95
+ | `TraceStatus` | Status of the overall trace (e.g., running, completed, failed). |
96
+ | `SpanType` | Category of span (e.g., tool, llm, retrieval). |
97
+ | `SpanStatus` | Status of an individual span. |
98
+ | `DecisionType` | Category of decision (e.g., tool_selection, routing). |
99
+ | `EventType` | Category of event within a span. |
100
+
101
+ ## Configuration
102
+
103
+ Pass `InitOptions` to `init()`:
104
+
105
+ ```typescript
106
+ init({
107
+ apiKey: "your-api-key", // Required. Your AgentLens API key.
108
+ endpoint: "https://...", // API endpoint. Defaults to AgentLens cloud.
109
+ maxBatchSize: 100, // Max items per batch before auto-flush.
110
+ flushInterval: 5000, // Auto-flush interval in milliseconds.
111
+ });
112
+ ```
113
+
114
+ ## Transport
115
+
116
+ The SDK ships with `BatchTransport`, which batches payloads and flushes them on an interval or when the batch size threshold is reached. This is used internally by `init()` — you typically do not need to instantiate it directly.
117
+
118
+ ## Documentation
119
+
120
+ Full documentation: [agentlens.vectry.tech/docs/typescript-sdk](https://agentlens.vectry.tech/docs/typescript-sdk)
121
+
122
+ ## License
123
+
124
+ MIT
package/dist/index.cjs ADDED
@@ -0,0 +1,320 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ BatchTransport: () => BatchTransport,
24
+ DecisionType: () => DecisionType,
25
+ EventType: () => EventType,
26
+ SpanStatus: () => SpanStatus,
27
+ SpanType: () => SpanType,
28
+ TraceBuilder: () => TraceBuilder,
29
+ TraceStatus: () => TraceStatus,
30
+ createDecision: () => createDecision,
31
+ flush: () => flush,
32
+ generateId: () => generateId,
33
+ getClient: () => getClient,
34
+ init: () => init,
35
+ nowISO: () => nowISO,
36
+ shutdown: () => shutdown
37
+ });
38
+ module.exports = __toCommonJS(index_exports);
39
+
40
+ // src/transport.ts
41
+ var BatchTransport = class {
42
+ apiKey;
43
+ endpoint;
44
+ maxBatchSize;
45
+ flushInterval;
46
+ buffer = [];
47
+ timer = null;
48
+ constructor(options) {
49
+ this.apiKey = options.apiKey;
50
+ this.endpoint = options.endpoint.replace(/\/+$/, "");
51
+ this.maxBatchSize = options.maxBatchSize ?? 10;
52
+ this.flushInterval = options.flushInterval ?? 5e3;
53
+ this.timer = setInterval(() => {
54
+ void this._doFlush();
55
+ }, this.flushInterval);
56
+ }
57
+ add(trace) {
58
+ this.buffer.push(trace);
59
+ if (this.buffer.length >= this.maxBatchSize) {
60
+ void this._doFlush();
61
+ }
62
+ }
63
+ async flush() {
64
+ await this._doFlush();
65
+ }
66
+ async shutdown() {
67
+ if (this.timer !== null) {
68
+ clearInterval(this.timer);
69
+ this.timer = null;
70
+ }
71
+ await this._doFlush();
72
+ }
73
+ async _doFlush() {
74
+ if (this.buffer.length === 0) {
75
+ return;
76
+ }
77
+ const batch = this.buffer.splice(0, this.buffer.length);
78
+ try {
79
+ const response = await fetch(`${this.endpoint}/api/traces`, {
80
+ method: "POST",
81
+ headers: {
82
+ Authorization: `Bearer ${this.apiKey}`,
83
+ "Content-Type": "application/json"
84
+ },
85
+ body: JSON.stringify({ traces: batch })
86
+ });
87
+ if (!response.ok) {
88
+ const text = await response.text().catch(() => "");
89
+ console.warn(
90
+ `AgentLens: Failed to send traces (HTTP ${response.status}): ${text.slice(0, 200)}`
91
+ );
92
+ }
93
+ } catch (error) {
94
+ const message = error instanceof Error ? error.message : String(error);
95
+ console.warn(`AgentLens: Failed to send traces: ${message}`);
96
+ }
97
+ }
98
+ };
99
+
100
+ // src/_registry.ts
101
+ var _transport = null;
102
+ function _setTransport(transport) {
103
+ _transport = transport;
104
+ }
105
+ function _getTransport() {
106
+ return _transport;
107
+ }
108
+
109
+ // src/models.ts
110
+ var import_crypto = require("crypto");
111
+ var TraceStatus = {
112
+ RUNNING: "RUNNING",
113
+ COMPLETED: "COMPLETED",
114
+ ERROR: "ERROR"
115
+ };
116
+ var DecisionType = {
117
+ TOOL_SELECTION: "TOOL_SELECTION",
118
+ ROUTING: "ROUTING",
119
+ RETRY: "RETRY",
120
+ ESCALATION: "ESCALATION",
121
+ MEMORY_RETRIEVAL: "MEMORY_RETRIEVAL",
122
+ PLANNING: "PLANNING",
123
+ CUSTOM: "CUSTOM"
124
+ };
125
+ var SpanType = {
126
+ LLM_CALL: "LLM_CALL",
127
+ TOOL_CALL: "TOOL_CALL",
128
+ MEMORY_OP: "MEMORY_OP",
129
+ CHAIN: "CHAIN",
130
+ AGENT: "AGENT",
131
+ CUSTOM: "CUSTOM"
132
+ };
133
+ var SpanStatus = {
134
+ RUNNING: "RUNNING",
135
+ COMPLETED: "COMPLETED",
136
+ ERROR: "ERROR"
137
+ };
138
+ var EventType = {
139
+ ERROR: "ERROR",
140
+ RETRY: "RETRY",
141
+ FALLBACK: "FALLBACK",
142
+ CONTEXT_OVERFLOW: "CONTEXT_OVERFLOW",
143
+ USER_FEEDBACK: "USER_FEEDBACK",
144
+ CUSTOM: "CUSTOM"
145
+ };
146
+ function generateId() {
147
+ return (0, import_crypto.randomUUID)();
148
+ }
149
+ function nowISO() {
150
+ return (/* @__PURE__ */ new Date()).toISOString();
151
+ }
152
+
153
+ // src/trace.ts
154
+ var TraceBuilder = class {
155
+ trace;
156
+ startMs;
157
+ constructor(name, options) {
158
+ this.startMs = Date.now();
159
+ this.trace = {
160
+ id: generateId(),
161
+ name,
162
+ sessionId: options?.sessionId,
163
+ status: TraceStatus.RUNNING,
164
+ tags: options?.tags ?? [],
165
+ metadata: options?.metadata,
166
+ startedAt: nowISO(),
167
+ decisionPoints: [],
168
+ spans: [],
169
+ events: []
170
+ };
171
+ }
172
+ addSpan(input) {
173
+ const id = input.id ?? generateId();
174
+ const span = {
175
+ id,
176
+ parentSpanId: input.parentSpanId,
177
+ name: input.name,
178
+ type: input.type,
179
+ input: input.input,
180
+ output: input.output,
181
+ tokenCount: input.tokenCount,
182
+ costUsd: input.costUsd,
183
+ durationMs: input.durationMs,
184
+ status: input.status ?? SpanStatus.RUNNING,
185
+ statusMessage: input.statusMessage,
186
+ startedAt: input.startedAt ?? nowISO(),
187
+ endedAt: input.endedAt,
188
+ metadata: input.metadata
189
+ };
190
+ this.trace.spans.push(span);
191
+ return id;
192
+ }
193
+ addDecision(input) {
194
+ const id = input.id ?? generateId();
195
+ const decision = {
196
+ id,
197
+ type: input.type,
198
+ chosen: input.chosen,
199
+ alternatives: input.alternatives ?? [],
200
+ reasoning: input.reasoning,
201
+ contextSnapshot: input.contextSnapshot,
202
+ durationMs: input.durationMs,
203
+ costUsd: input.costUsd,
204
+ parentSpanId: input.parentSpanId,
205
+ timestamp: input.timestamp ?? nowISO()
206
+ };
207
+ this.trace.decisionPoints.push(decision);
208
+ return id;
209
+ }
210
+ addEvent(input) {
211
+ const id = input.id ?? generateId();
212
+ const event = {
213
+ id,
214
+ spanId: input.spanId,
215
+ type: input.type,
216
+ name: input.name,
217
+ metadata: input.metadata,
218
+ timestamp: input.timestamp ?? nowISO()
219
+ };
220
+ this.trace.events.push(event);
221
+ return id;
222
+ }
223
+ setStatus(status) {
224
+ this.trace.status = status;
225
+ return this;
226
+ }
227
+ setMetadata(metadata) {
228
+ this.trace.metadata = metadata;
229
+ return this;
230
+ }
231
+ toPayload() {
232
+ return { ...this.trace };
233
+ }
234
+ end(options) {
235
+ const endedAt = nowISO();
236
+ this.trace.endedAt = endedAt;
237
+ this.trace.totalDuration = Date.now() - this.startMs;
238
+ this.trace.status = options?.status ?? TraceStatus.COMPLETED;
239
+ if (options?.metadata !== void 0) {
240
+ this.trace.metadata = options.metadata;
241
+ }
242
+ if (options?.totalCost !== void 0) {
243
+ this.trace.totalCost = options.totalCost;
244
+ }
245
+ if (options?.totalTokens !== void 0) {
246
+ this.trace.totalTokens = options.totalTokens;
247
+ }
248
+ const transport = _getTransport();
249
+ if (transport) {
250
+ transport.add(this.trace);
251
+ }
252
+ return { ...this.trace };
253
+ }
254
+ };
255
+
256
+ // src/decision.ts
257
+ function createDecision(input) {
258
+ return {
259
+ id: generateId(),
260
+ type: input.type,
261
+ chosen: input.chosen,
262
+ alternatives: input.alternatives ?? [],
263
+ reasoning: input.reasoning,
264
+ contextSnapshot: input.contextSnapshot,
265
+ durationMs: input.durationMs,
266
+ costUsd: input.costUsd,
267
+ parentSpanId: input.parentSpanId,
268
+ timestamp: input.timestamp ?? nowISO()
269
+ };
270
+ }
271
+
272
+ // src/index.ts
273
+ function init(options) {
274
+ const existing = _getTransport();
275
+ if (existing) {
276
+ void existing.shutdown();
277
+ }
278
+ _setTransport(
279
+ new BatchTransport({
280
+ apiKey: options.apiKey,
281
+ endpoint: options.endpoint ?? "https://agentlens.vectry.tech",
282
+ maxBatchSize: options.maxBatchSize,
283
+ flushInterval: options.flushInterval
284
+ })
285
+ );
286
+ }
287
+ async function shutdown() {
288
+ const transport = _getTransport();
289
+ if (transport) {
290
+ await transport.shutdown();
291
+ _setTransport(null);
292
+ }
293
+ }
294
+ function getClient() {
295
+ return _getTransport();
296
+ }
297
+ async function flush() {
298
+ const transport = _getTransport();
299
+ if (transport) {
300
+ await transport.flush();
301
+ }
302
+ }
303
+ // Annotate the CommonJS export names for ESM import in node:
304
+ 0 && (module.exports = {
305
+ BatchTransport,
306
+ DecisionType,
307
+ EventType,
308
+ SpanStatus,
309
+ SpanType,
310
+ TraceBuilder,
311
+ TraceStatus,
312
+ createDecision,
313
+ flush,
314
+ generateId,
315
+ getClient,
316
+ init,
317
+ nowISO,
318
+ shutdown
319
+ });
320
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/transport.ts","../src/_registry.ts","../src/models.ts","../src/trace.ts","../src/decision.ts"],"sourcesContent":["import { BatchTransport } from \"./transport.js\";\nimport { _setTransport, _getTransport } from \"./_registry.js\";\n\nexport interface InitOptions {\n apiKey: string;\n endpoint?: string;\n maxBatchSize?: number;\n flushInterval?: number;\n}\n\nexport function init(options: InitOptions): void {\n const existing = _getTransport();\n if (existing) {\n void existing.shutdown();\n }\n _setTransport(\n new BatchTransport({\n apiKey: options.apiKey,\n endpoint: options.endpoint ?? \"https://agentlens.vectry.tech\",\n maxBatchSize: options.maxBatchSize,\n flushInterval: options.flushInterval,\n }),\n );\n}\n\nexport async function shutdown(): Promise<void> {\n const transport = _getTransport();\n if (transport) {\n await transport.shutdown();\n _setTransport(null);\n }\n}\n\nexport function getClient(): BatchTransport | null {\n return _getTransport();\n}\n\nexport async function flush(): Promise<void> {\n const transport = _getTransport();\n if (transport) {\n await transport.flush();\n }\n}\n\nexport {\n TraceStatus,\n DecisionType,\n SpanType,\n SpanStatus,\n EventType,\n generateId,\n nowISO,\n} from \"./models.js\";\n\nexport type {\n JsonValue,\n DecisionPointPayload,\n SpanPayload,\n EventPayload,\n TracePayload,\n} from \"./models.js\";\n\nexport { BatchTransport } from \"./transport.js\";\nexport type { BatchTransportOptions } from \"./transport.js\";\n\nexport { TraceBuilder } from \"./trace.js\";\nexport type {\n TraceBuilderOptions,\n AddSpanInput,\n AddDecisionInput,\n AddEventInput,\n EndOptions,\n} from \"./trace.js\";\n\nexport { createDecision } from \"./decision.js\";\nexport type { CreateDecisionInput } from \"./decision.js\";\n","import type { TracePayload } from \"./models.js\";\n\nexport interface BatchTransportOptions {\n apiKey: string;\n endpoint: string;\n maxBatchSize?: number;\n flushInterval?: number;\n}\n\nexport class BatchTransport {\n private readonly apiKey: string;\n private readonly endpoint: string;\n private readonly maxBatchSize: number;\n private readonly flushInterval: number;\n private buffer: TracePayload[] = [];\n private timer: ReturnType<typeof setInterval> | null = null;\n\n constructor(options: BatchTransportOptions) {\n this.apiKey = options.apiKey;\n this.endpoint = options.endpoint.replace(/\\/+$/, \"\");\n this.maxBatchSize = options.maxBatchSize ?? 10;\n this.flushInterval = options.flushInterval ?? 5_000;\n\n this.timer = setInterval(() => {\n void this._doFlush();\n }, this.flushInterval);\n }\n\n add(trace: TracePayload): void {\n this.buffer.push(trace);\n if (this.buffer.length >= this.maxBatchSize) {\n void this._doFlush();\n }\n }\n\n async flush(): Promise<void> {\n await this._doFlush();\n }\n\n async shutdown(): Promise<void> {\n if (this.timer !== null) {\n clearInterval(this.timer);\n this.timer = null;\n }\n await this._doFlush();\n }\n\n private async _doFlush(): Promise<void> {\n if (this.buffer.length === 0) {\n return;\n }\n\n const batch = this.buffer.splice(0, this.buffer.length);\n\n try {\n const response = await fetch(`${this.endpoint}/api/traces`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ traces: batch }),\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n console.warn(\n `AgentLens: Failed to send traces (HTTP ${response.status}): ${text.slice(0, 200)}`,\n );\n }\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : String(error);\n console.warn(`AgentLens: Failed to send traces: ${message}`);\n }\n }\n}\n","import type { BatchTransport } from \"./transport.js\";\n\nlet _transport: BatchTransport | null = null;\n\nexport function _setTransport(transport: BatchTransport | null): void {\n _transport = transport;\n}\n\nexport function _getTransport(): BatchTransport | null {\n return _transport;\n}\n","import { randomUUID } from \"crypto\";\n\n// ---------------------------------------------------------------------------\n// JSON value type (replaces Prisma.JsonValue for the SDK)\n// ---------------------------------------------------------------------------\n\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\n// ---------------------------------------------------------------------------\n// Enums (as const + type union pattern — NO TypeScript enum keyword)\n// ---------------------------------------------------------------------------\n\nexport const TraceStatus = {\n RUNNING: \"RUNNING\",\n COMPLETED: \"COMPLETED\",\n ERROR: \"ERROR\",\n} as const;\nexport type TraceStatus = (typeof TraceStatus)[keyof typeof TraceStatus];\n\nexport const DecisionType = {\n TOOL_SELECTION: \"TOOL_SELECTION\",\n ROUTING: \"ROUTING\",\n RETRY: \"RETRY\",\n ESCALATION: \"ESCALATION\",\n MEMORY_RETRIEVAL: \"MEMORY_RETRIEVAL\",\n PLANNING: \"PLANNING\",\n CUSTOM: \"CUSTOM\",\n} as const;\nexport type DecisionType = (typeof DecisionType)[keyof typeof DecisionType];\n\nexport const SpanType = {\n LLM_CALL: \"LLM_CALL\",\n TOOL_CALL: \"TOOL_CALL\",\n MEMORY_OP: \"MEMORY_OP\",\n CHAIN: \"CHAIN\",\n AGENT: \"AGENT\",\n CUSTOM: \"CUSTOM\",\n} as const;\nexport type SpanType = (typeof SpanType)[keyof typeof SpanType];\n\nexport const SpanStatus = {\n RUNNING: \"RUNNING\",\n COMPLETED: \"COMPLETED\",\n ERROR: \"ERROR\",\n} as const;\nexport type SpanStatus = (typeof SpanStatus)[keyof typeof SpanStatus];\n\nexport const EventType = {\n ERROR: \"ERROR\",\n RETRY: \"RETRY\",\n FALLBACK: \"FALLBACK\",\n CONTEXT_OVERFLOW: \"CONTEXT_OVERFLOW\",\n USER_FEEDBACK: \"USER_FEEDBACK\",\n CUSTOM: \"CUSTOM\",\n} as const;\nexport type EventType = (typeof EventType)[keyof typeof EventType];\n\n// ---------------------------------------------------------------------------\n// Wire-format interfaces (camelCase, matching POST /api/traces contract)\n// ---------------------------------------------------------------------------\n\nexport interface DecisionPointPayload {\n id: string;\n type: DecisionType;\n chosen: JsonValue;\n alternatives: JsonValue[];\n reasoning?: string;\n contextSnapshot?: JsonValue;\n durationMs?: number;\n costUsd?: number;\n parentSpanId?: string;\n timestamp: string;\n}\n\nexport interface SpanPayload {\n id: string;\n parentSpanId?: string;\n name: string;\n type: SpanType;\n input?: JsonValue;\n output?: JsonValue;\n tokenCount?: number;\n costUsd?: number;\n durationMs?: number;\n status: SpanStatus;\n statusMessage?: string;\n startedAt: string;\n endedAt?: string;\n metadata?: JsonValue;\n}\n\nexport interface EventPayload {\n id: string;\n spanId?: string;\n type: EventType;\n name: string;\n metadata?: JsonValue;\n timestamp: string;\n}\n\nexport interface TracePayload {\n id: string;\n name: string;\n sessionId?: string;\n status: TraceStatus;\n tags: string[];\n metadata?: JsonValue;\n totalCost?: number;\n totalTokens?: number;\n totalDuration?: number;\n startedAt: string;\n endedAt?: string;\n decisionPoints: DecisionPointPayload[];\n spans: SpanPayload[];\n events: EventPayload[];\n}\n\n// ---------------------------------------------------------------------------\n// Helper functions\n// ---------------------------------------------------------------------------\n\n/** Generate a v4 UUID. */\nexport function generateId(): string {\n return randomUUID();\n}\n\n/** Return the current time as an ISO-8601 string. */\nexport function nowISO(): string {\n return new Date().toISOString();\n}\n","import type {\n TracePayload,\n SpanPayload,\n DecisionPointPayload,\n EventPayload,\n JsonValue,\n TraceStatus,\n SpanType,\n SpanStatus,\n DecisionType,\n EventType,\n} from \"./models.js\";\nimport {\n generateId,\n nowISO,\n TraceStatus as TraceStatusValues,\n SpanStatus as SpanStatusValues,\n} from \"./models.js\";\nimport { _getTransport } from \"./_registry.js\";\n\nexport interface TraceBuilderOptions {\n sessionId?: string;\n tags?: string[];\n metadata?: JsonValue;\n}\n\nexport interface AddSpanInput {\n id?: string;\n parentSpanId?: string;\n name: string;\n type: SpanType;\n input?: JsonValue;\n output?: JsonValue;\n tokenCount?: number;\n costUsd?: number;\n durationMs?: number;\n status?: SpanStatus;\n statusMessage?: string;\n startedAt?: string;\n endedAt?: string;\n metadata?: JsonValue;\n}\n\nexport interface AddDecisionInput {\n id?: string;\n type: DecisionType;\n chosen: JsonValue;\n alternatives?: JsonValue[];\n reasoning?: string;\n contextSnapshot?: JsonValue;\n durationMs?: number;\n costUsd?: number;\n parentSpanId?: string;\n timestamp?: string;\n}\n\nexport interface AddEventInput {\n id?: string;\n spanId?: string;\n type: EventType;\n name: string;\n metadata?: JsonValue;\n timestamp?: string;\n}\n\nexport interface EndOptions {\n status?: TraceStatus;\n metadata?: JsonValue;\n totalCost?: number;\n totalTokens?: number;\n}\n\nexport class TraceBuilder {\n private readonly trace: TracePayload;\n private readonly startMs: number;\n\n constructor(name: string, options?: TraceBuilderOptions) {\n this.startMs = Date.now();\n this.trace = {\n id: generateId(),\n name,\n sessionId: options?.sessionId,\n status: TraceStatusValues.RUNNING,\n tags: options?.tags ?? [],\n metadata: options?.metadata,\n startedAt: nowISO(),\n decisionPoints: [],\n spans: [],\n events: [],\n };\n }\n\n addSpan(input: AddSpanInput): string {\n const id = input.id ?? generateId();\n const span: SpanPayload = {\n id,\n parentSpanId: input.parentSpanId,\n name: input.name,\n type: input.type,\n input: input.input,\n output: input.output,\n tokenCount: input.tokenCount,\n costUsd: input.costUsd,\n durationMs: input.durationMs,\n status: input.status ?? SpanStatusValues.RUNNING,\n statusMessage: input.statusMessage,\n startedAt: input.startedAt ?? nowISO(),\n endedAt: input.endedAt,\n metadata: input.metadata,\n };\n this.trace.spans.push(span);\n return id;\n }\n\n addDecision(input: AddDecisionInput): string {\n const id = input.id ?? generateId();\n const decision: DecisionPointPayload = {\n id,\n type: input.type,\n chosen: input.chosen,\n alternatives: input.alternatives ?? [],\n reasoning: input.reasoning,\n contextSnapshot: input.contextSnapshot,\n durationMs: input.durationMs,\n costUsd: input.costUsd,\n parentSpanId: input.parentSpanId,\n timestamp: input.timestamp ?? nowISO(),\n };\n this.trace.decisionPoints.push(decision);\n return id;\n }\n\n addEvent(input: AddEventInput): string {\n const id = input.id ?? generateId();\n const event: EventPayload = {\n id,\n spanId: input.spanId,\n type: input.type,\n name: input.name,\n metadata: input.metadata,\n timestamp: input.timestamp ?? nowISO(),\n };\n this.trace.events.push(event);\n return id;\n }\n\n setStatus(status: TraceStatus): this {\n this.trace.status = status;\n return this;\n }\n\n setMetadata(metadata: JsonValue): this {\n this.trace.metadata = metadata;\n return this;\n }\n\n toPayload(): TracePayload {\n return { ...this.trace };\n }\n\n end(options?: EndOptions): TracePayload {\n const endedAt = nowISO();\n this.trace.endedAt = endedAt;\n this.trace.totalDuration = Date.now() - this.startMs;\n this.trace.status =\n options?.status ?? TraceStatusValues.COMPLETED;\n\n if (options?.metadata !== undefined) {\n this.trace.metadata = options.metadata;\n }\n if (options?.totalCost !== undefined) {\n this.trace.totalCost = options.totalCost;\n }\n if (options?.totalTokens !== undefined) {\n this.trace.totalTokens = options.totalTokens;\n }\n\n const transport = _getTransport();\n if (transport) {\n transport.add(this.trace);\n }\n\n return { ...this.trace };\n }\n}\n","import type { DecisionPointPayload, DecisionType, JsonValue } from \"./models.js\";\nimport { generateId, nowISO } from \"./models.js\";\n\nexport interface CreateDecisionInput {\n type: DecisionType;\n chosen: JsonValue;\n alternatives?: JsonValue[];\n reasoning?: string;\n contextSnapshot?: JsonValue;\n durationMs?: number;\n costUsd?: number;\n parentSpanId?: string;\n timestamp?: string;\n}\n\nexport function createDecision(input: CreateDecisionInput): DecisionPointPayload {\n return {\n id: generateId(),\n type: input.type,\n chosen: input.chosen,\n alternatives: input.alternatives ?? [],\n reasoning: input.reasoning,\n contextSnapshot: input.contextSnapshot,\n durationMs: input.durationMs,\n costUsd: input.costUsd,\n parentSpanId: input.parentSpanId,\n timestamp: input.timestamp ?? nowISO(),\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,205 @@
1
+ type JsonValue = string | number | boolean | null | JsonValue[] | {
2
+ [key: string]: JsonValue;
3
+ };
4
+ declare const TraceStatus: {
5
+ readonly RUNNING: "RUNNING";
6
+ readonly COMPLETED: "COMPLETED";
7
+ readonly ERROR: "ERROR";
8
+ };
9
+ type TraceStatus = (typeof TraceStatus)[keyof typeof TraceStatus];
10
+ declare const DecisionType: {
11
+ readonly TOOL_SELECTION: "TOOL_SELECTION";
12
+ readonly ROUTING: "ROUTING";
13
+ readonly RETRY: "RETRY";
14
+ readonly ESCALATION: "ESCALATION";
15
+ readonly MEMORY_RETRIEVAL: "MEMORY_RETRIEVAL";
16
+ readonly PLANNING: "PLANNING";
17
+ readonly CUSTOM: "CUSTOM";
18
+ };
19
+ type DecisionType = (typeof DecisionType)[keyof typeof DecisionType];
20
+ declare const SpanType: {
21
+ readonly LLM_CALL: "LLM_CALL";
22
+ readonly TOOL_CALL: "TOOL_CALL";
23
+ readonly MEMORY_OP: "MEMORY_OP";
24
+ readonly CHAIN: "CHAIN";
25
+ readonly AGENT: "AGENT";
26
+ readonly CUSTOM: "CUSTOM";
27
+ };
28
+ type SpanType = (typeof SpanType)[keyof typeof SpanType];
29
+ declare const SpanStatus: {
30
+ readonly RUNNING: "RUNNING";
31
+ readonly COMPLETED: "COMPLETED";
32
+ readonly ERROR: "ERROR";
33
+ };
34
+ type SpanStatus = (typeof SpanStatus)[keyof typeof SpanStatus];
35
+ declare const EventType: {
36
+ readonly ERROR: "ERROR";
37
+ readonly RETRY: "RETRY";
38
+ readonly FALLBACK: "FALLBACK";
39
+ readonly CONTEXT_OVERFLOW: "CONTEXT_OVERFLOW";
40
+ readonly USER_FEEDBACK: "USER_FEEDBACK";
41
+ readonly CUSTOM: "CUSTOM";
42
+ };
43
+ type EventType = (typeof EventType)[keyof typeof EventType];
44
+ interface DecisionPointPayload {
45
+ id: string;
46
+ type: DecisionType;
47
+ chosen: JsonValue;
48
+ alternatives: JsonValue[];
49
+ reasoning?: string;
50
+ contextSnapshot?: JsonValue;
51
+ durationMs?: number;
52
+ costUsd?: number;
53
+ parentSpanId?: string;
54
+ timestamp: string;
55
+ }
56
+ interface SpanPayload {
57
+ id: string;
58
+ parentSpanId?: string;
59
+ name: string;
60
+ type: SpanType;
61
+ input?: JsonValue;
62
+ output?: JsonValue;
63
+ tokenCount?: number;
64
+ costUsd?: number;
65
+ durationMs?: number;
66
+ status: SpanStatus;
67
+ statusMessage?: string;
68
+ startedAt: string;
69
+ endedAt?: string;
70
+ metadata?: JsonValue;
71
+ }
72
+ interface EventPayload {
73
+ id: string;
74
+ spanId?: string;
75
+ type: EventType;
76
+ name: string;
77
+ metadata?: JsonValue;
78
+ timestamp: string;
79
+ }
80
+ interface TracePayload {
81
+ id: string;
82
+ name: string;
83
+ sessionId?: string;
84
+ status: TraceStatus;
85
+ tags: string[];
86
+ metadata?: JsonValue;
87
+ totalCost?: number;
88
+ totalTokens?: number;
89
+ totalDuration?: number;
90
+ startedAt: string;
91
+ endedAt?: string;
92
+ decisionPoints: DecisionPointPayload[];
93
+ spans: SpanPayload[];
94
+ events: EventPayload[];
95
+ }
96
+ /** Generate a v4 UUID. */
97
+ declare function generateId(): string;
98
+ /** Return the current time as an ISO-8601 string. */
99
+ declare function nowISO(): string;
100
+
101
+ interface BatchTransportOptions {
102
+ apiKey: string;
103
+ endpoint: string;
104
+ maxBatchSize?: number;
105
+ flushInterval?: number;
106
+ }
107
+ declare class BatchTransport {
108
+ private readonly apiKey;
109
+ private readonly endpoint;
110
+ private readonly maxBatchSize;
111
+ private readonly flushInterval;
112
+ private buffer;
113
+ private timer;
114
+ constructor(options: BatchTransportOptions);
115
+ add(trace: TracePayload): void;
116
+ flush(): Promise<void>;
117
+ shutdown(): Promise<void>;
118
+ private _doFlush;
119
+ }
120
+
121
+ interface TraceBuilderOptions {
122
+ sessionId?: string;
123
+ tags?: string[];
124
+ metadata?: JsonValue;
125
+ }
126
+ interface AddSpanInput {
127
+ id?: string;
128
+ parentSpanId?: string;
129
+ name: string;
130
+ type: SpanType;
131
+ input?: JsonValue;
132
+ output?: JsonValue;
133
+ tokenCount?: number;
134
+ costUsd?: number;
135
+ durationMs?: number;
136
+ status?: SpanStatus;
137
+ statusMessage?: string;
138
+ startedAt?: string;
139
+ endedAt?: string;
140
+ metadata?: JsonValue;
141
+ }
142
+ interface AddDecisionInput {
143
+ id?: string;
144
+ type: DecisionType;
145
+ chosen: JsonValue;
146
+ alternatives?: JsonValue[];
147
+ reasoning?: string;
148
+ contextSnapshot?: JsonValue;
149
+ durationMs?: number;
150
+ costUsd?: number;
151
+ parentSpanId?: string;
152
+ timestamp?: string;
153
+ }
154
+ interface AddEventInput {
155
+ id?: string;
156
+ spanId?: string;
157
+ type: EventType;
158
+ name: string;
159
+ metadata?: JsonValue;
160
+ timestamp?: string;
161
+ }
162
+ interface EndOptions {
163
+ status?: TraceStatus;
164
+ metadata?: JsonValue;
165
+ totalCost?: number;
166
+ totalTokens?: number;
167
+ }
168
+ declare class TraceBuilder {
169
+ private readonly trace;
170
+ private readonly startMs;
171
+ constructor(name: string, options?: TraceBuilderOptions);
172
+ addSpan(input: AddSpanInput): string;
173
+ addDecision(input: AddDecisionInput): string;
174
+ addEvent(input: AddEventInput): string;
175
+ setStatus(status: TraceStatus): this;
176
+ setMetadata(metadata: JsonValue): this;
177
+ toPayload(): TracePayload;
178
+ end(options?: EndOptions): TracePayload;
179
+ }
180
+
181
+ interface CreateDecisionInput {
182
+ type: DecisionType;
183
+ chosen: JsonValue;
184
+ alternatives?: JsonValue[];
185
+ reasoning?: string;
186
+ contextSnapshot?: JsonValue;
187
+ durationMs?: number;
188
+ costUsd?: number;
189
+ parentSpanId?: string;
190
+ timestamp?: string;
191
+ }
192
+ declare function createDecision(input: CreateDecisionInput): DecisionPointPayload;
193
+
194
+ interface InitOptions {
195
+ apiKey: string;
196
+ endpoint?: string;
197
+ maxBatchSize?: number;
198
+ flushInterval?: number;
199
+ }
200
+ declare function init(options: InitOptions): void;
201
+ declare function shutdown(): Promise<void>;
202
+ declare function getClient(): BatchTransport | null;
203
+ declare function flush(): Promise<void>;
204
+
205
+ export { type AddDecisionInput, type AddEventInput, type AddSpanInput, BatchTransport, type BatchTransportOptions, type CreateDecisionInput, type DecisionPointPayload, DecisionType, type EndOptions, type EventPayload, EventType, type InitOptions, type JsonValue, type SpanPayload, SpanStatus, SpanType, TraceBuilder, type TraceBuilderOptions, type TracePayload, TraceStatus, createDecision, flush, generateId, getClient, init, nowISO, shutdown };
@@ -0,0 +1,205 @@
1
+ type JsonValue = string | number | boolean | null | JsonValue[] | {
2
+ [key: string]: JsonValue;
3
+ };
4
+ declare const TraceStatus: {
5
+ readonly RUNNING: "RUNNING";
6
+ readonly COMPLETED: "COMPLETED";
7
+ readonly ERROR: "ERROR";
8
+ };
9
+ type TraceStatus = (typeof TraceStatus)[keyof typeof TraceStatus];
10
+ declare const DecisionType: {
11
+ readonly TOOL_SELECTION: "TOOL_SELECTION";
12
+ readonly ROUTING: "ROUTING";
13
+ readonly RETRY: "RETRY";
14
+ readonly ESCALATION: "ESCALATION";
15
+ readonly MEMORY_RETRIEVAL: "MEMORY_RETRIEVAL";
16
+ readonly PLANNING: "PLANNING";
17
+ readonly CUSTOM: "CUSTOM";
18
+ };
19
+ type DecisionType = (typeof DecisionType)[keyof typeof DecisionType];
20
+ declare const SpanType: {
21
+ readonly LLM_CALL: "LLM_CALL";
22
+ readonly TOOL_CALL: "TOOL_CALL";
23
+ readonly MEMORY_OP: "MEMORY_OP";
24
+ readonly CHAIN: "CHAIN";
25
+ readonly AGENT: "AGENT";
26
+ readonly CUSTOM: "CUSTOM";
27
+ };
28
+ type SpanType = (typeof SpanType)[keyof typeof SpanType];
29
+ declare const SpanStatus: {
30
+ readonly RUNNING: "RUNNING";
31
+ readonly COMPLETED: "COMPLETED";
32
+ readonly ERROR: "ERROR";
33
+ };
34
+ type SpanStatus = (typeof SpanStatus)[keyof typeof SpanStatus];
35
+ declare const EventType: {
36
+ readonly ERROR: "ERROR";
37
+ readonly RETRY: "RETRY";
38
+ readonly FALLBACK: "FALLBACK";
39
+ readonly CONTEXT_OVERFLOW: "CONTEXT_OVERFLOW";
40
+ readonly USER_FEEDBACK: "USER_FEEDBACK";
41
+ readonly CUSTOM: "CUSTOM";
42
+ };
43
+ type EventType = (typeof EventType)[keyof typeof EventType];
44
+ interface DecisionPointPayload {
45
+ id: string;
46
+ type: DecisionType;
47
+ chosen: JsonValue;
48
+ alternatives: JsonValue[];
49
+ reasoning?: string;
50
+ contextSnapshot?: JsonValue;
51
+ durationMs?: number;
52
+ costUsd?: number;
53
+ parentSpanId?: string;
54
+ timestamp: string;
55
+ }
56
+ interface SpanPayload {
57
+ id: string;
58
+ parentSpanId?: string;
59
+ name: string;
60
+ type: SpanType;
61
+ input?: JsonValue;
62
+ output?: JsonValue;
63
+ tokenCount?: number;
64
+ costUsd?: number;
65
+ durationMs?: number;
66
+ status: SpanStatus;
67
+ statusMessage?: string;
68
+ startedAt: string;
69
+ endedAt?: string;
70
+ metadata?: JsonValue;
71
+ }
72
+ interface EventPayload {
73
+ id: string;
74
+ spanId?: string;
75
+ type: EventType;
76
+ name: string;
77
+ metadata?: JsonValue;
78
+ timestamp: string;
79
+ }
80
+ interface TracePayload {
81
+ id: string;
82
+ name: string;
83
+ sessionId?: string;
84
+ status: TraceStatus;
85
+ tags: string[];
86
+ metadata?: JsonValue;
87
+ totalCost?: number;
88
+ totalTokens?: number;
89
+ totalDuration?: number;
90
+ startedAt: string;
91
+ endedAt?: string;
92
+ decisionPoints: DecisionPointPayload[];
93
+ spans: SpanPayload[];
94
+ events: EventPayload[];
95
+ }
96
+ /** Generate a v4 UUID. */
97
+ declare function generateId(): string;
98
+ /** Return the current time as an ISO-8601 string. */
99
+ declare function nowISO(): string;
100
+
101
+ interface BatchTransportOptions {
102
+ apiKey: string;
103
+ endpoint: string;
104
+ maxBatchSize?: number;
105
+ flushInterval?: number;
106
+ }
107
+ declare class BatchTransport {
108
+ private readonly apiKey;
109
+ private readonly endpoint;
110
+ private readonly maxBatchSize;
111
+ private readonly flushInterval;
112
+ private buffer;
113
+ private timer;
114
+ constructor(options: BatchTransportOptions);
115
+ add(trace: TracePayload): void;
116
+ flush(): Promise<void>;
117
+ shutdown(): Promise<void>;
118
+ private _doFlush;
119
+ }
120
+
121
+ interface TraceBuilderOptions {
122
+ sessionId?: string;
123
+ tags?: string[];
124
+ metadata?: JsonValue;
125
+ }
126
+ interface AddSpanInput {
127
+ id?: string;
128
+ parentSpanId?: string;
129
+ name: string;
130
+ type: SpanType;
131
+ input?: JsonValue;
132
+ output?: JsonValue;
133
+ tokenCount?: number;
134
+ costUsd?: number;
135
+ durationMs?: number;
136
+ status?: SpanStatus;
137
+ statusMessage?: string;
138
+ startedAt?: string;
139
+ endedAt?: string;
140
+ metadata?: JsonValue;
141
+ }
142
+ interface AddDecisionInput {
143
+ id?: string;
144
+ type: DecisionType;
145
+ chosen: JsonValue;
146
+ alternatives?: JsonValue[];
147
+ reasoning?: string;
148
+ contextSnapshot?: JsonValue;
149
+ durationMs?: number;
150
+ costUsd?: number;
151
+ parentSpanId?: string;
152
+ timestamp?: string;
153
+ }
154
+ interface AddEventInput {
155
+ id?: string;
156
+ spanId?: string;
157
+ type: EventType;
158
+ name: string;
159
+ metadata?: JsonValue;
160
+ timestamp?: string;
161
+ }
162
+ interface EndOptions {
163
+ status?: TraceStatus;
164
+ metadata?: JsonValue;
165
+ totalCost?: number;
166
+ totalTokens?: number;
167
+ }
168
+ declare class TraceBuilder {
169
+ private readonly trace;
170
+ private readonly startMs;
171
+ constructor(name: string, options?: TraceBuilderOptions);
172
+ addSpan(input: AddSpanInput): string;
173
+ addDecision(input: AddDecisionInput): string;
174
+ addEvent(input: AddEventInput): string;
175
+ setStatus(status: TraceStatus): this;
176
+ setMetadata(metadata: JsonValue): this;
177
+ toPayload(): TracePayload;
178
+ end(options?: EndOptions): TracePayload;
179
+ }
180
+
181
+ interface CreateDecisionInput {
182
+ type: DecisionType;
183
+ chosen: JsonValue;
184
+ alternatives?: JsonValue[];
185
+ reasoning?: string;
186
+ contextSnapshot?: JsonValue;
187
+ durationMs?: number;
188
+ costUsd?: number;
189
+ parentSpanId?: string;
190
+ timestamp?: string;
191
+ }
192
+ declare function createDecision(input: CreateDecisionInput): DecisionPointPayload;
193
+
194
+ interface InitOptions {
195
+ apiKey: string;
196
+ endpoint?: string;
197
+ maxBatchSize?: number;
198
+ flushInterval?: number;
199
+ }
200
+ declare function init(options: InitOptions): void;
201
+ declare function shutdown(): Promise<void>;
202
+ declare function getClient(): BatchTransport | null;
203
+ declare function flush(): Promise<void>;
204
+
205
+ export { type AddDecisionInput, type AddEventInput, type AddSpanInput, BatchTransport, type BatchTransportOptions, type CreateDecisionInput, type DecisionPointPayload, DecisionType, type EndOptions, type EventPayload, EventType, type InitOptions, type JsonValue, type SpanPayload, SpanStatus, SpanType, TraceBuilder, type TraceBuilderOptions, type TracePayload, TraceStatus, createDecision, flush, generateId, getClient, init, nowISO, shutdown };
package/dist/index.js ADDED
@@ -0,0 +1,280 @@
1
+ // src/transport.ts
2
+ var BatchTransport = class {
3
+ apiKey;
4
+ endpoint;
5
+ maxBatchSize;
6
+ flushInterval;
7
+ buffer = [];
8
+ timer = null;
9
+ constructor(options) {
10
+ this.apiKey = options.apiKey;
11
+ this.endpoint = options.endpoint.replace(/\/+$/, "");
12
+ this.maxBatchSize = options.maxBatchSize ?? 10;
13
+ this.flushInterval = options.flushInterval ?? 5e3;
14
+ this.timer = setInterval(() => {
15
+ void this._doFlush();
16
+ }, this.flushInterval);
17
+ }
18
+ add(trace) {
19
+ this.buffer.push(trace);
20
+ if (this.buffer.length >= this.maxBatchSize) {
21
+ void this._doFlush();
22
+ }
23
+ }
24
+ async flush() {
25
+ await this._doFlush();
26
+ }
27
+ async shutdown() {
28
+ if (this.timer !== null) {
29
+ clearInterval(this.timer);
30
+ this.timer = null;
31
+ }
32
+ await this._doFlush();
33
+ }
34
+ async _doFlush() {
35
+ if (this.buffer.length === 0) {
36
+ return;
37
+ }
38
+ const batch = this.buffer.splice(0, this.buffer.length);
39
+ try {
40
+ const response = await fetch(`${this.endpoint}/api/traces`, {
41
+ method: "POST",
42
+ headers: {
43
+ Authorization: `Bearer ${this.apiKey}`,
44
+ "Content-Type": "application/json"
45
+ },
46
+ body: JSON.stringify({ traces: batch })
47
+ });
48
+ if (!response.ok) {
49
+ const text = await response.text().catch(() => "");
50
+ console.warn(
51
+ `AgentLens: Failed to send traces (HTTP ${response.status}): ${text.slice(0, 200)}`
52
+ );
53
+ }
54
+ } catch (error) {
55
+ const message = error instanceof Error ? error.message : String(error);
56
+ console.warn(`AgentLens: Failed to send traces: ${message}`);
57
+ }
58
+ }
59
+ };
60
+
61
+ // src/_registry.ts
62
+ var _transport = null;
63
+ function _setTransport(transport) {
64
+ _transport = transport;
65
+ }
66
+ function _getTransport() {
67
+ return _transport;
68
+ }
69
+
70
+ // src/models.ts
71
+ import { randomUUID } from "crypto";
72
+ var TraceStatus = {
73
+ RUNNING: "RUNNING",
74
+ COMPLETED: "COMPLETED",
75
+ ERROR: "ERROR"
76
+ };
77
+ var DecisionType = {
78
+ TOOL_SELECTION: "TOOL_SELECTION",
79
+ ROUTING: "ROUTING",
80
+ RETRY: "RETRY",
81
+ ESCALATION: "ESCALATION",
82
+ MEMORY_RETRIEVAL: "MEMORY_RETRIEVAL",
83
+ PLANNING: "PLANNING",
84
+ CUSTOM: "CUSTOM"
85
+ };
86
+ var SpanType = {
87
+ LLM_CALL: "LLM_CALL",
88
+ TOOL_CALL: "TOOL_CALL",
89
+ MEMORY_OP: "MEMORY_OP",
90
+ CHAIN: "CHAIN",
91
+ AGENT: "AGENT",
92
+ CUSTOM: "CUSTOM"
93
+ };
94
+ var SpanStatus = {
95
+ RUNNING: "RUNNING",
96
+ COMPLETED: "COMPLETED",
97
+ ERROR: "ERROR"
98
+ };
99
+ var EventType = {
100
+ ERROR: "ERROR",
101
+ RETRY: "RETRY",
102
+ FALLBACK: "FALLBACK",
103
+ CONTEXT_OVERFLOW: "CONTEXT_OVERFLOW",
104
+ USER_FEEDBACK: "USER_FEEDBACK",
105
+ CUSTOM: "CUSTOM"
106
+ };
107
+ function generateId() {
108
+ return randomUUID();
109
+ }
110
+ function nowISO() {
111
+ return (/* @__PURE__ */ new Date()).toISOString();
112
+ }
113
+
114
+ // src/trace.ts
115
+ var TraceBuilder = class {
116
+ trace;
117
+ startMs;
118
+ constructor(name, options) {
119
+ this.startMs = Date.now();
120
+ this.trace = {
121
+ id: generateId(),
122
+ name,
123
+ sessionId: options?.sessionId,
124
+ status: TraceStatus.RUNNING,
125
+ tags: options?.tags ?? [],
126
+ metadata: options?.metadata,
127
+ startedAt: nowISO(),
128
+ decisionPoints: [],
129
+ spans: [],
130
+ events: []
131
+ };
132
+ }
133
+ addSpan(input) {
134
+ const id = input.id ?? generateId();
135
+ const span = {
136
+ id,
137
+ parentSpanId: input.parentSpanId,
138
+ name: input.name,
139
+ type: input.type,
140
+ input: input.input,
141
+ output: input.output,
142
+ tokenCount: input.tokenCount,
143
+ costUsd: input.costUsd,
144
+ durationMs: input.durationMs,
145
+ status: input.status ?? SpanStatus.RUNNING,
146
+ statusMessage: input.statusMessage,
147
+ startedAt: input.startedAt ?? nowISO(),
148
+ endedAt: input.endedAt,
149
+ metadata: input.metadata
150
+ };
151
+ this.trace.spans.push(span);
152
+ return id;
153
+ }
154
+ addDecision(input) {
155
+ const id = input.id ?? generateId();
156
+ const decision = {
157
+ id,
158
+ type: input.type,
159
+ chosen: input.chosen,
160
+ alternatives: input.alternatives ?? [],
161
+ reasoning: input.reasoning,
162
+ contextSnapshot: input.contextSnapshot,
163
+ durationMs: input.durationMs,
164
+ costUsd: input.costUsd,
165
+ parentSpanId: input.parentSpanId,
166
+ timestamp: input.timestamp ?? nowISO()
167
+ };
168
+ this.trace.decisionPoints.push(decision);
169
+ return id;
170
+ }
171
+ addEvent(input) {
172
+ const id = input.id ?? generateId();
173
+ const event = {
174
+ id,
175
+ spanId: input.spanId,
176
+ type: input.type,
177
+ name: input.name,
178
+ metadata: input.metadata,
179
+ timestamp: input.timestamp ?? nowISO()
180
+ };
181
+ this.trace.events.push(event);
182
+ return id;
183
+ }
184
+ setStatus(status) {
185
+ this.trace.status = status;
186
+ return this;
187
+ }
188
+ setMetadata(metadata) {
189
+ this.trace.metadata = metadata;
190
+ return this;
191
+ }
192
+ toPayload() {
193
+ return { ...this.trace };
194
+ }
195
+ end(options) {
196
+ const endedAt = nowISO();
197
+ this.trace.endedAt = endedAt;
198
+ this.trace.totalDuration = Date.now() - this.startMs;
199
+ this.trace.status = options?.status ?? TraceStatus.COMPLETED;
200
+ if (options?.metadata !== void 0) {
201
+ this.trace.metadata = options.metadata;
202
+ }
203
+ if (options?.totalCost !== void 0) {
204
+ this.trace.totalCost = options.totalCost;
205
+ }
206
+ if (options?.totalTokens !== void 0) {
207
+ this.trace.totalTokens = options.totalTokens;
208
+ }
209
+ const transport = _getTransport();
210
+ if (transport) {
211
+ transport.add(this.trace);
212
+ }
213
+ return { ...this.trace };
214
+ }
215
+ };
216
+
217
+ // src/decision.ts
218
+ function createDecision(input) {
219
+ return {
220
+ id: generateId(),
221
+ type: input.type,
222
+ chosen: input.chosen,
223
+ alternatives: input.alternatives ?? [],
224
+ reasoning: input.reasoning,
225
+ contextSnapshot: input.contextSnapshot,
226
+ durationMs: input.durationMs,
227
+ costUsd: input.costUsd,
228
+ parentSpanId: input.parentSpanId,
229
+ timestamp: input.timestamp ?? nowISO()
230
+ };
231
+ }
232
+
233
+ // src/index.ts
234
+ function init(options) {
235
+ const existing = _getTransport();
236
+ if (existing) {
237
+ void existing.shutdown();
238
+ }
239
+ _setTransport(
240
+ new BatchTransport({
241
+ apiKey: options.apiKey,
242
+ endpoint: options.endpoint ?? "https://agentlens.vectry.tech",
243
+ maxBatchSize: options.maxBatchSize,
244
+ flushInterval: options.flushInterval
245
+ })
246
+ );
247
+ }
248
+ async function shutdown() {
249
+ const transport = _getTransport();
250
+ if (transport) {
251
+ await transport.shutdown();
252
+ _setTransport(null);
253
+ }
254
+ }
255
+ function getClient() {
256
+ return _getTransport();
257
+ }
258
+ async function flush() {
259
+ const transport = _getTransport();
260
+ if (transport) {
261
+ await transport.flush();
262
+ }
263
+ }
264
+ export {
265
+ BatchTransport,
266
+ DecisionType,
267
+ EventType,
268
+ SpanStatus,
269
+ SpanType,
270
+ TraceBuilder,
271
+ TraceStatus,
272
+ createDecision,
273
+ flush,
274
+ generateId,
275
+ getClient,
276
+ init,
277
+ nowISO,
278
+ shutdown
279
+ };
280
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/transport.ts","../src/_registry.ts","../src/models.ts","../src/trace.ts","../src/decision.ts","../src/index.ts"],"sourcesContent":["import type { TracePayload } from \"./models.js\";\n\nexport interface BatchTransportOptions {\n apiKey: string;\n endpoint: string;\n maxBatchSize?: number;\n flushInterval?: number;\n}\n\nexport class BatchTransport {\n private readonly apiKey: string;\n private readonly endpoint: string;\n private readonly maxBatchSize: number;\n private readonly flushInterval: number;\n private buffer: TracePayload[] = [];\n private timer: ReturnType<typeof setInterval> | null = null;\n\n constructor(options: BatchTransportOptions) {\n this.apiKey = options.apiKey;\n this.endpoint = options.endpoint.replace(/\\/+$/, \"\");\n this.maxBatchSize = options.maxBatchSize ?? 10;\n this.flushInterval = options.flushInterval ?? 5_000;\n\n this.timer = setInterval(() => {\n void this._doFlush();\n }, this.flushInterval);\n }\n\n add(trace: TracePayload): void {\n this.buffer.push(trace);\n if (this.buffer.length >= this.maxBatchSize) {\n void this._doFlush();\n }\n }\n\n async flush(): Promise<void> {\n await this._doFlush();\n }\n\n async shutdown(): Promise<void> {\n if (this.timer !== null) {\n clearInterval(this.timer);\n this.timer = null;\n }\n await this._doFlush();\n }\n\n private async _doFlush(): Promise<void> {\n if (this.buffer.length === 0) {\n return;\n }\n\n const batch = this.buffer.splice(0, this.buffer.length);\n\n try {\n const response = await fetch(`${this.endpoint}/api/traces`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ traces: batch }),\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n console.warn(\n `AgentLens: Failed to send traces (HTTP ${response.status}): ${text.slice(0, 200)}`,\n );\n }\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : String(error);\n console.warn(`AgentLens: Failed to send traces: ${message}`);\n }\n }\n}\n","import type { BatchTransport } from \"./transport.js\";\n\nlet _transport: BatchTransport | null = null;\n\nexport function _setTransport(transport: BatchTransport | null): void {\n _transport = transport;\n}\n\nexport function _getTransport(): BatchTransport | null {\n return _transport;\n}\n","import { randomUUID } from \"crypto\";\n\n// ---------------------------------------------------------------------------\n// JSON value type (replaces Prisma.JsonValue for the SDK)\n// ---------------------------------------------------------------------------\n\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\n// ---------------------------------------------------------------------------\n// Enums (as const + type union pattern — NO TypeScript enum keyword)\n// ---------------------------------------------------------------------------\n\nexport const TraceStatus = {\n RUNNING: \"RUNNING\",\n COMPLETED: \"COMPLETED\",\n ERROR: \"ERROR\",\n} as const;\nexport type TraceStatus = (typeof TraceStatus)[keyof typeof TraceStatus];\n\nexport const DecisionType = {\n TOOL_SELECTION: \"TOOL_SELECTION\",\n ROUTING: \"ROUTING\",\n RETRY: \"RETRY\",\n ESCALATION: \"ESCALATION\",\n MEMORY_RETRIEVAL: \"MEMORY_RETRIEVAL\",\n PLANNING: \"PLANNING\",\n CUSTOM: \"CUSTOM\",\n} as const;\nexport type DecisionType = (typeof DecisionType)[keyof typeof DecisionType];\n\nexport const SpanType = {\n LLM_CALL: \"LLM_CALL\",\n TOOL_CALL: \"TOOL_CALL\",\n MEMORY_OP: \"MEMORY_OP\",\n CHAIN: \"CHAIN\",\n AGENT: \"AGENT\",\n CUSTOM: \"CUSTOM\",\n} as const;\nexport type SpanType = (typeof SpanType)[keyof typeof SpanType];\n\nexport const SpanStatus = {\n RUNNING: \"RUNNING\",\n COMPLETED: \"COMPLETED\",\n ERROR: \"ERROR\",\n} as const;\nexport type SpanStatus = (typeof SpanStatus)[keyof typeof SpanStatus];\n\nexport const EventType = {\n ERROR: \"ERROR\",\n RETRY: \"RETRY\",\n FALLBACK: \"FALLBACK\",\n CONTEXT_OVERFLOW: \"CONTEXT_OVERFLOW\",\n USER_FEEDBACK: \"USER_FEEDBACK\",\n CUSTOM: \"CUSTOM\",\n} as const;\nexport type EventType = (typeof EventType)[keyof typeof EventType];\n\n// ---------------------------------------------------------------------------\n// Wire-format interfaces (camelCase, matching POST /api/traces contract)\n// ---------------------------------------------------------------------------\n\nexport interface DecisionPointPayload {\n id: string;\n type: DecisionType;\n chosen: JsonValue;\n alternatives: JsonValue[];\n reasoning?: string;\n contextSnapshot?: JsonValue;\n durationMs?: number;\n costUsd?: number;\n parentSpanId?: string;\n timestamp: string;\n}\n\nexport interface SpanPayload {\n id: string;\n parentSpanId?: string;\n name: string;\n type: SpanType;\n input?: JsonValue;\n output?: JsonValue;\n tokenCount?: number;\n costUsd?: number;\n durationMs?: number;\n status: SpanStatus;\n statusMessage?: string;\n startedAt: string;\n endedAt?: string;\n metadata?: JsonValue;\n}\n\nexport interface EventPayload {\n id: string;\n spanId?: string;\n type: EventType;\n name: string;\n metadata?: JsonValue;\n timestamp: string;\n}\n\nexport interface TracePayload {\n id: string;\n name: string;\n sessionId?: string;\n status: TraceStatus;\n tags: string[];\n metadata?: JsonValue;\n totalCost?: number;\n totalTokens?: number;\n totalDuration?: number;\n startedAt: string;\n endedAt?: string;\n decisionPoints: DecisionPointPayload[];\n spans: SpanPayload[];\n events: EventPayload[];\n}\n\n// ---------------------------------------------------------------------------\n// Helper functions\n// ---------------------------------------------------------------------------\n\n/** Generate a v4 UUID. */\nexport function generateId(): string {\n return randomUUID();\n}\n\n/** Return the current time as an ISO-8601 string. */\nexport function nowISO(): string {\n return new Date().toISOString();\n}\n","import type {\n TracePayload,\n SpanPayload,\n DecisionPointPayload,\n EventPayload,\n JsonValue,\n TraceStatus,\n SpanType,\n SpanStatus,\n DecisionType,\n EventType,\n} from \"./models.js\";\nimport {\n generateId,\n nowISO,\n TraceStatus as TraceStatusValues,\n SpanStatus as SpanStatusValues,\n} from \"./models.js\";\nimport { _getTransport } from \"./_registry.js\";\n\nexport interface TraceBuilderOptions {\n sessionId?: string;\n tags?: string[];\n metadata?: JsonValue;\n}\n\nexport interface AddSpanInput {\n id?: string;\n parentSpanId?: string;\n name: string;\n type: SpanType;\n input?: JsonValue;\n output?: JsonValue;\n tokenCount?: number;\n costUsd?: number;\n durationMs?: number;\n status?: SpanStatus;\n statusMessage?: string;\n startedAt?: string;\n endedAt?: string;\n metadata?: JsonValue;\n}\n\nexport interface AddDecisionInput {\n id?: string;\n type: DecisionType;\n chosen: JsonValue;\n alternatives?: JsonValue[];\n reasoning?: string;\n contextSnapshot?: JsonValue;\n durationMs?: number;\n costUsd?: number;\n parentSpanId?: string;\n timestamp?: string;\n}\n\nexport interface AddEventInput {\n id?: string;\n spanId?: string;\n type: EventType;\n name: string;\n metadata?: JsonValue;\n timestamp?: string;\n}\n\nexport interface EndOptions {\n status?: TraceStatus;\n metadata?: JsonValue;\n totalCost?: number;\n totalTokens?: number;\n}\n\nexport class TraceBuilder {\n private readonly trace: TracePayload;\n private readonly startMs: number;\n\n constructor(name: string, options?: TraceBuilderOptions) {\n this.startMs = Date.now();\n this.trace = {\n id: generateId(),\n name,\n sessionId: options?.sessionId,\n status: TraceStatusValues.RUNNING,\n tags: options?.tags ?? [],\n metadata: options?.metadata,\n startedAt: nowISO(),\n decisionPoints: [],\n spans: [],\n events: [],\n };\n }\n\n addSpan(input: AddSpanInput): string {\n const id = input.id ?? generateId();\n const span: SpanPayload = {\n id,\n parentSpanId: input.parentSpanId,\n name: input.name,\n type: input.type,\n input: input.input,\n output: input.output,\n tokenCount: input.tokenCount,\n costUsd: input.costUsd,\n durationMs: input.durationMs,\n status: input.status ?? SpanStatusValues.RUNNING,\n statusMessage: input.statusMessage,\n startedAt: input.startedAt ?? nowISO(),\n endedAt: input.endedAt,\n metadata: input.metadata,\n };\n this.trace.spans.push(span);\n return id;\n }\n\n addDecision(input: AddDecisionInput): string {\n const id = input.id ?? generateId();\n const decision: DecisionPointPayload = {\n id,\n type: input.type,\n chosen: input.chosen,\n alternatives: input.alternatives ?? [],\n reasoning: input.reasoning,\n contextSnapshot: input.contextSnapshot,\n durationMs: input.durationMs,\n costUsd: input.costUsd,\n parentSpanId: input.parentSpanId,\n timestamp: input.timestamp ?? nowISO(),\n };\n this.trace.decisionPoints.push(decision);\n return id;\n }\n\n addEvent(input: AddEventInput): string {\n const id = input.id ?? generateId();\n const event: EventPayload = {\n id,\n spanId: input.spanId,\n type: input.type,\n name: input.name,\n metadata: input.metadata,\n timestamp: input.timestamp ?? nowISO(),\n };\n this.trace.events.push(event);\n return id;\n }\n\n setStatus(status: TraceStatus): this {\n this.trace.status = status;\n return this;\n }\n\n setMetadata(metadata: JsonValue): this {\n this.trace.metadata = metadata;\n return this;\n }\n\n toPayload(): TracePayload {\n return { ...this.trace };\n }\n\n end(options?: EndOptions): TracePayload {\n const endedAt = nowISO();\n this.trace.endedAt = endedAt;\n this.trace.totalDuration = Date.now() - this.startMs;\n this.trace.status =\n options?.status ?? TraceStatusValues.COMPLETED;\n\n if (options?.metadata !== undefined) {\n this.trace.metadata = options.metadata;\n }\n if (options?.totalCost !== undefined) {\n this.trace.totalCost = options.totalCost;\n }\n if (options?.totalTokens !== undefined) {\n this.trace.totalTokens = options.totalTokens;\n }\n\n const transport = _getTransport();\n if (transport) {\n transport.add(this.trace);\n }\n\n return { ...this.trace };\n }\n}\n","import type { DecisionPointPayload, DecisionType, JsonValue } from \"./models.js\";\nimport { generateId, nowISO } from \"./models.js\";\n\nexport interface CreateDecisionInput {\n type: DecisionType;\n chosen: JsonValue;\n alternatives?: JsonValue[];\n reasoning?: string;\n contextSnapshot?: JsonValue;\n durationMs?: number;\n costUsd?: number;\n parentSpanId?: string;\n timestamp?: string;\n}\n\nexport function createDecision(input: CreateDecisionInput): DecisionPointPayload {\n return {\n id: generateId(),\n type: input.type,\n chosen: input.chosen,\n alternatives: input.alternatives ?? [],\n reasoning: input.reasoning,\n contextSnapshot: input.contextSnapshot,\n durationMs: input.durationMs,\n costUsd: input.costUsd,\n parentSpanId: input.parentSpanId,\n timestamp: input.timestamp ?? nowISO(),\n };\n}\n","import { BatchTransport } from \"./transport.js\";\nimport { _setTransport, _getTransport } from \"./_registry.js\";\n\nexport interface InitOptions {\n apiKey: string;\n endpoint?: string;\n maxBatchSize?: number;\n flushInterval?: number;\n}\n\nexport function init(options: InitOptions): void {\n const existing = _getTransport();\n if (existing) {\n void existing.shutdown();\n }\n _setTransport(\n new BatchTransport({\n apiKey: options.apiKey,\n endpoint: options.endpoint ?? \"https://agentlens.vectry.tech\",\n maxBatchSize: options.maxBatchSize,\n flushInterval: options.flushInterval,\n }),\n );\n}\n\nexport async function shutdown(): Promise<void> {\n const transport = _getTransport();\n if (transport) {\n await transport.shutdown();\n _setTransport(null);\n }\n}\n\nexport function getClient(): BatchTransport | null {\n return _getTransport();\n}\n\nexport async function flush(): Promise<void> {\n const transport = _getTransport();\n if (transport) {\n await transport.flush();\n }\n}\n\nexport {\n TraceStatus,\n DecisionType,\n SpanType,\n SpanStatus,\n EventType,\n generateId,\n nowISO,\n} from \"./models.js\";\n\nexport type {\n JsonValue,\n DecisionPointPayload,\n SpanPayload,\n EventPayload,\n TracePayload,\n} from \"./models.js\";\n\nexport { BatchTransport } from \"./transport.js\";\nexport type { BatchTransportOptions } from \"./transport.js\";\n\nexport { TraceBuilder } from \"./trace.js\";\nexport type {\n TraceBuilderOptions,\n AddSpanInput,\n AddDecisionInput,\n AddEventInput,\n EndOptions,\n} from \"./trace.js\";\n\nexport { createDecision } from \"./decision.js\";\nexport type { CreateDecisionInput } from \"./decision.js\";\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "agentlens-sdk",
3
+ "version": "0.1.0",
4
+ "description": "AgentLens TypeScript SDK — Agent observability that traces decisions, not just API calls.",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.cts",
17
+ "default": "./dist/index.cjs"
18
+ }
19
+ }
20
+ },
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "scripts": {
25
+ "build": "tsup",
26
+ "dev": "tsup --watch",
27
+ "typecheck": "tsc --noEmit",
28
+ "clean": "rm -rf dist"
29
+ },
30
+ "engines": {
31
+ "node": ">=20"
32
+ },
33
+ "license": "MIT",
34
+ "author": "Vectry <hunter@repi.fun>",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://gitea.repi.fun/repi/agentlens",
38
+ "directory": "packages/sdk-ts"
39
+ },
40
+ "homepage": "https://agentlens.vectry.tech",
41
+ "bugs": {
42
+ "url": "https://gitea.repi.fun/repi/agentlens/issues"
43
+ },
44
+ "keywords": [
45
+ "agentlens",
46
+ "observability",
47
+ "tracing",
48
+ "ai-agents",
49
+ "sdk",
50
+ "typescript"
51
+ ],
52
+ "devDependencies": {
53
+ "tsup": "^8.3.0",
54
+ "typescript": "^5.7.0"
55
+ }
56
+ }