CLI: Add AI chat option for Next.js

This commit is contained in:
Fuma Nama
2026-03-11 21:52:24 +08:00
parent 42e17a4d6f
commit e7ab32989d
9 changed files with 264 additions and 234 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'create-fumadocs-app': patch
---
Add AI chat option for Next.js
+10 -8
View File
@@ -99,10 +99,6 @@ export const registry: Registry = {
path: 'components/openrouter/search.tsx',
target: '<dir>/ai/search.tsx',
},
{
type: 'components',
path: 'components/markdown.tsx',
},
{
type: 'route',
path: 'lib/openrouter/server.ts',
@@ -113,6 +109,16 @@ export const registry: Registry = {
flexsearch: '^0.8.212',
},
},
{
name: 'markdown',
unlisted: true,
files: [
{
type: 'components',
path: 'components/markdown.tsx',
},
],
},
{
name: 'ai/inkeep',
title: 'AI Chat (Next.js + Inkeep AI)',
@@ -123,10 +129,6 @@ export const registry: Registry = {
path: 'components/inkeep/search.tsx',
target: '<dir>/ai/search.tsx',
},
{
type: 'components',
path: 'components/markdown.tsx',
},
{
type: 'route',
path: 'lib/inkeep/server.ts',
+1 -1
View File
@@ -56,7 +56,7 @@ const openrouter = createOpenRouter({
});
const systemPrompt = [
'You are an AI assistant for the Fumadocs documentation site.',
'You are an AI assistant for a documentation site.',
'Use the `search` tool to retrieve relevant docs context before answering when needed.',
'The `search` tool returns raw JSON results from documentation. Use those results to ground your answer and cite sources as markdown links using the document `url` field when available.',
'If you cannot find the answer in search results, say you do not know and suggest a better search query.',
+10 -7
View File
@@ -12,8 +12,12 @@ import { parse } from 'oxc-parser';
import { ResolverFactory } from 'oxc-resolver';
import MagicString from 'magic-string';
import { transformSpecifiers } from '@/utils/ast';
import { isRelative } from '@/utils/fs';
export type OnResolve = (reference: SourceReference) => Reference;
export type OnResolve = (
reference: SourceReference,
from: { component: Component; file: ComponentFile },
) => Reference;
export interface CompiledRegistry {
name: string;
@@ -404,9 +408,8 @@ export class ComponentCompiler {
}
const s = new MagicString(content);
/**
* Process import paths
*/
const ctx = { component: this.component, file };
// Process import paths
transformSpecifiers(ast.program, s, (specifier) => {
let resolved: Reference = {
type: 'unknown-specifier',
@@ -415,7 +418,7 @@ export class ComponentCompiler {
const onResolve = this.component.onResolve ?? this.registry.onResolve;
const resolvedSpecifier = resolver.oxc.resolveFileSync(sourceFilePath, specifier);
if (resolvedSpecifier.error || !resolvedSpecifier.path) {
return writeReference(onResolve ? onResolve(resolved) : resolved);
return writeReference(onResolve ? onResolve(resolved, ctx) : resolved);
}
resolved = {
@@ -424,7 +427,7 @@ export class ComponentCompiler {
};
// outside of registry dir
if (path.relative(this.registry.dir, resolvedSpecifier.path).startsWith('../')) {
if (!isRelative(this.registry.dir, resolvedSpecifier.path)) {
resolved = {
type: 'dependency',
dep: resolver.getDepFromSpecifier(specifier),
@@ -444,7 +447,7 @@ export class ComponentCompiler {
}
}
return writeReference(onResolve ? onResolve(resolved) : resolved);
return writeReference(onResolve ? onResolve(resolved, ctx) : resolved);
});
return {
+1
View File
@@ -44,6 +44,7 @@
"dependencies": {
"@clack/prompts": "^1.1.0",
"@commander-js/extra-typings": "^14.0.0",
"@fumadocs/cli": "workspace:*",
"commander": "^14.0.3",
"picocolors": "^1.1.1",
"tinyexec": "^1.0.2",
+37
View File
@@ -35,6 +35,12 @@ const command = program
.addOption(
new Option('--og-image <name>', 'configure OG image generation').choices(['next-og', 'takumi']),
)
.addOption(
new Option('--ai-chat <name>', 'configure AI chat (Next.js only)').choices([
'openrouter',
'inkeep',
]),
)
.addOption(
new Option('--template <name>', 'choose a template').choices(
templates.map((item) => item.value),
@@ -157,6 +163,31 @@ async function main(): Promise<void> {
],
});
},
aiChat: async ({ results }: { results: { template?: Template } }) => {
if (config.aiChat !== undefined) return config.aiChat;
if (results.template !== '+next+fuma-docs-mdx') return false;
if (isCI) return false;
return select<false | 'openrouter' | 'inkeep'>({
message: 'Configure AI Chat?',
options: [
{
value: false,
label: 'No',
},
{
value: 'openrouter',
label: 'OpenRouter',
hint: 'API key required',
},
{
value: 'inkeep',
label: 'Inkeep AI',
hint: 'API key required',
},
],
});
},
installDeps: async () => {
if (config.install !== undefined) return config.install;
if (isCI) return false;
@@ -206,6 +237,12 @@ async function main(): Promise<void> {
plugins.push(nextUseTakumi());
}
if (options.aiChat) {
const { nextUseAi } = await import('./plugins/next-use-ai');
plugins.push(nextUseAi(options.aiChat));
}
await create({
packageManager: config.pm,
template: options.template,
@@ -0,0 +1,95 @@
import { TemplatePlugin, TemplatePluginContext } from '@/index';
import { ComponentInstaller } from '@fumadocs/cli/registry/installer';
import { getDefaultConfig } from '@fumadocs/cli/config';
import { HttpRegistryClient } from '@fumadocs/cli/registry/client';
import { createSourceFile } from '@/transform/shared';
import path from 'node:path';
import fs from 'node:fs/promises';
import { SyntaxKind } from 'ts-morph';
export function nextUseAi(provider: 'openrouter' | 'inkeep'): TemplatePlugin {
return {
async afterWrite() {
if (this.template.value === '+next+fuma-docs-mdx') {
const config = await getDefaultConfig();
await install(
`ai/${provider}`,
new ComponentInstaller(new HttpRegistryClient('https://fumadocs.dev/registry', config), {
cwd: this.dest,
}),
);
await addAIChat(this);
await fs.writeFile(
path.join(this.dest, '.env.local'),
provider === 'openrouter' ? 'OPENROUTER_API_KEY=' : 'INKEEP_API_KEY=',
);
}
},
};
}
async function install(target: string, installer: ComponentInstaller) {
try {
await installer.install(target, {
onWarn() {},
async confirmFileOverride() {
return true;
},
onFileDownloaded() {},
});
} catch (e) {
console.error(e instanceof Error ? e.message : String(e));
process.exit(-1);
}
const deps = await installer.deps();
if (deps.hasRequired()) await deps.installRequired();
await installer.onEnd();
}
async function addAIChat({ appDir }: TemplatePluginContext) {
const file = await createSourceFile(path.join(appDir, 'app/layout.tsx'));
const elements = file.getDescendantsOfKind(SyntaxKind.JsxElement);
const code = `<AISearch>
<AISearchPanel />
<AISearchTrigger
position="float"
className={cn(
buttonVariants({
variant: 'secondary',
className: 'text-fd-muted-foreground rounded-2xl',
}),
)}
>
<MessageCircleIcon className="size-4.5" />
Ask AI
</AISearchTrigger>
</AISearch>`;
for (const element of elements) {
const opening = element.getFirstChildByKind(SyntaxKind.JsxOpeningElement);
if (opening?.getTagNameNode().getText() !== 'body') continue;
const prior = element
.getJsxChildren()
.map((child) => child.print().trim())
.join('\n');
element.setBodyText(`${code}\n\n${prior}`);
break;
}
file.addImportDeclaration({
moduleSpecifier: '@/components/ai/search',
namedImports: ['AISearch', 'AISearchPanel', 'AISearchTrigger'],
});
file.addImportDeclaration({
moduleSpecifier: 'lucide-react',
namedImports: ['MessageCircleIcon'],
});
file.addImportDeclaration({
moduleSpecifier: 'fumadocs-ui/components/ui/button',
namedImports: ['buttonVariants'],
});
await file.save();
}
@@ -2,6 +2,8 @@ import { IndentationText, Project, QuoteKind } from 'ts-morph';
import fs from 'node:fs/promises';
const project = new Project({
skipAddingFilesFromTsConfig: true,
skipLoadingLibFiles: true,
manipulationSettings: {
indentationText: IndentationText.TwoSpaces,
quoteKind: QuoteKind.Single,
+103 -218
View File
@@ -1085,7 +1085,7 @@ importers:
version: 19.2.3(@types/[email protected])
'@vitejs/plugin-rsc':
specifier: ^0.5.21
version: 0.5.21([email protected]([email protected]))([email protected]([email protected]([email protected]))([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))
version: 0.5.21([email protected]([email protected]))([email protected]([email protected]([email protected]))([email protected])([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))
react-router-devtools:
specifier: ^6.2.0
version: 6.2.0(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected])([email protected]([email protected]))([email protected]([email protected]([email protected]))([email protected]))([email protected])([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))
@@ -1185,7 +1185,7 @@ importers:
version: 1.166.7(@tanstack/[email protected]([email protected]([email protected]))([email protected]))(@tanstack/[email protected])([email protected])([email protected]([email protected]))([email protected])
'@tanstack/react-start':
specifier: 1.166.7
version: 1.166.7([email protected])([email protected]([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected])
version: 1.166.7([email protected]([email protected]))([email protected]([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected])
fumadocs-core:
specifier: workspace:*
version: link:../../packages/core
@@ -1322,7 +1322,7 @@ importers:
version: 1.166.7(@tanstack/[email protected]([email protected]([email protected]))([email protected]))(@tanstack/[email protected])([email protected])([email protected]([email protected]))([email protected])
'@tanstack/react-start':
specifier: 1.166.7
version: 1.166.7([email protected])([email protected]([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected])
version: 1.166.7([email protected]([email protected]))([email protected]([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected])
fumadocs-core:
specifier: workspace:*
version: link:../../packages/core
@@ -1392,7 +1392,7 @@ importers:
version: 1.166.7(@tanstack/[email protected]([email protected]([email protected]))([email protected]))(@tanstack/[email protected])([email protected])([email protected]([email protected]))([email protected])
'@tanstack/react-start':
specifier: 1.166.7
version: 1.166.7([email protected])([email protected]([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected])
version: 1.166.7([email protected]([email protected]))([email protected]([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected])
'@tanstack/start-static-server-functions':
specifier: 1.166.7
version: 1.166.7(@tanstack/[email protected]([email protected]([email protected]))([email protected]([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected]))
@@ -1654,7 +1654,7 @@ importers:
version: link:../tailwind
'@takumi-rs/image-response':
specifier: '*'
version: 0.70.4
version: 0.71.7
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
@@ -1980,6 +1980,9 @@ importers:
'@commander-js/extra-typings':
specifier: ^14.0.0
version: 14.0.0([email protected])
'@fumadocs/cli':
specifier: workspace:*
version: link:../cli
commander:
specifier: ^14.0.3
version: 14.0.3
@@ -2734,7 +2737,7 @@ importers:
version: 1.1.13(@types/[email protected](@types/[email protected]))(@types/[email protected])([email protected]([email protected]))([email protected])
'@takumi-rs/image-response':
specifier: '*'
version: 0.70.4
version: 0.71.7
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
@@ -3994,15 +3997,9 @@ packages:
'@fastify/[email protected]':
resolution: {integrity: sha512-N5Oqvltoa2r9z1tbx4xjky0oRR60v+T47Ic4J1ukoVQcptLOrIdRnCSdTGmOmajZuHVKlTnfcmrjyqsGEW1ztA==}
'@floating-ui/[email protected]':
resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==}
'@floating-ui/[email protected]':
resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==}
'@floating-ui/[email protected]':
resolution: {integrity: sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==}
'@floating-ui/[email protected]':
resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==}
@@ -6489,125 +6486,64 @@ packages:
peerDependencies:
vite: ^5.2.0 || ^6 || ^7
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-rl/iZMZTL4oCV4/AYUWapfGd+/UNENMt5BOtXrIwxwsVswS5LgZVDxqD0/ngApCxhvcK0oHCDBQWUqRAzO17TA==}
engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'}
cpu: [arm64]
os: [darwin]
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-mcW/ikpqj4QToZfvC6JY1nxnCpnvioOUm9QsXiGnjmr7z/zei1Xf4GKl67P/3dEXU6bi7gqsmEf+XOc66E6taQ==}
engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'}
cpu: [arm64]
os: [darwin]
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-d7PUmO9X0LWDtCqvHBA7xWEDcb97oW17FnCxQzP45fXNJ3kiDeHR7MKEgLA/iFWVuCiqwtoo/4IkJplS47VlZA==}
engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'}
cpu: [x64]
os: [darwin]
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-xvhulaXxTWxpMsj7Fqm88KpltQstz6cR2gW1CijdPQd/DEi+k5xso3AM/kH/E80qxCXYItbyyZlLlG7gog9mzg==}
engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'}
cpu: [x64]
os: [darwin]
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-a80EcGlsLggK9H/XsD+TGIIcSA/mGn/EP/k7XcVjV+R80cjr60NrDSTwtqKfsC9bg5AQG2wcGjoh5j18TYRrxQ==}
engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'}
cpu: [arm64]
os: [linux]
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-H3JBWt0DlfCMinAMvQyaG3cUF1hI6/f+tSzgXSezg/J8f+vYJaOBOBAE8YXLtBb/+VZe5RzyvMgNsT1+6LNrMw==}
engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'}
cpu: [arm64]
os: [linux]
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-8EXmcU9H3I9eydxhK8ZxtmyZa6lWaKuxz223kxBqUTQ7Zg9H7yBcGG5JKxQGt/QS0olANjSfXv1f28dYJF9pAw==}
engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'}
cpu: [arm64]
os: [linux]
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-QkFSh0qabNioGGvZYmXqkTCeuyUAlfkhClo7sl6jfnU2wodG2f0sIcvVLPLshRQBUbY6Rf8ktjp75TVQZFw1HQ==}
engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'}
cpu: [arm64]
os: [linux]
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-A32LzsEyXwdaLUCfxLK73F5OUYHbbAbDel1ACzkdsmE7clOQFKuP6pW3lXI9OuTUl5r7cpBAhcK2ObzqrTdoIA==}
engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'}
cpu: [x64]
os: [linux]
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-CNSR1x2OPjlnpqY6nksTsp0bTp+41IbXE85TwippLST5NrRokL9xKJ6EM+AFaSfLH/0gy+XMgtOQoD1C+TFDUA==}
engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'}
cpu: [x64]
os: [linux]
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-OLrZXkz9/H37vuHihmQlrJBgsNd0vXbGMFc+Vec+mZoIB3oF9WShI9nyAULUldF+vM6Z+OrXm23dGB/DOoDykg==}
engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'}
cpu: [x64]
os: [linux]
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-xDtS7YuFkr6UtaJ812cxbkx8d0ShzxavQwz59YSTCB1Q0aiW9fnAu7WZeP9rrPRctn3y5sp3DUVyzONvwfCa1w==}
engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'}
cpu: [x64]
os: [linux]
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-Bgc0VGbg+V0B7RNo08A9sikFfbD7bwPiLKoWlGeSr4Vr/95u/UyF+l/mozN75PRWAGPdNE2v2h6IzV1FEMXK7w==}
engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'}
cpu: [arm64]
os: [win32]
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-2AhdKHby2Hor+d3yrhiZNpght7YXItWN1WXNiK/m/uqKKlmrq7oqgUmdn0/5ks5cZ/JaLjfsLFlgIB2uPReFYA==}
engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'}
cpu: [arm64]
os: [win32]
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-Iah4b4XLbiehplyITYJ5oaikefVp16rpvpWiwgmItT82oUZfnomQKj1x1ojjAKgRCZ/5M2DV4+4cf/KFFosrew==}
engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'}
cpu: [x64]
os: [win32]
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-jZLSrrCv118zP1yAXURjHdHtpWswEiml3mwbJ+ypHKPaLppstpPtQVwRyOUe2GBC/OIGjz1lLl8dEKucJ+P67Q==}
engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'}
cpu: [x64]
os: [win32]
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-wedpLgaeuJWZfahBOGdo8RV0MtKc8WFaD2YbozlnRcw0ehooI2xupuFlhWpKyKkFjb/REIqnEJRiiTkMqGG3/Q==}
engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'}
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-5wWs4GNMOcHsJQ6dhpAe0Fk/2mUy40AL2cETSqrt/H21xsGGSsCacGpPpPoIqK4DwdoJyFxoxLwhDGId8WrzOA==}
engines: {node: '>= 12.22.0 < 13 || >= 14.17.0 < 15 || >= 15.12.0 < 16 || >= 16.0.0'}
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-kzxCcsNHMziZKHBw4Zu8ceiBwYcUzVt4s0vxpDVMNknSgBd09yZnJG3U1OiSSjoI94f5AcF6i/qgr7wq4dgaaQ==}
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-OipwcnYZjfZz6OJ/sUdvUDkVfe/n5TksdB4sBuSmN+qoCpu42usdd3VPOHHdARZyHgbahxaNmnPSqfE5HGI47w==}
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-h0nyKvU4470STunToY+uA2OFbVIFZiHDwPj9qZWUKf5BspXnZuXaaCnhMitORSKhqI9LxWjS3DpuE30yaYBuJw==}
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-CRdhVEJqKse9+eovVc8CGHisCAXxPNRuZZJ2tUHzrDBFGaNp99+tX6hAim7wUWbo+NEXN7KOkaESqp/MCrhUbw==}
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-gl5JQv1MCgKkndxqZf7H/SBvuezZCg4n74CXBVcjP2eXC+ZGtStM4J6KMQYdP8mCF3Y9cD2Fdfezyx9KfJsOOg==}
'@takumi-rs/[email protected]':
resolution: {integrity: sha512-yoau96mSOvG4kSSdypWfpvAacjK4r5tHlg90kOkAcXDp/UFe3npEwNsGe5DzHdKqTpHWsr2tzmEdhjnZW4v2VQ==}
@@ -8830,9 +8766,6 @@ packages:
resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
engines: {node: '>=16'}
[email protected]:
resolution: {integrity: sha512-3+mMldrTAPdta5kjX2G2J7iX4zxtnwpdA8Tr2ZSjkyPSanvbZAcy6flmtnXbEybHrDcU9641lxrMfFuUxVz9vA==}
[email protected]:
resolution: {integrity: sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==}
@@ -8880,20 +8813,6 @@ packages:
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
engines: {node: '>= 0.6'}
[email protected]:
resolution: {integrity: sha512-w8hghCMQ4oq10j6aZh3U2yeEQv5K69O/seDI/41PK4HtgkLrcBovUNc0ayBC3UyyU7V1mrY2yLzvYdWJX9pGZQ==}
peerDependencies:
'@emotion/is-prop-valid': '*'
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
peerDependenciesMeta:
'@emotion/is-prop-valid':
optional: true
react:
optional: true
react-dom:
optional: true
[email protected]:
resolution: {integrity: sha512-dhfuEMaNo0hc+AEqyHiIfiJRNb9U9UQutE9FoKm5pjf7CMitp9xPEF1iWZihR1q86LBmo6EJ7S8cN8QXEy49AA==}
peerDependencies:
@@ -9064,16 +8983,6 @@ packages:
[email protected]:
resolution: {integrity: sha512-oi15ESLW5LRthZ+qPCi5GNasY/gvynSKUQxgiovrY63bPAtG59wtM+LSrlcwvOHAXzGrXVLnI97brbkdPF9WoQ==}
[email protected]:
resolution: {integrity: sha512-163qbGmTr/9rqQRNuqMqtgXnOUAkE4KTdauiC9y0E5iG1I65kte9NyfWvZw5RTDMt6eY+DtyoNzrQ9wA2BfvGQ==}
engines: {node: '>=20.11.1'}
hasBin: true
peerDependencies:
crossws: ^0.4.1
peerDependenciesMeta:
crossws:
optional: true
[email protected]:
resolution: {integrity: sha512-h+pjvyujdo9way8qj6FUbhaQcHlR8FEq65EhTX9ViT5pK8aLj68uFl4hBkF+hsTJAH+H1END2Yv6hTIsabGfag==}
engines: {node: '>=20.11.1'}
@@ -9196,10 +9105,6 @@ packages:
[email protected]:
resolution: {integrity: sha512-50UEfZq1KR0Lfk2Tr6xb/MUIZH3h10oNC0OTy9g7WELcs5Fgy/mKN1vEhuKTkKbdo8vr5F9GXstu2eLhApfQ3A==}
[email protected]:
resolution: {integrity: sha512-3qq+FUBtlTHhtYxbxheZgY8NIFnkkC/MR8u5TTsr7YZ3wixryQ3cCwn3iZbg8p8B88iDBBAYSfZDS75t8MN7Vg==}
engines: {node: '>=16.9.0'}
[email protected]:
resolution: {integrity: sha512-jq9l1DM0zVIvsm3lv9Nw9nlJnMNPOcAtsbsgiUhWcFzPE99Gvo6yRTlszSLLYacMeQ6quHD6hMfId8crVHvexw==}
engines: {node: '>=16.9.0'}
@@ -10291,9 +10196,6 @@ packages:
resolution: {integrity: sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==}
engines: {node: '>= 0.8.0'}
[email protected]:
resolution: {integrity: sha512-FFMLEnIejK/zDABn+vqGVAUN4T0+3fw+cVAY8MMT65yR+j5uMuvWdd4npACWhh94OVWQs79CrBBuwOwGRZAQiA==}
[email protected]:
resolution: {integrity: sha512-pWXFMTwvGDbx1Fe9YL5HZebv2NhvGBzRtiNUv58aoK7+XrsuaydQ0JGRKK2r+bTKlwgSWwWxHbP5249Qr/BNpg==}
@@ -11293,9 +11195,6 @@ packages:
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
[email protected]:
resolution: {integrity: sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg==}
[email protected]:
resolution: {integrity: sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA==}
@@ -11343,10 +11242,6 @@ packages:
[email protected]:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
[email protected]:
resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==}
engines: {node: '>=11.0.0'}
[email protected]:
resolution: {integrity: sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==}
engines: {node: '>=11.0.0'}
@@ -11534,11 +11429,6 @@ packages:
engines: {node: '>=20.16.0'}
hasBin: true
[email protected]:
resolution: {integrity: sha512-2n9t0YnAXPJjinytvxccNgs7rOA5gmE7Wowt/8Dy2dx2fDC6sBhfBpbrCvjYKALlVukPS/Uq3QwkolKNa7P/2Q==}
engines: {node: '>=20.16.0'}
hasBin: true
[email protected]:
resolution: {integrity: sha512-97wWJS6F0KTKAhDlHVmBzMvlBOp5FiNp3XrLoodIgYJpXxgG5tE9rX4Pg7s46n2shI4wtEsMATTS1+rI3/ubzA==}
engines: {node: '>=20.16.0'}
@@ -13150,7 +13040,7 @@ snapshots:
'@babel/runtime': 7.28.6
'@base-ui/utils': 0.2.5(@types/[email protected])([email protected]([email protected]))([email protected])
'@floating-ui/react-dom': 2.1.7([email protected]([email protected]))([email protected])
'@floating-ui/utils': 0.2.10
'@floating-ui/utils': 0.2.11
react: 19.2.4
react-dom: 19.2.4([email protected])
tabbable: 6.4.0
@@ -13161,7 +13051,7 @@ snapshots:
'@base-ui/[email protected](@types/[email protected])([email protected]([email protected]))([email protected])':
dependencies:
'@babel/runtime': 7.28.6
'@floating-ui/utils': 0.2.10
'@floating-ui/utils': 0.2.11
react: 19.2.4
react-dom: 19.2.4([email protected])
reselect: 5.1.1
@@ -13764,19 +13654,10 @@ snapshots:
'@fastify/[email protected]': {}
'@floating-ui/[email protected]':
dependencies:
'@floating-ui/utils': 0.2.10
'@floating-ui/[email protected]':
dependencies:
'@floating-ui/utils': 0.2.11
'@floating-ui/[email protected]':
dependencies:
'@floating-ui/core': 1.7.4
'@floating-ui/utils': 0.2.10
'@floating-ui/[email protected]':
dependencies:
'@floating-ui/core': 1.7.5
@@ -13784,7 +13665,7 @@ snapshots:
'@floating-ui/[email protected]([email protected]([email protected]))([email protected])':
dependencies:
'@floating-ui/dom': 1.7.5
'@floating-ui/dom': 1.7.6
react: 19.2.4
react-dom: 19.2.4([email protected])
@@ -13795,7 +13676,7 @@ snapshots:
'@floating-ui/[email protected]([email protected]([email protected]))':
dependencies:
'@floating-ui/dom': 1.7.6
'@floating-ui/utils': 0.2.10
'@floating-ui/utils': 0.2.11
vue-demi: 0.14.10([email protected]([email protected]))
transitivePeerDependencies:
- '@vue/composition-api'
@@ -13825,10 +13706,6 @@ snapshots:
'@tanstack/vue-virtual': 3.13.21([email protected]([email protected]))
vue: 3.5.30([email protected])
'@hono/[email protected]([email protected])':
dependencies:
hono: 4.12.5
'@hono/[email protected]([email protected])':
dependencies:
hono: 4.12.7
@@ -15399,7 +15276,7 @@ snapshots:
vite-node: 3.2.4(@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected])
optionalDependencies:
'@react-router/serve': 7.13.1([email protected]([email protected]([email protected]))([email protected]))([email protected])
'@vitejs/plugin-rsc': 0.5.21([email protected]([email protected]))([email protected]([email protected]([email protected]))([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))
'@vitejs/plugin-rsc': 0.5.21([email protected]([email protected]))([email protected]([email protected]([email protected]))([email protected])([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))
react-server-dom-webpack: 19.2.4([email protected]([email protected]))([email protected])([email protected])
typescript: 5.9.3
transitivePeerDependencies:
@@ -16119,65 +15996,30 @@ snapshots:
tailwindcss: 4.2.1
vite: 7.3.1(@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected])
'@takumi-rs/[email protected]':
optional: true
'@takumi-rs/[email protected]':
optional: true
'@takumi-rs/[email protected]':
optional: true
'@takumi-rs/[email protected]':
optional: true
'@takumi-rs/[email protected]':
optional: true
'@takumi-rs/[email protected]':
optional: true
'@takumi-rs/[email protected]':
optional: true
'@takumi-rs/[email protected]':
optional: true
'@takumi-rs/[email protected]':
optional: true
'@takumi-rs/[email protected]':
optional: true
'@takumi-rs/[email protected]':
optional: true
'@takumi-rs/[email protected]':
optional: true
'@takumi-rs/[email protected]':
optional: true
'@takumi-rs/[email protected]':
optional: true
'@takumi-rs/[email protected]':
optional: true
'@takumi-rs/[email protected]':
optional: true
'@takumi-rs/[email protected]':
optionalDependencies:
'@takumi-rs/core-darwin-arm64': 0.70.4
'@takumi-rs/core-darwin-x64': 0.70.4
'@takumi-rs/core-linux-arm64-gnu': 0.70.4
'@takumi-rs/core-linux-arm64-musl': 0.70.4
'@takumi-rs/core-linux-x64-gnu': 0.70.4
'@takumi-rs/core-linux-x64-musl': 0.70.4
'@takumi-rs/core-win32-arm64-msvc': 0.70.4
'@takumi-rs/core-win32-x64-msvc': 0.70.4
'@takumi-rs/[email protected]':
optionalDependencies:
'@takumi-rs/core-darwin-arm64': 0.71.7
@@ -16189,24 +16031,14 @@ snapshots:
'@takumi-rs/core-win32-arm64-msvc': 0.71.7
'@takumi-rs/core-win32-x64-msvc': 0.71.7
'@takumi-rs/[email protected]': {}
'@takumi-rs/[email protected]': {}
'@takumi-rs/[email protected]':
dependencies:
'@takumi-rs/core': 0.70.4
'@takumi-rs/helpers': 0.70.4
'@takumi-rs/wasm': 0.70.4
'@takumi-rs/[email protected]':
dependencies:
'@takumi-rs/core': 0.71.7
'@takumi-rs/helpers': 0.71.7
'@takumi-rs/wasm': 0.71.7
'@takumi-rs/[email protected]': {}
'@takumi-rs/[email protected]': {}
'@tanstack/[email protected]':
@@ -16311,6 +16143,18 @@ snapshots:
tiny-invariant: 1.3.3
tiny-warning: 1.0.3
'@tanstack/[email protected]([email protected]([email protected]))([email protected]([email protected]))([email protected])':
dependencies:
'@tanstack/history': 1.161.4
'@tanstack/react-router': 1.166.7([email protected]([email protected]))([email protected])
'@tanstack/router-core': 1.166.7
'@tanstack/start-client-core': 1.166.7
'@tanstack/start-server-core': 1.166.7([email protected]([email protected]))
react: 19.2.4
react-dom: 19.2.4([email protected])
transitivePeerDependencies:
- crossws
'@tanstack/[email protected]([email protected])([email protected]([email protected]))([email protected])':
dependencies:
'@tanstack/history': 1.161.4
@@ -16323,6 +16167,26 @@ snapshots:
transitivePeerDependencies:
- crossws
'@tanstack/[email protected]([email protected]([email protected]))([email protected]([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected])':
dependencies:
'@tanstack/react-router': 1.166.7([email protected]([email protected]))([email protected])
'@tanstack/react-start-client': 1.166.7([email protected]([email protected]))([email protected])
'@tanstack/react-start-server': 1.166.7([email protected]([email protected]))([email protected]([email protected]))([email protected])
'@tanstack/router-utils': 1.161.4
'@tanstack/start-client-core': 1.166.7
'@tanstack/start-plugin-core': 1.166.7(@tanstack/[email protected]([email protected]([email protected]))([email protected]))([email protected]([email protected]))([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected])
'@tanstack/start-server-core': 1.166.7([email protected]([email protected]))
pathe: 2.0.3
react: 19.2.4
react-dom: 19.2.4([email protected])
vite: 7.3.1(@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected])
transitivePeerDependencies:
- '@rsbuild/core'
- crossws
- supports-color
- vite-plugin-solid
- webpack
'@tanstack/[email protected]([email protected])([email protected]([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected])':
dependencies:
'@tanstack/react-router': 1.166.7([email protected]([email protected]))([email protected])
@@ -16429,6 +16293,38 @@ snapshots:
'@tanstack/[email protected]': {}
'@tanstack/[email protected](@tanstack/[email protected]([email protected]([email protected]))([email protected]))([email protected]([email protected]))([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected])':
dependencies:
'@babel/code-frame': 7.27.1
'@babel/core': 7.29.0
'@babel/types': 7.29.0
'@rolldown/pluginutils': 1.0.0-beta.40
'@tanstack/router-core': 1.166.7
'@tanstack/router-generator': 1.166.7
'@tanstack/router-plugin': 1.166.7(@tanstack/[email protected]([email protected]([email protected]))([email protected]))([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected])
'@tanstack/router-utils': 1.161.4
'@tanstack/start-client-core': 1.166.7
'@tanstack/start-server-core': 1.166.7([email protected]([email protected]))
cheerio: 1.2.0
exsolve: 1.0.8
pathe: 2.0.3
picomatch: 4.0.3
source-map: 0.7.6
srvx: 0.11.9
tinyglobby: 0.2.15
ufo: 1.6.3
vite: 7.3.1(@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected])
vitefu: 1.1.2([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))
xmlbuilder2: 4.0.3
zod: 3.25.76
transitivePeerDependencies:
- '@rsbuild/core'
- '@tanstack/react-router'
- crossws
- supports-color
- vite-plugin-solid
- webpack
'@tanstack/[email protected](@tanstack/[email protected]([email protected]([email protected]))([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected])':
dependencies:
'@babel/code-frame': 7.27.1
@@ -16461,6 +16357,18 @@ snapshots:
- vite-plugin-solid
- webpack
'@tanstack/[email protected]([email protected]([email protected]))':
dependencies:
'@tanstack/history': 1.161.4
'@tanstack/router-core': 1.166.7
'@tanstack/start-client-core': 1.166.7
'@tanstack/start-storage-context': 1.166.7
h3-v2: [email protected]([email protected]([email protected]))
seroval: 1.5.1
tiny-invariant: 1.3.3
transitivePeerDependencies:
- crossws
'@tanstack/[email protected]([email protected])':
dependencies:
'@tanstack/history': 1.161.4
@@ -16478,7 +16386,7 @@ snapshots:
'@tanstack/start-client-core': 1.166.7
seroval: 1.5.1
optionalDependencies:
'@tanstack/react-start': 1.166.7([email protected])([email protected]([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected])
'@tanstack/react-start': 1.166.7([email protected]([email protected]))([email protected]([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))([email protected])
'@tanstack/[email protected]':
dependencies:
@@ -16920,7 +16828,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@vitejs/[email protected]([email protected]([email protected]))([email protected]([email protected]([email protected]))([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))':
'@vitejs/[email protected]([email protected]([email protected]))([email protected]([email protected]([email protected]))([email protected])([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))':
dependencies:
'@rolldown/pluginutils': 1.0.0-rc.5
es-module-lexer: 2.0.0
@@ -16929,7 +16837,7 @@ snapshots:
periscopic: 4.0.2
react: 19.2.4
react-dom: 19.2.4([email protected])
srvx: 0.11.8
srvx: 0.11.9
strip-literal: 3.1.0
turbo-stream: 3.2.0
vite: 7.3.1(@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected])
@@ -18988,11 +18896,9 @@ snapshots:
[email protected]:
dependencies:
flatted: 3.3.4
flatted: 3.4.1
keyv: 4.5.4
[email protected]: {}
[email protected]: {}
[email protected]: {}
@@ -19049,15 +18955,6 @@ snapshots:
[email protected]: {}
[email protected]([email protected]([email protected]))([email protected]):
dependencies:
motion-dom: 12.35.0
motion-utils: 12.29.2
tslib: 2.8.1
optionalDependencies:
react: 19.2.4
react-dom: 19.2.4([email protected])
[email protected]([email protected]([email protected]))([email protected]):
dependencies:
motion-dom: 12.35.2
@@ -19229,9 +19126,9 @@ snapshots:
ufo: 1.6.3
uncrypto: 0.1.3
[email protected]4([email protected]([email protected])):
[email protected]6([email protected]([email protected])):
dependencies:
rou3: 0.7.12
rou3: 0.8.1
srvx: 0.11.9
optionalDependencies:
crossws: 0.4.4([email protected])
@@ -19469,8 +19366,6 @@ snapshots:
[email protected]: {}
[email protected]: {}
[email protected]: {}
[email protected]: {}
@@ -20782,10 +20677,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
[email protected]:
dependencies:
motion-utils: 12.29.2
[email protected]:
dependencies:
motion-utils: 12.29.2
@@ -20900,7 +20791,7 @@ snapshots:
consola: 3.4.2
crossws: 0.4.4([email protected])
db0: 0.3.4
h3: 2.0.1-rc.14([email protected]([email protected]))
h3: 2.0.1-rc.16([email protected]([email protected]))
jiti: 2.6.1
nf3: 0.3.7
ofetch: 2.0.0-alpha.3
@@ -21674,7 +21565,7 @@ snapshots:
'@types/react-dom': 19.2.3(@types/[email protected])
chalk: 5.6.2
clsx: 2.1.1
framer-motion: 12.35.0([email protected]([email protected]))([email protected])
framer-motion: 12.35.2([email protected]([email protected]))([email protected])
goober: 2.1.18([email protected])
react: 19.2.4
react-d3-tree: 3.6.6([email protected]([email protected]))([email protected])
@@ -21722,7 +21613,7 @@ snapshots:
[email protected]([email protected]([email protected]))([email protected]):
dependencies:
'@floating-ui/dom': 1.7.5
'@floating-ui/dom': 1.7.6
classnames: 2.5.1
react: 19.2.4
react-dom: 19.2.4([email protected])
@@ -22132,8 +22023,6 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.59.0
fsevents: 2.3.3
[email protected]: {}
[email protected]: {}
[email protected]:
@@ -22192,8 +22081,6 @@ snapshots:
[email protected]: {}
[email protected]: {}
[email protected]: {}
[email protected]: {}
@@ -22502,8 +22389,6 @@ snapshots:
[email protected]: {}
[email protected]: {}
[email protected]: {}
[email protected]: {}
@@ -23289,11 +23174,11 @@ snapshots:
[email protected](@types/[email protected])([email protected])([email protected])([email protected]([email protected]))([email protected]([email protected]([email protected]))([email protected])([email protected]))([email protected])([email protected])([email protected])([email protected]):
dependencies:
'@hono/node-server': 1.19.11([email protected].5)
'@hono/node-server': 1.19.11([email protected].7)
'@vitejs/plugin-react': 5.1.4([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))
'@vitejs/plugin-rsc': 0.5.21([email protected]([email protected]))([email protected]([email protected]([email protected]))([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))
'@vitejs/plugin-rsc': 0.5.21([email protected]([email protected]))([email protected]([email protected]([email protected]))([email protected])([email protected]))([email protected])([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected]))
dotenv: 17.3.1
hono: 4.12.5
hono: 4.12.7
magic-string: 0.30.21
picocolors: 1.1.1
react: 19.2.4
@@ -23523,7 +23408,7 @@ snapshots:
[email protected]:
dependencies:
sax: 1.4.4
sax: 1.5.0
[email protected]:
dependencies: