feat: ship v0.4.0 with interactive writing mode

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-06 17:46:16 +08:00
parent 0a054606fe
commit a8e0ba9ac9
39 changed files with 2113 additions and 89 deletions
+42
View File
@@ -15,6 +15,11 @@ import type {
NamingConflict,
AiStreamChunkEvent,
AiNetworkStatusEvent,
InteractiveFlow,
InteractiveGateResult,
InteractiveStreamChunkEvent,
PlotOption,
PlotSelection,
IpcResult,
LandmarkType,
OutlineItem,
@@ -199,6 +204,42 @@ export interface ElectronAPI {
testConnection: (config?: AiConfig) => Promise<IpcResult<{ ok: true }>>
namingCheck: (bookId: string) => Promise<IpcResult<NamingConflict[]>>
}
interactive: {
checkGate: (bookId: string) => Promise<IpcResult<InteractiveGateResult>>
getFlow: (bookId: string, sessionId: string) => Promise<IpcResult<InteractiveFlow | null>>
start: (bookId: string, sessionId: string) => Promise<IpcResult<InteractiveFlow>>
confirmContext: (
bookId: string,
flowId: string,
binding: AiContextBinding
) => Promise<IpcResult<InteractiveFlow>>
suggestPlots: (bookId: string, flowId: string) => Promise<IpcResult<PlotOption[]>>
selectPlot: (
bookId: string,
flowId: string,
selection: PlotSelection
) => Promise<IpcResult<InteractiveFlow>>
generateScene: (bookId: string, flowId: string) => Promise<IpcResult<InteractiveFlow>>
resolveNaming: (
bookId: string,
flowId: string,
chosenName: string
) => Promise<IpcResult<InteractiveFlow>>
refineScene: (
bookId: string,
flowId: string,
instruction: string
) => Promise<IpcResult<InteractiveFlow>>
acceptScene: (bookId: string, flowId: string) => Promise<IpcResult<InteractiveFlow>>
finishChapter: (
bookId: string,
flowId: string,
volumeId: string,
title?: string
) => Promise<IpcResult<{ chapterId: string }>>
abort: (flowId: string) => Promise<IpcResult<void>>
getSceneDraft: (bookId: string, flowId: string) => Promise<IpcResult<string>>
}
wordfreq: {
analyze: (
bookId: string,
@@ -212,6 +253,7 @@ export interface ElectronAPI {
onShortcutTriggered: (callback: (action: ActionId) => void) => () => void
onAiStreamChunk: (callback: (payload: AiStreamChunkEvent) => void) => () => void
onAiNetworkStatus: (callback: (payload: AiNetworkStatusEvent) => void) => () => void
onInteractiveStreamChunk: (callback: (payload: InteractiveStreamChunkEvent) => void) => () => void
}
declare global {