@tonyclaw/llm-inspector 1.19.3 → 1.20.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.
Files changed (33) hide show
  1. package/.output/cli.js +478 -14
  2. package/.output/nitro.json +1 -1
  3. package/.output/public/assets/{CompareDrawer-AMCFfwDw.js → CompareDrawer-DaEfZjXJ.js} +1 -1
  4. package/.output/public/assets/{ProxyViewerContainer-Bi1QXDYo.js → ProxyViewerContainer-RhHgw8Ej.js} +10 -10
  5. package/.output/public/assets/{ReplayDialog-C1x2-73A.js → ReplayDialog-BjQGoECv.js} +1 -1
  6. package/.output/public/assets/{RequestAnatomy-CBNqMbxo.js → RequestAnatomy-QU9eugVN.js} +1 -1
  7. package/.output/public/assets/{ResponseView-BsBxYW8b.js → ResponseView-aYiH9vL2.js} +1 -1
  8. package/.output/public/assets/{StreamingChunkSequence-BjX20-9R.js → StreamingChunkSequence-Cpx_Qp8w.js} +1 -1
  9. package/.output/public/assets/_sessionId-BloLpBNK.js +1 -0
  10. package/.output/public/assets/index-BKzkybBt.js +1 -0
  11. package/.output/public/assets/{index-Bqi9RAGS.css → index-DUZVFAL8.css} +1 -1
  12. package/.output/public/assets/{json-viewer-CyJ5nYhX.js → json-viewer-iMGYFtiP.js} +1 -1
  13. package/.output/public/assets/{main-DpODUL6C.js → main-DLMLYxyQ.js} +7 -7
  14. package/.output/server/{_sessionId-DJ9Eab2q.mjs → _sessionId-B-zUQeOo.mjs} +2 -2
  15. package/.output/server/_ssr/{CompareDrawer-CZjtgISX.mjs → CompareDrawer-CX6uQvQB.mjs} +3 -3
  16. package/.output/server/_ssr/{ProxyViewerContainer-PjfpTAwC.mjs → ProxyViewerContainer-DsQWgvwt.mjs} +77 -10
  17. package/.output/server/_ssr/{ReplayDialog-OiEK8Sbt.mjs → ReplayDialog-BrMgVKb9.mjs} +4 -4
  18. package/.output/server/_ssr/{RequestAnatomy-DN7d-srT.mjs → RequestAnatomy-ll7Vbnl7.mjs} +2 -2
  19. package/.output/server/_ssr/{ResponseView-7iJG8mU_.mjs → ResponseView-CdloAejU.mjs} +3 -3
  20. package/.output/server/_ssr/{StreamingChunkSequence-DgtV9nLT.mjs → StreamingChunkSequence-C9LC9S8C.mjs} +3 -3
  21. package/.output/server/_ssr/{index-YZwFhEEr.mjs → index-DBs4Nc1G.mjs} +2 -2
  22. package/.output/server/_ssr/index.mjs +2 -2
  23. package/.output/server/_ssr/{json-viewer-0GHTWO7g.mjs → json-viewer-l1tDAk7X.mjs} +2 -2
  24. package/.output/server/_ssr/{router-DCW8d1sw.mjs → router-O1ouXZtT.mjs} +4 -4
  25. package/.output/server/{_tanstack-start-manifest_v-CxTbhyJ_.mjs → _tanstack-start-manifest_v-OkvTTh2H.mjs} +1 -1
  26. package/.output/server/index.mjs +69 -69
  27. package/package.json +1 -1
  28. package/src/assets/favicon.svg +13 -0
  29. package/src/cli/doctor.ts +530 -0
  30. package/src/cli.ts +6 -0
  31. package/src/components/ui/crab-logo.tsx +50 -0
  32. package/.output/public/assets/_sessionId-DE0J5YHU.js +0 -1
  33. package/.output/public/assets/index-DqgTchf4.js +0 -1
@@ -1,6 +1,6 @@
1
1
  import { j as jsxRuntimeExports } from "./_libs/react.mjs";
2
- import { P as ProxyViewerContainer } from "./_ssr/ProxyViewerContainer-PjfpTAwC.mjs";
3
- import { R as Route$j } from "./_ssr/router-DCW8d1sw.mjs";
2
+ import { P as ProxyViewerContainer } from "./_ssr/ProxyViewerContainer-DsQWgvwt.mjs";
3
+ import { R as Route$j } from "./_ssr/router-O1ouXZtT.mjs";
4
4
  import "./_libs/jszip.mjs";
5
5
  import "./_libs/modelcontextprotocol__server.mjs";
6
6
  import "./_libs/swr.mjs";
@@ -1,7 +1,7 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { g as getLogFormatAdapter, r as resolveLogFormat, a as getConversationId, c as cn, B as Badge, f as formatTokens } from "./ProxyViewerContainer-PjfpTAwC.mjs";
3
- import { JsonViewerFromString } from "./json-viewer-0GHTWO7g.mjs";
4
- import "./router-DCW8d1sw.mjs";
2
+ import { g as getLogFormatAdapter, r as resolveLogFormat, a as getConversationId, c as cn, B as Badge, f as formatTokens } from "./ProxyViewerContainer-DsQWgvwt.mjs";
3
+ import { JsonViewerFromString } from "./json-viewer-l1tDAk7X.mjs";
4
+ import "./router-O1ouXZtT.mjs";
5
5
  import "../_libs/modelcontextprotocol__server.mjs";
6
6
  import "../_libs/jszip.mjs";
7
7
  import { X, J as Rows3, K as Columns2, m as Minus, P as Plus, l as Pencil, f as ChevronRight, N as Equal, C as Check, a as Copy } from "../_libs/lucide-react.mjs";
@@ -1,5 +1,5 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports, a as React } from "../_libs/react.mjs";
2
- import { C as CapturedLogSchema, D as DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS, a as RuntimeConfigSchema, r as requestFormatForPath, c as createPendingProviderTestResults, P as ProviderTestResultsSchema, d as createFailedProviderTestResults, M as MAX_SLOW_RESPONSE_THRESHOLD_SECONDS, g as getSessionPath, e as ProviderConfigSchema, s as stripClaudeCodeBillingHeader, p as parseOpenAIResponse, O as OpenAIRequestSchema, A as AnthropicResponseSchema$1, b as AnthropicRequestSchema } from "./router-DCW8d1sw.mjs";
2
+ import { C as CapturedLogSchema, D as DEFAULT_SLOW_RESPONSE_THRESHOLD_SECONDS, a as RuntimeConfigSchema, r as requestFormatForPath, c as createPendingProviderTestResults, P as ProviderTestResultsSchema, d as createFailedProviderTestResults, M as MAX_SLOW_RESPONSE_THRESHOLD_SECONDS, g as getSessionPath, e as ProviderConfigSchema, s as stripClaudeCodeBillingHeader, p as parseOpenAIResponse, O as OpenAIRequestSchema, A as AnthropicResponseSchema$1, b as AnthropicRequestSchema } from "./router-O1ouXZtT.mjs";
3
3
  import { u as useSWR, a as useSWRConfig } from "../_libs/swr.mjs";
4
4
  import { J as JSZip } from "../_libs/jszip.mjs";
5
5
  import { c as clsx } from "../_libs/clsx.mjs";
@@ -275,7 +275,7 @@ function getStatusCategory(status) {
275
275
  if (status >= 500) return "server_error";
276
276
  return "pending";
277
277
  }
278
- const version = "1.19.3";
278
+ const version = "1.20.0";
279
279
  const packageJson = {
280
280
  version
281
281
  };
@@ -1343,27 +1343,27 @@ function useCopyFeedback(text) {
1343
1343
  return { copied, copy };
1344
1344
  }
1345
1345
  const LazyCompareDrawer = reactExports.lazy(
1346
- () => import("./CompareDrawer-CZjtgISX.mjs").then((m) => ({ default: m.CompareDrawer }))
1346
+ () => import("./CompareDrawer-CX6uQvQB.mjs").then((m) => ({ default: m.CompareDrawer }))
1347
1347
  );
1348
1348
  const LazyReplayDialog = reactExports.lazy(
1349
- () => import("./ReplayDialog-OiEK8Sbt.mjs").then((m) => ({ default: m.ReplayDialog }))
1349
+ () => import("./ReplayDialog-BrMgVKb9.mjs").then((m) => ({ default: m.ReplayDialog }))
1350
1350
  );
1351
1351
  const LazyRequestAnatomy = reactExports.lazy(
1352
- () => import("./RequestAnatomy-DN7d-srT.mjs").then((m) => ({ default: m.RequestAnatomy }))
1352
+ () => import("./RequestAnatomy-ll7Vbnl7.mjs").then((m) => ({ default: m.RequestAnatomy }))
1353
1353
  );
1354
1354
  const LazyResponseView = reactExports.lazy(
1355
- () => import("./ResponseView-7iJG8mU_.mjs").then((m) => ({ default: m.ResponseView }))
1355
+ () => import("./ResponseView-CdloAejU.mjs").then((m) => ({ default: m.ResponseView }))
1356
1356
  );
1357
1357
  const LazyStreamingChunkSequence = reactExports.lazy(
1358
- () => import("./StreamingChunkSequence-DgtV9nLT.mjs").then((m) => ({
1358
+ () => import("./StreamingChunkSequence-C9LC9S8C.mjs").then((m) => ({
1359
1359
  default: m.StreamingChunkSequence
1360
1360
  }))
1361
1361
  );
1362
1362
  const LazyJsonViewer = reactExports.lazy(
1363
- () => import("./json-viewer-0GHTWO7g.mjs").then((m) => ({ default: m.JsonViewer }))
1363
+ () => import("./json-viewer-l1tDAk7X.mjs").then((m) => ({ default: m.JsonViewer }))
1364
1364
  );
1365
1365
  const LazyJsonViewerFromString = reactExports.lazy(
1366
- () => import("./json-viewer-0GHTWO7g.mjs").then((m) => ({ default: m.JsonViewerFromString }))
1366
+ () => import("./json-viewer-l1tDAk7X.mjs").then((m) => ({ default: m.JsonViewerFromString }))
1367
1367
  );
1368
1368
  const HIGHLIGHT_DURATION_MS = 1200;
1369
1369
  const MAX_HIGHLIGHT_ATTEMPTS = 12;
@@ -3154,7 +3154,74 @@ function CrabLogo({ className }) {
3154
3154
  /* @__PURE__ */ jsxRuntimeExports.jsx("line", { x1: "6.5", y1: "16", x2: "4.5", y2: "19.5" }),
3155
3155
  /* @__PURE__ */ jsxRuntimeExports.jsx("line", { x1: "9", y1: "17.5", x2: "8", y2: "20.5" }),
3156
3156
  /* @__PURE__ */ jsxRuntimeExports.jsx("line", { x1: "15", y1: "17.5", x2: "16", y2: "20.5" }),
3157
- /* @__PURE__ */ jsxRuntimeExports.jsx("line", { x1: "17.5", y1: "16", x2: "19.5", y2: "19.5" })
3157
+ /* @__PURE__ */ jsxRuntimeExports.jsx("line", { x1: "17.5", y1: "16", x2: "19.5", y2: "19.5" }),
3158
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("g", { children: [
3159
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
3160
+ "path",
3161
+ {
3162
+ d: "M5.6 17.7 L8.4 15.4 L10.8 18 C9.1 18.9 7.2 18.8 5.6 17.7 Z",
3163
+ fill: "#2f6b3f",
3164
+ stroke: "none",
3165
+ opacity: "0.95"
3166
+ }
3167
+ ),
3168
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
3169
+ "path",
3170
+ {
3171
+ d: "M6.9 17.5 L8.4 16 L9.8 17.7 C8.9 18.1 7.8 18.1 6.9 17.5 Z",
3172
+ fill: "#6fb36f",
3173
+ stroke: "none",
3174
+ opacity: "0.95"
3175
+ }
3176
+ ),
3177
+ /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M8.4 16 L8.4 18.4", stroke: "#d6b45f", strokeWidth: "0.34" }),
3178
+ /* @__PURE__ */ jsxRuntimeExports.jsx("circle", { cx: "10.6", cy: "17.75", r: "0.36", fill: "#c2412d", stroke: "none" })
3179
+ ] }),
3180
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("g", { children: [
3181
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
3182
+ "path",
3183
+ {
3184
+ d: "M8 16.5 L11.9 13.6 L15.8 16.8 C13.3 18.4 10.4 18.3 8 16.5 Z",
3185
+ fill: "#2f6b3f",
3186
+ stroke: "none",
3187
+ opacity: "0.97"
3188
+ }
3189
+ ),
3190
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
3191
+ "path",
3192
+ {
3193
+ d: "M9.8 16.3 L11.9 14.4 L14.3 16.5 C12.8 17.4 11.3 17.4 9.8 16.3 Z",
3194
+ fill: "#6fb36f",
3195
+ stroke: "none",
3196
+ opacity: "0.95"
3197
+ }
3198
+ ),
3199
+ /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M11.9 14.3 L11.9 17.8", stroke: "#d6b45f", strokeWidth: "0.42" }),
3200
+ /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M9.8 16.3 C11.2 15.8 12.9 15.9 14.3 16.5", stroke: "#9fca78", strokeWidth: "0.36" }),
3201
+ /* @__PURE__ */ jsxRuntimeExports.jsx("circle", { cx: "15.6", cy: "16.75", r: "0.43", fill: "#c2412d", stroke: "none" })
3202
+ ] }),
3203
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("g", { children: [
3204
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
3205
+ "path",
3206
+ {
3207
+ d: "M13.6 18.1 L16.2 15.7 L18.5 18.2 C17.1 19.1 15.2 19 13.6 18.1 Z",
3208
+ fill: "#2f6b3f",
3209
+ stroke: "none",
3210
+ opacity: "0.95"
3211
+ }
3212
+ ),
3213
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
3214
+ "path",
3215
+ {
3216
+ d: "M14.8 17.9 L16.2 16.3 L17.5 18 C16.6 18.4 15.7 18.4 14.8 17.9 Z",
3217
+ fill: "#6fb36f",
3218
+ stroke: "none",
3219
+ opacity: "0.95"
3220
+ }
3221
+ ),
3222
+ /* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M16.2 16.3 L16.2 18.6", stroke: "#d6b45f", strokeWidth: "0.34" }),
3223
+ /* @__PURE__ */ jsxRuntimeExports.jsx("circle", { cx: "18.35", cy: "18.15", r: "0.36", fill: "#c2412d", stroke: "none" })
3224
+ ] })
3158
3225
  ]
3159
3226
  }
3160
3227
  );
@@ -1,10 +1,10 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { D as Dialog, b as DialogContent, d as DialogHeader, e as DialogTitle, T as Tabs, h as TabsList, i as TabsTrigger, j as TabsContent, k as TooltipProvider, l as Tooltip, m as TooltipTrigger, n as TooltipContent, o as Button } from "./ProxyViewerContainer-PjfpTAwC.mjs";
3
- import { ResponseView } from "./ResponseView-7iJG8mU_.mjs";
4
- import "./router-DCW8d1sw.mjs";
2
+ import { D as Dialog, b as DialogContent, d as DialogHeader, e as DialogTitle, T as Tabs, h as TabsList, i as TabsTrigger, j as TabsContent, k as TooltipProvider, l as Tooltip, m as TooltipTrigger, n as TooltipContent, o as Button } from "./ProxyViewerContainer-DsQWgvwt.mjs";
3
+ import { ResponseView } from "./ResponseView-CdloAejU.mjs";
4
+ import "./router-O1ouXZtT.mjs";
5
5
  import "../_libs/modelcontextprotocol__server.mjs";
6
6
  import "../_libs/jszip.mjs";
7
- import "./json-viewer-0GHTWO7g.mjs";
7
+ import "./json-viewer-l1tDAk7X.mjs";
8
8
  import { s as RotateCcw } from "../_libs/lucide-react.mjs";
9
9
  import { d as object, c as boolean, n as number, b as string } from "../_libs/zod.mjs";
10
10
  import "../_libs/swr.mjs";
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { k as TooltipProvider, f as formatTokens, c as cn, l as Tooltip, m as TooltipTrigger, n as TooltipContent } from "./ProxyViewerContainer-PjfpTAwC.mjs";
3
- import "./router-DCW8d1sw.mjs";
2
+ import { k as TooltipProvider, f as formatTokens, c as cn, l as Tooltip, m as TooltipTrigger, n as TooltipContent } from "./ProxyViewerContainer-DsQWgvwt.mjs";
3
+ import "./router-O1ouXZtT.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import { Q as Info } from "../_libs/lucide-react.mjs";
@@ -1,7 +1,7 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { g as getLogFormatAdapter, f as formatTokens, c as cn, p as getStatusCategory, B as Badge, s as safeJsonValue } from "./ProxyViewerContainer-PjfpTAwC.mjs";
3
- import { JsonViewer } from "./json-viewer-0GHTWO7g.mjs";
4
- import "./router-DCW8d1sw.mjs";
2
+ import { g as getLogFormatAdapter, f as formatTokens, c as cn, p as getStatusCategory, B as Badge, s as safeJsonValue } from "./ProxyViewerContainer-DsQWgvwt.mjs";
3
+ import { JsonViewer } from "./json-viewer-l1tDAk7X.mjs";
4
+ import "./router-O1ouXZtT.mjs";
5
5
  import "../_libs/modelcontextprotocol__server.mjs";
6
6
  import "../_libs/jszip.mjs";
7
7
  import { Z as Zap, i as TriangleAlert, V as CircleStop, Y as Brain, b as ChevronDown, f as ChevronRight, _ as Terminal } from "../_libs/lucide-react.mjs";
@@ -1,7 +1,7 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { k as TooltipProvider, l as Tooltip, m as TooltipTrigger, B as Badge, n as TooltipContent } from "./ProxyViewerContainer-PjfpTAwC.mjs";
3
- import { JsonViewer } from "./json-viewer-0GHTWO7g.mjs";
4
- import "./router-DCW8d1sw.mjs";
2
+ import { k as TooltipProvider, l as Tooltip, m as TooltipTrigger, B as Badge, n as TooltipContent } from "./ProxyViewerContainer-DsQWgvwt.mjs";
3
+ import { JsonViewer } from "./json-viewer-l1tDAk7X.mjs";
4
+ import "./router-O1ouXZtT.mjs";
5
5
  import "../_libs/modelcontextprotocol__server.mjs";
6
6
  import "../_libs/jszip.mjs";
7
7
  import { b as ChevronDown, f as ChevronRight, L as LoaderCircle } from "../_libs/lucide-react.mjs";
@@ -1,6 +1,6 @@
1
- import { P as ProxyViewerContainer } from "./ProxyViewerContainer-PjfpTAwC.mjs";
1
+ import { P as ProxyViewerContainer } from "./ProxyViewerContainer-DsQWgvwt.mjs";
2
2
  import "../_libs/react.mjs";
3
- import "./router-DCW8d1sw.mjs";
3
+ import "./router-O1ouXZtT.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import "../_libs/swr.mjs";
@@ -198,7 +198,7 @@ function getResponse() {
198
198
  return event.res;
199
199
  }
200
200
  async function getStartManifest(matchedRoutes) {
201
- const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-CxTbhyJ_.mjs");
201
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-OkvTTh2H.mjs");
202
202
  const startManifest = tsrStartManifest();
203
203
  const rootRoute = startManifest.routes[rootRouteId] = startManifest.routes[rootRouteId] || {};
204
204
  rootRoute.assets = rootRoute.assets || [];
@@ -767,7 +767,7 @@ let entriesPromise;
767
767
  let baseManifestPromise;
768
768
  let cachedFinalManifestPromise;
769
769
  async function loadEntries() {
770
- const routerEntry = await import("./router-DCW8d1sw.mjs").then((n) => n.f);
770
+ const routerEntry = await import("./router-O1ouXZtT.mjs").then((n) => n.f);
771
771
  const startEntry = await import("./start-HYkvq4Ni.mjs");
772
772
  return { startEntry, routerEntry };
773
773
  }
@@ -1,6 +1,6 @@
1
1
  import { r as reactExports, j as jsxRuntimeExports } from "../_libs/react.mjs";
2
- import { q as parseJsonText, c as cn, k as TooltipProvider, l as Tooltip, m as TooltipTrigger, n as TooltipContent } from "./ProxyViewerContainer-PjfpTAwC.mjs";
3
- import "./router-DCW8d1sw.mjs";
2
+ import { q as parseJsonText, c as cn, k as TooltipProvider, l as Tooltip, m as TooltipTrigger, n as TooltipContent } from "./ProxyViewerContainer-DsQWgvwt.mjs";
3
+ import "./router-O1ouXZtT.mjs";
4
4
  import "../_libs/modelcontextprotocol__server.mjs";
5
5
  import "../_libs/jszip.mjs";
6
6
  import { C as Check, a as Copy, b as ChevronDown, f as ChevronRight, q as ChevronsDown } from "../_libs/lucide-react.mjs";
@@ -48,8 +48,8 @@ import "../_libs/debounce-fn.mjs";
48
48
  import "../_libs/mimic-function.mjs";
49
49
  import "../_libs/semver.mjs";
50
50
  import "../_libs/uint8array-extras.mjs";
51
- const faviconSvg = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2064%2064'%20role='img'%20aria-label='LLM%20Inspector'%3e%3crect%20width='64'%20height='64'%20rx='14'%20fill='%23111827'%20/%3e%3cg%20fill='none'%20stroke='%23f59e0b'%20stroke-width='4.2'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20fill='%23f59e0b'%20d='M15%2036c0-11%207-18%2017-18s17%207%2017%2018c0%208-7%2013-17%2013s-17-5-17-13z'%20/%3e%3cpath%20d='M16%2031c-6-5-12-3-12%204%200%205%206%206%2011%202'%20/%3e%3cpath%20d='M48%2031c6-5%2012-3%2012%204%200%205-6%206-11%202'%20/%3e%3cpath%20d='M27%2019l-3-7'%20/%3e%3cpath%20d='M37%2019l3-7'%20/%3e%3cpath%20d='M19%2045l-6%209'%20/%3e%3cpath%20d='M27%2048l-3%209'%20/%3e%3cpath%20d='M37%2048l3%209'%20/%3e%3cpath%20d='M45%2045l6%209'%20/%3e%3c/g%3e%3ccircle%20cx='24'%20cy='11'%20r='3.2'%20fill='%23f59e0b'%20/%3e%3ccircle%20cx='40'%20cy='11'%20r='3.2'%20fill='%23f59e0b'%20/%3e%3ccircle%20cx='25'%20cy='34'%20r='2.1'%20fill='%23111827'%20/%3e%3ccircle%20cx='39'%20cy='34'%20r='2.1'%20fill='%23111827'%20/%3e%3c/svg%3e";
52
- const appCss = "/assets/index-Bqi9RAGS.css";
51
+ const faviconSvg = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2064%2064'%20role='img'%20aria-label='LLM%20Inspector'%3e%3crect%20width='64'%20height='64'%20rx='14'%20fill='%23111827'%20/%3e%3cg%20fill='none'%20stroke='%23f59e0b'%20stroke-width='4.2'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20fill='%23f59e0b'%20d='M15%2036c0-11%207-18%2017-18s17%207%2017%2018c0%208-7%2013-17%2013s-17-5-17-13z'%20/%3e%3cpath%20d='M16%2031c-6-5-12-3-12%204%200%205%206%206%2011%202'%20/%3e%3cpath%20d='M48%2031c6-5%2012-3%2012%204%200%205-6%206-11%202'%20/%3e%3cpath%20d='M27%2019l-3-7'%20/%3e%3cpath%20d='M37%2019l3-7'%20/%3e%3cpath%20d='M19%2045l-6%209'%20/%3e%3cpath%20d='M27%2048l-3%209'%20/%3e%3cpath%20d='M37%2048l3%209'%20/%3e%3cpath%20d='M45%2045l6%209'%20/%3e%3c/g%3e%3cpath%20d='M14%2047l9-8%208%209c-5%203.5-12%203-17-1z'%20fill='%232f6b3f'%20opacity='.95'%20/%3e%3cpath%20d='M18%2046l5-5%205%206c-3%201.6-7%201.4-10-1z'%20fill='%236fb36f'%20opacity='.95'%20/%3e%3cpath%20d='M23%2041v10'%20fill='none'%20stroke='%23d6b45f'%20stroke-width='1.6'%20stroke-linecap='round'%20/%3e%3ccircle%20cx='31'%20cy='48'%20r='1.8'%20fill='%23c2412d'%20/%3e%3cpath%20d='M24%2044l13-11%2014%2013c-8%205.8-18%205.3-27-2z'%20fill='%232f6b3f'%20opacity='.97'%20/%3e%3cpath%20d='M30%2043l7-7%209%209c-5%202.7-11%202.5-16-2z'%20fill='%236fb36f'%20opacity='.95'%20/%3e%3cpath%20d='M37%2036v14'%20fill='none'%20stroke='%23d6b45f'%20stroke-width='2'%20stroke-linecap='round'%20/%3e%3cpath%20d='M30%2043c5-2%2011-1.5%2016%202'%20fill='none'%20stroke='%239fca78'%20stroke-width='1.8'%20stroke-linecap='round'%20/%3e%3ccircle%20cx='51'%20cy='46'%20r='2'%20fill='%23c2412d'%20/%3e%3cpath%20d='M40%2050l8-8%207%208c-4.2%203.2-10%203-15%200z'%20fill='%232f6b3f'%20opacity='.95'%20/%3e%3cpath%20d='M43%2049l5-5%204.5%205.5c-3%201.5-6%201.2-9.5-.5z'%20fill='%236fb36f'%20opacity='.95'%20/%3e%3cpath%20d='M48%2044v9'%20fill='none'%20stroke='%23d6b45f'%20stroke-width='1.5'%20stroke-linecap='round'%20/%3e%3ccircle%20cx='55'%20cy='50'%20r='1.7'%20fill='%23c2412d'%20/%3e%3ccircle%20cx='24'%20cy='11'%20r='3.2'%20fill='%23f59e0b'%20/%3e%3ccircle%20cx='40'%20cy='11'%20r='3.2'%20fill='%23f59e0b'%20/%3e%3ccircle%20cx='25'%20cy='34'%20r='2.1'%20fill='%23111827'%20/%3e%3ccircle%20cx='39'%20cy='34'%20r='2.1'%20fill='%23111827'%20/%3e%3c/svg%3e";
52
+ const appCss = "/assets/index-DUZVFAL8.css";
53
53
  const Route$l = createRootRoute({
54
54
  head: () => ({
55
55
  meta: [
@@ -76,7 +76,7 @@ function RootDocument({ children }) {
76
76
  ] })
77
77
  ] });
78
78
  }
79
- const $$splitComponentImporter$1 = () => import("./index-YZwFhEEr.mjs");
79
+ const $$splitComponentImporter$1 = () => import("./index-DBs4Nc1G.mjs");
80
80
  const Route$k = createFileRoute("/")({
81
81
  component: lazyRouteComponent($$splitComponentImporter$1, "component")
82
82
  });
@@ -119,7 +119,7 @@ function decodeSessionIdFromPath(encoded) {
119
119
  function getSessionPath(sessionId) {
120
120
  return `/session/${encodeSessionIdForPath(sessionId)}`;
121
121
  }
122
- const $$splitComponentImporter = () => import("../_sessionId-DJ9Eab2q.mjs");
122
+ const $$splitComponentImporter = () => import("../_sessionId-B-zUQeOo.mjs");
123
123
  const Route$j = createFileRoute("/session/$sessionId")({
124
124
  component: lazyRouteComponent($$splitComponentImporter, "component"),
125
125
  parseParams: (params) => ({
@@ -1,4 +1,4 @@
1
- const tsrStartManifest = () => ({ "routes": { "__root__": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/__root.tsx", "children": ["/", "/api/config", "/api/health", "/api/logs", "/api/mcp", "/api/models", "/api/providers", "/api/sessions", "/proxy/$", "/session/$sessionId"], "preloads": ["/assets/main-DpODUL6C.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-DqgTchf4.js", "/assets/ProxyViewerContainer-Bi1QXDYo.js"] }, "/api/config": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/config.ts", "children": ["/api/config/paths"] }, "/api/health": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/health.ts" }, "/api/logs": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/logs.ts", "children": ["/api/logs/$id", "/api/logs/stream"] }, "/api/mcp": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/mcp.ts" }, "/api/models": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/models.ts" }, "/api/providers": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.ts", "children": ["/api/providers/$providerId", "/api/providers/export", "/api/providers/import", "/api/providers/scan"] }, "/api/sessions": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/sessions.ts" }, "/proxy/$": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/proxy/$.ts" }, "/session/$sessionId": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/session/$sessionId.tsx", "assets": [], "preloads": ["/assets/_sessionId-DE0J5YHU.js", "/assets/ProxyViewerContainer-Bi1QXDYo.js"] }, "/api/config/paths": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/config.paths.ts" }, "/api/logs/$id": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/logs.$id.ts", "children": ["/api/logs/$id/chunks", "/api/logs/$id/replay"] }, "/api/logs/stream": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/logs.stream.ts" }, "/api/providers/$providerId": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.$providerId.ts", "children": ["/api/providers/$providerId/test"] }, "/api/providers/export": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.export.ts" }, "/api/providers/import": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.import.ts" }, "/api/providers/scan": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.scan.ts" }, "/api/logs/$id/chunks": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/logs.$id.chunks.ts" }, "/api/logs/$id/replay": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/logs.$id.replay.ts" }, "/api/providers/$providerId/test": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.$providerId.test.ts", "children": ["/api/providers/$providerId/test/log"] }, "/api/providers/$providerId/test/log": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.$providerId.test.log.ts" } }, "clientEntry": "/assets/main-DpODUL6C.js" });
1
+ const tsrStartManifest = () => ({ "routes": { "__root__": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/__root.tsx", "children": ["/", "/api/config", "/api/health", "/api/logs", "/api/mcp", "/api/models", "/api/providers", "/api/sessions", "/proxy/$", "/session/$sessionId"], "preloads": ["/assets/main-DLMLYxyQ.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-BKzkybBt.js", "/assets/ProxyViewerContainer-RhHgw8Ej.js"] }, "/api/config": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/config.ts", "children": ["/api/config/paths"] }, "/api/health": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/health.ts" }, "/api/logs": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/logs.ts", "children": ["/api/logs/$id", "/api/logs/stream"] }, "/api/mcp": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/mcp.ts" }, "/api/models": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/models.ts" }, "/api/providers": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.ts", "children": ["/api/providers/$providerId", "/api/providers/export", "/api/providers/import", "/api/providers/scan"] }, "/api/sessions": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/sessions.ts" }, "/proxy/$": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/proxy/$.ts" }, "/session/$sessionId": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/session/$sessionId.tsx", "assets": [], "preloads": ["/assets/_sessionId-BloLpBNK.js", "/assets/ProxyViewerContainer-RhHgw8Ej.js"] }, "/api/config/paths": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/config.paths.ts" }, "/api/logs/$id": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/logs.$id.ts", "children": ["/api/logs/$id/chunks", "/api/logs/$id/replay"] }, "/api/logs/stream": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/logs.stream.ts" }, "/api/providers/$providerId": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.$providerId.ts", "children": ["/api/providers/$providerId/test"] }, "/api/providers/export": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.export.ts" }, "/api/providers/import": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.import.ts" }, "/api/providers/scan": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.scan.ts" }, "/api/logs/$id/chunks": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/logs.$id.chunks.ts" }, "/api/logs/$id/replay": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/logs.$id.replay.ts" }, "/api/providers/$providerId/test": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.$providerId.test.ts", "children": ["/api/providers/$providerId/test/log"] }, "/api/providers/$providerId/test/log": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/api/providers.$providerId.test.log.ts" } }, "clientEntry": "/assets/main-DLMLYxyQ.js" });
2
2
  export {
3
3
  tsrStartManifest
4
4
  };
@@ -38,107 +38,107 @@ const assets = {
38
38
  "/assets/alibaba-TTwafVwX.svg": {
39
39
  "type": "image/svg+xml",
40
40
  "etag": '"171b-6dyV5K8QjiaY35sN9qNprh9zDIs"',
41
- "mtime": "2026-06-18T09:12:22.689Z",
41
+ "mtime": "2026-06-20T00:50:36.226Z",
42
42
  "size": 5915,
43
43
  "path": "../public/assets/alibaba-TTwafVwX.svg"
44
44
  },
45
- "/assets/index-Bqi9RAGS.css": {
46
- "type": "text/css; charset=utf-8",
47
- "etag": '"177a9-QMoW/GsYu1jERI0JyFHA9CiB/o0"',
48
- "mtime": "2026-06-18T09:12:22.692Z",
49
- "size": 96169,
50
- "path": "../public/assets/index-Bqi9RAGS.css"
51
- },
52
- "/assets/json-viewer-CyJ5nYhX.js": {
53
- "type": "text/javascript; charset=utf-8",
54
- "etag": '"1e651-ydiPWeNOTBxab1yp6aZhKmFLc9w"',
55
- "mtime": "2026-06-18T09:12:22.693Z",
56
- "size": 124497,
57
- "path": "../public/assets/json-viewer-CyJ5nYhX.js"
58
- },
59
- "/assets/index-DqgTchf4.js": {
45
+ "/assets/index-BKzkybBt.js": {
60
46
  "type": "text/javascript; charset=utf-8",
61
- "etag": '"74-dCXgAHXAyb0J55GEgjrhbbUgzbc"',
62
- "mtime": "2026-06-18T09:12:22.692Z",
47
+ "etag": '"74-UKYg7v7pdMJGpY8l8NZyhnJ2u0Q"',
48
+ "mtime": "2026-06-20T00:50:36.226Z",
63
49
  "size": 116,
64
- "path": "../public/assets/index-DqgTchf4.js"
50
+ "path": "../public/assets/index-BKzkybBt.js"
65
51
  },
66
- "/assets/CompareDrawer-AMCFfwDw.js": {
52
+ "/assets/CompareDrawer-DaEfZjXJ.js": {
67
53
  "type": "text/javascript; charset=utf-8",
68
- "etag": '"4a1f-JS26/3WLLROR+e/DYSYJ+f7WiQc"',
69
- "mtime": "2026-06-18T09:12:22.693Z",
54
+ "etag": '"4a1f-37ilcIB3uwSLFBXJNBsm4srG3Cc"',
55
+ "mtime": "2026-06-20T00:50:36.227Z",
70
56
  "size": 18975,
71
- "path": "../public/assets/CompareDrawer-AMCFfwDw.js"
57
+ "path": "../public/assets/CompareDrawer-DaEfZjXJ.js"
58
+ },
59
+ "/assets/index-DUZVFAL8.css": {
60
+ "type": "text/css; charset=utf-8",
61
+ "etag": '"1789c-0/l5ZIGy+tNwwf4kwZ1H/2P3kfw"',
62
+ "mtime": "2026-06-20T00:50:36.226Z",
63
+ "size": 96412,
64
+ "path": "../public/assets/index-DUZVFAL8.css"
65
+ },
66
+ "/assets/minimax-BPMzvuL-.jpeg": {
67
+ "type": "image/jpeg",
68
+ "etag": '"1b06-IwivU89ko5UTMUM1/t7hn4sQK9A"',
69
+ "mtime": "2026-06-20T00:50:36.226Z",
70
+ "size": 6918,
71
+ "path": "../public/assets/minimax-BPMzvuL-.jpeg"
72
72
  },
73
- "/assets/ReplayDialog-C1x2-73A.js": {
73
+ "/assets/ReplayDialog-BjQGoECv.js": {
74
74
  "type": "text/javascript; charset=utf-8",
75
- "etag": '"11c0-0BdsMUTzMbm8+qZrAg7WR+cZJxI"',
76
- "mtime": "2026-06-18T09:12:22.692Z",
75
+ "etag": '"11c0-DPZ4iKsJsdKQk+GTMhXUmFBHY6A"',
76
+ "mtime": "2026-06-20T00:50:36.227Z",
77
77
  "size": 4544,
78
- "path": "../public/assets/ReplayDialog-C1x2-73A.js"
78
+ "path": "../public/assets/ReplayDialog-BjQGoECv.js"
79
79
  },
80
- "/assets/StreamingChunkSequence-BjX20-9R.js": {
80
+ "/assets/ResponseView-aYiH9vL2.js": {
81
81
  "type": "text/javascript; charset=utf-8",
82
- "etag": '"d81-wlp9qhgGUggvmv1Zxwa60zK7kv0"',
83
- "mtime": "2026-06-18T09:12:22.693Z",
84
- "size": 3457,
85
- "path": "../public/assets/StreamingChunkSequence-BjX20-9R.js"
82
+ "etag": '"6e91-P7hpuUo4EEblUWZLCSgkX7iIauk"',
83
+ "mtime": "2026-06-20T00:50:36.227Z",
84
+ "size": 28305,
85
+ "path": "../public/assets/ResponseView-aYiH9vL2.js"
86
86
  },
87
- "/assets/ResponseView-BsBxYW8b.js": {
87
+ "/assets/json-viewer-iMGYFtiP.js": {
88
88
  "type": "text/javascript; charset=utf-8",
89
- "etag": '"6e91-dcQF6OvaeJlJzeXqydW9EwIelj8"',
90
- "mtime": "2026-06-18T09:12:22.693Z",
91
- "size": 28305,
92
- "path": "../public/assets/ResponseView-BsBxYW8b.js"
89
+ "etag": '"1e651-O8VMc/GqtsPUHanLc6OI4L+iG6A"',
90
+ "mtime": "2026-06-20T00:50:36.227Z",
91
+ "size": 124497,
92
+ "path": "../public/assets/json-viewer-iMGYFtiP.js"
93
93
  },
94
- "/assets/minimax-BPMzvuL-.jpeg": {
95
- "type": "image/jpeg",
96
- "etag": '"1b06-IwivU89ko5UTMUM1/t7hn4sQK9A"',
97
- "mtime": "2026-06-18T09:12:22.692Z",
98
- "size": 6918,
99
- "path": "../public/assets/minimax-BPMzvuL-.jpeg"
94
+ "/assets/RequestAnatomy-QU9eugVN.js": {
95
+ "type": "text/javascript; charset=utf-8",
96
+ "etag": '"142a-cK+LQXqVU4PpY8HLQ9pxhI6zNn4"',
97
+ "mtime": "2026-06-20T00:50:36.227Z",
98
+ "size": 5162,
99
+ "path": "../public/assets/RequestAnatomy-QU9eugVN.js"
100
+ },
101
+ "/assets/StreamingChunkSequence-Cpx_Qp8w.js": {
102
+ "type": "text/javascript; charset=utf-8",
103
+ "etag": '"d81-8rV/rvQQVae+wS6nUchljhz8vEk"',
104
+ "mtime": "2026-06-20T00:50:36.227Z",
105
+ "size": 3457,
106
+ "path": "../public/assets/StreamingChunkSequence-Cpx_Qp8w.js"
100
107
  },
101
108
  "/assets/zhipuai-BPNAnxo-.svg": {
102
109
  "type": "image/svg+xml",
103
110
  "etag": '"2bf8-hNaLCTi89nOFCsIIfWpP/jrfo0s"',
104
- "mtime": "2026-06-18T09:12:22.692Z",
111
+ "mtime": "2026-06-20T00:50:36.226Z",
105
112
  "size": 11256,
106
113
  "path": "../public/assets/zhipuai-BPNAnxo-.svg"
107
114
  },
108
- "/assets/main-DpODUL6C.js": {
115
+ "/assets/_sessionId-BloLpBNK.js": {
109
116
  "type": "text/javascript; charset=utf-8",
110
- "etag": '"50e93-I+c4WJ0eqNgllRdD+TE3/FNhdZw"',
111
- "mtime": "2026-06-18T09:12:22.692Z",
112
- "size": 331411,
113
- "path": "../public/assets/main-DpODUL6C.js"
117
+ "etag": '"d2-EI9Biaib5hB2C/gxBzBJ1lNwtPI"',
118
+ "mtime": "2026-06-20T00:50:36.226Z",
119
+ "size": 210,
120
+ "path": "../public/assets/_sessionId-BloLpBNK.js"
121
+ },
122
+ "/assets/main-DLMLYxyQ.js": {
123
+ "type": "text/javascript; charset=utf-8",
124
+ "etag": '"51388-Wow2QJ41/NUH/FvBVlRV/w4kckI"',
125
+ "mtime": "2026-06-20T00:50:36.226Z",
126
+ "size": 332680,
127
+ "path": "../public/assets/main-DLMLYxyQ.js"
114
128
  },
115
129
  "/assets/qwen-CONDcHqt.png": {
116
130
  "type": "image/png",
117
131
  "etag": '"572c3-cdJAPaHdOvFCGzuaQjagdgOu6XE"',
118
- "mtime": "2026-06-18T09:12:22.692Z",
132
+ "mtime": "2026-06-20T00:50:36.226Z",
119
133
  "size": 357059,
120
134
  "path": "../public/assets/qwen-CONDcHqt.png"
121
135
  },
122
- "/assets/RequestAnatomy-CBNqMbxo.js": {
136
+ "/assets/ProxyViewerContainer-RhHgw8Ej.js": {
123
137
  "type": "text/javascript; charset=utf-8",
124
- "etag": '"142a-OyCo/ZrZQjHOESLPR2QHdrDlSfY"',
125
- "mtime": "2026-06-18T09:12:22.693Z",
126
- "size": 5162,
127
- "path": "../public/assets/RequestAnatomy-CBNqMbxo.js"
128
- },
129
- "/assets/ProxyViewerContainer-Bi1QXDYo.js": {
130
- "type": "text/javascript; charset=utf-8",
131
- "etag": '"76fed-g89dZRBRI198ItonW8vjcw/8gls"',
132
- "mtime": "2026-06-18T09:12:22.692Z",
133
- "size": 487405,
134
- "path": "../public/assets/ProxyViewerContainer-Bi1QXDYo.js"
135
- },
136
- "/assets/_sessionId-DE0J5YHU.js": {
137
- "type": "text/javascript; charset=utf-8",
138
- "etag": '"d2-yTX8F3UFbyfcaXlKoGMrmxJtX0U"',
139
- "mtime": "2026-06-18T09:12:22.692Z",
140
- "size": 210,
141
- "path": "../public/assets/_sessionId-DE0J5YHU.js"
138
+ "etag": '"77558-qCK8wPoq/Ji6Ahm7wVf0Yzht3us"',
139
+ "mtime": "2026-06-20T00:50:36.227Z",
140
+ "size": 488792,
141
+ "path": "../public/assets/ProxyViewerContainer-RhHgw8Ej.js"
142
142
  }
143
143
  };
144
144
  function readAsset(id) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tonyclaw/llm-inspector",
3
- "version": "1.19.3",
3
+ "version": "1.20.0",
4
4
  "type": "module",
5
5
  "description": "Local LLM API inspector for AI coding tools, with real-time request and response capture.",
6
6
  "license": "MIT",
@@ -11,6 +11,19 @@
11
11
  <path d="M37 48l3 9" />
12
12
  <path d="M45 45l6 9" />
13
13
  </g>
14
+ <path d="M14 47l9-8 8 9c-5 3.5-12 3-17-1z" fill="#2f6b3f" opacity=".95" />
15
+ <path d="M18 46l5-5 5 6c-3 1.6-7 1.4-10-1z" fill="#6fb36f" opacity=".95" />
16
+ <path d="M23 41v10" fill="none" stroke="#d6b45f" stroke-width="1.6" stroke-linecap="round" />
17
+ <circle cx="31" cy="48" r="1.8" fill="#c2412d" />
18
+ <path d="M24 44l13-11 14 13c-8 5.8-18 5.3-27-2z" fill="#2f6b3f" opacity=".97" />
19
+ <path d="M30 43l7-7 9 9c-5 2.7-11 2.5-16-2z" fill="#6fb36f" opacity=".95" />
20
+ <path d="M37 36v14" fill="none" stroke="#d6b45f" stroke-width="2" stroke-linecap="round" />
21
+ <path d="M30 43c5-2 11-1.5 16 2" fill="none" stroke="#9fca78" stroke-width="1.8" stroke-linecap="round" />
22
+ <circle cx="51" cy="46" r="2" fill="#c2412d" />
23
+ <path d="M40 50l8-8 7 8c-4.2 3.2-10 3-15 0z" fill="#2f6b3f" opacity=".95" />
24
+ <path d="M43 49l5-5 4.5 5.5c-3 1.5-6 1.2-9.5-.5z" fill="#6fb36f" opacity=".95" />
25
+ <path d="M48 44v9" fill="none" stroke="#d6b45f" stroke-width="1.5" stroke-linecap="round" />
26
+ <circle cx="55" cy="50" r="1.7" fill="#c2412d" />
14
27
  <circle cx="24" cy="11" r="3.2" fill="#f59e0b" />
15
28
  <circle cx="40" cy="11" r="3.2" fill="#f59e0b" />
16
29
  <circle cx="25" cy="34" r="2.1" fill="#111827" />