diff --git a/.changeset/ai-search-plugin.md b/.changeset/ai-search-plugin.md new file mode 100644 index 0000000000..80de61dcad --- /dev/null +++ b/.changeset/ai-search-plugin.md @@ -0,0 +1,5 @@ +--- +"@emdash-cms/cloudflare": minor +--- + +Adds a Cloudflare AI Search plugin with automatic content indexing, cron-driven reindexing, language-aware queries, synonyms, index status, admin configuration, and an Astro search component with the browser snippet included. diff --git a/demos/cloudflare/astro.config.mjs b/demos/cloudflare/astro.config.mjs index a349f89745..d642415079 100644 --- a/demos/cloudflare/astro.config.mjs +++ b/demos/cloudflare/astro.config.mjs @@ -10,6 +10,7 @@ import { cloudflareImages, cloudflareStream, } from "@emdash-cms/cloudflare"; +import { aiSearch } from "@emdash-cms/cloudflare/plugins"; import { formsPlugin } from "@emdash-cms/plugin-forms"; import webhookNotifier from "@emdash-cms/plugin-webhook-notifier"; import { defineConfig, fontProviders } from "astro/config"; @@ -72,6 +73,19 @@ export default defineConfig({ plugins: [ // Test plugin that exercises all v2 APIs formsPlugin(), + aiSearch({ + // AI Search instance name (created on first index). Default: "emdash-content". + instanceName: "emdash-content", + // wrangler.jsonc `ai_search_namespaces` binding name. Default: "AI_SEARCH". + binding: "AI_SEARCH", + // Hybrid search (vector + keyword). Default: true. + hybridSearch: true, + // Public result URLs returned to the AI Search snippet. + urlTemplates: { + posts: "/posts/{slug}?lang={locale}", + pages: "/pages/{slug}?lang={locale}", + }, + }), ], // Sandboxed plugins (run in isolated workers) sandboxed: [webhookNotifier], diff --git a/demos/cloudflare/package.json b/demos/cloudflare/package.json index 0459fa6213..82047e5080 100644 --- a/demos/cloudflare/package.json +++ b/demos/cloudflare/package.json @@ -15,6 +15,7 @@ "dependencies": { "@astrojs/cloudflare": "catalog:", "@astrojs/react": "catalog:", + "@cloudflare/ai-search-snippet": "^0.0.40", "@emdash-cms/cloudflare": "workspace:*", "@emdash-cms/plugin-forms": "workspace:*", "@emdash-cms/plugin-webhook-notifier": "workspace:*", diff --git a/demos/cloudflare/src/layouts/Base.astro b/demos/cloudflare/src/layouts/Base.astro index df078d8c05..380a6e298b 100644 --- a/demos/cloudflare/src/layouts/Base.astro +++ b/demos/cloudflare/src/layouts/Base.astro @@ -7,7 +7,6 @@ import { EmDashBodyEnd, } from "emdash/ui"; import { createPublicPageContext } from "emdash/page"; -import LiveSearch from "emdash/ui/search"; import { Font } from "astro:assets"; import { resolveBlogSiteIdentity } from "../utils/site-identity"; import "../styles/theme.css"; @@ -23,7 +22,6 @@ interface Props { publishedTime?: string | null; modifiedTime?: string | null; author?: string | null; - /** Pass content reference for plugin page contributions on content pages */ content?: { collection: string; id: string; slug?: string | null }; } @@ -41,22 +39,14 @@ const { content, } = Astro.props; const { siteTitle, siteTagline, siteLogo } = resolveBlogSiteIdentity(await getSiteSettings()); -// If title already includes site title (from getSeoMeta), use as-is const fullTitle = title.includes(siteTitle) ? title : `${title} — ${siteTitle}`; -// Fetch primary menu defined in seed const menu = await getMenu("primary"); -// Optional "social" menu. If a site defines a `social` menu in its seed, -// it'll render in the footer's "Connect" column. Otherwise that column -// just shows RSS, avoiding duplication with the "Navigate" column above. const socialMenu = await getMenu("social"); -// Fetch pages for footer const { entries: pages } = await getEmDashCollection("pages"); -// Build public page context for plugin contributions -// SEO data is passed here and rendered securely by EmDashHead const pageCtx = createPublicPageContext({ Astro, kind: content ? "content" : "custom", @@ -72,7 +62,6 @@ const pageCtx = createPublicPageContext({ siteName: siteTitle, }); -// Check if user is logged in (for showing admin link) const isLoggedIn = !!Astro.locals.user; --- @@ -110,14 +99,24 @@ const isLoggedIn = !!Astro.locals.user; }