@seed-ship/mcp-ui-solid 6.8.2 → 6.9.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 (39) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/components/ChartJSRenderer.cjs +27 -13
  3. package/dist/components/ChartJSRenderer.cjs.map +1 -1
  4. package/dist/components/ChartJSRenderer.d.ts.map +1 -1
  5. package/dist/components/ChartJSRenderer.js +28 -14
  6. package/dist/components/ChartJSRenderer.js.map +1 -1
  7. package/dist/components/DegradedFallback.cjs +73 -0
  8. package/dist/components/DegradedFallback.cjs.map +1 -0
  9. package/dist/components/DegradedFallback.d.ts +37 -0
  10. package/dist/components/DegradedFallback.d.ts.map +1 -0
  11. package/dist/components/DegradedFallback.js +73 -0
  12. package/dist/components/DegradedFallback.js.map +1 -0
  13. package/dist/components/GraphRenderer.cjs +30 -15
  14. package/dist/components/GraphRenderer.cjs.map +1 -1
  15. package/dist/components/GraphRenderer.d.ts.map +1 -1
  16. package/dist/components/GraphRenderer.js +31 -16
  17. package/dist/components/GraphRenderer.js.map +1 -1
  18. package/dist/components/MapRenderer.cjs +128 -107
  19. package/dist/components/MapRenderer.cjs.map +1 -1
  20. package/dist/components/MapRenderer.d.ts.map +1 -1
  21. package/dist/components/MapRenderer.js +129 -108
  22. package/dist/components/MapRenderer.js.map +1 -1
  23. package/dist/index.cjs +4 -4
  24. package/dist/index.js +1 -1
  25. package/dist/utils/degraded-projections.cjs +87 -0
  26. package/dist/utils/degraded-projections.cjs.map +1 -0
  27. package/dist/utils/degraded-projections.d.ts +64 -0
  28. package/dist/utils/degraded-projections.d.ts.map +1 -0
  29. package/dist/utils/degraded-projections.js +87 -0
  30. package/dist/utils/degraded-projections.js.map +1 -0
  31. package/package.json +1 -1
  32. package/src/components/ChartJSRenderer.tsx +94 -85
  33. package/src/components/DegradedFallback.test.tsx +61 -0
  34. package/src/components/DegradedFallback.tsx +93 -0
  35. package/src/components/GraphRenderer.tsx +26 -4
  36. package/src/components/MapRenderer.tsx +446 -392
  37. package/src/utils/degraded-projections.test.ts +113 -0
  38. package/src/utils/degraded-projections.ts +149 -0
  39. package/tsconfig.tsbuildinfo +1 -1
@@ -28,6 +28,9 @@ import type {
28
28
  } from '@seed-ship/mcp-ui-spec';
29
29
  import { ExpandableWrapper, useExpanded } from './ExpandableWrapper';
30
30
  import { PortalDropdownMenu } from './PortalDropdownMenu';
31
+ import { DegradedFallback } from './DegradedFallback';
32
+ import { graphToDegradedTable } from '../utils/degraded-projections';
33
+ import { useTelemetry } from '../context/MCPUITelemetryContext';
31
34
 
32
35
  // Module-scoped lazy import promise — first call triggers the dynamic
33
36
  // import, subsequent calls reuse the resolved module.
@@ -220,6 +223,7 @@ export interface GraphRendererProps {
220
223
  export const GraphRenderer: Component<GraphRendererProps> = (props) => {
221
224
  const params = () => props.component.params as GraphComponentParams;
222
225
  const isExpanded = useExpanded();
226
+ const telemetry = useTelemetry();
223
227
  const [available, setAvailable] = createSignal<boolean | null>(null);
224
228
  const [error, setError] = createSignal<string | undefined>();
225
229
  const [exportMenuOpen, setExportMenuOpen] = createSignal(false);
@@ -293,7 +297,18 @@ export const GraphRenderer: Component<GraphRendererProps> = (props) => {
293
297
  graphInstance = new (Graph as any)(config);
294
298
  await graphInstance.render();
295
299
  } catch (err) {
296
- setError(err instanceof Error ? err.message : 'Failed to render graph');
300
+ const message = err instanceof Error ? err.message : 'Failed to render graph';
301
+ setError(message);
302
+ // Fallback ladder (P2.5): the native G6 render threw — emit telemetry
303
+ // so the failure is observable, then degrade to the edge/node table
304
+ // below instead of leaving a blank canvas.
305
+ telemetry?.dispatch({
306
+ type: 'render:error',
307
+ errorMessage: message,
308
+ id: props.component.id ?? '',
309
+ componentType: 'graph',
310
+ ts: Date.now(),
311
+ });
297
312
  }
298
313
  });
299
314
 
@@ -424,19 +439,26 @@ export const GraphRenderer: Component<GraphRendererProps> = (props) => {
424
439
  </PortalDropdownMenu>
425
440
  </div>
426
441
 
442
+ {/* Native G6 canvas — hidden once a render error degrades us. */}
427
443
  <div
428
444
  ref={containerRef}
429
445
  class={`bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden ${
430
- isExpanded() ? 'flex-1 min-h-0' : ''
431
- }`}
446
+ error() ? 'hidden' : ''
447
+ } ${isExpanded() ? 'flex-1 min-h-0' : ''}`}
432
448
  style={
433
449
  isExpanded()
434
450
  ? `height: 100%; width: ${params().width ?? '100%'};`
435
451
  : `height: ${params().height ?? '400px'}; width: ${params().width ?? '100%'};`
436
452
  }
437
453
  />
454
+ {/* Fallback ladder (P2.5): degrade to an edge/node table on error
455
+ rather than showing a bare message. Export menu stays usable. */}
438
456
  <Show when={error()}>
439
- <p class="text-xs text-red-600 dark:text-red-400 mt-1">Render error: {error()}</p>
457
+ <DegradedFallback
458
+ message={`Graph rendering failed: ${error()}`}
459
+ caption="Showing the graph data as a table — the interactive view is unavailable."
460
+ {...graphToDegradedTable(params())}
461
+ />
440
462
  </Show>
441
463
  </div>
442
464
  </ExpandableWrapper>