@seed-ship/mcp-ui-solid 6.5.0 → 6.6.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 (83) hide show
  1. package/CHANGELOG.md +130 -0
  2. package/README.md +37 -0
  3. package/dist/adapters/connector.cjs +112 -0
  4. package/dist/adapters/connector.cjs.map +1 -0
  5. package/dist/adapters/connector.d.ts +71 -0
  6. package/dist/adapters/connector.d.ts.map +1 -0
  7. package/dist/adapters/connector.js +112 -0
  8. package/dist/adapters/connector.js.map +1 -0
  9. package/dist/adapters/index.d.ts +18 -0
  10. package/dist/adapters/index.d.ts.map +1 -0
  11. package/dist/adapters.cjs +6 -0
  12. package/dist/adapters.cjs.map +1 -0
  13. package/dist/adapters.d.cts +18 -0
  14. package/dist/adapters.d.ts +18 -0
  15. package/dist/adapters.js +6 -0
  16. package/dist/adapters.js.map +1 -0
  17. package/dist/components/ExpandableWrapper.cjs +24 -6
  18. package/dist/components/ExpandableWrapper.cjs.map +1 -1
  19. package/dist/components/ExpandableWrapper.d.ts.map +1 -1
  20. package/dist/components/ExpandableWrapper.js +24 -6
  21. package/dist/components/ExpandableWrapper.js.map +1 -1
  22. package/dist/components/FeedbackInline.cjs +6 -2
  23. package/dist/components/FeedbackInline.cjs.map +1 -1
  24. package/dist/components/FeedbackInline.d.ts +2 -2
  25. package/dist/components/FeedbackInline.d.ts.map +1 -1
  26. package/dist/components/FeedbackInline.js +7 -3
  27. package/dist/components/FeedbackInline.js.map +1 -1
  28. package/dist/components/PresentationFeedback.cjs +207 -0
  29. package/dist/components/PresentationFeedback.cjs.map +1 -0
  30. package/dist/components/PresentationFeedback.d.ts +113 -0
  31. package/dist/components/PresentationFeedback.d.ts.map +1 -0
  32. package/dist/components/PresentationFeedback.js +207 -0
  33. package/dist/components/PresentationFeedback.js.map +1 -0
  34. package/dist/components/StreamingUIRenderer.cjs +82 -195
  35. package/dist/components/StreamingUIRenderer.cjs.map +1 -1
  36. package/dist/components/StreamingUIRenderer.d.ts +25 -5
  37. package/dist/components/StreamingUIRenderer.d.ts.map +1 -1
  38. package/dist/components/StreamingUIRenderer.js +84 -197
  39. package/dist/components/StreamingUIRenderer.js.map +1 -1
  40. package/dist/components/index.d.ts +2 -0
  41. package/dist/components/index.d.ts.map +1 -1
  42. package/dist/components.cjs +3 -0
  43. package/dist/components.cjs.map +1 -1
  44. package/dist/components.d.cts +2 -0
  45. package/dist/components.d.ts +2 -0
  46. package/dist/components.js +3 -0
  47. package/dist/components.js.map +1 -1
  48. package/dist/context/MCPUIStringsContext.cjs +38 -0
  49. package/dist/context/MCPUIStringsContext.cjs.map +1 -0
  50. package/dist/context/MCPUIStringsContext.d.ts +95 -0
  51. package/dist/context/MCPUIStringsContext.d.ts.map +1 -0
  52. package/dist/context/MCPUIStringsContext.js +38 -0
  53. package/dist/context/MCPUIStringsContext.js.map +1 -0
  54. package/dist/index.cjs +8 -0
  55. package/dist/index.cjs.map +1 -1
  56. package/dist/index.d.cts +5 -0
  57. package/dist/index.d.ts +5 -0
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +8 -0
  60. package/dist/index.js.map +1 -1
  61. package/dist/mcp-ui-spec/dist/schemas.cjs +103 -0
  62. package/dist/mcp-ui-spec/dist/schemas.cjs.map +1 -1
  63. package/dist/mcp-ui-spec/dist/schemas.js +103 -0
  64. package/dist/mcp-ui-spec/dist/schemas.js.map +1 -1
  65. package/docs/briefs/ROADMAP-opendata-macro-mcpui.md +912 -0
  66. package/package.json +17 -5
  67. package/src/adapters/connector.test.ts +165 -0
  68. package/src/adapters/connector.ts +234 -0
  69. package/src/adapters/index.ts +24 -0
  70. package/src/components/ExpandableWrapper.test.tsx +5 -2
  71. package/src/components/ExpandableWrapper.tsx +8 -6
  72. package/src/components/FeedbackInline.test.tsx +6 -3
  73. package/src/components/FeedbackInline.tsx +8 -6
  74. package/src/components/PresentationFeedback.test.tsx +163 -0
  75. package/src/components/PresentationFeedback.tsx +326 -0
  76. package/src/components/StreamingUIRenderer.parity.test.tsx +158 -0
  77. package/src/components/StreamingUIRenderer.tsx +42 -166
  78. package/src/components/index.ts +10 -0
  79. package/src/context/MCPUIStringsContext.test.tsx +116 -0
  80. package/src/context/MCPUIStringsContext.tsx +128 -0
  81. package/src/index.ts +27 -0
  82. package/tsconfig.tsbuildinfo +1 -1
  83. package/vite.config.ts +1 -0
@@ -1,137 +1,17 @@
1
- import { delegateEvents, getNextElement, template, getNextMarker, insert, createComponent, memo, effect, style, runHydrationEvents, className, setAttribute } from "solid-js/web";
2
- import { createSignal, Show, For, onMount, onCleanup } from "solid-js";
1
+ import { delegateEvents, getNextElement, template, getNextMarker, insert, createComponent, memo, effect, style, runHydrationEvents, className } from "solid-js/web";
2
+ import { createSignal, Show, For, onMount } from "solid-js";
3
3
  import { useStreamingUI } from "../hooks/useStreamingUI.js";
4
- import { validateComponent } from "../services/validation.js";
5
- import { GenerativeUIErrorBoundary } from "./GenerativeUIErrorBoundary.js";
6
- import { markRenderStart, markRenderEnd, PERF_PREFIX } from "../utils/perf.js";
7
- import { useTelemetry } from "../context/MCPUITelemetryContext.js";
8
- 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">`);
9
- function StreamingComponentRenderer(props) {
10
- var _a, _b, _c, _d, _e, _f;
11
- markRenderStart(props.component.id);
12
- const telemetry = useTelemetry();
13
- onMount(() => {
14
- markRenderEnd(props.component.id);
15
- if (telemetry) {
16
- const ts = Date.now();
17
- telemetry.dispatch({
18
- type: "component:mounted",
19
- id: props.component.id,
20
- componentType: props.component.type,
21
- ts
22
- });
23
- if (typeof performance !== "undefined" && typeof performance.getEntriesByName === "function") {
24
- const entries = performance.getEntriesByName(`${PERF_PREFIX}${props.component.id}:render`, "measure");
25
- const last = entries[entries.length - 1];
26
- if (last) {
27
- telemetry.dispatch({
28
- type: "component:rendered",
29
- id: props.component.id,
30
- componentType: props.component.type,
31
- durationMs: last.duration,
32
- ts
33
- });
34
- }
35
- }
36
- }
37
- });
38
- onCleanup(() => {
39
- if (telemetry) {
40
- telemetry.dispatch({
41
- type: "component:unmounted",
42
- id: props.component.id,
43
- componentType: props.component.type,
44
- ts: Date.now()
45
- });
46
- }
47
- });
48
- const validation = validateComponent(props.component);
49
- if (!validation.valid) {
50
- (_a = props.onError) == null ? void 0 : _a.call(props, {
51
- type: "validation",
52
- message: "Component validation failed",
53
- componentId: props.component.id,
54
- details: validation.errors
55
- });
56
- if (telemetry) {
57
- telemetry.dispatch({
58
- type: "validation:failed",
59
- id: props.component.id,
60
- componentType: props.component.type,
61
- errorCount: ((_b = validation.errors) == null ? void 0 : _b.length) ?? 0,
62
- firstErrorCode: ((_d = (_c = validation.errors) == null ? void 0 : _c[0]) == null ? void 0 : _d.code) ?? null,
63
- ts: Date.now()
64
- });
65
- }
66
- const mode = props.errorMode ?? "block";
67
- const firstError = ((_f = (_e = validation.errors) == null ? void 0 : _e[0]) == null ? void 0 : _f.message) || "Unknown validation error";
68
- if (mode === "silent") {
69
- return null;
70
- }
71
- if (mode === "inline-warn") {
72
- return (() => {
73
- 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);
74
- setAttribute(_el$, "title", firstError);
75
- insert(_el$3, () => props.component.type, _el$6, _co$);
76
- return _el$;
77
- })();
4
+ import { UIResourceRenderer } from "./UIResourceRenderer.js";
5
+ import { useMCPUIStrings } from "../context/MCPUIStringsContext.js";
6
+ var _tmpl$ = /* @__PURE__ */ template(`<span class="text-sm text-text-secondary"><!$><!/> / <!$><!/>`), _tmpl$2 = /* @__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$3 = /* @__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$4 = /* @__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">`), _tmpl$5 = /* @__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$6 = /* @__PURE__ */ template(`<div><div class="font-medium text-text-primary">Cost</div><div>$<!$><!/>`), _tmpl$7 = /* @__PURE__ */ template(`<div><div class="font-medium text-text-primary">Cached</div><div class=text-success-primary>Yes`), _tmpl$8 = /* @__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$9 = /* @__PURE__ */ template(`<div><!$><!/><!$><!/><div class="grid grid-cols-12 gap-4"><!$><!/><!$><!/></div><!$><!/>`), _tmpl$0 = /* @__PURE__ */ template(`<div>`), _tmpl$1 = /* @__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
+ function asFullWidth(component) {
8
+ return {
9
+ ...component,
10
+ position: {
11
+ colStart: 1,
12
+ colSpan: 12
78
13
  }
79
- return (() => {
80
- var _el$7 = getNextElement(_tmpl$2), _el$8 = _el$7.firstChild, _el$9 = _el$8.nextSibling;
81
- insert(_el$9, firstError);
82
- return _el$7;
83
- })();
84
- }
85
- const params = props.component.params;
86
- return createComponent(GenerativeUIErrorBoundary, {
87
- get componentId() {
88
- return props.component.id;
89
- },
90
- get componentType() {
91
- return props.component.type;
92
- },
93
- get onError() {
94
- return props.onError;
95
- },
96
- allowRetry: false,
97
- get children() {
98
- 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);
99
- _el$21.nextSibling;
100
- insert(_el$10, () => props.component.type);
101
- insert(_el$0, createComponent(Show, {
102
- get when() {
103
- return params == null ? void 0 : params.title;
104
- },
105
- get children() {
106
- var _el$11 = getNextElement(_tmpl$3);
107
- insert(_el$11, () => params.title);
108
- return _el$11;
109
- }
110
- }), _el$23, _co$4);
111
- insert(_el$0, createComponent(Show, {
112
- get when() {
113
- return memo(() => props.component.type === "metric")() && (params == null ? void 0 : params.value);
114
- },
115
- get children() {
116
- var _el$12 = getNextElement(_tmpl$5), _el$13 = _el$12.firstChild, _el$15 = _el$13.nextSibling, [_el$16, _co$2] = getNextMarker(_el$15.nextSibling);
117
- insert(_el$13, () => params.value);
118
- insert(_el$12, createComponent(Show, {
119
- get when() {
120
- return params.unit;
121
- },
122
- get children() {
123
- var _el$14 = getNextElement(_tmpl$4);
124
- insert(_el$14, () => params.unit);
125
- return _el$14;
126
- }
127
- }), _el$16, _co$2);
128
- return _el$12;
129
- }
130
- }), _el$25, _co$5);
131
- insert(_el$17, () => props.component.id.slice(0, 8), _el$21, _co$3);
132
- return _el$0;
133
- }
134
- });
14
+ };
135
15
  }
136
16
  function StreamingUIRenderer(props) {
137
17
  const {
@@ -151,6 +31,7 @@ function StreamingUIRenderer(props) {
151
31
  onError: props.onError,
152
32
  onComponentReceived: props.onComponentReceived
153
33
  });
34
+ const strings = useMCPUIStrings();
154
35
  const [animatingComponents, setAnimatingComponents] = createSignal(/* @__PURE__ */ new Set());
155
36
  const handleComponentRender = (componentId) => {
156
37
  setAnimatingComponents((prev) => /* @__PURE__ */ new Set([...prev, componentId]));
@@ -163,81 +44,87 @@ function StreamingUIRenderer(props) {
163
44
  }, 500);
164
45
  };
165
46
  return (() => {
166
- 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);
167
- insert(_el$26, createComponent(Show, {
47
+ var _el$ = getNextElement(_tmpl$9), _el$60 = _el$.firstChild, [_el$61, _co$11] = getNextMarker(_el$60.nextSibling), _el$62 = _el$61.nextSibling, [_el$63, _co$12] = getNextMarker(_el$62.nextSibling), _el$24 = _el$63.nextSibling, _el$25 = _el$24.firstChild, [_el$26, _co$6] = getNextMarker(_el$25.nextSibling), _el$27 = _el$26.nextSibling, [_el$28, _co$7] = getNextMarker(_el$27.nextSibling), _el$64 = _el$24.nextSibling, [_el$65, _co$13] = getNextMarker(_el$64.nextSibling);
48
+ insert(_el$, createComponent(Show, {
168
49
  get when() {
169
50
  return memo(() => props.showProgress !== false)() && (isLoading() || isStreaming());
170
51
  },
171
52
  get children() {
172
- 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);
173
- insert(_el$29, () => progress().message);
174
- insert(_el$28, createComponent(Show, {
53
+ var _el$2 = getNextElement(_tmpl$3), _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$1 = _el$4.nextSibling, [_el$10, _co$3] = getNextMarker(_el$1.nextSibling), _el$11 = _el$3.nextSibling, _el$12 = _el$11.firstChild, _el$14 = _el$11.nextSibling, [_el$15, _co$4] = getNextMarker(_el$14.nextSibling);
54
+ insert(_el$4, () => progress().message);
55
+ insert(_el$3, createComponent(Show, {
175
56
  get when() {
176
57
  return progress().totalCount !== null;
177
58
  },
178
59
  get children() {
179
- 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);
180
- insert(_el$30, () => progress().receivedCount, _el$33, _co$6);
181
- insert(_el$30, () => progress().totalCount, _el$35, _co$7);
182
- return _el$30;
60
+ var _el$5 = getNextElement(_tmpl$), _el$7 = _el$5.firstChild, [_el$8, _co$] = getNextMarker(_el$7.nextSibling), _el$6 = _el$8.nextSibling, _el$9 = _el$6.nextSibling, [_el$0, _co$2] = getNextMarker(_el$9.nextSibling);
61
+ insert(_el$5, () => progress().receivedCount, _el$8, _co$);
62
+ insert(_el$5, () => progress().totalCount, _el$0, _co$2);
63
+ return _el$5;
183
64
  }
184
- }), _el$37, _co$8);
185
- insert(_el$27, createComponent(Show, {
65
+ }), _el$10, _co$3);
66
+ insert(_el$2, createComponent(Show, {
186
67
  get when() {
187
68
  return memo(() => progress().totalCount === null)() && isStreaming();
188
69
  },
189
70
  get children() {
190
- return getNextElement(_tmpl$8);
71
+ return getNextElement(_tmpl$2);
191
72
  }
192
- }), _el$42, _co$9);
193
- effect((_$p) => style(_el$39, progress().totalCount !== null ? `width: ${progress().receivedCount / progress().totalCount * 100}%` : "width: 0%", _$p));
194
- return _el$27;
73
+ }), _el$15, _co$4);
74
+ effect((_$p) => style(_el$12, progress().totalCount !== null ? `width: ${progress().receivedCount / progress().totalCount * 100}%` : "width: 0%", _$p));
75
+ return _el$2;
195
76
  }
196
- }), _el$88, _co$16);
197
- insert(_el$26, createComponent(Show, {
77
+ }), _el$61, _co$11);
78
+ insert(_el$, createComponent(Show, {
198
79
  get when() {
199
80
  return error();
200
81
  },
201
82
  get children() {
202
- 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);
203
- insert(_el$46, () => {
83
+ var _el$16 = getNextElement(_tmpl$5), _el$17 = _el$16.firstChild, _el$18 = _el$17.firstChild, _el$19 = _el$18.nextSibling, _el$20 = _el$17.nextSibling, _el$22 = _el$20.nextSibling, [_el$23, _co$5] = getNextMarker(_el$22.nextSibling);
84
+ insert(_el$19, () => {
204
85
  var _a;
205
86
  return (_a = error()) == null ? void 0 : _a.error;
206
87
  });
207
- insert(_el$47, () => {
88
+ insert(_el$20, () => {
208
89
  var _a;
209
90
  return (_a = error()) == null ? void 0 : _a.message;
210
91
  });
211
- insert(_el$43, createComponent(Show, {
92
+ insert(_el$16, createComponent(Show, {
212
93
  get when() {
213
94
  var _a;
214
95
  return (_a = error()) == null ? void 0 : _a.recoverable;
215
96
  },
216
97
  get children() {
217
- var _el$48 = getNextElement(_tmpl$0);
218
- _el$48.$$click = () => startStreaming();
98
+ var _el$21 = getNextElement(_tmpl$4);
99
+ _el$21.$$click = () => startStreaming();
100
+ insert(_el$21, () => strings.retry);
219
101
  runHydrationEvents();
220
- return _el$48;
102
+ return _el$21;
221
103
  }
222
- }), _el$50, _co$0);
223
- return _el$43;
104
+ }), _el$23, _co$5);
105
+ return _el$16;
224
106
  }
225
- }), _el$90, _co$17);
226
- insert(_el$51, createComponent(For, {
107
+ }), _el$63, _co$12);
108
+ insert(_el$24, createComponent(For, {
227
109
  get each() {
228
110
  return components();
229
111
  },
230
112
  children: (component) => {
231
113
  onMount(() => handleComponentRender(component.id));
232
114
  return (() => {
233
- var _el$93 = getNextElement(_tmpl$14);
234
- insert(_el$93, createComponent(StreamingComponentRenderer, {
235
- component,
236
- get onError() {
237
- return props.onRenderError;
115
+ var _el$66 = getNextElement(_tmpl$0);
116
+ insert(_el$66, createComponent(UIResourceRenderer, {
117
+ get content() {
118
+ return asFullWidth(component);
238
119
  },
239
120
  get errorMode() {
240
121
  return props.errorMode;
122
+ },
123
+ get onError() {
124
+ return props.onRenderError;
125
+ },
126
+ get toolbarVariant() {
127
+ return props.toolbarVariant;
241
128
  }
242
129
  }));
243
130
  effect((_p$) => {
@@ -245,18 +132,18 @@ function StreamingUIRenderer(props) {
245
132
  col-span-${component.position.colSpan}
246
133
  ${animatingComponents().has(component.id) ? "animate-fade-in-up" : ""}
247
134
  `, _v$2 = `grid-column-start: ${component.position.colStart}; grid-column-end: ${component.position.colStart + component.position.colSpan}`;
248
- _v$ !== _p$.e && className(_el$93, _p$.e = _v$);
249
- _p$.t = style(_el$93, _v$2, _p$.t);
135
+ _v$ !== _p$.e && className(_el$66, _p$.e = _v$);
136
+ _p$.t = style(_el$66, _v$2, _p$.t);
250
137
  return _p$;
251
138
  }, {
252
139
  e: void 0,
253
140
  t: void 0
254
141
  });
255
- return _el$93;
142
+ return _el$66;
256
143
  })();
257
144
  }
258
- }), _el$53, _co$1);
259
- insert(_el$51, createComponent(Show, {
145
+ }), _el$26, _co$6);
146
+ insert(_el$24, createComponent(Show, {
260
147
  get when() {
261
148
  return memo(() => !!isStreaming())() && progress().totalCount !== null;
262
149
  },
@@ -270,65 +157,65 @@ function StreamingUIRenderer(props) {
270
157
  children: () => createComponent(SkeletonComponent, {})
271
158
  });
272
159
  }
273
- }), _el$55, _co$10);
274
- insert(_el$26, createComponent(Show, {
160
+ }), _el$28, _co$7);
161
+ insert(_el$, createComponent(Show, {
275
162
  get when() {
276
163
  return memo(() => props.showMetadata !== false)() && metadata();
277
164
  },
278
165
  get children() {
279
- 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);
280
- _el$69.nextSibling;
281
- 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);
282
- _el$81.nextSibling;
283
- var _el$85 = _el$76.nextSibling, [_el$86, _co$15] = getNextMarker(_el$85.nextSibling);
284
- insert(_el$60, () => {
166
+ var _el$29 = getNextElement(_tmpl$8), _el$30 = _el$29.firstChild, _el$31 = _el$30.firstChild, _el$32 = _el$31.firstChild, _el$33 = _el$32.nextSibling, _el$34 = _el$31.nextSibling, _el$35 = _el$34.firstChild, _el$36 = _el$35.nextSibling, _el$37 = _el$34.nextSibling, _el$38 = _el$37.firstChild, _el$39 = _el$38.nextSibling, _el$41 = _el$39.firstChild, [_el$42, _co$8] = getNextMarker(_el$41.nextSibling);
167
+ _el$42.nextSibling;
168
+ var _el$56 = _el$37.nextSibling, [_el$57, _co$1] = getNextMarker(_el$56.nextSibling), _el$49 = _el$57.nextSibling, _el$50 = _el$49.firstChild, _el$51 = _el$50.nextSibling, _el$53 = _el$51.firstChild, [_el$54, _co$0] = getNextMarker(_el$53.nextSibling);
169
+ _el$54.nextSibling;
170
+ var _el$58 = _el$49.nextSibling, [_el$59, _co$10] = getNextMarker(_el$58.nextSibling);
171
+ insert(_el$33, () => {
285
172
  var _a;
286
173
  return (_a = metadata()) == null ? void 0 : _a.provider;
287
174
  });
288
- insert(_el$63, () => {
175
+ insert(_el$36, () => {
289
176
  var _a;
290
177
  return (_a = metadata()) == null ? void 0 : _a.model;
291
178
  });
292
- insert(_el$66, () => {
179
+ insert(_el$39, () => {
293
180
  var _a;
294
181
  return (_a = metadata()) == null ? void 0 : _a.executionTimeMs;
295
- }, _el$69, _co$11);
296
- insert(_el$57, createComponent(Show, {
182
+ }, _el$42, _co$8);
183
+ insert(_el$30, createComponent(Show, {
297
184
  get when() {
298
185
  var _a;
299
186
  return ((_a = metadata()) == null ? void 0 : _a.costUSD) !== void 0;
300
187
  },
301
188
  get children() {
302
- 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);
303
- insert(_el$72, () => {
189
+ var _el$43 = getNextElement(_tmpl$6), _el$44 = _el$43.firstChild, _el$45 = _el$44.nextSibling, _el$46 = _el$45.firstChild, _el$47 = _el$46.nextSibling, [_el$48, _co$9] = getNextMarker(_el$47.nextSibling);
190
+ insert(_el$45, () => {
304
191
  var _a, _b;
305
192
  return (_b = (_a = metadata()) == null ? void 0 : _a.costUSD) == null ? void 0 : _b.toFixed(4);
306
- }, _el$75, _co$12);
307
- return _el$70;
193
+ }, _el$48, _co$9);
194
+ return _el$43;
308
195
  }
309
- }), _el$84, _co$14);
310
- insert(_el$78, () => {
196
+ }), _el$57, _co$1);
197
+ insert(_el$51, () => {
311
198
  var _a;
312
199
  return (_a = metadata()) == null ? void 0 : _a.firstTokenMs;
313
- }, _el$81, _co$13);
314
- insert(_el$57, createComponent(Show, {
200
+ }, _el$54, _co$0);
201
+ insert(_el$30, createComponent(Show, {
315
202
  get when() {
316
203
  var _a;
317
204
  return (_a = metadata()) == null ? void 0 : _a.cached;
318
205
  },
319
206
  get children() {
320
- return getNextElement(_tmpl$11);
207
+ return getNextElement(_tmpl$7);
321
208
  }
322
- }), _el$86, _co$15);
323
- return _el$56;
209
+ }), _el$59, _co$10);
210
+ return _el$29;
324
211
  }
325
- }), _el$92, _co$18);
326
- effect(() => className(_el$26, `streaming-ui-renderer ${props.class || ""}`));
327
- return _el$26;
212
+ }), _el$65, _co$13);
213
+ effect(() => className(_el$, `streaming-ui-renderer ${props.class || ""}`));
214
+ return _el$;
328
215
  })();
329
216
  }
330
217
  function SkeletonComponent() {
331
- return getNextElement(_tmpl$15);
218
+ return getNextElement(_tmpl$1);
332
219
  }
333
220
  delegateEvents(["click"]);
334
221
  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, onCleanup } 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, PERF_PREFIX } from '../utils/perf'\nimport { useTelemetry } from '../context/MCPUITelemetryContext'\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\n // Telemetry sink (B.5 — v5.6.0). Same wiring as ComponentRenderer in\n // UIResourceRenderer.tsx — null when no Provider, no-op everywhere then.\n const telemetry = useTelemetry()\n\n onMount(() => {\n markRenderEnd(props.component.id)\n if (telemetry) {\n const ts = Date.now()\n telemetry.dispatch({\n type: 'component:mounted',\n id: props.component.id,\n componentType: props.component.type,\n ts,\n })\n if (typeof performance !== 'undefined' && typeof performance.getEntriesByName === 'function') {\n const entries = performance.getEntriesByName(`${PERF_PREFIX}${props.component.id}:render`, 'measure')\n const last = entries[entries.length - 1]\n if (last) {\n telemetry.dispatch({\n type: 'component:rendered',\n id: props.component.id,\n componentType: props.component.type,\n durationMs: last.duration,\n ts,\n })\n }\n }\n }\n })\n\n onCleanup(() => {\n if (telemetry) {\n telemetry.dispatch({\n type: 'component:unmounted',\n id: props.component.id,\n componentType: props.component.type,\n ts: Date.now(),\n })\n }\n })\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 if (telemetry) {\n telemetry.dispatch({\n type: 'validation:failed',\n id: props.component.id,\n componentType: props.component.type,\n errorCount: validation.errors?.length ?? 0,\n firstErrorCode: validation.errors?.[0]?.code ?? null,\n ts: Date.now(),\n })\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","telemetry","useTelemetry","onMount","markRenderEnd","ts","Date","now","dispatch","type","componentType","performance","getEntriesByName","entries","PERF_PREFIX","last","length","durationMs","duration","onCleanup","validation","validateComponent","valid","onError","message","componentId","details","errors","errorCount","firstErrorCode","code","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","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","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":"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"}
1
+ {"version":3,"file":"StreamingUIRenderer.js","sources":["../../src/components/StreamingUIRenderer.tsx"],"sourcesContent":["/**\n * StreamingUIRenderer Component\n *\n * Renders streaming dashboard components with skeleton states and progress\n * indicators. Uses the `useStreamingUI` hook for SSE connection and state.\n *\n * ## Rendering parity (v6.6.0 — closes Gap 1 of ROADMAP-opendata-macro-mcpui)\n *\n * Each component received over SSE is delegated to the real\n * `<UIResourceRenderer>`. Streamed `table` / `chart` / `map` / `action-group`\n * therefore render with the SAME fidelity as a static layout — no more\n * simplified \"type + title\" placeholder. Validation, telemetry, the error\n * boundary and `errorMode` all come from `<UIResourceRenderer>`, so the two\n * paths cannot drift.\n *\n * Delegation is a one-way value import (`UIResourceRenderer` never imports\n * this file — no cycle). The streamed component's `position` is normalized\n * to full-width before delegation : this component owns the 12-column grid,\n * `<UIResourceRenderer>` only owns the component's own rendering.\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 { UIResourceRenderer, type ValidationErrorMode } from './UIResourceRenderer'\nimport { useMCPUIStrings } from '../context/MCPUIStringsContext'\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). Forwarded to the delegated `<UIResourceRenderer>`.\n */\n errorMode?: ValidationErrorMode\n /**\n * Visibility behavior of the inline expand button on streamed components\n * wrapped in `<ExpandableWrapper>` (v6.6.0 — parity with the static\n * `<UIResourceRenderer toolbarVariant>` prop). Forwarded as-is.\n */\n toolbarVariant?: 'hover' | 'always-visible'\n}\n\n/**\n * The 12-column placement of a streamed component is owned by this\n * component's outer grid (the cell `<div>` below). Delegating the component\n * verbatim to `<UIResourceRenderer>` would re-apply that placement inside a\n * fresh nested 12-column grid and visually misplace it. We hand\n * `<UIResourceRenderer>` a full-width copy so it only renders the component,\n * not a competing layout.\n */\nfunction asFullWidth(component: UIComponent): UIComponent {\n return { ...component, position: { colStart: 1, colSpan: 12 } }\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 strings = useMCPUIStrings()\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 {strings.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 — delegated to the real UIResourceRenderer */}\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 <UIResourceRenderer\n content={asFullWidth(component)}\n errorMode={props.errorMode}\n onError={props.onRenderError}\n toolbarVariant={props.toolbarVariant}\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":["asFullWidth","component","position","colStart","colSpan","StreamingUIRenderer","props","components","isLoading","isStreaming","error","progress","metadata","startStreaming","useStreamingUI","query","spaceIds","sessionId","options","onComplete","onError","onComponentReceived","strings","useMCPUIStrings","animatingComponents","setAnimatingComponents","createSignal","Set","handleComponentRender","componentId","prev","setTimeout","next","delete","_el$","_$getNextElement","_tmpl$9","_el$60","firstChild","_el$61","_co$11","_$getNextMarker","nextSibling","_el$62","_el$63","_co$12","_el$24","_el$25","_el$26","_co$6","_el$27","_el$28","_co$7","_el$64","_el$65","_co$13","_$insert","_$createComponent","Show","when","_$memo","showProgress","children","_el$2","_tmpl$3","_el$3","_el$4","_el$1","_el$10","_co$3","_el$11","_el$12","_el$14","_el$15","_co$4","message","totalCount","_el$5","_tmpl$","_el$7","_el$8","_co$","_el$6","_el$9","_el$0","_co$2","receivedCount","_tmpl$2","_$effect","_$p","_$style","_el$16","_tmpl$5","_el$17","_el$18","_el$19","_el$20","_el$22","_el$23","_co$5","recoverable","_el$21","_tmpl$4","$$click","retry","_$runHydrationEvents","For","each","onMount","id","_el$66","_tmpl$0","UIResourceRenderer","content","errorMode","onRenderError","toolbarVariant","_p$","_v$","has","_v$2","e","_$className","t","undefined","Array","from","length","SkeletonComponent","showMetadata","_el$29","_tmpl$8","_el$30","_el$31","_el$32","_el$33","_el$34","_el$35","_el$36","_el$37","_el$38","_el$39","_el$41","_el$42","_co$8","_el$56","_el$57","_co$1","_el$49","_el$50","_el$51","_el$53","_el$54","_co$0","_el$58","_el$59","_co$10","provider","model","executionTimeMs","costUSD","_el$43","_tmpl$6","_el$44","_el$45","_el$46","_el$47","_el$48","_co$9","toFixed","firstTokenMs","cached","_tmpl$7","class","_tmpl$1","_$delegateEvents"],"mappings":"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"}
@@ -7,6 +7,8 @@ export { UIResourceRenderer } from './UIResourceRenderer';
7
7
  export type { UIResourceRendererProps } from './UIResourceRenderer';
8
8
  export { StreamingUIRenderer } from './StreamingUIRenderer';
9
9
  export type { StreamingUIRendererProps } from './StreamingUIRenderer';
10
+ export { PresentationFeedback, DEFAULT_PRESENTATION_FEEDBACK_LABELS, } from './PresentationFeedback';
11
+ export type { PresentationFeedbackProps, PresentationFeedbackLabels, } from './PresentationFeedback';
10
12
  export { GenerativeUIErrorBoundary } from './GenerativeUIErrorBoundary';
11
13
  export type { GenerativeUIErrorBoundaryProps } from './GenerativeUIErrorBoundary';
12
14
  export { FooterRenderer } from './FooterRenderer';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
3
  const UIResourceRenderer = require("./components/UIResourceRenderer.cjs");
4
4
  const StreamingUIRenderer = require("./components/StreamingUIRenderer.cjs");
5
+ const PresentationFeedback = require("./components/PresentationFeedback.cjs");
5
6
  const GenerativeUIErrorBoundary = require("./components/GenerativeUIErrorBoundary.cjs");
6
7
  const FooterRenderer = require("./components/FooterRenderer.cjs");
7
8
  const ActionRenderer = require("./components/ActionRenderer.cjs");
@@ -30,6 +31,8 @@ const PortalDropdownMenu = require("./components/PortalDropdownMenu.cjs");
30
31
  exports.UIResourceRenderer = UIResourceRenderer.UIResourceRenderer;
31
32
  exports.default = UIResourceRenderer.UIResourceRenderer;
32
33
  exports.StreamingUIRenderer = StreamingUIRenderer.StreamingUIRenderer;
34
+ exports.DEFAULT_PRESENTATION_FEEDBACK_LABELS = PresentationFeedback.DEFAULT_PRESENTATION_FEEDBACK_LABELS;
35
+ exports.PresentationFeedback = PresentationFeedback.PresentationFeedback;
33
36
  exports.GenerativeUIErrorBoundary = GenerativeUIErrorBoundary.GenerativeUIErrorBoundary;
34
37
  exports.FooterRenderer = FooterRenderer.FooterRenderer;
35
38
  exports.ActionRenderer = ActionRenderer.ActionRenderer;
@@ -1 +1 @@
1
- {"version":3,"file":"components.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"components.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -7,6 +7,8 @@ export { UIResourceRenderer } from './UIResourceRenderer';
7
7
  export type { UIResourceRendererProps } from './UIResourceRenderer';
8
8
  export { StreamingUIRenderer } from './StreamingUIRenderer';
9
9
  export type { StreamingUIRendererProps } from './StreamingUIRenderer';
10
+ export { PresentationFeedback, DEFAULT_PRESENTATION_FEEDBACK_LABELS, } from './PresentationFeedback';
11
+ export type { PresentationFeedbackProps, PresentationFeedbackLabels, } from './PresentationFeedback';
10
12
  export { GenerativeUIErrorBoundary } from './GenerativeUIErrorBoundary';
11
13
  export type { GenerativeUIErrorBoundaryProps } from './GenerativeUIErrorBoundary';
12
14
  export { FooterRenderer } from './FooterRenderer';
@@ -7,6 +7,8 @@ export { UIResourceRenderer } from './UIResourceRenderer';
7
7
  export type { UIResourceRendererProps } from './UIResourceRenderer';
8
8
  export { StreamingUIRenderer } from './StreamingUIRenderer';
9
9
  export type { StreamingUIRendererProps } from './StreamingUIRenderer';
10
+ export { PresentationFeedback, DEFAULT_PRESENTATION_FEEDBACK_LABELS, } from './PresentationFeedback';
11
+ export type { PresentationFeedbackProps, PresentationFeedbackLabels, } from './PresentationFeedback';
10
12
  export { GenerativeUIErrorBoundary } from './GenerativeUIErrorBoundary';
11
13
  export type { GenerativeUIErrorBoundaryProps } from './GenerativeUIErrorBoundary';
12
14
  export { FooterRenderer } from './FooterRenderer';