From 39abcf9724aeef5a553bce8f296cbe2a5e41e1ce Mon Sep 17 00:00:00 2001 From: Jeppe Reinhold Date: Mon, 12 Jan 2026 11:10:55 +0100 Subject: [PATCH 01/17] WIP --- .github/instructions/eval.instructions.md | 3 +- apps/internal-storybook/.storybook/main.ts | 2 +- packages/addon-mcp/package.json | 1 + packages/addon-mcp/src/mcp-handler.ts | 1 + .../addon-mcp/src/tools/get-story-urls.ts | 59 +- packages/addon-mcp/src/tools/preview.html | 187 ++++ pnpm-lock.yaml | 985 +++++------------- 7 files changed, 502 insertions(+), 736 deletions(-) create mode 100644 packages/addon-mcp/src/tools/preview.html diff --git a/.github/instructions/eval.instructions.md b/.github/instructions/eval.instructions.md index da827380..dd1185ac 100644 --- a/.github/instructions/eval.instructions.md +++ b/.github/instructions/eval.instructions.md @@ -585,8 +585,7 @@ export default meta; type Story = StoryObj; export const Default: Story = { - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); + play: async ({ canvas }) => { await userEvent.click(canvas.getByTestId('submit')); await expect(canvas.getByText('Success')).toBeInTheDocument(); } diff --git a/apps/internal-storybook/.storybook/main.ts b/apps/internal-storybook/.storybook/main.ts index bee3c4d9..7d5361b1 100644 --- a/apps/internal-storybook/.storybook/main.ts +++ b/apps/internal-storybook/.storybook/main.ts @@ -23,7 +23,7 @@ const config = defineMain({ }, ], framework: '@storybook/react-vite', - logLevel: 'debug', + // logLevel: 'debug', core: { disableTelemetry: true, }, diff --git a/packages/addon-mcp/package.json b/packages/addon-mcp/package.json index 717f8c4b..780697af 100644 --- a/packages/addon-mcp/package.json +++ b/packages/addon-mcp/package.json @@ -37,6 +37,7 @@ "@tmcp/adapter-valibot": "catalog:", "@tmcp/transport-http": "catalog:", "tmcp": "catalog:", + "@mcp-ui/server": "^5.16.3", "valibot": "catalog:" }, "devDependencies": { diff --git a/packages/addon-mcp/src/mcp-handler.ts b/packages/addon-mcp/src/mcp-handler.ts index c83f38d0..3d9cd0fd 100644 --- a/packages/addon-mcp/src/mcp-handler.ts +++ b/packages/addon-mcp/src/mcp-handler.ts @@ -37,6 +37,7 @@ const initializeMCPServer = async (options: Options) => { adapter: new ValibotJsonSchemaAdapter(), capabilities: { tools: { listChanged: true }, + resources: { listChanged: true }, }, }, ).withContext(); diff --git a/packages/addon-mcp/src/tools/get-story-urls.ts b/packages/addon-mcp/src/tools/get-story-urls.ts index 8458c288..085fb6fd 100644 --- a/packages/addon-mcp/src/tools/get-story-urls.ts +++ b/packages/addon-mcp/src/tools/get-story-urls.ts @@ -1,5 +1,6 @@ import type { McpServer } from 'tmcp'; import path from 'node:path'; +import { createUIResource } from '@mcp-ui/server'; import { storyNameFromExport } from 'storybook/internal/csf'; import { logger } from 'storybook/internal/node-logger'; import * as v from 'valibot'; @@ -8,8 +9,10 @@ import { fetchStoryIndex } from '../utils/fetch-story-index.ts'; import { errorToMCPContent } from '../utils/errors.ts'; import type { AddonContext } from '../types.ts'; import { StoryInputArray } from '../types.ts'; +import previewHtml from './preview.html'; -export const GET_STORY_URLS_TOOL_NAME = 'get-story-urls'; +export const GET_STORY_URLS_TOOL_NAME = 'preview-story'; +export const GET_STORY_URLS_RESOURCE_URI = `ui://${GET_STORY_URLS_TOOL_NAME}/preview.html`; const GetStoryUrlsInput = v.object({ stories: StoryInputArray, @@ -20,15 +23,58 @@ type GetStoryUrlsInput = v.InferOutput; export async function addGetStoryUrlsTool( server: McpServer, ) { + // // console.log(previewHtml); + // const storyPreviewResource = createUIResource({ + // uri: GET_STORY_URLS_RESOURCE_URI, + // encoding: 'text', + // content: { + // type: 'rawHtml', + // htmlString: previewHtml, + // }, + // uiMetadata: { + // 'preferred-frame-size': ['100%', '1200px'], + // }, + // adapters: { + // mcpApps: { enabled: true }, + // }, + // }); + + server.resource( + { + name: GET_STORY_URLS_RESOURCE_URI, + description: 'App Resource for the Get Story tool', + uri: GET_STORY_URLS_RESOURCE_URI, + mimeType: 'text/html;profile=mcp-app', + }, + () => ({ + contents: [ + { + uri: GET_STORY_URLS_RESOURCE_URI, + mimeType: 'text/html;profile=mcp-app', + text: previewHtml, + _meta: { + ui: { + prefersBorders: true, + csp: { + frameDomains: ['http://localhost:6006'], + }, + }, + }, + }, + ], + }), + ); + server.tool( { name: GET_STORY_URLS_TOOL_NAME, - title: "Get stories' URLs", - description: `Get the URL for one or more stories.`, + title: 'Preview stories, either as rendered MCP Apps or raw URLs', + description: `Preview one or more stories, rendering them as an MCP App using the UI Resource.`, schema: GetStoryUrlsInput, enabled: () => server.ctx.custom?.toolsets?.dev ?? true, + _meta: { ui: { resourceUri: GET_STORY_URLS_RESOURCE_URI } }, }, - async (input: GetStoryUrlsInput) => { + async (input) => { try { const { origin, disableTelemetry } = server.ctx.custom ?? {}; @@ -40,6 +86,7 @@ export async function addGetStoryUrlsTool( const entriesList = Object.values(index.entries); const result: string[] = []; + const previewUrls: string[] = []; let foundStoryCount = 0; for (const { @@ -68,6 +115,7 @@ export async function addGetStoryUrlsTool( if (foundStoryId) { logger.debug(`Found story ID: ${foundStoryId}`); result.push(`${origin}/?path=/story/${foundStoryId}`); + previewUrls.push(`${origin}/iframe.html?id=${foundStoryId}`); foundStoryCount++; } else { logger.debug('No story found'); @@ -94,6 +142,9 @@ export async function addGetStoryUrlsTool( type: 'text', text, })), + structuredContent: { + previewUrls, + }, }; } catch (error) { return errorToMCPContent(error); diff --git a/packages/addon-mcp/src/tools/preview.html b/packages/addon-mcp/src/tools/preview.html new file mode 100644 index 00000000..5c551034 --- /dev/null +++ b/packages/addon-mcp/src/tools/preview.html @@ -0,0 +1,187 @@ + + + + + + + + + + +

Story Preview

+ + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 93d719ef..7204074f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,73 +36,6 @@ catalogs: vite: specifier: 7.2.2 version: 7.2.2 - experiments: - '@eslint/js': - specifier: 9.39.1 - version: 9.39.1 - '@storybook/addon-a11y': - specifier: 10.2.0-alpha.14 - version: 10.2.0-alpha.14 - '@storybook/addon-docs': - specifier: 10.2.0-alpha.14 - version: 10.2.0-alpha.14 - '@storybook/addon-vitest': - specifier: 10.2.0-alpha.14 - version: 10.2.0-alpha.14 - '@storybook/react-vite': - specifier: 10.2.0-alpha.14 - version: 10.2.0-alpha.14 - '@types/node': - specifier: 24.10.1 - version: 24.10.1 - '@types/react': - specifier: 19.2.6 - version: 19.2.6 - '@types/react-dom': - specifier: 19.2.3 - version: 19.2.3 - '@vitejs/plugin-react-swc': - specifier: 4.2.2 - version: 4.2.2 - '@vitest/browser-playwright': - specifier: 4.0.6 - version: 4.0.6 - eslint: - specifier: 9.39.1 - version: 9.39.1 - eslint-plugin-react-hooks: - specifier: 7.0.1 - version: 7.0.1 - eslint-plugin-react-refresh: - specifier: 0.4.24 - version: 0.4.24 - eslint-plugin-storybook: - specifier: 10.2.0-alpha.14 - version: 10.2.0-alpha.14 - globals: - specifier: 16.5.0 - version: 16.5.0 - react: - specifier: 19.2.0 - version: 19.2.0 - react-dom: - specifier: 19.2.0 - version: 19.2.0 - storybook: - specifier: 10.2.0-alpha.14 - version: 10.2.0-alpha.14 - typescript: - specifier: 5.9.3 - version: 5.9.3 - typescript-eslint: - specifier: 8.47.0 - version: 8.47.0 - vite: - specifier: 7.2.2 - version: 7.2.2 - vitest: - specifier: 4.0.6 - version: 4.0.6 importers: @@ -325,133 +258,11 @@ importers: specifier: ^7.1.12 version: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0) - eval/evals/110-flight-booking-reshaped/experiments/storybook-mcp-docs-claude-code-claude-sonnet-4.5-2026-01-08T14-02-29/project: - dependencies: - react: - specifier: catalog:experiments - version: 19.2.0 - react-dom: - specifier: catalog:experiments - version: 19.2.0(react@19.2.0) - reshaped: - specifier: ^3.9.0 - version: 3.9.0(postcss@8.5.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - devDependencies: - '@eslint/js': - specifier: catalog:experiments - version: 9.39.1 - '@storybook/addon-a11y': - specifier: catalog:experiments - version: 10.2.0-alpha.14(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) - '@storybook/addon-docs': - specifier: catalog:experiments - version: 10.2.0-alpha.14(@types/react@19.2.6)(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12)) - '@storybook/addon-mcp': - specifier: workspace:* - version: link:../../../../../../packages/addon-mcp - '@storybook/addon-vitest': - specifier: catalog:experiments - version: 10.2.0-alpha.14(@vitest/browser-playwright@4.0.6)(@vitest/browser@4.0.6(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(vitest@4.0.6))(@vitest/runner@4.0.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vitest@4.0.6) - '@storybook/react-vite': - specifier: catalog:experiments - version: 10.2.0-alpha.14(esbuild@0.25.12)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.52.5)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12)) - '@types/node': - specifier: catalog:experiments - version: 24.10.1 - '@types/react': - specifier: catalog:experiments - version: 19.2.6 - '@types/react-dom': - specifier: catalog:experiments - version: 19.2.3(@types/react@19.2.6) - '@vitejs/plugin-react-swc': - specifier: catalog:experiments - version: 4.2.2(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0)) - '@vitest/browser-playwright': - specifier: catalog:experiments - version: 4.0.6(playwright@1.56.1)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(vitest@4.0.6) - eslint: - specifier: catalog:experiments - version: 9.39.1(jiti@2.6.1) - eslint-plugin-react-hooks: - specifier: catalog:experiments - version: 7.0.1(eslint@9.39.1(jiti@2.6.1)) - eslint-plugin-react-refresh: - specifier: catalog:experiments - version: 0.4.24(eslint@9.39.1(jiti@2.6.1)) - eslint-plugin-storybook: - specifier: catalog:experiments - version: 10.2.0-alpha.14(eslint@9.39.1(jiti@2.6.1))(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3) - globals: - specifier: catalog:experiments - version: 16.5.0 - storybook: - specifier: catalog:experiments - version: 10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - typescript: - specifier: catalog:experiments - version: 5.9.3 - typescript-eslint: - specifier: catalog:experiments - version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - vite: - specifier: catalog:experiments - version: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0) - vitest: - specifier: catalog:experiments - version: 4.0.6(@types/node@24.10.1)(@vitest/browser-playwright@4.0.6)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0) - - eval/evals/110-flight-booking-reshaped/experiments/storybook-mcp-docs-claude-code-claude-sonnet-4.5-2026-01-08T14-06-26/project: - dependencies: - react: - specifier: catalog:experiments - version: 19.2.0 - react-dom: - specifier: catalog:experiments - version: 19.2.0(react@19.2.0) - reshaped: - specifier: ^3.9.0 - version: 3.9.0(postcss@8.5.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - devDependencies: - '@eslint/js': - specifier: catalog:experiments - version: 9.39.1 - '@types/node': - specifier: catalog:experiments - version: 24.10.1 - '@types/react': - specifier: catalog:experiments - version: 19.2.6 - '@types/react-dom': - specifier: catalog:experiments - version: 19.2.3(@types/react@19.2.6) - '@vitejs/plugin-react-swc': - specifier: catalog:experiments - version: 4.2.2(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0)) - eslint: - specifier: catalog:experiments - version: 9.39.1(jiti@2.6.1) - eslint-plugin-react-hooks: - specifier: catalog:experiments - version: 7.0.1(eslint@9.39.1(jiti@2.6.1)) - eslint-plugin-react-refresh: - specifier: catalog:experiments - version: 0.4.24(eslint@9.39.1(jiti@2.6.1)) - globals: - specifier: catalog:experiments - version: 16.5.0 - typescript: - specifier: catalog:experiments - version: 5.9.3 - typescript-eslint: - specifier: catalog:experiments - version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - vite: - specifier: catalog:experiments - version: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0) - packages/addon-mcp: dependencies: + '@mcp-ui/server': + specifier: ^5.16.3 + version: 5.16.3(hono@4.11.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(zod@3.25.76) '@storybook/mcp': specifier: workspace:* version: link:../mcp @@ -904,12 +715,6 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/eslint-utils@4.9.1': - resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.2': resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -961,6 +766,12 @@ packages: '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + '@hono/node-server@1.19.7': + resolution: {integrity: sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: ^4 + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -1103,12 +914,28 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@mcp-ui/server@5.16.3': + resolution: {integrity: sha512-MZttML9tQC1B8f4SPgoT1BORfCDXqs4Ywb/mQ0wSwIYS9AuIWFLj1KXmvqC/zrG0SlNMlyvMSxEX/eVYsIoZaA==} + '@mdx-js/react@3.1.1': resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==} peerDependencies: '@types/react': '>=16' react: '>=16' + '@modelcontextprotocol/ext-apps@0.2.2': + resolution: {integrity: sha512-h8sN3QIBLqMsRXjKL76M5VmBQf3N0I1G1DiDiSYAgtdynYQctHqCs79WEo1d5wClyZVYBWXdRcxgiR/WBfSOqw==} + peerDependencies: + '@modelcontextprotocol/sdk': ^1.24.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + zod: ^3.25.0 || ^4.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + '@modelcontextprotocol/inspector-cli@0.17.2': resolution: {integrity: sha512-xXaqZYWJz77xvmfAVlYbvz2/xw9OaalFHq0n5A8PlmZvmhi6akQocIE7ZYaoEBpLbWRSwIZWfsidnfoKb6dO2A==} hasBin: true @@ -1135,6 +962,16 @@ packages: '@cfworker/json-schema': optional: true + '@modelcontextprotocol/sdk@1.25.2': + resolution: {integrity: sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + '@napi-rs/wasm-runtime@1.0.7': resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} @@ -1206,6 +1043,61 @@ packages: '@octokit/types@13.10.0': resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} + '@oven/bun-darwin-aarch64@1.3.5': + resolution: {integrity: sha512-8GvNtMo0NINM7Emk9cNAviCG3teEgr3BUX9be0+GD029zIagx2Sf54jMui1Eu1IpFm7nWHODuLEefGOQNaJ0gQ==} + cpu: [arm64] + os: [darwin] + + '@oven/bun-darwin-x64-baseline@1.3.5': + resolution: {integrity: sha512-p5q3rJk48qhLuLBOFehVc+kqCE03YrswTc6NCxbwsxiwfySXwcAvpF2KWKF/ZZObvvR8hCCvqe1F81b2p5r2dg==} + cpu: [x64] + os: [darwin] + + '@oven/bun-darwin-x64@1.3.5': + resolution: {integrity: sha512-r33eHQOHAwkuiBJIwmkXIyqONQOQMnd1GMTpDzaxx9vf9+svby80LZO9Hcm1ns6KT/TBRFyODC/0loA7FAaffg==} + cpu: [x64] + os: [darwin] + + '@oven/bun-linux-aarch64-musl@1.3.5': + resolution: {integrity: sha512-HKBeUlJdNduRkzJKZ5DXM+pPqntfC50/Hu2X65jVX0Y7hu/6IC8RaUTqpr8FtCZqqmc9wDK0OTL+Mbi9UQIKYQ==} + cpu: [arm64] + os: [linux] + + '@oven/bun-linux-aarch64@1.3.5': + resolution: {integrity: sha512-zkcHPI23QxJ1TdqafhgkXt1NOEN8o5C460sVeNnrhfJ43LwZgtfcvcQE39x/pBedu67fatY8CU0iY00nOh46ZQ==} + cpu: [arm64] + os: [linux] + + '@oven/bun-linux-x64-baseline@1.3.5': + resolution: {integrity: sha512-FeCQyBU62DMuB0nn01vPnf3McXrKOsrK9p7sHaBFYycw0mmoU8kCq/WkBkGMnLuvQljJSyen8QBTx+fXdNupWg==} + cpu: [x64] + os: [linux] + + '@oven/bun-linux-x64-musl-baseline@1.3.5': + resolution: {integrity: sha512-TJiYC7KCr0XxFTsxgwQOeE7dncrEL/RSyL0EzSL3xRkrxJMWBCvCSjQn7LV1i6T7hFst0+3KoN3VWvD5BinqHA==} + cpu: [x64] + os: [linux] + + '@oven/bun-linux-x64-musl@1.3.5': + resolution: {integrity: sha512-XkCCHkByYn8BIDvoxnny898znju4xnW2kvFE8FT5+0Y62cWdcBGMZ9RdsEUTeRz16k8hHtJpaSfLcEmNTFIwRQ==} + cpu: [x64] + os: [linux] + + '@oven/bun-linux-x64@1.3.5': + resolution: {integrity: sha512-n7zhKTSDZS0yOYg5Rq8easZu5Y/o47sv0c7yGr2ciFdcie9uYV55fZ7QMqhWMGK33ezCSikh5EDkUMCIvfWpjA==} + cpu: [x64] + os: [linux] + + '@oven/bun-windows-x64-baseline@1.3.5': + resolution: {integrity: sha512-rtVQB9/1XK8FWJgFtsOthbPifRMYypgJwxu+pK3NHx8WvFKmq7HcPDqNr8xLzGULjQEO7eAo2aOZfONOwYz+5g==} + cpu: [x64] + os: [win32] + + '@oven/bun-windows-x64@1.3.5': + resolution: {integrity: sha512-T3xkODItb/0ftQPFsZDc7EAX2D6A4TEazQ2YZyofZToO8Q7y8YT8ooWdhd0BQiTCd66uEvgE1DCZetynwg2IoA==} + cpu: [x64] + os: [win32] + '@oxc-project/runtime@0.97.0': resolution: {integrity: sha512-yH0zw7z+jEws4dZ4IUKoix5Lh3yhqIJWF9Dc8PWvhpo7U7O+lJrv7ZZL4BeRO0la8LBQFwcCewtLBnVV7hPe/w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2104,11 +1996,21 @@ packages: cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.55.1': + resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.52.5': resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.55.1': + resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-freebsd-arm64@4.52.5': resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} cpu: [arm64] @@ -2134,6 +2036,11 @@ packages: cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.55.1': + resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.52.5': resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} cpu: [arm64] @@ -2169,6 +2076,11 @@ packages: cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.55.1': + resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.52.5': resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} cpu: [x64] @@ -2199,6 +2111,11 @@ packages: cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.55.1': + resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==} + cpu: [x64] + os: [win32] + '@rsuite/icon-font@4.1.0': resolution: {integrity: sha512-q0Y+uQCVvzhD6lFeAFrvCDd1lTjZfM6MIaBjre3lSW1w586VWbuFnhTiqos3v9HIMlUpm3aAsxd3SuM6gYaqqQ==} @@ -2221,24 +2138,6 @@ packages: peerDependencies: storybook: ^10.2.0-alpha.14 - '@storybook/addon-vitest@10.2.0-alpha.14': - resolution: {integrity: sha512-wCb3lQyul+7TFjyJEu12GYfbd0bmc8qoPCFX6te1D79sS+SK4PBK2sjq8/3OH3VLtUbSrutw2uaTD7aQQsFrDw==} - peerDependencies: - '@vitest/browser': ^3.0.0 || ^4.0.0 - '@vitest/browser-playwright': ^4.0.0 - '@vitest/runner': ^3.0.0 || ^4.0.0 - storybook: ^10.2.0-alpha.14 - vitest: ^3.0.0 || ^4.0.0 - peerDependenciesMeta: - '@vitest/browser': - optional: true - '@vitest/browser-playwright': - optional: true - '@vitest/runner': - optional: true - vitest: - optional: true - '@storybook/builder-vite@10.2.0-alpha.14': resolution: {integrity: sha512-PZQ0oSVSfKaGe+h48MSGoH3wmcYRPbcmuX8G7GLORViW+x7gILLr0e3D5MF5C9rc4BHpfxikaXa3Gq5krUYeKQ==} peerDependencies: @@ -2512,9 +2411,6 @@ packages: '@types/react@18.3.26': resolution: {integrity: sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==} - '@types/react@19.2.6': - resolution: {integrity: sha512-p/jUvulfgU7oKtj6Xpk8cA2Y1xKTtICGpJYeJXz2YVO2UcvjQgeRMLDGfDeqeRW2Ta+0QNFwcc8X3GH8SxZz6w==} - '@types/react@19.2.7': resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} @@ -2527,102 +2423,6 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@8.47.0': - resolution: {integrity: sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.47.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/parser@8.47.0': - resolution: {integrity: sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/project-service@8.47.0': - resolution: {integrity: sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/project-service@8.52.0': - resolution: {integrity: sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/scope-manager@8.47.0': - resolution: {integrity: sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/scope-manager@8.52.0': - resolution: {integrity: sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.47.0': - resolution: {integrity: sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/tsconfig-utils@8.52.0': - resolution: {integrity: sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/type-utils@8.47.0': - resolution: {integrity: sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/types@8.47.0': - resolution: {integrity: sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.52.0': - resolution: {integrity: sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.47.0': - resolution: {integrity: sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/typescript-estree@8.52.0': - resolution: {integrity: sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/utils@8.47.0': - resolution: {integrity: sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/utils@8.52.0': - resolution: {integrity: sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/visitor-keys@8.47.0': - resolution: {integrity: sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/visitor-keys@8.52.0': - resolution: {integrity: sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@valibot/to-json-schema@1.3.0': resolution: {integrity: sha512-82Vv6x7sOYhv5YmTRgSppSqj1nn2pMCk5BqCMGWYp0V/fq+qirrbGncqZAtZ09/lrO40ne/7z8ejwE728aVreg==} peerDependencies: @@ -2920,9 +2720,6 @@ packages: brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -3072,10 +2869,6 @@ packages: resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} engines: {node: '>=20'} - commander@14.0.2: - resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} - engines: {node: '>=20'} - commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -3389,23 +3182,6 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-plugin-react-hooks@7.0.1: - resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} - engines: {node: '>=18'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - - eslint-plugin-react-refresh@0.4.24: - resolution: {integrity: sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==} - peerDependencies: - eslint: '>=8.40' - - eslint-plugin-storybook@10.2.0-alpha.14: - resolution: {integrity: sha512-W5K/nx+HWNKqWL3bY+9Cn+oJpE+StDAt1s8RDPmWAEj+SnHD7MUY3JZlZ7y5I4tEFZS6yMQKZKri7iz/kKq7Vw==} - peerDependencies: - eslint: '>=8' - storybook: ^10.2.0-alpha.14 - eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -3674,9 +3450,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -3695,18 +3468,16 @@ packages: hastscript@9.0.1: resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} - hermes-estree@0.25.1: - resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} - - hermes-parser@0.25.1: - resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} highlightjs-vue@1.0.0: resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} + hono@4.11.3: + resolution: {integrity: sha512-PmQi306+M/ct/m5s66Hrg+adPnkD5jiO6IjA7WhWw0gSBSo1EcRegwuI1deZ+wd5pzCGynCcn2DprnE4/yEV4w==} + engines: {node: '>=16.9.0'} + hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} @@ -3733,10 +3504,6 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} - image-size@0.5.5: resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} engines: {node: '>=0.10.0'} @@ -3856,6 +3623,9 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true + jose@6.1.3: + resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3890,6 +3660,9 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -4059,10 +3832,6 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -4719,14 +4488,6 @@ packages: react: ^18 || ^19 react-dom: ^18 || ^19 - reshaped@3.9.0: - resolution: {integrity: sha512-lIrTyxgAiCpZtcZoH4QfQb+hO0MeLDDZZ71BRwnYMsvXSkPtqilj5luJfGd9HfoioSUQ5j5oXl0BPBsTXPRClQ==} - hasBin: true - peerDependencies: - postcss: ^8 - react: ^18 || ^19 - react-dom: ^18 || ^19 - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -5109,12 +4870,6 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - ts-api-utils@2.4.0: - resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - ts-dedent@2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} @@ -5225,13 +4980,6 @@ packages: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} - typescript-eslint@8.47.0: - resolution: {integrity: sha512-Lwe8i2XQ3WoMjua/r1PHrCTpkubPYJCAfOurtn+mtTzqB6jNd+14n9UN1bJ4s3F49x9ixAm0FLflB/JzQ57M8Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -5535,11 +5283,10 @@ packages: peerDependencies: zod: ^3.24.1 - zod-validation-error@4.0.2: - resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} - engines: {node: '>=18.0.0'} + zod-to-json-schema@3.25.1: + resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} peerDependencies: - zod: ^3.25.0 || ^4.0.0 + zod: ^3.25 || ^4 zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -6013,11 +5760,6 @@ snapshots: eslint: 9.39.1(jiti@2.6.1) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.1(jiti@2.6.1))': - dependencies: - eslint: 9.39.1(jiti@2.6.1) - eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.2': {} '@eslint/config-array@0.21.1': @@ -6084,6 +5826,10 @@ snapshots: '@floating-ui/utils@0.2.10': {} + '@hono/node-server@1.19.7(hono@4.11.3)': + dependencies: + hono: 4.11.3 + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.7': @@ -6223,17 +5969,48 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 + '@mcp-ui/server@5.16.3(hono@4.11.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(zod@3.25.76)': + dependencies: + '@modelcontextprotocol/ext-apps': 0.2.2(@modelcontextprotocol/sdk@1.25.2(hono@4.11.3)(zod@3.25.76))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(zod@3.25.76) + '@modelcontextprotocol/sdk': 1.25.2(hono@4.11.3)(zod@3.25.76) + transitivePeerDependencies: + - '@cfworker/json-schema' + - hono + - react + - react-dom + - supports-color + - zod + '@mdx-js/react@3.1.1(@types/react@18.3.26)(react@19.2.0)': dependencies: '@types/mdx': 2.0.13 '@types/react': 18.3.26 react: 19.2.0 - '@mdx-js/react@3.1.1(@types/react@19.2.6)(react@19.2.0)': + '@modelcontextprotocol/ext-apps@0.2.2(@modelcontextprotocol/sdk@1.25.2(hono@4.11.3)(zod@3.25.76))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(zod@3.25.76)': dependencies: - '@types/mdx': 2.0.13 - '@types/react': 19.2.6 + '@modelcontextprotocol/sdk': 1.25.2(hono@4.11.3)(zod@3.25.76) + prettier: 3.6.2 + zod: 3.25.76 + optionalDependencies: + '@oven/bun-darwin-aarch64': 1.3.5 + '@oven/bun-darwin-x64': 1.3.5 + '@oven/bun-darwin-x64-baseline': 1.3.5 + '@oven/bun-linux-aarch64': 1.3.5 + '@oven/bun-linux-aarch64-musl': 1.3.5 + '@oven/bun-linux-x64': 1.3.5 + '@oven/bun-linux-x64-baseline': 1.3.5 + '@oven/bun-linux-x64-musl': 1.3.5 + '@oven/bun-linux-x64-musl-baseline': 1.3.5 + '@oven/bun-windows-x64': 1.3.5 + '@oven/bun-windows-x64-baseline': 1.3.5 + '@rollup/rollup-darwin-arm64': 4.55.1 + '@rollup/rollup-darwin-x64': 4.55.1 + '@rollup/rollup-linux-arm64-gnu': 4.55.1 + '@rollup/rollup-linux-x64-gnu': 4.55.1 + '@rollup/rollup-win32-x64-msvc': 4.55.1 react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) '@modelcontextprotocol/inspector-cli@0.17.2': dependencies: @@ -6335,10 +6112,32 @@ snapshots: transitivePeerDependencies: - supports-color - '@napi-rs/wasm-runtime@1.0.7': + '@modelcontextprotocol/sdk@1.25.2(hono@4.11.3)(zod@3.25.76)': dependencies: - '@emnapi/core': 1.6.0 - '@emnapi/runtime': 1.6.0 + '@hono/node-server': 1.19.7(hono@4.11.3) + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + express: 5.1.0 + express-rate-limit: 7.5.1(express@5.1.0) + jose: 6.1.3 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.0 + raw-body: 3.0.1 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + transitivePeerDependencies: + - hono + - supports-color + + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.6.0 + '@emnapi/runtime': 1.6.0 '@tybys/wasm-util': 0.10.1 optional: true @@ -6426,6 +6225,39 @@ snapshots: dependencies: '@octokit/openapi-types': 24.2.0 + '@oven/bun-darwin-aarch64@1.3.5': + optional: true + + '@oven/bun-darwin-x64-baseline@1.3.5': + optional: true + + '@oven/bun-darwin-x64@1.3.5': + optional: true + + '@oven/bun-linux-aarch64-musl@1.3.5': + optional: true + + '@oven/bun-linux-aarch64@1.3.5': + optional: true + + '@oven/bun-linux-x64-baseline@1.3.5': + optional: true + + '@oven/bun-linux-x64-musl-baseline@1.3.5': + optional: true + + '@oven/bun-linux-x64-musl@1.3.5': + optional: true + + '@oven/bun-linux-x64@1.3.5': + optional: true + + '@oven/bun-windows-x64-baseline@1.3.5': + optional: true + + '@oven/bun-windows-x64@1.3.5': + optional: true + '@oxc-project/runtime@0.97.0': {} '@oxc-project/types@0.97.0': {} @@ -6472,7 +6304,8 @@ snapshots: '@oxlint/win32-x64@1.28.0': optional: true - '@polka/url@1.0.0-next.29': {} + '@polka/url@1.0.0-next.29': + optional: true '@publint/pack@0.1.2': {} @@ -7678,9 +7511,15 @@ snapshots: '@rollup/rollup-darwin-arm64@4.52.5': optional: true + '@rollup/rollup-darwin-arm64@4.55.1': + optional: true + '@rollup/rollup-darwin-x64@4.52.5': optional: true + '@rollup/rollup-darwin-x64@4.55.1': + optional: true + '@rollup/rollup-freebsd-arm64@4.52.5': optional: true @@ -7696,6 +7535,9 @@ snapshots: '@rollup/rollup-linux-arm64-gnu@4.52.5': optional: true + '@rollup/rollup-linux-arm64-gnu@4.55.1': + optional: true + '@rollup/rollup-linux-arm64-musl@4.52.5': optional: true @@ -7717,6 +7559,9 @@ snapshots: '@rollup/rollup-linux-x64-gnu@4.52.5': optional: true + '@rollup/rollup-linux-x64-gnu@4.55.1': + optional: true + '@rollup/rollup-linux-x64-musl@4.52.5': optional: true @@ -7735,6 +7580,9 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.52.5': optional: true + '@rollup/rollup-win32-x64-msvc@4.55.1': + optional: true + '@rsuite/icon-font@4.1.0': {} '@rsuite/icons@1.4.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': @@ -7769,37 +7617,6 @@ snapshots: - vite - webpack - '@storybook/addon-docs@10.2.0-alpha.14(@types/react@19.2.6)(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12))': - dependencies: - '@mdx-js/react': 3.1.1(@types/react@19.2.6)(react@19.2.0) - '@storybook/csf-plugin': 10.2.0-alpha.14(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12)) - '@storybook/icons': 2.0.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@storybook/react-dom-shim': 10.2.0-alpha.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - storybook: 10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - esbuild - - rollup - - vite - - webpack - - '@storybook/addon-vitest@10.2.0-alpha.14(@vitest/browser-playwright@4.0.6)(@vitest/browser@4.0.6(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(vitest@4.0.6))(@vitest/runner@4.0.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vitest@4.0.6)': - dependencies: - '@storybook/global': 5.0.0 - '@storybook/icons': 2.0.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - storybook: 10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - optionalDependencies: - '@vitest/browser': 4.0.6(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(vitest@4.0.6) - '@vitest/browser-playwright': 4.0.6(playwright@1.56.1)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(vitest@4.0.6) - '@vitest/runner': 4.0.6 - vitest: 4.0.6(@types/node@24.10.1)(@vitest/browser-playwright@4.0.6)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0) - transitivePeerDependencies: - - react - - react-dom - '@storybook/builder-vite@10.2.0-alpha.14(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12))': dependencies: '@storybook/csf-plugin': 10.2.0-alpha.14(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12)) @@ -8142,10 +7959,6 @@ snapshots: '@types/react': 18.3.26 optional: true - '@types/react-dom@19.2.3(@types/react@19.2.6)': - dependencies: - '@types/react': 19.2.6 - '@types/react-dom@19.2.3(@types/react@19.2.7)': dependencies: '@types/react': 19.2.7 @@ -8160,10 +7973,6 @@ snapshots: '@types/prop-types': 15.7.15 csstype: 3.2.3 - '@types/react@19.2.6': - dependencies: - csstype: 3.2.3 - '@types/react@19.2.7': dependencies: csstype: 3.2.3 @@ -8175,150 +7984,6 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.47.0 - '@typescript-eslint/type-utils': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.47.0 - eslint: 9.39.1(jiti@2.6.1) - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.47.0 - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.47.0 - debug: 4.4.3 - eslint: 9.39.1(jiti@2.6.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.47.0(typescript@5.9.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.47.0(typescript@5.9.3) - '@typescript-eslint/types': 8.47.0 - debug: 4.4.3 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.52.0(typescript@5.9.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3) - '@typescript-eslint/types': 8.52.0 - debug: 4.4.3 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@8.47.0': - dependencies: - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/visitor-keys': 8.47.0 - - '@typescript-eslint/scope-manager@8.52.0': - dependencies: - '@typescript-eslint/types': 8.52.0 - '@typescript-eslint/visitor-keys': 8.52.0 - - '@typescript-eslint/tsconfig-utils@8.47.0(typescript@5.9.3)': - dependencies: - typescript: 5.9.3 - - '@typescript-eslint/tsconfig-utils@8.52.0(typescript@5.9.3)': - dependencies: - typescript: 5.9.3 - - '@typescript-eslint/type-utils@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - debug: 4.4.3 - eslint: 9.39.1(jiti@2.6.1) - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@8.47.0': {} - - '@typescript-eslint/types@8.52.0': {} - - '@typescript-eslint/typescript-estree@8.47.0(typescript@5.9.3)': - dependencies: - '@typescript-eslint/project-service': 8.47.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.47.0(typescript@5.9.3) - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/visitor-keys': 8.47.0 - debug: 4.4.3 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.3 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.52.0(typescript@5.9.3)': - dependencies: - '@typescript-eslint/project-service': 8.52.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3) - '@typescript-eslint/types': 8.52.0 - '@typescript-eslint/visitor-keys': 8.52.0 - debug: 4.4.3 - minimatch: 9.0.5 - semver: 7.7.3 - tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.47.0 - '@typescript-eslint/types': 8.47.0 - '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - eslint: 9.39.1(jiti@2.6.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.52.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.1(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.52.0 - '@typescript-eslint/types': 8.52.0 - '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) - eslint: 9.39.1(jiti@2.6.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@8.47.0': - dependencies: - '@typescript-eslint/types': 8.47.0 - eslint-visitor-keys: 4.2.1 - - '@typescript-eslint/visitor-keys@8.52.0': - dependencies: - '@typescript-eslint/types': 8.52.0 - eslint-visitor-keys: 4.2.1 - '@valibot/to-json-schema@1.3.0(valibot@1.2.0(typescript@5.9.3))': dependencies: valibot: 1.2.0(typescript@5.9.3) @@ -8357,19 +8022,6 @@ snapshots: - vite optional: true - '@vitest/browser-playwright@4.0.6(playwright@1.56.1)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(vitest@4.0.6)': - dependencies: - '@vitest/browser': 4.0.6(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(vitest@4.0.6) - '@vitest/mocker': 4.0.6(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0)) - playwright: 1.56.1 - tinyrainbow: 3.0.3 - vitest: 4.0.6(@types/node@24.10.1)(@vitest/browser-playwright@4.0.6)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0) - transitivePeerDependencies: - - bufferutil - - msw - - utf-8-validate - - vite - '@vitest/browser@4.0.6(vite@7.2.2(@types/node@20.19.0)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(vitest@4.0.6)': dependencies: '@vitest/mocker': 4.0.6(vite@7.2.2(@types/node@20.19.0)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0)) @@ -8388,23 +8040,6 @@ snapshots: - vite optional: true - '@vitest/browser@4.0.6(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(vitest@4.0.6)': - dependencies: - '@vitest/mocker': 4.0.6(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0)) - '@vitest/utils': 4.0.6 - magic-string: 0.30.21 - pixelmatch: 7.1.0 - pngjs: 7.0.0 - sirv: 3.0.2 - tinyrainbow: 3.0.3 - vitest: 4.0.6(@types/node@24.10.1)(@vitest/browser-playwright@4.0.6)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0) - ws: 8.18.3 - transitivePeerDependencies: - - bufferutil - - msw - - utf-8-validate - - vite - '@vitest/coverage-v8@4.0.6(@vitest/browser@4.0.6(vite@7.2.2(@types/node@20.19.0)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(vitest@4.0.6))(vitest@4.0.6)': dependencies: '@bcoe/v8-coverage': 1.0.2 @@ -8457,14 +8092,6 @@ snapshots: optionalDependencies: vite: 7.2.2(@types/node@20.19.0)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0) - '@vitest/mocker@4.0.6(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))': - dependencies: - '@vitest/spy': 4.0.6 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0) - '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 @@ -8737,10 +8364,6 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.2: - dependencies: - balanced-match: 1.0.2 - braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -8871,8 +8494,6 @@ snapshots: commander@14.0.1: {} - commander@14.0.2: {} - commander@2.20.3: optional: true @@ -9175,30 +8796,6 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@2.6.1)): - dependencies: - '@babel/core': 7.28.5 - '@babel/parser': 7.28.5 - eslint: 9.39.1(jiti@2.6.1) - hermes-parser: 0.25.1 - zod: 3.25.76 - zod-validation-error: 4.0.2(zod@3.25.76) - transitivePeerDependencies: - - supports-color - - eslint-plugin-react-refresh@0.4.24(eslint@9.39.1(jiti@2.6.1)): - dependencies: - eslint: 9.39.1(jiti@2.6.1) - - eslint-plugin-storybook@10.2.0-alpha.14(eslint@9.39.1(jiti@2.6.1))(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3): - dependencies: - '@typescript-eslint/utils': 8.52.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.1(jiti@2.6.1) - storybook: 10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - transitivePeerDependencies: - - supports-color - - typescript - eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 @@ -9512,8 +9109,6 @@ snapshots: graceful-fs@4.2.11: {} - graphemer@1.4.0: {} - has-flag@4.0.0: {} has-symbols@1.1.0: {} @@ -9534,16 +9129,12 @@ snapshots: property-information: 7.1.0 space-separated-tokens: 2.0.2 - hermes-estree@0.25.1: {} - - hermes-parser@0.25.1: - dependencies: - hermes-estree: 0.25.1 - highlight.js@10.7.3: {} highlightjs-vue@1.0.0: {} + hono@4.11.3: {} + hookable@5.5.3: {} html-escaper@2.0.2: {} @@ -9568,8 +9159,6 @@ snapshots: ignore@5.3.2: {} - ignore@7.0.5: {} - image-size@0.5.5: optional: true @@ -9671,6 +9260,8 @@ snapshots: jiti@2.6.1: optional: true + jose@6.1.3: {} + js-tokens@4.0.0: {} js-tokens@9.0.1: {} @@ -9697,6 +9288,8 @@ snapshots: json-schema-traverse@1.0.0: {} + json-schema-typed@8.0.2: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@2.2.3: {} @@ -9852,10 +9445,6 @@ snapshots: dependencies: brace-expansion: 1.1.12 - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.2 - minimist@1.2.8: {} minipass@7.1.2: {} @@ -9869,7 +9458,8 @@ snapshots: mri@1.2.0: {} - mrmime@2.0.1: {} + mrmime@2.0.1: + optional: true ms@2.1.3: {} @@ -10054,6 +9644,7 @@ snapshots: pixelmatch@7.1.0: dependencies: pngjs: 7.0.0 + optional: true pkce-challenge@4.1.0: {} @@ -10090,7 +9681,8 @@ snapshots: optionalDependencies: fsevents: 2.3.2 - pngjs@7.0.0: {} + pngjs@7.0.0: + optional: true postcss-calc@10.1.1(postcss@8.5.6): dependencies: @@ -10576,19 +10168,6 @@ snapshots: transitivePeerDependencies: - encoding - reshaped@3.9.0(postcss@8.5.6)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): - dependencies: - '@csstools/postcss-global-data': 3.1.0(postcss@8.5.6) - chalk: 4.1.2 - commander: 14.0.2 - cssnano: 7.1.1(postcss@8.5.6) - csstype: 3.1.3 - culori: 4.0.2 - postcss: 8.5.6 - postcss-custom-media: 11.0.6(postcss@8.5.6) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -10841,6 +10420,7 @@ snapshots: '@polka/url': 1.0.0-next.29 mrmime: 2.0.1 totalist: 3.0.1 + optional: true sisteransi@1.0.5: {} @@ -11057,16 +10637,13 @@ snapshots: toidentifier@1.0.1: {} - totalist@3.0.1: {} + totalist@3.0.1: + optional: true tr46@0.0.3: {} tree-kill@1.2.2: {} - ts-api-utils@2.4.0(typescript@5.9.3): - dependencies: - typescript: 5.9.3 - ts-dedent@2.2.0: {} ts-node@10.9.2(@swc/core@1.13.5)(@types/node@20.19.0)(typescript@5.9.3): @@ -11170,17 +10747,6 @@ snapshots: media-typer: 1.1.0 mime-types: 3.0.1 - typescript-eslint@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@typescript-eslint/eslint-plugin': 8.47.0(@typescript-eslint/parser@8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.47.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.1(jiti@2.6.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - typescript@5.9.3: {} ufo@1.6.1: {} @@ -11367,45 +10933,6 @@ snapshots: - tsx - yaml - vitest@4.0.6(@types/node@24.10.1)(@vitest/browser-playwright@4.0.6)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0): - dependencies: - '@vitest/expect': 4.0.6 - '@vitest/mocker': 4.0.6(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0)) - '@vitest/pretty-format': 4.0.6 - '@vitest/runner': 4.0.6 - '@vitest/snapshot': 4.0.6 - '@vitest/spy': 4.0.6 - '@vitest/utils': 4.0.6 - debug: 4.4.3 - es-module-lexer: 1.7.0 - expect-type: 1.2.2 - magic-string: 0.30.21 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.10.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.15 - tinyrainbow: 3.0.3 - vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 24.10.1 - '@vitest/browser-playwright': 4.0.6(playwright@1.56.1)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(vitest@4.0.6) - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - watchpack@2.4.4: dependencies: glob-to-regexp: 0.4.1 @@ -11518,7 +11045,7 @@ snapshots: dependencies: zod: 3.25.76 - zod-validation-error@4.0.2(zod@3.25.76): + zod-to-json-schema@3.25.1(zod@3.25.76): dependencies: zod: 3.25.76 From b4af86c15ebba0f185e466c20eccb610e87625b1 Mon Sep 17 00:00:00 2001 From: Jeppe Reinhold Date: Thu, 15 Jan 2026 11:04:26 +0100 Subject: [PATCH 02/17] WIP --- packages/addon-mcp/package.json | 1 + packages/addon-mcp/src/preset.ts | 11 ++ packages/addon-mcp/src/preview.ts | 73 +++++++++ .../src/tools/get-story-urls.test.ts | 18 +-- .../addon-mcp/src/tools/get-story-urls.ts | 115 +++++++++----- .../get-ui-building-instructions.test.ts | 4 +- .../src/tools/get-ui-building-instructions.ts | 4 +- packages/addon-mcp/src/tools/preview.html | 143 ++++++++++++------ packages/addon-mcp/tsdown.config.ts | 2 +- 9 files changed, 267 insertions(+), 104 deletions(-) create mode 100644 packages/addon-mcp/src/preview.ts diff --git a/packages/addon-mcp/package.json b/packages/addon-mcp/package.json index 780697af..01d4f4a5 100644 --- a/packages/addon-mcp/package.json +++ b/packages/addon-mcp/package.json @@ -16,6 +16,7 @@ "type": "module", "exports": { "./preset": "./dist/preset.js", + "./preview": "./dist/preview.js", "./package.json": "./package.json" }, "files": [ diff --git a/packages/addon-mcp/src/preset.ts b/packages/addon-mcp/src/preset.ts index 19c80ddc..9860b445 100644 --- a/packages/addon-mcp/src/preset.ts +++ b/packages/addon-mcp/src/preset.ts @@ -1,9 +1,20 @@ import { mcpServerHandler } from './mcp-handler.ts'; +import * as path from 'node:path'; import type { PresetProperty } from 'storybook/internal/types'; import { AddonOptions } from './types.ts'; import * as v from 'valibot'; import { getManifestStatus } from './tools/is-manifest-available.ts'; import htmlTemplate from './template.html'; +import { fileURLToPath } from 'node:url'; + +export const previewEntries: PresetProperty<'previewEntries'> = async ( + existingEntries = [], +) => { + return [ + ...existingEntries, + fileURLToPath(import.meta.resolve('@storybook/addon-mcp/preview')), + ]; +}; export const experimental_devServer: PresetProperty< 'experimental_devServer' diff --git a/packages/addon-mcp/src/preview.ts b/packages/addon-mcp/src/preview.ts new file mode 100644 index 00000000..41e790ab --- /dev/null +++ b/packages/addon-mcp/src/preview.ts @@ -0,0 +1,73 @@ +/** + * Storybook MCP App Script + * + * This script runs inside Storybook's iframe and communicates dimensions + * to the parent preview.html frame via postMessage (cross-origin safe). + * + * Only activates when the iframe is loaded with `mcp-app=true` query parameter, + * which is set by the MCP Apps preview.html wrapper. + */ + +const MCP_APP_PARAM = 'mcp-app'; + +// Only run if we're in the special MCP App iframe context +const isMcpApp = new URLSearchParams(window.location.search).has(MCP_APP_PARAM); + +if (isMcpApp) { + const STORYBOOK_MCP_SIZE_CHANGED = 'storybook-mcp:size-changed'; + const SIZE_CHANGE_THRESHOLD = 2; // Only report changes > 2px to avoid oscillation + + let debounceTimer: ReturnType | null = null; + let lastSentHeight = 0; + const DEBOUNCE_MS = 100; + + function sendSizeToParent() { + const height = document.body.scrollHeight; + + // Only send if the change exceeds the threshold + if (Math.abs(height - lastSentHeight) <= SIZE_CHANGE_THRESHOLD) { + return; + } + + lastSentHeight = height; + console.log( + `[MCP App] Reporting size change from previewAnnotation: ${height}px`, + ); + window.parent.postMessage( + { + type: STORYBOOK_MCP_SIZE_CHANGED, + height, + }, + '*', + ); + } + + function debouncedSendSize() { + if (debounceTimer) { + clearTimeout(debounceTimer); + } + debounceTimer = setTimeout(sendSizeToParent, DEBOUNCE_MS); + } + + // Send initial size after DOM is ready + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', sendSizeToParent); + } else { + sendSizeToParent(); + } + + // Also send after full load (images, fonts, etc.) + window.addEventListener('load', sendSizeToParent); + + // Observe body for size changes using ResizeObserver + const resizeObserver = new ResizeObserver(debouncedSendSize); + resizeObserver.observe(document.body); + + // Also observe for DOM mutations that might affect size + const mutationObserver = new MutationObserver(debouncedSendSize); + mutationObserver.observe(document.body, { + childList: true, + subtree: true, + attributes: true, + }); +} diff --git a/packages/addon-mcp/src/tools/get-story-urls.test.ts b/packages/addon-mcp/src/tools/get-story-urls.test.ts index 83583f7d..7b278d1e 100644 --- a/packages/addon-mcp/src/tools/get-story-urls.test.ts +++ b/packages/addon-mcp/src/tools/get-story-urls.test.ts @@ -3,7 +3,7 @@ import { McpServer } from 'tmcp'; import { ValibotJsonSchemaAdapter } from '@tmcp/adapter-valibot'; import { addGetStoryUrlsTool, - GET_STORY_URLS_TOOL_NAME, + PREVIEW_STORIES_TOOL_NAME, } from './get-story-urls.ts'; import type { AddonContext } from '../types.ts'; import smallStoryIndexFixture from '../../fixtures/small-story-index.fixture.json' with { type: 'json' }; @@ -68,7 +68,7 @@ describe('getStoryUrlsTool', () => { id: 1, method: 'tools/call', params: { - name: GET_STORY_URLS_TOOL_NAME, + name: PREVIEW_STORIES_TOOL_NAME, arguments: { stories: [ { @@ -102,7 +102,7 @@ describe('getStoryUrlsTool', () => { id: 1, method: 'tools/call', params: { - name: GET_STORY_URLS_TOOL_NAME, + name: PREVIEW_STORIES_TOOL_NAME, arguments: { stories: [ { @@ -151,7 +151,7 @@ describe('getStoryUrlsTool', () => { id: 1, method: 'tools/call', params: { - name: GET_STORY_URLS_TOOL_NAME, + name: PREVIEW_STORIES_TOOL_NAME, arguments: { stories: [ { @@ -182,7 +182,7 @@ describe('getStoryUrlsTool', () => { id: 1, method: 'tools/call', params: { - name: GET_STORY_URLS_TOOL_NAME, + name: PREVIEW_STORIES_TOOL_NAME, arguments: { stories: [ { @@ -216,7 +216,7 @@ describe('getStoryUrlsTool', () => { id: 1, method: 'tools/call', params: { - name: GET_STORY_URLS_TOOL_NAME, + name: PREVIEW_STORIES_TOOL_NAME, arguments: { stories: [ { @@ -254,7 +254,7 @@ describe('getStoryUrlsTool', () => { id: 1, method: 'tools/call', params: { - name: GET_STORY_URLS_TOOL_NAME, + name: PREVIEW_STORIES_TOOL_NAME, arguments: { stories: [ { @@ -289,7 +289,7 @@ describe('getStoryUrlsTool', () => { id: 1, method: 'tools/call', params: { - name: GET_STORY_URLS_TOOL_NAME, + name: PREVIEW_STORIES_TOOL_NAME, arguments: { stories: [ { @@ -328,7 +328,7 @@ describe('getStoryUrlsTool', () => { id: 1, method: 'tools/call', params: { - name: GET_STORY_URLS_TOOL_NAME, + name: PREVIEW_STORIES_TOOL_NAME, arguments: { stories: [ { diff --git a/packages/addon-mcp/src/tools/get-story-urls.ts b/packages/addon-mcp/src/tools/get-story-urls.ts index 085fb6fd..b3eddcab 100644 --- a/packages/addon-mcp/src/tools/get-story-urls.ts +++ b/packages/addon-mcp/src/tools/get-story-urls.ts @@ -8,17 +8,34 @@ import { collectTelemetry } from '../telemetry.ts'; import { fetchStoryIndex } from '../utils/fetch-story-index.ts'; import { errorToMCPContent } from '../utils/errors.ts'; import type { AddonContext } from '../types.ts'; -import { StoryInputArray } from '../types.ts'; +import { StoryInput, StoryInputArray } from '../types.ts'; import previewHtml from './preview.html'; -export const GET_STORY_URLS_TOOL_NAME = 'preview-story'; -export const GET_STORY_URLS_RESOURCE_URI = `ui://${GET_STORY_URLS_TOOL_NAME}/preview.html`; +export const PREVIEW_STORIES_TOOL_NAME = 'preview-story'; +export const PREVIEW_STORIES_RESOURCE_URI = `ui://${PREVIEW_STORIES_TOOL_NAME}/preview.html`; const GetStoryUrlsInput = v.object({ stories: StoryInputArray, }); +const GetStoryUrlsOutput = v.object({ + stories: v.array( + v.union([ + v.object({ + title: v.string(), + name: v.string(), + previewUrl: v.string(), + }), + v.object({ + input: StoryInput, + error: v.string(), + }), + ]), + ), +}); + type GetStoryUrlsInput = v.InferOutput; +type GetStoryUrlsOutput = v.InferOutput; export async function addGetStoryUrlsTool( server: McpServer, @@ -41,38 +58,47 @@ export async function addGetStoryUrlsTool( server.resource( { - name: GET_STORY_URLS_RESOURCE_URI, + name: PREVIEW_STORIES_RESOURCE_URI, description: 'App Resource for the Get Story tool', - uri: GET_STORY_URLS_RESOURCE_URI, + uri: PREVIEW_STORIES_RESOURCE_URI, mimeType: 'text/html;profile=mcp-app', }, - () => ({ - contents: [ - { - uri: GET_STORY_URLS_RESOURCE_URI, - mimeType: 'text/html;profile=mcp-app', - text: previewHtml, - _meta: { - ui: { - prefersBorders: true, - csp: { - frameDomains: ['http://localhost:6006'], + () => { + const origin = server.ctx.custom!.origin; + console.log({ origin }); + return { + contents: [ + { + uri: PREVIEW_STORIES_RESOURCE_URI, + mimeType: 'text/html;profile=mcp-app', + text: previewHtml, + _meta: { + ui: { + prefersBorders: true, + domain: origin, + csp: { + connectDomains: [origin], + resourceDomains: [origin], + frameDomains: [origin], + baseUriDomains: [origin], + }, }, }, }, - }, - ], - }), + ], + }; + }, ); server.tool( { - name: GET_STORY_URLS_TOOL_NAME, - title: 'Preview stories, either as rendered MCP Apps or raw URLs', - description: `Preview one or more stories, rendering them as an MCP App using the UI Resource.`, + name: PREVIEW_STORIES_TOOL_NAME, + title: 'Preview stories', + description: `Use this tool to preview one or more stories, rendering them as an MCP App using the UI Resource or returning the raw URL for users to visit.`, schema: GetStoryUrlsInput, + outputSchema: GetStoryUrlsOutput, enabled: () => server.ctx.custom?.toolsets?.dev ?? true, - _meta: { ui: { resourceUri: GET_STORY_URLS_RESOURCE_URI } }, + _meta: { ui: { resourceUri: PREVIEW_STORIES_RESOURCE_URI } }, }, async (input) => { try { @@ -85,15 +111,12 @@ export async function addGetStoryUrlsTool( const index = await fetchStoryIndex(origin); const entriesList = Object.values(index.entries); - const result: string[] = []; - const previewUrls: string[] = []; - let foundStoryCount = 0; + const structuredResult: GetStoryUrlsOutput['stories'] = []; + const textResult: string[] = []; - for (const { - exportName, - explicitStoryName, - absoluteStoryPath, - } of input.stories) { + for (const inputParams of input.stories) { + const { exportName, explicitStoryName, absoluteStoryPath } = + inputParams; const relativePath = `./${path.relative(process.cwd(), absoluteStoryPath)}`; logger.debug('Searching for:'); @@ -104,26 +127,34 @@ export async function addGetStoryUrlsTool( relativePath, }); - const foundStoryId = entriesList.find( + const foundStory = entriesList.find( (entry) => entry.importPath === relativePath && [explicitStoryName, storyNameFromExport(exportName)].includes( entry.name, ), - )?.id; + ); - if (foundStoryId) { - logger.debug(`Found story ID: ${foundStoryId}`); - result.push(`${origin}/?path=/story/${foundStoryId}`); - previewUrls.push(`${origin}/iframe.html?id=${foundStoryId}`); - foundStoryCount++; + if (foundStory) { + logger.debug(`Found story ID: ${foundStory.id}`); + const previewUrl = `${origin}/?path=/story/${foundStory.id}`; + structuredResult.push({ + title: foundStory.title, + name: foundStory.name, + previewUrl, + }); + textResult.push(previewUrl); } else { logger.debug('No story found'); let errorMessage = `No story found for export name "${exportName}" with absolute file path "${absoluteStoryPath}"`; if (!explicitStoryName) { errorMessage += ` (did you forget to pass the explicit story name?)`; } - result.push(errorMessage); + structuredResult.push({ + input: inputParams, + error: errorMessage, + }); + textResult.push(errorMessage); } } @@ -133,17 +164,17 @@ export async function addGetStoryUrlsTool( server, toolset: 'dev', inputStoryCount: input.stories.length, - outputStoryCount: foundStoryCount, + outputStoryCount: structuredResult.length, }); } return { - content: result.map((text) => ({ + content: textResult.map((text) => ({ type: 'text', text, })), structuredContent: { - previewUrls, + stories: structuredResult, }, }; } catch (error) { diff --git a/packages/addon-mcp/src/tools/get-ui-building-instructions.test.ts b/packages/addon-mcp/src/tools/get-ui-building-instructions.test.ts index da55840f..5180f68c 100644 --- a/packages/addon-mcp/src/tools/get-ui-building-instructions.test.ts +++ b/packages/addon-mcp/src/tools/get-ui-building-instructions.test.ts @@ -6,7 +6,7 @@ import { GET_UI_BUILDING_INSTRUCTIONS_TOOL_NAME, } from './get-ui-building-instructions.ts'; import type { AddonContext } from '../types.ts'; -import { GET_STORY_URLS_TOOL_NAME } from './get-story-urls.ts'; +import { PREVIEW_STORIES_TOOL_NAME } from './get-story-urls.ts'; describe('getUIBuildingInstructionsTool', () => { let server: McpServer; @@ -80,7 +80,7 @@ describe('getUIBuildingInstructionsTool', () => { // Check that placeholders were replaced expect(instructions).toContain('@storybook/react-vite'); expect(instructions).toContain('@storybook/react'); - expect(instructions).toContain(GET_STORY_URLS_TOOL_NAME); + expect(instructions).toContain(PREVIEW_STORIES_TOOL_NAME); // Check that no placeholders remain expect(instructions).not.toContain('{{FRAMEWORK}}'); diff --git a/packages/addon-mcp/src/tools/get-ui-building-instructions.ts b/packages/addon-mcp/src/tools/get-ui-building-instructions.ts index 03ca386f..e5893351 100644 --- a/packages/addon-mcp/src/tools/get-ui-building-instructions.ts +++ b/packages/addon-mcp/src/tools/get-ui-building-instructions.ts @@ -1,5 +1,5 @@ import type { McpServer } from 'tmcp'; -import { GET_STORY_URLS_TOOL_NAME } from './get-story-urls.ts'; +import { PREVIEW_STORIES_TOOL_NAME } from './get-story-urls.ts'; import { collectTelemetry } from '../telemetry.ts'; import uiInstructionsTemplate from '../ui-building-instructions.md'; import { errorToMCPContent } from '../utils/errors.ts'; @@ -46,7 +46,7 @@ export async function addGetUIBuildingInstructionsTool( const uiInstructions = uiInstructionsTemplate .replace('{{FRAMEWORK}}', framework) .replace('{{RENDERER}}', renderer ?? framework) - .replace('{{GET_STORY_URLS_TOOL_NAME}}', GET_STORY_URLS_TOOL_NAME); + .replace('{{GET_STORY_URLS_TOOL_NAME}}', PREVIEW_STORIES_TOOL_NAME); return { content: [{ type: 'text' as const, text: uiInstructions }], diff --git a/packages/addon-mcp/src/tools/preview.html b/packages/addon-mcp/src/tools/preview.html index 5c551034..12c76fed 100644 --- a/packages/addon-mcp/src/tools/preview.html +++ b/packages/addon-mcp/src/tools/preview.html @@ -3,6 +3,7 @@ + - -

Story Preview

- + diff --git a/packages/addon-mcp/tsdown.config.ts b/packages/addon-mcp/tsdown.config.ts index 0e953e99..8de36ec3 100644 --- a/packages/addon-mcp/tsdown.config.ts +++ b/packages/addon-mcp/tsdown.config.ts @@ -4,5 +4,5 @@ import pkg from './package.json' with { type: 'json' }; export default defineConfig({ ...sharedTsDownConfig(pkg.name), - entry: 'src/preset.ts', + entry: ['src/preset.ts', 'src/preview.ts'], }); From 005498ab4da9cecccf9b2e49146ae3a4a09b8a1f Mon Sep 17 00:00:00 2001 From: Jeppe Reinhold Date: Thu, 22 Jan 2026 13:12:45 +0100 Subject: [PATCH 03/17] it works now --- .github/copilot-instructions.md | 4 + .../addon-mcp/src/tools/get-story-urls.ts | 3 +- packages/addon-mcp/src/tools/preview.html | 138 ++++++++++-------- 3 files changed, 82 insertions(+), 63 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 71d4129e..a45a903a 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -376,3 +376,7 @@ When working on data validation, refer to the following resources: - https://valibot.dev/ - https://github.com/paoloricciuti/tmcp/tree/main/packages/adapter-valibot + +When working with MCP Apps and/or the `get-story-urls.ts` file, refer to the MCP App specification: + +- https://raw.githubusercontent.com/modelcontextprotocol/ext-apps/refs/heads/main/specification/draft/apps.mdx diff --git a/packages/addon-mcp/src/tools/get-story-urls.ts b/packages/addon-mcp/src/tools/get-story-urls.ts index b3eddcab..18724ad8 100644 --- a/packages/addon-mcp/src/tools/get-story-urls.ts +++ b/packages/addon-mcp/src/tools/get-story-urls.ts @@ -65,7 +65,6 @@ export async function addGetStoryUrlsTool( }, () => { const origin = server.ctx.custom!.origin; - console.log({ origin }); return { contents: [ { @@ -74,7 +73,7 @@ export async function addGetStoryUrlsTool( text: previewHtml, _meta: { ui: { - prefersBorders: true, + prefersBorder: false, domain: origin, csp: { connectDomains: [origin], diff --git a/packages/addon-mcp/src/tools/preview.html b/packages/addon-mcp/src/tools/preview.html index 12c76fed..c2cb8dae 100644 --- a/packages/addon-mcp/src/tools/preview.html +++ b/packages/addon-mcp/src/tools/preview.html @@ -10,27 +10,46 @@ padding: 0; box-sizing: border-box; } + html[data-theme='light'] { + color-scheme: light; + } + html[data-theme='dark'] { + color-scheme: dark; + } html, body { width: 100%; height: 100%; - margin: 0.5rem; + margin: 0; + padding: 0; + background-color: var(--color-background-secondary); + } + body { + display: flex; + flex-direction: column; + gap: 1rem; } :root { + /* + These are fallback values, if the MCP client doesn't set them. + See https://github.com/modelcontextprotocol/ext-apps/blob/main/specification/draft/apps.mdx#theming + */ --color-text-primary: light-dark(black, white); --color-border-primary: light-dark(#ccc, #444); - + --color-background-secondary: light-dark(#f9f9f9, #1e1e1e); --font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Oxygen-Sans', Ubuntu, Cantarell, 'Helvetica Neue', sans-serif; - --font-heading-md-size: 1.5rem; + --font-heading-xs-size: 1rem; + --font-heading-xs-line-height: 1.25; --border-width-regular: 1px; } .story-heading { font-family: var(--font-sans); - font-size: var(--font-heading-md-size); + font-size: var(--font-heading-xs-size); + line-height: var(--font-heading-xs-line-height); color: var(--color-text-primary); - padding: 1rem 0; + padding: 0.5rem 0; } .story-iframe { background-color: white; @@ -48,7 +67,6 @@

const MCP_APP_PARAM = 'mcp-app'; // Adapted from https://github.com/MCP-UI-Org/mcp-ui/blob/fd89e2942eb7148d83245397be0b6ad34ce538b0/sdks/typescript/server/src/adapters/mcp-apps/adapter-runtime.ts - /** * Current protocol version - must match LATEST_PROTOCOL_VERSION from ext-apps * @see https://github.com/modelcontextprotocol/ext-apps @@ -97,43 +115,36 @@

let nextId = 1; function sendHostRequest(method, params) { const id = nextId++; + const { promise, resolve, reject } = Promise.withResolvers(); + window.parent.postMessage({ jsonrpc: '2.0', id, method, params }, '*'); - console.log('Sent host request:', { id, method, params }); - return new Promise((resolve, reject) => { - window.addEventListener('message', function listener(event) { - const data = event.data; - console.log('Received message in preview iframe:', { data }); - if (event.data?.id !== id) { - reject(new Error(`Unsupported message: ${JSON.stringify(data)}`)); - return; - } - window.removeEventListener('message', listener); - if (event.data?.result) { - resolve(event.data?.result); - } else if (event.data?.error) { - reject(new Error(event.data.error)); - } - }); + + window.addEventListener('message', function listener(event) { + const data = event.data; + if (event.data?.id !== id) { + return; + } + window.removeEventListener('message', listener); + if (event.data?.result) { + resolve(event.data?.result); + } else if (event.data?.error) { + reject(new Error(event.data.error)); + } }); + return promise; } + function sendHostNotification(method, params) { - console.log('Sending host notification:', { method, params }); window.parent.postMessage({ jsonrpc: '2.0', method, params }, '*'); } + function onHostNotification(method, handler) { window.addEventListener('message', function listener(event) { if (event.data?.method === method) { - console.log('Received host notification:', { - method, - params: event.data.params, - }); handler(event.data.params); } }); } - // --- - - console.log('Preview HTML loaded, initializing MCP Apps protocol...'); const initializeResult = await sendHostRequest(METHODS.INITIALIZE, { appInfo: { @@ -143,48 +154,60 @@

appCapabilities: {}, protocolVersion: LATEST_PROTOCOL_VERSION, }); - const hostTheme = initializeResult?.hostContext?.theme; - const hostStyles = initializeResult?.hostContext?.styles?.variables; - // if (hostTheme) { - // document.documentElement.setAttribute('data-theme', hostTheme); - // document.documentElement.style.colorScheme = hostTheme; - // } - // if (hostStyles) { - // for (const [key, value] of Object.entries(hostStyles)) { - // if (value !== undefined) { - // document.documentElement.style.setProperty(key, value); - // } - // s; - // } - // } - console.log({ initializeResult }); - sendHostNotification(METHODS.INITIALIZED, {}); + applyHostStyles(initializeResult?.hostContext); + onHostNotification(METHODS.TOOL_RESULT, loadStoryIframes); + onHostNotification(METHODS.HOST_CONTEXT_CHANGED, applyHostStyles); + sendHostNotification(METHODS.INITIALIZED, {}); // Listen for size messages from Storybook iframes (height only to avoid feedback loops) window.addEventListener('message', function (event) { - console.log('Received size change from story iframe:'); - console.log(event.data?.type); if (event.data?.type !== STORYBOOK_MCP_SIZE_CHANGED) { return; } - console.log('Received size change from story iframe:'); - // Find the iframe that sent this message const iframes = document.querySelectorAll('.story-iframe'); + let hasResizedIframes = false; for (const iframe of iframes) { if (iframe.contentWindow === event.source) { iframe.style.height = event.data.height + 'px'; - resizeApp(); + hasResizedIframes = true; break; } } + if (hasResizedIframes) { + resizeApp(); + } }); + function applyHostStyles(hostContext) { + console.log('Applying host styles:', { hostContext }); + if (hostContext?.theme) { + document.documentElement.setAttribute( + 'data-theme', + hostContext.theme, + ); + } + if (!hostContext?.styles?.variables) { + return; + } + for (const [key, value] of Object.entries( + hostContext.styles.variables, + ).filter(([, value]) => !!value)) { + document.documentElement.style.setProperty(key, value); + } + resizeApp(); + } + + function resizeApp(event) { + sendHostNotification(METHODS.SIZE_CHANGED, { + width: document.documentElement.scrollWidth, + height: document.documentElement.scrollHeight, + }); + } + function loadStoryIframes(params) { - console.log('TOOL result RECEIVED IN PREVIEW HTML:'); - console.log({ params }); if ( !params.structuredContent?.stories || params.structuredContent.stories.length === 0 @@ -218,15 +241,8 @@

iframe.src = url.toString(); document.body.appendChild(article); - resizeApp(); } - } - - function resizeApp(event) { - sendHostNotification(METHODS.SIZE_CHANGED, { - width: document.body.scrollWidth, - height: document.body.scrollHeight, - }); + resizeApp(); } From 62f0a710b16e82f3651e62d741d0bdfe4948aa3f Mon Sep 17 00:00:00 2001 From: Jeppe Reinhold Date: Thu, 22 Jan 2026 14:20:57 +0100 Subject: [PATCH 04/17] use tsdown to bundle the preview stories script --- .../instructions/addon-mcp.instructions.md | 2 +- packages/addon-mcp/package.json | 1 + packages/addon-mcp/src/constants.ts | 2 + packages/addon-mcp/src/mcp-handler.ts | 4 +- packages/addon-mcp/src/preview.ts | 9 +- .../get-ui-building-instructions.test.ts | 2 +- .../src/tools/get-ui-building-instructions.ts | 2 +- ...y-urls.test.ts => preview-stories.test.ts} | 10 +- .../{get-story-urls.ts => preview-stories.ts} | 53 ++-- .../preview-stories-app-script.ts | 243 +++++++++++++++++ .../preview-stories-app-template.html | 73 +++++ packages/addon-mcp/src/tools/preview.html | 250 ------------------ packages/addon-mcp/src/types.ts | 6 - packages/addon-mcp/tsdown.config.ts | 26 +- 14 files changed, 381 insertions(+), 302 deletions(-) create mode 100644 packages/addon-mcp/src/constants.ts rename packages/addon-mcp/src/tools/{get-story-urls.test.ts => preview-stories.test.ts} (97%) rename packages/addon-mcp/src/tools/{get-story-urls.ts => preview-stories.ts} (81%) create mode 100644 packages/addon-mcp/src/tools/preview-stories/preview-stories-app-script.ts create mode 100644 packages/addon-mcp/src/tools/preview-stories/preview-stories-app-template.html delete mode 100644 packages/addon-mcp/src/tools/preview.html diff --git a/.github/instructions/addon-mcp.instructions.md b/.github/instructions/addon-mcp.instructions.md index 8f0d2ac9..77cf2d0f 100644 --- a/.github/instructions/addon-mcp.instructions.md +++ b/.github/instructions/addon-mcp.instructions.md @@ -245,7 +245,7 @@ Tests run automatically on PRs and main branch pushes via `.github/workflows/che ### Naming Conventions - Constants: SCREAMING_SNAKE_CASE (e.g., `GET_STORY_URLS_TOOL_NAME`) -- Functions: camelCase (e.g., `addGetStoryUrlsTool`, `createAddonMcpHandler`) +- Functions: camelCase (e.g., `addPreviewStoriesTool`, `createAddonMcpHandler`) - Types/Interfaces: PascalCase (e.g., `AddonContext`, `StoryInput`) ## Important Files diff --git a/packages/addon-mcp/package.json b/packages/addon-mcp/package.json index 01d4f4a5..f59279fa 100644 --- a/packages/addon-mcp/package.json +++ b/packages/addon-mcp/package.json @@ -17,6 +17,7 @@ "exports": { "./preset": "./dist/preset.js", "./preview": "./dist/preview.js", + "./internal/preview-stories-app-script": "./dist/preview-stories-app-script.js", "./package.json": "./package.json" }, "files": [ diff --git a/packages/addon-mcp/src/constants.ts b/packages/addon-mcp/src/constants.ts new file mode 100644 index 00000000..05fc627b --- /dev/null +++ b/packages/addon-mcp/src/constants.ts @@ -0,0 +1,2 @@ +export const MCP_APP_PARAM = 'mcp-app'; +export const MCP_APP_SIZE_CHANGED_EVENT = 'storybook-mcp:size-changed'; diff --git a/packages/addon-mcp/src/mcp-handler.ts b/packages/addon-mcp/src/mcp-handler.ts index 3d9cd0fd..8b6ba0f0 100644 --- a/packages/addon-mcp/src/mcp-handler.ts +++ b/packages/addon-mcp/src/mcp-handler.ts @@ -2,7 +2,7 @@ import { McpServer } from 'tmcp'; import { ValibotJsonSchemaAdapter } from '@tmcp/adapter-valibot'; import { HttpTransport } from '@tmcp/transport-http'; import pkgJson from '../package.json' with { type: 'json' }; -import { addGetStoryUrlsTool } from './tools/get-story-urls.ts'; +import { addPreviewStoriesTool } from './tools/preview-stories.ts'; import { addGetUIBuildingInstructionsTool } from './tools/get-ui-building-instructions.ts'; import { addListAllDocumentationTool, @@ -49,7 +49,7 @@ const initializeMCPServer = async (options: Options) => { } // Register dev addon tools - await addGetStoryUrlsTool(server); + await addPreviewStoriesTool(server); await addGetUIBuildingInstructionsTool(server); // Only register the additional tools if the component manifest feature is enabled diff --git a/packages/addon-mcp/src/preview.ts b/packages/addon-mcp/src/preview.ts index 41e790ab..fd01de4e 100644 --- a/packages/addon-mcp/src/preview.ts +++ b/packages/addon-mcp/src/preview.ts @@ -8,13 +8,13 @@ * which is set by the MCP Apps preview.html wrapper. */ -const MCP_APP_PARAM = 'mcp-app'; +import { MCP_APP_SIZE_CHANGED_EVENT } from './constants'; +import { MCP_APP_PARAM } from './constants'; // Only run if we're in the special MCP App iframe context const isMcpApp = new URLSearchParams(window.location.search).has(MCP_APP_PARAM); if (isMcpApp) { - const STORYBOOK_MCP_SIZE_CHANGED = 'storybook-mcp:size-changed'; const SIZE_CHANGE_THRESHOLD = 2; // Only report changes > 2px to avoid oscillation let debounceTimer: ReturnType | null = null; @@ -30,12 +30,9 @@ if (isMcpApp) { } lastSentHeight = height; - console.log( - `[MCP App] Reporting size change from previewAnnotation: ${height}px`, - ); window.parent.postMessage( { - type: STORYBOOK_MCP_SIZE_CHANGED, + type: MCP_APP_SIZE_CHANGED_EVENT, height, }, '*', diff --git a/packages/addon-mcp/src/tools/get-ui-building-instructions.test.ts b/packages/addon-mcp/src/tools/get-ui-building-instructions.test.ts index 5180f68c..bfdc659e 100644 --- a/packages/addon-mcp/src/tools/get-ui-building-instructions.test.ts +++ b/packages/addon-mcp/src/tools/get-ui-building-instructions.test.ts @@ -6,7 +6,7 @@ import { GET_UI_BUILDING_INSTRUCTIONS_TOOL_NAME, } from './get-ui-building-instructions.ts'; import type { AddonContext } from '../types.ts'; -import { PREVIEW_STORIES_TOOL_NAME } from './get-story-urls.ts'; +import { PREVIEW_STORIES_TOOL_NAME } from './preview-stories.ts'; describe('getUIBuildingInstructionsTool', () => { let server: McpServer; diff --git a/packages/addon-mcp/src/tools/get-ui-building-instructions.ts b/packages/addon-mcp/src/tools/get-ui-building-instructions.ts index e5893351..0f48218e 100644 --- a/packages/addon-mcp/src/tools/get-ui-building-instructions.ts +++ b/packages/addon-mcp/src/tools/get-ui-building-instructions.ts @@ -1,5 +1,5 @@ import type { McpServer } from 'tmcp'; -import { PREVIEW_STORIES_TOOL_NAME } from './get-story-urls.ts'; +import { PREVIEW_STORIES_TOOL_NAME } from './preview-stories.ts'; import { collectTelemetry } from '../telemetry.ts'; import uiInstructionsTemplate from '../ui-building-instructions.md'; import { errorToMCPContent } from '../utils/errors.ts'; diff --git a/packages/addon-mcp/src/tools/get-story-urls.test.ts b/packages/addon-mcp/src/tools/preview-stories.test.ts similarity index 97% rename from packages/addon-mcp/src/tools/get-story-urls.test.ts rename to packages/addon-mcp/src/tools/preview-stories.test.ts index 7b278d1e..8a6038e0 100644 --- a/packages/addon-mcp/src/tools/get-story-urls.test.ts +++ b/packages/addon-mcp/src/tools/preview-stories.test.ts @@ -2,9 +2,9 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { McpServer } from 'tmcp'; import { ValibotJsonSchemaAdapter } from '@tmcp/adapter-valibot'; import { - addGetStoryUrlsTool, + addPreviewStoriesTool, PREVIEW_STORIES_TOOL_NAME, -} from './get-story-urls.ts'; +} from './preview-stories.ts'; import type { AddonContext } from '../types.ts'; import smallStoryIndexFixture from '../../fixtures/small-story-index.fixture.json' with { type: 'json' }; import * as fetchStoryIndex from '../utils/fetch-story-index.ts'; @@ -13,7 +13,7 @@ vi.mock('storybook/internal/csf', () => ({ storyNameFromExport: (exportName: string) => exportName, })); -describe('getStoryUrlsTool', () => { +describe('previewStoriesTool', () => { let server: McpServer; let fetchStoryIndexSpy: any; const testContext: AddonContext = { @@ -55,7 +55,7 @@ describe('getStoryUrlsTool', () => { }, ); - await addGetStoryUrlsTool(server); + await addPreviewStoriesTool(server); // Mock fetchStoryIndex to return the fixture fetchStoryIndexSpy = vi.spyOn(fetchStoryIndex, 'fetchStoryIndex'); @@ -274,7 +274,7 @@ describe('getStoryUrlsTool', () => { expect(telemetry).toHaveBeenCalledWith( 'addon-mcp', expect.objectContaining({ - event: 'tool:getStoryUrls', + event: 'tool:previewStories', mcpSessionId: 'test-session', toolset: 'dev', inputStoryCount: 1, diff --git a/packages/addon-mcp/src/tools/get-story-urls.ts b/packages/addon-mcp/src/tools/preview-stories.ts similarity index 81% rename from packages/addon-mcp/src/tools/get-story-urls.ts rename to packages/addon-mcp/src/tools/preview-stories.ts index 18724ad8..9611ac7e 100644 --- a/packages/addon-mcp/src/tools/get-story-urls.ts +++ b/packages/addon-mcp/src/tools/preview-stories.ts @@ -1,6 +1,6 @@ import type { McpServer } from 'tmcp'; import path from 'node:path'; -import { createUIResource } from '@mcp-ui/server'; +import url from 'node:url'; import { storyNameFromExport } from 'storybook/internal/csf'; import { logger } from 'storybook/internal/node-logger'; import * as v from 'valibot'; @@ -9,16 +9,17 @@ import { fetchStoryIndex } from '../utils/fetch-story-index.ts'; import { errorToMCPContent } from '../utils/errors.ts'; import type { AddonContext } from '../types.ts'; import { StoryInput, StoryInputArray } from '../types.ts'; -import previewHtml from './preview.html'; +import appTemplate from './preview-stories/preview-stories-app-template.html'; +import fs from 'node:fs/promises'; export const PREVIEW_STORIES_TOOL_NAME = 'preview-story'; export const PREVIEW_STORIES_RESOURCE_URI = `ui://${PREVIEW_STORIES_TOOL_NAME}/preview.html`; -const GetStoryUrlsInput = v.object({ +const PreviewStoriesInput = v.object({ stories: StoryInputArray, }); -const GetStoryUrlsOutput = v.object({ +const PreviewStoriesOutput = v.object({ stories: v.array( v.union([ v.object({ @@ -34,33 +35,31 @@ const GetStoryUrlsOutput = v.object({ ), }); -type GetStoryUrlsInput = v.InferOutput; -type GetStoryUrlsOutput = v.InferOutput; +type PreviewStoriesInput = v.InferOutput; +export type PreviewStoriesOutput = v.InferOutput; -export async function addGetStoryUrlsTool( +export async function addPreviewStoriesTool( server: McpServer, ) { - // // console.log(previewHtml); - // const storyPreviewResource = createUIResource({ - // uri: GET_STORY_URLS_RESOURCE_URI, - // encoding: 'text', - // content: { - // type: 'rawHtml', - // htmlString: previewHtml, - // }, - // uiMetadata: { - // 'preferred-frame-size': ['100%', '1200px'], - // }, - // adapters: { - // mcpApps: { enabled: true }, - // }, - // }); + const previewStoryAppScript = await fs.readFile( + url.fileURLToPath( + import.meta.resolve( + '@storybook/addon-mcp/internal/preview-stories-app-script', + ), + ), + 'utf-8', + ); + const appHtml = appTemplate.replace( + '', + previewStoryAppScript, + ); server.resource( { name: PREVIEW_STORIES_RESOURCE_URI, description: 'App Resource for the Get Story tool', uri: PREVIEW_STORIES_RESOURCE_URI, + //@ts-expect-error tmcp types doesn't know this is valid mimeType: 'text/html;profile=mcp-app', }, () => { @@ -70,7 +69,7 @@ export async function addGetStoryUrlsTool( { uri: PREVIEW_STORIES_RESOURCE_URI, mimeType: 'text/html;profile=mcp-app', - text: previewHtml, + text: appHtml, _meta: { ui: { prefersBorder: false, @@ -94,8 +93,8 @@ export async function addGetStoryUrlsTool( name: PREVIEW_STORIES_TOOL_NAME, title: 'Preview stories', description: `Use this tool to preview one or more stories, rendering them as an MCP App using the UI Resource or returning the raw URL for users to visit.`, - schema: GetStoryUrlsInput, - outputSchema: GetStoryUrlsOutput, + schema: PreviewStoriesInput, + outputSchema: PreviewStoriesOutput, enabled: () => server.ctx.custom?.toolsets?.dev ?? true, _meta: { ui: { resourceUri: PREVIEW_STORIES_RESOURCE_URI } }, }, @@ -110,7 +109,7 @@ export async function addGetStoryUrlsTool( const index = await fetchStoryIndex(origin); const entriesList = Object.values(index.entries); - const structuredResult: GetStoryUrlsOutput['stories'] = []; + const structuredResult: PreviewStoriesOutput['stories'] = []; const textResult: string[] = []; for (const inputParams of input.stories) { @@ -159,7 +158,7 @@ export async function addGetStoryUrlsTool( if (!disableTelemetry) { await collectTelemetry({ - event: 'tool:getStoryUrls', + event: 'tool:previewStories', server, toolset: 'dev', inputStoryCount: input.stories.length, diff --git a/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-script.ts b/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-script.ts new file mode 100644 index 00000000..f46e2ad5 --- /dev/null +++ b/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-script.ts @@ -0,0 +1,243 @@ +// Adapted from https://github.com/MCP-UI-Org/mcp-ui/blob/fd89e2942eb7148d83245397be0b6ad34ce538b0/sdks/typescript/server/src/adapters/mcp-apps/adapter-runtime.ts +/** + * Current protocol version - must match LATEST_PROTOCOL_VERSION from ext-apps + * @see https://github.com/modelcontextprotocol/ext-apps + */ +const LATEST_PROTOCOL_VERSION = '2025-11-21'; + +import { MCP_APP_SIZE_CHANGED_EVENT } from '../../constants.ts'; +import { MCP_APP_PARAM } from '../../constants.ts'; +// Import types from get-story-urls tool +import type { PreviewStoriesOutput } from '../preview-stories.ts'; + +interface McpUiHostStyles { + variables?: Record; + css?: { + fonts?: string; + }; +} + +interface McpUiHostContext { + [key: string]: unknown; + theme?: 'light' | 'dark'; + styles?: McpUiHostStyles; + displayMode?: 'inline' | 'fullscreen' | 'pip'; + availableDisplayModes?: string[]; + locale?: string; + timeZone?: string; + userAgent?: string; + platform?: 'web' | 'desktop' | 'mobile'; + deviceCapabilities?: { + touch?: boolean; + hover?: boolean; + }; + safeAreaInsets?: { + top: number; + right: number; + bottom: number; + left: number; + }; +} + +interface McpUiInitializeResult { + protocolVersion: string; + hostInfo: { + name: string; + version: string; + }; + hostCapabilities: Record; + hostContext: McpUiHostContext; + [key: string]: unknown; +} + +/** + * MCP Apps SEP protocol method constants + * These match the `method` field values from @modelcontextprotocol/ext-apps type definitions: + * - McpUiInitializeRequest: "ui/initialize" + * - McpUiInitializedNotification: "ui/notifications/initialized" + * - McpUiToolInputNotification: "ui/notifications/tool-input" + * - McpUiToolInputPartialNotification: "ui/notifications/tool-input-partial" + * - McpUiToolResultNotification: "ui/notifications/tool-result" + * - McpUiHostContextChangedNotification: "ui/notifications/host-context-changed" + * - McpUiSizeChangedNotification: "ui/notifications/size-changed" + * - McpUiResourceTeardownRequest: "ui/resource-teardown" + * + * @see https://github.com/modelcontextprotocol/ext-apps/blob/main/src/spec.types.ts + */ +const METHODS = { + // Lifecycle + INITIALIZE: 'ui/initialize', + INITIALIZED: 'ui/notifications/initialized', + + // Tool data (Host -> Guest) + TOOL_INPUT: 'ui/notifications/tool-input', + TOOL_INPUT_PARTIAL: 'ui/notifications/tool-input-partial', + TOOL_RESULT: 'ui/notifications/tool-result', + TOOL_CANCELLED: 'ui/notifications/tool-cancelled', + + // Context & UI + HOST_CONTEXT_CHANGED: 'ui/notifications/host-context-changed', + SIZE_CHANGED: 'ui/notifications/size-changed', + RESOURCE_TEARDOWN: 'ui/resource-teardown', + + // Standard MCP methods + TOOLS_CALL: 'tools/call', + NOTIFICATIONS_MESSAGE: 'notifications/message', + OPEN_LINK: 'ui/open-link', + MESSAGE: 'ui/message', +} as const; + +type McpMethod = (typeof METHODS)[keyof typeof METHODS]; + +// Adapted from https://github.com/modelcontextprotocol/ext-apps/blob/main/specification/draft/apps.mdx#transport-layer + +let nextId = 1; + +function sendHostRequest( + method: McpMethod, + params: unknown, +): Promise { + const id = nextId++; + const { promise, resolve, reject } = + Promise.withResolvers(); + + window.parent.postMessage({ jsonrpc: '2.0', id, method, params }, '*'); + + window.addEventListener('message', function listener(event: MessageEvent) { + const data = event.data as { + id?: number; + result?: McpUiInitializeResult; + error?: unknown; + }; + if (event.data?.id !== id) { + return; + } + window.removeEventListener('message', listener); + if (event.data?.result) { + resolve(event.data.result); + } else if (event.data?.error) { + reject(new Error(String(event.data.error))); + } + }); + return promise; +} + +function sendHostNotification(method: McpMethod, params: unknown): void { + window.parent.postMessage({ jsonrpc: '2.0', method, params }, '*'); +} + +function onHostNotification( + method: McpMethod, + handler: (params: T) => void, +): void { + window.addEventListener('message', function listener(event: MessageEvent) { + if (event.data?.method === method) { + handler(event.data.params as T); + } + }); +} + +const initializeResult = (await sendHostRequest(METHODS.INITIALIZE, { + appInfo: { + name: 'storybook-story-preview', + version: '1.0.0', + }, + appCapabilities: {}, + protocolVersion: LATEST_PROTOCOL_VERSION, +})) as McpUiInitializeResult; +applyHostStyles(initializeResult?.hostContext); + +onHostNotification(METHODS.TOOL_RESULT, loadStoryIframes); +onHostNotification(METHODS.HOST_CONTEXT_CHANGED, applyHostStyles); +sendHostNotification(METHODS.INITIALIZED, {}); + +// Listen for size messages from Storybook iframes (height only to avoid feedback loops) +window.addEventListener('message', function (event: MessageEvent) { + if (event.data?.type !== MCP_APP_SIZE_CHANGED_EVENT) { + return; + } + + // Find the iframe that sent this message + const iframes = document.querySelectorAll('.story-iframe'); + let hasResizedIframes = false; + for (const iframe of iframes) { + if (iframe.contentWindow === event.source) { + iframe.style.height = (event.data.height ?? 0) + 'px'; + hasResizedIframes = true; + break; + } + } + if (hasResizedIframes) { + resizeApp(); + } +}); + +function applyHostStyles(hostContext: McpUiHostContext | undefined): void { + if (hostContext?.theme) { + document.documentElement.setAttribute('data-theme', hostContext.theme); + } + if (!hostContext?.styles?.variables) { + return; + } + for (const [key, value] of Object.entries(hostContext.styles.variables)) { + if (value) { + document.documentElement.style.setProperty(key, value); + } + } + resizeApp(); +} + +function resizeApp(): void { + console.log('Resizing app to fit content', { + width: document.body.scrollWidth, + height: document.body.scrollHeight, + }); + sendHostNotification(METHODS.SIZE_CHANGED, { + width: document.body.scrollWidth, + height: document.body.scrollHeight, + }); +} + +function loadStoryIframes(params: { + structuredContent?: PreviewStoriesOutput; +}): void { + const stories = params.structuredContent?.stories; + + if (!stories || stories.length === 0) { + console.warn('No preview URLs found in tool result.'); + return; + } + + const template = document.getElementById( + 'preview-template', + ) as HTMLTemplateElement; + + for (const storyResult of stories) { + if ('error' in storyResult) { + console.warn('Skipping story with error:', storyResult.error); + continue; + } + const clone = template.content.cloneNode(true) as DocumentFragment; + const article = clone.querySelector('article') as HTMLElement; + const heading = clone.querySelector('h1') as HTMLHeadingElement; + const iframe = clone.querySelector('iframe') as HTMLIFrameElement; + + heading.textContent = `${storyResult.title} - ${storyResult.name}`; + + // Set a reasonable default size while waiting for the iframe to report its size + iframe.style.width = '100%'; + iframe.style.height = '0'; + + const iframeSrc = storyResult.previewUrl.replace( + '/?path=/story/', + '/iframe.html?id=', + ); + // Add MCP App param to enable size reporting in Storybook's preview.ts + const url = new URL(iframeSrc); + url.searchParams.set(MCP_APP_PARAM, 'true'); + iframe.src = url.toString(); + + document.body.appendChild(article); + } + resizeApp(); +} diff --git a/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-template.html b/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-template.html new file mode 100644 index 00000000..29092b84 --- /dev/null +++ b/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-template.html @@ -0,0 +1,73 @@ + + + + + + + + + + + + diff --git a/packages/addon-mcp/src/tools/preview.html b/packages/addon-mcp/src/tools/preview.html deleted file mode 100644 index c2cb8dae..00000000 --- a/packages/addon-mcp/src/tools/preview.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - - - - - - diff --git a/packages/addon-mcp/src/types.ts b/packages/addon-mcp/src/types.ts index 4739f1ef..049b3361 100644 --- a/packages/addon-mcp/src/types.ts +++ b/packages/addon-mcp/src/types.ts @@ -73,9 +73,3 @@ export type StoryInput = v.InferOutput; */ export const StoryInputArray = v.array(StoryInput); export type StoryInputArray = v.InferOutput; - -/** - * Schema for the output URL array. - */ -export const StoryUrlArray = v.array(v.string()); -export type StoryUrlArray = v.InferOutput; diff --git a/packages/addon-mcp/tsdown.config.ts b/packages/addon-mcp/tsdown.config.ts index 8de36ec3..bbbd7322 100644 --- a/packages/addon-mcp/tsdown.config.ts +++ b/packages/addon-mcp/tsdown.config.ts @@ -2,7 +2,27 @@ import { defineConfig } from 'tsdown'; import sharedTsDownConfig from '../../tsdown-shared.config.ts'; import pkg from './package.json' with { type: 'json' }; -export default defineConfig({ +const sharedNodeConfig = sharedTsDownConfig(pkg.name); +const browserConfig = { ...sharedTsDownConfig(pkg.name), - entry: ['src/preset.ts', 'src/preview.ts'], -}); + target: 'chrome131', +}; +export default defineConfig([ + { + ...sharedNodeConfig, + entry: ['src/preset.ts'], + }, + { + ...browserConfig, + entry: 'src/preview.ts', + }, + /* + this must be a separate config because it can't rely on code splitting at all + using a shared config would risk code being shared between entries + which would break the MCP App script + */ + { + ...browserConfig, + entry: 'src/tools/preview-stories/preview-stories-app-script.ts', + }, +]); From ae8c78eb2707d0ad9baa7231c66db133c8c3d1c2 Mon Sep 17 00:00:00 2001 From: Jeppe Reinhold Date: Thu, 22 Jan 2026 14:51:22 +0100 Subject: [PATCH 05/17] update naming of story url tool --- .claude/settings.local.json | 2 +- .github/copilot-instructions.md | 6 +- .../instructions/addon-mcp.instructions.md | 12 +- .../.claude/settings.local.json | 2 +- .../tests/mcp-endpoint.e2e.test.ts | 93 ++- packages/addon-mcp/README.md | 2 +- packages/addon-mcp/package.json | 1 - packages/addon-mcp/src/template.html | 2 +- .../get-ui-building-instructions.test.ts | 2 +- .../src/tools/get-ui-building-instructions.ts | 2 +- .../src/tools/preview-stories.test.ts | 39 +- .../addon-mcp/src/tools/preview-stories.ts | 2 +- .../preview-stories-app-script.ts | 1 - .../addon-mcp/src/ui-building-instructions.md | 2 +- pnpm-lock.yaml | 590 ++++++++++-------- 15 files changed, 475 insertions(+), 283 deletions(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 134a8a29..62fb926a 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -5,7 +5,7 @@ "Bash(git checkout:*)", "Bash(git add:*)", "mcp__storybook-addon-mcp__get-ui-building-instructions", - "mcp__storybook-addon-mcp__get-story-urls" + "mcp__storybook-addon-mcp__preview-stories" ], "deny": [], "ask": [] diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index a45a903a..5a211877 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -33,7 +33,7 @@ The addon supports configuring which toolsets are enabled: name: '@storybook/addon-mcp', options: { toolsets: { - dev: true, // get-story-urls, get-ui-building-instructions + dev: true, // preview-stories, get-ui-building-instructions docs: true, // list-all-documentation, get-component-documentation }, experimentalFormat: 'markdown' // Output format: 'markdown' (default) or 'xml' @@ -171,7 +171,7 @@ import pkgJson from '../package.json' with { type: 'json' }; **Naming:** -- Constants: `SCREAMING_SNAKE_CASE` (e.g., `GET_STORY_URLS_TOOL_NAME`) +- Constants: `SCREAMING_SNAKE_CASE` (e.g., `PREVIEW_STORIES_TOOL_NAME`) - Functions: `camelCase` - Types: `PascalCase` @@ -377,6 +377,6 @@ When working on data validation, refer to the following resources: - https://valibot.dev/ - https://github.com/paoloricciuti/tmcp/tree/main/packages/adapter-valibot -When working with MCP Apps and/or the `get-story-urls.ts` file, refer to the MCP App specification: +When working with MCP Apps and/or the `preview-stories.ts` file, refer to the MCP App specification: - https://raw.githubusercontent.com/modelcontextprotocol/ext-apps/refs/heads/main/specification/draft/apps.mdx diff --git a/.github/instructions/addon-mcp.instructions.md b/.github/instructions/addon-mcp.instructions.md index 77cf2d0f..10a8fd42 100644 --- a/.github/instructions/addon-mcp.instructions.md +++ b/.github/instructions/addon-mcp.instructions.md @@ -25,7 +25,7 @@ This is a Storybook addon that runs an MCP (Model Context Protocol) server withi The addon supports two toolsets that can be enabled/disabled: 1. **`dev`** (default: true) - - `get-story-urls`: Retrieve story URLs from Storybook + - `preview-stories`: Retrieve story preview URLs from Storybook - `get-ui-building-instructions`: Provide UI development guidelines 2. **`docs`** (default: true) @@ -80,7 +80,7 @@ src/ types.ts # Valibot schemas and AddonContext type ui-building-instructions.md # Template for agent UI development instructions tools/ - get-story-urls.ts # Tool to retrieve story URLs from Storybook + preview-stories.ts # Tool to retrieve story preview URLs from Storybook get-ui-building-instructions.ts # Tool to provide UI development guidelines utils/ errors.ts # Error handling utilities @@ -173,7 +173,7 @@ pnpm test:ci # Run tests with coverage and CI reporters - **Overall Target**: >70% statement coverage - **src/utils**: 100% coverage (errors.ts, fetch-story-index.ts) -- **src/tools**: >90% coverage (get-story-urls.ts, get-ui-building-instructions.ts) +- **src/tools**: >90% coverage (preview-stories.ts, get-ui-building-instructions.ts) - **src**: Integration files (preset.ts, mcp-handler.ts, telemetry.ts) have partial coverage **Key Testing Patterns:** @@ -244,7 +244,7 @@ Tests run automatically on PRs and main branch pushes via `.github/workflows/che ### Naming Conventions -- Constants: SCREAMING_SNAKE_CASE (e.g., `GET_STORY_URLS_TOOL_NAME`) +- Constants: SCREAMING_SNAKE_CASE (e.g., `PREVIEW_STORIES_TOOL_NAME`) - Functions: camelCase (e.g., `addPreviewStoriesTool`, `createAddonMcpHandler`) - Types/Interfaces: PascalCase (e.g., `AddonContext`, `StoryInput`) @@ -263,7 +263,7 @@ Tests run automatically on PRs and main branch pushes via `.github/workflows/che - `src/mcp-handler.ts` - Main MCP server handler factory using tmcp - `src/telemetry.ts` - Telemetry tracking for usage analytics - `src/types.ts` - Valibot schemas and AddonContext interface -- `src/tools/get-story-urls.ts` - Tool to fetch story URLs from index.json +- `src/tools/preview-stories.ts` - Tool to preview stories from Storybook - `src/tools/get-ui-building-instructions.ts` - Tool to provide framework-specific UI instructions - `src/utils/errors.ts` - Error handling utilities - `src/utils/fetch-story-index.ts` - Utility to fetch Storybook's story index @@ -483,7 +483,7 @@ pnpm test run --coverage # With coverage report - `src/utils/errors.test.ts` - Tests error handling utilities - `src/utils/fetch-story-index.test.ts` - Tests story index fetching -- `src/tools/get-story-urls.test.ts` - Tests story URL resolution tool +- `src/tools/preview-stories.test.ts` - Tests story preview tool - `src/tools/get-ui-building-instructions.test.ts` - Tests UI instructions tool - `src/mcp-handler.test.ts` - Tests HTTP conversion utilities diff --git a/apps/internal-storybook/.claude/settings.local.json b/apps/internal-storybook/.claude/settings.local.json index 01323a79..4a6f3ce6 100644 --- a/apps/internal-storybook/.claude/settings.local.json +++ b/apps/internal-storybook/.claude/settings.local.json @@ -2,7 +2,7 @@ "permissions": { "allow": [ "mcp__storybook-addon-mcp__get-ui-building-instructions", - "mcp__storybook-addon-mcp__get-story-urls", + "mcp__storybook-addon-mcp__preview-stories", "mcp__storybook-addon-mcp__list-all-documentation", "mcp__storybook-addon-mcp__get-documentation" ] diff --git a/apps/internal-storybook/tests/mcp-endpoint.e2e.test.ts b/apps/internal-storybook/tests/mcp-endpoint.e2e.test.ts index 53741ad9..fc365299 100644 --- a/apps/internal-storybook/tests/mcp-endpoint.e2e.test.ts +++ b/apps/internal-storybook/tests/mcp-endpoint.e2e.test.ts @@ -166,7 +166,12 @@ describe('MCP Endpoint E2E Tests', () => { expect(response.result.tools).toMatchInlineSnapshot(` [ { - "description": "Get the URL for one or more stories.", + "_meta": { + "ui": { + "resourceUri": "ui://preview-stories/preview.html", + }, + }, + "description": "Use this tool to preview one or more stories, rendering them as an MCP App using the UI Resource or returning the raw URL for users to visit.", "inputSchema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { @@ -197,8 +202,73 @@ describe('MCP Endpoint E2E Tests', () => { ], "type": "object", }, - "name": "get-story-urls", - "title": "Get stories' URLs", + "name": "preview-stories", + "outputSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "properties": { + "stories": { + "items": { + "anyOf": [ + { + "properties": { + "name": { + "type": "string", + }, + "previewUrl": { + "type": "string", + }, + "title": { + "type": "string", + }, + }, + "required": [ + "title", + "name", + "previewUrl", + ], + "type": "object", + }, + { + "properties": { + "error": { + "type": "string", + }, + "input": { + "properties": { + "absoluteStoryPath": { + "type": "string", + }, + "explicitStoryName": { + "type": "string", + }, + "exportName": { + "type": "string", + }, + }, + "required": [ + "exportName", + "absoluteStoryPath", + ], + "type": "object", + }, + }, + "required": [ + "input", + "error", + ], + "type": "object", + }, + ], + }, + "type": "array", + }, + }, + "required": [ + "stories", + ], + "type": "object", + }, + "title": "Preview stories", }, { "description": "Instructions on how to do UI component development. @@ -243,7 +313,7 @@ describe('MCP Endpoint E2E Tests', () => { }); }); - describe('Tool: get-story-urls', () => { + describe('Tool: preview-stories', () => { it('should return story URLs for valid stories', async () => { const cwd = process.cwd(); const storyPath = cwd.endsWith('/apps/internal-storybook') @@ -251,7 +321,7 @@ describe('MCP Endpoint E2E Tests', () => { : `${cwd}/apps/internal-storybook/stories/components/Button.stories.ts`; const response = await mcpRequest('tools/call', { - name: 'get-story-urls', + name: 'preview-stories', arguments: { stories: [ { @@ -270,13 +340,22 @@ describe('MCP Endpoint E2E Tests', () => { "type": "text", }, ], + "structuredContent": { + "stories": [ + { + "name": "Primary", + "previewUrl": "http://localhost:6006/?path=/story/example-button--primary", + "title": "Example/Button", + }, + ], + }, } `); }); it('should return error message for non-existent story', async () => { const response = await mcpRequest('tools/call', { - name: 'get-story-urls', + name: 'preview-stories', arguments: { stories: [ { @@ -479,7 +558,7 @@ describe('MCP Endpoint E2E Tests', () => { expect(toolNames).toMatchInlineSnapshot(` [ - "get-story-urls", + "preview-stories", "get-ui-building-instructions", ] `); diff --git a/packages/addon-mcp/README.md b/packages/addon-mcp/README.md index b939fe76..ca156880 100644 --- a/packages/addon-mcp/README.md +++ b/packages/addon-mcp/README.md @@ -152,7 +152,7 @@ Provides agents with standardized instructions for UI component development with The instructions ensure agents follow your project's conventions when creating or modifying UI components and their corresponding stories. -#### 2. Get Story URLs (`get_story_urls`) +#### 2. Preview Stories (`preview-stories`) Allows agents to retrieve direct URLs to specific stories in your Storybook. The agent can request URLs for multiple stories by providing: diff --git a/packages/addon-mcp/package.json b/packages/addon-mcp/package.json index f59279fa..bc1ad368 100644 --- a/packages/addon-mcp/package.json +++ b/packages/addon-mcp/package.json @@ -39,7 +39,6 @@ "@tmcp/adapter-valibot": "catalog:", "@tmcp/transport-http": "catalog:", "tmcp": "catalog:", - "@mcp-ui/server": "^5.16.3", "valibot": "catalog:" }, "devDependencies": { diff --git a/packages/addon-mcp/src/template.html b/packages/addon-mcp/src/template.html index dad96d48..c099eb1b 100644 --- a/packages/addon-mcp/src/template.html +++ b/packages/addon-mcp/src/template.html @@ -204,7 +204,7 @@

Available Toolsets

{{DEV_STATUS}}
    -
  • get-story-urls
  • +
  • preview-stories
  • get-ui-building-instructions
diff --git a/packages/addon-mcp/src/tools/get-ui-building-instructions.test.ts b/packages/addon-mcp/src/tools/get-ui-building-instructions.test.ts index bfdc659e..9b96896c 100644 --- a/packages/addon-mcp/src/tools/get-ui-building-instructions.test.ts +++ b/packages/addon-mcp/src/tools/get-ui-building-instructions.test.ts @@ -85,7 +85,7 @@ describe('getUIBuildingInstructionsTool', () => { // Check that no placeholders remain expect(instructions).not.toContain('{{FRAMEWORK}}'); expect(instructions).not.toContain('{{RENDERER}}'); - expect(instructions).not.toContain('{{GET_STORY_URLS_TOOL_NAME}}'); + expect(instructions).not.toContain('{{PREVIEW_STORIES_TOOL_NAME}}'); }); it('should handle Vue framework', async () => { diff --git a/packages/addon-mcp/src/tools/get-ui-building-instructions.ts b/packages/addon-mcp/src/tools/get-ui-building-instructions.ts index 0f48218e..0689221c 100644 --- a/packages/addon-mcp/src/tools/get-ui-building-instructions.ts +++ b/packages/addon-mcp/src/tools/get-ui-building-instructions.ts @@ -46,7 +46,7 @@ export async function addGetUIBuildingInstructionsTool( const uiInstructions = uiInstructionsTemplate .replace('{{FRAMEWORK}}', framework) .replace('{{RENDERER}}', renderer ?? framework) - .replace('{{GET_STORY_URLS_TOOL_NAME}}', PREVIEW_STORIES_TOOL_NAME); + .replace('{{PREVIEW_STORIES_TOOL_NAME}}', PREVIEW_STORIES_TOOL_NAME); return { content: [{ type: 'text' as const, text: uiInstructions }], diff --git a/packages/addon-mcp/src/tools/preview-stories.test.ts b/packages/addon-mcp/src/tools/preview-stories.test.ts index 8a6038e0..23aa1e5d 100644 --- a/packages/addon-mcp/src/tools/preview-stories.test.ts +++ b/packages/addon-mcp/src/tools/preview-stories.test.ts @@ -28,7 +28,7 @@ describe('previewStoriesTool', () => { { name: 'test-server', version: '1.0.0', - description: 'Test server for get-story-urls tool', + description: 'Test server for preview-stories tool', }, { adapter, @@ -92,6 +92,15 @@ describe('previewStoriesTool', () => { text: 'http://localhost:6006/?path=/story/button--primary', }, ], + structuredContent: { + stories: [ + { + title: 'Button', + name: 'Primary', + previewUrl: 'http://localhost:6006/?path=/story/button--primary', + }, + ], + }, }); expect(fetchStoryIndexSpy).toHaveBeenCalledWith('http://localhost:6006'); }); @@ -142,6 +151,25 @@ describe('previewStoriesTool', () => { text: 'http://localhost:6006/?path=/story/input--default', }, ], + structuredContent: { + stories: [ + { + title: 'Button', + name: 'Primary', + previewUrl: 'http://localhost:6006/?path=/story/button--primary', + }, + { + title: 'Button', + name: 'Secondary', + previewUrl: 'http://localhost:6006/?path=/story/button--secondary', + }, + { + title: 'Input', + name: 'Default', + previewUrl: 'http://localhost:6006/?path=/story/input--default', + }, + ], + }, }); }); @@ -207,6 +235,15 @@ describe('previewStoriesTool', () => { text: 'http://localhost:6006/?path=/story/button--primary', }, ], + structuredContent: { + stories: [ + { + title: 'Button', + name: 'Primary', + previewUrl: 'http://localhost:6006/?path=/story/button--primary', + }, + ], + }, }); }); diff --git a/packages/addon-mcp/src/tools/preview-stories.ts b/packages/addon-mcp/src/tools/preview-stories.ts index 9611ac7e..bf306592 100644 --- a/packages/addon-mcp/src/tools/preview-stories.ts +++ b/packages/addon-mcp/src/tools/preview-stories.ts @@ -12,7 +12,7 @@ import { StoryInput, StoryInputArray } from '../types.ts'; import appTemplate from './preview-stories/preview-stories-app-template.html'; import fs from 'node:fs/promises'; -export const PREVIEW_STORIES_TOOL_NAME = 'preview-story'; +export const PREVIEW_STORIES_TOOL_NAME = 'preview-stories'; export const PREVIEW_STORIES_RESOURCE_URI = `ui://${PREVIEW_STORIES_TOOL_NAME}/preview.html`; const PreviewStoriesInput = v.object({ diff --git a/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-script.ts b/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-script.ts index f46e2ad5..72f37cd7 100644 --- a/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-script.ts +++ b/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-script.ts @@ -7,7 +7,6 @@ const LATEST_PROTOCOL_VERSION = '2025-11-21'; import { MCP_APP_SIZE_CHANGED_EVENT } from '../../constants.ts'; import { MCP_APP_PARAM } from '../../constants.ts'; -// Import types from get-story-urls tool import type { PreviewStoriesOutput } from '../preview-stories.ts'; interface McpUiHostStyles { diff --git a/packages/addon-mcp/src/ui-building-instructions.md b/packages/addon-mcp/src/ui-building-instructions.md index a9fe0e0f..40c4054a 100644 --- a/packages/addon-mcp/src/ui-building-instructions.md +++ b/packages/addon-mcp/src/ui-building-instructions.md @@ -95,4 +95,4 @@ Before doing this ensure you have mocked the import in the preview file. - ALWAYS provide story links after any changes to stories files, including changes to existing stories. - After changing any UI components, ALWAYS search for related stories that might cover the changes you've made. If you find any, provide the story links to the user. THIS IS VERY IMPORTANT, as it allows the user to visually inspect the changes you've made. Even later in a session when changing UI components or stories that have already been linked to previously, YOU MUST PROVIDE THE LINKS AGAIN. -- Use the {{GET_STORY_URLS_TOOL_NAME}} tool to get the correct URLs for links to stories. +- Use the {{PREVIEW_STORIES_TOOL_NAME}} tool to get the correct URLs for links to stories. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7204074f..c7c76831 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -100,7 +100,7 @@ importers: version: 5.1.4(typescript@5.9.3)(vite@7.2.2(@types/node@20.19.0)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0)) vitest: specifier: 4.0.6 - version: 4.0.6(@types/node@20.19.0)(@vitest/browser-playwright@4.0.6)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0) + version: 4.0.6(@types/node@20.19.0)(@vitest/browser-playwright@4.0.6)(jiti@2.6.1)(jsdom@27.4.0)(less@4.4.2)(terser@5.44.0) apps/internal-storybook: devDependencies: @@ -260,9 +260,6 @@ importers: packages/addon-mcp: dependencies: - '@mcp-ui/server': - specifier: ^5.16.3 - version: 5.16.3(hono@4.11.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(zod@3.25.76) '@storybook/mcp': specifier: workspace:* version: link:../mcp @@ -313,6 +310,9 @@ importers: packages: + '@acemir/cssom@0.9.31': + resolution: {integrity: sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==} + '@actions/core@1.11.1': resolution: {integrity: sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==} @@ -337,6 +337,15 @@ packages: peerDependencies: zod: ^3.24.1 + '@asamuzakjp/css-color@4.1.1': + resolution: {integrity: sha512-B0Hv6G3gWGMn0xKJ0txEi/jM5iFpT3MfDxmhZFb4W047GvytCf1DHQ1D69W3zHI4yWe2aTZAA0JnbMZ7Xc8DuQ==} + + '@asamuzakjp/dom-selector@6.7.6': + resolution: {integrity: sha512-hBaJER6A9MpdG3WgdlOolHmbOYvSk46y7IQN/1+iqiCuUu6iWdQrs9DGKF8ocqsEqWujWf/V7b7vaDgiUmIvUg==} + + '@asamuzakjp/nwsapi@2.3.9': + resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -521,12 +530,34 @@ packages: '@csstools/css-parser-algorithms': ^3.0.5 '@csstools/css-tokenizer': ^3.0.4 + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-parser-algorithms@3.0.5': resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} engines: {node: '>=18'} peerDependencies: '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-syntax-patches-for-csstree@1.0.25': + resolution: {integrity: sha512-g0Kw9W3vjx5BEBAF8c5Fm2NcB/Fs8jJXh85aXqwEXiL+tqtOut07TWgyaGzAAfTM+gKckrrncyeGEZPcaRgm2Q==} + engines: {node: '>=18'} + '@csstools/css-tokenizer@3.0.4': resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} @@ -747,6 +778,15 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@exodus/bytes@1.9.0': + resolution: {integrity: sha512-lagqsvnk09NKogQaN/XrtlWeUF8SRhT12odMvbTIIaVObqzwAogL6jhR4DAp0gPuKoM1AOVrKUshJpRdpMFrww==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@noble/hashes': ^1.8.0 || ^2.0.0 + peerDependenciesMeta: + '@noble/hashes': + optional: true + '@fastify/busboy@2.1.1': resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} @@ -766,12 +806,6 @@ packages: '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} - '@hono/node-server@1.19.7': - resolution: {integrity: sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw==} - engines: {node: '>=18.14.1'} - peerDependencies: - hono: ^4 - '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -914,28 +948,12 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@mcp-ui/server@5.16.3': - resolution: {integrity: sha512-MZttML9tQC1B8f4SPgoT1BORfCDXqs4Ywb/mQ0wSwIYS9AuIWFLj1KXmvqC/zrG0SlNMlyvMSxEX/eVYsIoZaA==} - '@mdx-js/react@3.1.1': resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==} peerDependencies: '@types/react': '>=16' react: '>=16' - '@modelcontextprotocol/ext-apps@0.2.2': - resolution: {integrity: sha512-h8sN3QIBLqMsRXjKL76M5VmBQf3N0I1G1DiDiSYAgtdynYQctHqCs79WEo1d5wClyZVYBWXdRcxgiR/WBfSOqw==} - peerDependencies: - '@modelcontextprotocol/sdk': ^1.24.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - zod: ^3.25.0 || ^4.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - '@modelcontextprotocol/inspector-cli@0.17.2': resolution: {integrity: sha512-xXaqZYWJz77xvmfAVlYbvz2/xw9OaalFHq0n5A8PlmZvmhi6akQocIE7ZYaoEBpLbWRSwIZWfsidnfoKb6dO2A==} hasBin: true @@ -962,16 +980,6 @@ packages: '@cfworker/json-schema': optional: true - '@modelcontextprotocol/sdk@1.25.2': - resolution: {integrity: sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww==} - engines: {node: '>=18'} - peerDependencies: - '@cfworker/json-schema': ^4.1.1 - zod: ^3.25 || ^4.0 - peerDependenciesMeta: - '@cfworker/json-schema': - optional: true - '@napi-rs/wasm-runtime@1.0.7': resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} @@ -1043,61 +1051,6 @@ packages: '@octokit/types@13.10.0': resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} - '@oven/bun-darwin-aarch64@1.3.5': - resolution: {integrity: sha512-8GvNtMo0NINM7Emk9cNAviCG3teEgr3BUX9be0+GD029zIagx2Sf54jMui1Eu1IpFm7nWHODuLEefGOQNaJ0gQ==} - cpu: [arm64] - os: [darwin] - - '@oven/bun-darwin-x64-baseline@1.3.5': - resolution: {integrity: sha512-p5q3rJk48qhLuLBOFehVc+kqCE03YrswTc6NCxbwsxiwfySXwcAvpF2KWKF/ZZObvvR8hCCvqe1F81b2p5r2dg==} - cpu: [x64] - os: [darwin] - - '@oven/bun-darwin-x64@1.3.5': - resolution: {integrity: sha512-r33eHQOHAwkuiBJIwmkXIyqONQOQMnd1GMTpDzaxx9vf9+svby80LZO9Hcm1ns6KT/TBRFyODC/0loA7FAaffg==} - cpu: [x64] - os: [darwin] - - '@oven/bun-linux-aarch64-musl@1.3.5': - resolution: {integrity: sha512-HKBeUlJdNduRkzJKZ5DXM+pPqntfC50/Hu2X65jVX0Y7hu/6IC8RaUTqpr8FtCZqqmc9wDK0OTL+Mbi9UQIKYQ==} - cpu: [arm64] - os: [linux] - - '@oven/bun-linux-aarch64@1.3.5': - resolution: {integrity: sha512-zkcHPI23QxJ1TdqafhgkXt1NOEN8o5C460sVeNnrhfJ43LwZgtfcvcQE39x/pBedu67fatY8CU0iY00nOh46ZQ==} - cpu: [arm64] - os: [linux] - - '@oven/bun-linux-x64-baseline@1.3.5': - resolution: {integrity: sha512-FeCQyBU62DMuB0nn01vPnf3McXrKOsrK9p7sHaBFYycw0mmoU8kCq/WkBkGMnLuvQljJSyen8QBTx+fXdNupWg==} - cpu: [x64] - os: [linux] - - '@oven/bun-linux-x64-musl-baseline@1.3.5': - resolution: {integrity: sha512-TJiYC7KCr0XxFTsxgwQOeE7dncrEL/RSyL0EzSL3xRkrxJMWBCvCSjQn7LV1i6T7hFst0+3KoN3VWvD5BinqHA==} - cpu: [x64] - os: [linux] - - '@oven/bun-linux-x64-musl@1.3.5': - resolution: {integrity: sha512-XkCCHkByYn8BIDvoxnny898znju4xnW2kvFE8FT5+0Y62cWdcBGMZ9RdsEUTeRz16k8hHtJpaSfLcEmNTFIwRQ==} - cpu: [x64] - os: [linux] - - '@oven/bun-linux-x64@1.3.5': - resolution: {integrity: sha512-n7zhKTSDZS0yOYg5Rq8easZu5Y/o47sv0c7yGr2ciFdcie9uYV55fZ7QMqhWMGK33ezCSikh5EDkUMCIvfWpjA==} - cpu: [x64] - os: [linux] - - '@oven/bun-windows-x64-baseline@1.3.5': - resolution: {integrity: sha512-rtVQB9/1XK8FWJgFtsOthbPifRMYypgJwxu+pK3NHx8WvFKmq7HcPDqNr8xLzGULjQEO7eAo2aOZfONOwYz+5g==} - cpu: [x64] - os: [win32] - - '@oven/bun-windows-x64@1.3.5': - resolution: {integrity: sha512-T3xkODItb/0ftQPFsZDc7EAX2D6A4TEazQ2YZyofZToO8Q7y8YT8ooWdhd0BQiTCd66uEvgE1DCZetynwg2IoA==} - cpu: [x64] - os: [win32] - '@oxc-project/runtime@0.97.0': resolution: {integrity: sha512-yH0zw7z+jEws4dZ4IUKoix5Lh3yhqIJWF9Dc8PWvhpo7U7O+lJrv7ZZL4BeRO0la8LBQFwcCewtLBnVV7hPe/w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1996,21 +1949,11 @@ packages: cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-arm64@4.55.1': - resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==} - cpu: [arm64] - os: [darwin] - '@rollup/rollup-darwin-x64@4.52.5': resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} cpu: [x64] os: [darwin] - '@rollup/rollup-darwin-x64@4.55.1': - resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==} - cpu: [x64] - os: [darwin] - '@rollup/rollup-freebsd-arm64@4.52.5': resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} cpu: [arm64] @@ -2036,11 +1979,6 @@ packages: cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.55.1': - resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-musl@4.52.5': resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} cpu: [arm64] @@ -2076,11 +2014,6 @@ packages: cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.55.1': - resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-musl@4.52.5': resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} cpu: [x64] @@ -2111,11 +2044,6 @@ packages: cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.55.1': - resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==} - cpu: [x64] - os: [win32] - '@rsuite/icon-font@4.1.0': resolution: {integrity: sha512-q0Y+uQCVvzhD6lFeAFrvCDd1lTjZfM6MIaBjre3lSW1w586VWbuFnhTiqos3v9HIMlUpm3aAsxd3SuM6gYaqqQ==} @@ -2587,6 +2515,10 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + ai-tokenizer@1.0.6: resolution: {integrity: sha512-GaakQFxen0pRH/HIA4v68ZM40llCH27HUYUSBLK+gVuZ57e53pYJe1xFvSTj4sJJjbWU92m1X6NjPWyeWkFDow==} peerDependencies: @@ -2707,6 +2639,9 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + birpc@2.8.0: resolution: {integrity: sha512-Bz2a4qD/5GRhiHSwj30c/8kC8QGj12nNDwz3D4ErQ4Xhy35dsSDvF+RA/tWpjyU0pdGtSDiEk6B5fBGE1qNVhw==} @@ -2978,6 +2913,10 @@ packages: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + cssstyle@5.3.7: + resolution: {integrity: sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==} + engines: {node: '>=20'} + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -2992,6 +2931,10 @@ packages: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} + data-urls@6.0.1: + resolution: {integrity: sha512-euIQENZg6x8mj3fO6o9+fOW8MimUI4PpD/fZBhJfeioZVy9TUpM4UY7KjQNVZFlqwJ0UdzRDzkycB997HEq1BQ==} + engines: {node: '>=20'} + dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} @@ -3008,6 +2951,9 @@ packages: supports-color: optional: true + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} @@ -3142,6 +3088,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + envinfo@7.20.0: resolution: {integrity: sha512-+zUomDcLXsVkQ37vUqWBvQwLaLlj8eZPSi61llaEFAVBY5mhcXdaSw1pSJVl4yTYD5g/gEfpNl28YYk4IPvrrg==} engines: {node: '>=4'} @@ -3474,13 +3424,13 @@ packages: highlightjs-vue@1.0.0: resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} - hono@4.11.3: - resolution: {integrity: sha512-PmQi306+M/ct/m5s66Hrg+adPnkD5jiO6IjA7WhWw0gSBSo1EcRegwuI1deZ+wd5pzCGynCcn2DprnE4/yEV4w==} - engines: {node: '>=16.9.0'} - hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + html-encoding-sniffer@6.0.0: + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -3488,6 +3438,14 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + human-id@4.1.2: resolution: {integrity: sha512-v/J+4Z/1eIJovEBdlV5TYj1IR+ZiohcYGRY+qN/oC9dAfKzVT023N/Bgw37hrKCoVRBvk3bqyzpr2PP5YeTMSg==} hasBin: true @@ -3570,6 +3528,9 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} @@ -3623,9 +3584,6 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true - jose@6.1.3: - resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3640,6 +3598,15 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true + jsdom@27.4.0: + resolution: {integrity: sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -3660,9 +3627,6 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-schema-typed@8.0.2: - resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} - json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -3998,6 +3962,9 @@ packages: resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} engines: {node: '>= 0.10'} + parse5@8.0.0: + resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -4576,6 +4543,10 @@ packages: sax@1.4.3: resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==} + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} @@ -4787,6 +4758,9 @@ packages: engines: {node: '>=16'} hasBin: true + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tailwind-merge@2.6.0: resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} @@ -4848,6 +4822,13 @@ packages: resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} + tldts-core@7.0.19: + resolution: {integrity: sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==} + + tldts@7.0.19: + resolution: {integrity: sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==} + hasBin: true + tmcp@1.18.1: resolution: {integrity: sha512-P7MR8zKO447R317sm1rQES4JBkhibJS+W1YIz8neysO+rGr3oHSN1FO0vWgq/EtNz7EU57iutCZaBRBuiBbPvA==} @@ -4863,9 +4844,17 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} + tough-cookie@6.0.0: + resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + engines: {node: '>=16'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} + tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -5179,6 +5168,10 @@ packages: jsdom: optional: true + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + watchpack@2.4.4: resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} engines: {node: '>=10.13.0'} @@ -5190,6 +5183,10 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@8.0.1: + resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} + engines: {node: '>=20'} + webpack-sources@3.3.3: resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} engines: {node: '>=10.13.0'} @@ -5207,6 +5204,18 @@ packages: webpack-cli: optional: true + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-mimetype@5.0.0: + resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} + engines: {node: '>=20'} + + whatwg-url@15.1.0: + resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} + engines: {node: '>=20'} + whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -5251,6 +5260,13 @@ packages: resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} engines: {node: '>=18'} + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -5283,16 +5299,14 @@ packages: peerDependencies: zod: ^3.24.1 - zod-to-json-schema@3.25.1: - resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} - peerDependencies: - zod: ^3.25 || ^4 - zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} snapshots: + '@acemir/cssom@0.9.31': + optional: true + '@actions/core@1.11.1': dependencies: '@actions/exec': 1.1.1 @@ -5332,6 +5346,27 @@ snapshots: '@img/sharp-linux-x64': 0.33.5 '@img/sharp-win32-x64': 0.33.5 + '@asamuzakjp/css-color@4.1.1': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 11.2.4 + optional: true + + '@asamuzakjp/dom-selector@6.7.6': + dependencies: + '@asamuzakjp/nwsapi': 2.3.9 + bidi-js: 1.0.3 + css-tree: 3.1.0 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.2.4 + optional: true + + '@asamuzakjp/nwsapi@2.3.9': + optional: true + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -5646,10 +5681,30 @@ snapshots: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 + '@csstools/color-helpers@5.1.0': + optional: true + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + optional: true + + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + optional: true + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': dependencies: '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-syntax-patches-for-csstree@1.0.25': + optional: true + '@csstools/css-tokenizer@3.0.4': {} '@csstools/media-query-list-parser@4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': @@ -5801,6 +5856,9 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 + '@exodus/bytes@1.9.0': + optional: true + '@fastify/busboy@2.1.1': {} '@floating-ui/core@1.7.3': @@ -5826,10 +5884,6 @@ snapshots: '@floating-ui/utils@0.2.10': {} - '@hono/node-server@1.19.7(hono@4.11.3)': - dependencies: - hono: 4.11.3 - '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.7': @@ -5969,49 +6023,12 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@mcp-ui/server@5.16.3(hono@4.11.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(zod@3.25.76)': - dependencies: - '@modelcontextprotocol/ext-apps': 0.2.2(@modelcontextprotocol/sdk@1.25.2(hono@4.11.3)(zod@3.25.76))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(zod@3.25.76) - '@modelcontextprotocol/sdk': 1.25.2(hono@4.11.3)(zod@3.25.76) - transitivePeerDependencies: - - '@cfworker/json-schema' - - hono - - react - - react-dom - - supports-color - - zod - '@mdx-js/react@3.1.1(@types/react@18.3.26)(react@19.2.0)': dependencies: '@types/mdx': 2.0.13 '@types/react': 18.3.26 react: 19.2.0 - '@modelcontextprotocol/ext-apps@0.2.2(@modelcontextprotocol/sdk@1.25.2(hono@4.11.3)(zod@3.25.76))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(zod@3.25.76)': - dependencies: - '@modelcontextprotocol/sdk': 1.25.2(hono@4.11.3)(zod@3.25.76) - prettier: 3.6.2 - zod: 3.25.76 - optionalDependencies: - '@oven/bun-darwin-aarch64': 1.3.5 - '@oven/bun-darwin-x64': 1.3.5 - '@oven/bun-darwin-x64-baseline': 1.3.5 - '@oven/bun-linux-aarch64': 1.3.5 - '@oven/bun-linux-aarch64-musl': 1.3.5 - '@oven/bun-linux-x64': 1.3.5 - '@oven/bun-linux-x64-baseline': 1.3.5 - '@oven/bun-linux-x64-musl': 1.3.5 - '@oven/bun-linux-x64-musl-baseline': 1.3.5 - '@oven/bun-windows-x64': 1.3.5 - '@oven/bun-windows-x64-baseline': 1.3.5 - '@rollup/rollup-darwin-arm64': 4.55.1 - '@rollup/rollup-darwin-x64': 4.55.1 - '@rollup/rollup-linux-arm64-gnu': 4.55.1 - '@rollup/rollup-linux-x64-gnu': 4.55.1 - '@rollup/rollup-win32-x64-msvc': 4.55.1 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - '@modelcontextprotocol/inspector-cli@0.17.2': dependencies: '@modelcontextprotocol/sdk': 1.22.0 @@ -6112,28 +6129,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@modelcontextprotocol/sdk@1.25.2(hono@4.11.3)(zod@3.25.76)': - dependencies: - '@hono/node-server': 1.19.7(hono@4.11.3) - ajv: 8.17.1 - ajv-formats: 3.0.1(ajv@8.17.1) - content-type: 1.0.5 - cors: 2.8.5 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - eventsource-parser: 3.0.6 - express: 5.1.0 - express-rate-limit: 7.5.1(express@5.1.0) - jose: 6.1.3 - json-schema-typed: 8.0.2 - pkce-challenge: 5.0.0 - raw-body: 3.0.1 - zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) - transitivePeerDependencies: - - hono - - supports-color - '@napi-rs/wasm-runtime@1.0.7': dependencies: '@emnapi/core': 1.6.0 @@ -6225,39 +6220,6 @@ snapshots: dependencies: '@octokit/openapi-types': 24.2.0 - '@oven/bun-darwin-aarch64@1.3.5': - optional: true - - '@oven/bun-darwin-x64-baseline@1.3.5': - optional: true - - '@oven/bun-darwin-x64@1.3.5': - optional: true - - '@oven/bun-linux-aarch64-musl@1.3.5': - optional: true - - '@oven/bun-linux-aarch64@1.3.5': - optional: true - - '@oven/bun-linux-x64-baseline@1.3.5': - optional: true - - '@oven/bun-linux-x64-musl-baseline@1.3.5': - optional: true - - '@oven/bun-linux-x64-musl@1.3.5': - optional: true - - '@oven/bun-linux-x64@1.3.5': - optional: true - - '@oven/bun-windows-x64-baseline@1.3.5': - optional: true - - '@oven/bun-windows-x64@1.3.5': - optional: true - '@oxc-project/runtime@0.97.0': {} '@oxc-project/types@0.97.0': {} @@ -7511,15 +7473,9 @@ snapshots: '@rollup/rollup-darwin-arm64@4.52.5': optional: true - '@rollup/rollup-darwin-arm64@4.55.1': - optional: true - '@rollup/rollup-darwin-x64@4.52.5': optional: true - '@rollup/rollup-darwin-x64@4.55.1': - optional: true - '@rollup/rollup-freebsd-arm64@4.52.5': optional: true @@ -7535,9 +7491,6 @@ snapshots: '@rollup/rollup-linux-arm64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-arm64-gnu@4.55.1': - optional: true - '@rollup/rollup-linux-arm64-musl@4.52.5': optional: true @@ -7559,9 +7512,6 @@ snapshots: '@rollup/rollup-linux-x64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-x64-gnu@4.55.1': - optional: true - '@rollup/rollup-linux-x64-musl@4.52.5': optional: true @@ -7580,9 +7530,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.52.5': optional: true - '@rollup/rollup-win32-x64-msvc@4.55.1': - optional: true - '@rsuite/icon-font@4.1.0': {} '@rsuite/icons@1.4.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': @@ -8014,7 +7961,7 @@ snapshots: '@vitest/mocker': 4.0.6(vite@7.2.2(@types/node@20.19.0)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0)) playwright: 1.56.1 tinyrainbow: 3.0.3 - vitest: 4.0.6(@types/node@20.19.0)(@vitest/browser-playwright@4.0.6)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0) + vitest: 4.0.6(@types/node@20.19.0)(@vitest/browser-playwright@4.0.6)(jiti@2.6.1)(jsdom@27.4.0)(less@4.4.2)(terser@5.44.0) transitivePeerDependencies: - bufferutil - msw @@ -8031,7 +7978,7 @@ snapshots: pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.0.3 - vitest: 4.0.6(@types/node@20.19.0)(@vitest/browser-playwright@4.0.6)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0) + vitest: 4.0.6(@types/node@20.19.0)(@vitest/browser-playwright@4.0.6)(jiti@2.6.1)(jsdom@27.4.0)(less@4.4.2)(terser@5.44.0) ws: 8.18.3 transitivePeerDependencies: - bufferutil @@ -8053,7 +8000,7 @@ snapshots: magicast: 0.3.5 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.6(@types/node@20.19.0)(@vitest/browser-playwright@4.0.6)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0) + vitest: 4.0.6(@types/node@20.19.0)(@vitest/browser-playwright@4.0.6)(jiti@2.6.1)(jsdom@27.4.0)(less@4.4.2)(terser@5.44.0) optionalDependencies: '@vitest/browser': 4.0.6(vite@7.2.2(@types/node@20.19.0)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(vitest@4.0.6) transitivePeerDependencies: @@ -8245,6 +8192,9 @@ snapshots: acorn@8.15.0: {} + agent-base@7.1.4: + optional: true + ai-tokenizer@1.0.6: {} ajv-formats@2.1.1(ajv@8.17.1): @@ -8341,6 +8291,11 @@ snapshots: dependencies: is-windows: 1.0.2 + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + optional: true + birpc@2.8.0: {} body-parser@2.2.0: @@ -8622,6 +8577,14 @@ snapshots: dependencies: css-tree: 2.2.1 + cssstyle@5.3.7: + dependencies: + '@asamuzakjp/css-color': 4.1.1 + '@csstools/css-syntax-patches-for-csstree': 1.0.25 + css-tree: 3.1.0 + lru-cache: 11.2.4 + optional: true + csstype@3.1.3: {} csstype@3.2.3: {} @@ -8630,6 +8593,12 @@ snapshots: data-uri-to-buffer@4.0.1: {} + data-urls@6.0.1: + dependencies: + whatwg-mimetype: 5.0.0 + whatwg-url: 15.1.0 + optional: true + dataloader@1.4.0: {} date-fns@2.30.0: @@ -8640,6 +8609,9 @@ snapshots: dependencies: ms: 2.1.3 + decimal.js@10.6.0: + optional: true + decode-named-character-reference@1.2.0: dependencies: character-entities: 2.0.2 @@ -8744,6 +8716,9 @@ snapshots: entities@4.5.0: {} + entities@6.0.1: + optional: true + envinfo@7.20.0: {} errno@0.1.8: @@ -9133,10 +9108,15 @@ snapshots: highlightjs-vue@1.0.0: {} - hono@4.11.3: {} - hookable@5.5.3: {} + html-encoding-sniffer@6.0.0: + dependencies: + '@exodus/bytes': 1.9.0 + transitivePeerDependencies: + - '@noble/hashes' + optional: true + html-escaper@2.0.2: {} http-errors@2.0.0: @@ -9147,6 +9127,22 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + optional: true + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + optional: true + human-id@4.1.2: {} iconv-lite@0.6.3: @@ -9206,6 +9202,9 @@ snapshots: is-number@7.0.0: {} + is-potential-custom-element-name@1.0.1: + optional: true + is-promise@4.0.0: {} is-subdir@1.2.0: @@ -9260,8 +9259,6 @@ snapshots: jiti@2.6.1: optional: true - jose@6.1.3: {} - js-tokens@4.0.0: {} js-tokens@9.0.1: {} @@ -9275,6 +9272,35 @@ snapshots: dependencies: argparse: 2.0.1 + jsdom@27.4.0: + dependencies: + '@acemir/cssom': 0.9.31 + '@asamuzakjp/dom-selector': 6.7.6 + '@exodus/bytes': 1.9.0 + cssstyle: 5.3.7 + data-urls: 6.0.1 + decimal.js: 10.6.0 + html-encoding-sniffer: 6.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + parse5: 8.0.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 6.0.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 15.1.0 + ws: 8.18.3 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - '@noble/hashes' + - bufferutil + - supports-color + - utf-8-validate + optional: true + jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -9288,8 +9314,6 @@ snapshots: json-schema-traverse@1.0.0: {} - json-schema-typed@8.0.2: {} - json-stable-stringify-without-jsonify@1.0.1: {} json5@2.2.3: {} @@ -9608,6 +9632,11 @@ snapshots: parse-node-version@1.0.1: optional: true + parse5@8.0.0: + dependencies: + entities: 6.0.1 + optional: true + parseurl@1.3.3: {} path-exists@4.0.0: {} @@ -10308,6 +10337,11 @@ snapshots: sax@1.4.3: {} + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + optional: true + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 @@ -10574,6 +10608,9 @@ snapshots: picocolors: 1.1.1 sax: 1.4.3 + symbol-tree@3.2.4: + optional: true + tailwind-merge@2.6.0: {} tapable@2.3.0: @@ -10621,6 +10658,14 @@ snapshots: tinyspy@4.0.4: {} + tldts-core@7.0.19: + optional: true + + tldts@7.0.19: + dependencies: + tldts-core: 7.0.19 + optional: true + tmcp@1.18.1(typescript@5.9.3): dependencies: '@standard-schema/spec': 1.0.0 @@ -10640,8 +10685,18 @@ snapshots: totalist@3.0.1: optional: true + tough-cookie@6.0.0: + dependencies: + tldts: 7.0.19 + optional: true + tr46@0.0.3: {} + tr46@6.0.0: + dependencies: + punycode: 2.3.1 + optional: true + tree-kill@1.2.2: {} ts-dedent@2.2.0: {} @@ -10894,7 +10949,7 @@ snapshots: less: 4.4.2 terser: 5.44.0 - vitest@4.0.6(@types/node@20.19.0)(@vitest/browser-playwright@4.0.6)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0): + vitest@4.0.6(@types/node@20.19.0)(@vitest/browser-playwright@4.0.6)(jiti@2.6.1)(jsdom@27.4.0)(less@4.4.2)(terser@5.44.0): dependencies: '@vitest/expect': 4.0.6 '@vitest/mocker': 4.0.6(vite@7.2.2(@types/node@20.19.0)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0)) @@ -10919,6 +10974,7 @@ snapshots: optionalDependencies: '@types/node': 20.19.0 '@vitest/browser-playwright': 4.0.6(playwright@1.56.1)(vite@7.2.2(@types/node@20.19.0)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(vitest@4.0.6) + jsdom: 27.4.0 transitivePeerDependencies: - jiti - less @@ -10933,6 +10989,11 @@ snapshots: - tsx - yaml + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + optional: true + watchpack@2.4.4: dependencies: glob-to-regexp: 0.4.1 @@ -10943,6 +11004,9 @@ snapshots: webidl-conversions@3.0.1: {} + webidl-conversions@8.0.1: + optional: true + webpack-sources@3.3.3: optional: true @@ -10981,6 +11045,18 @@ snapshots: - uglify-js optional: true + whatwg-mimetype@4.0.0: + optional: true + + whatwg-mimetype@5.0.0: + optional: true + + whatwg-url@15.1.0: + dependencies: + tr46: 6.0.0 + webidl-conversions: 8.0.1 + optional: true + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -11017,6 +11093,12 @@ snapshots: dependencies: is-wsl: 3.1.0 + xml-name-validator@5.0.0: + optional: true + + xmlchars@2.2.0: + optional: true + y18n@5.0.8: {} yallist@3.1.1: {} @@ -11045,8 +11127,4 @@ snapshots: dependencies: zod: 3.25.76 - zod-to-json-schema@3.25.1(zod@3.25.76): - dependencies: - zod: 3.25.76 - zod@3.25.76: {} From 80e21850f653b7aa4d5a94eccdfb73e3a56141f2 Mon Sep 17 00:00:00 2001 From: Jeppe Reinhold Date: Thu, 22 Jan 2026 14:52:01 +0100 Subject: [PATCH 06/17] update storybook dependencies --- pnpm-lock.yaml | 158 ++++++++++++++++++++++---------------------- pnpm-workspace.yaml | 24 +++---- 2 files changed, 91 insertions(+), 91 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c7c76831..70d451d8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,14 +7,14 @@ settings: catalogs: default: '@storybook/addon-a11y': - specifier: 10.2.0-alpha.14 - version: 10.2.0-alpha.14 + specifier: 10.3.0-alpha.0 + version: 10.3.0-alpha.0 '@storybook/addon-docs': - specifier: 10.2.0-alpha.14 - version: 10.2.0-alpha.14 + specifier: 10.3.0-alpha.0 + version: 10.3.0-alpha.0 '@storybook/react-vite': - specifier: 10.2.0-alpha.14 - version: 10.2.0-alpha.14 + specifier: 10.3.0-alpha.0 + version: 10.3.0-alpha.0 '@tmcp/adapter-valibot': specifier: ^0.1.4 version: 0.1.4 @@ -25,8 +25,8 @@ catalogs: specifier: ^0.4.1 version: 0.4.1 storybook: - specifier: 10.2.0-alpha.14 - version: 10.2.0-alpha.14 + specifier: 10.3.0-alpha.0 + version: 10.3.0-alpha.0 tmcp: specifier: ^1.16.0 version: 1.18.1 @@ -106,13 +106,13 @@ importers: devDependencies: '@storybook/addon-docs': specifier: 'catalog:' - version: 10.2.0-alpha.14(@types/react@18.3.26)(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12)) + version: 10.3.0-alpha.0(@types/react@18.3.26)(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12)) '@storybook/addon-mcp': specifier: workspace:* version: link:../../packages/addon-mcp '@storybook/react-vite': specifier: 'catalog:' - version: 10.2.0-alpha.14(esbuild@0.25.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.52.5)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12)) + version: 10.3.0-alpha.0(esbuild@0.25.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.52.5)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12)) '@types/react': specifier: ^18.2.65 version: 18.3.26 @@ -130,7 +130,7 @@ importers: version: 18.3.1(react@18.3.1) storybook: specifier: 'catalog:' - version: 10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tinyexec: specifier: ^1.0.2 version: 1.0.2 @@ -163,13 +163,13 @@ importers: version: 1.1.11(@types/react-dom@19.2.3(@types/react@18.3.26))(@types/react@18.3.26)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@storybook/addon-a11y': specifier: 'catalog:' - version: 10.2.0-alpha.14(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) + version: 10.3.0-alpha.0(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) '@storybook/mcp': specifier: workspace:* version: link:../packages/mcp '@storybook/react-vite': specifier: 'catalog:' - version: 10.2.0-alpha.14(esbuild@0.25.12)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.52.5)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12)) + version: 10.3.0-alpha.0(esbuild@0.25.12)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.52.5)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12)) '@tsconfig/node-ts': specifier: ^23.6.1 version: 23.6.2 @@ -241,10 +241,10 @@ importers: version: 5.83.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) storybook: specifier: 'catalog:' - version: 10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) storybook-addon-test-codegen: specifier: ^3.0.0 - version: 3.0.0(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) + version: 3.0.0(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) tinyexec: specifier: ^1.0.1 version: 1.0.2 @@ -278,7 +278,7 @@ importers: devDependencies: storybook: specifier: 'catalog:' - version: 10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) packages/mcp: dependencies: @@ -2056,28 +2056,28 @@ packages: '@standard-schema/spec@1.0.0': resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} - '@storybook/addon-a11y@10.2.0-alpha.14': - resolution: {integrity: sha512-RdW2P3QLta8p4FGrQZWrcgdhuyA6PqoLVQ1Xr+hOOYDkO1Zhr1KgcoGDYtGYM0GMm//Z40dLkYkqYPWCs4g2pg==} + '@storybook/addon-a11y@10.3.0-alpha.0': + resolution: {integrity: sha512-8wWV0y2XSuJLlYBlaJc3X0wO4MpkoTcnZzPElgI8vvq55o3ip019ChyQ7YDZuCxyg/uGJQEOInDkIprkGl9YFw==} peerDependencies: - storybook: ^10.2.0-alpha.14 + storybook: ^10.3.0-alpha.0 - '@storybook/addon-docs@10.2.0-alpha.14': - resolution: {integrity: sha512-4kQUfHk2uxrEfLVYyE5N7f94K33iWqIRUfxRd+NhT+SUwJkVHPQ8BqQ29Z9qwJ7RO6otAH2RwZO/BmZBqTgECA==} + '@storybook/addon-docs@10.3.0-alpha.0': + resolution: {integrity: sha512-vjZ7Zh1ve7PBhF9Rk8xEOQD2AGrnWW1oHpVnXcX+KMdFEuivlxwJFF6K07Skoh1fRrBGHN1D5/4SOTYNFs+Wlg==} peerDependencies: - storybook: ^10.2.0-alpha.14 + storybook: ^10.3.0-alpha.0 - '@storybook/builder-vite@10.2.0-alpha.14': - resolution: {integrity: sha512-PZQ0oSVSfKaGe+h48MSGoH3wmcYRPbcmuX8G7GLORViW+x7gILLr0e3D5MF5C9rc4BHpfxikaXa3Gq5krUYeKQ==} + '@storybook/builder-vite@10.3.0-alpha.0': + resolution: {integrity: sha512-3dI0Z+2/1/wTrbWmp4DMH30qJ8yFo4OWq5gwUm/dUCOwHKmQKMUgr7i26OLuG6itQIhrsHfhOlnsb5FDBSXgLg==} peerDependencies: - storybook: ^10.2.0-alpha.14 + storybook: ^10.3.0-alpha.0 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - '@storybook/csf-plugin@10.2.0-alpha.14': - resolution: {integrity: sha512-uACCM01OIzeBPOFeNDygxjIqLTlYDQHpzVvMveRz8kcHrP+1jOi6Cq5efMXMmmtb2ltwhr39bblkqLcZCz0lkg==} + '@storybook/csf-plugin@10.3.0-alpha.0': + resolution: {integrity: sha512-o+hvAcvl3iHIem5tbSwgTKKiduu17TST/IHejSfka9NJ6c5EKsCSngDSLafoSlg573h2TsSJLKgeE8w/yLnWfg==} peerDependencies: esbuild: '*' rollup: '*' - storybook: ^10.2.0-alpha.14 + storybook: ^10.3.0-alpha.0 vite: '*' webpack: '*' peerDependenciesMeta: @@ -2099,27 +2099,27 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@storybook/react-dom-shim@10.2.0-alpha.14': - resolution: {integrity: sha512-QXIfC1XF1wRV2Y3/K7+yhqNUiWkStixk08SNOQ83RUI8ULzKb4GltRHyvt16gjQHHp+8LB5duV6PY8GI/3Il2g==} + '@storybook/react-dom-shim@10.3.0-alpha.0': + resolution: {integrity: sha512-Dfu1Z3FcvdF2mm6uGUjd5Rk7MFRrGkTrUT0Wxt2EHbzjHE28bOu7Eb3eKvXAtrDwuRCiC2IVbdxx2qu1Q/kjqA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.2.0-alpha.14 + storybook: ^10.3.0-alpha.0 - '@storybook/react-vite@10.2.0-alpha.14': - resolution: {integrity: sha512-mrT0kUObQwc4G73f8FKEXdvPT1cZ/iORW8S7KrIyeV83u0FcMPxHcZcYGLIfdvpOgLNRBK6pCSadIKLV5pOD6w==} + '@storybook/react-vite@10.3.0-alpha.0': + resolution: {integrity: sha512-/A8asJLWMQEbeuC5Ux0CRTpDOWLppNNhf1kpM9ZpZv2ZfblDL+dJNEkS9TrsMhGqBc5mpBq7MZF9R83yTg47vA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.2.0-alpha.14 + storybook: ^10.3.0-alpha.0 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - '@storybook/react@10.2.0-alpha.14': - resolution: {integrity: sha512-IsBgaa+3Erluy5asRTwxZcMeSfo9x8TVuixUXd3LTOpdbi5rjgF7MrEDyNe8oDnxH4vEiQnX59QzMaMZ7CDZmw==} + '@storybook/react@10.3.0-alpha.0': + resolution: {integrity: sha512-g2mKx+n2UBQNWnjRjesQ8WrBu8PVIfOgv8fvQOJkiIgOrAZeDOcriMSdmJBnGLLdYXf92TfD7Ose78IodOTW8Q==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.2.0-alpha.14 + storybook: ^10.3.0-alpha.0 typescript: '>= 4.9.x' peerDependenciesMeta: typescript: @@ -4690,8 +4690,8 @@ packages: peerDependencies: storybook: ^10.0.0 - storybook@10.2.0-alpha.14: - resolution: {integrity: sha512-ZyGO3qVK1ARL08nyVSpb88k8KGIJTJ62nsVNdUCTeyDct/0G7OXFS3F/Ogk5o0EAAS3iymVBKnX/76v/PH3keA==} + storybook@10.3.0-alpha.0: + resolution: {integrity: sha512-I91sdhrGosg7dEkr+oxubV4o5N5ytJd9Q3HhDtWPvzFuBlhoBzeizBQ6t1RnYwbVCQISorPoG8SKxSwMRTUF4w==} hasBin: true peerDependencies: prettier: ^2 || ^3 @@ -7541,21 +7541,21 @@ snapshots: '@standard-schema/spec@1.0.0': {} - '@storybook/addon-a11y@10.2.0-alpha.14(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))': + '@storybook/addon-a11y@10.3.0-alpha.0(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))': dependencies: '@storybook/global': 5.0.0 axe-core: 4.11.0 - storybook: 10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + storybook: 10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@storybook/addon-docs@10.2.0-alpha.14(@types/react@18.3.26)(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12))': + '@storybook/addon-docs@10.3.0-alpha.0(@types/react@18.3.26)(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12))': dependencies: '@mdx-js/react': 3.1.1(@types/react@18.3.26)(react@19.2.0) - '@storybook/csf-plugin': 10.2.0-alpha.14(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12)) + '@storybook/csf-plugin': 10.3.0-alpha.0(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12)) '@storybook/icons': 2.0.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@storybook/react-dom-shim': 10.2.0-alpha.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@storybook/react-dom-shim': 10.3.0-alpha.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - storybook: 10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + storybook: 10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' @@ -7564,11 +7564,11 @@ snapshots: - vite - webpack - '@storybook/builder-vite@10.2.0-alpha.14(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12))': + '@storybook/builder-vite@10.3.0-alpha.0(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12))': dependencies: - '@storybook/csf-plugin': 10.2.0-alpha.14(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12)) + '@storybook/csf-plugin': 10.3.0-alpha.0(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12)) '@vitest/mocker': 3.2.4(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0)) - storybook: 10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + storybook: 10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) ts-dedent: 2.2.0 vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0) transitivePeerDependencies: @@ -7577,11 +7577,11 @@ snapshots: - rollup - webpack - '@storybook/builder-vite@10.2.0-alpha.14(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12))': + '@storybook/builder-vite@10.3.0-alpha.0(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12))': dependencies: - '@storybook/csf-plugin': 10.2.0-alpha.14(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12)) + '@storybook/csf-plugin': 10.3.0-alpha.0(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12)) '@vitest/mocker': 3.2.4(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0)) - storybook: 10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + storybook: 10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) ts-dedent: 2.2.0 vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0) transitivePeerDependencies: @@ -7590,9 +7590,9 @@ snapshots: - rollup - webpack - '@storybook/csf-plugin@10.2.0-alpha.14(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12))': + '@storybook/csf-plugin@10.3.0-alpha.0(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12))': dependencies: - storybook: 10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + storybook: 10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) unplugin: 2.3.10 optionalDependencies: esbuild: 0.25.12 @@ -7600,9 +7600,9 @@ snapshots: vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0) webpack: 5.102.1(@swc/core@1.13.5)(esbuild@0.25.12) - '@storybook/csf-plugin@10.2.0-alpha.14(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12))': + '@storybook/csf-plugin@10.3.0-alpha.0(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12))': dependencies: - storybook: 10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + storybook: 10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) unplugin: 2.3.10 optionalDependencies: esbuild: 0.25.12 @@ -7622,37 +7622,37 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@storybook/react-dom-shim@10.2.0-alpha.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@storybook/react-dom-shim@10.3.0-alpha.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + storybook: 10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/react-dom-shim@10.2.0-alpha.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@storybook/react-dom-shim@10.3.0-alpha.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - storybook: 10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + storybook: 10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/react-dom-shim@10.2.0-alpha.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))': + '@storybook/react-dom-shim@10.3.0-alpha.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))': dependencies: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - storybook: 10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + storybook: 10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@storybook/react-vite@10.2.0-alpha.14(esbuild@0.25.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.52.5)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12))': + '@storybook/react-vite@10.3.0-alpha.0(esbuild@0.25.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.52.5)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12))': dependencies: '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.3(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0)) '@rollup/pluginutils': 5.3.0(rollup@4.52.5) - '@storybook/builder-vite': 10.2.0-alpha.14(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12)) - '@storybook/react': 10.2.0-alpha.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.9.3) + '@storybook/builder-vite': 10.3.0-alpha.0(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12)) + '@storybook/react': 10.3.0-alpha.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.9.3) empathic: 2.0.0 magic-string: 0.30.21 react: 18.3.1 react-docgen: 8.0.2 react-dom: 18.3.1(react@18.3.1) resolve: 1.22.11 - storybook: 10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + storybook: 10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tsconfig-paths: 4.2.0 vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0) transitivePeerDependencies: @@ -7663,19 +7663,19 @@ snapshots: - typescript - webpack - '@storybook/react-vite@10.2.0-alpha.14(esbuild@0.25.12)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.52.5)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12))': + '@storybook/react-vite@10.3.0-alpha.0(esbuild@0.25.12)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.52.5)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12))': dependencies: '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.3(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0)) '@rollup/pluginutils': 5.3.0(rollup@4.52.5) - '@storybook/builder-vite': 10.2.0-alpha.14(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12)) - '@storybook/react': 10.2.0-alpha.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3) + '@storybook/builder-vite': 10.3.0-alpha.0(esbuild@0.25.12)(rollup@4.52.5)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0))(webpack@5.102.1(@swc/core@1.13.5)(esbuild@0.25.12)) + '@storybook/react': 10.3.0-alpha.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3) empathic: 2.0.0 magic-string: 0.30.21 react: 19.2.0 react-docgen: 8.0.2 react-dom: 19.2.0(react@19.2.0) resolve: 1.22.11 - storybook: 10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + storybook: 10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) tsconfig-paths: 4.2.0 vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.0) transitivePeerDependencies: @@ -7686,27 +7686,27 @@ snapshots: - typescript - webpack - '@storybook/react@10.2.0-alpha.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.9.3)': + '@storybook/react@10.3.0-alpha.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.9.3)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 10.2.0-alpha.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + '@storybook/react-dom-shim': 10.3.0-alpha.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) react: 18.3.1 react-docgen: 8.0.2 react-dom: 18.3.1(react@18.3.1) - storybook: 10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + storybook: 10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@storybook/react@10.2.0-alpha.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3)': + '@storybook/react@10.3.0-alpha.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(typescript@5.9.3)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 10.2.0-alpha.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) + '@storybook/react-dom-shim': 10.3.0-alpha.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) react: 19.2.0 react-docgen: 8.0.2 react-dom: 19.2.0(react@19.2.0) - storybook: 10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + storybook: 10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -10500,11 +10500,11 @@ snapshots: std-env@3.10.0: {} - storybook-addon-test-codegen@3.0.0(storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)): + storybook-addon-test-codegen@3.0.0(storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)): dependencies: - storybook: 10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + storybook: 10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@storybook/global': 5.0.0 '@storybook/icons': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -10527,7 +10527,7 @@ snapshots: - react-dom - utf-8-validate - storybook@10.2.0-alpha.14(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + storybook@10.3.0-alpha.0(@testing-library/dom@10.4.1)(prettier@3.6.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@storybook/global': 5.0.0 '@storybook/icons': 2.0.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 5b3a1b09..e92d4d2b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -6,15 +6,15 @@ packages: - eval/evals/*/experiments/*/project catalog: - '@storybook/addon-a11y': 10.2.0-alpha.14 - '@storybook/addon-docs': 10.2.0-alpha.14 - '@storybook/addon-vitest': 10.2.0-alpha.14 - '@storybook/react-vite': 10.2.0-alpha.14 + '@storybook/addon-a11y': 10.3.0-alpha.0 + '@storybook/addon-docs': 10.3.0-alpha.0 + '@storybook/addon-vitest': 10.3.0-alpha.0 + '@storybook/react-vite': 10.3.0-alpha.0 '@tmcp/adapter-valibot': ^0.1.4 '@tmcp/transport-http': ^0.8.0 '@tmcp/transport-stdio': ^0.4.1 - eslint-plugin-storybook: 10.2.0-alpha.14 - storybook: 10.2.0-alpha.14 + eslint-plugin-storybook: 10.3.0-alpha.0 + storybook: 10.3.0-alpha.0 tmcp: ^1.16.0 tsdown: ^0.15.12 typescript: ^5.9.3 @@ -25,10 +25,10 @@ catalog: catalogs: experiments: '@eslint/js': 9.39.1 - '@storybook/addon-a11y': 10.2.0-alpha.14 - '@storybook/addon-docs': 10.2.0-alpha.14 - '@storybook/addon-vitest': 10.2.0-alpha.14 - '@storybook/react-vite': 10.2.0-alpha.14 + '@storybook/addon-a11y': 10.3.0-alpha.0 + '@storybook/addon-docs': 10.3.0-alpha.0 + '@storybook/addon-vitest': 10.3.0-alpha.0 + '@storybook/react-vite': 10.3.0-alpha.0 '@types/node': 24.10.1 '@types/react': 19.2.6 '@types/react-dom': 19.2.3 @@ -37,11 +37,11 @@ catalogs: eslint: 9.39.1 eslint-plugin-react-hooks: 7.0.1 eslint-plugin-react-refresh: 0.4.24 - eslint-plugin-storybook: 10.2.0-alpha.14 + eslint-plugin-storybook: 10.3.0-alpha.0 globals: 16.5.0 react: 19.2.0 react-dom: 19.2.0 - storybook: 10.2.0-alpha.14 + storybook: 10.3.0-alpha.0 typescript: 5.9.3 typescript-eslint: 8.47.0 vite: 7.2.2 From 30d0b4bbc65a223096400789a38b3fdba186ff99 Mon Sep 17 00:00:00 2001 From: Jeppe Reinhold Date: Thu, 22 Jan 2026 15:05:00 +0100 Subject: [PATCH 07/17] rename preview entry --- packages/addon-mcp/package.json | 2 +- packages/addon-mcp/src/preset.ts | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/addon-mcp/package.json b/packages/addon-mcp/package.json index bc1ad368..bc9a7c8f 100644 --- a/packages/addon-mcp/package.json +++ b/packages/addon-mcp/package.json @@ -16,7 +16,7 @@ "type": "module", "exports": { "./preset": "./dist/preset.js", - "./preview": "./dist/preview.js", + "./preview-annotation": "./dist/preview.js", "./internal/preview-stories-app-script": "./dist/preview-stories-app-script.js", "./package.json": "./package.json" }, diff --git a/packages/addon-mcp/src/preset.ts b/packages/addon-mcp/src/preset.ts index 9860b445..9e37f147 100644 --- a/packages/addon-mcp/src/preset.ts +++ b/packages/addon-mcp/src/preset.ts @@ -1,22 +1,23 @@ import { mcpServerHandler } from './mcp-handler.ts'; -import * as path from 'node:path'; -import type { PresetProperty } from 'storybook/internal/types'; +import type { PresetPropertyFn } from 'storybook/internal/types'; import { AddonOptions } from './types.ts'; import * as v from 'valibot'; import { getManifestStatus } from './tools/is-manifest-available.ts'; import htmlTemplate from './template.html'; import { fileURLToPath } from 'node:url'; -export const previewEntries: PresetProperty<'previewEntries'> = async ( - existingEntries = [], -) => { +export const previewAnnotations: PresetPropertyFn< + 'previewAnnotations' +> = async (existingAnnotations = []) => { return [ - ...existingEntries, - fileURLToPath(import.meta.resolve('@storybook/addon-mcp/preview')), + ...existingAnnotations, + fileURLToPath( + import.meta.resolve('@storybook/addon-mcp/preview-annotation'), + ), ]; }; -export const experimental_devServer: PresetProperty< +export const experimental_devServer: PresetPropertyFn< 'experimental_devServer' > = async (app, options) => { // There is no error handling here. This can make the whole storybook app crash with: From 64ed39caed0c3f1e79d127c3303b74e64a68ad02 Mon Sep 17 00:00:00 2001 From: Jeppe Reinhold Date: Thu, 22 Jan 2026 21:02:22 +0100 Subject: [PATCH 08/17] cleanup --- .github/instructions/addon-mcp.instructions.md | 4 ---- .../src/tools/preview-stories/preview-stories-app-script.ts | 3 ++- packages/addon-mcp/tsdown.config.ts | 6 +++--- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/instructions/addon-mcp.instructions.md b/.github/instructions/addon-mcp.instructions.md index 5d09fd7d..fb88a2f0 100644 --- a/.github/instructions/addon-mcp.instructions.md +++ b/.github/instructions/addon-mcp.instructions.md @@ -25,12 +25,8 @@ This is a Storybook addon that runs an MCP (Model Context Protocol) server withi The addon supports two toolsets that can be enabled/disabled: 1. **`dev`** (default: true) - <<<<<<< HEAD - `preview-stories`: Retrieve story preview URLs from Storybook - - # `get-ui-building-instructions`: Provide UI development guidelines - - `get-story-urls`: Retrieve story URLs from Storybook - `get-storybook-story-instructions`: Provide UI development guidelines - > > > > > > > e09477cfed1095fed760ff7da9cd040151a06e5c 2. **`docs`** (default: true) - `list-all-documentation`: List all available components from manifest diff --git a/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-script.ts b/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-script.ts index 72f37cd7..e02849a4 100644 --- a/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-script.ts +++ b/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-script.ts @@ -8,6 +8,7 @@ const LATEST_PROTOCOL_VERSION = '2025-11-21'; import { MCP_APP_SIZE_CHANGED_EVENT } from '../../constants.ts'; import { MCP_APP_PARAM } from '../../constants.ts'; import type { PreviewStoriesOutput } from '../preview-stories.ts'; +import pkg from '../../../package.json' with { type: 'json' }; interface McpUiHostStyles { variables?: Record; @@ -139,7 +140,7 @@ function onHostNotification( const initializeResult = (await sendHostRequest(METHODS.INITIALIZE, { appInfo: { name: 'storybook-story-preview', - version: '1.0.0', + version: pkg.version, }, appCapabilities: {}, protocolVersion: LATEST_PROTOCOL_VERSION, diff --git a/packages/addon-mcp/tsdown.config.ts b/packages/addon-mcp/tsdown.config.ts index bbbd7322..38efe4ac 100644 --- a/packages/addon-mcp/tsdown.config.ts +++ b/packages/addon-mcp/tsdown.config.ts @@ -10,15 +10,15 @@ const browserConfig = { export default defineConfig([ { ...sharedNodeConfig, - entry: ['src/preset.ts'], + entry: 'src/preset.ts', }, { ...browserConfig, entry: 'src/preview.ts', }, /* - this must be a separate config because it can't rely on code splitting at all - using a shared config would risk code being shared between entries + this must be a separate config because it can't rely on code splitting at all. + Using a shared config would risk code being shared between entries which would break the MCP App script */ { From 457b3497c9b30dbe465dc6f07f708c5ac77edc45 Mon Sep 17 00:00:00 2001 From: Jeppe Reinhold Date: Thu, 22 Jan 2026 21:05:48 +0100 Subject: [PATCH 09/17] add changeset --- .changeset/eighty-dryers-yawn.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/eighty-dryers-yawn.md diff --git a/.changeset/eighty-dryers-yawn.md b/.changeset/eighty-dryers-yawn.md new file mode 100644 index 00000000..3f557337 --- /dev/null +++ b/.changeset/eighty-dryers-yawn.md @@ -0,0 +1,5 @@ +--- +'@storybook/addon-mcp': patch +--- + +Add support for MCP App, rendering stories directly in the agent chat in MCP clients that supports it From 81faef5b0b97e665e0ca4dd9997a70f3b51fe160 Mon Sep 17 00:00:00 2001 From: Jeppe Reinhold Date: Thu, 22 Jan 2026 21:18:38 +0100 Subject: [PATCH 10/17] cleanup --- .github/instructions/addon-mcp.instructions.md | 9 +-------- packages/addon-mcp/src/preview.ts | 4 +--- packages/addon-mcp/src/tools/preview-stories.ts | 4 ++-- .../tools/preview-stories/preview-stories-app-script.ts | 8 +------- .../preview-stories/preview-stories-app-template.html | 3 +-- 5 files changed, 6 insertions(+), 22 deletions(-) diff --git a/.github/instructions/addon-mcp.instructions.md b/.github/instructions/addon-mcp.instructions.md index fb88a2f0..cbc77527 100644 --- a/.github/instructions/addon-mcp.instructions.md +++ b/.github/instructions/addon-mcp.instructions.md @@ -173,10 +173,7 @@ pnpm test:ci # Run tests with coverage and CI reporters - **Overall Target**: >70% statement coverage - **src/utils**: 100% coverage (errors.ts, fetch-story-index.ts) - <<<<<<< HEAD -- # **src/tools**: >90% coverage (preview-stories.ts, get-ui-building-instructions.ts) -- **src/tools**: >90% coverage (get-story-urls.ts, get-storybook-story-instructions.ts) - > > > > > > > e09477cfed1095fed760ff7da9cd040151a06e5c +- **src/tools**: >90% coverage (preview-stories.ts, get-storybook-story-instructions.ts) - **src**: Integration files (preset.ts, mcp-handler.ts, telemetry.ts) have partial coverage **Key Testing Patterns:** @@ -266,12 +263,8 @@ Tests run automatically on PRs and main branch pushes via `.github/workflows/che - `src/mcp-handler.ts` - Main MCP server handler factory using tmcp - `src/telemetry.ts` - Telemetry tracking for usage analytics - `src/types.ts` - Valibot schemas and AddonContext interface - <<<<<<< HEAD - `src/tools/preview-stories.ts` - Tool to preview stories from Storybook -- # `src/tools/get-ui-building-instructions.ts` - Tool to provide framework-specific UI instructions -- `src/tools/get-story-urls.ts` - Tool to fetch story URLs from index.json - `src/tools/get-storybook-story-instructions.ts` - Tool to provide framework-specific UI instructions - > > > > > > > e09477cfed1095fed760ff7da9cd040151a06e5c - `src/utils/errors.ts` - Error handling utilities - `src/utils/fetch-story-index.ts` - Utility to fetch Storybook's story index - `src/ui-building-instructions.md` - Template for UI development instructions diff --git a/packages/addon-mcp/src/preview.ts b/packages/addon-mcp/src/preview.ts index fd01de4e..63921d91 100644 --- a/packages/addon-mcp/src/preview.ts +++ b/packages/addon-mcp/src/preview.ts @@ -8,9 +8,7 @@ * which is set by the MCP Apps preview.html wrapper. */ -import { MCP_APP_SIZE_CHANGED_EVENT } from './constants'; -import { MCP_APP_PARAM } from './constants'; - +import { MCP_APP_PARAM, MCP_APP_SIZE_CHANGED_EVENT } from './constants'; // Only run if we're in the special MCP App iframe context const isMcpApp = new URLSearchParams(window.location.search).has(MCP_APP_PARAM); diff --git a/packages/addon-mcp/src/tools/preview-stories.ts b/packages/addon-mcp/src/tools/preview-stories.ts index bf306592..9831fa5f 100644 --- a/packages/addon-mcp/src/tools/preview-stories.ts +++ b/packages/addon-mcp/src/tools/preview-stories.ts @@ -51,13 +51,13 @@ export async function addPreviewStoriesTool( ); const appHtml = appTemplate.replace( - '', + '// APP_SCRIPT_PLACEHOLDER', previewStoryAppScript, ); server.resource( { name: PREVIEW_STORIES_RESOURCE_URI, - description: 'App Resource for the Get Story tool', + description: 'App resource for the Preview Stories tool', uri: PREVIEW_STORIES_RESOURCE_URI, //@ts-expect-error tmcp types doesn't know this is valid mimeType: 'text/html;profile=mcp-app', diff --git a/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-script.ts b/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-script.ts index e02849a4..289f023b 100644 --- a/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-script.ts +++ b/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-script.ts @@ -5,8 +5,7 @@ */ const LATEST_PROTOCOL_VERSION = '2025-11-21'; -import { MCP_APP_SIZE_CHANGED_EVENT } from '../../constants.ts'; -import { MCP_APP_PARAM } from '../../constants.ts'; +import { MCP_APP_SIZE_CHANGED_EVENT, MCP_APP_PARAM } from '../../constants.ts'; import type { PreviewStoriesOutput } from '../preview-stories.ts'; import pkg from '../../../package.json' with { type: 'json' }; @@ -104,11 +103,6 @@ function sendHostRequest( window.parent.postMessage({ jsonrpc: '2.0', id, method, params }, '*'); window.addEventListener('message', function listener(event: MessageEvent) { - const data = event.data as { - id?: number; - result?: McpUiInitializeResult; - error?: unknown; - }; if (event.data?.id !== id) { return; } diff --git a/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-template.html b/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-template.html index 29092b84..9dbf2669 100644 --- a/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-template.html +++ b/packages/addon-mcp/src/tools/preview-stories/preview-stories-app-template.html @@ -3,7 +3,6 @@ -