feat: organize project conversations and add coding teacher side chat

This commit is contained in:
brother7 committed 2026-09-22 12:30:26 +08:00
1 parent 2f82b9f79c
commit 9242a40d87
45 files changed
+2987 -1137

No files matched your search

+19 -1
View File
@@ -4,7 +4,14 @@ export type NianCodeDeepLink = {
type: 'desktop-auth-callback';
requestId: string;
url: string;
} | { type: 'cloud-agent'; slug: string; url: string };
} | { type: 'cloud-agent'; slug: string; url: string }
| { type: 'teacher-preview'; draftRevision: number; url: string };
let pendingTeacherPreviewRevision: number | null = null;
export function queueTeacherPreviewRevision(revision: number): void { pendingTeacherPreviewRevision = revision; }
export function takeTeacherPreviewRevision(): number | null {
const revision = pendingTeacherPreviewRevision; pendingTeacherPreviewRevision = null; return revision;
}
let pendingCloudAgentRoute: string | null = null;
export function queueCloudAgentLink(slug: string): void {
@@ -39,6 +46,17 @@ export function parseNianCodeDeepLinkUrl(rawUrl: string): NianCodeDeepLink | nul
return null;
}
if (url.hostname === 'coding-teacher' && url.pathname === '/preview'
&& !url.username && !url.password && !url.port && !url.hash
&& [...url.searchParams.keys()].length === 1 && url.searchParams.has('draft_revision')) {
const value = url.searchParams.get('draft_revision')!;
const draftRevision = Number(value);
if (/^[1-9][0-9]*$/.test(value) && Number.isSafeInteger(draftRevision)) {
return { type: 'teacher-preview', draftRevision, url: rawUrl };
}
return null;
}
if (url.hostname !== 'auth' || url.pathname !== '/callback') {
return null;
}