@seed-ship/mcp-ui-solid 5.5.0 → 5.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 (62) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/dist/components/FormRenderer.cjs +13 -2
  3. package/dist/components/FormRenderer.cjs.map +1 -1
  4. package/dist/components/FormRenderer.d.ts.map +1 -1
  5. package/dist/components/FormRenderer.js +13 -2
  6. package/dist/components/FormRenderer.js.map +1 -1
  7. package/dist/components/GenerativeUIErrorBoundary.cjs +11 -0
  8. package/dist/components/GenerativeUIErrorBoundary.cjs.map +1 -1
  9. package/dist/components/GenerativeUIErrorBoundary.d.ts.map +1 -1
  10. package/dist/components/GenerativeUIErrorBoundary.js +11 -0
  11. package/dist/components/GenerativeUIErrorBoundary.js.map +1 -1
  12. package/dist/components/StreamingUIRenderer.cjs +49 -3
  13. package/dist/components/StreamingUIRenderer.cjs.map +1 -1
  14. package/dist/components/StreamingUIRenderer.d.ts.map +1 -1
  15. package/dist/components/StreamingUIRenderer.js +51 -5
  16. package/dist/components/StreamingUIRenderer.js.map +1 -1
  17. package/dist/components/UIResourceRenderer.cjs +62 -3
  18. package/dist/components/UIResourceRenderer.cjs.map +1 -1
  19. package/dist/components/UIResourceRenderer.d.ts.map +1 -1
  20. package/dist/components/UIResourceRenderer.js +64 -5
  21. package/dist/components/UIResourceRenderer.js.map +1 -1
  22. package/dist/context/MCPUITelemetryContext.cjs +25 -0
  23. package/dist/context/MCPUITelemetryContext.cjs.map +1 -0
  24. package/dist/context/MCPUITelemetryContext.d.ts +36 -0
  25. package/dist/context/MCPUITelemetryContext.d.ts.map +1 -0
  26. package/dist/context/MCPUITelemetryContext.js +25 -0
  27. package/dist/context/MCPUITelemetryContext.js.map +1 -0
  28. package/dist/index.cjs +6 -0
  29. package/dist/index.cjs.map +1 -1
  30. package/dist/index.d.cts +4 -0
  31. package/dist/index.d.ts +4 -0
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +6 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/mcp-ui-spec/dist/schemas.cjs +16 -5
  36. package/dist/mcp-ui-spec/dist/schemas.cjs.map +1 -1
  37. package/dist/mcp-ui-spec/dist/schemas.js +16 -5
  38. package/dist/mcp-ui-spec/dist/schemas.js.map +1 -1
  39. package/dist/services/telemetry.cjs +56 -0
  40. package/dist/services/telemetry.cjs.map +1 -0
  41. package/dist/services/telemetry.d.ts +87 -0
  42. package/dist/services/telemetry.d.ts.map +1 -0
  43. package/dist/services/telemetry.js +56 -0
  44. package/dist/services/telemetry.js.map +1 -0
  45. package/dist/services/validation.cjs +28 -26
  46. package/dist/services/validation.cjs.map +1 -1
  47. package/dist/services/validation.d.ts.map +1 -1
  48. package/dist/services/validation.js +29 -27
  49. package/dist/services/validation.js.map +1 -1
  50. package/package.json +2 -2
  51. package/src/components/FormRenderer.tsx +14 -0
  52. package/src/components/GenerativeUIErrorBoundary.tsx +17 -1
  53. package/src/components/StreamingUIRenderer.tsx +55 -3
  54. package/src/components/UIResourceRenderer.tsx +79 -3
  55. package/src/context/MCPUITelemetryContext.test.tsx +119 -0
  56. package/src/context/MCPUITelemetryContext.tsx +71 -0
  57. package/src/index.ts +15 -0
  58. package/src/services/telemetry.test.ts +134 -0
  59. package/src/services/telemetry.ts +149 -0
  60. package/src/services/validation.test.ts +53 -3
  61. package/src/services/validation.ts +54 -44
  62. package/tsconfig.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"UIResourceRenderer.d.ts","sourceRoot":"","sources":["../../src/components/UIResourceRenderer.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,SAAS,EAA8D,MAAM,UAAU,CAAA;AAEhG,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAA0B,MAAM,UAAU,CAAA;AAK5F;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,CAAA;AA8DpE;;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;CAChC;AAiJD;;GAEG;AACH;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAYlE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CA4ElD;AA2iCD;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,CAAC,uBAAuB,CA6GjE,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;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,CAAA;AA8DpE;;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;CAChC;AAiJD;;GAEG;AACH;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAYlE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CA4ElD;AAsnCD;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,CAAC,uBAAuB,CA6GjE,CAAA"}
@@ -1,9 +1,10 @@
1
1
  import { delegateEvents, createComponent, getNextElement, template, getNextMarker, insert, effect, style, className, setProperty, setAttribute, runHydrationEvents, 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, For, Show, onMount, createSignal, createEffect } from "solid-js";
3
+ import { createMemo, For, Show, onMount, onCleanup, 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
- import { markRenderStart, markRenderEnd } from "../utils/perf.js";
6
+ import { markRenderStart, markRenderEnd, PERF_PREFIX } from "../utils/perf.js";
7
+ import { useTelemetry } from "../context/MCPUITelemetryContext.js";
7
8
  import { GridRenderer } from "./GridRenderer.js";
8
9
  import { FooterRenderer } from "./FooterRenderer.js";
9
10
  import { CarouselRenderer } from "./CarouselRenderer.js";
@@ -1053,9 +1054,44 @@ function LinkRenderer(props) {
1053
1054
  })();
1054
1055
  }
1055
1056
  function ComponentRenderer(props) {
1056
- var _a, _b, _c;
1057
+ var _a, _b, _c, _d, _e, _f;
1057
1058
  markRenderStart(props.component.id);
1058
- onMount(() => markRenderEnd(props.component.id));
1059
+ const telemetry = useTelemetry();
1060
+ onMount(() => {
1061
+ markRenderEnd(props.component.id);
1062
+ if (telemetry) {
1063
+ const ts = Date.now();
1064
+ telemetry.dispatch({
1065
+ type: "component:mounted",
1066
+ id: props.component.id,
1067
+ componentType: props.component.type,
1068
+ ts
1069
+ });
1070
+ if (typeof performance !== "undefined" && typeof performance.getEntriesByName === "function") {
1071
+ const entries = performance.getEntriesByName(`${PERF_PREFIX}${props.component.id}:render`, "measure");
1072
+ const last = entries[entries.length - 1];
1073
+ if (last) {
1074
+ telemetry.dispatch({
1075
+ type: "component:rendered",
1076
+ id: props.component.id,
1077
+ componentType: props.component.type,
1078
+ durationMs: last.duration,
1079
+ ts
1080
+ });
1081
+ }
1082
+ }
1083
+ }
1084
+ });
1085
+ onCleanup(() => {
1086
+ if (telemetry) {
1087
+ telemetry.dispatch({
1088
+ type: "component:unmounted",
1089
+ id: props.component.id,
1090
+ componentType: props.component.type,
1091
+ ts: Date.now()
1092
+ });
1093
+ }
1094
+ });
1059
1095
  const validation = validateComponent(props.component);
1060
1096
  if (!validation.valid) {
1061
1097
  (_a = props.onError) == null ? void 0 : _a.call(props, {
@@ -1064,8 +1100,18 @@ function ComponentRenderer(props) {
1064
1100
  componentId: props.component.id,
1065
1101
  details: validation.errors
1066
1102
  });
1103
+ if (telemetry) {
1104
+ telemetry.dispatch({
1105
+ type: "validation:failed",
1106
+ id: props.component.id,
1107
+ componentType: props.component.type,
1108
+ errorCount: ((_b = validation.errors) == null ? void 0 : _b.length) ?? 0,
1109
+ firstErrorCode: ((_d = (_c = validation.errors) == null ? void 0 : _c[0]) == null ? void 0 : _d.code) ?? null,
1110
+ ts: Date.now()
1111
+ });
1112
+ }
1067
1113
  const mode = props.errorMode ?? "block";
1068
- const firstError = ((_c = (_b = validation.errors) == null ? void 0 : _b[0]) == null ? void 0 : _c.message) || "Unknown validation error";
1114
+ const firstError = ((_f = (_e = validation.errors) == null ? void 0 : _e[0]) == null ? void 0 : _f.message) || "Unknown validation error";
1069
1115
  if (mode === "silent") {
1070
1116
  return null;
1071
1117
  }
@@ -1317,7 +1363,20 @@ function ActionRenderer(props) {
1317
1363
  execute,
1318
1364
  isExecuting
1319
1365
  } = useAction();
1366
+ const telemetry = useTelemetry();
1367
+ function dispatchTelemetry() {
1368
+ if (!telemetry) return;
1369
+ const actionName = params.toolName ?? params.action ?? "unknown";
1370
+ telemetry.dispatch({
1371
+ type: "action:dispatched",
1372
+ id: props.component.id,
1373
+ componentType: "action",
1374
+ actionName,
1375
+ ts: Date.now()
1376
+ });
1377
+ }
1320
1378
  const handleClick = async (e) => {
1379
+ dispatchTelemetry();
1321
1380
  if (params.action === "tool-call" && params.toolName) {
1322
1381
  e.preventDefault();
1323
1382
  await execute(params.toolName, params.params || {});