Vendored deer-flow upstream (bytedance/deer-flow) plus prompt-injection hardening: - New deerflow.security package: content_delimiter, html_cleaner, sanitizer (8 layers — invisible chars, control chars, symbols, NFC, PUA, tag chars, horizontal whitespace collapse with newline/tab preservation, length cap) - New deerflow.community.searx package: web_search, web_fetch, image_search backed by a private SearX instance, every external string sanitized and wrapped in <<<EXTERNAL_UNTRUSTED_CONTENT>>> delimiters - All native community web providers (ddg_search, tavily, exa, firecrawl, jina_ai, infoquest, image_search) replaced with hard-fail stubs that raise NativeWebToolDisabledError at import time, so a misconfigured tool.use path fails loud rather than silently falling back to unsanitized output - Native client back-doors (jina_client.py, infoquest_client.py) stubbed too - Native-tool tests quarantined under tests/_disabled_native/ (collect_ignore_glob via local conftest.py) - Sanitizer Layer 7 fix: only collapse horizontal whitespace, preserve newlines and tabs so list/table structure survives - Hardened runtime config.yaml references only the searx-backed tools - Factory overlay (backend/) kept in sync with deer-flow tree as a reference / source See HARDENING.md for the full audit trail and verification steps.
52 lines
1.4 KiB
TypeScript
52 lines
1.4 KiB
TypeScript
import type { PageMapItem } from "nextra";
|
|
import { getPageMap } from "nextra/page-map";
|
|
import { Layout } from "nextra-theme-docs";
|
|
|
|
import { Footer } from "@/components/landing/footer";
|
|
import { Header } from "@/components/landing/header";
|
|
import { getLocaleByLang } from "@/core/i18n/locale";
|
|
import "nextra-theme-docs/style.css";
|
|
|
|
const i18n = [
|
|
{ locale: "en", name: "English" },
|
|
{ locale: "zh", name: "中文" },
|
|
];
|
|
|
|
function formatPageRoute(base: string, items: PageMapItem[]): PageMapItem[] {
|
|
return items.map((item) => {
|
|
if ("route" in item && !item.route.startsWith(base)) {
|
|
item.route = `${base}${item.route}`;
|
|
}
|
|
if ("children" in item && item.children) {
|
|
item.children = formatPageRoute(base, item.children);
|
|
}
|
|
return item;
|
|
});
|
|
}
|
|
|
|
export default async function DocLayout({ children, params }) {
|
|
const { lang } = await params;
|
|
const locale = getLocaleByLang(lang);
|
|
const pages = await getPageMap(`/${lang}`);
|
|
const pageMap = formatPageRoute(`/${lang}/docs`, pages);
|
|
|
|
return (
|
|
<Layout
|
|
navbar={
|
|
<Header
|
|
className="relative max-w-full px-10"
|
|
homeURL="/"
|
|
locale={locale}
|
|
/>
|
|
}
|
|
pageMap={pageMap}
|
|
docsRepositoryBase="https://github.com/bytedance/deerflow/tree/main/frontend/src/content"
|
|
footer={<Footer />}
|
|
i18n={i18n}
|
|
// ... Your additional layout options
|
|
>
|
|
{children}
|
|
</Layout>
|
|
);
|
|
}
|