mirror of
https://github.com/CopilotKit/CopilotKit.git
synced 2026-09-14 16:26:20 +08:00
ad629e1779
Update user-facing references from "LangGraph" to "LangChain" per CPK-7186. The integration label, descriptions, and agent terminology now use "LangChain" while preserving "LangGraph" for technical references (Platform, Studio, CLI, StateGraph, code/package names, and API references). - Rename integration label in integrations.ts, meta.json, integration-grid, feature-matrix, quickstart-dropdown, and link-validation - Update ~47 MDX docs: "LangGraph agent(s)" → "LangChain agent(s)" - Update FAQ, snippets, and learn section references - Keep URL paths (/langgraph) unchanged for backward compatibility - Keep all code imports, package names, and LangGraph Platform/Studio/CLI as-is https://claude.ai/code/session_01JAQ7P3GEeP2bGZtc6V45WY
167 lines
3.8 KiB
TypeScript
167 lines
3.8 KiB
TypeScript
import { source } from "@/app/source";
|
|
|
|
export interface LinkSuggestion {
|
|
href: string;
|
|
title: string;
|
|
description?: string;
|
|
confidence: number;
|
|
}
|
|
|
|
export interface BrokenLinkInfo {
|
|
originalHref: string;
|
|
suggestions: LinkSuggestion[];
|
|
isExternal: boolean;
|
|
}
|
|
|
|
/**
|
|
* Validates if a link is broken and provides suggestions
|
|
*/
|
|
export function validateLink(href: string): BrokenLinkInfo {
|
|
const isExternal =
|
|
href.startsWith("http") ||
|
|
href.startsWith("mailto:") ||
|
|
href.startsWith("tel:");
|
|
|
|
if (isExternal) {
|
|
return {
|
|
originalHref: href,
|
|
suggestions: [],
|
|
isExternal: true,
|
|
};
|
|
}
|
|
|
|
// For internal links, check if the page exists
|
|
const normalizedHref = href.startsWith("/") ? href.slice(1) : href;
|
|
const slug = normalizedHref.split("/").filter(Boolean);
|
|
|
|
try {
|
|
const page = source.getPage(slug);
|
|
if (page) {
|
|
return {
|
|
originalHref: href,
|
|
suggestions: [],
|
|
isExternal: false,
|
|
};
|
|
}
|
|
} catch (error) {
|
|
// Page doesn't exist
|
|
}
|
|
|
|
// Generate suggestions based on the broken link
|
|
const suggestions = generateSuggestions(href, slug);
|
|
|
|
return {
|
|
originalHref: href,
|
|
suggestions,
|
|
isExternal: false,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Generates suggestions for a broken link
|
|
*/
|
|
function generateSuggestions(
|
|
originalHref: string,
|
|
slug: string[],
|
|
): LinkSuggestion[] {
|
|
const suggestions: LinkSuggestion[] = [];
|
|
|
|
// Get all available pages for fuzzy matching
|
|
const allPages = getAllPages();
|
|
|
|
if (slug.length === 0) {
|
|
// If it's just a root link, suggest main sections
|
|
suggestions.push(
|
|
{
|
|
href: "/direct-to-llm",
|
|
title: "Direct to LLM",
|
|
description: "Build copilots with any LLM",
|
|
confidence: 0.8,
|
|
},
|
|
{
|
|
href: "/langgraph",
|
|
title: "LangChain",
|
|
description: "Agentic workflows and state machines",
|
|
confidence: 0.8,
|
|
},
|
|
{
|
|
href: "/mastra",
|
|
title: "Mastra",
|
|
description: "Multi-agent orchestration",
|
|
confidence: 0.8,
|
|
},
|
|
{
|
|
href: "/reference",
|
|
title: "API Reference",
|
|
description: "Complete API documentation",
|
|
confidence: 0.8,
|
|
},
|
|
);
|
|
return suggestions;
|
|
}
|
|
|
|
// Try to find similar pages
|
|
const lastSegment = slug[slug.length - 1];
|
|
const similarPages = allPages.filter((page) => {
|
|
const pageSlug = page.slugs.join("/");
|
|
return (
|
|
pageSlug.includes(lastSegment) ||
|
|
page.data.title?.toLowerCase().includes(lastSegment.toLowerCase())
|
|
);
|
|
});
|
|
|
|
similarPages.slice(0, 3).forEach((page) => {
|
|
suggestions.push({
|
|
href: `/${page.slugs.join("/")}`,
|
|
title: page.data.title || "Untitled",
|
|
description: page.data.description,
|
|
confidence: 0.7,
|
|
});
|
|
});
|
|
|
|
// If no similar pages found, suggest main sections
|
|
if (suggestions.length === 0) {
|
|
const firstSegment = slug[0];
|
|
if (firstSegment) {
|
|
suggestions.push(
|
|
{
|
|
href: `/${firstSegment}`,
|
|
title: `${firstSegment} Documentation`,
|
|
confidence: 0.6,
|
|
},
|
|
{ href: "/", title: "Home", confidence: 0.5 },
|
|
);
|
|
}
|
|
}
|
|
|
|
return suggestions;
|
|
}
|
|
|
|
/**
|
|
* Gets all available pages (this would need to be implemented based on your source structure)
|
|
*/
|
|
function getAllPages(): Array<{
|
|
slugs: string[];
|
|
data: { title?: string; description?: string };
|
|
}> {
|
|
// This is a simplified version - you'd need to implement this based on your source structure
|
|
try {
|
|
// This would need to be implemented to get all pages from your source
|
|
return [];
|
|
} catch (error) {
|
|
return [];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Creates a link suggestion component
|
|
*/
|
|
export function createLinkSuggestion(suggestion: LinkSuggestion) {
|
|
return {
|
|
href: suggestion.href,
|
|
title: suggestion.title,
|
|
description: suggestion.description,
|
|
confidence: suggestion.confidence,
|
|
};
|
|
}
|