@aotter/mantle-web 0.1.0-alpha.13 → 0.1.0-alpha.15
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 +83 -9
- package/dist/webmcp.d.ts +48 -6
- package/dist/webmcp.d.ts.map +1 -1
- package/dist/webmcp.js +170 -42
- package/dist/webmcp.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -26,23 +26,97 @@ headless runtime operations.
|
|
|
26
26
|
|
|
27
27
|
## WebMCP (opt in)
|
|
28
28
|
|
|
29
|
-
Browsers implementing the draft imperative WebMCP API can expose public
|
|
30
|
-
as
|
|
29
|
+
Browsers implementing the draft imperative WebMCP API can expose public Mantle
|
|
30
|
+
capabilities as tools. Importing the subpath has no registration side effect;
|
|
31
31
|
registration begins only when `bindWebMcp` is called.
|
|
32
32
|
|
|
33
|
+
### Fresh server-backed site
|
|
34
|
+
|
|
35
|
+
Declare a public View; the Cloudflare adapter publishes its safe tool descriptor
|
|
36
|
+
at `/api/views` and keeps the manifest server-side.
|
|
37
|
+
|
|
38
|
+
```yaml
|
|
39
|
+
apiVersion: cms.mantle.aotter.net/v1
|
|
40
|
+
kind: View
|
|
41
|
+
metadata:
|
|
42
|
+
name: recent-posts
|
|
43
|
+
spec:
|
|
44
|
+
surface: public
|
|
45
|
+
from: posts
|
|
46
|
+
limit: 20
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
The default binding discovers and invokes those same-origin View routes:
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
import { bindWebMcp } from "@aotter/mantle-web/webmcp";
|
|
53
|
+
|
|
54
|
+
const binding = await bindWebMcp();
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Fresh browser-local SPA
|
|
58
|
+
|
|
59
|
+
Project the active plan and dispatch through the active local Runtime. Keeping
|
|
60
|
+
Runtime lookup inside `invoke` lets the SPA switch bundles without stale
|
|
61
|
+
closures.
|
|
62
|
+
|
|
33
63
|
```ts
|
|
34
64
|
import { projectCallableCapabilities } from "@aotter/mantle-runtime";
|
|
35
65
|
import { bindWebMcp } from "@aotter/mantle-web/webmcp";
|
|
36
66
|
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
);
|
|
67
|
+
const capabilities = projectCallableCapabilities(plan, { surface: "public" });
|
|
68
|
+
async function invokeMantle(capability, input, signal) {
|
|
69
|
+
signal.throwIfAborted();
|
|
70
|
+
const runtime = await getRuntime();
|
|
71
|
+
if (capability.kind === "procedure") {
|
|
72
|
+
const result = await runtime.invokeTrigger({
|
|
73
|
+
trigger: capability.trigger,
|
|
74
|
+
input,
|
|
75
|
+
ctx: getContext(),
|
|
76
|
+
});
|
|
77
|
+
if (!result.ok) throw result.diagnostic;
|
|
78
|
+
return result.data;
|
|
79
|
+
}
|
|
80
|
+
const { page, show, ...params } = input;
|
|
81
|
+
const result = await runtime.executeView({
|
|
82
|
+
view: capability.ownerName,
|
|
83
|
+
options: {
|
|
84
|
+
params,
|
|
85
|
+
page: typeof page === "number" ? page : undefined,
|
|
86
|
+
show: typeof show === "number" ? show : undefined,
|
|
87
|
+
},
|
|
88
|
+
ctx: getContext(),
|
|
89
|
+
});
|
|
90
|
+
if (!result.ok) throw result.diagnostic;
|
|
91
|
+
return result.result;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const binding = await bindWebMcp({ capabilities, invoke: invokeMantle });
|
|
40
95
|
|
|
41
96
|
// Unregister when the page/app scope ends.
|
|
42
97
|
binding.dispose();
|
|
43
98
|
```
|
|
44
99
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
100
|
+
### Existing WebMCP site
|
|
101
|
+
|
|
102
|
+
Pass the host's current registry and optional hooks. Mantle inspects and skips
|
|
103
|
+
existing names; it does not replace host registrations.
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
const binding = await bindWebMcp({
|
|
107
|
+
capabilities,
|
|
108
|
+
invoke: invokeMantle,
|
|
109
|
+
modelContext: document.modelContext,
|
|
110
|
+
before(call) {
|
|
111
|
+
analytics.track("webmcp:start", call);
|
|
112
|
+
},
|
|
113
|
+
after({ target }, result) {
|
|
114
|
+
if (result.status === "fulfilled") refreshUi(target);
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Unsupported browsers return `{ supported: false }`. Only public capabilities
|
|
120
|
+
are registered. Procedure tools must originate from explicit public MCP
|
|
121
|
+
Triggers, and execution must enter Runtime through that Trigger. `after` is
|
|
122
|
+
observational: its failure never replaces the invocation result.
|
package/dist/webmcp.d.ts
CHANGED
|
@@ -1,12 +1,25 @@
|
|
|
1
1
|
import type { RuntimeCallableCapability } from "@aotter/mantle-runtime";
|
|
2
|
+
export type WebMcpTarget = Readonly<{
|
|
3
|
+
readonly kind: "view";
|
|
4
|
+
readonly name: string;
|
|
5
|
+
}> | Readonly<{
|
|
6
|
+
readonly kind: "procedure";
|
|
7
|
+
readonly name: string;
|
|
8
|
+
}>;
|
|
9
|
+
export interface WebMcpCall {
|
|
10
|
+
readonly name: string;
|
|
11
|
+
readonly target: WebMcpTarget;
|
|
12
|
+
readonly input: Readonly<Record<string, unknown>>;
|
|
13
|
+
readonly signal: AbortSignal;
|
|
14
|
+
}
|
|
2
15
|
export interface WebMcpTool {
|
|
3
16
|
readonly name: string;
|
|
4
17
|
readonly title?: string;
|
|
5
18
|
readonly description: string;
|
|
6
19
|
readonly inputSchema: Record<string, unknown>;
|
|
7
20
|
readonly annotations: {
|
|
8
|
-
readonly readOnlyHint:
|
|
9
|
-
readonly untrustedContentHint
|
|
21
|
+
readonly readOnlyHint: boolean;
|
|
22
|
+
readonly untrustedContentHint?: boolean;
|
|
10
23
|
};
|
|
11
24
|
execute(input: Record<string, unknown>, context: {
|
|
12
25
|
readonly signal?: AbortSignal;
|
|
@@ -16,17 +29,46 @@ export interface WebMcpModelContext {
|
|
|
16
29
|
registerTool(tool: WebMcpTool, options: {
|
|
17
30
|
readonly signal: AbortSignal;
|
|
18
31
|
}): void | Promise<void>;
|
|
32
|
+
getTools?(): readonly {
|
|
33
|
+
readonly name: string;
|
|
34
|
+
}[] | Promise<readonly {
|
|
35
|
+
readonly name: string;
|
|
36
|
+
}[]>;
|
|
19
37
|
}
|
|
20
38
|
export interface WebMcpBinding {
|
|
21
39
|
readonly supported: boolean;
|
|
22
40
|
readonly registered: readonly string[];
|
|
41
|
+
readonly skipped: readonly string[];
|
|
23
42
|
dispose(): void;
|
|
24
43
|
}
|
|
25
|
-
export interface
|
|
44
|
+
export interface PublicWebMcpView {
|
|
45
|
+
readonly name: string;
|
|
46
|
+
readonly target: Readonly<{
|
|
47
|
+
readonly kind: "view";
|
|
48
|
+
readonly name: string;
|
|
49
|
+
}>;
|
|
50
|
+
readonly title?: string;
|
|
51
|
+
readonly description: string;
|
|
52
|
+
readonly inputSchema: Record<string, unknown>;
|
|
53
|
+
}
|
|
54
|
+
export type WebMcpInvoker = (capability: RuntimeCallableCapability, input: Readonly<Record<string, unknown>>, signal: AbortSignal) => Promise<unknown>;
|
|
55
|
+
interface CommonBindWebMcpOptions {
|
|
26
56
|
readonly modelContext?: WebMcpModelContext;
|
|
57
|
+
readonly before?: (call: WebMcpCall) => void | Promise<void>;
|
|
58
|
+
readonly after?: (call: WebMcpCall, result: PromiseSettledResult<unknown>) => void | Promise<void>;
|
|
59
|
+
}
|
|
60
|
+
export type BindWebMcpOptions = (CommonBindWebMcpOptions & {
|
|
61
|
+
readonly capabilities: readonly RuntimeCallableCapability[];
|
|
62
|
+
readonly invoke: WebMcpInvoker;
|
|
63
|
+
readonly fetch?: never;
|
|
64
|
+
readonly endpointPrefix?: never;
|
|
65
|
+
}) | (CommonBindWebMcpOptions & {
|
|
66
|
+
readonly capabilities?: never;
|
|
67
|
+
readonly invoke?: never;
|
|
27
68
|
readonly fetch?: typeof fetch;
|
|
28
69
|
readonly endpointPrefix?: string;
|
|
29
|
-
}
|
|
30
|
-
/** Opt-in browser binding
|
|
31
|
-
export declare function bindWebMcp(
|
|
70
|
+
});
|
|
71
|
+
/** Opt-in browser binding over public callable capabilities. */
|
|
72
|
+
export declare function bindWebMcp(options?: BindWebMcpOptions): Promise<WebMcpBinding>;
|
|
73
|
+
export {};
|
|
32
74
|
//# sourceMappingURL=webmcp.d.ts.map
|
package/dist/webmcp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webmcp.d.ts","sourceRoot":"","sources":["../src/webmcp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"webmcp.d.ts","sourceRoot":"","sources":["../src/webmcp.ts"],"names":[],"mappings":"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"}
|
package/dist/webmcp.js
CHANGED
|
@@ -1,31 +1,175 @@
|
|
|
1
|
-
/** Opt-in browser binding
|
|
2
|
-
export async function bindWebMcp(
|
|
1
|
+
/** Opt-in browser binding over public callable capabilities. */
|
|
2
|
+
export async function bindWebMcp(options = {}) {
|
|
3
3
|
const modelContext = options.modelContext ?? browserModelContext();
|
|
4
4
|
if (!modelContext)
|
|
5
5
|
return unsupportedBinding();
|
|
6
6
|
const controller = new AbortController();
|
|
7
|
-
const views = capabilities.filter((capability) => capability.kind === "view" && capability.surface === "public");
|
|
8
7
|
try {
|
|
9
|
-
await
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
8
|
+
const capabilities = await resolveCapabilities(options, controller.signal);
|
|
9
|
+
assertUniqueNames(capabilities);
|
|
10
|
+
const existing = modelContext.getTools
|
|
11
|
+
? new Set((await modelContext.getTools()).map((tool) => tool.name))
|
|
12
|
+
: new Set();
|
|
13
|
+
const skipped = capabilities
|
|
14
|
+
.filter((capability) => existing.has(capability.name))
|
|
15
|
+
.map((capability) => capability.name);
|
|
16
|
+
const pending = capabilities.filter((capability) => !existing.has(capability.name));
|
|
17
|
+
await Promise.all(pending.map((capability) => modelContext.registerTool(toWebMcpTool(capability, options), { signal: controller.signal })));
|
|
18
|
+
return binding(pending.map((capability) => capability.name), skipped, controller);
|
|
19
19
|
}
|
|
20
20
|
catch (error) {
|
|
21
21
|
controller.abort();
|
|
22
22
|
throw error;
|
|
23
23
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
}
|
|
25
|
+
function resolveCapabilities(options, signal) {
|
|
26
|
+
const capabilities = options.capabilities;
|
|
27
|
+
const invoke = options.invoke;
|
|
28
|
+
if (capabilities === undefined && invoke === undefined) {
|
|
29
|
+
return serverCapabilities(options, signal);
|
|
30
|
+
}
|
|
31
|
+
if (!Array.isArray(capabilities) || typeof invoke !== "function") {
|
|
32
|
+
throw new TypeError("WebMCP capabilities and invoke must be provided together.");
|
|
33
|
+
}
|
|
34
|
+
return localCapabilities(capabilities, invoke);
|
|
35
|
+
}
|
|
36
|
+
function localCapabilities(capabilities, invoke) {
|
|
37
|
+
return capabilities
|
|
38
|
+
.filter((capability) => capability.surface === "public")
|
|
39
|
+
.map((capability) => ({
|
|
40
|
+
name: capability.name,
|
|
41
|
+
...(capability.title ? { title: capability.title } : {}),
|
|
42
|
+
description: capability.description,
|
|
43
|
+
inputSchema: capability.inputSchema,
|
|
44
|
+
annotations: {
|
|
45
|
+
readOnlyHint: capability.kind === "view" || capability.inputSchema.readOnly === true,
|
|
46
|
+
...(capability.kind === "view" ? { untrustedContentHint: true } : {}),
|
|
47
|
+
},
|
|
48
|
+
target: Object.freeze({ kind: capability.kind, name: capability.ownerName }),
|
|
49
|
+
invoke: (input, signal) => invoke(capability, input, signal),
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
async function serverCapabilities(options, signal) {
|
|
53
|
+
const prefix = endpointPrefix(options.endpointPrefix);
|
|
54
|
+
const fetcher = options.fetch ?? fetch;
|
|
55
|
+
const response = await fetcher(prefix, {
|
|
56
|
+
method: "GET",
|
|
57
|
+
credentials: "same-origin",
|
|
58
|
+
headers: { accept: "application/json" },
|
|
59
|
+
signal,
|
|
60
|
+
});
|
|
61
|
+
if (!response.ok)
|
|
62
|
+
throw new Error(`Mantle WebMCP catalog failed (${response.status}).`);
|
|
63
|
+
return readCatalog(await response.json()).map((view) => ({
|
|
64
|
+
...view,
|
|
65
|
+
annotations: { readOnlyHint: true, untrustedContentHint: true },
|
|
66
|
+
invoke: (input, invocationSignal) => queryView(view, input, invocationSignal, prefix, fetcher),
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
function toWebMcpTool(capability, options) {
|
|
70
|
+
return {
|
|
71
|
+
name: capability.name,
|
|
72
|
+
...(capability.title ? { title: capability.title } : {}),
|
|
73
|
+
description: capability.description,
|
|
74
|
+
inputSchema: capability.inputSchema,
|
|
75
|
+
annotations: capability.annotations,
|
|
76
|
+
execute: async (input, context) => {
|
|
77
|
+
if (!input || typeof input !== "object" || Array.isArray(input)) {
|
|
78
|
+
throw new TypeError("WebMCP tool input must be an object.");
|
|
79
|
+
}
|
|
80
|
+
const signal = context.signal ?? new AbortController().signal;
|
|
81
|
+
const call = Object.freeze({
|
|
82
|
+
name: capability.name,
|
|
83
|
+
target: capability.target,
|
|
84
|
+
input,
|
|
85
|
+
signal,
|
|
86
|
+
});
|
|
87
|
+
let result;
|
|
88
|
+
try {
|
|
89
|
+
signal.throwIfAborted();
|
|
90
|
+
await options.before?.(call);
|
|
91
|
+
result = {
|
|
92
|
+
status: "fulfilled",
|
|
93
|
+
value: await capability.invoke(input, signal),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
catch (reason) {
|
|
97
|
+
result = { status: "rejected", reason };
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
await options.after?.(call, result);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Observational hooks never change the domain result.
|
|
104
|
+
}
|
|
105
|
+
if (result.status === "fulfilled")
|
|
106
|
+
return result.value;
|
|
107
|
+
throw result.reason;
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function endpointPrefix(prefix = "/api/views") {
|
|
112
|
+
const normalized = prefix.replace(/\/$/u, "");
|
|
113
|
+
if (!/^\/(?!\/)[^\\?#]*$/u.test(normalized)) {
|
|
114
|
+
throw new TypeError("WebMCP endpointPrefix must be a same-origin absolute path.");
|
|
115
|
+
}
|
|
116
|
+
return normalized;
|
|
117
|
+
}
|
|
118
|
+
async function queryView(view, input, signal, prefix, fetcher) {
|
|
119
|
+
const query = new URLSearchParams();
|
|
120
|
+
for (const [key, value] of Object.entries(input)) {
|
|
121
|
+
if (["string", "number", "boolean"].includes(typeof value)) {
|
|
122
|
+
query.set(key, String(value));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const search = query.size ? `?${query}` : "";
|
|
126
|
+
const response = await fetcher(`${prefix}/${encodeURIComponent(view.target.name)}${search}`, {
|
|
127
|
+
method: "GET",
|
|
128
|
+
credentials: "same-origin",
|
|
129
|
+
headers: { accept: "application/json" },
|
|
130
|
+
signal,
|
|
28
131
|
});
|
|
132
|
+
if (!response.ok) {
|
|
133
|
+
throw new Error(`Mantle View '${view.target.name}' failed (${response.status}).`);
|
|
134
|
+
}
|
|
135
|
+
const body = await response.json();
|
|
136
|
+
return isRecord(body) && body.ok === true ? body.data : body;
|
|
137
|
+
}
|
|
138
|
+
function readCatalog(body) {
|
|
139
|
+
if (!isRecord(body) || body.ok !== true || !Array.isArray(body.data)) {
|
|
140
|
+
throw new TypeError("Mantle WebMCP catalog response is invalid.");
|
|
141
|
+
}
|
|
142
|
+
return body.data.map((value) => {
|
|
143
|
+
if (!isRecord(value)
|
|
144
|
+
|| typeof value.name !== "string"
|
|
145
|
+
|| typeof value.description !== "string"
|
|
146
|
+
|| !isRecord(value.inputSchema)
|
|
147
|
+
|| !isRecord(value.target)
|
|
148
|
+
|| value.target.kind !== "view"
|
|
149
|
+
|| typeof value.target.name !== "string"
|
|
150
|
+
|| (value.title !== undefined && typeof value.title !== "string")) {
|
|
151
|
+
throw new TypeError("Mantle WebMCP catalog contains an invalid View.");
|
|
152
|
+
}
|
|
153
|
+
return Object.freeze({
|
|
154
|
+
name: value.name,
|
|
155
|
+
target: Object.freeze({ kind: "view", name: value.target.name }),
|
|
156
|
+
...(value.title ? { title: value.title } : {}),
|
|
157
|
+
description: value.description,
|
|
158
|
+
inputSchema: value.inputSchema,
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
function isRecord(value) {
|
|
163
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
164
|
+
}
|
|
165
|
+
function assertUniqueNames(capabilities) {
|
|
166
|
+
const names = new Set();
|
|
167
|
+
for (const capability of capabilities) {
|
|
168
|
+
if (names.has(capability.name)) {
|
|
169
|
+
throw new TypeError(`Duplicate WebMCP capability name '${capability.name}'.`);
|
|
170
|
+
}
|
|
171
|
+
names.add(capability.name);
|
|
172
|
+
}
|
|
29
173
|
}
|
|
30
174
|
function browserModelContext() {
|
|
31
175
|
const modelContext = globalThis
|
|
@@ -34,36 +178,20 @@ function browserModelContext() {
|
|
|
34
178
|
? modelContext
|
|
35
179
|
: undefined;
|
|
36
180
|
}
|
|
181
|
+
function binding(registered, skipped, controller) {
|
|
182
|
+
return Object.freeze({
|
|
183
|
+
supported: true,
|
|
184
|
+
registered: Object.freeze(registered),
|
|
185
|
+
skipped: Object.freeze(skipped),
|
|
186
|
+
dispose: () => controller.abort(),
|
|
187
|
+
});
|
|
188
|
+
}
|
|
37
189
|
function unsupportedBinding() {
|
|
38
190
|
return Object.freeze({
|
|
39
191
|
supported: false,
|
|
40
192
|
registered: Object.freeze([]),
|
|
193
|
+
skipped: Object.freeze([]),
|
|
41
194
|
dispose: () => { },
|
|
42
195
|
});
|
|
43
196
|
}
|
|
44
|
-
async function queryView(capability, input, signal, options) {
|
|
45
|
-
if (!input || typeof input !== "object" || Array.isArray(input)) {
|
|
46
|
-
throw new TypeError("WebMCP View input must be an object.");
|
|
47
|
-
}
|
|
48
|
-
const query = Object.entries(input)
|
|
49
|
-
.filter((entry) => ["string", "number", "boolean"].includes(typeof entry[1]))
|
|
50
|
-
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)
|
|
51
|
-
.join("&");
|
|
52
|
-
const prefix = (options.endpointPrefix ?? "/api/views").replace(/\/$/u, "");
|
|
53
|
-
if (!/^\/(?!\/)[^\\?#]*$/u.test(prefix)) {
|
|
54
|
-
throw new TypeError("WebMCP endpointPrefix must be a same-origin absolute path.");
|
|
55
|
-
}
|
|
56
|
-
const response = await (options.fetch ?? fetch)(`${prefix}/${encodeURIComponent(capability.ownerName)}${query ? `?${query}` : ""}`, {
|
|
57
|
-
method: "GET",
|
|
58
|
-
credentials: "same-origin",
|
|
59
|
-
headers: { accept: "application/json" },
|
|
60
|
-
signal,
|
|
61
|
-
});
|
|
62
|
-
if (!response.ok)
|
|
63
|
-
throw new Error(`Mantle View '${capability.ownerName}' failed (${response.status}).`);
|
|
64
|
-
const body = await response.json();
|
|
65
|
-
return body && typeof body === "object" && body.ok === true
|
|
66
|
-
? body.data
|
|
67
|
-
: body;
|
|
68
|
-
}
|
|
69
197
|
//# sourceMappingURL=webmcp.js.map
|
package/dist/webmcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webmcp.js","sourceRoot":"","sources":["../src/webmcp.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webmcp.js","sourceRoot":"","sources":["../src/webmcp.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aotter/mantle-web",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.15",
|
|
4
4
|
"description": "Optional public document composition for Mantle: HTML, Markdown, llms.txt, sitemap, SEO, and preview.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://mantle.tools/",
|
|
@@ -33,13 +33,13 @@
|
|
|
33
33
|
"README.md"
|
|
34
34
|
],
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@aotter/mantle-
|
|
37
|
-
"@aotter/mantle-
|
|
36
|
+
"@aotter/mantle-runtime": "0.1.0-alpha.15",
|
|
37
|
+
"@aotter/mantle-spec": "0.1.0-alpha.15"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/node": "^26",
|
|
41
41
|
"typescript": "^6.0.3",
|
|
42
|
-
"vitest": "^4.1.
|
|
42
|
+
"vitest": "^4.1.11"
|
|
43
43
|
},
|
|
44
44
|
"scripts": {
|
|
45
45
|
"prebuild": "rm -rf dist .tsbuildinfo",
|