@seed-ship/mcp-ui-solid 6.19.1 → 6.20.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 (257) hide show
  1. package/CHANGELOG.md +519 -0
  2. package/README.md +791 -1
  3. package/dist/adapters/connector.cjs +15 -4
  4. package/dist/adapters/connector.cjs.map +1 -1
  5. package/dist/adapters/connector.d.ts +38 -0
  6. package/dist/adapters/connector.d.ts.map +1 -1
  7. package/dist/adapters/connector.js +15 -4
  8. package/dist/adapters/connector.js.map +1 -1
  9. package/dist/adapters/index.d.ts +4 -3
  10. package/dist/adapters/index.d.ts.map +1 -1
  11. package/dist/adapters/macro-run.cjs +25 -13
  12. package/dist/adapters/macro-run.cjs.map +1 -1
  13. package/dist/adapters/macro-run.d.ts +37 -2
  14. package/dist/adapters/macro-run.d.ts.map +1 -1
  15. package/dist/adapters/macro-run.js +25 -13
  16. package/dist/adapters/macro-run.js.map +1 -1
  17. package/dist/adapters.cjs +2 -0
  18. package/dist/adapters.cjs.map +1 -1
  19. package/dist/adapters.js +4 -2
  20. package/dist/components/ActionGroupRenderer.cjs +3 -1
  21. package/dist/components/ActionGroupRenderer.cjs.map +1 -1
  22. package/dist/components/ActionGroupRenderer.d.ts.map +1 -1
  23. package/dist/components/ActionGroupRenderer.js +3 -1
  24. package/dist/components/ActionGroupRenderer.js.map +1 -1
  25. package/dist/components/AgentCard.cjs +11 -8
  26. package/dist/components/AgentCard.cjs.map +1 -1
  27. package/dist/components/AgentCard.d.ts.map +1 -1
  28. package/dist/components/AgentCard.js +11 -8
  29. package/dist/components/AgentCard.js.map +1 -1
  30. package/dist/components/AgentHandoff.cjs +6 -1
  31. package/dist/components/AgentHandoff.cjs.map +1 -1
  32. package/dist/components/AgentHandoff.d.ts.map +1 -1
  33. package/dist/components/AgentHandoff.js +6 -1
  34. package/dist/components/AgentHandoff.js.map +1 -1
  35. package/dist/components/ArtifactRenderer.cjs +25 -6
  36. package/dist/components/ArtifactRenderer.cjs.map +1 -1
  37. package/dist/components/ArtifactRenderer.d.ts.map +1 -1
  38. package/dist/components/ArtifactRenderer.js +25 -6
  39. package/dist/components/ArtifactRenderer.js.map +1 -1
  40. package/dist/components/AutocompleteDropdown.cjs +30 -24
  41. package/dist/components/AutocompleteDropdown.cjs.map +1 -1
  42. package/dist/components/AutocompleteDropdown.d.ts.map +1 -1
  43. package/dist/components/AutocompleteDropdown.js +30 -24
  44. package/dist/components/AutocompleteDropdown.js.map +1 -1
  45. package/dist/components/AutocompleteFormField.cjs +3 -1
  46. package/dist/components/AutocompleteFormField.cjs.map +1 -1
  47. package/dist/components/AutocompleteFormField.d.ts.map +1 -1
  48. package/dist/components/AutocompleteFormField.js +4 -2
  49. package/dist/components/AutocompleteFormField.js.map +1 -1
  50. package/dist/components/BriefingDiff.cjs +45 -39
  51. package/dist/components/BriefingDiff.cjs.map +1 -1
  52. package/dist/components/BriefingDiff.d.ts.map +1 -1
  53. package/dist/components/BriefingDiff.js +45 -39
  54. package/dist/components/BriefingDiff.js.map +1 -1
  55. package/dist/components/CarouselRenderer.cjs +8 -2
  56. package/dist/components/CarouselRenderer.cjs.map +1 -1
  57. package/dist/components/CarouselRenderer.d.ts.map +1 -1
  58. package/dist/components/CarouselRenderer.js +8 -2
  59. package/dist/components/CarouselRenderer.js.map +1 -1
  60. package/dist/components/ChartJSRenderer.cjs +60 -36
  61. package/dist/components/ChartJSRenderer.cjs.map +1 -1
  62. package/dist/components/ChartJSRenderer.d.ts.map +1 -1
  63. package/dist/components/ChartJSRenderer.js +61 -37
  64. package/dist/components/ChartJSRenderer.js.map +1 -1
  65. package/dist/components/ChatPrompt.cjs +15 -9
  66. package/dist/components/ChatPrompt.cjs.map +1 -1
  67. package/dist/components/ChatPrompt.d.ts.map +1 -1
  68. package/dist/components/ChatPrompt.js +15 -9
  69. package/dist/components/ChatPrompt.js.map +1 -1
  70. package/dist/components/CodeBlockRenderer.cjs +34 -16
  71. package/dist/components/CodeBlockRenderer.cjs.map +1 -1
  72. package/dist/components/CodeBlockRenderer.d.ts.map +1 -1
  73. package/dist/components/CodeBlockRenderer.js +34 -16
  74. package/dist/components/CodeBlockRenderer.js.map +1 -1
  75. package/dist/components/DataPreviewSection.cjs +91 -44
  76. package/dist/components/DataPreviewSection.cjs.map +1 -1
  77. package/dist/components/DataPreviewSection.d.ts.map +1 -1
  78. package/dist/components/DataPreviewSection.js +92 -45
  79. package/dist/components/DataPreviewSection.js.map +1 -1
  80. package/dist/components/DegradedFallback.cjs +20 -16
  81. package/dist/components/DegradedFallback.cjs.map +1 -1
  82. package/dist/components/DegradedFallback.d.ts.map +1 -1
  83. package/dist/components/DegradedFallback.js +20 -16
  84. package/dist/components/DegradedFallback.js.map +1 -1
  85. package/dist/components/FooterRenderer.cjs +21 -17
  86. package/dist/components/FooterRenderer.cjs.map +1 -1
  87. package/dist/components/FooterRenderer.d.ts.map +1 -1
  88. package/dist/components/FooterRenderer.js +21 -17
  89. package/dist/components/FooterRenderer.js.map +1 -1
  90. package/dist/components/FormFieldRenderer.cjs +116 -93
  91. package/dist/components/FormFieldRenderer.cjs.map +1 -1
  92. package/dist/components/FormFieldRenderer.d.ts.map +1 -1
  93. package/dist/components/FormFieldRenderer.js +116 -93
  94. package/dist/components/FormFieldRenderer.js.map +1 -1
  95. package/dist/components/FormRenderer.cjs +55 -31
  96. package/dist/components/FormRenderer.cjs.map +1 -1
  97. package/dist/components/FormRenderer.d.ts.map +1 -1
  98. package/dist/components/FormRenderer.js +55 -31
  99. package/dist/components/FormRenderer.js.map +1 -1
  100. package/dist/components/GenerativeUIErrorBoundary.cjs +20 -15
  101. package/dist/components/GenerativeUIErrorBoundary.cjs.map +1 -1
  102. package/dist/components/GenerativeUIErrorBoundary.d.ts.map +1 -1
  103. package/dist/components/GenerativeUIErrorBoundary.js +20 -15
  104. package/dist/components/GenerativeUIErrorBoundary.js.map +1 -1
  105. package/dist/components/GraphRenderer.cjs +56 -33
  106. package/dist/components/GraphRenderer.cjs.map +1 -1
  107. package/dist/components/GraphRenderer.d.ts.map +1 -1
  108. package/dist/components/GraphRenderer.js +56 -33
  109. package/dist/components/GraphRenderer.js.map +1 -1
  110. package/dist/components/ImageGalleryRenderer.cjs +13 -4
  111. package/dist/components/ImageGalleryRenderer.cjs.map +1 -1
  112. package/dist/components/ImageGalleryRenderer.d.ts.map +1 -1
  113. package/dist/components/ImageGalleryRenderer.js +13 -4
  114. package/dist/components/ImageGalleryRenderer.js.map +1 -1
  115. package/dist/components/LightboxOverlay.cjs +16 -8
  116. package/dist/components/LightboxOverlay.cjs.map +1 -1
  117. package/dist/components/LightboxOverlay.d.ts.map +1 -1
  118. package/dist/components/LightboxOverlay.js +17 -9
  119. package/dist/components/LightboxOverlay.js.map +1 -1
  120. package/dist/components/MapRenderer.cjs +59 -29
  121. package/dist/components/MapRenderer.cjs.map +1 -1
  122. package/dist/components/MapRenderer.d.ts +10 -2
  123. package/dist/components/MapRenderer.d.ts.map +1 -1
  124. package/dist/components/MapRenderer.js +60 -30
  125. package/dist/components/MapRenderer.js.map +1 -1
  126. package/dist/components/ModalRenderer.cjs +4 -1
  127. package/dist/components/ModalRenderer.cjs.map +1 -1
  128. package/dist/components/ModalRenderer.d.ts.map +1 -1
  129. package/dist/components/ModalRenderer.js +5 -2
  130. package/dist/components/ModalRenderer.js.map +1 -1
  131. package/dist/components/ScratchpadPanel.cjs +578 -535
  132. package/dist/components/ScratchpadPanel.cjs.map +1 -1
  133. package/dist/components/ScratchpadPanel.d.ts.map +1 -1
  134. package/dist/components/ScratchpadPanel.js +578 -535
  135. package/dist/components/ScratchpadPanel.js.map +1 -1
  136. package/dist/components/StreamingUIRenderer.cjs +92 -28
  137. package/dist/components/StreamingUIRenderer.cjs.map +1 -1
  138. package/dist/components/StreamingUIRenderer.d.ts.map +1 -1
  139. package/dist/components/StreamingUIRenderer.js +92 -28
  140. package/dist/components/StreamingUIRenderer.js.map +1 -1
  141. package/dist/components/UIResourceRenderer.cjs +456 -363
  142. package/dist/components/UIResourceRenderer.cjs.map +1 -1
  143. package/dist/components/UIResourceRenderer.d.ts +21 -0
  144. package/dist/components/UIResourceRenderer.d.ts.map +1 -1
  145. package/dist/components/UIResourceRenderer.js +458 -365
  146. package/dist/components/UIResourceRenderer.js.map +1 -1
  147. package/dist/components/VerifiedText.cjs +39 -20
  148. package/dist/components/VerifiedText.cjs.map +1 -1
  149. package/dist/components/VerifiedText.d.ts +2 -1
  150. package/dist/components/VerifiedText.d.ts.map +1 -1
  151. package/dist/components/VerifiedText.js +39 -20
  152. package/dist/components/VerifiedText.js.map +1 -1
  153. package/dist/components/VideoRenderer.cjs +10 -5
  154. package/dist/components/VideoRenderer.cjs.map +1 -1
  155. package/dist/components/VideoRenderer.d.ts.map +1 -1
  156. package/dist/components/VideoRenderer.js +10 -5
  157. package/dist/components/VideoRenderer.js.map +1 -1
  158. package/dist/components/chart-data-table.cjs +38 -17
  159. package/dist/components/chart-data-table.cjs.map +1 -1
  160. package/dist/components/chart-data-table.d.ts +30 -1
  161. package/dist/components/chart-data-table.d.ts.map +1 -1
  162. package/dist/components/chart-data-table.js +38 -17
  163. package/dist/components/chart-data-table.js.map +1 -1
  164. package/dist/context/MCPActionContext.cjs +3 -1
  165. package/dist/context/MCPActionContext.cjs.map +1 -1
  166. package/dist/context/MCPActionContext.d.ts.map +1 -1
  167. package/dist/context/MCPActionContext.js +3 -1
  168. package/dist/context/MCPActionContext.js.map +1 -1
  169. package/dist/context/MCPUIStringsContext.cjs +285 -2
  170. package/dist/context/MCPUIStringsContext.cjs.map +1 -1
  171. package/dist/context/MCPUIStringsContext.d.ts +600 -3
  172. package/dist/context/MCPUIStringsContext.d.ts.map +1 -1
  173. package/dist/context/MCPUIStringsContext.js +285 -2
  174. package/dist/context/MCPUIStringsContext.js.map +1 -1
  175. package/dist/hooks/index.d.ts +2 -2
  176. package/dist/hooks/index.d.ts.map +1 -1
  177. package/dist/hooks/useStreamingUI.cjs +28 -10
  178. package/dist/hooks/useStreamingUI.cjs.map +1 -1
  179. package/dist/hooks/useStreamingUI.d.ts +37 -0
  180. package/dist/hooks/useStreamingUI.d.ts.map +1 -1
  181. package/dist/hooks/useStreamingUI.js +28 -10
  182. package/dist/hooks/useStreamingUI.js.map +1 -1
  183. package/dist/hooks.cjs +1 -0
  184. package/dist/hooks.cjs.map +1 -1
  185. package/dist/hooks.js +2 -1
  186. package/dist/index.cjs +23 -8
  187. package/dist/index.cjs.map +1 -1
  188. package/dist/index.d.cts +9 -3
  189. package/dist/index.d.ts +9 -3
  190. package/dist/index.d.ts.map +1 -1
  191. package/dist/index.js +18 -3
  192. package/dist/index.js.map +1 -1
  193. package/dist/services/validation.cjs +41 -16
  194. package/dist/services/validation.cjs.map +1 -1
  195. package/dist/services/validation.d.ts +47 -2
  196. package/dist/services/validation.d.ts.map +1 -1
  197. package/dist/services/validation.js +41 -16
  198. package/dist/services/validation.js.map +1 -1
  199. package/dist/utils/degraded-projections.cjs +37 -12
  200. package/dist/utils/degraded-projections.cjs.map +1 -1
  201. package/dist/utils/degraded-projections.d.ts +39 -3
  202. package/dist/utils/degraded-projections.d.ts.map +1 -1
  203. package/dist/utils/degraded-projections.js +37 -12
  204. package/dist/utils/degraded-projections.js.map +1 -1
  205. package/dist/utils/format-string.cjs +10 -0
  206. package/dist/utils/format-string.cjs.map +1 -0
  207. package/dist/utils/format-string.d.ts +26 -0
  208. package/dist/utils/format-string.d.ts.map +1 -0
  209. package/dist/utils/format-string.js +10 -0
  210. package/dist/utils/format-string.js.map +1 -0
  211. package/dist/validation.cjs +3 -0
  212. package/dist/validation.cjs.map +1 -1
  213. package/dist/validation.d.cts +2 -1
  214. package/dist/validation.d.ts +2 -1
  215. package/dist/validation.d.ts.map +1 -1
  216. package/dist/validation.js +4 -1
  217. package/package.json +1 -1
  218. package/src/adapters/connector.ts +58 -4
  219. package/src/adapters/index.ts +12 -2
  220. package/src/adapters/macro-run.ts +71 -11
  221. package/src/components/ActionGroupRenderer.tsx +3 -1
  222. package/src/components/AgentCard.tsx +27 -9
  223. package/src/components/AgentHandoff.tsx +4 -1
  224. package/src/components/ArtifactRenderer.tsx +17 -5
  225. package/src/components/AutocompleteDropdown.tsx +8 -6
  226. package/src/components/AutocompleteFormField.tsx +5 -1
  227. package/src/components/BriefingDiff.tsx +11 -3
  228. package/src/components/CarouselRenderer.tsx +4 -2
  229. package/src/components/ChartJSRenderer.tsx +18 -9
  230. package/src/components/ChatPrompt.tsx +13 -8
  231. package/src/components/CodeBlockRenderer.tsx +12 -10
  232. package/src/components/DataPreviewSection.tsx +92 -26
  233. package/src/components/DegradedFallback.tsx +4 -2
  234. package/src/components/FooterRenderer.tsx +3 -1
  235. package/src/components/FormFieldRenderer.tsx +34 -19
  236. package/src/components/FormRenderer.tsx +38 -10
  237. package/src/components/GenerativeUIErrorBoundary.tsx +8 -3
  238. package/src/components/GraphRenderer.tsx +31 -16
  239. package/src/components/ImageGalleryRenderer.tsx +8 -4
  240. package/src/components/LightboxOverlay.tsx +6 -4
  241. package/src/components/MapRenderer.tsx +57 -20
  242. package/src/components/ModalRenderer.tsx +3 -1
  243. package/src/components/ScratchpadPanel.tsx +95 -44
  244. package/src/components/StreamingUIRenderer.tsx +41 -11
  245. package/src/components/UIResourceRenderer.tsx +145 -63
  246. package/src/components/VerifiedText.tsx +19 -9
  247. package/src/components/VideoRenderer.tsx +6 -4
  248. package/src/components/chart-data-table.ts +68 -14
  249. package/src/context/MCPActionContext.tsx +4 -1
  250. package/src/context/MCPUIStringsContext.tsx +1004 -1
  251. package/src/hooks/index.ts +2 -1
  252. package/src/hooks/useStreamingUI.ts +64 -10
  253. package/src/index.ts +23 -0
  254. package/src/services/validation.ts +93 -16
  255. package/src/utils/degraded-projections.ts +75 -12
  256. package/src/utils/format-string.ts +33 -0
  257. package/src/validation.ts +5 -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
- label: "Idle",
17
+ labelKey: "agentStatusIdle",
17
18
  color: "bg-gray-400",
18
19
  pulse: false
19
20
  },
20
21
  running: {
21
- label: "Running",
22
+ labelKey: "agentStatusRunning",
22
23
  color: "bg-blue-500",
23
24
  pulse: true
24
25
  },
25
26
  waiting: {
26
- label: "Waiting",
27
+ labelKey: "agentStatusWaiting",
27
28
  color: "bg-amber-500",
28
29
  pulse: true
29
30
  },
30
31
  done: {
31
- label: "Done",
32
+ labelKey: "agentStatusDone",
32
33
  color: "bg-green-500",
33
34
  pulse: false
34
35
  },
35
36
  error: {
36
- label: "Error",
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().label);
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().label;
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().label);
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<string, { label: string; color: string; pulse: boolean }> = {\n idle: { label: 'Idle', color: 'bg-gray-400', pulse: false },\n running: { label: 'Running', color: 'bg-blue-500', pulse: true },\n waiting: { label: 'Waiting', color: 'bg-amber-500', pulse: true },\n done: { label: 'Done', color: 'bg-green-500', pulse: false },\n error: { label: 'Error', color: 'bg-red-500', pulse: false },\n}\n\nexport function AgentCard(props: AgentCardProps) {\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={status().label} />\n <span class=\"text-xs text-gray-500 dark:text-gray-400\">{status().label}</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 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\">{status().label}</span>\n </span>\n )\n}\n"],"names":["AVATAR_MAP","scales","chart","search","document","brain","shield","globe","robot","STATUS_CONFIG","idle","label","color","pulse","running","waiting","done","error","AgentCard","props","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$","_$effect","_p$","_v$","_v$2","e","_$className","t","_$setAttribute","undefined","AgentStatusBadge","_el$19","_tmpl$6","_el$20","_el$21","_el$22","agentName"],"mappings":"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"}
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":"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"}
@@ -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>&rarr;</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 || `${c().itemCount} items`);
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\">&rarr;</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 || `${c().itemCount} items`}\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","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$"],"mappings":";;;;;AAcA,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,IAAIA,MAAMD,MAAME;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,MAI6BjB,UAAUI,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,mBAAAS,OAAA,MAEnClC,IAAI+B,WAAW,GAAG/B,EAAAA,EAAIgC,SAAS,QAAQ;AAAA,eAAAE;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAAf,OAAAC,IAAA;AAAAK,QAAAA,OAAAF,OAAA,MAOrB3B,UAAUI,IAAIM,GAAGoB,MAAM,CAAC;AAAAD,QAAAA,OAAAD,QAAA,MACqBxB,EAAAA,EAAIM,GAAGqB,IAAI;AAAA,WAAAnB;AAAAA,EAAA,GAAA;AAIvF;;"}
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\">&rarr;</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;AAE5D,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,mBAAmB,CAAA;CAC7B;AAaD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,kCAsCpD"}
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>&rarr;</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 || `${c().itemCount} items`);
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\">&rarr;</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 || `${c().itemCount} items`}\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","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$"],"mappings":";;;AAcA,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,IAAIA,MAAMD,MAAME;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,MAI6BjB,UAAUI,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,IAAI+B,WAAW,GAAG/B,EAAAA,EAAIgC,SAAS,QAAQ;AAAA,eAAAE;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAAf,OAAAC,IAAA;AAAAK,WAAAF,OAAA,MAOrB3B,UAAUI,IAAIM,GAAGoB,MAAM,CAAC;AAAAD,WAAAD,QAAA,MACqBxB,EAAAA,EAAIM,GAAGqB,IAAI;AAAA,WAAAnB;AAAAA,EAAA,GAAA;AAIvF;"}
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\">&rarr;</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
- 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>Download`);
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
- if (bytes < 1024) return `${bytes} B`;
17
- if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
18
- return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
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 || "Generated artifact", _el$1, _co$2);
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 `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\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 || 'Generated artifact'}\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 Download\n </a>\n </div>\n )\n}\n"],"names":["ArtifactRenderer","props","getIcon","params","mimeType","includes","formatSize","bytes","toFixed","_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","_$insert","filename","size","description","_$effect","_p$","_v$","safeUrl","url","_v$2","e","_$setAttribute","t","undefined"],"mappings":";;;;;AAWO,MAAMA,mBAAoEC,CAAAA,UAAU;AACvF,QAAMC,UAAUA,MAAM;;AAClB,SAAID,WAAME,OAAOC,aAAbH,mBAAuBI,SAAS,OAAQ,QAAO;AACnD,SAAIJ,WAAME,OAAOC,aAAbH,mBAAuBI,SAAS,QAAS,QAAO;AACpD,SAAIJ,WAAME,OAAOC,aAAbH,mBAAuBI,SAAS,OAAQ,QAAO;AACnD,WAAO;AAAA,EACX;AAEA,QAAMC,aAAaA,CAACC,UAAmB;AACnC,QAAI,CAACA,MAAO,QAAO;AACnB,QAAIA,QAAQ,KAAM,QAAO,GAAGA,KAAK;AACjC,QAAIA,QAAQ,OAAO,KAAM,QAAO,IAAIA,QAAQ,MAAMC,QAAQ,CAAC,CAAC;AAC5D,WAAO,IAAID,SAAS,OAAO,OAAOC,QAAQ,CAAC,CAAC;AAAA,EAChD;AAEA,UAAA,MAAA;AAAA,QAAAC,OAAAC,mBAAAC,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,QAAAA,OAAAd,OAIiBZ,OAAO;AAAA0B,QAAAA,OAAAX,OAAA,MAIHhB,MAAME,OAAO0B,QAAQ;AAAAD,eAAAV,OAAA,MAGrBZ,WAAWL,MAAME,OAAO2B,IAAI,GAACV,OAAAC,IAAA;AAAAO,eAAAV,OAAA,MAAKjB,MAAME,OAAO4B,eAAe,sBAAoBN,OAAAC,KAAA;AAAAM,QAAAA,OAAAC,CAAAA,QAAA;AAAA,UAAAC,MAMrFC,gBAAQlC,MAAME,OAAOiC,GAAG,GAACC,OACrBpC,MAAME,OAAO0B;AAAQK,cAAAD,IAAAK,KAAAC,IAAAA,aAAAZ,QAAA,QAAAM,IAAAK,IAAAJ,GAAA;AAAAG,eAAAJ,IAAAO,KAAAD,IAAAA,aAAAZ,QAAA,YAAAM,IAAAO,IAAAH,IAAA;AAAA,aAAAJ;AAAAA,IAAA,GAAA;AAAA,MAAAK,GAAAG;AAAAA,MAAAD,GAAAC;AAAAA,IAAAA,CAAA;AAAA,WAAAhC;AAAAA,EAAA,GAAA;AAU/C;;"}
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;AAGpC,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,CA2C3E,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
- 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>Download`);
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
- if (bytes < 1024) return `${bytes} B`;
15
- if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
16
- return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
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 || "Generated artifact", _el$1, _co$2);
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 `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\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 || 'Generated artifact'}\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 Download\n </a>\n </div>\n )\n}\n"],"names":["ArtifactRenderer","props","getIcon","params","mimeType","includes","formatSize","bytes","toFixed","_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","_$insert","filename","size","description","_$effect","_p$","_v$","safeUrl","url","_v$2","e","_$setAttribute","t","undefined"],"mappings":";;;AAWO,MAAMA,mBAAoEC,CAAAA,UAAU;AACvF,QAAMC,UAAUA,MAAM;;AAClB,SAAID,WAAME,OAAOC,aAAbH,mBAAuBI,SAAS,OAAQ,QAAO;AACnD,SAAIJ,WAAME,OAAOC,aAAbH,mBAAuBI,SAAS,QAAS,QAAO;AACpD,SAAIJ,WAAME,OAAOC,aAAbH,mBAAuBI,SAAS,OAAQ,QAAO;AACnD,WAAO;AAAA,EACX;AAEA,QAAMC,aAAaA,CAACC,UAAmB;AACnC,QAAI,CAACA,MAAO,QAAO;AACnB,QAAIA,QAAQ,KAAM,QAAO,GAAGA,KAAK;AACjC,QAAIA,QAAQ,OAAO,KAAM,QAAO,IAAIA,QAAQ,MAAMC,QAAQ,CAAC,CAAC;AAC5D,WAAO,IAAID,SAAS,OAAO,OAAOC,QAAQ,CAAC,CAAC;AAAA,EAChD;AAEA,UAAA,MAAA;AAAA,QAAAC,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,WAAAd,OAIiBZ,OAAO;AAAA0B,WAAAX,OAAA,MAIHhB,MAAME,OAAO0B,QAAQ;AAAAD,WAAAV,OAAA,MAGrBZ,WAAWL,MAAME,OAAO2B,IAAI,GAACV,OAAAC,IAAA;AAAAO,WAAAV,OAAA,MAAKjB,MAAME,OAAO4B,eAAe,sBAAoBN,OAAAC,KAAA;AAAAM,WAAAC,CAAAA,QAAA;AAAA,UAAAC,MAMrFC,QAAQlC,MAAME,OAAOiC,GAAG,GAACC,OACrBpC,MAAME,OAAO0B;AAAQK,cAAAD,IAAAK,KAAAC,aAAAZ,QAAA,QAAAM,IAAAK,IAAAJ,GAAA;AAAAG,eAAAJ,IAAAO,KAAAD,aAAAZ,QAAA,YAAAM,IAAAO,IAAAH,IAAA;AAAA,aAAAJ;AAAAA,IAAA,GAAA;AAAA,MAAAK,GAAAG;AAAAA,MAAAD,GAAAC;AAAAA,IAAAA,CAAA;AAAA,WAAAhC;AAAAA,EAAA,GAAA;AAU/C;"}
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
- 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> to navigate, <kbd style="background-color:#e5e7eb;padding:1px 4px;border-radius:2px;font-family:inherit;font-size:0.7rem">Enter</kbd> to select, <kbd style="background-color:#e5e7eb;padding:1px 4px;border-radius:2px;font-family:inherit;font-size:0.7rem">Esc</kbd> to dismiss`), _tmpl$9 = /* @__PURE__ */ web.template(`<div role=listbox aria-label=Suggestions><!$><!/><!$><!/><!$><!/><!$><!/>`), _tmpl$0 = /* @__PURE__ */ web.template(`<li role=option style="padding:8px 16px;font-size:0.875rem;transition:background-color 150ms ease">`);
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$24 = _el$1.firstChild, [_el$25, _co$4] = web.getNextMarker(_el$24.nextSibling), _el$26 = _el$25.nextSibling, [_el$27, _co$5] = web.getNextMarker(_el$26.nextSibling), _el$28 = _el$27.nextSibling, [_el$29, _co$6] = web.getNextMarker(_el$28.nextSibling), _el$30 = _el$29.nextSibling, [_el$31, _co$7] = web.getNextMarker(_el$30.nextSibling);
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 || "Loading...", _el$13, _co$3);
93
+ web.insert(_el$10, () => props.loadingMessage || strings.autocompleteLoading, _el$13, _co$3);
92
94
  return _el$10;
93
95
  }
94
- }), _el$25, _co$4);
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 || "No suggestions found");
103
+ web.insert(_el$14, () => props.emptyMessage || strings.autocompleteEmpty);
102
104
  return _el$14;
103
105
  }
104
- }), _el$27, _co$5);
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$32 = web.getNextElement(_tmpl$0);
120
- _el$32.addEventListener("mouseenter", () => {
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$32.$$click = () => {
128
+ _el$36.$$click = () => {
127
129
  if (!isDisabled()) {
128
130
  props.onSelect(option);
129
131
  }
130
132
  };
131
- web.insert(_el$32, web.createComponent(solidJs.Show, {
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$3 = isSelected(), _v$4 = isDisabled(), _v$5 = `mcp-autocomplete-option ${isSelected() ? "mcp-autocomplete-option-selected" : ""} ${isDisabled() ? "mcp-autocomplete-option-disabled" : ""}`, _v$6 = isDisabled() ? "not-allowed" : "pointer", _v$7 = isSelected() ? "#eff6ff" : "transparent", _v$8 = isDisabled() ? "#9ca3af" : "#374151";
152
- _v$3 !== _p$.e && web.setAttribute(_el$32, "aria-selected", _p$.e = _v$3);
153
- _v$4 !== _p$.t && web.setAttribute(_el$32, "aria-disabled", _p$.t = _v$4);
154
- _v$5 !== _p$.a && web.className(_el$32, _p$.a = _v$5);
155
- _v$6 !== _p$.o && web.setStyleProperty(_el$32, "cursor", _p$.o = _v$6);
156
- _v$7 !== _p$.i && web.setStyleProperty(_el$32, "background-color", _p$.i = _v$7);
157
- _v$8 !== _p$.n && web.setStyleProperty(_el$32, "color", _p$.n = _v$8);
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$32;
170
+ return _el$36;
169
171
  })();
170
172
  }
171
173
  }));
172
174
  return _el$15;
173
175
  }
174
- }), _el$29, _co$6);
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$20 = _el$19.nextSibling, _el$21 = _el$20.nextSibling, _el$22 = _el$21.nextSibling;
181
- _el$22.nextSibling;
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$31, _co$7);
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
  }