@seanhogg/builderforce-memory 2026.7.14 → 2026.9.28

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.
Files changed (225) hide show
  1. package/README.md +10 -0
  2. package/dist/bridges/AnthropicBridge.d.ts +9 -1
  3. package/dist/bridges/AnthropicBridge.d.ts.map +1 -1
  4. package/dist/bridges/AnthropicBridge.js +58 -2
  5. package/dist/bridges/AnthropicBridge.js.map +1 -1
  6. package/dist/bridges/CachingBridge.d.ts +9 -1
  7. package/dist/bridges/CachingBridge.d.ts.map +1 -1
  8. package/dist/bridges/CachingBridge.js +24 -1
  9. package/dist/bridges/CachingBridge.js.map +1 -1
  10. package/dist/bridges/OpenAIBridge.d.ts +4 -1
  11. package/dist/bridges/OpenAIBridge.d.ts.map +1 -1
  12. package/dist/bridges/OpenAIBridge.js +40 -2
  13. package/dist/bridges/OpenAIBridge.js.map +1 -1
  14. package/dist/bridges/SemanticCachingBridge.d.ts +8 -1
  15. package/dist/bridges/SemanticCachingBridge.d.ts.map +1 -1
  16. package/dist/bridges/SemanticCachingBridge.js +26 -1
  17. package/dist/bridges/SemanticCachingBridge.js.map +1 -1
  18. package/dist/bridges/TransformerBridge.d.ts +13 -0
  19. package/dist/bridges/TransformerBridge.d.ts.map +1 -1
  20. package/dist/bridges/VertexAIBridge.d.ts +102 -0
  21. package/dist/bridges/VertexAIBridge.d.ts.map +1 -0
  22. package/dist/bridges/VertexAIBridge.js +224 -0
  23. package/dist/bridges/VertexAIBridge.js.map +1 -0
  24. package/dist/bridges/index.d.ts +3 -1
  25. package/dist/bridges/index.d.ts.map +1 -1
  26. package/dist/bridges/index.js +1 -0
  27. package/dist/bridges/index.js.map +1 -1
  28. package/dist/eval/EvalHarness.d.ts +37 -0
  29. package/dist/eval/EvalHarness.d.ts.map +1 -0
  30. package/dist/eval/EvalHarness.js +178 -0
  31. package/dist/eval/EvalHarness.js.map +1 -0
  32. package/dist/eval/graders.d.ts +76 -0
  33. package/dist/eval/graders.d.ts.map +1 -0
  34. package/dist/eval/graders.js +168 -0
  35. package/dist/eval/graders.js.map +1 -0
  36. package/dist/eval/index.d.ts +26 -0
  37. package/dist/eval/index.d.ts.map +1 -0
  38. package/dist/eval/index.js +26 -0
  39. package/dist/eval/index.js.map +1 -0
  40. package/dist/eval/types.d.ts +97 -0
  41. package/dist/eval/types.d.ts.map +1 -0
  42. package/dist/eval/types.js +5 -0
  43. package/dist/eval/types.js.map +1 -0
  44. package/dist/evermind/contract.d.ts +40 -0
  45. package/dist/evermind/contract.d.ts.map +1 -0
  46. package/dist/evermind/contract.js +13 -0
  47. package/dist/evermind/contract.js.map +1 -0
  48. package/dist/evermind/index.d.ts +15 -0
  49. package/dist/evermind/index.d.ts.map +1 -0
  50. package/dist/evermind/index.js +4 -0
  51. package/dist/evermind/index.js.map +1 -0
  52. package/dist/evermind/memoryBlock.d.ts +7 -0
  53. package/dist/evermind/memoryBlock.d.ts.map +1 -0
  54. package/dist/evermind/memoryBlock.js +37 -0
  55. package/dist/evermind/memoryBlock.js.map +1 -0
  56. package/dist/evermind/recall.d.ts +48 -0
  57. package/dist/evermind/recall.d.ts.map +1 -0
  58. package/dist/evermind/recall.js +105 -0
  59. package/dist/evermind/recall.js.map +1 -0
  60. package/dist/index.d.ts +18 -3
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +14 -1
  63. package/dist/index.js.map +1 -1
  64. package/dist/ingest/IngestionPipeline.d.ts +95 -0
  65. package/dist/ingest/IngestionPipeline.d.ts.map +1 -0
  66. package/dist/ingest/IngestionPipeline.js +295 -0
  67. package/dist/ingest/IngestionPipeline.js.map +1 -0
  68. package/dist/ingest/index.d.ts +10 -0
  69. package/dist/ingest/index.d.ts.map +1 -0
  70. package/dist/ingest/index.js +8 -0
  71. package/dist/ingest/index.js.map +1 -0
  72. package/dist/ingest/parsers.d.ts +53 -0
  73. package/dist/ingest/parsers.d.ts.map +1 -0
  74. package/dist/ingest/parsers.js +306 -0
  75. package/dist/ingest/parsers.js.map +1 -0
  76. package/dist/ingest/types.d.ts +114 -0
  77. package/dist/ingest/types.d.ts.map +1 -0
  78. package/dist/ingest/types.js +19 -0
  79. package/dist/ingest/types.js.map +1 -0
  80. package/dist/memory/MemoryStore.d.ts +33 -0
  81. package/dist/memory/MemoryStore.d.ts.map +1 -1
  82. package/dist/memory/MemoryStore.js +29 -3
  83. package/dist/memory/MemoryStore.js.map +1 -1
  84. package/dist/memory/index.d.ts +1 -1
  85. package/dist/memory/index.d.ts.map +1 -1
  86. package/dist/orchestration/AgentGraph.d.ts +104 -0
  87. package/dist/orchestration/AgentGraph.d.ts.map +1 -0
  88. package/dist/orchestration/AgentGraph.js +364 -0
  89. package/dist/orchestration/AgentGraph.js.map +1 -0
  90. package/dist/orchestration/checkpoint.d.ts +58 -0
  91. package/dist/orchestration/checkpoint.d.ts.map +1 -0
  92. package/dist/orchestration/checkpoint.js +92 -0
  93. package/dist/orchestration/checkpoint.js.map +1 -0
  94. package/dist/orchestration/index.d.ts +14 -0
  95. package/dist/orchestration/index.d.ts.map +1 -0
  96. package/dist/orchestration/index.js +10 -0
  97. package/dist/orchestration/index.js.map +1 -0
  98. package/dist/orchestration/patterns.d.ts +159 -0
  99. package/dist/orchestration/patterns.d.ts.map +1 -0
  100. package/dist/orchestration/patterns.js +371 -0
  101. package/dist/orchestration/patterns.js.map +1 -0
  102. package/dist/orchestration/types.d.ts +146 -0
  103. package/dist/orchestration/types.d.ts.map +1 -0
  104. package/dist/orchestration/types.js +20 -0
  105. package/dist/orchestration/types.js.map +1 -0
  106. package/dist/rag/EnterpriseRetriever.d.ts +114 -0
  107. package/dist/rag/EnterpriseRetriever.d.ts.map +1 -0
  108. package/dist/rag/EnterpriseRetriever.js +240 -0
  109. package/dist/rag/EnterpriseRetriever.js.map +1 -0
  110. package/dist/rag/index.d.ts +6 -0
  111. package/dist/rag/index.d.ts.map +1 -0
  112. package/dist/rag/index.js +5 -0
  113. package/dist/rag/index.js.map +1 -0
  114. package/dist/retrieval/bm25.d.ts +48 -1
  115. package/dist/retrieval/bm25.d.ts.map +1 -1
  116. package/dist/retrieval/bm25.js +59 -13
  117. package/dist/retrieval/bm25.js.map +1 -1
  118. package/dist/retrieval/index.d.ts +2 -2
  119. package/dist/retrieval/index.d.ts.map +1 -1
  120. package/dist/retrieval/index.js +1 -1
  121. package/dist/retrieval/index.js.map +1 -1
  122. package/dist/runtime/SSMRuntime.d.ts +1 -1
  123. package/dist/runtime/SSMRuntime.d.ts.map +1 -1
  124. package/dist/telemetry/InstrumentedBridge.d.ts +62 -0
  125. package/dist/telemetry/InstrumentedBridge.d.ts.map +1 -0
  126. package/dist/telemetry/InstrumentedBridge.js +120 -0
  127. package/dist/telemetry/InstrumentedBridge.js.map +1 -0
  128. package/dist/telemetry/MetricsRegistry.d.ts +88 -0
  129. package/dist/telemetry/MetricsRegistry.d.ts.map +1 -0
  130. package/dist/telemetry/MetricsRegistry.js +167 -0
  131. package/dist/telemetry/MetricsRegistry.js.map +1 -0
  132. package/dist/telemetry/Tracer.d.ts +137 -0
  133. package/dist/telemetry/Tracer.d.ts.map +1 -0
  134. package/dist/telemetry/Tracer.js +244 -0
  135. package/dist/telemetry/Tracer.js.map +1 -0
  136. package/dist/telemetry/exporters.d.ts +68 -0
  137. package/dist/telemetry/exporters.d.ts.map +1 -0
  138. package/dist/telemetry/exporters.js +145 -0
  139. package/dist/telemetry/exporters.js.map +1 -0
  140. package/dist/telemetry/index.d.ts +19 -0
  141. package/dist/telemetry/index.d.ts.map +1 -0
  142. package/dist/telemetry/index.js +12 -0
  143. package/dist/telemetry/index.js.map +1 -0
  144. package/dist/telemetry/pricing.d.ts +74 -0
  145. package/dist/telemetry/pricing.d.ts.map +1 -0
  146. package/dist/telemetry/pricing.js +98 -0
  147. package/dist/telemetry/pricing.js.map +1 -0
  148. package/dist/telemetry/traceparent.d.ts +50 -0
  149. package/dist/telemetry/traceparent.d.ts.map +1 -0
  150. package/dist/telemetry/traceparent.js +77 -0
  151. package/dist/telemetry/traceparent.js.map +1 -0
  152. package/dist/telemetry/types.d.ts +90 -0
  153. package/dist/telemetry/types.d.ts.map +1 -0
  154. package/dist/telemetry/types.js +17 -0
  155. package/dist/telemetry/types.js.map +1 -0
  156. package/dist/vectorstore/MemoryVectorStore.d.ts +72 -0
  157. package/dist/vectorstore/MemoryVectorStore.d.ts.map +1 -0
  158. package/dist/vectorstore/MemoryVectorStore.js +205 -0
  159. package/dist/vectorstore/MemoryVectorStore.js.map +1 -0
  160. package/dist/vectorstore/RestVectorStore.d.ts +79 -0
  161. package/dist/vectorstore/RestVectorStore.d.ts.map +1 -0
  162. package/dist/vectorstore/RestVectorStore.js +170 -0
  163. package/dist/vectorstore/RestVectorStore.js.map +1 -0
  164. package/dist/vectorstore/dialects.d.ts +101 -0
  165. package/dist/vectorstore/dialects.d.ts.map +1 -0
  166. package/dist/vectorstore/dialects.js +618 -0
  167. package/dist/vectorstore/dialects.js.map +1 -0
  168. package/dist/vectorstore/filter.d.ts +42 -0
  169. package/dist/vectorstore/filter.d.ts.map +1 -0
  170. package/dist/vectorstore/filter.js +132 -0
  171. package/dist/vectorstore/filter.js.map +1 -0
  172. package/dist/vectorstore/index.d.ts +15 -0
  173. package/dist/vectorstore/index.d.ts.map +1 -0
  174. package/dist/vectorstore/index.js +11 -0
  175. package/dist/vectorstore/index.js.map +1 -0
  176. package/dist/vectorstore/types.d.ts +151 -0
  177. package/dist/vectorstore/types.d.ts.map +1 -0
  178. package/dist/vectorstore/types.js +30 -0
  179. package/dist/vectorstore/types.js.map +1 -0
  180. package/package.json +39 -5
  181. package/src/bridges/AnthropicBridge.ts +68 -3
  182. package/src/bridges/CachingBridge.ts +28 -2
  183. package/src/bridges/OpenAIBridge.ts +48 -3
  184. package/src/bridges/SemanticCachingBridge.ts +29 -2
  185. package/src/bridges/TransformerBridge.ts +16 -0
  186. package/src/bridges/VertexAIBridge.ts +297 -0
  187. package/src/bridges/index.ts +3 -1
  188. package/src/eval/EvalHarness.ts +214 -0
  189. package/src/eval/graders.ts +218 -0
  190. package/src/eval/index.ts +26 -0
  191. package/src/eval/types.ts +107 -0
  192. package/src/evermind/contract.ts +39 -0
  193. package/src/evermind/index.ts +18 -0
  194. package/src/evermind/memoryBlock.ts +38 -0
  195. package/src/evermind/recall.ts +122 -0
  196. package/src/index.ts +232 -0
  197. package/src/ingest/IngestionPipeline.ts +378 -0
  198. package/src/ingest/index.ts +46 -0
  199. package/src/ingest/parsers.ts +318 -0
  200. package/src/ingest/types.ts +116 -0
  201. package/src/memory/MemoryStore.ts +55 -3
  202. package/src/memory/index.ts +1 -1
  203. package/src/orchestration/AgentGraph.ts +462 -0
  204. package/src/orchestration/checkpoint.ts +129 -0
  205. package/src/orchestration/index.ts +63 -0
  206. package/src/orchestration/patterns.ts +532 -0
  207. package/src/orchestration/types.ts +128 -0
  208. package/src/rag/EnterpriseRetriever.ts +348 -0
  209. package/src/rag/index.ts +18 -0
  210. package/src/retrieval/bm25.ts +71 -13
  211. package/src/retrieval/index.ts +2 -2
  212. package/src/telemetry/InstrumentedBridge.ts +152 -0
  213. package/src/telemetry/MetricsRegistry.ts +263 -0
  214. package/src/telemetry/Tracer.ts +310 -0
  215. package/src/telemetry/exporters.ts +187 -0
  216. package/src/telemetry/index.ts +56 -0
  217. package/src/telemetry/pricing.ts +129 -0
  218. package/src/telemetry/traceparent.ts +89 -0
  219. package/src/telemetry/types.ts +105 -0
  220. package/src/vectorstore/MemoryVectorStore.ts +250 -0
  221. package/src/vectorstore/RestVectorStore.ts +236 -0
  222. package/src/vectorstore/dialects.ts +702 -0
  223. package/src/vectorstore/filter.ts +148 -0
  224. package/src/vectorstore/index.ts +53 -0
  225. package/src/vectorstore/types.ts +149 -0
@@ -0,0 +1,244 @@
1
+ /**
2
+ * telemetry/Tracer.ts — granular tracing for agent runs.
3
+ *
4
+ * A production agent failure is almost never "the LLM was wrong"; it is "the
5
+ * retrieval returned nothing, so the LLM was asked to answer from an empty
6
+ * context". You can only see that with a span tree covering the WHOLE request —
7
+ * ingest, retrieval, each graph node, each model call — under one trace id.
8
+ *
9
+ * `now` and `newId` are injected so traces are deterministic under test; the
10
+ * defaults use wall-clock and a random hex id.
11
+ */
12
+ import { estimateCostUsd, DEFAULT_PRICE_BOOK } from './pricing.js';
13
+ import { formatTraceparent } from './traceparent.js';
14
+ /**
15
+ * A live span. Mutating methods are no-ops once `end()`/`fail()` has run, so a
16
+ * late callback (a stream resolving after a timeout) cannot corrupt a span that
17
+ * has already been exported.
18
+ */
19
+ export class Span {
20
+ _tracer;
21
+ _data;
22
+ _closed = false;
23
+ _recorded;
24
+ /** @internal — construct via {@link Tracer.startSpan}. */
25
+ constructor(tracer, data, recorded) {
26
+ this._tracer = tracer;
27
+ this._data = data;
28
+ this._recorded = recorded;
29
+ }
30
+ get traceId() { return this._data.traceId; }
31
+ get spanId() { return this._data.spanId; }
32
+ get name() { return this._data.name; }
33
+ get closed() { return this._closed; }
34
+ /** False when this trace was dropped by sampling — nothing will be exported. */
35
+ get recorded() { return this._recorded; }
36
+ /** A snapshot copy; mutating it does not affect the span. */
37
+ get data() {
38
+ return { ...this._data, attributes: { ...this._data.attributes }, events: [...this._data.events] };
39
+ }
40
+ setAttribute(key, value) {
41
+ if (!this._closed)
42
+ this._data.attributes[key] = value;
43
+ return this;
44
+ }
45
+ setAttributes(attrs) {
46
+ for (const [k, v] of Object.entries(attrs)) {
47
+ if (v !== undefined)
48
+ this.setAttribute(k, v);
49
+ }
50
+ return this;
51
+ }
52
+ addEvent(name, attributes) {
53
+ if (this._closed)
54
+ return this;
55
+ const event = { name, at: this._tracer.now() };
56
+ if (attributes)
57
+ event.attributes = attributes;
58
+ this._data.events.push(event);
59
+ return this;
60
+ }
61
+ /** Records token usage and prices it with the tracer's price book. */
62
+ recordUsage(usage) {
63
+ if (this._closed)
64
+ return this;
65
+ this._data.usage = usage;
66
+ const cost = estimateCostUsd(usage, this._tracer.pricing);
67
+ if (cost !== undefined)
68
+ this._data.costUsd = cost;
69
+ return this;
70
+ }
71
+ /** Marks time-to-first-token; call when a stream yields its first chunk. */
72
+ recordFirstToken() {
73
+ if (this._closed)
74
+ return this;
75
+ this._data.timeToFirstTokenMs = this._tracer.now() - this._data.startedAt;
76
+ return this.addEvent('first-token');
77
+ }
78
+ /** Opens a child span inside this one (same trace, this span as parent). */
79
+ child(name, opts = {}) {
80
+ return this._tracer.startSpan(name, { ...opts, parent: this });
81
+ }
82
+ /**
83
+ * This span's position, for handing to another process. The sampling flag is the
84
+ * span's OWN `recorded` verdict, so the next hop inherits the decision already
85
+ * taken rather than making a second, possibly contradictory one.
86
+ */
87
+ context() {
88
+ return { traceId: this._data.traceId, spanId: this._data.spanId, sampled: this._recorded };
89
+ }
90
+ /**
91
+ * The `traceparent` header value to send on an outbound request made inside this
92
+ * span. Set it and the callee's root span becomes this span's child.
93
+ */
94
+ traceparent() {
95
+ return formatTraceparent(this.context());
96
+ }
97
+ end(status = 'ok') {
98
+ return this._close(status);
99
+ }
100
+ /** Ends the span as failed, recording the error message. */
101
+ fail(error) {
102
+ if (!this._closed) {
103
+ this._data.error = error instanceof Error ? error.message : String(error);
104
+ }
105
+ return this._close('error');
106
+ }
107
+ _close(status) {
108
+ if (this._closed)
109
+ return this.data;
110
+ this._closed = true;
111
+ this._data.status = status;
112
+ this._data.endedAt = this._tracer.now();
113
+ this._data.durationMs = this._data.endedAt - this._data.startedAt;
114
+ this._tracer._finish(this._data, this._recorded);
115
+ return this.data;
116
+ }
117
+ }
118
+ export class Tracer {
119
+ pricing;
120
+ _exporter;
121
+ _now;
122
+ _newId;
123
+ _maxBatch;
124
+ _sampleRate;
125
+ _random;
126
+ _buffer = [];
127
+ _finished = [];
128
+ /** traceId -> sampling decision, so children inherit the root's verdict. */
129
+ _sampled = new Map();
130
+ constructor(opts = {}) {
131
+ if (opts.exporter)
132
+ this._exporter = opts.exporter;
133
+ this.pricing = opts.pricing ?? DEFAULT_PRICE_BOOK;
134
+ this._now = opts.now ?? (() => Date.now());
135
+ this._newId = opts.newId ?? defaultIdFactory();
136
+ this._maxBatch = Math.max(1, opts.maxBatchSize ?? 64);
137
+ this._sampleRate = clamp01(opts.sampleRate ?? 1);
138
+ this._random = opts.random ?? Math.random;
139
+ }
140
+ now() { return this._now(); }
141
+ startSpan(name, opts = {}) {
142
+ // An in-process parent beats a remote one: if both are present the remote
143
+ // header is stale context that the live parent already descends from.
144
+ const remote = opts.parent ? undefined : opts.remoteParent;
145
+ const traceId = opts.parent?.traceId ?? remote?.traceId ?? opts.traceId ?? this._newId(16);
146
+ const recorded = remote
147
+ ? this._adoptSampling(traceId, remote.sampled)
148
+ : this._decideSampling(traceId, Boolean(opts.parent));
149
+ const data = {
150
+ traceId,
151
+ spanId: this._newId(8),
152
+ name,
153
+ kind: opts.kind ?? 'internal',
154
+ startedAt: this._now(),
155
+ attributes: { ...(opts.attributes ?? {}) },
156
+ events: [],
157
+ status: 'unset',
158
+ };
159
+ if (opts.parent)
160
+ data.parentSpanId = opts.parent.spanId;
161
+ else if (remote)
162
+ data.parentSpanId = remote.spanId;
163
+ return new Span(this, data, recorded);
164
+ }
165
+ /**
166
+ * Runs `fn` inside a span, ending it `ok` on resolve and `error` on throw.
167
+ * Every subsystem uses this rather than hand-pairing start/end, so a thrown
168
+ * error can never leak an un-ended span into the trace tree.
169
+ */
170
+ async withSpan(name, opts, fn) {
171
+ const span = this.startSpan(name, opts);
172
+ try {
173
+ const out = await fn(span);
174
+ span.end('ok');
175
+ return out;
176
+ }
177
+ catch (err) {
178
+ span.fail(err);
179
+ throw err;
180
+ }
181
+ }
182
+ /** All spans finished since construction (recorded ones only). */
183
+ finished() { return this._finished; }
184
+ /** Spans of one trace, in completion order. */
185
+ trace(traceId) {
186
+ return this._finished.filter((s) => s.traceId === traceId);
187
+ }
188
+ /** Pushes any buffered spans to the exporter. */
189
+ async flush() {
190
+ if (this._buffer.length === 0)
191
+ return;
192
+ const batch = this._buffer;
193
+ this._buffer = [];
194
+ await this._exporter?.export(batch);
195
+ }
196
+ async shutdown() {
197
+ await this.flush();
198
+ await this._exporter?.shutdown?.();
199
+ }
200
+ /** @internal */
201
+ _finish(data, recorded) {
202
+ if (!recorded)
203
+ return;
204
+ this._finished.push(data);
205
+ this._buffer.push(data);
206
+ if (this._buffer.length >= this._maxBatch)
207
+ void this.flush();
208
+ }
209
+ /**
210
+ * Take the upstream hop's sampling verdict verbatim and record it against the
211
+ * trace, so every later span in this process inherits it too. Head-based
212
+ * sampling only works if it is decided ONCE, at the head.
213
+ */
214
+ _adoptSampling(traceId, sampled) {
215
+ const known = this._sampled.get(traceId);
216
+ if (known !== undefined)
217
+ return known;
218
+ this._sampled.set(traceId, sampled);
219
+ return sampled;
220
+ }
221
+ _decideSampling(traceId, hasParent) {
222
+ const known = this._sampled.get(traceId);
223
+ if (known !== undefined)
224
+ return known;
225
+ // A child whose parent's decision is unknown defaults to recorded rather
226
+ // than re-rolling the dice, which would tear a trace in half.
227
+ const decision = hasParent || this._sampleRate >= 1 || this._random() < this._sampleRate;
228
+ this._sampled.set(traceId, decision);
229
+ return decision;
230
+ }
231
+ }
232
+ function clamp01(n) {
233
+ return Number.isFinite(n) ? Math.min(1, Math.max(0, n)) : 1;
234
+ }
235
+ function defaultIdFactory() {
236
+ return (bytes) => {
237
+ let out = '';
238
+ for (let i = 0; i < bytes; i++) {
239
+ out += Math.floor(Math.random() * 256).toString(16).padStart(2, '0');
240
+ }
241
+ return out;
242
+ };
243
+ }
244
+ //# sourceMappingURL=Tracer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tracer.js","sourceRoot":"","sources":["../../src/telemetry/Tracer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * telemetry/exporters.ts — where finished spans go.
3
+ *
4
+ * Three sinks cover the deployment spectrum without a vendor dependency:
5
+ * • {@link InMemorySpanExporter} — tests and in-process dashboards.
6
+ * • {@link ConsoleSpanExporter} — local development.
7
+ * • {@link OtlpHttpSpanExporter} — any OTLP/HTTP collector, which includes
8
+ * Google Cloud Trace, Datadog, Honeycomb, Grafana Tempo and the OpenTelemetry
9
+ * Collector. It speaks the protocol over `fetch` rather than importing the
10
+ * OpenTelemetry SDK, so the package stays zero-dependency and still runs in a
11
+ * browser or a Cloudflare Worker where the Node SDK cannot.
12
+ */
13
+ import type { SpanData, SpanExporter } from './types.js';
14
+ export declare class InMemorySpanExporter implements SpanExporter {
15
+ private readonly _spans;
16
+ export(spans: readonly SpanData[]): void;
17
+ get spans(): readonly SpanData[];
18
+ /** Spans belonging to one trace, oldest first. */
19
+ trace(traceId: string): SpanData[];
20
+ reset(): void;
21
+ }
22
+ export interface ConsoleSpanExporterOptions {
23
+ /** Sink for the rendered lines. Default `console.log`. */
24
+ write?: (line: string) => void;
25
+ /** Include span attributes. Default false — one line per span. */
26
+ verbose?: boolean;
27
+ }
28
+ export declare class ConsoleSpanExporter implements SpanExporter {
29
+ private readonly _write;
30
+ private readonly _verbose;
31
+ constructor(opts?: ConsoleSpanExporterOptions);
32
+ export(spans: readonly SpanData[]): void;
33
+ }
34
+ export interface OtlpHttpSpanExporterOptions {
35
+ /** Collector endpoint, e.g. `https://otlp.example.com/v1/traces`. */
36
+ url: string;
37
+ /** Extra headers (auth token, GCP project header, …). */
38
+ headers?: Record<string, string>;
39
+ /** `service.name` reported on the resource. Default `evermind`. */
40
+ serviceName?: string;
41
+ /** Injected for test. Default global `fetch`. */
42
+ fetchImpl?: typeof fetch;
43
+ /**
44
+ * Called when an export request fails. Default: swallow. Telemetry must never
45
+ * take down the request it is measuring, so failures are reported, not thrown.
46
+ */
47
+ onError?: (err: unknown) => void;
48
+ }
49
+ export declare class OtlpHttpSpanExporter implements SpanExporter {
50
+ private readonly _url;
51
+ private readonly _headers;
52
+ private readonly _serviceName;
53
+ private readonly _fetch;
54
+ private readonly _onError;
55
+ constructor(opts: OtlpHttpSpanExporterOptions);
56
+ export(spans: readonly SpanData[]): Promise<void>;
57
+ }
58
+ /** Wraps spans in the OTLP/HTTP JSON envelope. */
59
+ export declare function toOtlpPayload(spans: readonly SpanData[], serviceName?: string): unknown;
60
+ /**
61
+ * Converts one span to the OTLP wire shape. The mapping is a rename, not a
62
+ * re-model, because {@link SpanData} was designed against this schema.
63
+ *
64
+ * LLM attributes follow the OpenTelemetry GenAI semantic conventions
65
+ * (`gen_ai.*`) so a stock trace viewer renders token counts without config.
66
+ */
67
+ export declare function toOtlpSpan(span: SpanData): unknown;
68
+ //# sourceMappingURL=exporters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exporters.d.ts","sourceRoot":"","sources":["../../src/telemetry/exporters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAkB,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEzE,qBAAa,oBAAqB,YAAW,YAAY;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAEzC,MAAM,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,IAAI;IAIxC,IAAI,KAAK,IAAI,SAAS,QAAQ,EAAE,CAAwB;IAExD,kDAAkD;IAClD,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE;IAIlC,KAAK,IAAI,IAAI;CAChB;AAED,MAAM,WAAW,0BAA0B;IACvC,0DAA0D;IAC1D,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,mBAAoB,YAAW,YAAY;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;gBAEvB,IAAI,GAAE,0BAA+B;IAKjD,MAAM,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,IAAI;CAc3C;AAED,MAAM,WAAW,2BAA2B;IACxC,qEAAqE;IACrE,GAAG,EAAE,MAAM,CAAC;IACZ,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC;AAMD,qBAAa,oBAAqB,YAAW,YAAY;IACrD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;gBAEtC,IAAI,EAAE,2BAA2B;IAQvC,MAAM,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAa1D;AAED,kDAAkD;AAClD,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,EAAE,WAAW,SAAa,GAAG,OAAO,CAU3F;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAqClD"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * telemetry/exporters.ts — where finished spans go.
3
+ *
4
+ * Three sinks cover the deployment spectrum without a vendor dependency:
5
+ * • {@link InMemorySpanExporter} — tests and in-process dashboards.
6
+ * • {@link ConsoleSpanExporter} — local development.
7
+ * • {@link OtlpHttpSpanExporter} — any OTLP/HTTP collector, which includes
8
+ * Google Cloud Trace, Datadog, Honeycomb, Grafana Tempo and the OpenTelemetry
9
+ * Collector. It speaks the protocol over `fetch` rather than importing the
10
+ * OpenTelemetry SDK, so the package stays zero-dependency and still runs in a
11
+ * browser or a Cloudflare Worker where the Node SDK cannot.
12
+ */
13
+ export class InMemorySpanExporter {
14
+ _spans = [];
15
+ export(spans) {
16
+ this._spans.push(...spans);
17
+ }
18
+ get spans() { return this._spans; }
19
+ /** Spans belonging to one trace, oldest first. */
20
+ trace(traceId) {
21
+ return this._spans.filter((s) => s.traceId === traceId);
22
+ }
23
+ reset() { this._spans.length = 0; }
24
+ }
25
+ export class ConsoleSpanExporter {
26
+ _write;
27
+ _verbose;
28
+ constructor(opts = {}) {
29
+ this._write = opts.write ?? ((line) => console.log(line));
30
+ this._verbose = opts.verbose ?? false;
31
+ }
32
+ export(spans) {
33
+ for (const span of spans) {
34
+ const cost = span.costUsd !== undefined ? ` $${span.costUsd.toFixed(6)}` : '';
35
+ const tokens = span.usage ? ` ${span.usage.inputTokens}in/${span.usage.outputTokens}out` : '';
36
+ const status = span.status === 'error' ? ` ERROR: ${span.error ?? ''}` : '';
37
+ this._write(`[${span.traceId.slice(0, 8)}] ${span.kind.padEnd(9)} ${span.name} ` +
38
+ `${Math.round(span.durationMs ?? 0)}ms${tokens}${cost}${status}`);
39
+ if (this._verbose && Object.keys(span.attributes).length > 0) {
40
+ this._write(` ${JSON.stringify(span.attributes)}`);
41
+ }
42
+ }
43
+ }
44
+ }
45
+ /** OTLP span kind codes: UNSPECIFIED 0, INTERNAL 1, SERVER 2, CLIENT 3. */
46
+ const OTLP_CLIENT = 3;
47
+ const OTLP_INTERNAL = 1;
48
+ export class OtlpHttpSpanExporter {
49
+ _url;
50
+ _headers;
51
+ _serviceName;
52
+ _fetch;
53
+ _onError;
54
+ constructor(opts) {
55
+ this._url = opts.url;
56
+ this._headers = opts.headers ?? {};
57
+ this._serviceName = opts.serviceName ?? 'evermind';
58
+ this._fetch = opts.fetchImpl ?? ((...args) => fetch(...args));
59
+ this._onError = opts.onError ?? (() => { });
60
+ }
61
+ async export(spans) {
62
+ if (spans.length === 0)
63
+ return;
64
+ try {
65
+ const res = await this._fetch(this._url, {
66
+ method: 'POST',
67
+ headers: { 'Content-Type': 'application/json', ...this._headers },
68
+ body: JSON.stringify(toOtlpPayload(spans, this._serviceName)),
69
+ });
70
+ if (!res.ok)
71
+ this._onError(new Error(`OTLP export failed: ${res.status}`));
72
+ }
73
+ catch (err) {
74
+ this._onError(err);
75
+ }
76
+ }
77
+ }
78
+ /** Wraps spans in the OTLP/HTTP JSON envelope. */
79
+ export function toOtlpPayload(spans, serviceName = 'evermind') {
80
+ return {
81
+ resourceSpans: [{
82
+ resource: { attributes: [otlpAttr('service.name', serviceName)] },
83
+ scopeSpans: [{
84
+ scope: { name: '@seanhogg/builderforce-memory' },
85
+ spans: spans.map(toOtlpSpan),
86
+ }],
87
+ }],
88
+ };
89
+ }
90
+ /**
91
+ * Converts one span to the OTLP wire shape. The mapping is a rename, not a
92
+ * re-model, because {@link SpanData} was designed against this schema.
93
+ *
94
+ * LLM attributes follow the OpenTelemetry GenAI semantic conventions
95
+ * (`gen_ai.*`) so a stock trace viewer renders token counts without config.
96
+ */
97
+ export function toOtlpSpan(span) {
98
+ const attributes = Object.entries(span.attributes).map(([k, v]) => otlpAttr(k, v));
99
+ if (span.usage) {
100
+ attributes.push(otlpAttr('gen_ai.request.model', span.usage.model), otlpAttr('gen_ai.usage.input_tokens', span.usage.inputTokens), otlpAttr('gen_ai.usage.output_tokens', span.usage.outputTokens));
101
+ if (span.usage.cachedInputTokens !== undefined) {
102
+ attributes.push(otlpAttr('gen_ai.usage.cached_input_tokens', span.usage.cachedInputTokens));
103
+ }
104
+ }
105
+ if (span.costUsd !== undefined)
106
+ attributes.push(otlpAttr('gen_ai.usage.cost_usd', span.costUsd));
107
+ if (span.timeToFirstTokenMs !== undefined) {
108
+ attributes.push(otlpAttr('gen_ai.server.time_to_first_token_ms', span.timeToFirstTokenMs));
109
+ }
110
+ const out = {
111
+ traceId: span.traceId,
112
+ spanId: span.spanId,
113
+ name: span.name,
114
+ kind: span.kind === 'llm' || span.kind === 'embedding' ? OTLP_CLIENT : OTLP_INTERNAL,
115
+ startTimeUnixNano: msToNano(span.startedAt),
116
+ endTimeUnixNano: msToNano(span.endedAt ?? span.startedAt),
117
+ attributes,
118
+ events: span.events.map((e) => ({
119
+ name: e.name,
120
+ timeUnixNano: msToNano(e.at),
121
+ attributes: Object.entries(e.attributes ?? {}).map(([k, v]) => otlpAttr(k, v)),
122
+ })),
123
+ status: span.status === 'error'
124
+ ? { code: 2, message: span.error ?? '' }
125
+ : { code: span.status === 'ok' ? 1 : 0 },
126
+ };
127
+ if (span.parentSpanId)
128
+ out['parentSpanId'] = span.parentSpanId;
129
+ return out;
130
+ }
131
+ function otlpAttr(key, value) {
132
+ if (typeof value === 'number') {
133
+ return Number.isInteger(value)
134
+ ? { key, value: { intValue: value } }
135
+ : { key, value: { doubleValue: value } };
136
+ }
137
+ if (typeof value === 'boolean')
138
+ return { key, value: { boolValue: value } };
139
+ return { key, value: { stringValue: value } };
140
+ }
141
+ /** OTLP timestamps are nanoseconds since the epoch, as a decimal string. */
142
+ function msToNano(ms) {
143
+ return `${Math.round(ms)}000000`;
144
+ }
145
+ //# sourceMappingURL=exporters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exporters.js","sourceRoot":"","sources":["../../src/telemetry/exporters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * telemetry — granular tracing plus LLM-native metrics (tokens/sec, TTFT,
3
+ * cost-per-request, cache-hit rate), built on ONE span stream so the trace view
4
+ * and the metric view can never disagree.
5
+ */
6
+ export { Tracer, Span } from './Tracer.js';
7
+ export type { TracerOptions, SpanOptions } from './Tracer.js';
8
+ export { parseTraceparent, formatTraceparent } from './traceparent.js';
9
+ export type { TraceContext } from './traceparent.js';
10
+ export { MetricsRegistry, percentile } from './MetricsRegistry.js';
11
+ export type { LlmMetricSnapshot, KindMetricSnapshot, MetricsRegistryOptions, } from './MetricsRegistry.js';
12
+ export { InstrumentedBridge } from './InstrumentedBridge.js';
13
+ export type { InstrumentedBridgeOptions } from './InstrumentedBridge.js';
14
+ export { InMemorySpanExporter, ConsoleSpanExporter, OtlpHttpSpanExporter, toOtlpPayload, toOtlpSpan, } from './exporters.js';
15
+ export type { ConsoleSpanExporterOptions, OtlpHttpSpanExporterOptions, } from './exporters.js';
16
+ export { estimateCostUsd, estimateTokens, resolveRate, DEFAULT_PRICE_BOOK, ANTHROPIC_PRICE_BOOK, EVERMIND_PRICE_BOOK, DEFAULT_CACHE_READ_MULTIPLIER, DEFAULT_CACHE_WRITE_MULTIPLIER, } from './pricing.js';
17
+ export type { ModelRate, PriceBook } from './pricing.js';
18
+ export type { AttributeValue, SpanKind, SpanStatus, SpanEvent, SpanData, SpanExporter, LlmUsage, BridgeCallInfo, } from './types.js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACvE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACnE,YAAY,EACR,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEzE,OAAO,EACH,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACb,UAAU,GACb,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACR,0BAA0B,EAC1B,2BAA2B,GAC9B,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACH,eAAe,EACf,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,6BAA6B,EAC7B,8BAA8B,GACjC,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD,YAAY,EACR,cAAc,EACd,QAAQ,EACR,UAAU,EACV,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,cAAc,GACjB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * telemetry — granular tracing plus LLM-native metrics (tokens/sec, TTFT,
3
+ * cost-per-request, cache-hit rate), built on ONE span stream so the trace view
4
+ * and the metric view can never disagree.
5
+ */
6
+ export { Tracer, Span } from './Tracer.js';
7
+ export { parseTraceparent, formatTraceparent } from './traceparent.js';
8
+ export { MetricsRegistry, percentile } from './MetricsRegistry.js';
9
+ export { InstrumentedBridge } from './InstrumentedBridge.js';
10
+ export { InMemorySpanExporter, ConsoleSpanExporter, OtlpHttpSpanExporter, toOtlpPayload, toOtlpSpan, } from './exporters.js';
11
+ export { estimateCostUsd, estimateTokens, resolveRate, DEFAULT_PRICE_BOOK, ANTHROPIC_PRICE_BOOK, EVERMIND_PRICE_BOOK, DEFAULT_CACHE_READ_MULTIPLIER, DEFAULT_CACHE_WRITE_MULTIPLIER, } from './pricing.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGvE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAOnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,EACH,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACb,UAAU,GACb,MAAM,gBAAgB,CAAC;AAMxB,OAAO,EACH,eAAe,EACf,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,6BAA6B,EAC7B,8BAA8B,GACjC,MAAM,cAAc,CAAC"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * telemetry/pricing.ts — cost-per-request, computed from real token counts.
3
+ *
4
+ * "Cost per request" is an LLM-native metric that cannot be derived from latency
5
+ * or call count: it depends on the model, the input/output split, AND how much of
6
+ * the input was a cache read (cheap) versus a cache write (dear). This module is
7
+ * the ONE place that arithmetic lives, so the bridges, the metrics registry, and
8
+ * the eval harness cannot disagree about what a run cost.
9
+ *
10
+ * Rates are DATA, not code: an enterprise on a negotiated rate card, a partner
11
+ * platform (Bedrock/Vertex bill separately from the first-party API), or a model
12
+ * released after this file was written is handled by passing a {@link PriceBook},
13
+ * never by editing a branch. Unknown models cost `undefined` — reported as an
14
+ * `unpricedCalls` count rather than silently billed at zero, because a silent
15
+ * zero is how cost dashboards lie.
16
+ */
17
+ import type { LlmUsage } from './types.js';
18
+ export interface ModelRate {
19
+ /** USD per 1M input tokens. */
20
+ inputPerMTok: number;
21
+ /** USD per 1M output tokens. */
22
+ outputPerMTok: number;
23
+ /**
24
+ * Multiplier applied to `inputPerMTok` for tokens READ from the provider's
25
+ * prompt cache. Anthropic bills cache reads at 10% of input. Default 0.1.
26
+ */
27
+ cacheReadMultiplier?: number;
28
+ /**
29
+ * Multiplier applied to `inputPerMTok` for tokens WRITTEN to the prompt
30
+ * cache. Anthropic bills a 5-minute cache write at 125% of input. Default 1.25.
31
+ */
32
+ cacheWriteMultiplier?: number;
33
+ }
34
+ /** Model id → rate. Keys match exactly, or by longest prefix (see {@link resolveRate}). */
35
+ export type PriceBook = Record<string, ModelRate>;
36
+ export declare const DEFAULT_CACHE_READ_MULTIPLIER = 0.1;
37
+ export declare const DEFAULT_CACHE_WRITE_MULTIPLIER = 1.25;
38
+ /**
39
+ * First-party Anthropic API rates (USD / 1M tokens), current as of 2026-08-20.
40
+ *
41
+ * Bedrock and Vertex are partner-operated and priced separately — supply those
42
+ * rates via a custom {@link PriceBook} rather than assuming these apply.
43
+ */
44
+ export declare const ANTHROPIC_PRICE_BOOK: PriceBook;
45
+ /**
46
+ * Evermind serves `evermind/<ref>` traffic on-device, so it has no per-token
47
+ * vendor bill. It is priced explicitly at zero rather than left unknown — the
48
+ * whole point of routing to Evermind is that the saving is *measurable*.
49
+ */
50
+ export declare const EVERMIND_PRICE_BOOK: PriceBook;
51
+ export declare const DEFAULT_PRICE_BOOK: PriceBook;
52
+ /**
53
+ * Resolves a model id to a rate: exact match first, then the longest key the
54
+ * model id starts with. Prefix matching is what makes dated snapshots
55
+ * (`claude-opus-4-5@20251101`) and platform-prefixed ids (`anthropic.claude-opus-5`)
56
+ * resolve without a per-variant entry.
57
+ */
58
+ export declare function resolveRate(model: string, book?: PriceBook): ModelRate | undefined;
59
+ /**
60
+ * Cost in USD for one call, or `undefined` when the model is not in the book.
61
+ *
62
+ * A locally-served call (`localCacheHit`) is free by construction — it never
63
+ * reached a provider — so it costs 0 even for an unpriced model.
64
+ */
65
+ export declare function estimateCostUsd(usage: LlmUsage, book?: PriceBook): number | undefined;
66
+ /**
67
+ * Character-based token estimate — the fallback when a provider reports no usage.
68
+ *
69
+ * ~4 characters per token is the standard English approximation. Estimates are
70
+ * flagged (`estimated: true`) all the way through to the metric snapshot so a
71
+ * cost figure never silently mixes measured and guessed numbers.
72
+ */
73
+ export declare function estimateTokens(text: string): number;
74
+ //# sourceMappingURL=pricing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../src/telemetry/pricing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,WAAW,SAAS;IACtB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,2FAA2F;AAC3F,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAElD,eAAO,MAAM,6BAA6B,MAAM,CAAC;AACjD,eAAO,MAAM,8BAA8B,OAAO,CAAC;AAEnD;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAUlC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAGjC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,SAA+D,CAAC;AAEjG;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,SAA8B,GAAG,SAAS,GAAG,SAAS,CAatG;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAE,SAA8B,GAAG,MAAM,GAAG,SAAS,CAiBzG;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD"}