@mono-agent/observability 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 +62 -0
- package/dist/artifact-fs.d.ts +50 -0
- package/dist/artifact-fs.d.ts.map +1 -0
- package/dist/artifact-fs.js +97 -0
- package/dist/artifact-fs.js.map +1 -0
- package/dist/content.d.ts +22 -0
- package/dist/content.d.ts.map +1 -0
- package/dist/content.js +66 -0
- package/dist/content.js.map +1 -0
- package/dist/event-timeline.d.ts +3 -0
- package/dist/event-timeline.d.ts.map +1 -0
- package/dist/event-timeline.js +78 -0
- package/dist/event-timeline.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/recorded-runs.d.ts +14 -0
- package/dist/recorded-runs.d.ts.map +1 -0
- package/dist/recorded-runs.js +372 -0
- package/dist/recorded-runs.js.map +1 -0
- package/dist/recorder.d.ts +13 -0
- package/dist/recorder.d.ts.map +1 -0
- package/dist/recorder.js +188 -0
- package/dist/recorder.js.map +1 -0
- package/dist/trace-sources.d.ts +15 -0
- package/dist/trace-sources.d.ts.map +1 -0
- package/dist/trace-sources.js +348 -0
- package/dist/trace-sources.js.map +1 -0
- package/dist/types.d.ts +171 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +32 -0
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
import { readdir, readFile, stat } from "node:fs/promises";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { DEFAULT_MAX_EVENTS_PER_RUN, DEFAULT_MAX_RUNS, DEFAULT_MAX_STRING_BYTES, errorMessage, isErrno, isRecord, minInteger, normalizeRunId as normalizeRunIdGuard, positiveInteger, safeArtifactName, safeJoin as safeJoinGuard, stringField, } from "./artifact-fs.js";
|
|
4
|
+
import { classifyAssistantContent, compactString } from "./content.js";
|
|
5
|
+
import { redactJsonValue } from "./recorder.js";
|
|
6
|
+
const SUMMARY_SUFFIX = ".summary.json";
|
|
7
|
+
const EVENTS_SUFFIX = ".events.jsonl";
|
|
8
|
+
export class ObservabilityReadError extends Error {
|
|
9
|
+
code;
|
|
10
|
+
details;
|
|
11
|
+
constructor(code, message, details = {}) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = "ObservabilityReadError";
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.details = { ...details, code };
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export async function listRecordedRuns(options) {
|
|
19
|
+
const normalized = normalizeReaderOptions(options);
|
|
20
|
+
const { summaries, warnings } = await loadSummaryFiles(normalized);
|
|
21
|
+
return {
|
|
22
|
+
runs: [...summaries]
|
|
23
|
+
.sort((a, b) => summaryUpdatedAtMs(b) - summaryUpdatedAtMs(a))
|
|
24
|
+
.slice(0, normalized.maxRuns)
|
|
25
|
+
.map((entry) => summaryToListItem(entry.summary, entry.updatedAt, normalized.maxStringBytes)),
|
|
26
|
+
warnings,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export async function readRecordedRun(options, runId) {
|
|
30
|
+
const normalized = normalizeReaderOptions(options);
|
|
31
|
+
const normalizedRunId = normalizeRunId(runId);
|
|
32
|
+
const baseName = safeArtifactName(normalizedRunId);
|
|
33
|
+
const summaryPath = safeJoin(normalized.artifactDir, `${baseName}${SUMMARY_SUFFIX}`);
|
|
34
|
+
const warnings = [];
|
|
35
|
+
const summary = await readSummaryFile(summaryPath, `${baseName}${SUMMARY_SUFFIX}`, normalized, warnings);
|
|
36
|
+
if (summary === undefined || summary.summary.runId !== normalizedRunId) {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
const eventsPath = safeJoin(normalized.artifactDir, `${baseName}${EVENTS_SUFFIX}`);
|
|
40
|
+
const events = await readEventsFile(eventsPath, normalized, warnings);
|
|
41
|
+
return {
|
|
42
|
+
summary: summaryToListItem(summary.summary, summary.updatedAt, normalized.maxStringBytes),
|
|
43
|
+
events,
|
|
44
|
+
warnings,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function classifyRecordedRunEvent(event) {
|
|
48
|
+
if (!isRecord(event)) {
|
|
49
|
+
return "runtime";
|
|
50
|
+
}
|
|
51
|
+
const type = stringField(event, "type")?.toLowerCase() ?? "";
|
|
52
|
+
if (type.includes("error") ||
|
|
53
|
+
type.includes("failure") ||
|
|
54
|
+
type.includes("failed") ||
|
|
55
|
+
event.error !== undefined ||
|
|
56
|
+
event.failureKind !== undefined) {
|
|
57
|
+
return "error";
|
|
58
|
+
}
|
|
59
|
+
if (type.includes("tool") ||
|
|
60
|
+
stringField(event, "toolName") !== undefined ||
|
|
61
|
+
stringField(event, "tool") !== undefined ||
|
|
62
|
+
stringField(event, "tool_call_id") !== undefined ||
|
|
63
|
+
stringField(event, "toolCallId") !== undefined) {
|
|
64
|
+
return "tool";
|
|
65
|
+
}
|
|
66
|
+
if (type.includes("thinking") || type.includes("reasoning") || type.includes("thought")) {
|
|
67
|
+
return "thinking";
|
|
68
|
+
}
|
|
69
|
+
if (assistantMessageContentKind(event) === "thinking") {
|
|
70
|
+
return "thinking";
|
|
71
|
+
}
|
|
72
|
+
if (type === "assistant" || type === "user" || type.includes("message") || event.message !== undefined) {
|
|
73
|
+
return "message";
|
|
74
|
+
}
|
|
75
|
+
return "runtime";
|
|
76
|
+
}
|
|
77
|
+
async function loadSummaryFiles(normalized) {
|
|
78
|
+
const warnings = [];
|
|
79
|
+
let entries;
|
|
80
|
+
try {
|
|
81
|
+
entries = await readdir(normalized.artifactDir, { withFileTypes: true });
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
if (isErrno(error, "ENOENT")) {
|
|
85
|
+
return { summaries: [], warnings };
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
summaries: [],
|
|
89
|
+
warnings: [`Unable to read artifact directory: ${errorMessage(error)}.`],
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const summaries = [];
|
|
93
|
+
for (const entry of entries) {
|
|
94
|
+
if (!entry.isFile() || !entry.name.endsWith(SUMMARY_SUFFIX)) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const filePath = safeJoin(normalized.artifactDir, entry.name);
|
|
98
|
+
const parsed = await readSummaryFile(filePath, entry.name, normalized, warnings);
|
|
99
|
+
if (parsed !== undefined) {
|
|
100
|
+
summaries.push(parsed);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return { summaries, warnings };
|
|
104
|
+
}
|
|
105
|
+
async function readSummaryFile(filePath, fileName, normalized, warnings) {
|
|
106
|
+
let raw;
|
|
107
|
+
try {
|
|
108
|
+
raw = await readFile(filePath, "utf8");
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (isErrno(error, "ENOENT")) {
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
warnings.push(`Unable to read ${fileName}: ${errorMessage(error)}.`);
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
let parsed;
|
|
118
|
+
try {
|
|
119
|
+
parsed = JSON.parse(raw);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
warnings.push(`Skipping ${fileName}: invalid JSON (${errorMessage(error)}).`);
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
const summary = coerceRunSummary(parsed, fileName, warnings, normalized.maxStringBytes);
|
|
126
|
+
if (summary === undefined) {
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
let stats;
|
|
130
|
+
try {
|
|
131
|
+
stats = await stat(filePath);
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
warnings.push(`Unable to stat ${fileName}: ${errorMessage(error)}.`);
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
fileName,
|
|
139
|
+
summary,
|
|
140
|
+
updatedAt: stats.mtime.toISOString(),
|
|
141
|
+
mtimeMs: stats.mtimeMs,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
async function readEventsFile(filePath, normalized, warnings) {
|
|
145
|
+
let raw;
|
|
146
|
+
try {
|
|
147
|
+
raw = await readFile(filePath, "utf8");
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
if (isErrno(error, "ENOENT")) {
|
|
151
|
+
warnings.push("Event artifact is missing for this run.");
|
|
152
|
+
return [];
|
|
153
|
+
}
|
|
154
|
+
warnings.push(`Unable to read event artifact: ${errorMessage(error)}.`);
|
|
155
|
+
return [];
|
|
156
|
+
}
|
|
157
|
+
const events = [];
|
|
158
|
+
const lines = raw.split(/\r?\n/u);
|
|
159
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
160
|
+
const line = lines[i];
|
|
161
|
+
if (line === undefined || line.trim().length === 0) {
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (events.length >= normalized.maxEventsPerRun) {
|
|
165
|
+
warnings.push(`Event list was capped at ${normalized.maxEventsPerRun} events.`);
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
const parsed = JSON.parse(line);
|
|
170
|
+
events.push(toRecordedEvent(parsed, events.length, normalized.maxStringBytes));
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
warnings.push(`Skipping malformed event line ${i + 1}: ${errorMessage(error)}.`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return events;
|
|
177
|
+
}
|
|
178
|
+
function coerceRunSummary(value, fileName, warnings, maxStringBytes) {
|
|
179
|
+
if (!isRecord(value)) {
|
|
180
|
+
warnings.push(`Skipping ${fileName}: summary is not an object.`);
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
const runId = stringField(value, "runId");
|
|
184
|
+
const conversationId = stringField(value, "conversationId");
|
|
185
|
+
const status = runSummaryStatus(value.status);
|
|
186
|
+
const durationMs = finiteNumberField(value, "durationMs");
|
|
187
|
+
const eventCount = integerNumberField(value, "eventCount");
|
|
188
|
+
if (runId === undefined || conversationId === undefined || status === undefined || durationMs === undefined || eventCount === undefined) {
|
|
189
|
+
warnings.push(`Skipping ${fileName}: summary is missing required run metadata.`);
|
|
190
|
+
return undefined;
|
|
191
|
+
}
|
|
192
|
+
const failureKind = stringField(value, "failureKind");
|
|
193
|
+
const startedAt = stringField(value, "startedAt");
|
|
194
|
+
const endedAt = stringField(value, "endedAt");
|
|
195
|
+
const updatedAt = stringField(value, "updatedAt");
|
|
196
|
+
const providerSessionId = providerSessionIdField(value.providerSessionId);
|
|
197
|
+
const artifactPaths = Array.isArray(value.artifactPaths) ? value.artifactPaths.filter((entry) => typeof entry === "string") : [];
|
|
198
|
+
const summary = {
|
|
199
|
+
runId,
|
|
200
|
+
conversationId,
|
|
201
|
+
status,
|
|
202
|
+
...(failureKind === undefined ? {} : { failureKind }),
|
|
203
|
+
...(startedAt === undefined ? {} : { startedAt }),
|
|
204
|
+
...(endedAt === undefined ? {} : { endedAt }),
|
|
205
|
+
...(updatedAt === undefined ? {} : { updatedAt }),
|
|
206
|
+
durationMs,
|
|
207
|
+
...(value.usage === undefined ? {} : { usage: redactJsonValue(value.usage, maxStringBytes) }),
|
|
208
|
+
...(value.cost === undefined ? {} : { cost: redactJsonValue(value.cost, maxStringBytes) }),
|
|
209
|
+
...(providerSessionId === undefined ? {} : { providerSessionId }),
|
|
210
|
+
eventCount,
|
|
211
|
+
artifactPaths,
|
|
212
|
+
...(value.runtimeWarnings === undefined ? {} : { runtimeWarnings: redactJsonValue(value.runtimeWarnings, maxStringBytes) }),
|
|
213
|
+
...(value.diagnostics === undefined ? {} : { diagnostics: redactJsonValue(value.diagnostics, maxStringBytes) }),
|
|
214
|
+
...(value.capabilitiesUsed === undefined ? {} : { capabilitiesUsed: redactJsonValue(value.capabilitiesUsed, maxStringBytes) }),
|
|
215
|
+
};
|
|
216
|
+
return summary;
|
|
217
|
+
}
|
|
218
|
+
function summaryToListItem(summary, updatedAt, maxStringBytes) {
|
|
219
|
+
return {
|
|
220
|
+
runId: summary.runId,
|
|
221
|
+
conversationId: summary.conversationId,
|
|
222
|
+
status: summary.status,
|
|
223
|
+
...(summary.failureKind === undefined ? {} : { failureKind: summary.failureKind }),
|
|
224
|
+
...(summary.startedAt === undefined ? {} : { startedAt: summary.startedAt }),
|
|
225
|
+
...(summary.endedAt === undefined ? {} : { endedAt: summary.endedAt }),
|
|
226
|
+
durationMs: summary.durationMs,
|
|
227
|
+
eventCount: summary.eventCount,
|
|
228
|
+
updatedAt: summary.updatedAt ?? updatedAt,
|
|
229
|
+
...(summary.usage === undefined ? {} : { usage: redactJsonValue(summary.usage, maxStringBytes) }),
|
|
230
|
+
...(summary.cost === undefined ? {} : { cost: redactJsonValue(summary.cost, maxStringBytes) }),
|
|
231
|
+
...(summary.providerSessionId === undefined ? {} : { providerSessionId: summary.providerSessionId }),
|
|
232
|
+
...(summary.runtimeWarnings === undefined ? {} : { runtimeWarnings: redactJsonValue(summary.runtimeWarnings, maxStringBytes) }),
|
|
233
|
+
...(summary.diagnostics === undefined ? {} : { diagnostics: redactJsonValue(summary.diagnostics, maxStringBytes) }),
|
|
234
|
+
...(summary.capabilitiesUsed === undefined ? {} : { capabilitiesUsed: redactJsonValue(summary.capabilitiesUsed, maxStringBytes) }),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
function toRecordedEvent(raw, index, maxStringBytes) {
|
|
238
|
+
const payload = redactJsonValue(raw, maxStringBytes);
|
|
239
|
+
const category = classifyRecordedRunEvent(payload);
|
|
240
|
+
const record = isRecord(payload) ? payload : {};
|
|
241
|
+
const type = stringField(record, "type");
|
|
242
|
+
const timestamp = stringField(record, "timestamp") ?? stringField(record, "createdAt") ?? stringField(record, "time");
|
|
243
|
+
return {
|
|
244
|
+
index,
|
|
245
|
+
...(type === undefined ? {} : { type }),
|
|
246
|
+
category,
|
|
247
|
+
...(timestamp === undefined ? {} : { timestamp }),
|
|
248
|
+
label: eventLabel(record, category, type),
|
|
249
|
+
summary: eventSummary(record, category, payload, maxStringBytes),
|
|
250
|
+
payload,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
function eventLabel(record, category, type) {
|
|
254
|
+
const toolName = stringField(record, "toolName") ?? stringField(record, "tool") ?? stringField(record, "name");
|
|
255
|
+
if (category === "tool" && toolName !== undefined) {
|
|
256
|
+
return `Tool: ${toolName}`;
|
|
257
|
+
}
|
|
258
|
+
const role = stringField(record, "role");
|
|
259
|
+
if (category === "message" && role !== undefined) {
|
|
260
|
+
return `Message: ${role}`;
|
|
261
|
+
}
|
|
262
|
+
if (category === "thinking") {
|
|
263
|
+
return type ?? "Reasoning event";
|
|
264
|
+
}
|
|
265
|
+
if (category === "error") {
|
|
266
|
+
return type ?? stringField(record, "failureKind") ?? "Error";
|
|
267
|
+
}
|
|
268
|
+
return type ?? "Runtime event";
|
|
269
|
+
}
|
|
270
|
+
function eventSummary(record, category, payload, maxStringBytes) {
|
|
271
|
+
const direct = stringField(record, "summary") ?? stringField(record, "text") ?? stringField(record, "delta") ?? stringField(record, "error");
|
|
272
|
+
if (direct !== undefined) {
|
|
273
|
+
return compactString(direct);
|
|
274
|
+
}
|
|
275
|
+
const messageText = textFromMessage(record.message);
|
|
276
|
+
if (messageText !== undefined) {
|
|
277
|
+
return compactString(messageText);
|
|
278
|
+
}
|
|
279
|
+
if (category === "tool") {
|
|
280
|
+
const status = stringField(record, "status") ?? stringField(record, "state");
|
|
281
|
+
const toolName = stringField(record, "toolName") ?? stringField(record, "tool") ?? stringField(record, "name");
|
|
282
|
+
if (toolName !== undefined && status !== undefined) {
|
|
283
|
+
return `${toolName} — ${status}`;
|
|
284
|
+
}
|
|
285
|
+
if (toolName !== undefined) {
|
|
286
|
+
return toolName;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
if (category === "thinking") {
|
|
290
|
+
return "Runtime emitted a reasoning/thinking process event.";
|
|
291
|
+
}
|
|
292
|
+
return compactString(JSON.stringify(redactJsonValue(payload, maxStringBytes)));
|
|
293
|
+
}
|
|
294
|
+
function textFromMessage(value) {
|
|
295
|
+
if (typeof value === "string") {
|
|
296
|
+
return value;
|
|
297
|
+
}
|
|
298
|
+
if (!isRecord(value)) {
|
|
299
|
+
return undefined;
|
|
300
|
+
}
|
|
301
|
+
const content = value.content;
|
|
302
|
+
if (typeof content === "string") {
|
|
303
|
+
return content;
|
|
304
|
+
}
|
|
305
|
+
if (!Array.isArray(content)) {
|
|
306
|
+
return undefined;
|
|
307
|
+
}
|
|
308
|
+
const text = content
|
|
309
|
+
.map((block) => {
|
|
310
|
+
if (typeof block === "string") {
|
|
311
|
+
return block;
|
|
312
|
+
}
|
|
313
|
+
if (isRecord(block) && block.type === "text" && typeof block.text === "string") {
|
|
314
|
+
return block.text;
|
|
315
|
+
}
|
|
316
|
+
return "";
|
|
317
|
+
})
|
|
318
|
+
.join("");
|
|
319
|
+
return text.length > 0 ? text : undefined;
|
|
320
|
+
}
|
|
321
|
+
function assistantMessageContentKind(event) {
|
|
322
|
+
if (stringField(event, "type") !== "assistant") {
|
|
323
|
+
return undefined;
|
|
324
|
+
}
|
|
325
|
+
return classifyAssistantContent(event.message)?.kind;
|
|
326
|
+
}
|
|
327
|
+
function normalizeReaderOptions(options) {
|
|
328
|
+
if (typeof options.artifactDir !== "string" || options.artifactDir.trim().length === 0) {
|
|
329
|
+
throw new ObservabilityReadError("invalid_reader_options", "artifactDir must be a non-empty path.");
|
|
330
|
+
}
|
|
331
|
+
const raiseOptions = (message, field) => {
|
|
332
|
+
throw new ObservabilityReadError("invalid_reader_options", message, { field });
|
|
333
|
+
};
|
|
334
|
+
return {
|
|
335
|
+
artifactDir: resolve(options.artifactDir),
|
|
336
|
+
maxRuns: positiveInteger(options.maxRuns, DEFAULT_MAX_RUNS, "maxRuns", raiseOptions),
|
|
337
|
+
maxEventsPerRun: positiveInteger(options.maxEventsPerRun, DEFAULT_MAX_EVENTS_PER_RUN, "maxEventsPerRun", raiseOptions),
|
|
338
|
+
maxStringBytes: minInteger(options.maxStringBytes, DEFAULT_MAX_STRING_BYTES, 64, "maxStringBytes", raiseOptions),
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
function normalizeRunId(runId) {
|
|
342
|
+
return normalizeRunIdGuard(runId, (message) => {
|
|
343
|
+
throw new ObservabilityReadError("invalid_run_id", message);
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
function safeJoin(root, fileName) {
|
|
347
|
+
return safeJoinGuard(root, fileName, () => {
|
|
348
|
+
throw new ObservabilityReadError("invalid_run_id", "Resolved artifact path escapes artifactDir.");
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
function runSummaryStatus(value) {
|
|
352
|
+
return value === "running" || value === "succeeded" || value === "failed" || value === "cancelled" ? value : undefined;
|
|
353
|
+
}
|
|
354
|
+
function summaryUpdatedAtMs(entry) {
|
|
355
|
+
const parsed = entry.summary.updatedAt === undefined ? Number.NaN : Date.parse(entry.summary.updatedAt);
|
|
356
|
+
return Number.isFinite(parsed) ? parsed : entry.mtimeMs;
|
|
357
|
+
}
|
|
358
|
+
function providerSessionIdField(value) {
|
|
359
|
+
if (value === null) {
|
|
360
|
+
return null;
|
|
361
|
+
}
|
|
362
|
+
return typeof value === "string" ? value : undefined;
|
|
363
|
+
}
|
|
364
|
+
function finiteNumberField(record, key) {
|
|
365
|
+
const value = record[key];
|
|
366
|
+
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
367
|
+
}
|
|
368
|
+
function integerNumberField(record, key) {
|
|
369
|
+
const value = record[key];
|
|
370
|
+
return typeof value === "number" && Number.isInteger(value) && value >= 0 ? value : undefined;
|
|
371
|
+
}
|
|
372
|
+
//# sourceMappingURL=recorded-runs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recorded-runs.js","sourceRoot":"","sources":["../src/recorded-runs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { JsonlRunRecorderOptions, RunRecorder } from "./types.js";
|
|
2
|
+
export type ObservabilityErrorCode = "invalid_recorder_options" | "artifact_write_failed";
|
|
3
|
+
export type ObservabilityErrorDetails = Record<string, unknown> & {
|
|
4
|
+
readonly code: ObservabilityErrorCode;
|
|
5
|
+
};
|
|
6
|
+
export declare class ObservabilityError extends Error {
|
|
7
|
+
readonly code: ObservabilityErrorCode;
|
|
8
|
+
readonly details: ObservabilityErrorDetails;
|
|
9
|
+
constructor(code: ObservabilityErrorCode, message: string, details?: Record<string, unknown>);
|
|
10
|
+
}
|
|
11
|
+
export declare function createJsonlRunRecorder(options: JsonlRunRecorderOptions): RunRecorder;
|
|
12
|
+
export declare function redactJsonValue(value: unknown, maxStringBytes?: number): unknown;
|
|
13
|
+
//# sourceMappingURL=recorder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,WAAW,EAAmD,MAAM,YAAY,CAAC;AAIxH,MAAM,MAAM,sBAAsB,GAAG,0BAA0B,GAAG,uBAAuB,CAAC;AAC1F,MAAM,MAAM,yBAAyB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAA;CAAE,CAAC;AAE5G,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;gBAEhC,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CAMjG;AAoGD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,WAAW,CAEpF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,SAA2B,GAAG,OAAO,CAElG"}
|
package/dist/recorder.js
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { join, resolve } from "node:path";
|
|
2
|
+
import { DEFAULT_MAX_STRING_BYTES, mkdir, safeArtifactName, writeJsonAtomic } from "./artifact-fs.js";
|
|
3
|
+
const SENSITIVE_KEY_PATTERN = /(token|secret|password|authorization|api[_-]?key|cookie)/iu;
|
|
4
|
+
export class ObservabilityError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
details;
|
|
7
|
+
constructor(code, message, details = {}) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = "ObservabilityError";
|
|
10
|
+
this.code = code;
|
|
11
|
+
this.details = { ...details, code };
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
class JsonlRunRecorder {
|
|
15
|
+
runId;
|
|
16
|
+
conversationId;
|
|
17
|
+
artifactDir;
|
|
18
|
+
clock;
|
|
19
|
+
maxStringBytes;
|
|
20
|
+
startedAt;
|
|
21
|
+
startedAtIso;
|
|
22
|
+
events = [];
|
|
23
|
+
constructor(options) {
|
|
24
|
+
this.runId = normalizeId(options.runId, "runId");
|
|
25
|
+
this.conversationId = normalizeId(options.conversationId, "conversationId");
|
|
26
|
+
if (typeof options.artifactDir !== "string" || options.artifactDir.trim().length === 0) {
|
|
27
|
+
throw new ObservabilityError("invalid_recorder_options", "artifactDir must be a non-empty path.");
|
|
28
|
+
}
|
|
29
|
+
if (options.maxStringBytes !== undefined && (!Number.isInteger(options.maxStringBytes) || options.maxStringBytes < 64)) {
|
|
30
|
+
throw new ObservabilityError("invalid_recorder_options", "maxStringBytes must be an integer of at least 64.");
|
|
31
|
+
}
|
|
32
|
+
this.artifactDir = resolve(options.artifactDir);
|
|
33
|
+
this.clock = options.clock ?? (() => Date.now());
|
|
34
|
+
this.maxStringBytes = options.maxStringBytes ?? DEFAULT_MAX_STRING_BYTES;
|
|
35
|
+
this.startedAt = this.clock();
|
|
36
|
+
this.startedAtIso = new Date(this.startedAt).toISOString();
|
|
37
|
+
}
|
|
38
|
+
async start() {
|
|
39
|
+
return await this.writeArtifacts(this.buildSummary("running", undefined, {}));
|
|
40
|
+
}
|
|
41
|
+
onEvent(event) {
|
|
42
|
+
this.events.push(redactJsonValue(event, this.maxStringBytes));
|
|
43
|
+
}
|
|
44
|
+
async finish(result) {
|
|
45
|
+
const status = result.cancelled === true ? "cancelled" : runtimeFailureKind(result) === undefined ? "succeeded" : "failed";
|
|
46
|
+
const baseSummary = this.buildSummary(status, runtimeFailureKind(result), result);
|
|
47
|
+
return await this.writeArtifacts(baseSummary);
|
|
48
|
+
}
|
|
49
|
+
async fail(error) {
|
|
50
|
+
const failureKind = errorFailureKind(error);
|
|
51
|
+
const summary = this.buildSummary("failed", failureKind, {
|
|
52
|
+
diagnostics: {
|
|
53
|
+
error: redactJsonValue(errorToJson(error), this.maxStringBytes),
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
return await this.writeArtifacts(summary);
|
|
57
|
+
}
|
|
58
|
+
buildSummary(status, failureKind, result) {
|
|
59
|
+
const now = this.clock();
|
|
60
|
+
const nowIso = new Date(now).toISOString();
|
|
61
|
+
const summary = {
|
|
62
|
+
runId: this.runId,
|
|
63
|
+
conversationId: this.conversationId,
|
|
64
|
+
status,
|
|
65
|
+
...(failureKind === undefined ? {} : { failureKind }),
|
|
66
|
+
startedAt: this.startedAtIso,
|
|
67
|
+
...(status === "running" ? {} : { endedAt: nowIso }),
|
|
68
|
+
updatedAt: nowIso,
|
|
69
|
+
durationMs: Math.max(0, now - this.startedAt),
|
|
70
|
+
...(result.usage === undefined ? {} : { usage: redactJsonValue(result.usage, this.maxStringBytes) }),
|
|
71
|
+
...(result.cost === undefined ? {} : { cost: redactJsonValue(result.cost, this.maxStringBytes) }),
|
|
72
|
+
...(result.providerSessionId === undefined ? {} : { providerSessionId: result.providerSessionId }),
|
|
73
|
+
eventCount: this.events.length,
|
|
74
|
+
artifactPaths: this.artifactPaths(),
|
|
75
|
+
...(result.runtimeWarnings === undefined ? {} : { runtimeWarnings: redactJsonValue(result.runtimeWarnings, this.maxStringBytes) }),
|
|
76
|
+
...(result.diagnostics === undefined ? {} : { diagnostics: redactJsonValue(result.diagnostics, this.maxStringBytes) }),
|
|
77
|
+
...(result.capabilitiesUsed === undefined ? {} : { capabilitiesUsed: redactJsonValue(result.capabilitiesUsed, this.maxStringBytes) }),
|
|
78
|
+
};
|
|
79
|
+
return summary;
|
|
80
|
+
}
|
|
81
|
+
artifactPaths() {
|
|
82
|
+
const base = safeArtifactName(this.runId);
|
|
83
|
+
return [join(this.artifactDir, `${base}.events.jsonl`), join(this.artifactDir, `${base}.summary.json`)];
|
|
84
|
+
}
|
|
85
|
+
async writeArtifacts(summary) {
|
|
86
|
+
const [eventsPath, summaryPath] = summary.artifactPaths;
|
|
87
|
+
if (eventsPath === undefined || summaryPath === undefined) {
|
|
88
|
+
throw new ObservabilityError("artifact_write_failed", "Recorder artifact paths were not generated.");
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
await mkdir(this.artifactDir, { recursive: true });
|
|
92
|
+
const eventsJsonl = this.events.map((event) => JSON.stringify(event)).join("\n");
|
|
93
|
+
await writeJsonAtomic(eventsPath, eventsJsonl.length === 0 ? "" : `${eventsJsonl}\n`);
|
|
94
|
+
await writeJsonAtomic(summaryPath, `${JSON.stringify(summary, null, 2)}\n`);
|
|
95
|
+
return summary;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
throw new ObservabilityError("artifact_write_failed", "Unable to write run artifacts.", {
|
|
99
|
+
cause: error instanceof Error ? error.message : String(error),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export function createJsonlRunRecorder(options) {
|
|
105
|
+
return new JsonlRunRecorder(options);
|
|
106
|
+
}
|
|
107
|
+
export function redactJsonValue(value, maxStringBytes = DEFAULT_MAX_STRING_BYTES) {
|
|
108
|
+
return redact(value, maxStringBytes, 0, undefined, new WeakSet());
|
|
109
|
+
}
|
|
110
|
+
function redact(value, maxStringBytes, depth, key, seen) {
|
|
111
|
+
if (key !== undefined && SENSITIVE_KEY_PATTERN.test(key)) {
|
|
112
|
+
return "[redacted]";
|
|
113
|
+
}
|
|
114
|
+
if (value === null || typeof value === "boolean" || typeof value === "number") {
|
|
115
|
+
return value;
|
|
116
|
+
}
|
|
117
|
+
if (typeof value === "string") {
|
|
118
|
+
return truncateString(value, maxStringBytes);
|
|
119
|
+
}
|
|
120
|
+
if (typeof value === "bigint") {
|
|
121
|
+
return value.toString();
|
|
122
|
+
}
|
|
123
|
+
if (typeof value === "undefined" || typeof value === "function" || typeof value === "symbol") {
|
|
124
|
+
return String(value);
|
|
125
|
+
}
|
|
126
|
+
if (value instanceof Error) {
|
|
127
|
+
return errorToJson(value);
|
|
128
|
+
}
|
|
129
|
+
if (depth >= 12) {
|
|
130
|
+
return "[max-depth]";
|
|
131
|
+
}
|
|
132
|
+
if (seen.has(value)) {
|
|
133
|
+
return "[circular]";
|
|
134
|
+
}
|
|
135
|
+
seen.add(value);
|
|
136
|
+
if (Array.isArray(value)) {
|
|
137
|
+
return value.map((item) => redact(item, maxStringBytes, depth + 1, undefined, seen));
|
|
138
|
+
}
|
|
139
|
+
const out = {};
|
|
140
|
+
for (const [entryKey, entryValue] of Object.entries(value)) {
|
|
141
|
+
out[entryKey] = redact(entryValue, maxStringBytes, depth + 1, entryKey, seen);
|
|
142
|
+
}
|
|
143
|
+
return out;
|
|
144
|
+
}
|
|
145
|
+
function truncateString(value, maxStringBytes) {
|
|
146
|
+
const bytes = Buffer.byteLength(value, "utf8");
|
|
147
|
+
if (bytes <= maxStringBytes) {
|
|
148
|
+
return value;
|
|
149
|
+
}
|
|
150
|
+
return `${value.slice(0, maxStringBytes)}…[truncated ${bytes - maxStringBytes} bytes]`;
|
|
151
|
+
}
|
|
152
|
+
function normalizeId(value, field) {
|
|
153
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
154
|
+
throw new ObservabilityError("invalid_recorder_options", `${field} must be a non-empty string.`, { field });
|
|
155
|
+
}
|
|
156
|
+
return value.trim();
|
|
157
|
+
}
|
|
158
|
+
function runtimeFailureKind(result) {
|
|
159
|
+
if (typeof result.failureKind === "string" && result.failureKind.trim().length > 0) {
|
|
160
|
+
return result.failureKind;
|
|
161
|
+
}
|
|
162
|
+
if (typeof result.error === "string" && result.error.trim().length > 0) {
|
|
163
|
+
return "runtime_error";
|
|
164
|
+
}
|
|
165
|
+
return undefined;
|
|
166
|
+
}
|
|
167
|
+
function errorFailureKind(error) {
|
|
168
|
+
if (typeof error === "object" && error !== null && "failureKind" in error) {
|
|
169
|
+
const failureKind = error.failureKind;
|
|
170
|
+
if (typeof failureKind === "string" && failureKind.trim().length > 0) {
|
|
171
|
+
return failureKind;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (error instanceof Error && error.name.length > 0) {
|
|
175
|
+
return error.name;
|
|
176
|
+
}
|
|
177
|
+
return "exception";
|
|
178
|
+
}
|
|
179
|
+
function errorToJson(error) {
|
|
180
|
+
if (error instanceof Error) {
|
|
181
|
+
return {
|
|
182
|
+
name: error.name,
|
|
183
|
+
message: error.message,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
return { message: String(error) };
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=recorder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recorder.js","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { RegisterTraceSourceOptions, TraceRunDetail, TraceRunListOptions, TraceRunListResult, TraceSourceHandle, TraceSourceListResult, TraceSourceRegistryOptions } from "./types.js";
|
|
2
|
+
export type TraceSourceRegistryErrorCode = "invalid_registry_options" | "invalid_source_id" | "invalid_run_id" | "manifest_write_failed";
|
|
3
|
+
export type TraceSourceRegistryErrorDetails = Record<string, unknown> & {
|
|
4
|
+
readonly code: TraceSourceRegistryErrorCode;
|
|
5
|
+
};
|
|
6
|
+
export declare class TraceSourceRegistryError extends Error {
|
|
7
|
+
readonly code: TraceSourceRegistryErrorCode;
|
|
8
|
+
readonly details: TraceSourceRegistryErrorDetails;
|
|
9
|
+
constructor(code: TraceSourceRegistryErrorCode, message: string, details?: Record<string, unknown>);
|
|
10
|
+
}
|
|
11
|
+
export declare function registerTraceSource(options: RegisterTraceSourceOptions): Promise<TraceSourceHandle>;
|
|
12
|
+
export declare function listTraceSources(options: TraceSourceRegistryOptions): Promise<TraceSourceListResult>;
|
|
13
|
+
export declare function listTraceRuns(options: TraceRunListOptions): Promise<TraceRunListResult>;
|
|
14
|
+
export declare function readTraceRun(options: TraceRunListOptions, sourceId: string, runId: string): Promise<TraceRunDetail | undefined>;
|
|
15
|
+
//# sourceMappingURL=trace-sources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-sources.d.ts","sourceRoot":"","sources":["../src/trace-sources.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAEV,0BAA0B,EAC1B,cAAc,EAEd,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EAEjB,qBAAqB,EAErB,0BAA0B,EAG3B,MAAM,YAAY,CAAC;AAOpB,MAAM,MAAM,4BAA4B,GACpC,0BAA0B,GAC1B,mBAAmB,GACnB,gBAAgB,GAChB,uBAAuB,CAAC;AAC5B,MAAM,MAAM,+BAA+B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,4BAA4B,CAAA;CAAE,CAAC;AAExH,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,IAAI,EAAE,4BAA4B,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,+BAA+B,CAAC;gBAEtC,IAAI,EAAE,4BAA4B,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CAMvG;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA4DzG;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAQ1G;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0B7F;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,EAC5B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAWrC"}
|