@reactive-agents/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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Tyler Buell
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,45 @@
1
+ # @reactive-agents/observability
2
+
3
+ Observability for the [Reactive Agents](https://tylerjrbuell.github.io/reactive-agents-ts/) framework.
4
+
5
+ Adds distributed tracing, metrics, and structured logging to every phase of the agent execution engine.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ bun add @reactive-agents/observability effect
11
+ ```
12
+
13
+ ## Features
14
+
15
+ - **Distributed tracing** — span per execution phase, compatible with OpenTelemetry exporters
16
+ - **Metrics** — token usage, latency, step count, cost per run
17
+ - **Structured logging** — JSON logs with trace context for easy querying
18
+
19
+ ## Usage
20
+
21
+ ```typescript
22
+ import { ReactiveAgents } from "reactive-agents";
23
+
24
+ const agent = await ReactiveAgents.create()
25
+ .withName("traced-agent")
26
+ .withProvider("anthropic")
27
+ .withObservability()
28
+ .build();
29
+
30
+ const result = await agent.run("Analyze this data");
31
+ // All 10 execution phases are traced automatically
32
+ ```
33
+
34
+ ## What Gets Traced
35
+
36
+ Each of the 10 execution phases emits a span:
37
+
38
+ ```
39
+ bootstrap → guardrail → cost-route → strategy-select →
40
+ think → act → observe → verify → memory-flush → complete
41
+ ```
42
+
43
+ ## Documentation
44
+
45
+ Full documentation at [tylerjrbuell.github.io/reactive-agents-ts](https://tylerjrbuell.github.io/reactive-agents-ts/)
@@ -0,0 +1,201 @@
1
+ import { Schema, Effect, Context, Layer } from 'effect';
2
+ import * as effect_Cause from 'effect/Cause';
3
+ import * as effect_Types from 'effect/Types';
4
+ import * as effect_Layer from 'effect/Layer';
5
+
6
+ declare const LogLevel: Schema.Literal<["debug", "info", "warn", "error"]>;
7
+ type LogLevel = typeof LogLevel.Type;
8
+ declare const LogEntrySchema: Schema.Struct<{
9
+ timestamp: typeof Schema.DateFromSelf;
10
+ level: Schema.Literal<["debug", "info", "warn", "error"]>;
11
+ message: typeof Schema.String;
12
+ agentId: Schema.optional<typeof Schema.String>;
13
+ sessionId: Schema.optional<typeof Schema.String>;
14
+ traceId: Schema.optional<typeof Schema.String>;
15
+ spanId: Schema.optional<typeof Schema.String>;
16
+ layer: Schema.optional<typeof Schema.String>;
17
+ operation: Schema.optional<typeof Schema.String>;
18
+ durationMs: Schema.optional<typeof Schema.Number>;
19
+ metadata: Schema.optional<Schema.Record$<typeof Schema.String, typeof Schema.Unknown>>;
20
+ }>;
21
+ type LogEntry = typeof LogEntrySchema.Type;
22
+ declare const SpanStatusSchema: Schema.Literal<["ok", "error", "unset"]>;
23
+ type SpanStatus = typeof SpanStatusSchema.Type;
24
+ declare const SpanSchema: Schema.Struct<{
25
+ traceId: typeof Schema.String;
26
+ spanId: typeof Schema.String;
27
+ parentSpanId: Schema.optional<typeof Schema.String>;
28
+ name: typeof Schema.String;
29
+ startTime: typeof Schema.DateFromSelf;
30
+ endTime: Schema.optional<typeof Schema.DateFromSelf>;
31
+ status: Schema.Literal<["ok", "error", "unset"]>;
32
+ attributes: Schema.Record$<typeof Schema.String, typeof Schema.Unknown>;
33
+ events: Schema.Array$<Schema.Struct<{
34
+ name: typeof Schema.String;
35
+ timestamp: typeof Schema.DateFromSelf;
36
+ attributes: Schema.optional<Schema.Record$<typeof Schema.String, typeof Schema.Unknown>>;
37
+ }>>;
38
+ }>;
39
+ type Span = typeof SpanSchema.Type;
40
+ declare const MetricType: Schema.Literal<["counter", "histogram", "gauge"]>;
41
+ type MetricType = typeof MetricType.Type;
42
+ declare const MetricSchema: Schema.Struct<{
43
+ name: typeof Schema.String;
44
+ type: Schema.Literal<["counter", "histogram", "gauge"]>;
45
+ value: typeof Schema.Number;
46
+ timestamp: typeof Schema.DateFromSelf;
47
+ labels: Schema.Record$<typeof Schema.String, typeof Schema.String>;
48
+ unit: Schema.optional<typeof Schema.String>;
49
+ }>;
50
+ type Metric = typeof MetricSchema.Type;
51
+ declare const AgentStateSnapshotSchema: Schema.Struct<{
52
+ agentId: typeof Schema.String;
53
+ timestamp: typeof Schema.DateFromSelf;
54
+ workingMemory: Schema.Array$<typeof Schema.Unknown>;
55
+ currentStrategy: Schema.optional<typeof Schema.String>;
56
+ reasoningStep: Schema.optional<typeof Schema.Number>;
57
+ activeTools: Schema.Array$<typeof Schema.String>;
58
+ tokenUsage: Schema.Struct<{
59
+ inputTokens: typeof Schema.Number;
60
+ outputTokens: typeof Schema.Number;
61
+ contextWindowUsed: typeof Schema.Number;
62
+ contextWindowMax: typeof Schema.Number;
63
+ }>;
64
+ costAccumulated: typeof Schema.Number;
65
+ }>;
66
+ type AgentStateSnapshot = typeof AgentStateSnapshotSchema.Type;
67
+
68
+ declare const TracingError_base: new <A extends Record<string, any> = {}>(args: effect_Types.Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => effect_Cause.YieldableError & {
69
+ readonly _tag: "TracingError";
70
+ } & Readonly<A>;
71
+ declare class TracingError extends TracingError_base<{
72
+ readonly message: string;
73
+ readonly cause?: unknown;
74
+ }> {
75
+ }
76
+ declare const MetricsError_base: new <A extends Record<string, any> = {}>(args: effect_Types.Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => effect_Cause.YieldableError & {
77
+ readonly _tag: "MetricsError";
78
+ } & Readonly<A>;
79
+ declare class MetricsError extends MetricsError_base<{
80
+ readonly message: string;
81
+ readonly metricName?: string;
82
+ }> {
83
+ }
84
+ declare const ExporterError_base: new <A extends Record<string, any> = {}>(args: effect_Types.Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => effect_Cause.YieldableError & {
85
+ readonly _tag: "ExporterError";
86
+ } & Readonly<A>;
87
+ declare class ExporterError extends ExporterError_base<{
88
+ readonly message: string;
89
+ readonly exporter: string;
90
+ readonly cause?: unknown;
91
+ }> {
92
+ }
93
+
94
+ interface Tracer {
95
+ readonly withSpan: <A, E>(name: string, effect: Effect.Effect<A, E>, attributes?: Record<string, unknown>) => Effect.Effect<A, E>;
96
+ readonly getTraceContext: () => Effect.Effect<{
97
+ traceId: string;
98
+ spanId: string;
99
+ }, never>;
100
+ readonly getSpans: (filter?: {
101
+ name?: string;
102
+ status?: SpanStatus;
103
+ }) => Effect.Effect<readonly Span[], never>;
104
+ }
105
+ declare const makeTracer: Effect.Effect<{
106
+ withSpan: <A, E>(name: string, effect: Effect.Effect<A, E>, attributes?: Record<string, unknown>) => Effect.Effect<A, E>;
107
+ getTraceContext: () => Effect.Effect<{
108
+ traceId: string;
109
+ spanId: string;
110
+ }, never>;
111
+ getSpans: (filter?: {
112
+ name?: string;
113
+ status?: SpanStatus;
114
+ }) => Effect.Effect<readonly Span[], never>;
115
+ }, never, never>;
116
+
117
+ interface StructuredLogger {
118
+ readonly log: (level: LogLevel, message: string, metadata?: Record<string, unknown>) => Effect.Effect<void, never>;
119
+ readonly debug: (message: string, metadata?: Record<string, unknown>) => Effect.Effect<void, never>;
120
+ readonly info: (message: string, metadata?: Record<string, unknown>) => Effect.Effect<void, never>;
121
+ readonly warn: (message: string, metadata?: Record<string, unknown>) => Effect.Effect<void, never>;
122
+ readonly error: (message: string, err?: unknown, metadata?: Record<string, unknown>) => Effect.Effect<void, never>;
123
+ readonly getLogs: (filter?: {
124
+ level?: LogLevel;
125
+ agentId?: string;
126
+ limit?: number;
127
+ }) => Effect.Effect<readonly LogEntry[], never>;
128
+ }
129
+ declare const makeStructuredLogger: Effect.Effect<{
130
+ log: (level: LogLevel, message: string, metadata?: Record<string, unknown>) => Effect.Effect<void, never>;
131
+ debug: (msg: string, meta?: Record<string, unknown>) => Effect.Effect<void, never, never>;
132
+ info: (msg: string, meta?: Record<string, unknown>) => Effect.Effect<void, never, never>;
133
+ warn: (msg: string, meta?: Record<string, unknown>) => Effect.Effect<void, never, never>;
134
+ error: (msg: string, err?: unknown, meta?: Record<string, unknown>) => Effect.Effect<void, never, never>;
135
+ getLogs: (filter?: {
136
+ level?: LogLevel;
137
+ agentId?: string;
138
+ limit?: number;
139
+ }) => Effect.Effect<readonly LogEntry[], never>;
140
+ }, never, never>;
141
+
142
+ interface MetricsCollector {
143
+ readonly incrementCounter: (name: string, value?: number, labels?: Record<string, string>) => Effect.Effect<void, never>;
144
+ readonly recordHistogram: (name: string, value: number, labels?: Record<string, string>) => Effect.Effect<void, never>;
145
+ readonly setGauge: (name: string, value: number, labels?: Record<string, string>) => Effect.Effect<void, never>;
146
+ readonly getMetrics: (filter?: {
147
+ name?: string;
148
+ startTime?: Date;
149
+ endTime?: Date;
150
+ }) => Effect.Effect<readonly Metric[], never>;
151
+ }
152
+ declare const makeMetricsCollector: Effect.Effect<{
153
+ incrementCounter: (name: string, value?: number, labels?: Record<string, string>) => Effect.Effect<void, never>;
154
+ recordHistogram: (name: string, value: number, labels?: Record<string, string>) => Effect.Effect<void, never>;
155
+ setGauge: (name: string, value: number, labels?: Record<string, string>) => Effect.Effect<void, never>;
156
+ getMetrics: (filter?: {
157
+ name?: string;
158
+ startTime?: Date;
159
+ endTime?: Date;
160
+ }) => Effect.Effect<readonly Metric[], never>;
161
+ }, never, never>;
162
+
163
+ interface StateInspector {
164
+ readonly capture: (agentId: string, state: Partial<AgentStateSnapshot>) => Effect.Effect<AgentStateSnapshot, never>;
165
+ readonly getSnapshots: (agentId: string, limit?: number) => Effect.Effect<readonly AgentStateSnapshot[], never>;
166
+ }
167
+ declare const makeStateInspector: Effect.Effect<{
168
+ capture: (agentId: string, partialState: Partial<AgentStateSnapshot>) => Effect.Effect<AgentStateSnapshot, never>;
169
+ getSnapshots: (agentId: string, limit?: number) => Effect.Effect<readonly AgentStateSnapshot[], never>;
170
+ }, never, never>;
171
+
172
+ declare const ObservabilityService_base: Context.TagClass<ObservabilityService, "ObservabilityService", {
173
+ readonly withSpan: <A, E>(name: string, effect: Effect.Effect<A, E>, attributes?: Record<string, unknown>) => Effect.Effect<A, E>;
174
+ readonly getTraceContext: () => Effect.Effect<{
175
+ traceId: string;
176
+ spanId: string;
177
+ }, never>;
178
+ readonly log: (level: LogLevel, message: string, metadata?: Record<string, unknown>) => Effect.Effect<void, never>;
179
+ readonly debug: (message: string, metadata?: Record<string, unknown>) => Effect.Effect<void, never>;
180
+ readonly info: (message: string, metadata?: Record<string, unknown>) => Effect.Effect<void, never>;
181
+ readonly warn: (message: string, metadata?: Record<string, unknown>) => Effect.Effect<void, never>;
182
+ readonly error: (message: string, error?: unknown, metadata?: Record<string, unknown>) => Effect.Effect<void, never>;
183
+ readonly incrementCounter: (name: string, value?: number, labels?: Record<string, string>) => Effect.Effect<void, never>;
184
+ readonly recordHistogram: (name: string, value: number, labels?: Record<string, string>) => Effect.Effect<void, never>;
185
+ readonly setGauge: (name: string, value: number, labels?: Record<string, string>) => Effect.Effect<void, never>;
186
+ readonly getMetrics: (filter?: {
187
+ name?: string;
188
+ startTime?: Date;
189
+ endTime?: Date;
190
+ }) => Effect.Effect<readonly Metric[], never>;
191
+ readonly captureSnapshot: (agentId: string, state: Partial<AgentStateSnapshot>) => Effect.Effect<AgentStateSnapshot, never>;
192
+ readonly getSnapshots: (agentId: string, limit?: number) => Effect.Effect<readonly AgentStateSnapshot[], never>;
193
+ readonly flush: () => Effect.Effect<void, ExporterError>;
194
+ }>;
195
+ declare class ObservabilityService extends ObservabilityService_base {
196
+ }
197
+ declare const ObservabilityServiceLive: Layer.Layer<ObservabilityService, never, never>;
198
+
199
+ declare const createObservabilityLayer: () => effect_Layer.Layer<ObservabilityService, never, never>;
200
+
201
+ export { type AgentStateSnapshot, AgentStateSnapshotSchema, ExporterError, type LogEntry, LogEntrySchema, LogLevel, type Metric, MetricSchema, MetricType, type MetricsCollector, MetricsError, ObservabilityService, ObservabilityServiceLive, type Span, SpanSchema, type SpanStatus, SpanStatusSchema, type StateInspector, type StructuredLogger, type Tracer, TracingError, createObservabilityLayer, makeMetricsCollector, makeStateInspector, makeStructuredLogger, makeTracer };
package/dist/index.js ADDED
@@ -0,0 +1,279 @@
1
+ // src/types.ts
2
+ import { Schema } from "effect";
3
+ var LogLevel = Schema.Literal("debug", "info", "warn", "error");
4
+ var LogEntrySchema = Schema.Struct({
5
+ timestamp: Schema.DateFromSelf,
6
+ level: LogLevel,
7
+ message: Schema.String,
8
+ agentId: Schema.optional(Schema.String),
9
+ sessionId: Schema.optional(Schema.String),
10
+ traceId: Schema.optional(Schema.String),
11
+ spanId: Schema.optional(Schema.String),
12
+ layer: Schema.optional(Schema.String),
13
+ operation: Schema.optional(Schema.String),
14
+ durationMs: Schema.optional(Schema.Number),
15
+ metadata: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Unknown }))
16
+ });
17
+ var SpanStatusSchema = Schema.Literal("ok", "error", "unset");
18
+ var SpanSchema = Schema.Struct({
19
+ traceId: Schema.String,
20
+ spanId: Schema.String,
21
+ parentSpanId: Schema.optional(Schema.String),
22
+ name: Schema.String,
23
+ startTime: Schema.DateFromSelf,
24
+ endTime: Schema.optional(Schema.DateFromSelf),
25
+ status: SpanStatusSchema,
26
+ attributes: Schema.Record({ key: Schema.String, value: Schema.Unknown }),
27
+ events: Schema.Array(Schema.Struct({
28
+ name: Schema.String,
29
+ timestamp: Schema.DateFromSelf,
30
+ attributes: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Unknown }))
31
+ }))
32
+ });
33
+ var MetricType = Schema.Literal("counter", "histogram", "gauge");
34
+ var MetricSchema = Schema.Struct({
35
+ name: Schema.String,
36
+ type: MetricType,
37
+ value: Schema.Number,
38
+ timestamp: Schema.DateFromSelf,
39
+ labels: Schema.Record({ key: Schema.String, value: Schema.String }),
40
+ unit: Schema.optional(Schema.String)
41
+ });
42
+ var AgentStateSnapshotSchema = Schema.Struct({
43
+ agentId: Schema.String,
44
+ timestamp: Schema.DateFromSelf,
45
+ workingMemory: Schema.Array(Schema.Unknown),
46
+ currentStrategy: Schema.optional(Schema.String),
47
+ reasoningStep: Schema.optional(Schema.Number),
48
+ activeTools: Schema.Array(Schema.String),
49
+ tokenUsage: Schema.Struct({
50
+ inputTokens: Schema.Number,
51
+ outputTokens: Schema.Number,
52
+ contextWindowUsed: Schema.Number,
53
+ contextWindowMax: Schema.Number
54
+ }),
55
+ costAccumulated: Schema.Number
56
+ });
57
+
58
+ // src/errors.ts
59
+ import { Data } from "effect";
60
+ var TracingError = class extends Data.TaggedError("TracingError") {
61
+ };
62
+ var MetricsError = class extends Data.TaggedError("MetricsError") {
63
+ };
64
+ var ExporterError = class extends Data.TaggedError("ExporterError") {
65
+ };
66
+
67
+ // src/tracing/tracer.ts
68
+ import { Effect, Ref } from "effect";
69
+ var generateId = () => {
70
+ const bytes = new Uint8Array(16);
71
+ crypto.getRandomValues(bytes);
72
+ return Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
73
+ };
74
+ var generateSpanId = () => {
75
+ const bytes = new Uint8Array(8);
76
+ crypto.getRandomValues(bytes);
77
+ return Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
78
+ };
79
+ var makeTracer = Effect.gen(function* () {
80
+ const spansRef = yield* Ref.make([]);
81
+ const withSpan = (name, effect, attributes) => Effect.gen(function* () {
82
+ const traceId = generateId();
83
+ const spanId = generateSpanId();
84
+ const startTime = performance.now();
85
+ const baseSpan = {
86
+ traceId,
87
+ spanId,
88
+ name,
89
+ startTime: /* @__PURE__ */ new Date(),
90
+ status: "unset",
91
+ attributes: { ...attributes, "service.name": "reactive-agents" },
92
+ events: []
93
+ };
94
+ const result = yield* effect.pipe(
95
+ Effect.tap(
96
+ () => Ref.update(spansRef, (spans) => [
97
+ ...spans,
98
+ {
99
+ ...baseSpan,
100
+ endTime: /* @__PURE__ */ new Date(),
101
+ status: "ok",
102
+ attributes: { ...baseSpan.attributes, duration_ms: performance.now() - startTime }
103
+ }
104
+ ])
105
+ ),
106
+ Effect.tapError(
107
+ (error) => Ref.update(spansRef, (spans) => [
108
+ ...spans,
109
+ {
110
+ ...baseSpan,
111
+ endTime: /* @__PURE__ */ new Date(),
112
+ status: "error",
113
+ attributes: { ...baseSpan.attributes, duration_ms: performance.now() - startTime, "error.message": String(error) },
114
+ events: [{ name: "exception", timestamp: /* @__PURE__ */ new Date(), attributes: { message: String(error) } }]
115
+ }
116
+ ])
117
+ )
118
+ );
119
+ return result;
120
+ });
121
+ const getTraceContext = () => Effect.succeed({ traceId: generateId(), spanId: generateSpanId() });
122
+ const getSpans = (filter) => Effect.gen(function* () {
123
+ const spans = yield* Ref.get(spansRef);
124
+ let filtered = spans;
125
+ if (filter?.name) filtered = filtered.filter((s) => s.name.includes(filter.name));
126
+ if (filter?.status) filtered = filtered.filter((s) => s.status === filter.status);
127
+ return filtered;
128
+ });
129
+ return { withSpan, getTraceContext, getSpans };
130
+ });
131
+
132
+ // src/logging/structured-logger.ts
133
+ import { Effect as Effect2, Ref as Ref2 } from "effect";
134
+ var LOG_LEVEL_ORDER = {
135
+ debug: 0,
136
+ info: 1,
137
+ warn: 2,
138
+ error: 3
139
+ };
140
+ var makeStructuredLogger = Effect2.gen(function* () {
141
+ const logsRef = yield* Ref2.make([]);
142
+ const log = (level, message, metadata) => Ref2.update(logsRef, (logs) => [
143
+ ...logs,
144
+ { timestamp: /* @__PURE__ */ new Date(), level, message, metadata }
145
+ ]);
146
+ const debug = (msg, meta) => log("debug", msg, meta);
147
+ const info = (msg, meta) => log("info", msg, meta);
148
+ const warn = (msg, meta) => log("warn", msg, meta);
149
+ const error = (msg, err, meta) => log("error", msg, {
150
+ ...meta,
151
+ error: err instanceof Error ? { name: err.name, message: err.message, stack: err.stack } : { message: String(err) }
152
+ });
153
+ const getLogs = (filter) => Effect2.gen(function* () {
154
+ const logs = yield* Ref2.get(logsRef);
155
+ let filtered = logs;
156
+ if (filter?.level) filtered = filtered.filter((l) => LOG_LEVEL_ORDER[l.level] >= LOG_LEVEL_ORDER[filter.level]);
157
+ if (filter?.agentId) filtered = filtered.filter((l) => l.agentId === filter.agentId);
158
+ if (filter?.limit) filtered = filtered.slice(-filter.limit);
159
+ return filtered;
160
+ });
161
+ return { log, debug, info, warn, error, getLogs };
162
+ });
163
+
164
+ // src/metrics/metrics-collector.ts
165
+ import { Effect as Effect3, Ref as Ref3 } from "effect";
166
+ var makeMetricsCollector = Effect3.gen(function* () {
167
+ const metricsRef = yield* Ref3.make([]);
168
+ const incrementCounter = (name, value = 1, labels = {}) => Ref3.update(metricsRef, (metrics) => [
169
+ ...metrics,
170
+ { name, type: "counter", value, timestamp: /* @__PURE__ */ new Date(), labels }
171
+ ]);
172
+ const recordHistogram = (name, value, labels = {}) => Ref3.update(metricsRef, (metrics) => [
173
+ ...metrics,
174
+ { name, type: "histogram", value, timestamp: /* @__PURE__ */ new Date(), labels }
175
+ ]);
176
+ const setGauge = (name, value, labels = {}) => Ref3.update(metricsRef, (metrics) => [
177
+ ...metrics,
178
+ { name, type: "gauge", value, timestamp: /* @__PURE__ */ new Date(), labels }
179
+ ]);
180
+ const getMetrics = (filter) => Effect3.gen(function* () {
181
+ const metrics = yield* Ref3.get(metricsRef);
182
+ let filtered = metrics;
183
+ if (filter?.name) filtered = filtered.filter((m) => m.name === filter.name || m.name.startsWith(filter.name));
184
+ if (filter?.startTime) filtered = filtered.filter((m) => m.timestamp >= filter.startTime);
185
+ if (filter?.endTime) filtered = filtered.filter((m) => m.timestamp <= filter.endTime);
186
+ return filtered;
187
+ });
188
+ return { incrementCounter, recordHistogram, setGauge, getMetrics };
189
+ });
190
+
191
+ // src/debugging/state-inspector.ts
192
+ import { Effect as Effect4, Ref as Ref4 } from "effect";
193
+ var MAX_SNAPSHOTS = 1e3;
194
+ var makeStateInspector = Effect4.gen(function* () {
195
+ const snapshotsRef = yield* Ref4.make([]);
196
+ const capture = (agentId, partialState) => Effect4.gen(function* () {
197
+ const snapshot = {
198
+ agentId,
199
+ timestamp: /* @__PURE__ */ new Date(),
200
+ workingMemory: partialState.workingMemory ?? [],
201
+ currentStrategy: partialState.currentStrategy,
202
+ reasoningStep: partialState.reasoningStep,
203
+ activeTools: partialState.activeTools ?? [],
204
+ tokenUsage: partialState.tokenUsage ?? {
205
+ inputTokens: 0,
206
+ outputTokens: 0,
207
+ contextWindowUsed: 0,
208
+ contextWindowMax: 2e5
209
+ },
210
+ costAccumulated: partialState.costAccumulated ?? 0
211
+ };
212
+ yield* Ref4.update(snapshotsRef, (snaps) => {
213
+ const updated = [...snaps, snapshot];
214
+ return updated.length > MAX_SNAPSHOTS ? updated.slice(-MAX_SNAPSHOTS) : updated;
215
+ });
216
+ return snapshot;
217
+ });
218
+ const getSnapshots = (agentId, limit = 50) => Effect4.gen(function* () {
219
+ const snapshots = yield* Ref4.get(snapshotsRef);
220
+ return snapshots.filter((s) => s.agentId === agentId).slice(-limit);
221
+ });
222
+ return { capture, getSnapshots };
223
+ });
224
+
225
+ // src/observability-service.ts
226
+ import { Effect as Effect5, Context, Layer } from "effect";
227
+ var ObservabilityService = class extends Context.Tag("ObservabilityService")() {
228
+ };
229
+ var ObservabilityServiceLive = Layer.effect(
230
+ ObservabilityService,
231
+ Effect5.gen(function* () {
232
+ const tracer = yield* makeTracer;
233
+ const logger = yield* makeStructuredLogger;
234
+ const metrics = yield* makeMetricsCollector;
235
+ const inspector = yield* makeStateInspector;
236
+ return {
237
+ withSpan: (name, effect, attributes) => tracer.withSpan(name, effect, attributes).pipe(
238
+ Effect5.tap(() => metrics.incrementCounter(`span.${name}.completed`)),
239
+ Effect5.tapError(() => metrics.incrementCounter(`span.${name}.errors`))
240
+ ),
241
+ getTraceContext: () => tracer.getTraceContext(),
242
+ log: (level, message, metadata) => logger.log(level, message, metadata),
243
+ debug: (msg, meta) => logger.debug(msg, meta),
244
+ info: (msg, meta) => logger.info(msg, meta),
245
+ warn: (msg, meta) => logger.warn(msg, meta),
246
+ error: (msg, err, meta) => logger.error(msg, err, meta),
247
+ incrementCounter: (name, value, labels) => metrics.incrementCounter(name, value, labels),
248
+ recordHistogram: (name, value, labels) => metrics.recordHistogram(name, value, labels),
249
+ setGauge: (name, value, labels) => metrics.setGauge(name, value, labels),
250
+ getMetrics: (filter) => metrics.getMetrics(filter),
251
+ captureSnapshot: (agentId, state) => inspector.capture(agentId, state),
252
+ getSnapshots: (agentId, limit) => inspector.getSnapshots(agentId, limit),
253
+ flush: () => Effect5.void
254
+ };
255
+ })
256
+ );
257
+
258
+ // src/runtime.ts
259
+ var createObservabilityLayer = () => ObservabilityServiceLive;
260
+ export {
261
+ AgentStateSnapshotSchema,
262
+ ExporterError,
263
+ LogEntrySchema,
264
+ LogLevel,
265
+ MetricSchema,
266
+ MetricType,
267
+ MetricsError,
268
+ ObservabilityService,
269
+ ObservabilityServiceLive,
270
+ SpanSchema,
271
+ SpanStatusSchema,
272
+ TracingError,
273
+ createObservabilityLayer,
274
+ makeMetricsCollector,
275
+ makeStateInspector,
276
+ makeStructuredLogger,
277
+ makeTracer
278
+ };
279
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts","../src/errors.ts","../src/tracing/tracer.ts","../src/logging/structured-logger.ts","../src/metrics/metrics-collector.ts","../src/debugging/state-inspector.ts","../src/observability-service.ts","../src/runtime.ts"],"sourcesContent":["import { Schema } from \"effect\";\n\n// ─── Log Level (matches @reactive-agents/core) ───\n\nexport const LogLevel = Schema.Literal(\"debug\", \"info\", \"warn\", \"error\");\nexport type LogLevel = typeof LogLevel.Type;\n\n// ─── Structured Log Entry ───\n\nexport const LogEntrySchema = Schema.Struct({\n timestamp: Schema.DateFromSelf,\n level: LogLevel,\n message: Schema.String,\n agentId: Schema.optional(Schema.String),\n sessionId: Schema.optional(Schema.String),\n traceId: Schema.optional(Schema.String),\n spanId: Schema.optional(Schema.String),\n layer: Schema.optional(Schema.String),\n operation: Schema.optional(Schema.String),\n durationMs: Schema.optional(Schema.Number),\n metadata: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Unknown })),\n});\nexport type LogEntry = typeof LogEntrySchema.Type;\n\n// ─── Span ───\n\nexport const SpanStatusSchema = Schema.Literal(\"ok\", \"error\", \"unset\");\nexport type SpanStatus = typeof SpanStatusSchema.Type;\n\nexport const SpanSchema = Schema.Struct({\n traceId: Schema.String,\n spanId: Schema.String,\n parentSpanId: Schema.optional(Schema.String),\n name: Schema.String,\n startTime: Schema.DateFromSelf,\n endTime: Schema.optional(Schema.DateFromSelf),\n status: SpanStatusSchema,\n attributes: Schema.Record({ key: Schema.String, value: Schema.Unknown }),\n events: Schema.Array(Schema.Struct({\n name: Schema.String,\n timestamp: Schema.DateFromSelf,\n attributes: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Unknown })),\n })),\n});\nexport type Span = typeof SpanSchema.Type;\n\n// ─── Metric ───\n\nexport const MetricType = Schema.Literal(\"counter\", \"histogram\", \"gauge\");\nexport type MetricType = typeof MetricType.Type;\n\nexport const MetricSchema = Schema.Struct({\n name: Schema.String,\n type: MetricType,\n value: Schema.Number,\n timestamp: Schema.DateFromSelf,\n labels: Schema.Record({ key: Schema.String, value: Schema.String }),\n unit: Schema.optional(Schema.String),\n});\nexport type Metric = typeof MetricSchema.Type;\n\n// ─── Agent State Snapshot ───\n\nexport const AgentStateSnapshotSchema = Schema.Struct({\n agentId: Schema.String,\n timestamp: Schema.DateFromSelf,\n workingMemory: Schema.Array(Schema.Unknown),\n currentStrategy: Schema.optional(Schema.String),\n reasoningStep: Schema.optional(Schema.Number),\n activeTools: Schema.Array(Schema.String),\n tokenUsage: Schema.Struct({\n inputTokens: Schema.Number,\n outputTokens: Schema.Number,\n contextWindowUsed: Schema.Number,\n contextWindowMax: Schema.Number,\n }),\n costAccumulated: Schema.Number,\n});\nexport type AgentStateSnapshot = typeof AgentStateSnapshotSchema.Type;\n","import { Data } from \"effect\";\n\nexport class TracingError extends Data.TaggedError(\"TracingError\")<{\n readonly message: string;\n readonly cause?: unknown;\n}> {}\n\nexport class MetricsError extends Data.TaggedError(\"MetricsError\")<{\n readonly message: string;\n readonly metricName?: string;\n}> {}\n\nexport class ExporterError extends Data.TaggedError(\"ExporterError\")<{\n readonly message: string;\n readonly exporter: string;\n readonly cause?: unknown;\n}> {}\n","import { Effect, Ref } from \"effect\";\nimport type { Span, SpanStatus } from \"../types.js\";\n\nexport interface Tracer {\n readonly withSpan: <A, E>(name: string, effect: Effect.Effect<A, E>, attributes?: Record<string, unknown>) => Effect.Effect<A, E>;\n readonly getTraceContext: () => Effect.Effect<{ traceId: string; spanId: string }, never>;\n readonly getSpans: (filter?: { name?: string; status?: SpanStatus }) => Effect.Effect<readonly Span[], never>;\n}\n\nconst generateId = (): string => {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n};\n\nconst generateSpanId = (): string => {\n const bytes = new Uint8Array(8);\n crypto.getRandomValues(bytes);\n return Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n};\n\nexport const makeTracer = Effect.gen(function* () {\n const spansRef = yield* Ref.make<Span[]>([]);\n\n const withSpan = <A, E>(\n name: string,\n effect: Effect.Effect<A, E>,\n attributes?: Record<string, unknown>,\n ): Effect.Effect<A, E> =>\n Effect.gen(function* () {\n const traceId = generateId();\n const spanId = generateSpanId();\n const startTime = performance.now();\n\n const baseSpan: Span = {\n traceId,\n spanId,\n name,\n startTime: new Date(),\n status: \"unset\",\n attributes: { ...attributes, \"service.name\": \"reactive-agents\" },\n events: [],\n };\n\n const result = yield* effect.pipe(\n Effect.tap(() =>\n Ref.update(spansRef, (spans) => [\n ...spans,\n {\n ...baseSpan,\n endTime: new Date(),\n status: \"ok\" as const,\n attributes: { ...baseSpan.attributes, duration_ms: performance.now() - startTime },\n },\n ]),\n ),\n Effect.tapError((error) =>\n Ref.update(spansRef, (spans) => [\n ...spans,\n {\n ...baseSpan,\n endTime: new Date(),\n status: \"error\" as const,\n attributes: { ...baseSpan.attributes, duration_ms: performance.now() - startTime, \"error.message\": String(error) },\n events: [{ name: \"exception\", timestamp: new Date(), attributes: { message: String(error) } }],\n },\n ]),\n ),\n );\n\n return result;\n });\n\n const getTraceContext = (): Effect.Effect<{ traceId: string; spanId: string }, never> =>\n Effect.succeed({ traceId: generateId(), spanId: generateSpanId() });\n\n const getSpans = (filter?: { name?: string; status?: SpanStatus }): Effect.Effect<readonly Span[], never> =>\n Effect.gen(function* () {\n const spans = yield* Ref.get(spansRef);\n let filtered = spans;\n if (filter?.name) filtered = filtered.filter((s) => s.name.includes(filter.name!));\n if (filter?.status) filtered = filtered.filter((s) => s.status === filter.status);\n return filtered;\n });\n\n return { withSpan, getTraceContext, getSpans } satisfies Tracer;\n});\n","import { Effect, Ref } from \"effect\";\nimport type { LogEntry, LogLevel } from \"../types.js\";\n\nexport interface StructuredLogger {\n readonly log: (level: LogLevel, message: string, metadata?: Record<string, unknown>) => Effect.Effect<void, never>;\n readonly debug: (message: string, metadata?: Record<string, unknown>) => Effect.Effect<void, never>;\n readonly info: (message: string, metadata?: Record<string, unknown>) => Effect.Effect<void, never>;\n readonly warn: (message: string, metadata?: Record<string, unknown>) => Effect.Effect<void, never>;\n readonly error: (message: string, err?: unknown, metadata?: Record<string, unknown>) => Effect.Effect<void, never>;\n readonly getLogs: (filter?: { level?: LogLevel; agentId?: string; limit?: number }) => Effect.Effect<readonly LogEntry[], never>;\n}\n\nconst LOG_LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\nexport const makeStructuredLogger = Effect.gen(function* () {\n const logsRef = yield* Ref.make<LogEntry[]>([]);\n\n const log = (\n level: LogLevel,\n message: string,\n metadata?: Record<string, unknown>,\n ): Effect.Effect<void, never> =>\n Ref.update(logsRef, (logs) => [\n ...logs,\n { timestamp: new Date(), level, message, metadata },\n ]);\n\n const debug = (msg: string, meta?: Record<string, unknown>) => log(\"debug\", msg, meta);\n const info = (msg: string, meta?: Record<string, unknown>) => log(\"info\", msg, meta);\n const warn = (msg: string, meta?: Record<string, unknown>) => log(\"warn\", msg, meta);\n const error = (msg: string, err?: unknown, meta?: Record<string, unknown>) =>\n log(\"error\", msg, {\n ...meta,\n error: err instanceof Error\n ? { name: err.name, message: err.message, stack: err.stack }\n : { message: String(err) },\n });\n\n const getLogs = (filter?: { level?: LogLevel; agentId?: string; limit?: number }): Effect.Effect<readonly LogEntry[], never> =>\n Effect.gen(function* () {\n const logs = yield* Ref.get(logsRef);\n let filtered = logs;\n if (filter?.level) filtered = filtered.filter((l) => LOG_LEVEL_ORDER[l.level] >= LOG_LEVEL_ORDER[filter.level!]);\n if (filter?.agentId) filtered = filtered.filter((l) => l.agentId === filter.agentId);\n if (filter?.limit) filtered = filtered.slice(-filter.limit);\n return filtered;\n });\n\n return { log, debug, info, warn, error, getLogs } satisfies StructuredLogger;\n});\n","import { Effect, Ref } from \"effect\";\nimport type { Metric } from \"../types.js\";\n\nexport interface MetricsCollector {\n readonly incrementCounter: (name: string, value?: number, labels?: Record<string, string>) => Effect.Effect<void, never>;\n readonly recordHistogram: (name: string, value: number, labels?: Record<string, string>) => Effect.Effect<void, never>;\n readonly setGauge: (name: string, value: number, labels?: Record<string, string>) => Effect.Effect<void, never>;\n readonly getMetrics: (filter?: { name?: string; startTime?: Date; endTime?: Date }) => Effect.Effect<readonly Metric[], never>;\n}\n\nexport const makeMetricsCollector = Effect.gen(function* () {\n const metricsRef = yield* Ref.make<Metric[]>([]);\n\n const incrementCounter = (\n name: string,\n value: number = 1,\n labels: Record<string, string> = {},\n ): Effect.Effect<void, never> =>\n Ref.update(metricsRef, (metrics) => [\n ...metrics,\n { name, type: \"counter\" as const, value, timestamp: new Date(), labels },\n ]);\n\n const recordHistogram = (\n name: string,\n value: number,\n labels: Record<string, string> = {},\n ): Effect.Effect<void, never> =>\n Ref.update(metricsRef, (metrics) => [\n ...metrics,\n { name, type: \"histogram\" as const, value, timestamp: new Date(), labels },\n ]);\n\n const setGauge = (\n name: string,\n value: number,\n labels: Record<string, string> = {},\n ): Effect.Effect<void, never> =>\n Ref.update(metricsRef, (metrics) => [\n ...metrics,\n { name, type: \"gauge\" as const, value, timestamp: new Date(), labels },\n ]);\n\n const getMetrics = (filter?: { name?: string; startTime?: Date; endTime?: Date }): Effect.Effect<readonly Metric[], never> =>\n Effect.gen(function* () {\n const metrics = yield* Ref.get(metricsRef);\n let filtered = metrics;\n if (filter?.name) filtered = filtered.filter((m) => m.name === filter.name || m.name.startsWith(filter.name!));\n if (filter?.startTime) filtered = filtered.filter((m) => m.timestamp >= filter.startTime!);\n if (filter?.endTime) filtered = filtered.filter((m) => m.timestamp <= filter.endTime!);\n return filtered;\n });\n\n return { incrementCounter, recordHistogram, setGauge, getMetrics } satisfies MetricsCollector;\n});\n","import { Effect, Ref } from \"effect\";\nimport type { AgentStateSnapshot } from \"../types.js\";\n\nexport interface StateInspector {\n readonly capture: (agentId: string, state: Partial<AgentStateSnapshot>) => Effect.Effect<AgentStateSnapshot, never>;\n readonly getSnapshots: (agentId: string, limit?: number) => Effect.Effect<readonly AgentStateSnapshot[], never>;\n}\n\nconst MAX_SNAPSHOTS = 1000;\n\nexport const makeStateInspector = Effect.gen(function* () {\n const snapshotsRef = yield* Ref.make<AgentStateSnapshot[]>([]);\n\n const capture = (\n agentId: string,\n partialState: Partial<AgentStateSnapshot>,\n ): Effect.Effect<AgentStateSnapshot, never> =>\n Effect.gen(function* () {\n const snapshot: AgentStateSnapshot = {\n agentId,\n timestamp: new Date(),\n workingMemory: partialState.workingMemory ?? [],\n currentStrategy: partialState.currentStrategy,\n reasoningStep: partialState.reasoningStep,\n activeTools: partialState.activeTools ?? [],\n tokenUsage: partialState.tokenUsage ?? {\n inputTokens: 0,\n outputTokens: 0,\n contextWindowUsed: 0,\n contextWindowMax: 200_000,\n },\n costAccumulated: partialState.costAccumulated ?? 0,\n };\n\n yield* Ref.update(snapshotsRef, (snaps) => {\n const updated = [...snaps, snapshot];\n return updated.length > MAX_SNAPSHOTS ? updated.slice(-MAX_SNAPSHOTS) : updated;\n });\n\n return snapshot;\n });\n\n const getSnapshots = (\n agentId: string,\n limit: number = 50,\n ): Effect.Effect<readonly AgentStateSnapshot[], never> =>\n Effect.gen(function* () {\n const snapshots = yield* Ref.get(snapshotsRef);\n return snapshots.filter((s) => s.agentId === agentId).slice(-limit);\n });\n\n return { capture, getSnapshots } satisfies StateInspector;\n});\n","import { Effect, Context, Layer } from \"effect\";\nimport type { LogLevel, Metric, AgentStateSnapshot } from \"./types.js\";\nimport type { ExporterError } from \"./errors.js\";\nimport { makeTracer } from \"./tracing/tracer.js\";\nimport { makeStructuredLogger } from \"./logging/structured-logger.js\";\nimport { makeMetricsCollector } from \"./metrics/metrics-collector.js\";\nimport { makeStateInspector } from \"./debugging/state-inspector.js\";\n\n// ─── Service Tag ───\n\nexport class ObservabilityService extends Context.Tag(\"ObservabilityService\")<\n ObservabilityService,\n {\n readonly withSpan: <A, E>(name: string, effect: Effect.Effect<A, E>, attributes?: Record<string, unknown>) => Effect.Effect<A, E>;\n readonly getTraceContext: () => Effect.Effect<{ traceId: string; spanId: string }, never>;\n readonly log: (level: LogLevel, message: string, metadata?: Record<string, unknown>) => Effect.Effect<void, never>;\n readonly debug: (message: string, metadata?: Record<string, unknown>) => Effect.Effect<void, never>;\n readonly info: (message: string, metadata?: Record<string, unknown>) => Effect.Effect<void, never>;\n readonly warn: (message: string, metadata?: Record<string, unknown>) => Effect.Effect<void, never>;\n readonly error: (message: string, error?: unknown, metadata?: Record<string, unknown>) => Effect.Effect<void, never>;\n readonly incrementCounter: (name: string, value?: number, labels?: Record<string, string>) => Effect.Effect<void, never>;\n readonly recordHistogram: (name: string, value: number, labels?: Record<string, string>) => Effect.Effect<void, never>;\n readonly setGauge: (name: string, value: number, labels?: Record<string, string>) => Effect.Effect<void, never>;\n readonly getMetrics: (filter?: { name?: string; startTime?: Date; endTime?: Date }) => Effect.Effect<readonly Metric[], never>;\n readonly captureSnapshot: (agentId: string, state: Partial<AgentStateSnapshot>) => Effect.Effect<AgentStateSnapshot, never>;\n readonly getSnapshots: (agentId: string, limit?: number) => Effect.Effect<readonly AgentStateSnapshot[], never>;\n readonly flush: () => Effect.Effect<void, ExporterError>;\n }\n>() {}\n\n// ─── Live Implementation ───\n\nexport const ObservabilityServiceLive = Layer.effect(\n ObservabilityService,\n Effect.gen(function* () {\n const tracer = yield* makeTracer;\n const logger = yield* makeStructuredLogger;\n const metrics = yield* makeMetricsCollector;\n const inspector = yield* makeStateInspector;\n\n return {\n withSpan: (name, effect, attributes) =>\n tracer.withSpan(name, effect, attributes).pipe(\n Effect.tap(() => metrics.incrementCounter(`span.${name}.completed`)),\n Effect.tapError(() => metrics.incrementCounter(`span.${name}.errors`)),\n ),\n getTraceContext: () => tracer.getTraceContext(),\n log: (level, message, metadata) => logger.log(level, message, metadata),\n debug: (msg, meta) => logger.debug(msg, meta),\n info: (msg, meta) => logger.info(msg, meta),\n warn: (msg, meta) => logger.warn(msg, meta),\n error: (msg, err, meta) => logger.error(msg, err, meta),\n incrementCounter: (name, value, labels) => metrics.incrementCounter(name, value, labels),\n recordHistogram: (name, value, labels) => metrics.recordHistogram(name, value, labels),\n setGauge: (name, value, labels) => metrics.setGauge(name, value, labels),\n getMetrics: (filter) => metrics.getMetrics(filter),\n captureSnapshot: (agentId, state) => inspector.capture(agentId, state),\n getSnapshots: (agentId, limit) => inspector.getSnapshots(agentId, limit),\n flush: () => Effect.void as Effect.Effect<void, ExporterError>,\n };\n }),\n);\n","import { ObservabilityServiceLive } from \"./observability-service.js\";\n\nexport const createObservabilityLayer = () => ObservabilityServiceLive;\n"],"mappings":"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","names":["Effect","Ref","Effect","Ref","Effect","Ref","Effect","Effect"]}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@reactive-agents/observability",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsup --config ../../tsup.config.base.ts",
9
+ "typecheck": "tsc --noEmit",
10
+ "test": "bun test",
11
+ "test:watch": "bun test --watch"
12
+ },
13
+ "dependencies": {
14
+ "effect": "^3.10.0",
15
+ "@reactive-agents/core": "0.1.0"
16
+ },
17
+ "devDependencies": {
18
+ "typescript": "^5.7.0",
19
+ "bun-types": "latest"
20
+ },
21
+ "license": "MIT",
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "https://github.com/tylerjrbuell/reactive-agents-ts.git",
25
+ "directory": "packages/observability"
26
+ },
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "README.md",
33
+ "LICENSE"
34
+ ],
35
+ "exports": {
36
+ ".": {
37
+ "types": "./dist/index.d.ts",
38
+ "import": "./dist/index.js",
39
+ "default": "./dist/index.js"
40
+ }
41
+ },
42
+ "description": "Observability for Reactive Agents — distributed tracing, metrics, and structured logging",
43
+ "homepage": "https://tylerjrbuell.github.io/reactive-agents-ts/",
44
+ "bugs": {
45
+ "url": "https://github.com/tylerjrbuell/reactive-agents-ts/issues"
46
+ }
47
+ }