@seed-ship/mcp-ui-solid 5.3.1 → 5.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +104 -0
- package/dist/components/StreamingUIRenderer.cjs +106 -90
- package/dist/components/StreamingUIRenderer.cjs.map +1 -1
- package/dist/components/StreamingUIRenderer.d.ts +7 -0
- package/dist/components/StreamingUIRenderer.d.ts.map +1 -1
- package/dist/components/StreamingUIRenderer.js +107 -91
- package/dist/components/StreamingUIRenderer.js.map +1 -1
- package/dist/components/UIResourceRenderer.cjs +101 -82
- package/dist/components/UIResourceRenderer.cjs.map +1 -1
- package/dist/components/UIResourceRenderer.d.ts +23 -0
- package/dist/components/UIResourceRenderer.d.ts.map +1 -1
- package/dist/components/UIResourceRenderer.js +102 -83
- package/dist/components/UIResourceRenderer.js.map +1 -1
- package/dist/index.cjs +7 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-ui-spec/dist/schemas.cjs +493 -0
- package/dist/mcp-ui-spec/dist/schemas.cjs.map +1 -0
- package/dist/mcp-ui-spec/dist/schemas.js +493 -0
- package/dist/mcp-ui-spec/dist/schemas.js.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.cjs +118 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.cjs.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.js +118 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.js.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.cjs +10 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.cjs.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.js +10 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.js.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorUtil.cjs +8 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorUtil.cjs.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorUtil.js +9 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorUtil.js.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.cjs +122 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.cjs.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.js +122 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.js.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.cjs +137 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.cjs.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.js +139 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.js.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.cjs +105 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.cjs.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.js +106 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.js.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.cjs +3229 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.cjs.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.js +3230 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.js.map +1 -0
- package/dist/services/validation.cjs +70 -152
- package/dist/services/validation.cjs.map +1 -1
- package/dist/services/validation.d.ts.map +1 -1
- package/dist/services/validation.js +70 -152
- package/dist/services/validation.js.map +1 -1
- package/dist/utils/logger.cjs +26 -4
- package/dist/utils/logger.cjs.map +1 -1
- package/dist/utils/logger.d.ts +30 -3
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +27 -5
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/perf.cjs +34 -0
- package/dist/utils/perf.cjs.map +1 -0
- package/dist/utils/perf.d.ts +19 -0
- package/dist/utils/perf.d.ts.map +1 -0
- package/dist/utils/perf.js +34 -0
- package/dist/utils/perf.js.map +1 -0
- package/package.json +3 -2
- package/src/components/StreamingUIRenderer.tsx +54 -2
- package/src/components/UIResourceRenderer.errorMode.test.tsx +95 -0
- package/src/components/UIResourceRenderer.tsx +72 -4
- package/src/index.ts +7 -0
- package/src/services/validation.spec-migration.test.ts +207 -0
- package/src/services/validation.ts +132 -178
- package/src/utils/logger.test.ts +130 -0
- package/src/utils/logger.ts +60 -7
- package/src/utils/perf.test.ts +59 -0
- package/src/utils/perf.ts +50 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -22,11 +22,18 @@
|
|
|
22
22
|
*/
|
|
23
23
|
import { type UseStreamingUIOptions } from '../hooks/useStreamingUI';
|
|
24
24
|
import type { RendererError } from '../types';
|
|
25
|
+
import type { ValidationErrorMode } from './UIResourceRenderer';
|
|
25
26
|
export interface StreamingUIRendererProps extends UseStreamingUIOptions {
|
|
26
27
|
class?: string;
|
|
27
28
|
showProgress?: boolean;
|
|
28
29
|
showMetadata?: boolean;
|
|
29
30
|
onRenderError?: (error: RendererError) => void;
|
|
31
|
+
/**
|
|
32
|
+
* How to react when a streamed component fails `validateComponent()`
|
|
33
|
+
* (v5.4.0). Defaults to `'block'` (full red error card — pre-v5.4.0
|
|
34
|
+
* behavior). See `ValidationErrorMode` in `UIResourceRenderer`.
|
|
35
|
+
*/
|
|
36
|
+
errorMode?: ValidationErrorMode;
|
|
30
37
|
}
|
|
31
38
|
export declare function StreamingUIRenderer(props: StreamingUIRendererProps): import("solid-js").JSX.Element;
|
|
32
39
|
//# sourceMappingURL=StreamingUIRenderer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StreamingUIRenderer.d.ts","sourceRoot":"","sources":["../../src/components/StreamingUIRenderer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AACpF,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,UAAU,CAAA;AAI1D,MAAM,WAAW,wBAAyB,SAAQ,qBAAqB;IACrE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"StreamingUIRenderer.d.ts","sourceRoot":"","sources":["../../src/components/StreamingUIRenderer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AACpF,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,UAAU,CAAA;AAI1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAE/D,MAAM,WAAW,wBAAyB,SAAQ,qBAAqB;IACrE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;IAC9C;;;;OAIG;IACH,SAAS,CAAC,EAAE,mBAAmB,CAAA;CAChC;AA0GD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,kCA+KlE"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import { delegateEvents, getNextElement, template, getNextMarker, insert, createComponent, memo, effect, style, runHydrationEvents, className } from "solid-js/web";
|
|
1
|
+
import { delegateEvents, getNextElement, template, getNextMarker, insert, createComponent, memo, effect, style, runHydrationEvents, className, setAttribute } from "solid-js/web";
|
|
2
2
|
import { createSignal, Show, For, onMount } from "solid-js";
|
|
3
3
|
import { useStreamingUI } from "../hooks/useStreamingUI.js";
|
|
4
4
|
import { validateComponent } from "../services/validation.js";
|
|
5
5
|
import { GenerativeUIErrorBoundary } from "./GenerativeUIErrorBoundary.js";
|
|
6
|
-
|
|
6
|
+
import { markRenderStart, markRenderEnd } from "../utils/perf.js";
|
|
7
|
+
var _tmpl$ = /* @__PURE__ */ template(`<div class="inline-flex items-center gap-1.5 px-2 py-1 rounded-md bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 text-xs text-yellow-800 dark:text-yellow-200"role=alert aria-label="Component validation warning"><svg xmlns=http://www.w3.org/2000/svg class="w-3.5 h-3.5"viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true><path d="M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"></path><line x1=12 y1=9 x2=12 y2=13></line><line x1=12 y1=17 x2=12.01 y2=17></line></svg><span>Invalid <!$><!/>`), _tmpl$2 = /* @__PURE__ */ template(`<div class="w-full bg-error-subtle border border-border-error rounded-lg p-4"><p class="text-sm font-medium text-error-primary">Validation Error</p><p class="text-xs text-text-secondary mt-1">`), _tmpl$3 = /* @__PURE__ */ template(`<h3 class="text-sm font-semibold text-text-primary">`), _tmpl$4 = /* @__PURE__ */ template(`<span class="text-sm text-text-secondary">`), _tmpl$5 = /* @__PURE__ */ template(`<div class=mt-2><p class="text-2xl font-semibold text-text-primary"></p><!$><!/>`), _tmpl$6 = /* @__PURE__ */ template(`<div class="w-full bg-surface-secondary border border-border-subtle rounded-lg p-4"><div class="flex items-center gap-2 mb-2"><span class="text-xs font-medium text-text-tertiary uppercase"></span></div><!$><!/><!$><!/><div class="mt-3 text-xs text-text-tertiary">Component ID: <!$><!/>...`), _tmpl$7 = /* @__PURE__ */ template(`<span class="text-sm text-text-secondary"><!$><!/> / <!$><!/>`), _tmpl$8 = /* @__PURE__ */ template(`<div class=mt-2><div class="h-1 w-full overflow-hidden rounded-full bg-surface-tertiary"><div class="animate-progress-indeterminate h-full w-1/3 bg-brand-primary">`), _tmpl$9 = /* @__PURE__ */ template(`<div class="mb-4 rounded-lg border border-border-subtle bg-surface-secondary p-4"><div class="mb-2 flex items-center justify-between"><span class="text-sm font-medium text-text-primary"></span><!$><!/></div><div class="h-2 w-full overflow-hidden rounded-full bg-surface-tertiary"><div class="h-full bg-brand-primary transition-all duration-300 ease-out"></div></div><!$><!/>`), _tmpl$0 = /* @__PURE__ */ template(`<button type=button class="mt-3 rounded-md bg-error-primary px-3 py-1.5 text-sm font-medium text-white hover:bg-error-hover">Retry`), _tmpl$1 = /* @__PURE__ */ template(`<div class="mb-4 rounded-lg border border-border-error bg-error-subtle p-4"><div class="mb-2 flex items-center gap-2"><svg class="h-5 w-5 text-error-primary"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg><span class="font-medium text-error-primary"></span></div><p class="text-sm text-text-secondary"></p><!$><!/>`), _tmpl$10 = /* @__PURE__ */ template(`<div><div class="font-medium text-text-primary">Cost</div><div>$<!$><!/>`), _tmpl$11 = /* @__PURE__ */ template(`<div><div class="font-medium text-text-primary">Cached</div><div class=text-success-primary>Yes`), _tmpl$12 = /* @__PURE__ */ template(`<div class="mt-6 rounded-lg border border-border-subtle bg-surface-secondary p-4 text-sm text-text-secondary"><div class="grid grid-cols-2 gap-4 md:grid-cols-4"><div><div class="font-medium text-text-primary">Provider</div><div></div></div><div><div class="font-medium text-text-primary">Model</div><div></div></div><div><div class="font-medium text-text-primary">Execution Time</div><div><!$><!/>ms</div></div><!$><!/><div><div class="font-medium text-text-primary">TTFB</div><div><!$><!/>ms</div></div><!$><!/>`), _tmpl$13 = /* @__PURE__ */ template(`<div><!$><!/><!$><!/><div class="grid grid-cols-12 gap-4"><!$><!/><!$><!/></div><!$><!/>`), _tmpl$14 = /* @__PURE__ */ template(`<div>`), _tmpl$15 = /* @__PURE__ */ template(`<div class="col-span-12 md:col-span-6 lg:col-span-4"><div class="animate-pulse rounded-lg border border-border-subtle bg-surface-secondary p-4"><div class="mb-4 h-6 w-1/2 rounded bg-surface-tertiary"></div><div class=space-y-3><div class="h-4 rounded bg-surface-tertiary"></div><div class="h-4 w-5/6 rounded bg-surface-tertiary"></div><div class="h-4 w-4/6 rounded bg-surface-tertiary"></div></div><div class="mt-4 h-32 rounded bg-surface-tertiary">`);
|
|
7
8
|
function StreamingComponentRenderer(props) {
|
|
8
|
-
var _a;
|
|
9
|
+
var _a, _b, _c;
|
|
10
|
+
markRenderStart(props.component.id);
|
|
11
|
+
onMount(() => markRenderEnd(props.component.id));
|
|
9
12
|
const validation = validateComponent(props.component);
|
|
10
13
|
if (!validation.valid) {
|
|
11
14
|
(_a = props.onError) == null ? void 0 : _a.call(props, {
|
|
@@ -14,13 +17,23 @@ function StreamingComponentRenderer(props) {
|
|
|
14
17
|
componentId: props.component.id,
|
|
15
18
|
details: validation.errors
|
|
16
19
|
});
|
|
20
|
+
const mode = props.errorMode ?? "block";
|
|
21
|
+
const firstError = ((_c = (_b = validation.errors) == null ? void 0 : _b[0]) == null ? void 0 : _c.message) || "Unknown validation error";
|
|
22
|
+
if (mode === "silent") {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
if (mode === "inline-warn") {
|
|
26
|
+
return (() => {
|
|
27
|
+
var _el$ = getNextElement(_tmpl$), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling, [_el$6, _co$] = getNextMarker(_el$5.nextSibling);
|
|
28
|
+
setAttribute(_el$, "title", firstError);
|
|
29
|
+
insert(_el$3, () => props.component.type, _el$6, _co$);
|
|
30
|
+
return _el$;
|
|
31
|
+
})();
|
|
32
|
+
}
|
|
17
33
|
return (() => {
|
|
18
|
-
var _el$ = getNextElement(_tmpl$), _el$
|
|
19
|
-
insert(_el$
|
|
20
|
-
|
|
21
|
-
return ((_b = (_a2 = validation.errors) == null ? void 0 : _a2[0]) == null ? void 0 : _b.message) || "Unknown validation error";
|
|
22
|
-
});
|
|
23
|
-
return _el$;
|
|
34
|
+
var _el$7 = getNextElement(_tmpl$2), _el$8 = _el$7.firstChild, _el$9 = _el$8.nextSibling;
|
|
35
|
+
insert(_el$9, firstError);
|
|
36
|
+
return _el$7;
|
|
24
37
|
})();
|
|
25
38
|
}
|
|
26
39
|
const params = props.component.params;
|
|
@@ -36,41 +49,41 @@ function StreamingComponentRenderer(props) {
|
|
|
36
49
|
},
|
|
37
50
|
allowRetry: false,
|
|
38
51
|
get children() {
|
|
39
|
-
var _el$
|
|
40
|
-
_el$
|
|
41
|
-
insert(_el$
|
|
42
|
-
insert(_el$
|
|
52
|
+
var _el$0 = getNextElement(_tmpl$6), _el$1 = _el$0.firstChild, _el$10 = _el$1.firstChild, _el$22 = _el$1.nextSibling, [_el$23, _co$4] = getNextMarker(_el$22.nextSibling), _el$24 = _el$23.nextSibling, [_el$25, _co$5] = getNextMarker(_el$24.nextSibling), _el$17 = _el$25.nextSibling, _el$18 = _el$17.firstChild, _el$20 = _el$18.nextSibling, [_el$21, _co$3] = getNextMarker(_el$20.nextSibling);
|
|
53
|
+
_el$21.nextSibling;
|
|
54
|
+
insert(_el$10, () => props.component.type);
|
|
55
|
+
insert(_el$0, createComponent(Show, {
|
|
43
56
|
get when() {
|
|
44
57
|
return params == null ? void 0 : params.title;
|
|
45
58
|
},
|
|
46
59
|
get children() {
|
|
47
|
-
var _el$
|
|
48
|
-
insert(_el$
|
|
49
|
-
return _el$
|
|
60
|
+
var _el$11 = getNextElement(_tmpl$3);
|
|
61
|
+
insert(_el$11, () => params.title);
|
|
62
|
+
return _el$11;
|
|
50
63
|
}
|
|
51
|
-
}), _el$
|
|
52
|
-
insert(_el$
|
|
64
|
+
}), _el$23, _co$4);
|
|
65
|
+
insert(_el$0, createComponent(Show, {
|
|
53
66
|
get when() {
|
|
54
67
|
return memo(() => props.component.type === "metric")() && (params == null ? void 0 : params.value);
|
|
55
68
|
},
|
|
56
69
|
get children() {
|
|
57
|
-
var _el$
|
|
58
|
-
insert(_el$
|
|
59
|
-
insert(_el$
|
|
70
|
+
var _el$12 = getNextElement(_tmpl$5), _el$13 = _el$12.firstChild, _el$15 = _el$13.nextSibling, [_el$16, _co$2] = getNextMarker(_el$15.nextSibling);
|
|
71
|
+
insert(_el$13, () => params.value);
|
|
72
|
+
insert(_el$12, createComponent(Show, {
|
|
60
73
|
get when() {
|
|
61
74
|
return params.unit;
|
|
62
75
|
},
|
|
63
76
|
get children() {
|
|
64
|
-
var _el$
|
|
65
|
-
insert(_el$
|
|
66
|
-
return _el$
|
|
77
|
+
var _el$14 = getNextElement(_tmpl$4);
|
|
78
|
+
insert(_el$14, () => params.unit);
|
|
79
|
+
return _el$14;
|
|
67
80
|
}
|
|
68
|
-
}), _el$
|
|
69
|
-
return _el$
|
|
81
|
+
}), _el$16, _co$2);
|
|
82
|
+
return _el$12;
|
|
70
83
|
}
|
|
71
|
-
}), _el$
|
|
72
|
-
insert(_el$
|
|
73
|
-
return _el$
|
|
84
|
+
}), _el$25, _co$5);
|
|
85
|
+
insert(_el$17, () => props.component.id.slice(0, 8), _el$21, _co$3);
|
|
86
|
+
return _el$0;
|
|
74
87
|
}
|
|
75
88
|
});
|
|
76
89
|
}
|
|
@@ -104,78 +117,81 @@ function StreamingUIRenderer(props) {
|
|
|
104
117
|
}, 500);
|
|
105
118
|
};
|
|
106
119
|
return (() => {
|
|
107
|
-
var _el$
|
|
108
|
-
insert(_el$
|
|
120
|
+
var _el$26 = getNextElement(_tmpl$13), _el$87 = _el$26.firstChild, [_el$88, _co$16] = getNextMarker(_el$87.nextSibling), _el$89 = _el$88.nextSibling, [_el$90, _co$17] = getNextMarker(_el$89.nextSibling), _el$51 = _el$90.nextSibling, _el$52 = _el$51.firstChild, [_el$53, _co$1] = getNextMarker(_el$52.nextSibling), _el$54 = _el$53.nextSibling, [_el$55, _co$10] = getNextMarker(_el$54.nextSibling), _el$91 = _el$51.nextSibling, [_el$92, _co$18] = getNextMarker(_el$91.nextSibling);
|
|
121
|
+
insert(_el$26, createComponent(Show, {
|
|
109
122
|
get when() {
|
|
110
123
|
return memo(() => props.showProgress !== false)() && (isLoading() || isStreaming());
|
|
111
124
|
},
|
|
112
125
|
get children() {
|
|
113
|
-
var _el$
|
|
114
|
-
insert(_el$
|
|
115
|
-
insert(_el$
|
|
126
|
+
var _el$27 = getNextElement(_tmpl$9), _el$28 = _el$27.firstChild, _el$29 = _el$28.firstChild, _el$36 = _el$29.nextSibling, [_el$37, _co$8] = getNextMarker(_el$36.nextSibling), _el$38 = _el$28.nextSibling, _el$39 = _el$38.firstChild, _el$41 = _el$38.nextSibling, [_el$42, _co$9] = getNextMarker(_el$41.nextSibling);
|
|
127
|
+
insert(_el$29, () => progress().message);
|
|
128
|
+
insert(_el$28, createComponent(Show, {
|
|
116
129
|
get when() {
|
|
117
130
|
return progress().totalCount !== null;
|
|
118
131
|
},
|
|
119
132
|
get children() {
|
|
120
|
-
var _el$
|
|
121
|
-
insert(_el$
|
|
122
|
-
insert(_el$
|
|
123
|
-
return _el$
|
|
133
|
+
var _el$30 = getNextElement(_tmpl$7), _el$32 = _el$30.firstChild, [_el$33, _co$6] = getNextMarker(_el$32.nextSibling), _el$31 = _el$33.nextSibling, _el$34 = _el$31.nextSibling, [_el$35, _co$7] = getNextMarker(_el$34.nextSibling);
|
|
134
|
+
insert(_el$30, () => progress().receivedCount, _el$33, _co$6);
|
|
135
|
+
insert(_el$30, () => progress().totalCount, _el$35, _co$7);
|
|
136
|
+
return _el$30;
|
|
124
137
|
}
|
|
125
|
-
}), _el$
|
|
126
|
-
insert(_el$
|
|
138
|
+
}), _el$37, _co$8);
|
|
139
|
+
insert(_el$27, createComponent(Show, {
|
|
127
140
|
get when() {
|
|
128
141
|
return memo(() => progress().totalCount === null)() && isStreaming();
|
|
129
142
|
},
|
|
130
143
|
get children() {
|
|
131
|
-
return getNextElement(_tmpl$
|
|
144
|
+
return getNextElement(_tmpl$8);
|
|
132
145
|
}
|
|
133
|
-
}), _el$
|
|
134
|
-
effect((_$p) => style(_el$
|
|
135
|
-
return _el$
|
|
146
|
+
}), _el$42, _co$9);
|
|
147
|
+
effect((_$p) => style(_el$39, progress().totalCount !== null ? `width: ${progress().receivedCount / progress().totalCount * 100}%` : "width: 0%", _$p));
|
|
148
|
+
return _el$27;
|
|
136
149
|
}
|
|
137
|
-
}), _el$
|
|
138
|
-
insert(_el$
|
|
150
|
+
}), _el$88, _co$16);
|
|
151
|
+
insert(_el$26, createComponent(Show, {
|
|
139
152
|
get when() {
|
|
140
153
|
return error();
|
|
141
154
|
},
|
|
142
155
|
get children() {
|
|
143
|
-
var _el$
|
|
144
|
-
insert(_el$
|
|
156
|
+
var _el$43 = getNextElement(_tmpl$1), _el$44 = _el$43.firstChild, _el$45 = _el$44.firstChild, _el$46 = _el$45.nextSibling, _el$47 = _el$44.nextSibling, _el$49 = _el$47.nextSibling, [_el$50, _co$0] = getNextMarker(_el$49.nextSibling);
|
|
157
|
+
insert(_el$46, () => {
|
|
145
158
|
var _a;
|
|
146
159
|
return (_a = error()) == null ? void 0 : _a.error;
|
|
147
160
|
});
|
|
148
|
-
insert(_el$
|
|
161
|
+
insert(_el$47, () => {
|
|
149
162
|
var _a;
|
|
150
163
|
return (_a = error()) == null ? void 0 : _a.message;
|
|
151
164
|
});
|
|
152
|
-
insert(_el$
|
|
165
|
+
insert(_el$43, createComponent(Show, {
|
|
153
166
|
get when() {
|
|
154
167
|
var _a;
|
|
155
168
|
return (_a = error()) == null ? void 0 : _a.recoverable;
|
|
156
169
|
},
|
|
157
170
|
get children() {
|
|
158
|
-
var _el$
|
|
159
|
-
_el$
|
|
171
|
+
var _el$48 = getNextElement(_tmpl$0);
|
|
172
|
+
_el$48.$$click = () => startStreaming();
|
|
160
173
|
runHydrationEvents();
|
|
161
|
-
return _el$
|
|
174
|
+
return _el$48;
|
|
162
175
|
}
|
|
163
|
-
}), _el$
|
|
164
|
-
return _el$
|
|
176
|
+
}), _el$50, _co$0);
|
|
177
|
+
return _el$43;
|
|
165
178
|
}
|
|
166
|
-
}), _el$
|
|
167
|
-
insert(_el$
|
|
179
|
+
}), _el$90, _co$17);
|
|
180
|
+
insert(_el$51, createComponent(For, {
|
|
168
181
|
get each() {
|
|
169
182
|
return components();
|
|
170
183
|
},
|
|
171
184
|
children: (component) => {
|
|
172
185
|
onMount(() => handleComponentRender(component.id));
|
|
173
186
|
return (() => {
|
|
174
|
-
var _el$
|
|
175
|
-
insert(_el$
|
|
187
|
+
var _el$93 = getNextElement(_tmpl$14);
|
|
188
|
+
insert(_el$93, createComponent(StreamingComponentRenderer, {
|
|
176
189
|
component,
|
|
177
190
|
get onError() {
|
|
178
191
|
return props.onRenderError;
|
|
192
|
+
},
|
|
193
|
+
get errorMode() {
|
|
194
|
+
return props.errorMode;
|
|
179
195
|
}
|
|
180
196
|
}));
|
|
181
197
|
effect((_p$) => {
|
|
@@ -183,18 +199,18 @@ function StreamingUIRenderer(props) {
|
|
|
183
199
|
col-span-${component.position.colSpan}
|
|
184
200
|
${animatingComponents().has(component.id) ? "animate-fade-in-up" : ""}
|
|
185
201
|
`, _v$2 = `grid-column-start: ${component.position.colStart}; grid-column-end: ${component.position.colStart + component.position.colSpan}`;
|
|
186
|
-
_v$ !== _p$.e && className(_el$
|
|
187
|
-
_p$.t = style(_el$
|
|
202
|
+
_v$ !== _p$.e && className(_el$93, _p$.e = _v$);
|
|
203
|
+
_p$.t = style(_el$93, _v$2, _p$.t);
|
|
188
204
|
return _p$;
|
|
189
205
|
}, {
|
|
190
206
|
e: void 0,
|
|
191
207
|
t: void 0
|
|
192
208
|
});
|
|
193
|
-
return _el$
|
|
209
|
+
return _el$93;
|
|
194
210
|
})();
|
|
195
211
|
}
|
|
196
|
-
}), _el$
|
|
197
|
-
insert(_el$
|
|
212
|
+
}), _el$53, _co$1);
|
|
213
|
+
insert(_el$51, createComponent(Show, {
|
|
198
214
|
get when() {
|
|
199
215
|
return memo(() => !!isStreaming())() && progress().totalCount !== null;
|
|
200
216
|
},
|
|
@@ -208,65 +224,65 @@ function StreamingUIRenderer(props) {
|
|
|
208
224
|
children: () => createComponent(SkeletonComponent, {})
|
|
209
225
|
});
|
|
210
226
|
}
|
|
211
|
-
}), _el$
|
|
212
|
-
insert(_el$
|
|
227
|
+
}), _el$55, _co$10);
|
|
228
|
+
insert(_el$26, createComponent(Show, {
|
|
213
229
|
get when() {
|
|
214
230
|
return memo(() => props.showMetadata !== false)() && metadata();
|
|
215
231
|
},
|
|
216
232
|
get children() {
|
|
217
|
-
var _el$
|
|
218
|
-
_el$
|
|
219
|
-
var _el$
|
|
220
|
-
_el$
|
|
221
|
-
var _el$
|
|
222
|
-
insert(_el$
|
|
233
|
+
var _el$56 = getNextElement(_tmpl$12), _el$57 = _el$56.firstChild, _el$58 = _el$57.firstChild, _el$59 = _el$58.firstChild, _el$60 = _el$59.nextSibling, _el$61 = _el$58.nextSibling, _el$62 = _el$61.firstChild, _el$63 = _el$62.nextSibling, _el$64 = _el$61.nextSibling, _el$65 = _el$64.firstChild, _el$66 = _el$65.nextSibling, _el$68 = _el$66.firstChild, [_el$69, _co$11] = getNextMarker(_el$68.nextSibling);
|
|
234
|
+
_el$69.nextSibling;
|
|
235
|
+
var _el$83 = _el$64.nextSibling, [_el$84, _co$14] = getNextMarker(_el$83.nextSibling), _el$76 = _el$84.nextSibling, _el$77 = _el$76.firstChild, _el$78 = _el$77.nextSibling, _el$80 = _el$78.firstChild, [_el$81, _co$13] = getNextMarker(_el$80.nextSibling);
|
|
236
|
+
_el$81.nextSibling;
|
|
237
|
+
var _el$85 = _el$76.nextSibling, [_el$86, _co$15] = getNextMarker(_el$85.nextSibling);
|
|
238
|
+
insert(_el$60, () => {
|
|
223
239
|
var _a;
|
|
224
240
|
return (_a = metadata()) == null ? void 0 : _a.provider;
|
|
225
241
|
});
|
|
226
|
-
insert(_el$
|
|
242
|
+
insert(_el$63, () => {
|
|
227
243
|
var _a;
|
|
228
244
|
return (_a = metadata()) == null ? void 0 : _a.model;
|
|
229
245
|
});
|
|
230
|
-
insert(_el$
|
|
246
|
+
insert(_el$66, () => {
|
|
231
247
|
var _a;
|
|
232
248
|
return (_a = metadata()) == null ? void 0 : _a.executionTimeMs;
|
|
233
|
-
}, _el$
|
|
234
|
-
insert(_el$
|
|
249
|
+
}, _el$69, _co$11);
|
|
250
|
+
insert(_el$57, createComponent(Show, {
|
|
235
251
|
get when() {
|
|
236
252
|
var _a;
|
|
237
253
|
return ((_a = metadata()) == null ? void 0 : _a.costUSD) !== void 0;
|
|
238
254
|
},
|
|
239
255
|
get children() {
|
|
240
|
-
var _el$
|
|
241
|
-
insert(_el$
|
|
256
|
+
var _el$70 = getNextElement(_tmpl$10), _el$71 = _el$70.firstChild, _el$72 = _el$71.nextSibling, _el$73 = _el$72.firstChild, _el$74 = _el$73.nextSibling, [_el$75, _co$12] = getNextMarker(_el$74.nextSibling);
|
|
257
|
+
insert(_el$72, () => {
|
|
242
258
|
var _a, _b;
|
|
243
259
|
return (_b = (_a = metadata()) == null ? void 0 : _a.costUSD) == null ? void 0 : _b.toFixed(4);
|
|
244
|
-
}, _el$
|
|
245
|
-
return _el$
|
|
260
|
+
}, _el$75, _co$12);
|
|
261
|
+
return _el$70;
|
|
246
262
|
}
|
|
247
|
-
}), _el$
|
|
248
|
-
insert(_el$
|
|
263
|
+
}), _el$84, _co$14);
|
|
264
|
+
insert(_el$78, () => {
|
|
249
265
|
var _a;
|
|
250
266
|
return (_a = metadata()) == null ? void 0 : _a.firstTokenMs;
|
|
251
|
-
}, _el$
|
|
252
|
-
insert(_el$
|
|
267
|
+
}, _el$81, _co$13);
|
|
268
|
+
insert(_el$57, createComponent(Show, {
|
|
253
269
|
get when() {
|
|
254
270
|
var _a;
|
|
255
271
|
return (_a = metadata()) == null ? void 0 : _a.cached;
|
|
256
272
|
},
|
|
257
273
|
get children() {
|
|
258
|
-
return getNextElement(_tmpl$
|
|
274
|
+
return getNextElement(_tmpl$11);
|
|
259
275
|
}
|
|
260
|
-
}), _el$
|
|
261
|
-
return _el$
|
|
276
|
+
}), _el$86, _co$15);
|
|
277
|
+
return _el$56;
|
|
262
278
|
}
|
|
263
|
-
}), _el$
|
|
264
|
-
effect(() => className(_el$
|
|
265
|
-
return _el$
|
|
279
|
+
}), _el$92, _co$18);
|
|
280
|
+
effect(() => className(_el$26, `streaming-ui-renderer ${props.class || ""}`));
|
|
281
|
+
return _el$26;
|
|
266
282
|
})();
|
|
267
283
|
}
|
|
268
284
|
function SkeletonComponent() {
|
|
269
|
-
return getNextElement(_tmpl$
|
|
285
|
+
return getNextElement(_tmpl$15);
|
|
270
286
|
}
|
|
271
287
|
delegateEvents(["click"]);
|
|
272
288
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StreamingUIRenderer.js","sources":["../../src/components/StreamingUIRenderer.tsx"],"sourcesContent":["/**\n * StreamingUIRenderer Component - Phase 2\n *\n * Renders streaming dashboard components with skeleton states and progress indicators.\n * Uses the useStreamingUI hook for SSE connection and state management.\n *\n * Features:\n * - Skeleton loading states while components stream\n * - Progress bar and status messages\n * - Smooth component animations on arrival\n * - Error handling with retry capability\n * - Responsive 12-column grid layout\n *\n * Usage:\n * ```tsx\n * <StreamingUIRenderer\n * query=\"Show me revenue trends\"\n * spaceIds={['uuid1', 'uuid2']}\n * onComplete={(metadata) => console.log('Done!', metadata)}\n * />\n * ```\n */\n\nimport { Show, For, createSignal, onMount } from 'solid-js'\nimport { useStreamingUI, type UseStreamingUIOptions } from '../hooks/useStreamingUI'\nimport type { UIComponent, RendererError } from '../types'\nimport { validateComponent } from '../services/validation'\nimport { GenerativeUIErrorBoundary } from './GenerativeUIErrorBoundary'\n\nexport interface StreamingUIRendererProps extends UseStreamingUIOptions {\n class?: string\n showProgress?: boolean\n showMetadata?: boolean\n onRenderError?: (error: RendererError) => void\n}\n\n/**\n * Component Renderer - Inline lightweight version\n * (Full implementation in UIResourceRenderer)\n */\nfunction StreamingComponentRenderer(props: {\n component: UIComponent\n onError?: (error: RendererError) => void\n}) {\n // Validate component before rendering\n const validation = validateComponent(props.component)\n if (!validation.valid) {\n props.onError?.({\n type: 'validation',\n message: 'Component validation failed',\n componentId: props.component.id,\n details: validation.errors,\n })\n\n return (\n <div class=\"w-full bg-error-subtle border border-border-error rounded-lg p-4\">\n <p class=\"text-sm font-medium text-error-primary\">Validation Error</p>\n <p class=\"text-xs text-text-secondary mt-1\">\n {validation.errors?.[0]?.message || 'Unknown validation error'}\n </p>\n </div>\n )\n }\n\n // Simplified renderer - just show component type and title\n // Full rendering logic in UIResourceRenderer\n const params = props.component.params as any\n\n return (\n <GenerativeUIErrorBoundary\n componentId={props.component.id}\n componentType={props.component.type}\n onError={props.onError}\n allowRetry={false}\n >\n <div class=\"w-full bg-surface-secondary border border-border-subtle rounded-lg p-4\">\n <div class=\"flex items-center gap-2 mb-2\">\n <span class=\"text-xs font-medium text-text-tertiary uppercase\">\n {props.component.type}\n </span>\n </div>\n <Show when={params?.title}>\n <h3 class=\"text-sm font-semibold text-text-primary\">{params.title}</h3>\n </Show>\n <Show when={props.component.type === 'metric' && params?.value}>\n <div class=\"mt-2\">\n <p class=\"text-2xl font-semibold text-text-primary\">{params.value}</p>\n <Show when={params.unit}>\n <span class=\"text-sm text-text-secondary\">{params.unit}</span>\n </Show>\n </div>\n </Show>\n <div class=\"mt-3 text-xs text-text-tertiary\">\n Component ID: {props.component.id.slice(0, 8)}...\n </div>\n </div>\n </GenerativeUIErrorBoundary>\n )\n}\n\nexport function StreamingUIRenderer(props: StreamingUIRendererProps) {\n const { components, isLoading, isStreaming, error, progress, metadata, startStreaming } =\n useStreamingUI({\n query: props.query,\n spaceIds: props.spaceIds,\n sessionId: props.sessionId,\n options: props.options,\n onComplete: props.onComplete,\n onError: props.onError,\n onComponentReceived: props.onComponentReceived,\n })\n\n const [animatingComponents, setAnimatingComponents] = createSignal<Set<string>>(new Set())\n\n // Track new components for animation\n const handleComponentRender = (componentId: string) => {\n setAnimatingComponents((prev) => new Set([...prev, componentId]))\n\n // Remove from animating set after animation completes\n setTimeout(() => {\n setAnimatingComponents((prev) => {\n const next = new Set(prev)\n next.delete(componentId)\n return next\n })\n }, 500)\n }\n\n return (\n <div class={`streaming-ui-renderer ${props.class || ''}`}>\n {/* Progress Bar */}\n <Show when={props.showProgress !== false && (isLoading() || isStreaming())}>\n <div class=\"mb-4 rounded-lg border border-border-subtle bg-surface-secondary p-4\">\n {/* Status Message */}\n <div class=\"mb-2 flex items-center justify-between\">\n <span class=\"text-sm font-medium text-text-primary\">{progress().message}</span>\n <Show when={progress().totalCount !== null}>\n <span class=\"text-sm text-text-secondary\">\n {progress().receivedCount} / {progress().totalCount}\n </span>\n </Show>\n </div>\n\n {/* Progress Bar */}\n <div class=\"h-2 w-full overflow-hidden rounded-full bg-surface-tertiary\">\n <div\n class=\"h-full bg-brand-primary transition-all duration-300 ease-out\"\n style={\n progress().totalCount !== null\n ? `width: ${(progress().receivedCount / progress().totalCount!) * 100}%`\n : 'width: 0%'\n }\n />\n </div>\n\n {/* Indeterminate Progress (when totalCount unknown) */}\n <Show when={progress().totalCount === null && isStreaming()}>\n <div class=\"mt-2\">\n <div class=\"h-1 w-full overflow-hidden rounded-full bg-surface-tertiary\">\n <div class=\"animate-progress-indeterminate h-full w-1/3 bg-brand-primary\" />\n </div>\n </div>\n </Show>\n </div>\n </Show>\n\n {/* Error State */}\n <Show when={error()}>\n <div class=\"mb-4 rounded-lg border border-border-error bg-error-subtle p-4\">\n <div class=\"mb-2 flex items-center gap-2\">\n <svg\n class=\"h-5 w-5 text-error-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span class=\"font-medium text-error-primary\">{error()?.error}</span>\n </div>\n <p class=\"text-sm text-text-secondary\">{error()?.message}</p>\n\n {/* Retry Button (if recoverable) */}\n <Show when={error()?.recoverable}>\n <button\n type=\"button\"\n class=\"mt-3 rounded-md bg-error-primary px-3 py-1.5 text-sm font-medium text-white hover:bg-error-hover\"\n onClick={() => startStreaming()}\n >\n Retry\n </button>\n </Show>\n </div>\n </Show>\n\n {/* Components Grid */}\n <div class=\"grid grid-cols-12 gap-4\">\n {/* Render received components */}\n <For each={components()}>\n {(component) => {\n // Trigger animation on mount (SSR-safe, no 'use' directive needed)\n onMount(() => handleComponentRender(component.id))\n\n return (\n <div\n class={`\n col-span-${component.position.colSpan}\n ${animatingComponents().has(component.id) ? 'animate-fade-in-up' : ''}\n `}\n style={`grid-column-start: ${component.position.colStart}; grid-column-end: ${component.position.colStart + component.position.colSpan}`}\n >\n <StreamingComponentRenderer component={component} onError={props.onRenderError} />\n </div>\n )\n }}\n </For>\n\n {/* Skeleton placeholders (if streaming and expecting more) */}\n <Show when={isStreaming() && progress().totalCount !== null}>\n <For\n each={Array.from({\n length: progress().totalCount! - progress().receivedCount,\n })}\n >\n {() => <SkeletonComponent />}\n </For>\n </Show>\n </div>\n\n {/* Metadata Display */}\n <Show when={props.showMetadata !== false && metadata()}>\n <div class=\"mt-6 rounded-lg border border-border-subtle bg-surface-secondary p-4 text-sm text-text-secondary\">\n <div class=\"grid grid-cols-2 gap-4 md:grid-cols-4\">\n <div>\n <div class=\"font-medium text-text-primary\">Provider</div>\n <div>{metadata()?.provider}</div>\n </div>\n <div>\n <div class=\"font-medium text-text-primary\">Model</div>\n <div>{metadata()?.model}</div>\n </div>\n <div>\n <div class=\"font-medium text-text-primary\">Execution Time</div>\n <div>{metadata()?.executionTimeMs}ms</div>\n </div>\n <Show when={metadata()?.costUSD !== undefined}>\n <div>\n <div class=\"font-medium text-text-primary\">Cost</div>\n <div>${metadata()?.costUSD?.toFixed(4)}</div>\n </div>\n </Show>\n <div>\n <div class=\"font-medium text-text-primary\">TTFB</div>\n <div>{metadata()?.firstTokenMs}ms</div>\n </div>\n <Show when={metadata()?.cached}>\n <div>\n <div class=\"font-medium text-text-primary\">Cached</div>\n <div class=\"text-success-primary\">Yes</div>\n </div>\n </Show>\n </div>\n </div>\n </Show>\n </div>\n )\n}\n\n/**\n * Skeleton Component - Placeholder while components load\n */\nfunction SkeletonComponent() {\n return (\n <div class=\"col-span-12 md:col-span-6 lg:col-span-4\">\n <div class=\"animate-pulse rounded-lg border border-border-subtle bg-surface-secondary p-4\">\n {/* Header skeleton */}\n <div class=\"mb-4 h-6 w-1/2 rounded bg-surface-tertiary\" />\n\n {/* Content skeleton */}\n <div class=\"space-y-3\">\n <div class=\"h-4 rounded bg-surface-tertiary\" />\n <div class=\"h-4 w-5/6 rounded bg-surface-tertiary\" />\n <div class=\"h-4 w-4/6 rounded bg-surface-tertiary\" />\n </div>\n\n {/* Chart/visual skeleton */}\n <div class=\"mt-4 h-32 rounded bg-surface-tertiary\" />\n </div>\n </div>\n )\n}\n\n// CSS Animations (add to global styles or Tailwind config)\n/*\n@keyframes fade-in-up {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes progress-indeterminate {\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(400%);\n }\n}\n\n.animate-fade-in-up {\n animation: fade-in-up 0.5s ease-out;\n}\n\n.animate-progress-indeterminate {\n animation: progress-indeterminate 1.5s infinite ease-in-out;\n}\n*/\n"],"names":["StreamingComponentRenderer","props","validation","validateComponent","component","valid","onError","type","message","componentId","id","details","errors","_el$","_$getNextElement","_tmpl$","_el$2","firstChild","_el$3","nextSibling","_$insert","params","_$createComponent","GenerativeUIErrorBoundary","componentType","allowRetry","children","_el$4","_tmpl$5","_el$5","_el$6","_el$16","_el$17","_co$3","_$getNextMarker","_el$18","_el$19","_co$4","_el$11","_el$12","_el$14","_el$15","_co$2","Show","when","title","_el$7","_tmpl$2","_$memo","value","_el$8","_tmpl$4","_el$9","_el$1","_el$10","_co$","unit","_el$0","_tmpl$3","slice","StreamingUIRenderer","components","isLoading","isStreaming","error","progress","metadata","startStreaming","useStreamingUI","query","spaceIds","sessionId","options","onComplete","onComponentReceived","animatingComponents","setAnimatingComponents","createSignal","Set","handleComponentRender","prev","setTimeout","next","delete","_el$20","_tmpl$12","_el$81","_el$82","_co$15","_el$83","_el$84","_co$16","_el$45","_el$46","_el$47","_co$0","_el$48","_el$49","_co$1","_el$85","_el$86","_co$17","showProgress","_el$21","_tmpl$8","_el$22","_el$23","_el$30","_el$31","_co$7","_el$32","_el$33","_el$35","_el$36","_co$8","totalCount","_el$24","_tmpl$6","_el$26","_el$27","_co$5","_el$25","_el$28","_el$29","_co$6","receivedCount","_tmpl$7","_$effect","_$p","_$style","_el$37","_tmpl$0","_el$38","_el$39","_el$40","_el$41","_el$43","_el$44","_co$9","recoverable","_el$42","_tmpl$9","$$click","_$runHydrationEvents","For","each","onMount","_el$87","_tmpl$13","onRenderError","_p$","_v$","position","colSpan","has","_v$2","colStart","e","_$className","t","undefined","Array","from","length","SkeletonComponent","showMetadata","_el$50","_tmpl$11","_el$51","_el$52","_el$53","_el$54","_el$55","_el$56","_el$57","_el$58","_el$59","_el$60","_el$62","_el$63","_co$10","_el$77","_el$78","_co$13","_el$70","_el$71","_el$72","_el$74","_el$75","_co$12","_el$79","_el$80","_co$14","provider","model","executionTimeMs","costUSD","_el$64","_tmpl$1","_el$65","_el$66","_el$67","_el$68","_el$69","_co$11","toFixed","firstTokenMs","cached","_tmpl$10","class","_tmpl$14","_$delegateEvents"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"StreamingUIRenderer.js","sources":["../../src/components/StreamingUIRenderer.tsx"],"sourcesContent":["/**\n * StreamingUIRenderer Component - Phase 2\n *\n * Renders streaming dashboard components with skeleton states and progress indicators.\n * Uses the useStreamingUI hook for SSE connection and state management.\n *\n * Features:\n * - Skeleton loading states while components stream\n * - Progress bar and status messages\n * - Smooth component animations on arrival\n * - Error handling with retry capability\n * - Responsive 12-column grid layout\n *\n * Usage:\n * ```tsx\n * <StreamingUIRenderer\n * query=\"Show me revenue trends\"\n * spaceIds={['uuid1', 'uuid2']}\n * onComplete={(metadata) => console.log('Done!', metadata)}\n * />\n * ```\n */\n\nimport { Show, For, createSignal, onMount } from 'solid-js'\nimport { useStreamingUI, type UseStreamingUIOptions } from '../hooks/useStreamingUI'\nimport type { UIComponent, RendererError } from '../types'\nimport { validateComponent } from '../services/validation'\nimport { GenerativeUIErrorBoundary } from './GenerativeUIErrorBoundary'\nimport { markRenderStart, markRenderEnd } from '../utils/perf'\nimport type { ValidationErrorMode } from './UIResourceRenderer'\n\nexport interface StreamingUIRendererProps extends UseStreamingUIOptions {\n class?: string\n showProgress?: boolean\n showMetadata?: boolean\n onRenderError?: (error: RendererError) => void\n /**\n * How to react when a streamed component fails `validateComponent()`\n * (v5.4.0). Defaults to `'block'` (full red error card — pre-v5.4.0\n * behavior). See `ValidationErrorMode` in `UIResourceRenderer`.\n */\n errorMode?: ValidationErrorMode\n}\n\n/**\n * Component Renderer - Inline lightweight version\n * (Full implementation in UIResourceRenderer)\n */\nfunction StreamingComponentRenderer(props: {\n component: UIComponent\n onError?: (error: RendererError) => void\n errorMode?: ValidationErrorMode\n}) {\n // Performance marks (v5.4.0) — see utils/perf.ts\n markRenderStart(props.component.id)\n onMount(() => markRenderEnd(props.component.id))\n\n // Validate component before rendering\n const validation = validateComponent(props.component)\n if (!validation.valid) {\n props.onError?.({\n type: 'validation',\n message: 'Component validation failed',\n componentId: props.component.id,\n details: validation.errors,\n })\n\n const mode: ValidationErrorMode = props.errorMode ?? 'block'\n const firstError = validation.errors?.[0]?.message || 'Unknown validation error'\n\n if (mode === 'silent') {\n return null\n }\n\n if (mode === 'inline-warn') {\n return (\n <div\n class=\"inline-flex items-center gap-1.5 px-2 py-1 rounded-md bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 text-xs text-yellow-800 dark:text-yellow-200\"\n role=\"alert\"\n aria-label=\"Component validation warning\"\n title={firstError}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"w-3.5 h-3.5\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n <span>Invalid {props.component.type}</span>\n </div>\n )\n }\n\n return (\n <div class=\"w-full bg-error-subtle border border-border-error rounded-lg p-4\">\n <p class=\"text-sm font-medium text-error-primary\">Validation Error</p>\n <p class=\"text-xs text-text-secondary mt-1\">\n {firstError}\n </p>\n </div>\n )\n }\n\n // Simplified renderer - just show component type and title\n // Full rendering logic in UIResourceRenderer\n const params = props.component.params as any\n\n return (\n <GenerativeUIErrorBoundary\n componentId={props.component.id}\n componentType={props.component.type}\n onError={props.onError}\n allowRetry={false}\n >\n <div class=\"w-full bg-surface-secondary border border-border-subtle rounded-lg p-4\">\n <div class=\"flex items-center gap-2 mb-2\">\n <span class=\"text-xs font-medium text-text-tertiary uppercase\">\n {props.component.type}\n </span>\n </div>\n <Show when={params?.title}>\n <h3 class=\"text-sm font-semibold text-text-primary\">{params.title}</h3>\n </Show>\n <Show when={props.component.type === 'metric' && params?.value}>\n <div class=\"mt-2\">\n <p class=\"text-2xl font-semibold text-text-primary\">{params.value}</p>\n <Show when={params.unit}>\n <span class=\"text-sm text-text-secondary\">{params.unit}</span>\n </Show>\n </div>\n </Show>\n <div class=\"mt-3 text-xs text-text-tertiary\">\n Component ID: {props.component.id.slice(0, 8)}...\n </div>\n </div>\n </GenerativeUIErrorBoundary>\n )\n}\n\nexport function StreamingUIRenderer(props: StreamingUIRendererProps) {\n const { components, isLoading, isStreaming, error, progress, metadata, startStreaming } =\n useStreamingUI({\n query: props.query,\n spaceIds: props.spaceIds,\n sessionId: props.sessionId,\n options: props.options,\n onComplete: props.onComplete,\n onError: props.onError,\n onComponentReceived: props.onComponentReceived,\n })\n\n const [animatingComponents, setAnimatingComponents] = createSignal<Set<string>>(new Set())\n\n // Track new components for animation\n const handleComponentRender = (componentId: string) => {\n setAnimatingComponents((prev) => new Set([...prev, componentId]))\n\n // Remove from animating set after animation completes\n setTimeout(() => {\n setAnimatingComponents((prev) => {\n const next = new Set(prev)\n next.delete(componentId)\n return next\n })\n }, 500)\n }\n\n return (\n <div class={`streaming-ui-renderer ${props.class || ''}`}>\n {/* Progress Bar */}\n <Show when={props.showProgress !== false && (isLoading() || isStreaming())}>\n <div class=\"mb-4 rounded-lg border border-border-subtle bg-surface-secondary p-4\">\n {/* Status Message */}\n <div class=\"mb-2 flex items-center justify-between\">\n <span class=\"text-sm font-medium text-text-primary\">{progress().message}</span>\n <Show when={progress().totalCount !== null}>\n <span class=\"text-sm text-text-secondary\">\n {progress().receivedCount} / {progress().totalCount}\n </span>\n </Show>\n </div>\n\n {/* Progress Bar */}\n <div class=\"h-2 w-full overflow-hidden rounded-full bg-surface-tertiary\">\n <div\n class=\"h-full bg-brand-primary transition-all duration-300 ease-out\"\n style={\n progress().totalCount !== null\n ? `width: ${(progress().receivedCount / progress().totalCount!) * 100}%`\n : 'width: 0%'\n }\n />\n </div>\n\n {/* Indeterminate Progress (when totalCount unknown) */}\n <Show when={progress().totalCount === null && isStreaming()}>\n <div class=\"mt-2\">\n <div class=\"h-1 w-full overflow-hidden rounded-full bg-surface-tertiary\">\n <div class=\"animate-progress-indeterminate h-full w-1/3 bg-brand-primary\" />\n </div>\n </div>\n </Show>\n </div>\n </Show>\n\n {/* Error State */}\n <Show when={error()}>\n <div class=\"mb-4 rounded-lg border border-border-error bg-error-subtle p-4\">\n <div class=\"mb-2 flex items-center gap-2\">\n <svg\n class=\"h-5 w-5 text-error-primary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span class=\"font-medium text-error-primary\">{error()?.error}</span>\n </div>\n <p class=\"text-sm text-text-secondary\">{error()?.message}</p>\n\n {/* Retry Button (if recoverable) */}\n <Show when={error()?.recoverable}>\n <button\n type=\"button\"\n class=\"mt-3 rounded-md bg-error-primary px-3 py-1.5 text-sm font-medium text-white hover:bg-error-hover\"\n onClick={() => startStreaming()}\n >\n Retry\n </button>\n </Show>\n </div>\n </Show>\n\n {/* Components Grid */}\n <div class=\"grid grid-cols-12 gap-4\">\n {/* Render received components */}\n <For each={components()}>\n {(component) => {\n // Trigger animation on mount (SSR-safe, no 'use' directive needed)\n onMount(() => handleComponentRender(component.id))\n\n return (\n <div\n class={`\n col-span-${component.position.colSpan}\n ${animatingComponents().has(component.id) ? 'animate-fade-in-up' : ''}\n `}\n style={`grid-column-start: ${component.position.colStart}; grid-column-end: ${component.position.colStart + component.position.colSpan}`}\n >\n <StreamingComponentRenderer\n component={component}\n onError={props.onRenderError}\n errorMode={props.errorMode}\n />\n </div>\n )\n }}\n </For>\n\n {/* Skeleton placeholders (if streaming and expecting more) */}\n <Show when={isStreaming() && progress().totalCount !== null}>\n <For\n each={Array.from({\n length: progress().totalCount! - progress().receivedCount,\n })}\n >\n {() => <SkeletonComponent />}\n </For>\n </Show>\n </div>\n\n {/* Metadata Display */}\n <Show when={props.showMetadata !== false && metadata()}>\n <div class=\"mt-6 rounded-lg border border-border-subtle bg-surface-secondary p-4 text-sm text-text-secondary\">\n <div class=\"grid grid-cols-2 gap-4 md:grid-cols-4\">\n <div>\n <div class=\"font-medium text-text-primary\">Provider</div>\n <div>{metadata()?.provider}</div>\n </div>\n <div>\n <div class=\"font-medium text-text-primary\">Model</div>\n <div>{metadata()?.model}</div>\n </div>\n <div>\n <div class=\"font-medium text-text-primary\">Execution Time</div>\n <div>{metadata()?.executionTimeMs}ms</div>\n </div>\n <Show when={metadata()?.costUSD !== undefined}>\n <div>\n <div class=\"font-medium text-text-primary\">Cost</div>\n <div>${metadata()?.costUSD?.toFixed(4)}</div>\n </div>\n </Show>\n <div>\n <div class=\"font-medium text-text-primary\">TTFB</div>\n <div>{metadata()?.firstTokenMs}ms</div>\n </div>\n <Show when={metadata()?.cached}>\n <div>\n <div class=\"font-medium text-text-primary\">Cached</div>\n <div class=\"text-success-primary\">Yes</div>\n </div>\n </Show>\n </div>\n </div>\n </Show>\n </div>\n )\n}\n\n/**\n * Skeleton Component - Placeholder while components load\n */\nfunction SkeletonComponent() {\n return (\n <div class=\"col-span-12 md:col-span-6 lg:col-span-4\">\n <div class=\"animate-pulse rounded-lg border border-border-subtle bg-surface-secondary p-4\">\n {/* Header skeleton */}\n <div class=\"mb-4 h-6 w-1/2 rounded bg-surface-tertiary\" />\n\n {/* Content skeleton */}\n <div class=\"space-y-3\">\n <div class=\"h-4 rounded bg-surface-tertiary\" />\n <div class=\"h-4 w-5/6 rounded bg-surface-tertiary\" />\n <div class=\"h-4 w-4/6 rounded bg-surface-tertiary\" />\n </div>\n\n {/* Chart/visual skeleton */}\n <div class=\"mt-4 h-32 rounded bg-surface-tertiary\" />\n </div>\n </div>\n )\n}\n\n// CSS Animations (add to global styles or Tailwind config)\n/*\n@keyframes fade-in-up {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes progress-indeterminate {\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(400%);\n }\n}\n\n.animate-fade-in-up {\n animation: fade-in-up 0.5s ease-out;\n}\n\n.animate-progress-indeterminate {\n animation: progress-indeterminate 1.5s infinite ease-in-out;\n}\n*/\n"],"names":["StreamingComponentRenderer","props","markRenderStart","component","id","onMount","markRenderEnd","validation","validateComponent","valid","onError","type","message","componentId","details","errors","mode","errorMode","firstError","_el$","_$getNextElement","_tmpl$","_el$2","firstChild","_el$3","nextSibling","_el$4","_el$5","_el$6","_co$","_$getNextMarker","_$setAttribute","_$insert","_el$7","_tmpl$2","_el$8","_el$9","params","_$createComponent","GenerativeUIErrorBoundary","componentType","allowRetry","children","_el$0","_tmpl$6","_el$1","_el$10","_el$22","_el$23","_co$4","_el$24","_el$25","_co$5","_el$17","_el$18","_el$20","_el$21","_co$3","Show","when","title","_el$11","_tmpl$3","_$memo","value","_el$12","_tmpl$5","_el$13","_el$15","_el$16","_co$2","unit","_el$14","_tmpl$4","slice","StreamingUIRenderer","components","isLoading","isStreaming","error","progress","metadata","startStreaming","useStreamingUI","query","spaceIds","sessionId","options","onComplete","onComponentReceived","animatingComponents","setAnimatingComponents","createSignal","Set","handleComponentRender","prev","setTimeout","next","delete","_el$26","_tmpl$13","_el$87","_el$88","_co$16","_el$89","_el$90","_co$17","_el$51","_el$52","_el$53","_co$1","_el$54","_el$55","_co$10","_el$91","_el$92","_co$18","showProgress","_el$27","_tmpl$9","_el$28","_el$29","_el$36","_el$37","_co$8","_el$38","_el$39","_el$41","_el$42","_co$9","totalCount","_el$30","_tmpl$7","_el$32","_el$33","_co$6","_el$31","_el$34","_el$35","_co$7","receivedCount","_tmpl$8","_$effect","_$p","_$style","_el$43","_tmpl$1","_el$44","_el$45","_el$46","_el$47","_el$49","_el$50","_co$0","recoverable","_el$48","_tmpl$0","$$click","_$runHydrationEvents","For","each","_el$93","_tmpl$14","onRenderError","_p$","_v$","position","colSpan","has","_v$2","colStart","e","_$className","t","undefined","Array","from","length","SkeletonComponent","showMetadata","_el$56","_tmpl$12","_el$57","_el$58","_el$59","_el$60","_el$61","_el$62","_el$63","_el$64","_el$65","_el$66","_el$68","_el$69","_co$11","_el$83","_el$84","_co$14","_el$76","_el$77","_el$78","_el$80","_el$81","_co$13","_el$85","_el$86","_co$15","provider","model","executionTimeMs","costUSD","_el$70","_tmpl$10","_el$71","_el$72","_el$73","_el$74","_el$75","_co$12","toFixed","firstTokenMs","cached","_tmpl$11","class","_tmpl$15","_$delegateEvents"],"mappings":";;;;;;;AAgDA,SAASA,2BAA2BC,OAIjC;;AAEDC,kBAAgBD,MAAME,UAAUC,EAAE;AAClCC,UAAQ,MAAMC,cAAcL,MAAME,UAAUC,EAAE,CAAC;AAG/C,QAAMG,aAAaC,kBAAkBP,MAAME,SAAS;AACpD,MAAI,CAACI,WAAWE,OAAO;AACrBR,gBAAMS,YAANT,+BAAgB;AAAA,MACdU,MAAM;AAAA,MACNC,SAAS;AAAA,MACTC,aAAaZ,MAAME,UAAUC;AAAAA,MAC7BU,SAASP,WAAWQ;AAAAA,IAAAA;AAGtB,UAAMC,OAA4Bf,MAAMgB,aAAa;AACrD,UAAMC,eAAaX,sBAAWQ,WAAXR,mBAAoB,OAApBA,mBAAwBK,YAAW;AAEtD,QAAII,SAAS,UAAU;AACrB,aAAO;AAAA,IACT;AAEA,QAAIA,SAAS,eAAe;AAC1B,cAAA,MAAA;AAAA,YAAAG,OAAAC,eAAAC,MAAA,GAAAC,QAAAH,KAAAI,YAAAC,QAAAF,MAAAG,aAAAC,QAAAF,MAAAD,YAAAI,QAAAD,MAAAD,aAAA,CAAAG,OAAAC,IAAA,IAAAC,cAAAH,MAAAF,WAAA;AAAAM,qBAAAZ,MAAA,SAKWD,UAAU;AAAAc,eAAAR,OAAA,MAiBFvB,MAAME,UAAUQ,MAAIiB,OAAAC,IAAA;AAAA,eAAAV;AAAAA,MAAA,GAAA;AAAA,IAGzC;AAEA,YAAA,MAAA;AAAA,UAAAc,QAAAb,eAAAc,OAAA,GAAAC,QAAAF,MAAAV,YAAAa,QAAAD,MAAAV;AAAAO,aAAAI,OAIOlB,UAAU;AAAA,aAAAe;AAAAA,IAAA,GAAA;AAAA,EAInB;AAIA,QAAMI,SAASpC,MAAME,UAAUkC;AAE/B,SAAAC,gBACGC,2BAAyB;AAAA,IAAA,IACxB1B,cAAW;AAAA,aAAEZ,MAAME,UAAUC;AAAAA,IAAE;AAAA,IAAA,IAC/BoC,gBAAa;AAAA,aAAEvC,MAAME,UAAUQ;AAAAA,IAAI;AAAA,IAAA,IACnCD,UAAO;AAAA,aAAET,MAAMS;AAAAA,IAAO;AAAA,IACtB+B,YAAY;AAAA,IAAK,IAAAC,WAAA;AAAA,UAAAC,QAAAvB,eAAAwB,OAAA,GAAAC,QAAAF,MAAApB,YAAAuB,SAAAD,MAAAtB,YAAAwB,SAAAF,MAAApB,aAAA,CAAAuB,QAAAC,KAAA,IAAAnB,cAAAiB,OAAAtB,WAAA,GAAAyB,SAAAF,OAAAvB,aAAA,CAAA0B,QAAAC,KAAA,IAAAtB,cAAAoB,OAAAzB,WAAA,GAAA4B,SAAAF,OAAA1B,aAAA6B,SAAAD,OAAA9B,YAAAgC,SAAAD,OAAA7B,aAAA,CAAA+B,QAAAC,KAAA,IAAA3B,cAAAyB,OAAA9B,WAAA;AAAA+B,aAAA/B;AAAAO,aAAAc,QAAA,MAKV7C,MAAME,UAAUQ,IAAI;AAAAqB,aAAAW,OAAAL,gBAGxBoB,MAAI;AAAA,QAAA,IAACC,OAAI;AAAA,iBAAEtB,iCAAQuB;AAAAA,QAAK;AAAA,QAAA,IAAAlB,WAAA;AAAA,cAAAmB,SAAAzC,eAAA0C,OAAA;AAAA9B,iBAAA6B,QAAA,MAC8BxB,OAAOuB,KAAK;AAAA,iBAAAC;AAAAA,QAAA;AAAA,MAAA,CAAA,GAAAb,QAAAC,KAAA;AAAAjB,aAAAW,OAAAL,gBAElEoB,MAAI;AAAA,QAAA,IAACC,OAAI;AAAA,iBAAEI,KAAA,MAAA9D,MAAME,UAAUQ,SAAS,QAAQ,EAAA,MAAI0B,iCAAQ2B;AAAAA,QAAK;AAAA,QAAA,IAAAtB,WAAA;AAAA,cAAAuB,SAAA7C,eAAA8C,OAAA,GAAAC,SAAAF,OAAA1C,YAAA6C,SAAAD,OAAA1C,aAAA,CAAA4C,QAAAC,KAAA,IAAAxC,cAAAsC,OAAA3C,WAAA;AAAAO,iBAAAmC,QAAA,MAEL9B,OAAO2B,KAAK;AAAAhC,iBAAAiC,QAAA3B,gBAChEoB,MAAI;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAEtB,OAAOkC;AAAAA,YAAI;AAAA,YAAA,IAAA7B,WAAA;AAAA,kBAAA8B,SAAApD,eAAAqD,OAAA;AAAAzC,qBAAAwC,QAAA,MACsBnC,OAAOkC,IAAI;AAAA,qBAAAC;AAAAA,YAAA;AAAA,UAAA,CAAA,GAAAH,QAAAC,KAAA;AAAA,iBAAAL;AAAAA,QAAA;AAAA,MAAA,CAAA,GAAAd,QAAAC,KAAA;AAAApB,aAAAqB,QAAA,MAK3CpD,MAAME,UAAUC,GAAGsE,MAAM,GAAG,CAAC,GAAClB,QAAAC,KAAA;AAAA,aAAAd;AAAAA,IAAA;AAAA,EAAA,CAAA;AAKvD;AAEO,SAASgC,oBAAoB1E,OAAiC;AACnE,QAAM;AAAA,IAAE2E;AAAAA,IAAYC;AAAAA,IAAWC;AAAAA,IAAaC;AAAAA,IAAOC;AAAAA,IAAUC;AAAAA,IAAUC;AAAAA,EAAAA,IACrEC,eAAe;AAAA,IACbC,OAAOnF,MAAMmF;AAAAA,IACbC,UAAUpF,MAAMoF;AAAAA,IAChBC,WAAWrF,MAAMqF;AAAAA,IACjBC,SAAStF,MAAMsF;AAAAA,IACfC,YAAYvF,MAAMuF;AAAAA,IAClB9E,SAAST,MAAMS;AAAAA,IACf+E,qBAAqBxF,MAAMwF;AAAAA,EAAAA,CAC5B;AAEH,QAAM,CAACC,qBAAqBC,sBAAsB,IAAIC,aAA0B,oBAAIC,KAAK;AAGzF,QAAMC,wBAAwBA,CAACjF,gBAAwB;AACrD8E,2BAAwBI,CAAAA,6BAAaF,IAAI,CAAC,GAAGE,MAAMlF,WAAW,CAAC,CAAC;AAGhEmF,eAAW,MAAM;AACfL,6BAAwBI,CAAAA,SAAS;AAC/B,cAAME,OAAO,IAAIJ,IAAIE,IAAI;AACzBE,aAAKC,OAAOrF,WAAW;AACvB,eAAOoF;AAAAA,MACT,CAAC;AAAA,IACH,GAAG,GAAG;AAAA,EACR;AAEA,UAAA,MAAA;AAAA,QAAAE,SAAA/E,eAAAgF,QAAA,GAAAC,SAAAF,OAAA5E,YAAA,CAAA+E,QAAAC,MAAA,IAAAzE,cAAAuE,OAAA5E,WAAA,GAAA+E,SAAAF,OAAA7E,aAAA,CAAAgF,QAAAC,MAAA,IAAA5E,cAAA0E,OAAA/E,WAAA,GAAAkF,SAAAF,OAAAhF,aAAAmF,SAAAD,OAAApF,YAAA,CAAAsF,QAAAC,KAAA,IAAAhF,cAAA8E,OAAAnF,WAAA,GAAAsF,SAAAF,OAAApF,aAAA,CAAAuF,QAAAC,MAAA,IAAAnF,cAAAiF,OAAAtF,WAAA,GAAAyF,SAAAP,OAAAlF,aAAA,CAAA0F,QAAAC,MAAA,IAAAtF,cAAAoF,OAAAzF,WAAA;AAAAO,WAAAmE,QAAA7D,gBAGKoB,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEI,KAAA,MAAA9D,MAAMoH,iBAAiB,KAAK,QAAKxC,eAAeC;MAAc;AAAA,MAAA,IAAApC,WAAA;AAAA,YAAA4E,SAAAlG,eAAAmG,OAAA,GAAAC,SAAAF,OAAA/F,YAAAkG,SAAAD,OAAAjG,YAAAmG,SAAAD,OAAAhG,aAAA,CAAAkG,QAAAC,KAAA,IAAA9F,cAAA4F,OAAAjG,WAAA,GAAAoG,SAAAL,OAAA/F,aAAAqG,SAAAD,OAAAtG,YAAAwG,SAAAF,OAAApG,aAAA,CAAAuG,QAAAC,KAAA,IAAAnG,cAAAiG,OAAAtG,WAAA;AAAAO,eAAAyF,QAAA,MAIfzC,SAAAA,EAAWpE,OAAO;AAAAoB,eAAAwF,QAAAlF,gBACtEoB,MAAI;AAAA,UAAA,IAACC,OAAI;AAAA,mBAAEqB,SAAAA,EAAWkD,eAAe;AAAA,UAAI;AAAA,UAAA,IAAAxF,WAAA;AAAA,gBAAAyF,SAAA/G,eAAAgH,OAAA,GAAAC,SAAAF,OAAA5G,YAAA,CAAA+G,QAAAC,KAAA,IAAAzG,cAAAuG,OAAA5G,WAAA,GAAA+G,SAAAF,OAAA7G,aAAAgH,SAAAD,OAAA/G,aAAA,CAAAiH,QAAAC,KAAA,IAAA7G,cAAA2G,OAAAhH,WAAA;AAAAO,mBAAAmG,QAAA,MAErCnD,SAAAA,EAAW4D,eAAaN,QAAAC,KAAA;AAAAvG,mBAAAmG,QAAA,MAAKnD,SAAAA,EAAWkD,YAAUQ,QAAAC,KAAA;AAAA,mBAAAR;AAAAA,UAAA;AAAA,QAAA,CAAA,GAAAR,QAAAC,KAAA;AAAA5F,eAAAsF,QAAAhF,gBAkBxDoB,MAAI;AAAA,UAAA,IAACC,OAAI;AAAA,mBAAEI,KAAA,MAAAiB,SAAAA,EAAWkD,eAAe,IAAI,EAAA,KAAIpD,YAAAA;AAAAA,UAAa;AAAA,UAAA,IAAApC,WAAA;AAAA,mBAAAtB,eAAAyH,OAAA;AAAA,UAAA;AAAA,QAAA,CAAA,GAAAb,QAAAC,KAAA;AAAAa,eAAAC,SAAAC,MAAAlB,QARrD9C,WAAWkD,eAAe,OACtB,UAAWlD,SAAAA,EAAW4D,gBAAgB5D,WAAWkD,aAAe,GAAG,MACnE,aAAWa,GAAA,CAAA;AAAA,eAAAzB;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAAhB,QAAAC,MAAA;AAAAvE,WAAAmE,QAAA7D,gBAiBxBoB,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEoB,MAAAA;AAAAA,MAAO;AAAA,MAAA,IAAArC,WAAA;AAAA,YAAAuG,SAAA7H,eAAA8H,OAAA,GAAAC,SAAAF,OAAA1H,YAAA6H,SAAAD,OAAA5H,YAAA8H,SAAAD,OAAA3H,aAAA6H,SAAAH,OAAA1H,aAAA8H,SAAAD,OAAA7H,aAAA,CAAA+H,QAAAC,KAAA,IAAA3H,cAAAyH,OAAA9H,WAAA;AAAAO,eAAAqH,QAAA;;AAgBiCtE,6BAAAA,MAAAA,mBAASA;AAAAA,SAAK;AAAA/C,eAAAsH,QAAA;;AAEtBvE,6BAAAA,MAAAA,mBAASnE;AAAAA,SAAO;AAAAoB,eAAAiH,QAAA3G,gBAGvDoB,MAAI;AAAA,UAAA,IAACC,OAAI;;AAAA,oBAAEoB,iBAAAA,mBAAS2E;AAAAA,UAAW;AAAA,UAAA,IAAAhH,WAAA;AAAA,gBAAAiH,SAAAvI,eAAAwI,OAAA;AAAAD,mBAAAE,UAInB,MAAM3E,eAAAA;AAAgB4E,+BAAAA;AAAA,mBAAAH;AAAAA,UAAA;AAAA,QAAA,CAAA,GAAAH,QAAAC,KAAA;AAAA,eAAAR;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAAxC,QAAAC,MAAA;AAAA1E,WAAA2E,QAAArE,gBAWpCyH,KAAG;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEpF,WAAAA;AAAAA,MAAY;AAAA,MAAAlC,UACnBvC,CAAAA,cAAc;AAEdE,gBAAQ,MAAMyF,sBAAsB3F,UAAUC,EAAE,CAAC;AAEjD,gBAAA,MAAA;AAAA,cAAA6J,SAAA7I,eAAA8I,QAAA;AAAAlI,iBAAAiI,QAAA3H,gBAQKtC,4BAA0B;AAAA,YACzBG;AAAAA,YAAoB,IACpBO,UAAO;AAAA,qBAAET,MAAMkK;AAAAA,YAAa;AAAA,YAAA,IAC5BlJ,YAAS;AAAA,qBAAEhB,MAAMgB;AAAAA,YAAS;AAAA,UAAA,CAAA,CAAA;AAAA6H,iBAAAsB,CAAAA,QAAA;AAAA,gBAAAC,MATrB;AAAA,6BACMlK,UAAUmK,SAASC,OAAO;AAAA,oBACnC7E,sBAAsB8E,IAAIrK,UAAUC,EAAE,IAAI,uBAAuB,EAAE;AAAA,mBACtEqK,OACM,sBAAsBtK,UAAUmK,SAASI,QAAQ,sBAAsBvK,UAAUmK,SAASI,WAAWvK,UAAUmK,SAASC,OAAO;AAAEF,oBAAAD,IAAAO,KAAAC,UAAAX,QAAAG,IAAAO,IAAAN,GAAA;AAAAD,gBAAAS,IAAA7B,MAAAiB,QAAAQ,MAAAL,IAAAS,CAAA;AAAA,mBAAAT;AAAAA,UAAA,GAAA;AAAA,YAAAO,GAAAG;AAAAA,YAAAD,GAAAC;AAAAA,UAAAA,CAAA;AAAA,iBAAAb;AAAAA,QAAA,GAAA;AAAA,MAS9I;AAAA,IAAA,CAAC,GAAApD,QAAAC,KAAA;AAAA9E,WAAA2E,QAAArE,gBAIFoB,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEI,KAAA,MAAA,CAAA,CAAAe,YAAAA,CAAa,EAAA,KAAIE,SAAAA,EAAWkD,eAAe;AAAA,MAAI;AAAA,MAAA,IAAAxF,WAAA;AAAA,eAAAJ,gBACxDyH,KAAG;AAAA,UAAA,IACFC,OAAI;AAAA,mBAAEe,MAAMC,KAAK;AAAA,cACfC,QAAQjG,SAAAA,EAAWkD,aAAclD,WAAW4D;AAAAA,YAAAA,CAC7C;AAAA,UAAC;AAAA,UAAAlG,UAEDA,MAAAJ,gBAAO4I,mBAAiB,CAAA,CAAA;AAAA,QAAA,CAAG;AAAA,MAAA;AAAA,IAAA,CAAA,GAAAlE,QAAAC,MAAA;AAAAjF,WAAAmE,QAAA7D,gBAMjCoB,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEI,KAAA,MAAA9D,MAAMkL,iBAAiB,KAAK,EAAA,KAAIlG,SAAAA;AAAAA,MAAU;AAAA,MAAA,IAAAvC,WAAA;AAAA,YAAA0I,SAAAhK,eAAAiK,QAAA,GAAAC,SAAAF,OAAA7J,YAAAgK,SAAAD,OAAA/J,YAAAiK,SAAAD,OAAAhK,YAAAkK,SAAAD,OAAA/J,aAAAiK,SAAAH,OAAA9J,aAAAkK,SAAAD,OAAAnK,YAAAqK,SAAAD,OAAAlK,aAAAoK,SAAAH,OAAAjK,aAAAqK,SAAAD,OAAAtK,YAAAwK,SAAAD,OAAArK,aAAAuK,SAAAD,OAAAxK,YAAA,CAAA0K,QAAAC,MAAA,IAAApK,cAAAkK,OAAAvK,WAAA;AAAAwK,eAAAxK;YAAA0K,SAAAN,OAAApK,aAAA,CAAA2K,QAAAC,MAAA,IAAAvK,cAAAqK,OAAA1K,WAAA,GAAA6K,SAAAF,OAAA3K,aAAA8K,SAAAD,OAAA/K,YAAAiL,SAAAD,OAAA9K,aAAAgL,SAAAD,OAAAjL,YAAA,CAAAmL,QAAAC,MAAA,IAAA7K,cAAA2K,OAAAhL,WAAA;AAAAiL,eAAAjL;YAAAmL,SAAAN,OAAA7K,aAAA,CAAAoL,QAAAC,MAAA,IAAAhL,cAAA8K,OAAAnL,WAAA;AAAAO,eAAAyJ,QAAA;;AAKxCxG,gCAAAA,MAAAA,mBAAY8H;AAAAA,SAAQ;AAAA/K,eAAA4J,QAAA;;AAIpB3G,gCAAAA,MAAAA,mBAAY+H;AAAAA,SAAK;AAAAhL,eAAA+J,QAAA,MAAA;;AAIjB9G,gCAAAA,MAAAA,mBAAYgI;AAAAA,WAAehB,QAAAC,MAAA;AAAAlK,eAAAsJ,QAAAhJ,gBAElCoB,MAAI;AAAA,UAAA,IAACC,OAAI;;AAAA,qBAAEsB,cAAAA,MAAAA,mBAAYiI,aAAYpC;AAAAA,UAAS;AAAA,UAAA,IAAApI,WAAA;AAAA,gBAAAyK,SAAA/L,eAAAgM,QAAA,GAAAC,SAAAF,OAAA5L,YAAA+L,SAAAD,OAAA5L,aAAA8L,SAAAD,OAAA/L,YAAAiM,SAAAD,OAAA9L,aAAA,CAAAgM,QAAAC,MAAA,IAAA5L,cAAA0L,OAAA/L,WAAA;AAAAO,mBAAAsL,QAAA,MAAA;;AAGlCrI,gDAAAA,mBAAYiI,YAAZjI,mBAAqB0I,QAAQ;AAAA,eAAEF,QAAAC,MAAA;AAAA,mBAAAP;AAAAA,UAAA;AAAA,QAAA,CAAA,GAAAf,QAAAC,MAAA;AAAArK,eAAAwK,QAAA,MAAA;;AAKlCvH,gCAAAA,MAAAA,mBAAY2I;AAAAA,WAAYlB,QAAAC,MAAA;AAAA3K,eAAAsJ,QAAAhJ,gBAE/BoB,MAAI;AAAA,UAAA,IAACC,OAAI;;AAAA,oBAAEsB,oBAAAA,mBAAY4I;AAAAA,UAAM;AAAA,UAAA,IAAAnL,WAAA;AAAA,mBAAAtB,eAAA0M,QAAA;AAAA,UAAA;AAAA,QAAA,CAAA,GAAAjB,QAAAC,MAAA;AAAA,eAAA1B;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAAjE,QAAAC,MAAA;AAAA0B,WAAA,MAAA8B,UAAAzE,QAvI1B,yBAAyBlG,MAAM8N,SAAS,EAAE,EAAE,CAAA;AAAA,WAAA5H;AAAAA,EAAA,GAAA;AAkJ5D;AAKA,SAAS+E,oBAAoB;AAC3B,SAAA9J,eAAA4M,QAAA;AAkBF;AAGAC,eAAA,CAAA,OAAA,CAAA;"}
|