Просмотр исходного кода

fix(search): 修复实体检索持久化结果类型收窄

darknessomi 2 недель назад
Родитель
Сommit
6ca84274d6

+ 27 - 0
src/lib/novel/writing-entity-web-search.spec.ts

@@ -365,4 +365,31 @@ describe("writing entity search workflow display and persistence", () => {
     expect(displayWritingEntitySearchWorkflowContent(legacy)).toBe(legacy)
     expect(displayWritingEntitySearchWorkflowContent(legacy)).toContain("https://m.baike.com/wikiid/123")
   })
+
+  it("filters malformed persisted names without trusting unknown array entries", () => {
+    const persisted = JSON.stringify({
+      content: "",
+      searchedNames: ["鲁茨科伊", null, 42, "", "哈斯布拉托夫"],
+      notes: ["有效备注", false],
+      items: [],
+    })
+
+    expect(parseWritingEntitySearchWorkflowResult(persisted)).toEqual({
+      content: "",
+      searchedNames: ["鲁茨科伊", "哈斯布拉托夫"],
+      notes: ["有效备注"],
+      items: [],
+    })
+  })
+
+  it("rebuilds display content when persisted content is empty", () => {
+    const persisted = JSON.stringify({
+      content: "",
+      searchedNames: ["鲁茨科伊"],
+      notes: [],
+      items: [],
+    })
+
+    expect(displayWritingEntitySearchWorkflowContent(persisted)).toBe("已搜索:鲁茨科伊")
+  })
 })

+ 9 - 5
src/lib/novel/writing-entity-web-search.ts

@@ -264,13 +264,17 @@ export function parseWritingEntitySearchWorkflowResult(
     const parsed = JSON.parse(text) as unknown
     if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return null
     const record = parsed as Record<string, unknown>
-    const hasItems = Array.isArray(record.items)
-    const hasSearchedNames = Array.isArray(record.searchedNames)
+    const rawItems = record.items
+    const rawSearchedNames = record.searchedNames
+    const hasItems = Array.isArray(rawItems)
+    const hasSearchedNames = Array.isArray(rawSearchedNames)
     if (!hasItems && !hasSearchedNames) return null
 
-    const items = hasItems ? normalizePersistedSearchItems(record.items) : []
+    const items = hasItems ? normalizePersistedSearchItems(rawItems) : []
     const searchedNames = hasSearchedNames
-      ? record.searchedNames.filter((name): name is string => typeof name === "string" && name.trim().length > 0)
+      ? rawSearchedNames.filter(
+          (name: unknown): name is string => typeof name === "string" && name.trim().length > 0,
+        )
       : items.map((item) => item.name)
     const notes = Array.isArray(record.notes)
       ? record.notes.filter((note): note is string => typeof note === "string")
@@ -290,7 +294,7 @@ export function parseWritingEntitySearchWorkflowResult(
 export function displayWritingEntitySearchWorkflowContent(text: string | undefined): string {
   const parsed = parseWritingEntitySearchWorkflowResult(text)
   if (!parsed) return (text ?? "").trim()
-  return parsed.content.trim() || formatWritingEntitySearchWorkflowResult(parsed)
+  return parsed.content.trim() || formatWritingEntitySearchWorkflowResult({ ...parsed, markdown: "" })
 }
 
 export function writingEntitySearchSourceHost(