移除草稿转换的文本引用回退

将 ChatComposerDraft.content 设为必填的 canonical 唯一来源。

删除 text 与 references 重建 DirectCodexUserItem 的兼容分支及其无效空值兜底。
This commit is contained in:
2026-09-18 13:19:01 +08:00
parent d8af0fa882
commit 840baf208f
4 changed files with 13 additions and 29 deletions
+1 -1
View File
@@ -4073,7 +4073,7 @@ export function App({
}
function handleChatComposerChange(draft: ChatComposerDraft) {
const content = draft.content ?? [];
const content = draft.content;
setChatContent(content);
setChatInput(directCodexContentToPromptText(content, manifest.assets));
setChatReferences(
@@ -916,11 +916,7 @@ function ResourceReferenceEditor({
);
const readPromptText = useCallback(
() =>
directCodexContentToPromptText(
liveDraftRef.current.content ?? [],
assets,
),
() => directCodexContentToPromptText(liveDraftRef.current.content, assets),
[assets],
);
const resolvePolishContext = useCallback(
@@ -957,7 +953,7 @@ function ResourceReferenceEditor({
const submitCurrentDraft = useCallback(() => {
setReminderOpen(false);
acknowledgedDraftKeyRef.current = chatPromptDraftKey(
liveDraftRef.current.content ?? [],
liveDraftRef.current.content,
);
rootRef.current?.closest('form')?.requestSubmit();
}, [rootRef]);
@@ -995,9 +991,9 @@ function ResourceReferenceEditor({
const handleFormSubmit = (event: Event) => {
if (
!shouldRemindChatPromptPolish({
content: liveDraftRef.current.content ?? [],
content: liveDraftRef.current.content,
prompt: directCodexContentToPromptText(
liveDraftRef.current.content ?? [],
liveDraftRef.current.content,
assetsRef.current,
),
acknowledgedDraftKey: acknowledgedDraftKeyRef.current,
@@ -1016,7 +1012,7 @@ function ResourceReferenceEditor({
// 草稿发出去或被清空后重新开始一轮:清掉润色结果与「本轮已确认」标记。
useEffect(() => {
if ((liveDraftRef.current.content ?? []).length > 0) return;
if (liveDraftRef.current.content.length > 0) return;
resetPromptPolish();
acknowledgedDraftKeyRef.current = null;
}, [resetPromptPolish]);
@@ -1365,9 +1361,9 @@ function ResourceReferenceEditor({
const nextDraft = readResourceReferenceDraft(editorState);
liveDraftRef.current = nextDraft;
setDraftText(
directCodexContentToPromptText(nextDraft.content ?? [], assets),
directCodexContentToPromptText(nextDraft.content, assets),
);
if ((nextDraft.content ?? []).length === 0) {
if (nextDraft.content.length === 0) {
resetPromptPolish();
acknowledgedDraftKeyRef.current = null;
}
@@ -51,8 +51,8 @@ export type ChatReference = ResourceReference | RuntimeRegionReference;
export type ChatComposerDraft = {
text: string;
references: ChatReference[];
/** Lexical 顺序对应的 canonical user content;仅由编辑器读回时提供。 */
content?: DirectCodexUserContentPart[];
/** Lexical 顺序对应的 canonical user content,是草稿的唯一结构化来源。 */
content: DirectCodexUserContentPart[];
};
export const RESOURCE_REFERENCE_INSERT_EVENT = 'agc-resource-reference-insert';
@@ -153,22 +153,10 @@ export function chatComposerDraftToDirectCodexUserItem(
draft: ChatComposerDraft,
id: string,
): DirectCodexUserItem {
const content =
draft.content ??
(draft.references.length > 0
? [
...(draft.text
? [{ type: 'input_text' as const, text: draft.text }]
: []),
...draft.references.map(chatReferenceToContentPart),
]
: draft.text
? [{ type: 'input_text' as const, text: draft.text }]
: []);
return {
type: 'message',
role: 'user',
content,
content: draft.content,
id,
} satisfies DirectCodexUserItem;
}
@@ -6712,7 +6712,7 @@ export default function ProjectDevelopmentView({
if (
currentDraft &&
directCodexContentToPromptText(
currentDraft.content ?? [],
currentDraft.content,
manifest.assets,
) !== text
) {
@@ -6743,7 +6743,7 @@ export default function ProjectDevelopmentView({
const applyResourceQuickEditDraft = useCallback(
(draft: ChatComposerDraft) => {
applyResourceQuickEditPrompt(
directCodexContentToPromptText(draft.content ?? [], manifest.assets),
directCodexContentToPromptText(draft.content, manifest.assets),
);
},
[applyResourceQuickEditPrompt, manifest.assets],