@seed-ship/mcp-ui-solid 6.19.1 → 6.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/CHANGELOG.md +663 -0
  2. package/README.md +911 -4
  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/IframeFallbackLink.cjs +37 -0
  111. package/dist/components/IframeFallbackLink.cjs.map +1 -0
  112. package/dist/components/IframeFallbackLink.d.ts +23 -0
  113. package/dist/components/IframeFallbackLink.d.ts.map +1 -0
  114. package/dist/components/IframeFallbackLink.js +37 -0
  115. package/dist/components/IframeFallbackLink.js.map +1 -0
  116. package/dist/components/ImageGalleryRenderer.cjs +13 -4
  117. package/dist/components/ImageGalleryRenderer.cjs.map +1 -1
  118. package/dist/components/ImageGalleryRenderer.d.ts.map +1 -1
  119. package/dist/components/ImageGalleryRenderer.js +13 -4
  120. package/dist/components/ImageGalleryRenderer.js.map +1 -1
  121. package/dist/components/LightboxOverlay.cjs +16 -8
  122. package/dist/components/LightboxOverlay.cjs.map +1 -1
  123. package/dist/components/LightboxOverlay.d.ts.map +1 -1
  124. package/dist/components/LightboxOverlay.js +17 -9
  125. package/dist/components/LightboxOverlay.js.map +1 -1
  126. package/dist/components/MapRenderer.cjs +59 -29
  127. package/dist/components/MapRenderer.cjs.map +1 -1
  128. package/dist/components/MapRenderer.d.ts +10 -2
  129. package/dist/components/MapRenderer.d.ts.map +1 -1
  130. package/dist/components/MapRenderer.js +60 -30
  131. package/dist/components/MapRenderer.js.map +1 -1
  132. package/dist/components/ModalRenderer.cjs +4 -1
  133. package/dist/components/ModalRenderer.cjs.map +1 -1
  134. package/dist/components/ModalRenderer.d.ts.map +1 -1
  135. package/dist/components/ModalRenderer.js +5 -2
  136. package/dist/components/ModalRenderer.js.map +1 -1
  137. package/dist/components/ScratchpadPanel.cjs +578 -535
  138. package/dist/components/ScratchpadPanel.cjs.map +1 -1
  139. package/dist/components/ScratchpadPanel.d.ts.map +1 -1
  140. package/dist/components/ScratchpadPanel.js +578 -535
  141. package/dist/components/ScratchpadPanel.js.map +1 -1
  142. package/dist/components/StreamingUIRenderer.cjs +92 -28
  143. package/dist/components/StreamingUIRenderer.cjs.map +1 -1
  144. package/dist/components/StreamingUIRenderer.d.ts.map +1 -1
  145. package/dist/components/StreamingUIRenderer.js +92 -28
  146. package/dist/components/StreamingUIRenderer.js.map +1 -1
  147. package/dist/components/UIResourceRenderer.cjs +481 -365
  148. package/dist/components/UIResourceRenderer.cjs.map +1 -1
  149. package/dist/components/UIResourceRenderer.d.ts +21 -0
  150. package/dist/components/UIResourceRenderer.d.ts.map +1 -1
  151. package/dist/components/UIResourceRenderer.js +484 -368
  152. package/dist/components/UIResourceRenderer.js.map +1 -1
  153. package/dist/components/VerifiedText.cjs +39 -20
  154. package/dist/components/VerifiedText.cjs.map +1 -1
  155. package/dist/components/VerifiedText.d.ts +2 -1
  156. package/dist/components/VerifiedText.d.ts.map +1 -1
  157. package/dist/components/VerifiedText.js +39 -20
  158. package/dist/components/VerifiedText.js.map +1 -1
  159. package/dist/components/VideoRenderer.cjs +51 -20
  160. package/dist/components/VideoRenderer.cjs.map +1 -1
  161. package/dist/components/VideoRenderer.d.ts.map +1 -1
  162. package/dist/components/VideoRenderer.js +51 -20
  163. package/dist/components/VideoRenderer.js.map +1 -1
  164. package/dist/components/chart-data-table.cjs +38 -17
  165. package/dist/components/chart-data-table.cjs.map +1 -1
  166. package/dist/components/chart-data-table.d.ts +30 -1
  167. package/dist/components/chart-data-table.d.ts.map +1 -1
  168. package/dist/components/chart-data-table.js +38 -17
  169. package/dist/components/chart-data-table.js.map +1 -1
  170. package/dist/context/MCPActionContext.cjs +3 -1
  171. package/dist/context/MCPActionContext.cjs.map +1 -1
  172. package/dist/context/MCPActionContext.d.ts.map +1 -1
  173. package/dist/context/MCPActionContext.js +3 -1
  174. package/dist/context/MCPActionContext.js.map +1 -1
  175. package/dist/context/MCPUIConfigContext.cjs +29 -0
  176. package/dist/context/MCPUIConfigContext.cjs.map +1 -0
  177. package/dist/context/MCPUIConfigContext.d.ts +124 -0
  178. package/dist/context/MCPUIConfigContext.d.ts.map +1 -0
  179. package/dist/context/MCPUIConfigContext.js +29 -0
  180. package/dist/context/MCPUIConfigContext.js.map +1 -0
  181. package/dist/context/MCPUIStringsContext.cjs +287 -2
  182. package/dist/context/MCPUIStringsContext.cjs.map +1 -1
  183. package/dist/context/MCPUIStringsContext.d.ts +607 -3
  184. package/dist/context/MCPUIStringsContext.d.ts.map +1 -1
  185. package/dist/context/MCPUIStringsContext.js +287 -2
  186. package/dist/context/MCPUIStringsContext.js.map +1 -1
  187. package/dist/hooks/index.d.ts +2 -2
  188. package/dist/hooks/index.d.ts.map +1 -1
  189. package/dist/hooks/useStreamingUI.cjs +28 -10
  190. package/dist/hooks/useStreamingUI.cjs.map +1 -1
  191. package/dist/hooks/useStreamingUI.d.ts +37 -0
  192. package/dist/hooks/useStreamingUI.d.ts.map +1 -1
  193. package/dist/hooks/useStreamingUI.js +28 -10
  194. package/dist/hooks/useStreamingUI.js.map +1 -1
  195. package/dist/hooks.cjs +1 -0
  196. package/dist/hooks.cjs.map +1 -1
  197. package/dist/hooks.js +2 -1
  198. package/dist/index.cjs +29 -8
  199. package/dist/index.cjs.map +1 -1
  200. package/dist/index.d.cts +12 -4
  201. package/dist/index.d.ts +12 -4
  202. package/dist/index.d.ts.map +1 -1
  203. package/dist/index.js +24 -3
  204. package/dist/index.js.map +1 -1
  205. package/dist/services/index.d.ts +1 -1
  206. package/dist/services/index.d.ts.map +1 -1
  207. package/dist/services/validation.cjs +52 -26
  208. package/dist/services/validation.cjs.map +1 -1
  209. package/dist/services/validation.d.ts +67 -2
  210. package/dist/services/validation.d.ts.map +1 -1
  211. package/dist/services/validation.js +52 -26
  212. package/dist/services/validation.js.map +1 -1
  213. package/dist/utils/degraded-projections.cjs +37 -12
  214. package/dist/utils/degraded-projections.cjs.map +1 -1
  215. package/dist/utils/degraded-projections.d.ts +39 -3
  216. package/dist/utils/degraded-projections.d.ts.map +1 -1
  217. package/dist/utils/degraded-projections.js +37 -12
  218. package/dist/utils/degraded-projections.js.map +1 -1
  219. package/dist/utils/format-string.cjs +10 -0
  220. package/dist/utils/format-string.cjs.map +1 -0
  221. package/dist/utils/format-string.d.ts +26 -0
  222. package/dist/utils/format-string.d.ts.map +1 -0
  223. package/dist/utils/format-string.js +10 -0
  224. package/dist/utils/format-string.js.map +1 -0
  225. package/dist/utils/iframe-coep.cjs +30 -0
  226. package/dist/utils/iframe-coep.cjs.map +1 -0
  227. package/dist/utils/iframe-coep.d.ts +46 -0
  228. package/dist/utils/iframe-coep.d.ts.map +1 -0
  229. package/dist/utils/iframe-coep.js +30 -0
  230. package/dist/utils/iframe-coep.js.map +1 -0
  231. package/dist/validation.cjs +5 -0
  232. package/dist/validation.cjs.map +1 -1
  233. package/dist/validation.d.cts +2 -1
  234. package/dist/validation.d.ts +2 -1
  235. package/dist/validation.d.ts.map +1 -1
  236. package/dist/validation.js +6 -1
  237. package/package.json +1 -1
  238. package/src/adapters/connector.ts +58 -4
  239. package/src/adapters/index.ts +12 -2
  240. package/src/adapters/macro-run.ts +71 -11
  241. package/src/components/ActionGroupRenderer.tsx +3 -1
  242. package/src/components/AgentCard.tsx +27 -9
  243. package/src/components/AgentHandoff.tsx +4 -1
  244. package/src/components/ArtifactRenderer.tsx +17 -5
  245. package/src/components/AutocompleteDropdown.tsx +8 -6
  246. package/src/components/AutocompleteFormField.tsx +5 -1
  247. package/src/components/BriefingDiff.tsx +11 -3
  248. package/src/components/CarouselRenderer.tsx +4 -2
  249. package/src/components/ChartJSRenderer.tsx +18 -9
  250. package/src/components/ChatPrompt.tsx +13 -8
  251. package/src/components/CodeBlockRenderer.tsx +12 -10
  252. package/src/components/DataPreviewSection.tsx +92 -26
  253. package/src/components/DegradedFallback.tsx +4 -2
  254. package/src/components/FooterRenderer.tsx +3 -1
  255. package/src/components/FormFieldRenderer.tsx +34 -19
  256. package/src/components/FormRenderer.tsx +38 -10
  257. package/src/components/GenerativeUIErrorBoundary.tsx +8 -3
  258. package/src/components/GraphRenderer.tsx +31 -16
  259. package/src/components/IframeFallbackLink.tsx +57 -0
  260. package/src/components/ImageGalleryRenderer.tsx +8 -4
  261. package/src/components/LightboxOverlay.tsx +6 -4
  262. package/src/components/MapRenderer.tsx +57 -20
  263. package/src/components/ModalRenderer.tsx +3 -1
  264. package/src/components/ScratchpadPanel.tsx +95 -44
  265. package/src/components/StreamingUIRenderer.tsx +41 -11
  266. package/src/components/UIResourceRenderer.tsx +176 -67
  267. package/src/components/VerifiedText.tsx +19 -9
  268. package/src/components/VideoRenderer.tsx +26 -4
  269. package/src/components/chart-data-table.ts +68 -14
  270. package/src/context/MCPActionContext.tsx +4 -1
  271. package/src/context/MCPUIConfigContext.tsx +151 -0
  272. package/src/context/MCPUIStringsContext.tsx +1014 -1
  273. package/src/hooks/index.ts +2 -1
  274. package/src/hooks/useStreamingUI.ts +64 -10
  275. package/src/index.ts +38 -0
  276. package/src/services/index.ts +1 -0
  277. package/src/services/validation.ts +131 -32
  278. package/src/solid-jsx-attrs.d.ts +24 -0
  279. package/src/utils/degraded-projections.ts +75 -12
  280. package/src/utils/format-string.ts +33 -0
  281. package/src/utils/iframe-coep.ts +74 -0
  282. package/src/validation.ts +9 -0
@@ -88,7 +88,16 @@ function resultSectionType(componentType) {
88
88
  return "data";
89
89
  }
90
90
  }
91
- function buildError(run) {
91
+ const DEFAULT_MACRO_RUN_MESSAGES = {
92
+ agentSectionTitle: "Agent",
93
+ progressSectionTitle: "Progress",
94
+ resultSectionTitle: "Result",
95
+ runAborted: "Macro run aborted.",
96
+ runFailed: "Macro run failed.",
97
+ confirmDefault: "Please confirm to continue."
98
+ };
99
+ const withMessages = (options = {}) => ({ ...DEFAULT_MACRO_RUN_MESSAGES, ...options.messages });
100
+ function buildError(run, messages) {
92
101
  if (run.status !== "failed" && run.status !== "aborted") return void 0;
93
102
  const aborted = run.status === "aborted";
94
103
  if (run.error) {
@@ -101,15 +110,16 @@ function buildError(run) {
101
110
  return err;
102
111
  }
103
112
  return {
104
- message: aborted ? "Macro run aborted." : "Macro run failed.",
113
+ message: aborted ? messages.runAborted : messages.runFailed,
105
114
  retryable: false
106
115
  };
107
116
  }
108
- function macroRunToScratchpadState(run) {
117
+ function macroRunToScratchpadState(run, options = {}) {
118
+ const messages = withMessages(options);
109
119
  const sections = [];
110
120
  sections.push({
111
121
  id: "macro-agent",
112
- title: "Agent",
122
+ title: messages.agentSectionTitle,
113
123
  type: "agent_card",
114
124
  content: buildAgentCard(run),
115
125
  editable: false,
@@ -120,14 +130,14 @@ function macroRunToScratchpadState(run) {
120
130
  sections.push(
121
131
  hasParallel ? {
122
132
  id: "macro-split-stepper",
123
- title: "Progress",
133
+ title: messages.progressSectionTitle,
124
134
  type: "split_stepper",
125
135
  content: buildSplitStepperContent(run.steps),
126
136
  editable: false,
127
137
  source: "agent"
128
138
  } : {
129
139
  id: "macro-stepper",
130
- title: "Progress",
140
+ title: messages.progressSectionTitle,
131
141
  type: "stepper",
132
142
  content: buildStepperContent(run.steps),
133
143
  editable: false,
@@ -140,7 +150,7 @@ function macroRunToScratchpadState(run) {
140
150
  id: "macro-prompt",
141
151
  title: run.pendingInterrogation.title,
142
152
  type: "prompt",
143
- content: macroInterrogationToChatPromptConfig(run.pendingInterrogation),
153
+ content: macroInterrogationToChatPromptConfig(run.pendingInterrogation, options),
144
154
  editable: false,
145
155
  source: "agent"
146
156
  });
@@ -149,7 +159,7 @@ function macroRunToScratchpadState(run) {
149
159
  results.forEach((component, index) => {
150
160
  sections.push({
151
161
  id: `macro-result-${String((component == null ? void 0 : component.id) ?? index)}`,
152
- title: "Result",
162
+ title: messages.resultSectionTitle,
153
163
  type: resultSectionType(component == null ? void 0 : component.type),
154
164
  content: component,
155
165
  editable: false,
@@ -164,7 +174,7 @@ function macroRunToScratchpadState(run) {
164
174
  agentMessages: [],
165
175
  status: RUN_STATUS_TO_SCRATCHPAD[run.status]
166
176
  };
167
- const error = buildError(run);
177
+ const error = buildError(run, messages);
168
178
  if (error) state.error = error;
169
179
  return state;
170
180
  }
@@ -173,11 +183,12 @@ function isElicitationSchema(value) {
173
183
  const v = value;
174
184
  return v.type === "object" && typeof v.properties === "object" && v.properties !== null;
175
185
  }
176
- function macroInterrogationToChatPromptConfig(q) {
186
+ function macroInterrogationToChatPromptConfig(q, options = {}) {
177
187
  var _a, _b, _c;
188
+ const messages = withMessages(options);
178
189
  switch (q.kind) {
179
190
  case "choice": {
180
- const options = (q.options ?? []).map((o) => {
191
+ const options2 = (q.options ?? []).map((o) => {
181
192
  const opt = { value: o.value, label: o.label };
182
193
  if (o.icon) opt.icon = o.icon;
183
194
  if (o.description) opt.description = o.description;
@@ -187,7 +198,7 @@ function macroInterrogationToChatPromptConfig(q) {
187
198
  return {
188
199
  type: "choice",
189
200
  title: q.title,
190
- config: { options, layout: "vertical" }
201
+ config: { options: options2, layout: "vertical" }
191
202
  };
192
203
  }
193
204
  case "confirm": {
@@ -214,12 +225,13 @@ function macroInterrogationToChatPromptConfig(q) {
214
225
  return {
215
226
  type: "confirm",
216
227
  title: q.title,
217
- config: { message: q.message ?? "Please confirm to continue." }
228
+ config: { message: q.message ?? messages.confirmDefault }
218
229
  };
219
230
  }
220
231
  }
221
232
  }
222
233
  export {
234
+ DEFAULT_MACRO_RUN_MESSAGES,
223
235
  macroInterrogationToChatPromptConfig,
224
236
  macroRunToScratchpadState
225
237
  };
@@ -1 +1 @@
1
- {"version":3,"file":"macro-run.js","sources":["../../src/adapters/macro-run.ts"],"sourcesContent":["/**\n * MacroRun adapters — `MacroRunV1` / `MacroInterrogationV1` → MCP-UI render\n * primitives.\n *\n * @since v6.7.0 (MacroRun Phase 2 — contract consolidated in deposium_MCPs\n * `docs/2026/briefs/2026-05-22-macro-run-runtime-contract-consolidation.md`)\n *\n * ## Opt-in, pure\n *\n * Published under the dedicated subpath `@seed-ship/mcp-ui-solid/adapters` —\n * never imported by the core renderer path. Every function here is a **pure\n * function**: same input → same output, no `fetch`, no SSE listener, no\n * persistence, no global state, no clock, no randomness.\n *\n * ## Scope boundary\n *\n * These adapters only translate the agnostic `MacroRunV1` contract (defined\n * in `@seed-ship/mcp-ui-spec`) into existing MCP-UI primitives — a\n * `ScratchpadState` and a `ChatPromptConfig`. They do NOT:\n *\n * - emit or consume any SSE event (a `macro_run_snapshot` producer is a\n * separate, later goal on the producing runtime repo);\n * - perform any fetch, persistence or resume;\n * - know anything about a specific runtime, host, corpus or domain;\n * - touch the `action:'submit'` executors, nor mix MacroRun with the\n * existing tool-call action path.\n *\n * The host owns all of the above — it feeds a `MacroRunV1` snapshot in and\n * decides where to render the result.\n */\n\nimport type { MacroRunV1, MacroStepV1, MacroInterrogationV1 } from '@seed-ship/mcp-ui-spec';\nimport type {\n ScratchpadState,\n ScratchpadSection,\n ChatPromptConfig,\n ChoiceOption,\n ConfirmPromptConfig,\n AgentCardContent,\n SplitStepperContent,\n ElicitationRequestedSchema,\n FormPromptConfig,\n} from '../types/chat-bus';\nimport { elicitationToPromptConfig } from '../services/chat-bus';\n\n// ─── Status mappings ─────────────────────────────────────────\n\n/**\n * Run status → top-level `ScratchpadState` status. `aborted` and `failed`\n * both surface as `error` (an aborted run is additionally non-retryable —\n * see `buildError`).\n */\nconst RUN_STATUS_TO_SCRATCHPAD: Record<MacroRunV1['status'], ScratchpadState['status']> = {\n pending: 'loading',\n running: 'processing',\n awaiting_input: 'waiting_human',\n completed: 'complete',\n failed: 'error',\n aborted: 'error',\n};\n\n/** Run status → `AgentCardContent` status, used when the run carries no agent. */\nfunction runStatusToAgentStatus(status: MacroRunV1['status']): AgentCardContent['status'] {\n switch (status) {\n case 'pending':\n return 'idle';\n case 'running':\n return 'running';\n case 'awaiting_input':\n return 'waiting';\n case 'completed':\n return 'done';\n case 'failed':\n case 'aborted':\n return 'error';\n }\n}\n\n/**\n * Step status → stepper status. The MCP-UI stepper primitive renders\n * `failed` as `error`; every other value passes through unchanged.\n */\nfunction stepToStepperStatus(\n status: MacroStepV1['status']\n): 'pending' | 'active' | 'done' | 'skipped' | 'error' {\n return status === 'failed' ? 'error' : status;\n}\n\n// ─── Section builders ────────────────────────────────────────\n\ninterface StepperSectionContent {\n steps: Array<{\n id: string;\n label: string;\n status: 'pending' | 'active' | 'done' | 'skipped' | 'error';\n summary?: string;\n duration_ms?: number;\n }>;\n orientation: 'horizontal' | 'vertical';\n}\n\nfunction buildAgentCard(run: MacroRunV1): AgentCardContent {\n const agent = run.agent;\n const card: AgentCardContent = {\n agentId: agent?.id ?? run.macroId,\n name: agent?.name ?? run.macroName ?? run.macroId,\n status: agent?.status ?? runStatusToAgentStatus(run.status),\n };\n if (agent?.avatar) card.avatar = agent.avatar;\n if (agent?.capabilities) card.capabilities = agent.capabilities;\n if (agent?.currentStep) card.currentStep = agent.currentStep;\n return card;\n}\n\nfunction buildStepperContent(steps: MacroStepV1[]): StepperSectionContent {\n return {\n orientation: 'horizontal',\n steps: steps.map((step) => {\n const out: StepperSectionContent['steps'][number] = {\n id: step.id,\n label: step.label,\n status: stepToStepperStatus(step.status),\n };\n if (step.summary) out.summary = step.summary;\n if (typeof step.durationMs === 'number') out.duration_ms = step.durationMs;\n return out;\n }),\n };\n}\n\n/** Collapse a set of sub-step statuses into a single parallel-lane status. */\nfunction laneStatus(subSteps: MacroStepV1[]): 'done' | 'active' | 'pending' | 'error' {\n if (subSteps.some((s) => s.status === 'failed')) return 'error';\n if (subSteps.some((s) => s.status === 'active')) return 'active';\n if (subSteps.length > 0 && subSteps.every((s) => s.status === 'done' || s.status === 'skipped'))\n return 'done';\n return 'pending';\n}\n\n/**\n * Build a `split_stepper` content from steps that carry `parallel` branches.\n * Each top-level step becomes a lane: a step with `parallel` sub-steps shows\n * those sub-steps; a step without falls back to a single-step lane.\n */\nfunction buildSplitStepperContent(steps: MacroStepV1[]): SplitStepperContent {\n return {\n agents: steps.map((step) => {\n const subSteps = step.parallel && step.parallel.length > 0 ? step.parallel : [step];\n return {\n id: step.id,\n name: step.label,\n status: laneStatus(subSteps),\n steps: subSteps.map((sub) => ({\n id: sub.id,\n label: sub.label,\n status: stepToStepperStatus(sub.status),\n })),\n };\n }),\n };\n}\n\n/** Component `type` → the closest `ScratchpadSection` type for a result. */\nfunction resultSectionType(componentType: unknown): ScratchpadSection['type'] {\n switch (componentType) {\n case 'chart':\n return 'chart';\n case 'map':\n return 'map';\n case 'table':\n return 'data_preview';\n default:\n return 'data';\n }\n}\n\nfunction buildError(run: MacroRunV1): ScratchpadState['error'] | undefined {\n if (run.status !== 'failed' && run.status !== 'aborted') return undefined;\n const aborted = run.status === 'aborted';\n if (run.error) {\n const err: NonNullable<ScratchpadState['error']> = {\n message: run.error.message,\n // An aborted run is never retryable, regardless of the producer flag.\n retryable: aborted ? false : (run.error.retryable ?? false),\n };\n if (run.error.code) err.code = run.error.code;\n return err;\n }\n return {\n message: aborted ? 'Macro run aborted.' : 'Macro run failed.',\n retryable: false,\n };\n}\n\n// ─── macroRunToScratchpadState ───────────────────────────────\n\n/**\n * Convert a `MacroRunV1` snapshot into a `ScratchpadState`.\n *\n * Sections produced, in order:\n * 1. `agent_card` — always (derived from `run.agent`, or from the macro\n * identity when the run carries no agent, e.g. a non-interactive macro).\n * 2. `stepper` — when the run has steps and none carry `parallel` branches.\n * `split_stepper` instead when any step carries `parallel` (future model).\n * 3. `prompt` — when `run.pendingInterrogation` is set; its content is the\n * `ChatPromptConfig` produced by {@link macroInterrogationToChatPromptConfig}.\n * 4. one section per `run.results` entry (`chart` / `map` / `data_preview` /\n * `data`, by component type). Optional — the adapter works without results.\n *\n * Pure: no fetch, no SSE, no persistence. The host owns all wiring.\n */\nexport function macroRunToScratchpadState(run: MacroRunV1): ScratchpadState {\n const sections: ScratchpadSection[] = [];\n\n // 1. Agent card — always present.\n sections.push({\n id: 'macro-agent',\n title: 'Agent',\n type: 'agent_card',\n content: buildAgentCard(run),\n editable: false,\n source: 'agent',\n });\n\n // 2. Stepper / split_stepper — when there are steps.\n if (run.steps.length > 0) {\n const hasParallel = run.steps.some((s) => Array.isArray(s.parallel) && s.parallel.length > 0);\n sections.push(\n hasParallel\n ? {\n id: 'macro-split-stepper',\n title: 'Progress',\n type: 'split_stepper',\n content: buildSplitStepperContent(run.steps),\n editable: false,\n source: 'agent',\n }\n : {\n id: 'macro-stepper',\n title: 'Progress',\n type: 'stepper',\n content: buildStepperContent(run.steps),\n editable: false,\n source: 'agent',\n }\n );\n }\n\n // 3. Pending interrogation → a `prompt` section.\n if (run.pendingInterrogation) {\n sections.push({\n id: 'macro-prompt',\n title: run.pendingInterrogation.title,\n type: 'prompt',\n content: macroInterrogationToChatPromptConfig(run.pendingInterrogation),\n editable: false,\n source: 'agent',\n });\n }\n\n // 4. Result components → one section each (results are optional). A result\n // is a `UIComponent`-shaped object — passthrough, read loosely (the spec\n // validates the run envelope, the renderer validates each component).\n const results = run.results ?? [];\n results.forEach((component, index) => {\n sections.push({\n id: `macro-result-${String(component?.id ?? index)}`,\n title: 'Result',\n type: resultSectionType(component?.type),\n content: component,\n editable: false,\n source: 'agent',\n });\n });\n\n const state: ScratchpadState = {\n id: run.runId,\n title: run.title ?? run.macroName ?? run.macroId,\n sections,\n filters: {},\n agentMessages: [],\n status: RUN_STATUS_TO_SCRATCHPAD[run.status],\n };\n\n const error = buildError(run);\n if (error) state.error = error;\n\n return state;\n}\n\n// ─── macroInterrogationToChatPromptConfig ────────────────────\n\nfunction isElicitationSchema(value: unknown): value is ElicitationRequestedSchema {\n if (typeof value !== 'object' || value === null) return false;\n const v = value as { type?: unknown; properties?: unknown };\n return v.type === 'object' && typeof v.properties === 'object' && v.properties !== null;\n}\n\n/**\n * Convert a `MacroInterrogationV1` into a `ChatPromptConfig`.\n *\n * - `choice` → `{ type: 'choice' }` (vertical layout).\n * - `confirm` → `{ type: 'confirm' }`.\n * - `form` → `{ type: 'form' }` (the opaque `fields` are passed through).\n * - `elicitation` → routed through the existing `elicitationToPromptConfig()`\n * helper. If the interrogation carries no usable elicitation JSON Schema,\n * it degrades to a `confirm` prompt rather than throwing.\n *\n * Always returns a `ChatPromptConfig` — never an `ElicitationEvent` — so the\n * host has a single entry point. Usable standalone or via\n * {@link macroRunToScratchpadState} (which calls it for an embedded\n * `pendingInterrogation`).\n */\nexport function macroInterrogationToChatPromptConfig(q: MacroInterrogationV1): ChatPromptConfig {\n switch (q.kind) {\n case 'choice': {\n const options: ChoiceOption[] = (q.options ?? []).map((o) => {\n const opt: ChoiceOption = { value: o.value, label: o.label };\n if (o.icon) opt.icon = o.icon;\n if (o.description) opt.description = o.description;\n if (o.metadata) opt.metadata = o.metadata;\n return opt;\n });\n return {\n type: 'choice',\n title: q.title,\n config: { options, layout: 'vertical' },\n };\n }\n\n case 'confirm': {\n const config: ConfirmPromptConfig = {};\n if (q.message) config.message = q.message;\n if (q.confirm?.confirmLabel) config.confirmLabel = q.confirm.confirmLabel;\n if (q.confirm?.cancelLabel) config.cancelLabel = q.confirm.cancelLabel;\n if (q.confirm?.variant) config.variant = q.confirm.variant;\n return { type: 'confirm', title: q.title, config };\n }\n\n case 'form':\n return {\n type: 'form',\n title: q.title,\n config: { fields: (q.fields ?? []) as FormPromptConfig['fields'] },\n };\n\n case 'elicitation': {\n if (isElicitationSchema(q.elicitationSchema)) {\n return elicitationToPromptConfig({\n message: q.message ?? q.title,\n requestedSchema: q.elicitationSchema,\n });\n }\n // No usable schema — degrade gracefully instead of crashing.\n return {\n type: 'confirm',\n title: q.title,\n config: { message: q.message ?? 'Please confirm to continue.' },\n };\n }\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"macro-run.js","sources":["../../src/adapters/macro-run.ts"],"sourcesContent":["/**\n * MacroRun adapters — `MacroRunV1` / `MacroInterrogationV1` → MCP-UI render\n * primitives.\n *\n * @since v6.7.0 (MacroRun Phase 2 — contract consolidated in deposium_MCPs\n * `docs/2026/briefs/2026-05-22-macro-run-runtime-contract-consolidation.md`)\n *\n * ## Opt-in, pure\n *\n * Published under the dedicated subpath `@seed-ship/mcp-ui-solid/adapters` —\n * never imported by the core renderer path. Every function here is a **pure\n * function**: same input → same output, no `fetch`, no SSE listener, no\n * persistence, no global state, no clock, no randomness.\n *\n * ## Scope boundary\n *\n * These adapters only translate the agnostic `MacroRunV1` contract (defined\n * in `@seed-ship/mcp-ui-spec`) into existing MCP-UI primitives — a\n * `ScratchpadState` and a `ChatPromptConfig`. They do NOT:\n *\n * - emit or consume any SSE event (a `macro_run_snapshot` producer is a\n * separate, later goal on the producing runtime repo);\n * - perform any fetch, persistence or resume;\n * - know anything about a specific runtime, host, corpus or domain;\n * - touch the `action:'submit'` executors, nor mix MacroRun with the\n * existing tool-call action path.\n *\n * The host owns all of the above — it feeds a `MacroRunV1` snapshot in and\n * decides where to render the result.\n */\n\nimport type { MacroRunV1, MacroStepV1, MacroInterrogationV1 } from '@seed-ship/mcp-ui-spec';\nimport type {\n ScratchpadState,\n ScratchpadSection,\n ChatPromptConfig,\n ChoiceOption,\n ConfirmPromptConfig,\n AgentCardContent,\n SplitStepperContent,\n ElicitationRequestedSchema,\n FormPromptConfig,\n} from '../types/chat-bus';\nimport { elicitationToPromptConfig } from '../services/chat-bus';\n\n// ─── Status mappings ─────────────────────────────────────────\n\n/**\n * Run status → top-level `ScratchpadState` status. `aborted` and `failed`\n * both surface as `error` (an aborted run is additionally non-retryable —\n * see `buildError`).\n */\nconst RUN_STATUS_TO_SCRATCHPAD: Record<MacroRunV1['status'], ScratchpadState['status']> = {\n pending: 'loading',\n running: 'processing',\n awaiting_input: 'waiting_human',\n completed: 'complete',\n failed: 'error',\n aborted: 'error',\n};\n\n/** Run status → `AgentCardContent` status, used when the run carries no agent. */\nfunction runStatusToAgentStatus(status: MacroRunV1['status']): AgentCardContent['status'] {\n switch (status) {\n case 'pending':\n return 'idle';\n case 'running':\n return 'running';\n case 'awaiting_input':\n return 'waiting';\n case 'completed':\n return 'done';\n case 'failed':\n case 'aborted':\n return 'error';\n }\n}\n\n/**\n * Step status → stepper status. The MCP-UI stepper primitive renders\n * `failed` as `error`; every other value passes through unchanged.\n */\nfunction stepToStepperStatus(\n status: MacroStepV1['status']\n): 'pending' | 'active' | 'done' | 'skipped' | 'error' {\n return status === 'failed' ? 'error' : status;\n}\n\n// ─── Section builders ────────────────────────────────────────\n\ninterface StepperSectionContent {\n steps: Array<{\n id: string;\n label: string;\n status: 'pending' | 'active' | 'done' | 'skipped' | 'error';\n summary?: string;\n duration_ms?: number;\n }>;\n orientation: 'horizontal' | 'vertical';\n}\n\nfunction buildAgentCard(run: MacroRunV1): AgentCardContent {\n const agent = run.agent;\n const card: AgentCardContent = {\n agentId: agent?.id ?? run.macroId,\n name: agent?.name ?? run.macroName ?? run.macroId,\n status: agent?.status ?? runStatusToAgentStatus(run.status),\n };\n if (agent?.avatar) card.avatar = agent.avatar;\n if (agent?.capabilities) card.capabilities = agent.capabilities;\n if (agent?.currentStep) card.currentStep = agent.currentStep;\n return card;\n}\n\nfunction buildStepperContent(steps: MacroStepV1[]): StepperSectionContent {\n return {\n orientation: 'horizontal',\n steps: steps.map((step) => {\n const out: StepperSectionContent['steps'][number] = {\n id: step.id,\n label: step.label,\n status: stepToStepperStatus(step.status),\n };\n if (step.summary) out.summary = step.summary;\n if (typeof step.durationMs === 'number') out.duration_ms = step.durationMs;\n return out;\n }),\n };\n}\n\n/** Collapse a set of sub-step statuses into a single parallel-lane status. */\nfunction laneStatus(subSteps: MacroStepV1[]): 'done' | 'active' | 'pending' | 'error' {\n if (subSteps.some((s) => s.status === 'failed')) return 'error';\n if (subSteps.some((s) => s.status === 'active')) return 'active';\n if (subSteps.length > 0 && subSteps.every((s) => s.status === 'done' || s.status === 'skipped'))\n return 'done';\n return 'pending';\n}\n\n/**\n * Build a `split_stepper` content from steps that carry `parallel` branches.\n * Each top-level step becomes a lane: a step with `parallel` sub-steps shows\n * those sub-steps; a step without falls back to a single-step lane.\n */\nfunction buildSplitStepperContent(steps: MacroStepV1[]): SplitStepperContent {\n return {\n agents: steps.map((step) => {\n const subSteps = step.parallel && step.parallel.length > 0 ? step.parallel : [step];\n return {\n id: step.id,\n name: step.label,\n status: laneStatus(subSteps),\n steps: subSteps.map((sub) => ({\n id: sub.id,\n label: sub.label,\n status: stepToStepperStatus(sub.status),\n })),\n };\n }),\n };\n}\n\n/** Component `type` → the closest `ScratchpadSection` type for a result. */\nfunction resultSectionType(componentType: unknown): ScratchpadSection['type'] {\n switch (componentType) {\n case 'chart':\n return 'chart';\n case 'map':\n return 'map';\n case 'table':\n return 'data_preview';\n default:\n return 'data';\n }\n}\n\n/**\n * The English wording this adapter produces on its own — section titles and\n * the fallbacks used when the run (or the interrogation) carries none.\n *\n * The adapter is runtime-free by contract: no `solid-js`, no\n * `MCPUIStringsContext`. Hosts that render in another language pass a\n * partial override through `MacroRunAdapterOptions.messages`, exactly like\n * `ConnectorResultToUILayoutOptions.messages`.\n *\n * @since v6.20.0\n */\nexport interface MacroRunAdapterMessages {\n /** Title of the always-present `agent_card` section. */\n agentSectionTitle: string;\n /** Title of the `stepper` / `split_stepper` section. */\n progressSectionTitle: string;\n /** Title of each result section. */\n resultSectionTitle: string;\n /** Error message of an aborted run that carries no `error`. */\n runAborted: string;\n /** Error message of a failed run that carries no `error`. */\n runFailed: string;\n /** Prompt body of an elicitation with no usable schema and no message. */\n confirmDefault: string;\n}\n\n/** English defaults for {@link MacroRunAdapterMessages}. */\nexport const DEFAULT_MACRO_RUN_MESSAGES: MacroRunAdapterMessages = {\n agentSectionTitle: 'Agent',\n progressSectionTitle: 'Progress',\n resultSectionTitle: 'Result',\n runAborted: 'Macro run aborted.',\n runFailed: 'Macro run failed.',\n confirmDefault: 'Please confirm to continue.',\n};\n\n/** Options shared by the MacroRun adapters. @since v6.20.0 */\nexport interface MacroRunAdapterOptions {\n /**\n * Partial override of the adapter's own wording, merged over\n * {@link DEFAULT_MACRO_RUN_MESSAGES}.\n */\n messages?: Partial<MacroRunAdapterMessages>;\n}\n\nconst withMessages = (\n options: MacroRunAdapterOptions = {}\n): MacroRunAdapterMessages => ({ ...DEFAULT_MACRO_RUN_MESSAGES, ...options.messages });\n\nfunction buildError(\n run: MacroRunV1,\n messages: MacroRunAdapterMessages\n): ScratchpadState['error'] | undefined {\n if (run.status !== 'failed' && run.status !== 'aborted') return undefined;\n const aborted = run.status === 'aborted';\n if (run.error) {\n const err: NonNullable<ScratchpadState['error']> = {\n message: run.error.message,\n // An aborted run is never retryable, regardless of the producer flag.\n retryable: aborted ? false : (run.error.retryable ?? false),\n };\n if (run.error.code) err.code = run.error.code;\n return err;\n }\n return {\n message: aborted ? messages.runAborted : messages.runFailed,\n retryable: false,\n };\n}\n\n// ─── macroRunToScratchpadState ───────────────────────────────\n\n/**\n * Convert a `MacroRunV1` snapshot into a `ScratchpadState`.\n *\n * Sections produced, in order:\n * 1. `agent_card` — always (derived from `run.agent`, or from the macro\n * identity when the run carries no agent, e.g. a non-interactive macro).\n * 2. `stepper` — when the run has steps and none carry `parallel` branches.\n * `split_stepper` instead when any step carries `parallel` (future model).\n * 3. `prompt` — when `run.pendingInterrogation` is set; its content is the\n * `ChatPromptConfig` produced by {@link macroInterrogationToChatPromptConfig}.\n * 4. one section per `run.results` entry (`chart` / `map` / `data_preview` /\n * `data`, by component type). Optional — the adapter works without results.\n *\n * Pure: no fetch, no SSE, no persistence. The host owns all wiring.\n */\nexport function macroRunToScratchpadState(\n run: MacroRunV1,\n options: MacroRunAdapterOptions = {}\n): ScratchpadState {\n const messages = withMessages(options);\n const sections: ScratchpadSection[] = [];\n\n // 1. Agent card — always present.\n sections.push({\n id: 'macro-agent',\n title: messages.agentSectionTitle,\n type: 'agent_card',\n content: buildAgentCard(run),\n editable: false,\n source: 'agent',\n });\n\n // 2. Stepper / split_stepper — when there are steps.\n if (run.steps.length > 0) {\n const hasParallel = run.steps.some((s) => Array.isArray(s.parallel) && s.parallel.length > 0);\n sections.push(\n hasParallel\n ? {\n id: 'macro-split-stepper',\n title: messages.progressSectionTitle,\n type: 'split_stepper',\n content: buildSplitStepperContent(run.steps),\n editable: false,\n source: 'agent',\n }\n : {\n id: 'macro-stepper',\n title: messages.progressSectionTitle,\n type: 'stepper',\n content: buildStepperContent(run.steps),\n editable: false,\n source: 'agent',\n }\n );\n }\n\n // 3. Pending interrogation → a `prompt` section.\n if (run.pendingInterrogation) {\n sections.push({\n id: 'macro-prompt',\n title: run.pendingInterrogation.title,\n type: 'prompt',\n content: macroInterrogationToChatPromptConfig(run.pendingInterrogation, options),\n editable: false,\n source: 'agent',\n });\n }\n\n // 4. Result components → one section each (results are optional). A result\n // is a `UIComponent`-shaped object — passthrough, read loosely (the spec\n // validates the run envelope, the renderer validates each component).\n const results = run.results ?? [];\n results.forEach((component, index) => {\n sections.push({\n id: `macro-result-${String(component?.id ?? index)}`,\n title: messages.resultSectionTitle,\n type: resultSectionType(component?.type),\n content: component,\n editable: false,\n source: 'agent',\n });\n });\n\n const state: ScratchpadState = {\n id: run.runId,\n title: run.title ?? run.macroName ?? run.macroId,\n sections,\n filters: {},\n agentMessages: [],\n status: RUN_STATUS_TO_SCRATCHPAD[run.status],\n };\n\n const error = buildError(run, messages);\n if (error) state.error = error;\n\n return state;\n}\n\n// ─── macroInterrogationToChatPromptConfig ────────────────────\n\nfunction isElicitationSchema(value: unknown): value is ElicitationRequestedSchema {\n if (typeof value !== 'object' || value === null) return false;\n const v = value as { type?: unknown; properties?: unknown };\n return v.type === 'object' && typeof v.properties === 'object' && v.properties !== null;\n}\n\n/**\n * Convert a `MacroInterrogationV1` into a `ChatPromptConfig`.\n *\n * - `choice` → `{ type: 'choice' }` (vertical layout).\n * - `confirm` → `{ type: 'confirm' }`.\n * - `form` → `{ type: 'form' }` (the opaque `fields` are passed through).\n * - `elicitation` → routed through the existing `elicitationToPromptConfig()`\n * helper. If the interrogation carries no usable elicitation JSON Schema,\n * it degrades to a `confirm` prompt rather than throwing.\n *\n * Always returns a `ChatPromptConfig` — never an `ElicitationEvent` — so the\n * host has a single entry point. Usable standalone or via\n * {@link macroRunToScratchpadState} (which calls it for an embedded\n * `pendingInterrogation`).\n */\nexport function macroInterrogationToChatPromptConfig(\n q: MacroInterrogationV1,\n options: MacroRunAdapterOptions = {}\n): ChatPromptConfig {\n const messages = withMessages(options);\n switch (q.kind) {\n case 'choice': {\n const options: ChoiceOption[] = (q.options ?? []).map((o) => {\n const opt: ChoiceOption = { value: o.value, label: o.label };\n if (o.icon) opt.icon = o.icon;\n if (o.description) opt.description = o.description;\n if (o.metadata) opt.metadata = o.metadata;\n return opt;\n });\n return {\n type: 'choice',\n title: q.title,\n config: { options, layout: 'vertical' },\n };\n }\n\n case 'confirm': {\n const config: ConfirmPromptConfig = {};\n if (q.message) config.message = q.message;\n if (q.confirm?.confirmLabel) config.confirmLabel = q.confirm.confirmLabel;\n if (q.confirm?.cancelLabel) config.cancelLabel = q.confirm.cancelLabel;\n if (q.confirm?.variant) config.variant = q.confirm.variant;\n return { type: 'confirm', title: q.title, config };\n }\n\n case 'form':\n return {\n type: 'form',\n title: q.title,\n config: { fields: (q.fields ?? []) as FormPromptConfig['fields'] },\n };\n\n case 'elicitation': {\n if (isElicitationSchema(q.elicitationSchema)) {\n return elicitationToPromptConfig({\n message: q.message ?? q.title,\n requestedSchema: q.elicitationSchema,\n });\n }\n // No usable schema — degrade gracefully instead of crashing.\n return {\n type: 'confirm',\n title: q.title,\n config: { message: q.message ?? messages.confirmDefault },\n };\n }\n }\n}\n"],"names":["options"],"mappings":"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"}
package/dist/adapters.cjs CHANGED
@@ -3,8 +3,10 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const connector = require("./adapters/connector.cjs");
4
4
  const macroRun = require("./adapters/macro-run.cjs");
5
5
  const adapters_presentation = require("./adapters/presentation.cjs");
6
+ exports.DEFAULT_CONNECTOR_MESSAGES = connector.DEFAULT_CONNECTOR_MESSAGES;
6
7
  exports.connectorActionsToActionGroup = connector.connectorActionsToActionGroup;
7
8
  exports.connectorResultToUILayout = connector.connectorResultToUILayout;
9
+ exports.DEFAULT_MACRO_RUN_MESSAGES = macroRun.DEFAULT_MACRO_RUN_MESSAGES;
8
10
  exports.macroInterrogationToChatPromptConfig = macroRun.macroInterrogationToChatPromptConfig;
9
11
  exports.macroRunToScratchpadState = macroRun.macroRunToScratchpadState;
10
12
  exports.createComparisonLayout = adapters_presentation.createComparisonLayout;
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
1
+ {"version":3,"file":"adapters.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;"}
package/dist/adapters.js CHANGED
@@ -1,7 +1,9 @@
1
- import { connectorActionsToActionGroup, connectorResultToUILayout } from "./adapters/connector.js";
2
- import { macroInterrogationToChatPromptConfig, macroRunToScratchpadState } from "./adapters/macro-run.js";
1
+ import { DEFAULT_CONNECTOR_MESSAGES, connectorActionsToActionGroup, connectorResultToUILayout } from "./adapters/connector.js";
2
+ import { DEFAULT_MACRO_RUN_MESSAGES, macroInterrogationToChatPromptConfig, macroRunToScratchpadState } from "./adapters/macro-run.js";
3
3
  import { createComparisonLayout, createEvidenceLayout, createGeographyLayout } from "./adapters/presentation.js";
4
4
  export {
5
+ DEFAULT_CONNECTOR_MESSAGES,
6
+ DEFAULT_MACRO_RUN_MESSAGES,
5
7
  connectorActionsToActionGroup,
6
8
  connectorResultToUILayout,
7
9
  createComparisonLayout,
@@ -4,6 +4,7 @@ const web = require("solid-js/web");
4
4
  const solidJs = require("solid-js");
5
5
  const useAction = require("../hooks/useAction.cjs");
6
6
  const safeUrl = require("../utils/safe-url.cjs");
7
+ const MCPUIStringsContext = require("../context/MCPUIStringsContext.cjs");
7
8
  var _tmpl$ = /* @__PURE__ */ web.template(`<span class=text-current>`), _tmpl$2 = /* @__PURE__ */ web.template(`<a target=_blank rel="noopener noreferrer"><!$><!/><!$><!/>`), _tmpl$3 = /* @__PURE__ */ web.template(`<span class="animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full">`), _tmpl$4 = /* @__PURE__ */ web.template(`<button type=button><!$><!/><!$><!/><!$><!/>`), _tmpl$5 = /* @__PURE__ */ web.template(`<div role=group>`);
8
9
  const ActionButton = (props) => {
9
10
  const {
@@ -117,6 +118,7 @@ const ActionButton = (props) => {
117
118
  })();
118
119
  };
119
120
  const ActionGroupRenderer = (props) => {
121
+ const strings = MCPUIStringsContext.useMCPUIStrings();
120
122
  const params = () => {
121
123
  var _a;
122
124
  return props.params || ((_a = props.component) == null ? void 0 : _a.params) || {
@@ -167,7 +169,7 @@ const ActionGroupRenderer = (props) => {
167
169
  }));
168
170
  web.effect((_p$) => {
169
171
  var _a, _b;
170
- var _v$5 = `${layoutClass()} ${gapClass()} ${((_a = params()) == null ? void 0 : _a.fullWidth) ? "w-full" : ""}`, _v$6 = ((_b = params()) == null ? void 0 : _b.label) || "Action group";
172
+ var _v$5 = `${layoutClass()} ${gapClass()} ${((_a = params()) == null ? void 0 : _a.fullWidth) ? "w-full" : ""}`, _v$6 = ((_b = params()) == null ? void 0 : _b.label) || strings.actionGroupLabel;
171
173
  _v$5 !== _p$.e && web.className(_el$14, _p$.e = _v$5);
172
174
  _v$6 !== _p$.t && web.setAttribute(_el$14, "aria-label", _p$.t = _v$6);
173
175
  return _p$;
@@ -1 +1 @@
1
- {"version":3,"file":"ActionGroupRenderer.cjs","sources":["../../src/components/ActionGroupRenderer.tsx"],"sourcesContent":["/**\n * ActionGroupRenderer - Group of actions with layout options\n * Sprint 3: UX Improvements\n */\n\nimport { Component, For, Show } from 'solid-js'\nimport type { UIComponent, ActionGroupParams, ActionComponentParams } from '../types'\nimport { useAction } from '../hooks/useAction'\nimport { safeUrl } from '../utils/safe-url'\n\nexport interface ActionGroupRendererProps {\n /**\n * UIComponent with action-group params (for declarative use)\n */\n component?: UIComponent\n\n /**\n * Direct action group params (alternative to component)\n */\n params?: ActionGroupParams\n}\n\n/**\n * Render a single action button with variants and click handling\n */\nconst ActionButton: Component<{\n action: ActionComponentParams\n index: number\n}> = (props) => {\n const { execute, executeAction, isExecuting } = useAction()\n\n // tool-call and submit both go through the host executor — they show a\n // loading state and gate disabled while running. link does neither.\n const isExecutable = () =>\n props.action.action === 'tool-call' || props.action.action === 'submit'\n\n const handleClick = async (e: MouseEvent) => {\n if (props.action.disabled) return\n\n if (props.action.action === 'tool-call' && props.action.toolName) {\n e.preventDefault()\n await execute(props.action.toolName, props.action.params || {})\n } else if (props.action.action === 'submit') {\n // submit is NOT a tool call — route it through the executor with the\n // `action: 'submit'` kind preserved so the host can POST to\n // params.submit_url etc. Works without a surrounding <form>.\n e.preventDefault()\n await executeAction({\n action: 'submit',\n toolName: props.action.toolName || 'submit',\n params: props.action.params || {},\n })\n } else if (props.action.action === 'link' && props.action.url) {\n window.open(props.action.url, '_blank', 'noopener,noreferrer')\n }\n }\n\n const isDisabled = () =>\n props.action.disabled || (isExecutable() && isExecuting())\n\n const variantClass = () => {\n switch (props.action.variant) {\n case 'primary':\n return 'bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500'\n case 'secondary':\n return 'bg-gray-200 text-gray-800 hover:bg-gray-300 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-600 focus:ring-gray-500'\n case 'outline':\n return 'border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700 focus:ring-gray-500'\n case 'ghost':\n return 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 focus:ring-gray-500'\n case 'danger':\n return 'bg-red-600 text-white hover:bg-red-700 focus:ring-red-500'\n default:\n return 'bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500'\n }\n }\n\n const sizeClass = () => {\n switch (props.action.size) {\n case 'sm':\n return 'px-2 py-1 text-xs'\n case 'lg':\n return 'px-6 py-3 text-base'\n default:\n return 'px-4 py-2 text-sm'\n }\n }\n\n // Render as link if it's a link action\n if (props.action.type === 'link' || (props.action.action === 'link' && props.action.url)) {\n return (\n <a\n href={safeUrl(props.action.url ?? '') ?? '#'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class={`inline-flex items-center justify-center gap-2 rounded-md font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 ${variantClass()} ${sizeClass()} ${\n isDisabled() ? 'opacity-50 cursor-not-allowed pointer-events-none' : ''\n }`}\n >\n <Show when={props.action.icon}>\n <span class=\"text-current\">{props.action.icon}</span>\n </Show>\n {props.action.label}\n </a>\n )\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isDisabled()}\n class={`inline-flex items-center justify-center gap-2 rounded-md font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 ${variantClass()} ${sizeClass()} ${\n isDisabled() ? 'opacity-50 cursor-not-allowed' : ''\n }`}\n >\n <Show when={isExecuting() && isExecutable()}>\n <span class=\"animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full\" />\n </Show>\n <Show when={props.action.icon && !(isExecuting() && isExecutable())}>\n <span class=\"text-current\">{props.action.icon}</span>\n </Show>\n {props.action.label}\n </button>\n )\n}\n\n/**\n * Action group component for rendering multiple actions with consistent layout\n *\n * @example\n * ```tsx\n * const actionGroup: UIComponent = {\n * id: 'form-actions',\n * type: 'action-group',\n * position: { colStart: 1, colSpan: 12 },\n * params: {\n * layout: 'end',\n * gap: 'md',\n * actions: [\n * { label: 'Cancel', variant: 'outline', action: 'link', url: '/back' },\n * { label: 'Save', variant: 'primary', action: 'tool-call', toolName: 'save' },\n * ],\n * },\n * }\n * <ActionGroupRenderer component={actionGroup} />\n * ```\n */\nexport const ActionGroupRenderer: Component<ActionGroupRendererProps> = (props) => {\n const params = () => props.params || (props.component?.params as ActionGroupParams) || { actions: [] }\n\n const layoutClass = () => {\n switch (params()?.layout) {\n case 'vertical':\n return 'flex flex-col'\n case 'space-between':\n return 'flex justify-between'\n case 'end':\n return 'flex justify-end'\n case 'center':\n return 'flex justify-center'\n default: // horizontal\n return 'flex'\n }\n }\n\n const gapClass = () => {\n switch (params()?.gap) {\n case 'none':\n return 'gap-0'\n case 'sm':\n return 'gap-1'\n case 'lg':\n return 'gap-4'\n default: // md\n return 'gap-2'\n }\n }\n\n return (\n <div\n class={`${layoutClass()} ${gapClass()} ${params()?.fullWidth ? 'w-full' : ''}`}\n role=\"group\"\n aria-label={params()?.label || 'Action group'}\n >\n <For each={params()?.actions || []}>\n {(action, index) => <ActionButton action={action} index={index()} />}\n </For>\n </div>\n )\n}\n"],"names":["ActionButton","props","execute","executeAction","isExecuting","useAction","isExecutable","action","handleClick","e","disabled","toolName","preventDefault","params","url","window","open","isDisabled","variantClass","variant","sizeClass","size","type","_el$","_$getNextElement","_tmpl$2","_el$3","firstChild","_el$4","_co$","_$getNextMarker","nextSibling","_el$5","_el$6","_co$2","_$insert","_$createComponent","Show","when","icon","children","_el$2","_tmpl$","label","_$effect","_p$","_v$","safeUrl","_v$2","_$setAttribute","t","_$className","undefined","_el$7","_tmpl$4","_el$0","_el$1","_co$3","_el$10","_el$11","_co$4","_el$12","_el$13","_co$5","$$click","_$memo","_tmpl$3","_el$9","_v$3","_v$4","_$setProperty","_$runHydrationEvents","ActionGroupRenderer","component","actions","layoutClass","layout","gapClass","gap","_el$14","_tmpl$5","For","each","index","_v$5","fullWidth","_v$6","_$delegateEvents"],"mappings":"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"}
1
+ {"version":3,"file":"ActionGroupRenderer.cjs","sources":["../../src/components/ActionGroupRenderer.tsx"],"sourcesContent":["/**\n * ActionGroupRenderer - Group of actions with layout options\n * Sprint 3: UX Improvements\n */\n\nimport { Component, For, Show } from 'solid-js'\nimport type { UIComponent, ActionGroupParams, ActionComponentParams } from '../types'\nimport { useAction } from '../hooks/useAction'\nimport { safeUrl } from '../utils/safe-url'\nimport { useMCPUIStrings } from '../context/MCPUIStringsContext'\n\nexport interface ActionGroupRendererProps {\n /**\n * UIComponent with action-group params (for declarative use)\n */\n component?: UIComponent\n\n /**\n * Direct action group params (alternative to component)\n */\n params?: ActionGroupParams\n}\n\n/**\n * Render a single action button with variants and click handling\n */\nconst ActionButton: Component<{\n action: ActionComponentParams\n index: number\n}> = (props) => {\n const { execute, executeAction, isExecuting } = useAction()\n\n // tool-call and submit both go through the host executor — they show a\n // loading state and gate disabled while running. link does neither.\n const isExecutable = () =>\n props.action.action === 'tool-call' || props.action.action === 'submit'\n\n const handleClick = async (e: MouseEvent) => {\n if (props.action.disabled) return\n\n if (props.action.action === 'tool-call' && props.action.toolName) {\n e.preventDefault()\n await execute(props.action.toolName, props.action.params || {})\n } else if (props.action.action === 'submit') {\n // submit is NOT a tool call — route it through the executor with the\n // `action: 'submit'` kind preserved so the host can POST to\n // params.submit_url etc. Works without a surrounding <form>.\n e.preventDefault()\n await executeAction({\n action: 'submit',\n toolName: props.action.toolName || 'submit',\n params: props.action.params || {},\n })\n } else if (props.action.action === 'link' && props.action.url) {\n window.open(props.action.url, '_blank', 'noopener,noreferrer')\n }\n }\n\n const isDisabled = () =>\n props.action.disabled || (isExecutable() && isExecuting())\n\n const variantClass = () => {\n switch (props.action.variant) {\n case 'primary':\n return 'bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500'\n case 'secondary':\n return 'bg-gray-200 text-gray-800 hover:bg-gray-300 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-600 focus:ring-gray-500'\n case 'outline':\n return 'border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700 focus:ring-gray-500'\n case 'ghost':\n return 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 focus:ring-gray-500'\n case 'danger':\n return 'bg-red-600 text-white hover:bg-red-700 focus:ring-red-500'\n default:\n return 'bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500'\n }\n }\n\n const sizeClass = () => {\n switch (props.action.size) {\n case 'sm':\n return 'px-2 py-1 text-xs'\n case 'lg':\n return 'px-6 py-3 text-base'\n default:\n return 'px-4 py-2 text-sm'\n }\n }\n\n // Render as link if it's a link action\n if (props.action.type === 'link' || (props.action.action === 'link' && props.action.url)) {\n return (\n <a\n href={safeUrl(props.action.url ?? '') ?? '#'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class={`inline-flex items-center justify-center gap-2 rounded-md font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 ${variantClass()} ${sizeClass()} ${\n isDisabled() ? 'opacity-50 cursor-not-allowed pointer-events-none' : ''\n }`}\n >\n <Show when={props.action.icon}>\n <span class=\"text-current\">{props.action.icon}</span>\n </Show>\n {props.action.label}\n </a>\n )\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isDisabled()}\n class={`inline-flex items-center justify-center gap-2 rounded-md font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 ${variantClass()} ${sizeClass()} ${\n isDisabled() ? 'opacity-50 cursor-not-allowed' : ''\n }`}\n >\n <Show when={isExecuting() && isExecutable()}>\n <span class=\"animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full\" />\n </Show>\n <Show when={props.action.icon && !(isExecuting() && isExecutable())}>\n <span class=\"text-current\">{props.action.icon}</span>\n </Show>\n {props.action.label}\n </button>\n )\n}\n\n/**\n * Action group component for rendering multiple actions with consistent layout\n *\n * @example\n * ```tsx\n * const actionGroup: UIComponent = {\n * id: 'form-actions',\n * type: 'action-group',\n * position: { colStart: 1, colSpan: 12 },\n * params: {\n * layout: 'end',\n * gap: 'md',\n * actions: [\n * { label: 'Cancel', variant: 'outline', action: 'link', url: '/back' },\n * { label: 'Save', variant: 'primary', action: 'tool-call', toolName: 'save' },\n * ],\n * },\n * }\n * <ActionGroupRenderer component={actionGroup} />\n * ```\n */\nexport const ActionGroupRenderer: Component<ActionGroupRendererProps> = (props) => {\n const strings = useMCPUIStrings()\n const params = () => props.params || (props.component?.params as ActionGroupParams) || { actions: [] }\n\n const layoutClass = () => {\n switch (params()?.layout) {\n case 'vertical':\n return 'flex flex-col'\n case 'space-between':\n return 'flex justify-between'\n case 'end':\n return 'flex justify-end'\n case 'center':\n return 'flex justify-center'\n default: // horizontal\n return 'flex'\n }\n }\n\n const gapClass = () => {\n switch (params()?.gap) {\n case 'none':\n return 'gap-0'\n case 'sm':\n return 'gap-1'\n case 'lg':\n return 'gap-4'\n default: // md\n return 'gap-2'\n }\n }\n\n return (\n <div\n class={`${layoutClass()} ${gapClass()} ${params()?.fullWidth ? 'w-full' : ''}`}\n role=\"group\"\n aria-label={params()?.label || strings.actionGroupLabel}\n >\n <For each={params()?.actions || []}>\n {(action, index) => <ActionButton action={action} index={index()} />}\n </For>\n </div>\n )\n}\n"],"names":["ActionButton","props","execute","executeAction","isExecuting","useAction","isExecutable","action","handleClick","e","disabled","toolName","preventDefault","params","url","window","open","isDisabled","variantClass","variant","sizeClass","size","type","_el$","_$getNextElement","_tmpl$2","_el$3","firstChild","_el$4","_co$","_$getNextMarker","nextSibling","_el$5","_el$6","_co$2","_$insert","_$createComponent","Show","when","icon","children","_el$2","_tmpl$","label","_$effect","_p$","_v$","safeUrl","_v$2","_$setAttribute","t","_$className","undefined","_el$7","_tmpl$4","_el$0","_el$1","_co$3","_el$10","_el$11","_co$4","_el$12","_el$13","_co$5","$$click","_$memo","_tmpl$3","_el$9","_v$3","_v$4","_$setProperty","_$runHydrationEvents","ActionGroupRenderer","strings","useMCPUIStrings","component","actions","layoutClass","layout","gapClass","gap","_el$14","_tmpl$5","For","each","index","_v$5","fullWidth","_v$6","actionGroupLabel","_$delegateEvents"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ActionGroupRenderer.d.ts","sourceRoot":"","sources":["../../src/components/ActionGroupRenderer.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAa,MAAM,UAAU,CAAA;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAyB,MAAM,UAAU,CAAA;AAIrF,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,SAAS,CAAC,EAAE,WAAW,CAAA;IAEvB;;OAEG;IACH,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B;AA2GD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,CAAC,wBAAwB,CA0CnE,CAAA"}
1
+ {"version":3,"file":"ActionGroupRenderer.d.ts","sourceRoot":"","sources":["../../src/components/ActionGroupRenderer.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAa,MAAM,UAAU,CAAA;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAyB,MAAM,UAAU,CAAA;AAKrF,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,SAAS,CAAC,EAAE,WAAW,CAAA;IAEvB;;OAEG;IACH,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B;AA2GD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,mBAAmB,EAAE,SAAS,CAAC,wBAAwB,CA2CnE,CAAA"}
@@ -2,6 +2,7 @@ import { getNextElement, insert, createComponent, effect, className, setAttribut
2
2
  import { For, Show } from "solid-js";
3
3
  import { useAction } from "../hooks/useAction.js";
4
4
  import { safeUrl } from "../utils/safe-url.js";
5
+ import { useMCPUIStrings } from "../context/MCPUIStringsContext.js";
5
6
  var _tmpl$ = /* @__PURE__ */ template(`<span class=text-current>`), _tmpl$2 = /* @__PURE__ */ template(`<a target=_blank rel="noopener noreferrer"><!$><!/><!$><!/>`), _tmpl$3 = /* @__PURE__ */ template(`<span class="animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full">`), _tmpl$4 = /* @__PURE__ */ template(`<button type=button><!$><!/><!$><!/><!$><!/>`), _tmpl$5 = /* @__PURE__ */ template(`<div role=group>`);
6
7
  const ActionButton = (props) => {
7
8
  const {
@@ -115,6 +116,7 @@ const ActionButton = (props) => {
115
116
  })();
116
117
  };
117
118
  const ActionGroupRenderer = (props) => {
119
+ const strings = useMCPUIStrings();
118
120
  const params = () => {
119
121
  var _a;
120
122
  return props.params || ((_a = props.component) == null ? void 0 : _a.params) || {
@@ -165,7 +167,7 @@ const ActionGroupRenderer = (props) => {
165
167
  }));
166
168
  effect((_p$) => {
167
169
  var _a, _b;
168
- var _v$5 = `${layoutClass()} ${gapClass()} ${((_a = params()) == null ? void 0 : _a.fullWidth) ? "w-full" : ""}`, _v$6 = ((_b = params()) == null ? void 0 : _b.label) || "Action group";
170
+ var _v$5 = `${layoutClass()} ${gapClass()} ${((_a = params()) == null ? void 0 : _a.fullWidth) ? "w-full" : ""}`, _v$6 = ((_b = params()) == null ? void 0 : _b.label) || strings.actionGroupLabel;
169
171
  _v$5 !== _p$.e && className(_el$14, _p$.e = _v$5);
170
172
  _v$6 !== _p$.t && setAttribute(_el$14, "aria-label", _p$.t = _v$6);
171
173
  return _p$;
@@ -1 +1 @@
1
- {"version":3,"file":"ActionGroupRenderer.js","sources":["../../src/components/ActionGroupRenderer.tsx"],"sourcesContent":["/**\n * ActionGroupRenderer - Group of actions with layout options\n * Sprint 3: UX Improvements\n */\n\nimport { Component, For, Show } from 'solid-js'\nimport type { UIComponent, ActionGroupParams, ActionComponentParams } from '../types'\nimport { useAction } from '../hooks/useAction'\nimport { safeUrl } from '../utils/safe-url'\n\nexport interface ActionGroupRendererProps {\n /**\n * UIComponent with action-group params (for declarative use)\n */\n component?: UIComponent\n\n /**\n * Direct action group params (alternative to component)\n */\n params?: ActionGroupParams\n}\n\n/**\n * Render a single action button with variants and click handling\n */\nconst ActionButton: Component<{\n action: ActionComponentParams\n index: number\n}> = (props) => {\n const { execute, executeAction, isExecuting } = useAction()\n\n // tool-call and submit both go through the host executor — they show a\n // loading state and gate disabled while running. link does neither.\n const isExecutable = () =>\n props.action.action === 'tool-call' || props.action.action === 'submit'\n\n const handleClick = async (e: MouseEvent) => {\n if (props.action.disabled) return\n\n if (props.action.action === 'tool-call' && props.action.toolName) {\n e.preventDefault()\n await execute(props.action.toolName, props.action.params || {})\n } else if (props.action.action === 'submit') {\n // submit is NOT a tool call — route it through the executor with the\n // `action: 'submit'` kind preserved so the host can POST to\n // params.submit_url etc. Works without a surrounding <form>.\n e.preventDefault()\n await executeAction({\n action: 'submit',\n toolName: props.action.toolName || 'submit',\n params: props.action.params || {},\n })\n } else if (props.action.action === 'link' && props.action.url) {\n window.open(props.action.url, '_blank', 'noopener,noreferrer')\n }\n }\n\n const isDisabled = () =>\n props.action.disabled || (isExecutable() && isExecuting())\n\n const variantClass = () => {\n switch (props.action.variant) {\n case 'primary':\n return 'bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500'\n case 'secondary':\n return 'bg-gray-200 text-gray-800 hover:bg-gray-300 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-600 focus:ring-gray-500'\n case 'outline':\n return 'border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700 focus:ring-gray-500'\n case 'ghost':\n return 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 focus:ring-gray-500'\n case 'danger':\n return 'bg-red-600 text-white hover:bg-red-700 focus:ring-red-500'\n default:\n return 'bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500'\n }\n }\n\n const sizeClass = () => {\n switch (props.action.size) {\n case 'sm':\n return 'px-2 py-1 text-xs'\n case 'lg':\n return 'px-6 py-3 text-base'\n default:\n return 'px-4 py-2 text-sm'\n }\n }\n\n // Render as link if it's a link action\n if (props.action.type === 'link' || (props.action.action === 'link' && props.action.url)) {\n return (\n <a\n href={safeUrl(props.action.url ?? '') ?? '#'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class={`inline-flex items-center justify-center gap-2 rounded-md font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 ${variantClass()} ${sizeClass()} ${\n isDisabled() ? 'opacity-50 cursor-not-allowed pointer-events-none' : ''\n }`}\n >\n <Show when={props.action.icon}>\n <span class=\"text-current\">{props.action.icon}</span>\n </Show>\n {props.action.label}\n </a>\n )\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isDisabled()}\n class={`inline-flex items-center justify-center gap-2 rounded-md font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 ${variantClass()} ${sizeClass()} ${\n isDisabled() ? 'opacity-50 cursor-not-allowed' : ''\n }`}\n >\n <Show when={isExecuting() && isExecutable()}>\n <span class=\"animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full\" />\n </Show>\n <Show when={props.action.icon && !(isExecuting() && isExecutable())}>\n <span class=\"text-current\">{props.action.icon}</span>\n </Show>\n {props.action.label}\n </button>\n )\n}\n\n/**\n * Action group component for rendering multiple actions with consistent layout\n *\n * @example\n * ```tsx\n * const actionGroup: UIComponent = {\n * id: 'form-actions',\n * type: 'action-group',\n * position: { colStart: 1, colSpan: 12 },\n * params: {\n * layout: 'end',\n * gap: 'md',\n * actions: [\n * { label: 'Cancel', variant: 'outline', action: 'link', url: '/back' },\n * { label: 'Save', variant: 'primary', action: 'tool-call', toolName: 'save' },\n * ],\n * },\n * }\n * <ActionGroupRenderer component={actionGroup} />\n * ```\n */\nexport const ActionGroupRenderer: Component<ActionGroupRendererProps> = (props) => {\n const params = () => props.params || (props.component?.params as ActionGroupParams) || { actions: [] }\n\n const layoutClass = () => {\n switch (params()?.layout) {\n case 'vertical':\n return 'flex flex-col'\n case 'space-between':\n return 'flex justify-between'\n case 'end':\n return 'flex justify-end'\n case 'center':\n return 'flex justify-center'\n default: // horizontal\n return 'flex'\n }\n }\n\n const gapClass = () => {\n switch (params()?.gap) {\n case 'none':\n return 'gap-0'\n case 'sm':\n return 'gap-1'\n case 'lg':\n return 'gap-4'\n default: // md\n return 'gap-2'\n }\n }\n\n return (\n <div\n class={`${layoutClass()} ${gapClass()} ${params()?.fullWidth ? 'w-full' : ''}`}\n role=\"group\"\n aria-label={params()?.label || 'Action group'}\n >\n <For each={params()?.actions || []}>\n {(action, index) => <ActionButton action={action} index={index()} />}\n </For>\n </div>\n )\n}\n"],"names":["ActionButton","props","execute","executeAction","isExecuting","useAction","isExecutable","action","handleClick","e","disabled","toolName","preventDefault","params","url","window","open","isDisabled","variantClass","variant","sizeClass","size","type","_el$","_$getNextElement","_tmpl$2","_el$3","firstChild","_el$4","_co$","_$getNextMarker","nextSibling","_el$5","_el$6","_co$2","_$insert","_$createComponent","Show","when","icon","children","_el$2","_tmpl$","label","_$effect","_p$","_v$","safeUrl","_v$2","_$setAttribute","t","_$className","undefined","_el$7","_tmpl$4","_el$0","_el$1","_co$3","_el$10","_el$11","_co$4","_el$12","_el$13","_co$5","$$click","_$memo","_tmpl$3","_el$9","_v$3","_v$4","_$setProperty","_$runHydrationEvents","ActionGroupRenderer","component","actions","layoutClass","layout","gapClass","gap","_el$14","_tmpl$5","For","each","index","_v$5","fullWidth","_v$6","_$delegateEvents"],"mappings":";;;;;AAyBA,MAAMA,eAGAC,CAAAA,UAAU;AACd,QAAM;AAAA,IAAEC;AAAAA,IAASC;AAAAA,IAAeC;AAAAA,EAAAA,IAAgBC,UAAAA;AAIhD,QAAMC,eAAeA,MACnBL,MAAMM,OAAOA,WAAW,eAAeN,MAAMM,OAAOA,WAAW;AAEjE,QAAMC,cAAc,OAAOC,MAAkB;AAC3C,QAAIR,MAAMM,OAAOG,SAAU;AAE3B,QAAIT,MAAMM,OAAOA,WAAW,eAAeN,MAAMM,OAAOI,UAAU;AAChEF,QAAEG,eAAAA;AACF,YAAMV,QAAQD,MAAMM,OAAOI,UAAUV,MAAMM,OAAOM,UAAU,EAAE;AAAA,IAChE,WAAWZ,MAAMM,OAAOA,WAAW,UAAU;AAI3CE,QAAEG,eAAAA;AACF,YAAMT,cAAc;AAAA,QAClBI,QAAQ;AAAA,QACRI,UAAUV,MAAMM,OAAOI,YAAY;AAAA,QACnCE,QAAQZ,MAAMM,OAAOM,UAAU,CAAA;AAAA,MAAC,CACjC;AAAA,IACH,WAAWZ,MAAMM,OAAOA,WAAW,UAAUN,MAAMM,OAAOO,KAAK;AAC7DC,aAAOC,KAAKf,MAAMM,OAAOO,KAAK,UAAU,qBAAqB;AAAA,IAC/D;AAAA,EACF;AAEA,QAAMG,aAAaA,MACjBhB,MAAMM,OAAOG,YAAaJ,aAAAA,KAAkBF,YAAAA;AAE9C,QAAMc,eAAeA,MAAM;AACzB,YAAQjB,MAAMM,OAAOY,SAAAA;AAAAA,MACnB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IAAA;AAAA,EAEb;AAEA,QAAMC,YAAYA,MAAM;AACtB,YAAQnB,MAAMM,OAAOc,MAAAA;AAAAA,MACnB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IAAA;AAAA,EAEb;AAGA,MAAIpB,MAAMM,OAAOe,SAAS,UAAWrB,MAAMM,OAAOA,WAAW,UAAUN,MAAMM,OAAOO,KAAM;AACxF,YAAA,MAAA;AAAA,UAAAS,OAAAC,eAAAC,OAAA,GAAAC,QAAAH,KAAAI,YAAA,CAAAC,OAAAC,IAAA,IAAAC,cAAAJ,MAAAK,WAAA,GAAAC,QAAAJ,MAAAG,aAAA,CAAAE,OAAAC,KAAA,IAAAJ,cAAAE,MAAAD,WAAA;AAAAI,aAAAZ,MAAAa,gBASKC,MAAI;AAAA,QAAA,IAACC,OAAI;AAAA,iBAAErC,MAAMM,OAAOgC;AAAAA,QAAI;AAAA,QAAA,IAAAC,WAAA;AAAA,cAAAC,QAAAjB,eAAAkB,MAAA;AAAAP,iBAAAM,OAAA,MACCxC,MAAMM,OAAOgC,IAAI;AAAA,iBAAAE;AAAAA,QAAA;AAAA,MAAA,CAAA,GAAAb,OAAAC,IAAA;AAAAM,aAAAZ,MAAA,MAE9CtB,MAAMM,OAAOoC,OAAKV,OAAAC,KAAA;AAAAU,aAAAC,CAAAA,QAAA;AAAA,YAAAC,MAVbC,QAAQ9C,MAAMM,OAAOO,OAAO,EAAE,KAAK,KAAGkC,OAGrC,8IAA8I9B,aAAAA,CAAc,IAAIE,UAAAA,CAAW,IAChLH,WAAAA,IAAe,sDAAsD,EAAE;AACvE6B,gBAAAD,IAAApC,KAAAwC,aAAA1B,MAAA,QAAAsB,IAAApC,IAAAqC,GAAA;AAAAE,iBAAAH,IAAAK,KAAAC,UAAA5B,MAAAsB,IAAAK,IAAAF,IAAA;AAAA,eAAAH;AAAAA,MAAA,GAAA;AAAA,QAAApC,GAAA2C;AAAAA,QAAAF,GAAAE;AAAAA,MAAAA,CAAA;AAAA,aAAA7B;AAAAA,IAAA,GAAA;AAAA,EAQR;AAEA,UAAA,MAAA;AAAA,QAAA8B,QAAA7B,eAAA8B,OAAA,GAAAC,QAAAF,MAAA1B,YAAA,CAAA6B,OAAAC,KAAA,IAAA3B,cAAAyB,MAAAxB,WAAA,GAAA2B,SAAAF,MAAAzB,aAAA,CAAA4B,QAAAC,KAAA,IAAA9B,cAAA4B,OAAA3B,WAAA,GAAA8B,SAAAF,OAAA5B,aAAA,CAAA+B,QAAAC,KAAA,IAAAjC,cAAA+B,OAAA9B,WAAA;AAAAsB,UAAAW,UAGaxD;AAAW2B,WAAAkB,OAAAjB,gBAMnBC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAE2B,aAAA7D,aAAa,EAAA,KAAIE,aAAAA;AAAAA,MAAc;AAAA,MAAA,IAAAkC,WAAA;AAAA,eAAAhB,eAAA0C,OAAA;AAAA,MAAA;AAAA,IAAA,CAAA,GAAAV,OAAAC,KAAA;AAAAtB,WAAAkB,OAAAjB,gBAG1CC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAE2B,KAAA,MAAA,CAAA,CAAAhE,MAAMM,OAAOgC,IAAI,EAAA,KAAI,EAAEnC,iBAAiBE;MAAe;AAAA,MAAA,IAAAkC,WAAA;AAAA,YAAA2B,QAAA3C,eAAAkB,MAAA;AAAAP,eAAAgC,OAAA,MACrClE,MAAMM,OAAOgC,IAAI;AAAA,eAAA4B;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAAR,QAAAC,KAAA;AAAAzB,WAAAkB,OAAA,MAE9CpD,MAAMM,OAAOoC,OAAKmB,QAAAC,KAAA;AAAAnB,WAAAC,CAAAA,QAAA;AAAA,UAAAuB,OAXTnD,WAAAA,GAAYoD,OACf,8IAA8InD,aAAAA,CAAc,IAAIE,UAAAA,CAAW,IAChLH,WAAAA,IAAe,kCAAkC,EAAE;AACnDmD,eAAAvB,IAAApC,KAAA6D,YAAAjB,OAAA,YAAAR,IAAApC,IAAA2D,IAAA;AAAAC,eAAAxB,IAAAK,KAAAC,UAAAE,OAAAR,IAAAK,IAAAmB,IAAA;AAAA,aAAAxB;AAAAA,IAAA,GAAA;AAAA,MAAApC,GAAA2C;AAAAA,MAAAF,GAAAE;AAAAA,IAAAA,CAAA;AAAAmB,uBAAAA;AAAA,WAAAlB;AAAAA,EAAA,GAAA;AAWR;AAuBO,MAAMmB,sBAA4DvE,CAAAA,UAAU;AACjF,QAAMY,SAASA,MAAAA;;AAAMZ,iBAAMY,YAAWZ,WAAMwE,cAANxE,mBAAiBY,WAAgC;AAAA,MAAE6D,SAAS,CAAA;AAAA,IAAA;AAAA;AAElG,QAAMC,cAAcA,MAAM;;AACxB,aAAQ9D,YAAAA,MAAAA,mBAAU+D,QAAAA;AAAAA,MAChB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IAAA;AAAA,EAEb;AAEA,QAAMC,WAAWA,MAAM;;AACrB,aAAQhE,YAAAA,MAAAA,mBAAUiE,KAAAA;AAAAA,MAChB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IAAA;AAAA,EAEb;AAEA,UAAA,MAAA;AAAA,QAAAC,SAAAvD,eAAAwD,OAAA;AAAA7C,WAAA4C,QAAA3C,gBAMK6C,KAAG;AAAA,MAAA,IAACC,OAAI;;AAAA,iBAAErE,YAAAA,MAAAA,mBAAU6D,YAAW,CAAA;AAAA,MAAE;AAAA,MAAAlC,UAC/BA,CAACjC,QAAQ4E,UAAK/C,gBAAMpC,cAAY;AAAA,QAACO;AAAAA,QAAc,IAAE4E,QAAK;AAAA,iBAAEA,MAAAA;AAAAA,QAAO;AAAA,MAAA,CAAA;AAAA,IAAA,CAAI,CAAA;AAAAvC,WAAAC,CAAAA,QAAA;;AAAA,UAAAuC,OAL/D,GAAGT,YAAAA,CAAa,IAAIE,UAAU,MAAIhE,YAAAA,MAAAA,mBAAUwE,aAAY,WAAW,EAAE,IAAEC,SAElEzE,YAAAA,MAAAA,mBAAU8B,UAAS;AAAcyC,eAAAvC,IAAApC,KAAA0C,UAAA4B,QAAAlC,IAAApC,IAAA2E,IAAA;AAAAE,eAAAzC,IAAAK,KAAAD,aAAA8B,QAAA,cAAAlC,IAAAK,IAAAoC,IAAA;AAAA,aAAAzC;AAAAA,IAAA,GAAA;AAAA,MAAApC,GAAA2C;AAAAA,MAAAF,GAAAE;AAAAA,IAAAA,CAAA;AAAA,WAAA2B;AAAAA,EAAA,GAAA;AAOnD;AAACQ,eAAA,CAAA,OAAA,CAAA;"}
1
+ {"version":3,"file":"ActionGroupRenderer.js","sources":["../../src/components/ActionGroupRenderer.tsx"],"sourcesContent":["/**\n * ActionGroupRenderer - Group of actions with layout options\n * Sprint 3: UX Improvements\n */\n\nimport { Component, For, Show } from 'solid-js'\nimport type { UIComponent, ActionGroupParams, ActionComponentParams } from '../types'\nimport { useAction } from '../hooks/useAction'\nimport { safeUrl } from '../utils/safe-url'\nimport { useMCPUIStrings } from '../context/MCPUIStringsContext'\n\nexport interface ActionGroupRendererProps {\n /**\n * UIComponent with action-group params (for declarative use)\n */\n component?: UIComponent\n\n /**\n * Direct action group params (alternative to component)\n */\n params?: ActionGroupParams\n}\n\n/**\n * Render a single action button with variants and click handling\n */\nconst ActionButton: Component<{\n action: ActionComponentParams\n index: number\n}> = (props) => {\n const { execute, executeAction, isExecuting } = useAction()\n\n // tool-call and submit both go through the host executor — they show a\n // loading state and gate disabled while running. link does neither.\n const isExecutable = () =>\n props.action.action === 'tool-call' || props.action.action === 'submit'\n\n const handleClick = async (e: MouseEvent) => {\n if (props.action.disabled) return\n\n if (props.action.action === 'tool-call' && props.action.toolName) {\n e.preventDefault()\n await execute(props.action.toolName, props.action.params || {})\n } else if (props.action.action === 'submit') {\n // submit is NOT a tool call — route it through the executor with the\n // `action: 'submit'` kind preserved so the host can POST to\n // params.submit_url etc. Works without a surrounding <form>.\n e.preventDefault()\n await executeAction({\n action: 'submit',\n toolName: props.action.toolName || 'submit',\n params: props.action.params || {},\n })\n } else if (props.action.action === 'link' && props.action.url) {\n window.open(props.action.url, '_blank', 'noopener,noreferrer')\n }\n }\n\n const isDisabled = () =>\n props.action.disabled || (isExecutable() && isExecuting())\n\n const variantClass = () => {\n switch (props.action.variant) {\n case 'primary':\n return 'bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500'\n case 'secondary':\n return 'bg-gray-200 text-gray-800 hover:bg-gray-300 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-600 focus:ring-gray-500'\n case 'outline':\n return 'border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700 focus:ring-gray-500'\n case 'ghost':\n return 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 focus:ring-gray-500'\n case 'danger':\n return 'bg-red-600 text-white hover:bg-red-700 focus:ring-red-500'\n default:\n return 'bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500'\n }\n }\n\n const sizeClass = () => {\n switch (props.action.size) {\n case 'sm':\n return 'px-2 py-1 text-xs'\n case 'lg':\n return 'px-6 py-3 text-base'\n default:\n return 'px-4 py-2 text-sm'\n }\n }\n\n // Render as link if it's a link action\n if (props.action.type === 'link' || (props.action.action === 'link' && props.action.url)) {\n return (\n <a\n href={safeUrl(props.action.url ?? '') ?? '#'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class={`inline-flex items-center justify-center gap-2 rounded-md font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 ${variantClass()} ${sizeClass()} ${\n isDisabled() ? 'opacity-50 cursor-not-allowed pointer-events-none' : ''\n }`}\n >\n <Show when={props.action.icon}>\n <span class=\"text-current\">{props.action.icon}</span>\n </Show>\n {props.action.label}\n </a>\n )\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isDisabled()}\n class={`inline-flex items-center justify-center gap-2 rounded-md font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 ${variantClass()} ${sizeClass()} ${\n isDisabled() ? 'opacity-50 cursor-not-allowed' : ''\n }`}\n >\n <Show when={isExecuting() && isExecutable()}>\n <span class=\"animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full\" />\n </Show>\n <Show when={props.action.icon && !(isExecuting() && isExecutable())}>\n <span class=\"text-current\">{props.action.icon}</span>\n </Show>\n {props.action.label}\n </button>\n )\n}\n\n/**\n * Action group component for rendering multiple actions with consistent layout\n *\n * @example\n * ```tsx\n * const actionGroup: UIComponent = {\n * id: 'form-actions',\n * type: 'action-group',\n * position: { colStart: 1, colSpan: 12 },\n * params: {\n * layout: 'end',\n * gap: 'md',\n * actions: [\n * { label: 'Cancel', variant: 'outline', action: 'link', url: '/back' },\n * { label: 'Save', variant: 'primary', action: 'tool-call', toolName: 'save' },\n * ],\n * },\n * }\n * <ActionGroupRenderer component={actionGroup} />\n * ```\n */\nexport const ActionGroupRenderer: Component<ActionGroupRendererProps> = (props) => {\n const strings = useMCPUIStrings()\n const params = () => props.params || (props.component?.params as ActionGroupParams) || { actions: [] }\n\n const layoutClass = () => {\n switch (params()?.layout) {\n case 'vertical':\n return 'flex flex-col'\n case 'space-between':\n return 'flex justify-between'\n case 'end':\n return 'flex justify-end'\n case 'center':\n return 'flex justify-center'\n default: // horizontal\n return 'flex'\n }\n }\n\n const gapClass = () => {\n switch (params()?.gap) {\n case 'none':\n return 'gap-0'\n case 'sm':\n return 'gap-1'\n case 'lg':\n return 'gap-4'\n default: // md\n return 'gap-2'\n }\n }\n\n return (\n <div\n class={`${layoutClass()} ${gapClass()} ${params()?.fullWidth ? 'w-full' : ''}`}\n role=\"group\"\n aria-label={params()?.label || strings.actionGroupLabel}\n >\n <For each={params()?.actions || []}>\n {(action, index) => <ActionButton action={action} index={index()} />}\n </For>\n </div>\n )\n}\n"],"names":["ActionButton","props","execute","executeAction","isExecuting","useAction","isExecutable","action","handleClick","e","disabled","toolName","preventDefault","params","url","window","open","isDisabled","variantClass","variant","sizeClass","size","type","_el$","_$getNextElement","_tmpl$2","_el$3","firstChild","_el$4","_co$","_$getNextMarker","nextSibling","_el$5","_el$6","_co$2","_$insert","_$createComponent","Show","when","icon","children","_el$2","_tmpl$","label","_$effect","_p$","_v$","safeUrl","_v$2","_$setAttribute","t","_$className","undefined","_el$7","_tmpl$4","_el$0","_el$1","_co$3","_el$10","_el$11","_co$4","_el$12","_el$13","_co$5","$$click","_$memo","_tmpl$3","_el$9","_v$3","_v$4","_$setProperty","_$runHydrationEvents","ActionGroupRenderer","strings","useMCPUIStrings","component","actions","layoutClass","layout","gapClass","gap","_el$14","_tmpl$5","For","each","index","_v$5","fullWidth","_v$6","actionGroupLabel","_$delegateEvents"],"mappings":"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"}
@@ -2,6 +2,7 @@
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");
5
6
  var _tmpl$ = /* @__PURE__ */ web.template(`<span class="text-xs text-gray-400 dark:text-gray-500">`), _tmpl$2 = /* @__PURE__ */ web.template(`<div class="flex flex-wrap gap-1 mt-1.5">`), _tmpl$3 = /* @__PURE__ */ web.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__ */ web.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__ */ web.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__ */ web.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">`);
6
7
  const AVATAR_MAP = {
7
8
  scales: "⚖️",
@@ -15,32 +16,33 @@ const AVATAR_MAP = {
15
16
  };
16
17
  const STATUS_CONFIG = {
17
18
  idle: {
18
- label: "Idle",
19
+ labelKey: "agentStatusIdle",
19
20
  color: "bg-gray-400",
20
21
  pulse: false
21
22
  },
22
23
  running: {
23
- label: "Running",
24
+ labelKey: "agentStatusRunning",
24
25
  color: "bg-blue-500",
25
26
  pulse: true
26
27
  },
27
28
  waiting: {
28
- label: "Waiting",
29
+ labelKey: "agentStatusWaiting",
29
30
  color: "bg-amber-500",
30
31
  pulse: true
31
32
  },
32
33
  done: {
33
- label: "Done",
34
+ labelKey: "agentStatusDone",
34
35
  color: "bg-green-500",
35
36
  pulse: false
36
37
  },
37
38
  error: {
38
- label: "Error",
39
+ labelKey: "agentStatusError",
39
40
  color: "bg-red-500",
40
41
  pulse: false
41
42
  }
42
43
  };
43
44
  function AgentCard(props) {
45
+ const strings = MCPUIStringsContext.useMCPUIStrings();
44
46
  const c = () => props.content;
45
47
  const status = () => STATUS_CONFIG[c().status] || STATUS_CONFIG.idle;
46
48
  const avatar = () => AVATAR_MAP[c().avatar || ""] || c().avatar || "🤖";
@@ -55,7 +57,7 @@ function AgentCard(props) {
55
57
  var _el$ = web.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] = web.getNextMarker(_el$12.nextSibling), _el$14 = _el$13.nextSibling, [_el$15, _co$3] = web.getNextMarker(_el$14.nextSibling), _el$16 = _el$15.nextSibling, [_el$17, _co$4] = web.getNextMarker(_el$16.nextSibling);
56
58
  web.insert(_el$2, avatar);
57
59
  web.insert(_el$5, () => c().name);
58
- web.insert(_el$7, () => status().label);
60
+ web.insert(_el$7, () => strings[status().labelKey]);
59
61
  web.insert(_el$3, web.createComponent(solidJs.Show, {
60
62
  get when() {
61
63
  return c().model;
@@ -96,7 +98,7 @@ function AgentCard(props) {
96
98
  }
97
99
  }), _el$17, _co$4);
98
100
  web.effect((_p$) => {
99
- var _v$ = `inline-block w-2 h-2 rounded-full ${status().color} ${status().pulse ? "animate-pulse" : ""}`, _v$2 = status().label;
101
+ var _v$ = `inline-block w-2 h-2 rounded-full ${status().color} ${status().pulse ? "animate-pulse" : ""}`, _v$2 = strings[status().labelKey];
100
102
  _v$ !== _p$.e && web.className(_el$6, _p$.e = _v$);
101
103
  _v$2 !== _p$.t && web.setAttribute(_el$6, "title", _p$.t = _v$2);
102
104
  return _p$;
@@ -108,11 +110,12 @@ function AgentCard(props) {
108
110
  })();
109
111
  }
110
112
  function AgentStatusBadge(props) {
113
+ const strings = MCPUIStringsContext.useMCPUIStrings();
111
114
  const status = () => STATUS_CONFIG[props.status] || STATUS_CONFIG.idle;
112
115
  return (() => {
113
116
  var _el$19 = web.getNextElement(_tmpl$6), _el$20 = _el$19.firstChild, _el$21 = _el$20.nextSibling, _el$22 = _el$21.nextSibling;
114
117
  web.insert(_el$21, () => props.agentName);
115
- web.insert(_el$22, () => status().label);
118
+ web.insert(_el$22, () => strings[status().labelKey]);
116
119
  web.effect(() => web.className(_el$20, `w-2 h-2 rounded-full ${status().color} ${status().pulse ? "animate-pulse" : ""}`));
117
120
  return _el$19;
118
121
  })();
@@ -1 +1 @@
1
- {"version":3,"file":"AgentCard.cjs","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.cjs","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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AgentCard.d.ts","sourceRoot":"","sources":["../../src/components/AgentCard.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEzD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,gBAAgB,CAAA;CAC1B;AAqBD,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,kCAuD9C;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAA;CAC1D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,kCAU5D"}
1
+ {"version":3,"file":"AgentCard.d.ts","sourceRoot":"","sources":["../../src/components/AgentCard.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAGzD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,gBAAgB,CAAA;CAC1B;AAoCD,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,kCAwD9C;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAA;CAC1D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,kCAW5D"}