@llmops/app 1.0.0-beta.12 → 1.0.0-beta.14

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 (3) hide show
  1. package/dist/index.cjs +27 -247
  2. package/dist/index.mjs +27 -246
  3. package/package.json +4 -6
package/dist/index.cjs CHANGED
@@ -41,8 +41,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
41
41
  //#endregion
42
42
  let hono = require("hono");
43
43
  let __llmops_core = require("@llmops/core");
44
- let nunjucks = require("nunjucks");
45
- nunjucks = __toESM(nunjucks);
46
44
  let __hono_zod_validator = require("@hono/zod-validator");
47
45
  let __llmops_sdk = require("@llmops/sdk");
48
46
  let hono_pretty_json = require("hono/pretty-json");
@@ -411,274 +409,42 @@ const decodeAsset = (asset) => {
411
409
  //#endregion
412
410
  //#region src/server/ssr/renderer.ts
413
411
  const manifest$1 = Object.keys(manifest).length > 0 ? manifest : {};
414
- const env$2 = new nunjucks.default.Environment(null, { autoescape: false });
415
- const htmlTemplate = `<!DOCTYPE html>
412
+ const renderer = ({ basePath = "", dev = false }) => {
413
+ const stylesPath = basePath === "/" ? styles_default : basePath + styles_default;
414
+ const clientPath = basePath === "/" ? client_default : basePath + client_default;
415
+ return `<!DOCTYPE html>
416
416
  <html lang="en" class="">
417
417
  <head>
418
418
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
419
419
  <link rel="preconnect" href="https://fonts.googleapis.com" />
420
420
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous" />
421
421
  <link href="https://fonts.googleapis.com/css2?family=Geist+Mono:wght@100..900&family=Geist:wght@100..900&display=swap" rel="stylesheet" />
422
- <link rel="icon" href="{{ faviconIcoPath }}" sizes="any" />
423
- <link rel="icon" href="{{ faviconSvgPath }}" type="image/svg+xml" />
422
+ <link rel="icon" href="${basePath === "/" ? "/favicon.ico" : basePath + "/favicon.ico"}" sizes="any" />
423
+ <link rel="icon" href="${basePath === "/" ? (!dev ? "/assets" : "") + "/favicon.svg" : basePath + (!dev ? "/assets" : "") + "/favicon.svg"}" type="image/svg+xml" />
424
424
  <style>
425
- /*! modern-normalize v3.0.1 | MIT License | https://github.com/sindresorhus/modern-normalize */
426
-
427
- /*
428
- Document
429
- ========
430
- */
431
-
432
- /**
433
- Use a better box model (opinionated).
434
- */
435
-
436
- *,
437
- ::before,
438
- ::after {
439
- box-sizing: border-box;
440
- }
441
-
442
- /**
443
- 1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)
444
- 2. Correct the line height in all browsers.
445
- 3. Prevent adjustments of font size after orientation changes in iOS.
446
- 4. Use a more readable tab size (opinionated).
447
- */
448
-
449
- html {
450
- font-family:
451
- system-ui, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif,
452
- 'Apple Color Emoji', 'Segoe UI Emoji'; /* 1 */
453
- line-height: 1.15; /* 2 */
454
- -webkit-text-size-adjust: 100%; /* 3 */
455
- tab-size: 4; /* 4 */
456
- }
457
-
458
- /*
459
- Sections
460
- ========
461
- */
462
-
463
- /**
464
- Remove the margin in all browsers.
465
- */
466
-
467
- body {
468
- margin: 0;
469
- }
470
-
471
- /*
472
- Text-level semantics
473
- ====================
474
- */
475
-
476
- /**
477
- Add the correct font weight in Chrome and Safari.
478
- */
479
-
480
- b,
481
- strong {
482
- font-weight: bolder;
483
- }
484
-
485
- /**
486
- 1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)
487
- 2. Correct the odd 'em' font sizing in all browsers.
488
- */
489
-
490
- code,
491
- kbd,
492
- samp,
493
- pre {
494
- font-family:
495
- ui-monospace, SFMono-Regular, Consolas, 'Liberation Mono', Menlo, monospace; /* 1 */
496
- font-size: 1em; /* 2 */
497
- }
498
-
499
- /**
500
- Add the correct font size in all browsers.
501
- */
502
-
503
- small {
504
- font-size: 80%;
505
- }
506
-
507
- /**
508
- Prevent 'sub' and 'sup' elements from affecting the line height in all browsers.
509
- */
510
-
511
- sub,
512
- sup {
513
- font-size: 75%;
514
- line-height: 0;
515
- position: relative;
516
- vertical-align: baseline;
517
- }
518
-
519
- sub {
520
- bottom: -0.25em;
521
- }
522
-
523
- sup {
524
- top: -0.5em;
525
- }
526
-
527
- /*
528
- Tabular data
529
- ============
530
- */
531
-
532
- /**
533
- Correct table border color inheritance in Chrome and Safari. (https://issues.chromium.org/issues/40615503, https://bugs.webkit.org/show_bug.cgi?id=195016)
534
- */
535
-
536
- table {
537
- border-color: currentcolor;
538
- }
539
-
540
- /*
541
- Forms
542
- =====
543
- */
544
-
545
- /**
546
- 1. Change the font styles in all browsers.
547
- 2. Remove the margin in Firefox and Safari.
548
- */
549
-
550
- button,
551
- input,
552
- optgroup,
553
- select,
554
- textarea {
555
- font-family: inherit; /* 1 */
556
- font-size: 100%; /* 1 */
557
- line-height: 1.15; /* 1 */
558
- margin: 0; /* 2 */
559
- }
560
-
561
- /**
562
- Correct the inability to style clickable types in iOS and Safari.
563
- */
564
-
565
- button,
566
- [type='button'],
567
- [type='reset'],
568
- [type='submit'] {
569
- -webkit-appearance: button;
570
- }
571
-
572
- /**
573
- Remove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.
574
- */
575
-
576
- legend {
577
- padding: 0;
578
- }
579
-
580
- /**
581
- Add the correct vertical alignment in Chrome and Firefox.
582
- */
583
-
584
- progress {
585
- vertical-align: baseline;
586
- }
587
-
588
- /**
589
- Correct the cursor style of increment and decrement buttons in Safari.
590
- */
591
-
592
- ::-webkit-inner-spin-button,
593
- ::-webkit-outer-spin-button {
594
- height: auto;
595
- }
596
-
597
- /**
598
- 1. Correct the odd appearance in Chrome and Safari.
599
- 2. Correct the outline style in Safari.
600
- */
601
-
602
- [type='search'] {
603
- -webkit-appearance: textfield; /* 1 */
604
- outline-offset: -2px; /* 2 */
605
- }
606
-
607
- /**
608
- Remove the inner padding in Chrome and Safari on macOS.
609
- */
610
-
611
- ::-webkit-search-decoration {
612
- -webkit-appearance: none;
613
- }
614
-
615
- /**
616
- 1. Correct the inability to style clickable types in iOS and Safari.
617
- 2. Change font properties to 'inherit' in Safari.
618
- */
619
-
620
- ::-webkit-file-upload-button {
621
- -webkit-appearance: button; /* 1 */
622
- font: inherit; /* 2 */
623
- }
624
-
625
- /*
626
- Interactive
627
- ===========
628
- */
629
-
630
- /*
631
- Add the correct display in Chrome and Safari.
632
- */
633
-
634
- summary {
635
- display: list-item;
636
- }
637
-
638
- .root {
639
- isolation: isolate;
640
- }
425
+ *,::before,::after{box-sizing:border-box}html{font-family:system-ui,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji';line-height:1.15;-webkit-text-size-adjust:100%;tab-size:4}body{margin:0}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Consolas,'Liberation Mono',Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}table{border-color:currentcolor}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,[type='button'],[type='reset'],[type='submit']{-webkit-appearance:button}legend{padding:0}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type='search']{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}.root{isolation:isolate}
641
426
  </style>
642
- <link href="{{ stylesPath }}" rel="stylesheet" />
643
- {% for cssFile in entryCSSFiles %}
644
- <link href="{{ cssFile }}" rel="stylesheet" />
645
- {% endfor %}
427
+ <link href="${stylesPath}" rel="stylesheet" />
428
+ ${(Object.keys(manifest$1)?.filter((key) => manifest$1[key].isEntry && manifest$1[key].css)?.flatMap((key) => manifest$1[key].css || []).map((cssFile) => basePath === "/" ? `/${cssFile}` : basePath + `/${cssFile}`).filter((cssFile) => cssFile !== stylesPath) || []).map((cssFile) => `<link href="${cssFile}" rel="stylesheet" />`).join("\n ")}
646
429
  <script>
647
430
  window.bootstrapData = {
648
- basePath: "{{ basePath }}"
431
+ basePath: "${basePath}"
649
432
  };
650
433
  <\/script>
651
- {% if dev %}
652
- <script type="module">
434
+ ${dev ? `<script type="module">
653
435
  import RefreshRuntime from "/@react-refresh";
654
436
  RefreshRuntime.injectIntoGlobalHook(window);
655
437
  window.$RefreshReg$ = () => {};
656
438
  window.$RefreshSig$ = () => (type) => type;
657
439
  window.__vite_plugin_react_preamble_installed__ = true;
658
- <\/script>
659
- {% endif %}
440
+ <\/script>` : ""}
660
441
  </head>
661
442
  <body>
662
443
  <noscript>You need to enable JavaScript to run this app.</noscript>
663
444
  <div id="root" class="root"></div>
664
- <script type="module" src="{{ clientPath }}"><\/script>
445
+ <script type="module" src="${clientPath}"><\/script>
665
446
  </body>
666
447
  </html>`;
667
- const renderer = ({ basePath = "", dev = false }) => {
668
- const stylesPath = basePath === "/" ? styles_default : basePath + styles_default;
669
- const clientPath = basePath === "/" ? client_default : basePath + client_default;
670
- const faviconIcoPath = basePath === "/" ? "/favicon.ico" : basePath + "/favicon.ico";
671
- const faviconSvgPath = basePath === "/" ? (!dev ? "/assets" : "") + "/favicon.svg" : basePath + (!dev ? "/assets" : "") + "/favicon.svg";
672
- const entryCSSFiles = Object.keys(manifest$1)?.filter((key) => manifest$1[key].isEntry && manifest$1[key].css)?.flatMap((key) => manifest$1[key].css || []).map((cssFile) => basePath === "/" ? `/${cssFile}` : basePath + `/${cssFile}`).filter((cssFile) => cssFile !== stylesPath) || [];
673
- return env$2.renderString(htmlTemplate, {
674
- basePath,
675
- dev,
676
- stylesPath,
677
- clientPath,
678
- faviconIcoPath,
679
- faviconSvgPath,
680
- entryCSSFiles
681
- });
682
448
  };
683
449
 
684
450
  //#endregion
@@ -14416,6 +14182,13 @@ function createBatchWriter(deps, config$1 = {}) {
14416
14182
  function enqueue(request) {
14417
14183
  queue.push(request);
14418
14184
  log(`[BatchWriter] Enqueued request ${request.requestId}, queue size: ${queue.length}`);
14185
+ if (typeof globalThis.process === "undefined" || !globalThis.process?.versions?.node) {
14186
+ flush().catch((err) => {
14187
+ const errorMsg = err instanceof Error ? err.message : String(err);
14188
+ __llmops_core.logger.error(`[BatchWriter] Edge flush error: ${errorMsg}`);
14189
+ });
14190
+ return;
14191
+ }
14419
14192
  if (!running) start();
14420
14193
  if (queue.length >= maxBatchSize) {
14421
14194
  log(`[BatchWriter] Max batch size reached, forcing flush`);
@@ -14615,6 +14388,13 @@ function createTraceBatchWriter(deps, config$1 = {}) {
14615
14388
  function enqueue(item) {
14616
14389
  queue.push(item);
14617
14390
  log(`[TraceBatchWriter] Enqueued span ${item.span.spanId}, queue size: ${queue.length}`);
14391
+ if (typeof globalThis.process === "undefined" || !globalThis.process?.versions?.node) {
14392
+ flush().catch((err) => {
14393
+ const errorMsg = err instanceof Error ? err.message : String(err);
14394
+ __llmops_core.logger.error(`[TraceBatchWriter] Edge flush error: ${errorMsg}`);
14395
+ });
14396
+ return;
14397
+ }
14618
14398
  if (!running) start();
14619
14399
  if (queue.length >= maxBatchSize) {
14620
14400
  log(`[TraceBatchWriter] Max batch size reached, forcing flush`);
package/dist/index.mjs CHANGED
@@ -1,6 +1,5 @@
1
1
  import { Hono } from "hono";
2
2
  import { LLMOPS_REQUEST_ID_HEADER, LLMOPS_SESSION_ID_HEADER, LLMOPS_SPAN_ID_HEADER, LLMOPS_SPAN_NAME_HEADER, LLMOPS_TRACE_ID_HEADER, LLMOPS_TRACE_NAME_HEADER, LLMOPS_USER_ID_HEADER, SupportedProviders, calculateCacheAwareCost, getDefaultPricingProvider, logger, validateLLMOpsConfig } from "@llmops/core";
3
- import nunjucks from "nunjucks";
4
3
  import { zValidator } from "@hono/zod-validator";
5
4
  import { COST_SUMMARY_GROUP_BY } from "@llmops/sdk";
6
5
  import { prettyJSON } from "hono/pretty-json";
@@ -384,274 +383,42 @@ const decodeAsset = (asset) => {
384
383
  //#endregion
385
384
  //#region src/server/ssr/renderer.ts
386
385
  const manifest$1 = Object.keys(manifest).length > 0 ? manifest : {};
387
- const env$1 = new nunjucks.Environment(null, { autoescape: false });
388
- const htmlTemplate = `<!DOCTYPE html>
386
+ const renderer = ({ basePath = "", dev = false }) => {
387
+ const stylesPath = basePath === "/" ? styles_default : basePath + styles_default;
388
+ const clientPath = basePath === "/" ? client_default : basePath + client_default;
389
+ return `<!DOCTYPE html>
389
390
  <html lang="en" class="">
390
391
  <head>
391
392
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
392
393
  <link rel="preconnect" href="https://fonts.googleapis.com" />
393
394
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous" />
394
395
  <link href="https://fonts.googleapis.com/css2?family=Geist+Mono:wght@100..900&family=Geist:wght@100..900&display=swap" rel="stylesheet" />
395
- <link rel="icon" href="{{ faviconIcoPath }}" sizes="any" />
396
- <link rel="icon" href="{{ faviconSvgPath }}" type="image/svg+xml" />
396
+ <link rel="icon" href="${basePath === "/" ? "/favicon.ico" : basePath + "/favicon.ico"}" sizes="any" />
397
+ <link rel="icon" href="${basePath === "/" ? (!dev ? "/assets" : "") + "/favicon.svg" : basePath + (!dev ? "/assets" : "") + "/favicon.svg"}" type="image/svg+xml" />
397
398
  <style>
398
- /*! modern-normalize v3.0.1 | MIT License | https://github.com/sindresorhus/modern-normalize */
399
-
400
- /*
401
- Document
402
- ========
403
- */
404
-
405
- /**
406
- Use a better box model (opinionated).
407
- */
408
-
409
- *,
410
- ::before,
411
- ::after {
412
- box-sizing: border-box;
413
- }
414
-
415
- /**
416
- 1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)
417
- 2. Correct the line height in all browsers.
418
- 3. Prevent adjustments of font size after orientation changes in iOS.
419
- 4. Use a more readable tab size (opinionated).
420
- */
421
-
422
- html {
423
- font-family:
424
- system-ui, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif,
425
- 'Apple Color Emoji', 'Segoe UI Emoji'; /* 1 */
426
- line-height: 1.15; /* 2 */
427
- -webkit-text-size-adjust: 100%; /* 3 */
428
- tab-size: 4; /* 4 */
429
- }
430
-
431
- /*
432
- Sections
433
- ========
434
- */
435
-
436
- /**
437
- Remove the margin in all browsers.
438
- */
439
-
440
- body {
441
- margin: 0;
442
- }
443
-
444
- /*
445
- Text-level semantics
446
- ====================
447
- */
448
-
449
- /**
450
- Add the correct font weight in Chrome and Safari.
451
- */
452
-
453
- b,
454
- strong {
455
- font-weight: bolder;
456
- }
457
-
458
- /**
459
- 1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)
460
- 2. Correct the odd 'em' font sizing in all browsers.
461
- */
462
-
463
- code,
464
- kbd,
465
- samp,
466
- pre {
467
- font-family:
468
- ui-monospace, SFMono-Regular, Consolas, 'Liberation Mono', Menlo, monospace; /* 1 */
469
- font-size: 1em; /* 2 */
470
- }
471
-
472
- /**
473
- Add the correct font size in all browsers.
474
- */
475
-
476
- small {
477
- font-size: 80%;
478
- }
479
-
480
- /**
481
- Prevent 'sub' and 'sup' elements from affecting the line height in all browsers.
482
- */
483
-
484
- sub,
485
- sup {
486
- font-size: 75%;
487
- line-height: 0;
488
- position: relative;
489
- vertical-align: baseline;
490
- }
491
-
492
- sub {
493
- bottom: -0.25em;
494
- }
495
-
496
- sup {
497
- top: -0.5em;
498
- }
499
-
500
- /*
501
- Tabular data
502
- ============
503
- */
504
-
505
- /**
506
- Correct table border color inheritance in Chrome and Safari. (https://issues.chromium.org/issues/40615503, https://bugs.webkit.org/show_bug.cgi?id=195016)
507
- */
508
-
509
- table {
510
- border-color: currentcolor;
511
- }
512
-
513
- /*
514
- Forms
515
- =====
516
- */
517
-
518
- /**
519
- 1. Change the font styles in all browsers.
520
- 2. Remove the margin in Firefox and Safari.
521
- */
522
-
523
- button,
524
- input,
525
- optgroup,
526
- select,
527
- textarea {
528
- font-family: inherit; /* 1 */
529
- font-size: 100%; /* 1 */
530
- line-height: 1.15; /* 1 */
531
- margin: 0; /* 2 */
532
- }
533
-
534
- /**
535
- Correct the inability to style clickable types in iOS and Safari.
536
- */
537
-
538
- button,
539
- [type='button'],
540
- [type='reset'],
541
- [type='submit'] {
542
- -webkit-appearance: button;
543
- }
544
-
545
- /**
546
- Remove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.
547
- */
548
-
549
- legend {
550
- padding: 0;
551
- }
552
-
553
- /**
554
- Add the correct vertical alignment in Chrome and Firefox.
555
- */
556
-
557
- progress {
558
- vertical-align: baseline;
559
- }
560
-
561
- /**
562
- Correct the cursor style of increment and decrement buttons in Safari.
563
- */
564
-
565
- ::-webkit-inner-spin-button,
566
- ::-webkit-outer-spin-button {
567
- height: auto;
568
- }
569
-
570
- /**
571
- 1. Correct the odd appearance in Chrome and Safari.
572
- 2. Correct the outline style in Safari.
573
- */
574
-
575
- [type='search'] {
576
- -webkit-appearance: textfield; /* 1 */
577
- outline-offset: -2px; /* 2 */
578
- }
579
-
580
- /**
581
- Remove the inner padding in Chrome and Safari on macOS.
582
- */
583
-
584
- ::-webkit-search-decoration {
585
- -webkit-appearance: none;
586
- }
587
-
588
- /**
589
- 1. Correct the inability to style clickable types in iOS and Safari.
590
- 2. Change font properties to 'inherit' in Safari.
591
- */
592
-
593
- ::-webkit-file-upload-button {
594
- -webkit-appearance: button; /* 1 */
595
- font: inherit; /* 2 */
596
- }
597
-
598
- /*
599
- Interactive
600
- ===========
601
- */
602
-
603
- /*
604
- Add the correct display in Chrome and Safari.
605
- */
606
-
607
- summary {
608
- display: list-item;
609
- }
610
-
611
- .root {
612
- isolation: isolate;
613
- }
399
+ *,::before,::after{box-sizing:border-box}html{font-family:system-ui,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji';line-height:1.15;-webkit-text-size-adjust:100%;tab-size:4}body{margin:0}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Consolas,'Liberation Mono',Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}table{border-color:currentcolor}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,[type='button'],[type='reset'],[type='submit']{-webkit-appearance:button}legend{padding:0}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type='search']{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}.root{isolation:isolate}
614
400
  </style>
615
- <link href="{{ stylesPath }}" rel="stylesheet" />
616
- {% for cssFile in entryCSSFiles %}
617
- <link href="{{ cssFile }}" rel="stylesheet" />
618
- {% endfor %}
401
+ <link href="${stylesPath}" rel="stylesheet" />
402
+ ${(Object.keys(manifest$1)?.filter((key) => manifest$1[key].isEntry && manifest$1[key].css)?.flatMap((key) => manifest$1[key].css || []).map((cssFile) => basePath === "/" ? `/${cssFile}` : basePath + `/${cssFile}`).filter((cssFile) => cssFile !== stylesPath) || []).map((cssFile) => `<link href="${cssFile}" rel="stylesheet" />`).join("\n ")}
619
403
  <script>
620
404
  window.bootstrapData = {
621
- basePath: "{{ basePath }}"
405
+ basePath: "${basePath}"
622
406
  };
623
407
  <\/script>
624
- {% if dev %}
625
- <script type="module">
408
+ ${dev ? `<script type="module">
626
409
  import RefreshRuntime from "/@react-refresh";
627
410
  RefreshRuntime.injectIntoGlobalHook(window);
628
411
  window.$RefreshReg$ = () => {};
629
412
  window.$RefreshSig$ = () => (type) => type;
630
413
  window.__vite_plugin_react_preamble_installed__ = true;
631
- <\/script>
632
- {% endif %}
414
+ <\/script>` : ""}
633
415
  </head>
634
416
  <body>
635
417
  <noscript>You need to enable JavaScript to run this app.</noscript>
636
418
  <div id="root" class="root"></div>
637
- <script type="module" src="{{ clientPath }}"><\/script>
419
+ <script type="module" src="${clientPath}"><\/script>
638
420
  </body>
639
421
  </html>`;
640
- const renderer = ({ basePath = "", dev = false }) => {
641
- const stylesPath = basePath === "/" ? styles_default : basePath + styles_default;
642
- const clientPath = basePath === "/" ? client_default : basePath + client_default;
643
- const faviconIcoPath = basePath === "/" ? "/favicon.ico" : basePath + "/favicon.ico";
644
- const faviconSvgPath = basePath === "/" ? (!dev ? "/assets" : "") + "/favicon.svg" : basePath + (!dev ? "/assets" : "") + "/favicon.svg";
645
- const entryCSSFiles = Object.keys(manifest$1)?.filter((key) => manifest$1[key].isEntry && manifest$1[key].css)?.flatMap((key) => manifest$1[key].css || []).map((cssFile) => basePath === "/" ? `/${cssFile}` : basePath + `/${cssFile}`).filter((cssFile) => cssFile !== stylesPath) || [];
646
- return env$1.renderString(htmlTemplate, {
647
- basePath,
648
- dev,
649
- stylesPath,
650
- clientPath,
651
- faviconIcoPath,
652
- faviconSvgPath,
653
- entryCSSFiles
654
- });
655
422
  };
656
423
 
657
424
  //#endregion
@@ -14389,6 +14156,13 @@ function createBatchWriter(deps, config$1 = {}) {
14389
14156
  function enqueue(request) {
14390
14157
  queue.push(request);
14391
14158
  log(`[BatchWriter] Enqueued request ${request.requestId}, queue size: ${queue.length}`);
14159
+ if (typeof globalThis.process === "undefined" || !globalThis.process?.versions?.node) {
14160
+ flush().catch((err) => {
14161
+ const errorMsg = err instanceof Error ? err.message : String(err);
14162
+ logger.error(`[BatchWriter] Edge flush error: ${errorMsg}`);
14163
+ });
14164
+ return;
14165
+ }
14392
14166
  if (!running) start();
14393
14167
  if (queue.length >= maxBatchSize) {
14394
14168
  log(`[BatchWriter] Max batch size reached, forcing flush`);
@@ -14588,6 +14362,13 @@ function createTraceBatchWriter(deps, config$1 = {}) {
14588
14362
  function enqueue(item) {
14589
14363
  queue.push(item);
14590
14364
  log(`[TraceBatchWriter] Enqueued span ${item.span.spanId}, queue size: ${queue.length}`);
14365
+ if (typeof globalThis.process === "undefined" || !globalThis.process?.versions?.node) {
14366
+ flush().catch((err) => {
14367
+ const errorMsg = err instanceof Error ? err.message : String(err);
14368
+ logger.error(`[TraceBatchWriter] Edge flush error: ${errorMsg}`);
14369
+ });
14370
+ return;
14371
+ }
14591
14372
  if (!running) start();
14592
14373
  if (queue.length >= maxBatchSize) {
14593
14374
  log(`[TraceBatchWriter] Max batch size reached, forcing flush`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@llmops/app",
3
- "version": "1.0.0-beta.12",
3
+ "version": "1.0.0-beta.14",
4
4
  "description": "LLMOps application with server and client",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -69,16 +69,15 @@
69
69
  "lexical": "^0.39.0",
70
70
  "lucide-react": "^0.556.0",
71
71
  "motion": "^12.23.25",
72
- "nunjucks": "^3.2.4",
73
72
  "openai": "^6.10.0",
74
73
  "protobufjs": "^8.0.0",
75
74
  "react-aria-components": "^1.13.0",
76
75
  "react-hook-form": "^7.68.0",
77
76
  "recharts": "^3.6.0",
78
77
  "uuid": "^13.0.0",
79
- "@llmops/core": "^1.0.0-beta.12",
80
- "@llmops/sdk": "^1.0.0-beta.12",
81
- "@llmops/gateway": "^1.0.0-beta.12"
78
+ "@llmops/gateway": "^1.0.0-beta.14",
79
+ "@llmops/sdk": "^1.0.0-beta.14",
80
+ "@llmops/core": "^1.0.0-beta.14"
82
81
  },
83
82
  "peerDependencies": {
84
83
  "react": "^19.2.1",
@@ -89,7 +88,6 @@
89
88
  "@hono/vite-build": "^1.8.0",
90
89
  "@hono/vite-dev-server": "^0.23.0",
91
90
  "@tanstack/router-plugin": "^1.139.14",
92
- "@types/nunjucks": "^3.2.6",
93
91
  "@types/pg": "^8.15.6",
94
92
  "@types/react": "^19.2.7",
95
93
  "@types/react-dom": "^19.2.3",