@seed-ship/mcp-ui-solid 6.19.1 → 6.21.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 +663 -0
- package/README.md +911 -4
- package/dist/adapters/connector.cjs +15 -4
- package/dist/adapters/connector.cjs.map +1 -1
- package/dist/adapters/connector.d.ts +38 -0
- package/dist/adapters/connector.d.ts.map +1 -1
- package/dist/adapters/connector.js +15 -4
- package/dist/adapters/connector.js.map +1 -1
- package/dist/adapters/index.d.ts +4 -3
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/macro-run.cjs +25 -13
- package/dist/adapters/macro-run.cjs.map +1 -1
- package/dist/adapters/macro-run.d.ts +37 -2
- package/dist/adapters/macro-run.d.ts.map +1 -1
- package/dist/adapters/macro-run.js +25 -13
- package/dist/adapters/macro-run.js.map +1 -1
- package/dist/adapters.cjs +2 -0
- package/dist/adapters.cjs.map +1 -1
- package/dist/adapters.js +4 -2
- package/dist/components/ActionGroupRenderer.cjs +3 -1
- package/dist/components/ActionGroupRenderer.cjs.map +1 -1
- package/dist/components/ActionGroupRenderer.d.ts.map +1 -1
- package/dist/components/ActionGroupRenderer.js +3 -1
- package/dist/components/ActionGroupRenderer.js.map +1 -1
- package/dist/components/AgentCard.cjs +11 -8
- package/dist/components/AgentCard.cjs.map +1 -1
- package/dist/components/AgentCard.d.ts.map +1 -1
- package/dist/components/AgentCard.js +11 -8
- package/dist/components/AgentCard.js.map +1 -1
- package/dist/components/AgentHandoff.cjs +6 -1
- package/dist/components/AgentHandoff.cjs.map +1 -1
- package/dist/components/AgentHandoff.d.ts.map +1 -1
- package/dist/components/AgentHandoff.js +6 -1
- package/dist/components/AgentHandoff.js.map +1 -1
- package/dist/components/ArtifactRenderer.cjs +25 -6
- package/dist/components/ArtifactRenderer.cjs.map +1 -1
- package/dist/components/ArtifactRenderer.d.ts.map +1 -1
- package/dist/components/ArtifactRenderer.js +25 -6
- package/dist/components/ArtifactRenderer.js.map +1 -1
- package/dist/components/AutocompleteDropdown.cjs +30 -24
- package/dist/components/AutocompleteDropdown.cjs.map +1 -1
- package/dist/components/AutocompleteDropdown.d.ts.map +1 -1
- package/dist/components/AutocompleteDropdown.js +30 -24
- package/dist/components/AutocompleteDropdown.js.map +1 -1
- package/dist/components/AutocompleteFormField.cjs +3 -1
- package/dist/components/AutocompleteFormField.cjs.map +1 -1
- package/dist/components/AutocompleteFormField.d.ts.map +1 -1
- package/dist/components/AutocompleteFormField.js +4 -2
- package/dist/components/AutocompleteFormField.js.map +1 -1
- package/dist/components/BriefingDiff.cjs +45 -39
- package/dist/components/BriefingDiff.cjs.map +1 -1
- package/dist/components/BriefingDiff.d.ts.map +1 -1
- package/dist/components/BriefingDiff.js +45 -39
- package/dist/components/BriefingDiff.js.map +1 -1
- package/dist/components/CarouselRenderer.cjs +8 -2
- package/dist/components/CarouselRenderer.cjs.map +1 -1
- package/dist/components/CarouselRenderer.d.ts.map +1 -1
- package/dist/components/CarouselRenderer.js +8 -2
- package/dist/components/CarouselRenderer.js.map +1 -1
- package/dist/components/ChartJSRenderer.cjs +60 -36
- package/dist/components/ChartJSRenderer.cjs.map +1 -1
- package/dist/components/ChartJSRenderer.d.ts.map +1 -1
- package/dist/components/ChartJSRenderer.js +61 -37
- package/dist/components/ChartJSRenderer.js.map +1 -1
- package/dist/components/ChatPrompt.cjs +15 -9
- package/dist/components/ChatPrompt.cjs.map +1 -1
- package/dist/components/ChatPrompt.d.ts.map +1 -1
- package/dist/components/ChatPrompt.js +15 -9
- package/dist/components/ChatPrompt.js.map +1 -1
- package/dist/components/CodeBlockRenderer.cjs +34 -16
- package/dist/components/CodeBlockRenderer.cjs.map +1 -1
- package/dist/components/CodeBlockRenderer.d.ts.map +1 -1
- package/dist/components/CodeBlockRenderer.js +34 -16
- package/dist/components/CodeBlockRenderer.js.map +1 -1
- package/dist/components/DataPreviewSection.cjs +91 -44
- package/dist/components/DataPreviewSection.cjs.map +1 -1
- package/dist/components/DataPreviewSection.d.ts.map +1 -1
- package/dist/components/DataPreviewSection.js +92 -45
- package/dist/components/DataPreviewSection.js.map +1 -1
- package/dist/components/DegradedFallback.cjs +20 -16
- package/dist/components/DegradedFallback.cjs.map +1 -1
- package/dist/components/DegradedFallback.d.ts.map +1 -1
- package/dist/components/DegradedFallback.js +20 -16
- package/dist/components/DegradedFallback.js.map +1 -1
- package/dist/components/FooterRenderer.cjs +21 -17
- package/dist/components/FooterRenderer.cjs.map +1 -1
- package/dist/components/FooterRenderer.d.ts.map +1 -1
- package/dist/components/FooterRenderer.js +21 -17
- package/dist/components/FooterRenderer.js.map +1 -1
- package/dist/components/FormFieldRenderer.cjs +116 -93
- package/dist/components/FormFieldRenderer.cjs.map +1 -1
- package/dist/components/FormFieldRenderer.d.ts.map +1 -1
- package/dist/components/FormFieldRenderer.js +116 -93
- package/dist/components/FormFieldRenderer.js.map +1 -1
- package/dist/components/FormRenderer.cjs +55 -31
- package/dist/components/FormRenderer.cjs.map +1 -1
- package/dist/components/FormRenderer.d.ts.map +1 -1
- package/dist/components/FormRenderer.js +55 -31
- package/dist/components/FormRenderer.js.map +1 -1
- package/dist/components/GenerativeUIErrorBoundary.cjs +20 -15
- package/dist/components/GenerativeUIErrorBoundary.cjs.map +1 -1
- package/dist/components/GenerativeUIErrorBoundary.d.ts.map +1 -1
- package/dist/components/GenerativeUIErrorBoundary.js +20 -15
- package/dist/components/GenerativeUIErrorBoundary.js.map +1 -1
- package/dist/components/GraphRenderer.cjs +56 -33
- package/dist/components/GraphRenderer.cjs.map +1 -1
- package/dist/components/GraphRenderer.d.ts.map +1 -1
- package/dist/components/GraphRenderer.js +56 -33
- package/dist/components/GraphRenderer.js.map +1 -1
- package/dist/components/IframeFallbackLink.cjs +37 -0
- package/dist/components/IframeFallbackLink.cjs.map +1 -0
- package/dist/components/IframeFallbackLink.d.ts +23 -0
- package/dist/components/IframeFallbackLink.d.ts.map +1 -0
- package/dist/components/IframeFallbackLink.js +37 -0
- package/dist/components/IframeFallbackLink.js.map +1 -0
- package/dist/components/ImageGalleryRenderer.cjs +13 -4
- package/dist/components/ImageGalleryRenderer.cjs.map +1 -1
- package/dist/components/ImageGalleryRenderer.d.ts.map +1 -1
- package/dist/components/ImageGalleryRenderer.js +13 -4
- package/dist/components/ImageGalleryRenderer.js.map +1 -1
- package/dist/components/LightboxOverlay.cjs +16 -8
- package/dist/components/LightboxOverlay.cjs.map +1 -1
- package/dist/components/LightboxOverlay.d.ts.map +1 -1
- package/dist/components/LightboxOverlay.js +17 -9
- package/dist/components/LightboxOverlay.js.map +1 -1
- package/dist/components/MapRenderer.cjs +59 -29
- package/dist/components/MapRenderer.cjs.map +1 -1
- package/dist/components/MapRenderer.d.ts +10 -2
- package/dist/components/MapRenderer.d.ts.map +1 -1
- package/dist/components/MapRenderer.js +60 -30
- package/dist/components/MapRenderer.js.map +1 -1
- package/dist/components/ModalRenderer.cjs +4 -1
- package/dist/components/ModalRenderer.cjs.map +1 -1
- package/dist/components/ModalRenderer.d.ts.map +1 -1
- package/dist/components/ModalRenderer.js +5 -2
- package/dist/components/ModalRenderer.js.map +1 -1
- package/dist/components/ScratchpadPanel.cjs +578 -535
- package/dist/components/ScratchpadPanel.cjs.map +1 -1
- package/dist/components/ScratchpadPanel.d.ts.map +1 -1
- package/dist/components/ScratchpadPanel.js +578 -535
- package/dist/components/ScratchpadPanel.js.map +1 -1
- package/dist/components/StreamingUIRenderer.cjs +92 -28
- package/dist/components/StreamingUIRenderer.cjs.map +1 -1
- package/dist/components/StreamingUIRenderer.d.ts.map +1 -1
- package/dist/components/StreamingUIRenderer.js +92 -28
- package/dist/components/StreamingUIRenderer.js.map +1 -1
- package/dist/components/UIResourceRenderer.cjs +481 -365
- package/dist/components/UIResourceRenderer.cjs.map +1 -1
- package/dist/components/UIResourceRenderer.d.ts +21 -0
- package/dist/components/UIResourceRenderer.d.ts.map +1 -1
- package/dist/components/UIResourceRenderer.js +484 -368
- package/dist/components/UIResourceRenderer.js.map +1 -1
- package/dist/components/VerifiedText.cjs +39 -20
- package/dist/components/VerifiedText.cjs.map +1 -1
- package/dist/components/VerifiedText.d.ts +2 -1
- package/dist/components/VerifiedText.d.ts.map +1 -1
- package/dist/components/VerifiedText.js +39 -20
- package/dist/components/VerifiedText.js.map +1 -1
- package/dist/components/VideoRenderer.cjs +51 -20
- package/dist/components/VideoRenderer.cjs.map +1 -1
- package/dist/components/VideoRenderer.d.ts.map +1 -1
- package/dist/components/VideoRenderer.js +51 -20
- package/dist/components/VideoRenderer.js.map +1 -1
- package/dist/components/chart-data-table.cjs +38 -17
- package/dist/components/chart-data-table.cjs.map +1 -1
- package/dist/components/chart-data-table.d.ts +30 -1
- package/dist/components/chart-data-table.d.ts.map +1 -1
- package/dist/components/chart-data-table.js +38 -17
- package/dist/components/chart-data-table.js.map +1 -1
- package/dist/context/MCPActionContext.cjs +3 -1
- package/dist/context/MCPActionContext.cjs.map +1 -1
- package/dist/context/MCPActionContext.d.ts.map +1 -1
- package/dist/context/MCPActionContext.js +3 -1
- package/dist/context/MCPActionContext.js.map +1 -1
- package/dist/context/MCPUIConfigContext.cjs +29 -0
- package/dist/context/MCPUIConfigContext.cjs.map +1 -0
- package/dist/context/MCPUIConfigContext.d.ts +124 -0
- package/dist/context/MCPUIConfigContext.d.ts.map +1 -0
- package/dist/context/MCPUIConfigContext.js +29 -0
- package/dist/context/MCPUIConfigContext.js.map +1 -0
- package/dist/context/MCPUIStringsContext.cjs +287 -2
- package/dist/context/MCPUIStringsContext.cjs.map +1 -1
- package/dist/context/MCPUIStringsContext.d.ts +607 -3
- package/dist/context/MCPUIStringsContext.d.ts.map +1 -1
- package/dist/context/MCPUIStringsContext.js +287 -2
- package/dist/context/MCPUIStringsContext.js.map +1 -1
- package/dist/hooks/index.d.ts +2 -2
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/useStreamingUI.cjs +28 -10
- package/dist/hooks/useStreamingUI.cjs.map +1 -1
- package/dist/hooks/useStreamingUI.d.ts +37 -0
- package/dist/hooks/useStreamingUI.d.ts.map +1 -1
- package/dist/hooks/useStreamingUI.js +28 -10
- package/dist/hooks/useStreamingUI.js.map +1 -1
- package/dist/hooks.cjs +1 -0
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.js +2 -1
- package/dist/index.cjs +29 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +12 -4
- package/dist/index.d.ts +12 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -3
- package/dist/index.js.map +1 -1
- package/dist/services/index.d.ts +1 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/validation.cjs +52 -26
- package/dist/services/validation.cjs.map +1 -1
- package/dist/services/validation.d.ts +67 -2
- package/dist/services/validation.d.ts.map +1 -1
- package/dist/services/validation.js +52 -26
- package/dist/services/validation.js.map +1 -1
- package/dist/utils/degraded-projections.cjs +37 -12
- package/dist/utils/degraded-projections.cjs.map +1 -1
- package/dist/utils/degraded-projections.d.ts +39 -3
- package/dist/utils/degraded-projections.d.ts.map +1 -1
- package/dist/utils/degraded-projections.js +37 -12
- package/dist/utils/degraded-projections.js.map +1 -1
- package/dist/utils/format-string.cjs +10 -0
- package/dist/utils/format-string.cjs.map +1 -0
- package/dist/utils/format-string.d.ts +26 -0
- package/dist/utils/format-string.d.ts.map +1 -0
- package/dist/utils/format-string.js +10 -0
- package/dist/utils/format-string.js.map +1 -0
- package/dist/utils/iframe-coep.cjs +30 -0
- package/dist/utils/iframe-coep.cjs.map +1 -0
- package/dist/utils/iframe-coep.d.ts +46 -0
- package/dist/utils/iframe-coep.d.ts.map +1 -0
- package/dist/utils/iframe-coep.js +30 -0
- package/dist/utils/iframe-coep.js.map +1 -0
- package/dist/validation.cjs +5 -0
- package/dist/validation.cjs.map +1 -1
- package/dist/validation.d.cts +2 -1
- package/dist/validation.d.ts +2 -1
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +6 -1
- package/package.json +1 -1
- package/src/adapters/connector.ts +58 -4
- package/src/adapters/index.ts +12 -2
- package/src/adapters/macro-run.ts +71 -11
- package/src/components/ActionGroupRenderer.tsx +3 -1
- package/src/components/AgentCard.tsx +27 -9
- package/src/components/AgentHandoff.tsx +4 -1
- package/src/components/ArtifactRenderer.tsx +17 -5
- package/src/components/AutocompleteDropdown.tsx +8 -6
- package/src/components/AutocompleteFormField.tsx +5 -1
- package/src/components/BriefingDiff.tsx +11 -3
- package/src/components/CarouselRenderer.tsx +4 -2
- package/src/components/ChartJSRenderer.tsx +18 -9
- package/src/components/ChatPrompt.tsx +13 -8
- package/src/components/CodeBlockRenderer.tsx +12 -10
- package/src/components/DataPreviewSection.tsx +92 -26
- package/src/components/DegradedFallback.tsx +4 -2
- package/src/components/FooterRenderer.tsx +3 -1
- package/src/components/FormFieldRenderer.tsx +34 -19
- package/src/components/FormRenderer.tsx +38 -10
- package/src/components/GenerativeUIErrorBoundary.tsx +8 -3
- package/src/components/GraphRenderer.tsx +31 -16
- package/src/components/IframeFallbackLink.tsx +57 -0
- package/src/components/ImageGalleryRenderer.tsx +8 -4
- package/src/components/LightboxOverlay.tsx +6 -4
- package/src/components/MapRenderer.tsx +57 -20
- package/src/components/ModalRenderer.tsx +3 -1
- package/src/components/ScratchpadPanel.tsx +95 -44
- package/src/components/StreamingUIRenderer.tsx +41 -11
- package/src/components/UIResourceRenderer.tsx +176 -67
- package/src/components/VerifiedText.tsx +19 -9
- package/src/components/VideoRenderer.tsx +26 -4
- package/src/components/chart-data-table.ts +68 -14
- package/src/context/MCPActionContext.tsx +4 -1
- package/src/context/MCPUIConfigContext.tsx +151 -0
- package/src/context/MCPUIStringsContext.tsx +1014 -1
- package/src/hooks/index.ts +2 -1
- package/src/hooks/useStreamingUI.ts +64 -10
- package/src/index.ts +38 -0
- package/src/services/index.ts +1 -0
- package/src/services/validation.ts +131 -32
- package/src/solid-jsx-attrs.d.ts +24 -0
- package/src/utils/degraded-projections.ts +75 -12
- package/src/utils/format-string.ts +33 -0
- package/src/utils/iframe-coep.ts +74 -0
- package/src/validation.ts +9 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getNextElement, getNextMarker, insert, createComponent, memo, effect, className, setAttribute, template } from "solid-js/web";
|
|
2
2
|
import { Show, For } from "solid-js";
|
|
3
|
+
import { useMCPUIStrings } from "../context/MCPUIStringsContext.js";
|
|
3
4
|
var _tmpl$ = /* @__PURE__ */ template(`<span class="text-xs text-gray-400 dark:text-gray-500">`), _tmpl$2 = /* @__PURE__ */ template(`<div class="flex flex-wrap gap-1 mt-1.5">`), _tmpl$3 = /* @__PURE__ */ template(`<div class="mt-1.5 flex items-center gap-1.5 text-xs text-blue-600 dark:text-blue-400"><div class="w-3 h-3 border-2 border-blue-500 border-t-transparent rounded-full animate-spin"></div><!$><!/>`), _tmpl$4 = /* @__PURE__ */ template(`<div class="flex items-start gap-3 p-3 rounded-lg bg-gradient-to-r from-gray-50 to-transparent dark:from-gray-800/50"><div class="flex-shrink-0 w-10 h-10 rounded-full bg-gray-100 dark:bg-gray-700 flex items-center justify-center text-xl"></div><div class="flex-1 min-w-0"><div class="flex items-center gap-2"><span class="font-medium text-sm text-gray-900 dark:text-white truncate"></span><span></span><span class="text-xs text-gray-500 dark:text-gray-400"></span></div><!$><!/><!$><!/><!$><!/>`), _tmpl$5 = /* @__PURE__ */ template(`<span class="px-1.5 py-0.5 text-[10px] rounded bg-blue-50 dark:bg-blue-900/20 text-blue-700 dark:text-blue-300">`), _tmpl$6 = /* @__PURE__ */ template(`<span class="inline-flex items-center gap-1.5 text-xs"><span></span><span class="text-gray-600 dark:text-gray-300"></span><span class="text-gray-400 dark:text-gray-500">`);
|
|
4
5
|
const AVATAR_MAP = {
|
|
5
6
|
scales: "⚖️",
|
|
@@ -13,32 +14,33 @@ const AVATAR_MAP = {
|
|
|
13
14
|
};
|
|
14
15
|
const STATUS_CONFIG = {
|
|
15
16
|
idle: {
|
|
16
|
-
|
|
17
|
+
labelKey: "agentStatusIdle",
|
|
17
18
|
color: "bg-gray-400",
|
|
18
19
|
pulse: false
|
|
19
20
|
},
|
|
20
21
|
running: {
|
|
21
|
-
|
|
22
|
+
labelKey: "agentStatusRunning",
|
|
22
23
|
color: "bg-blue-500",
|
|
23
24
|
pulse: true
|
|
24
25
|
},
|
|
25
26
|
waiting: {
|
|
26
|
-
|
|
27
|
+
labelKey: "agentStatusWaiting",
|
|
27
28
|
color: "bg-amber-500",
|
|
28
29
|
pulse: true
|
|
29
30
|
},
|
|
30
31
|
done: {
|
|
31
|
-
|
|
32
|
+
labelKey: "agentStatusDone",
|
|
32
33
|
color: "bg-green-500",
|
|
33
34
|
pulse: false
|
|
34
35
|
},
|
|
35
36
|
error: {
|
|
36
|
-
|
|
37
|
+
labelKey: "agentStatusError",
|
|
37
38
|
color: "bg-red-500",
|
|
38
39
|
pulse: false
|
|
39
40
|
}
|
|
40
41
|
};
|
|
41
42
|
function AgentCard(props) {
|
|
43
|
+
const strings = useMCPUIStrings();
|
|
42
44
|
const c = () => props.content;
|
|
43
45
|
const status = () => STATUS_CONFIG[c().status] || STATUS_CONFIG.idle;
|
|
44
46
|
const avatar = () => AVATAR_MAP[c().avatar || ""] || c().avatar || "🤖";
|
|
@@ -53,7 +55,7 @@ function AgentCard(props) {
|
|
|
53
55
|
var _el$ = getNextElement(_tmpl$4), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$4 = _el$3.firstChild, _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling, _el$7 = _el$6.nextSibling, _el$12 = _el$4.nextSibling, [_el$13, _co$2] = getNextMarker(_el$12.nextSibling), _el$14 = _el$13.nextSibling, [_el$15, _co$3] = getNextMarker(_el$14.nextSibling), _el$16 = _el$15.nextSibling, [_el$17, _co$4] = getNextMarker(_el$16.nextSibling);
|
|
54
56
|
insert(_el$2, avatar);
|
|
55
57
|
insert(_el$5, () => c().name);
|
|
56
|
-
insert(_el$7, () => status().
|
|
58
|
+
insert(_el$7, () => strings[status().labelKey]);
|
|
57
59
|
insert(_el$3, createComponent(Show, {
|
|
58
60
|
get when() {
|
|
59
61
|
return c().model;
|
|
@@ -94,7 +96,7 @@ function AgentCard(props) {
|
|
|
94
96
|
}
|
|
95
97
|
}), _el$17, _co$4);
|
|
96
98
|
effect((_p$) => {
|
|
97
|
-
var _v$ = `inline-block w-2 h-2 rounded-full ${status().color} ${status().pulse ? "animate-pulse" : ""}`, _v$2 = status().
|
|
99
|
+
var _v$ = `inline-block w-2 h-2 rounded-full ${status().color} ${status().pulse ? "animate-pulse" : ""}`, _v$2 = strings[status().labelKey];
|
|
98
100
|
_v$ !== _p$.e && className(_el$6, _p$.e = _v$);
|
|
99
101
|
_v$2 !== _p$.t && setAttribute(_el$6, "title", _p$.t = _v$2);
|
|
100
102
|
return _p$;
|
|
@@ -106,11 +108,12 @@ function AgentCard(props) {
|
|
|
106
108
|
})();
|
|
107
109
|
}
|
|
108
110
|
function AgentStatusBadge(props) {
|
|
111
|
+
const strings = useMCPUIStrings();
|
|
109
112
|
const status = () => STATUS_CONFIG[props.status] || STATUS_CONFIG.idle;
|
|
110
113
|
return (() => {
|
|
111
114
|
var _el$19 = getNextElement(_tmpl$6), _el$20 = _el$19.firstChild, _el$21 = _el$20.nextSibling, _el$22 = _el$21.nextSibling;
|
|
112
115
|
insert(_el$21, () => props.agentName);
|
|
113
|
-
insert(_el$22, () => status().
|
|
116
|
+
insert(_el$22, () => strings[status().labelKey]);
|
|
114
117
|
effect(() => className(_el$20, `w-2 h-2 rounded-full ${status().color} ${status().pulse ? "animate-pulse" : ""}`));
|
|
115
118
|
return _el$19;
|
|
116
119
|
})();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentCard.js","sources":["../../src/components/AgentCard.tsx"],"sourcesContent":["/**\n * AgentCard — Agent identity + status display\n * v4.1.0: AITL sprint — shows avatar, name, status, capabilities, current step\n *\n * @experimental\n */\n\nimport { Show, For } from 'solid-js'\nimport type { AgentCardContent } from '../types/chat-bus'\n\nexport interface AgentCardProps {\n content: AgentCardContent\n}\n\nconst AVATAR_MAP: Record<string, string> = {\n scales: '\\u2696\\uFE0F',\n chart: '\\uD83D\\uDCC8',\n search: '\\uD83D\\uDD0D',\n document: '\\uD83D\\uDCC4',\n brain: '\\uD83E\\uDDE0',\n shield: '\\uD83D\\uDEE1\\uFE0F',\n globe: '\\uD83C\\uDF10',\n robot: '\\uD83E\\uDD16',\n}\n\nconst STATUS_CONFIG: Record
|
|
1
|
+
{"version":3,"file":"AgentCard.js","sources":["../../src/components/AgentCard.tsx"],"sourcesContent":["/**\n * AgentCard — Agent identity + status display\n * v4.1.0: AITL sprint — shows avatar, name, status, capabilities, current step\n *\n * @experimental\n */\n\nimport { Show, For } from 'solid-js'\nimport type { AgentCardContent } from '../types/chat-bus'\nimport { useMCPUIStrings } from '../context/MCPUIStringsContext'\n\nexport interface AgentCardProps {\n content: AgentCardContent\n}\n\nconst AVATAR_MAP: Record<string, string> = {\n scales: '\\u2696\\uFE0F',\n chart: '\\uD83D\\uDCC8',\n search: '\\uD83D\\uDD0D',\n document: '\\uD83D\\uDCC4',\n brain: '\\uD83E\\uDDE0',\n shield: '\\uD83D\\uDEE1\\uFE0F',\n globe: '\\uD83C\\uDF10',\n robot: '\\uD83E\\uDD16',\n}\n\n/**\n * Status styling. The record stays module-level, but it carries a\n * `labelKey` rather than English: the label is resolved from\n * `useMCPUIStrings()` at render time so a host provider can localize it.\n */\ntype AgentStatusLabelKey =\n | 'agentStatusIdle'\n | 'agentStatusRunning'\n | 'agentStatusWaiting'\n | 'agentStatusDone'\n | 'agentStatusError'\n\nconst STATUS_CONFIG: Record<\n string,\n { labelKey: AgentStatusLabelKey; color: string; pulse: boolean }\n> = {\n idle: { labelKey: 'agentStatusIdle', color: 'bg-gray-400', pulse: false },\n running: { labelKey: 'agentStatusRunning', color: 'bg-blue-500', pulse: true },\n waiting: { labelKey: 'agentStatusWaiting', color: 'bg-amber-500', pulse: true },\n done: { labelKey: 'agentStatusDone', color: 'bg-green-500', pulse: false },\n error: { labelKey: 'agentStatusError', color: 'bg-red-500', pulse: false },\n}\n\nexport function AgentCard(props: AgentCardProps) {\n const strings = useMCPUIStrings()\n const c = () => props.content\n const status = () => STATUS_CONFIG[c().status] || STATUS_CONFIG.idle\n const avatar = () => AVATAR_MAP[c().avatar || ''] || c().avatar || '\\uD83E\\uDD16'\n\n if (typeof console !== 'undefined') {\n console.info('[MCP-UI:AgentCard] mounted', {\n agentId: c().agentId, status: c().status, capabilities: c().capabilities,\n })\n }\n\n return (\n <div class=\"flex items-start gap-3 p-3 rounded-lg bg-gradient-to-r from-gray-50 to-transparent dark:from-gray-800/50\">\n {/* Avatar */}\n <div class=\"flex-shrink-0 w-10 h-10 rounded-full bg-gray-100 dark:bg-gray-700 flex items-center justify-center text-xl\">\n {avatar()}\n </div>\n\n {/* Info */}\n <div class=\"flex-1 min-w-0\">\n <div class=\"flex items-center gap-2\">\n <span class=\"font-medium text-sm text-gray-900 dark:text-white truncate\">{c().name}</span>\n {/* Status dot */}\n <span class={`inline-block w-2 h-2 rounded-full ${status().color} ${status().pulse ? 'animate-pulse' : ''}`} title={strings[status().labelKey]} />\n <span class=\"text-xs text-gray-500 dark:text-gray-400\">{strings[status().labelKey]}</span>\n </div>\n\n {/* Model */}\n <Show when={c().model}>\n <span class=\"text-xs text-gray-400 dark:text-gray-500\">{c().model}</span>\n </Show>\n\n {/* Capabilities */}\n <Show when={c().capabilities && c().capabilities!.length > 0}>\n <div class=\"flex flex-wrap gap-1 mt-1.5\">\n <For each={c().capabilities}>\n {(cap) => (\n <span class=\"px-1.5 py-0.5 text-[10px] rounded bg-blue-50 dark:bg-blue-900/20 text-blue-700 dark:text-blue-300\">\n {cap}\n </span>\n )}\n </For>\n </div>\n </Show>\n\n {/* Current step */}\n <Show when={c().currentStep && c().status === 'running'}>\n <div class=\"mt-1.5 flex items-center gap-1.5 text-xs text-blue-600 dark:text-blue-400\">\n <div class=\"w-3 h-3 border-2 border-blue-500 border-t-transparent rounded-full animate-spin\" />\n {c().currentStep!.label}\n </div>\n </Show>\n </div>\n </div>\n )\n}\n\n/**\n * AgentStatusBadge — compact pulse badge for scratchpad header\n */\nexport interface AgentStatusBadgeProps {\n agentName: string\n status: 'idle' | 'running' | 'waiting' | 'done' | 'error'\n}\n\nexport function AgentStatusBadge(props: AgentStatusBadgeProps) {\n const strings = useMCPUIStrings()\n const status = () => STATUS_CONFIG[props.status] || STATUS_CONFIG.idle\n\n return (\n <span class=\"inline-flex items-center gap-1.5 text-xs\">\n <span class={`w-2 h-2 rounded-full ${status().color} ${status().pulse ? 'animate-pulse' : ''}`} />\n <span class=\"text-gray-600 dark:text-gray-300\">{props.agentName}</span>\n <span class=\"text-gray-400 dark:text-gray-500\">{strings[status().labelKey]}</span>\n </span>\n )\n}\n"],"names":["AVATAR_MAP","scales","chart","search","document","brain","shield","globe","robot","STATUS_CONFIG","idle","labelKey","color","pulse","running","waiting","done","error","AgentCard","props","strings","useMCPUIStrings","c","content","status","avatar","console","info","agentId","capabilities","_el$","_$getNextElement","_tmpl$4","_el$2","firstChild","_el$3","nextSibling","_el$4","_el$5","_el$6","_el$7","_el$12","_el$13","_co$2","_$getNextMarker","_el$14","_el$15","_co$3","_el$16","_el$17","_co$4","_$insert","name","_$createComponent","Show","when","model","children","_el$8","_tmpl$","_$memo","length","_el$9","_tmpl$2","For","each","cap","_el$18","_tmpl$5","currentStep","_el$0","_tmpl$3","_el$1","_el$10","_el$11","_co$","label","_$effect","_p$","_v$","_v$2","e","_$className","t","_$setAttribute","undefined","AgentStatusBadge","_el$19","_tmpl$6","_el$20","_el$21","_el$22","agentName"],"mappings":";;;;AAeA,MAAMA,aAAqC;AAAA,EACzCC,QAAQ;AAAA,EACRC,OAAO;AAAA,EACPC,QAAQ;AAAA,EACRC,UAAU;AAAA,EACVC,OAAO;AAAA,EACPC,QAAQ;AAAA,EACRC,OAAO;AAAA,EACPC,OAAO;AACT;AAcA,MAAMC,gBAGF;AAAA,EACFC,MAAM;AAAA,IAAEC,UAAU;AAAA,IAAmBC,OAAO;AAAA,IAAeC,OAAO;AAAA,EAAA;AAAA,EAClEC,SAAS;AAAA,IAAEH,UAAU;AAAA,IAAsBC,OAAO;AAAA,IAAeC,OAAO;AAAA,EAAA;AAAA,EACxEE,SAAS;AAAA,IAAEJ,UAAU;AAAA,IAAsBC,OAAO;AAAA,IAAgBC,OAAO;AAAA,EAAA;AAAA,EACzEG,MAAM;AAAA,IAAEL,UAAU;AAAA,IAAmBC,OAAO;AAAA,IAAgBC,OAAO;AAAA,EAAA;AAAA,EACnEI,OAAO;AAAA,IAAEN,UAAU;AAAA,IAAoBC,OAAO;AAAA,IAAcC,OAAO;AAAA,EAAA;AACrE;AAEO,SAASK,UAAUC,OAAuB;AAC/C,QAAMC,UAAUC,gBAAAA;AAChB,QAAMC,IAAIA,MAAMH,MAAMI;AACtB,QAAMC,SAASA,MAAMf,cAAca,IAAIE,MAAM,KAAKf,cAAcC;AAChE,QAAMe,SAASA,MAAMzB,WAAWsB,EAAAA,EAAIG,UAAU,EAAE,KAAKH,IAAIG,UAAU;AAEnE,MAAI,OAAOC,YAAY,aAAa;AAClCA,YAAQC,KAAK,8BAA8B;AAAA,MACzCC,SAASN,IAAIM;AAAAA,MAASJ,QAAQF,IAAIE;AAAAA,MAAQK,cAAcP,IAAIO;AAAAA,IAAAA,CAC7D;AAAA,EACH;AAEA,UAAA,MAAA;AAAA,QAAAC,OAAAC,eAAAC,OAAA,GAAAC,QAAAH,KAAAI,YAAAC,QAAAF,MAAAG,aAAAC,QAAAF,MAAAD,YAAAI,QAAAD,MAAAH,YAAAK,QAAAD,MAAAF,aAAAI,QAAAD,MAAAH,aAAAK,SAAAJ,MAAAD,aAAA,CAAAM,QAAAC,KAAA,IAAAC,cAAAH,OAAAL,WAAA,GAAAS,SAAAH,OAAAN,aAAA,CAAAU,QAAAC,KAAA,IAAAH,cAAAC,OAAAT,WAAA,GAAAY,SAAAF,OAAAV,aAAA,CAAAa,QAAAC,KAAA,IAAAN,cAAAI,OAAAZ,WAAA;AAAAe,WAAAlB,OAIOR,MAAM;AAAA0B,WAAAb,OAAA,MAMqEhB,EAAAA,EAAI8B,IAAI;AAAAD,WAAAX,OAAA,MAG1BpB,QAAQI,OAAAA,EAASb,QAAQ,CAAC;AAAAwC,WAAAhB,OAAAkB,gBAInFC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEjC,IAAIkC;AAAAA,MAAK;AAAA,MAAA,IAAAC,WAAA;AAAA,YAAAC,QAAA3B,eAAA4B,MAAA;AAAAR,eAAAO,OAAA,MACqCpC,EAAAA,EAAIkC,KAAK;AAAA,eAAAE;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAAhB,QAAAC,KAAA;AAAAQ,WAAAhB,OAAAkB,gBAIlEC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEK,KAAA,MAAA,CAAA,CAAAtC,IAAIO,YAAY,EAAA,KAAIP,EAAAA,EAAIO,aAAcgC,SAAS;AAAA,MAAC;AAAA,MAAA,IAAAJ,WAAA;AAAA,YAAAK,QAAA/B,eAAAgC,OAAA;AAAAZ,eAAAW,OAAAT,gBAEvDW,KAAG;AAAA,UAAA,IAACC,OAAI;AAAA,mBAAE3C,IAAIO;AAAAA,UAAY;AAAA,UAAA4B,UACvBS,UAAG,MAAA;AAAA,gBAAAC,SAAApC,eAAAqC,OAAA;AAAAjB,mBAAAgB,QAEAD,GAAG;AAAA,mBAAAC;AAAAA,UAAA,GAAA;AAAA,QAAA,CAEP,CAAA;AAAA,eAAAL;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAAhB,QAAAC,KAAA;AAAAI,WAAAhB,OAAAkB,gBAMNC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEK,KAAA,MAAA,CAAA,CAAAtC,EAAAA,EAAI+C,WAAW,OAAI/C,IAAIE,WAAW;AAAA,MAAS;AAAA,MAAA,IAAAiC,WAAA;AAAA,YAAAa,QAAAvC,eAAAwC,OAAA,GAAAC,QAAAF,MAAApC,YAAAuC,SAAAD,MAAApC,aAAA,CAAAsC,QAAAC,IAAA,IAAA/B,cAAA6B,OAAArC,WAAA;AAAAe,eAAAmB,OAAA,MAGlDhD,EAAAA,EAAI+C,YAAaO,OAAKF,QAAAC,IAAA;AAAA,eAAAL;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAArB,QAAAC,KAAA;AAAA2B,WAAAC,CAAAA,QAAA;AAAA,UAAAC,MA1BZ,qCAAqCvD,OAAAA,EAASZ,KAAK,IAAIY,OAAAA,EAASX,QAAQ,kBAAkB,EAAE,IAAEmE,OAAS5D,QAAQI,OAAAA,EAASb,QAAQ;AAACoE,cAAAD,IAAAG,KAAAC,UAAA3C,OAAAuC,IAAAG,IAAAF,GAAA;AAAAC,eAAAF,IAAAK,KAAAC,aAAA7C,OAAA,SAAAuC,IAAAK,IAAAH,IAAA;AAAA,aAAAF;AAAAA,IAAA,GAAA;AAAA,MAAAG,GAAAI;AAAAA,MAAAF,GAAAE;AAAAA,IAAAA,CAAA;AAAA,WAAAvD;AAAAA,EAAA,GAAA;AAgCxJ;AAUO,SAASwD,iBAAiBnE,OAA8B;AAC7D,QAAMC,UAAUC,gBAAAA;AAChB,QAAMG,SAASA,MAAMf,cAAcU,MAAMK,MAAM,KAAKf,cAAcC;AAElE,UAAA,MAAA;AAAA,QAAA6E,SAAAxD,eAAAyD,OAAA,GAAAC,SAAAF,OAAArD,YAAAwD,SAAAD,OAAArD,aAAAuD,SAAAD,OAAAtD;AAAAe,WAAAuC,QAAA,MAGoDvE,MAAMyE,SAAS;AAAAzC,WAAAwC,QAAA,MACfvE,QAAQI,OAAAA,EAASb,QAAQ,CAAC;AAAAkE,WAAA,MAAAK,UAAAO,QAF7D,wBAAwBjE,SAASZ,KAAK,IAAIY,OAAAA,EAASX,QAAQ,kBAAkB,EAAE,EAAE,CAAA;AAAA,WAAA0E;AAAAA,EAAA,GAAA;AAKpG;"}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const web = require("solid-js/web");
|
|
4
4
|
const solidJs = require("solid-js");
|
|
5
|
+
const MCPUIStringsContext = require("../context/MCPUIStringsContext.cjs");
|
|
6
|
+
const formatString = require("../utils/format-string.cjs");
|
|
5
7
|
var _tmpl$ = /* @__PURE__ */ web.template(`<span class="text-[10px] text-gray-500 dark:text-gray-400 text-center">`), _tmpl$2 = /* @__PURE__ */ web.template(`<div class="flex items-center gap-3 p-3 rounded-lg bg-gradient-to-r from-blue-50 via-transparent to-purple-50 dark:from-blue-900/10 dark:via-transparent dark:to-purple-900/10 border border-gray-200 dark:border-gray-700"><div class="flex items-center gap-1.5 flex-shrink-0"><span class=text-lg></span><span class="text-sm font-medium text-gray-700 dark:text-gray-300"></span></div><div class="flex-1 flex flex-col items-center gap-0.5"><div class="flex items-center gap-1 text-gray-400 dark:text-gray-500"><div class="h-px flex-1 bg-gray-300 dark:bg-gray-600 min-w-[20px]"></div><span class=text-xs>→</span><div class="h-px flex-1 bg-gray-300 dark:bg-gray-600 min-w-[20px]"></div></div><!$><!/></div><div class="flex items-center gap-1.5 flex-shrink-0"><span class=text-lg></span><span class="text-sm font-medium text-gray-700 dark:text-gray-300">`);
|
|
6
8
|
const AVATAR_MAP = {
|
|
7
9
|
scales: "⚖️",
|
|
@@ -18,6 +20,7 @@ function getAvatar(key) {
|
|
|
18
20
|
return AVATAR_MAP[key] || key;
|
|
19
21
|
}
|
|
20
22
|
function AgentHandoff(props) {
|
|
23
|
+
const strings = MCPUIStringsContext.useMCPUIStrings();
|
|
21
24
|
const c = () => props.content;
|
|
22
25
|
if (typeof console !== "undefined") {
|
|
23
26
|
console.info("[MCP-UI:Handoff] agent transfer", {
|
|
@@ -36,7 +39,9 @@ function AgentHandoff(props) {
|
|
|
36
39
|
},
|
|
37
40
|
get children() {
|
|
38
41
|
var _el$7 = web.getNextElement(_tmpl$);
|
|
39
|
-
web.insert(_el$7, () => c().summary ||
|
|
42
|
+
web.insert(_el$7, () => c().summary || formatString.formatMCPUIString(strings.handoffItems, {
|
|
43
|
+
count: c().itemCount ?? 0
|
|
44
|
+
}));
|
|
40
45
|
return _el$7;
|
|
41
46
|
}
|
|
42
47
|
}), _el$9, _co$);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentHandoff.cjs","sources":["../../src/components/AgentHandoff.tsx"],"sourcesContent":["/**\n * AgentHandoff — visualizes agent-to-agent transfer\n * v4.1.0: AITL sprint — \"Extracteur -> Analyste : 47 entites transmises\"\n *\n * @experimental\n */\n\nimport { Show } from 'solid-js'\nimport type { AgentHandoffContent } from '../types/chat-bus'\n\nexport interface AgentHandoffProps {\n content: AgentHandoffContent\n}\n\nconst AVATAR_MAP: Record<string, string> = {\n scales: '\\u2696\\uFE0F', chart: '\\uD83D\\uDCC8', search: '\\uD83D\\uDD0D',\n document: '\\uD83D\\uDCC4', brain: '\\uD83E\\uDDE0', shield: '\\uD83D\\uDEE1\\uFE0F',\n globe: '\\uD83C\\uDF10', robot: '\\uD83E\\uDD16',\n}\n\nfunction getAvatar(key?: string): string {\n if (!key) return '\\uD83E\\uDD16'\n return AVATAR_MAP[key] || key\n}\n\nexport function AgentHandoff(props: AgentHandoffProps) {\n const c = () => props.content\n\n if (typeof console !== 'undefined') {\n console.info('[MCP-UI:Handoff] agent transfer', {\n from: c().from.id, to: c().to.id, dataKeys: c().dataKeys,\n })\n }\n\n return (\n <div class=\"flex items-center gap-3 p-3 rounded-lg bg-gradient-to-r from-blue-50 via-transparent to-purple-50 dark:from-blue-900/10 dark:via-transparent dark:to-purple-900/10 border border-gray-200 dark:border-gray-700\">\n {/* From agent */}\n <div class=\"flex items-center gap-1.5 flex-shrink-0\">\n <span class=\"text-lg\">{getAvatar(c().from.avatar)}</span>\n <span class=\"text-sm font-medium text-gray-700 dark:text-gray-300\">{c().from.name}</span>\n </div>\n\n {/* Arrow + data */}\n <div class=\"flex-1 flex flex-col items-center gap-0.5\">\n <div class=\"flex items-center gap-1 text-gray-400 dark:text-gray-500\">\n <div class=\"h-px flex-1 bg-gray-300 dark:bg-gray-600 min-w-[20px]\" />\n <span class=\"text-xs\">→</span>\n <div class=\"h-px flex-1 bg-gray-300 dark:bg-gray-600 min-w-[20px]\" />\n </div>\n <Show when={c().summary || c().itemCount}>\n <span class=\"text-[10px] text-gray-500 dark:text-gray-400 text-center\">\n {c().summary
|
|
1
|
+
{"version":3,"file":"AgentHandoff.cjs","sources":["../../src/components/AgentHandoff.tsx"],"sourcesContent":["/**\n * AgentHandoff — visualizes agent-to-agent transfer\n * v4.1.0: AITL sprint — \"Extracteur -> Analyste : 47 entites transmises\"\n *\n * @experimental\n */\n\nimport { Show } from 'solid-js'\nimport type { AgentHandoffContent } from '../types/chat-bus'\nimport { formatMCPUIString, useMCPUIStrings } from '../context/MCPUIStringsContext'\n\nexport interface AgentHandoffProps {\n content: AgentHandoffContent\n}\n\nconst AVATAR_MAP: Record<string, string> = {\n scales: '\\u2696\\uFE0F', chart: '\\uD83D\\uDCC8', search: '\\uD83D\\uDD0D',\n document: '\\uD83D\\uDCC4', brain: '\\uD83E\\uDDE0', shield: '\\uD83D\\uDEE1\\uFE0F',\n globe: '\\uD83C\\uDF10', robot: '\\uD83E\\uDD16',\n}\n\nfunction getAvatar(key?: string): string {\n if (!key) return '\\uD83E\\uDD16'\n return AVATAR_MAP[key] || key\n}\n\nexport function AgentHandoff(props: AgentHandoffProps) {\n const strings = useMCPUIStrings()\n const c = () => props.content\n\n if (typeof console !== 'undefined') {\n console.info('[MCP-UI:Handoff] agent transfer', {\n from: c().from.id, to: c().to.id, dataKeys: c().dataKeys,\n })\n }\n\n return (\n <div class=\"flex items-center gap-3 p-3 rounded-lg bg-gradient-to-r from-blue-50 via-transparent to-purple-50 dark:from-blue-900/10 dark:via-transparent dark:to-purple-900/10 border border-gray-200 dark:border-gray-700\">\n {/* From agent */}\n <div class=\"flex items-center gap-1.5 flex-shrink-0\">\n <span class=\"text-lg\">{getAvatar(c().from.avatar)}</span>\n <span class=\"text-sm font-medium text-gray-700 dark:text-gray-300\">{c().from.name}</span>\n </div>\n\n {/* Arrow + data */}\n <div class=\"flex-1 flex flex-col items-center gap-0.5\">\n <div class=\"flex items-center gap-1 text-gray-400 dark:text-gray-500\">\n <div class=\"h-px flex-1 bg-gray-300 dark:bg-gray-600 min-w-[20px]\" />\n <span class=\"text-xs\">→</span>\n <div class=\"h-px flex-1 bg-gray-300 dark:bg-gray-600 min-w-[20px]\" />\n </div>\n <Show when={c().summary || c().itemCount}>\n <span class=\"text-[10px] text-gray-500 dark:text-gray-400 text-center\">\n {c().summary ||\n formatMCPUIString(strings.handoffItems, { count: c().itemCount ?? 0 })}\n </span>\n </Show>\n </div>\n\n {/* To agent */}\n <div class=\"flex items-center gap-1.5 flex-shrink-0\">\n <span class=\"text-lg\">{getAvatar(c().to.avatar)}</span>\n <span class=\"text-sm font-medium text-gray-700 dark:text-gray-300\">{c().to.name}</span>\n </div>\n </div>\n )\n}\n"],"names":["AVATAR_MAP","scales","chart","search","document","brain","shield","globe","robot","getAvatar","key","AgentHandoff","props","strings","useMCPUIStrings","c","content","console","info","from","id","to","dataKeys","_el$","_$getNextElement","_tmpl$2","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_el$6","_el$8","_el$9","_co$","_$getNextMarker","_el$0","_el$1","_el$10","_$insert","avatar","name","_$createComponent","Show","when","summary","itemCount","children","_el$7","_tmpl$","formatMCPUIString","handoffItems","count"],"mappings":";;;;;;;AAeA,MAAMA,aAAqC;AAAA,EACzCC,QAAQ;AAAA,EAAgBC,OAAO;AAAA,EAAgBC,QAAQ;AAAA,EACvDC,UAAU;AAAA,EAAgBC,OAAO;AAAA,EAAgBC,QAAQ;AAAA,EACzDC,OAAO;AAAA,EAAgBC,OAAO;AAChC;AAEA,SAASC,UAAUC,KAAsB;AACvC,MAAI,CAACA,IAAK,QAAO;AACjB,SAAOV,WAAWU,GAAG,KAAKA;AAC5B;AAEO,SAASC,aAAaC,OAA0B;AACrD,QAAMC,UAAUC,oBAAAA,gBAAAA;AAChB,QAAMC,IAAIA,MAAMH,MAAMI;AAEtB,MAAI,OAAOC,YAAY,aAAa;AAClCA,YAAQC,KAAK,mCAAmC;AAAA,MAC9CC,MAAMJ,IAAII,KAAKC;AAAAA,MAAIC,IAAIN,IAAIM,GAAGD;AAAAA,MAAIE,UAAUP,IAAIO;AAAAA,IAAAA,CACjD;AAAA,EACH;AAEA,UAAA,MAAA;AAAA,QAAAC,OAAAC,IAAAA,eAAAC,OAAA,GAAAC,QAAAH,KAAAI,YAAAC,QAAAF,MAAAC,YAAAE,QAAAD,MAAAE,aAAAC,QAAAL,MAAAI,aAAAE,QAAAD,MAAAJ,YAAAM,QAAAD,MAAAF,aAAA,CAAAI,OAAAC,IAAA,IAAAC,IAAAA,cAAAH,MAAAH,WAAA,GAAAO,QAAAN,MAAAD,aAAAQ,QAAAD,MAAAV,YAAAY,SAAAD,MAAAR;AAAAU,QAAAA,OAAAZ,OAAA,MAI6BnB,UAAUM,IAAII,KAAKsB,MAAM,CAAC;AAAAD,QAAAA,OAAAX,OAAA,MACmBd,EAAAA,EAAII,KAAKuB,IAAI;AAAAF,eAAAT,OAAAY,IAAAA,gBAUhFC,cAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAE9B,EAAAA,EAAI+B,WAAW/B,EAAAA,EAAIgC;AAAAA,MAAS;AAAA,MAAA,IAAAC,WAAA;AAAA,YAAAC,QAAAzB,IAAAA,eAAA0B,MAAA;AAAAV,YAAAA,OAAAS,OAAA,MAEnClC,EAAAA,EAAI+B,WACHK,aAAAA,kBAAkBtC,QAAQuC,cAAc;AAAA,UAAEC,OAAOtC,EAAAA,EAAIgC,aAAa;AAAA,QAAA,CAAG,CAAC;AAAA,eAAAE;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAAf,OAAAC,IAAA;AAAAK,QAAAA,OAAAF,OAAA,MAOrD7B,UAAUM,IAAIM,GAAGoB,MAAM,CAAC;AAAAD,QAAAA,OAAAD,QAAA,MACqBxB,EAAAA,EAAIM,GAAGqB,IAAI;AAAA,WAAAnB;AAAAA,EAAA,GAAA;AAIvF;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentHandoff.d.ts","sourceRoot":"","sources":["../../src/components/AgentHandoff.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"AgentHandoff.d.ts","sourceRoot":"","sources":["../../src/components/AgentHandoff.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAG5D,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,mBAAmB,CAAA;CAC7B;AAaD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,kCAwCpD"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { getNextElement, getNextMarker, insert, createComponent, template } from "solid-js/web";
|
|
2
2
|
import { Show } from "solid-js";
|
|
3
|
+
import { useMCPUIStrings } from "../context/MCPUIStringsContext.js";
|
|
4
|
+
import { formatMCPUIString } from "../utils/format-string.js";
|
|
3
5
|
var _tmpl$ = /* @__PURE__ */ template(`<span class="text-[10px] text-gray-500 dark:text-gray-400 text-center">`), _tmpl$2 = /* @__PURE__ */ template(`<div class="flex items-center gap-3 p-3 rounded-lg bg-gradient-to-r from-blue-50 via-transparent to-purple-50 dark:from-blue-900/10 dark:via-transparent dark:to-purple-900/10 border border-gray-200 dark:border-gray-700"><div class="flex items-center gap-1.5 flex-shrink-0"><span class=text-lg></span><span class="text-sm font-medium text-gray-700 dark:text-gray-300"></span></div><div class="flex-1 flex flex-col items-center gap-0.5"><div class="flex items-center gap-1 text-gray-400 dark:text-gray-500"><div class="h-px flex-1 bg-gray-300 dark:bg-gray-600 min-w-[20px]"></div><span class=text-xs>→</span><div class="h-px flex-1 bg-gray-300 dark:bg-gray-600 min-w-[20px]"></div></div><!$><!/></div><div class="flex items-center gap-1.5 flex-shrink-0"><span class=text-lg></span><span class="text-sm font-medium text-gray-700 dark:text-gray-300">`);
|
|
4
6
|
const AVATAR_MAP = {
|
|
5
7
|
scales: "⚖️",
|
|
@@ -16,6 +18,7 @@ function getAvatar(key) {
|
|
|
16
18
|
return AVATAR_MAP[key] || key;
|
|
17
19
|
}
|
|
18
20
|
function AgentHandoff(props) {
|
|
21
|
+
const strings = useMCPUIStrings();
|
|
19
22
|
const c = () => props.content;
|
|
20
23
|
if (typeof console !== "undefined") {
|
|
21
24
|
console.info("[MCP-UI:Handoff] agent transfer", {
|
|
@@ -34,7 +37,9 @@ function AgentHandoff(props) {
|
|
|
34
37
|
},
|
|
35
38
|
get children() {
|
|
36
39
|
var _el$7 = getNextElement(_tmpl$);
|
|
37
|
-
insert(_el$7, () => c().summary ||
|
|
40
|
+
insert(_el$7, () => c().summary || formatMCPUIString(strings.handoffItems, {
|
|
41
|
+
count: c().itemCount ?? 0
|
|
42
|
+
}));
|
|
38
43
|
return _el$7;
|
|
39
44
|
}
|
|
40
45
|
}), _el$9, _co$);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentHandoff.js","sources":["../../src/components/AgentHandoff.tsx"],"sourcesContent":["/**\n * AgentHandoff — visualizes agent-to-agent transfer\n * v4.1.0: AITL sprint — \"Extracteur -> Analyste : 47 entites transmises\"\n *\n * @experimental\n */\n\nimport { Show } from 'solid-js'\nimport type { AgentHandoffContent } from '../types/chat-bus'\n\nexport interface AgentHandoffProps {\n content: AgentHandoffContent\n}\n\nconst AVATAR_MAP: Record<string, string> = {\n scales: '\\u2696\\uFE0F', chart: '\\uD83D\\uDCC8', search: '\\uD83D\\uDD0D',\n document: '\\uD83D\\uDCC4', brain: '\\uD83E\\uDDE0', shield: '\\uD83D\\uDEE1\\uFE0F',\n globe: '\\uD83C\\uDF10', robot: '\\uD83E\\uDD16',\n}\n\nfunction getAvatar(key?: string): string {\n if (!key) return '\\uD83E\\uDD16'\n return AVATAR_MAP[key] || key\n}\n\nexport function AgentHandoff(props: AgentHandoffProps) {\n const c = () => props.content\n\n if (typeof console !== 'undefined') {\n console.info('[MCP-UI:Handoff] agent transfer', {\n from: c().from.id, to: c().to.id, dataKeys: c().dataKeys,\n })\n }\n\n return (\n <div class=\"flex items-center gap-3 p-3 rounded-lg bg-gradient-to-r from-blue-50 via-transparent to-purple-50 dark:from-blue-900/10 dark:via-transparent dark:to-purple-900/10 border border-gray-200 dark:border-gray-700\">\n {/* From agent */}\n <div class=\"flex items-center gap-1.5 flex-shrink-0\">\n <span class=\"text-lg\">{getAvatar(c().from.avatar)}</span>\n <span class=\"text-sm font-medium text-gray-700 dark:text-gray-300\">{c().from.name}</span>\n </div>\n\n {/* Arrow + data */}\n <div class=\"flex-1 flex flex-col items-center gap-0.5\">\n <div class=\"flex items-center gap-1 text-gray-400 dark:text-gray-500\">\n <div class=\"h-px flex-1 bg-gray-300 dark:bg-gray-600 min-w-[20px]\" />\n <span class=\"text-xs\">→</span>\n <div class=\"h-px flex-1 bg-gray-300 dark:bg-gray-600 min-w-[20px]\" />\n </div>\n <Show when={c().summary || c().itemCount}>\n <span class=\"text-[10px] text-gray-500 dark:text-gray-400 text-center\">\n {c().summary
|
|
1
|
+
{"version":3,"file":"AgentHandoff.js","sources":["../../src/components/AgentHandoff.tsx"],"sourcesContent":["/**\n * AgentHandoff — visualizes agent-to-agent transfer\n * v4.1.0: AITL sprint — \"Extracteur -> Analyste : 47 entites transmises\"\n *\n * @experimental\n */\n\nimport { Show } from 'solid-js'\nimport type { AgentHandoffContent } from '../types/chat-bus'\nimport { formatMCPUIString, useMCPUIStrings } from '../context/MCPUIStringsContext'\n\nexport interface AgentHandoffProps {\n content: AgentHandoffContent\n}\n\nconst AVATAR_MAP: Record<string, string> = {\n scales: '\\u2696\\uFE0F', chart: '\\uD83D\\uDCC8', search: '\\uD83D\\uDD0D',\n document: '\\uD83D\\uDCC4', brain: '\\uD83E\\uDDE0', shield: '\\uD83D\\uDEE1\\uFE0F',\n globe: '\\uD83C\\uDF10', robot: '\\uD83E\\uDD16',\n}\n\nfunction getAvatar(key?: string): string {\n if (!key) return '\\uD83E\\uDD16'\n return AVATAR_MAP[key] || key\n}\n\nexport function AgentHandoff(props: AgentHandoffProps) {\n const strings = useMCPUIStrings()\n const c = () => props.content\n\n if (typeof console !== 'undefined') {\n console.info('[MCP-UI:Handoff] agent transfer', {\n from: c().from.id, to: c().to.id, dataKeys: c().dataKeys,\n })\n }\n\n return (\n <div class=\"flex items-center gap-3 p-3 rounded-lg bg-gradient-to-r from-blue-50 via-transparent to-purple-50 dark:from-blue-900/10 dark:via-transparent dark:to-purple-900/10 border border-gray-200 dark:border-gray-700\">\n {/* From agent */}\n <div class=\"flex items-center gap-1.5 flex-shrink-0\">\n <span class=\"text-lg\">{getAvatar(c().from.avatar)}</span>\n <span class=\"text-sm font-medium text-gray-700 dark:text-gray-300\">{c().from.name}</span>\n </div>\n\n {/* Arrow + data */}\n <div class=\"flex-1 flex flex-col items-center gap-0.5\">\n <div class=\"flex items-center gap-1 text-gray-400 dark:text-gray-500\">\n <div class=\"h-px flex-1 bg-gray-300 dark:bg-gray-600 min-w-[20px]\" />\n <span class=\"text-xs\">→</span>\n <div class=\"h-px flex-1 bg-gray-300 dark:bg-gray-600 min-w-[20px]\" />\n </div>\n <Show when={c().summary || c().itemCount}>\n <span class=\"text-[10px] text-gray-500 dark:text-gray-400 text-center\">\n {c().summary ||\n formatMCPUIString(strings.handoffItems, { count: c().itemCount ?? 0 })}\n </span>\n </Show>\n </div>\n\n {/* To agent */}\n <div class=\"flex items-center gap-1.5 flex-shrink-0\">\n <span class=\"text-lg\">{getAvatar(c().to.avatar)}</span>\n <span class=\"text-sm font-medium text-gray-700 dark:text-gray-300\">{c().to.name}</span>\n </div>\n </div>\n )\n}\n"],"names":["AVATAR_MAP","scales","chart","search","document","brain","shield","globe","robot","getAvatar","key","AgentHandoff","props","strings","useMCPUIStrings","c","content","console","info","from","id","to","dataKeys","_el$","_$getNextElement","_tmpl$2","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_el$6","_el$8","_el$9","_co$","_$getNextMarker","_el$0","_el$1","_el$10","_$insert","avatar","name","_$createComponent","Show","when","summary","itemCount","children","_el$7","_tmpl$","formatMCPUIString","handoffItems","count"],"mappings":";;;;;AAeA,MAAMA,aAAqC;AAAA,EACzCC,QAAQ;AAAA,EAAgBC,OAAO;AAAA,EAAgBC,QAAQ;AAAA,EACvDC,UAAU;AAAA,EAAgBC,OAAO;AAAA,EAAgBC,QAAQ;AAAA,EACzDC,OAAO;AAAA,EAAgBC,OAAO;AAChC;AAEA,SAASC,UAAUC,KAAsB;AACvC,MAAI,CAACA,IAAK,QAAO;AACjB,SAAOV,WAAWU,GAAG,KAAKA;AAC5B;AAEO,SAASC,aAAaC,OAA0B;AACrD,QAAMC,UAAUC,gBAAAA;AAChB,QAAMC,IAAIA,MAAMH,MAAMI;AAEtB,MAAI,OAAOC,YAAY,aAAa;AAClCA,YAAQC,KAAK,mCAAmC;AAAA,MAC9CC,MAAMJ,IAAII,KAAKC;AAAAA,MAAIC,IAAIN,IAAIM,GAAGD;AAAAA,MAAIE,UAAUP,IAAIO;AAAAA,IAAAA,CACjD;AAAA,EACH;AAEA,UAAA,MAAA;AAAA,QAAAC,OAAAC,eAAAC,OAAA,GAAAC,QAAAH,KAAAI,YAAAC,QAAAF,MAAAC,YAAAE,QAAAD,MAAAE,aAAAC,QAAAL,MAAAI,aAAAE,QAAAD,MAAAJ,YAAAM,QAAAD,MAAAF,aAAA,CAAAI,OAAAC,IAAA,IAAAC,cAAAH,MAAAH,WAAA,GAAAO,QAAAN,MAAAD,aAAAQ,QAAAD,MAAAV,YAAAY,SAAAD,MAAAR;AAAAU,WAAAZ,OAAA,MAI6BnB,UAAUM,IAAII,KAAKsB,MAAM,CAAC;AAAAD,WAAAX,OAAA,MACmBd,EAAAA,EAAII,KAAKuB,IAAI;AAAAF,WAAAT,OAAAY,gBAUhFC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAE9B,EAAAA,EAAI+B,WAAW/B,EAAAA,EAAIgC;AAAAA,MAAS;AAAA,MAAA,IAAAC,WAAA;AAAA,YAAAC,QAAAzB,eAAA0B,MAAA;AAAAV,eAAAS,OAAA,MAEnClC,EAAAA,EAAI+B,WACHK,kBAAkBtC,QAAQuC,cAAc;AAAA,UAAEC,OAAOtC,EAAAA,EAAIgC,aAAa;AAAA,QAAA,CAAG,CAAC;AAAA,eAAAE;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAAf,OAAAC,IAAA;AAAAK,WAAAF,OAAA,MAOrD7B,UAAUM,IAAIM,GAAGoB,MAAM,CAAC;AAAAD,WAAAD,QAAA,MACqBxB,EAAAA,EAAIM,GAAGqB,IAAI;AAAA,WAAAnB;AAAAA,EAAA,GAAA;AAIvF;"}
|
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const web = require("solid-js/web");
|
|
4
4
|
const safeUrl = require("../utils/safe-url.cjs");
|
|
5
|
-
|
|
5
|
+
const MCPUIStringsContext = require("../context/MCPUIStringsContext.cjs");
|
|
6
|
+
const formatString = require("../utils/format-string.cjs");
|
|
7
|
+
var _tmpl$ = /* @__PURE__ */ web.template(`<div class="flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-800/50 border border-gray-200 dark:border-gray-700 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors"><div class="flex items-center gap-3"><div class="w-10 h-10 flex items-center justify-center bg-white dark:bg-gray-700 rounded-md shadow-sm text-xl"></div><div><h4 class="text-sm font-medium text-gray-900 dark:text-white truncate max-w-[200px]"></h4><p class="text-xs text-gray-500 dark:text-gray-400"><!$><!/> • <!$><!/></p></div></div><a class="px-3 py-1.5 text-sm font-medium text-blue-600 dark:text-blue-400 bg-blue-50 dark:bg-blue-900/20 hover:bg-blue-100 dark:hover:bg-blue-900/40 rounded-md transition-colors flex items-center gap-1"><svg class="w-4 h-4"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"></path></svg><!$><!/>`);
|
|
6
8
|
const ArtifactRenderer = (props) => {
|
|
9
|
+
const strings = MCPUIStringsContext.useMCPUIStrings();
|
|
7
10
|
const getIcon = () => {
|
|
8
11
|
var _a, _b, _c;
|
|
9
12
|
if ((_a = props.params.mimeType) == null ? void 0 : _a.includes("csv")) return "📊";
|
|
@@ -13,16 +16,32 @@ const ArtifactRenderer = (props) => {
|
|
|
13
16
|
};
|
|
14
17
|
const formatSize = (bytes) => {
|
|
15
18
|
if (!bytes) return "";
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
+
const oneDecimal = (n) => new Intl.NumberFormat(strings.locale, {
|
|
20
|
+
minimumFractionDigits: 1,
|
|
21
|
+
maximumFractionDigits: 1,
|
|
22
|
+
useGrouping: false
|
|
23
|
+
}).format(n);
|
|
24
|
+
if (bytes < 1024) {
|
|
25
|
+
return formatString.formatMCPUIString(strings.sizeBytes, {
|
|
26
|
+
size: new Intl.NumberFormat(strings.locale, {
|
|
27
|
+
maximumFractionDigits: 0
|
|
28
|
+
}).format(bytes)
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
if (bytes < 1024 * 1024) return formatString.formatMCPUIString(strings.sizeKilobytes, {
|
|
32
|
+
size: oneDecimal(bytes / 1024)
|
|
33
|
+
});
|
|
34
|
+
return formatString.formatMCPUIString(strings.sizeMegabytes, {
|
|
35
|
+
size: oneDecimal(bytes / (1024 * 1024))
|
|
36
|
+
});
|
|
19
37
|
};
|
|
20
38
|
return (() => {
|
|
21
|
-
var _el$ = web.getNextElement(_tmpl$), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling, _el$8 = _el$6.firstChild, [_el$9, _co$] = web.getNextMarker(_el$8.nextSibling), _el$7 = _el$9.nextSibling, _el$0 = _el$7.nextSibling, [_el$1, _co$2] = web.getNextMarker(_el$0.nextSibling), _el$10 = _el$2.nextSibling;
|
|
39
|
+
var _el$ = web.getNextElement(_tmpl$), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling, _el$8 = _el$6.firstChild, [_el$9, _co$] = web.getNextMarker(_el$8.nextSibling), _el$7 = _el$9.nextSibling, _el$0 = _el$7.nextSibling, [_el$1, _co$2] = web.getNextMarker(_el$0.nextSibling), _el$10 = _el$2.nextSibling, _el$11 = _el$10.firstChild, _el$12 = _el$11.nextSibling, [_el$13, _co$3] = web.getNextMarker(_el$12.nextSibling);
|
|
22
40
|
web.insert(_el$3, getIcon);
|
|
23
41
|
web.insert(_el$5, () => props.params.filename);
|
|
24
42
|
web.insert(_el$6, () => formatSize(props.params.size), _el$9, _co$);
|
|
25
|
-
web.insert(_el$6, () => props.params.description ||
|
|
43
|
+
web.insert(_el$6, () => props.params.description || strings.artifactDescription, _el$1, _co$2);
|
|
44
|
+
web.insert(_el$10, () => strings.download, _el$13, _co$3);
|
|
26
45
|
web.effect((_p$) => {
|
|
27
46
|
var _v$ = safeUrl.safeUrl(props.params.url), _v$2 = props.params.filename;
|
|
28
47
|
_v$ !== _p$.e && web.setAttribute(_el$10, "href", _p$.e = _v$);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArtifactRenderer.cjs","sources":["../../src/components/ArtifactRenderer.tsx"],"sourcesContent":["import { Component } from 'solid-js'\nimport { safeUrl } from '../utils/safe-url'\n\nexport interface ArtifactComponentParams {\n url: string\n filename: string\n mimeType: string\n size?: number\n description?: string\n}\n\nexport const ArtifactRenderer: Component<{ params: ArtifactComponentParams }> = (props) => {\n const getIcon = () => {\n if (props.params.mimeType?.includes('csv')) return '📊'\n if (props.params.mimeType?.includes('json')) return '{}'\n if (props.params.mimeType?.includes('pdf')) return '📄'\n return '📁'\n }\n\n const formatSize = (bytes?: number) => {\n if (!bytes) return ''\n if (bytes < 1024) return
|
|
1
|
+
{"version":3,"file":"ArtifactRenderer.cjs","sources":["../../src/components/ArtifactRenderer.tsx"],"sourcesContent":["import { Component } from 'solid-js'\nimport { safeUrl } from '../utils/safe-url'\nimport { formatMCPUIString, useMCPUIStrings } from '../context/MCPUIStringsContext'\n\nexport interface ArtifactComponentParams {\n url: string\n filename: string\n mimeType: string\n size?: number\n description?: string\n}\n\nexport const ArtifactRenderer: Component<{ params: ArtifactComponentParams }> = (props) => {\n const strings = useMCPUIStrings()\n const getIcon = () => {\n if (props.params.mimeType?.includes('csv')) return '📊'\n if (props.params.mimeType?.includes('json')) return '{}'\n if (props.params.mimeType?.includes('pdf')) return '📄'\n return '📁'\n }\n\n const formatSize = (bytes?: number) => {\n if (!bytes) return ''\n const oneDecimal = (n: number) =>\n new Intl.NumberFormat(strings.locale, {\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n useGrouping: false,\n }).format(n)\n if (bytes < 1024) {\n return formatMCPUIString(strings.sizeBytes, {\n size: new Intl.NumberFormat(strings.locale, { maximumFractionDigits: 0 }).format(bytes),\n })\n }\n if (bytes < 1024 * 1024) return formatMCPUIString(strings.sizeKilobytes, { size: oneDecimal(bytes / 1024) })\n return formatMCPUIString(strings.sizeMegabytes, { size: oneDecimal(bytes / (1024 * 1024)) })\n }\n\n return (\n <div class=\"flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-800/50 border border-gray-200 dark:border-gray-700 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\">\n <div class=\"flex items-center gap-3\">\n <div class=\"w-10 h-10 flex items-center justify-center bg-white dark:bg-gray-700 rounded-md shadow-sm text-xl\">\n {getIcon()}\n </div>\n <div>\n <h4 class=\"text-sm font-medium text-gray-900 dark:text-white truncate max-w-[200px]\">\n {props.params.filename}\n </h4>\n <p class=\"text-xs text-gray-500 dark:text-gray-400\">\n {formatSize(props.params.size)} • {props.params.description || strings.artifactDescription}\n </p>\n </div>\n </div>\n\n <a\n href={safeUrl(props.params.url)}\n download={props.params.filename}\n class=\"px-3 py-1.5 text-sm font-medium text-blue-600 dark:text-blue-400 bg-blue-50 dark:bg-blue-900/20 hover:bg-blue-100 dark:hover:bg-blue-900/40 rounded-md transition-colors flex items-center gap-1\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\" />\n </svg>\n {strings.download}\n </a>\n </div>\n )\n}\n"],"names":["ArtifactRenderer","props","strings","useMCPUIStrings","getIcon","params","mimeType","includes","formatSize","bytes","oneDecimal","n","Intl","NumberFormat","locale","minimumFractionDigits","maximumFractionDigits","useGrouping","format","formatMCPUIString","sizeBytes","size","sizeKilobytes","sizeMegabytes","_el$","_$getNextElement","_tmpl$","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_el$6","_el$8","_el$9","_co$","_$getNextMarker","_el$7","_el$0","_el$1","_co$2","_el$10","_el$11","_el$12","_el$13","_co$3","_$insert","filename","description","artifactDescription","download","_$effect","_p$","_v$","safeUrl","url","_v$2","e","_$setAttribute","t","undefined"],"mappings":";;;;;;;AAYO,MAAMA,mBAAoEC,CAAAA,UAAU;AACvF,QAAMC,UAAUC,oBAAAA,gBAAAA;AAChB,QAAMC,UAAUA,MAAM;;AAClB,SAAIH,WAAMI,OAAOC,aAAbL,mBAAuBM,SAAS,OAAQ,QAAO;AACnD,SAAIN,WAAMI,OAAOC,aAAbL,mBAAuBM,SAAS,QAAS,QAAO;AACpD,SAAIN,WAAMI,OAAOC,aAAbL,mBAAuBM,SAAS,OAAQ,QAAO;AACnD,WAAO;AAAA,EACX;AAEA,QAAMC,aAAaA,CAACC,UAAmB;AACnC,QAAI,CAACA,MAAO,QAAO;AACnB,UAAMC,aAAaA,CAACC,MAChB,IAAIC,KAAKC,aAAaX,QAAQY,QAAQ;AAAA,MAClCC,uBAAuB;AAAA,MACvBC,uBAAuB;AAAA,MACvBC,aAAa;AAAA,IAAA,CAChB,EAAEC,OAAOP,CAAC;AACf,QAAIF,QAAQ,MAAM;AACd,aAAOU,aAAAA,kBAAkBjB,QAAQkB,WAAW;AAAA,QACxCC,MAAM,IAAIT,KAAKC,aAAaX,QAAQY,QAAQ;AAAA,UAAEE,uBAAuB;AAAA,QAAA,CAAG,EAAEE,OAAOT,KAAK;AAAA,MAAA,CACzF;AAAA,IACL;AACA,QAAIA,QAAQ,OAAO,KAAM,QAAOU,aAAAA,kBAAkBjB,QAAQoB,eAAe;AAAA,MAAED,MAAMX,WAAWD,QAAQ,IAAI;AAAA,IAAA,CAAG;AAC3G,WAAOU,aAAAA,kBAAkBjB,QAAQqB,eAAe;AAAA,MAAEF,MAAMX,WAAWD,SAAS,OAAO,KAAK;AAAA,IAAA,CAAG;AAAA,EAC/F;AAEA,UAAA,MAAA;AAAA,QAAAe,OAAAC,IAAAA,eAAAC,MAAA,GAAAC,QAAAH,KAAAI,YAAAC,QAAAF,MAAAC,YAAAE,QAAAD,MAAAE,aAAAC,QAAAF,MAAAF,YAAAK,QAAAD,MAAAD,aAAAG,QAAAD,MAAAL,YAAA,CAAAO,OAAAC,IAAA,IAAAC,IAAAA,cAAAH,MAAAH,WAAA,GAAAO,QAAAH,MAAAJ,aAAAQ,QAAAD,MAAAP,aAAA,CAAAS,OAAAC,KAAA,IAAAJ,IAAAA,cAAAE,MAAAR,WAAA,GAAAW,SAAAf,MAAAI,aAAAY,SAAAD,OAAAd,YAAAgB,SAAAD,OAAAZ,aAAA,CAAAc,QAAAC,KAAA,IAAAT,IAAAA,cAAAO,OAAAb,WAAA;AAAAgB,QAAAA,OAAAlB,OAIiBzB,OAAO;AAAA2C,QAAAA,OAAAf,OAAA,MAIH/B,MAAMI,OAAO2C,QAAQ;AAAAD,eAAAd,OAAA,MAGrBzB,WAAWP,MAAMI,OAAOgB,IAAI,GAACc,OAAAC,IAAA;AAAAW,eAAAd,OAAA,MAAKhC,MAAMI,OAAO4C,eAAe/C,QAAQgD,qBAAmBV,OAAAC,KAAA;AAAAM,QAAAA,OAAAL,QAAA,MAajGxC,QAAQiD,UAAQN,QAAAC,KAAA;AAAAM,QAAAA,OAAAC,CAAAA,QAAA;AAAA,UAAAC,MAPXC,gBAAQtD,MAAMI,OAAOmD,GAAG,GAACC,OACrBxD,MAAMI,OAAO2C;AAAQM,cAAAD,IAAAK,KAAAC,IAAAA,aAAAjB,QAAA,QAAAW,IAAAK,IAAAJ,GAAA;AAAAG,eAAAJ,IAAAO,KAAAD,IAAAA,aAAAjB,QAAA,YAAAW,IAAAO,IAAAH,IAAA;AAAA,aAAAJ;AAAAA,IAAA,GAAA;AAAA,MAAAK,GAAAG;AAAAA,MAAAD,GAAAC;AAAAA,IAAAA,CAAA;AAAA,WAAArC;AAAAA,EAAA,GAAA;AAU/C;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArtifactRenderer.d.ts","sourceRoot":"","sources":["../../src/components/ArtifactRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"ArtifactRenderer.d.ts","sourceRoot":"","sources":["../../src/components/ArtifactRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAIpC,MAAM,WAAW,uBAAuB;IACpC,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC;IAAE,MAAM,EAAE,uBAAuB,CAAA;CAAE,CAsD3E,CAAA"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { getNextElement, getNextMarker, insert, effect, setAttribute, template } from "solid-js/web";
|
|
2
2
|
import { safeUrl } from "../utils/safe-url.js";
|
|
3
|
-
|
|
3
|
+
import { useMCPUIStrings } from "../context/MCPUIStringsContext.js";
|
|
4
|
+
import { formatMCPUIString } from "../utils/format-string.js";
|
|
5
|
+
var _tmpl$ = /* @__PURE__ */ template(`<div class="flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-800/50 border border-gray-200 dark:border-gray-700 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors"><div class="flex items-center gap-3"><div class="w-10 h-10 flex items-center justify-center bg-white dark:bg-gray-700 rounded-md shadow-sm text-xl"></div><div><h4 class="text-sm font-medium text-gray-900 dark:text-white truncate max-w-[200px]"></h4><p class="text-xs text-gray-500 dark:text-gray-400"><!$><!/> • <!$><!/></p></div></div><a class="px-3 py-1.5 text-sm font-medium text-blue-600 dark:text-blue-400 bg-blue-50 dark:bg-blue-900/20 hover:bg-blue-100 dark:hover:bg-blue-900/40 rounded-md transition-colors flex items-center gap-1"><svg class="w-4 h-4"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"></path></svg><!$><!/>`);
|
|
4
6
|
const ArtifactRenderer = (props) => {
|
|
7
|
+
const strings = useMCPUIStrings();
|
|
5
8
|
const getIcon = () => {
|
|
6
9
|
var _a, _b, _c;
|
|
7
10
|
if ((_a = props.params.mimeType) == null ? void 0 : _a.includes("csv")) return "📊";
|
|
@@ -11,16 +14,32 @@ const ArtifactRenderer = (props) => {
|
|
|
11
14
|
};
|
|
12
15
|
const formatSize = (bytes) => {
|
|
13
16
|
if (!bytes) return "";
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
const oneDecimal = (n) => new Intl.NumberFormat(strings.locale, {
|
|
18
|
+
minimumFractionDigits: 1,
|
|
19
|
+
maximumFractionDigits: 1,
|
|
20
|
+
useGrouping: false
|
|
21
|
+
}).format(n);
|
|
22
|
+
if (bytes < 1024) {
|
|
23
|
+
return formatMCPUIString(strings.sizeBytes, {
|
|
24
|
+
size: new Intl.NumberFormat(strings.locale, {
|
|
25
|
+
maximumFractionDigits: 0
|
|
26
|
+
}).format(bytes)
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
if (bytes < 1024 * 1024) return formatMCPUIString(strings.sizeKilobytes, {
|
|
30
|
+
size: oneDecimal(bytes / 1024)
|
|
31
|
+
});
|
|
32
|
+
return formatMCPUIString(strings.sizeMegabytes, {
|
|
33
|
+
size: oneDecimal(bytes / (1024 * 1024))
|
|
34
|
+
});
|
|
17
35
|
};
|
|
18
36
|
return (() => {
|
|
19
|
-
var _el$ = getNextElement(_tmpl$), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling, _el$8 = _el$6.firstChild, [_el$9, _co$] = getNextMarker(_el$8.nextSibling), _el$7 = _el$9.nextSibling, _el$0 = _el$7.nextSibling, [_el$1, _co$2] = getNextMarker(_el$0.nextSibling), _el$10 = _el$2.nextSibling;
|
|
37
|
+
var _el$ = getNextElement(_tmpl$), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.firstChild, _el$6 = _el$5.nextSibling, _el$8 = _el$6.firstChild, [_el$9, _co$] = getNextMarker(_el$8.nextSibling), _el$7 = _el$9.nextSibling, _el$0 = _el$7.nextSibling, [_el$1, _co$2] = getNextMarker(_el$0.nextSibling), _el$10 = _el$2.nextSibling, _el$11 = _el$10.firstChild, _el$12 = _el$11.nextSibling, [_el$13, _co$3] = getNextMarker(_el$12.nextSibling);
|
|
20
38
|
insert(_el$3, getIcon);
|
|
21
39
|
insert(_el$5, () => props.params.filename);
|
|
22
40
|
insert(_el$6, () => formatSize(props.params.size), _el$9, _co$);
|
|
23
|
-
insert(_el$6, () => props.params.description ||
|
|
41
|
+
insert(_el$6, () => props.params.description || strings.artifactDescription, _el$1, _co$2);
|
|
42
|
+
insert(_el$10, () => strings.download, _el$13, _co$3);
|
|
24
43
|
effect((_p$) => {
|
|
25
44
|
var _v$ = safeUrl(props.params.url), _v$2 = props.params.filename;
|
|
26
45
|
_v$ !== _p$.e && setAttribute(_el$10, "href", _p$.e = _v$);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArtifactRenderer.js","sources":["../../src/components/ArtifactRenderer.tsx"],"sourcesContent":["import { Component } from 'solid-js'\nimport { safeUrl } from '../utils/safe-url'\n\nexport interface ArtifactComponentParams {\n url: string\n filename: string\n mimeType: string\n size?: number\n description?: string\n}\n\nexport const ArtifactRenderer: Component<{ params: ArtifactComponentParams }> = (props) => {\n const getIcon = () => {\n if (props.params.mimeType?.includes('csv')) return '📊'\n if (props.params.mimeType?.includes('json')) return '{}'\n if (props.params.mimeType?.includes('pdf')) return '📄'\n return '📁'\n }\n\n const formatSize = (bytes?: number) => {\n if (!bytes) return ''\n if (bytes < 1024) return
|
|
1
|
+
{"version":3,"file":"ArtifactRenderer.js","sources":["../../src/components/ArtifactRenderer.tsx"],"sourcesContent":["import { Component } from 'solid-js'\nimport { safeUrl } from '../utils/safe-url'\nimport { formatMCPUIString, useMCPUIStrings } from '../context/MCPUIStringsContext'\n\nexport interface ArtifactComponentParams {\n url: string\n filename: string\n mimeType: string\n size?: number\n description?: string\n}\n\nexport const ArtifactRenderer: Component<{ params: ArtifactComponentParams }> = (props) => {\n const strings = useMCPUIStrings()\n const getIcon = () => {\n if (props.params.mimeType?.includes('csv')) return '📊'\n if (props.params.mimeType?.includes('json')) return '{}'\n if (props.params.mimeType?.includes('pdf')) return '📄'\n return '📁'\n }\n\n const formatSize = (bytes?: number) => {\n if (!bytes) return ''\n const oneDecimal = (n: number) =>\n new Intl.NumberFormat(strings.locale, {\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n useGrouping: false,\n }).format(n)\n if (bytes < 1024) {\n return formatMCPUIString(strings.sizeBytes, {\n size: new Intl.NumberFormat(strings.locale, { maximumFractionDigits: 0 }).format(bytes),\n })\n }\n if (bytes < 1024 * 1024) return formatMCPUIString(strings.sizeKilobytes, { size: oneDecimal(bytes / 1024) })\n return formatMCPUIString(strings.sizeMegabytes, { size: oneDecimal(bytes / (1024 * 1024)) })\n }\n\n return (\n <div class=\"flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-800/50 border border-gray-200 dark:border-gray-700 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors\">\n <div class=\"flex items-center gap-3\">\n <div class=\"w-10 h-10 flex items-center justify-center bg-white dark:bg-gray-700 rounded-md shadow-sm text-xl\">\n {getIcon()}\n </div>\n <div>\n <h4 class=\"text-sm font-medium text-gray-900 dark:text-white truncate max-w-[200px]\">\n {props.params.filename}\n </h4>\n <p class=\"text-xs text-gray-500 dark:text-gray-400\">\n {formatSize(props.params.size)} • {props.params.description || strings.artifactDescription}\n </p>\n </div>\n </div>\n\n <a\n href={safeUrl(props.params.url)}\n download={props.params.filename}\n class=\"px-3 py-1.5 text-sm font-medium text-blue-600 dark:text-blue-400 bg-blue-50 dark:bg-blue-900/20 hover:bg-blue-100 dark:hover:bg-blue-900/40 rounded-md transition-colors flex items-center gap-1\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4\" />\n </svg>\n {strings.download}\n </a>\n </div>\n )\n}\n"],"names":["ArtifactRenderer","props","strings","useMCPUIStrings","getIcon","params","mimeType","includes","formatSize","bytes","oneDecimal","n","Intl","NumberFormat","locale","minimumFractionDigits","maximumFractionDigits","useGrouping","format","formatMCPUIString","sizeBytes","size","sizeKilobytes","sizeMegabytes","_el$","_$getNextElement","_tmpl$","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_el$6","_el$8","_el$9","_co$","_$getNextMarker","_el$7","_el$0","_el$1","_co$2","_el$10","_el$11","_el$12","_el$13","_co$3","_$insert","filename","description","artifactDescription","download","_$effect","_p$","_v$","safeUrl","url","_v$2","e","_$setAttribute","t","undefined"],"mappings":";;;;;AAYO,MAAMA,mBAAoEC,CAAAA,UAAU;AACvF,QAAMC,UAAUC,gBAAAA;AAChB,QAAMC,UAAUA,MAAM;;AAClB,SAAIH,WAAMI,OAAOC,aAAbL,mBAAuBM,SAAS,OAAQ,QAAO;AACnD,SAAIN,WAAMI,OAAOC,aAAbL,mBAAuBM,SAAS,QAAS,QAAO;AACpD,SAAIN,WAAMI,OAAOC,aAAbL,mBAAuBM,SAAS,OAAQ,QAAO;AACnD,WAAO;AAAA,EACX;AAEA,QAAMC,aAAaA,CAACC,UAAmB;AACnC,QAAI,CAACA,MAAO,QAAO;AACnB,UAAMC,aAAaA,CAACC,MAChB,IAAIC,KAAKC,aAAaX,QAAQY,QAAQ;AAAA,MAClCC,uBAAuB;AAAA,MACvBC,uBAAuB;AAAA,MACvBC,aAAa;AAAA,IAAA,CAChB,EAAEC,OAAOP,CAAC;AACf,QAAIF,QAAQ,MAAM;AACd,aAAOU,kBAAkBjB,QAAQkB,WAAW;AAAA,QACxCC,MAAM,IAAIT,KAAKC,aAAaX,QAAQY,QAAQ;AAAA,UAAEE,uBAAuB;AAAA,QAAA,CAAG,EAAEE,OAAOT,KAAK;AAAA,MAAA,CACzF;AAAA,IACL;AACA,QAAIA,QAAQ,OAAO,KAAM,QAAOU,kBAAkBjB,QAAQoB,eAAe;AAAA,MAAED,MAAMX,WAAWD,QAAQ,IAAI;AAAA,IAAA,CAAG;AAC3G,WAAOU,kBAAkBjB,QAAQqB,eAAe;AAAA,MAAEF,MAAMX,WAAWD,SAAS,OAAO,KAAK;AAAA,IAAA,CAAG;AAAA,EAC/F;AAEA,UAAA,MAAA;AAAA,QAAAe,OAAAC,eAAAC,MAAA,GAAAC,QAAAH,KAAAI,YAAAC,QAAAF,MAAAC,YAAAE,QAAAD,MAAAE,aAAAC,QAAAF,MAAAF,YAAAK,QAAAD,MAAAD,aAAAG,QAAAD,MAAAL,YAAA,CAAAO,OAAAC,IAAA,IAAAC,cAAAH,MAAAH,WAAA,GAAAO,QAAAH,MAAAJ,aAAAQ,QAAAD,MAAAP,aAAA,CAAAS,OAAAC,KAAA,IAAAJ,cAAAE,MAAAR,WAAA,GAAAW,SAAAf,MAAAI,aAAAY,SAAAD,OAAAd,YAAAgB,SAAAD,OAAAZ,aAAA,CAAAc,QAAAC,KAAA,IAAAT,cAAAO,OAAAb,WAAA;AAAAgB,WAAAlB,OAIiBzB,OAAO;AAAA2C,WAAAf,OAAA,MAIH/B,MAAMI,OAAO2C,QAAQ;AAAAD,WAAAd,OAAA,MAGrBzB,WAAWP,MAAMI,OAAOgB,IAAI,GAACc,OAAAC,IAAA;AAAAW,WAAAd,OAAA,MAAKhC,MAAMI,OAAO4C,eAAe/C,QAAQgD,qBAAmBV,OAAAC,KAAA;AAAAM,WAAAL,QAAA,MAajGxC,QAAQiD,UAAQN,QAAAC,KAAA;AAAAM,WAAAC,CAAAA,QAAA;AAAA,UAAAC,MAPXC,QAAQtD,MAAMI,OAAOmD,GAAG,GAACC,OACrBxD,MAAMI,OAAO2C;AAAQM,cAAAD,IAAAK,KAAAC,aAAAjB,QAAA,QAAAW,IAAAK,IAAAJ,GAAA;AAAAG,eAAAJ,IAAAO,KAAAD,aAAAjB,QAAA,YAAAW,IAAAO,IAAAH,IAAA;AAAA,aAAAJ;AAAAA,IAAA,GAAA;AAAA,MAAAK,GAAAG;AAAAA,MAAAD,GAAAC;AAAAA,IAAAA,CAAA;AAAA,WAAArC;AAAAA,EAAA,GAAA;AAU/C;"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const web = require("solid-js/web");
|
|
4
4
|
const solidJs = require("solid-js");
|
|
5
|
-
|
|
5
|
+
const MCPUIStringsContext = require("../context/MCPUIStringsContext.cjs");
|
|
6
|
+
var _tmpl$ = /* @__PURE__ */ web.template(`<strong class=mcp-autocomplete-highlight>`), _tmpl$2 = /* @__PURE__ */ web.template(`<span class=mcp-autocomplete-option-icon>`), _tmpl$3 = /* @__PURE__ */ web.template(`<span class=mcp-autocomplete-option-description>`), _tmpl$4 = /* @__PURE__ */ web.template(`<div class=mcp-autocomplete-option-content><!$><!/><div class=mcp-autocomplete-option-text><span class=mcp-autocomplete-option-label></span><!$><!/>`), _tmpl$5 = /* @__PURE__ */ web.template(`<div class=mcp-autocomplete-loading style="padding:12px 16px;color:#6b7280;font-size:0.875rem;display:flex;align-items:center;gap:8px"><span style="display:inline-block;width:14px;height:14px;border:2px solid #e5e7eb;border-top-color:#3b82f6;border-radius:50%;animation:mcp-spin 0.6s linear infinite"></span><!$><!/>`), _tmpl$6 = /* @__PURE__ */ web.template(`<div class=mcp-autocomplete-empty style="padding:12px 16px;color:#9ca3af;font-size:0.875rem;text-align:center">`), _tmpl$7 = /* @__PURE__ */ web.template(`<ul class=mcp-autocomplete-options style="margin:0;padding:4px 0;list-style:none">`), _tmpl$8 = /* @__PURE__ */ web.template(`<div class=mcp-autocomplete-footer style="padding:6px 12px;border-top:1px solid #e5e7eb;background-color:#f9fafb;font-size:0.75rem;color:#6b7280"><kbd style="background-color:#e5e7eb;padding:1px 4px;border-radius:2px;font-family:inherit;font-size:0.7rem">↑</kbd> <kbd style="background-color:#e5e7eb;padding:1px 4px;border-radius:2px;font-family:inherit;font-size:0.7rem">↓</kbd><!$><!/><kbd style="background-color:#e5e7eb;padding:1px 4px;border-radius:2px;font-family:inherit;font-size:0.7rem">Enter</kbd><!$><!/><kbd style="background-color:#e5e7eb;padding:1px 4px;border-radius:2px;font-family:inherit;font-size:0.7rem">Esc</kbd><!$><!/>`), _tmpl$9 = /* @__PURE__ */ web.template(`<div role=listbox><!$><!/><!$><!/><!$><!/><!$><!/>`), _tmpl$0 = /* @__PURE__ */ web.template(`<li role=option style="padding:8px 16px;font-size:0.875rem;transition:background-color 150ms ease">`);
|
|
6
7
|
function highlightText(text, match) {
|
|
7
8
|
if (!match || !text) {
|
|
8
9
|
return text;
|
|
@@ -51,6 +52,7 @@ const DefaultOptionRenderer = (props) => {
|
|
|
51
52
|
})();
|
|
52
53
|
};
|
|
53
54
|
const AutocompleteDropdown = (props) => {
|
|
55
|
+
const strings = MCPUIStringsContext.useMCPUIStrings();
|
|
54
56
|
const positionStyles = solidJs.createMemo(() => {
|
|
55
57
|
if (props.position === "top") {
|
|
56
58
|
return {
|
|
@@ -81,27 +83,27 @@ const AutocompleteDropdown = (props) => {
|
|
|
81
83
|
return props.isOpen;
|
|
82
84
|
},
|
|
83
85
|
get children() {
|
|
84
|
-
var _el$1 = web.getNextElement(_tmpl$9), _el$
|
|
86
|
+
var _el$1 = web.getNextElement(_tmpl$9), _el$28 = _el$1.firstChild, [_el$29, _co$7] = web.getNextMarker(_el$28.nextSibling), _el$30 = _el$29.nextSibling, [_el$31, _co$8] = web.getNextMarker(_el$30.nextSibling), _el$32 = _el$31.nextSibling, [_el$33, _co$9] = web.getNextMarker(_el$32.nextSibling), _el$34 = _el$33.nextSibling, [_el$35, _co$0] = web.getNextMarker(_el$34.nextSibling);
|
|
85
87
|
web.insert(_el$1, web.createComponent(solidJs.Show, {
|
|
86
88
|
get when() {
|
|
87
89
|
return props.isLoading;
|
|
88
90
|
},
|
|
89
91
|
get children() {
|
|
90
92
|
var _el$10 = web.getNextElement(_tmpl$5), _el$11 = _el$10.firstChild, _el$12 = _el$11.nextSibling, [_el$13, _co$3] = web.getNextMarker(_el$12.nextSibling);
|
|
91
|
-
web.insert(_el$10, () => props.loadingMessage ||
|
|
93
|
+
web.insert(_el$10, () => props.loadingMessage || strings.autocompleteLoading, _el$13, _co$3);
|
|
92
94
|
return _el$10;
|
|
93
95
|
}
|
|
94
|
-
}), _el$
|
|
96
|
+
}), _el$29, _co$7);
|
|
95
97
|
web.insert(_el$1, web.createComponent(solidJs.Show, {
|
|
96
98
|
get when() {
|
|
97
99
|
return web.memo(() => !!!props.isLoading)() && props.options.length === 0;
|
|
98
100
|
},
|
|
99
101
|
get children() {
|
|
100
102
|
var _el$14 = web.getNextElement(_tmpl$6);
|
|
101
|
-
web.insert(_el$14, () => props.emptyMessage ||
|
|
103
|
+
web.insert(_el$14, () => props.emptyMessage || strings.autocompleteEmpty);
|
|
102
104
|
return _el$14;
|
|
103
105
|
}
|
|
104
|
-
}), _el$
|
|
106
|
+
}), _el$31, _co$8);
|
|
105
107
|
web.insert(_el$1, web.createComponent(solidJs.Show, {
|
|
106
108
|
get when() {
|
|
107
109
|
return web.memo(() => !!!props.isLoading)() && props.options.length > 0;
|
|
@@ -116,19 +118,19 @@ const AutocompleteDropdown = (props) => {
|
|
|
116
118
|
const isSelected = () => index() === props.selectedIndex;
|
|
117
119
|
const isDisabled = () => option.disabled;
|
|
118
120
|
return (() => {
|
|
119
|
-
var _el$
|
|
120
|
-
_el$
|
|
121
|
+
var _el$36 = web.getNextElement(_tmpl$0);
|
|
122
|
+
_el$36.addEventListener("mouseenter", () => {
|
|
121
123
|
var _a;
|
|
122
124
|
if (!isDisabled()) {
|
|
123
125
|
(_a = props.onHover) == null ? void 0 : _a.call(props, index());
|
|
124
126
|
}
|
|
125
127
|
});
|
|
126
|
-
_el$
|
|
128
|
+
_el$36.$$click = () => {
|
|
127
129
|
if (!isDisabled()) {
|
|
128
130
|
props.onSelect(option);
|
|
129
131
|
}
|
|
130
132
|
};
|
|
131
|
-
web.insert(_el$
|
|
133
|
+
web.insert(_el$36, web.createComponent(solidJs.Show, {
|
|
132
134
|
get when() {
|
|
133
135
|
return props.renderOption;
|
|
134
136
|
},
|
|
@@ -148,13 +150,13 @@ const AutocompleteDropdown = (props) => {
|
|
|
148
150
|
}
|
|
149
151
|
}));
|
|
150
152
|
web.effect((_p$) => {
|
|
151
|
-
var _v$
|
|
152
|
-
_v$
|
|
153
|
-
_v$
|
|
154
|
-
_v$
|
|
155
|
-
_v$
|
|
156
|
-
_v$
|
|
157
|
-
_v$
|
|
153
|
+
var _v$4 = isSelected(), _v$5 = isDisabled(), _v$6 = `mcp-autocomplete-option ${isSelected() ? "mcp-autocomplete-option-selected" : ""} ${isDisabled() ? "mcp-autocomplete-option-disabled" : ""}`, _v$7 = isDisabled() ? "not-allowed" : "pointer", _v$8 = isSelected() ? "#eff6ff" : "transparent", _v$9 = isDisabled() ? "#9ca3af" : "#374151";
|
|
154
|
+
_v$4 !== _p$.e && web.setAttribute(_el$36, "aria-selected", _p$.e = _v$4);
|
|
155
|
+
_v$5 !== _p$.t && web.setAttribute(_el$36, "aria-disabled", _p$.t = _v$5);
|
|
156
|
+
_v$6 !== _p$.a && web.className(_el$36, _p$.a = _v$6);
|
|
157
|
+
_v$7 !== _p$.o && web.setStyleProperty(_el$36, "cursor", _p$.o = _v$7);
|
|
158
|
+
_v$8 !== _p$.i && web.setStyleProperty(_el$36, "background-color", _p$.i = _v$8);
|
|
159
|
+
_v$9 !== _p$.n && web.setStyleProperty(_el$36, "color", _p$.n = _v$9);
|
|
158
160
|
return _p$;
|
|
159
161
|
}, {
|
|
160
162
|
e: void 0,
|
|
@@ -165,31 +167,35 @@ const AutocompleteDropdown = (props) => {
|
|
|
165
167
|
n: void 0
|
|
166
168
|
});
|
|
167
169
|
web.runHydrationEvents();
|
|
168
|
-
return _el$
|
|
170
|
+
return _el$36;
|
|
169
171
|
})();
|
|
170
172
|
}
|
|
171
173
|
}));
|
|
172
174
|
return _el$15;
|
|
173
175
|
}
|
|
174
|
-
}), _el$
|
|
176
|
+
}), _el$33, _co$9);
|
|
175
177
|
web.insert(_el$1, web.createComponent(solidJs.Show, {
|
|
176
178
|
get when() {
|
|
177
179
|
return web.memo(() => !!!props.isLoading)() && props.options.length > 0;
|
|
178
180
|
},
|
|
179
181
|
get children() {
|
|
180
|
-
var _el$16 = web.getNextElement(_tmpl$8), _el$17 = _el$16.firstChild, _el$18 = _el$17.nextSibling, _el$19 = _el$18.nextSibling, _el$
|
|
181
|
-
_el$
|
|
182
|
+
var _el$16 = web.getNextElement(_tmpl$8), _el$17 = _el$16.firstChild, _el$18 = _el$17.nextSibling, _el$19 = _el$18.nextSibling, _el$22 = _el$19.nextSibling, [_el$23, _co$4] = web.getNextMarker(_el$22.nextSibling), _el$20 = _el$23.nextSibling, _el$24 = _el$20.nextSibling, [_el$25, _co$5] = web.getNextMarker(_el$24.nextSibling), _el$21 = _el$25.nextSibling, _el$26 = _el$21.nextSibling, [_el$27, _co$6] = web.getNextMarker(_el$26.nextSibling);
|
|
183
|
+
web.insert(_el$16, () => strings.autocompleteHintNavigate, _el$23, _co$4);
|
|
184
|
+
web.insert(_el$16, () => strings.autocompleteHintSelect, _el$25, _co$5);
|
|
185
|
+
web.insert(_el$16, () => strings.autocompleteHintDismiss, _el$27, _co$6);
|
|
182
186
|
return _el$16;
|
|
183
187
|
}
|
|
184
|
-
}), _el$
|
|
188
|
+
}), _el$35, _co$0);
|
|
185
189
|
web.effect((_p$) => {
|
|
186
|
-
var _v$ = `mcp-autocomplete-dropdown ${props.class || ""}`, _v$2 = containerStyles();
|
|
190
|
+
var _v$ = `mcp-autocomplete-dropdown ${props.class || ""}`, _v$2 = containerStyles(), _v$3 = strings.autocompleteSuggestions;
|
|
187
191
|
_v$ !== _p$.e && web.className(_el$1, _p$.e = _v$);
|
|
188
192
|
_p$.t = web.style(_el$1, _v$2, _p$.t);
|
|
193
|
+
_v$3 !== _p$.a && web.setAttribute(_el$1, "aria-label", _p$.a = _v$3);
|
|
189
194
|
return _p$;
|
|
190
195
|
}, {
|
|
191
196
|
e: void 0,
|
|
192
|
-
t: void 0
|
|
197
|
+
t: void 0,
|
|
198
|
+
a: void 0
|
|
193
199
|
});
|
|
194
200
|
return _el$1;
|
|
195
201
|
}
|