@nuwax-ai/openui-mcp 0.1.12 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +66 -289
  3. package/dist/server/artifact-store.d.ts +14 -6
  4. package/dist/server/artifact-store.d.ts.map +1 -1
  5. package/dist/server/artifact-store.js +73 -9
  6. package/dist/server/artifact-store.js.map +1 -1
  7. package/dist/server/contracts.d.ts +68 -0
  8. package/dist/server/contracts.d.ts.map +1 -1
  9. package/dist/server/contracts.js +42 -0
  10. package/dist/server/contracts.js.map +1 -1
  11. package/dist/server/index.d.ts +1 -0
  12. package/dist/server/index.d.ts.map +1 -1
  13. package/dist/server/index.js +1 -0
  14. package/dist/server/index.js.map +1 -1
  15. package/dist/server/mcp-server.d.ts.map +1 -1
  16. package/dist/server/mcp-server.js +5 -7
  17. package/dist/server/mcp-server.js.map +1 -1
  18. package/dist/server/openui-reference.d.ts +1 -0
  19. package/dist/server/openui-reference.d.ts.map +1 -1
  20. package/dist/server/openui-reference.js +8 -1
  21. package/dist/server/openui-reference.js.map +1 -1
  22. package/dist/server/project-root.d.ts +11 -0
  23. package/dist/server/project-root.d.ts.map +1 -0
  24. package/dist/server/project-root.js +51 -0
  25. package/dist/server/project-root.js.map +1 -0
  26. package/dist/server/render-service.d.ts +3 -8
  27. package/dist/server/render-service.d.ts.map +1 -1
  28. package/dist/server/render-service.js +21 -26
  29. package/dist/server/render-service.js.map +1 -1
  30. package/dist/server/runtime.d.ts +3 -4
  31. package/dist/server/runtime.d.ts.map +1 -1
  32. package/dist/server/runtime.js +4 -7
  33. package/dist/server/runtime.js.map +1 -1
  34. package/dist/server/stdio.js +8 -9
  35. package/dist/server/stdio.js.map +1 -1
  36. package/dist/server/version.d.ts +1 -1
  37. package/dist/server/version.d.ts.map +1 -1
  38. package/dist/server/version.js +1 -1
  39. package/dist/server/version.js.map +1 -1
  40. package/dist/web/{sidecar.css → runtime.css} +1 -1
  41. package/dist/web/{sidecar.js → runtime.js} +7578 -7549
  42. package/package.json +6 -9
  43. package/dist/server/config.d.ts +0 -14
  44. package/dist/server/config.d.ts.map +0 -1
  45. package/dist/server/config.js +0 -50
  46. package/dist/server/config.js.map +0 -1
  47. package/dist/server/http-app.d.ts +0 -11
  48. package/dist/server/http-app.d.ts.map +0 -1
  49. package/dist/server/http-app.js +0 -88
  50. package/dist/server/http-app.js.map +0 -1
  51. package/dist/server/http-server.d.ts +0 -10
  52. package/dist/server/http-server.d.ts.map +0 -1
  53. package/dist/server/http-server.js +0 -30
  54. package/dist/server/http-server.js.map +0 -1
  55. package/dist/server/http.d.ts +0 -3
  56. package/dist/server/http.d.ts.map +0 -1
  57. package/dist/server/http.js +0 -18
  58. package/dist/server/http.js.map +0 -1
  59. package/dist/server/page-template.d.ts +0 -2
  60. package/dist/server/page-template.d.ts.map +0 -1
  61. package/dist/server/page-template.js +0 -32
  62. package/dist/server/page-template.js.map +0 -1
@@ -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;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoC/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"}
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,0BAA0B,EAAG,sBAA+B,CAAC;AAC1E,eAAO,MAAM,yBAAyB,EAAG,qBAA8B,CAAC;AACxE,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0ClC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoC/B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwB3B,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;iBASlC,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,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACxE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  export const OPENUI_SCHEMA_VERSION = 'nuwax.openui/v1';
3
+ export const OPENUI_FILE_SCHEMA_VERSION = 'nuwax.openui-file/v1';
4
+ export const OPENUI_REF_SCHEMA_VERSION = 'nuwax.openui-ref/v1';
3
5
  export const OPENUI_LANG_VERSION = '0.5';
4
6
  export const OPENUI_TOOL_NAME = 'nuwax_render_openui';
5
7
  export const OPENUI_REFERENCE_TOOL_NAME = 'nuwax_get_openui_reference';
@@ -22,6 +24,11 @@ const bindingSchema = z.object({
22
24
  access: z.enum(['query', 'mutation']),
23
25
  });
24
26
  export const renderOpenUiInputSchema = z.object({
27
+ artifactId: z
28
+ .string()
29
+ .uuid()
30
+ .optional()
31
+ .describe('Optional stable artifact UUID. Reusing an existing ID atomically replaces data/{artifactId}.openui.json.'),
25
32
  schemaVersion: z
26
33
  .literal(OPENUI_SCHEMA_VERSION)
27
34
  .describe('Always use nuwax.openui/v1.'),
@@ -88,4 +95,39 @@ export const openUiArtifactSchema = z.object({
88
95
  createdAt: z.string().datetime(),
89
96
  expiresAt: z.string().datetime(),
90
97
  });
98
+ export const openUiFileSchema = z.object({
99
+ type: z.literal('nuwax.openui-file'),
100
+ schemaVersion: z.literal(OPENUI_FILE_SCHEMA_VERSION),
101
+ artifactId: z.string().uuid(),
102
+ title: z.string(),
103
+ presentation: z.object({
104
+ mode: z.enum(['inline', 'sidecar']),
105
+ autoOpen: z.boolean(),
106
+ preferredWidth: z.enum(['compact', 'normal', 'wide']).optional(),
107
+ }),
108
+ document: z.object({
109
+ language: z.literal('openui-lang'),
110
+ specVersion: z.literal(OPENUI_LANG_VERSION),
111
+ source: z.string(),
112
+ digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
113
+ }),
114
+ bindings: z.object({
115
+ tools: z.array(bindingSchema),
116
+ }),
117
+ fallback: z.object({
118
+ markdown: z.string(),
119
+ }),
120
+ createdAt: z.string().datetime(),
121
+ updatedAt: z.string().datetime(),
122
+ });
123
+ export const openUiArtifactRefSchema = z.object({
124
+ type: z.literal('nuwax.openui-ref'),
125
+ schemaVersion: z.literal(OPENUI_REF_SCHEMA_VERSION),
126
+ artifactId: z.string().uuid(),
127
+ path: z.string().regex(/^data\/[0-9a-f-]{36}\.openui\.json$/),
128
+ title: z.string(),
129
+ presentation: openUiFileSchema.shape.presentation,
130
+ digest: z.string().regex(/^sha256:[a-f0-9]{64}$/),
131
+ operation: z.enum(['created', 'updated']),
132
+ });
91
133
  //# sourceMappingURL=contracts.js.map
@@ -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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"}
@@ -4,5 +4,6 @@ export * from './version.js';
4
4
  export * from './mcp-server.js';
5
5
  export * from './openui-validator.js';
6
6
  export * from './policy.js';
7
+ export * from './project-root.js';
7
8
  export * from './render-service.js';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC"}
@@ -4,5 +4,6 @@ export * from './version.js';
4
4
  export * from './mcp-server.js';
5
5
  export * from './openui-validator.js';
6
6
  export * from './policy.js';
7
+ export * from './project-root.js';
7
8
  export * from './render-service.js';
8
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC"}
@@ -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;AAgBpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,mBAAmB,GACjC,SAAS,CAsJX"}
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoBpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,mBAAmB,GACjC,SAAS,CAkJX"}
@@ -1,8 +1,8 @@
1
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import { z } from 'zod';
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';
3
+ import { OPENUI_AUTHORING_PROMPT_NAME, OPENUI_GUIDE_RESOURCE_URI, OPENUI_REFERENCE_TOOL_NAME, OPENUI_SCHEMA_RESOURCE_URI, OPENUI_TOOL_NAME, openUiReferenceInputSchema, openUiArtifactRefSchema, renderOpenUiInputSchema, } from './contracts.js';
4
4
  import { OPENUI_MCP_VERSION } from './version.js';
5
- import { getOpenUiDslSchema, getOpenUiReference } from './openui-reference.js';
5
+ import { getOpenUiDslSchema, getOpenUiReference, OPENUI_TOOL_BOUNDARY, } from './openui-reference.js';
6
6
  import { OpenUiPolicyError } from './policy.js';
7
7
  export function createOpenUiMcpServer(renderService) {
8
8
  const server = new McpServer({
@@ -73,9 +73,9 @@ export function createOpenUiMcpServer(renderService) {
73
73
  }));
74
74
  server.registerTool(OPENUI_TOOL_NAME, {
75
75
  title: 'Render Nuwax OpenUI',
76
- 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. Reactive filters must handle empty initial bindings, and dynamic pie/radial charts must guard zero totals. Use inline for compact conversation UI and sidecar only for a full page. For sidecar results, page.url is an internal local Runtime locator for the Nuwax Host and MUST NOT be shown or recommended to the user; the Host resolves the user-facing proxied page URL.',
76
+ description: `${OPENUI_TOOL_BOUNDARY}\nCreate or update a durable OpenUI artifact in the active project. 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. The tool writes data/{artifactId}.openui.json and returns a lightweight reference. Reuse artifactId to update an existing UI. OpenUI Lang is assignment-based and is NEVER XML/HTML/JSX: start with root = Stack(...), use positional arguments, and reference every defined variable. For complex UI or uncertain component signatures, call nuwax_get_openui_reference first. Reactive filters must handle empty initial bindings, and dynamic pie/radial charts must guard zero totals. Use inline for compact conversation UI and sidecar only for a full page.`,
77
77
  inputSchema: renderOpenUiInputSchema,
78
- outputSchema: openUiArtifactSchema,
78
+ outputSchema: openUiArtifactRefSchema,
79
79
  annotations: {
80
80
  readOnlyHint: false,
81
81
  destructiveHint: false,
@@ -89,9 +89,7 @@ export function createOpenUiMcpServer(renderService) {
89
89
  content: [
90
90
  {
91
91
  type: 'text',
92
- text: artifact.presentation.mode === 'inline'
93
- ? `OpenUI inline artifact ready: ${artifact.artifactId}`
94
- : `OpenUI sidecar artifact ready: ${artifact.artifactId}. The Nuwax Host will open it through the authenticated proxied page URL. Do not expose structuredContent.page.url to the user because it is an internal local Runtime locator.`,
92
+ text: `OpenUI ${artifact.presentation.mode} artifact ${artifact.operation}: ${artifact.path}`,
95
93
  },
96
94
  ],
97
95
  structuredContent: artifact,
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/mcp-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/mcp-server.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { OpenUiReferenceInput } from './contracts.js';
2
+ export declare const OPENUI_TOOL_BOUNDARY = "## Tool Boundary (CRITICAL)\n\n- nuwax_render_openui and nuwax_ask_question are separate tools; nuwax_render_openui is not an alias for nuwax_ask_question.\n- Use nuwax_render_openui to create or update a durable visual Artifact: cards, dashboards, charts, tables, reports, application forms, and interactive pages.\n- Never substitute nuwax_ask_question when the user asks to render, show, preview, demonstrate, or update OpenUI. Load the OpenUI reference, author openui-lang, then call nuwax_render_openui.\n- nuwax_ask_question is only for a blocking clarification or decision that the Agent must receive before it can continue. Its inline/modal/wizard schema is not OpenUI Lang and must never be passed to nuwax_render_openui.\n";
2
3
  export declare function getOpenUiReference(profile: OpenUiReferenceInput['profile']): string;
3
4
  export declare function getOpenUiDslSchema(): string;
4
5
  //# sourceMappingURL=openui-reference.d.ts.map
@@ -1 +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;AA6B3D,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,oBAAoB,CAAC,SAAS,CAAC,GACvC,MAAM,CAMR;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
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,eAAO,MAAM,oBAAoB,iuBAMhC,CAAC;AAoBF,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,oBAAoB,CAAC,SAAS,CAAC,GACvC,MAAM,CAMR;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
@@ -5,6 +5,13 @@ const PROFILE_FOCUS = {
5
5
  form: 'Focus on Form, FormControl, input components, Buttons/Action, validation rules, bindings, and Modal.',
6
6
  all: 'Use any documented component, but prefer the smallest set that satisfies the request.',
7
7
  };
8
+ export const OPENUI_TOOL_BOUNDARY = `## Tool Boundary (CRITICAL)
9
+
10
+ - nuwax_render_openui and nuwax_ask_question are separate tools; nuwax_render_openui is not an alias for nuwax_ask_question.
11
+ - Use nuwax_render_openui to create or update a durable visual Artifact: cards, dashboards, charts, tables, reports, application forms, and interactive pages.
12
+ - Never substitute nuwax_ask_question when the user asks to render, show, preview, demonstrate, or update OpenUI. Load the OpenUI reference, author openui-lang, then call nuwax_render_openui.
13
+ - nuwax_ask_question is only for a blocking clarification or decision that the Agent must receive before it can continue. Its inline/modal/wizard schema is not OpenUI Lang and must never be passed to nuwax_render_openui.
14
+ `;
8
15
  const REACTIVE_DASHBOARD_GUARDRAILS = `## Nuwax Reactive Dashboard Guardrails (CRITICAL)
9
16
 
10
17
  - Reactive input and select bindings start with an empty value. An optional filter MUST bypass @Filter until its binding is non-empty.
@@ -22,7 +29,7 @@ export function getOpenUiReference(profile) {
22
29
  const guardrails = profile === 'dashboard' || profile === 'all'
23
30
  ? `\n\n${REACTIVE_DASHBOARD_GUARDRAILS}`
24
31
  : '';
25
- return `Authoring profile: ${profile}. ${PROFILE_FOCUS[profile]}\nDo not emit XML, HTML, JSX, markdown fences, or explanations inside document.source.${guardrails}\n\n${normalizeGeneratedReference(openuiLibrary.prompt({}))}`;
32
+ return `${OPENUI_TOOL_BOUNDARY}\nAuthoring profile: ${profile}. ${PROFILE_FOCUS[profile]}\nDo not emit XML, HTML, JSX, markdown fences, or explanations inside document.source.${guardrails}\n\n${normalizeGeneratedReference(openuiLibrary.prompt({}))}`;
26
33
  }
27
34
  export function getOpenUiDslSchema() {
28
35
  return JSON.stringify(openuiLibrary.toJSONSchema(), null, 2);
@@ -1 +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,6BAA6B,GAAG;;;;;;;;;CASrC,CAAC;AAEF,SAAS,2BAA2B,CAAC,SAAiB;IACpD,OAAO,SAAS,CAAC,OAAO,CACtB,kGAAkG,EAClG,qKAAqK,CACtK,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,OAAwC;IAExC,MAAM,UAAU,GACd,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,KAAK;QAC1C,CAAC,CAAC,OAAO,6BAA6B,EAAE;QACxC,CAAC,CAAC,EAAE,CAAC;IACT,OAAO,sBAAsB,OAAO,KAAK,aAAa,CAAC,OAAO,CAAC,yFAAyF,UAAU,OAAO,2BAA2B,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACnO,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC/D,CAAC"}
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,CAAC,MAAM,oBAAoB,GAAG;;;;;;CAMnC,CAAC;AAEF,MAAM,6BAA6B,GAAG;;;;;;;;;CASrC,CAAC;AAEF,SAAS,2BAA2B,CAAC,SAAiB;IACpD,OAAO,SAAS,CAAC,OAAO,CACtB,kGAAkG,EAClG,qKAAqK,CACtK,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,OAAwC;IAExC,MAAM,UAAU,GACd,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,KAAK;QAC1C,CAAC,CAAC,OAAO,6BAA6B,EAAE;QACxC,CAAC,CAAC,EAAE,CAAC;IACT,OAAO,GAAG,oBAAoB,wBAAwB,OAAO,KAAK,aAAa,CAAC,OAAO,CAAC,yFAAyF,UAAU,OAAO,2BAA2B,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC5P,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface McpRootProvider {
2
+ (): Promise<Array<{
3
+ uri: string;
4
+ }>>;
5
+ }
6
+ export declare function createProjectRootResolver(options: {
7
+ env?: NodeJS.ProcessEnv;
8
+ cwd?: string;
9
+ listRoots?: McpRootProvider;
10
+ }): () => Promise<string>;
11
+ //# sourceMappingURL=project-root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-root.d.ts","sourceRoot":"","sources":["../../src/project-root.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;CACrC;AAgBD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B,SAIkB,OAAO,CAAC,MAAM,CAAC,CA8BjC"}
@@ -0,0 +1,51 @@
1
+ import { realpath, stat } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ async function validDirectory(candidate) {
5
+ try {
6
+ const resolved = await realpath(path.resolve(candidate));
7
+ if (!(await stat(resolved)).isDirectory())
8
+ return undefined;
9
+ return resolved;
10
+ }
11
+ catch {
12
+ return undefined;
13
+ }
14
+ }
15
+ function looksLikeInstalledPackage(candidate) {
16
+ return /node_modules[\\/]@nuwax-ai[\\/]openui-mcp(?:[\\/]|$)/.test(candidate);
17
+ }
18
+ export function createProjectRootResolver(options) {
19
+ const env = options.env ?? process.env;
20
+ const cwd = options.cwd ?? process.cwd();
21
+ return async () => {
22
+ const explicit = env.NUWAX_OPENUI_PROJECT_ROOT;
23
+ if (explicit) {
24
+ const resolved = await validDirectory(explicit);
25
+ if (!resolved)
26
+ throw new Error(`Invalid NUWAX_OPENUI_PROJECT_ROOT: ${explicit}`);
27
+ return resolved;
28
+ }
29
+ if (options.listRoots) {
30
+ try {
31
+ const roots = await options.listRoots();
32
+ for (const root of roots) {
33
+ if (!root.uri.startsWith('file:'))
34
+ continue;
35
+ const resolved = await validDirectory(fileURLToPath(root.uri));
36
+ if (resolved)
37
+ return resolved;
38
+ }
39
+ }
40
+ catch {
41
+ // Roots are optional. A session-scoped MCP normally inherits the project cwd.
42
+ }
43
+ }
44
+ const resolvedCwd = await validDirectory(cwd);
45
+ if (!resolvedCwd || looksLikeInstalledPackage(resolvedCwd)) {
46
+ throw new Error('Unable to resolve the active project directory. Run this MCP per Agent session, expose an MCP file root, or set NUWAX_OPENUI_PROJECT_ROOT.');
47
+ }
48
+ return resolvedCwd;
49
+ };
50
+ }
51
+ //# sourceMappingURL=project-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-root.js","sourceRoot":"","sources":["../../src/project-root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAMzC,KAAK,UAAU,cAAc,CAAC,SAAiB;IAC7C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE;YAAE,OAAO,SAAS,CAAC;QAC5D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,SAAiB;IAClD,OAAO,sDAAsD,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAIzC;IACC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEzC,OAAO,KAAK,IAAqB,EAAE;QACjC,MAAM,QAAQ,GAAG,GAAG,CAAC,yBAAyB,CAAC;QAC/C,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;YAChD,IAAI,CAAC,QAAQ;gBACX,MAAM,IAAI,KAAK,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAC;YACpE,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;gBACxC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;wBAAE,SAAS;oBAC5C,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC/D,IAAI,QAAQ;wBAAE,OAAO,QAAQ,CAAC;gBAChC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,8EAA8E;YAChF,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC,WAAW,IAAI,yBAAyB,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CACb,4IAA4I,CAC7I,CAAC;QACJ,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC,CAAC;AACJ,CAAC"}
@@ -1,13 +1,8 @@
1
- import { type OpenUiArtifact } from './contracts.js';
1
+ import { type OpenUiArtifactRef } from './contracts.js';
2
2
  import type { ArtifactStore } from './artifact-store.js';
3
- export interface RenderServiceOptions {
4
- baseUrl: string;
5
- artifactTtlSeconds: number;
6
- }
7
3
  export declare class RenderOpenUiService {
8
4
  private readonly store;
9
- private readonly options;
10
- constructor(store: ArtifactStore, options: RenderServiceOptions);
11
- render(rawInput: unknown): Promise<OpenUiArtifact>;
5
+ constructor(store: ArtifactStore);
6
+ render(rawInput: unknown): Promise<OpenUiArtifactRef>;
12
7
  }
13
8
  //# sourceMappingURL=render-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"render-service.d.ts","sourceRoot":"","sources":["../../src/render-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,cAAc,EAEpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAUD,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,oBAAoB;IAG1C,MAAM,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;CAwCzD"}
1
+ {"version":3,"file":"render-service.d.ts","sourceRoot":"","sources":["../../src/render-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,iBAAiB,EAGvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAQzD,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,aAAa;IAE3C,MAAM,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAsC5D"}
@@ -1,30 +1,25 @@
1
1
  import { createHash, randomUUID } from 'node:crypto';
2
- import { openUiArtifactSchema, renderOpenUiInputSchema, } from './contracts.js';
2
+ import { OPENUI_FILE_SCHEMA_VERSION, openUiArtifactRefSchema, openUiFileSchema, renderOpenUiInputSchema, } from './contracts.js';
3
3
  import { validateOpenUiDocument } from './openui-validator.js';
4
4
  import { enforceOpenUiPolicy } from './policy.js';
5
5
  function createDigest(source) {
6
6
  return `sha256:${createHash('sha256').update(source).digest('hex')}`;
7
7
  }
8
- function trimTrailingSlash(value) {
9
- return value.replace(/\/+$/, '');
10
- }
11
8
  export class RenderOpenUiService {
12
9
  store;
13
- options;
14
- constructor(store, options) {
10
+ constructor(store) {
15
11
  this.store = store;
16
- this.options = options;
17
12
  }
18
13
  async render(rawInput) {
19
14
  const input = renderOpenUiInputSchema.parse(rawInput);
20
15
  enforceOpenUiPolicy(input);
21
16
  validateOpenUiDocument(input.document.source);
22
- const artifactId = randomUUID();
23
- const createdAt = new Date();
24
- const expiresAt = new Date(createdAt.getTime() + this.options.artifactTtlSeconds * 1_000);
17
+ const artifactId = input.artifactId ?? randomUUID();
18
+ const existing = await this.store.get(artifactId);
19
+ const now = new Date().toISOString();
25
20
  const artifact = {
26
- type: 'nuwax.openui',
27
- schemaVersion: input.schemaVersion,
21
+ type: 'nuwax.openui-file',
22
+ schemaVersion: OPENUI_FILE_SCHEMA_VERSION,
28
23
  artifactId,
29
24
  title: input.title,
30
25
  presentation: input.presentation,
@@ -34,21 +29,21 @@ export class RenderOpenUiService {
34
29
  },
35
30
  bindings: input.bindings,
36
31
  fallback: input.fallback,
37
- createdAt: createdAt.toISOString(),
38
- expiresAt: expiresAt.toISOString(),
39
- ...(input.presentation.mode === 'sidecar'
40
- ? {
41
- page: {
42
- url: `${trimTrailingSlash(this.options.baseUrl)}/openui/pages/${artifactId}`,
43
- expiresAt: expiresAt.toISOString(),
44
- sandboxProfile: 'openui-sidecar-v1',
45
- },
46
- }
47
- : {}),
32
+ createdAt: existing?.createdAt ?? now,
33
+ updatedAt: now,
48
34
  };
49
- const validatedArtifact = openUiArtifactSchema.parse(artifact);
50
- await this.store.put(validatedArtifact);
51
- return validatedArtifact;
35
+ const validatedArtifact = openUiFileSchema.parse(artifact);
36
+ const operation = await this.store.put(validatedArtifact);
37
+ return openUiArtifactRefSchema.parse({
38
+ type: 'nuwax.openui-ref',
39
+ schemaVersion: 'nuwax.openui-ref/v1',
40
+ artifactId,
41
+ path: `data/${artifactId}.openui.json`,
42
+ title: validatedArtifact.title,
43
+ presentation: validatedArtifact.presentation,
44
+ digest: validatedArtifact.document.digest,
45
+ operation,
46
+ });
52
47
  }
53
48
  }
54
49
  //# sourceMappingURL=render-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"render-service.js","sourceRoot":"","sources":["../../src/render-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EACL,oBAAoB,EACpB,uBAAuB,GAGxB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAOlD,SAAS,YAAY,CAAC,MAAc;IAClC,OAAO,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,OAAO,mBAAmB;IAEX;IACA;IAFnB,YACmB,KAAoB,EACpB,OAA6B;QAD7B,UAAK,GAAL,KAAK,CAAe;QACpB,YAAO,GAAP,OAAO,CAAsB;IAC7C,CAAC;IAEJ,KAAK,CAAC,MAAM,CAAC,QAAiB;QAC5B,MAAM,KAAK,GAAsB,uBAAuB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzE,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC3B,sBAAsB,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE9C,MAAM,UAAU,GAAG,UAAU,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,IAAI,IAAI,CACxB,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,GAAG,KAAK,CAC9D,CAAC;QAEF,MAAM,QAAQ,GAAmB;YAC/B,IAAI,EAAE,cAAc;YACpB,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,UAAU;YACV,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,QAAQ,EAAE;gBACR,GAAG,KAAK,CAAC,QAAQ;gBACjB,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;aAC5C;YACD,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,SAAS,CAAC,WAAW,EAAE;YAClC,SAAS,EAAE,SAAS,CAAC,WAAW,EAAE;YAClC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,KAAK,SAAS;gBACvC,CAAC,CAAC;oBACE,IAAI,EAAE;wBACJ,GAAG,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,UAAU,EAAE;wBAC5E,SAAS,EAAE,SAAS,CAAC,WAAW,EAAE;wBAClC,cAAc,EAAE,mBAA4B;qBAC7C;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;QAEF,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/D,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACxC,OAAO,iBAAiB,CAAC;IAC3B,CAAC;CACF"}
1
+ {"version":3,"file":"render-service.js","sourceRoot":"","sources":["../../src/render-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,gBAAgB,EAChB,uBAAuB,GAIxB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,SAAS,YAAY,CAAC,MAAc;IAClC,OAAO,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACvE,CAAC;AAED,MAAM,OAAO,mBAAmB;IACD;IAA7B,YAA6B,KAAoB;QAApB,UAAK,GAAL,KAAK,CAAe;IAAG,CAAC;IAErD,KAAK,CAAC,MAAM,CAAC,QAAiB;QAC5B,MAAM,KAAK,GAAsB,uBAAuB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzE,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC3B,sBAAsB,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE9C,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,UAAU,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,MAAM,QAAQ,GAAe;YAC3B,IAAI,EAAE,mBAAmB;YACzB,aAAa,EAAE,0BAA0B;YACzC,UAAU;YACV,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,QAAQ,EAAE;gBACR,GAAG,KAAK,CAAC,QAAQ;gBACjB,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;aAC5C;YACD,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,GAAG;YACrC,SAAS,EAAE,GAAG;SACf,CAAC;QAEF,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC1D,OAAO,uBAAuB,CAAC,KAAK,CAAC;YACnC,IAAI,EAAE,kBAAkB;YACxB,aAAa,EAAE,qBAAqB;YACpC,UAAU;YACV,IAAI,EAAE,QAAQ,UAAU,cAAc;YACtC,KAAK,EAAE,iBAAiB,CAAC,KAAK;YAC9B,YAAY,EAAE,iBAAiB,CAAC,YAAY;YAC5C,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,MAAM;YACzC,SAAS;SACV,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -1,8 +1,7 @@
1
- import { InMemoryArtifactStore } from './artifact-store.js';
2
- import type { AppConfig } from './config.js';
1
+ import { FileArtifactStore, type ProjectRootResolver } from './artifact-store.js';
3
2
  import { RenderOpenUiService } from './render-service.js';
4
- export declare function createRuntime(config: AppConfig): {
5
- store: InMemoryArtifactStore;
3
+ export declare function createRuntime(resolveProjectRoot: ProjectRootResolver): {
4
+ store: FileArtifactStore;
6
5
  renderService: RenderOpenUiService;
7
6
  };
8
7
  export type OpenUiRuntime = ReturnType<typeof createRuntime>;
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS;;;EAQ9C;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,mBAAmB,EACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,wBAAgB,aAAa,CAAC,kBAAkB,EAAE,mBAAmB;;;EAKpE;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC"}
@@ -1,11 +1,8 @@
1
- import { InMemoryArtifactStore } from './artifact-store.js';
1
+ import { FileArtifactStore, } from './artifact-store.js';
2
2
  import { RenderOpenUiService } from './render-service.js';
3
- export function createRuntime(config) {
4
- const store = new InMemoryArtifactStore();
5
- const renderService = new RenderOpenUiService(store, {
6
- baseUrl: config.baseUrl,
7
- artifactTtlSeconds: config.artifactTtlSeconds,
8
- });
3
+ export function createRuntime(resolveProjectRoot) {
4
+ const store = new FileArtifactStore(resolveProjectRoot);
5
+ const renderService = new RenderOpenUiService(store);
9
6
  return { store, renderService };
10
7
  }
11
8
  //# sourceMappingURL=runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,UAAU,aAAa,CAAC,MAAiB;IAC7C,MAAM,KAAK,GAAG,IAAI,qBAAqB,EAAE,CAAC;IAC1C,MAAM,aAAa,GAAG,IAAI,mBAAmB,CAAC,KAAK,EAAE;QACnD,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;KAC9C,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAElB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,UAAU,aAAa,CAAC,kBAAuC;IACnE,MAAM,KAAK,GAAG,IAAI,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAErD,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;AAClC,CAAC"}
@@ -1,23 +1,22 @@
1
1
  #!/usr/bin/env node
2
2
  import 'dotenv/config';
3
3
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
- import { loadConfig } from './config.js';
5
- import { closeHttpServer, startHttpServer } from './http-server.js';
6
4
  import { createOpenUiMcpServer } from './mcp-server.js';
5
+ import { createProjectRootResolver } from './project-root.js';
7
6
  import { createRuntime } from './runtime.js';
8
- const config = loadConfig();
9
- const runtime = createRuntime(config);
10
- const sidecarServer = config.sidecarServerEnabled
11
- ? await startHttpServer({ config, runtime })
12
- : null;
7
+ const resolveProjectRoot = createProjectRootResolver({
8
+ listRoots: async () => {
9
+ const result = await server.server.listRoots();
10
+ return result.roots;
11
+ },
12
+ });
13
+ const runtime = createRuntime(resolveProjectRoot);
13
14
  const { renderService } = runtime;
14
15
  const server = createOpenUiMcpServer(renderService);
15
16
  const transport = new StdioServerTransport();
16
17
  await server.connect(transport);
17
18
  async function shutdown() {
18
19
  await server.close();
19
- if (sidecarServer)
20
- await closeHttpServer(sidecarServer);
21
20
  }
22
21
  process.on('SIGINT', () => {
23
22
  void shutdown().finally(() => process.exit(0));
@@ -1 +1 @@
1
- {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/stdio.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AAEvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAC5B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;AACtC,MAAM,aAAa,GAAG,MAAM,CAAC,oBAAoB;IAC/C,CAAC,CAAC,MAAM,eAAe,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC5C,CAAC,CAAC,IAAI,CAAC;AACT,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;AAClC,MAAM,MAAM,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;AACpD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAEhC,KAAK,UAAU,QAAQ;IACrB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,IAAI,aAAa;QAAE,MAAM,eAAe,CAAC,aAAa,CAAC,CAAC;AAC1D,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,KAAK,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,KAAK,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/stdio.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AAEvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,kBAAkB,GAAG,yBAAyB,CAAC;IACnD,SAAS,EAAE,KAAK,IAAI,EAAE;QACpB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAC/C,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;CACF,CAAC,CAAC;AACH,MAAM,OAAO,GAAG,aAAa,CAAC,kBAAkB,CAAC,CAAC;AAClD,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;AAClC,MAAM,MAAM,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;AACpD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAEhC,KAAK,UAAU,QAAQ;IACrB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,KAAK,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,KAAK,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const OPENUI_MCP_VERSION = "0.1.12";
1
+ export declare const OPENUI_MCP_VERSION = "0.2.1";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,WAAW,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,UAAU,CAAC"}
@@ -1,2 +1,2 @@
1
- export const OPENUI_MCP_VERSION = '0.1.12';
1
+ export const OPENUI_MCP_VERSION = '0.2.1';
2
2
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC"}