@nuwax-ai/openui-mcp 0.1.2 → 0.1.4

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/README.md CHANGED
@@ -91,7 +91,7 @@ one process and one sidecar port:
91
91
  "mcpServers": {
92
92
  "nuwax-openui": {
93
93
  "command": "npx",
94
- "args": ["-y", "@nuwax-ai/openui-mcp@0.1.2"],
94
+ "args": ["-y", "@nuwax-ai/openui-mcp@0.1.4"],
95
95
  "env": {
96
96
  "NUWAX_OPENUI_HOST": "127.0.0.1",
97
97
  "NUWAX_OPENUI_PORT": "8787",
@@ -161,6 +161,39 @@ schemaVersion = nuwax.openui/v1
161
161
 
162
162
  Do not infer UI from arbitrary MCP tool results.
163
163
 
164
+ ## Agent authoring guidance
165
+
166
+ The server publishes the DSL contract through multiple MCP capabilities so an
167
+ Agent does not need to guess syntax or inspect installed package files:
168
+
169
+ | Capability | Name / URI | Purpose |
170
+ | ---------- | ------------------------------------- | ---------------------------------------------------------------------------- |
171
+ | Tool | `nuwax_get_openui_reference` | Returns the generated authoring guide or complete DSL JSON Schema |
172
+ | Prompt | `nuwax_openui_authoring` | Starts an authoring flow with a `basic`, `dashboard`, `form`, or `all` focus |
173
+ | Resource | `nuwax://openui/schema/v0.5` | Complete JSON Schema generated from the renderer's current component library |
174
+ | Resource | `nuwax://openui/authoring-guide/v0.5` | Complete generated OpenUI Lang authoring guide |
175
+
176
+ `nuwax_render_openui` also includes trigger guidance and a minimal valid example
177
+ in its tool description and input schema. Agents should use it when the user
178
+ asks for a visual card, dashboard, chart, table, report, form, status panel, or
179
+ other structured interface even if the user does not explicitly mention
180
+ OpenUI.
181
+
182
+ For a complex interface, call `nuwax_get_openui_reference` with `format=guide`
183
+ and the closest profile before rendering. Clients that only expose MCP tools
184
+ can also retrieve the complete DSL schema with `format=schema`. OpenUI Lang is
185
+ assignment-based and is not XML, HTML, or JSX:
186
+
187
+ ```text
188
+ root = Stack([title, status])
189
+ title = TextContent("Deployment", "large-heavy")
190
+ status = Callout("success", "Ready", "Deployment completed successfully.")
191
+ ```
192
+
193
+ The JSON Schema and guide are generated from the exact OpenUI renderer library
194
+ used by this package, preventing the authoring contract from drifting away from
195
+ runtime behavior.
196
+
164
197
  ## Host integration
165
198
 
166
199
  For inline mode, mount the OpenUI renderer inside the existing tool block:
@@ -2,6 +2,22 @@ import { z } from 'zod';
2
2
  export declare const OPENUI_SCHEMA_VERSION: "nuwax.openui/v1";
3
3
  export declare const OPENUI_LANG_VERSION: "0.5";
4
4
  export declare const OPENUI_TOOL_NAME: "nuwax_render_openui";
5
+ export declare const OPENUI_REFERENCE_TOOL_NAME: "nuwax_get_openui_reference";
6
+ export declare const OPENUI_AUTHORING_PROMPT_NAME: "nuwax_openui_authoring";
7
+ export declare const OPENUI_SCHEMA_RESOURCE_URI: "nuwax://openui/schema/v0.5";
8
+ export declare const OPENUI_GUIDE_RESOURCE_URI: "nuwax://openui/authoring-guide/v0.5";
9
+ export declare const openUiReferenceInputSchema: z.ZodObject<{
10
+ format: z.ZodDefault<z.ZodEnum<{
11
+ guide: "guide";
12
+ schema: "schema";
13
+ }>>;
14
+ profile: z.ZodDefault<z.ZodEnum<{
15
+ basic: "basic";
16
+ dashboard: "dashboard";
17
+ form: "form";
18
+ all: "all";
19
+ }>>;
20
+ }, z.core.$strip>;
5
21
  declare const bindingSchema: z.ZodObject<{
6
22
  serverId: z.ZodString;
7
23
  toolName: z.ZodString;
@@ -89,6 +105,7 @@ export declare const openUiArtifactSchema: z.ZodObject<{
89
105
  expiresAt: z.ZodString;
90
106
  }, z.core.$strip>;
91
107
  export type RenderOpenUiInput = z.infer<typeof renderOpenUiInputSchema>;
108
+ export type OpenUiReferenceInput = z.infer<typeof openUiReferenceInputSchema>;
92
109
  export type OpenUiArtifact = z.infer<typeof openUiArtifactSchema>;
93
110
  export type OpenUiBinding = z.infer<typeof bindingSchema>;
94
111
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,qBAAqB,EAAG,iBAA0B,CAAC;AAChE,eAAO,MAAM,mBAAmB,EAAG,KAAc,CAAC;AAClD,eAAO,MAAM,gBAAgB,EAAG,qBAA8B,CAAC;AAE/D,QAAA,MAAM,aAAa;;;;;;;iBAIjB,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuBlC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+B/B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACxE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC"}
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,qBAAqB,EAAG,iBAA0B,CAAC;AAChE,eAAO,MAAM,mBAAmB,EAAG,KAAc,CAAC;AAClD,eAAO,MAAM,gBAAgB,EAAG,qBAA8B,CAAC;AAC/D,eAAO,MAAM,0BAA0B,EAAG,4BAAqC,CAAC;AAChF,eAAO,MAAM,4BAA4B,EAAG,wBAAiC,CAAC;AAC9E,eAAO,MAAM,0BAA0B,EAAG,4BAAqC,CAAC;AAChF,eAAO,MAAM,yBAAyB,EACpC,qCAA8C,CAAC;AAEjD,eAAO,MAAM,0BAA0B;;;;;;;;;;;iBAarC,CAAC;AAEH,QAAA,MAAM,aAAa;;;;;;;iBAIjB,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmClC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+B/B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACxE,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC"}
@@ -2,23 +2,45 @@ import { z } from 'zod';
2
2
  export const OPENUI_SCHEMA_VERSION = 'nuwax.openui/v1';
3
3
  export const OPENUI_LANG_VERSION = '0.5';
4
4
  export const OPENUI_TOOL_NAME = 'nuwax_render_openui';
5
+ export const OPENUI_REFERENCE_TOOL_NAME = 'nuwax_get_openui_reference';
6
+ export const OPENUI_AUTHORING_PROMPT_NAME = 'nuwax_openui_authoring';
7
+ export const OPENUI_SCHEMA_RESOURCE_URI = 'nuwax://openui/schema/v0.5';
8
+ export const OPENUI_GUIDE_RESOURCE_URI = 'nuwax://openui/authoring-guide/v0.5';
9
+ export const openUiReferenceInputSchema = z.object({
10
+ format: z
11
+ .enum(['guide', 'schema'])
12
+ .default('guide')
13
+ .describe('Use guide for authoring instructions, component signatures, and examples. Use schema for the complete renderer-generated JSON Schema.'),
14
+ profile: z
15
+ .enum(['basic', 'dashboard', 'form', 'all'])
16
+ .default('basic')
17
+ .describe('Component reference to return: basic for cards/content, dashboard for tables/charts, form for inputs/actions, all only when the other profiles are insufficient.'),
18
+ });
5
19
  const bindingSchema = z.object({
6
20
  serverId: z.string().trim().min(1).max(128),
7
21
  toolName: z.string().trim().min(1).max(128),
8
22
  access: z.enum(['query', 'mutation']),
9
23
  });
10
24
  export const renderOpenUiInputSchema = z.object({
11
- schemaVersion: z.literal(OPENUI_SCHEMA_VERSION),
12
- title: z.string().trim().min(1).max(160),
25
+ schemaVersion: z
26
+ .literal(OPENUI_SCHEMA_VERSION)
27
+ .describe('Always use nuwax.openui/v1.'),
28
+ title: z.string().trim().min(1).max(160).describe('Visible UI title.'),
13
29
  presentation: z.object({
14
- mode: z.enum(['inline', 'sidecar']),
30
+ mode: z
31
+ .enum(['inline', 'sidecar'])
32
+ .describe('Use inline for cards, forms, tables, and compact dashboards in chat. Use sidecar only for a full-page experience.'),
15
33
  preferredWidth: z.enum(['compact', 'normal', 'wide']).optional(),
16
34
  autoOpen: z.boolean().default(false),
17
35
  }),
18
36
  document: z.object({
19
37
  language: z.literal('openui-lang'),
20
38
  specVersion: z.literal(OPENUI_LANG_VERSION),
21
- source: z.string().min(1).max(100_000),
39
+ source: z
40
+ .string()
41
+ .min(1)
42
+ .max(100_000)
43
+ .describe('OpenUI Lang assignment syntax, NEVER XML/HTML/JSX. The first line must define root = Stack(...); arguments are positional. Minimal valid example: root = Stack([title])\\ntitle = TextContent("Ready", "large-heavy"). Call nuwax_get_openui_reference before authoring a complex document or whenever a signature is uncertain.'),
22
44
  }),
23
45
  bindings: z
24
46
  .object({
@@ -1 +1 @@
1
- {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/contracts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/contracts.ts"],"names":[],"mappings":"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"}
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,mBAAmB,GACjC,SAAS,CAkDX"}
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAepE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,mBAAmB,GACjC,SAAS,CAsJX"}
@@ -1,17 +1,86 @@
1
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import { z } from 'zod';
3
- import { OPENUI_TOOL_NAME, openUiArtifactSchema, renderOpenUiInputSchema, } from './contracts.js';
3
+ import { OPENUI_AUTHORING_PROMPT_NAME, OPENUI_GUIDE_RESOURCE_URI, OPENUI_REFERENCE_TOOL_NAME, OPENUI_SCHEMA_RESOURCE_URI, OPENUI_TOOL_NAME, openUiReferenceInputSchema, openUiArtifactSchema, renderOpenUiInputSchema, } from './contracts.js';
4
+ import { getOpenUiDslSchema, getOpenUiReference } from './openui-reference.js';
4
5
  import { OpenUiPolicyError } from './policy.js';
5
6
  export function createOpenUiMcpServer(renderService) {
6
7
  const server = new McpServer({
7
8
  name: 'nuwax-openui-mcp',
8
- version: '0.1.0',
9
+ version: '0.1.4',
9
10
  });
11
+ server.registerResource('nuwax-openui-dsl-schema', OPENUI_SCHEMA_RESOURCE_URI, {
12
+ title: 'Nuwax OpenUI Lang v0.5 JSON Schema',
13
+ description: 'Authoritative component and property schema generated from the exact OpenUI renderer library used by Nuwax.',
14
+ mimeType: 'application/schema+json',
15
+ }, (uri) => ({
16
+ contents: [
17
+ {
18
+ uri: uri.href,
19
+ mimeType: 'application/schema+json',
20
+ text: getOpenUiDslSchema(),
21
+ },
22
+ ],
23
+ }));
24
+ server.registerResource('nuwax-openui-authoring-guide', OPENUI_GUIDE_RESOURCE_URI, {
25
+ title: 'Nuwax OpenUI Lang v0.5 Authoring Guide',
26
+ description: 'Syntax rules, component signatures, actions, bindings, and examples generated from the current renderer library.',
27
+ mimeType: 'text/plain',
28
+ }, (uri) => ({
29
+ contents: [
30
+ {
31
+ uri: uri.href,
32
+ mimeType: 'text/plain',
33
+ text: getOpenUiReference('all'),
34
+ },
35
+ ],
36
+ }));
37
+ server.registerPrompt(OPENUI_AUTHORING_PROMPT_NAME, {
38
+ title: 'Author a Nuwax OpenUI interface',
39
+ description: 'Load the authoritative DSL syntax, component schema, and examples before creating a Nuwax visual interface.',
40
+ argsSchema: { profile: openUiReferenceInputSchema.shape.profile },
41
+ }, ({ profile }) => ({
42
+ description: `OpenUI ${profile} authoring instructions`,
43
+ messages: [
44
+ {
45
+ role: 'user',
46
+ content: {
47
+ type: 'text',
48
+ text: `${getOpenUiReference(profile)}\n\nAfter authoring the document, call ${OPENUI_TOOL_NAME} to validate and publish it.`,
49
+ },
50
+ },
51
+ ],
52
+ }));
53
+ server.registerTool(OPENUI_REFERENCE_TOOL_NAME, {
54
+ title: 'Get Nuwax OpenUI authoring reference',
55
+ description: 'Get the authoritative OpenUI Lang contract before creating a complex Nuwax UI. Use format=guide for syntax, component signatures, and examples; use format=schema for the complete renderer-generated JSON Schema. Use this instead of guessing syntax or searching local package files. Choose dashboard for tables/charts, form for inputs, basic for cards/content, and all only as a fallback.',
56
+ inputSchema: openUiReferenceInputSchema,
57
+ annotations: {
58
+ readOnlyHint: true,
59
+ destructiveHint: false,
60
+ idempotentHint: true,
61
+ openWorldHint: false,
62
+ },
63
+ }, async ({ format, profile }) => ({
64
+ content: [
65
+ {
66
+ type: 'text',
67
+ text: format === 'schema'
68
+ ? getOpenUiDslSchema()
69
+ : getOpenUiReference(profile),
70
+ },
71
+ ],
72
+ }));
10
73
  server.registerTool(OPENUI_TOOL_NAME, {
11
74
  title: 'Render Nuwax OpenUI',
12
- description: 'Validate and publish an OpenUI Lang document for Nuwax. Use inline for compact UI inside the tool block, or sidecar for a full page opened in the Nuwax preview iframe.',
75
+ description: 'Create and publish visual UI in a Nuwax Agent conversation. Use this whenever the user asks to show, render, visualize, preview, or build a card, dashboard, chart, table, report, form, status panel, or other structured interface—even if they do not mention OpenUI. Do not use it for prose-only or code-only answers. OpenUI Lang is assignment-based and is NEVER XML/HTML/JSX: start with root = Stack(...), use positional arguments, and reference every defined variable. A minimal valid source is root = Stack([title]) followed by title = TextContent("Ready", "large-heavy"). For complex UI or uncertain component signatures, call nuwax_get_openui_reference first; never guess or search local package files. Use inline for compact conversation UI and sidecar only for a full page.',
13
76
  inputSchema: renderOpenUiInputSchema,
14
77
  outputSchema: openUiArtifactSchema,
78
+ annotations: {
79
+ readOnlyHint: false,
80
+ destructiveHint: false,
81
+ idempotentHint: false,
82
+ openWorldHint: false,
83
+ },
15
84
  }, async (input) => {
16
85
  try {
17
86
  const artifact = await renderService.render(input);
@@ -35,7 +104,12 @@ export function createOpenUiMcpServer(renderService) {
35
104
  : 'Unknown OpenUI validation error.';
36
105
  return {
37
106
  isError: true,
38
- content: [{ type: 'text', text: message }],
107
+ content: [
108
+ {
109
+ type: 'text',
110
+ text: `${message}\nOpenUI Lang is not XML/HTML/JSX. Call ${OPENUI_REFERENCE_TOOL_NAME} with the closest profile, then retry once using root = Stack(...) and positional arguments.`,
111
+ },
112
+ ],
39
113
  _meta: error instanceof OpenUiPolicyError
40
114
  ? { code: error.code }
41
115
  : { code: 'invalid-openui-document' },
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhD,MAAM,UAAU,qBAAqB,CACnC,aAAkC;IAElC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACT,yKAAyK;QAC3K,WAAW,EAAE,uBAAuB;QACpC,YAAY,EAAE,oBAAoB;KACnC,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EACF,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,QAAQ;4BACrC,CAAC,CAAC,iCAAiC,QAAQ,CAAC,UAAU,EAAE;4BACxD,CAAC,CAAC,kCAAkC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;qBAC7D;iBACF;gBACD,iBAAiB,EAAE,QAAQ;aAC5B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,CAAC,CAAC,QAAQ;gBACzB,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC;gBACxB,CAAC,CAAC,KAAK,YAAY,KAAK;oBACtB,CAAC,CAAC,KAAK,CAAC,OAAO;oBACf,CAAC,CAAC,kCAAkC,CAAC;YAC3C,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBACnD,KAAK,EACH,KAAK,YAAY,iBAAiB;oBAChC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;oBACtB,CAAC,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE;aAC1C,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/mcp-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { OpenUiReferenceInput } from './contracts.js';
2
+ export declare function getOpenUiReference(profile: OpenUiReferenceInput['profile']): string;
3
+ export declare function getOpenUiDslSchema(): string;
4
+ //# sourceMappingURL=openui-reference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openui-reference.d.ts","sourceRoot":"","sources":["../../src/openui-reference.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAW3D,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,oBAAoB,CAAC,SAAS,CAAC,GACvC,MAAM,CAER;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
@@ -0,0 +1,14 @@
1
+ import { openuiLibrary } from '@openuidev/react-ui/genui-lib';
2
+ const PROFILE_FOCUS = {
3
+ basic: 'Focus on Stack, Card, CardHeader, TextContent, Callout, TagBlock, Buttons, and Separator.',
4
+ dashboard: 'Focus on Table/Col, chart components, KPI Cards, Tabs, and shared data arrays.',
5
+ form: 'Focus on Form, FormControl, input components, Buttons/Action, validation rules, bindings, and Modal.',
6
+ all: 'Use any documented component, but prefer the smallest set that satisfies the request.',
7
+ };
8
+ export function getOpenUiReference(profile) {
9
+ return `Authoring profile: ${profile}. ${PROFILE_FOCUS[profile]}\nDo not emit XML, HTML, JSX, markdown fences, or explanations inside document.source.\n\n${openuiLibrary.prompt({})}`;
10
+ }
11
+ export function getOpenUiDslSchema() {
12
+ return JSON.stringify(openuiLibrary.toJSONSchema(), null, 2);
13
+ }
14
+ //# sourceMappingURL=openui-reference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openui-reference.js","sourceRoot":"","sources":["../../src/openui-reference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAI9D,MAAM,aAAa,GAAoD;IACrE,KAAK,EACH,2FAA2F;IAC7F,SAAS,EACP,gFAAgF;IAClF,IAAI,EAAE,sGAAsG;IAC5G,GAAG,EAAE,uFAAuF;CAC7F,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAChC,OAAwC;IAExC,OAAO,sBAAsB,OAAO,KAAK,aAAa,CAAC,OAAO,CAAC,6FAA6F,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;AACzL,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC/D,CAAC"}
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nuwax-ai/openui-mcp",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "OpenUI over MCP for Nuwax, with inline and sidecar rendering contracts.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -34,6 +34,22 @@
34
34
  "README.md",
35
35
  "LICENSE"
36
36
  ],
37
+ "scripts": {
38
+ "build": "pnpm build:server && pnpm build:web",
39
+ "build:server": "tsc -p tsconfig.server.json",
40
+ "build:web": "vite build",
41
+ "dev:http": "tsx watch src/http.ts",
42
+ "dev:stdio": "tsx src/stdio.ts",
43
+ "format": "prettier --write .",
44
+ "format:check": "prettier --check .",
45
+ "lint": "eslint .",
46
+ "start": "node dist/server/http.js",
47
+ "test": "vitest run",
48
+ "test:watch": "vitest",
49
+ "typecheck": "tsc -p tsconfig.server.json --noEmit && tsc -p tsconfig.web.json --noEmit",
50
+ "verify": "pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm build",
51
+ "prepublishOnly": "pnpm verify"
52
+ },
37
53
  "publishConfig": {
38
54
  "access": "public",
39
55
  "registry": "https://registry.npmjs.org/"
@@ -70,19 +86,5 @@
70
86
  "engines": {
71
87
  "node": ">=20"
72
88
  },
73
- "scripts": {
74
- "build": "pnpm build:server && pnpm build:web",
75
- "build:server": "tsc -p tsconfig.server.json",
76
- "build:web": "vite build",
77
- "dev:http": "tsx watch src/http.ts",
78
- "dev:stdio": "tsx src/stdio.ts",
79
- "format": "prettier --write .",
80
- "format:check": "prettier --check .",
81
- "lint": "eslint .",
82
- "start": "node dist/server/http.js",
83
- "test": "vitest run",
84
- "test:watch": "vitest",
85
- "typecheck": "tsc -p tsconfig.server.json --noEmit && tsc -p tsconfig.web.json --noEmit",
86
- "verify": "pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm build"
87
- }
88
- }
89
+ "packageManager": "pnpm@10.30.3"
90
+ }