@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
@@ -6,6 +6,7 @@ const solidJs = require("solid-js");
6
6
  const validation = require("../services/validation.cjs");
7
7
  const GenerativeUIErrorBoundary = require("./GenerativeUIErrorBoundary.cjs");
8
8
  const perf = require("../utils/perf.cjs");
9
+ const MCPUITelemetryContext = require("../context/MCPUITelemetryContext.cjs");
9
10
  const GridRenderer = require("./GridRenderer.cjs");
10
11
  const FooterRenderer = require("./FooterRenderer.cjs");
11
12
  const CarouselRenderer = require("./CarouselRenderer.cjs");
@@ -1055,9 +1056,44 @@ function LinkRenderer(props) {
1055
1056
  })();
1056
1057
  }
1057
1058
  function ComponentRenderer(props) {
1058
- var _a, _b, _c;
1059
+ var _a, _b, _c, _d, _e, _f;
1059
1060
  perf.markRenderStart(props.component.id);
1060
- solidJs.onMount(() => perf.markRenderEnd(props.component.id));
1061
+ const telemetry = MCPUITelemetryContext.useTelemetry();
1062
+ solidJs.onMount(() => {
1063
+ perf.markRenderEnd(props.component.id);
1064
+ if (telemetry) {
1065
+ const ts = Date.now();
1066
+ telemetry.dispatch({
1067
+ type: "component:mounted",
1068
+ id: props.component.id,
1069
+ componentType: props.component.type,
1070
+ ts
1071
+ });
1072
+ if (typeof performance !== "undefined" && typeof performance.getEntriesByName === "function") {
1073
+ const entries = performance.getEntriesByName(`${perf.PERF_PREFIX}${props.component.id}:render`, "measure");
1074
+ const last = entries[entries.length - 1];
1075
+ if (last) {
1076
+ telemetry.dispatch({
1077
+ type: "component:rendered",
1078
+ id: props.component.id,
1079
+ componentType: props.component.type,
1080
+ durationMs: last.duration,
1081
+ ts
1082
+ });
1083
+ }
1084
+ }
1085
+ }
1086
+ });
1087
+ solidJs.onCleanup(() => {
1088
+ if (telemetry) {
1089
+ telemetry.dispatch({
1090
+ type: "component:unmounted",
1091
+ id: props.component.id,
1092
+ componentType: props.component.type,
1093
+ ts: Date.now()
1094
+ });
1095
+ }
1096
+ });
1061
1097
  const validation$1 = validation.validateComponent(props.component);
1062
1098
  if (!validation$1.valid) {
1063
1099
  (_a = props.onError) == null ? void 0 : _a.call(props, {
@@ -1066,8 +1102,18 @@ function ComponentRenderer(props) {
1066
1102
  componentId: props.component.id,
1067
1103
  details: validation$1.errors
1068
1104
  });
1105
+ if (telemetry) {
1106
+ telemetry.dispatch({
1107
+ type: "validation:failed",
1108
+ id: props.component.id,
1109
+ componentType: props.component.type,
1110
+ errorCount: ((_b = validation$1.errors) == null ? void 0 : _b.length) ?? 0,
1111
+ firstErrorCode: ((_d = (_c = validation$1.errors) == null ? void 0 : _c[0]) == null ? void 0 : _d.code) ?? null,
1112
+ ts: Date.now()
1113
+ });
1114
+ }
1069
1115
  const mode = props.errorMode ?? "block";
1070
- const firstError = ((_c = (_b = validation$1.errors) == null ? void 0 : _b[0]) == null ? void 0 : _c.message) || "Unknown validation error";
1116
+ const firstError = ((_f = (_e = validation$1.errors) == null ? void 0 : _e[0]) == null ? void 0 : _f.message) || "Unknown validation error";
1071
1117
  if (mode === "silent") {
1072
1118
  return null;
1073
1119
  }
@@ -1319,7 +1365,20 @@ function ActionRenderer(props) {
1319
1365
  execute,
1320
1366
  isExecuting
1321
1367
  } = useAction.useAction();
1368
+ const telemetry = MCPUITelemetryContext.useTelemetry();
1369
+ function dispatchTelemetry() {
1370
+ if (!telemetry) return;
1371
+ const actionName = params.toolName ?? params.action ?? "unknown";
1372
+ telemetry.dispatch({
1373
+ type: "action:dispatched",
1374
+ id: props.component.id,
1375
+ componentType: "action",
1376
+ actionName,
1377
+ ts: Date.now()
1378
+ });
1379
+ }
1322
1380
  const handleClick = async (e) => {
1381
+ dispatchTelemetry();
1323
1382
  if (params.action === "tool-call" && params.toolName) {
1324
1383
  e.preventDefault();
1325
1384
  await execute(params.toolName, params.params || {});