@maravilla-labs/functions 0.10.3 → 0.11.0
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/mcp/build.d.ts.map +1 -1
- package/dist/mcp/build.js +46 -27
- package/dist/mcp/build.js.map +1 -1
- package/dist/mcp/types.d.ts +5 -0
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/widgets.d.ts +56 -0
- package/dist/mcp/widgets.d.ts.map +1 -0
- package/dist/mcp/widgets.js +219 -0
- package/dist/mcp/widgets.js.map +1 -0
- package/package.json +3 -2
package/dist/mcp/build.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/mcp/build.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/mcp/build.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EAKZ,MAAM,YAAY,CAAC;AAkDpB;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAqGzF;AA6FD;;;;;;;;;;;;+CAY+C;AAC/C,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,WAAW,GAAG,IAAI,GAC9B,OAAO,CAAC,IAAI,CAAC,CAmCf"}
|
package/dist/mcp/build.js
CHANGED
|
@@ -4,36 +4,43 @@ import { pathToFileURL } from 'node:url';
|
|
|
4
4
|
import * as esbuild from 'esbuild';
|
|
5
5
|
import { discoverMcpSources } from './discover.js';
|
|
6
6
|
import { generateMcpEntry } from './generator.js';
|
|
7
|
+
import { buildMcpWidgets } from './widgets.js';
|
|
7
8
|
/**
|
|
8
|
-
* Resolve each template
|
|
9
|
+
* Resolve each template to a deploy-relative `htmlAsset` the runtime reads.
|
|
9
10
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* static asset
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
11
|
+
* Priority: an **auto-built** widget (compiled by {@link buildMcpWidgets} from
|
|
12
|
+
* `mcp-ui/<name>/` source into `static/mcp-ui/<name>.html`) wins; otherwise we
|
|
13
|
+
* fall back to a **legacy** `htmlPath` the tenant built themselves into their
|
|
14
|
+
* static assets. Either way the asset lives under the deploy static dir — listed
|
|
15
|
+
* in `routing.assets`, uploaded, and served. The runtime reads those bytes via
|
|
16
|
+
* the same `FileResolver` that loads `mcp.js` and serves them inline as the
|
|
17
|
+
* `ui://` resource. We do NOT copy: a build-root copy would be neither a
|
|
18
|
+
* `routing.assets` entry nor a registered bundle, so the deploy would never ship
|
|
19
|
+
* it. We only normalize + warn (never throw — a throw would disable the whole MCP
|
|
20
|
+
* build) when nothing resolves.
|
|
19
21
|
*/
|
|
20
|
-
async function resolveUiTemplates(raw, outDir) {
|
|
22
|
+
async function resolveUiTemplates(raw, outDir, built) {
|
|
21
23
|
return Promise.all(raw.map(async (t) => {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
// 1) Auto-built from source (the convention path).
|
|
25
|
+
const autobuilt = built.get(t.name);
|
|
26
|
+
if (autobuilt) {
|
|
27
|
+
return { name: t.name, htmlAsset: autobuilt, csp: t.csp };
|
|
25
28
|
}
|
|
26
|
-
//
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
29
|
+
// 2) Legacy: a pre-built single-file the tenant points htmlPath at.
|
|
30
|
+
if (t.htmlPath) {
|
|
31
|
+
const htmlAsset = t.htmlPath.replace(/^\.?\/+/, '');
|
|
32
|
+
try {
|
|
33
|
+
await fs.access(join(outDir, htmlAsset));
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
console.warn(`⚠️ MCP uiTemplate "${t.name}": widget not found at "${htmlAsset}" in the build output.`);
|
|
37
|
+
}
|
|
38
|
+
return { name: t.name, htmlAsset, csp: t.csp };
|
|
35
39
|
}
|
|
36
|
-
|
|
40
|
+
// 3) Neither — no source folder and no htmlPath.
|
|
41
|
+
console.warn(`⚠️ MCP uiTemplate "${t.name}": no widget source found. Create mcp-ui/${t.name}/ ` +
|
|
42
|
+
`(or src/mcp-ui/${t.name}/) with an index.html + component, or set htmlPath to a pre-built file.`);
|
|
43
|
+
return { name: t.name, htmlAsset: '', csp: t.csp };
|
|
37
44
|
}));
|
|
38
45
|
}
|
|
39
46
|
/**
|
|
@@ -45,7 +52,7 @@ async function resolveUiTemplates(raw, outDir) {
|
|
|
45
52
|
* `globalThis.handleRequest`) + ESM introspection for `mcp.json`.
|
|
46
53
|
*/
|
|
47
54
|
export async function buildMcp(options = {}) {
|
|
48
|
-
const { projectDir = process.cwd(), outputDir = '.maravilla', minify = false, sourcemap = false, production = false, } = options;
|
|
55
|
+
const { projectDir = process.cwd(), outputDir = '.maravilla', minify = false, sourcemap = false, production = false, framework, staticDir = 'static', } = options;
|
|
49
56
|
const resolvedProject = resolve(projectDir);
|
|
50
57
|
const resolvedOut = resolve(outputDir);
|
|
51
58
|
const sources = await discoverMcpSources(resolvedProject);
|
|
@@ -90,9 +97,21 @@ export async function buildMcp(options = {}) {
|
|
|
90
97
|
});
|
|
91
98
|
const { server, tools, uiTemplates: rawUiTemplates, serverPublic } = await introspect(esmIntrospectPath);
|
|
92
99
|
await fs.rm(tempDir, { recursive: true, force: true });
|
|
100
|
+
// Auto-build each declared widget from its source (mcp-ui/<name>/) into the
|
|
101
|
+
// deploy static dir. Framework-agnostic: resolves the tenant's framework Vite
|
|
102
|
+
// plugin + Tailwind, runs vite-plugin-singlefile. Templates with no source are
|
|
103
|
+
// absent from the map → resolveUiTemplates falls back to their legacy htmlPath.
|
|
104
|
+
const built = await buildMcpWidgets({
|
|
105
|
+
projectDir: resolvedProject,
|
|
106
|
+
outDir: resolvedOut,
|
|
107
|
+
staticDir,
|
|
108
|
+
framework,
|
|
109
|
+
production,
|
|
110
|
+
templates: rawUiTemplates.map((t) => ({ name: t.name, entry: t.entry, htmlPath: t.htmlPath })),
|
|
111
|
+
});
|
|
93
112
|
// Resolve each template's static-asset widget path; the runtime reads these
|
|
94
113
|
// bytes at bootstrap (same FileResolver as mcp.js) and serves them inline.
|
|
95
|
-
const uiTemplates = await resolveUiTemplates(rawUiTemplates, resolvedOut);
|
|
114
|
+
const uiTemplates = await resolveUiTemplates(rawUiTemplates, resolvedOut, built);
|
|
96
115
|
const manifest = {
|
|
97
116
|
version: 1,
|
|
98
117
|
bundle: 'mcp.js',
|
|
@@ -138,7 +157,7 @@ async function introspect(bundlePath) {
|
|
|
138
157
|
};
|
|
139
158
|
const serverPublic = serverSpec.public === true;
|
|
140
159
|
const uiTemplates = Array.isArray(serverSpec.uiTemplates)
|
|
141
|
-
? serverSpec.uiTemplates.map((t) => ({ name: t.name, htmlPath: t.htmlPath, csp: t.csp }))
|
|
160
|
+
? serverSpec.uiTemplates.map((t) => ({ name: t.name, entry: t.entry, htmlPath: t.htmlPath, csp: t.csp }))
|
|
142
161
|
: [];
|
|
143
162
|
const tools = list.tools.map((entry) => {
|
|
144
163
|
const spec = entry.spec || {};
|
package/dist/mcp/build.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/mcp/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/mcp/build.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/types.d.ts
CHANGED
|
@@ -75,6 +75,11 @@ export interface BuildMcpOptions {
|
|
|
75
75
|
minify?: boolean;
|
|
76
76
|
sourcemap?: boolean;
|
|
77
77
|
production?: boolean;
|
|
78
|
+
/** Framework id the adapter passes (`svelte` | `react` | `vue` | ...), used to
|
|
79
|
+
* auto-build MCP UI widgets from source. Omit to disable widget auto-build. */
|
|
80
|
+
framework?: string;
|
|
81
|
+
/** Manifest static-dir name (default `static`); where auto-built widgets land. */
|
|
82
|
+
staticDir?: string;
|
|
78
83
|
}
|
|
79
84
|
export interface DiscoveredMcpSource {
|
|
80
85
|
/** Absolute path on disk. */
|
package/dist/mcp/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAAA;;;8EAG8E;AAE9E,yEAAyE;AACzE,MAAM,WAAW,SAAS;IACxB,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,oEAAoE;AACpE,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oEAAoE;IACpE,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,sFAAsF;AACtF,MAAM,WAAW,gBAAgB;IAC/B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;;4BAG4B;AAC5B,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb;uEACmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,GAAG,CAAC,EAAE,gBAAgB,CAAC;CACxB;AAED,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,oFAAoF;AACpF,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC;oFACgF;IAChF,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAAA;;;8EAG8E;AAE9E,yEAAyE;AACzE,MAAM,WAAW,SAAS;IACxB,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,oEAAoE;AACpE,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oEAAoE;IACpE,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,sFAAsF;AACtF,MAAM,WAAW,gBAAgB;IAC/B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;;4BAG4B;AAC5B,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb;uEACmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,GAAG,CAAC,EAAE,gBAAgB,CAAC;CACxB;AAED,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,oFAAoF;AACpF,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC;oFACgF;IAChF,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;oFACgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-build MCP UI mini-app widgets — the framework-agnostic counterpart to
|
|
3
|
+
* the esbuild server bundle in {@link buildMcp}.
|
|
4
|
+
*
|
|
5
|
+
* An MCP widget is the platform's only *client* artifact: a self-contained
|
|
6
|
+
* single-file HTML the runtime serves inline as the `ui://<tool>/<template>`
|
|
7
|
+
* resource (MCP Apps). Unlike `functions`/`events`/`mcp` (framework-agnostic
|
|
8
|
+
* server esbuild bundles), it needs the tenant framework's component compiler
|
|
9
|
+
* (Svelte/React/Vue) + Tailwind + `vite-plugin-singlefile`. So instead of
|
|
10
|
+
* making every tenant hand-write a second Vite config + a `build:mcp-ui`
|
|
11
|
+
* script, we build it here automatically:
|
|
12
|
+
*
|
|
13
|
+
* - discover the widget source by convention (`mcp-ui/<name>/index.html` or
|
|
14
|
+
* `src/mcp-ui/<name>/index.html`, or an explicit `entry`),
|
|
15
|
+
* - resolve the framework's leaf Vite plugin + (optional) Tailwind FROM THE
|
|
16
|
+
* TENANT's `node_modules` (the adapter only tells us the framework id —
|
|
17
|
+
* neither adapter ships a component plugin), `vite-plugin-singlefile` is our
|
|
18
|
+
* own dependency,
|
|
19
|
+
* - run a programmatic `vite.build()` rooted at the project so Tailwind v4's
|
|
20
|
+
* automatic content detection scans all of `src/` (no `@source` needed),
|
|
21
|
+
* - emit one self-contained `<staticDir>/mcp-ui/<name>.html` into the deploy
|
|
22
|
+
* output, where {@link resolveUiTemplates} + `integrateMcpWithManifest`
|
|
23
|
+
* pick it up unchanged (the `routing.assets` registration from 0.10.2).
|
|
24
|
+
*
|
|
25
|
+
* The runtime needs no change: it already serves the manifest's `htmlAsset`.
|
|
26
|
+
*/
|
|
27
|
+
export interface WidgetTemplateInput {
|
|
28
|
+
name: string;
|
|
29
|
+
/** Explicit source entry (project-relative dir or `index.html`). Optional. */
|
|
30
|
+
entry?: string;
|
|
31
|
+
/** Legacy: a pre-built single-file under `static/`. If set and no source
|
|
32
|
+
* folder exists, we leave it for the legacy htmlPath path (no auto-build). */
|
|
33
|
+
htmlPath?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface BuildMcpWidgetsOptions {
|
|
36
|
+
projectDir: string;
|
|
37
|
+
/** Deploy output dir (e.g. `.maravilla`). Widgets land in `<outDir>/<staticDir>/mcp-ui`. */
|
|
38
|
+
outDir: string;
|
|
39
|
+
/** Manifest static dir name (default `static`). */
|
|
40
|
+
staticDir?: string;
|
|
41
|
+
/** Framework id the adapter passes (`svelte` | `react` | `vue` | ...). */
|
|
42
|
+
framework?: string;
|
|
43
|
+
/** The declared uiTemplates (name + optional entry/htmlPath). */
|
|
44
|
+
templates: WidgetTemplateInput[];
|
|
45
|
+
production?: boolean;
|
|
46
|
+
}
|
|
47
|
+
/** Map of template name → deploy-relative `htmlAsset` for widgets we built. */
|
|
48
|
+
export type BuiltWidgets = Map<string, string>;
|
|
49
|
+
/**
|
|
50
|
+
* Build every declared widget that has resolvable source. Returns a map of
|
|
51
|
+
* `name → htmlAsset` (deploy-relative, e.g. `static/mcp-ui/reader.html`) for
|
|
52
|
+
* the ones we built; templates with no source are absent (the caller falls
|
|
53
|
+
* back to their legacy `htmlPath`).
|
|
54
|
+
*/
|
|
55
|
+
export declare function buildMcpWidgets(opts: BuildMcpWidgetsOptions): Promise<BuiltWidgets>;
|
|
56
|
+
//# sourceMappingURL=widgets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widgets.d.ts","sourceRoot":"","sources":["../../src/mcp/widgets.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;mFAC+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,4FAA4F;IAC5F,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,+EAA+E;AAC/E,MAAM,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE/C;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CAwGzF"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { isAbsolute, join, relative, resolve } from 'node:path';
|
|
4
|
+
import { pathToFileURL } from 'node:url';
|
|
5
|
+
/**
|
|
6
|
+
* Build every declared widget that has resolvable source. Returns a map of
|
|
7
|
+
* `name → htmlAsset` (deploy-relative, e.g. `static/mcp-ui/reader.html`) for
|
|
8
|
+
* the ones we built; templates with no source are absent (the caller falls
|
|
9
|
+
* back to their legacy `htmlPath`).
|
|
10
|
+
*/
|
|
11
|
+
export async function buildMcpWidgets(opts) {
|
|
12
|
+
const built = new Map();
|
|
13
|
+
const { templates } = opts;
|
|
14
|
+
if (!templates || templates.length === 0)
|
|
15
|
+
return built;
|
|
16
|
+
const projectDir = resolve(opts.projectDir);
|
|
17
|
+
const staticDir = (opts.staticDir || 'static').replace(/^\/+|\/+$/g, '');
|
|
18
|
+
const outRoot = join(resolve(opts.outDir), staticDir, 'mcp-ui');
|
|
19
|
+
// Resolve the tenant's toolchain once (vite + framework plugin + tailwind).
|
|
20
|
+
const req = createRequire(join(projectDir, '__maravilla_widget_resolver__.cjs'));
|
|
21
|
+
let vite;
|
|
22
|
+
try {
|
|
23
|
+
vite = await importFrom('vite', req);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
console.warn('⚠️ MCP widgets: could not resolve "vite" from the project — skipping widget auto-build. ' +
|
|
27
|
+
'(Every framework app ships Vite; is this running inside the app?)');
|
|
28
|
+
return built;
|
|
29
|
+
}
|
|
30
|
+
// The adapter passes a framework id; fall back to detecting it from the
|
|
31
|
+
// project's package.json so auto-build works even with older adapters that
|
|
32
|
+
// don't forward one.
|
|
33
|
+
const framework = opts.framework || (await detectFramework(projectDir));
|
|
34
|
+
let frameworkPlugin = null;
|
|
35
|
+
try {
|
|
36
|
+
frameworkPlugin = await resolveFrameworkPlugin(framework, req);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
console.warn(`⚠️ MCP widgets: could not load the ${framework ?? 'framework'} Vite plugin from the project ` +
|
|
40
|
+
`(${err.message}). Install it (or build the widget yourself and set htmlPath). Skipping auto-build.`);
|
|
41
|
+
return built;
|
|
42
|
+
}
|
|
43
|
+
if (!frameworkPlugin) {
|
|
44
|
+
// Unknown framework — nothing safe to compile components with.
|
|
45
|
+
return built;
|
|
46
|
+
}
|
|
47
|
+
const tailwindPlugin = await resolveTailwind(req); // optional
|
|
48
|
+
for (const t of templates) {
|
|
49
|
+
const entryHtml = await findWidgetEntry(projectDir, t);
|
|
50
|
+
if (!entryHtml)
|
|
51
|
+
continue; // no source → legacy htmlPath handles it
|
|
52
|
+
try {
|
|
53
|
+
await vite.build({
|
|
54
|
+
// Root = project so Tailwind v4's automatic content detection scans all
|
|
55
|
+
// of src/ (incl. shared components) — no @source needed.
|
|
56
|
+
root: projectDir,
|
|
57
|
+
configFile: false,
|
|
58
|
+
logLevel: 'warn',
|
|
59
|
+
resolve: {
|
|
60
|
+
alias: {
|
|
61
|
+
$lib: join(projectDir, 'src', 'lib'),
|
|
62
|
+
'@': join(projectDir, 'src'),
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
plugins: [
|
|
66
|
+
frameworkPlugin,
|
|
67
|
+
...(tailwindPlugin ? [tailwindPlugin] : []),
|
|
68
|
+
await singleFilePlugin(req),
|
|
69
|
+
],
|
|
70
|
+
build: {
|
|
71
|
+
outDir: outRoot,
|
|
72
|
+
emptyOutDir: false,
|
|
73
|
+
cssCodeSplit: false,
|
|
74
|
+
assetsInlineLimit: 100_000_000,
|
|
75
|
+
minify: opts.production ?? false,
|
|
76
|
+
rollupOptions: { input: { [t.name]: entryHtml } },
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
console.warn(`⚠️ MCP widget "${t.name}": build failed — ${err.message}`);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
// With root = project, Vite writes the HTML preserving the entry's path
|
|
85
|
+
// relative to root (e.g. <outRoot>/src/mcp-ui/<name>/index.html). Flatten it
|
|
86
|
+
// to <outRoot>/<name>.html and remove the nested tree singlefile left behind.
|
|
87
|
+
const rel = relative(projectDir, entryHtml); // e.g. src/mcp-ui/<name>/index.html
|
|
88
|
+
const producedNested = join(outRoot, rel);
|
|
89
|
+
const finalPath = join(outRoot, `${t.name}.html`);
|
|
90
|
+
try {
|
|
91
|
+
await fs.access(producedNested);
|
|
92
|
+
await fs.rm(finalPath, { force: true });
|
|
93
|
+
await fs.rename(producedNested, finalPath);
|
|
94
|
+
const topSeg = rel.split(/[\\/]/)[0];
|
|
95
|
+
if (topSeg && topSeg !== `${t.name}.html`) {
|
|
96
|
+
await fs.rm(join(outRoot, topSeg), { recursive: true, force: true });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
console.warn(`⚠️ MCP widget "${t.name}": build produced no HTML at ${rel} — skipping.`);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
built.set(t.name, `${staticDir}/mcp-ui/${t.name}.html`);
|
|
104
|
+
console.log(`🎨 Built MCP widget "${t.name}" → ${staticDir}/mcp-ui/${t.name}.html`);
|
|
105
|
+
}
|
|
106
|
+
return built;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Resolve a widget's source `index.html` (absolute) from, in priority:
|
|
110
|
+
* 1. explicit `entry` (a dir or an `index.html`),
|
|
111
|
+
* 2. `mcp-ui/<name>/index.html`,
|
|
112
|
+
* 3. `src/mcp-ui/<name>/index.html`.
|
|
113
|
+
* Returns null when none exists (→ caller uses legacy htmlPath).
|
|
114
|
+
*/
|
|
115
|
+
async function findWidgetEntry(projectDir, t) {
|
|
116
|
+
const candidates = [];
|
|
117
|
+
if (t.entry) {
|
|
118
|
+
const e = isAbsolute(t.entry) ? t.entry : join(projectDir, t.entry);
|
|
119
|
+
candidates.push(e.endsWith('.html') ? e : join(e, 'index.html'));
|
|
120
|
+
}
|
|
121
|
+
candidates.push(join(projectDir, 'mcp-ui', t.name, 'index.html'));
|
|
122
|
+
candidates.push(join(projectDir, 'src', 'mcp-ui', t.name, 'index.html'));
|
|
123
|
+
for (const c of candidates) {
|
|
124
|
+
try {
|
|
125
|
+
await fs.access(c);
|
|
126
|
+
return c;
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
/* next */
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
/** Detect the framework from the project's package.json deps (fallback when the
|
|
135
|
+
* adapter doesn't pass a framework id). */
|
|
136
|
+
async function detectFramework(projectDir) {
|
|
137
|
+
let pkg = {};
|
|
138
|
+
try {
|
|
139
|
+
pkg = JSON.parse(await fs.readFile(join(projectDir, 'package.json'), 'utf-8'));
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
const deps = {
|
|
145
|
+
...pkg.dependencies,
|
|
146
|
+
...pkg.devDependencies,
|
|
147
|
+
};
|
|
148
|
+
if (deps['@sveltejs/kit'] || deps['@sveltejs/vite-plugin-svelte'] || deps['svelte'])
|
|
149
|
+
return 'svelte';
|
|
150
|
+
if (deps['@react-router/dev'] || deps['react-router'] || deps['next'] || deps['react'])
|
|
151
|
+
return 'react';
|
|
152
|
+
if (deps['nuxt'] || deps['vue'])
|
|
153
|
+
return 'vue';
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
/** Dynamic-import a package resolved from the tenant project. */
|
|
157
|
+
async function importFrom(spec, req) {
|
|
158
|
+
const path = req.resolve(spec);
|
|
159
|
+
return import(pathToFileURL(path).href);
|
|
160
|
+
}
|
|
161
|
+
/** `vite-plugin-singlefile` is OUR dependency — resolve it from our own tree.
|
|
162
|
+
* Use a non-literal specifier so `tsc` doesn't try to type-resolve it. */
|
|
163
|
+
async function singleFilePlugin(_req) {
|
|
164
|
+
const specifier = 'vite-plugin-singlefile';
|
|
165
|
+
const mod = await import(specifier);
|
|
166
|
+
const factory = mod.viteSingleFile ?? mod.default;
|
|
167
|
+
return factory();
|
|
168
|
+
}
|
|
169
|
+
/** Tailwind is optional: only add it when the project actually uses it. */
|
|
170
|
+
async function resolveTailwind(req) {
|
|
171
|
+
try {
|
|
172
|
+
const mod = await importFrom('@tailwindcss/vite', req);
|
|
173
|
+
const factory = mod.default ?? mod;
|
|
174
|
+
return factory();
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Resolve the framework's *leaf* Vite component plugin from the tenant project
|
|
182
|
+
* (NOT the framework meta-plugin like `sveltekit()`/`reactRouter()`, which
|
|
183
|
+
* bundle routing/SSR unfit for a single-file widget). Returns null for an
|
|
184
|
+
* unknown framework.
|
|
185
|
+
*/
|
|
186
|
+
async function resolveFrameworkPlugin(framework, req) {
|
|
187
|
+
switch (framework) {
|
|
188
|
+
case 'svelte':
|
|
189
|
+
case 'sveltekit': {
|
|
190
|
+
const mod = await importFrom('@sveltejs/vite-plugin-svelte', req);
|
|
191
|
+
const svelte = mod.svelte ?? mod.default;
|
|
192
|
+
const pre = mod.vitePreprocess ? mod.vitePreprocess() : undefined;
|
|
193
|
+
return svelte({ compilerOptions: { runes: true }, ...(pre ? { preprocess: pre } : {}) });
|
|
194
|
+
}
|
|
195
|
+
case 'react':
|
|
196
|
+
case 'react-router':
|
|
197
|
+
case 'nextjs':
|
|
198
|
+
case 'next': {
|
|
199
|
+
let mod;
|
|
200
|
+
try {
|
|
201
|
+
mod = await importFrom('@vitejs/plugin-react', req);
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
mod = await importFrom('@vitejs/plugin-react-swc', req);
|
|
205
|
+
}
|
|
206
|
+
const react = mod.default ?? mod;
|
|
207
|
+
return react();
|
|
208
|
+
}
|
|
209
|
+
case 'vue':
|
|
210
|
+
case 'nuxt': {
|
|
211
|
+
const mod = await importFrom('@vitejs/plugin-vue', req);
|
|
212
|
+
const vue = mod.default ?? mod;
|
|
213
|
+
return vue();
|
|
214
|
+
}
|
|
215
|
+
default:
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=widgets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widgets.js","sourceRoot":"","sources":["../../src/mcp/widgets.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@maravilla-labs/functions",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "Maravilla Edge Functions bundler and development tools",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -47,7 +47,8 @@
|
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
49
|
"esbuild": "^0.25.8",
|
|
50
|
-
"chokidar": "^3.5.3"
|
|
50
|
+
"chokidar": "^3.5.3",
|
|
51
|
+
"vite-plugin-singlefile": "^2.0.0"
|
|
51
52
|
},
|
|
52
53
|
"devDependencies": {
|
|
53
54
|
"@types/node": "^20.10.5",
|