@a5c-ai/agent-mux-observability 0.4.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,87 @@
1
+ /**
2
+ * Simple telemetry implementation that logs metrics.
3
+ */
4
+ class SimpleTelemetryImpl {
5
+ emit(event) {
6
+ process.stderr.write(JSON.stringify(event) + '\n');
7
+ }
8
+ startRunSpan(_runId, _agent, _model) {
9
+ return null;
10
+ }
11
+ startToolCallSpan(_toolName, _toolCallId, _parentSpan) {
12
+ return null;
13
+ }
14
+ startSubagentSpan(_subagentId, _agentName, _parentSpan) {
15
+ return null;
16
+ }
17
+ recordRunStart(agent, model) {
18
+ this.emit({
19
+ timestamp: new Date().toISOString(),
20
+ event: 'run_start',
21
+ agent,
22
+ model: model || 'unknown',
23
+ });
24
+ }
25
+ recordRunComplete(agent, model, duration, cost) {
26
+ this.emit({
27
+ timestamp: new Date().toISOString(),
28
+ event: 'run_complete',
29
+ agent,
30
+ model: model || 'unknown',
31
+ duration,
32
+ cost,
33
+ });
34
+ }
35
+ recordRunError(agent, model, error, cost) {
36
+ this.emit({
37
+ timestamp: new Date().toISOString(),
38
+ event: 'run_error',
39
+ agent,
40
+ model: model || 'unknown',
41
+ error_type: error instanceof Error ? error.constructor.name : 'unknown',
42
+ error_message: error instanceof Error ? error.message : error,
43
+ cost,
44
+ });
45
+ }
46
+ recordToolCall(toolName, duration, success) {
47
+ this.emit({
48
+ timestamp: new Date().toISOString(),
49
+ event: 'tool_call',
50
+ tool: toolName,
51
+ duration,
52
+ status: success ? 'success' : 'error',
53
+ });
54
+ }
55
+ recordAuthEvent(agent, method, success) {
56
+ this.emit({
57
+ timestamp: new Date().toISOString(),
58
+ event: 'auth_event',
59
+ agent,
60
+ method,
61
+ status: success ? 'success' : 'failure',
62
+ });
63
+ }
64
+ endSpanSuccess(_span, _attributes) {
65
+ // No-op in simple telemetry mode
66
+ }
67
+ endSpanError(_span, _error, _attributes) {
68
+ // No-op in simple telemetry mode
69
+ }
70
+ }
71
+ /**
72
+ * Default telemetry instance.
73
+ */
74
+ export const telemetry = new SimpleTelemetryImpl();
75
+ /**
76
+ * Initialize telemetry (no-op for simple implementation).
77
+ */
78
+ export function initializeTelemetry() {
79
+ // No-op for simple implementation
80
+ }
81
+ /**
82
+ * Shutdown telemetry (no-op for simple implementation).
83
+ */
84
+ export async function shutdownTelemetry() {
85
+ // No-op for simple implementation
86
+ }
87
+ //# sourceMappingURL=telemetry-simple.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry-simple.js","sourceRoot":"","sources":["../src/telemetry-simple.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,mBAAmB;IACf,IAAI,CAAC,KAA8B;QACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,YAAY,CAAC,MAAc,EAAE,MAAc,EAAE,MAAe;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iBAAiB,CAAC,SAAiB,EAAE,WAAmB,EAAE,WAAqB;QAC7E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iBAAiB,CAAC,WAAmB,EAAE,UAAkB,EAAE,WAAqB;QAC9E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc,CAAC,KAAa,EAAE,KAAc;QAC1C,IAAI,CAAC,IAAI,CAAC;YACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE,WAAW;YAClB,KAAK;YACL,KAAK,EAAE,KAAK,IAAI,SAAS;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB,CAAC,KAAa,EAAE,KAAyB,EAAE,QAAgB,EAAE,IAAe;QAC3F,IAAI,CAAC,IAAI,CAAC;YACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE,cAAc;YACrB,KAAK;YACL,KAAK,EAAE,KAAK,IAAI,SAAS;YACzB,QAAQ;YACR,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,KAAa,EAAE,KAAyB,EAAE,KAAqB,EAAE,IAAe;QAC7F,IAAI,CAAC,IAAI,CAAC;YACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE,WAAW;YAClB,KAAK;YACL,KAAK,EAAE,KAAK,IAAI,SAAS;YACzB,UAAU,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACvE,aAAa,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;YAC7D,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,QAAgB,EAAE,QAAgB,EAAE,OAAgB;QACjE,IAAI,CAAC,IAAI,CAAC;YACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,QAAQ;YACd,QAAQ;YACR,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;SACtC,CAAC,CAAC;IACL,CAAC;IAED,eAAe,CAAC,KAAa,EAAE,MAAc,EAAE,OAAgB;QAC7D,IAAI,CAAC,IAAI,CAAC;YACR,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE,YAAY;YACnB,KAAK;YACL,MAAM;YACN,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;SACxC,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,KAAc,EAAE,WAAuD;QACpF,iCAAiC;IACnC,CAAC;IAED,YAAY,CACV,KAAc,EACd,MAAsB,EACtB,WAAuD;QAEvD,iCAAiC;IACnC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,mBAAmB,EAAE,CAAC;AAEnD;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,kCAAkC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,kCAAkC;AACpC,CAAC"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * OpenTelemetry integration for agent-mux.
3
+ *
4
+ * Provides metrics, tracing, and observability for agent operations,
5
+ * performance monitoring, and error tracking.
6
+ */
7
+ import { type Meter, type Span, type Counter, type Histogram, type Gauge } from '@opentelemetry/api';
8
+ import { Telemetry, CostInfo } from './types.js';
9
+ /**
10
+ * Telemetry configuration options.
11
+ */
12
+ export interface TelemetryConfig {
13
+ /** Service name for telemetry */
14
+ serviceName?: string;
15
+ /** Service version */
16
+ serviceVersion?: string;
17
+ /** Enable tracing */
18
+ enableTracing?: boolean;
19
+ /** Enable metrics */
20
+ enableMetrics?: boolean;
21
+ /** OTLP endpoint for exporting data */
22
+ otlpEndpoint?: string;
23
+ /** Custom attributes to attach to all telemetry */
24
+ baseAttributes?: Record<string, string | number | boolean>;
25
+ }
26
+ /**
27
+ * Agent-mux specific metrics.
28
+ */
29
+ export interface AgentMuxMetrics {
30
+ /** Counter for total agent runs */
31
+ runsTotal: Counter;
32
+ /** Counter for agent run errors */
33
+ runsErrors: Counter;
34
+ /** Histogram for agent run duration */
35
+ runsDuration: Histogram;
36
+ /** Histogram for tool call duration */
37
+ toolCallsDuration: Histogram;
38
+ /** Counter for tool calls */
39
+ toolCallsTotal: Counter;
40
+ /** Gauge for active runs */
41
+ activeRuns: Gauge;
42
+ /** Histogram for token usage */
43
+ tokensUsed: Histogram;
44
+ /** Counter for cost tracking */
45
+ costTotal: Counter;
46
+ /** Counter for authentication events */
47
+ authEvents: Counter;
48
+ }
49
+ /**
50
+ * Telemetry manager for agent-mux observability.
51
+ */
52
+ export declare class TelemetryManager implements Telemetry {
53
+ private sdk;
54
+ private meter;
55
+ private tracer;
56
+ private metrics;
57
+ private config;
58
+ constructor(config?: TelemetryConfig);
59
+ /**
60
+ * Initialize OpenTelemetry SDK.
61
+ */
62
+ initialize(): void;
63
+ /**
64
+ * Shutdown telemetry.
65
+ */
66
+ shutdown(): Promise<void>;
67
+ /**
68
+ * Create metrics instances.
69
+ */
70
+ private createMetrics;
71
+ /**
72
+ * Start tracing an agent run.
73
+ */
74
+ startRunSpan(runId: string, agent: string, model?: string): Span;
75
+ /**
76
+ * Start tracing a tool call.
77
+ */
78
+ startToolCallSpan(toolName: string, toolCallId: string, parentSpan?: Span): Span;
79
+ /**
80
+ * Start tracing a subagent delegation.
81
+ */
82
+ startSubagentSpan(subagentId: string, agentName: string, parentSpan?: Span): Span;
83
+ /**
84
+ * Record agent run start.
85
+ */
86
+ recordRunStart(agent: string, model?: string): void;
87
+ /**
88
+ * Record agent run completion.
89
+ */
90
+ recordRunComplete(agent: string, model: string | undefined, duration: number, cost?: {
91
+ totalUsd?: number;
92
+ inputTokens?: number;
93
+ outputTokens?: number;
94
+ thinkingTokens?: number;
95
+ }): void;
96
+ /**
97
+ * Record agent run error.
98
+ */
99
+ recordRunError(agent: string, model: string | undefined, error: Error | string, cost?: CostInfo): void;
100
+ /**
101
+ * Record tool call.
102
+ */
103
+ recordToolCall(toolName: string, duration: number, success: boolean): void;
104
+ /**
105
+ * Record authentication event.
106
+ */
107
+ recordAuthEvent(agent: string, method: string, success: boolean): void;
108
+ /**
109
+ * Set active runs gauge.
110
+ */
111
+ setActiveRuns(count: number): void;
112
+ /**
113
+ * End a span with success.
114
+ */
115
+ endSpanSuccess(span: Span, attributes?: Record<string, string | number | boolean>): void;
116
+ /**
117
+ * End a span with error.
118
+ */
119
+ endSpanError(span: Span, error: Error | string, attributes?: Record<string, string | number | boolean>): void;
120
+ /**
121
+ * Get the meter instance.
122
+ */
123
+ getMeter(): Meter;
124
+ }
125
+ /**
126
+ * Default telemetry manager instance.
127
+ */
128
+ export declare const telemetry: TelemetryManager;
129
+ /**
130
+ * Initialize telemetry if enabled.
131
+ */
132
+ export declare function initializeTelemetry(): void;
133
+ /**
134
+ * Shutdown telemetry.
135
+ */
136
+ export declare function shutdownTelemetry(): Promise<void>;
137
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,313 @@
1
+ /**
2
+ * OpenTelemetry integration for agent-mux.
3
+ *
4
+ * Provides metrics, tracing, and observability for agent operations,
5
+ * performance monitoring, and error tracking.
6
+ */
7
+ import { NodeSDK } from '@opentelemetry/sdk-node';
8
+ import { resourceFromAttributes } from '@opentelemetry/resources';
9
+ import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';
10
+ import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
11
+ import { metrics, trace, context, SpanStatusCode, SpanKind, } from '@opentelemetry/api';
12
+ /**
13
+ * Telemetry manager for agent-mux observability.
14
+ */
15
+ export class TelemetryManager {
16
+ sdk = null;
17
+ meter;
18
+ tracer;
19
+ metrics;
20
+ config;
21
+ constructor(config = {}) {
22
+ this.config = {
23
+ serviceName: 'agent-mux',
24
+ serviceVersion: process.env.npm_package_version || '0.0.0',
25
+ enableTracing: true,
26
+ enableMetrics: true,
27
+ otlpEndpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4318',
28
+ baseAttributes: {},
29
+ ...config,
30
+ };
31
+ this.meter = metrics.getMeter('@a5c-ai/agent-mux', this.config.serviceVersion);
32
+ this.tracer = trace.getTracer('@a5c-ai/agent-mux', this.config.serviceVersion);
33
+ this.metrics = this.createMetrics();
34
+ }
35
+ /**
36
+ * Initialize OpenTelemetry SDK.
37
+ */
38
+ initialize() {
39
+ if (this.sdk) {
40
+ return; // Already initialized
41
+ }
42
+ this.sdk = new NodeSDK({
43
+ resource: resourceFromAttributes({
44
+ [ATTR_SERVICE_NAME]: this.config.serviceName,
45
+ [ATTR_SERVICE_VERSION]: this.config.serviceVersion,
46
+ }),
47
+ instrumentations: [getNodeAutoInstrumentations({
48
+ // Disable some noisy instrumentations
49
+ '@opentelemetry/instrumentation-dns': { enabled: false },
50
+ '@opentelemetry/instrumentation-net': { enabled: false },
51
+ })],
52
+ });
53
+ this.sdk.start();
54
+ }
55
+ /**
56
+ * Shutdown telemetry.
57
+ */
58
+ async shutdown() {
59
+ if (this.sdk) {
60
+ await this.sdk.shutdown();
61
+ this.sdk = null;
62
+ }
63
+ }
64
+ /**
65
+ * Create metrics instances.
66
+ */
67
+ createMetrics() {
68
+ return {
69
+ runsTotal: this.meter.createCounter('agent_runs_total', {
70
+ description: 'Total number of agent runs',
71
+ unit: '1',
72
+ }),
73
+ runsErrors: this.meter.createCounter('agent_runs_errors_total', {
74
+ description: 'Total number of failed agent runs',
75
+ unit: '1',
76
+ }),
77
+ runsDuration: this.meter.createHistogram('agent_runs_duration_ms', {
78
+ description: 'Duration of agent runs in milliseconds',
79
+ unit: 'ms',
80
+ }),
81
+ toolCallsDuration: this.meter.createHistogram('tool_calls_duration_ms', {
82
+ description: 'Duration of tool calls in milliseconds',
83
+ unit: 'ms',
84
+ }),
85
+ toolCallsTotal: this.meter.createCounter('tool_calls_total', {
86
+ description: 'Total number of tool calls',
87
+ unit: '1',
88
+ }),
89
+ activeRuns: this.meter.createGauge('agent_active_runs', {
90
+ description: 'Number of currently active agent runs',
91
+ unit: '1',
92
+ }),
93
+ tokensUsed: this.meter.createHistogram('tokens_used_total', {
94
+ description: 'Total tokens used (input + output + thinking)',
95
+ unit: '1',
96
+ }),
97
+ costTotal: this.meter.createCounter('cost_usd_total', {
98
+ description: 'Total cost in USD',
99
+ unit: 'USD',
100
+ }),
101
+ authEvents: this.meter.createCounter('auth_events_total', {
102
+ description: 'Authentication events',
103
+ unit: '1',
104
+ }),
105
+ };
106
+ }
107
+ /**
108
+ * Start tracing an agent run.
109
+ */
110
+ startRunSpan(runId, agent, model) {
111
+ return this.tracer.startSpan(`agent.run.${agent}`, {
112
+ kind: SpanKind.SERVER,
113
+ attributes: {
114
+ 'agent.run.id': runId,
115
+ 'agent.name': agent,
116
+ 'agent.model': model || 'unknown',
117
+ ...this.config.baseAttributes,
118
+ },
119
+ });
120
+ }
121
+ /**
122
+ * Start tracing a tool call.
123
+ */
124
+ startToolCallSpan(toolName, toolCallId, parentSpan) {
125
+ const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : context.active();
126
+ return context.with(spanContext, () => this.tracer.startSpan(`tool.call.${toolName}`, {
127
+ kind: SpanKind.CLIENT,
128
+ attributes: {
129
+ 'tool.name': toolName,
130
+ 'tool.call.id': toolCallId,
131
+ ...this.config.baseAttributes,
132
+ },
133
+ }));
134
+ }
135
+ /**
136
+ * Start tracing a subagent delegation.
137
+ */
138
+ startSubagentSpan(subagentId, agentName, parentSpan) {
139
+ const spanContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : context.active();
140
+ return context.with(spanContext, () => this.tracer.startSpan(`subagent.dispatch.${agentName}`, {
141
+ kind: SpanKind.INTERNAL,
142
+ attributes: {
143
+ 'subagent.id': subagentId,
144
+ 'subagent.name': agentName,
145
+ ...this.config.baseAttributes,
146
+ },
147
+ }));
148
+ }
149
+ /**
150
+ * Record agent run start.
151
+ */
152
+ recordRunStart(agent, model) {
153
+ this.metrics.runsTotal.add(1, {
154
+ agent,
155
+ model: model || 'unknown',
156
+ status: 'started',
157
+ });
158
+ }
159
+ /**
160
+ * Record agent run completion.
161
+ */
162
+ recordRunComplete(agent, model, duration, cost) {
163
+ this.metrics.runsDuration.record(duration, {
164
+ agent,
165
+ model: model || 'unknown',
166
+ status: 'completed',
167
+ });
168
+ if (cost) {
169
+ const totalTokens = (cost.inputTokens || 0) + (cost.outputTokens || 0) + (cost.thinkingTokens || 0);
170
+ this.metrics.tokensUsed.record(totalTokens, {
171
+ agent,
172
+ model: model || 'unknown',
173
+ token_type: 'total',
174
+ });
175
+ if (cost.inputTokens) {
176
+ this.metrics.tokensUsed.record(cost.inputTokens, {
177
+ agent,
178
+ model: model || 'unknown',
179
+ token_type: 'input',
180
+ });
181
+ }
182
+ if (cost.outputTokens) {
183
+ this.metrics.tokensUsed.record(cost.outputTokens, {
184
+ agent,
185
+ model: model || 'unknown',
186
+ token_type: 'output',
187
+ });
188
+ }
189
+ if (cost.thinkingTokens) {
190
+ this.metrics.tokensUsed.record(cost.thinkingTokens, {
191
+ agent,
192
+ model: model || 'unknown',
193
+ token_type: 'thinking',
194
+ });
195
+ }
196
+ if (cost.totalUsd) {
197
+ this.metrics.costTotal.add(cost.totalUsd, {
198
+ agent,
199
+ model: model || 'unknown',
200
+ });
201
+ }
202
+ }
203
+ }
204
+ /**
205
+ * Record agent run error.
206
+ */
207
+ recordRunError(agent, model, error, cost) {
208
+ this.metrics.runsErrors.add(1, {
209
+ agent,
210
+ model: model || 'unknown',
211
+ error_type: error instanceof Error ? error.constructor.name : 'unknown',
212
+ });
213
+ if (cost) {
214
+ const totalTokens = (cost.inputTokens || 0) + (cost.outputTokens || 0) + (cost.thinkingTokens || 0);
215
+ this.metrics.tokensUsed.record(totalTokens, {
216
+ agent,
217
+ model: model || 'unknown',
218
+ token_type: 'total',
219
+ status: 'error',
220
+ });
221
+ if (cost.totalUsd) {
222
+ this.metrics.costTotal.add(cost.totalUsd, {
223
+ agent,
224
+ model: model || 'unknown',
225
+ status: 'error',
226
+ });
227
+ }
228
+ }
229
+ }
230
+ /**
231
+ * Record tool call.
232
+ */
233
+ recordToolCall(toolName, duration, success) {
234
+ this.metrics.toolCallsTotal.add(1, {
235
+ tool: toolName,
236
+ status: success ? 'success' : 'error',
237
+ });
238
+ this.metrics.toolCallsDuration.record(duration, {
239
+ tool: toolName,
240
+ status: success ? 'success' : 'error',
241
+ });
242
+ }
243
+ /**
244
+ * Record authentication event.
245
+ */
246
+ recordAuthEvent(agent, method, success) {
247
+ this.metrics.authEvents.add(1, {
248
+ agent,
249
+ method,
250
+ status: success ? 'success' : 'failure',
251
+ });
252
+ }
253
+ /**
254
+ * Set active runs gauge.
255
+ */
256
+ setActiveRuns(count) {
257
+ this.metrics.activeRuns.record(count);
258
+ }
259
+ /**
260
+ * End a span with success.
261
+ */
262
+ endSpanSuccess(span, attributes) {
263
+ if (attributes) {
264
+ span.setAttributes(attributes);
265
+ }
266
+ span.setStatus({ code: SpanStatusCode.OK });
267
+ span.end();
268
+ }
269
+ /**
270
+ * End a span with error.
271
+ */
272
+ endSpanError(span, error, attributes) {
273
+ span.recordException(error instanceof Error ? error : new Error(error));
274
+ span.setStatus({
275
+ code: SpanStatusCode.ERROR,
276
+ message: error instanceof Error ? error.message : error,
277
+ });
278
+ if (attributes) {
279
+ span.setAttributes(attributes);
280
+ }
281
+ span.end();
282
+ }
283
+ /**
284
+ * Get the meter instance.
285
+ */
286
+ getMeter() {
287
+ return this.meter;
288
+ }
289
+ }
290
+ /**
291
+ * Default telemetry manager instance.
292
+ */
293
+ export const telemetry = new TelemetryManager({
294
+ serviceName: process.env.OTEL_SERVICE_NAME || 'agent-mux',
295
+ serviceVersion: process.env.npm_package_version,
296
+ enableTracing: process.env.OTEL_TRACES_EXPORTER !== 'none',
297
+ enableMetrics: process.env.OTEL_METRICS_EXPORTER !== 'none',
298
+ });
299
+ /**
300
+ * Initialize telemetry if enabled.
301
+ */
302
+ export function initializeTelemetry() {
303
+ if (process.env.OTEL_SDK_DISABLED !== 'true') {
304
+ telemetry.initialize();
305
+ }
306
+ }
307
+ /**
308
+ * Shutdown telemetry.
309
+ */
310
+ export async function shutdownTelemetry() {
311
+ await telemetry.shutdown();
312
+ }
313
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}