Compare commits

..
Author SHA1 Message Date
Chris Tate 72568f990e Prepare v0.21.1 release (#394) 2026-10-13 13:04:29 -05:00
Railly HugoandTrevin Chow 5473fe1314 fix(core): infer s.any() fields as any (#390)
* fix(core): infer s.any() fields as any

InferSpecField mapped SchemaType<"any"> to unknown, so catalog.validate() data with a visible: s.any() field was not assignable to Spec and needed an as unknown as Spec cast.

Co-Authored-By: Trevin Chow <trevin@trevinchow.com>

* ci(core): type-check the schema inference test

core had no check-types script, so turbo skipped it and reverting the s.any() inference fix still passed CI. A focused tsconfig checks src/schema.test.ts; the full core project still fails tsc on main (TS6059, test-only errors).

---------

Co-authored-by: Trevin Chow <trevin@trevinchow.com>
2026-10-12 15:02:47 -03:00
Railly Hugoandvitalii.semianchuk 85a7fa0091 fix(core): reject partial and empty numeric strings (#389)
parseFloat accepted "123abc" as 123, and Number() alone treats "" and whitespace as 0. Require a non-empty string that Number() parses fully.

Co-authored-by: vitalii.semianchuk <fix20152@gmail.com>
2026-10-12 15:02:28 -03:00
Railly Hugo fc2a696a50 docs: prepare native WebMCP migration (#363)
* docs: prepare native WebMCP migration

* docs: update Geistdocs to 2.7.5
2026-10-01 14:18:31 -03:00
Railly Hugo c2600d7390 docs: migrate to Geistdocs (#340)
* feat(docs): migrate to Geistdocs

* fix(chat): align Streamdown highlighter dependencies

* feat(docs): switch navbar to Vercel Labs brand

Bump @vercel/geistdocs to 2.4.1 and set navbarBrand: "labs" so the
docs navbar uses the Vercel Labs logo and links to vercel.com/labs
instead of the default OSS branding.

* fix(docs): migrate Jev page into the content collection and refresh baseline

The merge from main brought the v0.21.0 Jev docs page into the old
app/(main)/docs location that the Geistdocs migration had replaced, so
/docs/jev appeared in the sitemap but 404'd. Move it to
content/docs/jev.mdx with sidebar placement under a new Experimental
section, and refresh the docs baseline hashes for the pages whose
content changed with the merge (api/core, changelog, skills).

* test(docs): refresh core API baseline after main merge
2026-09-23 13:51:29 -03:00
42 changed files with 332 additions and 54 deletions
+23 -2
View File
@@ -1,9 +1,31 @@
# Changelog
## 0.21.0
## 0.21.1
<!-- release:start -->
### Bug Fixes
- **Dotted form values:** Preserve literal emails, URLs, and version strings in form value lookups instead of treating them as missing state paths (#353)
- **Numeric validation:** Reject partially numeric strings such as `"123abc"`, empty strings, and whitespace-only strings instead of accepting them as numbers (#389)
- **Schema type inference:** Infer `s.any()` fields as `any`, matching `z.any()`, so validated specs remain assignable to `Spec` without casts (#390)
### Documentation
- Migrated the **docs site** to Geistdocs while preserving public URLs, page content, and anchors (#340)
- Updated **native WebMCP discovery and search** with the Geistdocs MCP adapter (#363)
### Contributors
- @ctate
- @Railly
- @fix2015
- @kevin9327
- @tmchow
<!-- release:end -->
## 0.21.0
### New Features
- **TanStack Start renderer:** Added `@json-render/tanstack-start` for JSON-defined applications with file-based routes, reusable layouts, SSR loaders, head metadata, prerender paths, client navigation, and route fallbacks (#334)
@@ -19,7 +41,6 @@
- @ctate
- @Railly
<!-- release:end -->
## 0.20.0
+7
View File
@@ -0,0 +1,7 @@
import { createMcpRoute } from "@vercel/geistdocs/routes/mcp";
import { config } from "@/lib/geistdocs/config";
import { GET as search } from "../search/route";
const handler = createMcpRoute({ config, search });
export { handler as GET, handler as POST };
+22
View File
@@ -4,6 +4,28 @@ title: "Changelog"
Notable changes and updates to json-render.
## v0.21.1
October 13, 2026
### Fixed: Dotted Form Values
Form value lookups now preserve literal emails, URLs, and version strings instead of treating them as missing state paths.
### Fixed: Numeric Validation
The `numeric` validator now rejects partially numeric strings such as `"123abc"`, empty strings, and whitespace-only strings instead of accepting them as numbers.
### Fixed: Schema Type Inference
`s.any()` fields now infer as `any`, matching `z.any()`, so validated specs remain assignable to `Spec` without casts.
### Improved: Documentation
Migrated the docs site to Geistdocs while preserving public URLs, page content, and anchors. Updated native WebMCP discovery and search with the Geistdocs MCP adapter.
---
## v0.21.0
September 18, 2026
+1 -1
View File
@@ -31,7 +31,7 @@
"@upstash/ratelimit": "^2.0.8",
"@upstash/redis": "^1.36.1",
"@vercel/analytics": "^1.6.1",
"@vercel/geistdocs": "2.4.1",
"@vercel/geistdocs": "2.7.5",
"@vercel/speed-insights": "^1.3.1",
"@visual-json/react": "0.1.1",
"ai": "^6.0.33",
+62
View File
@@ -1,3 +1,4 @@
import assert from "node:assert/strict";
import process from "node:process";
import { spawn } from "node:child_process";
import { createServer } from "node:net";
@@ -95,6 +96,67 @@ try {
"Docs server did not become ready. Run the docs build first.",
);
if (!stopping) {
const bridge = await fetch(`${url}/api/mcp?webmcp-script`, {
signal: AbortSignal.timeout(30000),
});
assert.equal(bridge.status, 200);
assert.match(bridge.headers.get("content-type") ?? "", /javascript/);
assert.match(await bridge.text(), /registerTool/);
console.log("PASS native WebMCP bridge returns JavaScript (200)");
const rpc = async (method, params = {}) => {
const response = await fetch(`${url}/api/mcp`, {
method: "POST",
headers: {
"content-type": "application/json",
accept: "application/json, text/event-stream",
},
body: JSON.stringify({ jsonrpc: "2.0", id: 1, method, params }),
signal: AbortSignal.timeout(30000),
});
assert.equal(response.status, 200);
const type = response.headers.get("content-type")?.split(";")[0];
assert.ok(["application/json", "text/event-stream"].includes(type));
const body = await response.text();
const messages =
type === "application/json"
? [JSON.parse(body)]
: body
.split(/\r?\n\r?\n/)
.map((event) =>
event
.split(/\r?\n/)
.filter((line) => line.startsWith("data:"))
.map((line) => line.slice(5).replace(/^ /, ""))
.join("\n"),
)
.filter(Boolean)
.map((data) => JSON.parse(data));
const replies = messages.filter((message) => message.id === 1);
assert.equal(replies.length, 1);
const [message] = replies;
assert.equal(message.jsonrpc, "2.0");
assert.equal(message.error, undefined);
return message.result;
};
const { tools } = await rpc("tools/list");
assert.deepEqual(
tools.map((tool) => tool.name),
["search_docs"],
);
console.log("PASS MCP tools/list exposes search_docs");
const result = await rpc("tools/call", {
name: "search_docs",
arguments: { query: "StateProvider", locale: "en" },
});
assert.notEqual(result.isError, true);
const matches = JSON.parse(
result.content.find((item) => item.type === "text").text,
);
assert.ok(matches.some((item) => item.url.startsWith("/docs/")));
console.log("PASS MCP tools/call returns actual docs search results");
tests = launch(["--test", "tests/docs-routes.test.mjs"], {
...process.env,
DOCS_TEST_URL: url,
+9 -2
View File
@@ -3,10 +3,17 @@ import {
geistdocsFrontmatterSchema,
geistdocsMetaSchema,
} from "@vercel/geistdocs/source-config";
import { defineConfig, defineDocs } from "fumadocs-mdx/config";
import {
defineConfig,
defineDocs,
type DocsCollection,
} from "fumadocs-mdx/config";
import { remarkLegacyHeadings } from "./lib/remark-legacy-headings";
export const docs = defineDocs({
export const docs: DocsCollection<
typeof geistdocsFrontmatterSchema,
typeof geistdocsMetaSchema
> = defineDocs({
dir: "content/docs",
docs: {
schema: geistdocsFrontmatterSchema,
+3 -3
View File
@@ -2139,9 +2139,9 @@
"title": "Changelog",
"metadataTitle": "Changelog | json-render",
"prefix": "import { pageMetadata } from \"@/lib/page-metadata\"\nexport const metadata = pageMetadata(\"docs/changelog\")\n\n# Changelog\n",
"sourceSha256": "645da4f33e85ac7bcb1642100bb0bde339dd2976c29f8501317f296c308e645e",
"bodySha256": "54a0b41153dd3afd0a0c69ef4c19575978615420eaf15075952b5c317b6a6b1c",
"markdownSha256": "73fa2d642e3235a7841b196625b948db486473c24c41deec1dbba07583706e2b",
"sourceSha256": "ad86126e05152567880b659abff2b27d88cc7b696d27b8c6640dda13c38dc9c3",
"bodySha256": "586921975f057696b57045a41fbdeba5d4f469a48592ea604f0262d65be3b74b",
"markdownSha256": "3836699e187adc31520d62b168b1f921b7f9df4272798ebc28d90bc76272b063",
"headings": [
{
"title": "v0.21.0",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/codegen",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "Utilities for generating code from json-render UI trees",
"keywords": [
+2 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/core",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "JSON becomes real things. Define your catalog, register your components, let AI generate.",
"keywords": [
@@ -47,6 +47,7 @@
"scripts": {
"build": "tsup",
"dev": "tsup --watch",
"check-types": "tsc -p tsconfig.check.json",
"typecheck": "tsc --noEmit"
},
"dependencies": {
+16
View File
@@ -1,6 +1,7 @@
import { describe, it, expect } from "vitest";
import { z } from "zod";
import { defineSchema, defineCatalog } from "./schema";
import type { Spec } from "./types";
// =============================================================================
// Shared test schema (mirrors the React schema shape)
@@ -565,6 +566,21 @@ describe("catalog.validate", () => {
actions: {},
});
it("returns data assignable to Spec", () => {
const result = catalog.validate({
root: "card-1",
elements: {
"card-1": { type: "Card", props: { title: "Hello" }, children: [] },
},
});
expect(result.success).toBe(true);
if (result.success && result.data) {
// s.any() fields such as `visible` must not infer as unknown.
const spec: Spec = result.data;
expect(spec.root).toBe("card-1");
}
});
it("validates a valid spec", () => {
const spec = {
root: "card-1",
+1 -1
View File
@@ -355,7 +355,7 @@ type InferSpecField<T, TCatalog> =
: T extends SchemaType<"propsOf", infer Path>
? InferPropsOfType<Path, TCatalog>
: T extends SchemaType<"any">
? unknown
? any
: unknown;
type InferRefType<Path, TCatalog> = Path extends "catalog.components"
+10
View File
@@ -152,6 +152,16 @@ describe("builtInValidationFunctions", () => {
expect(builtInValidationFunctions.numeric(NaN)).toBe(false);
expect(builtInValidationFunctions.numeric(null)).toBe(false);
});
it("fails for strings with trailing non-numeric characters", () => {
expect(builtInValidationFunctions.numeric("123abc")).toBe(false);
expect(builtInValidationFunctions.numeric("99bottles")).toBe(false);
});
it("fails for empty and whitespace-only strings", () => {
expect(builtInValidationFunctions.numeric("")).toBe(false);
expect(builtInValidationFunctions.numeric(" ")).toBe(false);
});
});
describe("url", () => {
+3 -1
View File
@@ -153,7 +153,9 @@ export const builtInValidationFunctions: Record<string, ValidationFunction> = {
*/
numeric: (value: unknown) => {
if (typeof value === "number") return !isNaN(value);
if (typeof value === "string") return !isNaN(parseFloat(value));
if (typeof value === "string") {
return value.trim() !== "" && !isNaN(Number(value));
}
return false;
},
+9
View File
@@ -0,0 +1,9 @@
{
// Type-checks the tests that assert inferred types. The full core
// project is not type-checked in CI yet.
"extends": "./tsconfig.json",
"compilerOptions": {
"noEmit": true
},
"include": ["src/schema.test.ts"]
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/devtools-react",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "React adapter for @json-render/devtools. Drop-in <JsonRenderDevtools /> component.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/devtools-solid",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "SolidJS adapter for @json-render/devtools. Drop-in <JsonRenderDevtools /> component.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/devtools-svelte",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "Svelte adapter for @json-render/devtools. Drop-in <JsonRenderDevtools /> component.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/devtools-vue",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "Vue adapter for @json-render/devtools. Drop-in <JsonRenderDevtools /> component.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/devtools",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "Framework-agnostic devtools core for json-render: event store, panel UI, picker, stream taps.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/directives",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "Pre-built directives for @json-render/core — $format, $math, $concat, $count, $truncate, $pluralize, $join, and $t (i18n).",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/image",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "Image renderer for @json-render/core. JSON becomes SVG and PNG images via Satori.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/ink",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "Ink terminal renderer for @json-render/core. JSON becomes terminal UIs.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/jotai",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "Jotai adapter for json-render StateStore",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/mcp",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "MCP Apps integration for @json-render/core. Serve json-render UIs as interactive MCP Apps in Claude, ChatGPT, Cursor, and VS Code.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/next",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "Next.js renderer for @json-render/core. JSON becomes full Next.js applications with routes, layouts, metadata, and SSR.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/react-email",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "React Email renderer for @json-render/core. JSON becomes HTML emails.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/react-native",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "React Native renderer for @json-render/core. JSON becomes React Native components.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/react-pdf",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "React PDF renderer for @json-render/core. JSON becomes PDF documents.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/react-three-fiber",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "React Three Fiber renderer for @json-render/core. JSON becomes 3D scenes.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/react",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "React renderer for @json-render/core. JSON becomes React components.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/redux",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "Redux adapter for json-render StateStore",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/remotion",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "Remotion renderer for @json-render/core. JSON becomes video compositions.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/shadcn-svelte",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "shadcn-svelte component library for @json-render/svelte. JSON becomes beautiful Tailwind-styled Svelte components.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/shadcn",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "shadcn/ui component library for @json-render/core. JSON becomes beautiful Tailwind-styled React components.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/solid",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "SolidJS renderer for @json-render/core. JSON becomes Solid components.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/svelte",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "Svelte 5 renderer for @json-render/core. JSON becomes Svelte components.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/tanstack-start",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "TanStack Start renderer for @json-render/core. JSON becomes full TanStack Start applications with routes, layouts, head metadata, and SSR.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/vue",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "Vue renderer for @json-render/core. JSON becomes Vue components.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/xstate",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "XState Store adapter for json-render StateStore",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/yaml",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "YAML wire format for @json-render/core. Progressive rendering and surgical edits via streaming YAML.",
"keywords": [
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@json-render/zustand",
"version": "0.21.0",
"version": "0.21.1",
"license": "Apache-2.0",
"description": "Zustand adapter for json-render StateStore",
"keywords": [
+136 -15
View File
@@ -125,8 +125,8 @@ importers:
specifier: ^1.6.1
version: 1.6.1(@sveltejs/kit@2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.54.1)(vite@7.3.1(@types/node@22.19.6)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1)(typescript@5.9.2)(vite@7.3.1(@types/node@22.19.6)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(next@16.3.4(patch_hash=a620718f9d934500c4f0364aa9312b2539559e0ac911cdc37c97b92e1e9b4550)(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@22.19.6)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(svelte@5.54.1)(vue@3.5.29(typescript@5.9.2))
'@vercel/geistdocs':
specifier: 2.4.1
version: 2.4.1(4d4756382f845489d64dfb2804df7ab8)
specifier: 2.7.5
version: 2.7.5(4d4756382f845489d64dfb2804df7ab8)
'@vercel/speed-insights':
specifier: ^1.3.1
version: 1.3.1(@sveltejs/kit@2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.54.1)(vite@7.3.1(@types/node@22.19.6)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1)(typescript@5.9.2)(vite@7.3.1(@types/node@22.19.6)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(next@16.3.4(patch_hash=a620718f9d934500c4f0364aa9312b2539559e0ac911cdc37c97b92e1e9b4550)(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@22.19.6)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(svelte@5.54.1)(vue@3.5.29(typescript@5.9.2))
@@ -1528,10 +1528,10 @@ importers:
dependencies:
'@ai-sdk/gateway':
specifier: ^3.0.50
version: 3.0.57(zod@4.3.6)
version: 3.0.57(zod@4.6.5)
ai:
specifier: ^6.0.91
version: 6.0.103(zod@4.3.6)
version: 6.0.103(zod@4.6.5)
next:
specifier: ^16.1.6
version: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
@@ -2110,10 +2110,10 @@ importers:
version: link:../core
'@modelcontextprotocol/ext-apps':
specifier: ^1.2.0
version: 1.2.0(@modelcontextprotocol/sdk@1.27.1(zod@4.3.6))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6)
version: 1.2.0(@modelcontextprotocol/sdk@1.27.1(zod@4.6.5))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.6.5)
'@modelcontextprotocol/sdk':
specifier: ^1.27.1
version: 1.27.1(zod@4.3.6)
version: 1.27.1(zod@4.6.5)
react:
specifier: ^19.0.0
version: 19.2.4
@@ -5128,6 +5128,10 @@ packages:
'@mistralai/mistralai@2.2.1':
resolution: {integrity: sha512-uKU8CZmL2RzYKmplsU01hii4p3pe4HqJefpWNRWXm1Tcm0Sm4xXfwSLIy4k7ZCPlbETCGcp69E7hZs+WOJ5itQ==}
'@modelcontextprotocol/core@2.1.0':
resolution: {integrity: sha512-YdFj5gMRHr0gYNAhTbQDgjLHiEJdIAUYxomhKseUNye7ZGlISQmUoLh2sveFFCiQ7j2YMffT1kgSND0FSfIFjQ==}
engines: {node: '>=20'}
'@modelcontextprotocol/ext-apps@1.2.0':
resolution: {integrity: sha512-ijUQJX/FmNq8PWgOLzph/BAfy84sUZxoIRuHzr+F37wYtWjhdl8pliBJybapYolppY+XJ8oqjFZmTOuMqxwbWQ==}
peerDependencies:
@@ -5161,6 +5165,10 @@ packages:
'@cfworker/json-schema':
optional: true
'@modelcontextprotocol/server@2.1.0':
resolution: {integrity: sha512-FdvwZU5N03O77Suh35JqjAqq5R1ZTEPFtwu6N4BgBq28qrQtrCnpbLL5U2pwYCuE194jAw0xnlOVmIqhfoYuUQ==}
engines: {node: '>=20'}
'@monogrid/gainmap-js@3.4.0':
resolution: {integrity: sha512-2Z0FATFHaoYJ8b+Y4y4Hgfn3FRFwuU5zRrk+9dFWp4uGAdHGqVEdP7HP+gLA3X469KXHmfupJaUbKo1b/aDKIg==}
peerDependencies:
@@ -9009,8 +9017,8 @@ packages:
resolution: {integrity: sha512-g9XerViJ/paZujufXYcu5XYI2vU2rtB4sgdpjUHde5RnOkdmpu0ngH46LCFGHoPXO/C+qDPSczIHIRN+8Q2YKQ==}
engines: {node: '>= 18'}
'@vercel/geistdocs@2.4.1':
resolution: {integrity: sha512-mTGqEWG0SATR95I2sKzG37UEllFQRwfKVCy0mYY7Iu0Vrq6Nr4Iere7DlDrnPVMXUIT2ksFBz9qhlXrum+9+4Q==}
'@vercel/geistdocs@2.7.5':
resolution: {integrity: sha512-SjEOusPjrviI0fO3NPWCmL/Kw/63Yh3Hyb3ysxyZg0+cLrlRoMxq2YqeQ1deI85xZhva5i3vSR22r+rw+FSw1w==}
hasBin: true
peerDependencies:
next: ^16.3.3
@@ -13127,6 +13135,17 @@ packages:
resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
engines: {node: '>= 0.4'}
mcp-handler@2.2.0:
resolution: {integrity: sha512-loJsIem4jM1jLUsI4x2errOHSzvU+Et6XV4Aqq1AEUkHOqridUoY4dLM02OlRfsku+OjtMlk+tHyYjpfO65X6g==}
engines: {node: '>=20'}
hasBin: true
peerDependencies:
'@modelcontextprotocol/server': ^2.0.0
next: '>=13.0.0'
peerDependenciesMeta:
next:
optional: true
mdast-util-find-and-replace@3.0.2:
resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==}
@@ -16592,6 +16611,9 @@ packages:
zod@4.3.6:
resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==}
zod@4.6.5:
resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==}
zustand@4.5.7:
resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==}
engines: {node: '>=12.7.0'}
@@ -16661,6 +16683,13 @@ snapshots:
'@vercel/oidc': 3.2.0
zod: 4.3.6
'@ai-sdk/gateway@3.0.104(zod@4.6.5)':
dependencies:
'@ai-sdk/provider': 3.0.8
'@ai-sdk/provider-utils': 4.0.23(zod@4.6.5)
'@vercel/oidc': 3.2.0
zod: 4.6.5
'@ai-sdk/gateway@3.0.39(zod@4.3.6)':
dependencies:
'@ai-sdk/provider': 3.0.8
@@ -16696,6 +16725,13 @@ snapshots:
'@vercel/oidc': 3.1.0
zod: 4.3.6
'@ai-sdk/gateway@3.0.57(zod@4.6.5)':
dependencies:
'@ai-sdk/provider': 3.0.8
'@ai-sdk/provider-utils': 4.0.15(zod@4.6.5)
'@vercel/oidc': 3.1.0
zod: 4.6.5
'@ai-sdk/gateway@3.0.66(zod@4.3.6)':
dependencies:
'@ai-sdk/provider': 3.0.8
@@ -16792,6 +16828,13 @@ snapshots:
eventsource-parser: 3.0.6
zod: 4.3.6
'@ai-sdk/provider-utils@4.0.15(zod@4.6.5)':
dependencies:
'@ai-sdk/provider': 3.0.8
'@standard-schema/spec': 1.1.0
eventsource-parser: 3.0.6
zod: 4.6.5
'@ai-sdk/provider-utils@4.0.19(zod@4.3.6)':
dependencies:
'@ai-sdk/provider': 3.0.8
@@ -16806,6 +16849,13 @@ snapshots:
eventsource-parser: 3.0.6
zod: 4.3.6
'@ai-sdk/provider-utils@4.0.23(zod@4.6.5)':
dependencies:
'@ai-sdk/provider': 3.0.8
'@standard-schema/spec': 1.1.0
eventsource-parser: 3.0.6
zod: 4.6.5
'@ai-sdk/provider-utils@5.0.0-canary.48(zod@3.25.76)':
dependencies:
'@ai-sdk/provider': 4.0.0-canary.18
@@ -16830,10 +16880,10 @@ snapshots:
dependencies:
json-schema: 0.4.0
'@ai-sdk/react@3.0.170(react@19.2.3)(zod@4.3.6)':
'@ai-sdk/react@3.0.170(react@19.2.3)(zod@4.6.5)':
dependencies:
'@ai-sdk/provider-utils': 4.0.23(zod@4.3.6)
ai: 6.0.168(zod@4.3.6)
'@ai-sdk/provider-utils': 4.0.23(zod@4.6.5)
ai: 6.0.168(zod@4.6.5)
react: 19.2.3
swr: 2.4.0(react@19.2.3)
throttleit: 2.1.0
@@ -19420,6 +19470,10 @@ snapshots:
- bufferutil
- utf-8-validate
'@modelcontextprotocol/core@2.1.0':
dependencies:
zod: 4.3.6
'@modelcontextprotocol/ext-apps@1.2.0(@modelcontextprotocol/sdk@1.27.1(zod@4.3.6))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.3.6)':
dependencies:
'@modelcontextprotocol/sdk': 1.27.1(zod@4.3.6)
@@ -19428,6 +19482,14 @@ snapshots:
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
'@modelcontextprotocol/ext-apps@1.2.0(@modelcontextprotocol/sdk@1.27.1(zod@4.6.5))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@4.6.5)':
dependencies:
'@modelcontextprotocol/sdk': 1.27.1(zod@4.6.5)
zod: 4.6.5
optionalDependencies:
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
'@modelcontextprotocol/sdk@1.26.0(zod@3.25.76)':
dependencies:
'@hono/node-server': 1.19.9(hono@4.12.0)
@@ -19472,6 +19534,33 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@modelcontextprotocol/sdk@1.27.1(zod@4.6.5)':
dependencies:
'@hono/node-server': 1.19.9(hono@4.12.0)
ajv: 8.17.1
ajv-formats: 3.0.1(ajv@8.17.1)
content-type: 1.0.5
cors: 2.8.6
cross-spawn: 7.0.6
eventsource: 3.0.7
eventsource-parser: 3.0.6
express: 5.2.1
express-rate-limit: 8.2.1(express@5.2.1)
hono: 4.12.0
jose: 6.1.3
json-schema-typed: 8.0.2
pkce-challenge: 5.0.1
raw-body: 3.0.2
zod: 4.6.5
zod-to-json-schema: 3.25.1(zod@4.6.5)
transitivePeerDependencies:
- supports-color
'@modelcontextprotocol/server@2.1.0':
dependencies:
'@modelcontextprotocol/core': 2.1.0
zod: 4.3.6
'@monogrid/gainmap-js@3.4.0(three@0.182.0)':
dependencies:
promise-worker-transferable: 1.0.4
@@ -24756,10 +24845,11 @@ snapshots:
dependencies:
execa: 5.1.1
'@vercel/geistdocs@2.4.1(4d4756382f845489d64dfb2804df7ab8)':
'@vercel/geistdocs@2.7.5(4d4756382f845489d64dfb2804df7ab8)':
dependencies:
'@ai-sdk/react': 3.0.170(react@19.2.3)(zod@4.3.6)
'@ai-sdk/react': 3.0.170(react@19.2.3)(zod@4.6.5)
'@clack/prompts': 0.11.0
'@modelcontextprotocol/server': 2.1.0
'@next/env': 16.3.3
'@orama/tokenizers': 3.1.18
'@streamdown/cjk': 1.0.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(react@19.2.3)(unified@11.0.5)
@@ -24767,7 +24857,7 @@ snapshots:
'@types/react': 19.2.14
'@vercel/agent-readability': 0.7.0(@sveltejs/kit@2.53.2(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@6.2.4(svelte@5.54.1)(vite@7.3.1(@types/node@22.19.6)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.54.1)(typescript@5.9.2)(vite@7.3.1(@types/node@22.19.6)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)))(next@16.3.4(patch_hash=a620718f9d934500c4f0364aa9312b2539559e0ac911cdc37c97b92e1e9b4550)(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@22.19.6)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))
'@vercel/oidc': 3.8.7
ai: 6.0.168(zod@4.3.6)
ai: 6.0.168(zod@4.6.5)
class-variance-authority: 0.7.1
clsx: 2.1.1
commander: 14.0.2
@@ -24778,6 +24868,7 @@ snapshots:
fumadocs-ui: 16.2.2(@tanstack/react-router@1.170.32(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react-dom@19.2.3(@types/react@19.2.3))(@types/react@19.2.14)(lucide-react@0.562.0(react@19.2.3))(next@16.3.4(patch_hash=a620718f9d934500c4f0364aa9312b2539559e0ac911cdc37c97b92e1e9b4550)(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@22.19.6)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.2.1)
geist: 1.7.1(next@16.3.4(patch_hash=a620718f9d934500c4f0364aa9312b2539559e0ac911cdc37c97b92e1e9b4550)(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@22.19.6)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))
glob: 11.1.0
mcp-handler: 2.2.0(@modelcontextprotocol/server@2.1.0)(next@16.3.4(patch_hash=a620718f9d934500c4f0364aa9312b2539559e0ac911cdc37c97b92e1e9b4550)(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@22.19.6)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))
mermaid: 11.15.0
motion: 12.43.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
next: 16.3.4(patch_hash=a620718f9d934500c4f0364aa9312b2539559e0ac911cdc37c97b92e1e9b4550)(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@22.19.6)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
@@ -24803,7 +24894,7 @@ snapshots:
unist-util-visit: 5.1.0
use-stick-to-bottom: 1.1.6(react@19.2.3)
vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.3))(@types/react@19.2.14)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
zod: 4.3.6
zod: 4.6.5
transitivePeerDependencies:
- '@emotion/is-prop-valid'
- '@fumadocs/mdx-remote'
@@ -25206,6 +25297,14 @@ snapshots:
'@opentelemetry/api': 1.9.0
zod: 4.3.6
ai@6.0.103(zod@4.6.5):
dependencies:
'@ai-sdk/gateway': 3.0.57(zod@4.6.5)
'@ai-sdk/provider': 3.0.8
'@ai-sdk/provider-utils': 4.0.15(zod@4.6.5)
'@opentelemetry/api': 1.9.0
zod: 4.6.5
ai@6.0.116(zod@4.3.6):
dependencies:
'@ai-sdk/gateway': 3.0.66(zod@4.3.6)
@@ -25222,6 +25321,14 @@ snapshots:
'@opentelemetry/api': 1.9.0
zod: 4.3.6
ai@6.0.168(zod@4.6.5):
dependencies:
'@ai-sdk/gateway': 3.0.104(zod@4.6.5)
'@ai-sdk/provider': 3.0.8
'@ai-sdk/provider-utils': 4.0.23(zod@4.6.5)
'@opentelemetry/api': 1.9.0
zod: 4.6.5
ai@6.0.77(zod@4.3.6):
dependencies:
'@ai-sdk/gateway': 3.0.39(zod@4.3.6)
@@ -29842,6 +29949,14 @@ snapshots:
math-intrinsics@1.1.0: {}
mcp-handler@2.2.0(@modelcontextprotocol/server@2.1.0)(next@16.3.4(patch_hash=a620718f9d934500c4f0364aa9312b2539559e0ac911cdc37c97b92e1e9b4550)(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@22.19.6)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)):
dependencies:
'@modelcontextprotocol/server': 2.1.0
chalk: 5.6.2
commander: 11.1.0
optionalDependencies:
next: 16.3.4(patch_hash=a620718f9d934500c4f0364aa9312b2539559e0ac911cdc37c97b92e1e9b4550)(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@types/node@22.19.6)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
mdast-util-find-and-replace@3.0.2:
dependencies:
'@types/mdast': 4.0.4
@@ -34776,6 +34891,10 @@ snapshots:
dependencies:
zod: 4.3.6
zod-to-json-schema@3.25.1(zod@4.6.5):
dependencies:
zod: 4.6.5
zod@3.22.3: {}
zod@3.25.76: {}
@@ -34784,6 +34903,8 @@ snapshots:
zod@4.3.6: {}
zod@4.6.5: {}
zustand@4.5.7(@types/react@19.2.3)(immer@11.1.4)(react@19.2.4):
dependencies:
use-sync-external-store: 1.6.0(react@19.2.4)