@tonyclaw/llm-inspector 1.14.3 → 1.14.4

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.
@@ -9,6 +9,7 @@ import { randomUUID } from "crypto";
9
9
  import { exec } from "node:child_process";
10
10
  import { promisify } from "node:util";
11
11
  import { M as McpServer, W as WebStandardStreamableHTTPServerTransport } from "../_libs/modelcontextprotocol__server.mjs";
12
+ import { homedir } from "node:os";
12
13
  import { d as object, _ as _enum, b as string, a as array, u as union, c as boolean, r as record, n as number, g as discriminatedUnion, l as literal, h as _null, k as lazy, e as unknown } from "../_libs/zod.mjs";
13
14
  import "../_libs/tiny-warning.mjs";
14
15
  import "../_libs/tanstack__router-core.mjs";
@@ -31,7 +32,6 @@ import "node:crypto";
31
32
  import "node:assert";
32
33
  import "../_libs/dot-prop.mjs";
33
34
  import "../_libs/env-paths.mjs";
34
- import "node:os";
35
35
  import "../_libs/atomically.mjs";
36
36
  import "../_libs/stubborn-fs.mjs";
37
37
  import "../_libs/stubborn-utils.mjs";
@@ -45,8 +45,8 @@ import "../_libs/debounce-fn.mjs";
45
45
  import "../_libs/mimic-function.mjs";
46
46
  import "../_libs/semver.mjs";
47
47
  import "../_libs/uint8array-extras.mjs";
48
- const appCss = "/assets/index-CzrT_ZB_.css";
49
- const Route$j = createRootRoute({
48
+ const appCss = "/assets/index-o0Ui96SM.css";
49
+ const Route$k = createRootRoute({
50
50
  head: () => ({
51
51
  meta: [
52
52
  { charSet: "utf-8" },
@@ -69,8 +69,8 @@ function RootDocument({ children }) {
69
69
  ] })
70
70
  ] });
71
71
  }
72
- const $$splitComponentImporter = () => import("./index-BbJkYeb-.mjs");
73
- const Route$i = createFileRoute("/")({
72
+ const $$splitComponentImporter = () => import("./index-Cz6oxzsy.mjs");
73
+ const Route$j = createFileRoute("/")({
74
74
  component: lazyRouteComponent($$splitComponentImporter, "component")
75
75
  });
76
76
  const LOG_DIR_ENV = process.env["LOG_DIR"];
@@ -2554,7 +2554,7 @@ async function handleProxy(req) {
2554
2554
  }
2555
2555
  return handleStreamingResponse(upstreamRes, req, startTime, formatHandler, upstreamUrl, log);
2556
2556
  }
2557
- const Route$h = createFileRoute("/proxy/$")({
2557
+ const Route$i = createFileRoute("/proxy/$")({
2558
2558
  server: {
2559
2559
  handlers: {
2560
2560
  GET: ({ request }) => handleProxy(request),
@@ -2566,7 +2566,7 @@ const Route$h = createFileRoute("/proxy/$")({
2566
2566
  }
2567
2567
  }
2568
2568
  });
2569
- const Route$g = createFileRoute("/api/sessions")({
2569
+ const Route$h = createFileRoute("/api/sessions")({
2570
2570
  server: {
2571
2571
  handlers: {
2572
2572
  GET: () => Response.json(getSessions())
@@ -2585,7 +2585,7 @@ const ProviderInputSchema = object({
2585
2585
  apiDocsUrl: string().optional(),
2586
2586
  source: _enum(["company", "personal"]).optional()
2587
2587
  });
2588
- const Route$f = createFileRoute("/api/providers")({
2588
+ const Route$g = createFileRoute("/api/providers")({
2589
2589
  server: {
2590
2590
  handlers: {
2591
2591
  GET: () => {
@@ -2614,7 +2614,7 @@ const Route$f = createFileRoute("/api/providers")({
2614
2614
  }
2615
2615
  }
2616
2616
  });
2617
- const Route$e = createFileRoute("/api/models")({
2617
+ const Route$f = createFileRoute("/api/models")({
2618
2618
  server: {
2619
2619
  handlers: {
2620
2620
  GET: () => Response.json(getModels())
@@ -3124,7 +3124,7 @@ PATCH-style update: only the fields you supply are changed. Returns the updated
3124
3124
  ({ id }) => safeCall(() => testProviderImpl(callApi, id))
3125
3125
  );
3126
3126
  }
3127
- const Route$d = createFileRoute("/api/mcp")({
3127
+ const Route$e = createFileRoute("/api/mcp")({
3128
3128
  server: {
3129
3129
  handlers: {
3130
3130
  // The SDK may issue either POST, GET, or DELETE. TanStack Start only
@@ -3136,7 +3136,7 @@ const Route$d = createFileRoute("/api/mcp")({
3136
3136
  }
3137
3137
  }
3138
3138
  });
3139
- const Route$c = createFileRoute("/api/logs")({
3139
+ const Route$d = createFileRoute("/api/logs")({
3140
3140
  server: {
3141
3141
  handlers: {
3142
3142
  GET: ({ request }) => {
@@ -3162,7 +3162,7 @@ const Route$c = createFileRoute("/api/logs")({
3162
3162
  }
3163
3163
  });
3164
3164
  logger.debug("Health endpoint loaded");
3165
- const Route$b = createFileRoute("/api/health")({
3165
+ const Route$c = createFileRoute("/api/health")({
3166
3166
  server: {
3167
3167
  handlers: {
3168
3168
  GET: () => {
@@ -3176,7 +3176,7 @@ const RuntimeConfigPatchSchema = object({
3176
3176
  }).strict().refine((v) => Object.keys(v).length > 0, {
3177
3177
  message: "At least one field must be provided"
3178
3178
  });
3179
- const Route$a = createFileRoute("/api/config")({
3179
+ const Route$b = createFileRoute("/api/config")({
3180
3180
  server: {
3181
3181
  handlers: {
3182
3182
  GET: () => {
@@ -3205,6 +3205,196 @@ const Route$a = createFileRoute("/api/config")({
3205
3205
  }
3206
3206
  }
3207
3207
  });
3208
+ function isRecord(val) {
3209
+ return val !== null && typeof val === "object" && !Array.isArray(val);
3210
+ }
3211
+ function readJsonSafe(filePath) {
3212
+ try {
3213
+ if (!existsSync(filePath)) return null;
3214
+ const raw = readFileSync(filePath, "utf-8");
3215
+ const parsed = JSON.parse(raw);
3216
+ return isRecord(parsed) ? parsed : null;
3217
+ } catch {
3218
+ return null;
3219
+ }
3220
+ }
3221
+ function getEnvValue(envObj, key) {
3222
+ if (!isRecord(envObj)) return void 0;
3223
+ const val = envObj[key];
3224
+ return typeof val === "string" ? val.trim() : void 0;
3225
+ }
3226
+ function deriveNameFromUrl(url) {
3227
+ try {
3228
+ const hostname = new URL(url).hostname;
3229
+ const parts = hostname.split(".");
3230
+ const domain = parts.length >= 2 ? parts[parts.length - 2] ?? hostname : hostname;
3231
+ return domain.charAt(0).toUpperCase() + domain.slice(1);
3232
+ } catch {
3233
+ return "Imported Provider";
3234
+ }
3235
+ }
3236
+ function detectClaudeCodeProviders() {
3237
+ const home = homedir();
3238
+ const results = [];
3239
+ const globalConfig = readJsonSafe(join(home, ".claude", "settings.json"));
3240
+ const localConfig = readJsonSafe(join(home, ".claude", "settings.local.json"));
3241
+ const mergedEnv = {};
3242
+ if (isRecord(globalConfig)) {
3243
+ const env = globalConfig["env"];
3244
+ if (isRecord(env)) {
3245
+ Object.assign(mergedEnv, env);
3246
+ }
3247
+ }
3248
+ if (isRecord(localConfig)) {
3249
+ const env = localConfig["env"];
3250
+ if (isRecord(env)) {
3251
+ Object.assign(mergedEnv, env);
3252
+ }
3253
+ }
3254
+ const baseUrl = getEnvValue(mergedEnv, "ANTHROPIC_BASE_URL");
3255
+ const authToken = getEnvValue(mergedEnv, "ANTHROPIC_AUTH_TOKEN") ?? getEnvValue(mergedEnv, "ANTHROPIC_API_KEY");
3256
+ if (baseUrl === void 0 || baseUrl === "" || authToken === void 0 || authToken === "") {
3257
+ return results;
3258
+ }
3259
+ const modelSet = /* @__PURE__ */ new Set();
3260
+ const modelKeys = [
3261
+ "ANTHROPIC_MODEL",
3262
+ "ANTHROPIC_DEFAULT_OPUS_MODEL",
3263
+ "ANTHROPIC_DEFAULT_SONNET_MODEL",
3264
+ "ANTHROPIC_DEFAULT_HAIKU_MODEL"
3265
+ ];
3266
+ for (const key of modelKeys) {
3267
+ const val = getEnvValue(mergedEnv, key);
3268
+ if (val !== void 0 && val !== "") modelSet.add(val);
3269
+ }
3270
+ const models = modelSet.size > 0 ? [...modelSet] : ["default"];
3271
+ results.push({
3272
+ name: deriveNameFromUrl(baseUrl),
3273
+ apiKey: normalizeApiKey(authToken),
3274
+ format: "anthropic",
3275
+ anthropicBaseUrl: baseUrl,
3276
+ openaiBaseUrl: "",
3277
+ models,
3278
+ sourceTool: "claude-code",
3279
+ alreadyExists: false
3280
+ // filled in later
3281
+ });
3282
+ return results;
3283
+ }
3284
+ function detectOpenCodeProviders() {
3285
+ const home = homedir();
3286
+ const results = [];
3287
+ const config = readJsonSafe(join(home, ".config", "opencode", "opencode.json"));
3288
+ if (config === null) return results;
3289
+ const auth = readJsonSafe(join(home, ".local", "share", "opencode", "auth.json"));
3290
+ const providersVal = config["provider"];
3291
+ if (!isRecord(providersVal)) {
3292
+ return results;
3293
+ }
3294
+ const providers = providersVal;
3295
+ for (const [providerId, providerObj] of Object.entries(providers)) {
3296
+ if (!isRecord(providerObj)) continue;
3297
+ const options = providerObj["options"];
3298
+ const npm = providerObj["npm"];
3299
+ const npmStr = typeof npm === "string" ? npm : "";
3300
+ const format = npmStr === "@ai-sdk/anthropic" ? "anthropic" : "openai";
3301
+ let baseURL = "";
3302
+ let apiKey = "";
3303
+ if (isRecord(options)) {
3304
+ baseURL = typeof options["baseURL"] === "string" ? options["baseURL"].trim() : "";
3305
+ apiKey = typeof options["apiKey"] === "string" ? options["apiKey"].trim() : "";
3306
+ }
3307
+ if (apiKey === "" && isRecord(auth)) {
3308
+ const cred = auth[providerId];
3309
+ if (isRecord(cred)) {
3310
+ const key = cred["key"];
3311
+ if (typeof key === "string" && key !== "") apiKey = key;
3312
+ }
3313
+ }
3314
+ if (baseURL === "" || apiKey === "") continue;
3315
+ const modelSet = /* @__PURE__ */ new Set();
3316
+ const modelsObj = providerObj["models"];
3317
+ if (isRecord(modelsObj)) {
3318
+ for (const [modelId, modelDef] of Object.entries(modelsObj)) {
3319
+ if (typeof modelDef === "string") {
3320
+ modelSet.add(modelDef);
3321
+ } else if (isRecord(modelDef)) {
3322
+ const name = modelDef["name"];
3323
+ modelSet.add(typeof name === "string" && name !== "" ? name : modelId);
3324
+ } else {
3325
+ modelSet.add(modelId);
3326
+ }
3327
+ }
3328
+ }
3329
+ const models = modelSet.size > 0 ? [...modelSet] : ["default"];
3330
+ results.push({
3331
+ name: providerId,
3332
+ apiKey: normalizeApiKey(apiKey),
3333
+ format,
3334
+ anthropicBaseUrl: format === "anthropic" ? baseURL : "",
3335
+ openaiBaseUrl: format === "openai" ? baseURL : "",
3336
+ models,
3337
+ sourceTool: "opencode",
3338
+ alreadyExists: false
3339
+ });
3340
+ }
3341
+ return results;
3342
+ }
3343
+ function scanExternalProviders() {
3344
+ const warnings = [];
3345
+ let claudeProviders = [];
3346
+ try {
3347
+ claudeProviders = detectClaudeCodeProviders();
3348
+ } catch (err) {
3349
+ warnings.push(`Claude Code: ${err instanceof Error ? err.message : String(err)}`);
3350
+ }
3351
+ let opencodeProviders = [];
3352
+ try {
3353
+ opencodeProviders = detectOpenCodeProviders();
3354
+ } catch (err) {
3355
+ warnings.push(`OpenCode: ${err instanceof Error ? err.message : String(err)}`);
3356
+ }
3357
+ const allProviders = [...claudeProviders, ...opencodeProviders];
3358
+ const filteredProviders = allProviders.filter((p) => {
3359
+ const url = p.anthropicBaseUrl || p.openaiBaseUrl;
3360
+ return !/(?:localhost|127\.0\.0\.1)/.test(url);
3361
+ });
3362
+ let existing = [];
3363
+ try {
3364
+ existing = getProviders();
3365
+ } catch {
3366
+ }
3367
+ for (const ext of filteredProviders) {
3368
+ ext.alreadyExists = existing.some((p) => {
3369
+ if (p.apiKey !== ext.apiKey) return false;
3370
+ if (ext.format === "anthropic") {
3371
+ return (p.anthropicBaseUrl ?? "") === ext.anthropicBaseUrl;
3372
+ }
3373
+ return (p.openaiBaseUrl ?? "") === ext.openaiBaseUrl;
3374
+ });
3375
+ }
3376
+ return { providers: filteredProviders, warnings };
3377
+ }
3378
+ const Route$a = createFileRoute("/api/providers/scan")({
3379
+ server: {
3380
+ handlers: {
3381
+ GET: () => {
3382
+ try {
3383
+ const result = scanExternalProviders();
3384
+ return Response.json({
3385
+ providers: result.providers,
3386
+ warnings: result.warnings
3387
+ });
3388
+ } catch (err) {
3389
+ return Response.json(
3390
+ { error: `Scan failed: ${err instanceof Error ? err.message : String(err)}` },
3391
+ { status: 500 }
3392
+ );
3393
+ }
3394
+ }
3395
+ }
3396
+ }
3397
+ });
3208
3398
  union([string(), object({ providers: unknown() })]);
3209
3399
  const Route$9 = createFileRoute("/api/providers/import")({
3210
3400
  server: {
@@ -4336,50 +4526,55 @@ const Route = createFileRoute("/api/providers/$providerId/test/log")({
4336
4526
  }
4337
4527
  }
4338
4528
  });
4339
- const IndexRoute = Route$i.update({
4529
+ const IndexRoute = Route$j.update({
4340
4530
  id: "/",
4341
4531
  path: "/",
4342
- getParentRoute: () => Route$j
4532
+ getParentRoute: () => Route$k
4343
4533
  });
4344
- const ProxySplatRoute = Route$h.update({
4534
+ const ProxySplatRoute = Route$i.update({
4345
4535
  id: "/proxy/$",
4346
4536
  path: "/proxy/$",
4347
- getParentRoute: () => Route$j
4537
+ getParentRoute: () => Route$k
4348
4538
  });
4349
- const ApiSessionsRoute = Route$g.update({
4539
+ const ApiSessionsRoute = Route$h.update({
4350
4540
  id: "/api/sessions",
4351
4541
  path: "/api/sessions",
4352
- getParentRoute: () => Route$j
4542
+ getParentRoute: () => Route$k
4353
4543
  });
4354
- const ApiProvidersRoute = Route$f.update({
4544
+ const ApiProvidersRoute = Route$g.update({
4355
4545
  id: "/api/providers",
4356
4546
  path: "/api/providers",
4357
- getParentRoute: () => Route$j
4547
+ getParentRoute: () => Route$k
4358
4548
  });
4359
- const ApiModelsRoute = Route$e.update({
4549
+ const ApiModelsRoute = Route$f.update({
4360
4550
  id: "/api/models",
4361
4551
  path: "/api/models",
4362
- getParentRoute: () => Route$j
4552
+ getParentRoute: () => Route$k
4363
4553
  });
4364
- const ApiMcpRoute = Route$d.update({
4554
+ const ApiMcpRoute = Route$e.update({
4365
4555
  id: "/api/mcp",
4366
4556
  path: "/api/mcp",
4367
- getParentRoute: () => Route$j
4557
+ getParentRoute: () => Route$k
4368
4558
  });
4369
- const ApiLogsRoute = Route$c.update({
4559
+ const ApiLogsRoute = Route$d.update({
4370
4560
  id: "/api/logs",
4371
4561
  path: "/api/logs",
4372
- getParentRoute: () => Route$j
4562
+ getParentRoute: () => Route$k
4373
4563
  });
4374
- const ApiHealthRoute = Route$b.update({
4564
+ const ApiHealthRoute = Route$c.update({
4375
4565
  id: "/api/health",
4376
4566
  path: "/api/health",
4377
- getParentRoute: () => Route$j
4567
+ getParentRoute: () => Route$k
4378
4568
  });
4379
- const ApiConfigRoute = Route$a.update({
4569
+ const ApiConfigRoute = Route$b.update({
4380
4570
  id: "/api/config",
4381
4571
  path: "/api/config",
4382
- getParentRoute: () => Route$j
4572
+ getParentRoute: () => Route$k
4573
+ });
4574
+ const ApiProvidersScanRoute = Route$a.update({
4575
+ id: "/scan",
4576
+ path: "/scan",
4577
+ getParentRoute: () => ApiProvidersRoute
4383
4578
  });
4384
4579
  const ApiProvidersImportRoute = Route$9.update({
4385
4580
  id: "/import",
@@ -4464,7 +4659,8 @@ const ApiProvidersProviderIdRouteWithChildren = ApiProvidersProviderIdRoute._add
4464
4659
  const ApiProvidersRouteChildren = {
4465
4660
  ApiProvidersProviderIdRoute: ApiProvidersProviderIdRouteWithChildren,
4466
4661
  ApiProvidersExportRoute,
4467
- ApiProvidersImportRoute
4662
+ ApiProvidersImportRoute,
4663
+ ApiProvidersScanRoute
4468
4664
  };
4469
4665
  const ApiProvidersRouteWithChildren = ApiProvidersRoute._addFileChildren(
4470
4666
  ApiProvidersRouteChildren
@@ -4480,7 +4676,7 @@ const rootRouteChildren = {
4480
4676
  ApiSessionsRoute,
4481
4677
  ProxySplatRoute
4482
4678
  };
4483
- const routeTree = Route$j._addFileChildren(rootRouteChildren)._addFileTypes();
4679
+ const routeTree = Route$k._addFileChildren(rootRouteChildren)._addFileTypes();
4484
4680
  function getRouter() {
4485
4681
  const router2 = createRouter({
4486
4682
  routeTree,
@@ -0,0 +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/$"], "preloads": ["/assets/main-CC0TDCAo.js"], "assets": [] }, "/": { "filePath": "C:/Users/claw/workspace/llm-inspector/src/routes/index.tsx", "assets": [], "preloads": ["/assets/index-5yrjXc3u.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" }, "/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-CC0TDCAo.js" });
2
+ export {
3
+ tsrStartManifest
4
+ };
@@ -38,51 +38,51 @@ const assets = {
38
38
  "/assets/alibaba-TTwafVwX.svg": {
39
39
  "type": "image/svg+xml",
40
40
  "etag": '"171b-6dyV5K8QjiaY35sN9qNprh9zDIs"',
41
- "mtime": "2026-06-11T02:41:57.154Z",
41
+ "mtime": "2026-06-11T03:31:39.286Z",
42
42
  "size": 5915,
43
43
  "path": "../public/assets/alibaba-TTwafVwX.svg"
44
44
  },
45
- "/assets/index-CzrT_ZB_.css": {
45
+ "/assets/index-o0Ui96SM.css": {
46
46
  "type": "text/css; charset=utf-8",
47
- "etag": '"14427-WRw7wI3HmgJe0YWxs6QA9QvDsgk"',
48
- "mtime": "2026-06-11T02:41:57.155Z",
49
- "size": 82983,
50
- "path": "../public/assets/index-CzrT_ZB_.css"
47
+ "etag": '"14568-DGeUZ4EU9c5XMjbSk2O4NNGHJuM"',
48
+ "mtime": "2026-06-11T03:31:39.287Z",
49
+ "size": 83304,
50
+ "path": "../public/assets/index-o0Ui96SM.css"
51
51
  },
52
52
  "/assets/minimax-BPMzvuL-.jpeg": {
53
53
  "type": "image/jpeg",
54
54
  "etag": '"1b06-IwivU89ko5UTMUM1/t7hn4sQK9A"',
55
- "mtime": "2026-06-11T02:41:57.154Z",
55
+ "mtime": "2026-06-11T03:31:39.287Z",
56
56
  "size": 6918,
57
57
  "path": "../public/assets/minimax-BPMzvuL-.jpeg"
58
58
  },
59
- "/assets/main-BcEfx6FM.js": {
59
+ "/assets/main-CC0TDCAo.js": {
60
60
  "type": "text/javascript; charset=utf-8",
61
- "etag": '"50599-Zn3MOTxDKfi6edBd1hMuk0XMH8M"',
62
- "mtime": "2026-06-11T02:41:57.155Z",
61
+ "etag": '"50599-yA/9KX8Mg2eWotoKunAltiZazRk"',
62
+ "mtime": "2026-06-11T03:31:39.288Z",
63
63
  "size": 329113,
64
- "path": "../public/assets/main-BcEfx6FM.js"
64
+ "path": "../public/assets/main-CC0TDCAo.js"
65
65
  },
66
66
  "/assets/zhipuai-BPNAnxo-.svg": {
67
67
  "type": "image/svg+xml",
68
68
  "etag": '"2bf8-hNaLCTi89nOFCsIIfWpP/jrfo0s"',
69
- "mtime": "2026-06-11T02:41:57.154Z",
69
+ "mtime": "2026-06-11T03:31:39.287Z",
70
70
  "size": 11256,
71
71
  "path": "../public/assets/zhipuai-BPNAnxo-.svg"
72
72
  },
73
73
  "/assets/qwen-CONDcHqt.png": {
74
74
  "type": "image/png",
75
75
  "etag": '"572c3-cdJAPaHdOvFCGzuaQjagdgOu6XE"',
76
- "mtime": "2026-06-11T02:41:57.155Z",
76
+ "mtime": "2026-06-11T03:31:39.288Z",
77
77
  "size": 357059,
78
78
  "path": "../public/assets/qwen-CONDcHqt.png"
79
79
  },
80
- "/assets/index-6F6Tf88s.js": {
80
+ "/assets/index-5yrjXc3u.js": {
81
81
  "type": "text/javascript; charset=utf-8",
82
- "etag": '"92434-5hMgYz5Gl8U1bzvC5OsYy/vakXU"',
83
- "mtime": "2026-06-11T02:41:57.155Z",
84
- "size": 599092,
85
- "path": "../public/assets/index-6F6Tf88s.js"
82
+ "etag": '"93a3b-bQxOUGLPCMn+pCON1CPT+YUlLVo"',
83
+ "mtime": "2026-06-11T03:31:39.288Z",
84
+ "size": 604731,
85
+ "path": "../public/assets/index-5yrjXc3u.js"
86
86
  }
87
87
  };
88
88
  function readAsset(id) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tonyclaw/llm-inspector",
3
- "version": "1.14.3",
3
+ "version": "1.14.4",
4
4
  "type": "module",
5
5
  "description": "LLM API proxy inspector — captures and displays requests/responses from AI coding tools in a web UI",
6
6
  "license": "MIT",