diff --git a/src/components/agent/chat/components/Inputbar/index.tsx b/src/components/agent/chat/components/Inputbar/index.tsx index bf12dadb1..39c3d7f39 100644 --- a/src/components/agent/chat/components/Inputbar/index.tsx +++ b/src/components/agent/chat/components/Inputbar/index.tsx @@ -703,7 +703,6 @@ export const Inputbar: React.FC = ({ isComposing?: boolean; }; if ( - e.isComposing || nativeEvent.isComposing || nativeEvent.key === "Process" || nativeEvent.keyCode === 229 diff --git a/src/components/agent/chat/hooks/useAsterAgentChat.test.tsx b/src/components/agent/chat/hooks/useAsterAgentChat.test.tsx index 944832d57..1b987f278 100644 --- a/src/components/agent/chat/hooks/useAsterAgentChat.test.tsx +++ b/src/components/agent/chat/hooks/useAsterAgentChat.test.tsx @@ -37,7 +37,7 @@ const { info: vi.fn(), warning: vi.fn(), }, - mockParseSkillSlashCommand: vi.fn(() => null), + mockParseSkillSlashCommand: vi.fn((): { skillName: string; userInput: string } | null => null), mockTryExecuteSlashSkillCommand: vi.fn(async () => false), })); diff --git a/src/components/agent/chat/hooks/useTopicBranchBoard.test.tsx b/src/components/agent/chat/hooks/useTopicBranchBoard.test.tsx index 27382dfff..dee735753 100644 --- a/src/components/agent/chat/hooks/useTopicBranchBoard.test.tsx +++ b/src/components/agent/chat/hooks/useTopicBranchBoard.test.tsx @@ -63,7 +63,7 @@ function Probe({ describe("useTopicBranchBoard", () => { it("当前话题应自动为进行中", async () => { - let snapshot: ReturnType | null = null; + let snapshot = null as ReturnType | null; const container = document.createElement("div"); document.body.appendChild(container); const root = createRoot(container); @@ -82,12 +82,12 @@ describe("useTopicBranchBoard", () => { ); }); - const current = snapshot?.branchItems.find((item) => item.id === "topic-a"); + const current = snapshot?.branchItems.find((item: { id: string }) => item.id === "topic-a"); expect(current?.status).toBe("in_progress"); }); it("应允许手动设置分支状态", async () => { - let snapshot: ReturnType | null = null; + let snapshot = null as ReturnType | null; const container = document.createElement("div"); document.body.appendChild(container); const root = createRoot(container); @@ -110,7 +110,7 @@ describe("useTopicBranchBoard", () => { snapshot?.setTopicStatus("topic-b", "merged"); }); - const merged = snapshot?.branchItems.find((item) => item.id === "topic-b"); + const merged = snapshot?.branchItems.find((item: { id: string }) => item.id === "topic-b"); expect(merged?.status).toBe("merged"); }); @@ -123,7 +123,7 @@ describe("useTopicBranchBoard", () => { }), ); - let snapshot: ReturnType | null = null; + let snapshot = null as ReturnType | null; const container = document.createElement("div"); document.body.appendChild(container); const root = createRoot(container); @@ -142,14 +142,14 @@ describe("useTopicBranchBoard", () => { ); }); - const current = snapshot?.branchItems.find((item) => item.id === "topic-a"); - const merged = snapshot?.branchItems.find((item) => item.id === "topic-b"); + const current = snapshot?.branchItems.find((item: { id: string }) => item.id === "topic-a"); + const merged = snapshot?.branchItems.find((item: { id: string }) => item.id === "topic-b"); expect(current?.status).toBe("in_progress"); expect(merged?.status).toBe("merged"); }); it("外部托管模式应回调状态变更", async () => { - let snapshot: ReturnType | null = null; + let snapshot = null as ReturnType | null; let controlledMap: Record = { "topic-a": "in_progress", "topic-b": "candidate", diff --git a/src/components/agent/chat/index.tsx b/src/components/agent/chat/index.tsx index dd0439590..8fbc7153e 100644 --- a/src/components/agent/chat/index.tsx +++ b/src/components/agent/chat/index.tsx @@ -310,7 +310,7 @@ interface HandleSendObserver { interface HandleSendOptions { skipThemeSkillPrefix?: boolean; - purpose?: "content_review"; + purpose?: "content_review" | "text_stylize"; observer?: HandleSendObserver; } @@ -3690,12 +3690,17 @@ export function AgentChatPage({ return; } - const filePath = typeof selected === "string" ? selected : selected.path; + const filePath = selected; if (!filePath) { toast.error("未选择文件"); return; } + if (!sessionId) { + toast.error("会话未就绪"); + return; + } + toast.info("正在上传图片..."); // 上传图片到会话 @@ -3742,7 +3747,7 @@ export function AgentChatPage({ return; } - const filePath = typeof selected === "string" ? selected : selected.path; + const filePath = selected; if (!filePath) { toast.error("未选择文件"); return; @@ -4581,14 +4586,16 @@ export function AgentChatPage({ return; } + const fileContent = file.content ?? ""; + setCanvasState((prev) => { // 音乐主题:解析歌词并更新 sections if (mappedTheme === "music") { - const sections = parseLyrics(file.content); + const sections = parseLyrics(fileContent); if (!prev || prev.type !== "music") { const musicState = createInitialMusicState(); musicState.sections = sections; - const titleMatch = file.content.match(/^#\s*(.+)$/m); + const titleMatch = fileContent.match(/^#\s*(.+)$/m); if (titleMatch) { musicState.spec.title = titleMatch[1].trim(); } @@ -4598,16 +4605,16 @@ export function AgentChatPage({ } if (mappedTheme === "novel") { - return upsertNovelCanvasState(prev, file.content); + return upsertNovelCanvasState(prev, fileContent); } // 文档类型画布 if (!prev || prev.type !== "document") { - return createInitialDocumentState(file.content); + return createInitialDocumentState(fileContent); } return { ...prev, - content: file.content, + content: fileContent, }; }); // 只打开画布,不关闭文件列表(让用户自己关闭) @@ -5267,7 +5274,6 @@ export function AgentChatPage({ } const shouldShowCanvasLoadingState = - renderCanvasTheme !== "general" && ((!canvasState && (shouldBootstrapCanvasOnEntry || isInitialContentLoading || diff --git a/src/components/agent/chat/types.ts b/src/components/agent/chat/types.ts index 56f513f76..ef8e93e2d 100644 --- a/src/components/agent/chat/types.ts +++ b/src/components/agent/chat/types.ts @@ -103,7 +103,7 @@ export interface Message { /** 上下文准备轨迹(可选) */ contextTrace?: ContextTraceStep[]; /** 消息用途(用于跳过特定副作用) */ - purpose?: "content_review"; + purpose?: "content_review" | "text_stylize"; } export interface ChatSession { diff --git a/src/components/content-creator/canvas/document/editor/NotionEditor.tsx b/src/components/content-creator/canvas/document/editor/NotionEditor.tsx index 0c8339dff..d329ea0e0 100644 --- a/src/components/content-creator/canvas/document/editor/NotionEditor.tsx +++ b/src/components/content-creator/canvas/document/editor/NotionEditor.tsx @@ -223,7 +223,7 @@ const NotionEditorCore = forwardRef( clearIdleCommitTimer(); const nextHtml = markdownToHtml(content); - editor.commands.setContent(nextHtml, false); + editor.commands.setContent(nextHtml, { emitUpdate: false }); lastCommittedContentRef.current = content; dirtyRef.current = false; handledExternalInsertRef.current = null; diff --git a/src/components/content-creator/canvas/novel/NovelCanvas.tsx b/src/components/content-creator/canvas/novel/NovelCanvas.tsx index 9eaa2a291..50b321df4 100644 --- a/src/components/content-creator/canvas/novel/NovelCanvas.tsx +++ b/src/components/content-creator/canvas/novel/NovelCanvas.tsx @@ -616,7 +616,7 @@ export const NovelCanvas: React.FC = memo( {}} onSelectionTextChange={onSelectionTextChange} diff --git a/src/components/input-kit/BaseComposer.tsx b/src/components/input-kit/BaseComposer.tsx index 646d7d2d4..54d09c548 100644 --- a/src/components/input-kit/BaseComposer.tsx +++ b/src/components/input-kit/BaseComposer.tsx @@ -92,8 +92,7 @@ export const BaseComposer: React.FC = ({ isComposing?: boolean; }; return Boolean( - event.isComposing || - nativeEvent.isComposing || + nativeEvent.isComposing || nativeEvent.key === "Process" || nativeEvent.keyCode === 229, ); diff --git a/src/components/workspace/hooks/useCreationDialogs.test.tsx b/src/components/workspace/hooks/useCreationDialogs.test.tsx index 92ded3d42..48054baf9 100644 --- a/src/components/workspace/hooks/useCreationDialogs.test.tsx +++ b/src/components/workspace/hooks/useCreationDialogs.test.tsx @@ -589,7 +589,7 @@ describe("useCreationDialogs", () => { expect(loadContents).not.toHaveBeenCalled(); expect(onEnterWorkspace).not.toHaveBeenCalledWith("content-new", {}); - resolveCreateContent?.({ id: "content-new" }); + (resolveCreateContent as ((value: { id: string }) => void) | null)?.({ id: "content-new" }); await flushEffects(6); expect(loadContents).toHaveBeenCalledWith("project-1"); diff --git a/src/components/workspace/services/createConfirmationService.test.ts b/src/components/workspace/services/createConfirmationService.test.ts index a27affac6..861dab2b5 100644 --- a/src/components/workspace/services/createConfirmationService.test.ts +++ b/src/components/workspace/services/createConfirmationService.test.ts @@ -64,7 +64,7 @@ describe("createConfirmationService", () => { } expect(result.decision.type).toBe("continue_history"); expect(result.decision.initialUserPrompt).toContain("大纲"); - expect(result.decision.preferredContentId).toBe("content-2"); + expect((result.decision as Extract).preferredContentId).toBe("content-2"); }); it("resolveCreateConfirmationDecision 新建时应返回 create_new", () => {