返回 oh-my-ppt
generationActivityLog.ts
根目录 / src / renderer / src / components / session-detail / modal / generationActivityLog.ts
1 import { stripInternalEditConfirmations } from '@shared/edit-output'
2 import type { GenerateChunkEvent } from '@shared/generation'
3
4 type ActivityLogLabels = {
5 processing: string
6 completed: string
7 runFailed: string
8 pageFailed: (page: number, title: string) => string
9 pageContext: (page: number, title: string) => string
10 partialCompleted: (count: number) => string
11 unknownError: string
12 }
13
14 export type GenerationActivityLogContent = {
15 label: string
16 detail?: string
17 }
18
19 export type GenerationActivityStatus = 'running' | 'completed' | 'cancelled' | 'failed'
20
21 export function resolveGenerationActivityStatus(
22 event: GenerateChunkEvent,
23 failedPageCount: number
24 ): GenerationActivityStatus {
25 if (event.type === 'run_completed') {
26 return failedPageCount > 0 ? 'failed' : 'completed'
27 }
28 if (event.type === 'run_error') {
29 return event.payload.cancelled ? 'cancelled' : 'failed'
30 }
31 return 'running'
32 }
33
34 const clean = (value: unknown): string | undefined => {
35 if (typeof value !== 'string') return undefined
36 return stripInternalEditConfirmations(value) || undefined
37 }
38
39 const pageContext = (
40 event: GenerateChunkEvent,
41 labels: ActivityLogLabels
42 ): string | undefined => {
43 if (!('pageNumber' in event.payload) || typeof event.payload.pageNumber !== 'number') {
44 return undefined
45 }
46 const title =
47 'title' in event.payload && typeof event.payload.title === 'string'
48 ? event.payload.title
49 : ''
50 return labels.pageContext(event.payload.pageNumber, title)
51 }
52
53 export function buildGenerationActivityLogContent(
54 event: GenerateChunkEvent,
55 labels: ActivityLogLabels
56 ): GenerationActivityLogContent {
57 const eventLabel = 'label' in event.payload ? clean(event.payload.label) : undefined
58 const eventDetail = 'detail' in event.payload ? clean(event.payload.detail) : undefined
59
60 if (event.type === 'page_failed') {
61 return {
62 label: labels.pageFailed(event.payload.pageNumber, event.payload.title || ''),
63 detail: clean(event.payload.error) || eventDetail || labels.unknownError
64 }
65 }
66 if (event.type === 'run_error') {
67 return {
68 label: labels.runFailed,
69 detail: clean(event.payload.message) || labels.unknownError
70 }
71 }
72 if (event.type === 'run_completed') {
73 const failedPageCount = event.payload.failedPageCount || 0
74 return {
75 label:
76 failedPageCount > 0 ? labels.partialCompleted(failedPageCount) : labels.completed
77 }
78 }
79
80 return {
81 label: eventLabel || labels.processing,
82 detail: eventDetail || pageContext(event, labels)
83 }
84 }
85
85 lines TYPESCRIPT