feat: ship v1.2.0 Wave 1 foundation with book settings, chapter management, and focus mode

Deliver schema v9, book/chapter IPC extensions, BookSettingsTab, chapter meta/tags,
AI session menu, focus mode and TTS, template context enrich, and Wave 1 E2E coverage.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-08 15:22:58 +08:00
parent 64da95f7e1
commit fe127ec3ed
57 changed files with 1963 additions and 139 deletions
+18 -4
View File
@@ -32,6 +32,8 @@ import type {
Snapshot,
SnapshotType,
UpdateChapterParams,
UpdateBookMetaParams,
ChapterTag,
Volume,
WordFreqResult,
KnowledgeEntry,
@@ -73,10 +75,12 @@ export interface ElectronAPI {
create: (params: CreateBookParams) => Promise<IpcResult<BookMeta>>
delete: (bookId: string) => Promise<IpcResult<void>>
open: (bookId: string) => Promise<IpcResult<BookOpenResult>>
updateMeta: (
bookId: string,
patch: { lastChapterId?: string | null; status?: BookMeta['status'] }
) => Promise<IpcResult<BookMeta>>
updateMeta: (bookId: string, patch: UpdateBookMetaParams) => Promise<IpcResult<BookMeta>>
pickCover: (bookId: string) => Promise<IpcResult<BookMeta | null>>
}
bookPrefs: {
get: (bookId: string, key: string) => Promise<IpcResult<string | null>>
set: (bookId: string, key: string, value: string) => Promise<IpcResult<void>>
}
volume: {
create: (bookId: string, name: string) => Promise<IpcResult<Volume>>
@@ -105,6 +109,11 @@ export interface ElectronAPI {
publishStatus: PublishStatus
) => Promise<IpcResult<Chapter>>
}
chapterTag: {
list: (bookId: string, chapterId: string) => Promise<IpcResult<ChapterTag[]>>
set: (bookId: string, chapterId: string, tag: string, color?: string) => Promise<IpcResult<void>>
remove: (bookId: string, chapterId: string, tag: string) => Promise<IpcResult<void>>
}
outline: {
list: (bookId: string) => Promise<IpcResult<OutlineItem[]>>
create: (
@@ -221,6 +230,11 @@ export interface ElectronAPI {
patch: Partial<{ title: string; model: string; archived: boolean; context: AiContextBinding }>
) => Promise<IpcResult<AiSession>>
sessionDelete: (bookId: string, sessionId: string) => Promise<IpcResult<void>>
sessionExport: (
bookId: string,
sessionId: string,
format?: 'markdown' | 'txt'
) => Promise<IpcResult<string | null>>
messageList: (bookId: string, sessionId: string) => Promise<IpcResult<AiMessage[]>>
chat: (
bookId: string,