Help us shape the future of Go! Take the 2026 Go Developer Survey

app

package
v1.7.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 13, 2026 License: AGPL-3.0 Imports: 55 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type App

type App struct {
	// contains filtered or unexported fields
}

App 是 Wails 绑定的根对象。前端通过 window.go.main.App 调用其导出方法。 各领域方法按文件拆分(novel.go / chapter.go 等),均接收 *App。

func New

func New(logger *slog.Logger) *App

New 创建 App 实例。初始化在 OnStartup 中完成。

func (*App) ApproveTool

func (a *App) ApproveTool(toolID string, approved bool, feedback string) error

ApproveTool 前端调用,响应审批请求。

func (*App) CancelChat

func (a *App) CancelChat(sessionID string)

CancelChat 前端调用,取消一个正在进行的对话。

func (*App) CancelExtract

func (a *App) CancelExtract(taskID string)

CancelExtract 取消指定 taskID 的风格提取任务。

func (*App) CancelExtractPattern

func (a *App) CancelExtractPattern(novelID int64)

CancelExtractPattern 取消正在进行的小说模式提取

func (*App) CancelQuit added in v1.6.0

func (a *App) CancelQuit()

CancelQuit 由前端在用户选择继续等待后调用。

必须清除待确认标记:否则用户下次关窗会被 decideClose 当成「确认期间再次关闭」 而直接放行,等于第二次关闭不再劝阻。

func (*App) Chat

func (a *App) Chat(input ChatInput) (*ChatResult, error)

Chat 是对话入口。Wails 绑定,前端调用后同步执行,期间通过 EventsEmit 推流。

func (*App) CheckUpdate

func (a *App) CheckUpdate(skipDismiss bool) (*update.CheckResult, error)

CheckUpdate 检查 GitHub Release 是否有新版本。 skipDismiss 为 true 时跳过已忽略版本的过滤 + 12h 节流(手动检查场景)。 返回 CheckResult(包含是否有更新的信息),网络/解析错误时返回 error。 自动检查场景下,若距上次检查不足 12h,或用户已忽略过该版本且没有更新的版本,返回 nil。

func (*App) CompressContext

func (a *App) CompressContext(input CompressInput) (*CompressResult, error)

CompressContext 手动触发上下文压缩。仅在无进行中 turn 时允许。

func (*App) ComputeStyleStats

func (a *App) ComputeStyleStats(input ComputeStyleStatsInput) (*style.Stats, error)

ComputeStyleStats 对指定的风格素材进行确定性文本统计。

func (*App) ConfirmQuit added in v1.6.0

func (a *App) ConfirmQuit()

ConfirmQuit 由前端在用户确认退出后调用。

先登记「已确认」再退出:runtime.Quit 会再次触发 OnBeforeClose,这个标记让那一次 直接放行,否则又会弹出一轮确认。

func (*App) CreateArcNode

func (a *App) CreateArcNode(novelID int64, input CreateArcNodeInput) (*storyarc.ArcNode, error)

CreateArcNode 创建弧线节点。

func (*App) CreateChapter

func (a *App) CreateChapter(input CreateChapterInput) (*chapter.Chapter, error)

CreateChapter 创建新章节。同时创建空正文文件。 新章节默认追加到最后一卷;尚未建卷时追加到未分卷组。

func (*App) CreateCharacter

func (a *App) CreateCharacter(novelID int64, input CreateCharacterInput) (*character.Character, error)

CreateCharacter 创建一个角色。

func (*App) CreateCharacterGroup added in v1.6.1

func (a *App) CreateCharacterGroup(novelID int64, input CharacterGroupInput) (*character.Group, error)

func (*App) CreateLocation

func (a *App) CreateLocation(novelID int64, input CreateLocationInput) (*location.Location, error)

CreateLocation 创建一个地点。

func (*App) CreateNovel

func (a *App) CreateNovel(input CreateNovelInput) (*novel.Novel, error)

CreateNovel 创建一部新小说。

func (*App) CreateNovelSetting

func (a *App) CreateNovelSetting(novelID int64, input CreateNovelSettingInput) (*setting.SettingItem, error)

CreateNovelSetting 创建一条小说设定。

func (*App) CreatePreference

func (a *App) CreatePreference(novelID int64, input CreatePreferenceInput) (*preference.PreferenceItem, error)

CreatePreference 创建一条创作偏好。

func (*App) CreateReaderPerspective

func (a *App) CreateReaderPerspective(novelID int64, input CreateReaderPerspectiveInput) (*reader.ReaderPerspective, error)

CreateReaderPerspective 创建一条读者认知条目。

func (*App) CreateStoryArc

func (a *App) CreateStoryArc(novelID int64, input CreateStoryArcInput) (*storyarc.StoryArc, error)

CreateStoryArc 创建一条叙事弧线。

func (*App) CreateStyleSample

func (a *App) CreateStyleSample(input CreateStyleSampleInput) (*style.Sample, error)

CreateStyleSample 创建一条风格素材。

func (*App) CreateTimelineEntry

func (a *App) CreateTimelineEntry(novelID int64, input CreateTimelineEntryInput) (*timeline.TimelineEntry, error)

CreateTimelineEntry 创建一条伏笔或用户指令。

func (*App) DeleteArcNode

func (a *App) DeleteArcNode(novelID int64, nodeID int64) error

DeleteArcNode 删除弧线节点。

func (*App) DeleteChapter added in v1.6.0

func (a *App) DeleteChapter(novelID, chapterID int64) (*chapter.DeleteResult, error)

DeleteChapter 删除没有交叉引用的章节及其正文、大纲与派生索引。

func (*App) DeleteCharacter

func (a *App) DeleteCharacter(novelID int64, charID int64) error

DeleteCharacter 删除角色(级联删除关联的关系记录)。

func (*App) DeleteCharacterGroup added in v1.6.1

func (a *App) DeleteCharacterGroup(novelID, groupID int64) error

func (*App) DeleteCover

func (a *App) DeleteCover(novelID int64) error

DeleteCover 删除小说封面并提交到 Git 仓库。

func (*App) DeleteLocation

func (a *App) DeleteLocation(novelID int64, locID int64) error

DeleteLocation 删除地点(子地点父级置空,级联删除空间关系)。

func (*App) DeleteMCPConnection added in v1.7.0

func (a *App) DeleteMCPConnection(id string) error

func (*App) DeleteNovel

func (a *App) DeleteNovel(novelID int64) error

DeleteNovel 删除小说,级联清理所有关联数据、Git 仓库目录。

func (*App) DeleteNovelSetting

func (a *App) DeleteNovelSetting(id int64) error

DeleteNovelSetting 删除一条小说设定。

func (*App) DeletePreference

func (a *App) DeletePreference(id int64) error

DeletePreference 删除一条创作偏好。

func (*App) DeleteReaderPerspective

func (a *App) DeleteReaderPerspective(id int64, novelID int64) error

DeleteReaderPerspective 删除一条读者认知条目。

func (*App) DeleteSession

func (a *App) DeleteSession(sessionID string) error

DeleteSession 删除指定会话及其全部消息、关联的操作日志。不可恢复。

func (*App) DeleteSkill

func (a *App) DeleteSkill(input DeleteSkillInput) error

DeleteSkill 删除用户级或小说级技能文件。内置技能不可删除。

func (*App) DeleteStoryArc

func (a *App) DeleteStoryArc(novelID int64, arcID int64) error

DeleteStoryArc 删除一条叙事弧线(级联删除关联节点)。

func (*App) DeleteStyleSample

func (a *App) DeleteStyleSample(input DeleteStyleSampleInput) error

DeleteStyleSample 删除一条风格素材。

func (*App) DeleteTimelineEntry

func (a *App) DeleteTimelineEntry(novelID int64, entryID int64) error

DeleteTimelineEntry 删除一条伏笔或用户指令。

func (*App) DeleteVolume added in v1.6.0

func (a *App) DeleteVolume(novelID, volumeID int64) error

DeleteVolume 删除指定小说中的空卷。

func (*App) DiscoverModels

func (a *App) DiscoverModels(providerName, chatURL, apiKey string) ([]llm.ModelInfo, error)

DiscoverModels 调用 /models 端点自动发现可用模型列表。

func (*App) DismissUpdate

func (a *App) DismissUpdate(tagName string) error

DismissUpdate 记录用户已忽略的更新版本号,同一版本不再提示。

func (*App) ExportNovel

func (a *App) ExportNovel(novelID int64, format string) error

ExportNovel 将小说导出为指定格式。先弹出保存对话框让用户选择保存位置, 再读取章节并生成文件,避免在耗时生成后才弹窗(Windows 上 Wails 原生对话框 在桥接负载下可能无法创建窗口,导致导出卡死)。

func (*App) ExtractPattern

func (a *App) ExtractPattern(input ExtractPatternInput) (*ExtractPatternResult, error)

ExtractPattern 从指定小说中提取叙事套路模式

func (*App) ExtractStyle

func (a *App) ExtractStyle(input ExtractStyleInput) (*style.ExtractResult, error)

ExtractStyle 从选中的素材中提取写作风格,生成仿写 skill。

func (*App) FrontendReady added in v1.6.0

func (a *App) FrontendReady() StartupState

FrontendReady 由前端在挂载完成、且已注册 startup:state 监听之后调用。

它在同一临界区内标记前端就绪并返回当前快照:此前状态由返回值补齐,此后 状态转换都会发事件。前端按 Version 应用快照,因此无需依赖事件投递顺序。 在 React StrictMode 下重复调用也是安全的。

func (*App) GetAppConfig

func (a *App) GetAppConfig() map[string]any

GetAppConfig 返回当前运行时配置信息(供前端诊断)。

func (*App) GetArcNodes

func (a *App) GetArcNodes(novelID int64) ([]storyarc.ArcNode, error)

GetArcNodes 返回指定小说的全部弧线节点,供前端列表和关系图渲染。 4b: 改调 ListNodesByNovel(Size=-1) 全量(废弃 ListNodesByChapterRange)。 显式传 Order 补回 story_arc_id 前缀:同一条弧线的节点聚簇连续,避免被跨弧线打散。

func (*App) GetBuildHash added in v1.6.1

func (a *App) GetBuildHash() string

GetBuildHash 返回构建时的短 Git 提交号。

func (*App) GetChapterPlans

func (a *App) GetChapterPlans(novelID int64) ([]timeline.ChapterPlan, error)

GetChapterPlans 返回指定小说的章节计划(next/near/far 三个槽位)。

func (*App) GetChapters

func (a *App) GetChapters(novelID int64) ([]chapter.Chapter, error)

GetChapters 返回指定小说的章节列表,含文件路径。

func (*App) GetCharacterGroupMembers added in v1.6.1

func (a *App) GetCharacterGroupMembers(input GetCharacterGroupMembersInput) (*storage.PageResult[character.GroupMember], error)

func (*App) GetCharacterGroups added in v1.6.1

func (a *App) GetCharacterGroups(input GetCharacterGroupsInput) (*storage.PageResult[character.GroupView], error)

func (*App) GetCharacterRelations

func (a *App) GetCharacterRelations(novelID int64) ([]character.CharacterRelation, error)

GetCharacterRelations 返回指定小说的全部当前角色关系(有向边),供前端关系图渲染。

func (*App) GetCharacters

func (a *App) GetCharacters(novelID int64) ([]character.Character, error)

GetCharacters 返回指定小说的全部角色,供前端侧边栏列表和关系图节点渲染。 4b: 改调 ListByNovel(Size=-1) 全量(废弃 ListAllByNovel),传 Order="name ASC" 保持原 ListAllByNovel 的 name 升序行为。MCP 不传 Order,走默认 updated_at DESC。

func (*App) GetCommitFileList

func (a *App) GetCommitFileList(novelID int64, hash string) (*CommitFileListResult, error)

GetCommitFileList 获取指定 commit 的详细信息和变更文件列表(不含文件内容)。

func (*App) GetCommitLog

func (a *App) GetCommitLog(novelID int64, n int, afterHash string) ([]git.CommitInfo, error)

GetCommitLog 获取指定小说的 Git 提交历史。 afterHash 非空时返回该 commit 之后的更早提交(游标翻页)。

func (*App) GetContent

func (a *App) GetContent(novelID int64, path string) (string, error)

GetContent 返回小说仓库中指定路径的文件内容。文件不存在时返回空字符串。 内置 skill 路径(/builtin/skills/)从内存读取。

func (*App) GetFileDiff

func (a *App) GetFileDiff(novelID int64, hash string, filePath string) (*git.FileDiff, error)

GetFileDiff 获取指定 commit 中某个文件的前后内容。

func (*App) GetLLMConfig

func (a *App) GetLLMConfig() (*llm.LLMConfigView, error)

GetLLMConfig 返回合并内置模板和用户配置的完整视图。

func (*App) GetLocationRelations

func (a *App) GetLocationRelations(novelID int64) ([]location.LocationRelation, error)

GetLocationRelations 返回指定小说的全部空间关系(无向边),供前端关系图渲染。

func (*App) GetLocations

func (a *App) GetLocations(novelID int64) ([]location.Location, error)

GetLocations 返回指定小说的全部地点,供前端侧边栏嵌套树和关系图节点渲染。 4b: 改调 ListByNovel(Size=-1) 全量(废弃 ListAllByNovel),传 Order="name ASC" 保持原 name 升序行为。

func (*App) GetMCPServerSettings added in v1.7.0

func (a *App) GetMCPServerSettings() (mcpserver.LocalView, error)

func (*App) GetMCPTools added in v1.7.0

func (a *App) GetMCPTools(id string) ([]mcpclient.ToolView, error)

func (*App) GetMaxChapterNumber

func (a *App) GetMaxChapterNumber(novelID int64) (int, error)

GetMaxChapterNumber 返回该小说当前章节总数,无章节时返回 0。前端确定写作进度用。 展示章节号由阅读顺序实时计算,最大展示章节号等于章节总数。

func (*App) GetModels

func (a *App) GetModels() []llm.AvailableModel

GetModels 返回所有可用模型列表,由后端决定能力和推理程度。

func (*App) GetNovelSettings

func (a *App) GetNovelSettings(novelID int64) (*SettingResult, error)

GetNovelSettings 返回当前小说的全部设定,附带全量 token 数与超预算标记。 token_count 用于前端显示是否超 8k 软上限,不阻塞、不强制精简(用户自行决定)。 注入给 agent 的 NovelState 会按 created_at DESC 截断到 8k 内,与此处 token_count 是两套口径: 这里是"全量实际多少",agent 注入是"截断后剩多少"。

func (*App) GetNovels

func (a *App) GetNovels() ([]novel.Novel, error)

GetNovels 返回小说列表。

func (*App) GetPlatform

func (a *App) GetPlatform() map[string]any

GetPlatform 返回平台信息,供前端决定默认路径等行为。

func (*App) GetPreferences

func (a *App) GetPreferences(novelID int64) (*PreferenceResult, error)

GetPreferences 返回全局偏好和当前小说的专属偏好,附带全量 token 数与超预算标记。 token_count 用于前端显示是否超 4k 软上限,不阻塞、不强制精简(用户自行决定)。 注入给 agent 的 NovelProfile 会按 created_at DESC 截断到 4k 内,与此处 token_count 是两套口径: 这里是"全量实际多少",agent 注入是"截断后剩多少"。

func (*App) GetReaderPerspectives

func (a *App) GetReaderPerspectives(novelID int64) ([]reader.ReaderPerspective, error)

GetReaderPerspectives 返回指定小说的全部读者认知条目,按 type, planted_chapter_id ASC 排列。 4b: 改调 ListByNovel(Size=-1) 一次拉全(废弃循环翻页拉全)。显式传 Order 保持原排序。

func (*App) GetRemoteSkillContent

func (a *App) GetRemoteSkillContent(name string) *apperr.Result[string]

GetRemoteSkillContent 拉取指定远程 skill 的 markdown 原文内容。 用于详情面板展示全文。

func (*App) GetSession

func (a *App) GetSession(sessionID string) (*SessionDetail, error)

GetSession 加载单个会话的完整元数据,含用量、推理程度等。

func (*App) GetSessionMessages

func (a *App) GetSessionMessages(sessionID string) ([]session.Message, error)

GetSessionMessages 加载指定 session 的全部前端可见消息。

func (*App) GetSessions

func (a *App) GetSessions(input GetSessionsInput) (*storage.PageResult[SessionMeta], error)

GetSessions 分页查询当前小说的对话历史。search 非空时搜索消息内容。

func (*App) GetSettings

func (a *App) GetSettings() (*config.AppSettings, error)

GetSettings 返回运行时配置。返回结构体副本,避免调用方序列化时与并发写入竞争。

func (*App) GetStartupState added in v1.6.0

func (a *App) GetStartupState() StartupState

GetStartupState 返回当前启动状态。

前端可在任意时刻调用:Wails 的绑定在 CreateApp 阶段就注册完毕,早于 OnStartup 的执行,因此初始化期间调用是合法的;而本方法只读内存字段, 不触碰 db 与各领域 store,所以也不会 nil panic。

func (*App) GetStoryArcs

func (a *App) GetStoryArcs(novelID int64) ([]storyarc.StoryArc, error)

GetStoryArcs 返回指定小说的全部叙事弧线。弧线通常 3-5 条,全量无分页。 4b: 显式传 Order 保持原排序行为(importance DESC, created_at ASC)。

func (*App) GetStyleSample

func (a *App) GetStyleSample(id int64) (*style.Sample, error)

GetStyleSample 获取单条风格素材的完整内容。

func (*App) GetTimelineEntries

func (a *App) GetTimelineEntries(novelID int64) ([]timeline.TimelineEntry, error)

GetTimelineEntries 返回指定小说的全部伏笔/用户指令,供前端列表渲染。 4b: 改调 ListByNovel(Size=-1) 全量(废弃 ListByChapterRange,前端 useTimelineEntries 传 0,0 全量 + 内存切窗口,行为等价)。显式传 Order 保持原排序。

func (*App) GetVersion

func (a *App) GetVersion() string

GetVersion 返回当前应用版本号。

func (*App) GetVolumes added in v1.6.0

func (a *App) GetVolumes(novelID int64) ([]volume.Volume, error)

GetVolumes 返回指定小说的全部卷,按阅读顺序排列。

func (*App) GetWritingActivity

func (a *App) GetWritingActivity(months int) ([]writing.DailyActivity, error)

GetWritingActivity 返回最近 months 个月每日写作字数汇总。

func (*App) GetWritingStats

func (a *App) GetWritingStats() (*writing.WritingStats, error)

GetWritingStats 返回全局写作统计,跨所有小说。

func (*App) ImportNovel

func (a *App) ImportNovel(input ImportNovelInput) (*ImportNovelResult, error)

ImportNovel 从文件导入一部小说:解析文件 → 创建 Novel → 写入章节文件 → Git 提交。

func (*App) ImportWithLLM

func (a *App) ImportWithLLM(input ImportWithLLMInput) (*ImportNovelResult, error)

ImportWithLLM 使用 LLM 分析章节格式后导入小说。 当 ImportNovel 返回 NeedsLLM=true 时,前端调用此方法。 流程:LLM 生成正则 → 全文分割 → 校验 → 导入。

func (*App) Initialize

func (a *App) Initialize(dataDir string) error

Initialize 在用户触发首次初始化时调用:写入指针文件后执行初始化。 dataDir 参数保留用于前端兼容,实际数据目录由平台决定。

func (*App) InstallRemoteSkill

func (a *App) InstallRemoteSkill(input InstallRemoteSkillInput) *apperr.Result[apperr.Empty]

InstallRemoteSkill 将指定远程 skill 安装到目标层(user 或 novel)。 安装成功后触发 skill.Store 热重载(失败只 Warn 不返回 error)。 后端不做存在性判断,前端弹确认框处理覆盖语义。 expected_content 是用户看到目标时的内容,服务端在写入时校验它。

func (*App) IsInitialized

func (a *App) IsInitialized() bool

IsInitialized 报告核心运行时是否已就绪。

启动阶段的前端路由应使用 GetStartupState,而非这个兼容性布尔接口。

func (*App) ListMCPConnections added in v1.7.0

func (a *App) ListMCPConnections() ([]mcpclient.ConnectionView, error)

func (*App) ListRemoteSkills

ListRemoteSkills 列出远程 skill 市场的所有 skill,支持分页和搜索。 forceRefresh=false 优先使用内存缓存(1h TTL),前端"刷新"按钮可改为 true 强制刷新。 错误以 *apperr.Result[*storage.PageResult[remote.RemoteSkillMeta]] 透传,前端按 err_code 分类反馈。

func (*App) ListSkills

func (a *App) ListSkills(input ListSkillsInput) []skill.SkillMeta

ListSkills 返回所有可用 skill 的元数据(同名覆盖:novel > user > builtin)。

func (*App) ListSlashCommands

func (a *App) ListSlashCommands(input ListSlashCommandsInput) []SlashCommand

ListSlashCommands 返回所有 skill 对应的斜杠菜单条目。

func (*App) ListStyleSamples

func (a *App) ListStyleSamples(input ListStyleSamplesInput) (*storage.PageResult[style.Sample], error)

ListStyleSamples 分页列出风格素材。

func (*App) OnBeforeClose added in v1.6.0

func (a *App) OnBeforeClose(ctx context.Context) bool

OnBeforeClose 在窗口关闭前调用,返回 true 表示阻止关闭。

初始化进行中(含数据库迁移)时劝阻退出:迁移本身可断点续跑,但用户往往 不知道自己在等什么,中途退出会白白浪费一次启动。这里选择"劝阻 + 允许"而非 硬阻止——强杀进程无法拦截,硬阻止只会把用户逼向更粗暴的退出方式。

Wails v2 的 MessageDialog 在 Windows/Linux 会忽略自定义按钮(只给系统按钮, 返回值恒为 "Ok"/"OK"),无法表达"继续等待 / 退出"这组选项,因此改由前端渲染 弹窗:本函数只做判定与登记,用户的最终选择经 ConfirmQuit / CancelQuit 回来。

func (*App) OnShutdown

func (a *App) OnShutdown(shutdownCtx context.Context)

OnShutdown 在 Wails 窗口关闭前调用,释放资源。

func (*App) OnStartup

func (a *App) OnStartup(ctx context.Context)

OnStartup 在 Wails 窗口创建后调用,完成基础设施初始化。

注意 Wails 是在独立 goroutine 中调用本函数的,因此初始化与前端加载并发: 前端很可能在迁移跑完之前就挂载完毕。此时它靠 startup:state 事件与 GetStartupState 得知"正在初始化",而不是靠 IsInitialized() 的布尔量——后者 会把"初始化中"和"初始化失败"都误判为"未配置"。

func (*App) PickAndImportNovel

func (a *App) PickAndImportNovel() (*ImportNovelResult, error)

PickAndImportNovel 打开文件选择对话框,然后导入选中的小说文件。

func (*App) PlaceChapter added in v1.6.0

func (a *App) PlaceChapter(input PlaceChapterInput) (*chapter.Chapter, error)

PlaceChapter 新建或移动章节,并将其置于目标章节组的指定位置。

func (*App) PlaceVolume added in v1.6.0

func (a *App) PlaceVolume(input PlaceVolumeInput) (*volume.Volume, error)

func (*App) RebuildNovelIndex

func (a *App) RebuildNovelIndex(novelID int64) error

RebuildNovelIndex 无条件全量重建指定小说的向量索引,用于数据异常时的手动兜底。

func (*App) RecordCreativeActivity added in v1.6.1

func (a *App) RecordCreativeActivity(seconds int64)

RecordCreativeActivity 累计近似活跃秒数,单次最多计一分钟;统计失败不向前端返回错误。

func (*App) RefreshMCPTools added in v1.7.0

func (a *App) RefreshMCPTools(id string) ([]mcpclient.ToolView, error)

func (*App) RetryStartup added in v1.6.0

func (a *App) RetryStartup() error

RetryStartup 重新执行初始化,供前端在失败页点"重试"时调用。

与 Initialize 的区别:不写指针文件——配置已经存在,重试只是重新读取并初始化。 若复用 Initialize,会拿前端传来的路径覆盖用户已有配置。

func (*App) RevokeMCPServerCredential added in v1.7.0

func (a *App) RevokeMCPServerCredential() error

func (*App) RotateMCPServerCredential added in v1.7.0

func (a *App) RotateMCPServerCredential() (mcpserver.LocalView, error)

func (*App) SaveAvatar

func (a *App) SaveAvatar(data []byte) error

SaveAvatar 保存用户头像到数据目录。

func (*App) SaveContent

func (a *App) SaveContent(input SaveContentInput) error

SaveContent 保存小说仓库中指定路径的文件内容。

func (*App) SaveCover

func (a *App) SaveCover(novelID int64, data []byte) error

SaveCover 保存小说封面并提交到 Git 仓库。

func (*App) SaveGitConfig

func (a *App) SaveGitConfig(name, email string) error

SaveGitConfig 保存 Git user.name 和 user.email,并同步到所有已有仓库。

func (*App) SaveLLMConfig

func (a *App) SaveLLMConfig(input llm.LLMConfigView) error

SaveLLMConfig 保存用户 LLM 配置并热重载 Client。

func (*App) SaveMCPConnection added in v1.7.0

func (a *App) SaveMCPConnection(input mcpclient.ConnectionInput) (mcpclient.ConnectionView, error)

func (*App) SaveMCPServerSettings added in v1.7.0

func (a *App) SaveMCPServerSettings(input servercfg.Local) (mcpserver.LocalView, error)

func (*App) SaveSettings

func (a *App) SaveSettings(input SaveSettingsInput) error

SaveSettings 保存运行时配置。

func (*App) SaveUserName

func (a *App) SaveUserName(name string) error

SaveUserName 保存用户名称。

func (*App) SearchAll

func (a *App) SearchAll(novelID int64, query string) ([]search.Result, error)

SearchAll 执行全局搜索:实体 LIKE + 正文精确 + RAG 语义。

func (*App) SetActiveNovel

func (a *App) SetActiveNovel(input SetActiveNovelInput) error

SetActiveNovel 记录当前活跃的小说 ID,下次启动自动恢复。

func (*App) SetApprovalMode

func (a *App) SetApprovalMode(mode string) error

SetApprovalMode 前端调用,切换审批模式并持久化。"auto" 自动批准,"manual" 等待用户操作。

func (*App) SetLastSession

func (a *App) SetLastSession(sessionID string) error

SetLastSession 保存上次活跃的会话 ID。

func (*App) SetMCPConnectionEnabled added in v1.7.0

func (a *App) SetMCPConnectionEnabled(id string, enabled bool) error

func (*App) SetMCPToolAllowed added in v1.7.0

func (a *App) SetMCPToolAllowed(id, tool string, allowed bool) error

func (*App) SetReasoningEffort

func (a *App) SetReasoningEffort(effort string) error

SetReasoningEffort 单独保存推理程度。

func (*App) SetSelectedModel

func (a *App) SetSelectedModel(key, effort string) error

SetSelectedModel 保存选中的模型 key 和推理程度,持久化到 DB。

func (*App) TestConnection

func (a *App) TestConnection(input TestConnectionInput) (llm.TestConnectionResult, error)

TestConnection 发送最小化请求验证 provider 连通性。 多层 fallback 真测,返回验证通过的实际 URL(可能和入参不同,是探测到的正确端点)。 成功返回 (TestConnectionResult, nil),前端应将 result.URL 回写到 provider.chat_url 再保存,确保保存的 URL 和测试时一致。 result.Warning 非空时(如 429 限流)也应展示给用户,但不影响 ok 判定。 失败返回 (TestConnectionResult{}, error)。

func (*App) TestMCPConnection added in v1.7.0

func (a *App) TestMCPConnection(id string) ([]mcpclient.ToolView, error)

func (*App) UpdateArcNode

func (a *App) UpdateArcNode(novelID int64, nodeID int64, input UpdateArcNodeInput) error

UpdateArcNode 更新弧线节点。PUT 全量覆盖用户可编辑字段。

func (*App) UpdateChapterPlan

func (a *App) UpdateChapterPlan(novelID int64, input UpdateChapterPlanInput) error

UpdateChapterPlan 更新章节计划(全量替换文件内容)。

func (*App) UpdateChapterTitle

func (a *App) UpdateChapterTitle(novelID, chapterID int64, title string) error

UpdateChapterTitle 更新章节标题。

func (*App) UpdateCharacter

func (a *App) UpdateCharacter(novelID int64, charID int64, input UpdateCharacterInput) error

UpdateCharacter 更新角色。PUT 全量覆盖用户可编辑字段。

func (*App) UpdateCharacterGroup added in v1.6.1

func (a *App) UpdateCharacterGroup(novelID, groupID int64, input CharacterGroupInput) error

func (*App) UpdateCharacterGroupMemberships added in v1.6.1

func (a *App) UpdateCharacterGroupMemberships(novelID int64, input CharacterGroupMembershipInput) error

func (*App) UpdateDataDir

func (a *App) UpdateDataDir(newPath string) error

UpdateDataDir 更改数据目录并重新初始化所有运行时模块。

TODO: 实现数据迁移——更改目录时自动将旧目录中的数据文件移动到新目录。 同盘用 os.Rename(原子),跨盘用递归拷贝+进度回调,目标非空时弹确认框。

func (*App) UpdateLocation

func (a *App) UpdateLocation(novelID int64, locID int64, input UpdateLocationInput) error

UpdateLocation 更新地点。PUT 全量覆盖用户可编辑字段。

func (*App) UpdateNovel

func (a *App) UpdateNovel(novelID int64, input UpdateNovelInput) (*novel.Novel, error)

UpdateNovel 更新小说信息。PUT 全量覆盖用户可编辑字段。

func (*App) UpdateNovelSetting

func (a *App) UpdateNovelSetting(novelID int64, id int64, input UpdateNovelSettingInput) (*setting.SettingItem, error)

UpdateNovelSetting 更新一条小说设定。 PUT 语义:前端全量传 category/content,后端全量覆盖 + db.Save(走 GORM 回调)。 归属校验:只能改当前小说的设定。

func (*App) UpdatePreference

func (a *App) UpdatePreference(novelID int64, id int64, input UpdatePreferenceInput) (*preference.PreferenceItem, error)

UpdatePreference 更新一条创作偏好。 novelID 由前端显式传入(当前工作区小说),用于 is_global 切换时填 NovelID。 PUT 语义:前端全量传 category/content/is_global,后端全量覆盖 + db.Save(走 GORM 回调)。

func (*App) UpdateReaderPerspective

func (a *App) UpdateReaderPerspective(id int64, novelID int64, input UpdateReaderPerspectiveInput) error

UpdateReaderPerspective 更新一条读者认知条目。PUT 全量覆盖用户可编辑字段。

func (*App) UpdateStoryArc

func (a *App) UpdateStoryArc(novelID int64, arcID int64, input UpdateStoryArcInput) error

UpdateStoryArc 更新叙事弧线。PUT 全量覆盖用户可编辑字段。

func (*App) UpdateStyleSample

func (a *App) UpdateStyleSample(input UpdateStyleSampleInput) (*style.Sample, error)

UpdateStyleSample 更新一条风格素材。

func (*App) UpdateTimelineEntry

func (a *App) UpdateTimelineEntry(novelID int64, entryID int64, input UpdateTimelineEntryInput) error

UpdateTimelineEntry 更新伏笔或用户指令。PUT 全量覆盖用户可编辑字段。

func (*App) UpdateVolume added in v1.6.0

func (a *App) UpdateVolume(novelID, volumeID int64, name string) error

UpdateVolume 重命名指定小说中的卷。

type CharacterGroupInput added in v1.6.1

type CharacterGroupInput struct {
	Name        string `json:"name"`
	Description string `json:"description"`
}

CharacterGroupInput 是分组创建/更新参数;更新采用 PUT 语义。

type CharacterGroupMembershipInput added in v1.6.1

type CharacterGroupMembershipInput struct {
	CharacterIDs   []int64 `json:"character_ids"`
	AddGroupIDs    []int64 `json:"add_group_ids"`
	RemoveGroupIDs []int64 `json:"remove_group_ids"`
}

type ChatInput

type ChatInput struct {
	SessionID       string `json:"session_id"` // 空=新建会话
	NovelID         int64  `json:"novel_id"`
	Message         string `json:"message"`
	ProviderName    string `json:"provider_name"`    // "deepseek"
	ModelID         string `json:"model_id"`         // "deepseek-v4-pro"
	ReasoningEffort string `json:"reasoning_effort"` // "high" | "max" | ""
}

ChatInput 是一次对话请求的入参。

type ChatResult

type ChatResult struct {
	SessionID string `json:"session_id"`
	TurnID    int    `json:"turn_id"`
	FinalText string `json:"final_text"`
}

ChatResult 是一次对话请求的返回值。

type CommitFileListResult

type CommitFileListResult struct {
	Commit *git.CommitInfo `json:"commit"`
	Files  []git.FileEntry `json:"files"`
}

CommitFileListResult 包含一次 commit 的详细信息和变更文件列表(不含内容)。

type CompressInput

type CompressInput struct {
	SessionID    string `json:"session_id"`
	ProviderName string `json:"provider_name"`
	ModelID      string `json:"model_id"`
}

CompressInput 是手动压缩请求的入参。

type CompressResult

type CompressResult struct {
	TurnID int `json:"turn_id"`
}

CompressResult 是手动压缩请求的返回值。

type ComputeStyleStatsInput

type ComputeStyleStatsInput struct {
	SampleIDs []int64 `json:"sample_ids"`
}

ComputeStyleStatsInput 是计算风格统计的入参。

type CreateArcNodeInput

type CreateArcNodeInput struct {
	StoryArcID          int64  `json:"story_arc_id"`          // 所属弧线 ID,必填
	Title               string `json:"title"`                 // 节点标题,必填
	Description         string `json:"description,omitempty"` // 节点详情
	TargetReadingNumber int    `json:"target_reading_number"` // 预计发生的阅读位置,必填
}

CreateArcNodeInput 是 CreateArcNode 的参数。

type CreateChapterInput

type CreateChapterInput struct {
	NovelID int64  `json:"novel_id"`
	Title   string `json:"title"`
}

CreateChapterInput 是创建章节的入参。

type CreateCharacterInput

type CreateCharacterInput struct {
	Name        string `json:"name"`                  // 角色名称,必填
	Description string `json:"description,omitempty"` // 自然语言描述
	Personality string `json:"personality,omitempty"` // JSON 自由格式,如 {"traits":["勇敢","冲动"]}
	Abilities   string `json:"abilities,omitempty"`   // JSON 数组,如 ["剑术","隐身"]
}

CreateCharacterInput 是 CreateCharacter 的参数。

type CreateLocationInput

type CreateLocationInput struct {
	Name             string `json:"name"`                         // 地点名称,必填
	LocationType     string `json:"location_type,omitempty"`      // 自由文本类型
	Description      string `json:"description,omitempty"`        // 自然语言描述
	DetailJSON       string `json:"detail_json,omitempty"`        // JSON 自由格式
	ParentLocationID *int64 `json:"parent_location_id,omitempty"` // 父级地点 ID
	Tags             string `json:"tags,omitempty"`               // JSON 数组标签
}

CreateLocationInput 是 CreateLocation 的参数。

type CreateNovelInput

type CreateNovelInput struct {
	Title       string `json:"title"`
	Description string `json:"description,omitempty"`
	Genre       string `json:"genre,omitempty"`
}

CreateNovelInput 是创建小说的入参。

type CreateNovelSettingInput

type CreateNovelSettingInput struct {
	Category string `json:"category"`
	Content  string `json:"content"`
}

CreateNovelSettingInput 是创建设定的入参。 v2 取消 is_global 字段,设定全部归属当前小说。

type CreatePreferenceInput

type CreatePreferenceInput struct {
	IsGlobal bool   `json:"is_global"`
	Category string `json:"category"`
	Content  string `json:"content"`
}

CreatePreferenceInput 是创建偏好的入参。

type CreateReaderPerspectiveInput

type CreateReaderPerspectiveInput struct {
	Type              string `json:"type"`                          // 必填:"known" | "suspense" | "misconception"
	Content           string `json:"content"`                       // 必填
	PlantedChapterID  int64  `json:"planted_chapter_id"`            // 必填
	RelatedTruth      string `json:"related_truth,omitempty"`       // 可选
	RevealedChapterID *int64 `json:"revealed_chapter_id,omitempty"` // 可选,nil=未回收
}

CreateReaderPerspectiveInput 是创建读者认知条目的入参。

type CreateStoryArcInput

type CreateStoryArcInput struct {
	Name        string `json:"name"`                  // 弧线名称,必填
	ArcType     string `json:"arc_type"`              // 弧线类型,必填
	Description string `json:"description,omitempty"` // 弧线整体描述
	Importance  int    `json:"importance,omitempty"`  // 重要度 1-5
}

CreateStoryArcInput 是 CreateStoryArc 的参数。

type CreateStyleSampleInput

type CreateStyleSampleInput struct {
	NovelID  int64    `json:"novel_id"`
	IsGlobal bool     `json:"is_global"`
	Name     string   `json:"name"`
	Content  string   `json:"content"`
	Tags     []string `json:"tags"`
}

CreateStyleSampleInput 是创建风格素材的入参。

type CreateTimelineEntryInput

type CreateTimelineEntryInput struct {
	Category            string `json:"category"`                    // "foreshadowing" | "user_directive",必填
	Title               string `json:"title"`                       // 简短标题,必填
	Content             string `json:"content,omitempty"`           // 详细描述
	DetailJSON          string `json:"detail_json,omitempty"`       // JSON 字符串
	TargetReadingNumber int    `json:"target_reading_number"`       // 预计回收的阅读位置,必填
	Importance          int    `json:"importance,omitempty"`        // 重要度 1-5
	SourceChapterID     *int64 `json:"source_chapter_id,omitempty"` // 在哪章创建
	Source              string `json:"source,omitempty"`            // "ai" | "user"
}

CreateTimelineEntryInput 是 CreateTimelineEntry 的参数。

type DeleteSkillInput

type DeleteSkillInput struct {
	NovelID int64  `json:"novel_id"`
	Name    string `json:"name"`
	Source  string `json:"source"` // "novel" | "user"
}

DeleteSkillInput 是 DeleteSkill 的入参。

type DeleteStyleSampleInput

type DeleteStyleSampleInput struct {
	ID int64 `json:"id"`
}

DeleteStyleSampleInput 是删除风格素材的入参。

type ExtractPatternInput

type ExtractPatternInput = pattern.ExtractPatternInput

type ExtractPatternProgress

type ExtractPatternProgress = pattern.Progress

type ExtractPatternResult

type ExtractPatternResult = pattern.ExtractPatternResult

type ExtractStyleInput

type ExtractStyleInput struct {
	TaskID          string  `json:"task_id"`
	SampleIDs       []int64 `json:"sample_ids"`
	ProviderName    string  `json:"provider_name"`
	ModelID         string  `json:"model_id"`
	ReasoningEffort string  `json:"reasoning_effort"`
}

ExtractStyleInput 是风格提取的入参。

type GetCharacterGroupMembersInput added in v1.6.1

type GetCharacterGroupMembersInput struct {
	ListInput
	GroupID     int64 `json:"group_id"`
	CharacterID int64 `json:"character_id"`
}

type GetCharacterGroupsInput added in v1.6.1

type GetCharacterGroupsInput struct {
	ListInput
}

type GetSessionsInput

type GetSessionsInput struct {
	NovelID int64  `json:"novel_id"`
	Page    int    `json:"page"`
	Size    int    `json:"size"`
	Search  string `json:"search"`
}

GetSessionsInput 是 GetSessions 的入参。

type ImportNovelInput

type ImportNovelInput struct {
	FilePath string `json:"file_path"`
}

ImportNovelInput 是导入小说的入参。

type ImportNovelResult

type ImportNovelResult = imp.ImportResult

ImportNovelResult 是导入小说的返回结果。

type ImportProgress

type ImportProgress struct {
	Stage   string `json:"stage"`
	Message string `json:"message"`
	Current int    `json:"current"`
	Total   int    `json:"total"`
	Percent int    `json:"percent"`
	NovelID int64  `json:"novel_id,omitempty"`
}

ImportProgress 是导入过程的前端进度事件。

type ImportWithLLMInput

type ImportWithLLMInput struct {
	FilePath     string `json:"file_path"`
	ProviderName string `json:"provider_name"`
	ModelID      string `json:"model_id"`
}

ImportWithLLMInput 是 AI 辅助导入小说的入参。

type InstallRemoteSkillInput

type InstallRemoteSkillInput struct {
	Name            string  `json:"name"`
	Target          string  `json:"target"`   // "user" or "novel"
	NovelID         int64   `json:"novel_id"` // target=novel 时必填
	ExpectedContent *string `json:"expected_content"`
}

InstallRemoteSkillInput 是 InstallRemoteSkill 的入参。 Target 取值 "user" 或 "novel";Target=novel 时 NovelID 必填。

type ListInput added in v1.6.1

type ListInput struct {
	NovelID int64 `json:"novel_id"`
	storage.PageParams
	Search string `json:"search"`
}

ListInput 是按小说分页查询的公共入参,排序由各接口在后端指定。

type ListRemoteSkillsInput

type ListRemoteSkillsInput struct {
	Page  int    `json:"page"`
	Size  int    `json:"size"`
	Query string `json:"query"`
}

ListRemoteSkillsInput 是 ListRemoteSkills 的入参。 Page/Size 走 storage.PageParams 归一化(Page<1 → 1,Size 默认 20,上限 100)。 Query 为 name + description 的模糊匹配(大小写不敏感),空串表示不过滤。

type ListSkillsInput

type ListSkillsInput struct {
	NovelID int64 `json:"novel_id"`
}

ListSkillsInput 是 ListSkills 的入参。

type ListSlashCommandsInput

type ListSlashCommandsInput struct {
	NovelID int64 `json:"novel_id"`
}

ListSlashCommandsInput 是 ListSlashCommands 的入参。

type ListStyleSamplesInput

type ListStyleSamplesInput struct {
	NovelID int64  `json:"novel_id"`
	Page    int    `json:"page"`
	Size    int    `json:"size"`
	Search  string `json:"search"`
}

ListStyleSamplesInput 是列出风格素材的入参。

type PlaceChapterInput added in v1.6.0

type PlaceChapterInput = chapter.PlaceInput

PlaceChapterInput 把新章节或已有章节放入目标章节组的指定位置。 SourceChapterID 为空时创建章节,此时 Title 必填;有值时移动已有章节,Title 必须为空。 TargetVolumeID 为空表示未分卷组,BeforeChapterID 为空表示追加到该组末尾。

type PlaceVolumeInput added in v1.6.0

type PlaceVolumeInput = volume.PlaceInput

PlaceVolume 创建或移动卷,并将其置于锚点卷前或小说末尾。

type PreferenceResult

type PreferenceResult struct {
	Global     []preference.PreferenceItem `json:"global"`
	Novel      []preference.PreferenceItem `json:"novel"`
	TokenCount int                         `json:"token_count"` // 全量偏好 token 数(不截断),前端可显示是否超预算
	OverBudget bool                        `json:"over_budget"` // token_count > PreferencesTokenBudget
}

PreferenceResult 是 GetPreferences 的返回结构。

type SaveContentInput

type SaveContentInput struct {
	NovelID         int64   `json:"novel_id"`
	Path            string  `json:"path"`
	Content         string  `json:"content"`
	ExpectedContent *string `json:"expected_content,omitempty"`
}

SaveContentInput 是保存文件内容的入参。

type SaveSettingsInput

type SaveSettingsInput struct {
}

SaveSettingsInput 是保存设置的入参。

type SessionDetail

type SessionDetail struct {
	SessionID       string          `json:"session_id"`
	NovelID         int64           `json:"novel_id"`
	Title           string          `json:"title"`
	Model           string          `json:"model"`
	ReasoningEffort string          `json:"reasoning_effort"`
	ActiveVersion   int             `json:"active_version"`
	LastTurnID      int             `json:"last_turn_id"`
	Usage           json.RawMessage `json:"usage,omitempty"`
	CreatedAt       string          `json:"created_at"`
	UpdatedAt       string          `json:"updated_at"`
}

SessionDetail 是单个会话的完整元数据视图,含用量、推理程度等。

type SessionMeta

type SessionMeta struct {
	SessionID string `json:"session_id"`
	Title     string `json:"title"`
	UpdatedAt string `json:"updated_at"` // ISO 8601
}

SessionMeta 是前端会话列表的轻量视图。

type SetActiveNovelInput

type SetActiveNovelInput struct {
	NovelID int64 `json:"novel_id"`
}

SetActiveNovelInput 是切换当前小说的入参。

type SettingResult

type SettingResult struct {
	Items      []setting.SettingItem `json:"items"`
	TokenCount int                   `json:"token_count"` // 全量设定 token 数(不截断),前端可显示是否超预算
	OverBudget bool                  `json:"over_budget"` // token_count > SettingsTokenBudget
}

SettingResult 是 GetNovelSettings 的返回结构。 v2 取消全局设定概念后,设定全部归属当前小说,不再分 Global/Novel 两组。 保留 Items 字段(取代原 Global/Novel),前端可直接遍历。

type SlashCommand

type SlashCommand struct {
	Name        string `json:"name"`
	Description string `json:"description"`
	Type        string `json:"type"` // "auto" | "manual" | "always"(对应 skill mode)
}

SlashCommand 是斜杠菜单的统一条目,数据源来自 skill store,Type 直接对应 skill mode。

type StartupPhase added in v1.6.0

type StartupPhase string

StartupPhase 描述应用启动阶段,供前端决定渲染哪个界面。

单靠 IsInitialized() 的布尔量无法区分“未配置”与“初始化中 / 初始化失败”: 它返回的是 cfg != nil,而 cfg 只有全部初始化成功才赋值,于是后两种状态都 被折叠成 false,前端只能显示首次初始化界面——既误导用户,又让“开始使用” 按钮有机会触发第二次并发初始化。

const (
	// PhaseUnconfigured 指针文件不存在,等待用户在前端完成首次初始化。
	PhaseUnconfigured StartupPhase = "unconfigured"
	// PhaseInitializing 包括读取启动配置及 initWithConfig 进行中的全部准备工作。
	PhaseInitializing StartupPhase = "initializing"
	// PhaseReady 运行时模块全部就绪,可以进入主界面。
	PhaseReady StartupPhase = "ready"
	// PhaseFailed 初始化失败,Error 带原因;前端应显示错误页而非首次初始化界面。
	PhaseFailed StartupPhase = "failed"
)

type StartupState added in v1.6.0

type StartupState struct {
	Phase   StartupPhase `json:"phase"`
	Error   string       `json:"error,omitempty"`
	Version uint64       `json:"version"`
}

StartupState 是启动状态的快照。Version 在每次转换时递增,前端据此丢弃 乱序到达的旧事件;值语义可安全跨 goroutine 传递。

type TestConnectionInput

type TestConnectionInput struct {
	ProviderName string `json:"provider_name"`
	ChatURL      string `json:"chat_url"`
	APIKey       string `json:"api_key"`
	ModelID      string `json:"model_id"`
}

TestConnectionInput 是连通性测试的入参。

type UpdateArcNodeInput

type UpdateArcNodeInput struct {
	Title               string `json:"title"`
	Description         string `json:"description"`
	TargetReadingNumber int    `json:"target_reading_number"`
	ActualChapterID     *int64 `json:"actual_chapter_id"`
	Status              string `json:"status"` // "pending" | "completed" | "abandoned"
}

UpdateArcNodeInput 采用 PUT 语义:前端全量传,后端全量覆盖。

type UpdateChapterPlanInput

type UpdateChapterPlanInput struct {
	Scope   string `json:"scope"`   // "next" | "near" | "far"
	Content string `json:"content"` // 计划内容
}

UpdateChapterPlanInput 采用 PUT 语义:前端全量传,后端全量替换文件内容。

type UpdateCharacterInput

type UpdateCharacterInput struct {
	Name        string `json:"name"`
	Description string `json:"description"`
	Abilities   string `json:"abilities"`
}

UpdateCharacterInput 采用 PUT 语义:前端全量传,后端全量覆盖。 Personality 是 AI 写入字段,不在 input 里,后端 First 加载原值保留。

type UpdateLocationInput

type UpdateLocationInput struct {
	Name             string `json:"name"`
	LocationType     string `json:"location_type"`
	Description      string `json:"description"`
	ParentLocationID *int64 `json:"parent_location_id"`
	Tags             string `json:"tags"`
}

UpdateLocationInput 采用 PUT 语义:前端全量传,后端全量覆盖。 DetailJSON 是 AI 写入字段,不在 input 里,后端 First 加载原值保留。 ParentLocationID 传 nil 表示根节点(清空父级),传 &id 表示设置父级。

type UpdateNovelInput

type UpdateNovelInput struct {
	Title       string `json:"title"`
	Description string `json:"description"`
	Genre       string `json:"genre"`
}

UpdateNovelInput 采用 PUT 语义:前端全量传,后端全量覆盖。

type UpdateNovelSettingInput

type UpdateNovelSettingInput struct {
	Category string `json:"category"`
	Content  string `json:"content"`
}

UpdateNovelSettingInput 是更新设定的入参。 采用 PUT 语义:前端全量传,后端全量覆盖。 v2 取消 is_global 后不再需要 is_global 切换的 NovelID 联动,可直接用 PatchAndSave, 但为了与 UpdatePreference 风格一致(db.Save 走 GORM 回调),保留手动 First + Save 模式。

type UpdatePreferenceInput

type UpdatePreferenceInput struct {
	Category string `json:"category"`
	Content  string `json:"content"`
	IsGlobal bool   `json:"is_global"`
}

UpdatePreferenceInput 是更新偏好的入参。 采用 PUT 语义:前端全量传,后端全量覆盖。 不走 PatchAndSave(偏好可能全局 NovelID=0 + is_global 切换需特殊处理 NovelID)。

type UpdateReaderPerspectiveInput

type UpdateReaderPerspectiveInput struct {
	Type              string `json:"type"`
	Content           string `json:"content"`
	PlantedChapterID  *int64 `json:"planted_chapter_id"`
	RelatedTruth      string `json:"related_truth"`
	RevealedChapterID *int64 `json:"revealed_chapter_id"`
}

UpdateReaderPerspectiveInput 采用 PUT 语义:前端全量传,后端全量覆盖。

type UpdateStoryArcInput

type UpdateStoryArcInput struct {
	Name        string `json:"name"`
	Description string `json:"description"`
	ArcType     string `json:"arc_type"`
	Importance  int    `json:"importance"`
	Status      string `json:"status"` // "active" | "paused" | "completed" | "abandoned"
}

UpdateStoryArcInput 采用 PUT 语义:前端全量传,后端全量覆盖。 ReactivateAt 是 AI 写入字段,不在 input 里,后端 First 加载原值保留。

type UpdateStyleSampleInput

type UpdateStyleSampleInput struct {
	ID       int64    `json:"id"`
	Name     string   `json:"name"`
	Content  string   `json:"content"`
	Tags     []string `json:"tags"`
	IsGlobal bool     `json:"is_global"`
	NovelID  int64    `json:"novel_id"`
}

UpdateStyleSampleInput 是更新风格素材的入参。

type UpdateTimelineEntryInput

type UpdateTimelineEntryInput struct {
	Title               string `json:"title"`
	Content             string `json:"content"`
	TargetReadingNumber int    `json:"target_reading_number"`
	Importance          int    `json:"importance"`
	Status              string `json:"status"` // "pending" | "resolved" | "abandoned"
	ResolvedChapterID   *int64 `json:"resolved_chapter_id"`
}

UpdateTimelineEntryInput 采用 PUT 语义:前端全量传,后端全量覆盖。 DetailJSON 是 AI 写入字段,不在 input 里,后端 First 加载原值保留。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL