Merge teacher reply cleanup with continuous conversations
This commit is contained in:
@@ -3,7 +3,6 @@ import path from 'node:path';
|
||||
import { atomicWriteJson, readJsonFile } from '../coding-projects/atomic-json';
|
||||
import type { TeacherTopic, TeacherTopicList } from '../../shared/coding-teacher';
|
||||
import { TeacherError } from './config-client';
|
||||
import { parseTeacherDiscussionContent } from '../../shared/teacher-discussion';
|
||||
|
||||
export function teacherTopicId(id: string): string {
|
||||
if (!/^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/i.test(id))
|
||||
@@ -60,30 +59,7 @@ export class TeacherTopicStore {
|
||||
if (topic.id !== id || topic.schemaVersion !== 1 || !Array.isArray(topic.requests))
|
||||
throw new TeacherError(409, 'teacher_topic_invalid', '智能体历史无法读取。');
|
||||
let recovered = false;
|
||||
if (topic.discussion) {
|
||||
try {
|
||||
const discussion = topic.discussion;
|
||||
teacherTopicId(discussion.id);
|
||||
if (!Number.isSafeInteger(discussion.revision) || discussion.revision < 1
|
||||
|| !['offered', 'active', 'paused', 'finished'].includes(discussion.status)) throw new Error('Invalid discussion');
|
||||
discussion.content = parseTeacherDiscussionContent(discussion.content);
|
||||
for (const key of ['previousIdeas', 'previousStructure'] as const) {
|
||||
if (!discussion[key]) continue;
|
||||
try {
|
||||
const previous = parseTeacherDiscussionContent(discussion[key]);
|
||||
if (key === 'previousIdeas' && previous.kind === 'ideas') discussion.previousIdeas = previous;
|
||||
else if (key === 'previousStructure' && previous.kind === 'structure') discussion.previousStructure = previous;
|
||||
else throw new Error('Invalid history');
|
||||
} catch { delete discussion[key]; recovered = true; }
|
||||
}
|
||||
} catch { delete topic.discussion; recovered = true; }
|
||||
}
|
||||
for (const request of topic.requests) {
|
||||
if (request.discussionSnapshot) {
|
||||
try { request.discussionSnapshot = parseTeacherDiscussionContent(request.discussionSnapshot); }
|
||||
catch { delete request.discussionSnapshot; recovered = true; }
|
||||
}
|
||||
}
|
||||
// Legacy component fields are opaque archives: never validate, revive or delete them.
|
||||
for (const request of topic.requests)
|
||||
if (request.status === 'preparing' || request.status === 'running') {
|
||||
request.status = 'interrupted';
|
||||
|
||||
Reference in New Issue
Block a user