@seed-ship/mcp-ui-solid 4.0.1 → 4.0.2
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/dist/components/ScratchpadPanel.cjs +45 -33
- package/dist/components/ScratchpadPanel.cjs.map +1 -1
- package/dist/components/ScratchpadPanel.js +45 -33
- package/dist/components/ScratchpadPanel.js.map +1 -1
- package/package.json +1 -1
- package/src/components/ScratchpadPanel.tsx +26 -16
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -342,6 +342,16 @@ export const ScratchpadPanel: Component<ScratchpadPanelProps> = (props) => {
|
|
|
342
342
|
)
|
|
343
343
|
}
|
|
344
344
|
|
|
345
|
+
// ─── Helpers ────────────────────────────────────────────────
|
|
346
|
+
|
|
347
|
+
/** Parse content that may arrive as a JSON string from SSE transport */
|
|
348
|
+
function parseContent(content: unknown): unknown {
|
|
349
|
+
if (typeof content === 'string') {
|
|
350
|
+
try { return JSON.parse(content) } catch { return content }
|
|
351
|
+
}
|
|
352
|
+
return content
|
|
353
|
+
}
|
|
354
|
+
|
|
345
355
|
// ─── Section Renderer ────────────────────────────────────────
|
|
346
356
|
|
|
347
357
|
const SectionRenderer: Component<{
|
|
@@ -356,23 +366,23 @@ const SectionRenderer: Component<{
|
|
|
356
366
|
<div class="px-4 py-3">
|
|
357
367
|
<h4 class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wide mb-2">{props.section.title}</h4>
|
|
358
368
|
<Switch>
|
|
359
|
-
<Match when={props.section.type === 'data'}><DataSection content={props.section.content} /></Match>
|
|
360
|
-
<Match when={props.section.type === 'filter'}><InteractiveFilterSection content={props.section.content} filters={props.filters} onFilterChange={props.onFilterChange} /></Match>
|
|
369
|
+
<Match when={props.section.type === 'data'}><DataSection content={parseContent(props.section.content)} /></Match>
|
|
370
|
+
<Match when={props.section.type === 'filter'}><InteractiveFilterSection content={parseContent(props.section.content)} filters={props.filters} onFilterChange={props.onFilterChange} /></Match>
|
|
361
371
|
<Match when={props.section.type === 'message'}><p class="text-sm text-gray-700 dark:text-gray-300">{String(props.section.content)}</p></Match>
|
|
362
|
-
<Match when={props.section.type === 'action'}><ActionSection content={props.section.content} onAction={props.onAction} /></Match>
|
|
363
|
-
<Match when={props.section.type === 'steps'}><EnrichedStepsSection content={props.section.content} onAction={props.onAction} onFilterChange={props.onFilterChange} /></Match>
|
|
364
|
-
<Match when={props.section.type === 'form'}><EmbeddedFormSection content={props.section.content} sectionId={props.section.id} onAction={props.onAction} onSubmit={props.onSubmit} /></Match>
|
|
365
|
-
<Match when={props.section.type === 'understanding'}><UnderstandingSection content={props.section.content} /></Match>
|
|
366
|
-
<Match when={props.section.type === 'feedback'}><FeedbackSection content={props.section.content} onAction={props.onAction} /></Match>
|
|
367
|
-
<Match when={props.section.type === 'prompt'}><PromptSection content={props.section.content} onAction={props.onAction} /></Match>
|
|
368
|
-
<Match when={props.section.type === 'stepper'}><StepperProgressSection content={props.section.content} /></Match>
|
|
369
|
-
<Match when={props.section.type === 'error'}><ErrorSectionRenderer content={props.section.content} onAction={props.onAction} /></Match>
|
|
370
|
-
<Match when={props.section.type === 'source_card'}><SourceCardSection content={props.section.content} /></Match>
|
|
371
|
-
<Match when={props.section.type === 'diff'}><DiffSection content={props.section.content} /></Match>
|
|
372
|
-
<Match when={props.section.type === 'verified_text'}><VerifiedText {...(props.section.content as VerifiedTextContent)} onHallucinationClick={(h) => props.onAction?.('hallucination_click', h)} /></Match>
|
|
373
|
-
<Match when={props.section.type === 'data_preview'}><DataPreviewSection content={props.section.content as DataPreviewContent} /></Match>
|
|
374
|
-
<Match when={props.section.type === 'map'}>{(() => { const c = props.section.content as MapSectionContent; return <MapRenderer params={{ geojson: c.geojson, center: c.center, zoom: c.zoom, geojsonStyle: c.style, popup: c.popup, layers: c.layers, height: c.height || '300px', fitBounds: true }} /> })()}</Match>
|
|
375
|
-
<Match when={props.section.type === 'chart'}
|
|
372
|
+
<Match when={props.section.type === 'action'}><ActionSection content={parseContent(props.section.content)} onAction={props.onAction} /></Match>
|
|
373
|
+
<Match when={props.section.type === 'steps'}><EnrichedStepsSection content={parseContent(props.section.content)} onAction={props.onAction} onFilterChange={props.onFilterChange} /></Match>
|
|
374
|
+
<Match when={props.section.type === 'form'}><EmbeddedFormSection content={parseContent(props.section.content)} sectionId={props.section.id} onAction={props.onAction} onSubmit={props.onSubmit} /></Match>
|
|
375
|
+
<Match when={props.section.type === 'understanding'}><UnderstandingSection content={parseContent(props.section.content)} /></Match>
|
|
376
|
+
<Match when={props.section.type === 'feedback'}><FeedbackSection content={parseContent(props.section.content)} onAction={props.onAction} /></Match>
|
|
377
|
+
<Match when={props.section.type === 'prompt'}><PromptSection content={parseContent(props.section.content)} onAction={props.onAction} /></Match>
|
|
378
|
+
<Match when={props.section.type === 'stepper'}><StepperProgressSection content={parseContent(props.section.content)} /></Match>
|
|
379
|
+
<Match when={props.section.type === 'error'}><ErrorSectionRenderer content={parseContent(props.section.content)} onAction={props.onAction} /></Match>
|
|
380
|
+
<Match when={props.section.type === 'source_card'}><SourceCardSection content={parseContent(props.section.content)} /></Match>
|
|
381
|
+
<Match when={props.section.type === 'diff'}><DiffSection content={parseContent(props.section.content)} /></Match>
|
|
382
|
+
<Match when={props.section.type === 'verified_text'}><VerifiedText {...(parseContent(props.section.content) as VerifiedTextContent)} onHallucinationClick={(h) => props.onAction?.('hallucination_click', h)} /></Match>
|
|
383
|
+
<Match when={props.section.type === 'data_preview'}><DataPreviewSection content={parseContent(props.section.content) as DataPreviewContent} /></Match>
|
|
384
|
+
<Match when={props.section.type === 'map'}>{(() => { const c = parseContent(props.section.content) as MapSectionContent; return <MapRenderer params={{ geojson: c.geojson, center: c.center, zoom: c.zoom, geojsonStyle: c.style, popup: c.popup, layers: c.layers, height: c.height || '300px', fitBounds: true }} /> })()}</Match>
|
|
385
|
+
<Match when={props.section.type === 'chart'}>{(() => { const c = parseContent(props.section.content) as ChartComponentParams; return <ChartJSRenderer component={{ id: props.section.id, type: 'chart', position: { colStart: 1, colSpan: 12 }, params: { ...c, renderer: 'native', height: (c as any)?.height || '250px' } }} /> })()}</Match>
|
|
376
386
|
<Match when={true}><pre class="text-xs text-gray-500 overflow-auto">{JSON.stringify(props.section.content, null, 2)}</pre></Match>
|
|
377
387
|
</Switch>
|
|
378
388
|
</div>
|