ai: migrate docs-search to @crema/lexical-rag-ui
Replace the in-app docs-search.ts and build-docs-index.mjs with the
new sibling lib (@crema/lexical-rag-ui). Wire-up only — same index
shape, same tool response shape, same MiniSearch config, so the agent
sees no behavior change.
- tsconfig + app.css: wire the lib; alias minisearch to consumer's
node_modules so sibling-lib resolution works.
- admin-tools.ts: createRAGClient("/docs-index.json"), keep search_docs
tool's response shape unchanged (collapse tags[] back to category).
- ai.tsx: define DocHit locally — it's the tool-response shape, no
longer the lib's internal type.
- scripts/build-docs-index.mjs: thin wrapper that injects MiniSearch
and calls buildIndex. Per-app sources list and tags live here.
- package.json: add minisearch dep + build:docs script + prebuild hook.
- .gitignore: don't commit the generated /public/docs-index.json.
Delete: app/lib/docs-search.ts (was untracked; its logic moved to lib).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -15,9 +15,13 @@ import {
|
||||
suspendTenant,
|
||||
type Tenant,
|
||||
} from "~/lib/arcadia/tenants"
|
||||
import { searchDocs } from "~/lib/docs-search"
|
||||
import { createRAGClient } from "@crema/lexical-rag-ui"
|
||||
import { BLOCK_INDEX, getBlockSchema } from "~/lib/block-schemas"
|
||||
|
||||
// Lazy singleton — first tool call fetches /docs-index.json, subsequent
|
||||
// calls reuse the parsed MiniSearch instance.
|
||||
const docsClient = createRAGClient("/docs-index.json")
|
||||
|
||||
export type ToolCall = {
|
||||
name: string
|
||||
args: Record<string, unknown>
|
||||
@@ -253,8 +257,22 @@ const TOOLS: ToolDef[] = [
|
||||
10,
|
||||
Math.max(1, typeof args.limit === "number" ? args.limit : 5),
|
||||
)
|
||||
const hits = await searchDocs(query, limit)
|
||||
return { query, count: hits.length, hits }
|
||||
const hits = await docsClient.search(query, { limit })
|
||||
// Tool-shape parity with the previous searchDocs() return: collapse
|
||||
// tags[] back to category for now so the agent's prior expectations
|
||||
// and any cached examples still parse cleanly.
|
||||
return {
|
||||
query,
|
||||
count: hits.length,
|
||||
hits: hits.map((h) => ({
|
||||
id: h.id,
|
||||
title: h.title,
|
||||
sourcePath: h.sourcePath,
|
||||
category: h.tags[0] ?? "",
|
||||
excerpt: h.excerpt,
|
||||
score: h.score,
|
||||
})),
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user