@vantageos/mosaic 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/artifacts.cjs +113 -0
- package/dist/artifacts.cjs.map +1 -0
- package/dist/artifacts.d.cts +29 -0
- package/dist/artifacts.d.ts +29 -0
- package/dist/artifacts.js +105 -0
- package/dist/artifacts.js.map +1 -0
- package/dist/confirmation.cjs +180 -0
- package/dist/confirmation.cjs.map +1 -0
- package/dist/confirmation.d.cts +33 -0
- package/dist/confirmation.d.ts +33 -0
- package/dist/confirmation.js +176 -0
- package/dist/confirmation.js.map +1 -0
- package/dist/display.cjs +273 -0
- package/dist/display.cjs.map +1 -0
- package/dist/display.d.cts +94 -0
- package/dist/display.d.ts +94 -0
- package/dist/display.js +268 -0
- package/dist/display.js.map +1 -0
- package/dist/index.cjs +40 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +12 -232
- package/dist/index.d.ts +12 -232
- package/dist/index.js +40 -3
- package/dist/index.js.map +1 -1
- package/dist/input.cjs +102 -0
- package/dist/input.cjs.map +1 -0
- package/dist/input.d.cts +34 -0
- package/dist/input.d.ts +34 -0
- package/dist/input.js +98 -0
- package/dist/input.js.map +1 -0
- package/dist/media.cjs +98 -0
- package/dist/media.cjs.map +1 -0
- package/dist/media.d.cts +29 -0
- package/dist/media.d.ts +29 -0
- package/dist/media.js +94 -0
- package/dist/media.js.map +1 -0
- package/dist/progress.cjs +125 -0
- package/dist/progress.cjs.map +1 -0
- package/dist/progress.d.cts +29 -0
- package/dist/progress.d.ts +29 -0
- package/dist/progress.js +121 -0
- package/dist/progress.js.map +1 -0
- package/dist/server.cjs +121 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +33 -0
- package/dist/server.d.ts +33 -0
- package/dist/server.js +116 -0
- package/dist/server.js.map +1 -0
- package/package.json +48 -7
package/dist/server.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { createUIResource } from '@mcp-ui/server';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
|
|
4
|
+
// src/server/create-mosaic-resource.ts
|
|
5
|
+
var MarkdownRendererPropsSchema = z.object({
|
|
6
|
+
content: z.string(),
|
|
7
|
+
locale: z.enum(["en", "fr"]),
|
|
8
|
+
maxLength: z.number().positive().default(5e4),
|
|
9
|
+
allowHtml: z.boolean().default(false)
|
|
10
|
+
});
|
|
11
|
+
var TokenDisplayOnceModalPropsSchema = z.object({
|
|
12
|
+
token: z.string().min(1),
|
|
13
|
+
title: z.string().min(1),
|
|
14
|
+
warningMessage: z.string().min(1),
|
|
15
|
+
copyLabel: z.string().min(1),
|
|
16
|
+
closeLabel: z.string().min(1),
|
|
17
|
+
locale: z.enum(["en", "fr"]).default("en")
|
|
18
|
+
});
|
|
19
|
+
var ColumnDefSchema = z.object({
|
|
20
|
+
key: z.string().min(1),
|
|
21
|
+
header: z.string().min(1)
|
|
22
|
+
// render is a runtime function — excluded from Zod, typed separately
|
|
23
|
+
});
|
|
24
|
+
var TableViewPropsSchema = z.object({
|
|
25
|
+
columns: z.array(ColumnDefSchema).min(1, "TableView requires at least one column"),
|
|
26
|
+
virtualizeThreshold: z.number().int().positive().default(100),
|
|
27
|
+
ariaLabel: z.string().min(1),
|
|
28
|
+
locale: z.enum(["en", "fr"]).default("en")
|
|
29
|
+
});
|
|
30
|
+
var ConfirmDialogPropsSchema = z.object({
|
|
31
|
+
title: z.string().min(1),
|
|
32
|
+
message: z.string().min(1),
|
|
33
|
+
confirmLabel: z.string().min(1),
|
|
34
|
+
cancelLabel: z.string().min(1),
|
|
35
|
+
variant: z.enum(["default", "danger"]).default("default"),
|
|
36
|
+
locale: z.enum(["en", "fr"]).default("en")
|
|
37
|
+
});
|
|
38
|
+
var StatusBadgePropsSchema = z.object({
|
|
39
|
+
status: z.string(),
|
|
40
|
+
variant: z.enum(["success", "warning", "danger", "info", "neutral"]).default("neutral"),
|
|
41
|
+
label: z.string().optional(),
|
|
42
|
+
locale: z.enum(["en", "fr"])
|
|
43
|
+
});
|
|
44
|
+
var ProgressBarPropsSchema = z.object({
|
|
45
|
+
value: z.number().min(0).max(100),
|
|
46
|
+
label: z.string().min(1),
|
|
47
|
+
locale: z.enum(["en", "fr"]).default("en"),
|
|
48
|
+
colorVariant: z.enum(["default", "warning", "danger"]).default("default")
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// src/server/create-mosaic-resource.ts
|
|
52
|
+
var MCP_UI_CAPABILITY_KEY = "io.modelcontextprotocol/ui";
|
|
53
|
+
var MOSAIC_MIME_TYPE = "text/html;profile=mcp-app";
|
|
54
|
+
var SCHEMA_BY_NAME = {
|
|
55
|
+
ProgressBar: ProgressBarPropsSchema,
|
|
56
|
+
ConfirmDialog: ConfirmDialogPropsSchema,
|
|
57
|
+
TableView: TableViewPropsSchema,
|
|
58
|
+
MarkdownRenderer: MarkdownRendererPropsSchema,
|
|
59
|
+
TokenDisplayOnceModal: TokenDisplayOnceModalPropsSchema,
|
|
60
|
+
StatusBadge: StatusBadgePropsSchema
|
|
61
|
+
};
|
|
62
|
+
var COMPONENT_KEYS = Object.keys(SCHEMA_BY_NAME);
|
|
63
|
+
var I18N_TITLE = {
|
|
64
|
+
ProgressBar: { en: "Progress", fr: "Progression" },
|
|
65
|
+
ConfirmDialog: { en: "Confirmation", fr: "Confirmation" },
|
|
66
|
+
TableView: { en: "Data table", fr: "Tableau de donn\xE9es" },
|
|
67
|
+
MarkdownRenderer: { en: "Markdown content", fr: "Contenu Markdown" },
|
|
68
|
+
TokenDisplayOnceModal: { en: "Token (shown once)", fr: "Jeton (affich\xE9 une fois)" },
|
|
69
|
+
StatusBadge: { en: "Status", fr: "Statut" }
|
|
70
|
+
};
|
|
71
|
+
function escapeHtml(s) {
|
|
72
|
+
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
73
|
+
}
|
|
74
|
+
function fallbackMarkdown(componentName, locale) {
|
|
75
|
+
const heading = I18N_TITLE[componentName][locale];
|
|
76
|
+
const note = locale === "fr" ? "Rendu Markdown de secours \u2014 composant Mosaic charg\xE9 via MCP UI." : "Markdown fallback \u2014 Mosaic component rendered via MCP UI.";
|
|
77
|
+
return `# ${heading}
|
|
78
|
+
|
|
79
|
+
${note}
|
|
80
|
+
`;
|
|
81
|
+
}
|
|
82
|
+
function buildHtml(componentName, props, locale) {
|
|
83
|
+
const propsJson = escapeHtml(JSON.stringify(props));
|
|
84
|
+
const title = escapeHtml(I18N_TITLE[componentName][locale]);
|
|
85
|
+
return `<!DOCTYPE html><html lang="${locale}"><head><meta charset="utf-8"><title>${title}</title></head><body><div id="mosaic-root" data-component="${componentName}" data-props='${propsJson}'></div></body></html>`;
|
|
86
|
+
}
|
|
87
|
+
function createMosaicResource(componentName, props, locale = "en") {
|
|
88
|
+
const schema = SCHEMA_BY_NAME[componentName];
|
|
89
|
+
if (!schema) {
|
|
90
|
+
throw new Error(`createMosaicResource: unknown component '${componentName}'`);
|
|
91
|
+
}
|
|
92
|
+
const validated = schema.parse(props);
|
|
93
|
+
const uri = `ui://mosaic/${componentName.toLowerCase()}`;
|
|
94
|
+
const html = buildHtml(componentName, validated, locale);
|
|
95
|
+
const fallback = fallbackMarkdown(componentName, locale);
|
|
96
|
+
const resource = createUIResource({
|
|
97
|
+
uri,
|
|
98
|
+
content: { type: "rawHtml", htmlString: html },
|
|
99
|
+
encoding: "text",
|
|
100
|
+
metadata: {
|
|
101
|
+
ui: {
|
|
102
|
+
resourceUri: uri,
|
|
103
|
+
locale,
|
|
104
|
+
componentName,
|
|
105
|
+
fallback
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
resource.resource.mimeType = MOSAIC_MIME_TYPE;
|
|
110
|
+
return resource;
|
|
111
|
+
}
|
|
112
|
+
var MOSAIC_SUPPORTED_COMPONENTS = COMPONENT_KEYS;
|
|
113
|
+
|
|
114
|
+
export { MCP_UI_CAPABILITY_KEY, MOSAIC_MIME_TYPE, MOSAIC_SUPPORTED_COMPONENTS, createMosaicResource };
|
|
115
|
+
//# sourceMappingURL=server.js.map
|
|
116
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/artifacts/MarkdownRenderer.schema.ts","../src/components/confirmation/TokenDisplayOnceModal.schema.ts","../src/components/display/TableView.schema.ts","../src/components/input/ConfirmDialog.schema.ts","../src/components/media/StatusBadge.schema.ts","../src/components/progress/ProgressBar.schema.ts","../src/server/create-mosaic-resource.ts"],"names":["z"],"mappings":"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","file":"server.js","sourcesContent":["import { z } from \"zod\";\n\nexport const MarkdownRendererPropsSchema = z.object({\n content: z.string(),\n locale: z.enum([\"en\", \"fr\"]),\n maxLength: z.number().positive().default(50000),\n allowHtml: z.boolean().default(false),\n});\n\nexport type MarkdownRendererProps = z.infer<typeof MarkdownRendererPropsSchema>;\n\nexport function validateProps(raw: unknown): MarkdownRendererProps {\n return MarkdownRendererPropsSchema.parse(raw);\n}\n","import { z } from \"zod\";\n\n// i18nKeys: TokenDisplayOnceModal.button.copy, TokenDisplayOnceModal.button.close,\n// TokenDisplayOnceModal.warning.once, TokenDisplayOnceModal.copied\n\nexport const TokenDisplayOnceModalPropsSchema = z.object({\n token: z.string().min(1),\n title: z.string().min(1),\n warningMessage: z.string().min(1),\n copyLabel: z.string().min(1),\n closeLabel: z.string().min(1),\n locale: z.enum([\"en\", \"fr\"]).default(\"en\"),\n});\n\nexport type TokenDisplayOnceModalProps = z.infer<typeof TokenDisplayOnceModalPropsSchema> & {\n onClose: () => void;\n};\n\nexport function validateTokenDisplayOnceModalProps(\n raw: unknown,\n): z.infer<typeof TokenDisplayOnceModalPropsSchema> {\n return TokenDisplayOnceModalPropsSchema.parse(raw);\n}\n","import type { ReactNode } from \"react\";\nimport type { Observable } from \"rxjs\";\nimport { z } from \"zod\";\n\n// i18nKeys: TableView.aria.table, TableView.pagination.next, TableView.pagination.prev, TableView.empty.message, TableView.error.invalidProps\n\nexport const ColumnDefSchema = z.object({\n key: z.string().min(1),\n header: z.string().min(1),\n // render is a runtime function — excluded from Zod, typed separately\n});\n\nexport type ColumnDef<TRow extends Record<string, unknown> = Record<string, unknown>> = {\n key: string;\n header: string;\n render?: (row: TRow) => ReactNode;\n};\n\n/**\n * Validates the serialisable (non-function) portion of TableView props.\n * The `rows$` Observable and `render` callbacks are not Zod-parseable and\n * must be validated at the call-site type level.\n */\nexport const TableViewPropsSchema = z.object({\n columns: z.array(ColumnDefSchema).min(1, \"TableView requires at least one column\"),\n virtualizeThreshold: z.number().int().positive().default(100),\n ariaLabel: z.string().min(1),\n locale: z.enum([\"en\", \"fr\"]).default(\"en\"),\n});\n\nexport type TableViewPropsSchemaInput = z.input<typeof TableViewPropsSchema>;\nexport type TableViewPropsSchemaOutput = z.output<typeof TableViewPropsSchema>;\n\n/**\n * Props for the static TableView — accepts a plain array of rows.\n * Primary API for already-fetched data (no rxjs required).\n */\nexport type TableViewProps<TRow extends Record<string, unknown> = Record<string, unknown>> = {\n columns: ColumnDef<TRow>[];\n rows: Partial<TRow>[];\n virtualizeThreshold?: number;\n ariaLabel: string;\n locale?: \"en\" | \"fr\";\n};\n\n/**\n * Props for StreamingTableView — accepts an RxJS Observable for incremental row appending.\n * Consumers using this variant MUST install rxjs ^7.8.0 in their project.\n */\nexport type StreamingTableViewProps<\n TRow extends Record<string, unknown> = Record<string, unknown>,\n> = {\n columns: ColumnDef<TRow>[];\n rows$: Observable<Partial<TRow>[]>;\n virtualizeThreshold?: number;\n ariaLabel: string;\n locale?: \"en\" | \"fr\";\n};\n\nexport function validateTableViewProps(raw: unknown): TableViewPropsSchemaOutput {\n return TableViewPropsSchema.parse(raw);\n}\n","import { z } from \"zod\";\n\n// i18nKeys: ConfirmDialog.button.confirm, ConfirmDialog.button.cancel, ConfirmDialog.aria.dialog\n\nexport const ConfirmDialogPropsSchema = z.object({\n title: z.string().min(1),\n message: z.string().min(1),\n confirmLabel: z.string().min(1),\n cancelLabel: z.string().min(1),\n variant: z.enum([\"default\", \"danger\"]).default(\"default\"),\n locale: z.enum([\"en\", \"fr\"]).default(\"en\"),\n});\n\nexport type ConfirmDialogProps = z.infer<typeof ConfirmDialogPropsSchema> & {\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nexport function validateConfirmDialogProps(raw: unknown): z.infer<typeof ConfirmDialogPropsSchema> {\n return ConfirmDialogPropsSchema.parse(raw);\n}\n","import { z } from \"zod\";\n\nexport const StatusBadgePropsSchema = z.object({\n status: z.string(),\n variant: z.enum([\"success\", \"warning\", \"danger\", \"info\", \"neutral\"]).default(\"neutral\"),\n label: z.string().optional(),\n locale: z.enum([\"en\", \"fr\"]),\n});\n\nexport type StatusBadgeProps = z.infer<typeof StatusBadgePropsSchema>;\n\nexport function validateProps(raw: unknown): StatusBadgeProps {\n return StatusBadgePropsSchema.parse(raw);\n}\n","import { z } from \"zod\";\n\nexport const ProgressBarPropsSchema = z.object({\n value: z.number().min(0).max(100),\n label: z.string().min(1),\n locale: z.enum([\"en\", \"fr\"]).default(\"en\"),\n colorVariant: z.enum([\"default\", \"warning\", \"danger\"]).default(\"default\"),\n});\n\nexport type ProgressBarProps = z.infer<typeof ProgressBarPropsSchema>;\n\nexport function validateProps(raw: unknown): ProgressBarProps {\n return ProgressBarPropsSchema.parse(raw);\n}\n","import { type UIResource, createUIResource } from \"@mcp-ui/server\";\nimport { MarkdownRendererPropsSchema } from \"../components/artifacts/MarkdownRenderer.schema.js\";\nimport { TokenDisplayOnceModalPropsSchema } from \"../components/confirmation/TokenDisplayOnceModal.schema.js\";\nimport { TableViewPropsSchema } from \"../components/display/TableView.schema.js\";\nimport { ConfirmDialogPropsSchema } from \"../components/input/ConfirmDialog.schema.js\";\nimport { StatusBadgePropsSchema } from \"../components/media/StatusBadge.schema.js\";\nimport { ProgressBarPropsSchema } from \"../components/progress/ProgressBar.schema.js\";\n\n/**\n * MCP capability key used by hosts to discover that this server emits\n * MCP UI Apps resources (mosaic-architecture-standard-v1 §2.1).\n */\nexport const MCP_UI_CAPABILITY_KEY = \"io.modelcontextprotocol/ui\" as const;\n\n/**\n * Canonical Mosaic MIME type — every UIResource produced by this server\n * advertises the MCP Apps profile (`text/html;profile=mcp-app`).\n */\nexport const MOSAIC_MIME_TYPE = \"text/html;profile=mcp-app\" as const;\n\ntype SupportedComponent =\n | \"ProgressBar\"\n | \"ConfirmDialog\"\n | \"TableView\"\n | \"MarkdownRenderer\"\n | \"TokenDisplayOnceModal\"\n | \"StatusBadge\";\n\nconst SCHEMA_BY_NAME = {\n ProgressBar: ProgressBarPropsSchema,\n ConfirmDialog: ConfirmDialogPropsSchema,\n TableView: TableViewPropsSchema,\n MarkdownRenderer: MarkdownRendererPropsSchema,\n TokenDisplayOnceModal: TokenDisplayOnceModalPropsSchema,\n StatusBadge: StatusBadgePropsSchema,\n} as const;\n\nconst COMPONENT_KEYS = Object.keys(SCHEMA_BY_NAME) as SupportedComponent[];\n\nconst I18N_TITLE: Record<SupportedComponent, { en: string; fr: string }> = {\n ProgressBar: { en: \"Progress\", fr: \"Progression\" },\n ConfirmDialog: { en: \"Confirmation\", fr: \"Confirmation\" },\n TableView: { en: \"Data table\", fr: \"Tableau de données\" },\n MarkdownRenderer: { en: \"Markdown content\", fr: \"Contenu Markdown\" },\n TokenDisplayOnceModal: { en: \"Token (shown once)\", fr: \"Jeton (affiché une fois)\" },\n StatusBadge: { en: \"Status\", fr: \"Statut\" },\n};\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nfunction fallbackMarkdown(componentName: SupportedComponent, locale: \"en\" | \"fr\"): string {\n const heading = I18N_TITLE[componentName][locale];\n const note =\n locale === \"fr\"\n ? \"Rendu Markdown de secours — composant Mosaic chargé via MCP UI.\"\n : \"Markdown fallback — Mosaic component rendered via MCP UI.\";\n return `# ${heading}\\n\\n${note}\\n`;\n}\n\nfunction buildHtml(componentName: SupportedComponent, props: unknown, locale: \"en\" | \"fr\"): string {\n const propsJson = escapeHtml(JSON.stringify(props));\n const title = escapeHtml(I18N_TITLE[componentName][locale]);\n return `<!DOCTYPE html><html lang=\"${locale}\"><head><meta charset=\"utf-8\"><title>${title}</title></head><body><div id=\"mosaic-root\" data-component=\"${componentName}\" data-props='${propsJson}'></div></body></html>`;\n}\n\nexport interface CreateMosaicResourceOptions {\n /** Optional override for the generated `ui://` URI. */\n uri?: `ui://${string}`;\n /** Optional override of the markdown fallback emitted under `_meta.ui.fallback`. */\n markdownFallback?: string;\n}\n\n/**\n * Create a canonical MCP UI Apps `UIResource` for a Mosaic component.\n *\n * - Runtime-validates `props` with the component's Zod schema (throws on failure).\n * - Wraps the rendered HTML with `createUIResource()` from `@mcp-ui/server`.\n * - Emits canonical nested `_meta.ui.{ resourceUri, locale, componentName, fallback }`.\n * - Uses MIME `text/html;profile=mcp-app` (Mosaic standard §2.1).\n *\n * @throws ZodError when `props` fails validation for `componentName`.\n */\nexport function createMosaicResource(\n componentName: SupportedComponent,\n props: unknown,\n locale: \"en\" | \"fr\" = \"en\",\n): UIResource {\n const schema = SCHEMA_BY_NAME[componentName];\n if (!schema) {\n throw new Error(`createMosaicResource: unknown component '${componentName}'`);\n }\n const validated = schema.parse(props);\n const uri: `ui://${string}` = `ui://mosaic/${componentName.toLowerCase()}`;\n const html = buildHtml(componentName, validated, locale);\n const fallback = fallbackMarkdown(componentName, locale);\n\n const resource = createUIResource({\n uri,\n content: { type: \"rawHtml\", htmlString: html },\n encoding: \"text\",\n metadata: {\n ui: {\n resourceUri: uri,\n locale,\n componentName,\n fallback,\n },\n },\n });\n\n // createUIResource may itself default the MIME type; ensure it matches the\n // Mosaic canonical profile regardless of upstream defaults.\n resource.resource.mimeType = MOSAIC_MIME_TYPE;\n return resource;\n}\n\nexport const MOSAIC_SUPPORTED_COMPONENTS: readonly SupportedComponent[] = COMPONENT_KEYS;\nexport type { SupportedComponent };\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vantageos/mosaic",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Fleet-wide MCP UI design system — 6-category taxonomy, Zod-validated, registry-gated, streaming-ready.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -8,10 +8,46 @@
|
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
9
9
|
"exports": {
|
|
10
10
|
".": {
|
|
11
|
-
"types": "./dist/index.d.ts",
|
|
12
11
|
"import": "./dist/index.js",
|
|
13
|
-
"require": "./dist/index.cjs"
|
|
14
|
-
|
|
12
|
+
"require": "./dist/index.cjs",
|
|
13
|
+
"types": "./dist/index.d.ts"
|
|
14
|
+
},
|
|
15
|
+
"./progress": {
|
|
16
|
+
"import": "./dist/progress.js",
|
|
17
|
+
"require": "./dist/progress.cjs",
|
|
18
|
+
"types": "./dist/progress.d.ts"
|
|
19
|
+
},
|
|
20
|
+
"./input": {
|
|
21
|
+
"import": "./dist/input.js",
|
|
22
|
+
"require": "./dist/input.cjs",
|
|
23
|
+
"types": "./dist/input.d.ts"
|
|
24
|
+
},
|
|
25
|
+
"./display": {
|
|
26
|
+
"import": "./dist/display.js",
|
|
27
|
+
"require": "./dist/display.cjs",
|
|
28
|
+
"types": "./dist/display.d.ts"
|
|
29
|
+
},
|
|
30
|
+
"./artifacts": {
|
|
31
|
+
"import": "./dist/artifacts.js",
|
|
32
|
+
"require": "./dist/artifacts.cjs",
|
|
33
|
+
"types": "./dist/artifacts.d.ts"
|
|
34
|
+
},
|
|
35
|
+
"./confirmation": {
|
|
36
|
+
"import": "./dist/confirmation.js",
|
|
37
|
+
"require": "./dist/confirmation.cjs",
|
|
38
|
+
"types": "./dist/confirmation.d.ts"
|
|
39
|
+
},
|
|
40
|
+
"./media": {
|
|
41
|
+
"import": "./dist/media.js",
|
|
42
|
+
"require": "./dist/media.cjs",
|
|
43
|
+
"types": "./dist/media.d.ts"
|
|
44
|
+
},
|
|
45
|
+
"./server": {
|
|
46
|
+
"import": "./dist/server.js",
|
|
47
|
+
"require": "./dist/server.cjs",
|
|
48
|
+
"types": "./dist/server.d.ts"
|
|
49
|
+
},
|
|
50
|
+
"./registry.yaml": "./registry.yaml"
|
|
15
51
|
},
|
|
16
52
|
"files": [
|
|
17
53
|
"dist",
|
|
@@ -23,7 +59,8 @@
|
|
|
23
59
|
"@mcp-ui/client": "7.1.1",
|
|
24
60
|
"react": "^19.1.0",
|
|
25
61
|
"react-dom": "^19.1.0",
|
|
26
|
-
"react-i18next": "15.5.2"
|
|
62
|
+
"react-i18next": "15.5.2",
|
|
63
|
+
"rxjs": "^7.8.0"
|
|
27
64
|
},
|
|
28
65
|
"peerDependenciesMeta": {
|
|
29
66
|
"@mcp-ui/client": {
|
|
@@ -31,6 +68,9 @@
|
|
|
31
68
|
},
|
|
32
69
|
"react-i18next": {
|
|
33
70
|
"optional": true
|
|
71
|
+
},
|
|
72
|
+
"rxjs": {
|
|
73
|
+
"optional": true
|
|
34
74
|
}
|
|
35
75
|
},
|
|
36
76
|
"dependencies": {
|
|
@@ -39,11 +79,12 @@
|
|
|
39
79
|
"@tanstack/react-virtual": "3.13.6",
|
|
40
80
|
"dompurify": "3.2.4",
|
|
41
81
|
"marked": "15.0.7",
|
|
42
|
-
"recharts": "2.15.3",
|
|
43
|
-
"rxjs": "7.8.2",
|
|
44
82
|
"zod": "3.25.28"
|
|
45
83
|
},
|
|
46
84
|
"devDependencies": {
|
|
85
|
+
"@babel/parser": "7.29.7",
|
|
86
|
+
"@babel/traverse": "7.29.7",
|
|
87
|
+
"@types/babel__traverse": "7.28.0",
|
|
47
88
|
"@axe-core/playwright": "4.10.1",
|
|
48
89
|
"@biomejs/biome": "1.9.4",
|
|
49
90
|
"@playwright/test": "1.50.1",
|