@kizenapps/cli 0.9.0 → 0.10.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 (129) hide show
  1. package/dist/index.js +101 -33
  2. package/dist/index.js.map +1 -1
  3. package/dist/viewer/assets/AppDetailPage-ObugMPkn.js +1 -0
  4. package/dist/viewer/assets/BootstrapContext-CEWgv2oI.js +1 -0
  5. package/dist/viewer/assets/Card-BSwG5koM.js +1 -0
  6. package/dist/viewer/assets/ConfigurationPage-SnFNzZgJ.js +1 -0
  7. package/dist/viewer/assets/CredentialsContext-BLZX6RwF.js +1 -0
  8. package/dist/viewer/assets/DevSidebar-BiROAoKF.js +1 -0
  9. package/dist/viewer/assets/SandboxPage-BFVVe-i3.js +1 -0
  10. package/dist/viewer/assets/SidebarContext-Byo6PYOF.js +1 -0
  11. package/dist/viewer/assets/VersionsPage-DOd2Hv8M.js +1 -0
  12. package/dist/viewer/assets/configStorage-Bb-A9Nvj.js +14 -0
  13. package/dist/viewer/assets/{fa-core-BU3ZZt7W.js → fa-core-mHW_3JUd.js} +1 -1
  14. package/dist/viewer/assets/index-B-4D4w_w.js +5 -0
  15. package/dist/viewer/assets/index-D6Un_G7k.css +2 -0
  16. package/dist/viewer/assets/{react-C90crogl.js → react-D_K8ni3_.js} +1 -1
  17. package/dist/viewer/assets/validIcons-TcFXfn-E.js +1 -0
  18. package/dist/viewer/index.html +8 -5
  19. package/package.json +5 -1
  20. package/dist/chromium-extension/manifest.json +0 -17
  21. package/dist/chromium-extension/rules.json +0 -17
  22. package/dist/chunk-4OYGMEFM.js +0 -3675
  23. package/dist/chunk-4OYGMEFM.js.map +0 -1
  24. package/dist/chunk-4Z6S6LWP.js +0 -6134
  25. package/dist/chunk-4Z6S6LWP.js.map +0 -1
  26. package/dist/chunk-5WPGAZLP.js +0 -6136
  27. package/dist/chunk-5WPGAZLP.js.map +0 -1
  28. package/dist/chunk-6XGFZ4W5.js +0 -3673
  29. package/dist/chunk-6XGFZ4W5.js.map +0 -1
  30. package/dist/chunk-HJPLDI45.js +0 -6134
  31. package/dist/chunk-HJPLDI45.js.map +0 -1
  32. package/dist/chunk-KMKDY2I6.js +0 -46
  33. package/dist/chunk-KMKDY2I6.js.map +0 -1
  34. package/dist/chunk-LSHHXCC6.js +0 -3639
  35. package/dist/chunk-LSHHXCC6.js.map +0 -1
  36. package/dist/chunk-NNDSADQG.js +0 -3641
  37. package/dist/chunk-NNDSADQG.js.map +0 -1
  38. package/dist/chunk-SEGVTWSK.js +0 -44
  39. package/dist/chunk-SEGVTWSK.js.map +0 -1
  40. package/dist/chunk-ZWE3DS7E.js +0 -39
  41. package/dist/chunk-ZWE3DS7E.js.map +0 -1
  42. package/dist/devtools-HNR7DD7Q.js +0 -68
  43. package/dist/devtools-HNR7DD7Q.js.map +0 -1
  44. package/dist/devtools-HW3UQAHH.js +0 -69
  45. package/dist/devtools-HW3UQAHH.js.map +0 -1
  46. package/dist/devtools-KXIXZGBY.js +0 -64
  47. package/dist/devtools-KXIXZGBY.js.map +0 -1
  48. package/dist/devtools-PDXM3L35.js +0 -67
  49. package/dist/devtools-PDXM3L35.js.map +0 -1
  50. package/dist/devtools-SDEASRYI.js +0 -66
  51. package/dist/devtools-SDEASRYI.js.map +0 -1
  52. package/dist/devtools-XBEEGBQ4.js +0 -66
  53. package/dist/devtools-XBEEGBQ4.js.map +0 -1
  54. package/dist/dist-4P5P64FK.js +0 -8474
  55. package/dist/dist-4P5P64FK.js.map +0 -1
  56. package/dist/dist-AVHDSU4X.js +0 -137
  57. package/dist/dist-AVHDSU4X.js.map +0 -1
  58. package/dist/dist-C3F6UOWF.js +0 -8472
  59. package/dist/dist-C3F6UOWF.js.map +0 -1
  60. package/dist/dist-NUJOSN7W.js +0 -8472
  61. package/dist/dist-NUJOSN7W.js.map +0 -1
  62. package/dist/dist-QHDMIBVE.js +0 -135
  63. package/dist/dist-QHDMIBVE.js.map +0 -1
  64. package/dist/dist-ZIZQOSY3.js +0 -135
  65. package/dist/dist-ZIZQOSY3.js.map +0 -1
  66. package/dist/electron/icon.png +0 -0
  67. package/dist/electron/main.js +0 -201
  68. package/dist/electron/main.js.map +0 -1
  69. package/dist/electron/preload.cjs +0 -9
  70. package/dist/gzip-size-K37OQCQ2.js +0 -137
  71. package/dist/gzip-size-K37OQCQ2.js.map +0 -1
  72. package/dist/gzip-size-QRGIYYEQ.js +0 -137
  73. package/dist/gzip-size-QRGIYYEQ.js.map +0 -1
  74. package/dist/gzip-size-SHZBT5GU.js +0 -139
  75. package/dist/gzip-size-SHZBT5GU.js.map +0 -1
  76. package/dist/nwjs/shell/icon.png +0 -0
  77. package/dist/nwjs/shell/index.html +0 -200
  78. package/dist/nwjs/shell/package.json +0 -16
  79. package/dist/viewer/assets/fa-core-DAYjf9Yn.js +0 -558
  80. package/dist/viewer/assets/fa-core-Ff8SZmm_.js +0 -558
  81. package/dist/viewer/assets/index-47Vh9MH0.js +0 -17
  82. package/dist/viewer/assets/index-6uunWX8M.js +0 -17
  83. package/dist/viewer/assets/index-B48OpZHg.js +0 -17
  84. package/dist/viewer/assets/index-BFfw7eD7.js +0 -17
  85. package/dist/viewer/assets/index-BFyUUb06.js +0 -17
  86. package/dist/viewer/assets/index-BL-Yu7Bf.js +0 -17
  87. package/dist/viewer/assets/index-BUmv8vz7.js +0 -17
  88. package/dist/viewer/assets/index-BZ4HmEz8.js +0 -17
  89. package/dist/viewer/assets/index-BZIXccTd.js +0 -17
  90. package/dist/viewer/assets/index-Bk9hnfnO.js +0 -17
  91. package/dist/viewer/assets/index-C0SIHm9A.js +0 -17
  92. package/dist/viewer/assets/index-CDd-WK6Y.js +0 -17
  93. package/dist/viewer/assets/index-CDxQqP40.js +0 -17
  94. package/dist/viewer/assets/index-CGJzvpL5.js +0 -17
  95. package/dist/viewer/assets/index-CIarX3Lt.js +0 -17
  96. package/dist/viewer/assets/index-CIfVP45E.js +0 -17
  97. package/dist/viewer/assets/index-CJeb7uFu.css +0 -2
  98. package/dist/viewer/assets/index-CbwLb2S_.js +0 -17
  99. package/dist/viewer/assets/index-CsfWgoID.js +0 -17
  100. package/dist/viewer/assets/index-CvWmkIY5.js +0 -17
  101. package/dist/viewer/assets/index-Cy-weKfG.css +0 -2
  102. package/dist/viewer/assets/index-Cym12l2M.js +0 -17
  103. package/dist/viewer/assets/index-D0W0oANg.js +0 -17
  104. package/dist/viewer/assets/index-DCPtqd3W.js +0 -17
  105. package/dist/viewer/assets/index-DF_zYdLw.js +0 -17
  106. package/dist/viewer/assets/index-DGqxQcUx.js +0 -17
  107. package/dist/viewer/assets/index-DK0OVb7V.js +0 -17
  108. package/dist/viewer/assets/index-DKjVFdzw.js +0 -17
  109. package/dist/viewer/assets/index-DLhj0I_2.js +0 -17
  110. package/dist/viewer/assets/index-DPS_ZjbM.js +0 -17
  111. package/dist/viewer/assets/index-DSbHkhcS.js +0 -17
  112. package/dist/viewer/assets/index-DTbmNtEU.js +0 -17
  113. package/dist/viewer/assets/index-DUYd6RpI.js +0 -17
  114. package/dist/viewer/assets/index-DZwYe1wZ.css +0 -2
  115. package/dist/viewer/assets/index-DkRokbYc.js +0 -17
  116. package/dist/viewer/assets/index-DtOWzkR5.js +0 -17
  117. package/dist/viewer/assets/index-DuvXujkm.js +0 -17
  118. package/dist/viewer/assets/index-Dv0mX-oM.js +0 -17
  119. package/dist/viewer/assets/index-DyXisBY9.css +0 -2
  120. package/dist/viewer/assets/index-Nm1xKWTO.js +0 -17
  121. package/dist/viewer/assets/index-ZBdAq6dF.js +0 -17
  122. package/dist/viewer/assets/index-ZOxL_JJZ.js +0 -17
  123. package/dist/viewer/assets/index-kMMOwjlY.js +0 -17
  124. package/dist/viewer/assets/index-ov2oU6RI.js +0 -17
  125. package/dist/viewer/assets/index-uF6u0kT8.js +0 -17
  126. package/dist/viewer/assets/index-xbDHMSaa.css +0 -2
  127. package/dist/viewer/assets/react-D7PmSb6e.js +0 -9
  128. package/dist/viewer/assets/react-DIjeYlvh.js +0 -9
  129. /package/dist/viewer/assets/{fa-pro-icons-D4afj0tU.js → fa-pro-icons-CIQGXozY.js} +0 -0
package/dist/index.js CHANGED
@@ -259,30 +259,44 @@ function isKizenUrl(url) {
259
259
  }
260
260
  }
261
261
  function parseProp(prop) {
262
- if (prop.type === "number") return Number(prop.value);
263
- if (prop.type === "boolean") return prop.value === "true";
264
- if (prop.type === "undefined") return void 0;
265
- if (prop.type === "object" && prop.value === "null") return null;
262
+ if (prop.type === "number") {
263
+ return Number(prop.value);
264
+ }
265
+ if (prop.type === "boolean") {
266
+ return prop.value === "true";
267
+ }
268
+ if (prop.type === "undefined") {
269
+ return void 0;
270
+ }
271
+ if (prop.type === "object" && prop.value === "null") {
272
+ return null;
273
+ }
266
274
  if (prop.type === "object" && prop.valuePreview) {
267
275
  const { valuePreview } = prop;
268
276
  if (valuePreview.subtype === "array") {
269
277
  return valuePreview.properties.filter((p) => /^\d+$/.test(p.name)).sort((a, b) => parseInt(a.name) - parseInt(b.name)).map(parseProp);
270
278
  }
271
279
  const obj = {};
272
- for (const p of valuePreview.properties) obj[p.name] = parseProp(p);
280
+ for (const p of valuePreview.properties) {
281
+ obj[p.name] = parseProp(p);
282
+ }
273
283
  return obj;
274
284
  }
275
285
  return prop.value ?? `[${prop.type}]`;
276
286
  }
277
287
  function serializeArg(arg) {
278
- if (arg.value !== void 0) return arg.value;
288
+ if (arg.value !== void 0) {
289
+ return arg.value;
290
+ }
279
291
  if (arg.preview) {
280
292
  const { preview } = arg;
281
293
  if (preview.subtype === "array") {
282
294
  return preview.properties.filter((p) => /^\d+$/.test(p.name)).sort((a, b) => parseInt(a.name) - parseInt(b.name)).map(parseProp);
283
295
  }
284
296
  const obj = {};
285
- for (const prop of preview.properties) obj[prop.name] = parseProp(prop);
297
+ for (const prop of preview.properties) {
298
+ obj[prop.name] = parseProp(prop);
299
+ }
286
300
  return obj;
287
301
  }
288
302
  return arg.description ?? `[${arg.type}]`;
@@ -296,7 +310,9 @@ async function serializeArgAsync(client, arg) {
296
310
  returnByValue: true
297
311
  });
298
312
  const val = result.result.value;
299
- if (typeof val === "string") return JSON.parse(val);
313
+ if (typeof val === "string") {
314
+ return JSON.parse(val);
315
+ }
300
316
  } catch {
301
317
  }
302
318
  }
@@ -313,9 +329,9 @@ async function installDockIcon(client) {
313
329
  async function launchChromeViewer(opts) {
314
330
  mkdirSync(opts.userDataDir, { recursive: true });
315
331
  const chrome = await launch({
316
- startingUrl: `http://localhost:${opts.port}`,
332
+ startingUrl: `http://localhost:${String(opts.port)}`,
317
333
  chromeFlags: [
318
- `--app=http://localhost:${opts.port}`,
334
+ `--app=http://localhost:${String(opts.port)}`,
319
335
  "--no-first-run",
320
336
  "--no-default-browser-check",
321
337
  "--disable-extensions"
@@ -326,7 +342,7 @@ async function launchChromeViewer(opts) {
326
342
  });
327
343
  let client = null;
328
344
  let cookieTimer = null;
329
- let cdpPort = chrome.port;
345
+ const cdpPort = chrome.port;
330
346
  for (let attempt = 0; attempt < 10; attempt++) {
331
347
  await new Promise((r) => setTimeout(r, 300));
332
348
  try {
@@ -335,14 +351,18 @@ async function launchChromeViewer(opts) {
335
351
  } catch {
336
352
  if (attempt === 9) {
337
353
  return {
338
- kill: () => chrome.kill()
354
+ kill: () => {
355
+ chrome.kill();
356
+ }
339
357
  };
340
358
  }
341
359
  }
342
360
  }
343
361
  if (!client) {
344
362
  return {
345
- kill: () => chrome.kill()
363
+ kill: () => {
364
+ chrome.kill();
365
+ }
346
366
  };
347
367
  }
348
368
  const c = client;
@@ -357,13 +377,17 @@ async function launchChromeViewer(opts) {
357
377
  void (async () => {
358
378
  const params = rawParams;
359
379
  const { requestId, request, responseHeaders, responseStatusCode } = params;
360
- const url = request?.url ?? "";
380
+ const url = request.url;
361
381
  const filtered = [];
362
382
  for (const h of responseHeaders ?? []) {
363
- if (CSP_HEADERS.has(h.name.toLowerCase())) continue;
383
+ if (CSP_HEADERS.has(h.name.toLowerCase())) {
384
+ continue;
385
+ }
364
386
  if (h.name.toLowerCase() === "set-cookie" && isKizenUrl(url)) {
365
387
  const patched = h.value.split("\n").map((cookie) => {
366
- if (!/SameSite=/i.test(cookie)) return cookie + "; SameSite=None; Secure";
388
+ if (!/SameSite=/i.test(cookie)) {
389
+ return cookie + "; SameSite=None; Secure";
390
+ }
367
391
  return cookie.replace(/SameSite=\w+/i, "SameSite=None");
368
392
  }).join("\n");
369
393
  filtered.push({ name: h.name, value: patched });
@@ -393,8 +417,12 @@ async function launchChromeViewer(opts) {
393
417
  try {
394
418
  const { cookies } = await c.Network.getAllCookies();
395
419
  for (const cookie of cookies) {
396
- if (!isKizenUrl(`https://${cookie.domain ?? ""}`)) continue;
397
- if (cookie.sameSite === "None") continue;
420
+ if (!isKizenUrl(`https://${cookie.domain ?? ""}`)) {
421
+ continue;
422
+ }
423
+ if (cookie.sameSite === "None") {
424
+ continue;
425
+ }
398
426
  const raw = cookie.domain ?? "";
399
427
  const bare = raw.startsWith(".") ? raw.slice(1) : raw;
400
428
  await c.Network.setCookie({
@@ -437,7 +465,9 @@ async function launchChromeViewer(opts) {
437
465
  c.on("Runtime.consoleAPICalled", (rawParams) => {
438
466
  void (async () => {
439
467
  const { type, args } = rawParams;
440
- if (args[0]?.type === "string" && String(args[0].value).includes("Chrome Security")) return;
468
+ if (args[0]?.type === "string" && String(args[0].value).includes("Chrome Security")) {
469
+ return;
470
+ }
441
471
  const level = type === "warning" ? "warn" : ["log", "warn", "error", "info"].includes(type) ? type : "log";
442
472
  const serialized = await Promise.all(args.map((arg) => serializeArgAsync(c, arg)));
443
473
  opts.broadcast({ type: "console-message", level, args: serialized });
@@ -445,7 +475,7 @@ async function launchChromeViewer(opts) {
445
475
  });
446
476
  });
447
477
  const kill = () => {
448
- if (cookieTimer !== null) clearInterval(cookieTimer);
478
+ clearInterval(cookieTimer);
449
479
  try {
450
480
  void c.close();
451
481
  } catch {
@@ -456,8 +486,12 @@ async function launchChromeViewer(opts) {
456
486
  }
457
487
 
458
488
  // src/lib/proxyCache.ts
459
- function createProxyCache() {
489
+ function createProxyCache(options = {}) {
460
490
  const cache = /* @__PURE__ */ new Map();
491
+ const { onChange } = options;
492
+ const emitChange = () => {
493
+ onChange?.(cache.size);
494
+ };
461
495
  return {
462
496
  get(key, fetcher) {
463
497
  const existing = cache.get(key);
@@ -475,13 +509,22 @@ function createProxyCache() {
475
509
  };
476
510
  }).catch((error) => {
477
511
  cache.delete(key);
512
+ emitChange();
478
513
  throw error;
479
514
  });
480
515
  cache.set(key, pending);
481
- return pending.then((response) => ({ response, fromCache: false }));
516
+ emitChange();
517
+ return pending.then((response) => {
518
+ if (response.status >= 400) {
519
+ cache.delete(key);
520
+ emitChange();
521
+ }
522
+ return { response, fromCache: false };
523
+ });
482
524
  },
483
525
  clear() {
484
526
  cache.clear();
527
+ emitChange();
485
528
  }
486
529
  };
487
530
  }
@@ -982,8 +1025,8 @@ async function fileExists(filePath) {
982
1025
  return false;
983
1026
  }
984
1027
  }
985
- function createRequestHandler(viewerPath, createServerLog, createProxyLog, credentialsRef, activeProfileRef, outputDir, broadcast) {
986
- const proxyCache = createProxyCache();
1028
+ function createRequestHandler(viewerPath, createServerLog, createProxyLog, credentialsRef, activeProfileRef, outputDir, broadcast, onProxyCacheChange) {
1029
+ const proxyCache = createProxyCache({ onChange: onProxyCacheChange });
987
1030
  return (req, res) => {
988
1031
  void (async () => {
989
1032
  const url = req.url ?? "/";
@@ -1150,6 +1193,9 @@ var DevUI = ({
1150
1193
  const [buildError, setBuildError] = useState3(null);
1151
1194
  const [lastBuilt, setLastBuilt] = useState3(null);
1152
1195
  const [wsClientCount, setWsClientCount] = useState3(0);
1196
+ const [proxyCacheSize, setProxyCacheSize] = useState3(0);
1197
+ const [proxyCacheHits, setProxyCacheHits] = useState3(0);
1198
+ const [proxyCacheMisses, setProxyCacheMisses] = useState3(0);
1153
1199
  const buildingRef = useRef(false);
1154
1200
  const viewerLaunchedRef = useRef(false);
1155
1201
  const chromeHandleRef = useRef(null);
@@ -1182,7 +1228,9 @@ var DevUI = ({
1182
1228
  broadcast
1183
1229
  }).then((handle) => {
1184
1230
  chromeHandleRef.current = handle;
1185
- process.on("exit", () => handle.kill());
1231
+ process.on("exit", () => {
1232
+ handle.kill();
1233
+ });
1186
1234
  });
1187
1235
  }, [port, outputDir, broadcast]);
1188
1236
  useInput2(
@@ -1228,6 +1276,13 @@ var DevUI = ({
1228
1276
  -LOG_LIMIT
1229
1277
  )
1230
1278
  );
1279
+ if (entry.kind === "request") {
1280
+ if (entry.fromCache) {
1281
+ setProxyCacheHits((n) => n + 1);
1282
+ } else {
1283
+ setProxyCacheMisses((n) => n + 1);
1284
+ }
1285
+ }
1231
1286
  broadcast({ type: "proxy-log", entry });
1232
1287
  },
1233
1288
  [broadcast]
@@ -1305,7 +1360,8 @@ var DevUI = ({
1305
1360
  credentialsRef,
1306
1361
  activeProfileRef,
1307
1362
  outputDir,
1308
- broadcast
1363
+ broadcast,
1364
+ setProxyCacheSize
1309
1365
  );
1310
1366
  const server = createServer(handler);
1311
1367
  const wss = new WebSocketServer({ server });
@@ -1361,7 +1417,7 @@ var DevUI = ({
1361
1417
  ] }),
1362
1418
  /* @__PURE__ */ jsxs3(Box4, { flexDirection: "column", children: [
1363
1419
  /* @__PURE__ */ jsxs3(Box4, { gap: 2, marginBottom: 0, children: [
1364
- /* @__PURE__ */ jsx4(Text4, { bold: true, dimColor: true, children: "Build" }),
1420
+ /* @__PURE__ */ jsx4(Text4, { bold: true, dimColor: true, children: "App Build" }),
1365
1421
  buildStatus === "pending" && /* @__PURE__ */ jsx4(Text4, { dimColor: true, children: "waiting\u2026" }),
1366
1422
  buildStatus === "building" && /* @__PURE__ */ jsxs3(Box4, { gap: 1, children: [
1367
1423
  /* @__PURE__ */ jsx4(Spinner2, {}),
@@ -1384,7 +1440,7 @@ var DevUI = ({
1384
1440
  Box4,
1385
1441
  {
1386
1442
  flexDirection: "column",
1387
- height: LOG_DISPLAY,
1443
+ height: LOG_DISPLAY + 2,
1388
1444
  borderStyle: "single",
1389
1445
  borderColor: "gray",
1390
1446
  overflow: "hidden",
@@ -1394,7 +1450,7 @@ var DevUI = ({
1394
1450
  ] }),
1395
1451
  /* @__PURE__ */ jsxs3(Box4, { marginTop: 1, flexDirection: "column", children: [
1396
1452
  /* @__PURE__ */ jsxs3(Box4, { gap: 2, children: [
1397
- /* @__PURE__ */ jsx4(Text4, { bold: true, dimColor: true, children: "Server" }),
1453
+ /* @__PURE__ */ jsx4(Text4, { bold: true, dimColor: true, children: "Web Server" }),
1398
1454
  status === "starting" && /* @__PURE__ */ jsx4(Text4, { dimColor: true, children: "starting\u2026" }),
1399
1455
  status === "running" && /* @__PURE__ */ jsxs3(Box4, { gap: 2, children: [
1400
1456
  /* @__PURE__ */ jsx4(Text4, { color: "green", children: "\u2713 Running" }),
@@ -1414,7 +1470,7 @@ var DevUI = ({
1414
1470
  Box4,
1415
1471
  {
1416
1472
  flexDirection: "column",
1417
- height: LOG_DISPLAY,
1473
+ height: LOG_DISPLAY + 2,
1418
1474
  borderStyle: "single",
1419
1475
  borderColor: "gray",
1420
1476
  overflow: "hidden",
@@ -1424,14 +1480,26 @@ var DevUI = ({
1424
1480
  ] }),
1425
1481
  /* @__PURE__ */ jsxs3(Box4, { marginTop: 1, flexDirection: "column", children: [
1426
1482
  /* @__PURE__ */ jsxs3(Box4, { gap: 2, children: [
1427
- /* @__PURE__ */ jsx4(Text4, { bold: true, dimColor: true, children: "Proxy" }),
1428
- /* @__PURE__ */ jsx4(Text4, { color: "green", children: "\u2713 Active" })
1483
+ /* @__PURE__ */ jsx4(Text4, { bold: true, dimColor: true, children: "Network Proxy" }),
1484
+ /* @__PURE__ */ jsx4(Text4, { color: "green", children: "\u2713 Active" }),
1485
+ /* @__PURE__ */ jsxs3(Text4, { dimColor: true, children: [
1486
+ "\u25CF ",
1487
+ proxyCacheSize,
1488
+ " key",
1489
+ proxyCacheSize !== 1 ? "s" : "",
1490
+ " in the network cache \xB7",
1491
+ " ",
1492
+ proxyCacheHits,
1493
+ " hit \xB7 ",
1494
+ proxyCacheMisses,
1495
+ " miss"
1496
+ ] })
1429
1497
  ] }),
1430
1498
  /* @__PURE__ */ jsx4(
1431
1499
  Box4,
1432
1500
  {
1433
1501
  flexDirection: "column",
1434
- height: LOG_DISPLAY,
1502
+ height: LOG_DISPLAY + 2,
1435
1503
  borderStyle: "single",
1436
1504
  borderColor: "gray",
1437
1505
  overflow: "hidden",