59c8fec7e7
- SafeCitationContent: add loadingOnly and renderBody props.
- loadingOnly: show only loading indicator or null (e.g. write_file step).
- renderBody(parsed): custom body renderer (e.g. artifact preview).
- message-group write_file: use SafeCitationContent(content, isLoading,
rehypePlugins, loadingOnly) instead of local useParsedCitations +
shouldShowCitationLoading + CitationsLoadingIndicator. Pass rehypePlugins
into ToolCall.
- artifact-file-detail markdown preview: use SafeCitationContent with
renderBody((p) => <ArtifactFilePreview ... cleanContent={p.cleanContent}
citationMap={p.citationMap} />). Remove local shouldShowCitationLoading
and CitationsLoadingIndicator branch.
- core/citations: inline buildCitationMap into use-parsed-citations, remove
from utils; stop exporting hasCitationsBlock (internal to shouldShowCitationLoading).
- inline-citation: make InlineCitationCard, InlineCitationCardBody,
InlineCitationSource file-private (no longer exported).
Co-authored-by: Cursor <cursoragent@cursor.com>
---
refactor(前端): 收拢引用逻辑、精简导出与实现
- SafeCitationContent 新增 loadingOnly、renderBody。
- loadingOnly:仅显示加载或 null(如 write_file 步骤)。
- renderBody(parsed):自定义正文渲染(如 artifact 预览)。
- message-group write_file:改用 SafeCitationContent(loadingOnly),去掉
本地 useParsedCitations + shouldShowCitationLoading + CitationsLoadingIndicator,
并向 ToolCall 传入 rehypePlugins。
- artifact-file-detail 的 markdown 预览:改用 SafeCitationContent +
renderBody 渲染 ArtifactFilePreview,去掉本地加载判断与
CitationsLoadingIndicator 分支。
- core/citations:buildCitationMap 内联到 use-parsed-citations 并从 utils
删除;hasCitationsBlock 不再导出(仅 shouldShowCitationLoading 内部使用)。
- inline-citation:InlineCitationCard/Body/Source 改为文件内私有,不再导出。
29 lines
758 B
TypeScript
29 lines
758 B
TypeScript
"use client";
|
|
|
|
import { useMemo } from "react";
|
|
|
|
import { parseCitations } from "./utils";
|
|
import type { Citation } from "./utils";
|
|
|
|
export interface UseParsedCitationsResult {
|
|
citations: Citation[];
|
|
cleanContent: string;
|
|
citationMap: Map<string, Citation>;
|
|
}
|
|
|
|
/**
|
|
* Parse content for citations and build citation map. Memoized by content.
|
|
*/
|
|
export function useParsedCitations(content: string): UseParsedCitationsResult {
|
|
return useMemo(() => {
|
|
const parsed = parseCitations(content ?? "");
|
|
const citationMap = new Map<string, Citation>();
|
|
for (const c of parsed.citations) citationMap.set(c.url, c);
|
|
return {
|
|
citations: parsed.citations,
|
|
cleanContent: parsed.cleanContent,
|
|
citationMap,
|
|
};
|
|
}, [content]);
|
|
}
|