@seed-ship/mcp-ui-solid 6.5.0 → 6.6.1

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 (104) hide show
  1. package/CHANGELOG.md +161 -0
  2. package/README.md +37 -0
  3. package/dist/adapters/connector.cjs +112 -0
  4. package/dist/adapters/connector.cjs.map +1 -0
  5. package/dist/adapters/connector.d.ts +71 -0
  6. package/dist/adapters/connector.d.ts.map +1 -0
  7. package/dist/adapters/connector.js +112 -0
  8. package/dist/adapters/connector.js.map +1 -0
  9. package/dist/adapters/index.d.ts +18 -0
  10. package/dist/adapters/index.d.ts.map +1 -0
  11. package/dist/adapters.cjs +6 -0
  12. package/dist/adapters.cjs.map +1 -0
  13. package/dist/adapters.d.cts +18 -0
  14. package/dist/adapters.d.ts +18 -0
  15. package/dist/adapters.js +6 -0
  16. package/dist/adapters.js.map +1 -0
  17. package/dist/components/ActionGroupRenderer.cjs +12 -3
  18. package/dist/components/ActionGroupRenderer.cjs.map +1 -1
  19. package/dist/components/ActionGroupRenderer.d.ts.map +1 -1
  20. package/dist/components/ActionGroupRenderer.js +12 -3
  21. package/dist/components/ActionGroupRenderer.js.map +1 -1
  22. package/dist/components/ExpandableWrapper.cjs +24 -6
  23. package/dist/components/ExpandableWrapper.cjs.map +1 -1
  24. package/dist/components/ExpandableWrapper.d.ts.map +1 -1
  25. package/dist/components/ExpandableWrapper.js +24 -6
  26. package/dist/components/ExpandableWrapper.js.map +1 -1
  27. package/dist/components/FeedbackInline.cjs +6 -2
  28. package/dist/components/FeedbackInline.cjs.map +1 -1
  29. package/dist/components/FeedbackInline.d.ts +2 -2
  30. package/dist/components/FeedbackInline.d.ts.map +1 -1
  31. package/dist/components/FeedbackInline.js +7 -3
  32. package/dist/components/FeedbackInline.js.map +1 -1
  33. package/dist/components/PresentationFeedback.cjs +207 -0
  34. package/dist/components/PresentationFeedback.cjs.map +1 -0
  35. package/dist/components/PresentationFeedback.d.ts +113 -0
  36. package/dist/components/PresentationFeedback.d.ts.map +1 -0
  37. package/dist/components/PresentationFeedback.js +207 -0
  38. package/dist/components/PresentationFeedback.js.map +1 -0
  39. package/dist/components/StreamingUIRenderer.cjs +82 -195
  40. package/dist/components/StreamingUIRenderer.cjs.map +1 -1
  41. package/dist/components/StreamingUIRenderer.d.ts +25 -5
  42. package/dist/components/StreamingUIRenderer.d.ts.map +1 -1
  43. package/dist/components/StreamingUIRenderer.js +84 -197
  44. package/dist/components/StreamingUIRenderer.js.map +1 -1
  45. package/dist/components/UIResourceRenderer.cjs +22 -15
  46. package/dist/components/UIResourceRenderer.cjs.map +1 -1
  47. package/dist/components/UIResourceRenderer.d.ts.map +1 -1
  48. package/dist/components/UIResourceRenderer.js +22 -15
  49. package/dist/components/UIResourceRenderer.js.map +1 -1
  50. package/dist/components/index.d.ts +2 -0
  51. package/dist/components/index.d.ts.map +1 -1
  52. package/dist/components.cjs +3 -0
  53. package/dist/components.cjs.map +1 -1
  54. package/dist/components.d.cts +2 -0
  55. package/dist/components.d.ts +2 -0
  56. package/dist/components.js +3 -0
  57. package/dist/components.js.map +1 -1
  58. package/dist/context/MCPActionContext.cjs +4 -1
  59. package/dist/context/MCPActionContext.cjs.map +1 -1
  60. package/dist/context/MCPActionContext.d.ts +13 -1
  61. package/dist/context/MCPActionContext.d.ts.map +1 -1
  62. package/dist/context/MCPActionContext.js +4 -1
  63. package/dist/context/MCPActionContext.js.map +1 -1
  64. package/dist/context/MCPUIStringsContext.cjs +38 -0
  65. package/dist/context/MCPUIStringsContext.cjs.map +1 -0
  66. package/dist/context/MCPUIStringsContext.d.ts +95 -0
  67. package/dist/context/MCPUIStringsContext.d.ts.map +1 -0
  68. package/dist/context/MCPUIStringsContext.js +38 -0
  69. package/dist/context/MCPUIStringsContext.js.map +1 -0
  70. package/dist/index.cjs +8 -0
  71. package/dist/index.cjs.map +1 -1
  72. package/dist/index.d.cts +5 -0
  73. package/dist/index.d.ts +5 -0
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +8 -0
  76. package/dist/index.js.map +1 -1
  77. package/dist/mcp-ui-spec/dist/schemas.cjs +103 -0
  78. package/dist/mcp-ui-spec/dist/schemas.cjs.map +1 -1
  79. package/dist/mcp-ui-spec/dist/schemas.js +103 -0
  80. package/dist/mcp-ui-spec/dist/schemas.js.map +1 -1
  81. package/docs/briefs/ROADMAP-opendata-macro-mcpui.md +912 -0
  82. package/package.json +17 -5
  83. package/src/adapters/connector.test.ts +165 -0
  84. package/src/adapters/connector.ts +234 -0
  85. package/src/adapters/index.ts +24 -0
  86. package/src/components/ActionGroupRenderer.test.tsx +1 -0
  87. package/src/components/ActionGroupRenderer.tsx +19 -4
  88. package/src/components/ActionSubmit.test.tsx +188 -0
  89. package/src/components/ExpandableWrapper.test.tsx +5 -2
  90. package/src/components/ExpandableWrapper.tsx +8 -6
  91. package/src/components/FeedbackInline.test.tsx +6 -3
  92. package/src/components/FeedbackInline.tsx +8 -6
  93. package/src/components/PresentationFeedback.test.tsx +163 -0
  94. package/src/components/PresentationFeedback.tsx +326 -0
  95. package/src/components/StreamingUIRenderer.parity.test.tsx +158 -0
  96. package/src/components/StreamingUIRenderer.tsx +42 -166
  97. package/src/components/UIResourceRenderer.tsx +19 -6
  98. package/src/components/index.ts +10 -0
  99. package/src/context/MCPActionContext.tsx +17 -1
  100. package/src/context/MCPUIStringsContext.test.tsx +116 -0
  101. package/src/context/MCPUIStringsContext.tsx +128 -0
  102. package/src/index.ts +27 -0
  103. package/tsconfig.tsbuildinfo +1 -1
  104. package/vite.config.ts +1 -0
@@ -7,6 +7,8 @@ export { UIResourceRenderer } from './UIResourceRenderer';
7
7
  export type { UIResourceRendererProps } from './UIResourceRenderer';
8
8
  export { StreamingUIRenderer } from './StreamingUIRenderer';
9
9
  export type { StreamingUIRendererProps } from './StreamingUIRenderer';
10
+ export { PresentationFeedback, DEFAULT_PRESENTATION_FEEDBACK_LABELS, } from './PresentationFeedback';
11
+ export type { PresentationFeedbackProps, PresentationFeedbackLabels, } from './PresentationFeedback';
10
12
  export { GenerativeUIErrorBoundary } from './GenerativeUIErrorBoundary';
11
13
  export type { GenerativeUIErrorBoundaryProps } from './GenerativeUIErrorBoundary';
12
14
  export { FooterRenderer } from './FooterRenderer';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
3
  const UIResourceRenderer = require("./components/UIResourceRenderer.cjs");
4
4
  const StreamingUIRenderer = require("./components/StreamingUIRenderer.cjs");
5
+ const PresentationFeedback = require("./components/PresentationFeedback.cjs");
5
6
  const GenerativeUIErrorBoundary = require("./components/GenerativeUIErrorBoundary.cjs");
6
7
  const FooterRenderer = require("./components/FooterRenderer.cjs");
7
8
  const ActionRenderer = require("./components/ActionRenderer.cjs");
@@ -30,6 +31,8 @@ const PortalDropdownMenu = require("./components/PortalDropdownMenu.cjs");
30
31
  exports.UIResourceRenderer = UIResourceRenderer.UIResourceRenderer;
31
32
  exports.default = UIResourceRenderer.UIResourceRenderer;
32
33
  exports.StreamingUIRenderer = StreamingUIRenderer.StreamingUIRenderer;
34
+ exports.DEFAULT_PRESENTATION_FEEDBACK_LABELS = PresentationFeedback.DEFAULT_PRESENTATION_FEEDBACK_LABELS;
35
+ exports.PresentationFeedback = PresentationFeedback.PresentationFeedback;
33
36
  exports.GenerativeUIErrorBoundary = GenerativeUIErrorBoundary.GenerativeUIErrorBoundary;
34
37
  exports.FooterRenderer = FooterRenderer.FooterRenderer;
35
38
  exports.ActionRenderer = ActionRenderer.ActionRenderer;
@@ -1 +1 @@
1
- {"version":3,"file":"components.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"components.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -7,6 +7,8 @@ export { UIResourceRenderer } from './UIResourceRenderer';
7
7
  export type { UIResourceRendererProps } from './UIResourceRenderer';
8
8
  export { StreamingUIRenderer } from './StreamingUIRenderer';
9
9
  export type { StreamingUIRendererProps } from './StreamingUIRenderer';
10
+ export { PresentationFeedback, DEFAULT_PRESENTATION_FEEDBACK_LABELS, } from './PresentationFeedback';
11
+ export type { PresentationFeedbackProps, PresentationFeedbackLabels, } from './PresentationFeedback';
10
12
  export { GenerativeUIErrorBoundary } from './GenerativeUIErrorBoundary';
11
13
  export type { GenerativeUIErrorBoundaryProps } from './GenerativeUIErrorBoundary';
12
14
  export { FooterRenderer } from './FooterRenderer';
@@ -7,6 +7,8 @@ export { UIResourceRenderer } from './UIResourceRenderer';
7
7
  export type { UIResourceRendererProps } from './UIResourceRenderer';
8
8
  export { StreamingUIRenderer } from './StreamingUIRenderer';
9
9
  export type { StreamingUIRendererProps } from './StreamingUIRenderer';
10
+ export { PresentationFeedback, DEFAULT_PRESENTATION_FEEDBACK_LABELS, } from './PresentationFeedback';
11
+ export type { PresentationFeedbackProps, PresentationFeedbackLabels, } from './PresentationFeedback';
10
12
  export { GenerativeUIErrorBoundary } from './GenerativeUIErrorBoundary';
11
13
  export type { GenerativeUIErrorBoundaryProps } from './GenerativeUIErrorBoundary';
12
14
  export { FooterRenderer } from './FooterRenderer';
@@ -1,5 +1,6 @@
1
1
  import { UIResourceRenderer, UIResourceRenderer as UIResourceRenderer2 } from "./components/UIResourceRenderer.js";
2
2
  import { StreamingUIRenderer } from "./components/StreamingUIRenderer.js";
3
+ import { DEFAULT_PRESENTATION_FEEDBACK_LABELS, PresentationFeedback } from "./components/PresentationFeedback.js";
3
4
  import { GenerativeUIErrorBoundary } from "./components/GenerativeUIErrorBoundary.js";
4
5
  import { FooterRenderer } from "./components/FooterRenderer.js";
5
6
  import { ActionRenderer } from "./components/ActionRenderer.js";
@@ -36,6 +37,7 @@ export {
36
37
  CarouselRenderer,
37
38
  ChartJSRenderer,
38
39
  CodeBlockRenderer,
40
+ DEFAULT_PRESENTATION_FEEDBACK_LABELS,
39
41
  DataPreviewSection,
40
42
  ElicitationForm,
41
43
  FooterRenderer,
@@ -48,6 +50,7 @@ export {
48
50
  MapRenderer,
49
51
  ModalRenderer,
50
52
  PortalDropdownMenu,
53
+ PresentationFeedback,
51
54
  RenderContext,
52
55
  RenderProvider,
53
56
  SplitStepper,
@@ -1 +1 @@
1
- {"version":3,"file":"components.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"components.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -12,7 +12,10 @@ const defaultExecutor = async (request) => {
12
12
  toolName: request.toolName,
13
13
  params: request.params || {},
14
14
  spaceIds: request.spaceIds,
15
- macroId: request.macroId
15
+ macroId: request.macroId,
16
+ // v6.6.1 — action kind so a window-level listener can route a
17
+ // `submit` (POST to params.submit_url) vs a tool call.
18
+ action: request.action ?? "tool-call"
16
19
  },
17
20
  bubbles: true
18
21
  });
@@ -1 +1 @@
1
- {"version":3,"file":"MCPActionContext.cjs","sources":["../../src/context/MCPActionContext.tsx"],"sourcesContent":["/**\n * MCPActionContext - Context provider for MCP action execution\n * Phase 5.0: Quick Wins - Replaces CustomEvent with typed context for Mastra integration\n */\n\nimport { createContext, createSignal, useContext, ParentComponent, Accessor } from 'solid-js'\n\n/**\n * Action request payload\n */\nexport interface ActionRequest {\n /**\n * MCP tool name to execute\n */\n toolName: string\n\n /**\n * Tool parameters\n */\n params?: Record<string, any>\n\n /**\n * Optional space IDs for multi-space context\n */\n spaceIds?: string[]\n\n /**\n * Optional macro ID for template execution\n */\n macroId?: string\n}\n\n/**\n * Action result from execution\n */\nexport interface ActionResult {\n /**\n * Whether the action was successful\n */\n success: boolean\n\n /**\n * Result data (if successful)\n */\n data?: any\n\n /**\n * Error message (if failed)\n */\n error?: string\n\n /**\n * Execution timestamp\n */\n timestamp: string\n\n /**\n * Tool that was executed\n */\n toolName: string\n}\n\n/**\n * Context value interface\n */\nexport interface MCPActionContextValue {\n /**\n * Execute an MCP action\n */\n executeAction: (request: ActionRequest) => Promise<ActionResult>\n\n /**\n * Currently available tools (from MCP server)\n */\n availableTools: Accessor<string[]>\n\n /**\n * Space IDs in current context\n */\n spaceIds: Accessor<string[]>\n\n /**\n * Current macro ID (if executing within a template)\n */\n macroId: Accessor<string | undefined>\n\n /**\n * Whether an action is currently executing\n */\n isExecuting: Accessor<boolean>\n\n /**\n * Last action result\n */\n lastResult: Accessor<ActionResult | undefined>\n}\n\n/**\n * Props for MCPActionProvider\n */\nexport interface MCPActionProviderProps {\n /**\n * Space IDs for multi-space queries\n */\n spaceIds?: string[]\n\n /**\n * Macro ID when executing within a template\n */\n macroId?: string\n\n /**\n * Available MCP tools\n */\n availableTools?: string[]\n\n /**\n * Callback for action execution (for audit logging)\n */\n onAction?: (request: ActionRequest, result: ActionResult) => void\n\n /**\n * Callback for webhook events (n8n, Zapier integration)\n */\n onWebhook?: (event: { type: string; payload: any }) => void\n\n /**\n * Custom action executor (override default)\n */\n executor?: (request: ActionRequest) => Promise<ActionResult>\n}\n\n// Create the context with undefined default\nconst MCPActionContext = createContext<MCPActionContextValue>()\n\n/**\n * Default action executor using CustomEvent fallback\n * This maintains backward compatibility while allowing Context-based usage\n */\nconst defaultExecutor = async (request: ActionRequest): Promise<ActionResult> => {\n return new Promise((resolve) => {\n const timestamp = new Date().toISOString()\n\n // Dispatch CustomEvent for backward compatibility with existing listeners\n if (typeof window !== 'undefined') {\n const event = new CustomEvent('mcp-action', {\n detail: {\n toolName: request.toolName,\n params: request.params || {},\n spaceIds: request.spaceIds,\n macroId: request.macroId,\n },\n bubbles: true,\n })\n\n // Listen for response event\n const responseHandler = (e: Event) => {\n const customEvent = e as CustomEvent\n window.removeEventListener('mcp-action-response', responseHandler)\n resolve({\n success: customEvent.detail?.success ?? true,\n data: customEvent.detail?.data,\n error: customEvent.detail?.error,\n timestamp,\n toolName: request.toolName,\n })\n }\n\n window.addEventListener('mcp-action-response', responseHandler)\n window.dispatchEvent(event)\n\n // Timeout fallback - resolve as success if no response in 100ms\n // (indicates no listener, action was dispatched)\n setTimeout(() => {\n window.removeEventListener('mcp-action-response', responseHandler)\n resolve({\n success: true,\n data: { dispatched: true },\n timestamp,\n toolName: request.toolName,\n })\n }, 100)\n } else {\n // Server-side: return immediately\n resolve({\n success: false,\n error: 'Actions not available server-side',\n timestamp,\n toolName: request.toolName,\n })\n }\n })\n}\n\n/**\n * MCPActionProvider - Provides action execution context to child components\n *\n * @example\n * ```tsx\n * <MCPActionProvider\n * spaceIds={['space-123']}\n * macroId=\"sales_overview\"\n * onAction={(req, res) => audit(req, res)}\n * >\n * <UIResourceRenderer layout={layout} />\n * </MCPActionProvider>\n * ```\n */\nexport const MCPActionProvider: ParentComponent<MCPActionProviderProps> = (props) => {\n const [isExecuting, setIsExecuting] = createSignal(false)\n const [lastResult, setLastResult] = createSignal<ActionResult>()\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [spaceIds, _setSpaceIds] = createSignal<string[]>(props.spaceIds || [])\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [macroId, _setMacroId] = createSignal<string | undefined>(props.macroId)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [availableTools, _setAvailableTools] = createSignal<string[]>(props.availableTools || [])\n\n // Update signals when props change\n // Note: This is a simple approach; for more complex scenarios, consider createEffect\n\n const executeAction = async (request: ActionRequest): Promise<ActionResult> => {\n setIsExecuting(true)\n\n try {\n // Enrich request with context\n const enrichedRequest: ActionRequest = {\n ...request,\n spaceIds: request.spaceIds || spaceIds(),\n macroId: request.macroId || macroId(),\n }\n\n // Execute using custom executor or default\n const executor = props.executor || defaultExecutor\n const result = await executor(enrichedRequest)\n\n setLastResult(result)\n\n // Call audit callback if provided\n props.onAction?.(enrichedRequest, result)\n\n // Trigger webhook if provided and action was successful\n if (result.success && props.onWebhook) {\n props.onWebhook({\n type: 'action-completed',\n payload: {\n request: enrichedRequest,\n result,\n },\n })\n }\n\n return result\n } catch (error) {\n const errorResult: ActionResult = {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n timestamp: new Date().toISOString(),\n toolName: request.toolName,\n }\n\n setLastResult(errorResult)\n props.onAction?.(request, errorResult)\n\n return errorResult\n } finally {\n setIsExecuting(false)\n }\n }\n\n const contextValue: MCPActionContextValue = {\n executeAction,\n availableTools,\n spaceIds,\n macroId,\n isExecuting,\n lastResult,\n }\n\n return (\n <MCPActionContext.Provider value={contextValue}>\n {props.children}\n </MCPActionContext.Provider>\n )\n}\n\n/**\n * Hook to access MCP action context\n * Throws if used outside of MCPActionProvider\n *\n * @example\n * ```tsx\n * const { executeAction, isExecuting } = useMCPAction()\n *\n * const handleClick = async () => {\n * const result = await executeAction({\n * toolName: 'search.hub',\n * params: { query: 'revenue Q4' },\n * })\n * }\n * ```\n */\nexport function useMCPAction(): MCPActionContextValue {\n const context = useContext(MCPActionContext)\n if (!context) {\n throw new Error('useMCPAction must be used within an MCPActionProvider')\n }\n return context\n}\n\n/**\n * Hook to access MCP action context with fallback for components\n * outside of provider (uses CustomEvent fallback)\n *\n * @example\n * ```tsx\n * const { executeAction, isExecuting } = useMCPActionSafe()\n * // Works even without MCPActionProvider\n * ```\n */\nexport function useMCPActionSafe(): MCPActionContextValue {\n const context = useContext(MCPActionContext)\n\n if (context) {\n return context\n }\n\n // Fallback implementation for components outside provider\n const [isExecuting, setIsExecuting] = createSignal(false)\n const [lastResult, setLastResult] = createSignal<ActionResult>()\n\n const executeAction = async (request: ActionRequest): Promise<ActionResult> => {\n setIsExecuting(true)\n try {\n const result = await defaultExecutor(request)\n setLastResult(result)\n return result\n } finally {\n setIsExecuting(false)\n }\n }\n\n return {\n executeAction,\n availableTools: () => [],\n spaceIds: () => [],\n macroId: () => undefined,\n isExecuting,\n lastResult,\n }\n}\n\nexport { MCPActionContext }\n"],"names":["MCPActionContext","createContext","defaultExecutor","request","Promise","resolve","timestamp","Date","toISOString","window","event","CustomEvent","detail","toolName","params","spaceIds","macroId","bubbles","responseHandler","e","customEvent","removeEventListener","success","data","error","addEventListener","dispatchEvent","setTimeout","dispatched","MCPActionProvider","props","isExecuting","setIsExecuting","createSignal","lastResult","setLastResult","_setSpaceIds","_setMacroId","availableTools","_setAvailableTools","executeAction","enrichedRequest","executor","result","onAction","onWebhook","type","payload","errorResult","Error","message","contextValue","_$createComponent","Provider","value","children","useMCPAction","context","useContext","useMCPActionSafe","undefined"],"mappings":"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"}
1
+ {"version":3,"file":"MCPActionContext.cjs","sources":["../../src/context/MCPActionContext.tsx"],"sourcesContent":["/**\n * MCPActionContext - Context provider for MCP action execution\n * Phase 5.0: Quick Wins - Replaces CustomEvent with typed context for Mastra integration\n */\n\nimport { createContext, createSignal, useContext, ParentComponent, Accessor } from 'solid-js'\n\n/**\n * Action request payload\n */\nexport interface ActionRequest {\n /**\n * MCP tool name to execute. For a `submit` action with no associated\n * tool, renderers pass the sentinel `'submit'` — branch on `action`,\n * not on `toolName`, to tell a submit apart from a tool call.\n */\n toolName: string\n\n /**\n * Tool parameters\n */\n params?: Record<string, any>\n\n /**\n * Optional space IDs for multi-space context\n */\n spaceIds?: string[]\n\n /**\n * Optional macro ID for template execution\n */\n macroId?: string\n\n /**\n * Action kind (v6.6.1). Lets a host `executor` tell a tool call apart\n * from a form-style `submit`. Absent ⇒ treat as `'tool-call'` (backward\n * compatible — every pre-v6.6.1 request omits it).\n *\n * A `submit` action carries its payload in `params` (e.g. `submit_url`,\n * `connector_id`, `feedback_value`) and **must NOT** be executed as a\n * tool call — the host routes it (e.g. POST to `params.submit_url`).\n */\n action?: 'tool-call' | 'submit' | 'link'\n}\n\n/**\n * Action result from execution\n */\nexport interface ActionResult {\n /**\n * Whether the action was successful\n */\n success: boolean\n\n /**\n * Result data (if successful)\n */\n data?: any\n\n /**\n * Error message (if failed)\n */\n error?: string\n\n /**\n * Execution timestamp\n */\n timestamp: string\n\n /**\n * Tool that was executed\n */\n toolName: string\n}\n\n/**\n * Context value interface\n */\nexport interface MCPActionContextValue {\n /**\n * Execute an MCP action\n */\n executeAction: (request: ActionRequest) => Promise<ActionResult>\n\n /**\n * Currently available tools (from MCP server)\n */\n availableTools: Accessor<string[]>\n\n /**\n * Space IDs in current context\n */\n spaceIds: Accessor<string[]>\n\n /**\n * Current macro ID (if executing within a template)\n */\n macroId: Accessor<string | undefined>\n\n /**\n * Whether an action is currently executing\n */\n isExecuting: Accessor<boolean>\n\n /**\n * Last action result\n */\n lastResult: Accessor<ActionResult | undefined>\n}\n\n/**\n * Props for MCPActionProvider\n */\nexport interface MCPActionProviderProps {\n /**\n * Space IDs for multi-space queries\n */\n spaceIds?: string[]\n\n /**\n * Macro ID when executing within a template\n */\n macroId?: string\n\n /**\n * Available MCP tools\n */\n availableTools?: string[]\n\n /**\n * Callback for action execution (for audit logging)\n */\n onAction?: (request: ActionRequest, result: ActionResult) => void\n\n /**\n * Callback for webhook events (n8n, Zapier integration)\n */\n onWebhook?: (event: { type: string; payload: any }) => void\n\n /**\n * Custom action executor (override default)\n */\n executor?: (request: ActionRequest) => Promise<ActionResult>\n}\n\n// Create the context with undefined default\nconst MCPActionContext = createContext<MCPActionContextValue>()\n\n/**\n * Default action executor using CustomEvent fallback\n * This maintains backward compatibility while allowing Context-based usage\n */\nconst defaultExecutor = async (request: ActionRequest): Promise<ActionResult> => {\n return new Promise((resolve) => {\n const timestamp = new Date().toISOString()\n\n // Dispatch CustomEvent for backward compatibility with existing listeners\n if (typeof window !== 'undefined') {\n const event = new CustomEvent('mcp-action', {\n detail: {\n toolName: request.toolName,\n params: request.params || {},\n spaceIds: request.spaceIds,\n macroId: request.macroId,\n // v6.6.1 — action kind so a window-level listener can route a\n // `submit` (POST to params.submit_url) vs a tool call.\n action: request.action ?? 'tool-call',\n },\n bubbles: true,\n })\n\n // Listen for response event\n const responseHandler = (e: Event) => {\n const customEvent = e as CustomEvent\n window.removeEventListener('mcp-action-response', responseHandler)\n resolve({\n success: customEvent.detail?.success ?? true,\n data: customEvent.detail?.data,\n error: customEvent.detail?.error,\n timestamp,\n toolName: request.toolName,\n })\n }\n\n window.addEventListener('mcp-action-response', responseHandler)\n window.dispatchEvent(event)\n\n // Timeout fallback - resolve as success if no response in 100ms\n // (indicates no listener, action was dispatched)\n setTimeout(() => {\n window.removeEventListener('mcp-action-response', responseHandler)\n resolve({\n success: true,\n data: { dispatched: true },\n timestamp,\n toolName: request.toolName,\n })\n }, 100)\n } else {\n // Server-side: return immediately\n resolve({\n success: false,\n error: 'Actions not available server-side',\n timestamp,\n toolName: request.toolName,\n })\n }\n })\n}\n\n/**\n * MCPActionProvider - Provides action execution context to child components\n *\n * @example\n * ```tsx\n * <MCPActionProvider\n * spaceIds={['space-123']}\n * macroId=\"sales_overview\"\n * onAction={(req, res) => audit(req, res)}\n * >\n * <UIResourceRenderer layout={layout} />\n * </MCPActionProvider>\n * ```\n */\nexport const MCPActionProvider: ParentComponent<MCPActionProviderProps> = (props) => {\n const [isExecuting, setIsExecuting] = createSignal(false)\n const [lastResult, setLastResult] = createSignal<ActionResult>()\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [spaceIds, _setSpaceIds] = createSignal<string[]>(props.spaceIds || [])\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [macroId, _setMacroId] = createSignal<string | undefined>(props.macroId)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [availableTools, _setAvailableTools] = createSignal<string[]>(props.availableTools || [])\n\n // Update signals when props change\n // Note: This is a simple approach; for more complex scenarios, consider createEffect\n\n const executeAction = async (request: ActionRequest): Promise<ActionResult> => {\n setIsExecuting(true)\n\n try {\n // Enrich request with context\n const enrichedRequest: ActionRequest = {\n ...request,\n spaceIds: request.spaceIds || spaceIds(),\n macroId: request.macroId || macroId(),\n }\n\n // Execute using custom executor or default\n const executor = props.executor || defaultExecutor\n const result = await executor(enrichedRequest)\n\n setLastResult(result)\n\n // Call audit callback if provided\n props.onAction?.(enrichedRequest, result)\n\n // Trigger webhook if provided and action was successful\n if (result.success && props.onWebhook) {\n props.onWebhook({\n type: 'action-completed',\n payload: {\n request: enrichedRequest,\n result,\n },\n })\n }\n\n return result\n } catch (error) {\n const errorResult: ActionResult = {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n timestamp: new Date().toISOString(),\n toolName: request.toolName,\n }\n\n setLastResult(errorResult)\n props.onAction?.(request, errorResult)\n\n return errorResult\n } finally {\n setIsExecuting(false)\n }\n }\n\n const contextValue: MCPActionContextValue = {\n executeAction,\n availableTools,\n spaceIds,\n macroId,\n isExecuting,\n lastResult,\n }\n\n return (\n <MCPActionContext.Provider value={contextValue}>\n {props.children}\n </MCPActionContext.Provider>\n )\n}\n\n/**\n * Hook to access MCP action context\n * Throws if used outside of MCPActionProvider\n *\n * @example\n * ```tsx\n * const { executeAction, isExecuting } = useMCPAction()\n *\n * const handleClick = async () => {\n * const result = await executeAction({\n * toolName: 'search.hub',\n * params: { query: 'revenue Q4' },\n * })\n * }\n * ```\n */\nexport function useMCPAction(): MCPActionContextValue {\n const context = useContext(MCPActionContext)\n if (!context) {\n throw new Error('useMCPAction must be used within an MCPActionProvider')\n }\n return context\n}\n\n/**\n * Hook to access MCP action context with fallback for components\n * outside of provider (uses CustomEvent fallback)\n *\n * @example\n * ```tsx\n * const { executeAction, isExecuting } = useMCPActionSafe()\n * // Works even without MCPActionProvider\n * ```\n */\nexport function useMCPActionSafe(): MCPActionContextValue {\n const context = useContext(MCPActionContext)\n\n if (context) {\n return context\n }\n\n // Fallback implementation for components outside provider\n const [isExecuting, setIsExecuting] = createSignal(false)\n const [lastResult, setLastResult] = createSignal<ActionResult>()\n\n const executeAction = async (request: ActionRequest): Promise<ActionResult> => {\n setIsExecuting(true)\n try {\n const result = await defaultExecutor(request)\n setLastResult(result)\n return result\n } finally {\n setIsExecuting(false)\n }\n }\n\n return {\n executeAction,\n availableTools: () => [],\n spaceIds: () => [],\n macroId: () => undefined,\n isExecuting,\n lastResult,\n }\n}\n\nexport { MCPActionContext }\n"],"names":["MCPActionContext","createContext","defaultExecutor","request","Promise","resolve","timestamp","Date","toISOString","window","event","CustomEvent","detail","toolName","params","spaceIds","macroId","action","bubbles","responseHandler","e","customEvent","removeEventListener","success","data","error","addEventListener","dispatchEvent","setTimeout","dispatched","MCPActionProvider","props","isExecuting","setIsExecuting","createSignal","lastResult","setLastResult","_setSpaceIds","_setMacroId","availableTools","_setAvailableTools","executeAction","enrichedRequest","executor","result","onAction","onWebhook","type","payload","errorResult","Error","message","contextValue","_$createComponent","Provider","value","children","useMCPAction","context","useContext","useMCPActionSafe","undefined"],"mappings":"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"}
@@ -8,7 +8,9 @@ import { ParentComponent, Accessor } from 'solid-js';
8
8
  */
9
9
  export interface ActionRequest {
10
10
  /**
11
- * MCP tool name to execute
11
+ * MCP tool name to execute. For a `submit` action with no associated
12
+ * tool, renderers pass the sentinel `'submit'` — branch on `action`,
13
+ * not on `toolName`, to tell a submit apart from a tool call.
12
14
  */
13
15
  toolName: string;
14
16
  /**
@@ -23,6 +25,16 @@ export interface ActionRequest {
23
25
  * Optional macro ID for template execution
24
26
  */
25
27
  macroId?: string;
28
+ /**
29
+ * Action kind (v6.6.1). Lets a host `executor` tell a tool call apart
30
+ * from a form-style `submit`. Absent ⇒ treat as `'tool-call'` (backward
31
+ * compatible — every pre-v6.6.1 request omits it).
32
+ *
33
+ * A `submit` action carries its payload in `params` (e.g. `submit_url`,
34
+ * `connector_id`, `feedback_value`) and **must NOT** be executed as a
35
+ * tool call — the host routes it (e.g. POST to `params.submit_url`).
36
+ */
37
+ action?: 'tool-call' | 'submit' | 'link';
26
38
  }
27
39
  /**
28
40
  * Action result from execution
@@ -1 +1 @@
1
- {"version":3,"file":"MCPActionContext.d.ts","sourceRoot":"","sources":["../../src/context/MCPActionContext.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAA2C,eAAe,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAE7F;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAE5B;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IAEnB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAA;IAEhB;;OAEG;IACH,IAAI,CAAC,EAAE,GAAG,CAAA;IAEV;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,aAAa,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA;IAEhE;;OAEG;IACH,cAAc,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAElC;;OAEG;IACH,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAE5B;;OAEG;IACH,OAAO,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAErC;;OAEG;IACH,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;IAE9B;;OAEG;IACH,UAAU,EAAE,QAAQ,CAAC,YAAY,GAAG,SAAS,CAAC,CAAA;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IAEnB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IAEzB;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,KAAK,IAAI,CAAA;IAEjE;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,KAAK,IAAI,CAAA;IAE3D;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA;CAC7D;AAGD,QAAA,MAAM,gBAAgB,+DAAyC,CAAA;AA6D/D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,iBAAiB,EAAE,eAAe,CAAC,sBAAsB,CA4ErE,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,IAAI,qBAAqB,CAMpD;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,IAAI,qBAAqB,CA8BxD;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAA"}
1
+ {"version":3,"file":"MCPActionContext.d.ts","sourceRoot":"","sources":["../../src/context/MCPActionContext.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAA2C,eAAe,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAE7F;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAE5B;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IAEnB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAA;CACzC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,OAAO,EAAE,OAAO,CAAA;IAEhB;;OAEG;IACH,IAAI,CAAC,EAAE,GAAG,CAAA;IAEV;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,aAAa,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA;IAEhE;;OAEG;IACH,cAAc,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAElC;;OAEG;IACH,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAE5B;;OAEG;IACH,OAAO,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAErC;;OAEG;IACH,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;IAE9B;;OAEG;IACH,UAAU,EAAE,QAAQ,CAAC,YAAY,GAAG,SAAS,CAAC,CAAA;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IAEnB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;IAEzB;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,KAAK,IAAI,CAAA;IAEjE;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,KAAK,IAAI,CAAA;IAE3D;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA;CAC7D;AAGD,QAAA,MAAM,gBAAgB,+DAAyC,CAAA;AAgE/D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,iBAAiB,EAAE,eAAe,CAAC,sBAAsB,CA4ErE,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,IAAI,qBAAqB,CAMpD;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,IAAI,qBAAqB,CA8BxD;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAA"}
@@ -10,7 +10,10 @@ const defaultExecutor = async (request) => {
10
10
  toolName: request.toolName,
11
11
  params: request.params || {},
12
12
  spaceIds: request.spaceIds,
13
- macroId: request.macroId
13
+ macroId: request.macroId,
14
+ // v6.6.1 — action kind so a window-level listener can route a
15
+ // `submit` (POST to params.submit_url) vs a tool call.
16
+ action: request.action ?? "tool-call"
14
17
  },
15
18
  bubbles: true
16
19
  });
@@ -1 +1 @@
1
- {"version":3,"file":"MCPActionContext.js","sources":["../../src/context/MCPActionContext.tsx"],"sourcesContent":["/**\n * MCPActionContext - Context provider for MCP action execution\n * Phase 5.0: Quick Wins - Replaces CustomEvent with typed context for Mastra integration\n */\n\nimport { createContext, createSignal, useContext, ParentComponent, Accessor } from 'solid-js'\n\n/**\n * Action request payload\n */\nexport interface ActionRequest {\n /**\n * MCP tool name to execute\n */\n toolName: string\n\n /**\n * Tool parameters\n */\n params?: Record<string, any>\n\n /**\n * Optional space IDs for multi-space context\n */\n spaceIds?: string[]\n\n /**\n * Optional macro ID for template execution\n */\n macroId?: string\n}\n\n/**\n * Action result from execution\n */\nexport interface ActionResult {\n /**\n * Whether the action was successful\n */\n success: boolean\n\n /**\n * Result data (if successful)\n */\n data?: any\n\n /**\n * Error message (if failed)\n */\n error?: string\n\n /**\n * Execution timestamp\n */\n timestamp: string\n\n /**\n * Tool that was executed\n */\n toolName: string\n}\n\n/**\n * Context value interface\n */\nexport interface MCPActionContextValue {\n /**\n * Execute an MCP action\n */\n executeAction: (request: ActionRequest) => Promise<ActionResult>\n\n /**\n * Currently available tools (from MCP server)\n */\n availableTools: Accessor<string[]>\n\n /**\n * Space IDs in current context\n */\n spaceIds: Accessor<string[]>\n\n /**\n * Current macro ID (if executing within a template)\n */\n macroId: Accessor<string | undefined>\n\n /**\n * Whether an action is currently executing\n */\n isExecuting: Accessor<boolean>\n\n /**\n * Last action result\n */\n lastResult: Accessor<ActionResult | undefined>\n}\n\n/**\n * Props for MCPActionProvider\n */\nexport interface MCPActionProviderProps {\n /**\n * Space IDs for multi-space queries\n */\n spaceIds?: string[]\n\n /**\n * Macro ID when executing within a template\n */\n macroId?: string\n\n /**\n * Available MCP tools\n */\n availableTools?: string[]\n\n /**\n * Callback for action execution (for audit logging)\n */\n onAction?: (request: ActionRequest, result: ActionResult) => void\n\n /**\n * Callback for webhook events (n8n, Zapier integration)\n */\n onWebhook?: (event: { type: string; payload: any }) => void\n\n /**\n * Custom action executor (override default)\n */\n executor?: (request: ActionRequest) => Promise<ActionResult>\n}\n\n// Create the context with undefined default\nconst MCPActionContext = createContext<MCPActionContextValue>()\n\n/**\n * Default action executor using CustomEvent fallback\n * This maintains backward compatibility while allowing Context-based usage\n */\nconst defaultExecutor = async (request: ActionRequest): Promise<ActionResult> => {\n return new Promise((resolve) => {\n const timestamp = new Date().toISOString()\n\n // Dispatch CustomEvent for backward compatibility with existing listeners\n if (typeof window !== 'undefined') {\n const event = new CustomEvent('mcp-action', {\n detail: {\n toolName: request.toolName,\n params: request.params || {},\n spaceIds: request.spaceIds,\n macroId: request.macroId,\n },\n bubbles: true,\n })\n\n // Listen for response event\n const responseHandler = (e: Event) => {\n const customEvent = e as CustomEvent\n window.removeEventListener('mcp-action-response', responseHandler)\n resolve({\n success: customEvent.detail?.success ?? true,\n data: customEvent.detail?.data,\n error: customEvent.detail?.error,\n timestamp,\n toolName: request.toolName,\n })\n }\n\n window.addEventListener('mcp-action-response', responseHandler)\n window.dispatchEvent(event)\n\n // Timeout fallback - resolve as success if no response in 100ms\n // (indicates no listener, action was dispatched)\n setTimeout(() => {\n window.removeEventListener('mcp-action-response', responseHandler)\n resolve({\n success: true,\n data: { dispatched: true },\n timestamp,\n toolName: request.toolName,\n })\n }, 100)\n } else {\n // Server-side: return immediately\n resolve({\n success: false,\n error: 'Actions not available server-side',\n timestamp,\n toolName: request.toolName,\n })\n }\n })\n}\n\n/**\n * MCPActionProvider - Provides action execution context to child components\n *\n * @example\n * ```tsx\n * <MCPActionProvider\n * spaceIds={['space-123']}\n * macroId=\"sales_overview\"\n * onAction={(req, res) => audit(req, res)}\n * >\n * <UIResourceRenderer layout={layout} />\n * </MCPActionProvider>\n * ```\n */\nexport const MCPActionProvider: ParentComponent<MCPActionProviderProps> = (props) => {\n const [isExecuting, setIsExecuting] = createSignal(false)\n const [lastResult, setLastResult] = createSignal<ActionResult>()\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [spaceIds, _setSpaceIds] = createSignal<string[]>(props.spaceIds || [])\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [macroId, _setMacroId] = createSignal<string | undefined>(props.macroId)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [availableTools, _setAvailableTools] = createSignal<string[]>(props.availableTools || [])\n\n // Update signals when props change\n // Note: This is a simple approach; for more complex scenarios, consider createEffect\n\n const executeAction = async (request: ActionRequest): Promise<ActionResult> => {\n setIsExecuting(true)\n\n try {\n // Enrich request with context\n const enrichedRequest: ActionRequest = {\n ...request,\n spaceIds: request.spaceIds || spaceIds(),\n macroId: request.macroId || macroId(),\n }\n\n // Execute using custom executor or default\n const executor = props.executor || defaultExecutor\n const result = await executor(enrichedRequest)\n\n setLastResult(result)\n\n // Call audit callback if provided\n props.onAction?.(enrichedRequest, result)\n\n // Trigger webhook if provided and action was successful\n if (result.success && props.onWebhook) {\n props.onWebhook({\n type: 'action-completed',\n payload: {\n request: enrichedRequest,\n result,\n },\n })\n }\n\n return result\n } catch (error) {\n const errorResult: ActionResult = {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n timestamp: new Date().toISOString(),\n toolName: request.toolName,\n }\n\n setLastResult(errorResult)\n props.onAction?.(request, errorResult)\n\n return errorResult\n } finally {\n setIsExecuting(false)\n }\n }\n\n const contextValue: MCPActionContextValue = {\n executeAction,\n availableTools,\n spaceIds,\n macroId,\n isExecuting,\n lastResult,\n }\n\n return (\n <MCPActionContext.Provider value={contextValue}>\n {props.children}\n </MCPActionContext.Provider>\n )\n}\n\n/**\n * Hook to access MCP action context\n * Throws if used outside of MCPActionProvider\n *\n * @example\n * ```tsx\n * const { executeAction, isExecuting } = useMCPAction()\n *\n * const handleClick = async () => {\n * const result = await executeAction({\n * toolName: 'search.hub',\n * params: { query: 'revenue Q4' },\n * })\n * }\n * ```\n */\nexport function useMCPAction(): MCPActionContextValue {\n const context = useContext(MCPActionContext)\n if (!context) {\n throw new Error('useMCPAction must be used within an MCPActionProvider')\n }\n return context\n}\n\n/**\n * Hook to access MCP action context with fallback for components\n * outside of provider (uses CustomEvent fallback)\n *\n * @example\n * ```tsx\n * const { executeAction, isExecuting } = useMCPActionSafe()\n * // Works even without MCPActionProvider\n * ```\n */\nexport function useMCPActionSafe(): MCPActionContextValue {\n const context = useContext(MCPActionContext)\n\n if (context) {\n return context\n }\n\n // Fallback implementation for components outside provider\n const [isExecuting, setIsExecuting] = createSignal(false)\n const [lastResult, setLastResult] = createSignal<ActionResult>()\n\n const executeAction = async (request: ActionRequest): Promise<ActionResult> => {\n setIsExecuting(true)\n try {\n const result = await defaultExecutor(request)\n setLastResult(result)\n return result\n } finally {\n setIsExecuting(false)\n }\n }\n\n return {\n executeAction,\n availableTools: () => [],\n spaceIds: () => [],\n macroId: () => undefined,\n isExecuting,\n lastResult,\n }\n}\n\nexport { MCPActionContext }\n"],"names":["MCPActionContext","createContext","defaultExecutor","request","Promise","resolve","timestamp","Date","toISOString","window","event","CustomEvent","detail","toolName","params","spaceIds","macroId","bubbles","responseHandler","e","customEvent","removeEventListener","success","data","error","addEventListener","dispatchEvent","setTimeout","dispatched","MCPActionProvider","props","isExecuting","setIsExecuting","createSignal","lastResult","setLastResult","_setSpaceIds","_setMacroId","availableTools","_setAvailableTools","executeAction","enrichedRequest","executor","result","onAction","onWebhook","type","payload","errorResult","Error","message","contextValue","_$createComponent","Provider","value","children","useMCPAction","context","useContext","useMCPActionSafe","undefined"],"mappings":"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"}
1
+ {"version":3,"file":"MCPActionContext.js","sources":["../../src/context/MCPActionContext.tsx"],"sourcesContent":["/**\n * MCPActionContext - Context provider for MCP action execution\n * Phase 5.0: Quick Wins - Replaces CustomEvent with typed context for Mastra integration\n */\n\nimport { createContext, createSignal, useContext, ParentComponent, Accessor } from 'solid-js'\n\n/**\n * Action request payload\n */\nexport interface ActionRequest {\n /**\n * MCP tool name to execute. For a `submit` action with no associated\n * tool, renderers pass the sentinel `'submit'` — branch on `action`,\n * not on `toolName`, to tell a submit apart from a tool call.\n */\n toolName: string\n\n /**\n * Tool parameters\n */\n params?: Record<string, any>\n\n /**\n * Optional space IDs for multi-space context\n */\n spaceIds?: string[]\n\n /**\n * Optional macro ID for template execution\n */\n macroId?: string\n\n /**\n * Action kind (v6.6.1). Lets a host `executor` tell a tool call apart\n * from a form-style `submit`. Absent ⇒ treat as `'tool-call'` (backward\n * compatible — every pre-v6.6.1 request omits it).\n *\n * A `submit` action carries its payload in `params` (e.g. `submit_url`,\n * `connector_id`, `feedback_value`) and **must NOT** be executed as a\n * tool call — the host routes it (e.g. POST to `params.submit_url`).\n */\n action?: 'tool-call' | 'submit' | 'link'\n}\n\n/**\n * Action result from execution\n */\nexport interface ActionResult {\n /**\n * Whether the action was successful\n */\n success: boolean\n\n /**\n * Result data (if successful)\n */\n data?: any\n\n /**\n * Error message (if failed)\n */\n error?: string\n\n /**\n * Execution timestamp\n */\n timestamp: string\n\n /**\n * Tool that was executed\n */\n toolName: string\n}\n\n/**\n * Context value interface\n */\nexport interface MCPActionContextValue {\n /**\n * Execute an MCP action\n */\n executeAction: (request: ActionRequest) => Promise<ActionResult>\n\n /**\n * Currently available tools (from MCP server)\n */\n availableTools: Accessor<string[]>\n\n /**\n * Space IDs in current context\n */\n spaceIds: Accessor<string[]>\n\n /**\n * Current macro ID (if executing within a template)\n */\n macroId: Accessor<string | undefined>\n\n /**\n * Whether an action is currently executing\n */\n isExecuting: Accessor<boolean>\n\n /**\n * Last action result\n */\n lastResult: Accessor<ActionResult | undefined>\n}\n\n/**\n * Props for MCPActionProvider\n */\nexport interface MCPActionProviderProps {\n /**\n * Space IDs for multi-space queries\n */\n spaceIds?: string[]\n\n /**\n * Macro ID when executing within a template\n */\n macroId?: string\n\n /**\n * Available MCP tools\n */\n availableTools?: string[]\n\n /**\n * Callback for action execution (for audit logging)\n */\n onAction?: (request: ActionRequest, result: ActionResult) => void\n\n /**\n * Callback for webhook events (n8n, Zapier integration)\n */\n onWebhook?: (event: { type: string; payload: any }) => void\n\n /**\n * Custom action executor (override default)\n */\n executor?: (request: ActionRequest) => Promise<ActionResult>\n}\n\n// Create the context with undefined default\nconst MCPActionContext = createContext<MCPActionContextValue>()\n\n/**\n * Default action executor using CustomEvent fallback\n * This maintains backward compatibility while allowing Context-based usage\n */\nconst defaultExecutor = async (request: ActionRequest): Promise<ActionResult> => {\n return new Promise((resolve) => {\n const timestamp = new Date().toISOString()\n\n // Dispatch CustomEvent for backward compatibility with existing listeners\n if (typeof window !== 'undefined') {\n const event = new CustomEvent('mcp-action', {\n detail: {\n toolName: request.toolName,\n params: request.params || {},\n spaceIds: request.spaceIds,\n macroId: request.macroId,\n // v6.6.1 — action kind so a window-level listener can route a\n // `submit` (POST to params.submit_url) vs a tool call.\n action: request.action ?? 'tool-call',\n },\n bubbles: true,\n })\n\n // Listen for response event\n const responseHandler = (e: Event) => {\n const customEvent = e as CustomEvent\n window.removeEventListener('mcp-action-response', responseHandler)\n resolve({\n success: customEvent.detail?.success ?? true,\n data: customEvent.detail?.data,\n error: customEvent.detail?.error,\n timestamp,\n toolName: request.toolName,\n })\n }\n\n window.addEventListener('mcp-action-response', responseHandler)\n window.dispatchEvent(event)\n\n // Timeout fallback - resolve as success if no response in 100ms\n // (indicates no listener, action was dispatched)\n setTimeout(() => {\n window.removeEventListener('mcp-action-response', responseHandler)\n resolve({\n success: true,\n data: { dispatched: true },\n timestamp,\n toolName: request.toolName,\n })\n }, 100)\n } else {\n // Server-side: return immediately\n resolve({\n success: false,\n error: 'Actions not available server-side',\n timestamp,\n toolName: request.toolName,\n })\n }\n })\n}\n\n/**\n * MCPActionProvider - Provides action execution context to child components\n *\n * @example\n * ```tsx\n * <MCPActionProvider\n * spaceIds={['space-123']}\n * macroId=\"sales_overview\"\n * onAction={(req, res) => audit(req, res)}\n * >\n * <UIResourceRenderer layout={layout} />\n * </MCPActionProvider>\n * ```\n */\nexport const MCPActionProvider: ParentComponent<MCPActionProviderProps> = (props) => {\n const [isExecuting, setIsExecuting] = createSignal(false)\n const [lastResult, setLastResult] = createSignal<ActionResult>()\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [spaceIds, _setSpaceIds] = createSignal<string[]>(props.spaceIds || [])\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [macroId, _setMacroId] = createSignal<string | undefined>(props.macroId)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [availableTools, _setAvailableTools] = createSignal<string[]>(props.availableTools || [])\n\n // Update signals when props change\n // Note: This is a simple approach; for more complex scenarios, consider createEffect\n\n const executeAction = async (request: ActionRequest): Promise<ActionResult> => {\n setIsExecuting(true)\n\n try {\n // Enrich request with context\n const enrichedRequest: ActionRequest = {\n ...request,\n spaceIds: request.spaceIds || spaceIds(),\n macroId: request.macroId || macroId(),\n }\n\n // Execute using custom executor or default\n const executor = props.executor || defaultExecutor\n const result = await executor(enrichedRequest)\n\n setLastResult(result)\n\n // Call audit callback if provided\n props.onAction?.(enrichedRequest, result)\n\n // Trigger webhook if provided and action was successful\n if (result.success && props.onWebhook) {\n props.onWebhook({\n type: 'action-completed',\n payload: {\n request: enrichedRequest,\n result,\n },\n })\n }\n\n return result\n } catch (error) {\n const errorResult: ActionResult = {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n timestamp: new Date().toISOString(),\n toolName: request.toolName,\n }\n\n setLastResult(errorResult)\n props.onAction?.(request, errorResult)\n\n return errorResult\n } finally {\n setIsExecuting(false)\n }\n }\n\n const contextValue: MCPActionContextValue = {\n executeAction,\n availableTools,\n spaceIds,\n macroId,\n isExecuting,\n lastResult,\n }\n\n return (\n <MCPActionContext.Provider value={contextValue}>\n {props.children}\n </MCPActionContext.Provider>\n )\n}\n\n/**\n * Hook to access MCP action context\n * Throws if used outside of MCPActionProvider\n *\n * @example\n * ```tsx\n * const { executeAction, isExecuting } = useMCPAction()\n *\n * const handleClick = async () => {\n * const result = await executeAction({\n * toolName: 'search.hub',\n * params: { query: 'revenue Q4' },\n * })\n * }\n * ```\n */\nexport function useMCPAction(): MCPActionContextValue {\n const context = useContext(MCPActionContext)\n if (!context) {\n throw new Error('useMCPAction must be used within an MCPActionProvider')\n }\n return context\n}\n\n/**\n * Hook to access MCP action context with fallback for components\n * outside of provider (uses CustomEvent fallback)\n *\n * @example\n * ```tsx\n * const { executeAction, isExecuting } = useMCPActionSafe()\n * // Works even without MCPActionProvider\n * ```\n */\nexport function useMCPActionSafe(): MCPActionContextValue {\n const context = useContext(MCPActionContext)\n\n if (context) {\n return context\n }\n\n // Fallback implementation for components outside provider\n const [isExecuting, setIsExecuting] = createSignal(false)\n const [lastResult, setLastResult] = createSignal<ActionResult>()\n\n const executeAction = async (request: ActionRequest): Promise<ActionResult> => {\n setIsExecuting(true)\n try {\n const result = await defaultExecutor(request)\n setLastResult(result)\n return result\n } finally {\n setIsExecuting(false)\n }\n }\n\n return {\n executeAction,\n availableTools: () => [],\n spaceIds: () => [],\n macroId: () => undefined,\n isExecuting,\n lastResult,\n }\n}\n\nexport { MCPActionContext }\n"],"names":["MCPActionContext","createContext","defaultExecutor","request","Promise","resolve","timestamp","Date","toISOString","window","event","CustomEvent","detail","toolName","params","spaceIds","macroId","action","bubbles","responseHandler","e","customEvent","removeEventListener","success","data","error","addEventListener","dispatchEvent","setTimeout","dispatched","MCPActionProvider","props","isExecuting","setIsExecuting","createSignal","lastResult","setLastResult","_setSpaceIds","_setMacroId","availableTools","_setAvailableTools","executeAction","enrichedRequest","executor","result","onAction","onWebhook","type","payload","errorResult","Error","message","contextValue","_$createComponent","Provider","value","children","useMCPAction","context","useContext","useMCPActionSafe","undefined"],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const web = require("solid-js/web");
4
+ const solidJs = require("solid-js");
5
+ const DEFAULT_MCPUI_STRINGS = {
6
+ expand: "Expand",
7
+ expandedView: "Expanded view",
8
+ copyToClipboard: "Copy to clipboard",
9
+ closeExpandedView: "Close expanded view",
10
+ feedbackUseful: "Useful",
11
+ feedbackNotUseful: "Not useful",
12
+ feedbackPositiveAck: "Thanks!",
13
+ feedbackNegativeAck: "Noted — we'll improve",
14
+ retry: "Retry"
15
+ };
16
+ const MCPUIStringsContext = solidJs.createContext(DEFAULT_MCPUI_STRINGS);
17
+ function useMCPUIStrings() {
18
+ return solidJs.useContext(MCPUIStringsContext);
19
+ }
20
+ function MCPUIStringsProvider(props) {
21
+ const value = () => ({
22
+ ...DEFAULT_MCPUI_STRINGS,
23
+ ...props.strings
24
+ });
25
+ return web.createComponent(MCPUIStringsContext.Provider, {
26
+ get value() {
27
+ return value();
28
+ },
29
+ get children() {
30
+ return props.children;
31
+ }
32
+ });
33
+ }
34
+ exports.DEFAULT_MCPUI_STRINGS = DEFAULT_MCPUI_STRINGS;
35
+ exports.MCPUIStringsContext = MCPUIStringsContext;
36
+ exports.MCPUIStringsProvider = MCPUIStringsProvider;
37
+ exports.useMCPUIStrings = useMCPUIStrings;
38
+ //# sourceMappingURL=MCPUIStringsContext.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MCPUIStringsContext.cjs","sources":["../../src/context/MCPUIStringsContext.tsx"],"sourcesContent":["/**\n * MCPUIStringsContext — i18n for the library's own \"chrome\" strings.\n *\n * @since v6.6.0 (D2 / R4 of ROADMAP-opendata-macro-mcpui)\n *\n * ## Scope — chrome only, NOT content\n *\n * MCP-UI renders two kinds of text :\n *\n * - **Content** — table headers, chart titles, action labels, prompt\n * questions. These come from the payload and are ALREADY localized by\n * whoever produced the payload (the connector / MCP server). MCP-UI\n * renders them verbatim and this context never touches them.\n * - **Chrome** — the handful of strings the library itself hardcodes :\n * the expand-button tooltip, the feedback acknowledgements, etc. THIS\n * is what `MCPUIStrings` covers.\n *\n * There is deliberately no full i18n framework here : no per-renderer\n * `locale` prop, no message catalogue, no ICU. A flat string map behind a\n * context is enough — the chrome surface is small and static.\n *\n * ## Defaults are English\n *\n * `DEFAULT_MCPUI_STRINGS` is English. A published library should not ship\n * hardcoded French. Consumers that want another language wrap their tree\n * in `<MCPUIStringsProvider strings={...}>` with a partial override.\n *\n * Component props that already carry a label (e.g. `FeedbackInline`'s\n * `positiveAck`, `ExpandableWrapper`'s `copyLabel`) keep priority over the\n * provider — the provider only fills the gap when no explicit prop is set.\n *\n * @example\n * ```tsx\n * import { MCPUIStringsProvider } from '@seed-ship/mcp-ui-solid'\n *\n * <MCPUIStringsProvider strings={{ expand: 'Agrandir', feedbackUseful: 'Utile' }}>\n * <App />\n * </MCPUIStringsProvider>\n * ```\n */\n\nimport { createContext, useContext, type JSX } from 'solid-js'\n\n/**\n * The library's own chrome strings. Flat map, no interpolation.\n *\n * Marked exhaustive as of v6.6.0 ; new chrome strings added by later\n * renderers extend this interface (the `MCPUIStringsProvider` merge keeps\n * older consumers working — any unset key falls back to the EN default).\n */\nexport interface MCPUIStrings {\n // ── ExpandableWrapper toolbar ──────────────────────────────\n /** `title` of the expand-to-fullscreen button. */\n expand: string\n /** Heading + `aria-label` of the fullscreen modal when no title is given. */\n expandedView: string\n /** Default tooltip of the copy button (overridden by `copyLabel` prop). */\n copyToClipboard: string\n /** `aria-label` of the close button in the fullscreen modal. */\n closeExpandedView: string\n\n // ── FeedbackInline (response-quality feedback) ─────────────\n /** `title` of the thumb-up button. */\n feedbackUseful: string\n /** `title` of the thumb-down button. */\n feedbackNotUseful: string\n /** Acknowledgement shown after a positive rating (overridden by `positiveAck`). */\n feedbackPositiveAck: string\n /** Acknowledgement shown after a negative rating (overridden by `negativeAck`). */\n feedbackNegativeAck: string\n\n // ── Generic chrome ────────────────────────────────────────\n /** Label of the streaming retry button. */\n retry: string\n}\n\n/**\n * English defaults. A published library ships no hardcoded non-English\n * chrome — consumers localize via `<MCPUIStringsProvider>`.\n */\nexport const DEFAULT_MCPUI_STRINGS: MCPUIStrings = {\n expand: 'Expand',\n expandedView: 'Expanded view',\n copyToClipboard: 'Copy to clipboard',\n closeExpandedView: 'Close expanded view',\n feedbackUseful: 'Useful',\n feedbackNotUseful: 'Not useful',\n feedbackPositiveAck: 'Thanks!',\n feedbackNegativeAck: \"Noted — we'll improve\",\n retry: 'Retry',\n}\n\nexport const MCPUIStringsContext = createContext<MCPUIStrings>(DEFAULT_MCPUI_STRINGS)\n\n/**\n * Reads the active chrome strings. Returns `DEFAULT_MCPUI_STRINGS` when no\n * `<MCPUIStringsProvider>` is mounted above — every renderer works\n * standalone with English chrome.\n */\nexport function useMCPUIStrings(): MCPUIStrings {\n return useContext(MCPUIStringsContext)\n}\n\nexport interface MCPUIStringsProviderProps {\n /**\n * Partial override of the chrome strings. Any key left unset falls back\n * to the English `DEFAULT_MCPUI_STRINGS` — so a consumer can localize\n * just the strings they care about.\n */\n strings?: Partial<MCPUIStrings>\n children: JSX.Element\n}\n\n/**\n * Provides localized chrome strings to every MCP-UI renderer below it.\n * Merges the partial `strings` override over the English defaults.\n */\nexport function MCPUIStringsProvider(props: MCPUIStringsProviderProps): JSX.Element {\n // `props.strings` is read inside the getter so a reactive override\n // (signal-backed) re-propagates ; for the common static case it is read\n // once at mount.\n const value = (): MCPUIStrings => ({ ...DEFAULT_MCPUI_STRINGS, ...props.strings })\n return (\n <MCPUIStringsContext.Provider value={value()}>\n {props.children}\n </MCPUIStringsContext.Provider>\n )\n}\n"],"names":["DEFAULT_MCPUI_STRINGS","expand","expandedView","copyToClipboard","closeExpandedView","feedbackUseful","feedbackNotUseful","feedbackPositiveAck","feedbackNegativeAck","retry","MCPUIStringsContext","createContext","useMCPUIStrings","useContext","MCPUIStringsProvider","props","value","strings","_$createComponent","Provider","children"],"mappings":";;;;AAgFO,MAAMA,wBAAsC;AAAA,EACjDC,QAAQ;AAAA,EACRC,cAAc;AAAA,EACdC,iBAAiB;AAAA,EACjBC,mBAAmB;AAAA,EACnBC,gBAAgB;AAAA,EAChBC,mBAAmB;AAAA,EACnBC,qBAAqB;AAAA,EACrBC,qBAAqB;AAAA,EACrBC,OAAO;AACT;AAEO,MAAMC,sBAAsBC,QAAAA,cAA4BX,qBAAqB;AAO7E,SAASY,kBAAgC;AAC9C,SAAOC,QAAAA,WAAWH,mBAAmB;AACvC;AAgBO,SAASI,qBAAqBC,OAA+C;AAIlF,QAAMC,QAAQA,OAAqB;AAAA,IAAE,GAAGhB;AAAAA,IAAuB,GAAGe,MAAME;AAAAA,EAAAA;AACxE,SAAAC,IAAAA,gBACGR,oBAAoBS,UAAQ;AAAA,IAAA,IAACH,QAAK;AAAA,aAAEA,MAAAA;AAAAA,IAAO;AAAA,IAAA,IAAAI,WAAA;AAAA,aACzCL,MAAMK;AAAAA,IAAQ;AAAA,EAAA,CAAA;AAGrB;;;;;"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * MCPUIStringsContext — i18n for the library's own "chrome" strings.
3
+ *
4
+ * @since v6.6.0 (D2 / R4 of ROADMAP-opendata-macro-mcpui)
5
+ *
6
+ * ## Scope — chrome only, NOT content
7
+ *
8
+ * MCP-UI renders two kinds of text :
9
+ *
10
+ * - **Content** — table headers, chart titles, action labels, prompt
11
+ * questions. These come from the payload and are ALREADY localized by
12
+ * whoever produced the payload (the connector / MCP server). MCP-UI
13
+ * renders them verbatim and this context never touches them.
14
+ * - **Chrome** — the handful of strings the library itself hardcodes :
15
+ * the expand-button tooltip, the feedback acknowledgements, etc. THIS
16
+ * is what `MCPUIStrings` covers.
17
+ *
18
+ * There is deliberately no full i18n framework here : no per-renderer
19
+ * `locale` prop, no message catalogue, no ICU. A flat string map behind a
20
+ * context is enough — the chrome surface is small and static.
21
+ *
22
+ * ## Defaults are English
23
+ *
24
+ * `DEFAULT_MCPUI_STRINGS` is English. A published library should not ship
25
+ * hardcoded French. Consumers that want another language wrap their tree
26
+ * in `<MCPUIStringsProvider strings={...}>` with a partial override.
27
+ *
28
+ * Component props that already carry a label (e.g. `FeedbackInline`'s
29
+ * `positiveAck`, `ExpandableWrapper`'s `copyLabel`) keep priority over the
30
+ * provider — the provider only fills the gap when no explicit prop is set.
31
+ *
32
+ * @example
33
+ * ```tsx
34
+ * import { MCPUIStringsProvider } from '@seed-ship/mcp-ui-solid'
35
+ *
36
+ * <MCPUIStringsProvider strings={{ expand: 'Agrandir', feedbackUseful: 'Utile' }}>
37
+ * <App />
38
+ * </MCPUIStringsProvider>
39
+ * ```
40
+ */
41
+ import { type JSX } from 'solid-js';
42
+ /**
43
+ * The library's own chrome strings. Flat map, no interpolation.
44
+ *
45
+ * Marked exhaustive as of v6.6.0 ; new chrome strings added by later
46
+ * renderers extend this interface (the `MCPUIStringsProvider` merge keeps
47
+ * older consumers working — any unset key falls back to the EN default).
48
+ */
49
+ export interface MCPUIStrings {
50
+ /** `title` of the expand-to-fullscreen button. */
51
+ expand: string;
52
+ /** Heading + `aria-label` of the fullscreen modal when no title is given. */
53
+ expandedView: string;
54
+ /** Default tooltip of the copy button (overridden by `copyLabel` prop). */
55
+ copyToClipboard: string;
56
+ /** `aria-label` of the close button in the fullscreen modal. */
57
+ closeExpandedView: string;
58
+ /** `title` of the thumb-up button. */
59
+ feedbackUseful: string;
60
+ /** `title` of the thumb-down button. */
61
+ feedbackNotUseful: string;
62
+ /** Acknowledgement shown after a positive rating (overridden by `positiveAck`). */
63
+ feedbackPositiveAck: string;
64
+ /** Acknowledgement shown after a negative rating (overridden by `negativeAck`). */
65
+ feedbackNegativeAck: string;
66
+ /** Label of the streaming retry button. */
67
+ retry: string;
68
+ }
69
+ /**
70
+ * English defaults. A published library ships no hardcoded non-English
71
+ * chrome — consumers localize via `<MCPUIStringsProvider>`.
72
+ */
73
+ export declare const DEFAULT_MCPUI_STRINGS: MCPUIStrings;
74
+ export declare const MCPUIStringsContext: import("solid-js").Context<MCPUIStrings>;
75
+ /**
76
+ * Reads the active chrome strings. Returns `DEFAULT_MCPUI_STRINGS` when no
77
+ * `<MCPUIStringsProvider>` is mounted above — every renderer works
78
+ * standalone with English chrome.
79
+ */
80
+ export declare function useMCPUIStrings(): MCPUIStrings;
81
+ export interface MCPUIStringsProviderProps {
82
+ /**
83
+ * Partial override of the chrome strings. Any key left unset falls back
84
+ * to the English `DEFAULT_MCPUI_STRINGS` — so a consumer can localize
85
+ * just the strings they care about.
86
+ */
87
+ strings?: Partial<MCPUIStrings>;
88
+ children: JSX.Element;
89
+ }
90
+ /**
91
+ * Provides localized chrome strings to every MCP-UI renderer below it.
92
+ * Merges the partial `strings` override over the English defaults.
93
+ */
94
+ export declare function MCPUIStringsProvider(props: MCPUIStringsProviderProps): JSX.Element;
95
+ //# sourceMappingURL=MCPUIStringsContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MCPUIStringsContext.d.ts","sourceRoot":"","sources":["../../src/context/MCPUIStringsContext.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAA6B,KAAK,GAAG,EAAE,MAAM,UAAU,CAAA;AAE9D;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAE3B,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAA;IACd,6EAA6E;IAC7E,YAAY,EAAE,MAAM,CAAA;IACpB,2EAA2E;IAC3E,eAAe,EAAE,MAAM,CAAA;IACvB,gEAAgE;IAChE,iBAAiB,EAAE,MAAM,CAAA;IAGzB,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAA;IACtB,wCAAwC;IACxC,iBAAiB,EAAE,MAAM,CAAA;IACzB,mFAAmF;IACnF,mBAAmB,EAAE,MAAM,CAAA;IAC3B,mFAAmF;IACnF,mBAAmB,EAAE,MAAM,CAAA;IAG3B,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,YAUnC,CAAA;AAED,eAAO,MAAM,mBAAmB,0CAAqD,CAAA;AAErF;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAE9C;AAED,MAAM,WAAW,yBAAyB;IACxC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;IAC/B,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAA;CACtB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,GAAG,GAAG,CAAC,OAAO,CAUlF"}
@@ -0,0 +1,38 @@
1
+ import { createComponent } from "solid-js/web";
2
+ import { createContext, useContext } from "solid-js";
3
+ const DEFAULT_MCPUI_STRINGS = {
4
+ expand: "Expand",
5
+ expandedView: "Expanded view",
6
+ copyToClipboard: "Copy to clipboard",
7
+ closeExpandedView: "Close expanded view",
8
+ feedbackUseful: "Useful",
9
+ feedbackNotUseful: "Not useful",
10
+ feedbackPositiveAck: "Thanks!",
11
+ feedbackNegativeAck: "Noted — we'll improve",
12
+ retry: "Retry"
13
+ };
14
+ const MCPUIStringsContext = createContext(DEFAULT_MCPUI_STRINGS);
15
+ function useMCPUIStrings() {
16
+ return useContext(MCPUIStringsContext);
17
+ }
18
+ function MCPUIStringsProvider(props) {
19
+ const value = () => ({
20
+ ...DEFAULT_MCPUI_STRINGS,
21
+ ...props.strings
22
+ });
23
+ return createComponent(MCPUIStringsContext.Provider, {
24
+ get value() {
25
+ return value();
26
+ },
27
+ get children() {
28
+ return props.children;
29
+ }
30
+ });
31
+ }
32
+ export {
33
+ DEFAULT_MCPUI_STRINGS,
34
+ MCPUIStringsContext,
35
+ MCPUIStringsProvider,
36
+ useMCPUIStrings
37
+ };
38
+ //# sourceMappingURL=MCPUIStringsContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MCPUIStringsContext.js","sources":["../../src/context/MCPUIStringsContext.tsx"],"sourcesContent":["/**\n * MCPUIStringsContext — i18n for the library's own \"chrome\" strings.\n *\n * @since v6.6.0 (D2 / R4 of ROADMAP-opendata-macro-mcpui)\n *\n * ## Scope — chrome only, NOT content\n *\n * MCP-UI renders two kinds of text :\n *\n * - **Content** — table headers, chart titles, action labels, prompt\n * questions. These come from the payload and are ALREADY localized by\n * whoever produced the payload (the connector / MCP server). MCP-UI\n * renders them verbatim and this context never touches them.\n * - **Chrome** — the handful of strings the library itself hardcodes :\n * the expand-button tooltip, the feedback acknowledgements, etc. THIS\n * is what `MCPUIStrings` covers.\n *\n * There is deliberately no full i18n framework here : no per-renderer\n * `locale` prop, no message catalogue, no ICU. A flat string map behind a\n * context is enough — the chrome surface is small and static.\n *\n * ## Defaults are English\n *\n * `DEFAULT_MCPUI_STRINGS` is English. A published library should not ship\n * hardcoded French. Consumers that want another language wrap their tree\n * in `<MCPUIStringsProvider strings={...}>` with a partial override.\n *\n * Component props that already carry a label (e.g. `FeedbackInline`'s\n * `positiveAck`, `ExpandableWrapper`'s `copyLabel`) keep priority over the\n * provider — the provider only fills the gap when no explicit prop is set.\n *\n * @example\n * ```tsx\n * import { MCPUIStringsProvider } from '@seed-ship/mcp-ui-solid'\n *\n * <MCPUIStringsProvider strings={{ expand: 'Agrandir', feedbackUseful: 'Utile' }}>\n * <App />\n * </MCPUIStringsProvider>\n * ```\n */\n\nimport { createContext, useContext, type JSX } from 'solid-js'\n\n/**\n * The library's own chrome strings. Flat map, no interpolation.\n *\n * Marked exhaustive as of v6.6.0 ; new chrome strings added by later\n * renderers extend this interface (the `MCPUIStringsProvider` merge keeps\n * older consumers working — any unset key falls back to the EN default).\n */\nexport interface MCPUIStrings {\n // ── ExpandableWrapper toolbar ──────────────────────────────\n /** `title` of the expand-to-fullscreen button. */\n expand: string\n /** Heading + `aria-label` of the fullscreen modal when no title is given. */\n expandedView: string\n /** Default tooltip of the copy button (overridden by `copyLabel` prop). */\n copyToClipboard: string\n /** `aria-label` of the close button in the fullscreen modal. */\n closeExpandedView: string\n\n // ── FeedbackInline (response-quality feedback) ─────────────\n /** `title` of the thumb-up button. */\n feedbackUseful: string\n /** `title` of the thumb-down button. */\n feedbackNotUseful: string\n /** Acknowledgement shown after a positive rating (overridden by `positiveAck`). */\n feedbackPositiveAck: string\n /** Acknowledgement shown after a negative rating (overridden by `negativeAck`). */\n feedbackNegativeAck: string\n\n // ── Generic chrome ────────────────────────────────────────\n /** Label of the streaming retry button. */\n retry: string\n}\n\n/**\n * English defaults. A published library ships no hardcoded non-English\n * chrome — consumers localize via `<MCPUIStringsProvider>`.\n */\nexport const DEFAULT_MCPUI_STRINGS: MCPUIStrings = {\n expand: 'Expand',\n expandedView: 'Expanded view',\n copyToClipboard: 'Copy to clipboard',\n closeExpandedView: 'Close expanded view',\n feedbackUseful: 'Useful',\n feedbackNotUseful: 'Not useful',\n feedbackPositiveAck: 'Thanks!',\n feedbackNegativeAck: \"Noted — we'll improve\",\n retry: 'Retry',\n}\n\nexport const MCPUIStringsContext = createContext<MCPUIStrings>(DEFAULT_MCPUI_STRINGS)\n\n/**\n * Reads the active chrome strings. Returns `DEFAULT_MCPUI_STRINGS` when no\n * `<MCPUIStringsProvider>` is mounted above — every renderer works\n * standalone with English chrome.\n */\nexport function useMCPUIStrings(): MCPUIStrings {\n return useContext(MCPUIStringsContext)\n}\n\nexport interface MCPUIStringsProviderProps {\n /**\n * Partial override of the chrome strings. Any key left unset falls back\n * to the English `DEFAULT_MCPUI_STRINGS` — so a consumer can localize\n * just the strings they care about.\n */\n strings?: Partial<MCPUIStrings>\n children: JSX.Element\n}\n\n/**\n * Provides localized chrome strings to every MCP-UI renderer below it.\n * Merges the partial `strings` override over the English defaults.\n */\nexport function MCPUIStringsProvider(props: MCPUIStringsProviderProps): JSX.Element {\n // `props.strings` is read inside the getter so a reactive override\n // (signal-backed) re-propagates ; for the common static case it is read\n // once at mount.\n const value = (): MCPUIStrings => ({ ...DEFAULT_MCPUI_STRINGS, ...props.strings })\n return (\n <MCPUIStringsContext.Provider value={value()}>\n {props.children}\n </MCPUIStringsContext.Provider>\n )\n}\n"],"names":["DEFAULT_MCPUI_STRINGS","expand","expandedView","copyToClipboard","closeExpandedView","feedbackUseful","feedbackNotUseful","feedbackPositiveAck","feedbackNegativeAck","retry","MCPUIStringsContext","createContext","useMCPUIStrings","useContext","MCPUIStringsProvider","props","value","strings","_$createComponent","Provider","children"],"mappings":";;AAgFO,MAAMA,wBAAsC;AAAA,EACjDC,QAAQ;AAAA,EACRC,cAAc;AAAA,EACdC,iBAAiB;AAAA,EACjBC,mBAAmB;AAAA,EACnBC,gBAAgB;AAAA,EAChBC,mBAAmB;AAAA,EACnBC,qBAAqB;AAAA,EACrBC,qBAAqB;AAAA,EACrBC,OAAO;AACT;AAEO,MAAMC,sBAAsBC,cAA4BX,qBAAqB;AAO7E,SAASY,kBAAgC;AAC9C,SAAOC,WAAWH,mBAAmB;AACvC;AAgBO,SAASI,qBAAqBC,OAA+C;AAIlF,QAAMC,QAAQA,OAAqB;AAAA,IAAE,GAAGhB;AAAAA,IAAuB,GAAGe,MAAME;AAAAA,EAAAA;AACxE,SAAAC,gBACGR,oBAAoBS,UAAQ;AAAA,IAAA,IAACH,QAAK;AAAA,aAAEA,MAAAA;AAAAA,IAAO;AAAA,IAAA,IAAAI,WAAA;AAAA,aACzCL,MAAMK;AAAAA,IAAQ;AAAA,EAAA,CAAA;AAGrB;"}
package/dist/index.cjs CHANGED
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const UIResourceRenderer = require("./components/UIResourceRenderer.cjs");
4
4
  const StreamingUIRenderer = require("./components/StreamingUIRenderer.cjs");
5
+ const PresentationFeedback = require("./components/PresentationFeedback.cjs");
5
6
  const GenerativeUIErrorBoundary = require("./components/GenerativeUIErrorBoundary.cjs");
6
7
  require("solid-js/web");
7
8
  require("solid-js");
@@ -43,6 +44,7 @@ const logger = require("./utils/logger.cjs");
43
44
  const perf = require("./utils/perf.cjs");
44
45
  const stableKey = require("./utils/stable-key.cjs");
45
46
  const duplicateMountRegistry = require("./utils/duplicate-mount-registry.cjs");
47
+ const MCPUIStringsContext = require("./context/MCPUIStringsContext.cjs");
46
48
  const MCPUITelemetryContext = require("./context/MCPUITelemetryContext.cjs");
47
49
  const telemetry = require("./services/telemetry.cjs");
48
50
  const useStreamingUI = require("./hooks/useStreamingUI.cjs");
@@ -68,6 +70,8 @@ const index = require("./testing/index.cjs");
68
70
  exports.UIResourceRenderer = UIResourceRenderer.UIResourceRenderer;
69
71
  exports.renderCellValue = UIResourceRenderer.renderCellValue;
70
72
  exports.StreamingUIRenderer = StreamingUIRenderer.StreamingUIRenderer;
73
+ exports.DEFAULT_PRESENTATION_FEEDBACK_LABELS = PresentationFeedback.DEFAULT_PRESENTATION_FEEDBACK_LABELS;
74
+ exports.PresentationFeedback = PresentationFeedback.PresentationFeedback;
71
75
  exports.GenerativeUIErrorBoundary = GenerativeUIErrorBoundary.GenerativeUIErrorBoundary;
72
76
  exports.ExpandableWrapper = ExpandableWrapper.ExpandableWrapper;
73
77
  exports.useExpanded = ExpandableWrapper.useExpanded;
@@ -114,6 +118,10 @@ exports.markRenderEnd = perf.markRenderEnd;
114
118
  exports.markRenderStart = perf.markRenderStart;
115
119
  exports.getUiResourceStableKey = stableKey.getUiResourceStableKey;
116
120
  exports.setDuplicateMountReporter = duplicateMountRegistry.setDuplicateMountReporter;
121
+ exports.DEFAULT_MCPUI_STRINGS = MCPUIStringsContext.DEFAULT_MCPUI_STRINGS;
122
+ exports.MCPUIStringsContext = MCPUIStringsContext.MCPUIStringsContext;
123
+ exports.MCPUIStringsProvider = MCPUIStringsContext.MCPUIStringsProvider;
124
+ exports.useMCPUIStrings = MCPUIStringsContext.useMCPUIStrings;
117
125
  exports.MCPUITelemetryContext = MCPUITelemetryContext.MCPUITelemetryContext;
118
126
  exports.MCPUITelemetryProvider = MCPUITelemetryContext.MCPUITelemetryProvider;
119
127
  exports.useTelemetry = MCPUITelemetryContext.useTelemetry;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.d.cts CHANGED
@@ -35,6 +35,9 @@ export { ExpandableWrapper, useExpanded } from './components/ExpandableWrapper';
35
35
  export { ComponentToolbar } from './components/ComponentToolbar';
36
36
  export { FeedbackInline } from './components/FeedbackInline';
37
37
  export type { FeedbackInlineProps, FeedbackInlineContext } from './components/FeedbackInline';
38
+ export { PresentationFeedback, DEFAULT_PRESENTATION_FEEDBACK_LABELS, } from './components/PresentationFeedback';
39
+ export type { PresentationFeedbackProps, PresentationFeedbackLabels, } from './components/PresentationFeedback';
40
+ export type { ConnectorRenderFeedback, ConnectorRenderProblem, ConnectorPreferredLayout, } from '@seed-ship/mcp-ui-spec';
38
41
  export { ChatBusProvider, useChatBus } from './hooks/useChatBus';
39
42
  export { ChatPrompt } from './components/ChatPrompt';
40
43
  export { ElicitationForm } from './components/ElicitationForm';
@@ -64,6 +67,8 @@ export { markRenderStart, markRenderEnd, PERF_PREFIX } from './utils/perf';
64
67
  export { getUiResourceStableKey } from './utils/stable-key';
65
68
  export { setDuplicateMountReporter } from './utils/duplicate-mount-registry';
66
69
  export type { DuplicateMountInfo, DuplicateMountReporter, } from './utils/duplicate-mount-registry';
70
+ export { MCPUIStringsProvider, MCPUIStringsContext, useMCPUIStrings, DEFAULT_MCPUI_STRINGS, } from './context/MCPUIStringsContext';
71
+ export type { MCPUIStrings, MCPUIStringsProviderProps, } from './context/MCPUIStringsContext';
67
72
  export { MCPUITelemetryProvider, MCPUITelemetryContext, useTelemetry, } from './context/MCPUITelemetryContext';
68
73
  export type { MCPUITelemetryProviderProps } from './context/MCPUITelemetryContext';
69
74
  export { createTelemetryDispatcher } from './services/telemetry';
package/dist/index.d.ts CHANGED
@@ -35,6 +35,9 @@ export { ExpandableWrapper, useExpanded } from './components/ExpandableWrapper';
35
35
  export { ComponentToolbar } from './components/ComponentToolbar';
36
36
  export { FeedbackInline } from './components/FeedbackInline';
37
37
  export type { FeedbackInlineProps, FeedbackInlineContext } from './components/FeedbackInline';
38
+ export { PresentationFeedback, DEFAULT_PRESENTATION_FEEDBACK_LABELS, } from './components/PresentationFeedback';
39
+ export type { PresentationFeedbackProps, PresentationFeedbackLabels, } from './components/PresentationFeedback';
40
+ export type { ConnectorRenderFeedback, ConnectorRenderProblem, ConnectorPreferredLayout, } from '@seed-ship/mcp-ui-spec';
38
41
  export { ChatBusProvider, useChatBus } from './hooks/useChatBus';
39
42
  export { ChatPrompt } from './components/ChatPrompt';
40
43
  export { ElicitationForm } from './components/ElicitationForm';
@@ -64,6 +67,8 @@ export { markRenderStart, markRenderEnd, PERF_PREFIX } from './utils/perf';
64
67
  export { getUiResourceStableKey } from './utils/stable-key';
65
68
  export { setDuplicateMountReporter } from './utils/duplicate-mount-registry';
66
69
  export type { DuplicateMountInfo, DuplicateMountReporter, } from './utils/duplicate-mount-registry';
70
+ export { MCPUIStringsProvider, MCPUIStringsContext, useMCPUIStrings, DEFAULT_MCPUI_STRINGS, } from './context/MCPUIStringsContext';
71
+ export type { MCPUIStrings, MCPUIStringsProviderProps, } from './context/MCPUIStringsContext';
67
72
  export { MCPUITelemetryProvider, MCPUITelemetryContext, useTelemetry, } from './context/MCPUITelemetryContext';
68
73
  export type { MCPUITelemetryProviderProps } from './context/MCPUITelemetryContext';
69
74
  export { createTelemetryDispatcher } from './services/telemetry';