@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 +21 -0
- package/README.md +328 -0
- package/assets/loupe-logo.svg +161 -0
- package/dist/brand.d.ts +7 -0
- package/dist/brand.js +173 -0
- package/dist/client/app.css +3003 -0
- package/dist/client/app.js +39900 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +220 -0
- package/dist/server.d.ts +6 -0
- package/dist/server.js +156 -0
- package/dist/store.d.ts +25 -0
- package/dist/store.js +377 -0
- package/dist/theme.d.ts +6 -0
- package/dist/theme.js +67 -0
- package/dist/types.d.ts +209 -0
- package/dist/types.js +2 -0
- package/dist/ui-build.d.ts +3 -0
- package/dist/ui-build.js +66 -0
- package/dist/ui.d.ts +1 -0
- package/dist/ui.js +25 -0
- package/dist/utils.d.ts +10 -0
- package/dist/utils.js +280 -0
- package/package.json +71 -0
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>
|
package/dist/brand.d.ts
ADDED
|
@@ -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;
|