@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.
@@ -0,0 +1,348 @@
1
+ import { readdir, readFile, stat } from "node:fs/promises";
2
+ import { resolve } from "node:path";
3
+ import { DEFAULT_MAX_EVENTS_PER_RUN, DEFAULT_MAX_STRING_BYTES, errorMessage, isErrno, isRecord, mkdir, minInteger, normalizeRunId as normalizeRunIdGuard, positiveInteger, safeJoin as safeJoinGuard, stringField, writeJsonAtomic, } from "./artifact-fs.js";
4
+ import { listRecordedRuns, readRecordedRun } from "./recorded-runs.js";
5
+ import { redactJsonValue } from "./recorder.js";
6
+ const DEFAULT_STALE_AFTER_MS = 30_000;
7
+ const MANIFEST_SUFFIX = ".json";
8
+ const SOURCE_ID_PATTERN = /^[A-Za-z0-9._-]+$/u;
9
+ const DEFAULT_MAX_RUNS = 100;
10
+ export class TraceSourceRegistryError extends Error {
11
+ code;
12
+ details;
13
+ constructor(code, message, details = {}) {
14
+ super(message);
15
+ this.name = "TraceSourceRegistryError";
16
+ this.code = code;
17
+ this.details = { ...details, code };
18
+ }
19
+ }
20
+ export async function registerTraceSource(options) {
21
+ const normalized = normalizeRegistryOptions(options);
22
+ const sourceId = normalizeSourceId(options.sourceId ?? sourceIdFromLabel(options.label));
23
+ const label = normalizeNonEmpty(options.label, "label");
24
+ const artifactDir = resolvePath(options.artifactDir, "artifactDir");
25
+ const startedAt = options.startedAt ?? isoNow(normalized.clock);
26
+ let manifest = buildManifest({
27
+ sourceId,
28
+ label,
29
+ artifactDir,
30
+ status: options.status ?? "running",
31
+ startedAt,
32
+ updatedAt: isoNow(normalized.clock),
33
+ ...(options.pid === undefined ? {} : { pid: options.pid }),
34
+ ...(options.transports === undefined ? {} : { transports: options.transports }),
35
+ ...(options.configPath === undefined ? {} : { configPath: options.configPath }),
36
+ ...(options.metadata === undefined ? {} : { metadata: options.metadata }),
37
+ });
38
+ await writeManifest(normalized.registryDir, manifest);
39
+ let heartbeatTimer;
40
+ const heartbeatMs = options.heartbeatMs;
41
+ const writePatch = async (patch) => {
42
+ manifest = buildManifest({
43
+ ...manifest,
44
+ ...patch,
45
+ updatedAt: isoNow(normalized.clock),
46
+ });
47
+ await writeManifest(normalized.registryDir, manifest);
48
+ return manifest;
49
+ };
50
+ if (heartbeatMs !== undefined) {
51
+ if (!Number.isInteger(heartbeatMs) || heartbeatMs < 250) {
52
+ throw new TraceSourceRegistryError("invalid_registry_options", "heartbeatMs must be an integer of at least 250.", {
53
+ field: "heartbeatMs",
54
+ });
55
+ }
56
+ heartbeatTimer = setInterval(() => {
57
+ void writePatch({});
58
+ }, heartbeatMs);
59
+ heartbeatTimer.unref?.();
60
+ }
61
+ return {
62
+ get manifest() {
63
+ return manifest;
64
+ },
65
+ update: writePatch,
66
+ async heartbeat() {
67
+ return await writePatch({});
68
+ },
69
+ async stop(patch = {}) {
70
+ if (heartbeatTimer !== undefined) {
71
+ clearInterval(heartbeatTimer);
72
+ heartbeatTimer = undefined;
73
+ }
74
+ return await writePatch({ ...patch, status: patch.status ?? "stopped" });
75
+ },
76
+ };
77
+ }
78
+ export async function listTraceSources(options) {
79
+ const normalized = normalizeRegistryOptions(options);
80
+ const { manifests, warnings } = await readManifestFiles(normalized);
81
+ return {
82
+ registryDir: normalized.registryDir,
83
+ sources: manifests.map((manifest) => toListItem(manifest, normalized)).sort(compareSources),
84
+ warnings,
85
+ };
86
+ }
87
+ export async function listTraceRuns(options) {
88
+ const normalized = normalizeRunListOptions(options);
89
+ const sourceResult = await listTraceSources(normalized);
90
+ const warnings = [...sourceResult.warnings];
91
+ const runs = [];
92
+ for (const source of sourceResult.sources) {
93
+ if (!(await artifactDirExists(source.artifactDir))) {
94
+ warnings.push(`Source ${source.sourceId} artifact directory is missing: ${source.artifactDir}.`);
95
+ continue;
96
+ }
97
+ const result = await listRecordedRuns(readerOptionsForSource(source.artifactDir, normalized));
98
+ warnings.push(...result.warnings.map((warning) => `Source ${source.sourceId}: ${warning}`));
99
+ for (const run of result.runs) {
100
+ runs.push({ ...run, source });
101
+ }
102
+ }
103
+ return {
104
+ registryDir: normalized.registryDir,
105
+ sources: sourceResult.sources,
106
+ runs: runs
107
+ .sort(compareTraceRuns)
108
+ .slice(0, normalized.maxRuns),
109
+ warnings,
110
+ };
111
+ }
112
+ export async function readTraceRun(options, sourceId, runId) {
113
+ const normalized = normalizeRunListOptions(options);
114
+ const normalizedSourceId = normalizeSourceId(sourceId);
115
+ normalizeRunId(runId);
116
+ const sourceResult = await listTraceSources(normalized);
117
+ const source = sourceResult.sources.find((entry) => entry.sourceId === normalizedSourceId);
118
+ if (source === undefined) {
119
+ return undefined;
120
+ }
121
+ const run = await readRecordedRun(readerOptionsForSource(source.artifactDir, normalized), runId);
122
+ return run === undefined ? undefined : { source, run };
123
+ }
124
+ function buildManifest(input) {
125
+ return {
126
+ schema: "agent-runtime.trace-source.v1",
127
+ sourceId: normalizeSourceId(input.sourceId),
128
+ label: normalizeNonEmpty(input.label, "label"),
129
+ artifactDir: resolvePath(input.artifactDir, "artifactDir"),
130
+ ...(input.pid === undefined ? {} : { pid: input.pid }),
131
+ status: input.status,
132
+ startedAt: input.startedAt,
133
+ updatedAt: input.updatedAt,
134
+ ...(input.transports === undefined ? {} : { transports: input.transports.map((transport) => transport.trim()).filter(Boolean) }),
135
+ ...(input.configPath === undefined ? {} : { configPath: resolve(input.configPath) }),
136
+ ...(input.metadata === undefined ? {} : { metadata: redactJsonValue(input.metadata) }),
137
+ };
138
+ }
139
+ async function readManifestFiles(normalized) {
140
+ let entries;
141
+ try {
142
+ entries = await readdir(normalized.registryDir, { withFileTypes: true });
143
+ }
144
+ catch (error) {
145
+ if (isErrno(error, "ENOENT")) {
146
+ return { manifests: [], warnings: [] };
147
+ }
148
+ return { manifests: [], warnings: [`Unable to read trace registry: ${errorMessage(error)}.`] };
149
+ }
150
+ const manifests = [];
151
+ const warnings = [];
152
+ for (const entry of entries) {
153
+ if (!entry.isFile() || !entry.name.endsWith(MANIFEST_SUFFIX)) {
154
+ continue;
155
+ }
156
+ const path = safeJoin(normalized.registryDir, entry.name);
157
+ try {
158
+ const raw = await readFile(path, "utf8");
159
+ const parsed = JSON.parse(raw);
160
+ const manifest = coerceManifest(parsed, entry.name, warnings);
161
+ if (manifest !== undefined) {
162
+ manifests.push(manifest);
163
+ }
164
+ }
165
+ catch (error) {
166
+ warnings.push(`Skipping ${entry.name}: invalid JSON (${errorMessage(error)}).`);
167
+ }
168
+ }
169
+ return { manifests, warnings };
170
+ }
171
+ function coerceManifest(value, fileName, warnings) {
172
+ if (!isRecord(value)) {
173
+ warnings.push(`Skipping ${fileName}: manifest is not an object.`);
174
+ return undefined;
175
+ }
176
+ if (value.schema !== "agent-runtime.trace-source.v1") {
177
+ warnings.push(`Skipping ${fileName}: manifest schema is not agent-runtime.trace-source.v1.`);
178
+ return undefined;
179
+ }
180
+ const sourceId = stringField(value, "sourceId");
181
+ const label = stringField(value, "label");
182
+ const artifactDir = stringField(value, "artifactDir");
183
+ const status = sourceStatus(value.status);
184
+ const startedAt = stringField(value, "startedAt");
185
+ const updatedAt = stringField(value, "updatedAt");
186
+ if (sourceId === undefined ||
187
+ label === undefined ||
188
+ artifactDir === undefined ||
189
+ status === undefined ||
190
+ startedAt === undefined ||
191
+ updatedAt === undefined) {
192
+ warnings.push(`Skipping ${fileName}: manifest is missing required source metadata.`);
193
+ return undefined;
194
+ }
195
+ try {
196
+ const pid = typeof value.pid === "number" && Number.isInteger(value.pid) ? value.pid : undefined;
197
+ const transports = Array.isArray(value.transports) ? value.transports.filter((item) => typeof item === "string") : undefined;
198
+ const configPath = stringField(value, "configPath");
199
+ const metadata = isRecord(value.metadata) ? value.metadata : undefined;
200
+ return buildManifest({
201
+ sourceId,
202
+ label,
203
+ artifactDir,
204
+ status,
205
+ startedAt,
206
+ updatedAt,
207
+ ...(pid === undefined ? {} : { pid }),
208
+ ...(transports === undefined ? {} : { transports }),
209
+ ...(configPath === undefined ? {} : { configPath }),
210
+ ...(metadata === undefined ? {} : { metadata }),
211
+ });
212
+ }
213
+ catch (error) {
214
+ warnings.push(`Skipping ${fileName}: ${errorMessage(error)}.`);
215
+ return undefined;
216
+ }
217
+ }
218
+ function toListItem(manifest, normalized) {
219
+ const warnings = [];
220
+ const updatedAtMs = Date.parse(manifest.updatedAt);
221
+ const stale = manifest.status === "running" &&
222
+ Number.isFinite(updatedAtMs) &&
223
+ normalized.clock() - updatedAtMs > normalized.staleAfterMs;
224
+ if (stale) {
225
+ warnings.push(`Source ${manifest.sourceId} heartbeat is stale.`);
226
+ }
227
+ const health = manifest.status === "failed"
228
+ ? "failed"
229
+ : manifest.status === "stopped"
230
+ ? "stopped"
231
+ : stale
232
+ ? "stale"
233
+ : "running";
234
+ return { ...manifest, health, warnings };
235
+ }
236
+ async function writeManifest(registryDir, manifest) {
237
+ try {
238
+ await mkdir(registryDir, { recursive: true });
239
+ const path = manifestPath(registryDir, manifest.sourceId);
240
+ await writeJsonAtomic(path, `${JSON.stringify(manifest, null, 2)}\n`);
241
+ }
242
+ catch (error) {
243
+ throw new TraceSourceRegistryError("manifest_write_failed", "Unable to write trace source manifest.", {
244
+ cause: errorMessage(error),
245
+ });
246
+ }
247
+ }
248
+ function manifestPath(registryDir, sourceId) {
249
+ return safeJoin(registryDir, `${normalizeSourceId(sourceId)}${MANIFEST_SUFFIX}`);
250
+ }
251
+ function raiseRegistryOption(message, field) {
252
+ throw new TraceSourceRegistryError("invalid_registry_options", message, { field });
253
+ }
254
+ function normalizeRunListOptions(options) {
255
+ return {
256
+ ...normalizeRegistryOptions(options),
257
+ maxRuns: positiveInteger(options.maxRuns, DEFAULT_MAX_RUNS, "maxRuns", raiseRegistryOption),
258
+ maxEventsPerRun: positiveInteger(options.maxEventsPerRun, DEFAULT_MAX_EVENTS_PER_RUN, "maxEventsPerRun", raiseRegistryOption),
259
+ maxStringBytes: minInteger(options.maxStringBytes, DEFAULT_MAX_STRING_BYTES, 64, "maxStringBytes", raiseRegistryOption),
260
+ };
261
+ }
262
+ function normalizeRegistryOptions(options) {
263
+ if (typeof options.registryDir !== "string" || options.registryDir.trim().length === 0) {
264
+ throw new TraceSourceRegistryError("invalid_registry_options", "registryDir must be a non-empty path.");
265
+ }
266
+ return {
267
+ registryDir: resolve(options.registryDir),
268
+ staleAfterMs: positiveInteger(options.staleAfterMs, DEFAULT_STALE_AFTER_MS, "staleAfterMs", raiseRegistryOption),
269
+ clock: options.clock ?? (() => Date.now()),
270
+ };
271
+ }
272
+ function readerOptionsForSource(artifactDir, options) {
273
+ return {
274
+ artifactDir,
275
+ maxRuns: options.maxRuns,
276
+ maxEventsPerRun: options.maxEventsPerRun,
277
+ maxStringBytes: options.maxStringBytes,
278
+ };
279
+ }
280
+ function normalizeSourceId(sourceId) {
281
+ const normalized = normalizeNonEmpty(sourceId, "sourceId");
282
+ if (!SOURCE_ID_PATTERN.test(normalized) || normalized.includes("..")) {
283
+ throw new TraceSourceRegistryError("invalid_source_id", "sourceId must contain only letters, numbers, dot, underscore, or hyphen and cannot contain '..'.");
284
+ }
285
+ return normalized;
286
+ }
287
+ function normalizeRunId(runId) {
288
+ return normalizeRunIdGuard(runId, (message) => {
289
+ throw new TraceSourceRegistryError("invalid_run_id", message);
290
+ }, () => {
291
+ throw new TraceSourceRegistryError("invalid_registry_options", "runId must be a non-empty string.", { field: "runId" });
292
+ });
293
+ }
294
+ function sourceIdFromLabel(label) {
295
+ return label.trim().toLowerCase().replace(/[^a-z0-9._-]+/gu, "-").replace(/^-+|-+$/gu, "") || "source";
296
+ }
297
+ function sourceStatus(value) {
298
+ return value === "running" || value === "stopped" || value === "failed" ? value : undefined;
299
+ }
300
+ function compareSources(a, b) {
301
+ const byUpdated = Date.parse(b.updatedAt) - Date.parse(a.updatedAt);
302
+ return byUpdated === 0 ? a.sourceId.localeCompare(b.sourceId) : byUpdated;
303
+ }
304
+ function runUpdatedAtMs(run) {
305
+ const parsed = Date.parse(run.updatedAt);
306
+ return Number.isFinite(parsed) ? parsed : 0;
307
+ }
308
+ function compareTraceRuns(a, b) {
309
+ const byUpdated = runUpdatedAtMs(b) - runUpdatedAtMs(a);
310
+ if (byUpdated !== 0) {
311
+ return byUpdated;
312
+ }
313
+ const bySource = b.source.sourceId.localeCompare(a.source.sourceId);
314
+ if (bySource !== 0) {
315
+ return bySource;
316
+ }
317
+ return b.runId.localeCompare(a.runId);
318
+ }
319
+ async function artifactDirExists(path) {
320
+ try {
321
+ const stats = await stat(path);
322
+ return stats.isDirectory();
323
+ }
324
+ catch (error) {
325
+ if (isErrno(error, "ENOENT")) {
326
+ return false;
327
+ }
328
+ return false;
329
+ }
330
+ }
331
+ function resolvePath(path, field) {
332
+ return resolve(normalizeNonEmpty(path, field));
333
+ }
334
+ function normalizeNonEmpty(value, field) {
335
+ if (typeof value !== "string" || value.trim().length === 0) {
336
+ throw new TraceSourceRegistryError("invalid_registry_options", `${field} must be a non-empty string.`, { field });
337
+ }
338
+ return value.trim();
339
+ }
340
+ function safeJoin(root, fileName) {
341
+ return safeJoinGuard(root, fileName, () => {
342
+ throw new TraceSourceRegistryError("invalid_source_id", "Resolved manifest path escapes registryDir.");
343
+ });
344
+ }
345
+ function isoNow(clock) {
346
+ return new Date(clock()).toISOString();
347
+ }
348
+ //# sourceMappingURL=trace-sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-sources.js","sourceRoot":"","sources":["../src/trace-sources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,171 @@
1
+ export interface RuntimeEventLike {
2
+ readonly type?: string;
3
+ readonly [key: string]: unknown;
4
+ }
5
+ export interface RuntimeResultLike {
6
+ readonly cancelled?: boolean;
7
+ readonly error?: string | null;
8
+ readonly failureKind?: string | null;
9
+ readonly usage?: unknown;
10
+ readonly cost?: unknown;
11
+ readonly durationMs?: number;
12
+ readonly providerSessionId?: string | null;
13
+ readonly runtimeWarnings?: unknown;
14
+ readonly diagnostics?: unknown;
15
+ readonly capabilitiesUsed?: unknown;
16
+ readonly [key: string]: unknown;
17
+ }
18
+ export type RunSummaryStatus = "running" | "succeeded" | "failed" | "cancelled";
19
+ export interface RunSummary {
20
+ readonly runId: string;
21
+ readonly conversationId: string;
22
+ readonly status: RunSummaryStatus;
23
+ readonly failureKind?: string;
24
+ readonly startedAt?: string;
25
+ readonly endedAt?: string;
26
+ readonly updatedAt?: string;
27
+ readonly durationMs: number;
28
+ readonly usage?: unknown;
29
+ readonly cost?: unknown;
30
+ readonly providerSessionId?: string | null;
31
+ readonly eventCount: number;
32
+ readonly artifactPaths: readonly string[];
33
+ readonly runtimeWarnings?: unknown;
34
+ readonly diagnostics?: unknown;
35
+ readonly capabilitiesUsed?: unknown;
36
+ }
37
+ export interface RunRecorder {
38
+ start?(): Promise<RunSummary>;
39
+ onEvent(event: RuntimeEventLike): void;
40
+ finish(result: RuntimeResultLike): Promise<RunSummary>;
41
+ fail(error: unknown): Promise<RunSummary>;
42
+ }
43
+ export interface JsonlRunRecorderOptions {
44
+ readonly runId: string;
45
+ readonly conversationId: string;
46
+ readonly artifactDir: string;
47
+ readonly clock?: () => number;
48
+ readonly maxStringBytes?: number;
49
+ }
50
+ export type RecordedRunEventCategory = "tool" | "thinking" | "message" | "runtime" | "error";
51
+ export interface RecordedRunListItem {
52
+ readonly runId: string;
53
+ readonly conversationId: string;
54
+ readonly status: RunSummaryStatus;
55
+ readonly failureKind?: string;
56
+ readonly startedAt?: string;
57
+ readonly endedAt?: string;
58
+ readonly durationMs: number;
59
+ readonly eventCount: number;
60
+ readonly updatedAt: string;
61
+ readonly usage?: unknown;
62
+ readonly cost?: unknown;
63
+ readonly providerSessionId?: string | null;
64
+ readonly runtimeWarnings?: unknown;
65
+ readonly diagnostics?: unknown;
66
+ readonly capabilitiesUsed?: unknown;
67
+ }
68
+ export interface RecordedRunEvent {
69
+ readonly index: number;
70
+ readonly type?: string;
71
+ readonly category: RecordedRunEventCategory;
72
+ readonly timestamp?: string;
73
+ readonly label: string;
74
+ readonly summary: string;
75
+ readonly payload: unknown;
76
+ }
77
+ export interface RecordedRunTimelineItem extends RecordedRunEvent {
78
+ readonly sourceEventCount: number;
79
+ readonly sourceEventStartIndex: number;
80
+ readonly sourceEventEndIndex: number;
81
+ }
82
+ export interface RecordedRunDetail {
83
+ readonly summary: RecordedRunListItem;
84
+ readonly events: readonly RecordedRunEvent[];
85
+ readonly warnings: readonly string[];
86
+ }
87
+ export interface RecordedRunListResult {
88
+ readonly runs: readonly RecordedRunListItem[];
89
+ readonly warnings: readonly string[];
90
+ }
91
+ export interface JsonlRunReaderOptions {
92
+ readonly artifactDir: string;
93
+ readonly maxRuns?: number;
94
+ readonly maxEventsPerRun?: number;
95
+ readonly maxStringBytes?: number;
96
+ }
97
+ export type TraceSourceStatus = "running" | "stopped" | "failed";
98
+ export type TraceSourceHealth = "running" | "stale" | "stopped" | "failed";
99
+ export interface TraceSourceManifest {
100
+ readonly schema: "agent-runtime.trace-source.v1";
101
+ readonly sourceId: string;
102
+ readonly label: string;
103
+ readonly artifactDir: string;
104
+ readonly pid?: number;
105
+ readonly status: TraceSourceStatus;
106
+ readonly startedAt: string;
107
+ readonly updatedAt: string;
108
+ readonly transports?: readonly string[];
109
+ readonly configPath?: string;
110
+ readonly metadata?: Record<string, unknown>;
111
+ }
112
+ export interface TraceSourceListItem extends TraceSourceManifest {
113
+ readonly health: TraceSourceHealth;
114
+ readonly warnings: readonly string[];
115
+ }
116
+ export interface TraceRunListItem extends RecordedRunListItem {
117
+ readonly source: TraceSourceListItem;
118
+ }
119
+ export interface TraceRunDetail {
120
+ readonly source: TraceSourceListItem;
121
+ readonly run: RecordedRunDetail;
122
+ }
123
+ export interface TraceSourceRegistryOptions {
124
+ readonly registryDir: string;
125
+ readonly staleAfterMs?: number;
126
+ readonly clock?: () => number;
127
+ }
128
+ export interface RegisterTraceSourceOptions extends TraceSourceRegistryOptions {
129
+ readonly sourceId?: string;
130
+ readonly label: string;
131
+ readonly artifactDir: string;
132
+ readonly pid?: number;
133
+ readonly status?: TraceSourceStatus;
134
+ readonly startedAt?: string;
135
+ readonly heartbeatMs?: number;
136
+ readonly transports?: readonly string[];
137
+ readonly configPath?: string;
138
+ readonly metadata?: Record<string, unknown>;
139
+ }
140
+ export interface UpdateTraceSourceOptions {
141
+ readonly status?: TraceSourceStatus;
142
+ readonly artifactDir?: string;
143
+ readonly transports?: readonly string[];
144
+ readonly configPath?: string;
145
+ readonly metadata?: Record<string, unknown>;
146
+ }
147
+ export interface TraceSourceHandle {
148
+ readonly manifest: TraceSourceManifest;
149
+ update(patch: UpdateTraceSourceOptions): Promise<TraceSourceManifest>;
150
+ heartbeat(): Promise<TraceSourceManifest>;
151
+ stop(patch?: Omit<UpdateTraceSourceOptions, "status"> & {
152
+ readonly status?: "stopped" | "failed";
153
+ }): Promise<TraceSourceManifest>;
154
+ }
155
+ export interface TraceSourceListResult {
156
+ readonly registryDir: string;
157
+ readonly sources: readonly TraceSourceListItem[];
158
+ readonly warnings: readonly string[];
159
+ }
160
+ export interface TraceRunListOptions extends TraceSourceRegistryOptions {
161
+ readonly maxRuns?: number;
162
+ readonly maxEventsPerRun?: number;
163
+ readonly maxStringBytes?: number;
164
+ }
165
+ export interface TraceRunListResult {
166
+ readonly registryDir: string;
167
+ readonly sources: readonly TraceSourceListItem[];
168
+ readonly runs: readonly TraceRunListItem[];
169
+ readonly warnings: readonly string[];
170
+ }
171
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@mono-agent/observability",
3
+ "version": "0.1.0",
4
+ "description": "Run event recording and artifact summaries for agent hosts.",
5
+ "type": "module",
6
+ "license": "UNLICENSED",
7
+ "private": false,
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ },
15
+ "./event-timeline": {
16
+ "types": "./dist/event-timeline.d.ts",
17
+ "import": "./dist/event-timeline.js"
18
+ }
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "README.md"
23
+ ],
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "scripts": {
28
+ "build": "tsc -p tsconfig.build.json",
29
+ "typecheck": "tsc -p tsconfig.json --noEmit",
30
+ "test": "vitest run --passWithNoTests"
31
+ }
32
+ }