@mtharrison/loupe 1.0.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 Matt Harrison
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,328 @@
1
+ <p align="center">
2
+ <img src="./assets/loupe-logo.svg" alt="Loupe" width="320" />
3
+ </p>
4
+
5
+ # @mtharrison/loupe
6
+
7
+ Loupe is a lightweight local tracing dashboard for LLM applications and agent systems. It captures full request and response payloads with tags and hierarchy context, then serves an inspector UI on `127.0.0.1` with no database, no containers, and no persistence.
8
+
9
+ This package is for local development. Traces live in memory and are cleared on restart.
10
+
11
+ ## Why Loupe
12
+
13
+ Most tracing tools assume hosted infrastructure, persistent storage, or production telemetry. Loupe is deliberately smaller:
14
+
15
+ - local-only dashboard
16
+ - in-memory ring buffer
17
+ - full request and response visibility
18
+ - streaming chunk capture and reconstruction
19
+ - hierarchy for sessions, actors, child actors, stages, and guardrails
20
+ - cost rollups when token usage and pricing are available
21
+ - zero external services
22
+
23
+ ## Installation
24
+
25
+ ```sh
26
+ npm install @mtharrison/loupe
27
+ ```
28
+
29
+ ### Requirements
30
+
31
+ - Node.js 18 or newer
32
+
33
+ ## Quick Start
34
+
35
+ Enable tracing:
36
+
37
+ ```bash
38
+ export LLM_TRACE_ENABLED=1
39
+ ```
40
+
41
+ Start the dashboard during app startup, then instrument a model call:
42
+
43
+ ```ts
44
+ import {
45
+ getLocalLLMTracer,
46
+ isTraceEnabled,
47
+ recordError,
48
+ recordInvokeFinish,
49
+ recordInvokeStart,
50
+ type TraceContext,
51
+ } from '@mtharrison/loupe';
52
+
53
+ if (isTraceEnabled()) {
54
+ await getLocalLLMTracer().startServer();
55
+ }
56
+
57
+ const context: TraceContext = {
58
+ sessionId: 'session-123',
59
+ rootSessionId: 'session-123',
60
+ rootActorId: 'support-assistant',
61
+ actorId: 'support-assistant',
62
+ provider: 'openai',
63
+ model: 'gpt-4.1',
64
+ tags: {
65
+ environment: 'local',
66
+ feature: 'customer-support',
67
+ },
68
+ };
69
+
70
+ const request = {
71
+ input: {
72
+ messages: [{ role: 'user', content: 'Summarize the latest notes.' }],
73
+ tools: [],
74
+ },
75
+ options: {},
76
+ };
77
+
78
+ const traceId = recordInvokeStart(context, request);
79
+
80
+ try {
81
+ const response = await model.invoke(request.input, request.options);
82
+ recordInvokeFinish(traceId, response);
83
+ return response;
84
+ } catch (error) {
85
+ recordError(traceId, error);
86
+ throw error;
87
+ }
88
+ ```
89
+
90
+ If you do not call `startServer()` yourself, the dashboard starts lazily on the first recorded trace.
91
+
92
+ When the server starts, Loupe prints the local URL:
93
+
94
+ ```text
95
+ [llm-trace] dashboard: http://127.0.0.1:4319
96
+ ```
97
+
98
+ ## Streaming
99
+
100
+ Streaming works the same way. Loupe records each chunk event, first-chunk latency, and the reconstructed final response.
101
+
102
+ ```ts
103
+ import {
104
+ recordError,
105
+ recordStreamChunk,
106
+ recordStreamFinish,
107
+ recordStreamStart,
108
+ } from '@mtharrison/loupe';
109
+
110
+ const traceId = recordStreamStart(context, request);
111
+
112
+ try {
113
+ for await (const chunk of model.stream(request.input, request.options)) {
114
+ if (chunk?.type === 'finish') {
115
+ recordStreamFinish(traceId, chunk);
116
+ } else {
117
+ recordStreamChunk(traceId, chunk);
118
+ }
119
+
120
+ yield chunk;
121
+ }
122
+ } catch (error) {
123
+ recordError(traceId, error);
124
+ throw error;
125
+ }
126
+ ```
127
+
128
+ ## Trace Context
129
+
130
+ Loupe gets its hierarchy and filters from the context you pass to `recordInvokeStart()` and `recordStreamStart()`.
131
+
132
+ ### Generic context fields
133
+
134
+ - `sessionId`
135
+ - `rootSessionId`
136
+ - `parentSessionId`
137
+ - `rootActorId`
138
+ - `actorId`
139
+ - `actorType`
140
+ - `provider`
141
+ - `model`
142
+ - `tenantId`
143
+ - `userId`
144
+ - `stage`
145
+ - `guardrailType`
146
+ - `guardrailPhase`
147
+ - `tags`
148
+
149
+ Loupe derives higher-level kinds automatically:
150
+
151
+ - `actor`
152
+ - `child-actor`
153
+ - `stage`
154
+ - `guardrail`
155
+
156
+ If you pass `guardrailType` values that start with `input` or `output`, Loupe also derives `guardrailPhase`.
157
+
158
+ ### Compatibility aliases
159
+
160
+ Loupe still accepts the older project-specific field names below so existing integrations do not need to change immediately:
161
+
162
+ | Generic field | Legacy alias |
163
+ | --- | --- |
164
+ | `sessionId` | `chatId` |
165
+ | `rootSessionId` | `rootChatId` |
166
+ | `parentSessionId` | `parentChatId` |
167
+ | `rootActorId` | `topLevelAgentId` |
168
+ | `actorId` | `agentId` |
169
+ | `actorType` | `contextType` |
170
+ | `stage` | `workflowState` |
171
+ | `guardrailType` | `systemType` |
172
+ | `guardrailPhase` | `watchdogPhase` |
173
+
174
+ Loupe normalizes those aliases into the generic model before storing traces.
175
+
176
+ ## What Gets Captured
177
+
178
+ Each trace stores:
179
+
180
+ - request input and options
181
+ - sanitized request headers
182
+ - final response payload
183
+ - stream chunk events and reconstructed stream output
184
+ - usage payload
185
+ - error payloads
186
+ - tags and hierarchy context
187
+ - timings and durations
188
+
189
+ Sensitive headers such as `authorization`, `api-key`, `x-api-key`, and `openai-api-key` are redacted before storage.
190
+
191
+ ## Cost Tracking
192
+
193
+ Loupe calculates per-call and rolled-up cost when your model returns usage in this shape:
194
+
195
+ ```ts
196
+ {
197
+ usage: {
198
+ tokens: {
199
+ prompt: 123,
200
+ completion: 456,
201
+ },
202
+ pricing: {
203
+ prompt: 0.000001,
204
+ completion: 0.000002,
205
+ },
206
+ },
207
+ }
208
+ ```
209
+
210
+ If usage or pricing is missing, Loupe still records the trace, but cost will show as unavailable.
211
+
212
+ ## Dashboard
213
+
214
+ The local dashboard includes:
215
+
216
+ - `Traces` and `Sessions` navigation
217
+ - hierarchy-aware browsing
218
+ - conversation, request, response, context, and stream views
219
+ - formatted and raw JSON modes
220
+ - cost and latency badges
221
+ - live updates over SSE
222
+ - light and dark themes
223
+
224
+ This UI is intended for local inspection, not production monitoring.
225
+
226
+ ## Configuration
227
+
228
+ Environment variables:
229
+
230
+ | Variable | Default | Description |
231
+ | --- | --- | --- |
232
+ | `LLM_TRACE_ENABLED` | `false` | Enables Loupe. |
233
+ | `LLM_TRACE_HOST` | `127.0.0.1` | Host for the local dashboard server. |
234
+ | `LLM_TRACE_PORT` | `4319` | Port for the local dashboard server. |
235
+ | `LLM_TRACE_MAX_TRACES` | `1000` | Maximum number of traces kept in memory. |
236
+ | `LLM_TRACE_UI_HOT_RELOAD` | auto in local interactive dev | Enables UI rebuild + reload while developing the dashboard itself. |
237
+
238
+ Programmatic configuration is also available through `getLocalLLMTracer(config)`.
239
+
240
+ ## API
241
+
242
+ The supported public API is the low-level tracer lifecycle API.
243
+
244
+ ### `isTraceEnabled()`
245
+
246
+ Returns whether tracing is enabled from environment configuration.
247
+
248
+ ### `getLocalLLMTracer(config?)`
249
+
250
+ Returns the singleton tracer instance. This is useful if you want to:
251
+
252
+ - start the dashboard during app startup
253
+ - override host, port, or trace retention
254
+ - access the in-memory store in tests
255
+
256
+ ### `startTraceServer(config?)`
257
+
258
+ Starts the local dashboard server eagerly instead of waiting for the first trace.
259
+
260
+ ### `recordInvokeStart(context, request, config?)`
261
+
262
+ Creates an `invoke` trace and returns a `traceId`.
263
+
264
+ ### `recordInvokeFinish(traceId, response, config?)`
265
+
266
+ Marks an `invoke` trace as complete and stores the response payload.
267
+
268
+ ### `recordStreamStart(context, request, config?)`
269
+
270
+ Creates a `stream` trace and returns a `traceId`.
271
+
272
+ ### `recordStreamChunk(traceId, chunk, config?)`
273
+
274
+ Appends a non-final stream chunk to an existing trace.
275
+
276
+ ### `recordStreamFinish(traceId, chunk, config?)`
277
+
278
+ Stores the final stream payload and marks the trace complete.
279
+
280
+ ### `recordError(traceId, error, config?)`
281
+
282
+ Marks a trace as failed and stores a serialized error payload.
283
+
284
+ All of these functions forward to the singleton tracer returned by `getLocalLLMTracer()`.
285
+
286
+ ## HTTP Endpoints
287
+
288
+ Loupe serves a small local API alongside the UI:
289
+
290
+ - `GET /`
291
+ - `GET /api/traces`
292
+ - `GET /api/traces/:id`
293
+ - `GET /api/hierarchy`
294
+ - `GET /api/events`
295
+ - `DELETE /api/traces`
296
+
297
+ ## Development
298
+
299
+ The package lives in the `llm-trace/` workspace folder, even though the public package name is `@mtharrison/loupe`.
300
+
301
+ ```bash
302
+ cd llm-trace
303
+ npm install
304
+ npm run build
305
+ npm test
306
+ ```
307
+
308
+ Relevant directories:
309
+
310
+ - `src/` runtime, store, server, and HTML bootstrapping
311
+ - `client/src/` React dashboard
312
+ - `scripts/` UI build helpers
313
+ - `test/` package tests
314
+
315
+ ## Non-Goals
316
+
317
+ Loupe is intentionally not:
318
+
319
+ - a production observability platform
320
+ - a multi-process collector
321
+ - a persistent trace database
322
+ - a hosted SaaS product
323
+
324
+ If you need long-term retention, team sharing, or production-grade telemetry, Loupe is the wrong tool.
325
+
326
+ ## License
327
+
328
+ MIT.
@@ -0,0 +1,161 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="52 96 452 184" role="img" aria-labelledby="title desc">
2
+ <title id="title">Loupe</title>
3
+ <desc id="desc">Loupe logo</desc>
4
+ <path d="M80.415779,146.448868
5
+ C71.730598,159.286118 71.913239,171.568710 81.354355,182.992920
6
+ C86.011429,188.628204 82.045731,193.945496 82.456650,200.386292
7
+ C73.116425,195.254272 67.121796,188.315750 63.864403,179.428574
8
+ C53.477222,151.089218 73.408928,122.790794 103.661247,122.677803
9
+ C128.973755,122.583260 154.286880,122.653221 179.599731,122.650383
10
+ C181.551575,122.650169 183.503418,122.650352 186.762604,122.650352
11
+ C183.544434,119.267723 181.172668,116.830498 178.863693,114.335167
12
+ C175.051468,110.215279 174.640289,106.743202 177.556168,103.840134
13
+ C180.619812,100.789955 183.934357,101.081482 187.921692,105.001122
14
+ C194.096695,111.071297 200.235077,117.181656 206.267075,123.393349
15
+ C210.533051,127.786438 210.431000,130.447006 206.051132,134.867966
16
+ C199.956696,141.019577 193.779999,147.089630 187.674850,153.230698
17
+ C184.808502,156.113907 181.746994,157.726715 178.056488,154.754745
18
+ C174.913574,152.223755 174.873245,148.584976 178.096100,144.672333
19
+ C180.500458,141.753403 183.228516,139.101105 185.864365,136.274368
20
+ C184.302902,134.834488 182.733154,135.401794 181.328918,135.399551
21
+ C156.349197,135.359695 131.369095,135.299164 106.389763,135.405853
22
+ C96.403908,135.448502 87.236046,137.827118 80.415779,146.448868
23
+ z" fill="#18314a" />
24
+ <path d="M93.702499,198.130798
25
+ C95.312027,163.145493 131.961700,142.065460 162.811951,160.234619
26
+ C175.566391,167.746292 182.727295,179.302322 184.395432,194.293015
27
+ C187.228333,219.751144 169.398163,239.501587 148.776016,243.655914
28
+ C138.376312,245.750931 128.264633,244.658600 118.689369,239.818863
29
+ C117.224037,239.078232 115.749191,238.356400 113.852058,237.413910
30
+ C106.877029,246.055069 100.003838,254.565643 93.136497,263.080902
31
+ C91.465919,265.152405 89.873383,267.289764 88.142349,269.308868
32
+ C84.302116,273.788177 79.337685,275.351105 73.741341,273.882935
33
+ C68.469627,272.499908 65.291275,268.817291 64.256775,263.374268
34
+ C63.172443,257.669037 65.444687,253.248825 69.696648,249.779984
35
+ C78.597870,242.518158 87.526581,235.283783 96.626434,228.274979
36
+ C99.878777,225.770004 101.175140,223.727371 98.723930,219.686356
37
+ C94.849602,213.299225 93.496826,206.076111 93.702499,198.130798
38
+ M117.635521,175.121597
39
+ C101.979256,188.799164 104.095207,213.413193 119.828331,225.096069
40
+ C133.833496,235.495819 152.743011,233.312485 164.620468,219.589554
41
+ C174.986404,207.612961 173.839233,187.566116 162.119522,175.885422
42
+ C150.416412,164.221283 130.697617,163.663239 117.635521,175.121597
43
+ z" fill="#18314a" />
44
+ <path d="M194.711227,209.865845
45
+ C195.189117,207.178085 195.626083,204.909119 196.166122,202.104950
46
+ C201.296341,203.979767 203.942245,208.105881 206.410355,211.995163
47
+ C215.183945,225.820740 215.627838,240.363556 207.894424,254.596390
48
+ C200.432343,268.329865 188.274872,275.809448 172.602859,276.189819
49
+ C153.970993,276.642029 135.319611,276.322968 116.676857,276.271881
50
+ C111.533104,276.257812 108.773933,273.975586 108.732628,270.032715
51
+ C108.689995,265.963348 111.212189,263.302216 116.291420,263.211792
52
+ C129.603485,262.974792 142.921600,263.083984 156.237289,263.044098
53
+ C161.895782,263.027130 167.574265,263.278625 173.209137,262.897705
54
+ C194.781158,261.439392 206.924927,238.774673 196.049561,220.112289
55
+ C194.106888,216.778625 193.401978,213.807678 194.711227,209.865845
56
+ z" fill="#18314a" />
57
+ <path d="M160.018829,193.524551
58
+ C163.726074,196.097321 164.558716,199.288727 162.641052,202.788101
59
+ C161.064423,205.665115 158.041946,205.868683 155.194061,205.144470
60
+ C152.056152,204.346512 150.738922,201.897949 150.773422,198.795853
61
+ C150.821518,194.474289 154.256226,192.403793 160.018829,193.524551
62
+ z" fill="#18314a" />
63
+ <path d="M135.813202,204.575806
64
+ C132.370819,201.895523 131.663132,198.826340 133.863068,195.587372
65
+ C135.737473,192.827652 138.646393,191.780945 141.756866,193.394409
66
+ C144.898483,195.024048 146.374771,197.855011 145.199570,201.361801
67
+ C143.649033,205.988602 140.000641,205.793228 135.813202,204.575806
68
+ z" fill="#18314a" />
69
+ <path d="M116.472771,203.558167
70
+ C113.984703,200.083527 113.944397,197.013565 116.932442,194.356522
71
+ C119.133163,192.399582 121.700897,192.065170 124.279510,193.686066
72
+ C127.206573,195.525955 128.053360,198.260117 127.095482,201.474182
73
+ C125.887482,205.527466 121.995964,206.380997 116.472771,203.558167
74
+ z" fill="#18314a" />
75
+ <path d="M287.196716,201.005554
76
+ C287.188995,204.830704 287.146637,208.161194 287.183014,211.490814
77
+ C287.218445,214.733566 285.909821,216.390778 282.429016,216.363922
78
+ C270.607574,216.272659 258.784485,216.263443 246.963165,216.361877
79
+ C243.556824,216.390228 242.164169,215.052551 242.201492,211.635651
80
+ C242.363327,196.822510 242.486832,182.007782 242.435822,167.194275
81
+ C242.422104,163.211182 243.678894,161.510147 247.914001,161.610916
82
+ C261.980103,161.945572 260.207184,159.987167 260.317108,173.730133
83
+ C260.379700,181.555527 260.455231,189.385696 260.245209,197.206207
84
+ C260.148041,200.824127 261.650269,201.740128 264.984863,201.746307
85
+ C268.323456,201.752472 269.876404,200.829605 269.732788,197.216797
86
+ C269.241058,184.849777 270.591949,186.765305 280.315552,186.674103
87
+ C286.576569,186.615372 287.137512,187.257034 287.193237,193.517105
88
+ C287.213959,195.848068 287.196503,198.179382 287.196716,201.005554
89
+ z" fill="#18314a" />
90
+ <path d="M293.692596,181.073807
91
+ C292.527649,162.044342 304.018158,160.623306 318.454407,160.348877
92
+ C323.352203,160.255768 328.372742,160.644974 333.097565,162.779755
93
+ C338.394623,165.173050 341.207916,169.087799 341.289978,174.767883
94
+ C341.429321,184.414673 341.424591,194.066452 341.282440,203.713242
95
+ C341.200073,209.303604 337.977875,213.567230 332.740356,215.356476
96
+ C323.851166,218.393250 314.739899,218.439301 305.707581,216.409241
97
+ C297.447388,214.552750 294.006378,210.044769 293.767029,201.523743
98
+ C293.580231,194.874222 293.706085,188.215927 293.692596,181.073807
99
+ M311.942657,182.740601
100
+ C311.864380,187.205307 311.961029,191.682007 311.656586,196.131226
101
+ C311.375305,200.241669 313.187561,201.894501 317.104980,201.936722
102
+ C320.807220,201.976639 323.756714,201.357513 323.662781,196.654526
103
+ C323.566956,191.857956 323.537201,187.054596 323.683289,182.260437
104
+ C323.797791,178.503815 322.679413,176.308609 318.452606,176.178574
105
+ C314.324097,176.051544 311.543518,176.957184 311.942657,182.740601
106
+ z" fill="#18314a" />
107
+ <path d="M349.699585,174.032120
108
+ C349.710205,160.324371 348.717316,161.704956 361.456268,161.684799
109
+ C367.555542,161.675156 368.174744,162.332306 368.201935,168.696640
110
+ C368.240295,177.686584 368.315948,186.678986 368.145081,195.665970
111
+ C368.069855,199.621933 368.867249,201.961487 373.571930,201.868423
112
+ C378.164642,201.777573 379.737549,199.742538 379.683899,195.418579
113
+ C379.566193,185.930527 379.770966,176.437912 379.606812,166.951279
114
+ C379.541718,163.190186 380.673798,161.536865 384.706757,161.612213
115
+ C399.105530,161.881165 397.197205,160.102783 397.305573,174.073288
116
+ C397.376587,183.229279 397.372986,192.387131 397.274292,201.542770
117
+ C397.188293,209.521942 393.833832,214.206284 386.278625,216.172729
118
+ C378.297516,218.250000 370.093170,218.318161 362.074280,216.520554
119
+ C353.085205,214.505463 349.820099,210.134476 349.722565,200.997604
120
+ C349.628418,192.174942 349.700653,183.350510 349.699585,174.032120
121
+ z" fill="#18314a" />
122
+ <path d="M446.980408,166.060257
123
+ C453.024597,175.276978 451.440918,184.762527 448.918610,194.133636
124
+ C448.203339,196.791046 445.635071,198.697372 442.815613,199.652832
125
+ C440.142059,200.558838 437.435089,201.261963 434.561646,201.331589
126
+ C424.689026,201.570740 424.582153,201.603912 424.361755,211.249374
127
+ C424.281464,214.764587 423.139313,216.469849 419.415405,216.364182
128
+ C405.603912,215.972336 406.049103,218.881592 406.098145,203.534470
129
+ C406.134827,192.061935 406.090179,180.589157 406.122040,169.116592
130
+ C406.141449,162.118225 406.597076,161.673782 413.345978,161.664490
131
+ C420.661865,161.654419 427.977753,161.669342 435.293640,161.666672
132
+ C439.598999,161.665100 443.503510,162.762115 446.980408,166.060257
133
+ M430.755707,186.534988
134
+ C434.092316,185.050278 433.936218,182.192184 433.330536,179.384537
135
+ C432.849945,177.156677 431.110077,176.211090 428.851959,176.369034
136
+ C427.291534,176.478165 425.498962,175.878082 424.553925,177.893021
137
+ C422.401001,182.483337 424.922028,186.593628 430.755707,186.534988
138
+ z" fill="#18314a" />
139
+ <path d="M495.611938,161.750061
140
+ C498.973267,163.834503 500.360474,169.635468 498.965057,173.745392
141
+ C497.743469,177.343323 494.680023,176.213135 492.201691,176.302368
142
+ C488.212616,176.445999 484.213623,176.289368 480.220642,176.360397
143
+ C478.149841,176.397232 475.452118,175.850998 475.489624,179.196945
144
+ C475.524902,182.346924 478.124786,181.534103 479.967926,181.634796
145
+ C481.959229,181.743637 483.960938,181.655121 485.958038,181.665527
146
+ C492.430603,181.699234 493.191589,182.441284 493.221771,188.726181
147
+ C493.250732,194.755219 491.938660,196.134811 486.023041,196.224823
148
+ C483.693604,196.260269 481.363190,196.234192 479.033203,196.229675
149
+ C477.038422,196.225815 475.302094,196.506958 475.420288,199.145889
150
+ C475.525848,201.502731 477.168610,201.655807 478.930084,201.658356
151
+ C483.756470,201.665344 488.590637,201.836929 493.406982,201.618729
152
+ C497.817078,201.418945 499.470764,203.462143 499.242462,207.600250
153
+ C499.160034,209.094254 499.201813,210.594971 499.180817,212.092529
154
+ C499.141174,214.919464 497.816284,216.356247 494.877380,216.344284
155
+ C483.893402,216.299652 472.908997,216.285614 461.925110,216.334091
156
+ C458.948273,216.347229 457.713074,214.948196 457.715820,212.081223
157
+ C457.730469,196.769989 457.751984,181.458542 457.682770,166.147568
158
+ C457.666626,162.577301 459.490784,161.616760 462.697815,161.644287
159
+ C473.514771,161.737167 484.332855,161.697235 495.611938,161.750061
160
+ z" fill="#18314a" />
161
+ </svg>
@@ -0,0 +1,7 @@
1
+ export declare const BRAND_NAME = "Loupe";
2
+ export declare const BRAND_SUBTITLE = "Lightweight LLM Tracing for Dev";
3
+ export declare const BRAND_MARK_VIEWBOX = "52 96 164 184";
4
+ export declare const BRAND_WORDMARK_VIEWBOX = "238 158 266 62";
5
+ export declare const BRAND_MARK_PATHS: readonly ["M80.415779,146.448868\n C71.730598,159.286118 71.913239,171.568710 81.354355,182.992920\n C86.011429,188.628204 82.045731,193.945496 82.456650,200.386292\n C73.116425,195.254272 67.121796,188.315750 63.864403,179.428574\n C53.477222,151.089218 73.408928,122.790794 103.661247,122.677803\n C128.973755,122.583260 154.286880,122.653221 179.599731,122.650383\n C181.551575,122.650169 183.503418,122.650352 186.762604,122.650352\n C183.544434,119.267723 181.172668,116.830498 178.863693,114.335167\n C175.051468,110.215279 174.640289,106.743202 177.556168,103.840134\n C180.619812,100.789955 183.934357,101.081482 187.921692,105.001122\n C194.096695,111.071297 200.235077,117.181656 206.267075,123.393349\n C210.533051,127.786438 210.431000,130.447006 206.051132,134.867966\n C199.956696,141.019577 193.779999,147.089630 187.674850,153.230698\n C184.808502,156.113907 181.746994,157.726715 178.056488,154.754745\n C174.913574,152.223755 174.873245,148.584976 178.096100,144.672333\n C180.500458,141.753403 183.228516,139.101105 185.864365,136.274368\n C184.302902,134.834488 182.733154,135.401794 181.328918,135.399551\n C156.349197,135.359695 131.369095,135.299164 106.389763,135.405853\n C96.403908,135.448502 87.236046,137.827118 80.415779,146.448868\n z", "M93.702499,198.130798\n C95.312027,163.145493 131.961700,142.065460 162.811951,160.234619\n C175.566391,167.746292 182.727295,179.302322 184.395432,194.293015\n C187.228333,219.751144 169.398163,239.501587 148.776016,243.655914\n C138.376312,245.750931 128.264633,244.658600 118.689369,239.818863\n C117.224037,239.078232 115.749191,238.356400 113.852058,237.413910\n C106.877029,246.055069 100.003838,254.565643 93.136497,263.080902\n C91.465919,265.152405 89.873383,267.289764 88.142349,269.308868\n C84.302116,273.788177 79.337685,275.351105 73.741341,273.882935\n C68.469627,272.499908 65.291275,268.817291 64.256775,263.374268\n C63.172443,257.669037 65.444687,253.248825 69.696648,249.779984\n C78.597870,242.518158 87.526581,235.283783 96.626434,228.274979\n C99.878777,225.770004 101.175140,223.727371 98.723930,219.686356\n C94.849602,213.299225 93.496826,206.076111 93.702499,198.130798\n M117.635521,175.121597\n C101.979256,188.799164 104.095207,213.413193 119.828331,225.096069\n C133.833496,235.495819 152.743011,233.312485 164.620468,219.589554\n C174.986404,207.612961 173.839233,187.566116 162.119522,175.885422\n C150.416412,164.221283 130.697617,163.663239 117.635521,175.121597\n z", "M194.711227,209.865845\n C195.189117,207.178085 195.626083,204.909119 196.166122,202.104950\n C201.296341,203.979767 203.942245,208.105881 206.410355,211.995163\n C215.183945,225.820740 215.627838,240.363556 207.894424,254.596390\n C200.432343,268.329865 188.274872,275.809448 172.602859,276.189819\n C153.970993,276.642029 135.319611,276.322968 116.676857,276.271881\n C111.533104,276.257812 108.773933,273.975586 108.732628,270.032715\n C108.689995,265.963348 111.212189,263.302216 116.291420,263.211792\n C129.603485,262.974792 142.921600,263.083984 156.237289,263.044098\n C161.895782,263.027130 167.574265,263.278625 173.209137,262.897705\n C194.781158,261.439392 206.924927,238.774673 196.049561,220.112289\n C194.106888,216.778625 193.401978,213.807678 194.711227,209.865845\n z", "M160.018829,193.524551\n C163.726074,196.097321 164.558716,199.288727 162.641052,202.788101\n C161.064423,205.665115 158.041946,205.868683 155.194061,205.144470\n C152.056152,204.346512 150.738922,201.897949 150.773422,198.795853\n C150.821518,194.474289 154.256226,192.403793 160.018829,193.524551\n z", "M135.813202,204.575806\n C132.370819,201.895523 131.663132,198.826340 133.863068,195.587372\n C135.737473,192.827652 138.646393,191.780945 141.756866,193.394409\n C144.898483,195.024048 146.374771,197.855011 145.199570,201.361801\n C143.649033,205.988602 140.000641,205.793228 135.813202,204.575806\n z", "M116.472771,203.558167\n C113.984703,200.083527 113.944397,197.013565 116.932442,194.356522\n C119.133163,192.399582 121.700897,192.065170 124.279510,193.686066\n C127.206573,195.525955 128.053360,198.260117 127.095482,201.474182\n C125.887482,205.527466 121.995964,206.380997 116.472771,203.558167\n z"];
6
+ export declare const BRAND_WORDMARK_PATHS: readonly ["M287.196716,201.005554\n C287.188995,204.830704 287.146637,208.161194 287.183014,211.490814\n C287.218445,214.733566 285.909821,216.390778 282.429016,216.363922\n C270.607574,216.272659 258.784485,216.263443 246.963165,216.361877\n C243.556824,216.390228 242.164169,215.052551 242.201492,211.635651\n C242.363327,196.822510 242.486832,182.007782 242.435822,167.194275\n C242.422104,163.211182 243.678894,161.510147 247.914001,161.610916\n C261.980103,161.945572 260.207184,159.987167 260.317108,173.730133\n C260.379700,181.555527 260.455231,189.385696 260.245209,197.206207\n C260.148041,200.824127 261.650269,201.740128 264.984863,201.746307\n C268.323456,201.752472 269.876404,200.829605 269.732788,197.216797\n C269.241058,184.849777 270.591949,186.765305 280.315552,186.674103\n C286.576569,186.615372 287.137512,187.257034 287.193237,193.517105\n C287.213959,195.848068 287.196503,198.179382 287.196716,201.005554\n z", "M293.692596,181.073807\n C292.527649,162.044342 304.018158,160.623306 318.454407,160.348877\n C323.352203,160.255768 328.372742,160.644974 333.097565,162.779755\n C338.394623,165.173050 341.207916,169.087799 341.289978,174.767883\n C341.429321,184.414673 341.424591,194.066452 341.282440,203.713242\n C341.200073,209.303604 337.977875,213.567230 332.740356,215.356476\n C323.851166,218.393250 314.739899,218.439301 305.707581,216.409241\n C297.447388,214.552750 294.006378,210.044769 293.767029,201.523743\n C293.580231,194.874222 293.706085,188.215927 293.692596,181.073807\n M311.942657,182.740601\n C311.864380,187.205307 311.961029,191.682007 311.656586,196.131226\n C311.375305,200.241669 313.187561,201.894501 317.104980,201.936722\n C320.807220,201.976639 323.756714,201.357513 323.662781,196.654526\n C323.566956,191.857956 323.537201,187.054596 323.683289,182.260437\n C323.797791,178.503815 322.679413,176.308609 318.452606,176.178574\n C314.324097,176.051544 311.543518,176.957184 311.942657,182.740601\n z", "M349.699585,174.032120\n C349.710205,160.324371 348.717316,161.704956 361.456268,161.684799\n C367.555542,161.675156 368.174744,162.332306 368.201935,168.696640\n C368.240295,177.686584 368.315948,186.678986 368.145081,195.665970\n C368.069855,199.621933 368.867249,201.961487 373.571930,201.868423\n C378.164642,201.777573 379.737549,199.742538 379.683899,195.418579\n C379.566193,185.930527 379.770966,176.437912 379.606812,166.951279\n C379.541718,163.190186 380.673798,161.536865 384.706757,161.612213\n C399.105530,161.881165 397.197205,160.102783 397.305573,174.073288\n C397.376587,183.229279 397.372986,192.387131 397.274292,201.542770\n C397.188293,209.521942 393.833832,214.206284 386.278625,216.172729\n C378.297516,218.250000 370.093170,218.318161 362.074280,216.520554\n C353.085205,214.505463 349.820099,210.134476 349.722565,200.997604\n C349.628418,192.174942 349.700653,183.350510 349.699585,174.032120\n z", "M446.980408,166.060257\n C453.024597,175.276978 451.440918,184.762527 448.918610,194.133636\n C448.203339,196.791046 445.635071,198.697372 442.815613,199.652832\n C440.142059,200.558838 437.435089,201.261963 434.561646,201.331589\n C424.689026,201.570740 424.582153,201.603912 424.361755,211.249374\n C424.281464,214.764587 423.139313,216.469849 419.415405,216.364182\n C405.603912,215.972336 406.049103,218.881592 406.098145,203.534470\n C406.134827,192.061935 406.090179,180.589157 406.122040,169.116592\n C406.141449,162.118225 406.597076,161.673782 413.345978,161.664490\n C420.661865,161.654419 427.977753,161.669342 435.293640,161.666672\n C439.598999,161.665100 443.503510,162.762115 446.980408,166.060257\n M430.755707,186.534988\n C434.092316,185.050278 433.936218,182.192184 433.330536,179.384537\n C432.849945,177.156677 431.110077,176.211090 428.851959,176.369034\n C427.291534,176.478165 425.498962,175.878082 424.553925,177.893021\n C422.401001,182.483337 424.922028,186.593628 430.755707,186.534988\n z", "M495.611938,161.750061\n C498.973267,163.834503 500.360474,169.635468 498.965057,173.745392\n C497.743469,177.343323 494.680023,176.213135 492.201691,176.302368\n C488.212616,176.445999 484.213623,176.289368 480.220642,176.360397\n C478.149841,176.397232 475.452118,175.850998 475.489624,179.196945\n C475.524902,182.346924 478.124786,181.534103 479.967926,181.634796\n C481.959229,181.743637 483.960938,181.655121 485.958038,181.665527\n C492.430603,181.699234 493.191589,182.441284 493.221771,188.726181\n C493.250732,194.755219 491.938660,196.134811 486.023041,196.224823\n C483.693604,196.260269 481.363190,196.234192 479.033203,196.229675\n C477.038422,196.225815 475.302094,196.506958 475.420288,199.145889\n C475.525848,201.502731 477.168610,201.655807 478.930084,201.658356\n C483.756470,201.665344 488.590637,201.836929 493.406982,201.618729\n C497.817078,201.418945 499.470764,203.462143 499.242462,207.600250\n C499.160034,209.094254 499.201813,210.594971 499.180817,212.092529\n C499.141174,214.919464 497.816284,216.356247 494.877380,216.344284\n C483.893402,216.299652 472.908997,216.285614 461.925110,216.334091\n C458.948273,216.347229 457.713074,214.948196 457.715820,212.081223\n C457.730469,196.769989 457.751984,181.458542 457.682770,166.147568\n C457.666626,162.577301 459.490784,161.616760 462.697815,161.644287\n C473.514771,161.737167 484.332855,161.697235 495.611938,161.750061\n z"];
7
+ export declare function renderBrandMarkSvg(fill?: string): string;