@seed-ship/mcp-ui-solid 6.4.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.
- package/CHANGELOG.md +230 -0
- package/README.md +37 -0
- package/dist/adapters/connector.cjs +112 -0
- package/dist/adapters/connector.cjs.map +1 -0
- package/dist/adapters/connector.d.ts +71 -0
- package/dist/adapters/connector.d.ts.map +1 -0
- package/dist/adapters/connector.js +112 -0
- package/dist/adapters/connector.js.map +1 -0
- package/dist/adapters/index.d.ts +18 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters.cjs +6 -0
- package/dist/adapters.cjs.map +1 -0
- package/dist/adapters.d.cts +18 -0
- package/dist/adapters.d.ts +18 -0
- package/dist/adapters.js +6 -0
- package/dist/adapters.js.map +1 -0
- package/dist/components/ExpandableWrapper.cjs +24 -6
- package/dist/components/ExpandableWrapper.cjs.map +1 -1
- package/dist/components/ExpandableWrapper.d.ts.map +1 -1
- package/dist/components/ExpandableWrapper.js +24 -6
- package/dist/components/ExpandableWrapper.js.map +1 -1
- package/dist/components/FeedbackInline.cjs +6 -2
- package/dist/components/FeedbackInline.cjs.map +1 -1
- package/dist/components/FeedbackInline.d.ts +2 -2
- package/dist/components/FeedbackInline.d.ts.map +1 -1
- package/dist/components/FeedbackInline.js +7 -3
- package/dist/components/FeedbackInline.js.map +1 -1
- package/dist/components/PresentationFeedback.cjs +207 -0
- package/dist/components/PresentationFeedback.cjs.map +1 -0
- package/dist/components/PresentationFeedback.d.ts +113 -0
- package/dist/components/PresentationFeedback.d.ts.map +1 -0
- package/dist/components/PresentationFeedback.js +207 -0
- package/dist/components/PresentationFeedback.js.map +1 -0
- package/dist/components/StreamingUIRenderer.cjs +82 -195
- package/dist/components/StreamingUIRenderer.cjs.map +1 -1
- package/dist/components/StreamingUIRenderer.d.ts +25 -5
- package/dist/components/StreamingUIRenderer.d.ts.map +1 -1
- package/dist/components/StreamingUIRenderer.js +84 -197
- package/dist/components/StreamingUIRenderer.js.map +1 -1
- package/dist/components/UIResourceRenderer.cjs +40 -10
- package/dist/components/UIResourceRenderer.cjs.map +1 -1
- package/dist/components/UIResourceRenderer.d.ts +20 -0
- package/dist/components/UIResourceRenderer.d.ts.map +1 -1
- package/dist/components/UIResourceRenderer.js +42 -12
- package/dist/components/UIResourceRenderer.js.map +1 -1
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components.cjs +3 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.cts +2 -0
- package/dist/components.d.ts +2 -0
- package/dist/components.js +3 -0
- package/dist/components.js.map +1 -1
- package/dist/context/MCPUIStringsContext.cjs +38 -0
- package/dist/context/MCPUIStringsContext.cjs.map +1 -0
- package/dist/context/MCPUIStringsContext.d.ts +95 -0
- package/dist/context/MCPUIStringsContext.d.ts.map +1 -0
- package/dist/context/MCPUIStringsContext.js +38 -0
- package/dist/context/MCPUIStringsContext.js.map +1 -0
- package/dist/index.cjs +12 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-ui-spec/dist/schemas.cjs +103 -0
- package/dist/mcp-ui-spec/dist/schemas.cjs.map +1 -1
- package/dist/mcp-ui-spec/dist/schemas.js +103 -0
- package/dist/mcp-ui-spec/dist/schemas.js.map +1 -1
- package/dist/utils/duplicate-mount-registry.cjs +27 -0
- package/dist/utils/duplicate-mount-registry.cjs.map +1 -0
- package/dist/utils/duplicate-mount-registry.d.ts +84 -0
- package/dist/utils/duplicate-mount-registry.d.ts.map +1 -0
- package/dist/utils/duplicate-mount-registry.js +27 -0
- package/dist/utils/duplicate-mount-registry.js.map +1 -0
- package/dist/utils/stable-key.cjs +41 -0
- package/dist/utils/stable-key.cjs.map +1 -0
- package/dist/utils/stable-key.d.ts +33 -0
- package/dist/utils/stable-key.d.ts.map +1 -0
- package/dist/utils/stable-key.js +41 -0
- package/dist/utils/stable-key.js.map +1 -0
- package/docs/briefs/ROADMAP-opendata-macro-mcpui.md +912 -0
- package/package.json +17 -5
- package/src/adapters/connector.test.ts +165 -0
- package/src/adapters/connector.ts +234 -0
- package/src/adapters/index.ts +24 -0
- package/src/components/ExpandableWrapper.test.tsx +5 -2
- package/src/components/ExpandableWrapper.tsx +8 -6
- package/src/components/FeedbackInline.test.tsx +6 -3
- package/src/components/FeedbackInline.tsx +8 -6
- package/src/components/PresentationFeedback.test.tsx +163 -0
- package/src/components/PresentationFeedback.tsx +326 -0
- package/src/components/StreamingUIRenderer.parity.test.tsx +158 -0
- package/src/components/StreamingUIRenderer.tsx +42 -166
- package/src/components/UIResourceRenderer.identity.test.tsx +161 -0
- package/src/components/UIResourceRenderer.tsx +63 -2
- package/src/components/index.ts +10 -0
- package/src/context/MCPUIStringsContext.test.tsx +116 -0
- package/src/context/MCPUIStringsContext.tsx +128 -0
- package/src/index.ts +35 -0
- package/src/utils/duplicate-mount-registry.test.ts +82 -0
- package/src/utils/duplicate-mount-registry.ts +113 -0
- package/src/utils/stable-key.test.ts +96 -0
- package/src/utils/stable-key.ts +91 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/vite.config.ts +1 -0
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { Component } from 'solid-js';
|
|
6
6
|
import type { UIComponent, UILayout, RendererError } from '../types';
|
|
7
|
+
import { type DuplicateMountInfo } from '../utils/duplicate-mount-registry';
|
|
7
8
|
/**
|
|
8
9
|
* How `<UIResourceRenderer>` reacts when `validateComponent()` rejects a
|
|
9
10
|
* component (v5.4.0).
|
|
@@ -59,6 +60,25 @@ export interface UIResourceRendererProps {
|
|
|
59
60
|
* graph, map, video, carousel, image-gallery, code.
|
|
60
61
|
*/
|
|
61
62
|
toolbarVariant?: 'hover' | 'always-visible';
|
|
63
|
+
/**
|
|
64
|
+
* Per-instance hook fired when this renderer mounts a content key that
|
|
65
|
+
* is already mounted elsewhere in the document (v6.5.0 — closes Demande 2
|
|
66
|
+
* of `BRIEF-MCPUI-2026-05-10.md`).
|
|
67
|
+
*
|
|
68
|
+
* The key comes from `getUiResourceStableKey(content)` — `content.id` if
|
|
69
|
+
* provided, else a content hash. The reporter fires every time the
|
|
70
|
+
* concurrent mount count crosses 2+ ; consumers decide what to do
|
|
71
|
+
* (`console.warn`, telemetry beacon, debug overlay, …). The renderer
|
|
72
|
+
* never deduplicates visually on its own.
|
|
73
|
+
*/
|
|
74
|
+
onMountDuplicate?: (info: DuplicateMountInfo) => void;
|
|
75
|
+
/**
|
|
76
|
+
* When `true`, log duplicate mounts to `console.warn` from this instance
|
|
77
|
+
* even when the global `isDebugEnabled()` flag is off. Use to opt-in to
|
|
78
|
+
* console noise on a single suspect surface without flipping the global
|
|
79
|
+
* debug switch (v6.5.0).
|
|
80
|
+
*/
|
|
81
|
+
debugDuplicateMounts?: boolean;
|
|
62
82
|
}
|
|
63
83
|
/**
|
|
64
84
|
* Smart cell value renderer that handles markdown links and other formats
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UIResourceRenderer.d.ts","sourceRoot":"","sources":["../../src/components/UIResourceRenderer.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,SAAS,EAAyE,MAAM,UAAU,CAAA;AAE3G,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAA0B,MAAM,UAAU,CAAA;AAM5F;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,CAAA;AAgEpE;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,OAAO,EAAE,WAAW,GAAG,QAAQ,CAAA;IAE/B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;IAExC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,mBAAmB,CAAA;IAE/B;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"UIResourceRenderer.d.ts","sourceRoot":"","sources":["../../src/components/UIResourceRenderer.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,SAAS,EAAyE,MAAM,UAAU,CAAA;AAE3G,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAA0B,MAAM,UAAU,CAAA;AAM5F,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,mCAAmC,CAAA;AAG1C;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,CAAA;AAgEpE;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,OAAO,EAAE,WAAW,GAAG,QAAQ,CAAA;IAE/B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;IAExC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,mBAAmB,CAAA;IAE/B;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAA;IAE3C;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAA;IAErD;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAmJD;;GAEG;AACH;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAYlE;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,GAAG,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC,CAAA;IACjG;;;;;OAKG;IACH,MAAM,CAAC,EAAE,CACP,EAAE,EAAE,MAAM,EACV,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,SAAS,KACrF,MAAM,CAAA;CACZ;AA8DD,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,MAAM,CAkG7E;AAkqCD;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,CAAC,uBAAuB,CA6IjE,CAAA"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import { delegateEvents, createComponent, getNextElement, template, getNextMarker, insert, effect, style,
|
|
1
|
+
import { delegateEvents, createComponent, getNextElement, template, getNextMarker, spread, mergeProps, insert, effect, style, setAttribute, runHydrationEvents, setProperty, className, memo, isServer, use, addEventListener, classList, setStyleProperty } from "solid-js/web";
|
|
2
2
|
import purify from "../node_modules/.pnpm/dompurify@3.4.1/node_modules/dompurify/dist/purify.es.js";
|
|
3
|
-
import { createMemo,
|
|
3
|
+
import { createMemo, onMount, onCleanup, For, Show, createSignal, createEffect } from "solid-js";
|
|
4
4
|
import { validateComponent, getIframeSandbox, DEFAULT_RESOURCE_LIMITS } from "../services/validation.js";
|
|
5
5
|
import { GenerativeUIErrorBoundary } from "./GenerativeUIErrorBoundary.js";
|
|
6
6
|
import { markRenderStart, markRenderEnd, PERF_PREFIX } from "../utils/perf.js";
|
|
7
|
+
import { isDebugEnabled } from "../utils/logger.js";
|
|
8
|
+
import { getUiResourceStableKey } from "../utils/stable-key.js";
|
|
9
|
+
import { _registerMount, _unregisterMount, getDuplicateMountReporter } from "../utils/duplicate-mount-registry.js";
|
|
7
10
|
import { useTelemetry } from "../context/MCPUITelemetryContext.js";
|
|
8
11
|
import { GridRenderer } from "./GridRenderer.js";
|
|
9
12
|
import { FooterRenderer } from "./FooterRenderer.js";
|
|
@@ -1726,6 +1729,23 @@ const UIResourceRenderer = (props) => {
|
|
|
1726
1729
|
};
|
|
1727
1730
|
});
|
|
1728
1731
|
const layoutData = layout();
|
|
1732
|
+
const isLayoutContent = !("type" in props.content) || props.content.type === "composite";
|
|
1733
|
+
const outerKey = createMemo(() => getUiResourceStableKey(props.content));
|
|
1734
|
+
onMount(() => {
|
|
1735
|
+
var _a, _b;
|
|
1736
|
+
const key = outerKey();
|
|
1737
|
+
const info = _registerMount(key);
|
|
1738
|
+
if (info.count > 1) {
|
|
1739
|
+
(_a = props.onMountDuplicate) == null ? void 0 : _a.call(props, info);
|
|
1740
|
+
(_b = getDuplicateMountReporter()) == null ? void 0 : _b(info);
|
|
1741
|
+
if (isDebugEnabled() || props.debugDuplicateMounts) {
|
|
1742
|
+
console.warn("[mcp-ui] duplicate UIResourceRenderer mount", info);
|
|
1743
|
+
}
|
|
1744
|
+
}
|
|
1745
|
+
});
|
|
1746
|
+
onCleanup(() => {
|
|
1747
|
+
_unregisterMount(outerKey());
|
|
1748
|
+
});
|
|
1729
1749
|
const renderComponent = (component, onError) => createComponent(ComponentRenderer, {
|
|
1730
1750
|
component,
|
|
1731
1751
|
onError,
|
|
@@ -1740,6 +1760,15 @@ const UIResourceRenderer = (props) => {
|
|
|
1740
1760
|
renderComponent,
|
|
1741
1761
|
get children() {
|
|
1742
1762
|
var _el$232 = getNextElement(_tmpl$53), _el$233 = _el$232.firstChild, _el$234 = _el$233.nextSibling, [_el$235, _co$50] = getNextMarker(_el$234.nextSibling);
|
|
1763
|
+
spread(_el$232, mergeProps({
|
|
1764
|
+
get ["class"]() {
|
|
1765
|
+
return `w-full ${props.class || ""}`;
|
|
1766
|
+
}
|
|
1767
|
+
}, () => isLayoutContent ? {
|
|
1768
|
+
"data-mcp-ui-layout-id": outerKey()
|
|
1769
|
+
} : {
|
|
1770
|
+
"data-mcp-ui-component-id": outerKey()
|
|
1771
|
+
}), false, true);
|
|
1743
1772
|
insert(_el$233, createComponent(For, {
|
|
1744
1773
|
get each() {
|
|
1745
1774
|
return layoutData.components;
|
|
@@ -1758,7 +1787,15 @@ const UIResourceRenderer = (props) => {
|
|
|
1758
1787
|
return props.toolbarVariant;
|
|
1759
1788
|
}
|
|
1760
1789
|
}));
|
|
1761
|
-
effect((
|
|
1790
|
+
effect((_p$) => {
|
|
1791
|
+
var _v$43 = getGridStyleString(component), _v$44 = getUiResourceStableKey(component);
|
|
1792
|
+
_p$.e = style(_el$236, _v$43, _p$.e);
|
|
1793
|
+
_v$44 !== _p$.t && setAttribute(_el$236, "data-mcp-ui-component-id", _p$.t = _v$44);
|
|
1794
|
+
return _p$;
|
|
1795
|
+
}, {
|
|
1796
|
+
e: void 0,
|
|
1797
|
+
t: void 0
|
|
1798
|
+
});
|
|
1762
1799
|
return _el$236;
|
|
1763
1800
|
})()
|
|
1764
1801
|
}));
|
|
@@ -1774,15 +1811,8 @@ const UIResourceRenderer = (props) => {
|
|
|
1774
1811
|
});
|
|
1775
1812
|
}
|
|
1776
1813
|
}), _el$235, _co$50);
|
|
1777
|
-
effect((
|
|
1778
|
-
|
|
1779
|
-
_v$43 !== _p$.e && className(_el$232, _p$.e = _v$43);
|
|
1780
|
-
_p$.t = style(_el$233, _v$44, _p$.t);
|
|
1781
|
-
return _p$;
|
|
1782
|
-
}, {
|
|
1783
|
-
e: void 0,
|
|
1784
|
-
t: void 0
|
|
1785
|
-
});
|
|
1814
|
+
effect((_$p) => style(_el$233, gridContainerStyle(), _$p));
|
|
1815
|
+
runHydrationEvents();
|
|
1786
1816
|
return _el$232;
|
|
1787
1817
|
}
|
|
1788
1818
|
});
|