@waterwx/dsh-novel-forge 1.3.0 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["zh","zh","css","css","css","statusBadge","css","css","css","css","css","css","css","css"],"sources":["../src/protocol.ts","../src/client/api.ts","../src/client/locales.ts","../src/client/panel/helpers.ts","../src/client/panel/AssistantTab.tsx","../src/client/panel/AssetsTab.tsx","../src/client/panel/ShelfView.tsx","../src/client/panel/ReaderView.tsx","../src/client/panel/RunPanel.tsx","../node_modules/.pnpm/fflate@0.8.3/node_modules/fflate/esm/browser.js","../src/client/docx.ts","../src/client/panel/CreateBookView.tsx","../src/client/panel/WorldTab.tsx","../src/client/panel/views.tsx","../src/client/panel/NovelPanel.tsx","../src/client/mount.tsx","../src/client/panel/controller.ts","../src/client/sidebar-entry.ts","../src/client/index.ts"],"sourcesContent":["/**\n * dsh-novel-forge — shared protocol between the host half (Node) and the\n * browser half (web GUI). Route paths, request/response shapes, the project\n * state file format, and the NDJSON generation stream frames all live here so\n * both halves spell exactly one vocabulary.\n */\n\n/** The /api/dsh-novel-forge route family (same-origin, loopback-fenced). */\nexport const NOVEL_API = {\n status: '/api/dsh-novel-forge/status',\n loadOutline: '/api/dsh-novel-forge/load-outline',\n saveOutline: '/api/dsh-novel-forge/save-outline',\n plan: '/api/dsh-novel-forge/plan',\n volumes: '/api/dsh-novel-forge/volumes',\n bible: '/api/dsh-novel-forge/bible',\n assets: '/api/dsh-novel-forge/assets',\n styleEngine: '/api/dsh-novel-forge/style-engine',\n generate: '/api/dsh-novel-forge/generate',\n review: '/api/dsh-novel-forge/review',\n rewrite: '/api/dsh-novel-forge/rewrite',\n polish: '/api/dsh-novel-forge/polish',\n /** 采纳待确认草稿(润色/重写产物)覆盖正文文件。 */\n draftApply: '/api/dsh-novel-forge/draft/apply',\n /** 放弃待确认草稿,保留原稿。 */\n draftDiscard: '/api/dsh-novel-forge/draft/discard',\n summary: '/api/dsh-novel-forge/summary',\n foreshadow: '/api/dsh-novel-forge/foreshadow',\n exportBook: '/api/dsh-novel-forge/export',\n chapter: '/api/dsh-novel-forge/chapter',\n /** 审查任意正文文本(作者手动编辑后,不落盘)。 */\n chapterCheck: '/api/dsh-novel-forge/chapter/check',\n /** 保存手动编辑的正文(自动备份 .bak)。 */\n chapterSave: '/api/dsh-novel-forge/chapter/save',\n assistant: '/api/dsh-novel-forge/assistant',\n assistantHistory: '/api/dsh-novel-forge/assistant-history',\n /** 清空助手对话记录。 */\n assistantClear: '/api/dsh-novel-forge/assistant/clear',\n bookshelf: '/api/dsh-novel-forge/bookshelf',\n /** 重置项目(可选携带新大纲):清空设定/卷/章节/伏笔/资产/事实库。 */\n reset: '/api/dsh-novel-forge/reset',\n /** 全书一致性质检:LLM 扫描已生成章节,输出矛盾问题清单。 */\n audit: '/api/dsh-novel-forge/audit',\n /** 角色卡刷新:基于事实库与各章摘要聚合角色当前状态。 */\n charactersRefresh: '/api/dsh-novel-forge/characters/refresh',\n /** 事实库回填:对历史已生成章节批量抽取事实(旧章节无事实记录时用)。 */\n factsBackfill: '/api/dsh-novel-forge/facts/backfill',\n /** 设定圣经局部修补(如世界观规则编辑)。 */\n biblePatch: '/api/dsh-novel-forge/bible/patch',\n /** 小说简介:生成(AI)/补全(AI)/保存。 */\n blurb: '/api/dsh-novel-forge/blurb',\n /** 重命名当前书(同步项目与书架条目)。 */\n rename: '/api/dsh-novel-forge/rename',\n /** 大世界:AI 提炼 / 保存结构化数据(境界/区域/势力)。 */\n world: '/api/dsh-novel-forge/world',\n /** 封面:GET 读取(dataUrl)/ POST 上传或移除。 */\n cover: '/api/dsh-novel-forge/blurb/cover',\n /** 剧情线管理:增删改 + 关联章节。 */\n plotlines: '/api/dsh-novel-forge/plotlines',\n /** 角色库:AI 提炼 / 采纳 / 更新 / 删除。 */\n roles: '/api/dsh-novel-forge/roles',\n scenes: '/api/dsh-novel-forge/scenes',\n visualRules: '/api/dsh-novel-forge/visual-rules',\n /** 作者复盘补跑:对已写章节补齐 authorReview(全书流式 / 单章 JSON)。 */\n reviewBackfill: '/api/dsh-novel-forge/review/backfill',\n /** 章节复位:generating 卡死 → pending(可重新生成)。 */\n chapterReset: '/api/dsh-novel-forge/chapter/reset',\n /** 章节直接通过:作者对 rejected/written 章节行使最终决定权。 */\n chapterApprove: '/api/dsh-novel-forge/chapter/approve',\n /** 敏感词检查:全书已写章节或指定文本。 */\n sensitiveCheck: '/api/dsh-novel-forge/sensitive-check',\n /** 开书想法 → AI 补全大纲:输入一句话想法,生成 2-3 个可选大纲方案。 */\n outlineSuggest: '/api/dsh-novel-forge/outline/suggest',\n /** 拆书分析:对已写章节做结构/人物/文风/卖点四维体检(两阶段:源笔记→分节分析)。 */\n breakdown: '/api/dsh-novel-forge/breakdown',\n /** 漫剧分镜生成:章节 → 角色锚点 + 分镜表(可适配豆包/Seedance/SD)。 */\n /** 漫剧分集计划:读一卷 → 按故事弧线分集(高潮拆集/过渡并章)。 */\n /** 漫画脚本:章节 → 分页分格漫画脚本(含角色视觉锚点)。 */\n /** 生产单:启动批量生产(计划补足 + 逐章生成 + 被拒分级处理)。 */\n runStart: '/api/dsh-novel-forge/run/start',\n /** 生产单控制:pause / resume / stop。 */\n runControl: '/api/dsh-novel-forge/run/control',\n /** 生产单状态(含进度统计与日志)。 */\n runStatus: '/api/dsh-novel-forge/run/status',\n config: '/api/dsh-novel-forge/config',\n openFolder: '/api/dsh-novel-forge/open-folder',\n} as const\n\n/** 书架:一本书的条目。 */\nexport interface BookEntry {\n /** 稳定 id。 */\n id: string\n /** 书名。 */\n bookName: string\n /** 该书输出目录(独立项目目录)。 */\n outputDir: string\n /** 创建时间。 */\n createdAt: string\n /** 最后活动时间。 */\n updatedAt: string\n}\n\n/** 书架快照(含每本书的进度摘要)。 */\nexport interface BookshelfSnapshot {\n books: Array<BookEntry & { done: number; total: number; hasProject: boolean; hasCover: boolean; blurb?: string }>\n /** 当前激活的书 id(无则 null)。 */\n activeBookId: string | null\n}\n\n/** POST /bookshelf 请求:创建新书。 */\nexport interface BookCreateRequest {\n bookName: string\n outputDir?: string\n /** 开书向导:创建时直接导入的大纲文本(提供则立即建立项目)。 */\n outline?: string\n}\n\n/** POST /reset 请求:重置项目(可选更新大纲)。 */\nexport interface ResetRequest {\n /** 新大纲文本;提供则替换 outline,否则保留原大纲。 */\n outline?: string\n}\n\n/** POST /bookshelf/activate 请求:切换当前书。 */\nexport interface BookActivateRequest {\n id: string\n}\n\n/** POST /bookshelf/remove 请求:移除书架条目。 */\nexport interface BookRemoveRequest {\n id: string\n}\n\n/** Chapter lifecycle states (the writing pipeline's state machine). */\nexport type ChapterStatus =\n | 'pending' // planned, not started\n | 'generating' // LLM writing right now\n | 'written' // body on disk, awaiting review\n | 'reviewing' // review in progress\n | 'approved' // passed review (or user-approved)\n | 'rejected' // review found problems\n | 'error' // generation failed\n\n/** One chapter in the plan. */\nexport interface ChapterPlan {\n /** 1-based chapter number (stable identity; files are named from it). */\n no: number\n /** Volume this chapter belongs to (1-based; 0 = unassigned). */\n volume: number\n /** Chapter title, decided by the LLM plan step. */\n title: string\n /** Story beats / plot points for this chapter (model-facing guidance). */\n beats: string\n /** Target character count (defaults to the configured chapter size). */\n targetChars: number\n /** Generation/review state. */\n status: ChapterStatus\n /** 进入 generating 的时间(用于超时自动复位;未在生成时无此字段)。 */\n generatingAt?: string\n /** Actual character count once generated. */\n chars?: number\n /** Failure message when status is 'error'. */\n error?: string\n /** Output file name once generated (relative to the output dir). */\n file?: string\n /** LLM summary of the chapter (narrative memory for later chapters). */\n summary?: string\n /** Latest review report (present once reviewed). */\n review?: ReviewReport\n /** 作者复盘:钩子兑现/结尾钩子/剧情线推进/连续性/节奏趋势(生成后自动)。 */\n authorReview?: AuthorReview\n /**\n * 待确认草稿:润色(去AI味)或整章重写的产物正文。生成时先存这里,\n * 用户看过对比后点「采纳」才覆盖正文文件;点「放弃」则丢弃。刷新页面不丢失。\n */\n pendingDraft?: string\n}\n\n/** 作者复盘:叙事结构层面的逐章检查(钩子/推进/连续性/趋势)。 */\nexport interface AuthorReview {\n /** 上一章结尾钩子是否在本章兑现。 */\n hookHonored: boolean\n /** 钩子兑现说明(未兑现时给出建议)。 */\n hookNote: string\n /** 本章结尾钩子强度 0-10。 */\n endingHook: number\n /** 剧情线推进情况(推进了哪条线/或未推进)。 */\n plotlineProgress: string\n /** 结构化:本章推进的剧情线名称列表(与项目剧情线 name 精确匹配,复盘后自动关联章节)。 */\n advancedLines?: string[]\n /** 连续性检查(人物位置/时间/伤势/资源是否与上章衔接)。 */\n continuity: string\n /** 近期节奏趋势提示(拖沓/爽点密度等)。 */\n trend: string\n /** 复盘时间。 */\n reviewedAt: string\n}\n\n/** One review finding. */\nexport interface ReviewIssue {\n /** Severity: high = must fix, medium = should fix, low = suggestion. */\n severity: 'high' | 'medium' | 'low'\n /** What the problem is. */\n item: string\n /** Concrete suggestion for fixing it. */\n suggestion: string\n}\n\n/** AI review report for one chapter. */\nexport interface ReviewReport {\n /** Overall score 0-100. */\n score: number\n /** Pass threshold (config; 70 default). */\n passed: boolean\n /** One-line verdict. */\n verdict: string\n /** Individual findings. */\n issues: ReviewIssue[]\n /** When the review ran. */\n reviewedAt: string\n}\n\n/** A volume of the book. */\nexport interface Volume {\n /** 1-based volume number. */\n no: number\n /** Volume title. */\n title: string\n /** Volume positioning / summary. */\n summary: string\n /** First chapter number of this volume. */\n chapterStart: number\n /** Last chapter number (inclusive). */\n chapterEnd: number\n}\n\n/** A character card from the story bible. */\nexport interface CharacterCard {\n name: string\n role: 'protagonist' | 'supporting' | 'antagonist' | 'other'\n /** Personality / traits (short lines). */\n traits: string[]\n /** Goals and motivations. */\n goals: string\n /** Key relations to other characters. */\n relations: string\n /** 知情度:该角色已经知道的事实/秘密(未列出的信息该角色不知道)。 */\n knowledge?: string[]\n}\n\n/** The structured story bible (worldbuilding extracted from the outline). */\nexport interface StoryBible {\n /** Genre + tone tags. */\n genre: string\n /** Worldbuilding rules (power system, geography, factions...). */\n worldRules: string[]\n /** Character cards. */\n characters: CharacterCard[]\n /** Writing red lines (forbidden content / must-avoid tropes). */\n redLines: string[]\n /** Style guidance (pacing, pov, tone). */\n style: string[]\n /** When the bible was generated. */\n generatedAt?: string\n}\n\n/** A planted/active/resolved foreshadowing thread. */\nexport interface Foreshadow {\n /** Stable id. */\n id: string\n /** What the foreshadow is. */\n description: string\n /** Chapter where it was planted (undefined = planned). */\n plantedChapter?: number\n /** Chapter where it should be paid off. */\n targetChapter?: number\n /** Lifecycle state. */\n status: 'planned' | 'planted' | 'progressing' | 'resolved' | 'abandoned'\n /** Resolution note when resolved. */\n resolvedNote?: string\n}\n\n/** 一条已确立的叙事事实(事实库/时间线,注入后续章节生成)。 */\nexport interface ChapterFact {\n /** 来源章节号。 */\n chapterNo: number\n /** 事实文本(人物状态/境界资源/关系变化/伏笔落地等)。 */\n text: string\n}\n\n/** 一条全书质检发现的问题(一致性矛盾,定位到章)。 */\nexport interface AuditIssue {\n /** 问题所在章节号(无法定位时 0)。 */\n chapterNo: number\n severity: 'high' | 'medium' | 'low'\n /** 矛盾描述。 */\n item: string\n /** 修改建议。 */\n suggestion: string\n}\n\n/** POST /audit 响应。 */\nexport interface AuditResponse {\n issues: AuditIssue[]\n /** 参与质检的章节数。 */\n auditedChapters: number\n /** 质检时间。 */\n auditedAt: string\n}\n\n/** 全书质检的实时状态(通过 /status 暴露给面板/外部读取)。 */\nexport interface AuditStatus {\n status: 'idle' | 'running' | 'done' | 'error'\n /** 开始时间(ISO)。 */\n startedAt?: string\n /** 结束时间(ISO)。 */\n finishedAt?: string\n /** 总批次数(0 = 尚未开始/无章节)。 */\n totalBatches: number\n /** 已完成批次数。 */\n completedBatches: number\n /** 参与质检的章节数。 */\n auditedChapters?: number\n /** 发现的问题数(done 后有效)。 */\n issuesCount?: number\n /** 最近一次质检的问题清单(done 后有效;error 时为空)。 */\n issues?: AuditIssue[]\n /** 失败信息(error 时有效)。 */\n error?: string\n}\n\n/** 一条剧情线(主线/支线/人物线/悬念线)。 */\nexport interface Plotline {\n /** 稳定 id。 */\n id: string\n /** 线名。 */\n name: string\n /** 类型:主线 / 支线 / 人物线 / 悬念线。 */\n kind: 'main' | 'branch' | 'character' | 'mystery'\n /** 目标/终点(这条线最终要完成什么)。 */\n goal: string\n /** 当前进度说明(最近推进到哪)。 */\n progress: string\n /** 生命周期状态。 */\n status: 'active' | 'paused' | 'resolved' | 'abandoned'\n /** 关联章节号(推进/落地的章节)。 */\n chapters: number[]\n /** 创建时间。 */\n createdAt: string\n}\n\n/** POST /plotlines 请求:剧情线增删改 + 关联章节 + AI 辅助。 */\nexport interface PlotlinesRequest {\n op: 'add' | 'update' | 'remove' | 'link' | 'suggest' | 'refresh' | 'health' | 'plan'\n /** add / update 时传入的完整剧情线。 */\n line?: Plotline\n /** remove / link / refresh 时的目标线 id。 */\n id?: string\n /** link 时关联的章节号。 */\n chapterNo?: number\n}\n\n/** 剧情线健康检查报告。 */\nexport interface PlotlineHealthReport {\n /** 是否需要新线(需要 / 暂不需要 / 再写 X 章后需要)。 */\n verdict: string\n /** 建议添加新线的时机说明。 */\n timing: string\n /** 依据(基于数据的理由,每条一句)。 */\n reasons: string[]\n /** 各线健康度。 */\n lines: Array<{\n name: string\n /** ok=健康 / warning=预警 / stale=搁置过久。 */\n health: 'ok' | 'warning' | 'stale'\n note: string\n }>\n}\n\n/** AI 剧情方案:下一阶段目标 + 建议新线。 */\nexport interface PlotlinePlan {\n /** 下一阶段(未来 5-10 章)剧情方向。 */\n direction: string\n /** 建议的新线(可逐条采纳)。 */\n suggestions: Plotline[]\n}\n\n/** POST /plotlines 响应。 */\nexport interface PlotlinesResponse {\n plotlines: Plotline[]\n /** op=suggest 时的 AI 建议候选线。 */\n suggestions?: Plotline[]\n /** op=health 时的健康检查报告。 */\n health?: PlotlineHealthReport\n /** op=plan 时的剧情方案。 */\n plan?: PlotlinePlan\n}\n\n/** 一条敏感词命中。 */\nexport interface SensitiveHit {\n /** 命中章节号(文本检测时为 0)。 */\n chapterNo: number\n /** 命中的违禁词。 */\n word: string\n /** 类别:政治 / 擦边 / 暴力 / 辱骂 / 广告 / 其他。 */\n category: string\n /** 出现次数。 */\n count: number\n}\n\n/** POST /sensitive-check 请求:检测指定章节/任意文本/全书。 */\nexport interface SensitiveCheckRequest {\n /** 检测该章正文。 */\n chapterNo?: number\n /** 检测任意文本(优先于 chapterNo)。 */\n text?: string\n /** 扫描全部已写章节。 */\n all?: boolean\n}\n\n/** POST /sensitive-check 响应。 */\nexport interface SensitiveCheckResponse {\n hits: SensitiveHit[]\n /** 参与扫描的章节数。 */\n scannedChapters: number\n}\n\n/** 开书想法 → AI 大纲方案(一个候选)。 */\nexport interface OutlineCandidate {\n /** 唯一 id(前端暂留/换批用)。 */\n id: string\n /** 推荐书名。 */\n bookName: string\n /** 题材(如 仙侠修真 / 都市)。 */\n genre: string\n /** 核心卖点一句话。 */\n sellingPoint: string\n /** 完整大纲文本(可直接用作项目大纲,≥800 字)。 */\n outline: string\n}\n\n/** POST /outline/suggest 请求:想法 → 2-3 个可选大纲。 */\nexport interface OutlineSuggestRequest {\n /** 作者想法(一两句话,≥50 字)。 */\n idea: string\n /** 本次要生成的候选数(默认 3,最多 3)。 */\n count?: number\n /** 已暂留方案的剧情方向摘要(换批时让 LLM 避开,防止与已留方案重复)。 */\n exclude?: string[]\n}\n\n/** POST /outline/suggest 响应。 */\nexport interface OutlineSuggestResponse {\n candidates: OutlineCandidate[]\n}\n\n/** 拆书分析:一个分析小节。 */\nexport interface BreakdownSection {\n /** 小节键:overview / plot / character / style / market。 */\n key: string\n /** 小节标题(如「拆书总览」)。 */\n title: string\n /** 可读分析稿(markdown)。 */\n markdown: string\n /** 结构化数据(程序可消费)。 */\n structured: Record<string, unknown>\n}\n\n/** 拆书分析:一条证据(结论→原文回溯)。 */\nexport interface BreakdownEvidence {\n label: string\n excerpt: string\n /** 来源章节号(0 = 未定位)。 */\n chapterNo: number\n /** 指向的结构化字段。 */\n fieldKey?: string\n}\n\n/** POST /breakdown 请求:对已写章节做拆书分析。 */\nexport interface BreakdownRequest {\n /** 分析范围:'recent'=最近 20 章 / 'volume:N'=第 N 卷 / 'all'=全书(默认 recent)。 */\n scope?: string\n /** 分析档位:'quick'=4 维(总览/剧情/人物/文风)/ 'standard'=5 维(+卖点)。 */\n preset?: 'quick' | 'standard'\n /** token 预算上限(默认 50000)。 */\n budgetTokens?: number\n}\n\n/** POST /breakdown 响应。 */\nexport interface BreakdownResponse {\n sections: BreakdownSection[]\n evidence: BreakdownEvidence[]\n /** 参与分析的章节数。 */\n chaptersScanned: number\n /** 估算消耗 token。 */\n usedTokens: number\n}\n\n/** 角色卡:角色当前状态(从事实库聚合)。 */\nexport interface RoleStatusCard {\n name: string\n /** protagonist / supporting / antagonist / other。 */\n role: string\n /** 当前状态一句话(境界/资源/伤势/心境)。 */\n status: string\n /** 最近出场章节。 */\n lastChapter: number\n /** 出场次数。 */\n appearances: number\n}\n\n/** 角色库条目(主表:作者维护 + AI 提炼 + 编年录自动聚合)。 */\nexport interface RoleRecord {\n /** 角色名(唯一键)。 */\n name: string\n /** 定位:主角 / 女主 / 女配 / 配角 / 反派 / 路人。 */\n roleLabel: 'protagonist' | 'female_lead' | 'female_support' | 'support' | 'antagonist' | 'extra'\n /** 身份一句话(如:祭族后裔、青云宗杂役)。 */\n identity: string\n /** 性格标签。 */\n traits: string[]\n /** 目标与动机。 */\n goals: string\n /** 关系网:[角色名](关系)。 */\n relations: string[]\n /** 成长线:阶段 → 说明(可含章节)。 */\n arc: string[]\n /** 知情度:该角色已经知道的信息。 */\n knowledge: string[]\n /** 首次出场章节(编年录聚合,可手动修正)。 */\n firstChapter?: number\n /** 动漫形象描述词(AI 绘图用:中文描述 + 英文标签 + 关键外貌标签)。 */\n imagePrompt?: {\n /** 中文外貌描述:连贯一段(发色/瞳色/服装/气质/标志物)。 */\n zh: string\n /** 英文绘图标签:booru 风格逗号分隔。 */\n en: string\n /** 中文关键标签(发色/瞳色/服装/气质/标志物)。 */\n tags: string[]\n /** 依据来源说明(哪几章哪些描写)。 */\n source?: string\n }\n /** 角色参考图(dataURL 或 URL)。用于漫画/漫剧出图时锁定角色一致性。 */\n imageUrl?: string\n /** 角色图集(图像锚点):立绘/四视图/表情/场景/细节等,label 标注用途。 */\n gallery?: RoleImage[]\n /** 该角色所需的情绪表情清单(提炼时 LLM 补全 6-12 个,如\"疲惫/麻木/压抑悲伤\")。 */\n expressions?: string[]\n /** LLM 精修的四类生图提示词包(前端拼装版之外的高质量版,promptKit 接口生成)。 */\n promptKit?: {\n /** 立绘:全身/半身正视图。 */\n portrait: { zh: string; en: string }\n /** 四视图:正面/侧面/背面设定表。 */\n sheet: { zh: string; en: string }\n /** 表情:同一脸部锚换情绪,每表情一段。 */\n expressions: { name: string; zh: string; en: string }[]\n /** 细节:标志物局部特写。 */\n details: { zh: string; en: string }\n }\n /** 漫画/漫剧重要性:main=必须建卡保证一致;support=有锚点即可;extra=路人随机生成不约束。 */\n importance?: 'main' | 'support' | 'extra'\n}\n\n/** 角色图集条目:一张已定型的角色图(图像锚点)。 */\nexport interface RoleImage {\n /** 用途标签:立绘 / 四视图 / 表情-疲惫 / 场景 / 细节 等。 */\n label: string\n /** dataURL 或 URL。 */\n dataUrl: string\n}\n\n/** 场景库条目:从正文提炼的「镜头场景」视觉锚点(漫剧分镜/生图用)。 */\nexport interface SceneCard {\n /** 场景名(唯一键),如「旧茶渡·地下石殿」。 */\n name: string\n /** 一句话定位:空间/氛围/功能。 */\n summary: string\n /** 幕归属:第一幕·后场 / 第二幕·卖场 / …(便于按剧情段落组织)。 */\n act?: string\n /** 时间光态:夜间闭店后 / 雨夜 / 凌晨 / 频闪灯… */\n moment?: string\n /** 关键情节镜头 1-3 条:该场景拍什么(人物动作+情绪+镜头推进)。 */\n beats?: string[]\n /** 人物在场状态:主角/关键角色在该场景的状态一句话。 */\n characterState?: string\n /** 环境构成:空间结构/陈设/标志物。 */\n elements: string[]\n /** 色调与光影(含 HEX 色板,可空)。 */\n palette: string[]\n /** 氛围关键词:压抑/神秘/空旷… */\n moods: string[]\n /** 中文生图提示词(连贯一段,写实电影感)。 */\n zh: string\n /** 英文生图提示词(逗号分隔标签)。 */\n en: string\n /** 关键标签。 */\n tags: string[]\n /** 依据来源(哪几章哪些描写)。 */\n source?: string\n /** 场景图集(图像锚点):全景/局部/氛围 等。 */\n gallery?: RoleImage[]\n}\n\n/** POST /scenes 请求:场景库提炼 / 采纳 / 更新 / 删除 / 图集。 */\nexport interface ScenesRequest {\n op: 'extract' | 'adopt' | 'update' | 'remove' | 'image' | 'removeImage'\n /** adopt / update 时传入的场景卡(adopt 可修改后采纳)。 */\n scene?: SceneCard\n /** remove / image 时的场景名。 */\n name?: string\n /** op='image' 时的图片 dataURL 与用途标签(全景/局部/氛围)。 */\n dataUrl?: string\n label?: string\n}\n\n/** POST /visual-rules 请求:视觉世界观规则提炼 / 保存。 */\nexport interface VisualRulesRequest {\n op: 'extract' | 'save'\n /** op=save 时的规则数组。 */\n rules?: string[]\n}\n\n/** POST /visual-rules 响应。 */\nexport interface VisualRulesResponse {\n rules: string[]\n}\n\n/** POST /scenes 响应。 */\nexport interface ScenesResponse {\n scenes: SceneCard[]\n /** op=extract 时的 AI 候选场景。 */\n candidates?: SceneCard[]\n}\n\n/** POST /roles 请求:角色库增删改 + AI 提炼 + 参考图上传。 */\nexport interface RolesRequest {\n op: 'extract' | 'adopt' | 'update' | 'remove' | 'visual' | 'image' | 'removeImage' | 'imageGenerate' | 'promptKit'\n /** adopt / update 时传入的角色(adopt 可修改后采纳)。 */\n role?: RoleRecord\n /** remove 时的角色名。 */\n name?: string\n /** op='image' 时的参考图 dataURL。 */\n dataUrl?: string\n /** op='image' 时的图集用途标签(立绘/四视图/表情-x/场景/细节);缺省视为角色参考图(imageUrl)。 */\n label?: string\n /** op='imageGenerate' 时的漫画风格预设 id(用于统一角色图与漫画页风格)。 */\n style?: string\n}\n\n/** POST /roles 响应。 */\nexport interface RolesResponse {\n roles: RoleRecord[]\n /** op=extract 时的 AI 候选角色。 */\n candidates?: RoleRecord[]\n /** op=visual 时的动漫形象描述词(已写入角色卡)。 */\n visual?: RoleRecord['imagePrompt']\n /** op=promptKit 时的四类提示词精修包(已写入角色卡)。 */\n promptKit?: RoleRecord['promptKit']\n /** op=image 时的角色参考图 dataURL。 */\n imageUrl?: string\n}\n\n/** POST /bible/patch 请求:局部修补设定圣经。 */\nexport interface BiblePatchRequest {\n worldRules?: string[]\n redLines?: string[]\n style?: string[]\n /** 角色卡整体替换(人物志编辑知情度等)。 */\n characters?: CharacterCard[]\n}\n\n/** POST /blurb 请求:AI 生成/补全或手动保存小说简介。 */\nexport interface BlurbRequest {\n action: 'generate' | 'save'\n /** 已写好的开头(AI 补全时使用;留空 = 全量生成)。 */\n partial?: string\n /** 手动保存的完整简介(action=save 时)。 */\n text?: string\n}\n\n/** POST /chapter/check|save 请求:审查/保存手动编辑的正文。 */\nexport interface ChapterTextRequest {\n chapterNo: number\n /** 当前编辑中的正文全文。 */\n text: string\n /** 保存时携带:已在工作区审查过的报告(沿用落盘,不重复审);缺省则保存后自动正式审稿一次。 */\n report?: ReviewReport\n /** 审查/验证时携带:上一轮审稿报告。传入后进入「验证模式」——逐条核对原意见是否解决、\n * 只挑新增 high,不再全新找茬(防止\"越修 high 越多\")。 */\n previousReport?: ReviewReport\n}\n\n/** POST /chapter/save 响应。 */\nexport interface ChapterSaveResponse {\n ok: boolean\n chars: number\n file: string\n /** 落盘的审稿报告(沿用工作区报告或保存后自动审稿)。 */\n report?: ReviewReport\n}\n\n/** POST /cover 请求:上传或移除封面。 */\nexport interface CoverRequest {\n action: 'upload' | 'remove'\n /** 上传时:data:image/...;base64,... 格式的图片数据。 */\n dataUrl?: string\n}\n\n/** POST /rename 请求:重命名当前书。 */\nexport interface RenameRequest {\n bookName: string\n}\n\n/** 大世界:一个境界等级。 */\nexport interface WorldRealm {\n /** 境界名(练气/筑基/金丹…)。 */\n name: string\n /** 描述:突破条件/寿命/标志等。 */\n description: string\n}\n\n/** 大世界:一个地理区域。 */\nexport interface WorldRegion {\n name: string\n description: string\n /** 关联势力名(可空)。 */\n faction?: string\n}\n\n/** 大世界:一方势力。 */\nexport interface WorldFaction {\n name: string\n /** 类型:宗门/家族/王朝/组织… */\n kind: string\n description: string\n /** 驻地区域(可空)。 */\n region?: string\n}\n\n/** 大世界结构化数据。 */\nexport interface WorldState {\n realms: WorldRealm[]\n regions: WorldRegion[]\n factions: WorldFaction[]\n}\n\n/** POST /world 请求:AI 提炼或手动保存。 */\nexport interface WorldRequest {\n action: 'generate' | 'save'\n /** action=save 时的完整世界数据。 */\n world?: WorldState\n}\n\n/** GET /cover 响应:封面的 dataUrl(无封面为 null)。 */\nexport interface CoverResponse {\n dataUrl: string | null\n}\n\n/** The persisted project: outline + bible + plan + progress. */\nexport interface ProjectState {\n /** Book title (first non-empty line of the outline, usually). */\n bookName: string\n /** Full outline text (docx-extracted or pasted). */\n outline: string\n /** Source outline path when loaded from a docx. */\n outlinePath?: string\n /** Structured story bible (worldbuilding), if generated. */\n bible?: StoryBible\n /** Volumes, if planned. */\n volumes?: Volume[]\n /** Chapter plan. */\n chapters: ChapterPlan[]\n /** Foreshadowing threads. */\n foreshadows: Foreshadow[]\n /** 写作资产(题材基底/推进模式/反AI规则/写法资产)。 */\n assets?: ProjectAssets\n /** 事实库/时间线:每章生成后抽取,注入后续章节保持一致性。 */\n facts?: ChapterFact[]\n /** 小说简介(面向读者的作品门面,AI 生成或手动保存)。 */\n blurb?: string\n /** 封面文件名(相对输出目录,如 cover.png)。 */\n coverPath?: string\n /** 大世界结构化数据(境界体系/区域/势力)。 */\n world?: WorldState\n /** 剧情线(主线/支线/人物线/悬念线)。 */\n plotlines?: Plotline[]\n /** 角色库(作者维护 + AI 提炼的主表)。 */\n roles?: RoleRecord[]\n /** 场景库(作者维护 + AI 提炼的主表)。 */\n scenes?: SceneCard[]\n /** 视觉世界观规则(生图/生视频必须遵守,从道藏提炼,注入所有提示词)。 */\n visualRules?: string[]\n /** 人物志:角色当前状态聚合结果(从编年录刷新后存档,打开页面直接显示)。 */\n roleStatus?: RoleStatusCard[]\n /** 漫剧分镜结果缓存:章号 → 分镜(持久化,刷新不丢)。 */\n /** 漫剧分集计划缓存:卷号/0=全书 → 分集计划(持久化,刷新不丢)。 */\n /** 漫画脚本缓存:章号 → 漫画脚本(持久化,刷新不丢)。 */\n /** ISO timestamps. */\n createdAt: string\n updatedAt: string\n}\n\n/** Runtime config surface exposed to the panel (subset of plugin Config). */\nexport interface NovelConfig {\n /** Absolute path of the default docx outline to load. */\n outlinePath: string\n /** Absolute output directory for chapters + project state. */\n outputDir: string\n /** LLM provider route (e.g. deepseek-official). */\n provider: string\n /** LLM model id (e.g. deepseek-v4-flash). */\n model: string\n /** LLM reasoning effort: off = no thinking; low/high/max = thinking intensity. */\n reasoningEffort: 'off' | 'low' | 'high' | 'max'\n /** Target characters per chapter. */\n chapterChars: number\n /** Max output tokens per chapter call. */\n maxTokens: number\n /** Review pass threshold (0-100). */\n reviewPassScore: number\n /** Whether generation auto-runs review after writing. */\n autoReview: boolean\n /** Whether generation auto-runs the author review (hook/continuity/trend) after writing. */\n autoAuthorReview: boolean\n /** 修订/润色产出草稿后是否自动附带一次 AI 审查(工作区显示新稿评分与剩余问题)。 */\n autoReviewAfterRevise: boolean\n /** 豆包/Seedream 生图 API Key(保存在服务端配置,不暴露给前端明文回显)。 */\n imageApiKey?: string\n /** 豆包/Seedream 生图模型 ID(如 doubao-seedream-5-0-pro-260628)。 */\n imageApiModel?: string\n /** 是否启用豆包生图(默认关,避免误调用付费 API)。 */\n imageApiEnabled?: boolean\n}\n\n/** GET /status response. */\nexport interface StatusResponse {\n config: NovelConfig\n /** The persisted project, when one exists in the output dir. */\n project?: ProjectState\n /** Chapter files already on disk (basenames, sorted). */\n generatedFiles: string[]\n /** 全书质检实时状态(用于面板/外部读取进度)。 */\n audit?: AuditStatus\n}\n\n/** 生产单状态(生产单 = 区间批量生产执行器:计划补足 + 逐章生成 + 被拒分级处理)。 */\nexport interface RunState {\n runId: string\n /** 区间起点(含)。 */\n startNo: number\n /** 区间终点(含)。 */\n endNo: number\n status: 'running' | 'paused' | 'done' | 'stopped' | 'error'\n /** 当前处理到的章号(已 approved 的章会快进)。 */\n currentNo: number\n stats: {\n /** 新生成(含审稿)的章数。 */\n generated: number\n /** 被拒后按意见修订并通过的章数。 */\n revised: number\n /** 被拒后豁免通过(无 high)的章数。 */\n exempted: number\n /** error 后重新生成的章数。 */\n regenerated: number\n /** 生成失败的章数。 */\n error: number\n }\n /** 两轮修订仍不过、保留草稿待人工的章号。 */\n pendingManual: number[]\n /** 运行日志(保留最近 300 条)。 */\n log: Array<{ at: string; text: string }>\n startedAt: string\n updatedAt: string\n error?: string\n}\n\n/** POST /run/start request. */\nexport interface RunStartRequest {\n /** 起始章号(默认 1)。 */\n startNo?: number\n /** 结束章号(含;超出计划时自动补计划)。 */\n endNo?: number\n /** 或指定新增章数(从当前最后一章 +1 起)。 */\n count?: number\n}\n\n/** POST /run/control request. */\nexport interface RunControlRequest {\n action: 'pause' | 'resume' | 'stop'\n}\n\n/** POST /load-outline request: either a docx path or raw text. */\nexport interface LoadOutlineRequest {\n /** Absolute docx path; defaults to the configured outline path. */\n path?: string\n /** Raw outline text (takes precedence over path when present). */\n text?: string\n}\n\n/** POST /load-outline response. */\nexport interface LoadOutlineResponse {\n outline: string\n bookName: string\n chars: number\n path?: string\n}\n\n/** POST /plan request. */\nexport interface PlanRequest {\n /** Outline to plan from; defaults to the persisted project's outline. */\n outline?: string\n /** Number of chapters to plan (default: 30). */\n chapterCount?: number\n /** Volume to plan (1-based); when given, plans only that volume's chapters. */\n volume?: number\n}\n\n/** POST /plan response. */\nexport interface PlanResponse {\n chapters: ChapterPlan[]\n volumes?: Volume[]\n}\n\n/** POST /volumes request/response. */\nexport interface VolumesRequest {\n /** Outline to split into volumes; defaults to the project outline. */\n outline?: string\n}\nexport interface VolumesResponse {\n volumes: Volume[]\n}\n\n/** POST /bible request/response. */\nexport interface BibleRequest {\n /** Outline to extract from; defaults to the project outline. */\n outline?: string\n}\nexport interface BibleResponse {\n bible: StoryBible\n}\n\n/** POST /generate request: one chapter of the current project. */\nexport interface GenerateRequest {\n chapterNo: number\n /** When true, skips the auto-review step. */\n skipReview?: boolean\n}\n\n/** One NDJSON frame of a generation/review/rewrite stream. */\nexport type JobFrame =\n | { type: 'start'; no: number; title: string }\n | { type: 'delta'; text: string }\n | { type: 'progress'; chars: number }\n | { type: 'done'; no: number; file: string; chars: number; title: string }\n | { type: 'review'; no: number; report: ReviewReport }\n | { type: 'author-review'; no: number; review: AuthorReview }\n | { type: 'author-backfill-done'; count: number }\n | { type: 'rewritten'; no: number; file: string; chars: number }\n /** 润色/重写完成,产物作为待确认草稿(尚未覆盖正文)。 */\n | { type: 'drafted'; no: number; chars: number; draft: string }\n | { type: 'error'; no: number; message: string }\n\n/** POST /review request: review one written chapter. */\nexport interface ReviewRequest {\n chapterNo: number\n}\n\n/** POST /rewrite request: rewrite one chapter (optionally per review issues). */\nexport interface RewriteRequest {\n chapterNo: number\n /** Free-form instructions; defaults to fixing the review's high issues. */\n instructions?: string\n /**\n * 局部修订:正文中的一段原文(无需完全精确,取一个自然段内的片段即可)。\n * 提供时只重写该段,其余正文保持不变;不提供时整章重写。\n */\n target?: string\n}\n\n/** POST /polish request: de-AI-ify one chapter. */\nexport interface PolishRequest {\n chapterNo: number\n}\n\n/** POST /draft/apply | /draft/discard request: 采纳或放弃待确认草稿。 */\nexport interface DraftDecisionRequest {\n chapterNo: number\n /** apply 时可携带审查报告(沿用结论定状态;不携带则置 written)。 */\n report?: ReviewReport\n}\n\n/** POST /summary request: (re)generate a chapter summary. */\nexport interface SummaryRequest {\n chapterNo: number\n}\n\n/** POST /foreshadow request: create, update, or AI-suggest foreshadows. */\nexport interface ForeshadowRequest {\n /** When true, runs the LLM suggestion pass (ignores other fields). */\n suggest?: boolean\n /** When given, updates that foreshadow instead of creating one. */\n id?: string\n description?: string\n plantedChapter?: number\n targetChapter?: number\n status?: Foreshadow['status']\n resolvedNote?: string\n}\nexport interface ForeshadowResponse {\n foreshadows: Foreshadow[]\n}\n\n/** GET /chapter response. */\nexport interface ChapterResponse {\n no: number\n title: string\n markdown: string\n}\n\n/** POST /export request/response. */\nexport interface ExportRequest {\n format: 'txt' | 'md'\n}\nexport interface ExportResponse {\n file: string\n chars: number\n chapters: number\n}\n\n/** POST /config request: patch any subset of the runtime config. */\nexport interface ConfigPatch {\n outlinePath?: string\n outputDir?: string\n provider?: string\n model?: string\n reasoningEffort?: 'off' | 'low' | 'high' | 'max'\n chapterChars?: number\n maxTokens?: number\n reviewPassScore?: number\n autoReview?: boolean\n autoAuthorReview?: boolean\n autoReviewAfterRevise?: boolean\n imageApiKey?: string\n imageApiModel?: string\n imageApiEnabled?: boolean\n}\n\n// ------------------------------------------------------------ assistant\n\n/** One assistant conversation message (persisted per project). */\nexport interface AssistantMessage {\n role: 'user' | 'assistant' | 'tool'\n /** Message text (tool messages carry the tool result). */\n content: string\n /** ISO timestamp. */\n ts: string\n /** For tool messages: which tool ran. */\n tool?: string\n}\n\n/** POST /assistant request: one user turn. */\nexport interface AssistantRequest {\n message: string\n}\n\n/** One NDJSON frame of the assistant stream. */\nexport type AssistantFrame =\n | { type: 'delta'; text: string }\n | { type: 'tool'; name: string; status: 'start' | 'done' | 'error'; detail?: string }\n /** Live output while a tool runs (e.g. chapter text being generated). */\n | { type: 'toolDelta'; name: string; text: string }\n | { type: 'done' }\n | { type: 'error'; message: string }\n\n/** GET /assistant-history response. */\nexport interface AssistantHistoryResponse {\n messages: AssistantMessage[]\n}\n\n// ---------------------------------------------------------- writing assets\n\n/** 题材基底库:一本书属于哪个阅读市场。树形(题材→子题材→下级)。 */\nexport interface GenreNode {\n /** 题材名称(标签,如「仙侠修真」「都市异能」)。 */\n name: string\n /** 题材特征、常见爽点、叙事重心或读者期待。 */\n description: string\n /** 子题材。 */\n children: GenreNode[]\n}\n\n/** 推进模式库:读者为什么继续看下一章。 */\nexport interface ProgressionMode {\n /** 模式名称(如「升级变强」「经营扩张」「解谜揭露」)。 */\n name: string\n /** 核心驱动力:靠什么制造追读动力。 */\n driver: string\n /** 读者期待:每隔几章获得什么变化或回报。 */\n readerExpectation: string\n /** 常见兑现方式(爽点如何落地)。 */\n payoffs: string[]\n /** 节奏风险:最怕什么(重复升级、冲突变弱、谜题拖太久…)。 */\n risks: string[]\n /** 主模式或辅助模式。 */\n primary: boolean\n}\n\n/** 反 AI 规则:一条「要避免的问题 + 修正方向」。 */\nexport interface AntiAiRule {\n /** 规则名(如「禁止解释型心理描写」「AI 高频套话」)。 */\n name: string\n /** 要避免的表达问题,具体可检查。 */\n avoid: string\n /** 推荐修正方向。 */\n fix: string\n /** 命中即告警的具体表达模式(用于审稿逐条核对与去 AI 味检测)。 */\n detectPatterns?: string[]\n /** 是否内置全局规则(内置规则随插件发布,项目规则为用户自定义)。 */\n builtin?: boolean\n}\n\n/** 预置写法模板(来自 AI-Novel-Writing-Assistant 内置数据,一键绑定无需样本文本)。 */\nexport interface StyleTemplate {\n /** 模板 key(如 power-up-escalation)。 */\n key: string\n /** 模板名(如「爽文递进推进流」)。 */\n name: string\n /** 模板说明。 */\n description: string\n /** 分类(如「爽文流」「悬疑流」)。 */\n category: string\n /** 适用题材。 */\n applicableGenres: string[]\n /** 叙述规则。 */\n proseRules: string[]\n /** 角色/台词规则。 */\n dialogueRules: string[]\n /** 语言规则。 */\n languageRules: string[]\n /** 节奏规则。 */\n rhythmRules: string[]\n /** 该模板默认绑定的反 AI 规则 key(内置规则名)。 */\n defaultAntiAiRuleKeys: string[]\n}\n\n/** 写法引擎:从样本文本提取的叙事风格资产。 */\nexport interface StyleAsset {\n /** 资产名(如「林越式痞坏」「冷峻猎手风」)。 */\n name: string\n /** 叙述视角与句式节奏。 */\n proseRules: string[]\n /** 角色台词风格。 */\n dialogueRules: string[]\n /** 描写密度与情绪表达。 */\n descriptionRules: string[]\n /** 表达边界(不要做什么)。 */\n boundaries: string[]\n /** 来源样本文本(可空)。 */\n sourceText?: string\n /** 创建时间。 */\n createdAt: string\n}\n\n/** 项目写作资产(题材基底 + 推进模式 + 反 AI 规则 + 写法资产)。 */\nexport interface ProjectAssets {\n /** 本书选用的题材(可以是题材基底库中某节点名)。 */\n genre?: GenreNode\n /** 主推进模式。 */\n primaryProgression?: ProgressionMode\n /** 辅助推进模式。 */\n auxiliaryProgressions: ProgressionMode[]\n /** 生效的反 AI 规则(内置 + 自定义)。 */\n antiAiRules: AntiAiRule[]\n /** 绑定的写法资产。 */\n styleAssets: StyleAsset[]\n /** 资产更新时间。 */\n updatedAt?: string\n}\n\n/** GET /assets response(含全局题材库与反 AI 规则库)。 */\nexport interface AssetsResponse {\n projectAssets: ProjectAssets\n /** 全局题材基底库(可复用资产,跨书)。 */\n genreLibrary: GenreNode[]\n /** 全局反 AI 规则库(内置默认规则)。 */\n antiAiLibrary: AntiAiRule[]\n /** 预置写法模板(一键绑定,无需样本文本)。 */\n styleTemplates: StyleTemplate[]\n /** 内置推进模式候选。 */\n progressionLibrary: ProgressionMode[]\n}\n\n/** POST /assets request:更新项目写作资产(部分字段可选)。 */\nexport interface AssetsPatch {\n genre?: GenreNode\n primaryProgression?: ProgressionMode\n auxiliaryProgressions?: ProgressionMode[]\n antiAiRules?: AntiAiRule[]\n styleAssets?: StyleAsset[]\n}\n\n/** POST /style-engine request:从样本文本提取写法资产。 */\nexport interface StyleEngineRequest {\n /** 样本文本(风格来源)。 */\n sampleText: string\n /** 资产名(可选,默认「风格资产 N」)。 */\n name?: string\n}\n","/**\n * Browser-side API client for the /api/dsh-novel-forge route family. Plain\n * fetch, same origin; generation/rewrite/polish ride NDJSON streams read\n * incrementally.\n */\n\nimport {\n NOVEL_API,\n type AssetsPatch,\n type AssetsResponse,\n type BibleResponse,\n type ChapterResponse,\n type ConfigPatch,\n type ExportResponse,\n type ForeshadowRequest,\n type ForeshadowResponse,\n type JobFrame,\n type LoadOutlineResponse,\n type NovelConfig,\n type PlanResponse,\n type ReviewReport,\n type StatusResponse,\n type StyleEngineRequest,\n type StyleAsset,\n type VolumesResponse,\n} from '../protocol.ts'\n\n/** Error carrying the route's JSON error message. */\nexport class NovelApiError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'NovelApiError'\n }\n}\n\n/** Parse a JSON response or throw a NovelApiError. */\nasync function readJson<T>(response: Response): Promise<T> {\n let body: unknown\n try {\n body = await response.json()\n } catch {\n throw new NovelApiError(`HTTP ${response.status}: invalid JSON response`)\n }\n if (!response.ok) {\n const message = typeof body === 'object' && body !== null && typeof (body as { error?: unknown }).error === 'string'\n ? (body as { error: string }).error\n : `HTTP ${response.status}`\n throw new NovelApiError(message)\n }\n return body as T\n}\n\n/** POST JSON, return parsed JSON. */\nasync function postJson<T>(path: string, payload: unknown): Promise<T> {\n const response = await fetch(path, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n })\n return readJson<T>(response)\n}\n\n/** The browser half's only data entry point. */\nexport class NovelApi {\n async status(): Promise<StatusResponse> {\n const response = await fetch(NOVEL_API.status)\n return readJson<StatusResponse>(response)\n }\n\n async loadOutline(path?: string, text?: string): Promise<LoadOutlineResponse> {\n return postJson<LoadOutlineResponse>(NOVEL_API.loadOutline, { path, text })\n }\n\n async saveOutline(text: string): Promise<{ ok: boolean; bookName: string }> {\n return postJson<{ ok: boolean; bookName: string }>(NOVEL_API.saveOutline, { text })\n }\n\n /** 开书想法 → AI 大纲:生成 count 个方案(换批时传 exclude 避开已暂留方向)。 */\n async outlineSuggest(idea: string, count?: number, exclude?: string[]): Promise<import('../protocol.ts').OutlineSuggestResponse> {\n return postJson<import('../protocol.ts').OutlineSuggestResponse>(NOVEL_API.outlineSuggest, { idea, count, exclude })\n }\n\n /** 拆书分析:对已写章节做结构/人物/文风/卖点体检。 */\n async breakdown(scope?: string, preset?: 'quick' | 'standard', budgetTokens?: number): Promise<import('../protocol.ts').BreakdownResponse> {\n return postJson<import('../protocol.ts').BreakdownResponse>(NOVEL_API.breakdown, { scope, preset, budgetTokens })\n }\n\n async plan(outline?: string, chapterCount?: number, volume?: number): Promise<PlanResponse> {\n return postJson<PlanResponse>(NOVEL_API.plan, { outline, chapterCount, volume })\n }\n\n async volumes(outline?: string): Promise<VolumesResponse> {\n return postJson<VolumesResponse>(NOVEL_API.volumes, { outline })\n }\n\n async bible(outline?: string): Promise<BibleResponse> {\n return postJson<BibleResponse>(NOVEL_API.bible, { outline })\n }\n\n async review(chapterNo: number): Promise<{ report: ReviewReport }> {\n return postJson<{ report: ReviewReport }>(NOVEL_API.review, { chapterNo })\n }\n\n async summarize(chapterNo: number): Promise<{ summary: string }> {\n return postJson<{ summary: string }>(NOVEL_API.summary, { chapterNo })\n }\n\n async foreshadow(req: ForeshadowRequest): Promise<ForeshadowResponse> {\n return postJson<ForeshadowResponse>(NOVEL_API.foreshadow, req)\n }\n\n async exportBook(format: 'txt' | 'md'): Promise<ExportResponse> {\n return postJson<ExportResponse>(NOVEL_API.exportBook, { format })\n }\n\n async chapter(no: number): Promise<ChapterResponse> {\n const response = await fetch(`${NOVEL_API.chapter}?no=${no}`)\n return readJson<ChapterResponse>(response)\n }\n\n /** 审查手动编辑的正文(不落盘)。previousReport 传入时走「验证模式」(核对原意见解决 + 只挑新增 high)。 */\n async chapterCheck(no: number, text: string, previousReport?: ReviewReport): Promise<{ report: ReviewReport }> {\n return postJson<{ report: ReviewReport }>(NOVEL_API.chapterCheck, { chapterNo: no, text, previousReport })\n }\n\n /** 保存手动编辑的正文(自动备份 .bak;带报告则沿用落盘,否则保存后自动审稿)。 */\n async chapterSave(no: number, text: string, report?: ReviewReport): Promise<import('../protocol.ts').ChapterSaveResponse> {\n return postJson<import('../protocol.ts').ChapterSaveResponse>(NOVEL_API.chapterSave, { chapterNo: no, text, report })\n }\n\n async patchConfig(patch: ConfigPatch): Promise<{ config: NovelConfig }> {\n return postJson<{ config: NovelConfig }>(NOVEL_API.config, patch)\n }\n\n async openFolder(): Promise<void> {\n await fetch(NOVEL_API.openFolder, { method: 'POST', headers: { 'content-type': 'application/json' }, body: '{}' })\n }\n\n /** 书架快照。 */\n async bookshelf(): Promise<import('../protocol.ts').BookshelfSnapshot> {\n const response = await fetch(NOVEL_API.bookshelf)\n return readJson<import('../protocol.ts').BookshelfSnapshot>(response)\n }\n\n /** 新建书并激活(开书向导:可携带大纲文本,创建即建项目)。 */\n async bookCreate(bookName: string, outputDir?: string, outline?: string): Promise<import('../protocol.ts').BookshelfSnapshot> {\n return postJson<import('../protocol.ts').BookshelfSnapshot>(NOVEL_API.bookshelf, { bookName, outputDir, outline })\n }\n\n /** 重置项目(清空进度;可携带新大纲)。 */\n async reset(outline?: string): Promise<{ ok: boolean; bookName: string }> {\n return postJson<{ ok: boolean; bookName: string }>(NOVEL_API.reset, { outline })\n }\n\n /** 全书一致性质检。 */\n async audit(): Promise<import('../protocol.ts').AuditResponse> {\n return postJson<import('../protocol.ts').AuditResponse>(NOVEL_API.audit, {})\n }\n\n /** 角色卡刷新(基于事实库聚合)。 */\n async charactersRefresh(): Promise<{ cards: import('../protocol.ts').RoleStatusCard[] }> {\n return postJson<{ cards: import('../protocol.ts').RoleStatusCard[] }>(NOVEL_API.charactersRefresh, {})\n }\n\n /** 事实库回填:对历史已生成章节批量抽取事实。 */\n async factsBackfill(): Promise<{ ok: boolean; filled: number }> {\n return postJson<{ ok: boolean; filled: number }>(NOVEL_API.factsBackfill, {})\n }\n\n /** 设定圣经局部修补。 */\n async biblePatch(patch: import('../protocol.ts').BiblePatchRequest): Promise<{ bible: import('../protocol.ts').StoryBible }> {\n return postJson<{ bible: import('../protocol.ts').StoryBible }>(NOVEL_API.biblePatch, patch)\n }\n\n /** 剧情线管理:增删改 + 关联章节。 */\n async plotlines(req: import('../protocol.ts').PlotlinesRequest): Promise<import('../protocol.ts').PlotlinesResponse> {\n return postJson<import('../protocol.ts').PlotlinesResponse>(NOVEL_API.plotlines, req)\n }\n\n /** 敏感词检查:指定章节 / 任意文本 / 全书。 */\n async sensitiveCheck(req: import('../protocol.ts').SensitiveCheckRequest): Promise<import('../protocol.ts').SensitiveCheckResponse> {\n return postJson<import('../protocol.ts').SensitiveCheckResponse>(NOVEL_API.sensitiveCheck, req)\n }\n\n /** 作者复盘补跑:单章(JSON)。 */\n async reviewBackfillChapter(no: number): Promise<{ no: number; review: import('../protocol.ts').AuthorReview }> {\n return postJson<{ no: number; review: import('../protocol.ts').AuthorReview }>(NOVEL_API.reviewBackfill, { chapterNo: no })\n }\n\n /** 作者复盘补跑:全书缺失章节(NDJSON 流)。 */\n async reviewBackfillAll(onFrame: (frame: JobFrame) => void): Promise<void> {\n await this.streamJob(NOVEL_API.reviewBackfill, {}, onFrame)\n }\n\n /** 章节复位:generating 卡死 → pending。 */\n async chapterReset(no: number): Promise<{ ok: boolean; no: number }> {\n return postJson<{ ok: boolean; no: number }>(NOVEL_API.chapterReset, { chapterNo: no })\n }\n\n /** 章节直接通过(作者行使最终决定权)。 */\n async chapterApprove(no: number): Promise<{ ok: boolean; no: number }> {\n return postJson<{ ok: boolean; no: number }>(NOVEL_API.chapterApprove, { chapterNo: no })\n }\n\n /** 角色库:AI 提炼 / 采纳 / 更新 / 删除。 */\n async roles(req: import('../protocol.ts').RolesRequest): Promise<import('../protocol.ts').RolesResponse> {\n return postJson<import('../protocol.ts').RolesResponse>(NOVEL_API.roles, req)\n }\n\n /** 场景库:AI 提炼 / 采纳 / 更新 / 删除 / 图集。 */\n async scenes(req: import('../protocol.ts').ScenesRequest): Promise<import('../protocol.ts').ScenesResponse> {\n return postJson<import('../protocol.ts').ScenesResponse>(NOVEL_API.scenes, req)\n }\n\n /** 视觉世界观规则:提炼 / 保存。 */\n async visualRules(req: import('../protocol.ts').VisualRulesRequest): Promise<import('../protocol.ts').VisualRulesResponse> {\n return postJson<import('../protocol.ts').VisualRulesResponse>(NOVEL_API.visualRules, req)\n }\n\n /** 小说简介:AI 生成/补全(partial 留空 = 全量),或手动保存。 */\n async blurb(action: 'generate' | 'save', text?: string, partial?: string): Promise<{ blurb: string }> {\n return postJson<{ blurb: string }>(NOVEL_API.blurb, { action, text, partial })\n }\n\n /** 封面:读取(dataUrl;dir 指定某本书的输出目录,省略为当前书)。 */\n async coverGet(dir?: string): Promise<import('../protocol.ts').CoverResponse> {\n const query = dir !== undefined ? `?dir=${encodeURIComponent(dir)}` : ''\n const response = await fetch(NOVEL_API.cover + query)\n return readJson<import('../protocol.ts').CoverResponse>(response)\n }\n\n /** 封面:上传(base64 data URL)或移除。 */\n async coverPost(action: 'upload' | 'remove', dataUrl?: string): Promise<{ ok: boolean; coverPath?: string | null }> {\n return postJson<{ ok: boolean; coverPath?: string | null }>(NOVEL_API.cover, { action, dataUrl })\n }\n\n /** 重命名当前书(同步项目与书架条目)。 */\n async rename(bookName: string): Promise<{ bookName: string }> {\n return postJson<{ bookName: string }>(NOVEL_API.rename, { bookName })\n }\n\n /** 大世界:AI 提炼(generate)或手动保存(save)。 */\n async world(action: 'generate' | 'save', world?: import('../protocol.ts').WorldState): Promise<{ world: import('../protocol.ts').WorldState }> {\n return postJson<{ world: import('../protocol.ts').WorldState }>(NOVEL_API.world, { action, world })\n }\n\n /** 切换当前书。 */\n async bookActivate(id: string): Promise<import('../protocol.ts').BookshelfSnapshot> {\n return postJson<import('../protocol.ts').BookshelfSnapshot>('/api/dsh-novel-forge/bookshelf/activate', { id })\n }\n\n /** 移除书架条目。 */\n async bookRemove(id: string): Promise<import('../protocol.ts').BookshelfSnapshot> {\n return postJson<import('../protocol.ts').BookshelfSnapshot>('/api/dsh-novel-forge/bookshelf/remove', { id })\n }\n\n /** 生产单:启动批量生产(区间或新增 N 章;计划不足自动补)。 */\n async runStart(req: import('../protocol.ts').RunStartRequest): Promise<import('../protocol.ts').RunState> {\n return postJson<import('../protocol.ts').RunState>(NOVEL_API.runStart, req)\n }\n\n /** 生产单控制:pause / resume / stop。 */\n async runControl(action: 'pause' | 'resume' | 'stop'): Promise<import('../protocol.ts').RunState | null> {\n const response = await fetch(NOVEL_API.runControl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ action }),\n })\n if (response.status === 400) return null\n return readJson<import('../protocol.ts').RunState>(response)\n }\n\n /** 生产单状态(无生产单返回 null)。 */\n async runStatus(): Promise<import('../protocol.ts').RunState | null> {\n const response = await fetch(NOVEL_API.runStatus)\n if (response.status === 404) return null\n return readJson<import('../protocol.ts').RunState | null>(response)\n }\n\n /** Get project writing assets + built-in libraries. */\n async assets(): Promise<AssetsResponse> {\n const response = await fetch(NOVEL_API.assets)\n return readJson<AssetsResponse>(response)\n }\n\n /** Patch project writing assets. */\n async patchAssets(patch: AssetsPatch): Promise<AssetsResponse> {\n return postJson<AssetsResponse>(NOVEL_API.assets, patch)\n }\n\n /** Extract a style asset from sample text. */\n async styleEngine(req: StyleEngineRequest): Promise<{ styleAsset: StyleAsset }> {\n return postJson<{ styleAsset: StyleAsset }>(NOVEL_API.styleEngine, req)\n }\n\n /**\n * Consume an NDJSON job stream (generate / rewrite / polish).\n * @param path - the route to POST to.\n * @param payload - the JSON body.\n * @param onFrame - receives every frame as it lands.\n */\n private async streamJob(path: string, payload: unknown, onFrame: (frame: JobFrame) => void): Promise<void> {\n const response = await fetch(path, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n })\n if (!response.ok) {\n await readJson<{ error?: string }>(response)\n return\n }\n if (response.body === null) throw new NovelApiError('job: no response body')\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n for (const line of lines) {\n if (line.trim() === '') continue\n let frame: JobFrame\n try {\n frame = JSON.parse(line) as JobFrame\n } catch {\n continue\n }\n onFrame(frame)\n if (frame.type === 'error') {\n throw new NovelApiError(frame.message)\n }\n }\n }\n }\n\n /** Generate one chapter. */\n async generate(chapterNo: number, skipReview: boolean, onFrame: (frame: JobFrame) => void): Promise<void> {\n await this.streamJob(NOVEL_API.generate, { chapterNo, skipReview }, onFrame)\n }\n\n /** Rewrite one chapter (whole-chapter, or local when `target` is given). */\n async rewrite(chapterNo: number, instructions: string, target: string, onFrame: (frame: JobFrame) => void): Promise<void> {\n await this.streamJob(NOVEL_API.rewrite, { chapterNo, instructions, target }, onFrame)\n }\n\n /** Polish (de-AI-ify) one chapter. */\n async polish(chapterNo: number, onFrame: (frame: JobFrame) => void): Promise<void> {\n await this.streamJob(NOVEL_API.polish, { chapterNo }, onFrame)\n }\n\n /** 采纳待确认草稿(润色/重写产物),覆盖正文文件。返回采纳后的新正文(markdown)。\n * 可携带审查报告(沿用结论定状态:通过 → approved)。 */\n async draftApply(chapterNo: number, report?: import('../protocol.ts').ReviewReport): Promise<{ ok: boolean; chars: number; file: string; markdown: string }> {\n return postJson<{ ok: boolean; chars: number; file: string; markdown: string }>(NOVEL_API.draftApply, { chapterNo, report })\n }\n\n /** 放弃待确认草稿,保留原稿。 */\n async draftDiscard(chapterNo: number): Promise<{ ok: boolean }> {\n return postJson<{ ok: boolean }>(NOVEL_API.draftDiscard, { chapterNo })\n }\n\n /** Run one assistant turn (NDJSON stream). */\n async assistant(message: string, onFrame: (frame: import('../protocol.ts').AssistantFrame) => void): Promise<void> {\n const response = await fetch(NOVEL_API.assistant, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ message }),\n })\n if (!response.ok) {\n await readJson<{ error?: string }>(response)\n return\n }\n if (response.body === null) throw new NovelApiError('assistant: no response body')\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n for (const line of lines) {\n if (line.trim() === '') continue\n let frame: import('../protocol.ts').AssistantFrame\n try {\n frame = JSON.parse(line) as import('../protocol.ts').AssistantFrame\n } catch {\n continue\n }\n onFrame(frame)\n if (frame.type === 'error') throw new NovelApiError(frame.message)\n }\n }\n }\n\n /** Load the persisted assistant conversation. */\n async assistantHistory(): Promise<import('../protocol.ts').AssistantMessage[]> {\n const response = await fetch(NOVEL_API.assistantHistory)\n const body = await readJson<{ messages: import('../protocol.ts').AssistantMessage[] }>(response)\n return body.messages\n }\n\n /** 清空助手对话记录。 */\n async assistantClear(): Promise<{ ok: boolean }> {\n return postJson<{ ok: boolean }>(NOVEL_API.assistantClear, {})\n }\n}\n","/**\n * dsh-novel-forge — locale dictionaries (zh / en).\n */\n\n/** zh dictionary. */\nexport const zh = {\n 'entry.label': '小说工坊',\n 'entry.tooltip': 'AI 编译小说工作台:总纲 → 道藏 → 卷计划 → 章节计划 → 逐章生成+审稿',\n 'panel.title': '小说工坊',\n 'common.close': '关闭',\n 'common.loading': '加载中…',\n 'common.save': '保存',\n 'common.error': '错误',\n 'common.success': '成功',\n 'common.generating': '生成中…',\n 'common.chars': '字',\n 'tab.workflow': '工作台',\n 'tab.overview': '总纲',\n 'tab.plan': '章节',\n 'tab.bible': '道藏',\n 'tab.foreshadow': '暗线',\n 'tab.assistant': 'AI 助手',\n 'tab.settings': '设置',\n 'workflow.title': '创作工作台',\n 'workflow.step1': '① 加载总纲',\n 'workflow.step2': '② 提炼道藏',\n 'workflow.step3': '③ 规划卷',\n 'workflow.step4': '④ 生成章节计划',\n 'workflow.step5': '⑤ 逐章写作 + AI 审稿',\n 'workflow.step6': '⑥ 润色 / 导出',\n 'workflow.loadOutline': '读取总纲',\n 'workflow.genBible': '提炼道藏',\n 'workflow.genVolumes': '生成卷计划',\n 'workflow.genPlan': '生成章节计划',\n 'workflow.done': '已完成',\n 'workflow.todo': '待办',\n 'workflow.bibleDone': '道藏已生成({n} 条规则 / {c} 个人物 / {r} 条红线)',\n 'workflow.volumesDone': '卷计划已生成({n} 卷)',\n 'workflow.planDone': '章节计划已生成({n} 章)',\n 'workflow.progress': '进度:总纲 ✓ · 道藏 {bible} · 卷 {volumes} · 计划 {plan} · 已完成 {done}/{total} 章',\n 'overview.loadDocx': '从 docx 读取总纲',\n 'overview.loadDocxDefault': '读取默认总纲',\n 'overview.loadingOutline': '正在解析 docx…',\n 'overview.outlineHint': '总纲文本(可编辑)',\n 'overview.outlineChars': '总纲字数',\n 'overview.saveOutline': '保存总纲',\n 'overview.saved': '总纲已保存',\n 'overview.bookName': '书名',\n 'overview.loadCustom': '指定 docx 路径',\n 'overview.loadCustomHint': '绝对路径,留空使用默认',\n 'plan.generate': '生成章节计划',\n 'plan.generateHint': '章节数量',\n 'plan.count': '章',\n 'plan.empty': '暂无章节计划,请先生成',\n 'plan.chapter': '章',\n 'plan.pending': '待生成',\n 'plan.generating': '生成中',\n 'plan.written': '待审稿',\n 'plan.reviewing': '审稿中',\n 'plan.approved': '已通过',\n 'plan.rejected': '待修订',\n 'plan.error': '失败',\n 'plan.write': '生成本章',\n 'plan.rewrite': '修订',\n 'plan.review': '审稿',\n 'plan.polish': '去AI味',\n 'plan.writeAll': '批量生成全部',\n 'plan.writeAllPending': '批量生成剩余',\n 'plan.generated': '已生成',\n 'plan.progress': '进度',\n 'plan.beats': '剧情要点',\n 'plan.reviewReport': '审稿报告',\n 'plan.reviewScore': '评分',\n 'plan.reviewVerdict': '总评',\n 'plan.reviewIssues': '问题清单',\n 'plan.reviewPass': '通过',\n 'plan.reviewFail': '未通过',\n 'plan.approve': '手动通过',\n 'plan.summary': '章节摘要',\n 'plan.volumes': '卷',\n 'plan.noVolume': '未分卷',\n 'bible.title': '道藏',\n 'bible.gen': 'AI 提炼道藏',\n 'bible.genre': '题材基调',\n 'bible.worldRules': '世界规则',\n 'bible.characters': '人物志',\n 'bible.redLines': '写作红线',\n 'bible.style': '风格要求',\n 'bible.none': '尚未生成道藏。生成后写作会严格遵守人设与金手指规则,审稿也会按红线检查。',\n 'foreshadow.title': '暗线管理',\n 'foreshadow.suggest': 'AI 建议暗线',\n 'foreshadow.none': '暂无暗线',\n 'foreshadow.status': '状态',\n 'foreshadow.planned': '计划中',\n 'foreshadow.planted': '已埋设',\n 'foreshadow.progressing': '推进中',\n 'foreshadow.resolved': '已回收',\n 'foreshadow.abandoned': '已放弃',\n 'foreshadow.target': '预计回收',\n 'foreshadow.plantedAt': '埋设于',\n 'foreshadow.setPlanted': '标记已埋设',\n 'foreshadow.setResolved': '标记已回收',\n 'tab.facts': '编年录',\n 'tab.plotlines': '剧情线',\n 'plotlines.hint': '主线/支线/人物线/悬念线的推进管理:章节生成时会注入未完结的线,要求每章至少推进一条;关联章节记录推进节点。',\n 'plotlines.empty': '还没有剧情线——长篇小说建议先建主线与几条支线。',\n 'plotlines.new': '+ 新建剧情线',\n 'plotlines.name': '线名',\n 'plotlines.kind': '类型',\n 'plotlines.kindMain': '主线',\n 'plotlines.kindBranch': '支线',\n 'plotlines.kindCharacter': '人物线',\n 'plotlines.kindMystery': '悬念线',\n 'plotlines.goal': '目标/终点',\n 'plotlines.progress': '当前进度',\n 'plotlines.status': '状态',\n 'plotlines.statusActive': '推进中',\n 'plotlines.statusPaused': '暂停',\n 'plotlines.statusResolved': '已完结',\n 'plotlines.statusAbandoned': '已废弃',\n 'plotlines.save': '保存',\n 'plotlines.cancel': '取消',\n 'plotlines.edit': '编辑',\n 'plotlines.remove': '删除',\n 'plotlines.linkChapter': '关联本章',\n 'plotlines.chapters': '已关联',\n 'plotlines.workflowTitle': '剧情线进度',\n 'plotlines.workflowEmpty': '未建剧情线(去「剧情线」页创建)',\n 'sensitive.title': '敏感词检查',\n 'sensitive.scanAll': '🔞 全书敏感词检查',\n 'sensitive.hint': '内置违禁词库硬匹配(政治/擦边/暴力/辱骂/广告/其他),发布前建议检查;只做提示,是否修改由你判断。',\n 'sensitive.clean': '✅ 未命中任何违禁词(扫描 {n} 章)',\n 'sensitive.hits': '命中 {n} 处({chapters} 章受影响)',\n 'sensitive.goFix': '去修订',\n 'sensitive.fixPrefill': '请删除或替换正文中的违禁表达「{word}」(类别:{category}),用含蓄/间接的写法替代。',\n 'facts.title': '编年录 / 时间线({n} 条)',\n 'facts.hint': '每章生成后自动抽取「已确立事实」(人物状态/境界资源/关系变化/伏笔落地),最近 20 条注入后续章节生成,保证长期一致。',\n 'facts.backfill': '回填历史章节事实',\n 'facts.backfilled': '已从历史章节回填 {n} 条事实',\n 'settings.title': '设置',\n 'settings.outlinePath': '默认大纲路径',\n 'settings.outputDir': '输出目录',\n 'settings.provider': '模型提供商',\n 'settings.model': '模型',\n 'settings.modelCustom': '自定义…',\n 'settings.modelCustomPlaceholder': '输入任意模型 id',\n 'settings.reasoningEffort': '思考强度 (reasoningEffort)',\n 'settings.reasoning.off': 'off · 关闭思考(推荐日常写文)',\n 'settings.reasoning.low': 'low · 低思考',\n 'settings.reasoning.high': 'high · 高思考',\n 'settings.reasoning.max': 'max · 最高思考(质检/推演)',\n 'settings.reasoningHint': 'off 最快最省;high/max 更慢更贵但推理更强',\n 'settings.theme': '主题',\n 'settings.themeLiquid': 'iOS 液态玻璃(绿)',\n 'settings.themeClassic': '经典毛玻璃(蓝)',\n 'settings.themeNeumorph': '新拟物(双阴影)',\n 'settings.themeHint': '存于浏览器本地,即时生效',\n 'settings.chapterChars': '每章目标字数',\n 'settings.maxTokens': '单章最大输出 tokens',\n 'settings.reviewPassScore': '审稿通过分数(0-100)',\n 'settings.editorFontSize': '编辑器字号(仅编辑页显示)',\n 'settings.editorFontSizeHint': '存于浏览器本地,不影响其他设备',\n 'settings.autoReview': '生成后自动审稿',\n 'settings.autoAuthorReview': '生成后自动作者复盘',\n 'settings.autoAuthorReviewHint': '复盘钩子兑现/结尾钩子/剧情线推进/连续性/节奏趋势,每章约 2000 token',\n 'settings.autoReviewAfterRevise': '修订后自动审查',\n 'settings.autoReviewAfterReviseHint': '按意见修订/润色产出草稿后自动附带一次 AI 审查,直接显示新稿评分与剩余问题(每章约 2-3k token,可关)',\n 'settings.save': '保存设置',\n 'settings.saved': '设置已保存',\n 'settings.openFolder': '打开输出文件夹',\n 'settings.export': '导出',\n 'settings.exportTxt': '导出 TXT',\n 'settings.exportMd': '导出 Markdown',\n 'settings.exported': '已导出:{file}({chars} 字,{chapters} 章)',\n 'progress.generating': '正在生成第 {no} 章《{title}》…',\n 'progress.done': '第 {no} 章完成({chars} 字)→ {file}',\n 'progress.reviewed': '第 {no} 章审稿:{score} 分 — {verdict}',\n 'progress.error': '第 {no} 章失败:{message}',\n 'progress.rewriting': '正在修订第 {no} 章…',\n 'progress.polishing': '正在润色第 {no} 章…',\n 'progress.empty': '生成/审稿进度将显示在这里',\n 'assistant.hint': '和 AI 编辑讨论剧情、人设、暗线;达成一致后可让它直接修改总纲、道藏、章节内容。',\n 'assistant.placeholder': '例如:我想让第 2 章结尾加一个悬念——墟境里传来爷爷的声音…',\n 'assistant.send': '发送',\n 'assistant.toolStart': '⚙ 执行操作:{name}…',\n 'assistant.toolDone': '✓ {name} 完成:{detail}',\n 'assistant.toolError': '✗ {name} 失败:{detail}',\n 'assistant.empty': '还没有对话。和 AI 编辑聊聊剧情吧。',\n 'status.projectNone': '输出目录中还没有项目。请先加载大纲。',\n 'status.files': '已生成文件',\n 'api.error': '请求失败',\n} as const\n\n/** en dictionary (fallback). */\nexport const en: Record<string, string> = {\n 'entry.label': 'Novel Forge',\n 'entry.tooltip': 'AI novel workbench: outline → bible → volumes → plan → write + review',\n 'panel.title': 'Novel Forge',\n 'common.close': 'Close',\n 'common.loading': 'Loading…',\n 'common.save': 'Save',\n 'common.error': 'Error',\n 'common.success': 'Success',\n 'common.generating': 'Generating…',\n 'common.chars': ' chars',\n 'tab.workflow': 'Workbench',\n 'tab.overview': 'Outline',\n 'tab.plan': 'Chapters',\n 'tab.bible': 'Bible',\n 'tab.foreshadow': 'Foreshadow',\n 'tab.settings': 'Settings',\n 'workflow.title': 'Writing workbench',\n 'workflow.step1': '① Load outline',\n 'workflow.step2': '② Extract story bible',\n 'workflow.step3': '③ Plan volumes',\n 'workflow.step4': '④ Plan chapters',\n 'workflow.step5': '⑤ Write + AI review',\n 'workflow.step6': '⑥ Polish / export',\n 'workflow.loadOutline': 'Load outline',\n 'workflow.genBible': 'Extract bible',\n 'workflow.genVolumes': 'Plan volumes',\n 'workflow.genPlan': 'Plan chapters',\n 'workflow.done': 'done',\n 'workflow.todo': 'todo',\n 'workflow.bibleDone': 'Bible ready ({n} rules / {c} characters / {r} red lines)',\n 'workflow.volumesDone': 'Volumes ready ({n})',\n 'workflow.planDone': 'Plan ready ({n} chapters)',\n 'workflow.progress': 'Outline ✓ · bible {bible} · volumes {volumes} · plan {plan} · {done}/{total} chapters',\n 'overview.loadDocx': 'Load outline from docx',\n 'overview.loadDocxDefault': 'Load default outline',\n 'overview.loadingOutline': 'Parsing docx…',\n 'overview.outlineHint': 'Outline text (editable)',\n 'overview.outlineChars': 'Outline length',\n 'overview.saveOutline': 'Save outline',\n 'overview.saved': 'Outline saved',\n 'overview.bookName': 'Book',\n 'overview.loadCustom': 'Custom docx path',\n 'overview.loadCustomHint': 'Absolute path; empty = default',\n 'plan.generate': 'Plan chapters',\n 'plan.generateHint': 'Chapter count',\n 'plan.count': ' chapters',\n 'plan.empty': 'No plan yet — generate one first',\n 'plan.chapter': 'Ch.',\n 'plan.pending': 'pending',\n 'plan.generating': 'writing',\n 'plan.written': 'to review',\n 'plan.reviewing': 'reviewing',\n 'plan.approved': 'approved',\n 'plan.rejected': 'to revise',\n 'plan.error': 'failed',\n 'plan.write': 'Write',\n 'plan.rewrite': 'Revise',\n 'plan.review': 'Review',\n 'plan.polish': 'De-AI',\n 'plan.writeAll': 'Write all',\n 'plan.writeAllPending': 'Write remaining',\n 'plan.generated': 'generated',\n 'plan.progress': 'progress',\n 'plan.beats': 'Beats',\n 'plan.reviewReport': 'Review report',\n 'plan.reviewScore': 'Score',\n 'plan.reviewVerdict': 'Verdict',\n 'plan.reviewIssues': 'Issues',\n 'plan.reviewPass': 'Passed',\n 'plan.reviewFail': 'Failed',\n 'plan.approve': 'Approve',\n 'plan.summary': 'Summary',\n 'plan.volumes': 'Volumes',\n 'plan.noVolume': 'No volume',\n 'bible.title': 'Story bible',\n 'bible.gen': 'Extract bible with AI',\n 'bible.genre': 'Genre',\n 'bible.worldRules': 'World rules',\n 'bible.characters': 'Characters',\n 'bible.redLines': 'Red lines',\n 'bible.style': 'Style',\n 'bible.none': 'No bible yet. Generation and review follow it strictly once extracted.',\n 'foreshadow.title': 'Foreshadowing',\n 'foreshadow.suggest': 'Suggest with AI',\n 'foreshadow.none': 'No foreshadows',\n 'foreshadow.status': 'Status',\n 'foreshadow.planned': 'planned',\n 'foreshadow.planted': 'planted',\n 'foreshadow.progressing': 'progressing',\n 'foreshadow.resolved': 'resolved',\n 'foreshadow.abandoned': 'abandoned',\n 'foreshadow.target': 'target',\n 'foreshadow.plantedAt': 'planted at',\n 'foreshadow.setPlanted': 'Mark planted',\n 'foreshadow.setResolved': 'Mark resolved',\n 'settings.title': 'Settings',\n 'settings.outlinePath': 'Default outline path',\n 'settings.outputDir': 'Output directory',\n 'settings.provider': 'Provider',\n 'settings.model': 'Model',\n 'settings.modelCustom': 'Custom…',\n 'settings.modelCustomPlaceholder': 'Type any model id',\n 'settings.reasoningEffort': 'Reasoning effort',\n 'settings.reasoning.off': 'off · no thinking (recommended)',\n 'settings.reasoning.low': 'low',\n 'settings.reasoning.high': 'high',\n 'settings.reasoning.max': 'max (audit/reasoning)',\n 'settings.reasoningHint': 'off is fastest/cheapest; high/max are slower and stronger',\n 'settings.theme': 'Theme',\n 'settings.themeLiquid': 'iOS Liquid Glass (green)',\n 'settings.themeClassic': 'Classic frosted (blue)',\n 'settings.themeNeumorph': 'Neumorphism (dual-shadow)',\n 'settings.themeHint': 'Stored in browser localStorage; applies instantly',\n 'settings.chapterChars': 'Chars per chapter',\n 'settings.maxTokens': 'Max output tokens',\n 'settings.reviewPassScore': 'Review pass score (0-100)',\n 'settings.editorFontSize': 'Editor font size (workspace only)',\n 'settings.editorFontSizeHint': 'Stored in browser localStorage; display-only',\n 'settings.autoReview': 'Auto-review after writing',\n 'settings.autoAuthorReview': 'Auto author review after writing',\n 'settings.autoAuthorReviewHint': 'Reviews hook payoff / ending hook / plotline progress / continuity / pacing trend (~2000 tokens per chapter)',\n 'settings.autoReviewAfterRevise': 'Auto review after revise',\n 'settings.autoReviewAfterReviseHint': 'Automatically runs one AI review on the produced draft after revise/polish, showing the new score and remaining issues (~2-3k tokens, can be disabled)',\n 'settings.save': 'Save settings',\n 'settings.saved': 'Settings saved',\n 'settings.openFolder': 'Open output folder',\n 'settings.export': 'Export',\n 'settings.exportTxt': 'Export TXT',\n 'settings.exportMd': 'Export Markdown',\n 'settings.exported': 'Exported: {file} ({chars} chars, {chapters} chapters)',\n 'tab.facts': 'Chronicle',\n 'tab.plotlines': 'Plotlines',\n 'plotlines.hint': 'Track main/branch/character/mystery arcs: unfinished arcs are injected into chapter writing so each chapter advances at least one; linked chapters record progress nodes.',\n 'plotlines.empty': 'No plotlines yet — consider creating the main arc and a few branches.',\n 'plotlines.new': '+ New plotline',\n 'plotlines.name': 'Name',\n 'plotlines.kind': 'Type',\n 'plotlines.kindMain': 'Main',\n 'plotlines.kindBranch': 'Branch',\n 'plotlines.kindCharacter': 'Character',\n 'plotlines.kindMystery': 'Mystery',\n 'plotlines.goal': 'Goal',\n 'plotlines.progress': 'Current progress',\n 'plotlines.status': 'Status',\n 'plotlines.statusActive': 'Active',\n 'plotlines.statusPaused': 'Paused',\n 'plotlines.statusResolved': 'Resolved',\n 'plotlines.statusAbandoned': 'Abandoned',\n 'plotlines.save': 'Save',\n 'plotlines.cancel': 'Cancel',\n 'plotlines.edit': 'Edit',\n 'plotlines.remove': 'Remove',\n 'plotlines.linkChapter': 'Link chapter',\n 'plotlines.chapters': 'Linked',\n 'plotlines.workflowTitle': 'Plotline progress',\n 'plotlines.workflowEmpty': 'No plotlines yet (create them in the Plotlines tab)',\n 'sensitive.title': 'Sensitive-word check',\n 'sensitive.scanAll': '🔞 Scan all chapters',\n 'sensitive.hint': 'Built-in banned-word library (politics/erotica/violence/abuse/ads/other). Run before publishing; suggestions only.',\n 'sensitive.clean': '✅ No banned words found ({n} chapters scanned)',\n 'sensitive.hits': '{n} hits across {chapters} chapters',\n 'sensitive.goFix': 'Fix',\n 'sensitive.fixPrefill': 'Remove or rephrase the banned expression \"{word}\" (category: {category}) with an indirect alternative.',\n 'facts.title': 'Chronicle / timeline ({n} facts)',\n 'facts.hint': 'Auto-extracted established facts per chapter (state/resources/relations/foreshadow landings); the latest 20 are injected into later chapters for consistency.',\n 'facts.backfill': 'Backfill facts from historical chapters',\n 'facts.backfilled': 'Backfilled {n} facts from historical chapters',\n 'progress.generating': 'Writing chapter {no} “{title}”…',\n 'progress.done': 'Chapter {no} done ({chars} chars) → {file}',\n 'progress.reviewed': 'Chapter {no} review: {score} — {verdict}',\n 'progress.error': 'Chapter {no} failed: {message}',\n 'progress.rewriting': 'Revising chapter {no}…',\n 'progress.polishing': 'Polishing chapter {no}…',\n 'progress.empty': 'Generation/review progress appears here',\n 'assistant.hint': 'Discuss plot, characters, foreshadowing with the AI editor; once agreed, let it edit the outline, bible, or chapters directly.',\n 'assistant.placeholder': 'e.g. Add a hook at the end of chapter 2…',\n 'assistant.send': 'Send',\n 'assistant.toolStart': '⚙ Running {name}…',\n 'assistant.toolDone': '✓ {name} done: {detail}',\n 'assistant.toolError': '✗ {name} failed: {detail}',\n 'assistant.empty': 'No conversation yet. Chat with the AI editor.',\n 'status.projectNone': 'No project in the output directory yet. Load an outline first.',\n 'status.files': 'Generated files',\n 'api.error': 'Request failed',\n}\n\n/** Keys type for the zh dictionary. */\nexport type NovelKey = keyof typeof zh\n","/**\n * Tiny translation helper for the panel: reads the zh dict with the en dict\n * as fallback (the family plugins use a full locale registry; the panel keeps\n * a dependency-free helper so the client bundle stays self-contained).\n */\nimport { zh, en, type NovelKey } from '../locales.ts'\n\n/** Translate one key with optional {placeholder} substitution. */\nexport function tt(key: NovelKey, params?: Record<string, string | number>): string {\n let text: string = zh[key] ?? en[key] ?? key\n if (params !== undefined) {\n for (const [name, value] of Object.entries(params)) {\n text = text.replaceAll(`{${name}}`, String(value))\n }\n }\n return text\n}\n\n// ------------------------------------------------------------ shared constants\n\n/** 角色定位中文名(角色库/提炼候选共用,收敛自多份复制)。 */\nexport const ROLE_LABELS: Record<string, string> = {\n protagonist: '主角',\n female_lead: '女主',\n female_support: '女配',\n support: '配角',\n antagonist: '反派',\n extra: '路人',\n}\n\n/** 角色定位徽章颜色。 */\nexport function roleColor(label: string): string {\n if (label === 'protagonist') return 'var(--nf-success)'\n if (label === 'female_lead') return 'var(--nf-accent)'\n if (label === 'antagonist') return 'var(--nf-error)'\n return 'var(--nf-text-3)'\n}\n\n/** 剧情线类型中文名(与 locale 对齐)。 */\nexport function kindLabel(kind: string): string {\n switch (kind) {\n case 'main': return tt('plotlines.kindMain')\n case 'branch': return tt('plotlines.kindBranch')\n case 'character': return tt('plotlines.kindCharacter')\n case 'mystery': return tt('plotlines.kindMystery')\n default: return kind\n }\n}\n\n/** 剧情线状态中文名。 */\nexport function plotlineStatusLabel(status: string): string {\n switch (status) {\n case 'active': return tt('plotlines.statusActive')\n case 'paused': return tt('plotlines.statusPaused')\n case 'resolved': return tt('plotlines.statusResolved')\n case 'abandoned': return tt('plotlines.statusAbandoned')\n default: return status\n }\n}\n\n/** 剧情线状态颜色。 */\nexport function plotlineStatusColor(status: string): string {\n if (status === 'resolved') return 'var(--nf-success)'\n if (status === 'abandoned') return 'var(--nf-text-3)'\n if (status === 'paused') return 'var(--nf-warn)'\n return 'var(--nf-accent)'\n}\n","/**\n * AI 助手(编辑老师):与 AI 编辑对话讨论剧情,助手通过动作指令直接修改\n * 大纲 / 设定圣经 / 章节。流式渲染回复;工具调用显示为步骤卡片(中文名 +\n * 状态 + 耗时),顶部状态条展示当前在做什么;支持清空对话记录。\n */\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport { tt } from './helpers.ts'\nimport type { AssistantFrame, AssistantMessage } from '../../protocol.ts'\nimport css from './panel.module.css'\n\n/** 工具中文名 + 图标映射(作者看得懂)。 */\nconst TOOL_LABELS: Record<string, { icon: string; label: string }> = {\n book_overview: { icon: '📖', label: '读取全书上下文' },\n impact_analysis: { icon: '🔗', label: '影响分析' },\n outline_text: { icon: '📄', label: '读取大纲' },\n outline_replace: { icon: '📝', label: '修改大纲' },\n bible_set_rule: { icon: '📖', label: '修改设定规则' },\n bible_set_redline: { icon: '🚫', label: '修改写作红线' },\n chapter_text: { icon: '📄', label: '读取章节' },\n chapter_rewrite: { icon: '✏️', label: '修订章节' },\n chapter_generate: { icon: '✨', label: '生成章节' },\n chapter_review: { icon: '🔍', label: 'AI 审稿' },\n foreshadow_add: { icon: '🪤', label: '新增伏笔' },\n foreshadow_update: { icon: '🪤', label: '更新伏笔' },\n export_txt: { icon: '📦', label: '导出 TXT' },\n assets_status: { icon: '🎨', label: '查看写作资产' },\n assets_set_genre: { icon: '🏷️', label: '设置题材' },\n assets_set_progression: { icon: '📈', label: '设置推进模式' },\n assets_add_rule: { icon: '🚫', label: '新增反AI规则' },\n error: { icon: '⚠️', label: '出错了' },\n}\n\n/** One chat bubble (either side). */\ninterface ChatLine {\n id: number\n role: 'user' | 'assistant'\n text: string\n /** Tool steps interleaved with the assistant reply. */\n tools: Array<{ name: string; status: 'start' | 'done' | 'error'; detail?: string; startedAt?: number; elapsedMs?: number }>\n /** Live output while a tool runs (generated text streamed into the bubble). */\n live?: string\n}\n\n/** Props. */\nexport interface AssistantTabProps {\n api: NovelApi\n}\n\n/** The assistant conversation tab. */\nexport function AssistantTab({ api }: AssistantTabProps) {\n const [lines, setLines] = useState<ChatLine[]>([])\n const [input, setInput] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const [notice, setNotice] = useState('')\n /** 思考耗时(秒,busy 时每秒刷新)。 */\n const [thinkSeconds, setThinkSeconds] = useState(0)\n const idRef = useRef(0)\n const scrollRef = useRef<HTMLDivElement | null>(null)\n\n /** busy 计时:显示\"已思考 Xs\",让作者知道在干活。 */\n useEffect(() => {\n if (!busy) {\n setThinkSeconds(0)\n return\n }\n const started = Date.now()\n const timer = window.setInterval(() => {\n setThinkSeconds(Math.floor((Date.now() - started) / 1000))\n }, 1000)\n return () => { window.clearInterval(timer) }\n }, [busy])\n\n /** Append a bubble (or extend the current assistant bubble). */\n const pushLine = useCallback((line: Omit<ChatLine, 'id'>) => {\n setLines(prev => {\n const last = prev[prev.length - 1]\n // Extend the live assistant bubble while streaming.\n if (line.role === 'assistant' && last !== undefined && last.role === 'assistant' && last.tools.length === 0) {\n return [...prev.slice(0, -1), { ...last, text: last.text + line.text }]\n }\n return [...prev, { ...line, id: idRef.current++ }]\n })\n }, [])\n\n /** Push a tool event: start 创建步骤,done/error 更新同名步骤(含耗时)。 */\n const pushTool = useCallback((tool: ChatLine['tools'][number]) => {\n setLines(prev => {\n const last = prev[prev.length - 1]\n if (last === undefined || last.role !== 'assistant') {\n return [...prev, {\n id: idRef.current++,\n role: 'assistant',\n text: '',\n tools: [{ ...tool, startedAt: tool.status === 'start' ? Date.now() : undefined }],\n }]\n }\n const tools = [...last.tools]\n if (tool.status === 'start') {\n tools.push({ ...tool, startedAt: Date.now() })\n } else {\n // 找到同名未完成的步骤,更新状态与耗时。\n for (let i = tools.length - 1; i >= 0; i--) {\n const step = tools[i]!\n if (step.name === tool.name && step.status === 'start') {\n tools[i] = {\n ...step,\n status: tool.status,\n detail: tool.detail,\n elapsedMs: Date.now() - (step.startedAt ?? Date.now()),\n }\n break\n }\n }\n }\n return [...prev.slice(0, -1), { ...last, tools, live: undefined }]\n })\n }, [])\n\n /** Append live tool output onto the current assistant bubble. */\n const pushToolDelta = useCallback((text: string) => {\n setLines(prev => {\n const last = prev[prev.length - 1]\n if (last === undefined || last.role !== 'assistant') return prev\n return [...prev.slice(0, -1), { ...last, live: (last.live ?? '') + text }]\n })\n }, [])\n\n /** 当前进行中的工具(状态条显示)。 */\n const activeTool = (() => {\n if (!busy) return null\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i]!\n if (line.role !== 'assistant') continue\n for (let j = line.tools.length - 1; j >= 0; j--) {\n if (line.tools[j]!.status === 'start') return line.tools[j]!\n }\n }\n return null\n })()\n\n /** Load persisted history on mount. */\n useEffect(() => {\n let cancelled = false\n void (async () => {\n try {\n const history = await api.assistantHistory()\n if (cancelled) return\n const restored: ChatLine[] = []\n for (const entry of history) {\n if (entry.role === 'user') {\n restored.push({ id: idRef.current++, role: 'user', text: entry.content, tools: [] })\n } else if (entry.role === 'assistant') {\n restored.push({ id: idRef.current++, role: 'assistant', text: entry.content, tools: [] })\n }\n }\n setLines(restored)\n } catch (err) {\n if (!cancelled) setError((err as Error).message)\n }\n })()\n return () => { cancelled = true }\n }, [api])\n\n /** Auto-scroll to the newest line. */\n useEffect(() => {\n scrollRef.current?.scrollTo({ top: scrollRef.current.scrollHeight })\n }, [lines])\n\n /** 清空对话记录(服务端删除历史 + 本地清空)。 */\n const handleClear = async (): Promise<void> => {\n if (!window.confirm('清空全部聊天记录?此操作不可恢复(不影响大纲/设定/章节)。')) return\n setBusy(true)\n setError('')\n try {\n await api.assistantClear()\n setLines([])\n setNotice('对话已清空,编辑老师会重新了解项目')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** Send one message. */\n const handleSend = async (): Promise<void> => {\n const message = input.trim()\n if (message === '' || busy) return\n setInput('')\n setError('')\n setNotice('')\n pushLine({ role: 'user', text: message, tools: [] })\n // Start an empty assistant bubble.\n setLines(prev => [...prev, { id: idRef.current++, role: 'assistant', text: '', tools: [] }])\n setBusy(true)\n try {\n await api.assistant(message, (frame: AssistantFrame) => {\n if (frame.type === 'delta') {\n pushLine({ role: 'assistant', text: frame.text, tools: [] })\n } else if (frame.type === 'tool') {\n pushTool({\n name: frame.name,\n status: frame.status,\n detail: frame.detail,\n })\n } else if (frame.type === 'toolDelta') {\n pushToolDelta(frame.text)\n } else if (frame.type === 'error') {\n pushTool({ name: 'error', status: 'error', detail: frame.message })\n }\n })\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <div className={css.card} style={{ flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' }}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>{tt('tab.assistant')}</span>\n <button type=\"button\" className={css.iconButton} title=\"清空聊天记录\" aria-label=\"清空聊天记录\" onClick={() => { void handleClear() }}>\n 🗑️\n </button>\n </div>\n <span className={css.meta}>{tt('assistant.hint')}</span>\n {notice !== '' && <span style={{ color: 'var(--nf-success)', fontSize: 12 }}>{notice}</span>}\n {error !== '' && <span style={{ color: 'var(--nf-error)', fontSize: 12 }}>{tt('common.error')}: {error}</span>}\n {/* 状态条:编辑老师正在做什么 */}\n <div className={`${css.assistantStatus} ${busy ? css.assistantStatusBusy : ''}`}>\n {busy\n ? `🤖 编辑老师 · ${activeTool !== null ? `正在「${TOOL_LABELS[activeTool.name]?.label ?? activeTool.name}」` : `正在思考…(已 ${thinkSeconds}s)`}`\n : '💬 编辑老师 · 等你开口'}\n </div>\n <div\n ref={scrollRef}\n className={css.chatScroll}\n >\n {lines.length === 0 && <span className={css.meta}>{tt('assistant.empty')}</span>}\n {lines.map(line => (\n <div key={line.id} className={line.role === 'user' ? css.chatBubbleUser : css.chatBubbleAssistant}>\n {line.role === 'user' && <div className={css.chatRole}>你</div>}\n {line.text !== '' && <div style={{ whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>{line.text}</div>}\n {line.live !== undefined && line.live !== '' && (\n <div className={css.toolLive}>{line.live}</div>\n )}\n {/* 步骤卡片 */}\n {line.tools.length > 0 && (\n <div className={css.toolSteps}>\n {line.tools.map((tool, i) => {\n const meta = TOOL_LABELS[tool.name] ?? { icon: '⚙️', label: tool.name }\n return (\n <div\n key={i}\n className={`${css.toolStep} ${tool.status === 'error' ? css.toolStepError : tool.status === 'start' ? css.toolStepActive : ''}`}\n >\n <span className={css.toolStepIcon}>{meta.icon}</span>\n <span className={css.toolStepName}>{meta.label}</span>\n <span className={css.toolStepStatus}>\n {tool.status === 'start'\n ? '⏳ 进行中'\n : tool.status === 'done'\n ? `✓ ${tool.elapsedMs !== undefined ? `${(tool.elapsedMs / 1000).toFixed(1)}s` : ''}`\n : '✗ 失败'}\n </span>\n {tool.status === 'error' && tool.detail !== undefined && (\n <span className={css.toolStepDetail}>{tool.detail}</span>\n )}\n </div>\n )\n })}\n </div>\n )}\n </div>\n ))}\n {busy && <span className={css.meta} style={{ color: 'var(--nf-accent)' }}>…</span>}\n </div>\n <div className={css.row} style={{ marginTop: 8 }}>\n <textarea\n className={css.textarea}\n style={{ minHeight: 64, flex: 1 }}\n placeholder={tt('assistant.placeholder')}\n value={input}\n onChange={e => { setInput(e.target.value) }}\n onKeyDown={e => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n void handleSend()\n }\n }}\n />\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy || input.trim() === ''} onClick={() => { void handleSend() }}>\n {tt('assistant.send')}\n </button>\n </div>\n </div>\n )\n}\n","/**\n * 写作资产页签:题材基底库 / 推进模式库 / 反 AI 规则 / 写法引擎。\n * 学习自 AI-Novel-Writing-Assistant 的四大资产模块,注入到生成与审稿提示词中。\n */\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport { tt } from './helpers.ts'\nimport type { AntiAiRule, AssetsResponse, GenreNode, ProgressionMode, StyleAsset, StyleTemplate } from '../../protocol.ts'\nimport css from './panel.module.css'\n\n/** Props. */\nexport interface AssetsTabProps {\n api: NovelApi\n /** 初始子页(左侧导航直达对应资产分类)。 */\n initialTab?: AssetSubTab\n}\n\n/** 渲染题材树(带勾选当前题材)。 */\nfunction GenreTree({ node, selected, onSelect }: { node: GenreNode; selected: string; onSelect: (node: GenreNode) => void }) {\n return (\n <div>\n <label style={{ display: 'flex', alignItems: 'flex-start', gap: 6, cursor: 'pointer' }}>\n <input type=\"radio\" name=\"genre\" checked={selected === node.name} onChange={() => { onSelect(node) }} />\n <span>\n <b>{node.name}</b>\n {node.description !== '' && (\n <span\n className={`${css.meta} ${css.genreDesc}`}\n title={node.description}\n >\n — {node.description}\n </span>\n )}\n </span>\n </label>\n {node.children.length > 0 && (\n <div style={{ marginLeft: 22, display: 'flex', flexDirection: 'column', gap: 4 }}>\n {node.children.map(child => (\n <GenreTree key={child.name} node={child} selected={selected} onSelect={onSelect} />\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/** 写作资产子页签。 */\ntype AssetSubTab = 'genre' | 'progression' | 'templates' | 'rules' | 'style'\n\n/** 子页签定义。 */\nconst SUB_TABS: ReadonlyArray<{ id: AssetSubTab; label: string }> = [\n { id: 'genre', label: '题材基底' },\n { id: 'progression', label: '推进模式' },\n { id: 'templates', label: '笔法帖' },\n { id: 'rules', label: '文戒' },\n { id: 'style', label: '心法' },\n]\n\n/** 写作资产页签。 */\nexport function AssetsTab({ api, initialTab = 'genre' }: AssetsTabProps) {\n const [assetTab, setAssetTab] = useState<AssetSubTab>(initialTab)\n const [data, setData] = useState<AssetsResponse | null>(null)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const [notice, setNotice] = useState('')\n const [sampleText, setSampleText] = useState('')\n const [styleName, setStyleName] = useState('')\n const [newRule, setNewRule] = useState('')\n const [newProgression, setNewProgression] = useState('')\n /** 正在行内编辑的自定义反 AI 规则(下标 + 草稿字段)。 */\n const [editingRule, setEditingRule] = useState<{ index: number; name: string; avoid: string; fix: string } | null>(null)\n const loadId = useRef(0)\n\n /** Load assets (or reset from a new call). */\n const refresh = useCallback(async () => {\n try {\n const result = await api.assets()\n setData(result)\n } catch (err) {\n setError((err as Error).message)\n }\n }, [api])\n\n useEffect(() => {\n void refresh()\n }, [refresh])\n\n /** Patch assets and refresh. */\n const patch = async (patch: Parameters<NovelApi['patchAssets']>[0]): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.patchAssets(patch)\n setData(result)\n setNotice('已保存')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 提取写法资产。 */\n const handleExtractStyle = async (): Promise<void> => {\n if (sampleText.trim().length < 50) {\n setError(tt('settings.exported') === '' ? '样本文本过短' : '样本文本过短(<50 字符)')\n return\n }\n setBusy(true)\n setError('')\n try {\n const result = await api.styleEngine({ sampleText, name: styleName })\n setData(prev => prev === null ? prev : {\n ...prev,\n projectAssets: {\n ...prev.projectAssets,\n styleAssets: [...(prev.projectAssets.styleAssets ?? []), result.styleAsset],\n updatedAt: new Date().toISOString(),\n },\n })\n setNotice(`写法资产「${result.styleAsset.name}」已提取并绑定`)\n setSampleText('')\n setStyleName('')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 添加自定义反 AI 规则(一行 \"名称:要避免的\" 简单格式由用户填写 JSON)。 */\n const handleAddRule = async (): Promise<void> => {\n const text = newRule.trim()\n if (text === '') return\n let rule: AntiAiRule\n try {\n const parsed = JSON.parse(text) as AntiAiRule\n rule = { name: parsed.name ?? '自定义规则', avoid: parsed.avoid ?? '', fix: parsed.fix ?? '' }\n } catch {\n // Fallback: treat as \"避免什么\" text.\n rule = { name: `自定义规则 ${(data?.projectAssets.antiAiRules ?? []).length + 1}`, avoid: text, fix: '' }\n }\n if (rule.avoid === '' && rule.fix === '') return\n const next = [...(data?.projectAssets.antiAiRules ?? []), rule]\n await patch({ antiAiRules: next })\n setNewRule('')\n }\n\n /** 保存行内编辑的自定义规则。 */\n const handleSaveRuleEdit = async (): Promise<void> => {\n if (editingRule === null) return\n const rules = [...(data?.projectAssets.antiAiRules ?? [])]\n if (editingRule.index < 0 || editingRule.index >= rules.length) return\n const name = editingRule.name.trim() || rules[editingRule.index]!.name\n if (editingRule.avoid.trim() === '' && editingRule.fix.trim() === '') return\n rules[editingRule.index] = { name, avoid: editingRule.avoid.trim(), fix: editingRule.fix.trim() }\n await patch({ antiAiRules: rules })\n setEditingRule(null)\n }\n\n /** 删除一条自定义规则。 */\n const handleRemoveRule = async (index: number): Promise<void> => {\n const rules = [...(data?.projectAssets.antiAiRules ?? [])]\n rules.splice(index, 1)\n setEditingRule(null)\n await patch({ antiAiRules: rules })\n }\n\n /** 把内置规则复制为自定义副本(同名覆盖生效),并打开行内编辑。 */\n const handleOverrideBuiltin = (rule: AntiAiRule): void => {\n const rules = data?.projectAssets.antiAiRules ?? []\n const existing = rules.findIndex(r => r.name === rule.name)\n if (existing >= 0) {\n setEditingRule({ index: existing, name: rules[existing]!.name, avoid: rules[existing]!.avoid, fix: rules[existing]!.fix ?? '' })\n } else {\n const next = [...rules, { ...rule, fix: rule.fix ?? '' }]\n setEditingRule({ index: next.length - 1, name: rule.name, avoid: rule.avoid, fix: rule.fix ?? '' })\n void patch({ antiAiRules: next })\n }\n }\n\n /** 设置题材。 */\n const handleSelectGenre = (node: GenreNode): void => {\n void patch({ genre: node })\n }\n\n /** 添加推进模式(从内置库选择)。 */\n const handleAddProgression = async (mode: ProgressionMode): Promise<void> => {\n const current = data?.projectAssets\n const isPrimary = (data?.projectAssets.primaryProgression ?? undefined) === undefined\n if (isPrimary) {\n await patch({ primaryProgression: { ...mode, primary: true } })\n } else {\n await patch({ auxiliaryProgressions: [...(current?.auxiliaryProgressions ?? []), { ...mode, primary: false }] })\n }\n }\n\n if (data === null) {\n return <div className={css.card}><span className={css.meta}>{tt('common.loading')}</span></div>\n }\n\n const assets = data.projectAssets\n const builtinRules = data.antiAiLibrary\n const customRules = assets.antiAiRules ?? []\n const genreLibrary = data.genreLibrary\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12, flex: 1, minHeight: 0 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle} style={{ fontSize: 17, fontWeight: 700 }}>🧰 创作资产</span>\n <span className={css.meta}>题材基底 / 推进模式 / 笔法帖 / 文戒 / 心法</span>\n </div>\n {error !== '' && <div className={css.card} style={{ borderColor: 'var(--nf-error)' }}><span style={{ color: 'var(--nf-error)' }}>{tt('common.error')}: {error}</span></div>}\n {notice !== '' && <div className={css.card}><span style={{ color: 'var(--nf-success)' }}>{notice}</span></div>}\n\n {/* 资产状态总览(参照 AI-Novel-Writing-Assistant 状态网格) */}\n <div className={css.assetGrid}>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>当前题材</span>\n <span className={css.assetStatValue}>{assets.genre?.name ?? '未设置'}</span>\n {assets.genre !== undefined && <span className={css.assetStatDetail} title={assets.genre.description}>{assets.genre.description}</span>}\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>主推进模式</span>\n <span className={css.assetStatValue}>{assets.primaryProgression?.name ?? '未设置'}</span>\n {assets.primaryProgression !== undefined && <span className={css.assetStatDetail} title={assets.primaryProgression.driver}>{assets.primaryProgression.driver}</span>}\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>已绑定写法</span>\n <span className={css.assetStatValue}>{assets.styleAssets?.length ?? 0} 套</span>\n <span className={css.assetStatDetail} title={(assets.styleAssets ?? []).map(s => s.name).join('、')}>\n {(assets.styleAssets ?? []).map(s => s.name).join('、') || '未绑定(可在「笔法帖」一键选用)'}\n </span>\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>文戒</span>\n <span className={css.assetStatValue}>{builtinRules.length} 内置 + {(assets.antiAiRules ?? []).length} 自定义</span>\n <span className={css.assetStatDetail}>全部生效于生成与审稿提示词</span>\n </div>\n </div>\n\n {/* 子页签:题材基底 / 推进模式 / 笔法帖 / 文戒 / 心法 */}\n <div className={css.row} style={{ flexWrap: 'wrap', gap: 6 }}>\n {SUB_TABS.map(t => (\n <button\n key={t.id}\n type=\"button\"\n className={`${css.button} ${assetTab === t.id ? css.buttonPrimary : ''}`}\n style={{ fontSize: 14, flex: 1 }}\n onClick={() => { setAssetTab(t.id) }}\n >\n {t.label}\n </button>\n ))}\n </div>\n\n {/* 题材基底库 */}\n {assetTab === 'genre' && (\n <div className={css.card}>\n <span className={css.cardTitle}>题材基底库</span>\n <span className={css.meta}>这本书属于哪个阅读市场?题材定位会注入章节生成与审稿提示词。</span>\n {assets.genre !== undefined && (\n <div style={{ border: '1px solid var(--nf-border)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <b>当前题材:{assets.genre.name}</b> — {assets.genre.description}\n </div>\n )}\n {/* 题材基底库:自然展开,不套内部滚动条(描述两行截断,悬停看全文) */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {genreLibrary.map(root => <GenreTree key={root.name} node={root} selected={assets.genre?.name ?? ''} onSelect={handleSelectGenre} />)}\n </div>\n </div>\n )}\n\n {/* 推进模式库 */}\n {assetTab === 'progression' && (\n <div className={css.card} style={{ flex: 1, minHeight: 0 }}>\n <span className={css.cardTitle}>推进模式库</span>\n <span className={css.meta}>读者为什么继续看下一章?主模式 + 辅助模式注入卷规划与章节生成。</span>\n {assets.primaryProgression !== undefined && (\n <div style={{ border: '1px solid var(--nf-accent)', borderRadius: 6, padding: '6px 10px', fontSize: 12, color: 'var(--nf-accent)' }}>\n <b>主推进:{assets.primaryProgression.name}</b> — {assets.primaryProgression.driver}\n </div>\n )}\n {assets.auxiliaryProgressions.map(mode => (\n <div key={mode.name} style={{ border: '1px solid var(--nf-border)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <b>{mode.name}</b> — {mode.driver}\n </div>\n ))}\n <span className={css.meta}>从内置推进模式库选择添加(第一个设为主推进):</span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, flex: 1, minHeight: 0, overflowY: 'auto' }}>\n {data.progressionLibrary.map(mode => {\n const alreadyPrimary = assets.primaryProgression?.name === mode.name\n const alreadyAux = assets.auxiliaryProgressions.some(m => m.name === mode.name)\n if (alreadyPrimary || alreadyAux) return null\n return (\n <button key={mode.name} className={css.button} disabled={busy} onClick={() => { void handleAddProgression(mode) }}>\n + {assets.primaryProgression === undefined ? `主推进:` : '辅助:'}{mode.name} — {mode.driver.slice(0, 40)}…\n </button>\n )\n })}\n </div>\n </div>\n )}\n\n {/* 笔法帖(一键绑定) */}\n {assetTab === 'templates' && (\n <div className={css.card} style={{ flex: 1, minHeight: 0 }}>\n <span className={css.cardTitle}>笔法帖</span>\n <span className={css.meta}>从内置 8 套叙事风格模板中一键选用(来自 AI-Novel-Writing-Assistant 写法引擎),无需样本文本;绑定后生成与润色都遵循该风格。</span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, flex: 1, minHeight: 0, overflowY: 'auto' }}>\n {data.styleTemplates.map(template => {\n const bound = assets.styleAssets.some(s => s.name === template.name)\n return (\n <div key={template.key} style={{ border: `1px solid ${bound ? 'var(--nf-accent)' : 'var(--nf-border)'}`, borderRadius: 6, padding: '8px 10px', fontSize: 12 }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>\n <span><b>{template.name}</b> <span className={css.badge} style={{ borderColor: 'var(--nf-text-3)', color: 'var(--nf-text-3)' }}>{template.category}</span></span>\n <button\n className={`${css.button} ${css.buttonSmall} ${bound ? '' : css.buttonPrimary}`}\n disabled={busy || bound}\n onClick={() => {\n const styleAsset: StyleAsset = {\n name: template.name,\n proseRules: [...template.proseRules, ...template.rhythmRules.map(r => `节奏:${r}`)],\n dialogueRules: template.dialogueRules,\n descriptionRules: template.languageRules,\n boundaries: [`模板「${template.name}」适用题材:${template.applicableGenres.join('、')}`, '不要违背模板的叙事单元结构与节奏约束'],\n createdAt: new Date().toISOString(),\n }\n void patch({ styleAssets: [...(data.projectAssets.styleAssets ?? []), styleAsset] })\n }}\n >\n {bound ? '✓ 已绑定' : '+ 绑定'}\n </button>\n </div>\n <div className={css.meta}>{template.description}</div>\n <div className={css.meta}>叙述:{template.proseRules.slice(0, 2).join(';')}</div>\n <div className={css.meta}>台词:{template.dialogueRules.slice(0, 1).join(';')}</div>\n </div>\n )\n })}\n </div>\n </div>\n )}\n\n {/* 文戒 */}\n {assetTab === 'rules' && (\n <div className={css.card} style={{ flex: 1, minHeight: 0 }}>\n <span className={css.cardTitle}>文戒</span>\n <span className={css.meta}>写作时必须遵守的表达边界(内置全局 + 项目自定义),生成与审稿都会检查。内置规则可用「覆盖编辑」复制为自定义版本调整。</span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, flex: 1, minHeight: 0, overflowY: 'auto' }}>\n {builtinRules.map(rule => {\n const overridden = customRules.some(r => r.name === rule.name)\n return (\n <div key={rule.name} style={{ border: '1px solid var(--nf-border)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>\n <span>\n <b>{rule.name}</b>{' '}\n <span className={css.badge} style={{ borderColor: overridden ? 'var(--nf-accent)' : 'var(--nf-text-3)', color: overridden ? 'var(--nf-accent)' : 'var(--nf-text-3)' }}>\n {overridden ? '自定义覆盖中' : '内置'}\n </span>\n </span>\n <button className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { handleOverrideBuiltin(rule) }}>\n {overridden ? '✎ 编辑覆盖' : '+ 覆盖编辑'}\n </button>\n </div>\n <div className={css.meta}>避免:{rule.avoid}</div>\n <div className={css.meta}>修正:{rule.fix}</div>\n </div>\n )\n })}\n {customRules.map((rule, index) => (\n <div key={`${rule.name}-${index}`} style={{ border: '1px solid var(--nf-accent)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>\n <span>\n <b>{rule.name}</b>{' '}\n <span className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)' }}>自定义</span>\n </span>\n <span style={{ display: 'flex', gap: 6 }}>\n <button className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { setEditingRule({ index, name: rule.name, avoid: rule.avoid, fix: rule.fix ?? '' }) }}>\n 编辑\n </button>\n <button className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void handleRemoveRule(index) }}>\n 删除\n </button>\n </span>\n </div>\n {editingRule !== null && editingRule.index === index ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, marginTop: 6 }}>\n <input className={css.input} placeholder=\"规则名\" value={editingRule.name} onChange={e => { setEditingRule({ ...editingRule, name: e.target.value }) }} />\n <input className={css.input} placeholder=\"避免(要杜绝的表达)\" value={editingRule.avoid} onChange={e => { setEditingRule({ ...editingRule, avoid: e.target.value }) }} />\n <input className={css.input} placeholder=\"修正(改写方向,可留空)\" value={editingRule.fix} onChange={e => { setEditingRule({ ...editingRule, fix: e.target.value }) }} />\n <div className={css.row}>\n <button className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy || (editingRule.avoid.trim() === '' && editingRule.fix.trim() === '')} onClick={() => { void handleSaveRuleEdit() }}>\n 保存\n </button>\n <button className={`${css.button} ${css.buttonSmall}`} onClick={() => { setEditingRule(null) }}>\n 取消\n </button>\n </div>\n </div>\n ) : (\n <>\n <div className={css.meta}>避免:{rule.avoid}</div>\n {rule.fix !== '' && <div className={css.meta}>修正:{rule.fix}</div>}\n </>\n )}\n </div>\n ))}\n </div>\n <div className={css.row}>\n <input\n className={css.input}\n style={{ flex: 1 }}\n placeholder='新增规则(格式:{\"name\":\"规则名\",\"avoid\":\"要避免的\",\"fix\":\"修正方向\"};或直接填要避免的问题)'\n value={newRule}\n onChange={e => { setNewRule(e.target.value) }}\n />\n <button className={`${css.button} ${css.buttonPrimary}`} disabled={busy || newRule.trim() === ''} onClick={() => { void handleAddRule() }}>+ 添加</button>\n </div>\n </div>\n )}\n\n {/* 心法(自定义写法引擎) */}\n {assetTab === 'style' && (\n <div className={css.card}>\n <span className={css.cardTitle}>心法</span>\n <span className={css.meta}>粘贴一段你喜欢的样本文本,AI 提取叙事风格规则并绑定到本书,后续章节保持同一味道。</span>\n {assets.styleAssets.map(style => (\n <div key={style.name} style={{ border: '1px solid var(--nf-border)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <b>{style.name}</b>\n <div className={css.meta}>叙述:{style.proseRules.slice(0, 3).join(';')}</div>\n {style.dialogueRules.length > 0 && <div className={css.meta}>台词:{style.dialogueRules.slice(0, 2).join(';')}</div>}\n </div>\n ))}\n <textarea\n className={css.textarea}\n style={{ minHeight: 90 }}\n placeholder=\"粘贴样本文本(一段能代表目标风格的文字,50 字以上)…\"\n value={sampleText}\n onChange={e => { setSampleText(e.target.value) }}\n />\n <div className={css.row}>\n <input\n className={css.input}\n style={{ flex: 1 }}\n placeholder=\"写法资产名(可选)\"\n value={styleName}\n onChange={e => { setStyleName(e.target.value) }}\n />\n <button className={`${css.button} ${css.buttonPrimary}`} disabled={busy || sampleText.trim().length < 50} onClick={() => { void handleExtractStyle() }}>\n 提取并绑定\n </button>\n </div>\n </div>\n )}\n </div>\n )\n}\n","/**\n * 书架首页视图:书卡网格(封面/书名/简介/进度)+ 搜索筛选 + 开书入口。\n * 进入小说工坊默认展示;点击书卡进入该书工作台,+ 进入开书向导页。\n */\nimport { useEffect, useMemo, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport type { BookshelfSnapshot } from '../../protocol.ts'\nimport css from './panel.module.css'\n\n/** 相对时间(人性化:刚刚 / N 分钟前 / N 小时前 / N 天前 / 日期)。 */\nfunction relativeTime(iso: string): string {\n const t = new Date(iso).getTime()\n if (!Number.isFinite(t)) return '—'\n const diff = Date.now() - t\n if (diff < 60_000) return '刚刚'\n if (diff < 3_600_000) return `${Math.floor(diff / 60_000)} 分钟前`\n if (diff < 86_400_000) return `${Math.floor(diff / 3_600_000)} 小时前`\n if (diff < 7 * 86_400_000) return `${Math.floor(diff / 86_400_000)} 天前`\n return new Date(t).toLocaleDateString('zh-CN', { month: 'numeric', day: 'numeric' })\n}\n\n/** 一本书的状态标签。 */\nfunction bookStatus(book: BookshelfSnapshot['books'][number]): 'none' | 'done' | 'active' {\n if (!book.hasProject) return 'none'\n return book.total > 0 && book.done >= book.total ? 'done' : 'active'\n}\n\n/** 一张书卡(封面懒加载)。 */\nfunction BookCard({\n api,\n book,\n active,\n onOpen,\n onRead,\n}: {\n api: NovelApi\n book: BookshelfSnapshot['books'][number]\n active: boolean\n onOpen: () => void\n onRead: () => void\n}) {\n const [cover, setCover] = useState<string | null>(null)\n\n useEffect(() => {\n if (!book.hasCover) return\n let cancelled = false\n void api.coverGet(book.outputDir).then(result => {\n if (!cancelled) setCover(result.dataUrl)\n }).catch(() => { /* best-effort */ })\n return () => { cancelled = true }\n }, [api, book.hasCover, book.outputDir])\n\n const ratio = book.total > 0 ? Math.min(book.done / book.total, 1) : 0\n const status = bookStatus(book)\n const statusLabel = status === 'none' ? '未开书' : status === 'done' ? '已完结' : '进行中'\n\n return (\n <div\n className={`${css.bookCard} ${active ? css.bookCardActive : ''}`}\n onClick={onOpen}\n title={`打开《${book.bookName}》`}\n >\n <div className={css.bookCardCover}>\n {cover !== null ? (\n <img src={cover} alt={`《${book.bookName}》封面`} />\n ) : (\n <div className={css.bookCardCoverFallback}>\n <span className={css.bookCardCoverTitle}>{book.bookName.slice(0, 4)}</span>\n <span className={css.meta}>暂无封面</span>\n </div>\n )}\n </div>\n <div className={css.bookCardBody}>\n <div className={css.bookCardTitleRow}>\n <span className={css.bookCardName}>{book.bookName}</span>\n <span className={`${css.badge} ${status === 'none' ? css.badgePending : status === 'done' ? css.badgeDone : css.badgeWritten}`}>\n {statusLabel}\n </span>\n </div>\n <span className={`${css.meta} ${css.bookCardBlurb}`} title={book.blurb ?? ''}>\n {book.blurb !== undefined && book.blurb !== '' ? book.blurb : '暂无简介'}\n </span>\n <div className={css.bookCardProgressBar}>\n <div className={css.bookCardProgressFill} style={{ width: `${Math.round(ratio * 100)}%` }} />\n </div>\n <div className={css.bookCardMetaRow}>\n <span className={css.meta}>{book.total > 0 ? `已完成 ${book.done} / ${book.total} 章` : '尚未规划章节'}</span>\n {book.hasProject && <span className={css.meta} title=\"最近活动时间\">更新于 {relativeTime(book.updatedAt)}</span>}\n </div>\n <div className={css.bookCardActions} onClick={e => { e.stopPropagation() }}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n onClick={onOpen}\n title=\"进入创作工作台(大纲/章节/审稿/设定)\"\n >\n 📝 进入工作台\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={!book.hasProject || book.done === 0}\n onClick={onRead}\n title={book.hasProject && book.done > 0 ? '沉浸式阅读已写章节' : '尚无已写章节,先去工作台创作'}\n >\n 📖 阅读\n </button>\n </div>\n </div>\n </div>\n )\n}\n\n/** 书架首页。 */\nexport function ShelfView({\n api,\n shelf,\n onOpenBook,\n onReadBook,\n onAddBook,\n}: {\n api: NovelApi\n shelf: BookshelfSnapshot\n /** 点击书卡:激活该书并进入工作台。 */\n onOpenBook: (id: string) => void\n /** 点击「阅读」:激活该书并进入沉浸式阅读页。 */\n onReadBook: (id: string) => void\n /** 点击+:进入开书向导页。 */\n onAddBook: () => void\n}) {\n const [query, setQuery] = useState('')\n /** 筛选:all=全部 / active=进行中 / done=已完结 / none=未开书。 */\n const [filter, setFilter] = useState<'all' | 'active' | 'done' | 'none'>('all')\n\n const stats = useMemo(() => {\n let active = 0, done = 0, none = 0\n for (const b of shelf.books) {\n const s = bookStatus(b)\n if (s === 'none') none++\n else if (s === 'done') done++\n else active++\n }\n return { active, done, none }\n }, [shelf.books])\n\n const visible = useMemo(() => {\n const q = query.trim().toLowerCase()\n return shelf.books.filter(b => {\n if (filter !== 'all' && bookStatus(b) !== filter) return false\n if (q === '') return true\n return b.bookName.toLowerCase().includes(q) || (b.blurb ?? '').toLowerCase().includes(q)\n })\n }, [shelf.books, query, filter])\n\n const filters: Array<{ id: 'all' | 'active' | 'done' | 'none'; label: string; count: number }> = [\n { id: 'all', label: '全部', count: shelf.books.length },\n { id: 'active', label: '进行中', count: stats.active },\n { id: 'done', label: '已完结', count: stats.done },\n { id: 'none', label: '未开书', count: stats.none },\n ]\n\n return (\n <div className={css.shelfView}>\n <div className={css.shelfHeader}>\n <div className={css.shelfTitleRow}>\n <h2 className={css.panelTitle} style={{ margin: 0 }}>📚 书架</h2>\n {shelf.books.length > 0 && (\n <span className={css.meta}>\n {shelf.books.length} 本书 · {stats.active} 进行中 · {stats.done} 已完结 · {stats.none} 未开书\n </span>\n )}\n </div>\n <div className={css.shelfToolbar}>\n <input\n className={`${css.input} ${css.shelfSearch}`}\n type=\"search\"\n placeholder=\"🔍 搜索书名 / 简介…\"\n value={query}\n onChange={e => { setQuery(e.target.value) }}\n />\n </div>\n <div className={css.shelfFilters} style={{ display: 'flex', gap: 6, flexWrap: 'wrap' }}>\n {filters.map(f => (\n <button\n key={f.id}\n type=\"button\"\n className={`${css.button} ${filter === f.id ? css.buttonPrimary : ''}`}\n style={{ fontSize: 14, flex: 1 }}\n onClick={() => { setFilter(f.id) }}\n >\n {f.label}{f.count > 0 ? `(${f.count})` : ''}\n </button>\n ))}\n </div>\n </div>\n\n {shelf.books.length === 0 ? (\n /* 空书架引导卡 */\n <div className={css.shelfEmpty}>\n <span className={css.shelfEmptyIcon}>📖</span>\n <span className={css.shelfEmptyTitle}>你的创作从这里开始</span>\n <span className={css.meta}>开一本书:粘贴大纲或导入 docx,书名自动识别,开书即建项目</span>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} onClick={onAddBook}>\n + 开第一本书\n </button>\n </div>\n ) : visible.length === 0 ? (\n <div className={css.shelfEmpty} style={{ minHeight: 160 }}>\n <span className={css.shelfEmptyIcon}>🔍</span>\n <span className={css.shelfEmptyTitle}>没有符合条件的书</span>\n <span className={css.meta}>换个关键词或筛选条件试试</span>\n </div>\n ) : (\n <div className={css.shelfGrid}>\n {visible.map(book => (\n <BookCard\n key={book.id}\n api={api}\n book={book}\n active={book.id === shelf.activeBookId}\n onOpen={() => { onOpenBook(book.id) }}\n onRead={() => { onReadBook(book.id) }}\n />\n ))}\n\n {/* 开书入口:进入独立向导页 */}\n <div className={`${css.bookCard} ${css.bookAddCard}`} onClick={onAddBook}>\n <div className={css.bookAddIcon}>+</div>\n <span>开一本新书</span>\n <span className={css.meta}>书名 + 大纲,开书即建项目</span>\n </div>\n </div>\n )}\n </div>\n )\n}\n","/**\n * 阅读页:沉浸式章节阅读(纯只读,零 LLM 消耗)。\n * 布局:顶部工具栏 + 左侧可折叠目录栏(按卷分组)+ 阅读区。\n * 轻量渲染:去掉 md 首行标题,按行分段;字号/主题/阅读进度 localStorage 记忆。\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport type { ProjectState, ChapterPlan } from '../../protocol.ts'\nimport css from './panel.module.css'\n\nconst FONT_SIZES = [\n { id: 'sm', px: 15, label: 'A-' },\n { id: 'md', px: 17, label: 'A' },\n { id: 'lg', px: 20, label: 'A+' },\n] as const\n\nconst THEMES = [\n { id: 'paper', label: '📄 纸白', bg: '#f7f1e3', fg: '#3b3226', accent: '#8b6f47', dim: '#8a7d66' },\n { id: 'eye', label: '🌿 护眼', bg: '#e8f0e3', fg: '#2f3d2e', accent: '#5f7d5a', dim: '#6f836b' },\n { id: 'night', label: '🌙 夜间', bg: '#1d2226', fg: '#c9d1d9', accent: '#8aa5c0', dim: '#6d7882' },\n] as const\n\ntype FontId = typeof FONT_SIZES[number]['id']\ntype ThemeId = typeof THEMES[number]['id']\n\nfunction readPref<T>(key: string, fallback: T): T {\n try {\n const raw = window.localStorage.getItem(key)\n if (raw !== null) return JSON.parse(raw) as T\n } catch { /* ignore */ }\n return fallback\n}\n\nfunction writePref(key: string, value: unknown): void {\n try { window.localStorage.setItem(key, JSON.stringify(value)) } catch { /* ignore */ }\n}\n\n/** 章节状态小标(阅读视角)。 */\nfunction statusBadge(ch: ChapterPlan): { label: string; cls: string } {\n switch (ch.status) {\n case 'approved': return { label: '✅', cls: css.badgeDone }\n case 'written': return { label: '📝', cls: css.badgeWritten }\n case 'rejected': return { label: '⚠️', cls: css.badgePending }\n default: return { label: '', cls: css.badgePending }\n }\n}\n\n/** 目录分组:按卷区间过滤可读章节;卷外章节归入「未分卷」。 */\nfunction buildGroups(project: ProjectState, readable: ChapterPlan[]): Array<{ title: string; no: number; chapters: ChapterPlan[] }> {\n const vols = project.volumes ?? []\n if (vols.length === 0) return [{ title: '全部章节', no: 0, chapters: readable }]\n const groups: Array<{ title: string; no: number; chapters: ChapterPlan[] }> = []\n for (const v of vols) {\n const inVol = readable.filter(c => c.no >= v.chapterStart && c.no <= v.chapterEnd)\n if (inVol.length > 0) groups.push({ title: `第${v.no}卷 ${v.title}`, no: v.no, chapters: inVol })\n }\n const rest = readable.filter(c => !vols.some(v => c.no >= v.chapterStart && c.no <= v.chapterEnd))\n if (rest.length > 0) groups.push({ title: '未分卷', no: 0, chapters: rest })\n return groups\n}\n\nexport function ReaderView({\n api,\n project,\n onBack,\n onOpenWorkspace,\n}: {\n api: NovelApi\n project: ProjectState\n onBack: () => void\n onOpenWorkspace: () => void\n}) {\n const prefKey = useMemo(() => {\n const id = project.bookName || 'book'\n return `dsh-novel-forge.reader.${id}`\n }, [project.bookName])\n\n /** 可读章节(有正文落盘):approved / written / rejected。 */\n const readable = useMemo(() => project.chapters.filter(c =>\n c.status === 'approved' || c.status === 'written' || c.status === 'rejected',\n ), [project.chapters])\n\n const groups = useMemo(() => buildGroups(project, readable), [project, readable])\n\n const [currentNo, setCurrentNo] = useState<number>(() => {\n const saved = readPref<number | null>(`${prefKey}.no`, null)\n if (saved !== null && readable.some(c => c.no === saved)) return saved\n // 无记忆 → 最后一章已通过\n const lastApproved = [...readable].reverse().find(c => c.status === 'approved')\n return lastApproved?.no ?? readable[0]?.no ?? 0\n })\n const [markdown, setMarkdown] = useState<string>('')\n const [loading, setLoading] = useState(false)\n const [loadError, setLoadError] = useState<string>('')\n const [font, setFont] = useState<FontId>(() => readPref(`${prefKey}.font`, 'md'))\n const [theme, setTheme] = useState<ThemeId>(() => readPref(`${prefKey}.theme`, 'paper'))\n const [navOpen, setNavOpen] = useState<boolean>(() => readPref(`${prefKey}.nav`, true))\n /** 折叠的卷号(点击卷标题切换;记忆在 localStorage)。 */\n const [collapsedVols, setCollapsedVols] = useState<number[]>(() => readPref(`${prefKey}.collapsed`, []))\n const sidebarRef = useRef<HTMLDivElement>(null)\n\n const toggleVol = useCallback((no: number) => {\n setCollapsedVols(prev => {\n const next = prev.includes(no) ? prev.filter(v => v !== no) : [...prev, no]\n writePref(`${prefKey}.collapsed`, next)\n return next\n })\n }, [prefKey])\n\n const current = useMemo(() => project.chapters.find(c => c.no === currentNo), [project.chapters, currentNo])\n const idx = readable.findIndex(c => c.no === currentNo)\n const prevCh = idx > 0 ? readable[idx - 1] : undefined\n const nextCh = idx >= 0 && idx < readable.length - 1 ? readable[idx + 1] : undefined\n\n const load = useCallback(async (no: number) => {\n if (no === 0) return\n setLoading(true)\n setLoadError('')\n try {\n const res = await api.chapter(no)\n setMarkdown(res.markdown)\n setCurrentNo(no)\n writePref(`${prefKey}.no`, no)\n } catch (err) {\n setLoadError((err as Error).message)\n } finally {\n setLoading(false)\n }\n }, [api, prefKey])\n\n // 初始加载\n const initialNo = useRef<number>(0)\n useEffect(() => {\n if (initialNo.current === currentNo && markdown !== '') return\n if (currentNo === 0) return\n initialNo.current = currentNo\n void load(currentNo)\n }, [currentNo, load, markdown])\n\n // 键盘翻章\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return\n if (e.key === 'ArrowLeft' && prevCh !== undefined) void load(prevCh.no)\n if (e.key === 'ArrowRight' && nextCh !== undefined) void load(nextCh.no)\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [prevCh, nextCh, load])\n\n // 当前章滚动到可见(目录栏内)\n useEffect(() => {\n sidebarRef.current?.querySelector<HTMLElement>(`[data-no=\"${currentNo}\"]`)?.scrollIntoView({ block: 'nearest', behavior: 'smooth' })\n }, [currentNo])\n\n const themeMeta = THEMES.find(t => t.id === theme) ?? THEMES[0]\n const fontMeta = FONT_SIZES.find(f => f.id === font) ?? FONT_SIZES[1]\n\n /** 轻量渲染:去标题行、按行分段(网文每行一段)。 */\n const paragraphs = useMemo(() => {\n return markdown\n .split(/\\r?\\n/)\n .map(l => l.replace(/^#{1,6}\\s*/, '').trim())\n .filter(Boolean)\n }, [markdown])\n\n const itemBg = theme === 'night' ? 'rgba(255,255,255,0.03)' : 'rgba(0,0,0,0.025)'\n\n return (\n <div className={css.readerView} style={{ background: themeMeta.bg, color: themeMeta.fg }}>\n {/* 顶部栏 */}\n <div className={css.readerHeader} style={{ borderColor: themeMeta.dim }}>\n <button type=\"button\" className={css.iconButton} title=\"返回书架\" aria-label=\"返回书架\" onClick={onBack}>←</button>\n <span className={css.readerTitle}>📖 《{project.bookName}》</span>\n <span className={css.meta} style={{ color: themeMeta.dim }}>\n {readable.length > 0 && currentNo > 0 ? `第 ${currentNo} 章 · ${idx + 1}/${readable.length}` : ''}\n </span>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${navOpen ? css.buttonPrimary : ''}`}\n style={{ marginLeft: 4 }}\n onClick={() => { setNavOpen(v => { const next = !v; writePref(`${prefKey}.nav`, next); return next }) }}\n title={navOpen ? '收起目录' : '展开目录'}\n >\n ☰ 目录\n </button>\n <div style={{ flex: 1 }} />\n <span className={css.meta} style={{ color: themeMeta.dim }}>字号</span>\n <div className={css.readerSeg}>\n {FONT_SIZES.map(f => (\n <button\n key={f.id}\n type=\"button\"\n className={`${css.readerSegBtn} ${font === f.id ? css.readerSegActive : ''}`}\n style={font === f.id ? { background: themeMeta.accent, color: themeMeta.bg } : undefined}\n onClick={() => { setFont(f.id); writePref(`${prefKey}.font`, f.id) }}\n title={`字号 ${f.label}`}\n >\n {f.label}\n </button>\n ))}\n </div>\n <div className={css.readerSeg} style={{ marginLeft: 8 }}>\n {THEMES.map(t => (\n <button\n key={t.id}\n type=\"button\"\n className={`${css.readerSegBtn} ${theme === t.id ? css.readerSegActive : ''}`}\n style={theme === t.id ? { background: themeMeta.accent, color: themeMeta.bg } : undefined}\n onClick={() => { setTheme(t.id); writePref(`${prefKey}.theme`, t.id) }}\n title={t.label}\n >\n {t.label}\n </button>\n ))}\n </div>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} style={{ marginLeft: 10 }} onClick={onOpenWorkspace} title=\"回到创作工作台\">\n ✏️ 去工作台\n </button>\n </div>\n\n {/* 主体:左目录 + 右阅读区 */}\n <div className={css.readerBody}>\n {navOpen && (\n <aside className={css.readerSidebar} style={{ borderColor: themeMeta.dim, background: theme === 'night' ? 'rgba(0,0,0,0.25)' : 'rgba(255,255,255,0.35)' }} ref={sidebarRef}>\n {groups.length === 0 ? (\n <div className={css.meta} style={{ color: themeMeta.dim, padding: 12 }}>还没有已写章节,先去工作台创作吧</div>\n ) : groups.map(g => {\n const collapsed = collapsedVols.includes(g.no)\n return (\n <div key={g.no} className={css.readerGroup}>\n <button\n type=\"button\"\n className={css.readerGroupTitle}\n style={{ color: themeMeta.accent }}\n onClick={() => { toggleVol(g.no) }}\n title={collapsed ? `展开${g.title}` : `收起${g.title}`}\n >\n <span className={css.readerGroupArrow}>{collapsed ? '▸' : '▾'}</span>\n <span>{g.title}</span>\n <span className={css.readerGroupCount}>{g.chapters.length}</span>\n </button>\n {!collapsed && g.chapters.map(ch => {\n const badge = statusBadge(ch)\n const active = ch.no === currentNo\n return (\n <button\n key={ch.no}\n type=\"button\"\n data-no={ch.no}\n className={`${css.readerItem} ${active ? css.readerItemActive : ''}`}\n style={active ? { background: themeMeta.accent, color: themeMeta.bg, borderColor: themeMeta.accent } : { borderColor: 'transparent', color: themeMeta.fg }}\n onClick={() => { void load(ch.no) }}\n title={`第${ch.no}章 ${ch.title}`}\n >\n <span className={css.readerItemNo}>{ch.no}</span>\n <span className={css.readerItemTitle}>{ch.title}</span>\n {badge.label !== '' && <span className={css.readerItemBadge}>{badge.label}</span>}\n </button>\n )\n })}\n </div>\n )\n })}\n </aside>\n )}\n\n {/* 阅读区 */}\n <div className={css.readerMain} style={{ background: itemBg }}>\n {loadError !== '' ? (\n <div className={css.readerError}>{loadError}</div>\n ) : loading && markdown === '' ? (\n <div className={css.readerLoading}>⏳ 加载中…</div>\n ) : current !== undefined && currentNo > 0 ? (\n <article className={css.readerArticle} style={{ maxWidth: 720 }}>\n <h1 className={css.readerChapterTitle} style={{ color: themeMeta.accent }}>{current.title}</h1>\n <div className={css.readerChapterMeta} style={{ color: themeMeta.dim }}>\n <span>{statusBadge(current).label}</span>\n <span>第 {current.no} 章</span>\n {current.chars !== undefined && <span> · {current.chars.toLocaleString()} 字</span>}\n </div>\n <div className={css.readerText} style={{ fontSize: fontMeta.px, lineHeight: 1.9 }}>\n {paragraphs.map((p, i) => <p key={i} className={css.readerPara}>{p}</p>)}\n </div>\n <div className={css.readerFoot}>\n {prevCh !== undefined && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} style={{ borderColor: themeMeta.dim, color: themeMeta.fg }} onClick={() => { void load(prevCh.no) }} title=\"← 上一章\">\n ← 第{prevCh.no}章\n </button>\n )}\n <span className={css.meta} style={{ color: themeMeta.dim }}>← → 键盘翻章</span>\n {nextCh !== undefined && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} style={{ borderColor: themeMeta.accent, color: themeMeta.accent }} onClick={() => { void load(nextCh.no) }} title=\"下一章 →\">\n 第{nextCh.no}章 →\n </button>\n )}\n </div>\n </article>\n ) : (\n <div className={css.readerLoading}>暂无内容</div>\n )}\n </div>\n </div>\n </div>\n )\n}\n","/**\n * 生产单面板:区间批量生产(计划补足 → 逐章生成 → 被拒分级处理 → 断点续跑)。\n * 与「工作进度」悬浮窗不同:这是标准流水线设备,一键下单、实时进度、日志可查。\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport type { RunState } from '../../protocol.ts'\nimport css from './panel.module.css'\n\nexport function RunPanel({ api, totalChapters }: { api: NovelApi; totalChapters: number }) {\n const [run, setRun] = useState<RunState | null>(null)\n const [startNo, setStartNo] = useState<number>(1)\n const [endNo, setEndNo] = useState<number>(0)\n const [count, setCount] = useState<number>(30)\n const [mode, setMode] = useState<'count' | 'range'>('count')\n const [busy, setBusy] = useState(false)\n const [err, setErr] = useState('')\n const logRef = useRef<HTMLDivElement>(null)\n\n // 默认起点:最后一章 + 1;count 模式终点 = 起点 + count - 1\n useEffect(() => {\n setStartNo(totalChapters + 1)\n setEndNo(totalChapters + 30)\n }, [totalChapters])\n\n const poll = useCallback(async () => {\n try {\n const s = await api.runStatus()\n setRun(s)\n } catch { /* 静默 */ }\n }, [api])\n\n // 运行期间每 5 秒轮询一次状态。\n useEffect(() => {\n void poll()\n const timer = window.setInterval(() => { void poll() }, 5000)\n return () => window.clearInterval(timer)\n }, [poll])\n\n // 日志自动滚底。\n useEffect(() => {\n logRef.current?.scrollTo({ top: logRef.current.scrollHeight })\n }, [run?.log.length])\n\n const effectiveEnd = mode === 'count' ? startNo + count - 1 : endNo\n\n const handleStart = async (): Promise<void> => {\n setBusy(true)\n setErr('')\n try {\n const req = mode === 'count'\n ? { startNo, count }\n : { startNo, endNo }\n const s = await api.runStart(req)\n setRun(s)\n } catch (e) {\n setErr((e as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n const handleControl = async (action: 'pause' | 'resume' | 'stop'): Promise<void> => {\n setBusy(true)\n setErr('')\n try {\n const s = await api.runControl(action)\n if (s !== null) setRun(s)\n } catch (e) {\n setErr((e as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n const statusLabel = useMemo(() => {\n if (run === null) return '未启动'\n return {\n running: '🏭 生产中',\n paused: '⏸ 已暂停',\n done: '✅ 已完成',\n stopped: '⏹ 已停止',\n error: '❌ 异常',\n }[run.status] ?? run.status\n }, [run])\n\n const ratio = run !== null && run.endNo > run.startNo\n ? Math.min(Math.max((run.currentNo - run.startNo) / (run.endNo - run.startNo), 0), 1)\n : 0\n\n return (\n <div className={css.card} style={{ flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column', gap: 10 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>🏭 生产单(标准流水线:计划 → 生成 → 审稿 → 分级处理)</span>\n <span className={`${css.badge} ${run?.status === 'running' ? css.badgeWritten : run?.status === 'done' ? css.badgeDone : css.badgePending}`}>{statusLabel}</span>\n </div>\n\n <div className={css.meta}>\n 一键下生产单:自动补计划 → 逐章生成(完整质量门:生成→摘要+事实→审稿→作者复盘)→ 被拒章分级处理(无 high 豁免 / 有 high 按意见修订+验证 / 两轮不过转待人工)。中断后可从断点继续。\n </div>\n\n {/* 下单区 */}\n <div className={css.row} style={{ flexWrap: 'wrap', gap: 8, alignItems: 'flex-end' }}>\n <div style={{ display: 'flex', gap: 4, alignItems: 'center' }}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${mode === 'count' ? css.buttonPrimary : ''}`}\n onClick={() => { setMode('count') }}\n title=\"从当前末章 +1 起,新增 N 章\"\n >\n 新增 N 章\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${mode === 'range' ? css.buttonPrimary : ''}`}\n onClick={() => { setMode('range') }}\n title=\"指定起止章号区间\"\n >\n 指定区间\n </button>\n </div>\n {mode === 'count' ? (\n <>\n <div className={css.field} style={{ flex: 'none', minWidth: 90 }}>\n <label className={css.fieldLabel}>起始章</label>\n <input className={css.input} type=\"number\" min={1} value={startNo} onChange={e => { setStartNo(Math.max(1, Number(e.target.value) || 1)) }} />\n </div>\n <div className={css.field} style={{ flex: 'none', minWidth: 90 }}>\n <label className={css.fieldLabel}>新增章数</label>\n <input className={css.input} type=\"number\" min={1} max={200} value={count} onChange={e => { setCount(Math.max(1, Math.min(200, Number(e.target.value) || 1))) }} />\n </div>\n </>\n ) : (\n <>\n <div className={css.field} style={{ flex: 'none', minWidth: 90 }}>\n <label className={css.fieldLabel}>起始章</label>\n <input className={css.input} type=\"number\" min={1} value={startNo} onChange={e => { setStartNo(Math.max(1, Number(e.target.value) || 1)) }} />\n </div>\n <div className={css.field} style={{ flex: 'none', minWidth: 90 }}>\n <label className={css.fieldLabel}>结束章</label>\n <input className={css.input} type=\"number\" min={1} value={endNo} onChange={e => { setEndNo(Math.max(1, Number(e.target.value) || 1)) }} />\n </div>\n </>\n )}\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy || (run?.status === 'running')} onClick={() => { void handleStart() }} title=\"启动生产单\">\n {run?.status === 'running' ? '生产中…' : run?.status === 'paused' ? '▶ 继续' : '▶ 下单生产'}\n </button>\n {run !== null && run.status !== 'done' && (\n <>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || run.status !== 'running'} onClick={() => { void handleControl('pause') }}>\n ⏸ 暂停\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || run.status === 'stopped'} onClick={() => { void handleControl('stop') }}>\n ⏹ 停止\n </button>\n </>\n )}\n {run !== null && run.status === 'paused' && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleControl('resume') }}>\n ▶ 继续\n </button>\n )}\n </div>\n\n {err !== '' && <div style={{ color: 'var(--nf-error)', fontSize: 12 }}>{err}</div>}\n\n {/* 进度区 */}\n {run !== null && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n <div className={css.row} style={{ flexWrap: 'wrap', gap: 8 }}>\n <span className={css.meta}>范围:第 {run.startNo} - {run.endNo} 章 · 当前:第 {run.currentNo} 章</span>\n <span className={css.meta}>新生成 {run.stats.generated} · 修订通过 {run.stats.revised} · 豁免 {run.stats.exempted} · 重生成 {run.stats.regenerated} · 失败 {run.stats.error}</span>\n </div>\n <div className={css.bigProgressBar}>\n <div className={css.bigProgressBarFill} style={{ width: `${Math.round(ratio * 100)}%` }} />\n </div>\n {run.pendingManual.length > 0 && (\n <div className={css.meta} style={{ color: 'var(--nf-warn)' }}>\n ⚠️ 待人工:第 {run.pendingManual.join('、')} 章(两轮修订仍不过,保留草稿,可在章节列表处理)\n </div>\n )}\n {run.status === 'done' && <div className={css.meta} style={{ color: 'var(--nf-success)' }}>✅ 生产单完成:{run.startNo}-{run.endNo} 章处理完毕,待人工 {run.pendingManual.length} 章。</div>}\n {run.error !== undefined && <div className={css.meta} style={{ color: 'var(--nf-error)' }}>异常:{run.error}</div>}\n </div>\n )}\n\n {/* 日志区 */}\n <div className={css.meta} style={{ fontWeight: 600 }}>运行日志({run?.log.length ?? 0})</div>\n <div\n ref={logRef}\n style={{ flex: 1, minHeight: 120, overflowY: 'auto', border: '1px solid var(--nf-border)', borderRadius: 10, background: 'var(--nf-bg-inset)', padding: 8, display: 'flex', flexDirection: 'column', gap: 2, fontSize: 12 }}\n >\n {run === null || run.log.length === 0 ? (\n <span className={css.meta}>尚无日志——下单后这里会实时显示每章进度。</span>\n ) : run.log.map((l, i) => (\n <div key={i} style={{ display: 'flex', gap: 6, opacity: 0.85 }}>\n <span style={{ color: 'var(--nf-text-3)', flex: 'none' }}>{new Date(l.at).toLocaleTimeString('zh-CN', { hour12: false })}</span>\n <span>{l.text}</span>\n </div>\n ))}\n </div>\n </div>\n )\n}\n","// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n ], { type: 'text/javascript' }))));\n w.onmessage = function (e) {\n var d = e.data, ed = d.$e$;\n if (ed) {\n var err = new Error(ed[0]);\n err['code'] = ed[1];\n err.stack = ed[2];\n cb(err, null);\n }\n else\n cb(null, d);\n };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new i32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i) {\n if (cd[i])\n ++l[cd[i] - 1];\n }\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 1; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n UnexpectedEOF: 0,\n InvalidBlockType: 1,\n InvalidLengthLiteral: 2,\n InvalidDistance: 3,\n StreamFinished: 4,\n NoStreamHandler: 5,\n InvalidHeader: 6,\n NoCallback: 7,\n InvalidUTF8: 8,\n ExtraFieldTooLong: 9,\n InvalidDate: 10,\n FilenameTooLong: 11,\n StreamFinishing: 12,\n InvalidZipData: 13,\n UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n 'unexpected EOF',\n 'invalid block type',\n 'invalid length/literal',\n 'invalid distance',\n 'stream finished',\n 'no stream handler',\n , // determined by compression function\n 'no callback',\n 'invalid UTF-8 data',\n 'extra field too long',\n 'date not in range 1980-2099',\n 'filename too long',\n 'stream finishing',\n 'invalid zip data'\n // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n // source length dict length\n var sl = dat.length, dl = dict ? dict.length : 0;\n if (!sl || st.f && !st.l)\n return buf || new u8(0);\n var noBuf = !buf;\n // have to estimate size\n var resize = noBuf || st.i != 2;\n // no state\n var noSt = st.i;\n // Assumes roughly 33% compression ratio average\n if (noBuf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n err(0);\n break;\n }\n // ensure size\n if (resize)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8, st.f = final;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n err(1);\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17\n if (resize)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (!c)\n err(2);\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n if (!d)\n err(3);\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (resize)\n cbuf(bt + 131072);\n var end = bt + add;\n if (bt < dt) {\n var shift = dl - dt, dend = Math.min(dt, end);\n if (shift + bt < 0)\n err(3);\n for (; bt < dend; ++bt)\n buf[bt] = dict[shift + bt];\n }\n for (; bt < end; ++bt)\n buf[bt] = buf[bt - dt];\n }\n }\n st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n // don't reallocate for streams or user buffers\n return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return { t: et, l: 0 };\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return { t: v, l: 1 };\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n ++lcfreq[lclt[i] & 31];\n for (var i = 0; i < lcdt.length; ++i)\n ++lcfreq[lcdt[i] & 31];\n var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n var sym = syms[i];\n if (sym > 255) {\n var len = (sym >> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n var dst = sym & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[sym]), p += ll[sym];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n var s = st.z || dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var lst = st.l;\n var pos = (st.r || 0) & 7;\n if (lvl) {\n if (pos)\n w[0] = st.r >> 3;\n var opt = deo[lvl - 1];\n var n = opt >> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new i32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx blkpos\n var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n for (; i + 2 < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = i - dif + j & 32767;\n var pti = prev[ti];\n var cd = ti - pti & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += imod - pimod & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one int32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n for (i = Math.max(i, wi); i < s; ++i) {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n if (!lst) {\n st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n // shft(pos) now 1 less if pos & 7 != 0\n pos -= 7;\n st.h = head, st.p = prev, st.i = i, st.w = wi;\n }\n }\n else {\n for (var i = st.w || 0; i < s + lst; i += 65535) {\n // end\n var e = i + 65535;\n if (e >= s) {\n // write final block\n w[(pos / 8) | 0] = lst;\n e = s;\n }\n pos = wfblk(w, pos + 1, dat.subarray(i, e));\n }\n st.i = s;\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new Int32Array(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && -306674912) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Adler32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length | 0;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n if (!st) {\n st = { l: 1 };\n if (opt.dictionary) {\n var dict = opt.dictionary.subarray(-32768);\n var newDat = new u8(dict.length + dat.length);\n newDat.set(dict);\n newDat.set(dat, dict.length);\n dat = newDat;\n st.w = dict.length;\n }\n }\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k].buffer) {\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n fnStr = wcln(fns[i], fnStr, td_1);\n ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n }\n var td = mrg({}, ch[id].e);\n return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n out: o.size && new u8(o.size),\n dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) {\n if (ev.data[0]) {\n strm.push(ev.data[0], ev.data[1]);\n postMessage([ev.data[0].length]);\n }\n else\n strm.flush(ev.data[1]);\n };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else if (!Array.isArray(dat))\n ext(dat);\n else if (dat.length == 1) {\n strm.queuedSize -= dat[0];\n if (strm.ondrain)\n strm.ondrain(dat[0]);\n }\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.queuedSize = 0;\n strm.push = function (d, f) {\n if (!strm.ondata)\n err(5);\n if (t)\n strm.ondata(err(4, 0, 1), null, !!f);\n strm.queuedSize += d.length;\n // can fail for cross-realm Uint8Array, but ok - only a small performance penalty\n w.postMessage([d, t = f], d.buffer instanceof ArrayBuffer ? [d.buffer] : []);\n };\n strm.terminate = function () { w.terminate(); };\n if (flush) {\n strm.flush = function (sync) { w.postMessage([0, sync]); };\n }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\n// read 8 bytes\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n err(6, 'invalid gzip data');\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += (d[10] | d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n if (o.dictionary) {\n var h = adler();\n h.p(o.dictionary);\n wbytes(c, 2, h.d());\n }\n};\n// zlib start\nvar zls = function (d, dict) {\n if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n err(6, 'invalid zlib data');\n if ((d[1] >> 5 & 1) == +!dict)\n err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n // 98304 = 32768 (lookback) + 65536 (common chunk size)\n this.b = new u8(98304);\n if (this.o.dictionary) {\n var dict = this.o.dictionary.subarray(-32768);\n this.b.set(dict, 32768 - dict.length);\n this.s.i = 32768 - dict.length;\n }\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n var endLen = chunk.length + this.s.z;\n if (endLen > this.b.length) {\n if (endLen > 2 * this.b.length - 32768) {\n var newBuf = new u8(endLen & -32768);\n newBuf.set(this.b.subarray(0, this.s.z));\n this.b = newBuf;\n }\n var split = this.b.length - this.s.z;\n this.b.set(chunk.subarray(0, split), this.s.z);\n this.s.z = this.b.length;\n this.p(this.b, false);\n this.b.set(this.b.subarray(-32768));\n this.b.set(chunk.subarray(split), 32768);\n this.s.z = chunk.length - split + 32768;\n this.s.i = 32766, this.s.w = 32768;\n }\n else {\n this.b.set(chunk, this.s.z);\n this.s.z += chunk.length;\n }\n this.s.l = final & 1;\n if (this.s.z > this.s.w + 8191 || final) {\n this.p(this.b, final || false);\n this.s.w = this.s.i, this.s.i -= 2;\n }\n if (final) {\n // cleanup unneeded buffers/state to reduce memory usage\n this.s = this.o = {};\n this.b = et;\n }\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * deflated output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible. A separate DEFLATE stream may be concatenated\n * with the current output after a sync flush.\n */\n Deflate.prototype.flush = function (sync) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n this.p(this.b, false);\n this.s.w = this.s.i, this.s.i -= 2;\n // could technically skip writing the type-0 block for (this.s.r & 7) == 0,\n // but the deterministic trailer (00 00 FF FF) is useful in some situations\n if (sync) {\n var c = new u8(6);\n c[0] = this.s.r >> 3;\n // write empty, non-final type-0 block\n var ep = wfblk(c, this.s.r, et);\n this.s.r = 0;\n this.ondata(c.subarray(0, ep >> 3), false);\n }\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6, 1);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n function Inflate(opts, cb) {\n // no StrmOpt here to avoid adding to workerizer\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n this.s = { i: 0, b: dict ? dict.length : 0 };\n this.o = new u8(32768);\n this.p = new u8(0);\n if (dict)\n this.o.set(dict);\n }\n Inflate.prototype.e = function (c) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n if (!this.p.length)\n this.p = c;\n else if (c.length) {\n var n = new u8(this.p.length + c.length);\n n.set(this.p), n.set(c, this.p.length), this.p = n;\n }\n };\n Inflate.prototype.c = function (final) {\n this.s.i = +(this.d = final || false);\n var bts = this.s.b;\n var dt = inflt(this.p, this.s, this.o);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n function AsyncInflate(opts, cb) {\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Inflate(ev.data);\n onmessage = astrm(strm);\n }, 7, 0);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\nexport function inflateSync(data, opts) {\n return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n this.l += chunk.length;\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * GZIPped output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Gzip.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8, 1);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n function Gunzip(opts, cb) {\n this.v = 1;\n this.r = 0;\n Inflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n this.r += chunk.length;\n if (this.v) {\n var p = this.p.subarray(this.v - 1);\n var s = p.length > 3 ? gzs(p) : 4;\n if (s > p.length) {\n if (!final)\n return;\n }\n else if (this.v > 1 && this.onmember) {\n this.onmember(this.r - p.length);\n }\n this.p = p.subarray(s), this.v = 0;\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, 0);\n // process concatenated GZIP\n if (this.s.f && !this.s.l) {\n this.v = shft(this.s.p) + 9;\n this.s = { i: 0 };\n this.o = new u8(0);\n this.push(new u8(0), final);\n }\n else if (final) {\n Inflate.prototype.c.call(this, final);\n }\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n function AsyncGunzip(opts, cb) {\n var _this = this;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gunzip(ev.data);\n strm.onmember = function (offset) { return postMessage(offset); };\n onmessage = astrm(strm);\n }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\nexport function gunzipSync(data, opts) {\n var st = gzs(data);\n if (st + 8 > data.length)\n err(6, 'invalid gzip data');\n return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * zlibbed output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Zlib.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10, 1);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n function Unzlib(opts, cb) {\n Inflate.call(this, opts, cb);\n this.v = opts && opts.dictionary ? 2 : 1;\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 6 && !final)\n return;\n this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n err(6, 'invalid zlib data');\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n function AsyncUnzlib(opts, cb) {\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Unzlib(ev.data);\n onmessage = astrm(strm);\n }, 11, 0);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\nexport function unzlibSync(data, opts) {\n return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n function Decompress(opts, cb) {\n this.o = StrmOpt.call(this, opts, cb) || {};\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n }\n // init substream\n // overriden by AsyncDecompress\n Decompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (dat, final) {\n _this.ondata(dat, final);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(this.o)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(this.o)\n : new this.Z(this.o);\n this.i();\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n function AsyncDecompress(opts, cb) {\n Decompress.call(this, opts, cb);\n this.queuedSize = 0;\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n }\n AsyncDecompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (err, dat, final) {\n _this.ondata(err, dat, final);\n };\n this.s.ondrain = function (size) {\n _this.queuedSize -= size;\n if (_this.ondrain)\n _this.ondrain(size);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n this.queuedSize += chunk.length;\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, opts)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, opts)\n : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k, op = o;\n if (Array.isArray(val))\n op = mrg(o, val[1]), val = val[0];\n if (ArrayBuffer.isView(val))\n t[n] = [val, op];\n else {\n t[n += '/'] = [new u8(0), op];\n fltn(val, n, t, o);\n }\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return { s: r, r: slc(d, i - 1) };\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n err(8);\n this.t = null;\n }\n return;\n }\n if (!this.p)\n err(4);\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (final) {\n if (r.length)\n err(8);\n this.p = null;\n }\n else\n this.p = r;\n this.ondata(s, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td) {\n return td.decode(dat);\n }\n else {\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (r.length)\n err(8);\n return s;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), efl = b2(d, b + 30), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl;\n var _a = z64hs(d, es, efl, z, b4(d, b + 20), b4(d, b + 24), b4(d, b + 42)), sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + efl + b2(d, b + 32), off];\n};\n// read zip64 header sizes\nvar z64hs = function (d, b, l, z, sc, su, off) {\n var nsc = sc == 4294967295, nsu = su == 4294967295, noff = off == 4294967295, e = b + l;\n var nf = nsc + nsu + noff;\n if (z && nf) {\n for (; b + 4 < e; b += 4 + b2(d, b + 2)) {\n if (b2(d, b) == 1) {\n return [\n nsc ? b8(d, b + 4 + 8 * nsu) : sc,\n nsu ? b8(d, b + 4) : su,\n noff ? b8(d, b + 4 + 8 * (nsu + nsc)) : off,\n 1\n ];\n }\n }\n // z == 2 for unknown whether or not zip64\n if (z < 2)\n err(13);\n }\n return [sc, su, off, 0];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n err(9);\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n err(10);\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n if (c != -1) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n // we shouldn't really do this cast, but properly handling ArrayBufferLike\n // makes the API unergonomic with Buffer\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this = this;\n if (!this.ondata)\n err(5);\n // finishing or finished\n if (this.d & 2)\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n else {\n var f = strToU8(file.filename), fl_1 = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n var hl_1 = fl_1 + exfl(file.extra) + 30;\n if (fl_1 > 65535)\n this.ondata(err(11, 0, 1), null, false);\n var header = new u8(hl_1);\n wzh(header, 0, file, f, u, -1);\n var chks_1 = [header];\n var pAll_1 = function () {\n for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n var chk = chks_2[_i];\n _this.ondata(null, chk, false);\n }\n chks_1 = [];\n };\n var tr_1 = this.d;\n this.d = 0;\n var ind_1 = this.u.length;\n var uf_1 = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll_1();\n if (tr_1) {\n var nxt = _this.u[ind_1 + 1];\n if (nxt)\n nxt.r();\n else\n _this.d = 1;\n }\n tr_1 = 1;\n }\n });\n var cl_1 = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this.ondata(err, dat, final);\n _this.terminate();\n }\n else {\n cl_1 += dat.length;\n chks_1.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl_1);\n wbytes(dd, 12, file.size);\n chks_1.push(dd);\n uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n if (tr_1)\n uf_1.r();\n tr_1 = 1;\n }\n else if (tr_1)\n pAll_1();\n }\n };\n this.u.push(uf_1);\n }\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this = this;\n if (this.d & 2) {\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n return;\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this.d & 1))\n return;\n _this.u.splice(-1, 1);\n _this.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cbd(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cbd(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl(err(11, 0, 1), null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n err(11);\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (chunk, final) {\n // same as ZipPassThrough: cast to retain Buffer ergonomics\n this.ondata(null, chunk, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this = this;\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (chunk, final) {\n try {\n this.i.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (chunk, final) {\n if (this.i.terminate)\n chunk = slc(chunk, 0);\n this.i.push(chunk, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this = this;\n if (!this.onfile)\n err(5);\n if (!this.p)\n err(4);\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_3 = [];\n this_1.k.unshift(chks_3);\n f = 2;\n var lsc = b4(buf, i + 18), lsu = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n var _a = z64hs(buf, i, es, 2, lsc, lsu, 0), sc_1 = _a[0], su_1 = _a[1], z64 = _a[3];\n if (dd)\n sc_1 = -1 - z64;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n err(5);\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this.o[cmp_1];\n if (!ctr)\n file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n var dat = chks_4[_i];\n d_1.push(dat, false);\n }\n if (_this.k[0] == chks_3 && _this.c)\n _this.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n err(13);\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (lft) {\n var c = lft;\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = lft = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n if (d)\n files[fn] = d;\n if (!--lft)\n cbd(null, files);\n }\n };\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_1\n })) {\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n // Synchronously decompress under 512KB, or barely-compressed data\n if (su < 524288 || sc > 0.8 * su) {\n try {\n cbl(null, inflateSync(infl, { out: new u8(su) }));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n }\n else\n cbl(null, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n }\n else\n cbd(null, {});\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n err(13);\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_2\n })) {\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n else\n err(14, 'unknown compression type ' + c_2);\n }\n }\n return files;\n}\n","/**\n * Browser-side docx outline extraction: a .docx is a zip whose\n * word/document.xml holds the body text in <w:t> runs inside <w:p> paragraphs.\n * Uses fflate (inlined into the client bundle) so the user can pick or drag a\n * docx without any server upload.\n *\n * Import from 'fflate/browser' (not 'fflate'): the default entry resolves to\n * the Node build (esm/index.mjs), which calls module.createRequire() for the\n * optional worker_threads path — inlining that into the browser bundle leaves\n * a bare require(\"module\") the client-modules table cannot answer.\n */\n\nimport { unzipSync, strFromU8 } from 'fflate/browser'\n\n/** Decode the handful of XML entities docx bodies actually use. */\nfunction decodeEntities(text: string): string {\n return text\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/&amp;/g, '&')\n .replace(/&nbsp;/g, ' ')\n}\n\n/** Extract plain text from a docx buffer: one line per <w:p> paragraph. */\nexport function extractDocxTextFromBuffer(buffer: ArrayBuffer | Uint8Array): string {\n const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer)\n let files: ReturnType<typeof unzipSync>\n try {\n files = unzipSync(bytes)\n } catch (error) {\n throw new Error(`不是有效的 docx(zip 解压失败):${(error as Error).message}`)\n }\n const document = files['word/document.xml']\n if (document === undefined) {\n throw new Error('不是有效的 docx(缺少 word/document.xml)')\n }\n const xml = strFromU8(document)\n\n const paragraphs: string[] = []\n const parts = xml.split(/<w:p\\b[^>]*>/)\n for (let i = 1; i < parts.length; i++) {\n const segment = parts[i]!\n const runs: string[] = []\n const runRe = /<w:t(?:\\s[^>]*)?>([\\s\\S]*?)<\\/w:t>|<w:tab\\b[^>]*\\/>|<w:br\\b[^>]*\\/>/g\n for (const match of segment.matchAll(runRe)) {\n if (match[0].startsWith('<w:tab')) {\n runs.push('\\t')\n } else if (match[0].startsWith('<w:br')) {\n runs.push('\\n')\n } else {\n runs.push(decodeEntities(match[1] ?? ''))\n }\n }\n paragraphs.push(runs.join('').replace(/\\u00a0/g, ' ').trimEnd())\n }\n\n const text = paragraphs.join('\\n').replace(/\\n{3,}/g, '\\n\\n').trim()\n if (text.length === 0) {\n throw new Error('docx 中没有可提取的文本')\n }\n return text\n}\n\n/** Read a File as ArrayBuffer. */\nexport function readFileAsArrayBuffer(file: File): Promise<ArrayBuffer> {\n return file.arrayBuffer()\n}\n","/**\n * 开书向导:独立页面视图 —— 书名 + 大纲(选择 docx / 拖拽 / 粘贴),\n * 实时书名识别与题材提示,开书即建项目并进入工作台。\n * 另含「想法 → AI 大纲」:输入一句话想法生成 2-3 个方案,可暂留换批,选中后回填大纲框。\n */\nimport { useRef, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport type { OutlineCandidate } from '../../protocol.ts'\nimport { extractDocxTextFromBuffer } from '../docx.ts'\nimport css from './panel.module.css'\n\n/** 从大纲首行推断书名(与服务端 inferBookName 一致,供实时预览)。 */\nfunction inferBookNamePreview(outline: string): string {\n const line = outline.split('\\n').map(l => l.trim()).find(l => l.length > 0)\n if (line === undefined) return ''\n return line.replace(/^《/, '').replace(/》.*$/, '').slice(0, 40)\n}\n\n/** 简单题材识别(提示用)。 */\nfunction guessGenre(outline: string): string | null {\n const map: Array<[string, string[]]> = [\n ['仙侠修真', ['仙', '修', '灵根', '元婴', '宗门', '飞升']],\n ['都市', ['都市', '公司', '外卖', '职场', '总裁']],\n ['玄幻', ['斗气', '魂力', '大陆', '斗罗', '神']],\n ['悬疑', ['悬疑', '密室', '案件', '推理', '凶']],\n ['科幻', ['机甲', '星舰', 'AI', '未来', '星际']],\n ['历史', ['朝代', '皇帝', '将军', '古代', '王朝']],\n ['游戏', ['游戏', '副本', '装备', '等级', '职业']],\n ]\n for (const [genre, keywords] of map) {\n if (keywords.some(k => outline.includes(k))) return genre\n }\n return null\n}\n\n/** 开书向导页。 */\nexport function CreateBookView({\n api,\n onBack,\n onCreated,\n}: {\n api: NovelApi\n /** 返回书架。 */\n onBack: () => void\n /** 开书成功:进入新书工作台。 */\n onCreated: (id: string) => void\n}) {\n const [name, setName] = useState('')\n const [outlineText, setOutlineText] = useState('')\n const [outlineName, setOutlineName] = useState('')\n const [dragActive, setDragActive] = useState(false)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const outlineFileRef = useRef<HTMLInputElement | null>(null)\n\n // ---- 想法 → AI 大纲状态 ----\n const [ideaOpen, setIdeaOpen] = useState(false)\n const [idea, setIdea] = useState('')\n const [suggesting, setSuggesting] = useState(false)\n const [candidates, setCandidates] = useState<OutlineCandidate[]>([])\n const [pinned, setPinned] = useState<string[]>([])\n /** 回填后提示(如「已填入方案A,可继续修改」)。 */\n const [fillNotice, setFillNotice] = useState('')\n\n const autoName = inferBookNamePreview(outlineText)\n const effectiveName = name.trim() !== '' ? name.trim() : autoName\n const genre = guessGenre(outlineText)\n\n const handlePickOutlineFile = async (file: File | undefined): Promise<void> => {\n if (file === undefined) return\n try {\n const buffer = await file.arrayBuffer()\n const text = extractDocxTextFromBuffer(buffer)\n if (text.length < 50) {\n setError('大纲内容过短(<50 字符),请检查文件')\n return\n }\n setOutlineText(text)\n setOutlineName(file.name)\n if (name.trim() === '') setName(inferBookNamePreview(text))\n setError('')\n } catch (err) {\n setError(`读取大纲失败:${(err as Error).message}`)\n }\n }\n\n /** 生成/换批:只补未暂留的空槽;exclude 传已暂留方案的卖点方向。 */\n const handleSuggest = async (): Promise<void> => {\n if (idea.trim().length < 10) {\n setError('想法太短(<10 字):至少写一句完整想法,如「男主穿越修仙界靠做菜无敌」')\n return\n }\n setSuggesting(true)\n setError('')\n try {\n const exclude = candidates\n .filter(c => pinned.includes(c.id))\n .map(c => `${c.bookName}:${c.sellingPoint}${c.genre !== '' ? `(${c.genre})` : ''}`)\n const count = Math.max(1, 3 - pinned.length)\n const result = await api.outlineSuggest(idea.trim(), count, exclude)\n // 换批合并:已暂留的原地保留,新生成的补充进空槽。\n setCandidates(prev => {\n const kept = prev.filter(c => pinned.includes(c.id))\n return [...kept, ...result.candidates].slice(0, 3)\n })\n setFillNotice('')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setSuggesting(false)\n }\n }\n\n /** 暂留/取消暂留。 */\n const togglePin = (id: string): void => {\n setPinned(prev => prev.includes(id) ? prev.filter(x => x !== id) : [...prev, id])\n }\n\n /** 选中方案:回填大纲框 + 书名,滚动到上方。 */\n const handlePick = (candidate: OutlineCandidate): void => {\n setOutlineText(candidate.outline)\n setName(candidate.bookName)\n setFillNotice(`已填入方案《${candidate.bookName}》(${candidate.genre}),可继续修改后开书`)\n setIdeaOpen(false)\n window.scrollTo({ top: 0, behavior: 'smooth' })\n }\n\n const handleCreate = async (): Promise<void> => {\n if (effectiveName === '') {\n setError('请填写书名,或提供大纲自动识别')\n return\n }\n setBusy(true)\n setError('')\n try {\n const snapshot = await api.bookCreate(effectiveName, undefined, outlineText.trim() !== '' ? outlineText.trim() : undefined)\n const created = snapshot.books.find(b => b.id === snapshot.activeBookId)\n if (created !== undefined) {\n onCreated(created.id)\n } else {\n setError('开书失败:未找到新书')\n }\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <div className={css.createBookView}>\n <div className={css.createBookTop}>\n <button type=\"button\" className={css.iconButton} title=\"返回书架\" aria-label=\"返回书架\" onClick={onBack}>\n ← 书架\n </button>\n </div>\n\n <div className={css.createBookCard}>\n <span className={css.createBookIcon}>✒️</span>\n <h2 className={css.createBookTitle}>开书向导</h2>\n <span className={css.meta}>把一份大纲「编译」成一本完整的小说</span>\n\n {error !== '' && (\n <div className={css.card} style={{ borderColor: 'var(--nf-error)', padding: '8px 12px' }}>\n <span style={{ color: 'var(--nf-error)', fontSize: 12 }}>{error}</span>\n </div>\n )}\n\n {fillNotice !== '' && (\n <div className={css.card} style={{ borderColor: 'var(--nf-success)', padding: '8px 12px' }}>\n <span style={{ color: 'var(--nf-success)', fontSize: 12 }}>✅ {fillNotice}</span>\n </div>\n )}\n\n <div className={css.field}>\n <label className={css.fieldLabel}>书名</label>\n <input\n className={css.input}\n placeholder={autoName !== '' ? `自动识别:${autoName}` : '输入书名(提供大纲后自动识别)'}\n value={name}\n onChange={e => { setName(e.target.value) }}\n onKeyDown={e => { if (e.key === 'Enter') void handleCreate() }}\n autoFocus\n />\n </div>\n\n <div className={css.field}>\n <label className={css.fieldLabel}>大纲</label>\n <div\n className={`${css.dropzone} ${dragActive ? css.dropzoneActive : ''}`}\n onClick={() => { outlineFileRef.current?.click() }}\n onDragOver={e => { e.preventDefault(); setDragActive(true) }}\n onDragLeave={() => { setDragActive(false) }}\n onDrop={e => {\n e.preventDefault()\n setDragActive(false)\n void handlePickOutlineFile(e.dataTransfer.files?.[0])\n }}\n >\n <span className={css.dropzoneIcon}>📄</span>\n <span>{outlineName !== '' ? `已选择:${outlineName}` : '点击选择 docx 大纲,或将文件拖到这里'}</span>\n <span className={css.meta}>推荐提供大纲:开书即建立项目,书名自动识别</span>\n <input\n ref={outlineFileRef}\n type=\"file\"\n accept=\".docx,application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n style={{ display: 'none' }}\n onChange={e => {\n void handlePickOutlineFile(e.target.files?.[0])\n e.target.value = ''\n }}\n />\n </div>\n <textarea\n className={css.textarea}\n style={{ minHeight: 130 }}\n placeholder=\"或直接粘贴大纲文本(50 字以上)…\"\n value={outlineText}\n onChange={e => { setOutlineText(e.target.value) }}\n spellCheck={false}\n />\n </div>\n\n {(outlineText.trim().length > 0 || effectiveName !== '') && (\n <div className={css.row} style={{ flexWrap: 'wrap' }}>\n {outlineText.trim().length > 0 && <span className={css.meta}>大纲 {outlineText.length} 字</span>}\n {effectiveName !== '' && <span className={css.meta}>书名:{effectiveName}</span>}\n {genre !== null && <span className={css.meta}>题材:{genre}</span>}\n </div>\n )}\n\n {/* 想法 → AI 大纲(可折叠) */}\n <div className={css.ideaCard}>\n <button\n type=\"button\"\n className={css.ideaToggle}\n onClick={() => { setIdeaOpen(v => !v) }}\n aria-expanded={ideaOpen}\n >\n ✨ {ideaOpen ? '▾' : '▸'} 没有大纲?用一句话想法让 AI 生成\n </button>\n {ideaOpen && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n <textarea\n className={css.textarea}\n style={{ minHeight: 60 }}\n placeholder=\"例如:现代外卖员被雷劈穿越到修仙世界,靠祖传古玉捡漏发育,苟着苟着成了大佬…(≥50 字)\"\n value={idea}\n onChange={e => { setIdea(e.target.value) }}\n spellCheck={false}\n />\n <div className={css.row} style={{ flexWrap: 'wrap' }}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n disabled={suggesting || idea.trim().length < 10}\n onClick={() => { void handleSuggest() }}\n title=\"生成 3 个方向不同的大纲方案供选择(约消耗 6-8k token)\"\n >\n {suggesting ? '⏳ 生成中…' : candidates.length === 0 ? '✨ 生成大纲方案' : `↻ 换一批(${Math.max(1, 3 - pinned.length)} 个)`}\n </button>\n {candidates.length > 0 && (\n <span className={css.meta}>\n 已暂留 {pinned.length}/3 · 换批保留已暂留,只补新方案\n </span>\n )}\n </div>\n\n {/* 方案卡 */}\n {candidates.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {candidates.map(candidate => {\n const isPinned = pinned.includes(candidate.id)\n return (\n <div\n key={candidate.id}\n className={css.ideaCandidate}\n style={isPinned ? { borderColor: 'var(--nf-accent)', boxShadow: '0 0 0 2px var(--nf-accent-soft)' } : undefined}\n >\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap', gap: 6 }}>\n <span style={{ display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' }}>\n <b>《{candidate.bookName}》</b>\n {candidate.genre !== '' && <span className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)' }}>{candidate.genre}</span>}\n {isPinned && <span className={css.badge} style={{ borderColor: 'var(--nf-warn)', color: 'var(--nf-warn)' }}>★ 已暂留</span>}\n </span>\n <span style={{ display: 'flex', gap: 6 }}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${isPinned ? '' : css.buttonPrimary}`}\n onClick={() => { togglePin(candidate.id) }}\n title={isPinned ? '取消暂留:下次换批会覆盖此槽位' : '暂留此方案:换批时保留,继续对比新方案'}\n >\n {isPinned ? '★ 取消暂留' : '☆ 暂留'}\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n onClick={() => { handlePick(candidate) }}\n title=\"将这份大纲填入上方大纲框(可继续修改后开书)\"\n >\n 选这个\n </button>\n </span>\n </div>\n {candidate.sellingPoint !== '' && (\n <div className={css.meta}><b>卖点:</b>{candidate.sellingPoint}</div>\n )}\n <div\n className={css.meta}\n style={{\n display: '-webkit-box',\n WebkitLineClamp: 4,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n whiteSpace: 'pre-wrap',\n }}\n title={candidate.outline}\n >\n {candidate.outline}\n </div>\n </div>\n )\n })}\n {pinned.length >= 3 && (\n <span className={css.meta}>已暂留全部方案——直接挑一个「选这个」即可;换批需先取消某个暂留。</span>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonPrimary}`}\n style={{ width: '100%', padding: '10px 0', fontSize: 14 }}\n disabled={busy || effectiveName === ''}\n onClick={() => { void handleCreate() }}\n >\n ✨ 开书并进入工作台\n </button>\n <span className={css.meta} style={{ textAlign: 'center' }}>\n 未提供大纲也能开书,稍后可在大纲页导入\n </span>\n </div>\n </div>\n )\n}\n","/**\n * 大世界页签:境界体系 / 地理区域 / 势力分布 的结构化编辑 + AI 提炼。\n * 数据注入每章生成与审稿提示词(renderWorld),保证设定不写飞。\n */\nimport { useEffect, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport type { WorldFaction, WorldRealm, WorldRegion, WorldState } from '../../protocol.ts'\nimport css from './panel.module.css'\n\nconst EMPTY: WorldState = { realms: [], regions: [], factions: [] }\n\n/** 一个可编辑条目行。 */\nfunction EditableRow({\n name,\n detail,\n onName,\n onDetail,\n onRemove,\n namePlaceholder,\n detailPlaceholder,\n}: {\n name: string\n detail: string\n onName: (v: string) => void\n onDetail: (v: string) => void\n onRemove: () => void\n namePlaceholder: string\n detailPlaceholder: string\n}) {\n return (\n <div style={{ display: 'flex', gap: 6, alignItems: 'flex-start' }}>\n <input className={css.input} style={{ flex: 2, minWidth: 0 }} placeholder={namePlaceholder} value={name} onChange={e => { onName(e.target.value) }} />\n <input className={css.input} style={{ flex: 3, minWidth: 0 }} placeholder={detailPlaceholder} value={detail} onChange={e => { onDetail(e.target.value) }} />\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} title=\"删除\" onClick={onRemove}>×</button>\n </div>\n )\n}\n\n/** 大世界页签。 */\nexport function WorldTab({\n api,\n world,\n onChanged,\n}: {\n api: NovelApi\n /** 当前项目的大世界数据(可能为空)。 */\n world: WorldState | undefined\n /** 保存/提炼成功后由父组件刷新项目状态。 */\n onChanged: (world: WorldState) => void\n}) {\n const [draft, setDraft] = useState<WorldState>(() => world ?? EMPTY)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n\n // 外部数据变化时同步草稿(提炼/保存/切换书后)。\n useEffect(() => {\n setDraft(world ?? EMPTY)\n }, [world])\n\n const handleGenerate = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.world('generate')\n setDraft(result.world)\n onChanged(result.world)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n const handleSave = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.world('save', draft)\n onChanged(result.world)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n const setRealms = (realms: WorldRealm[]): void => setDraft(prev => ({ ...prev, realms }))\n const setRegions = (regions: WorldRegion[]): void => setDraft(prev => ({ ...prev, regions }))\n const setFactions = (factions: WorldFaction[]): void => setDraft(prev => ({ ...prev, factions }))\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n {error !== '' && <div className={css.card} style={{ borderColor: 'var(--nf-error)' }}><span style={{ color: 'var(--nf-error)' }}>{error}</span></div>}\n\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>大世界</span>\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleGenerate() }}>\n ✨ AI 提炼\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void handleSave() }}>\n 💾 保存\n </button>\n </div>\n </div>\n <span className={css.meta}>\n 境界体系按由低到高排序注入章节生成提示词,模型不得随意跳级或自创境界;区域与势力约束地理/势力设定。AI 提炼不满意可逐条编辑后保存。\n </span>\n </div>\n\n {/* 境界体系 */}\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>境界体系({draft.realms.length})</span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setRealms([...draft.realms, { name: '', description: '' }]) }}>\n + 新增境界\n </button>\n </div>\n {draft.realms.length === 0 ? (\n <span className={css.meta}>暂无境界体系 — 点击 ✨AI 提炼 或手动添加(由低到高)。</span>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {draft.realms.map((realm, i) => (\n <EditableRow\n key={i}\n name={realm.name}\n detail={realm.description}\n onName={v => { const next = [...draft.realms]; next[i] = { ...next[i]!, name: v }; setRealms(next) }}\n onDetail={v => { const next = [...draft.realms]; next[i] = { ...next[i]!, description: v }; setRealms(next) }}\n onRemove={() => { setRealms(draft.realms.filter((_, idx) => idx !== i)) }}\n namePlaceholder={`第 ${i + 1} 阶境界名`}\n detailPlaceholder=\"突破条件 / 寿命 / 标志…\"\n />\n ))}\n </div>\n )}\n </div>\n\n {/* 地理区域 */}\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>地理区域({draft.regions.length})</span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setRegions([...draft.regions, { name: '', description: '' }]) }}>\n + 新增区域\n </button>\n </div>\n {draft.regions.length === 0 ? (\n <span className={css.meta}>暂无地理区域 — 大陆 / 海域 / 秘境 / 遗迹…</span>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {draft.regions.map((region, i) => (\n <EditableRow\n key={i}\n name={region.name}\n detail={region.description}\n onName={v => { const next = [...draft.regions]; next[i] = { ...next[i]!, name: v }; setRegions(next) }}\n onDetail={v => { const next = [...draft.regions]; next[i] = { ...next[i]!, description: v }; setRegions(next) }}\n onRemove={() => { setRegions(draft.regions.filter((_, idx) => idx !== i)) }}\n namePlaceholder=\"区域名(如大荒 / 青云山脉)\"\n detailPlaceholder=\"描述…\"\n />\n ))}\n </div>\n )}\n </div>\n\n {/* 势力分布 */}\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>势力分布({draft.factions.length})</span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setFactions([...draft.factions, { name: '', kind: '宗门', description: '' }]) }}>\n + 新增势力\n </button>\n </div>\n {draft.factions.length === 0 ? (\n <span className={css.meta}>暂无势力 — 宗门 / 家族 / 王朝 / 组织…</span>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {draft.factions.map((faction, i) => (\n <EditableRow\n key={i}\n name={`${faction.name}(${faction.kind})`}\n detail={faction.description}\n onName={v => {\n const next = [...draft.factions]\n const match = /^(.*)((.*))$/.exec(v)\n next[i] = { ...next[i]!, name: (match?.[1] ?? v).trim(), kind: (match?.[2] ?? next[i]!.kind).trim() || '宗门' }\n setFactions(next)\n }}\n onDetail={v => { const next = [...draft.factions]; next[i] = { ...next[i]!, description: v }; setFactions(next) }}\n onRemove={() => { setFactions(draft.factions.filter((_, idx) => idx !== i)) }}\n namePlaceholder=\"势力名(类型)如:青云宗(宗门)\"\n detailPlaceholder=\"描述…\"\n />\n ))}\n </div>\n )}\n </div>\n </div>\n )\n}\n","/**\n * 纯展示组件(views):所有状态与事件处理器都留在 NovelPanel,\n * 这里只接收 props 渲染。便于单独维护与复用。\n */\nimport type { ReactElement } from 'react'\nimport type { AuditIssue, Plotline, PlotlineHealthReport, PlotlinePlan, RoleRecord, RoleStatusCard } from '../../protocol.ts'\nimport { tt, ROLE_LABELS, roleColor, kindLabel, plotlineStatusLabel, plotlineStatusColor } from './helpers.ts'\nimport css from './panel.module.css'\n\n/** 统计格:状态摘要条 / 资产健康通用。 */\nexport function StatCell(props: {\n label: string\n value: string\n detail: string\n /** 值颜色(可选)。 */\n valueColor?: string\n /** 值字号覆盖(如长文本用 13)。 */\n valueFontSize?: number\n /** detail 悬浮提示(可选)。 */\n detailTitle?: string\n}): ReactElement {\n return (\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>{props.label}</span>\n <span className={css.assetStatValue} style={{ color: props.valueColor, fontSize: props.valueFontSize }}>\n {props.value}\n </span>\n <span className={css.assetStatDetail} title={props.detailTitle}>{props.detail}</span>\n </div>\n )\n}\n\n/** 待办队列行。 */\nexport function TodoRow(props: {\n tone: 'danger' | 'warning' | 'info' | 'success'\n title: string\n description: string\n actionLabel: string\n disabled: boolean\n onAction: () => void\n}): ReactElement {\n return (\n <div className={`${css.todoItem} ${props.tone === 'danger' ? css.todoDanger : props.tone === 'warning' ? css.todoWarning : css.todoInfo}`}>\n <span className={css.todoText}>\n {props.title}\n {props.description !== '' && <span className={css.meta}> — {props.description}</span>}\n </span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={props.disabled} onClick={props.onAction}>\n {props.actionLabel}\n </button>\n </div>\n )\n}\n\n/** 全书质检问题行。 */\nexport function AuditIssueRow(props: {\n issue: AuditIssue\n disabled: boolean\n onFix: () => void\n}): ReactElement {\n const { issue } = props\n return (\n <div className={`${css.todoItem} ${issue.severity === 'high' ? css.todoDanger : issue.severity === 'medium' ? css.todoWarning : css.todoInfo}`}>\n <span className={css.todoText}>\n <span>\n {issue.chapterNo > 0 ? `第 ${issue.chapterNo} 章` : '未定位章节'} · [{issue.severity}] {issue.item}\n </span>\n {issue.suggestion !== '' && <span className={css.meta}>建议:{issue.suggestion}</span>}\n </span>\n {issue.chapterNo > 0 && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={props.disabled} onClick={props.onFix}>\n 去修订\n </button>\n )}\n </div>\n )\n}\n\n/** 剧情线卡片(列表主体)。 */\nexport function PlotlineCard(props: {\n line: Plotline\n disabled: boolean\n onRefresh: () => void\n onEdit: () => void\n onRemove: () => void\n}): ReactElement {\n const { line } = props\n return (\n <div key={line.id} style={{ border: '1px solid var(--nf-border)', borderRadius: 10, padding: '8px 12px', fontSize: 12, display: 'flex', flexDirection: 'column', gap: 4 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span style={{ display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>\n <b>{line.name}</b>\n <span className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)' }}>{kindLabel(line.kind)}</span>\n <span className={css.badge} style={{ borderColor: plotlineStatusColor(line.status), color: plotlineStatusColor(line.status) }}>{plotlineStatusLabel(line.status)}</span>\n </span>\n <span style={{ display: 'flex', gap: 6 }}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={props.disabled}\n onClick={props.onRefresh}\n title=\"AI 结合编年录与章节摘要,自动更新这条线的当前进度\"\n >\n ↻ AI 刷新进度\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={props.disabled} onClick={props.onEdit}>\n {tt('plotlines.edit')}\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={props.disabled} onClick={props.onRemove}>\n {tt('plotlines.remove')}\n </button>\n </span>\n </div>\n {line.goal !== '' && <div className={css.meta}><b>{tt('plotlines.goal')}:</b>{line.goal}</div>}\n {line.progress !== '' && <div className={css.meta}><b>{tt('plotlines.progress')}:</b>{line.progress}</div>}\n <div className={css.meta}>\n {tt('plotlines.chapters')}:{line.chapters.length > 0 ? line.chapters.map(n => `第${n}章`).join('、') : '—'}\n </div>\n </div>\n )\n}\n\n/** AI 候选角色行(提炼结果,可采纳/修改后采纳)。 */\nexport function RoleCandidateRow(props: {\n candidate: RoleRecord\n disabled: boolean\n onAdopt: () => void\n onEdit: () => void\n}): ReactElement {\n const { candidate: r } = props\n const label = ROLE_LABELS[r.roleLabel] ?? r.roleLabel\n const color = roleColor(r.roleLabel)\n return (\n <div key={r.name} style={{ border: '1px solid var(--nf-border)', borderRadius: 8, padding: '6px 10px', fontSize: 12 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span style={{ display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>\n <b>{r.name}</b>\n <span className={css.badge} style={{ borderColor: color, color }}>{label}</span>\n {r.identity !== '' && <span className={css.meta}>{r.identity}</span>}\n </span>\n <span style={{ display: 'flex', gap: 6 }}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={props.disabled} onClick={props.onAdopt}>\n + 采纳\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={props.disabled} onClick={props.onEdit} title=\"修改后再采纳(候选列表保留)\">\n ✏️ 修改后采纳\n </button>\n </span>\n </div>\n {r.goals !== '' && <div className={css.meta}>目标:{r.goals}</div>}\n {r.relations.length > 0 && <div className={css.meta}>关系:{r.relations.join('、')}</div>}\n </div>\n )\n}\n\n/** 已收录角色卡(含从编年录刷新的当前状态行)。 */\nexport function RoleCard(props: {\n role: RoleRecord\n status?: RoleStatusCard\n disabled: boolean\n onEdit: () => void\n onRemove: () => void\n}): ReactElement {\n const { role: r, status: st } = props\n const label = ROLE_LABELS[r.roleLabel] ?? r.roleLabel\n const color = roleColor(r.roleLabel)\n return (\n <div key={r.name} style={{ border: '1px solid var(--nf-border)', borderRadius: 8, padding: '6px 10px', fontSize: 12 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span style={{ display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>\n <b>{r.name}</b>\n <span className={css.badge} style={{ borderColor: color, color }}>{label}</span>\n {r.identity !== '' && <span className={css.meta}>{r.identity}</span>}\n </span>\n <span style={{ display: 'flex', gap: 6 }}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={props.disabled} onClick={props.onEdit}>编辑</button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={props.disabled} onClick={props.onRemove}>删除</button>\n </span>\n </div>\n {r.goals !== '' && <div className={css.meta}>目标:{r.goals}</div>}\n {st !== undefined && (\n <div className={css.meta} style={{ color: 'var(--nf-accent)' }}>\n <b>当前状态:</b>{st.status !== '' ? st.status : '(编年录暂无该角色记录)'}\n {' · 出场 '}{st.appearances} 次 · 最近 第 {st.lastChapter} 章\n </div>\n )}\n {r.relations.length > 0 && <div className={css.meta}>关系:{r.relations.join('、')}</div>}\n {r.arc.length > 0 && <div className={css.meta}>成长线:{r.arc.join(' → ')}</div>}\n {r.knowledge.length > 0 && <div className={css.meta}>知情度:{r.knowledge.join(';')}</div>}\n </div>\n )\n}\n\n/** 🩺 剧情健康检查报告面板。 */\nexport function PlotlineHealthPanel(props: {\n report: PlotlineHealthReport\n disabled: boolean\n onPlan: () => void\n onClose: () => void\n}): ReactElement {\n const { report } = props\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, border: '1px solid var(--nf-info)', borderRadius: 12, padding: 10 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <b>🩺 剧情健康检查</b>\n <span style={{ display: 'flex', gap: 8 }}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={props.disabled}\n onClick={props.onPlan}\n title=\"基于本次诊断生成下一阶段剧情方案\"\n >\n ✨ 基于此设计方案\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={props.onClose}>收起</button>\n </span>\n </div>\n <div style={{ fontSize: 12, fontWeight: 700, color: 'var(--nf-accent)' }}>判定:{report.verdict}</div>\n {report.timing !== '' && <div className={css.meta}><b>建议时机:</b>{report.timing}</div>}\n {report.reasons.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2, fontSize: 12 }}>\n {report.reasons.map((r, i) => <div key={i} className={css.meta}>· {r}</div>)}\n </div>\n )}\n {report.lines.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, fontSize: 12 }}>\n {report.lines.map((l, i) => {\n const color = l.health === 'ok' ? 'var(--nf-success)' : l.health === 'warning' ? 'var(--nf-warn)' : 'var(--nf-error)'\n const label = l.health === 'ok' ? '健康' : l.health === 'warning' ? '预警' : '搁置过久'\n return (\n <div key={i} style={{ display: 'flex', gap: 8, alignItems: 'flex-start' }}>\n <span className={css.badge} style={{ borderColor: color, color, flex: 'none', marginTop: 1 }}>{label}</span>\n <span className={css.meta}><b>{l.name}</b>:{l.note}</span>\n </div>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\n/** ✨ AI 剧情方案面板。 */\nexport function PlotlinePlanPanel(props: {\n plan: PlotlinePlan\n disabled: boolean\n onAdopt: (suggestion: Plotline) => void\n onClose: () => void\n}): ReactElement {\n const { plan } = props\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, border: '1px solid var(--nf-accent)', borderRadius: 12, padding: 10 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <b>✨ AI 剧情方案</b>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={props.onClose}>收起</button>\n </div>\n {plan.direction !== '' && (\n <div className={css.meta} style={{ fontSize: 12 }}><b>下一阶段方向:</b>{plan.direction}</div>\n )}\n {plan.suggestions.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, fontSize: 12 }}>\n {plan.suggestions.map((s, i) => (\n <div key={i} style={{ border: '1px solid var(--nf-border)', borderRadius: 8, padding: '6px 10px' }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span style={{ display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>\n <b>{s.name}</b>\n <span className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)' }}>{kindLabel(s.kind)}</span>\n </span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={props.disabled} onClick={() => { props.onAdopt(s) }}>\n + 采纳\n </button>\n </div>\n {s.goal !== '' && <div className={css.meta}>{s.goal}</div>}\n {s.progress !== '' && <div className={css.meta}>初始进度:{s.progress}</div>}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/** ✨ AI 建议剧情线面板。 */\nexport function PlotlineSuggestionPanel(props: {\n suggestions: Plotline[]\n disabled: boolean\n onAdopt: (suggestion: Plotline) => void\n onClose: () => void\n}): ReactElement {\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, border: '1px solid var(--nf-info)', borderRadius: 12, padding: 10 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <b>✨ AI 建议({props.suggestions.length} 条)</b>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={props.onClose}>收起</button>\n </div>\n {props.suggestions.length === 0 && <span className={css.meta}>没有候选线。</span>}\n {props.suggestions.map((s, i) => (\n <div key={i} style={{ border: '1px solid var(--nf-border)', borderRadius: 8, padding: '6px 10px', fontSize: 12 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span style={{ display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>\n <b>{s.name}</b>\n <span className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)' }}>{kindLabel(s.kind)}</span>\n </span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={props.disabled} onClick={() => { props.onAdopt(s) }}>\n + 采纳\n </button>\n </div>\n {s.goal !== '' && <div className={css.meta}>{s.goal}</div>}\n </div>\n ))}\n </div>\n )\n}\n","/**\n * The novel-forge workbench panel: tabs — 工作流 (guided pipeline), 大纲\n * (outline), 章节 (chapter plan + per-chapter write/review/rewrite/polish),\n * 设定库 (story bible), 伏笔 (foreshadows), 设置 (config). Generation and\n * review streams land in the progress console.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport type { PanelController } from './controller.ts'\nimport { tt } from './helpers.ts'\nimport { AssistantTab } from './AssistantTab.tsx'\nimport { AssetsTab } from './AssetsTab.tsx'\nimport { ShelfView } from './ShelfView.tsx'\nimport { ReaderView } from './ReaderView.tsx'\nimport { RunPanel } from './RunPanel.tsx'\nimport { CreateBookView } from './CreateBookView.tsx'\nimport { WorldTab } from './WorldTab.tsx'\nimport { AuditIssueRow, PlotlineCard, PlotlineHealthPanel, PlotlinePlanPanel, PlotlineSuggestionPanel, RoleCandidateRow, RoleCard, StatCell, TodoRow } from './views.tsx'\nimport { extractDocxTextFromBuffer } from '../docx.ts'\nimport type {\n AuditStatus,\n BookshelfSnapshot,\n ChapterPlan,\n Foreshadow,\n JobFrame,\n NovelConfig,\n Plotline,\n PlotlineHealthReport,\n PlotlinePlan,\n ProjectState,\n ReviewReport,\n RoleRecord,\n SensitiveHit,\n StoryBible,\n Volume,\n} from '../../protocol.ts'\nimport css from './panel.module.css'\n\n/** The panel's tab identifiers. */\nexport type NovelTab =\n | 'workflow' | 'overview' | 'blurb' | 'plan' | 'bible' | 'world' | 'foreshadow' | 'assistant' | 'settings'\n | 'characters' | 'roles' | 'facts' | 'plotlines' | 'reviews' | 'progress' | 'breakdown'\n | 'roleImage' | 'scenes'\n | 'assetsGenre' | 'assetsProgression' | 'assetsTemplates' | 'assetsRules' | 'assetsStyle' | 'run'\n | 'book' | 'assets'\n\n/** Panel shell props. */\nexport interface NovelPanelProps {\n /** The panel state owner (open/close/toggle). */\n controller: PanelController\n /** The API client every tab operates through. */\n api: NovelApi\n}\n\n/** One progress console line. */\ninterface ProgressLine {\n id: number\n text: string\n kind: 'info' | 'done' | 'error'\n /** Live line: a single in-place-updating row (generation counter + bar). */\n live?: boolean\n /** 0..1 completion ratio for the live line's progress bar. */\n ratio?: number\n}\n\n/** The navigation groups (AI-Novel-Writing-Assistant style grouping). */\nconst NAV_GROUPS: ReadonlyArray<{ id: string; label: string; items: ReadonlyArray<{ id: NovelTab; label: string; icon: string }> }> = [\n {\n id: 'create',\n label: '创作',\n items: [\n { id: 'workflow', label: tt('tab.workflow'), icon: '🛠️' },\n { id: 'overview', label: tt('tab.overview'), icon: '📄' },\n { id: 'blurb', label: '简介 / 封面', icon: '📖' },\n { id: 'plan', label: tt('tab.plan'), icon: '📚' },\n { id: 'plotlines', label: '长线管理', icon: '📜' },\n { id: 'book', label: '本书设定', icon: '📚' },\n ],\n },\n {\n id: 'tools',\n label: '工具',\n items: [\n { id: 'assistant', label: tt('tab.assistant'), icon: '💬' },\n { id: 'progress', label: '工作进度', icon: '📊' },\n { id: 'breakdown', label: '拆书分析', icon: '🔍' },\n { id: 'roleImage', label: '角色形象', icon: '🖼️' },\n { id: 'scenes', label: '场景库', icon: '🏞️' },\n { id: 'run', label: '生产单', icon: '🏭' },\n ],\n },\n {\n id: 'assets',\n label: '资产',\n items: [\n { id: 'assets', label: '创作资产', icon: '🧰' },\n ],\n },\n]\n\n/** Settings tab — pinned to the bottom of the nav rail. */\nconst SETTINGS_TAB: { id: NovelTab; label: string; icon: string } = { id: 'settings', label: tt('tab.settings'), icon: '⚙️' }\n\n/** Common DeepSeek model presets shown in settings; users can also type any model id. */\nconst MODEL_PRESETS = ['deepseek-v4-flash', 'deepseek-v4-pro', 'deepseek-chat', 'deepseek-reasoner'] as const\nconst REASONING_OPTIONS = ['off', 'low', 'high', 'max'] as const\n\n/** 构建时注入的插件版本(tsdown define 替换为字符串字面量)。 */\ndeclare const __NOVEL_FORGE_VERSION__: string | undefined\nconst PLUGIN_VERSION: string = typeof __NOVEL_FORGE_VERSION__ !== 'undefined' ? __NOVEL_FORGE_VERSION__ : '0.0.0'\n/** GitHub 仓库地址(关于区块点击跳转)。 */\nconst REPO_URL = 'https://github.com/watersxya/dsh-novel-forge'\n\n/** Whether any chapter is being generated right now. */\nfunction anyGenerating(chapters: ChapterPlan[] | undefined): boolean {\n return (chapters ?? []).some(c => c.status === 'generating' || c.status === 'reviewing')\n}\n\n/** Status badge class + label. */\nfunction statusBadge(chapter: ChapterPlan): { cls: string; label: string } {\n switch (chapter.status) {\n case 'pending': return { cls: css.badgePending, label: tt('plan.pending') }\n case 'generating': return { cls: css.badgeGenerating, label: tt('plan.generating') }\n case 'written': return { cls: css.badgeWritten, label: tt('plan.written') }\n case 'reviewing': return { cls: css.badgeGenerating, label: tt('plan.reviewing') }\n case 'approved': return { cls: css.badgeDone, label: tt('plan.approved') }\n case 'rejected': return { cls: css.badgeRejected, label: tt('plan.rejected') }\n case 'error': return { cls: css.badgeError, label: tt('plan.error') }\n }\n}\n\n/** One review issue line (severity-colored, theme-aware). */\nfunction severityColor(severity: string): string {\n return severity === 'high' ? 'var(--nf-error)' : severity === 'medium' ? 'var(--nf-warn)' : 'var(--nf-info)'\n}\n\n/** One row of a chapter-level diff (paragraph granularity). */\ntype DiffRow =\n | { kind: 'same'; text: string }\n | { kind: 'change'; old: string; neu: string }\n | { kind: 'del'; text: string }\n | { kind: 'add'; text: string }\n\n/**\n * Paragraph-level LCS diff between an original chapter body and its\n * rewrite/polish draft. Adjacent delete+add runs merge into \"change\" pairs\n * (the common case: a reworded paragraph shown as old → new).\n */\nfunction paragraphDiff(oldText: string, newText: string): DiffRow[] {\n const split = (t: string): string[] =>\n t.replace(/^#\\s+.*$/m, '').trim().split(/\\n{2,}/).map(p => p.trim()).filter(p => p !== '')\n const a = split(oldText)\n const b = split(newText)\n const n = a.length\n const m = b.length\n const dp: number[][] = Array.from({ length: n + 1 }, () => new Array<number>(m + 1).fill(0))\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n dp[i]![j] = a[i] === b[j] ? dp[i + 1]![j + 1]! + 1 : Math.max(dp[i + 1]![j]!, dp[i]![j + 1]!)\n }\n }\n const rows: DiffRow[] = []\n let i = 0\n let j = 0\n while (i < n || j < m) {\n if (i < n && j < m && a[i] === b[j]) {\n rows.push({ kind: 'same', text: a[i]! })\n i++\n j++\n } else if (i < n && (j >= m || dp[i + 1]![j]! >= dp[i]![j + 1]!)) {\n rows.push({ kind: 'del', text: a[i]! })\n i++\n } else if (j < m) {\n rows.push({ kind: 'add', text: b[j]! })\n j++\n } else if (i < n) {\n rows.push({ kind: 'del', text: a[i]! })\n i++\n } else {\n rows.push({ kind: 'add', text: b[j]! })\n j++\n }\n }\n // Merge adjacent del/add runs into change pairs.\n const merged: DiffRow[] = []\n let k = 0\n while (k < rows.length) {\n const row = rows[k]!\n if (row.kind !== 'del' && row.kind !== 'add') {\n merged.push(row)\n k++\n continue\n }\n const dels: string[] = []\n const adds: string[] = []\n while (k < rows.length && (rows[k]!.kind === 'del' || rows[k]!.kind === 'add')) {\n if (rows[k]!.kind === 'del') dels.push((rows[k] as { text: string }).text)\n else adds.push((rows[k] as { text: string }).text)\n k++\n }\n if (dels.length > 0 && adds.length > 0) {\n merged.push({ kind: 'change', old: dels.join('\\n\\n'), neu: adds.join('\\n\\n') })\n } else if (dels.length > 0) {\n for (const d of dels) merged.push({ kind: 'del', text: d })\n } else {\n for (const ad of adds) merged.push({ kind: 'add', text: ad })\n }\n }\n return merged\n}\n\n/** 把章节 beats 按结构标签渲染(本章目标/剧情要点/爽点/结尾钩子 等)。 */\nfunction renderBeats(beats: string): ReactElement {\n const lines = beats.split('\\n')\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n {lines.map((line, i) => {\n const trimmed = line.trim()\n const match = /^([^::]{2,14})[::]/.exec(trimmed)\n if (match !== null) {\n return (\n <div key={i}>\n <b style={{ color: 'var(--nf-accent)' }}>{match[1]}</b>\n {trimmed.slice(match[0].length)}\n </div>\n )\n }\n return <div key={i}>{line}</div>\n })}\n </div>\n )\n}\n\n/** The diff list of a draft-vs-original comparison (scrollable). */\nfunction DiffList({ original, draft, fontSize }: { original: string; draft: string; fontSize?: number }): ReactElement { const rows = useMemo(() => paragraphDiff(original, draft), [original, draft])\n const changed = rows.filter(r => r.kind === 'change').length\n const added = rows.filter(r => r.kind === 'add').length\n const removed = rows.filter(r => r.kind === 'del').length\n const [onlyChanges, setOnlyChanges] = useState(false)\n const shown = onlyChanges ? rows.filter(r => r.kind !== 'same') : rows\n return (\n <>\n <div className={css.diffLegend}>\n <span className={css.legendOld}>■ 原稿</span>\n <span className={css.legendNew}>■ 新稿</span>\n <span className={css.meta}>\n 原 {original.length} 字 → 新 {draft.length} 字 · 修改 {changed} · 新增 {added} · 删除 {removed}\n </span>\n <label className={css.onlyChanges}>\n <input\n type=\"checkbox\"\n checked={onlyChanges}\n onChange={e => { setOnlyChanges(e.target.checked) }}\n />\n 只看改动\n </label>\n </div>\n <div className={css.diffList} style={fontSize !== undefined ? { fontSize } : undefined}>\n {shown.map((row, idx) => {\n if (row.kind === 'same') {\n return (\n <details key={idx} className={css.diffSame}>\n <summary>第 {idx + 1} 段 · 未改动(点击展开)</summary>\n <div className={css.diffSameBody}>{row.text}</div>\n </details>\n )\n }\n if (row.kind === 'change') {\n return (\n <div key={idx} className={css.diffChange}>\n <div className={css.diffColumn}>\n <span className={css.diffTagOld}>原稿</span>\n <div className={css.diffOld}>{row.old}</div>\n </div>\n <div className={css.diffColumn}>\n <span className={css.diffTagNew}>新稿</span>\n <div className={css.diffNew}>{row.neu}</div>\n </div>\n </div>\n )\n }\n if (row.kind === 'del') {\n return (\n <div key={idx} className={css.diffDel}>\n <span className={css.diffTagOld}>原稿</span>\n <span className={css.diffText}>{row.text}</span>\n </div>\n )\n }\n return (\n <div key={idx} className={css.diffAdd}>\n <span className={css.diffTagNew}>新稿</span>\n <span className={css.diffText}>{row.text}</span>\n </div>\n )\n })}\n </div>\n </>\n )\n}\n\n/** The novel-forge panel. */\nexport function NovelPanel({ controller, api }: NovelPanelProps) {\n const [activeTab, setActiveTab] = useState<NovelTab>('workflow')\n const [config, setConfig] = useState<NovelConfig | null>(null)\n const [project, setProject] = useState<ProjectState | null>(null)\n const [generatedFiles, setGeneratedFiles] = useState<string[]>([])\n const [outlineText, setOutlineText] = useState('')\n const [customDocxPath, setCustomDocxPath] = useState('')\n const [shelf, setShelf] = useState<BookshelfSnapshot | null>(null)\n const [dragActive, setDragActive] = useState(false)\n const fileInputRef = useRef<HTMLInputElement | null>(null)\n const [planCount, setPlanCount] = useState(30)\n const [busy, setBusy] = useState(false)\n const [busyLabel, setBusyLabel] = useState('')\n const [error, setError] = useState('')\n const [notice, setNotice] = useState('')\n const [progress, setProgress] = useState<ProgressLine[]>([])\n const [configDraft, setConfigDraft] = useState<NovelConfig | null>(null)\n const [modelCustomMode, setModelCustomMode] = useState(false)\n const [expandedChapter, setExpandedChapter] = useState<number | null>(null)\n /** 复盘记录页:当前展开的章节号。 */\n const [expandedReviewChapter, setExpandedReviewChapter] = useState<number | null>(null)\n /** 复盘记录页:按卷折叠,卷号 → 是否展开(默认全部收起)。 */\n const [expandedVolumes, setExpandedVolumes] = useState<Record<number, boolean>>({})\n const [chapterText, setChapterText] = useState('')\n const progressId = useRef(0)\n /** id of the single live progress row (generation counter), if any. */\n const liveProgressId = useRef<number | null>(null)\n /** last chars value rendered into the live row (throttle for streaming). */\n const lastDeltaChars = useRef(0)\n /** cumulative chars received this job (delta frames carry increments). */\n const liveChars = useRef(0)\n /** chapter no of the job currently streaming (delta frames carry no `no`). */\n const currentJobNo = useRef(0)\n /** prominent top-of-panel progress bar while a chapter is being written. */\n const [liveBar, setLiveBar] = useState<{ text: string; ratio?: number } | null>(null)\n /** 润色/修订工作区:左栏原文(可选中局部目标)+ 右栏指令/预览/应用。 */\n const [workspace, setWorkspace] = useState<{\n no: number\n title: string\n original: string\n instruction: string\n draft: string | null\n /** 已采纳草稿(原地结论态):显示已采纳横幅 + 自动审稿结果,返回时才关闭工作区。 */\n applied?: boolean\n } | null>(null)\n /** 工作区左栏当前选中的文字(局部修订目标)。 */\n const [wsSelected, setWsSelected] = useState('')\n /** 工作区预览区:diff 对比视图开关。 */\n const [wsShowDiff, setWsShowDiff] = useState(false)\n /** 工作区原文 textarea 引用(用于捕获选中文字)。 */\n const wsEditorRef = useRef<HTMLTextAreaElement | null>(null)\n /** 工作区:手动编辑后的 AI 审查结果(不落盘)。 */\n const [wsCheckReport, setWsCheckReport] = useState<ReviewReport | null>(null)\n /** 手动审查结果中作者勾选要修复的问题(issue 下标)。 */\n const [wsChecked, setWsChecked] = useState<number[]>([])\n /** 工作区「一键修订结果」模式:顶部显示「✅ 修订完成」横幅,不展示旧意见选择。 */\n const [wsResultMode, setWsResultMode] = useState(false)\n /** 编辑页字号(localStorage 记忆,仅影响显示)。 */\n const [editorFontSize, setEditorFontSize] = useState<number>(() => {\n try {\n const v = Number(window.localStorage.getItem('dsh-novel-forge.editor.fontSize'))\n return v >= 12 && v <= 24 ? v : 14\n } catch { return 14 }\n })\n const changeEditorFontSize = (next: number): void => {\n const v = Math.min(24, Math.max(12, next))\n setEditorFontSize(v)\n try { window.localStorage.setItem('dsh-novel-forge.editor.fontSize', String(v)) } catch { /* ignore */ }\n }\n /** 面板主题(localStorage 记忆):'liquid'=iOS 液态玻璃(绿) / 'classic'=经典毛玻璃(蓝) / 'neumorph'=新拟物(浅色)。 */\n const [panelTheme, setPanelTheme] = useState<'liquid' | 'classic' | 'neumorph'>(() => {\n try {\n const v = window.localStorage.getItem('dsh-novel-forge.theme')\n return v === 'classic' || v === 'neumorph' ? v : 'liquid'\n } catch { return 'liquid' }\n })\n const changePanelTheme = (next: 'liquid' | 'classic' | 'neumorph'): void => {\n setPanelTheme(next)\n try { window.localStorage.setItem('dsh-novel-forge.theme', next) } catch { /* ignore */ }\n }\n /** 有未采纳草稿的章节号(refresh 后检测到遗留草稿时提示)。 */\n const [draftNo, setDraftNo] = useState<number | null>(null)\n /** 大纲页「更新大纲」编辑区是否展开。 */\n const [updatingOutline, setUpdatingOutline] = useState(false)\n /** 全书质检结果(null = 未运行)。 */\n const [auditIssues, setAuditIssues] = useState<import('../../protocol.ts').AuditIssue[] | null>(null)\n /** 全书质检实时状态(来自 /status,用于显示进度)。 */\n const [auditStatus, setAuditStatus] = useState<AuditStatus | null>(null)\n /** 角色卡(从事实库聚合)。 */\n const [charCards, setCharCards] = useState<import('../../protocol.ts').RoleStatusCard[] | null>(null)\n /** 世界观规则编辑草稿(bible tab,每行一条)。 */\n const [worldRulesDraft, setWorldRulesDraft] = useState('')\n /** 小说简介编辑草稿。 */\n const [blurbDraft, setBlurbDraft] = useState('')\n /** 书名编辑草稿(简介页改名用)。 */\n const [bookNameDraft, setBookNameDraft] = useState('')\n /** 封面 dataUrl(无封面为 null)。 */\n const [coverDataUrl, setCoverDataUrl] = useState<string | null>(null)\n /** 封面文件选择。 */\n const coverFileRef = useRef<HTMLInputElement | null>(null)\n /** 章节列表按卷折叠(存已折叠的卷号)。 */\n const [collapsedVolumes, setCollapsedVolumes] = useState<number[]>([])\n /** 章节页当前选中的卷('all' = 全部卷显示在一起)。 */\n const [selectedVolume, setSelectedVolume] = useState<number | 'all'>('all')\n /** 待办/主行动卡「定位章节」的目标章号(用于展开+滚动+高亮,消费后清空)。 */\n const [focusNo, setFocusNo] = useState<number | null>(null)\n /** 剧情线编辑草稿(null = 未在编辑)。 */\n const [plotlineDraft, setPlotlineDraft] = useState<{\n id: string\n name: string\n kind: Plotline['kind']\n goal: string\n progress: string\n status: Plotline['status']\n } | null>(null)\n /** 长线管理页:子页签(剧情线 / 伏笔),localStorage 记忆。 */\n const [longlineTab, setLonglineTab] = useState<'plotlines' | 'foreshadow'>(() => {\n try {\n const v = window.localStorage.getItem('dsh-novel-forge.longline.tab')\n return v === 'foreshadow' ? 'foreshadow' : 'plotlines'\n } catch { return 'plotlines' }\n })\n const changeLonglineTab = (next: 'plotlines' | 'foreshadow'): void => {\n setLonglineTab(next)\n try { window.localStorage.setItem('dsh-novel-forge.longline.tab', next) } catch { /* ignore */ }\n }\n /** 编年 / 复盘页:子页签(编年录 / 复盘记录),localStorage 记忆。 */\n const [archiveTab, setArchiveTab] = useState<'facts' | 'reviews'>(() => {\n try {\n const v = window.localStorage.getItem('dsh-novel-forge.archive.tab')\n return v === 'reviews' ? 'reviews' : 'facts'\n } catch { return 'facts' }\n })\n const changeArchiveTab = (next: 'facts' | 'reviews'): void => {\n setArchiveTab(next)\n try { window.localStorage.setItem('dsh-novel-forge.archive.tab', next) } catch { /* ignore */ }\n }\n /** 本书设定页:子页签(设定库 / 大世界 / 角色库 / 编年·复盘),localStorage 记忆。 */\n const [bookTab, setBookTab] = useState<'bible' | 'world' | 'roles' | 'facts'>(() => {\n try {\n const v = window.localStorage.getItem('dsh-novel-forge.book.tab')\n return v === 'world' || v === 'roles' || v === 'facts' ? v : 'bible'\n } catch { return 'bible' }\n })\n const changeBookTab = (next: 'bible' | 'world' | 'roles' | 'facts'): void => {\n setBookTab(next)\n try { window.localStorage.setItem('dsh-novel-forge.book.tab', next) } catch { /* ignore */ }\n }\n /** 角色知情度编辑草稿(角色名 → 文本,每行一条)。 */\n const [knowledgeDraft, setKnowledgeDraft] = useState<Record<string, string>>({})\n /** 角色库:AI 提炼候选(null = 未运行;localStorage 持久化,刷新不丢)。 */\n const [roleCandidates, setRoleCandidates] = useState<RoleRecord[] | null>(() => {\n try {\n const raw = window.localStorage.getItem('dsh-novel-forge.role.candidates')\n if (raw !== null) {\n const parsed = JSON.parse(raw) as RoleRecord[]\n return Array.isArray(parsed) && parsed.length > 0 ? parsed : null\n }\n } catch { /* ignore */ }\n return null\n })\n /** 角色库:编辑草稿(null = 不在编辑)。 */\n const [roleDraft, setRoleDraft] = useState<RoleRecord | null>(null)\n /** 角色库候选持久化:提炼/采纳后写回 localStorage。 */\n useEffect(() => {\n try {\n if (roleCandidates !== null && roleCandidates.length > 0) {\n window.localStorage.setItem('dsh-novel-forge.role.candidates', JSON.stringify(roleCandidates))\n } else {\n window.localStorage.removeItem('dsh-novel-forge.role.candidates')\n }\n } catch { /* ignore */ }\n }, [roleCandidates])\n /** 全书敏感词检查结果(null = 未运行)。 */\n const [sensHits, setSensHits] = useState<SensitiveHit[] | null>(null)\n const [sensScanned, setSensScanned] = useState(0)\n /** 拆书分析结果(null = 未运行)。 */\n const [breakdownResult, setBreakdownResult] = useState<import('../../protocol.ts').BreakdownResponse | null>(null)\n const [breakdownScope, setBreakdownScope] = useState<'recent' | 'volume:2' | 'volume:3' | 'all'>('recent')\n const [breakdownPreset, setBreakdownPreset] = useState<'quick' | 'standard'>('quick')\n /** 角色图集上传:当前等待上传的角色名。 */\n const [roleImageTarget, setRoleImageTarget] = useState<string | null>(null)\n /** 角色图集上传:当前用途标签(立绘/四视图/表情-x/场景/细节)。 */\n const [roleImageLabel, setRoleImageLabel] = useState('立绘')\n /** 角色形象详情:当前打开的角色名(null = 关闭)。 */\n const [detailRoleName, setDetailRoleName] = useState<string | null>(null)\n /** 详情面板:上传标签输入。 */\n const [detailUploadLabel, setDetailUploadLabel] = useState('立绘')\n /** 场景库:AI 提炼候选(null = 未运行)。 */\n const [sceneCandidates, setSceneCandidates] = useState<import('../../protocol.ts').SceneCard[] | null>(null)\n /** 场景库:当前打开的场景名。 */\n const [sceneDetailName, setSceneDetailName] = useState<string | null>(null)\n /** 场景库:上传标签输入。 */\n const [sceneUploadLabel, setSceneUploadLabel] = useState('全景')\n /** 场景库:编辑草稿(null = 不在编辑)。 */\n const [sceneDraft, setSceneDraft] = useState<import('../../protocol.ts').SceneCard | null>(null)\n const roleImageInputRef = useRef<HTMLInputElement | null>(null)\n /** AI 建议的剧情线候选(null = 未运行)。 */\n const [plotlineSuggestions, setPlotlineSuggestions] = useState<Plotline[] | null>(null)\n /** 剧情健康检查报告(null = 未运行)。 */\n const [plotlineHealth, setPlotlineHealth] = useState<PlotlineHealthReport | null>(null)\n /** AI 剧情方案(null = 未运行)。 */\n const [plotlinePlan, setPlotlinePlan] = useState<PlotlinePlan | null>(null)\n /** npm 最新版本(更新检测;null = 未检测/检测失败)。 */\n const [npmLatest, setNpmLatest] = useState<string | null>(null)\n /** 活动输出容器:自动滚动锚点(有新活动时跟随到底部)。 */\n const progressEndRef = useRef<HTMLDivElement | null>(null)\n useEffect(() => {\n progressEndRef.current?.scrollIntoView({ behavior: 'smooth', block: 'nearest' })\n }, [progress])\n\n /** 后台检测 npm 最新版本(失败静默,不打扰)。 */\n useEffect(() => {\n let cancelled = false\n void fetch('https://registry.npmjs.org/@waterwx%2Fdsh-novel-forge')\n .then(response => response.json() as Promise<{ 'dist-tags'?: { latest?: string } }>)\n .then(data => {\n if (!cancelled && data['dist-tags']?.latest !== undefined) setNpmLatest(data['dist-tags'].latest)\n })\n .catch(() => { /* best-effort */ })\n return () => { cancelled = true }\n }, [])\n /** AI 助手悬浮窗:是否打开。 */\n const [assistantOpen, setAssistantOpen] = useState(false)\n /** 工作进度悬浮窗:是否打开。 */\n const [progressOpen, setProgressOpen] = useState(false)\n /** 工作进度悬浮窗位置(localStorage 记忆)。 */\n const [progressPos, setProgressPos] = useState(() => {\n try {\n const raw = window.localStorage.getItem('dsh-novel-forge.progress.float')\n if (raw !== null) {\n const parsed = JSON.parse(raw) as { x?: unknown; y?: unknown }\n return { x: typeof parsed.x === 'number' ? parsed.x : 60, y: typeof parsed.y === 'number' ? parsed.y : 120 }\n }\n } catch { /* ignore */ }\n return { x: 60, y: 120 }\n })\n /** 工作进度悬浮窗尺寸(localStorage 记忆)。 */\n const [progressSize, setProgressSize] = useState(() => {\n try {\n const raw = window.localStorage.getItem('dsh-novel-forge.progress.size')\n if (raw !== null) {\n const parsed = JSON.parse(raw) as { w?: unknown; h?: unknown }\n return { w: typeof parsed.w === 'number' ? parsed.w : 460, h: typeof parsed.h === 'number' ? parsed.h : 420 }\n }\n } catch { /* ignore */ }\n return { w: 460, h: 420 }\n })\n /** 悬浮窗位置(相对面板,localStorage 记忆)。 */\n const [assistantPos, setAssistantPos] = useState(() => {\n try {\n const raw = window.localStorage.getItem('dsh-novel-forge.assistant.float')\n if (raw !== null) {\n const parsed = JSON.parse(raw) as { x?: unknown; y?: unknown }\n return { x: typeof parsed.x === 'number' ? parsed.x : 260, y: typeof parsed.y === 'number' ? parsed.y : 60 }\n }\n } catch { /* ignore */ }\n return { x: 260, y: 60 }\n })\n /** 悬浮窗尺寸(localStorage 记忆)。 */\n const [assistantSize, setAssistantSize] = useState(() => {\n try {\n const raw = window.localStorage.getItem('dsh-novel-forge.assistant.size')\n if (raw !== null) {\n const parsed = JSON.parse(raw) as { w?: unknown; h?: unknown }\n return { w: typeof parsed.w === 'number' ? parsed.w : 420, h: typeof parsed.h === 'number' ? parsed.h : 460 }\n }\n } catch { /* ignore */ }\n return { w: 420, h: 460 }\n })\n /** 拖拽/缩放状态(target 区分 AI 助手 / 工作进度两个悬浮窗)。 */\n const dragState = useRef<{ type: 'move' | 'resize'; target: 'assistant' | 'progress'; startX: number; startY: number; origX: number; origY: number; origW: number; origH: number } | null>(null)\n\n /** 悬浮窗位置/尺寸持久化。 */\n useEffect(() => {\n try {\n window.localStorage.setItem('dsh-novel-forge.assistant.float', JSON.stringify(assistantPos))\n window.localStorage.setItem('dsh-novel-forge.assistant.size', JSON.stringify(assistantSize))\n window.localStorage.setItem('dsh-novel-forge.progress.float', JSON.stringify(progressPos))\n window.localStorage.setItem('dsh-novel-forge.progress.size', JSON.stringify(progressSize))\n } catch { /* ignore */ }\n }, [assistantPos, assistantSize, progressPos, progressSize])\n\n /** 全局拖拽/缩放监听(挂一次,靠 dragState 判断)。 */\n useEffect(() => {\n const onMove = (e: MouseEvent): void => {\n const s = dragState.current\n if (s === null) return\n if (s.type === 'move') {\n const next = {\n x: Math.max(-340, Math.min(s.origX + e.clientX - s.startX, 3000)),\n y: Math.max(0, Math.min(s.origY + e.clientY - s.startY, 3000)),\n }\n if (s.target === 'assistant') setAssistantPos(next)\n else setProgressPos(next)\n } else {\n const next = {\n w: Math.max(320, Math.min(s.origW + e.clientX - s.startX, 1400)),\n h: Math.max(220, Math.min(s.origH + e.clientY - s.startY, 1200)),\n }\n if (s.target === 'assistant') setAssistantSize(next)\n else setProgressSize(next)\n }\n }\n const onUp = (): void => { dragState.current = null }\n window.addEventListener('mousemove', onMove)\n window.addEventListener('mouseup', onUp)\n return () => {\n window.removeEventListener('mousemove', onMove)\n window.removeEventListener('mouseup', onUp)\n }\n }, [])\n /** 左侧导航折叠状态(localStorage 记忆,参照 AI-Novel-Writing-Assistant 侧边栏)。 */\n const [navCollapsed, setNavCollapsed] = useState(() => {\n try { return window.localStorage.getItem('dsh-novel-forge.nav.collapsed') === 'true' } catch { return false }\n })\n /** 视图:shelf = 书架首页;create = 开书向导;workspace = 当前书工作台。 */\n const [viewMode, setViewMode] = useState<'shelf' | 'create' | 'workspace' | 'reader'>('shelf')\n\n /** Refresh bookshelf. */\n const refreshShelf = useCallback(async () => {\n try {\n const snapshot = await api.bookshelf()\n setShelf(snapshot)\n } catch { /* shelf is best-effort */ }\n }, [api])\n\n /** Append a progress console line. */\n const pushProgress = useCallback((text: string, kind: ProgressLine['kind'] = 'info') => {\n setProgress(prev => [...prev.slice(-300), { id: progressId.current++, text, kind }])\n }, [])\n\n /** Update the single live progress row in place (create it on first call). */\n const setLiveProgress = useCallback((text: string, ratio?: number) => {\n setProgress(prev => {\n if (liveProgressId.current !== null) {\n return prev.map(l => l.id === liveProgressId.current ? { ...l, text, ratio } : l)\n }\n const id = progressId.current++\n liveProgressId.current = id\n return [...prev.slice(-300), { id, text, kind: 'info', live: true, ratio }]\n })\n }, [])\n\n /** Remove the live progress row (a job finished / failed). */\n const clearLiveProgress = useCallback(() => {\n if (liveProgressId.current === null) return\n const id = liveProgressId.current\n liveProgressId.current = null\n setProgress(prev => prev.filter(l => l.id !== id))\n }, [])\n\n /** Refresh status (config + project + files). */\n const refresh = useCallback(async (showError = true, forceOutline = false) => {\n try {\n const status = await api.status()\n setConfig(status.config)\n setConfigDraft(status.config)\n setModelCustomMode(!(MODEL_PRESETS as readonly string[]).includes(status.config.model))\n setAuditStatus(status.audit ?? null)\n setProject(status.project ?? null)\n // 人物志存档同步:有 roleStatus 存档直接显示,无需重新刷新计算。\n if (status.project?.roleStatus !== undefined) {\n setCharCards(status.project.roleStatus)\n } else {\n setCharCards(null)\n }\n setGeneratedFiles(status.generatedFiles)\n const withDraft = status.project?.chapters.find(c => c.pendingDraft !== undefined && c.pendingDraft !== '')\n setDraftNo(withDraft?.no ?? null)\n const nextOutline = status.project?.outline\n // forceOutline:切换书/开书后强制同步大纲(refresh 闭包里的\n // outlineText 可能是旧值,导致 `=== ''` 条件失效、大纲不同步、\n // 「生成章节计划」按钮被禁用)。\n if (forceOutline || (nextOutline !== undefined && outlineText === '')) {\n setOutlineText(nextOutline ?? '')\n }\n } catch (err) {\n if (showError) setError((err as Error).message)\n }\n }, [api, outlineText])\n\n /** 激活一本书(书架入口共用):重置本地编辑状态 → 拉取目标书 → 进入工作台或阅读页。 */\n const activateBook = useCallback(async (id: string, mode: 'workspace' | 'reader') => {\n setBusy(true)\n setError('')\n try {\n await api.bookActivate(id)\n // 切换书后重置本地编辑状态,重新拉取目标书。\n setOutlineText('')\n setProject(null)\n setGeneratedFiles([])\n setChapterText('')\n setExpandedChapter(null)\n setProgress([])\n setAuditIssues(null)\n setCharCards(null)\n await refresh(false, true)\n await refreshShelf()\n setViewMode(mode)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }, [api, refresh, refreshShelf])\n\n /** Handle a docx file (pick or drag): parse locally, save outline. */\n const handleDocxFile = useCallback(async (file: File) => {\n setBusy(true)\n setBusyLabel(tt('overview.loadingOutline'))\n setError('')\n try {\n const buffer = await file.arrayBuffer()\n const outline = extractDocxTextFromBuffer(buffer)\n if (outline.length < 50) {\n throw new Error('大纲内容过短(<50 字符),请检查文件')\n }\n setOutlineText(outline)\n await api.saveOutline(outline)\n await refresh(false)\n pushProgress(`已从「${file.name}」读取大纲(${outline.length} 字)`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`读取大纲失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }, [api, pushProgress, refresh])\n\n useEffect(() => {\n void refresh()\n void refreshShelf()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n /** 进入简介页时预填已保存的简介。 */\n useEffect(() => {\n if (activeTab === 'blurb') {\n if (blurbDraft === '' && project?.blurb !== undefined && project.blurb !== '') {\n setBlurbDraft(project.blurb)\n }\n if (bookNameDraft === '' && project?.bookName !== undefined && project.bookName !== '') {\n setBookNameDraft(project.bookName)\n }\n void loadCover()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeTab, project?.blurb, project?.bookName])\n\n /** Load the outline from docx (default path or custom). */\n const handleLoadDocx = async (useCustom: boolean): Promise<void> => {\n setBusy(true)\n setBusyLabel(tt('overview.loadingOutline'))\n setError('')\n try {\n const result = await api.loadOutline(useCustom ? customDocxPath || undefined : undefined)\n setOutlineText(result.outline)\n // Persist into the project (load-or-create).\n await api.saveOutline(result.outline)\n await refresh(false)\n pushProgress(`大纲已读取(${result.chars} 字):${result.bookName}${result.path !== undefined ? ` ← ${result.path}` : ''}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`读取大纲失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** Save the edited outline. */\n const handleSaveOutline = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await api.saveOutline(outlineText)\n setNotice(tt('overview.saved'))\n pushProgress(tt('overview.saved'), 'done')\n await refresh(false)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 大纲页「更新大纲」展开/收起(展开时预填当前大纲文本)。 */\n const handleToggleUpdateOutline = (): void => {\n if (!updatingOutline && project !== null) setOutlineText(project.outline)\n setUpdatingOutline(v => !v)\n }\n\n /** 重置项目:清空全部进度,从新大纲重新开始(二次确认)。 */\n const handleResetProject = async (): Promise<void> => {\n if (project === null) return\n if (!window.confirm('将清空本书全部进度(道藏/卷计划/章节计划/已生成章节/暗线/写作资产/编年录),且不可恢复。确定用新总纲重置?')) return\n setBusy(true)\n setError('')\n try {\n const result = await api.reset(outlineText)\n setUpdatingOutline(false)\n pushProgress(`已重置项目:${result.bookName}(从新大纲重新开始)`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`重置失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\n\n /** 全书一致性质检(LLM 扫描已生成章节)。 */\n const handleAudit = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel('全书一致性质检中…')\n setError('')\n setAuditStatus({ status: 'running', totalBatches: 0, completedBatches: 0 })\n let stopped = false\n const poll = window.setInterval(async () => {\n if (stopped) return\n try {\n const s = await api.status()\n if (s.audit !== undefined) setAuditStatus(s.audit)\n } catch { /* 轮询失败忽略,主请求仍会给出最终结果 */ }\n }, 1000)\n try {\n const result = await api.audit()\n if (stopped) return\n setAuditIssues(result.issues)\n pushProgress(result.issues.length === 0\n ? `全书质检完成:${result.auditedChapters} 章未发现矛盾 🎉`\n : `全书质检完成:发现 ${result.issues.length} 处疑似矛盾`, result.issues.length === 0 ? 'done' : 'error')\n } catch (err) {\n if (stopped) return\n setError((err as Error).message)\n pushProgress(`全书质检失败:${(err as Error).message}`, 'error')\n } finally {\n stopped = true\n window.clearInterval(poll)\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\n\n /** 角色卡刷新。 */\n const handleCharactersRefresh = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel('聚合角色状态中…')\n setError('')\n try {\n const result = await api.charactersRefresh()\n setCharCards(result.cards)\n // 同步到项目存档(角色库卡片显示当前状态)。\n setProject(prev => prev === null ? prev : { ...prev, roleStatus: result.cards, updatedAt: new Date().toISOString() })\n pushProgress(`角色状态已刷新:${result.cards.length} 个角色`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`角色状态刷新失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 事实库回填(历史章节批量抽取)。 */\n const handleFactsBackfill = async (): Promise<void> => { if (doneCount === 0) return\n setBusy(true)\n setBusyLabel('回填历史章节事实中…')\n setError('')\n try {\n const result = await api.factsBackfill()\n pushProgress(result.filled > 0\n ? `事实库回填完成:${result.filled} 章已抽取事实`\n : '事实库无需回填(所有章节都已有事实记录)', 'done')\n await refresh(false)\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`事实库回填失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 章节复位:generating 卡死 → pending(可重新生成)。 */\n const handleChapterReset = async (no: number): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await api.chapterReset(no)\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === no ? { ...c, status: 'pending', error: undefined } : c),\n })\n pushProgress(`第 ${no} 章已复位为待生成,可重新生成`, 'info')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`复位失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n }\n }\n\n /** 章节直接通过(作者行使最终决定权)。 */\n const handleChapterApprove = async (no: number): Promise<void> => {\n if (!window.confirm(`确定直接通过第 ${no} 章?(跳过审稿判定,保留审稿记录)`)) return\n setBusy(true)\n setError('')\n try {\n await api.chapterApprove(no)\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === no ? { ...c, status: 'approved' } : c),\n })\n pushProgress(`第 ${no} 章已直接通过`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`操作失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n }\n }\n\n /** 剧情线:保存草稿(新增或更新)。 */\n const handlePlotlineSave = async (): Promise<void> => {\n if (plotlineDraft === null) return\n const line: Plotline = {\n id: plotlineDraft.id,\n name: plotlineDraft.name.trim(),\n kind: plotlineDraft.kind,\n goal: plotlineDraft.goal.trim(),\n progress: plotlineDraft.progress.trim(),\n status: plotlineDraft.status,\n chapters: plotlineDraft.id !== ''\n ? (project?.plotlines?.find(l => l.id === plotlineDraft.id)?.chapters ?? [])\n : [],\n createdAt: plotlineDraft.id !== ''\n ? (project?.plotlines?.find(l => l.id === plotlineDraft.id)?.createdAt ?? new Date().toISOString())\n : new Date().toISOString(),\n }\n if (line.name === '') {\n setError('剧情线名称不能为空')\n return\n }\n setBusy(true)\n setError('')\n try {\n const result = await api.plotlines({ op: plotlineDraft.id !== '' ? 'update' : 'add', line })\n setProject(prev => prev === null ? prev : { ...prev, plotlines: result.plotlines, updatedAt: new Date().toISOString() })\n setPlotlineDraft(null)\n pushProgress(plotlineDraft.id !== '' ? `剧情线已更新:${line.name}` : `剧情线已创建:${line.name}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`保存剧情线失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n }\n }\n\n /** 剧情线:删除。 */\n const handlePlotlineRemove = async (id: string): Promise<void> => {\n if (!window.confirm('确定删除这条剧情线?关联章节记录会一并移除。')) return\n setBusy(true)\n setError('')\n try {\n const result = await api.plotlines({ op: 'remove', id })\n setProject(prev => prev === null ? prev : { ...prev, plotlines: result.plotlines, updatedAt: new Date().toISOString() })\n pushProgress('剧情线已删除', 'done')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 剧情线:把本章关联到某条线(推进节点)。 */\n const handlePlotlineLink = async (id: string, chapterNo: number): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.plotlines({ op: 'link', id, chapterNo })\n setProject(prev => prev === null ? prev : { ...prev, plotlines: result.plotlines, updatedAt: new Date().toISOString() })\n pushProgress(`已把第 ${chapterNo} 章关联到剧情线`, 'done')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 剧情线:AI 建议候选线。 */\n const handlePlotlineSuggest = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel('AI 分析剧情线中…')\n setError('')\n try {\n const result = await api.plotlines({ op: 'suggest' })\n setPlotlineSuggestions(result.suggestions ?? [])\n pushProgress(result.suggestions !== undefined && result.suggestions.length > 0\n ? `AI 建议了 ${result.suggestions.length} 条剧情线,可逐条采纳`\n : 'AI 没有给出剧情线建议,请检查大纲是否已加载', 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`AI 建议剧情线失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 剧情线:采纳一条 AI 建议。 */\n const handlePlotlineAdopt = async (suggestion: Plotline): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.plotlines({ op: 'add', line: { ...suggestion, id: '' } })\n setProject(prev => prev === null ? prev : { ...prev, plotlines: result.plotlines, updatedAt: new Date().toISOString() })\n setPlotlineSuggestions(prev => prev === null ? prev : prev.filter(s => s !== suggestion))\n pushProgress(`已采纳剧情线:${suggestion.name}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 剧情线:AI 刷新单条线进度。 */\n const handlePlotlineRefresh = async (id: string): Promise<void> => {\n setBusy(true)\n setBusyLabel('AI 刷新剧情线进度中…')\n setError('')\n try {\n const result = await api.plotlines({ op: 'refresh', id })\n setProject(prev => prev === null ? prev : { ...prev, plotlines: result.plotlines, updatedAt: new Date().toISOString() })\n const line = result.plotlines.find(l => l.id === id)\n pushProgress(`剧情线进度已刷新:${line?.progress ?? ''}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`刷新剧情线进度失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 🩺 剧情健康检查:判断是否需要新线、多少章后添加。 */\n const handlePlotlineHealth = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel('🩺 剧情健康检查中…')\n setError('')\n try {\n const result = await api.plotlines({ op: 'health' })\n setPlotlineHealth(result.health ?? null)\n pushProgress(`剧情健康检查完成:${result.health?.verdict ?? '无结论'}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`剧情健康检查失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** ✨ AI 设计剧情方案:下一阶段方向 + 建议新线(含健康检查)。 */\n const handlePlotlinePlan = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel('✨ 设计剧情方案中…')\n setError('')\n try {\n const result = await api.plotlines({ op: 'plan' })\n setPlotlineHealth(result.health ?? null)\n setPlotlinePlan(result.plan ?? null)\n pushProgress(`剧情方案已生成:${result.plan?.suggestions.length ?? 0} 条建议新线`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`剧情方案生成失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 采纳方案里的一条建议线。 */\n const handlePlanAdopt = async (suggestion: Plotline): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.plotlines({ op: 'add', line: { ...suggestion, id: '' } })\n setProject(prev => prev === null ? prev : { ...prev, plotlines: result.plotlines, updatedAt: new Date().toISOString() })\n setPlotlinePlan(prev => prev === null ? prev : { ...prev, suggestions: prev.suggestions.filter(s => s !== suggestion) })\n pushProgress(`已采纳剧情线:${suggestion.name}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 全书敏感词检查(硬匹配内置词库)。 */\n const handleSensitiveScan = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel('敏感词检查中…')\n setError('')\n try {\n const result = await api.sensitiveCheck({ all: true })\n setSensHits(result.hits)\n setSensScanned(result.scannedChapters)\n pushProgress(result.hits.length > 0\n ? `敏感词检查:${result.hits.length} 处命中(${new Set(result.hits.map(h => h.chapterNo)).size} 章受影响)`\n : `敏感词检查完成:扫描 ${result.scannedChapters} 章,未命中违禁词`, result.hits.length > 0 ? 'error' : 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`敏感词检查失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 拆书分析:对已写章节做结构/人物/文风/卖点体检(两阶段 LLM 管道,约 1-3 分钟)。 */\n const handleBreakdown = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel('拆书分析中…')\n setError('')\n try {\n const result = await api.breakdown(breakdownScope, breakdownPreset)\n setBreakdownResult(result)\n pushProgress(`拆书分析完成:${result.chaptersScanned} 章 · ${result.sections.length} 个小节 · 约 ${result.usedTokens} token`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`拆书分析失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 生成单个角色的形象锚点(复用角色库 visual 能力)。 */\n const handleRoleVisual = async (name: string): Promise<void> => {\n setBusy(true)\n setBusyLabel(`生成「${name}」形象锚点…`)\n setError('')\n try {\n await api.roles({ op: 'visual', name })\n await refresh(false)\n pushProgress(`已生成「${name}」形象锚点`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`生成「${name}」形象锚点失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 上传角色图:读取本地图片为 dataURL 并写入角色卡(带用途标签 → 图集)。 */\n const handleRoleImageUpload = async (name: string, file: File, label = '立绘'): Promise<void> => {\n const dataUrl = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(String(reader.result))\n reader.onerror = () => reject(reader.error ?? new Error('读取图片失败'))\n reader.readAsDataURL(file)\n })\n setBusy(true)\n setBusyLabel(`上传「${name}」${label}…`)\n setError('')\n try {\n await api.roles({ op: 'image', name, dataUrl, label })\n await refresh(false)\n pushProgress(`已上传「${name}」${label}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`上传「${name}」${label}失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n setRoleImageTarget(null)\n if (roleImageInputRef.current !== null) roleImageInputRef.current.value = ''\n }\n }\n\n /** 用豆包/Seedream 为角色生成参考图。 */\n const handleRoleImageGenerate = async (name: string): Promise<void> => {\n setBusy(true)\n setBusyLabel(`用豆包生成「${name}」参考图…`)\n setError('')\n try {\n await api.roles({ op: 'imageGenerate', name })\n await refresh(false)\n pushProgress(`已生成「${name}」参考图`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`生成「${name}」参考图失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 更新角色漫画重要性(main/support/extra)。 */\n const handleRoleImportance = async (role: RoleRecord, importance: RoleRecord['importance']): Promise<void> => {\n setBusy(true)\n setBusyLabel(`更新「${role.name}」重要性…`)\n setError('')\n try {\n await api.roles({ op: 'update', role: { ...role, importance } })\n await refresh(false)\n pushProgress(`已更新「${role.name}」重要性`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`更新「${role.name}」重要性失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 作者复盘补跑:全书缺失章节(流式)。 */\n const handleAuthorBackfillAll = async (): Promise<void> => {\n const missing = chapters.filter(c => c.status !== 'pending' && c.status !== 'generating' && c.status !== 'error' && c.authorReview === undefined).length\n setBusy(true)\n setBusyLabel(`补齐历史章节作者复盘(${missing} 章)…`)\n setError('')\n try {\n await api.reviewBackfillAll(frame => { applyJobFrame(frame, () => '') })\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`补齐作者复盘失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 作者复盘补跑:单章。 */\n const handleAuthorBackfillChapter = async (no: number): Promise<void> => {\n setBusy(true)\n setBusyLabel(`生成第 ${no} 章作者复盘…`)\n setError('')\n try {\n const result = await api.reviewBackfillChapter(no)\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === result.no ? { ...c, authorReview: result.review } : c),\n })\n const r = result.review\n pushProgress(\n `📋 第${no}章作者复盘:钩子${r.hookHonored ? '已兑现 ✓' : '未兑现 ✗'} · 结尾钩子 ${r.endingHook}/10`,\n r.hookHonored && r.endingHook >= 6 ? 'done' : 'error',\n )\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`生成第 ${no} 章作者复盘失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 保存角色知情度(bible.characters 整体更新)。 */\n const handleKnowledgeSave = async (): Promise<void> => {\n if (bible === undefined) return\n const characters = bible.characters.map(card => ({\n ...card,\n knowledge: (knowledgeDraft[card.name] ?? (card.knowledge ?? []).join('\\n'))\n .split('\\n').map(l => l.trim()).filter(l => l !== ''),\n }))\n setBusy(true)\n setError('')\n try {\n const result = await api.biblePatch({ characters })\n setProject(prev => prev === null || prev.bible === undefined ? prev : { ...prev, bible: result.bible, updatedAt: new Date().toISOString() })\n pushProgress('角色知情度已保存(生成/审稿都会严格遵守信息差)', 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`保存知情度失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n }\n }\n\n /** 角色库:AI 从全书提炼角色候选。 */\n const handleRolesExtract = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel('✨ 提炼角色库中…')\n setError('')\n try {\n const result = await api.roles({ op: 'extract' })\n // 双保险:过滤掉已入库的同名角色(服务端已排除,这里兜底)。\n const inLibrary = new Set((project?.roles ?? []).map(r => r.name))\n const fresh = (result.candidates ?? []).filter(r => !inLibrary.has(r.name))\n setRoleCandidates(prev => {\n const merged = [...(prev ?? []).filter(p => !fresh.some(f => f.name === p.name)), ...fresh]\n return merged\n })\n pushProgress(`AI 提炼出 ${fresh.length} 个新角色(已排除 ${(result.candidates?.length ?? 0) - fresh.length} 个已收录)`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`角色提炼失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 角色库:采纳候选(或修改后采纳)。 */\n const handleRoleAdopt = async (role: RoleRecord): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.roles({ op: 'adopt', role })\n setProject(prev => prev === null ? prev : { ...prev, roles: result.roles, updatedAt: new Date().toISOString() })\n setRoleCandidates(prev => prev === null ? prev : prev.filter(r => r !== role))\n pushProgress(`已加入角色库:${role.name}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 角色库:保存编辑草稿。 */\n const handleRoleSave = async (): Promise<void> => {\n if (roleDraft === null) return\n if (roleDraft.name.trim() === '') {\n setError('角色名不能为空')\n return\n }\n setBusy(true)\n setError('')\n try {\n const result = await api.roles({ op: 'update', role: roleDraft })\n setProject(prev => prev === null ? prev : { ...prev, roles: result.roles, updatedAt: new Date().toISOString() })\n setRoleDraft(null)\n pushProgress(`角色已保存:${roleDraft.name}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 角色库:删除角色。 */\n const handleRoleRemove = async (name: string): Promise<void> => {\n if (!window.confirm(`确定从角色库删除「${name}」?`)) return\n setBusy(true)\n setError('')\n try {\n const result = await api.roles({ op: 'remove', name })\n setProject(prev => prev === null ? prev : { ...prev, roles: result.roles, updatedAt: new Date().toISOString() })\n pushProgress(`已从角色库删除:${name}`, 'info')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 保存世界观规则编辑(bible tab,每行一条)。 */\n const handleSaveWorldRules = async (): Promise<void> => {\n if (bible === undefined) return\n const rules = worldRulesDraft.split('\\n').map(line => line.trim()).filter(line => line !== '')\n setBusy(true)\n setError('')\n try {\n const result = await api.biblePatch({ worldRules: rules })\n setProject(prev => prev === null ? prev : { ...prev, bible: result.bible, updatedAt: new Date().toISOString() })\n pushProgress(`世界观规则已保存(${rules.length} 条)`, 'done')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 简介:AI 全量生成。 */\n const handleBlurbGenerate = async (): Promise<void> => {\n if (project === null) return\n setBusy(true)\n setBusyLabel('AI 生成简介中…')\n setError('')\n try {\n const result = await api.blurb('generate')\n setBlurbDraft(result.blurb)\n pushProgress(`简介已生成(${result.blurb.length} 字)`, 'done')\n await refresh(false)\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`简介生成失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 简介:按已写开头 AI 补全。 */\n const handleBlurbComplete = async (): Promise<void> => {\n if (project === null) return\n if (blurbDraft.trim() === '') return\n setBusy(true)\n setBusyLabel('AI 补全简介中…')\n setError('')\n try {\n const result = await api.blurb('generate', undefined, blurbDraft)\n setBlurbDraft(result.blurb)\n pushProgress(`简介已补全(${result.blurb.length} 字)`, 'done')\n await refresh(false)\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`简介补全失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 简介:手动保存。 */\n const handleBlurbSave = async (): Promise<void> => {\n if (project === null) return\n setBusy(true)\n setError('')\n try {\n const result = await api.blurb('save', blurbDraft)\n pushProgress(`简介已保存(${result.blurb.length} 字)`, 'done')\n await refresh(false)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 加载封面(进入简介页时)。 */\n const loadCover = useCallback(async (): Promise<void> => {\n try {\n const result = await api.coverGet()\n setCoverDataUrl(result.dataUrl)\n } catch { /* best-effort */ }\n }, [api])\n\n /** 封面上传(本地预览 + 落盘)。 */\n const handleCoverUpload = (file: File | undefined): void => {\n if (file === undefined) return\n const reader = new FileReader()\n reader.onload = () => {\n const dataUrl = typeof reader.result === 'string' ? reader.result : null\n if (dataUrl === null) return\n setCoverDataUrl(dataUrl)\n void (async () => {\n setBusy(true)\n setError('')\n try {\n await api.coverPost('upload', dataUrl)\n pushProgress(`封面已上传:${file.name}`, 'done')\n await refresh(false)\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`封面上传失败:${(err as Error).message}`, 'error')\n await loadCover()\n } finally {\n setBusy(false)\n }\n })()\n }\n reader.readAsDataURL(file)\n }\n\n /** 工作区:AI 审查当前编辑的正文(不落盘)。 */\n const handleWsCheck = async (): Promise<void> => {\n if (workspace === null) return\n if (workspace.original.trim().length < 50) {\n setError('正文过短(<50 字),请先编辑内容')\n return\n }\n setBusy(true)\n setBusyLabel(`AI 审查 第${workspace.no}章`)\n setError('')\n try {\n const result = await api.chapterCheck(workspace.no, workspace.original)\n setWsCheckReport(result.report)\n // 默认勾选 high 问题(无 high 则勾选全部 medium),作者可自行增删。\n const highIdx = result.report.issues.map((it, i) => ({ it, i })).filter(x => x.it.severity === 'high').map(x => x.i)\n const mediumIdx = result.report.issues.map((it, i) => ({ it, i })).filter(x => x.it.severity === 'medium').map(x => x.i)\n setWsChecked(highIdx.length > 0 ? highIdx : mediumIdx)\n pushProgress(`审查完成:${result.report.score} 分 — ${result.report.verdict}`, result.report.passed ? 'done' : 'error')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`AI 审查失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 工作区「应用并保存」:有草稿(修订/润色产物)→ 应用草稿落盘;无草稿(手动编辑)→ 保存原文。\n * 沿用已有审查报告(wsCheckReport)或后端自动审稿;成功后原地进入「已采纳」结论态,返回定位到该章。 */\n const handleWsSave = async (): Promise<void> => {\n if (workspace === null) return\n if (workspace.original.trim().length < 50) {\n setError('正文过短(<50 字),未保存')\n return\n }\n setBusy(true)\n setError('')\n const no = workspace.no\n try {\n let report: ReviewReport | undefined = undefined\n let chars = workspace.original.length\n if (workspace.draft !== null) {\n // 有草稿:应用草稿(draftApply 已返回新正文 markdown;携带审查报告沿用结论定状态)。\n setBusyLabel(`应用草稿 第${no}章`)\n const result = await api.draftApply(no, wsCheckReport ?? undefined)\n report = wsCheckReport ?? undefined\n chars = result.chars\n setWorkspace(prev => prev === null ? prev : {\n ...prev,\n original: result.markdown ?? prev.original,\n draft: null,\n applied: true,\n })\n } else {\n // 无草稿:保存当前原文(沿用报告或后端自动审稿,1-2 分钟)。\n setBusyLabel(`AI 审查 第${no}章`)\n const result = await api.chapterSave(no, workspace.original, wsCheckReport ?? undefined)\n report = result.report\n setWorkspace(prev => prev === null ? prev : { ...prev, applied: true })\n }\n setDraftNo(null)\n if (report !== undefined) {\n pushProgress(`已保存并审稿:${report.score} 分 — ${report.verdict}(${report.passed ? '通过' : '未通过'})`, report.passed ? 'done' : 'error')\n } else {\n pushProgress(`已保存第 ${no} 章(${chars} 字,原稿已备份 .bak)`, 'done')\n }\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`保存失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\n\n /** 移除封面。 */\n const handleCoverRemove = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await api.coverPost('remove')\n setCoverDataUrl(null)\n pushProgress('封面已移除', 'info')\n await refresh(false)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 重命名当前书(同步项目与书架)。 */\n const handleRename = async (): Promise<void> => {\n const name = bookNameDraft.trim()\n if (name === '' || project === null || name === project.bookName) return\n setBusy(true)\n setError('')\n try {\n const result = await api.rename(name)\n pushProgress(`书名已改为《${result.bookName}》`, 'done')\n await refresh(false)\n await refreshShelf()\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`改名失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n }\n }\n\n /** Extract the story bible. */\n const handleBible = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel(tt('bible.gen'))\n setError('')\n try {\n const result = await api.bible(outlineText || undefined)\n setProject(prev => prev === null ? prev : { ...prev, bible: result.bible, updatedAt: new Date().toISOString() })\n const bible: StoryBible = result.bible\n pushProgress(tt('workflow.bibleDone', {\n n: bible.worldRules.length,\n c: bible.characters.length,\n r: bible.redLines.length,\n }), 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`提炼道藏失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** Plan volumes. */\n const handleVolumes = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel(tt('workflow.genVolumes'))\n setError('')\n try {\n const result = await api.volumes(outlineText || undefined)\n setProject(prev => prev === null ? prev : { ...prev, volumes: result.volumes, updatedAt: new Date().toISOString() })\n pushProgress(tt('workflow.volumesDone', { n: result.volumes.length }), 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`生成卷计划失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** Generate the chapter plan via LLM. */\n const handlePlan = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel(tt('plan.generate'))\n setError('')\n try {\n const result = await api.plan(outlineText || undefined, planCount)\n let freshCount = 0\n setProject(prev => {\n const base = prev ?? {\n bookName: '', outline: outlineText, chapters: [] as ChapterPlan[],\n foreshadows: [] as Foreshadow[], createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(),\n }\n // 追加时按标题去重,避免重复生成计划导致剧情「重头再来」。\n const existingTitles = new Set(base.chapters.map(c => c.title))\n const fresh = result.chapters.filter(c => !existingTitles.has(c.title))\n freshCount = fresh.length\n if (fresh.length === 0) return base\n return { ...base, chapters: [...base.chapters, ...fresh], updatedAt: new Date().toISOString() }\n })\n pushProgress(tt('workflow.planDone', { n: freshCount }), 'done')\n if (freshCount < result.chapters.length) {\n pushProgress(`已跳过 ${result.chapters.length - freshCount} 个与已有章节同名的重复章节`, 'error')\n }\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`生成章节计划失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 打开某章的工作区(读取服务器原文;有遗留草稿时预载草稿;可预填修订指令)。 */\n const openWorkspace = useCallback(async (no: number, instruction?: string, mode?: 'pick' | 'result'): Promise<void> => {\n try {\n const [chapterRes, statusRes] = await Promise.all([api.chapter(no), api.status()])\n const chapter = statusRes.project?.chapters.find(c => c.no === no)\n if (chapter === undefined) return\n // 指令框只承载「显式传入的指令」(如按质检/敏感词意见修订);\n // 审稿意见统一由下方可勾选列表承载,不再自动预填文字,避免重复。\n const autoInstruction = instruction ?? ''\n setWorkspace({\n no,\n title: chapter.title,\n original: chapterRes.markdown,\n instruction: autoInstruction,\n draft: chapter.pendingDraft !== undefined && chapter.pendingDraft !== '' ? chapter.pendingDraft : null,\n })\n setWsSelected('')\n setWsShowDiff(true)\n if (mode === 'result') {\n // 一键修订结果模式:不再加载旧审稿意见(修订已按意见执行完),\n // 直接展示草稿;wsResultMode 标记用于顶部「✅ 修订完成」横幅。\n setWsCheckReport(null)\n setWsChecked([])\n setWsResultMode(true)\n } else {\n // 意见统一为「当前意见」:进工作区即加载已有审稿意见为可勾选列表,\n // 默认勾选 high(无 high 则勾选全部 medium),作者可自行增删。\n setWsResultMode(false)\n const carried = chapter.review\n setWsCheckReport(carried ?? null)\n if (carried !== undefined && carried.issues.length > 0) {\n const highIdx = carried.issues.map((it, i) => ({ it, i })).filter(x => x.it.severity === 'high').map(x => x.i)\n const mediumIdx = carried.issues.map((it, i) => ({ it, i })).filter(x => x.it.severity === 'medium').map(x => x.i)\n setWsChecked(highIdx.length > 0 ? highIdx : mediumIdx)\n } else {\n setWsChecked([])\n }\n }\n } catch { /* best-effort */ }\n }, [api])\n\n /** 捕获工作区原文 textarea 中选中的文字(局部修订目标)。 */\n const captureWsSelection = (): void => {\n const el = wsEditorRef.current\n if (el === null) return\n const start = el.selectionStart ?? 0\n const end = el.selectionEnd ?? 0\n if (end > start) setWsSelected(el.value.slice(start, end).trim())\n else setWsSelected('')\n }\n\n /** 工作区:去 AI 味润色(流式 → 预览草稿)。 */\n const handleWsPolish = async (): Promise<void> => {\n if (workspace === null) return\n setBusy(true)\n setBusyLabel(`${tt('plan.polish')} 第${workspace.no}章`)\n setError('')\n try {\n await api.polish(workspace.no, frame => { applyJobFrame(frame, n => tt('progress.polishing', { no: n })) })\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`第 ${workspace.no} 章润色失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\n\n /** 工作区:按指令修订(whole=true 整章,false 仅修订选中片段)。 */\n /** 工作区:对草稿自动跑一次 AI 审查(不落盘),刷新「当前意见」为草稿版本。 */\n /**\n * 主观项豁免判定(方案 B):修订后审查中,剩余问题若没有 high(逻辑/设定/事实矛盾),\n * 即使分数未达阈值也视为可接受——主观项(文笔/节奏/套话)不再无限循环卡修订。\n */\n const reviseAcceptable = (report: ReviewReport): boolean =>\n report.passed || report.issues.every(i => i.severity !== 'high')\n\n const autoCheckDraft = async (no: number, previousReport?: ReviewReport | null): Promise<void> => {\n const draft = project?.chapters.find(c => c.no === no)?.pendingDraft\n if (draft === undefined || draft === '') return\n setBusyLabel(`AI 审查草稿 第${no}章`)\n try {\n // 携带上一轮审稿报告 → 后端走「验证模式」:核对原意见是否解决 + 只挑新增 high,防止越修越多。\n const result = await api.chapterCheck(no, draft, previousReport ?? undefined)\n // 主观项豁免:无 high 即视为通过(passed 置 true,供保存沿用与横幅展示)。\n const acceptable = reviseAcceptable(result.report)\n const report: ReviewReport = acceptable ? { ...result.report, passed: true } : result.report\n setWsCheckReport(report)\n const highIdx = report.issues.map((it, i) => ({ it, i })).filter(x => x.it.severity === 'high').map(x => x.i)\n const mediumIdx = report.issues.map((it, i) => ({ it, i })).filter(x => x.it.severity === 'medium').map(x => x.i)\n setWsChecked(highIdx.length > 0 ? highIdx : mediumIdx)\n if (acceptable && !result.report.passed) {\n pushProgress(`草稿审查:${report.score} 分 — 可接受(剩余均为主观项,无逻辑/设定矛盾)`, 'done')\n } else {\n pushProgress(`草稿审查:${report.score} 分 — ${report.verdict}`, report.passed ? 'done' : 'error')\n }\n } catch (err) {\n pushProgress(`草稿审查失败:${(err as Error).message}`, 'error')\n } finally {\n setBusyLabel('')\n }\n }\n\n const handleWsRewrite = async (whole: boolean, overrideInstruction?: string): Promise<void> => {\n if (workspace === null) return\n const target = whole ? '' : wsSelected\n const instruction = overrideInstruction ?? workspace.instruction\n // 新一轮修订开始:清掉「已采纳」结论态(横幅只在采纳后短暂停留)。\n if (workspace.applied === true) {\n setWorkspace({ ...workspace, applied: false })\n }\n setBusy(true)\n setBusyLabel(`${tt('plan.rewrite')} 第${workspace.no}章`)\n setError('')\n const no = workspace.no\n try {\n await api.rewrite(no, instruction, target, frame => { applyJobFrame(frame, n => tt('progress.rewriting', { no: n })) })\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`第 ${no} 章修订失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n // 修订后自动审查(设置开关,默认开):草稿 → 验证模式审查(携带本次修订所依据的报告),\n // 核对原意见解决情况 + 只挑新增 high,防止\"越修 high 越多\"。\n if (config?.autoReviewAfterRevise !== false) {\n setBusy(true)\n await autoCheckDraft(no, wsCheckReport)\n setBusy(false)\n }\n }\n }\n\n /** 工作区:按审查报告中勾选的问题一键修订(按勾选意见整章修订到草稿,不污染指令框)。 */\n const handleWsReviseByReport = async (): Promise<void> => {\n if (workspace === null || wsCheckReport === null) return\n const picked = wsChecked\n .map(i => wsCheckReport.issues[i])\n .filter((it): it is ReviewReport['issues'][number] => it !== undefined)\n .slice(0, 5)\n if (picked.length === 0) return\n const instruction = '按审稿意见修订(优先处理):\\n' + picked.map(i => `[${i.severity}] ${i.item} → ${i.suggestion}`).join('\\n')\n await handleWsRewrite(true, instruction)\n }\n\n /** 列表页「按意见修订」一键直达:不进工作区,直接按该章审稿意见全部修订(high 优先,\n * 无 high 用 medium,不足取前 3 条),修订完自动打开工作区展示草稿 + 自动审查结果。 */\n const handleReviseNow = async (no: number): Promise<void> => {\n const chapter = chapters.find(c => c.no === no)\n if (chapter?.review === undefined || chapter.review.issues.length === 0) {\n openWorkspace(no)\n return\n }\n const issues = chapter.review.issues\n const high = issues.filter(i => i.severity === 'high')\n const medium = issues.filter(i => i.severity === 'medium')\n const picked = high.length > 0 ? high : medium.length > 0 ? medium : issues\n const top = picked.slice(0, 5)\n const instruction = '按审稿意见修订(优先处理):\\n' + top.map(i => `[${i.severity}] ${i.item} → ${i.suggestion}`).join('\\n')\n setBusy(true)\n setBusyLabel(`${tt('plan.rewrite')} 第${no}章`)\n setError('')\n try {\n await api.rewrite(no, instruction, '', frame => { applyJobFrame(frame, n => tt('progress.rewriting', { no: n })) })\n await refresh(false)\n // 结果模式打开工作区:不展示旧意见,直接看草稿;开启自动审查时以「验证模式」跑一次\n // (携带本章原审稿报告:核对原意见解决情况 + 只挑新增 high,防止越修越多)。\n await openWorkspace(no, undefined, 'result')\n if (config?.autoReviewAfterRevise !== false) {\n setBusy(true)\n await autoCheckDraft(no, chapter.review)\n }\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`第 ${no} 章修订失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 放弃草稿:保留原稿,仅清空草稿。 */\n const handleDraftDiscard = async (no: number): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await api.draftDiscard(no)\n setWorkspace(null)\n setWsResultMode(false)\n setDraftNo(null)\n pushProgress(`已放弃第 ${no} 章草稿,保留原稿`, 'info')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`放弃第 ${no} 章草稿失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\n\n /** Shared frame handler for generate/rewrite/polish streams. */\n const applyJobFrame = useCallback((frame: JobFrame, label: (no: number) => string) => {\n if (frame.type === 'start') {\n clearLiveProgress()\n setLiveBar(null)\n lastDeltaChars.current = 0\n liveChars.current = 0\n currentJobNo.current = frame.no\n // 任务开始:不自动弹出进度悬浮窗(导航「工作进度」显示呼吸绿点提示,\n // 想看进度时手动点导航打开;liveBar 数据照常累积)。\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === frame.no ? { ...c, status: 'generating', error: undefined } : c),\n })\n pushProgress(label(frame.no))\n } else if (frame.type === 'delta') {\n // One live row updated in place — no per-token console spam. The\n // server streams incremental text, so accumulate locally.\n const chars = (liveChars.current += frame.text.length)\n const target = project?.chapters.find(c => c.no === currentJobNo.current)?.targetChars ?? 0\n if (chars < 50 || chars - lastDeltaChars.current >= 200) {\n lastDeltaChars.current = chars\n const text = target > 0 ? `已生成 ${chars} / ${target} 字` : `已生成 ${chars} 字`\n const ratio = target > 0 ? Math.min(chars / target, 1) : undefined\n setLiveProgress(text, ratio)\n setLiveBar({ text, ratio })\n }\n } else if (frame.type === 'done' || frame.type === 'rewritten') {\n clearLiveProgress()\n setLiveBar(null)\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === frame.no ? { ...c, status: 'written', chars: frame.chars, file: frame.file, review: undefined } : c),\n })\n pushProgress(tt('progress.done', { no: frame.no, chars: frame.chars, file: frame.file }), 'done')\n setGeneratedFiles(prev => prev.includes(frame.file) ? prev : [...prev, frame.file])\n } else if (frame.type === 'review') {\n clearLiveProgress()\n setLiveBar(null)\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === frame.no ? { ...c, status: frame.report.passed ? 'approved' : 'rejected', review: frame.report } : c),\n })\n pushProgress(tt('progress.reviewed', {\n no: frame.no,\n score: frame.report.score,\n verdict: frame.report.verdict,\n }), frame.report.passed ? 'done' : 'error')\n } else if (frame.type === 'author-review') {\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === frame.no ? { ...c, authorReview: frame.review } : c),\n })\n const r = frame.review\n pushProgress(\n `📋 第${frame.no}章作者复盘:钩子${r.hookHonored ? '已兑现 ✓' : '未兑现 ✗'} · 结尾钩子 ${r.endingHook}/10 · ${r.plotlineProgress !== '' ? r.plotlineProgress : '无实质推进'}`,\n r.hookHonored && r.endingHook >= 6 ? 'done' : r.endingHook < 6 || !r.hookHonored ? 'error' : 'info',\n )\n } else if (frame.type === 'author-backfill-done') {\n clearLiveProgress()\n setLiveBar(null)\n pushProgress(`✅ 历史章节作者复盘补齐完成(共 ${frame.count} 章)`, 'done')\n void refresh(false)\n } else if (frame.type === 'drafted') {\n // 润色/重写完成:产物作为待确认草稿,展示在工作区预览,由用户决定。\n clearLiveProgress()\n setLiveBar(null)\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === frame.no ? { ...c, pendingDraft: frame.draft } : c),\n })\n pushProgress(`第 ${frame.no} 章润色完成(${frame.chars} 字),请查看预览后应用或放弃`)\n setDraftNo(frame.no)\n setWsShowDiff(false)\n setWorkspace(prev => prev !== null && prev.no === frame.no ? { ...prev, draft: frame.draft } : prev)\n } else if (frame.type === 'error') {\n clearLiveProgress()\n setLiveBar(null)\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === frame.no ? { ...c, status: 'error', error: frame.message } : c),\n })\n pushProgress(tt('progress.error', { no: frame.no, message: frame.message }), 'error')\n }\n }, [pushProgress, setLiveProgress, clearLiveProgress, project])\n\n /** Generate one chapter, streaming frames into the console. */\n const handleWriteChapter = async (no: number, skipReview: boolean): Promise<void> => {\n setBusy(true)\n setBusyLabel(`${tt('plan.write')} 第${no}章`)\n setError('')\n try {\n await api.generate(no, skipReview, frame => { applyJobFrame(frame, n => tt('progress.generating', { no: n, title: (project?.chapters.find(c => c.no === n)?.title ?? '') })) })\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`第 ${no} 章失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\n\n /** Batch-write all remaining chapters in sequence (auto-retry once per chapter). */\n const handleWriteAll = async (): Promise<void> => {\n const remaining = chapters.filter(c => c.status === 'pending' || c.status === 'error')\n if (remaining.length === 0) return\n setBusy(true)\n setBusyLabel(`${tt('plan.writeAllPending')}(共 ${remaining.length} 章)`)\n setError('')\n let failed = 0\n const sleep = (ms: number): Promise<void> => new Promise(resolve => setTimeout(resolve, ms))\n for (const chapter of remaining) {\n pushProgress(`▶ 开始生成第 ${chapter.no} 章《${chapter.title}》`)\n let lastError: unknown = null\n // 失败自动重试:最多尝试 2 次,间隔 3 秒(网络抖动/LLM 偶发失败自愈)。\n for (let attempt = 1; attempt <= 2; attempt++) {\n try {\n // 批量连写也走完整质量门:生成 → 自动审稿 → 作者复盘(false = 不跳过审稿)。\n await api.generate(chapter.no, false, frame => { applyJobFrame(frame, n => tt('progress.generating', { no: n, title: (project?.chapters.find(c => c.no === n)?.title ?? '') })) })\n lastError = null\n break\n } catch (err) {\n lastError = err\n if (attempt < 2) {\n pushProgress(`第 ${chapter.no} 章第 ${attempt} 次尝试失败(${(err as Error).message}),3 秒后自动重试…`, 'error')\n await sleep(3000)\n }\n }\n }\n if (lastError !== null) {\n failed++\n pushProgress(`第 ${chapter.no} 章失败:${(lastError as Error).message}`, 'error')\n }\n }\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n pushProgress(failed === 0\n ? `批量生成完成:${remaining.length} 章全部完成`\n : `批量生成结束:${remaining.length - failed} 章完成,${failed} 章失败`, failed === 0 ? 'done' : 'error')\n }\n\n /** Review one chapter. */\n const handleReview = async (no: number): Promise<void> => {\n setBusy(true)\n setBusyLabel(`${tt('plan.review')} 第${no}章`)\n setError('')\n try {\n const result = await api.review(no)\n const report: ReviewReport = result.report\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === no ? { ...c, status: report.passed ? 'approved' : 'rejected', review: report } : c),\n })\n pushProgress(tt('progress.reviewed', { no, score: report.score, verdict: report.verdict }), report.passed ? 'done' : 'error')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** Toggle chapter preview. */\n const handleToggleChapter = async (no: number): Promise<void> => {\n if (expandedChapter === no) {\n setExpandedChapter(null)\n setChapterText('')\n return\n }\n setExpandedChapter(no)\n setChapterText('')\n try {\n const result = await api.chapter(no)\n setChapterText(result.markdown)\n } catch (err) {\n setChapterText(`(${(err as Error).message})`)\n }\n }\n\n /** Suggest foreshadows via LLM. */\n const handleSuggestForeshadows = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel(tt('foreshadow.suggest'))\n setError('')\n try {\n const result = await api.foreshadow({ suggest: true })\n setProject(prev => prev === null ? prev : { ...prev, foreshadows: [...(prev?.foreshadows ?? []), ...result.foreshadows], updatedAt: new Date().toISOString() })\n pushProgress(`AI 已建议 ${result.foreshadows.length} 条伏笔`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`伏笔建议失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** Save the settings draft. */\n const handleSaveConfig = async (): Promise<void> => {\n if (configDraft === null) return\n setBusy(true)\n setError('')\n try {\n const result = await api.patchConfig({\n outlinePath: configDraft.outlinePath,\n outputDir: configDraft.outputDir,\n provider: configDraft.provider,\n model: configDraft.model,\n reasoningEffort: configDraft.reasoningEffort ?? 'off',\n chapterChars: configDraft.chapterChars,\n maxTokens: configDraft.maxTokens,\n reviewPassScore: configDraft.reviewPassScore,\n autoReview: configDraft.autoReview,\n autoAuthorReview: configDraft.autoAuthorReview,\n autoReviewAfterRevise: configDraft.autoReviewAfterRevise,\n imageApiKey: configDraft.imageApiKey,\n imageApiModel: configDraft.imageApiModel,\n imageApiEnabled: configDraft.imageApiEnabled ?? false,\n })\n setConfig(result.config)\n setConfigDraft(result.config)\n setNotice(tt('settings.saved'))\n pushProgress(tt('settings.saved'), 'done')\n await refresh(false)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** Export the book. */\n const handleExport = async (format: 'txt' | 'md'): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.exportBook(format)\n setNotice(tt('settings.exported', { file: result.file, chars: result.chars, chapters: result.chapters }))\n pushProgress(tt('settings.exported', { file: result.file, chars: result.chars, chapters: result.chapters }), 'done')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n const busyAny = anyGenerating(project?.chapters)\n const chapters = project?.chapters ?? []\n const doneCount = chapters.filter(c => c.status === 'approved' || c.status === 'written' || c.status === 'rejected').length\n const pendingCount = chapters.filter(c => c.status === 'pending' || c.status === 'error').length\n const bible: StoryBible | undefined = project?.bible\n const volumes: Volume[] | undefined = project?.volumes\n const foreshadows: Foreshadow[] = project?.foreshadows ?? []\n\n /**\n * 定位章节:从待办/主行动卡跳到章节页的目标章——切 tab、解除卷筛选、\n * 展开所在卷,并滚动高亮(focusNo 驱动 useEffect 执行)。\n * 不强行展开章节详情:保持章节原有收起/展开状态,避免页面被撑开。\n */\n const gotoChapter = useCallback((no: number): void => {\n setActiveTab('plan')\n setSelectedVolume('all')\n // 展开目标章所在卷(从折叠列表移除该卷号)。\n const chapter = chapters.find(c => c.no === no)\n if (chapter !== undefined && chapter.volume > 0) {\n setCollapsedVolumes(prev => prev.filter(v => v !== chapter.volume))\n }\n setFocusNo(no)\n }, [chapters])\n\n /** focusNo 驱动:等 DOM 渲染后滚动到目标章并短暂高亮(3 秒后清除)。 */\n useEffect(() => {\n if (focusNo === null) return\n const timer = window.setTimeout(() => {\n const el = document.querySelector(`[data-chapter-no=\"${focusNo}\"]`)\n if (el !== null) {\n el.scrollIntoView({ behavior: 'smooth', block: 'center' })\n el.classList.add(css.chapterFocus)\n window.setTimeout(() => { el.classList.remove(css.chapterFocus) }, 3000)\n }\n setFocusNo(null)\n }, 350)\n return () => { window.clearTimeout(timer) }\n }, [focusNo])\n\n /** 章节按卷分组(未分卷章节单独一组;章节多时可按卷折叠浏览)。 */\n const chapterGroups = useMemo(() => {\n const groups: Array<{ no: number; title: string; chapters: ChapterPlan[] }> = []\n if (volumes !== undefined) {\n for (const v of volumes) {\n const list = chapters.filter(c => c.volume === v.no)\n if (list.length > 0) groups.push({ no: v.no, title: `第${v.no}卷 · ${v.title}`, chapters: list })\n }\n }\n const unassigned = chapters.filter(c => c.volume === 0)\n if (unassigned.length > 0) groups.push({ no: 0, title: '未分卷', chapters: unassigned })\n if (groups.length === 0) groups.push({ no: 0, title: '全部章节', chapters })\n return groups\n }, [chapters, volumes])\n\n // --------------------------------------------------- dashboard (workflow)\n const approvedCount = chapters.filter(c => c.status === 'approved').length\n const reviewPendingCount = chapters.filter(c => c.status === 'written' || c.status === 'rejected').length\n const writingNow = chapters.find(c => c.status === 'generating' || c.status === 'reviewing')\n const totalChars = chapters.reduce((sum, c) => sum + (c.chars ?? 0), 0)\n const firstChapter = chapters[0]\n const currentVolumeName = (() => {\n if (firstChapter === undefined || volumes === undefined || volumes.length === 0) return '—'\n const vol = volumes.find(v => v.no === firstChapter.volume)\n return vol !== undefined ? vol.title : `第 ${firstChapter.volume} 卷`\n })()\n const lastUpdated = project?.updatedAt !== undefined\n ? new Date(project.updatedAt).toLocaleString('zh-CN', { month: 'numeric', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n : '—'\n\n /** 创作旅程 6 阶段(完成/当前/未到)。 */\n const journeyStages: Array<{ id: string; label: string; done: boolean }> = [\n { id: 'outline', label: '大纲', done: project !== null },\n { id: 'bible', label: '设定', done: bible !== undefined },\n { id: 'volumes', label: '卷计划', done: volumes !== undefined },\n { id: 'plan', label: '章节计划', done: chapters.length > 0 },\n { id: 'write', label: '正文', done: chapters.some(c => (c.chars ?? 0) > 0) },\n { id: 'review', label: '审稿', done: approvedCount > 0 },\n ]\n const journeyDoneCount = journeyStages.filter(s => s.done).length\n const journeyPercent = Math.round((journeyDoneCount / journeyStages.length) * 100)\n const currentStageId = journeyStages.find(s => !s.done)?.id\n\n /** 创作时间线阶段点击 → 跳转对应 tab。 */\n const jumpToStage = (id: string): void => {\n switch (id) {\n case 'outline': setActiveTab('overview'); break\n case 'bible': setActiveTab('book'); changeBookTab('bible'); break\n case 'volumes':\n case 'plan':\n case 'write': setActiveTab('plan'); break\n case 'review': setActiveTab('book'); changeBookTab('facts'); changeArchiveTab('reviews'); break\n }\n }\n\n /** 侧栏当前书卡(demo 风格):书架激活书 → 封面首字 / 书名 / 进度。 */\n const activeBook = shelf?.books.find(b => b.id === shelf?.activeBookId) ?? null\n const activeBookName = activeBook?.bookName ?? project?.bookName ?? '未选书'\n const activeBookMeta = activeBook !== null ? `${activeBook.done}/${activeBook.total} 章 · 点按打开书架` : '点按打开书架'\n const activeBookLetter = activeBookName.trim().charAt(0) || '书'\n\n /** 主行动卡片:推荐下一步(AI-Novel-Writing-Assistant 首页主卡模式)。 */\n const nextAction = useMemo((): { eyebrow: string; title: string; reason: string; actionLabel: string; onClick: () => void } | null => {\n if (project === null) {\n return {\n eyebrow: '开始你的第一本书',\n title: '导入小说大纲',\n reason: '从 docx 文件或粘贴文本开始,AI 会把一份大纲「编译」成完整的小说。',\n actionLabel: '导入大纲',\n onClick: () => { setActiveTab('overview') },\n }\n }\n if (bible === undefined) {\n return {\n eyebrow: '推荐下一步',\n title: '提炼道藏',\n reason: '人设、世界观、金手指规则、写作红线是后续所有生成的地基,越完整质量越高。',\n actionLabel: '生成道藏',\n onClick: () => { void handleBible() },\n }\n }\n if (volumes === undefined) {\n return {\n eyebrow: '推荐下一步',\n title: '规划全书卷结构',\n reason: '按剧情弧线划分卷,章节计划才有骨架可依。',\n actionLabel: '生成卷计划',\n onClick: () => { void handleVolumes() },\n }\n }\n if (chapters.length === 0) {\n return {\n eyebrow: '推荐下一步',\n title: '生成章节计划',\n reason: 'LLM 根据大纲拆解每章标题与剧情要点,然后就可以逐章生成正文。',\n actionLabel: '生成章节计划',\n onClick: () => { void handlePlan() },\n }\n }\n const drafting = chapters.find(c => c.pendingDraft !== undefined && c.pendingDraft !== '')\n if (drafting !== undefined) {\n return {\n eyebrow: '需要你确认',\n title: `第 ${drafting.no} 章有未采纳的润色草稿`,\n reason: '打开工作区查看对比,决定采纳新稿或保留原稿(原稿未被改动)。',\n actionLabel: '打开工作区',\n onClick: () => { void openWorkspace(drafting.no) },\n }\n }\n if (pendingCount > 0) {\n return {\n eyebrow: '继续创作',\n title: `还有 ${pendingCount} 章待生成`,\n reason: '批量生成剩余章节,顶部进度条会实时显示每章字数与进度。',\n actionLabel: `批量生成(${pendingCount})`,\n onClick: () => { void handleWriteAll() },\n }\n }\n if (reviewPendingCount > 0) {\n const firstPending = chapters.find(c => c.status === 'written' || c.status === 'rejected')\n return {\n eyebrow: '推荐下一步',\n title: `${reviewPendingCount} 章待审稿`,\n reason: '审稿通过后章节才算完成;不通过的可按意见在工作区修订。',\n actionLabel: '去审稿',\n onClick: () => { if (firstPending !== undefined) gotoChapter(firstPending.no) },\n }\n }\n return {\n eyebrow: '全部完成 🎉',\n title: '《' + project.bookName + '》已全部生成',\n reason: '可以去 AI 味润色(对比后采纳)、按卷复查或导出全本(TXT/MD)。',\n actionLabel: '导出全本',\n onClick: () => { void handleExport('txt') },\n }\n }, [project, bible, volumes, chapters, pendingCount, reviewPendingCount, openWorkspace, gotoChapter])\n\n /** 待办队列(失败/草稿/待审稿,点击直达)。 */\n const todos = useMemo(() => {\n const items: Array<{ tone: 'danger' | 'warning' | 'info' | 'success'; title: string; description: string; actionLabel: string; onClick: () => void }> = []\n for (const chapter of chapters) {\n if (chapter.status === 'error') {\n items.push({\n tone: 'danger',\n title: `第 ${chapter.no} 章《${chapter.title}》生成失败`,\n description: chapter.error ?? '',\n actionLabel: '去处理',\n onClick: () => { gotoChapter(chapter.no) },\n })\n }\n if (items.length >= 3) return items\n }\n const drafting = chapters.find(c => c.pendingDraft !== undefined && c.pendingDraft !== '')\n if (drafting !== undefined && items.length < 3) {\n items.push({\n tone: 'warning',\n title: `第 ${drafting.no} 章《${drafting.title}》有未采纳草稿`,\n description: '原稿未被改动,采纳或放弃由你决定',\n actionLabel: '打开工作区',\n onClick: () => { void openWorkspace(drafting.no) },\n })\n }\n for (const chapter of chapters) {\n if ((chapter.status === 'written' || chapter.status === 'rejected') && items.length < 3) {\n items.push({\n tone: 'info',\n title: `第 ${chapter.no} 章《${chapter.title}》待审稿`,\n description: chapter.status === 'rejected' ? '审稿未通过,可按意见修订' : '等待 AI 审稿确认',\n actionLabel: '去审稿',\n onClick: () => { gotoChapter(chapter.no) },\n })\n }\n }\n return items\n }, [chapters, openWorkspace, gotoChapter])\n\n /** 资产健康(设定/卷/写作资产/伏笔)。 */\n const assetSummary = (() => {\n const assets = project?.assets\n const parts: string[] = []\n if (assets?.genre !== undefined) parts.push(`题材:${assets.genre.name}`)\n if (assets?.primaryProgression !== undefined) parts.push(`推进:${assets.primaryProgression.name}`)\n if ((assets?.styleAssets?.length ?? 0) > 0) parts.push(`写法:${assets!.styleAssets!.length} 套`)\n return parts.length > 0 ? parts.join(' · ') : '题材 / 推进 / 写法未绑定'\n })()\n const assetCount = (() => {\n const assets = project?.assets\n let n = 0\n if (assets?.genre !== undefined) n++\n if (assets?.primaryProgression !== undefined) n++\n n += assets?.auxiliaryProgressions?.length ?? 0\n n += assets?.styleAssets?.length ?? 0\n n += assets?.antiAiRules?.length ?? 0\n return n\n })()\n\n return (\n <div className={css.panel} data-nf-theme={panelTheme}>\n {viewMode === 'shelf' ? (\n /* 书架首页:默认视图,选择一本书进入工作台或阅读页 */\n <ShelfView\n api={api}\n shelf={shelf ?? { books: [], activeBookId: null }}\n onOpenBook={async (id) => {\n await activateBook(id, 'workspace')\n }}\n onReadBook={async (id) => {\n await activateBook(id, 'reader')\n }}\n onAddBook={() => { setViewMode('create') }}\n />\n ) : viewMode === 'create' ? (\n /* 开书向导:独立页面 */\n <CreateBookView\n api={api}\n onBack={() => { setViewMode('shelf') }}\n onCreated={async (id) => {\n setBusy(true)\n try {\n setOutlineText('')\n setProject(null)\n setGeneratedFiles([])\n setChapterText('')\n setExpandedChapter(null)\n setProgress([])\n setAuditIssues(null)\n setCharCards(null)\n await refresh(false, true)\n await refreshShelf()\n setViewMode('workspace')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }}\n />\n ) : viewMode === 'reader' ? (\n /* 沉浸式阅读页:只读已写章节 */\n <ReaderView\n api={api}\n project={project ?? { bookName: '', outline: '', chapters: [], foreshadows: [], createdAt: '', updatedAt: '' }}\n onBack={() => { setViewMode('shelf') }}\n onOpenWorkspace={() => { setViewMode('workspace') }}\n />\n ) : (\n <>\n <div className={css.panelBody}>\n <nav className={`${css.panelNav} ${navCollapsed ? css.panelNavCollapsed : ''}`} role=\"tablist\" aria-label=\"工作台导航\">\n {/* 标题区:小说工坊 + 当前书名(顶部标题栏取消后移入侧栏) */}\n <div className={css.navTitle}>\n <div className={css.navTitleLogo}>书</div>\n {!navCollapsed && (\n <div style={{ minWidth: 0 }}>\n <div className={css.navTitleName}>小说工坊</div>\n <div className={css.navTitleBook} title={project?.bookName ?? ''}>\n {project?.bookName !== undefined && project.bookName !== '' ? `📖 ${project.bookName}` : '未选书'}\n </div>\n </div>\n )}\n </div>\n {/* 分组导航(创作 / 工具 / 数据库) */}\n {NAV_GROUPS.map(group => (\n <div key={group.id} className={css.navGroup}>\n {!navCollapsed && <div className={css.navGroupLabel}>{group.label}</div>}\n {group.items.map(tab => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={activeTab === tab.id || (tab.id === 'assistant' && assistantOpen) || (tab.id === 'progress' && progressOpen)}\n data-active={activeTab === tab.id || (tab.id === 'assistant' && assistantOpen) || (tab.id === 'progress' && progressOpen) ? '' : undefined}\n className={css.navTab}\n title={tab.label}\n onClick={() => {\n if (tab.id === 'assistant') {\n setAssistantOpen(true)\n } else if (tab.id === 'progress') {\n setProgressOpen(v => !v)\n } else {\n setActiveTab(tab.id)\n }\n }}\n >\n <span className={css.navTabIcon}>{tab.icon}</span>\n {!navCollapsed && <span className={css.navTabLabel}>{tab.label}</span>}\n {/* 状态角标:章节待办 / 伏笔待埋 / 工作流进度 */}\n {tab.id === 'plan' && (pendingCount > 0 || reviewPendingCount > 0) && (\n <span className={`${css.navTabBadge} ${chapters.some(c => c.status === 'error') ? css.navTabBadgeDanger : css.navTabBadgeWarn}`}>\n {chapters.some(c => c.status === 'error') ? `!${pendingCount + reviewPendingCount}` : pendingCount + reviewPendingCount}\n </span>\n )}\n {tab.id === 'plotlines' && foreshadows.some(f => f.status === 'planned') && (\n <span className={css.navTabBadge}>{foreshadows.filter(f => f.status === 'planned').length}</span>\n )}\n {tab.id === 'workflow' && chapters.length > 0 && (\n <span className={`${css.navTabBadge} ${css.navTabBadgeDone}`}>{journeyPercent}%</span>\n )}\n {/* 任务进行中:工作进度导航显示呼吸绿点(悬停看任务名),不自动弹窗 */}\n {tab.id === 'progress' && busy && (\n <span\n className={`${css.navTabBadge} ${css.navTabBadgeLive}`}\n title={busyLabel !== '' ? `任务中:${busyLabel}` : '任务进行中'}\n >\n ●\n </span>\n )}\n </button>\n ))}\n {!navCollapsed && <div className={css.navGroupSep} />}\n </div>\n ))}\n {/* 设置沉底 */}\n <div className={css.navSpacer} />\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={activeTab === SETTINGS_TAB.id}\n data-active={activeTab === SETTINGS_TAB.id ? '' : undefined}\n className={css.navTab}\n title={SETTINGS_TAB.label}\n onClick={() => { setActiveTab(SETTINGS_TAB.id) }}\n >\n <span className={css.navTabIcon}>{SETTINGS_TAB.icon}</span>\n {!navCollapsed && <span className={css.navTabLabel}>{SETTINGS_TAB.label}</span>}\n </button>\n {/* 当前书切换卡(demo 风格底部内容卡:封面首字 + 书名 + 进度,点击回书架) */}\n {!navCollapsed && shelf !== null && (\n <button\n type=\"button\"\n className={css.bookSwitch}\n title={activeBook !== null ? `当前书:${activeBook.bookName}(${activeBook.outputDir})· 点击打开书架` : '打开书架'}\n onClick={() => { setViewMode('shelf') }}\n >\n <span className={css.bookSwitchCover}>{activeBookLetter}</span>\n <span style={{ minWidth: 0, display: 'flex', flexDirection: 'column' }}>\n <span className={css.bookSwitchName}>{activeBookName}</span>\n <span className={css.bookSwitchMeta}>{activeBookMeta}</span>\n </span>\n <span className={css.bookSwitchArrow}>⌄</span>\n </button>\n )}\n {/* 关于:版本 + GitHub + 更新检测 */}\n <div className={css.navAbout}>\n <button\n type=\"button\"\n className={css.navAboutRow}\n title=\"打开 GitHub 仓库\"\n onClick={() => { window.open(REPO_URL, '_blank', 'noopener') }}\n >\n <span>ℹ️ v{PLUGIN_VERSION}</span>\n <span className={css.meta}>GitHub ↗</span>\n </button>\n {npmLatest !== null && npmLatest !== PLUGIN_VERSION && (\n <button\n type=\"button\"\n className={css.navAboutUpdate}\n title=\"查看更新方法\"\n onClick={() => {\n window.alert(\n `检测到新版本 v${npmLatest}(当前 v${PLUGIN_VERSION})\\n\\n更新方式:\\n\\n【npm 安装】\\ncd ~/.dsh/profiles/web && pnpm add @waterwx/dsh-novel-forge@latest\\n然后重启 dsh web\\n\\n【GitHub 安装】\\ndsh plugin --profile web add github:watersxya/dsh-novel-forge\\n\\n【本地开发】\\n拉取最新代码 → pnpm install && pnpm build → 重启 dsh web`,\n )\n }}\n >\n 📦 有新版本 v{npmLatest}\n </button>\n )}\n </div>\n {/* 操作行:收起导航 / 关闭面板(原顶部按钮下放,收起态保留图标) */}\n <div className={css.navActions}>\n <button\n type=\"button\"\n className={css.navActionBtn}\n title={navCollapsed ? '展开导航栏' : '收起导航栏'}\n aria-label={navCollapsed ? '展开导航栏' : '收起导航栏'}\n onClick={() => {\n setNavCollapsed(prev => {\n const next = !prev\n try { window.localStorage.setItem('dsh-novel-forge.nav.collapsed', String(next)) } catch { /* ignore */ }\n return next\n })\n }}\n >\n {navCollapsed ? '▸' : '◂'}\n </button>\n <button\n type=\"button\"\n className={css.navActionBtn}\n title={tt('common.close')}\n aria-label={tt('common.close')}\n onClick={() => { controller.close() }}\n >\n ×\n </button>\n </div>\n </nav>\n <div className={css.panelContent}>\n {error !== '' && <div className={css.card} style={{ borderColor: 'var(--nf-error)' }}><span style={{ color: 'var(--nf-error)' }}>{tt('common.error')}: {error}</span></div>}\n {notice !== '' && <div className={css.card}><span style={{ color: 'var(--nf-success)' }}>{notice}</span></div>}\n\n {/* 遗留草稿提示:刷新页面后仍有未采纳的润色/修订草稿 */}\n {workspace === null && draftNo !== null && (\n <div className={css.card} style={{ borderColor: 'var(--nf-info)' }}>\n <div className={css.busyRow}>\n <span style={{ color: 'var(--nf-info)' }}>第 {draftNo} 章有未采纳的润色/修订草稿(原稿未被改动)</span>\n <span style={{ display: 'flex', gap: 8 }}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void openWorkspace(draftNo) }}>\n 打开工作区\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void handleDraftDiscard(draftNo) }}>\n 放弃\n </button>\n </span>\n </div>\n </div>\n )}\n\n {/* 章节编辑页(独占整页:点「编辑」进入,返回后回到原页面;无卡片盒子,撑满内容区) */}\n {workspace !== null && (\n <div className={css.wsPage}>\n <div className={css.wsPageHeader}>\n {workspace.applied === true ? (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} onClick={() => { setWorkspace(null); setWsResultMode(false); gotoChapter(workspace.no) }} title=\"关闭工作区,返回章节页并定位到本章(滚动 + 高亮)\">\n ← 返回章节页\n </button>\n ) : (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setWorkspace(null); setWsResultMode(false) }} title=\"返回章节列表(草稿不丢失)\">\n ← 返回\n </button>\n )}\n <span className={css.cardTitle}>第 {workspace.no} 章《{workspace.title}》</span>\n <span className={css.meta}>{workspace.original.length} 字</span>\n <span style={{ display: 'flex', gap: 4, alignItems: 'center', marginLeft: 'auto' }}>\n <button type=\"button\" className={css.iconButton} title=\"减小字号\" aria-label=\"减小字号\" onClick={() => { changeEditorFontSize(editorFontSize - 1) }}>A−</button>\n <span className={css.meta}>{editorFontSize}px</span>\n <button type=\"button\" className={css.iconButton} title=\"增大字号\" aria-label=\"增大字号\" onClick={() => { changeEditorFontSize(editorFontSize + 1) }}>A+</button>\n <button type=\"button\" className={css.iconButton} title=\"关闭工作区\" aria-label=\"关闭工作区\" onClick={() => { setWorkspace(null); setWsResultMode(false) }}>×</button>\n </span>\n </div>\n {workspace.applied === true && (\n <div className={css.wsAppliedBanner}>\n ✅ 已采纳第 {workspace.no} 章新稿({workspace.original.length} 字)· 原稿已自动备份 .bak\n {wsCheckReport !== null ? (\n <span style={{ color: wsCheckReport.passed ? 'var(--nf-success)' : 'var(--nf-error)' }}>\n {' · '}修订时审查:{wsCheckReport.score} 分 — {wsCheckReport.passed ? '通过 ✓' : '未通过,可继续勾选意见修订'}\n </span>\n ) : (\n <span className={css.meta}>{' · '}需要结论?点「🔍 AI 审查」查看</span>\n )}\n </div>\n )}\n {workspace.applied !== true && wsResultMode && (\n <div className={css.wsAppliedBanner} style={{ borderColor: 'var(--nf-accent)', background: 'color-mix(in srgb, var(--nf-accent) 8%, transparent)' }}>\n ✅ 修订完成,请查看草稿对比\n {wsCheckReport !== null && (\n <span style={{ color: wsCheckReport.passed ? 'var(--nf-success)' : 'var(--nf-error)' }}>\n {' · '}草稿审查:{wsCheckReport.score} 分 — {wsCheckReport.passed ? '通过 ✓' : '未通过,可勾选意见继续修订'}\n </span>\n )}\n <span className={css.meta}>{' · '}满意后点「✅ 应用并保存」落盘</span>\n </div>\n )}\n <div className={css.wsColumns}>\n <div className={css.wsColumn}>\n <div className={css.meta}>\n 原文({workspace.original.length} 字)— 在正文中选中文字可作为「修订选中」的局部目标\n </div>\n <textarea\n ref={wsEditorRef}\n className={`${css.textarea} ${css.wsEditor}`}\n style={{ fontSize: editorFontSize }}\n value={workspace.original}\n onChange={e => { setWorkspace({ ...workspace, original: e.target.value }) }}\n onMouseUp={captureWsSelection}\n onKeyUp={captureWsSelection}\n onSelect={captureWsSelection}\n spellCheck={false}\n />\n </div>\n <div className={css.wsColumn}>\n <div className={css.meta} style={{ fontWeight: 600 }}>AI 修正指令</div>\n <textarea\n className={css.textarea}\n style={{ minHeight: 60 }}\n placeholder=\"输入修正要求,例如:压缩冗余、加强冲突、这段对话更口语化…(可留空)\"\n value={workspace.instruction}\n onChange={e => { setWorkspace({ ...workspace, instruction: e.target.value }) }}\n />\n {wsSelected !== '' ? (\n <div className={css.wsSelected}>\n <div className={css.meta}>当前选中内容(将用于精准修订)</div>\n <div className={css.wsSelectedText}>{wsSelected}</div>\n </div>\n ) : (\n <div className={css.meta}>未选中内容时仅支持整章润色/修订。</div>\n )}\n <div className={css.row} style={{ flexWrap: 'wrap' }}>\n {(wsCheckReport !== null && wsCheckReport.issues.length > 0) ? (\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n disabled={busy || wsChecked.length === 0}\n onClick={() => { void handleWsReviseByReport() }}\n title=\"按下方勾选的意见自动修订整章;产出草稿后自动附带一次 AI 审查\"\n >\n 🔧 按意见修订({wsChecked.length})\n </button>\n ) : (\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n disabled={busy || workspace.instruction.trim() === ''}\n onClick={() => { void handleWsRewrite(true) }}\n title=\"按指令框内容整章修订\"\n >\n 🔧 整章修订\n </button>\n )}\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleWsPolish() }}>\n ✨ 去AI味润色\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy || workspace.original.trim().length < 50} onClick={() => { void handleWsSave() }} title=\"有草稿则应用草稿,无草稿则保存当前编辑;沿用审查结论或自动审稿,落盘后原地显示结果\">\n ✅ 应用并保存\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || wsSelected === ''} onClick={() => { void handleWsRewrite(false) }} title=\"只修订在左栏选中的文字片段\">\n 📝 修订选中\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || workspace.original.trim().length < 50} onClick={() => { void handleWsCheck() }} title=\"对当前正文跑一次 AI 审查(不落盘)\">\n 🔍 AI 审查\n </button>\n {workspace.draft !== null && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void handleDraftDiscard(workspace.no) }} title=\"放弃草稿,保留原稿\">\n ↩️ 放弃草稿\n </button>\n )}\n </div>\n {/* 手动编辑后的 AI 审查结果 */}\n {wsCheckReport !== null && (\n <div className={css.wsPreview} style={{ borderColor: wsCheckReport.passed ? 'var(--nf-success)' : 'var(--nf-warn)' }}>\n <div className={css.busyRow}>\n <span className={css.meta} style={{ fontWeight: 600 }}>AI 审查结果</span>\n <span style={{ color: wsCheckReport.passed ? 'var(--nf-success)' : 'var(--nf-error)' }}>\n {wsCheckReport.score} 分 — {wsCheckReport.passed ? '通过' : '未通过'}\n </span>\n </div>\n <div className={css.meta}><b>总评:</b>{wsCheckReport.verdict}</div>\n {wsCheckReport.issues.length > 0 && (\n <ul style={{ margin: 0, paddingLeft: 16, display: 'flex', flexDirection: 'column', gap: 3, fontSize: editorFontSize - 1, maxHeight: '45vh', overflowY: 'auto' }}>\n {wsCheckReport.issues.map((issue, i) => (\n <li key={i} style={{ color: severityColor(issue.severity), display: 'flex', gap: 6, alignItems: 'flex-start' }}>\n <input\n type=\"checkbox\"\n style={{ marginTop: 1 }}\n checked={wsChecked.includes(i)}\n onChange={e => {\n setWsChecked(prev => e.target.checked ? [...prev, i] : prev.filter(x => x !== i))\n }}\n title=\"勾选后由「按意见修订」一起修订\"\n />\n <span>\n [{issue.severity}] {issue.item}\n {issue.suggestion !== '' && <span style={{ color: 'var(--nf-text-2)' }}> → {issue.suggestion}</span>}\n </span>\n </li>\n ))}\n </ul>\n )}\n <span className={css.meta}>\n {wsCheckReport.passed\n ? '当前意见:已通过。勾选想微调的问题点「按意见修订」,或直接「✅ 应用并保存」。'\n : '意见只读不落盘;勾选要修的问题点「🔧 按意见修订」一键修订(默认已勾 high),满意后点「✅ 应用并保存」写入文件(原稿自动备份 .bak)。'}\n </span>\n </div>\n )}\n {workspace.draft !== null && (\n <div className={css.wsPreview} style={{ flex: 1, minHeight: 0 }}>\n <div className={css.busyRow}>\n <span className={css.meta}>优化预览({workspace.draft.length} 字)</span>\n <span style={{ display: 'flex', gap: 8 }}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setWsShowDiff(v => !v) }}>\n {wsShowDiff ? '显示文本' : '查看对比'}\n </button>\n </span>\n </div>\n {wsShowDiff\n ? <DiffList original={workspace.original} draft={workspace.draft} fontSize={editorFontSize} />\n : <pre className={css.wsPreviewText} style={{ fontSize: editorFontSize }}>{workspace.draft}</pre>}\n <span className={css.meta}>满意后点上方「✅ 应用并保存」落盘(原稿自动备份 .bak);不满意可继续修订。</span>\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* 编辑页打开时独占整页:隐藏其余所有页面内容 */}\n {workspace === null && (<>\n {activeTab === 'workflow' && (\n <>\n {/* ⭐ 主行动大卡片 */}\n <div className={css.dashHero}>\n <div className={css.dashHeroEyebrow}>\n <span className={css.dashHeroSparkle}>✨</span>\n {nextAction?.eyebrow ?? '开始'}\n </div>\n {project !== null && (\n <div className={css.dashHeroTitle}>\n <span className={css.meta}>正在创作</span>\n <h3 className={css.dashHeroBook}>《{project.bookName}》</h3>\n </div>\n )}\n {nextAction !== null && (\n <div className={css.dashHeroAction}>\n <span className={css.dashHeroArrow}>→</span>\n <div className={css.dashHeroActionBody}>\n <div className={css.dashHeroActionTitle}>{nextAction.title}</div>\n <div className={css.meta}>{nextAction.reason}</div>\n </div>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { nextAction.onClick() }}>\n {nextAction.actionLabel}\n </button>\n </div>\n )}\n {/* 创作旅程进度 */}\n <div className={css.dashJourney}>\n <div className={css.busyRow}>\n <span className={css.meta} style={{ fontWeight: 600 }}>创作旅程</span>\n <span className={css.meta}>{journeyPercent}% · 已完成 {journeyDoneCount}/{journeyStages.length} 步</span>\n </div>\n <div className={css.tlBar}>\n {journeyStages.map(stage => (\n <button\n key={stage.id}\n type=\"button\"\n className={`${css.tlSeg} ${stage.done ? css.tlSegDone : stage.id === currentStageId ? css.tlSegCurrent : css.tlSegTodo}`}\n title={`${stage.label}${stage.done ? ' · 已完成' : stage.id === currentStageId ? ' · 进行中' : ' · 未开始'}(点击跳转)`}\n onClick={() => { jumpToStage(stage.id) }}\n >\n <span className={css.tlSegTrack}><span className={css.tlSegFill} /></span>\n <span className={css.tlSegLabel}>{stage.done ? '✓ ' : ''}{stage.label}</span>\n </button>\n ))}\n </div>\n </div>\n </div>\n\n {/* 统计卡(demo 风格:今日待写 / 写作中 / 已通过 / 待审稿) */}\n <div className={css.statRowD}>\n <div className={css.statCardD}>\n <div style={{ minWidth: 0 }}>\n <div className={css.statCardDLabel}>今日待写</div>\n <div className={css.statCardDValue}>{pendingCount} <span className={css.statCardDUnit}>章</span></div>\n <div className={css.statCardDDetail}>\n {chapters.some(c => c.status === 'error') ? `含 error ${chapters.filter(c => c.status === 'error').length} 章` : '待生成队列'}\n </div>\n </div>\n <div className={css.statCardDIcon}>📝</div>\n </div>\n <div className={css.statCardD}>\n <div style={{ minWidth: 0 }}>\n <div className={css.statCardDLabel}>写作中</div>\n <div className={css.statCardDValue}>{chapters.filter(c => c.status === 'generating' || c.status === 'reviewing').length} <span className={css.statCardDUnit}>章</span></div>\n <div className={css.statCardDDetail}>{writingNow !== undefined ? `第 ${writingNow.no} 章 · ${writingNow.title}` : '无进行中任务'}</div>\n </div>\n <div className={css.statCardDIcon}>✍️</div>\n </div>\n <div className={css.statCardD}>\n <div style={{ minWidth: 0 }}>\n <div className={css.statCardDLabel}>已通过</div>\n <div className={css.statCardDValue}>{approvedCount} <span className={css.statCardDUnit}>章</span></div>\n <div className={css.statCardDDetail}>{chapters.length > 0 ? `占全书 ${Math.round((approvedCount / chapters.length) * 100)}%` : '尚无已通过章节'}</div>\n </div>\n <div className={css.statCardDIcon}>✅</div>\n </div>\n <div className={css.statCardD}>\n <div style={{ minWidth: 0 }}>\n <div className={css.statCardDLabel}>待审稿</div>\n <div className={css.statCardDValue}>{reviewPendingCount} <span className={css.statCardDUnit}>章</span></div>\n <div className={`${css.statCardDDetail} ${reviewPendingCount > 0 ? css.statCardDDown : ''}`}>\n {`written ${chapters.filter(c => c.status === 'written').length} · rejected ${chapters.filter(c => c.status === 'rejected').length}`}\n </div>\n </div>\n <div className={`${css.statCardDIcon} ${css.statCardDIconRed}`}>⚠️</div>\n </div>\n </div>\n {/* 补充统计:总字数 / 当前卷 / 最近创作(原有数据保留) */}\n <div className={css.assetGrid}>\n <StatCell label=\"总字数\" value={String(totalChars)} detail=\"已生成正文累计\" />\n <StatCell label=\"当前卷\" value={currentVolumeName} valueFontSize={13} detail=\"正在推进的卷\" />\n <StatCell label=\"最近创作\" value={lastUpdated} valueFontSize={13} detail=\"最近生成/编辑时间\" />\n </div>\n\n {/* 资产健康:独占一行(道藏/卷计划/写作资产/伏笔 + 全书质检) */}\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>资产健康</span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || doneCount === 0} onClick={() => { void handleAudit() }} title=\"LLM 扫描全本已生成章节,检查人名/境界/资源/时间线矛盾\">\n 🔍 全书质检\n </button>\n </div>\n {auditStatus?.status === 'running' && (\n <div className={css.meta} style={{ marginTop: 8 }}>\n 🔍 全书质检中:{auditStatus.completedBatches}/{auditStatus.totalBatches > 0 ? auditStatus.totalBatches : '…'} 批\n {auditStatus.totalBatches > 0 && (\n <div className={css.dashJourneyBar} style={{ marginTop: 4 }}>\n <div className={css.dashJourneyFill} style={{ width: `${Math.round((auditStatus.completedBatches / auditStatus.totalBatches) * 100)}%` }} />\n </div>\n )}\n </div>\n )}\n {auditStatus?.status === 'error' && auditStatus.error !== undefined && (\n <div className={css.meta} style={{ color: 'var(--nf-error)', marginTop: 8 }}>全书质检失败:{auditStatus.error}</div>\n )}\n <div className={css.assetGrid}>\n <StatCell\n label=\"道藏\"\n value={bible !== undefined ? `✓ ${bible.worldRules.length} 条规则` : '未生成'}\n valueColor={bible !== undefined ? 'var(--nf-success)' : 'var(--nf-text-3)'}\n detail={bible !== undefined ? `${bible.characters.length} 人物 · ${bible.redLines.length} 红线` : '提炼人设 / 世界观 / 金手指'}\n />\n <StatCell\n label=\"卷计划\"\n value={volumes !== undefined ? `${volumes.length} 卷` : '未生成'}\n valueColor={volumes !== undefined ? 'var(--nf-success)' : 'var(--nf-text-3)'}\n detail={volumes !== undefined ? volumes.map(v => v.title).join(' / ') : '按剧情弧线划分全书'}\n detailTitle={volumes?.map(v => v.title).join(' / ')}\n />\n <StatCell\n label=\"写作资产\"\n value={`${assetCount} 项`}\n valueColor={assetCount > 0 ? 'var(--nf-success)' : 'var(--nf-text-3)'}\n detail={assetSummary}\n detailTitle={assetSummary}\n />\n <StatCell\n label=\"伏笔\"\n value={`${foreshadows.length} 条`}\n detail={`${foreshadows.filter(f => f.status === 'planned').length} 待埋 · ${foreshadows.filter(f => f.status === 'resolved').length} 已回收`}\n />\n </div>\n </div>\n\n {/* 剧情线进度 | 作者复盘趋势:精简摘要卡,并排(点击跳转详情页) */}\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))', gap: 14, alignItems: 'stretch' }}>\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>🧵 {tt('plotlines.workflowTitle')}({(project?.plotlines ?? []).length} 条)</span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setActiveTab('plotlines') }} title=\"查看完整剧情线管理页\">\n 查看全部 →\n </button>\n </div>\n {(() => {\n const all = project?.plotlines ?? []\n const active = all.filter(l => l.status === 'active').length\n const paused = all.filter(l => l.status === 'paused').length\n const resolved = all.filter(l => l.status === 'resolved').length\n const main = all.find(l => l.kind === 'main' && l.status === 'active')\n const withLinks = all.filter(l => l.chapters.length > 0)\n const latest = withLinks.sort((a, b) => Math.max(...b.chapters) - Math.max(...a.chapters))[0]\n if (all.length === 0) return <span className={css.meta}>{tt('plotlines.workflowEmpty')}</span>\n return (\n <span className={css.meta}>\n {active} 推进中 · {paused} 暂停 · {resolved} 已完结\n {main !== undefined && <> · 主线:{main.name}</>}\n {latest !== undefined && <> · 最近推进:{latest.name}(第 {Math.max(...latest.chapters)} 章)</>}\n </span>\n )\n })()}\n </div>\n\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>📋 作者复盘(最近 {Math.min(6, chapters.filter(c => c.authorReview !== undefined).length)} 章)</span>\n <div className={css.row}>\n {(() => {\n const missing = chapters.filter(c => c.status !== 'pending' && c.status !== 'generating' && c.status !== 'error' && c.authorReview === undefined).length\n return missing > 0 && (\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy}\n onClick={() => { void handleAuthorBackfillAll() }}\n title=\"对历史已写章节逐章补跑作者复盘(不重新生成正文,每章约 2000 token)\"\n >\n ↻ 补齐({missing})\n </button>\n )\n })()}\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setActiveTab('book'); changeBookTab('facts'); changeArchiveTab('reviews') }} title=\"查看按卷分组的全部复盘记录\">\n 查看全部 →\n </button>\n </div>\n </div>\n {(() => {\n const reviewed = chapters.filter(c => c.authorReview !== undefined)\n if (reviewed.length === 0) {\n return <span className={css.meta}>尚无作者复盘——生成/审稿后自动生成,或点「补齐」为已写章节补跑。</span>\n }\n const honored = reviewed.filter(c => c.authorReview!.hookHonored).length\n const avg = Math.round(reviewed.reduce((s, c) => s + c.authorReview!.endingHook, 0) / reviewed.length * 10) / 10\n const last = reviewed[reviewed.length - 1]!\n return (\n <span className={css.meta}>\n 钩子兑现 {honored}/{reviewed.length} · 结尾钩子均分 {avg} · 最近:第 {last.no} 章(钩子{last.authorReview!.hookHonored ? '✓' : '✗'} {last.authorReview!.endingHook}/10)\n </span>\n )\n })()}\n </div>\n </div>\n\n {/* 全书质检结果 */}\n {auditIssues !== null && (\n <div className={css.card} style={{ borderColor: auditIssues.length > 0 ? 'var(--nf-error)' : 'var(--nf-success)' }}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>\n 🔍 全书质检{auditIssues.length === 0 ? ':未发现矛盾 🎉' : `:${auditIssues.length} 处疑似矛盾`}\n </span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setAuditIssues(null) }}>\n 收起\n </button>\n </div>\n {auditIssues.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {auditIssues.map((issue, i) => (\n <AuditIssueRow\n key={i}\n issue={issue}\n disabled={busy}\n onFix={() => { void openWorkspace(issue.chapterNo, `按质检意见修订:${issue.item}(建议:${issue.suggestion})`) }}\n />\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* 待办队列(活动输出已移入「工具 → 工作进度」悬浮窗) */}\n <div className={css.card}>\n <span className={css.cardTitle}>待办队列</span>\n {todos.length === 0 ? (\n <span className={css.meta}>🎉 暂无待办,一切顺畅</span>\n ) : (\n todos.map((todo, i) => (\n <TodoRow\n key={i}\n tone={todo.tone}\n title={todo.title}\n description={todo.description}\n actionLabel={todo.actionLabel}\n disabled={busy}\n onAction={todo.onClick}\n />\n ))\n )}\n </div>\n </>\n )}\n\n {activeTab === 'overview' && (\n <>\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>{tt('tab.overview')}</span>\n {project !== null && (\n <div className={css.row}>\n <span className={css.meta}>\n {tt('overview.bookName')}: {project.bookName} · {project.outline.length} 字\n {project.outlinePath !== undefined && <span> · {project.outlinePath}</span>}\n </span>\n <button type=\"button\" className={css.button} disabled={busy} onClick={() => { handleToggleUpdateOutline() }}>\n {updatingOutline ? '收起' : '更新大纲'}\n </button>\n </div>\n )}\n </div>\n {project === null ? (\n <>\n {/* 未开书:导入大纲(开书动作) */}\n <div\n className={`${css.dropzone} ${dragActive ? css.dropzoneActive : ''}`}\n onClick={() => { fileInputRef.current?.click() }}\n onDragOver={e => { e.preventDefault(); setDragActive(true) }}\n onDragLeave={() => { setDragActive(false) }}\n onDrop={e => {\n e.preventDefault()\n setDragActive(false)\n const file = e.dataTransfer.files?.[0]\n if (file !== undefined) void handleDocxFile(file)\n }}\n >\n <span className={css.dropzoneIcon}>📄</span>\n <span>点击选择本机 docx 大纲,或将文件拖到这里</span>\n <span className={css.meta}>也支持粘贴文本到下方编辑区</span>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".docx,application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n style={{ display: 'none' }}\n onChange={e => {\n const file = e.target.files?.[0]\n if (file !== undefined) void handleDocxFile(file)\n e.target.value = ''\n }}\n />\n </div>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.meta}>{tt('overview.outlineChars')}: {outlineText.length}</span>\n <button type=\"button\" className={css.button} disabled={busy || outlineText.length < 50} onClick={() => { void handleSaveOutline() }}>\n {tt('overview.saveOutline')}\n </button>\n </div>\n <textarea\n className={css.textarea}\n value={outlineText}\n placeholder={tt('overview.outlineHint')}\n onChange={e => { setOutlineText(e.target.value) }}\n spellCheck={false}\n />\n </>\n ) : updatingOutline ? (\n <>\n <div className={css.meta}>\n 大纲是本书的「出生证明」。更新时请二选一:<b>仅更新文本</b>(保留设定/章节/正文全部进度),或\n <b>重置项目</b>(从新总纲重新开始,清空道藏/卷/章节/正文/暗线/资产/编年录,不可恢复)。\n </div>\n <textarea\n className={css.textarea}\n value={outlineText}\n placeholder=\"粘贴新版大纲文本…\"\n onChange={e => { setOutlineText(e.target.value) }}\n spellCheck={false}\n />\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy || outlineText.length < 50} onClick={() => { void handleSaveOutline() }}>\n 仅更新文本(保留进度)\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonDanger}`} disabled={busy || outlineText.length < 50} onClick={() => { void handleResetProject() }}>\n 重置项目并更新(清空进度)\n </button>\n <span className={css.meta}>{outlineText.length} 字</span>\n </div>\n </>\n ) : (\n /* 只读展示:大纲是开书时的出生证明 */\n <pre className={css.outlineReadonly}>{project.outline}</pre>\n )}\n </div>\n <div className={css.card}>\n <span className={css.cardTitle}>{tt('status.files')}({generatedFiles.length})</span>\n <div className={css.fileList}>\n {generatedFiles.length === 0 && <span>{tt('status.projectNone')}</span>}\n {generatedFiles.map(file => <span key={file}>{file}</span>)}\n </div>\n </div>\n </>\n )}\n\n {/* 卷首语:面向读者的作品门面 */}\n {activeTab === 'blurb' && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>📖 简介 / 封面</span>\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy || project === null} onClick={() => { void handleBlurbGenerate() }}>\n ✨ AI 生成\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || project === null || blurbDraft.trim() === ''} onClick={() => { void handleBlurbComplete() }}>\n ✍️ AI 补全\n </button>\n {project?.blurb !== undefined && (\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy || project === null}\n onClick={() => {\n if (window.confirm('重新生成会覆盖当前简介(可先复制保存),确定?')) void handleBlurbGenerate()\n }}\n >\n 🔄 重新生成\n </button>\n )}\n </div>\n </div>\n {/* 书名(可改名,同步书架) */}\n <div className={css.row}>\n <input\n className={css.input}\n style={{ flex: 1, maxWidth: 320 }}\n placeholder=\"书名\"\n value={bookNameDraft}\n onChange={e => { setBookNameDraft(e.target.value) }}\n onKeyDown={e => { if (e.key === 'Enter') void handleRename() }}\n />\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy || bookNameDraft.trim() === '' || bookNameDraft.trim() === project?.bookName}\n onClick={() => { void handleRename() }}\n >\n 💾 改书名\n </button>\n </div>\n {/* 封面 */}\n <div className={css.row} style={{ alignItems: 'flex-start', gap: 14 }}>\n <div className={css.coverPreview}>\n {coverDataUrl !== null ? (\n <img src={coverDataUrl} alt=\"封面\" />\n ) : (\n <span className={css.coverPlaceholder}>暂无封面</span>\n )}\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || project === null} onClick={() => { coverFileRef.current?.click() }}>\n 📤 上传封面\n </button>\n <input\n ref={coverFileRef}\n type=\"file\"\n accept=\"image/png,image/jpeg,image/webp\"\n style={{ display: 'none' }}\n onChange={e => {\n handleCoverUpload(e.target.files?.[0])\n e.target.value = ''\n }}\n />\n {coverDataUrl !== null && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void handleCoverRemove() }}>\n 🗑️ 移除\n </button>\n )}\n </div>\n <span className={css.meta}>支持 PNG / JPG / WebP,建议 3:4 竖版;保存于输出目录 cover.*。</span>\n </div>\n </div>\n <span className={css.meta}>\n 面向读者的作品门面(120-250 字):突出核心卖点与开局钩子,不剧透。点击 ✨AI 生成全量生成;或先写几句再点 ✍️AI 补全续写完整;不满意可 🔄 重新生成。\n </span>\n {project === null ? (\n <span className={css.meta}>请先在大纲页导入大纲建立项目。</span>\n ) : (\n <>\n <textarea\n className={css.textarea}\n style={{ minHeight: 140 }}\n placeholder=\"点击 ✨AI 生成,或先写下开头几句,再点 ✍️AI 补全…\"\n value={blurbDraft}\n onChange={e => { setBlurbDraft(e.target.value) }}\n spellCheck={false}\n />\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || blurbDraft.trim() === ''} onClick={() => { void handleBlurbSave() }}>\n 💾 保存简介\n </button>\n <span className={css.meta}>\n {blurbDraft.length} 字 · 已保存:{project.blurb !== undefined ? `${project.blurb.length} 字` : '无'}\n </span>\n </div>\n </>\n )}\n </div>\n )}\n\n {activeTab === 'plan' && (\n <>\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>{tt('tab.plan')}</span>\n <div className={css.row} style={{ flexWrap: 'wrap' }}>\n <span className={css.meta}>{tt('plan.generateHint')}</span>\n <input\n className={css.input}\n style={{ width: 72 }}\n type=\"number\"\n min={1}\n max={200}\n value={planCount}\n onChange={e => { const v = Number(e.target.value); if (Number.isInteger(v)) setPlanCount(v) }}\n />\n <span className={css.meta}>{tt('plan.count')}</span>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy || outlineText.length < 50} onClick={() => { void handlePlan() }}>\n {tt('plan.generate')}\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || doneCount === 0} onClick={() => { void handleSensitiveScan() }} title={tt('sensitive.hint')}>\n 🔞 {tt('sensitive.scanAll')}\n </button>\n </div>\n </div>\n </div>\n\n {sensHits !== null && (\n <div className={css.card} style={{ borderColor: sensHits.length > 0 ? 'var(--nf-warn)' : 'var(--nf-success)' }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>\n {sensHits.length === 0\n ? tt('sensitive.clean', { n: sensScanned })\n : tt('sensitive.hits', { n: sensHits.length, chapters: new Set(sensHits.map(h => h.chapterNo)).size })}\n </span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setSensHits(null) }}>收起</button>\n </div>\n <span className={css.meta}>{tt('sensitive.hint')}</span>\n {sensHits.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, maxHeight: 300, overflowY: 'auto', fontSize: 12 }}>\n {sensHits.map((hit, i) => (\n <div key={i} style={{ display: 'flex', gap: 8, alignItems: 'flex-start', border: '1px solid var(--nf-border)', borderRadius: 6, padding: '4px 8px' }}>\n <span className={css.badge} style={{ borderColor: 'var(--nf-warn)', color: 'var(--nf-warn)', flex: 'none' }}>\n {hit.chapterNo > 0 ? `第${hit.chapterNo}章` : '文本'}\n </span>\n <span className={css.meta} style={{ flex: 1 }}>\n <b style={{ color: 'var(--nf-error)' }}>{hit.word}</b> ×{hit.count} · [{hit.category}]\n </span>\n {hit.chapterNo > 0 && (\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy}\n onClick={() => { void openWorkspace(hit.chapterNo, tt('sensitive.fixPrefill', { word: hit.word, category: hit.category })) }}\n >\n {tt('sensitive.goFix')}\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n\n {chapters.length > 0 && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <div className={css.row} style={{ flexWrap: 'wrap', gap: 6 }}>\n {(volumes !== undefined && volumes.length > 0) && (\n <>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${selectedVolume === 'all' ? css.buttonPrimary : ''}`}\n onClick={() => { setSelectedVolume('all') }}\n >\n 全部卷\n </button>\n {volumes.map(v => (\n <button\n key={v.no}\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${selectedVolume === v.no ? css.buttonPrimary : ''}`}\n onClick={() => { setSelectedVolume(v.no) }}\n title={`第${v.no}卷 · ${v.chapterStart}-${v.chapterEnd} 章`}\n >\n {v.no}. {v.title}({v.chapterStart}-{v.chapterEnd})\n </button>\n ))}\n </>\n )}\n </div>\n {pendingCount > 0 && (\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleWriteAll() }}>\n {tt('plan.writeAllPending')}({pendingCount})\n </button>\n )}\n </div>\n <div className={css.chapterList}>\n {chapterGroups.filter(g => selectedVolume === 'all' || g.no === selectedVolume).map(group => {\n const collapsed = group.no !== 0 && collapsedVolumes.includes(group.no)\n const groupDone = group.chapters.filter(c => c.status === 'approved' || c.status === 'written' || c.status === 'rejected').length\n return (\n <div key={group.no} className={css.volumeGroup}>\n <div\n className={css.volumeGroupHeader}\n onClick={() => {\n if (group.no !== 0) {\n setCollapsedVolumes(prev => prev.includes(group.no) ? prev.filter(x => x !== group.no) : [...prev, group.no])\n }\n }}\n >\n <span className={css.volumeGroupToggle}>{group.no !== 0 ? (collapsed ? '▸' : '▾') : '📖'}</span>\n <b>{group.title}</b>\n <span className={css.meta}>({group.chapters.length} 章 · 已完成 {groupDone})</span>\n </div>\n {!collapsed && group.chapters.map(chapter => {\n const badge = statusBadge(chapter)\n const expanded = expandedChapter === chapter.no\n const review: ReviewReport | undefined = chapter.review\n return (\n <div key={chapter.no} className={css.chapter} data-chapter-no={chapter.no}>\n <span className={css.chapterNum}>{chapter.no}</span>\n <div className={css.chapterMain}>\n <div className={css.chapterTitle}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} style={{ padding: '1px 6px' }} onClick={() => { void handleToggleChapter(chapter.no) }}>\n {expanded ? '−' : '+'}\n </button>\n <span>{chapter.title}</span>\n {chapter.status === 'approved' && chapter.chars !== undefined && (\n <span className={css.meta}>{chapter.chars}{tt('common.chars')}</span>\n )}\n {chapter.volume > 0 && <span className={css.meta}>{tt('plan.volumes')}{chapter.volume}</span>}\n </div>\n {!expanded && <div className={css.chapterBeats} title={chapter.beats}>{chapter.beats}</div>}\n {expanded && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n <div className={css.meta}><b>{tt('plan.beats')}:</b></div>\n <div className={css.meta}>{renderBeats(chapter.beats)}</div>\n {chapter.summary !== undefined && chapter.summary !== '' && (\n <div className={css.meta}><b>{tt('plan.summary')}:</b> {chapter.summary}</div>\n )}\n <pre className={css.chapterPreview}>{chapterText || `(${tt('common.loading')})`}</pre>\n {review !== undefined && (\n <div className={css.reviewBox}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <b>{tt('plan.reviewReport')}</b>\n <span style={{ color: review.passed ? 'var(--nf-success)' : 'var(--nf-error)' }}>\n {tt('plan.reviewScore')}: {review.score} — {review.passed ? tt('plan.reviewPass') : tt('plan.reviewFail')}\n </span>\n </div>\n <div className={css.meta}><b>{tt('plan.reviewVerdict')}:</b> {review.verdict}</div>\n {review.issues.length > 0 && (\n <ul style={{ margin: 0, paddingLeft: 18, fontSize: 12 }}>\n {review.issues.map((issue, i) => (\n <li key={i} style={{ color: severityColor(issue.severity) }}>\n [{issue.severity}] {issue.item} → {issue.suggestion}\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n {chapter.authorReview === undefined && chapter.status !== 'pending' && chapter.status !== 'generating' && chapter.status !== 'error' && (\n <div className={css.row}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy}\n onClick={() => { void handleAuthorBackfillChapter(chapter.no) }}\n title=\"对该章补跑一次作者复盘(读取已落盘正文,不重新生成)\"\n >\n 📋 生成作者复盘\n </button>\n </div>\n )}\n {chapter.authorReview !== undefined && (\n <div className={css.reviewBox} style={{ borderColor: 'color-mix(in srgb, var(--nf-info) 45%, transparent)' }}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <b>📋 作者复盘</b>\n <span style={{ color: chapter.authorReview.hookHonored ? 'var(--nf-success)' : 'var(--nf-warn)' }}>\n 钩子{chapter.authorReview.hookHonored ? '已兑现 ✓' : '未兑现 ✗'} · 结尾钩子 {chapter.authorReview.endingHook}/10\n </span>\n </div>\n {chapter.authorReview.hookNote !== '' && (\n <div className={css.meta}><b>钩子:</b>{chapter.authorReview.hookNote}</div>\n )}\n {chapter.authorReview.plotlineProgress !== '' && (\n <div className={css.meta}><b>推进:</b>{chapter.authorReview.plotlineProgress}</div>\n )}\n {chapter.authorReview.continuity !== '' && (\n <div className={css.meta}><b>衔接:</b>{chapter.authorReview.continuity}</div>\n )}\n {chapter.authorReview.trend !== '' && (\n <div className={css.meta}><b>趋势:</b>{chapter.authorReview.trend}</div>\n )}\n </div>\n )}\n {(chapter.status === 'rejected' || chapter.status === 'written' || chapter.status === 'approved') && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n <div className={css.meta} style={{ fontWeight: 600 }}>\n 润色 / 修订 — 在右上角打开工作区:左栏原文可直接选中文字做局部修订,右栏输入指令后预览,确认后再应用(未应用不改动原稿)\n </div>\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy || busyAny} onClick={() => { void openWorkspace(chapter.no) }}>\n {tt('plan.rewrite')} / {tt('plan.polish')}\n </button>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n <span className={`${css.badge} ${badge.cls}`}>{badge.label}</span>\n <div className={css.chapterActions}>\n {(chapter.status === 'pending' || chapter.status === 'error') && (\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n disabled={busy || busyAny}\n onClick={() => { void handleWriteChapter(chapter.no, true) }}\n >\n {tt('plan.write')}\n </button>\n )}\n {chapter.status === 'generating' && (\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy}\n onClick={() => { void handleChapterReset(chapter.no) }}\n title=\"生成卡死/中断时可复位为待生成,重新生成\"\n >\n 🔄 复位\n </button>\n )}\n {(chapter.status === 'written' || chapter.status === 'rejected') && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { void handleReview(chapter.no) }}>\n {tt('plan.review')}\n </button>\n )}\n {(chapter.status === 'written' || chapter.status === 'rejected') && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { void handleChapterApprove(chapter.no) }} title=\"作者行使最终决定权:直接通过(不重审,保留审稿记录,落盘保存)\">\n ✔ 直接通过\n </button>\n )}\n {(chapter.status === 'written' || chapter.status === 'rejected' || chapter.status === 'approved') && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { void openWorkspace(chapter.no) }} title=\"手动编辑正文 → AI 审查 → 保存\">\n ✏️ 编辑\n </button>\n )}\n {(chapter.status === 'written' || chapter.status === 'rejected' || chapter.status === 'approved') && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { void openWorkspace(chapter.no) }}>\n {tt('plan.polish')}\n </button>\n )}\n {chapter.status === 'rejected' && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { void handleReviseNow(chapter.no) }} title=\"一键按该章审稿意见全部修订(high 优先,无需进工作区选择);修订完自动打开工作区看草稿与审查\">\n 按意见修订\n </button>\n )}\n {chapter.status === 'rejected' && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { void handleWriteChapter(chapter.no, true) }} title=\"整章重新生成\">\n 重新生成\n </button>\n )}\n </div>\n </div>\n )\n })}\n </div>\n )\n })}\n </div>\n </div>\n )}\n </>\n )}\n\n {activeTab === 'book' && (\n <div className={css.card} style={{ gap: 12 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle} style={{ fontSize: 17, fontWeight: 700 }}>📚 本书设定</span>\n <span className={css.meta}>当前书的知识与资料(参考 AI-Novel-Writing-Assistant:世界观/角色准备收进书内)</span>\n </div>\n <div className={css.row} style={{ flexWrap: 'wrap', gap: 6 }}>\n <button\n type=\"button\"\n className={`${css.button} ${bookTab === 'bible' ? css.buttonPrimary : ''}`}\n style={{ fontSize: 14, flex: 1 }}\n onClick={() => { changeBookTab('bible') }}\n title=\"设定库:题材 / 世界观规则 / 人物摘要 / 红线 / 文风\"\n >\n 📖 设定库\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${bookTab === 'world' ? css.buttonPrimary : ''}`}\n style={{ fontSize: 14, flex: 1 }}\n onClick={() => { changeBookTab('world') }}\n title=\"大世界:境界体系 / 地理区域 / 势力分布(注入生成与审稿提示词)\"\n >\n 🌍 大世界\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${bookTab === 'roles' ? css.buttonPrimary : ''}`}\n style={{ fontSize: 14, flex: 1 }}\n onClick={() => { changeBookTab('roles') }}\n title=\"角色库:全书角色主表(定位 / 关系网 / 成长线 / 知情度)\"\n >\n 👥 角色库({project?.roles?.length ?? 0})\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${bookTab === 'facts' ? css.buttonPrimary : ''}`}\n style={{ fontSize: 14, flex: 1 }}\n onClick={() => { changeBookTab('facts') }}\n title=\"编年录与复盘记录\"\n >\n 📚 编年 / 复盘\n </button>\n </div>\n </div>\n )}\n {activeTab === 'book' && bookTab === 'bible' && (\n <>\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>{tt('bible.title')}</span>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleBible() }}>\n {tt('bible.gen')}\n </button>\n </div>\n {bible === undefined ? (\n <span className={css.meta}>{tt('bible.none')}</span>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n {bible.genre !== '' && (\n <div><b>{tt('bible.genre')}:</b> <span className={css.meta}>{bible.genre}</span></div>\n )}\n {/* 世界观规则独立卡片(可编辑,每行一条) */}\n {bible.worldRules.length > 0 && (\n <div style={{ border: '1px solid var(--nf-border)', borderRadius: 10, padding: '8px 10px' }}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <b>{tt('bible.worldRules')}({bible.worldRules.length})</b>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setWorldRulesDraft(bible.worldRules.join('\\n')) }}>\n 编辑\n </button>\n </div>\n {worldRulesDraft !== '' && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, marginTop: 6 }}>\n <textarea\n className={css.textarea}\n style={{ minHeight: 120 }}\n value={worldRulesDraft}\n onChange={e => { setWorldRulesDraft(e.target.value) }}\n placeholder=\"每条规则一行…\"\n />\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleSaveWorldRules() }}>\n 保存规则\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setWorldRulesDraft('') }}>\n 取消\n </button>\n </div>\n </div>\n )}\n {worldRulesDraft === '' && (\n <ul style={{ margin: '4px 0 0', paddingLeft: 18, fontSize: 12 }}>{bible.worldRules.map((r, i) => <li key={i}>{r}</li>)}</ul>\n )}\n </div>\n )}\n {bible.characters.length > 0 && (\n <div>\n <b>{tt('bible.characters')}({bible.characters.length})</b>\n {bible.characters.map(card => (\n <div key={card.name} style={{ marginTop: 4, fontSize: 12 }}>\n <b>{card.name}</b> <span className={css.meta}>[{card.role}] {card.traits.join('、')}</span>\n {card.goals !== '' && <div className={css.meta}>目标:{card.goals}</div>}\n {card.relations !== '' && <div className={css.meta}>关系:{card.relations}</div>}\n </div>\n ))}\n </div>\n )}\n {bible.redLines.length > 0 && (\n <div>\n <b>{tt('bible.redLines')}({bible.redLines.length})</b>\n <ul style={{ margin: 0, paddingLeft: 18, fontSize: 12, color: 'var(--nf-error)' }}>{bible.redLines.map((r, i) => <li key={i}>{r}</li>)}</ul>\n </div>\n )}\n {bible.style.length > 0 && (\n <div>\n <b>{tt('bible.style')}({bible.style.length})</b>\n <ul style={{ margin: 0, paddingLeft: 18, fontSize: 12 }}>{bible.style.map((r, i) => <li key={i}>{r}</li>)}</ul>\n </div>\n )}\n </div>\n )}\n </div>\n </>\n )}\n\n {/* 大世界:境界体系 / 区域 / 势力 */}\n {activeTab === 'book' && bookTab === 'world' && (\n <WorldTab\n api={api}\n world={project?.world}\n onChanged={w => {\n setProject(prev => prev === null ? prev : { ...prev, world: w, updatedAt: new Date().toISOString() })\n pushProgress(`大世界已保存:${w.realms.length} 境界 · ${w.regions.length} 区域 · ${w.factions.length} 势力`, 'done')\n }}\n />\n )}\n\n {/* 角色库:全书角色主表(独立导航页) */}\n {activeTab === 'book' && bookTab === 'roles' && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>👥 角色库({(project?.roles ?? []).length} 个)</span>\n <div className={css.row}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy || (project?.facts ?? []).length === 0}\n onClick={() => { void handleCharactersRefresh() }}\n title=\"从编年录聚合各角色当前状态(境界/伤势/心境/出场统计),显示在每张卡上\"\n >\n ↻ 从编年录刷新状态\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n disabled={busy || doneCount === 0}\n onClick={() => { void handleRolesExtract() }}\n title=\"AI 扫描大纲/编年录/已写章节,提炼完整角色库(含女主/女配/反派定位)\"\n >\n ✨ 从全书提炼角色\n </button>\n </div>\n </div>\n <span className={css.meta}>角色库是全书角色主表:定位(女主/女配/配角/反派)、身份、关系网、成长线、知情度——生成与审稿都会按定位规格刻画互动。点「从编年录刷新状态」可在每张卡上显示角色当前状态。</span>\n\n {roleCandidates !== null && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, border: '1px solid var(--nf-info)', borderRadius: 12, padding: 10 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <b>✨ AI 提炼候选({roleCandidates.length})</b>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setRoleCandidates(null) }}>收起</button>\n </div>\n {roleCandidates.length === 0 && <span className={css.meta}>未提炼到角色。</span>}\n {roleCandidates.map((r, i) => (\n <RoleCandidateRow\n key={i}\n candidate={r}\n disabled={busy}\n onAdopt={() => { void handleRoleAdopt(r) }}\n onEdit={() => { setRoleDraft(r) }}\n />\n ))}\n </div>\n )}\n\n {roleDraft !== null && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, border: '1px solid var(--nf-accent)', borderRadius: 12, padding: 10 }}>\n <div className={css.row} style={{ flexWrap: 'wrap' }}>\n <div className={css.field} style={{ flex: 1, minWidth: 140 }}>\n <label className={css.fieldLabel}>角色名</label>\n <input className={css.input} value={roleDraft.name} onChange={e => { setRoleDraft({ ...roleDraft, name: e.target.value }) }} />\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>定位</label>\n <select className={css.input} value={roleDraft.roleLabel} onChange={e => { setRoleDraft({ ...roleDraft, roleLabel: e.target.value as RoleRecord['roleLabel'] }) }}>\n <option value=\"protagonist\">主角</option>\n <option value=\"female_lead\">女主</option>\n <option value=\"female_support\">女配</option>\n <option value=\"support\">配角</option>\n <option value=\"antagonist\">反派</option>\n <option value=\"extra\">路人</option>\n </select>\n </div>\n <div className={css.field} style={{ flex: 2 }}>\n <label className={css.fieldLabel}>身份</label>\n <input className={css.input} value={roleDraft.identity} onChange={e => { setRoleDraft({ ...roleDraft, identity: e.target.value }) }} />\n </div>\n </div>\n <div className={css.field}>\n <label className={css.fieldLabel}>目标</label>\n <textarea className={css.textarea} style={{ minHeight: 44 }} value={roleDraft.goals} onChange={e => { setRoleDraft({ ...roleDraft, goals: e.target.value }) }} />\n </div>\n <div className={css.field}>\n <label className={css.fieldLabel}>关系网(每行一条:角色名(关系))</label>\n <textarea className={css.textarea} style={{ minHeight: 44 }} value={roleDraft.relations.join('\\n')} onChange={e => { setRoleDraft({ ...roleDraft, relations: e.target.value.split('\\n').map(l => l.trim()).filter(l => l !== '') }) }} />\n </div>\n <div className={css.field}>\n <label className={css.fieldLabel}>成长线(每行一条:阶段:说明)</label>\n <textarea className={css.textarea} style={{ minHeight: 44 }} value={roleDraft.arc.join('\\n')} onChange={e => { setRoleDraft({ ...roleDraft, arc: e.target.value.split('\\n').map(l => l.trim()).filter(l => l !== '') }) }} />\n </div>\n <div className={css.field}>\n <label className={css.fieldLabel}>知情度(每行一条该角色知道的信息)</label>\n <textarea className={css.textarea} style={{ minHeight: 44 }} value={roleDraft.knowledge.join('\\n')} onChange={e => { setRoleDraft({ ...roleDraft, knowledge: e.target.value.split('\\n').map(l => l.trim()).filter(l => l !== '') }) }} />\n </div>\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleRoleSave() }}>\n 保存\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setRoleDraft(null) }}>取消</button>\n </div>\n </div>\n )}\n\n {(project?.roles ?? []).length === 0 ? (\n <span className={css.meta}>角色库为空——点「✨ 从全书提炼角色」自动建立,或手动新增。</span>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {(project?.roles ?? []).map(r => (\n <RoleCard\n key={r.name}\n role={r}\n status={(project?.roleStatus ?? []).find(s => s.name === r.name)}\n disabled={busy}\n onEdit={() => { setRoleDraft(r) }}\n onRemove={() => { void handleRoleRemove(r.name) }}\n />\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* 写作资产 5 个子分类(左侧导航直达) */}\n {activeTab === 'assets' && <AssetsTab api={api} />}\n\n {activeTab === 'settings' && configDraft !== null && (\n <div className={css.card}>\n <span className={css.cardTitle}>{tt('settings.title')}</span>\n <div className={css.field}>\n <label className={css.fieldLabel}>{tt('settings.outlinePath')}</label>\n <input className={css.input} value={configDraft.outlinePath} onChange={e => { setConfigDraft({ ...configDraft, outlinePath: e.target.value }) }} />\n </div>\n <div className={css.field}>\n <label className={css.fieldLabel}>{tt('settings.outputDir')}</label>\n <input className={css.input} value={configDraft.outputDir} onChange={e => { setConfigDraft({ ...configDraft, outputDir: e.target.value }) }} />\n </div>\n <div className={css.row} style={{ alignItems: 'flex-start' }}>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.provider')}</label>\n <input className={css.input} value={configDraft.provider} onChange={e => { setConfigDraft({ ...configDraft, provider: e.target.value }) }} />\n </div>\n <div className={css.field} style={{ flex: 1.4 }}>\n <label className={css.fieldLabel}>{tt('settings.model')}</label>\n <select\n className={css.input}\n value={modelCustomMode ? '__custom__' : configDraft.model}\n onChange={e => {\n const v = e.target.value\n if (v === '__custom__') {\n setModelCustomMode(true)\n } else {\n setModelCustomMode(false)\n setConfigDraft({ ...configDraft, model: v })\n }\n }}\n >\n {MODEL_PRESETS.map(m => <option key={m} value={m}>{m}</option>)}\n <option value=\"__custom__\">{tt('settings.modelCustom')}</option>\n </select>\n {modelCustomMode && (\n <input\n className={css.input}\n style={{ marginTop: 6 }}\n value={configDraft.model}\n placeholder={tt('settings.modelCustomPlaceholder')}\n onChange={e => { setConfigDraft({ ...configDraft, model: e.target.value }) }}\n />\n )}\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.reasoningEffort')}</label>\n <select\n className={css.input}\n value={configDraft.reasoningEffort ?? 'off'}\n onChange={e => { setConfigDraft({ ...configDraft, reasoningEffort: e.target.value as NovelConfig['reasoningEffort'] }) }}\n >\n {REASONING_OPTIONS.map(v => <option key={v} value={v}>{tt(`settings.reasoning.${v}`)}</option>)}\n </select>\n <span className={css.meta}>{tt('settings.reasoningHint')}</span>\n </div>\n </div>\n <div className={css.row}>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>豆包 API Key(生图)</label>\n <input className={css.input} type=\"password\" placeholder=\"ark-...\" value={configDraft.imageApiKey ?? ''} onChange={e => { setConfigDraft({ ...configDraft, imageApiKey: e.target.value }) }} />\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>豆包生图模型</label>\n <input className={css.input} placeholder=\"doubao-seedream-5-0-pro-260628\" value={configDraft.imageApiModel ?? ''} onChange={e => { setConfigDraft({ ...configDraft, imageApiModel: e.target.value }) }} />\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>启用豆包生图</label>\n <select\n className={css.input}\n value={configDraft.imageApiEnabled ? '1' : '0'}\n onChange={e => { setConfigDraft({ ...configDraft, imageApiEnabled: e.target.value === '1' }) }}\n >\n <option value=\"0\">关(默认)</option>\n <option value=\"1\">开</option>\n </select>\n <span className={css.meta}>开启后漫画工坊才显示「豆包生成」按钮</span>\n </div>\n </div>\n <div className={css.row}>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.chapterChars')}</label>\n <input className={css.input} type=\"number\" min={1000} max={20000} value={configDraft.chapterChars} onChange={e => { setConfigDraft({ ...configDraft, chapterChars: Number(e.target.value) }) }} />\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.maxTokens')}</label>\n <input className={css.input} type=\"number\" min={2000} max={64000} value={configDraft.maxTokens} onChange={e => { setConfigDraft({ ...configDraft, maxTokens: Number(e.target.value) }) }} />\n </div>\n </div>\n <div className={css.row}>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.reviewPassScore')}</label>\n <input className={css.input} type=\"number\" min={0} max={100} value={configDraft.reviewPassScore} onChange={e => { setConfigDraft({ ...configDraft, reviewPassScore: Number(e.target.value) }) }} />\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.editorFontSize')}</label>\n <select\n className={css.input}\n value={editorFontSize}\n onChange={e => { changeEditorFontSize(Number(e.target.value)) }}\n >\n {[12, 13, 14, 15, 16, 18, 20, 22, 24].map(v => (\n <option key={v} value={v}>{v}px</option>\n ))}\n </select>\n <span className={css.meta}>{tt('settings.editorFontSizeHint')}</span>\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.autoReview')}</label>\n <select\n className={css.input}\n value={configDraft.autoReview ? '1' : '0'}\n onChange={e => { setConfigDraft({ ...configDraft, autoReview: e.target.value === '1' }) }}\n >\n <option value=\"1\">✓ 是</option>\n <option value=\"0\">✗ 否</option>\n </select>\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.autoAuthorReview')}</label>\n <select\n className={css.input}\n value={configDraft.autoAuthorReview ? '1' : '0'}\n onChange={e => { setConfigDraft({ ...configDraft, autoAuthorReview: e.target.value === '1' }) }}\n >\n <option value=\"1\">✓ 是</option>\n <option value=\"0\">✗ 否</option>\n </select>\n <span className={css.meta}>{tt('settings.autoAuthorReviewHint')}</span>\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.autoReviewAfterRevise')}</label>\n <select\n className={css.input}\n value={configDraft.autoReviewAfterRevise ? '1' : '0'}\n onChange={e => { setConfigDraft({ ...configDraft, autoReviewAfterRevise: e.target.value === '1' }) }}\n >\n <option value=\"1\">✓ 是</option>\n <option value=\"0\">✗ 否</option>\n </select>\n <span className={css.meta}>{tt('settings.autoReviewAfterReviseHint')}</span>\n </div>\n </div>\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleSaveConfig() }}>\n {tt('settings.save')}\n </button>\n <button type=\"button\" className={css.button} onClick={() => { void api.openFolder() }}>\n {tt('settings.openFolder')}\n </button>\n <span className={css.meta}>当前:{config?.provider} / {config?.model} · {config?.outputDir}</span>\n </div>\n <div className={css.row}>\n <span className={css.cardTitle}>{tt('settings.export')}</span>\n <button type=\"button\" className={css.button} disabled={busy || chapters.length === 0} onClick={() => { void handleExport('txt') }}>\n {tt('settings.exportTxt')}\n </button>\n <button type=\"button\" className={css.button} disabled={busy || chapters.length === 0} onClick={() => { void handleExport('md') }}>\n {tt('settings.exportMd')}\n </button>\n </div>\n </div>\n )}\n\n {activeTab === 'settings' && (\n <div className={css.card}>\n <span className={css.cardTitle}>{tt('settings.theme')}</span>\n <div className={css.row} style={{ gap: 8, flexWrap: 'wrap' }}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${panelTheme === 'liquid' ? css.buttonPrimary : ''}`}\n onClick={() => { changePanelTheme('liquid') }}\n title=\"iOS 液态玻璃质感 · 绿色强调(当前默认)\"\n >\n 🧊 {tt('settings.themeLiquid')}\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${panelTheme === 'classic' ? css.buttonPrimary : ''}`}\n onClick={() => { changePanelTheme('classic') }}\n title=\"经典 iOS 毛玻璃 · 蓝色强调\"\n >\n 💠 {tt('settings.themeClassic')}\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${panelTheme === 'neumorph' ? css.buttonPrimary : ''}`}\n onClick={() => { changePanelTheme('neumorph') }}\n title=\"新拟物派 · 双阴影立体(仅浅色;深色下自动回退液态)\"\n >\n 🔘 {tt('settings.themeNeumorph')}\n </button>\n <span className={css.meta}>{tt('settings.themeHint')}</span>\n </div>\n </div>\n )}\n\n {activeTab === 'book' && bookTab === 'facts' && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle} style={{ fontSize: 17, fontWeight: 700 }}>📚 编年 / 复盘</span>\n </div>\n <div className={css.row} style={{ flexWrap: 'wrap', gap: 6 }}>\n <button\n type=\"button\"\n className={`${css.button} ${archiveTab === 'facts' ? css.buttonPrimary : ''}`}\n style={{ fontSize: 14, flex: 1 }}\n onClick={() => { changeArchiveTab('facts') }}\n title=\"编年录:客观事实流水(第 N 章 · 事件),生成/审稿查证用\"\n >\n 📜 编年录({(project?.facts ?? []).length})\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${archiveTab === 'reviews' ? css.buttonPrimary : ''}`}\n style={{ fontSize: 14, flex: 1 }}\n onClick={() => { changeArchiveTab('reviews') }}\n title=\"复盘记录:每章作者复盘(钩子 / 推进 / 衔接 / 趋势)\"\n >\n 📋 复盘记录({chapters.filter(c => c.authorReview !== undefined).length} 章)\n </button>\n </div>\n\n {archiveTab === 'reviews' ? (\n <>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>📋 复盘记录({chapters.filter(c => c.authorReview !== undefined).length} 章已复盘)</span>\n <div className={css.row}>\n {(() => {\n const missing = chapters.filter(c => c.status !== 'pending' && c.status !== 'generating' && c.status !== 'error' && c.authorReview === undefined).length\n return missing > 0 && (\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n disabled={busy}\n onClick={() => { void handleAuthorBackfillAll() }}\n title=\"对历史已写章节逐章补跑作者复盘\"\n >\n ↻ 补齐缺失复盘({missing})\n </button>\n )\n })()}\n </div>\n </div>\n {(() => {\n const reviewed = chapters.filter(c => c.authorReview !== undefined)\n if (reviewed.length === 0) {\n return <span className={css.meta}>尚无作者复盘——生成/审稿后自动生成,或点「补齐缺失复盘」为已写章节补跑。</span>\n }\n const honored = reviewed.filter(c => c.authorReview!.hookHonored).length\n const avg = Math.round(reviewed.reduce((s, c) => s + c.authorReview!.endingHook, 0) / reviewed.length * 10) / 10\n return (\n <span className={css.meta} style={{ fontWeight: 600 }}>\n 钩子兑现 {honored}/{reviewed.length} · 结尾钩子均分 {avg}/10\n </span>\n )\n })()}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10, overflowY: 'auto', flex: 1, minHeight: 0 }}>\n {(() => {\n const groupsWithReviews = chapterGroups.filter(group => group.chapters.some(c => c.authorReview !== undefined))\n if (groupsWithReviews.length === 0) return null\n return (\n <div className={css.row} style={{ justifyContent: 'flex-end', gap: 6 }}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n onClick={() => { setExpandedVolumes(Object.fromEntries(groupsWithReviews.map(g => [g.no, true]))) }}\n >\n 全部展开\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n onClick={() => { setExpandedVolumes({}) }}\n >\n 全部折叠\n </button>\n </div>\n )\n })()}\n {chapterGroups.map(group => {\n const groupReviewed = group.chapters.filter(c => c.authorReview !== undefined)\n if (groupReviewed.length === 0) return null\n const volumeExpanded = expandedVolumes[group.no] === true\n return (\n <div key={group.no} style={{ border: '1px solid var(--nf-border)', borderRadius: 10, overflow: 'hidden' }}>\n <button\n type=\"button\"\n style={{ width: '100%', textAlign: 'left', border: 'none', background: 'transparent', cursor: 'pointer', padding: '8px 12px', fontSize: 13, display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' }}\n onClick={() => { setExpandedVolumes(prev => ({ ...prev, [group.no]: !volumeExpanded })) }}\n >\n <span style={{ color: 'var(--nf-text-3)' }}>{volumeExpanded ? '▾' : '▸'}</span>\n <b>{group.title}</b>\n <span className={css.meta}>已复盘 {groupReviewed.length}/{group.chapters.length} 章</span>\n </button>\n {volumeExpanded && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, padding: '4px 8px 8px', borderTop: '1px solid var(--nf-border)' }}>\n {[...groupReviewed].reverse().map(c => {\n const ar = c.authorReview!\n const expanded = expandedReviewChapter === c.no\n return (\n <div key={c.no} style={{ border: '1px solid var(--nf-border)', borderRadius: 8, overflow: 'hidden' }}>\n <button\n type=\"button\"\n style={{ width: '100%', textAlign: 'left', border: 'none', background: 'transparent', cursor: 'pointer', padding: '6px 10px', fontSize: 12, display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}\n onClick={() => { setExpandedReviewChapter(expanded ? null : c.no) }}\n >\n <span style={{ color: 'var(--nf-text-3)' }}>{expanded ? '▾' : '▸'}</span>\n <b>第{c.no}章《{c.title}》</b>\n <span style={{ color: ar.hookHonored ? 'var(--nf-success)' : 'var(--nf-warn)' }}>钩子{ar.hookHonored ? '✓' : '✗'}</span>\n <span style={{ color: ar.endingHook >= 6 ? 'var(--nf-success)' : 'var(--nf-error)' }}>结尾钩子 {ar.endingHook}/10</span>\n {ar.plotlineProgress !== '' && <span className={css.meta} style={{ marginLeft: 4 }}>{ar.plotlineProgress.slice(0, 40)}{ar.plotlineProgress.length > 40 ? '…' : ''}</span>}\n </button>\n {expanded && (\n <div style={{ padding: '4px 10px 8px', fontSize: 12, display: 'flex', flexDirection: 'column', gap: 3, borderTop: '1px solid var(--nf-border)' }}>\n {ar.hookNote !== '' && <span className={css.meta}><b>钩子:</b>{ar.hookNote}</span>}\n {ar.plotlineProgress !== '' && <span className={css.meta}><b>推进:</b>{ar.plotlineProgress}</span>}\n {ar.continuity !== '' && <span className={css.meta}><b>衔接:</b>{ar.continuity}</span>}\n {ar.trend !== '' && <span className={css.meta}><b>趋势:</b>{ar.trend}</span>}\n </div>\n )}\n </div>\n )\n })}\n </div>\n )}\n </div>\n )\n })}\n </div>\n </>\n ) : (\n <>\n <div className={css.busyRow} style={{ flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>{tt('facts.title', { n: (project?.facts ?? []).length })}</span>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy || chapters.length === 0}\n onClick={() => { void handleFactsBackfill() }}\n title=\"用 LLM 从历史章节正文重新抽取事实,补齐缺失的编年录条目\"\n >\n 📥 {tt('facts.backfill')}\n </button>\n </div>\n <span className={css.meta}>{tt('facts.hint')}</span>\n {(project?.facts ?? []).length > 0 ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, maxHeight: '60vh', overflowY: 'auto', fontSize: 12 }}>\n {[...(project?.facts ?? [])].reverse().map((fact, i) => (\n <div key={i} style={{ display: 'flex', gap: 8, alignItems: 'flex-start' }}>\n <span className={css.badge} style={{ borderColor: 'var(--nf-text-3)', color: 'var(--nf-text-3)', flex: 'none', marginTop: 1 }}>\n 第 {fact.chapterNo} 章\n </span>\n <span className={css.meta}>{fact.text}</span>\n </div>\n ))}\n </div>\n ) : (\n <span className={css.meta}>暂无事实条目——写一章后会自动生成,或点击上方「回填」。</span>\n )}\n </>\n )}\n </div>\n )}\n\n {activeTab === 'plotlines' && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle} style={{ fontSize: 17, fontWeight: 700 }}>📜 长线管理</span>\n </div>\n <div className={css.row} style={{ flexWrap: 'wrap', gap: 6 }}>\n <button\n type=\"button\"\n className={`${css.button} ${longlineTab === 'plotlines' ? css.buttonPrimary : ''}`}\n style={{ fontSize: 14, flex: 1 }}\n onClick={() => { changeLonglineTab('plotlines') }}\n title=\"剧情线:故事明线(主线 / 支线 / 人物 / 悬念)\"\n >\n 🧵 剧情线({project?.plotlines?.length ?? 0})\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${longlineTab === 'foreshadow' ? css.buttonPrimary : ''}`}\n style={{ fontSize: 14, flex: 1 }}\n onClick={() => { changeLonglineTab('foreshadow') }}\n title=\"伏笔:道具 / 事件级暗线(埋设 → 回收)\"\n >\n 🔮 伏笔({foreshadows.length})\n </button>\n </div>\n\n {longlineTab === 'foreshadow' ? (\n <>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>🔮 {tt('foreshadow.title')}({foreshadows.length})</span>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleSuggestForeshadows() }}>\n {tt('foreshadow.suggest')}\n </button>\n </div>\n {foreshadows.length === 0 ? (\n <span className={css.meta}>{tt('foreshadow.none')}</span>\n ) : (\n <div className={css.chapterList}>\n {foreshadows.map(f => {\n const statusLabel = { planned: tt('foreshadow.planned'), planted: tt('foreshadow.planted'), progressing: tt('foreshadow.progressing'), resolved: tt('foreshadow.resolved'), abandoned: tt('foreshadow.abandoned') }[f.status]\n const statusColor = f.status === 'resolved' ? 'var(--nf-success)' : f.status === 'planted' || f.status === 'progressing' ? 'var(--nf-accent)' : f.status === 'abandoned' ? 'var(--nf-text-3)' : 'var(--nf-info)'\n return (\n <div key={f.id} className={css.chapter}>\n <div className={css.chapterMain}>\n <div className={css.chapterTitle}>\n <span>{f.description}</span>\n </div>\n <div className={css.meta}>\n {f.plantedChapter !== undefined && <span>{tt('foreshadow.plantedAt')} 第{f.plantedChapter}章 · </span>}\n {f.targetChapter !== undefined && <span>{tt('foreshadow.target')} 第{f.targetChapter}章 · </span>}\n {f.resolvedNote !== undefined && f.resolvedNote !== '' && <span>回收:{f.resolvedNote} · </span>}\n </div>\n </div>\n <span className={css.badge} style={{ borderColor: statusColor, color: statusColor }}>{statusLabel}</span>\n <div className={css.row} style={{ gap: 4 }}>\n {f.status === 'planned' && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => {\n void api.foreshadow({ id: f.id, status: 'planted', plantedChapter: doneCount + 1 }).then(r => setProject(prev => prev === null ? prev : { ...prev, foreshadows: r.foreshadows }))\n }}>\n {tt('foreshadow.setPlanted')}\n </button>\n )}\n {(f.status === 'planted' || f.status === 'progressing') && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => {\n void api.foreshadow({ id: f.id, status: 'resolved', resolvedNote: `第${doneCount}章回收` }).then(r => setProject(prev => prev === null ? prev : { ...prev, foreshadows: r.foreshadows }))\n }}>\n {tt('foreshadow.setResolved')}\n </button>\n )}\n </div>\n </div>\n )\n })}\n </div>\n )}\n </>\n ) : (\n <>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>🧵 {tt('tab.plotlines')}({project?.plotlines?.length ?? 0})</span>\n <div className={css.row} style={{ flexWrap: 'wrap' }}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy || outlineText.length < 50}\n onClick={() => { void handlePlotlineHealth() }}\n title=\"根据已写章节数与各线推进情况,判断是否需要新增剧情线、建议多少章后添加\"\n >\n 🩺 剧情健康检查\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy || outlineText.length < 50}\n onClick={() => { void handlePlotlinePlan() }}\n title=\"AI 设计下一阶段剧情方案:未来 5-10 章方向 + 2-3 条建议新线\"\n >\n ✨ 设计剧情方案\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy || outlineText.length < 50}\n onClick={() => { void handlePlotlineSuggest() }}\n title=\"AI 根据大纲/卷计划/已写章节/编年录,提炼候选剧情线\"\n >\n ✨ AI 建议剧情线\n </button>\n {plotlineDraft === null && (\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n onClick={() => { setPlotlineDraft({ id: '', name: '', kind: 'main', goal: '', progress: '', status: 'active' }) }}\n >\n {tt('plotlines.new')}\n </button>\n )}\n </div>\n </div>\n <span className={css.meta}>{tt('plotlines.hint')}</span>\n\n {plotlineHealth !== null && (\n <PlotlineHealthPanel\n report={plotlineHealth}\n disabled={busy}\n onPlan={() => { void handlePlotlinePlan() }}\n onClose={() => { setPlotlineHealth(null) }}\n />\n )}\n\n {plotlinePlan !== null && (\n <PlotlinePlanPanel\n plan={plotlinePlan}\n disabled={busy}\n onAdopt={(s) => { void handlePlanAdopt(s) }}\n onClose={() => { setPlotlinePlan(null) }}\n />\n )}\n\n {plotlineSuggestions !== null && (\n <PlotlineSuggestionPanel\n suggestions={plotlineSuggestions}\n disabled={busy}\n onAdopt={(s) => { void handlePlotlineAdopt(s) }}\n onClose={() => { setPlotlineSuggestions(null) }}\n />\n )}\n\n {plotlineDraft !== null && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, border: '1px solid var(--nf-accent)', borderRadius: 12, padding: 10 }}>\n <div className={css.row} style={{ flexWrap: 'wrap' }}>\n <div className={css.field} style={{ flex: 2, minWidth: 160 }}>\n <label className={css.fieldLabel}>{tt('plotlines.name')}</label>\n <input className={css.input} value={plotlineDraft.name} onChange={e => { setPlotlineDraft({ ...plotlineDraft, name: e.target.value }) }} placeholder=\"如:集齐古玉残片\" />\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('plotlines.kind')}</label>\n <select className={css.input} value={plotlineDraft.kind} onChange={e => { setPlotlineDraft({ ...plotlineDraft, kind: e.target.value as Plotline['kind'] }) }}>\n <option value=\"main\">{tt('plotlines.kindMain')}</option>\n <option value=\"branch\">{tt('plotlines.kindBranch')}</option>\n <option value=\"character\">{tt('plotlines.kindCharacter')}</option>\n <option value=\"mystery\">{tt('plotlines.kindMystery')}</option>\n </select>\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('plotlines.status')}</label>\n <select className={css.input} value={plotlineDraft.status} onChange={e => { setPlotlineDraft({ ...plotlineDraft, status: e.target.value as Plotline['status'] }) }}>\n <option value=\"active\">{tt('plotlines.statusActive')}</option>\n <option value=\"paused\">{tt('plotlines.statusPaused')}</option>\n <option value=\"resolved\">{tt('plotlines.statusResolved')}</option>\n <option value=\"abandoned\">{tt('plotlines.statusAbandoned')}</option>\n </select>\n </div>\n </div>\n <div className={css.field}>\n <label className={css.fieldLabel}>{tt('plotlines.goal')}</label>\n <textarea className={css.textarea} style={{ minHeight: 48 }} value={plotlineDraft.goal} onChange={e => { setPlotlineDraft({ ...plotlineDraft, goal: e.target.value }) }} />\n </div>\n <div className={css.field}>\n <label className={css.fieldLabel}>{tt('plotlines.progress')}</label>\n <textarea className={css.textarea} style={{ minHeight: 40 }} value={plotlineDraft.progress} onChange={e => { setPlotlineDraft({ ...plotlineDraft, progress: e.target.value }) }} placeholder=\"如:已取得第二枚残片,正追踪第三枚线索\" />\n </div>\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handlePlotlineSave() }}>\n {tt('plotlines.save')}\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setPlotlineDraft(null) }}>\n {tt('plotlines.cancel')}\n </button>\n </div>\n </div>\n )}\n\n {(project?.plotlines ?? []).length === 0 ? (\n <span className={css.meta}>{tt('plotlines.empty')}</span>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, overflowY: 'auto', flex: 1, minHeight: 0 }}>\n {(project?.plotlines ?? []).map(line => (\n <PlotlineCard\n key={line.id}\n line={line}\n disabled={busy}\n onRefresh={() => { void handlePlotlineRefresh(line.id) }}\n onEdit={() => { setPlotlineDraft({ id: line.id, name: line.name, kind: line.kind, goal: line.goal, progress: line.progress, status: line.status }) }}\n onRemove={() => { void handlePlotlineRemove(line.id) }}\n />\n ))}\n </div>\n )}\n </>\n )}\n </div>\n )}\n\n {activeTab === 'run' && (\n <RunPanel api={api} totalChapters={chapters.length} />\n )}\n\n {activeTab === 'breakdown' && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>🔍 拆书分析</span>\n <div className={css.row} style={{ flexWrap: 'wrap' }}>\n <select\n className={css.input}\n style={{ width: 160 }}\n value={breakdownScope}\n onChange={e => { setBreakdownScope(e.target.value as typeof breakdownScope) }}\n title=\"分析范围\"\n >\n <option value=\"recent\">最近 20 章</option>\n {volumes !== undefined && volumes.map(v => (\n <option key={v.no} value={`volume:${v.no}`}>第{v.no}卷</option>\n ))}\n <option value=\"all\">全书</option>\n </select>\n <select\n className={css.input}\n style={{ width: 150 }}\n value={breakdownPreset}\n onChange={e => { setBreakdownPreset(e.target.value as 'quick' | 'standard') }}\n title=\"分析档位\"\n >\n <option value=\"quick\">快速(4 维)</option>\n <option value=\"standard\">标准+卖点</option>\n </select>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleBreakdown() }} title=\"对已写章节做结构/人物/文风/卖点体检(约 1-3 分钟,消耗 LLM 额度)\">\n {busy ? '⏳ 分析中…' : '✨ 开始拆书'}\n </button>\n </div>\n </div>\n <span className={css.meta}>拆书分析 = 整卷复盘工具:定位、剧情结构、人物系统、文风技法(标准档加商业化卖点)。每条结论基于实际章节归纳,帮你发现「写偏了/人物变形/文风漂移」——与单章审稿互补。</span>\n\n {breakdownResult === null ? (\n <div className={css.shelfEmpty} style={{ minHeight: 140 }}>\n <span className={css.shelfEmptyIcon}>📖</span>\n <span className={css.shelfEmptyTitle}>尚未运行拆书分析</span>\n <span className={css.meta}>选择范围与档位,点「开始拆书」对已写章节做整卷体检</span>\n </div>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n <span className={css.meta}>\n 分析 {breakdownResult.chaptersScanned} 章 · {breakdownResult.sections.length} 个小节 · 约 {breakdownResult.usedTokens} token\n </span>\n {breakdownResult.sections.map(sec => (\n <div key={sec.key} className={css.wsPreview} style={{ borderColor: 'var(--nf-info)' }}>\n <div className={css.busyRow}>\n <b>{sec.title}</b>\n </div>\n {Object.keys(sec.structured).length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2, fontSize: 12, marginBottom: 6 }}>\n {Object.entries(sec.structured).map(([k, v]) => {\n const label = (typeof v === 'string') ? v : Array.isArray(v) ? (v as string[]).join('、') : JSON.stringify(v)\n return <div key={k} className={css.meta}><b>{k}:</b>{label}</div>\n })}\n </div>\n )}\n <div className={css.meta} style={{ whiteSpace: 'pre-wrap', fontSize: 12 }}>{sec.markdown}</div>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n\n {activeTab === 'roleImage' && (\n <div className={css.card} style={{ flex: 1, minHeight: 0 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle} style={{ fontSize: 17, fontWeight: 700 }}>🖼️ 角色形象</span>\n <span className={css.meta}>角色形象锚点 / 参考图(漫画功能已移除,形象保留用于立绘与一致性)</span>\n </div>\n\n <input\n ref={roleImageInputRef}\n type=\"file\"\n accept=\"image/*\"\n style={{ display: 'none' }}\n onChange={e => {\n const file = e.target.files?.[0]\n const target = roleImageTarget\n if (file === undefined || target === null) return\n const readDataUrl = (): Promise<string> => new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(String(reader.result))\n reader.onerror = () => reject(reader.error ?? new Error('读取图片失败'))\n reader.readAsDataURL(file!)\n })\n void (async () => {\n const dataUrl = await readDataUrl()\n if (target.endsWith('||scene')) {\n const sceneName = target.slice(0, -'||scene'.length)\n setBusy(true)\n setBusyLabel(`上传场景图「${sceneName}」${roleImageLabel}…`)\n setError('')\n try {\n await api.scenes({ op: 'image', name: sceneName, dataUrl, label: roleImageLabel })\n await refresh(false)\n pushProgress(`已上传场景「${sceneName}」${roleImageLabel}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`场景图上传失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n setRoleImageTarget(null)\n if (roleImageInputRef.current !== null) roleImageInputRef.current.value = ''\n }\n } else {\n await handleRoleImageUpload(target, file, roleImageLabel)\n }\n })()\n }}\n />\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10, flex: 1, minHeight: 0, overflowY: 'auto' }}>\n <div className={css.row} style={{ flexWrap: 'wrap', gap: 6, justifyContent: 'space-between' }}>\n <span className={css.row} style={{ gap: 6 }}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void (async () => {\n setBusy(true)\n setBusyLabel('⚠️ 提炼本书视觉规则…')\n setError('')\n try {\n const result = await api.visualRules({ op: 'extract' })\n await refresh(false)\n pushProgress(`已提炼 ${result.rules.length} 条视觉规则(已注入所有提示词)`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`视觉规则提炼失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n })() }}>⚠️ 提炼视觉规则</button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { void refresh(false); pushProgress('角色库已刷新', 'done') }}>🔄 刷新角色库</button>\n </span>\n </div>\n\n {(project?.visualRules ?? []).length > 0 && (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4, alignItems: 'center', marginTop: 6 }}>\n <span className={css.meta} style={{ fontSize: 11 }}>⚠️ 本书视觉规则:</span>\n {(project?.visualRules ?? []).map((r, i) => <span key={i} style={{ border: '1px solid var(--nf-warn, #b8860b)', borderRadius: 999, padding: '1px 8px', fontSize: 10, color: 'var(--nf-warn, #b8860b)' }}>{r}</span>)}\n </div>\n )}\n\n{(() => {\n const roles = project?.roles ?? []\n if (roles.length === 0) {\n return (\n <div className={css.shelfEmpty} style={{ minHeight: 140, flex: 1 }}>\n <span className={css.shelfEmptyIcon}>🎭</span>\n <span className={css.shelfEmptyTitle}>角色库为空</span>\n <span className={css.meta}>请先到「角色库」提炼角色并生成形象锚点</span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setActiveTab('roles') }}>去角色库</button>\n </div>\n )\n }\n const detailRole = detailRoleName !== null ? roles.find(r => r.name === detailRoleName) : undefined\n const group = (role: RoleRecord) => {\n const g = role.gallery ?? []\n const byLabel = (key: string) => g.filter(x => x.label === key)\n const byPrefix = (pre: string) => g.filter(x => x.label.startsWith(pre))\n return {\n portrait: byLabel('立绘')[0],\n sheet: byLabel('四视图')[0],\n expressions: byPrefix('表情-'),\n others: g.filter(x => x.label !== '立绘' && x.label !== '四视图' && !x.label.startsWith('表情-')),\n }\n }\n const uploadInDetail = (role: RoleRecord) => {\n setRoleImageLabel(detailUploadLabel.trim() !== '' ? detailUploadLabel.trim() : '立绘')\n setRoleImageTarget(role.name)\n roleImageInputRef.current?.click()\n }\n return (\n <>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(130px, 1fr))', gap: 10 }}>\n {roles.map(r => (\n <div key={r.name} onClick={() => { setDetailRoleName(r.name); setDetailUploadLabel('立绘') }} style={{ cursor: 'pointer', border: '1px solid var(--nf-border)', borderRadius: 12, overflow: 'hidden', background: 'var(--nf-bg-inset)', display: 'flex', flexDirection: 'column' }}>\n <div style={{ aspectRatio: '3/4', display: 'flex', alignItems: 'center', justifyContent: 'center', background: 'var(--nf-bg-inset)', borderBottom: '1px solid var(--nf-border)', position: 'relative', overflow: 'hidden' }}>\n {r.imageUrl !== undefined\n ? <img src={r.imageUrl} alt={r.name} style={{ width: '100%', height: '100%', objectFit: 'cover', objectPosition: 'center 20%' }} />\n : <span className={css.meta}>暂无形象</span>}\n <span style={{ position: 'absolute', bottom: 4, right: 4, background: 'rgba(0,0,0,0.6)', color: '#fff', fontSize: 10, borderRadius: 6, padding: '1px 6px' }}>🖼 {(r.gallery ?? []).length}</span>\n </div>\n <div style={{ padding: 6, display: 'flex', flexDirection: 'column', gap: 2 }}>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <b style={{ fontSize: 13 }}>{r.name}</b>\n <span className={css.meta} style={{ fontSize: 10 }}>{r.roleLabel}</span>\n </div>\n <div className={css.meta} style={{ fontSize: 10, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>\n {r.imagePrompt !== undefined ? '✓ 锚点' : '⚠ 无锚点'} · {(r.identity ?? '').slice(0, 16)}\n </div>\n </div>\n </div>\n ))}\n </div>\n\n {detailRole !== undefined && (\n <div style={{ position: 'fixed', inset: 0, background: 'rgba(0,0,0,0.55)', zIndex: 1000, display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 24 }} onClick={() => { setDetailRoleName(null) }}>\n <div style={{ background: 'var(--nf-bg)', border: '1px solid var(--nf-border)', borderRadius: 16, width: 'min(960px, 100%)', maxHeight: '92vh', overflowY: 'auto', padding: 20, position: 'relative' }} onClick={e => e.stopPropagation()}>\n <button type=\"button\" className={css.iconButton} style={{ position: 'absolute', top: 12, right: 12, fontSize: 18 }} title=\"关闭\" aria-label=\"关闭\" onClick={() => { setDetailRoleName(null) }}>✕</button>\n <div style={{ marginBottom: 12 }}>\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 10, flexWrap: 'wrap' }}>\n <b style={{ fontSize: 22 }}>{detailRole.name}</b>\n <span className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)' }}>{detailRole.roleLabel}</span>\n </div>\n <div className={css.meta} style={{ marginTop: 4 }}>{detailRole.identity}</div>\n </div>\n\n {(project?.visualRules ?? []).length > 0 && (\n <div style={{ border: '1px solid var(--nf-warn, #b8860b)', borderRadius: 10, padding: '6px 10px', marginBottom: 10, fontSize: 11 }}>\n <b>⚠️ 本书视觉规则(已内嵌到下方所有提示词)</b>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4, marginTop: 4 }}>\n {(project?.visualRules ?? []).map((r, i) => <span key={i} style={{ border: '1px solid var(--nf-border)', borderRadius: 999, padding: '1px 8px', fontSize: 10 }}>{r}</span>)}\n </div>\n </div>\n )}\n\n <details style={{ marginBottom: 10, fontSize: 12 }}>\n <summary style={{ cursor: 'pointer', color: 'var(--nf-text-2)' }}>🖼 图集({(detailRole.gallery ?? []).length} 张 · 点击展开/收起)</summary>\n <div style={{ marginTop: 8 }}>\n {(() => {\n const g = group(detailRole)\n const hasMain = g.portrait !== undefined || g.sheet !== undefined\n return (\n <>\n {hasMain && (\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(240px, 1fr))', gap: 10, marginBottom: 12 }}>\n {g.portrait !== undefined && (\n <div style={{ border: '1px solid var(--nf-border)', borderRadius: 12, overflow: 'hidden' }}>\n <img src={g.portrait.dataUrl} alt=\"立绘\" style={{ width: '100%', maxHeight: 380, objectFit: 'contain', display: 'block', background: '#111' }} />\n <div className={css.meta} style={{ padding: '2px 8px', fontSize: 11 }}>立绘</div>\n </div>\n )}\n {g.sheet !== undefined && (\n <div style={{ border: '1px solid var(--nf-border)', borderRadius: 12, overflow: 'hidden' }}>\n <img src={g.sheet.dataUrl} alt=\"四视图\" style={{ width: '100%', maxHeight: 380, objectFit: 'contain', display: 'block', background: '#111' }} />\n <div className={css.meta} style={{ padding: '2px 8px', fontSize: 11 }}>四视图</div>\n </div>\n )}\n </div>\n )}\n {g.expressions.length > 0 && (\n <div style={{ marginBottom: 12 }}>\n <b style={{ fontSize: 13 }}>表情设定</b>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(110px, 1fr))', gap: 8, marginTop: 6 }}>\n {g.expressions.map(img => (\n <div key={img.label} style={{ border: '1px solid var(--nf-border)', borderRadius: 10, overflow: 'hidden', position: 'relative' }}>\n <img src={img.dataUrl} alt={img.label} style={{ width: '100%', height: 110, objectFit: 'cover', display: 'block' }} />\n <div style={{ background: 'rgba(0,0,0,0.55)', color: '#fff', fontSize: 10, padding: '1px 6px', textAlign: 'center' }}>{img.label.replace('表情-', '')}</div>\n <button type=\"button\" className={css.iconButton} style={{ position: 'absolute', top: 2, right: 2, fontSize: 11 }} title=\"删除\" aria-label=\"删除\" onClick={() => { void (async () => {\n try {\n await api.roles({ op: 'removeImage', name: detailRole.name, label: img.label })\n await refresh(false)\n pushProgress(`已删除「${detailRole.name}」${img.label}`, 'done')\n } catch (err) { setError((err as Error).message) }\n })() }}>×</button>\n </div>\n ))}\n </div>\n </div>\n )}\n {g.others.length > 0 && (\n <div style={{ marginBottom: 12 }}>\n <b style={{ fontSize: 13 }}>场景 / 细节</b>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(140px, 1fr))', gap: 8, marginTop: 6 }}>\n {g.others.map(img => (\n <div key={img.label} style={{ border: '1px solid var(--nf-border)', borderRadius: 10, overflow: 'hidden', position: 'relative' }}>\n <img src={img.dataUrl} alt={img.label} style={{ width: '100%', height: 90, objectFit: 'cover', display: 'block' }} />\n <div style={{ background: 'rgba(0,0,0,0.55)', color: '#fff', fontSize: 10, padding: '1px 6px', textAlign: 'center' }}>{img.label}</div>\n <button type=\"button\" className={css.iconButton} style={{ position: 'absolute', top: 2, right: 2, fontSize: 11 }} title=\"删除\" aria-label=\"删除\" onClick={() => { void (async () => {\n try {\n await api.roles({ op: 'removeImage', name: detailRole.name, label: img.label })\n await refresh(false)\n pushProgress(`已删除「${detailRole.name}」${img.label}`, 'done')\n } catch (err) { setError((err as Error).message) }\n })() }}>×</button>\n </div>\n ))}\n </div>\n </div>\n )}\n </>\n )\n })()}\n </div>\n </details>\n\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(280px, 1fr))', gap: 14, marginBottom: 12 }}>\n <div>\n <b style={{ fontSize: 13 }}>基本信息</b>\n <div style={{ fontSize: 12, lineHeight: 1.8, marginTop: 4 }}>\n <div><span className={css.meta}>性格:</span>{(detailRole.traits ?? []).join('、') || '—'}</div>\n <div><span className={css.meta}>目标:</span>{detailRole.goals || '—'}</div>\n <div><span className={css.meta}>关系:</span>{(detailRole.relations ?? []).join(';') || '—'}</div>\n <div><span className={css.meta}>成长线:</span>{(detailRole.arc ?? []).join(';') || '—'}</div>\n </div>\n </div>\n <div>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <b style={{ fontSize: 13 }}>📄 提示词包</b>\n {detailRole.imagePrompt !== undefined && detailRole.promptKit === undefined && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void (async () => {\n setBusy(true)\n setBusyLabel(`精修「${detailRole.name}」提示词…`)\n setError('')\n try {\n await api.roles({ op: 'promptKit', name: detailRole.name })\n await refresh(false)\n pushProgress(`已生成「${detailRole.name}」四类精修提示词`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`提示词精修失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n })() }}>✨ 生成精修版</button>\n )}\n </div>\n {detailRole.imagePrompt === undefined && <span className={css.meta}>未生成锚点,先点「✨ 生成锚点」</span>}\n {(() => {\n const anchor = detailRole.imagePrompt\n if (anchor === undefined) return null\n const rules = project?.visualRules ?? []\n const rulesZh = rules.length > 0 ? '\\n【本书视觉规则】' + rules.join(';') : ''\n const expressions = detailRole.expressions ?? ['平静']\n const expName = (n: string) => n.replace(/^表情-/, '')\n const kit = detailRole.promptKit\n const blocks: Array<{ key: string; title: string; zh: string; en: string }> = []\n if (kit !== undefined) {\n blocks.push({ key: 'portrait', title: '立绘', zh: kit.portrait.zh, en: kit.portrait.en })\n blocks.push({ key: 'sheet', title: '四视图', zh: kit.sheet.zh, en: kit.sheet.en })\n for (const e of kit.expressions) blocks.push({ key: 'exp-' + e.name, title: `表情·${e.name}`, zh: e.zh, en: e.en })\n blocks.push({ key: 'details', title: '细节', zh: kit.details.zh, en: kit.details.en })\n } else {\n blocks.push({ key: 'portrait', title: '立绘', zh: anchor.zh + '。全身/半身正视图,写实电影感。' + rulesZh, en: anchor.en + ', full body, front view, plain background' })\n blocks.push({ key: 'sheet', title: '四视图', zh: anchor.zh + '。同一角色的正面/左侧面/右侧面/背面四视图设定表,纯白背景,四个视角分别描述。' + rulesZh, en: anchor.en + ', character sheet, front view, left side view, right side view, back view, full body, plain white background' })\n for (const n of expressions) blocks.push({ key: 'exp-' + n, title: `表情·${expName(n)}`, zh: anchor.zh + `。表情:${expName(n)},脸部特写(头部到锁骨),纯白背景,五官与角色定稿完全一致,皮肤纹理细节完整,无多余杂物。` + rulesZh, en: anchor.en + `, facial close-up, head to collarbone, expression: ${expName(n)}, plain white background, consistent with character design, detailed skin texture, no extra objects` })\n blocks.push({ key: 'details', title: '细节', zh: `多组局部细节集合参考图,纯白背景:${anchor.tags.map(t => t + '特写').join(';')}。细节清晰锐利,角色细节参考稿,无多余杂物。` + rulesZh, en: anchor.tags.join(', ') + ', multi-panel detail reference sheet, plain white background, macro close-up, sharp details, character detail sheet, no extra objects' })\n }\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, marginTop: 8 }}>\n {blocks.map(b => (\n <div key={b.key} style={{ border: '1px solid var(--nf-border)', borderRadius: 8, padding: '6px 8px' }}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <b style={{ fontSize: 11 }}>{b.title}</b>\n <span className={css.row} style={{ gap: 4 }}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} style={{ fontSize: 10 }} onClick={() => {\n void navigator.clipboard?.writeText(b.zh).then(() => { pushProgress(`已复制「${detailRole.name}」${b.title}中文提示词`, 'done') }).catch(() => { /* ignore */ })\n }}>复制</button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} style={{ fontSize: 10 }} onClick={() => {\n void navigator.clipboard?.writeText(b.en).then(() => { pushProgress(`已复制「${detailRole.name}」${b.title}英文标签`, 'done') }).catch(() => { /* ignore */ })\n }}>EN</button>\n </span>\n </div>\n <div className={css.meta} style={{ fontSize: 11, lineHeight: 1.5, marginTop: 3 }}>{b.zh}</div>\n <details style={{ marginTop: 3 }}>\n <summary style={{ cursor: 'pointer', fontSize: 10, color: 'var(--nf-text-2)' }}>🌐 英文标签(点击展开)</summary>\n <div className={css.meta} style={{ fontSize: 9, fontFamily: 'monospace', marginTop: 2, wordBreak: 'break-all', color: 'var(--nf-text-2)' }}>{b.en}</div>\n </details>\n </div>\n ))}\n <div className={css.meta} style={{ fontSize: 10 }}>关键词:{(anchor.tags ?? []).join('、')}</div>\n </div>\n )\n })()}\n </div>\n </div>\n\n <div style={{ borderTop: '1px solid var(--nf-border)', paddingTop: 10, display: 'flex', flexWrap: 'wrap', gap: 6, alignItems: 'center' }}>\n {detailRole.imagePrompt === undefined && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void handleRoleVisual(detailRole.name) }}>✨ 生成锚点</button>\n )}\n {detailRole.imagePrompt !== undefined && config?.imageApiEnabled === true && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void handleRoleImageGenerate(detailRole.name) }}>豆包生成</button>\n )}\n {detailRole.imagePrompt !== undefined && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => {\n const text = [detailRole.imagePrompt!.en, detailRole.imagePrompt!.tags.join(', ')].filter(Boolean).join('\\n')\n void navigator.clipboard?.writeText(text).then(() => { pushProgress(`已复制「${detailRole.name}」英文生图提示词`, 'done') }).catch(() => { /* ignore */ })\n }}>复制提示词</button>\n )}\n <input\n className={css.input}\n style={{ width: 140, fontSize: 12, padding: '3px 6px' }}\n placeholder=\"图集标签\"\n value={detailUploadLabel}\n onChange={e => { setDetailUploadLabel(e.target.value) }}\n />\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { uploadInDetail(detailRole) }}>📤 上传图</button>\n <select\n className={css.input}\n style={{ fontSize: 12, padding: '3px 4px', width: 90 }}\n value={detailRole.importance ?? 'support'}\n onChange={e => { void handleRoleImportance(detailRole, e.target.value as RoleRecord['importance']) }}\n title=\"漫剧重要性\"\n >\n <option value=\"main\">重要</option>\n <option value=\"support\">配角</option>\n <option value=\"extra\">路人</option>\n </select>\n </div>\n </div>\n </div>\n )}\n </>\n )\n })()}\n </div>\n </div>\n )}\n\n {activeTab === 'scenes' && (\n <div className={css.card} style={{ flex: 1, minHeight: 0 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle} style={{ fontSize: 17, fontWeight: 700 }}>🏞️ 场景库</span>\n <span className={css.meta}>场景视觉锚点:提炼自正文,供漫剧分镜/生图锁定\"在哪、什么氛围\"</span>\n </div>\n\n <div className={css.row} style={{ flexWrap: 'wrap', gap: 6, margin: '8px 0' }}>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void (async () => {\n setBusy(true)\n setBusyLabel('✨ 从全书提炼场景…')\n setError('')\n try {\n const result = await api.scenes({ op: 'extract' })\n setSceneCandidates(result.candidates ?? [])\n pushProgress(`提炼出 ${(result.candidates ?? []).length} 个候选场景,可采纳或修改后采纳`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`场景提炼失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n })() }}>{busy ? '⏳ 提炼中…' : '✨ 从全书提炼场景'}</button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { void refresh(false); pushProgress('场景库已刷新', 'done') }}>🔄 刷新</button>\n {sceneCandidates !== null && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setSceneCandidates(null) }}>收起候选</button>\n )}\n </div>\n\n {sceneDraft !== null && (\n <div style={{ border: '1px solid var(--nf-accent)', borderRadius: 10, padding: 10, marginBottom: 10, display: 'flex', flexDirection: 'column', gap: 6 }}>\n <b style={{ fontSize: 13 }}>编辑场景</b>\n <input className={css.input} style={{ fontSize: 12, padding: '4px 8px' }} placeholder=\"场景名\" value={sceneDraft.name} onChange={e => { setSceneDraft({ ...sceneDraft, name: e.target.value }) }} />\n <input className={css.input} style={{ fontSize: 12, padding: '4px 8px' }} placeholder=\"一句话定位\" value={sceneDraft.summary} onChange={e => { setSceneDraft({ ...sceneDraft, summary: e.target.value }) }} />\n <div className={css.row} style={{ gap: 6 }}>\n <input className={css.input} style={{ fontSize: 12, padding: '4px 8px', flex: 1 }} placeholder=\"幕归属(第一幕后场…)\" value={sceneDraft.act ?? ''} onChange={e => { setSceneDraft({ ...sceneDraft, act: e.target.value }) }} />\n <input className={css.input} style={{ fontSize: 12, padding: '4px 8px', flex: 1 }} placeholder=\"时间光态(雨夜/闭店后…)\" value={sceneDraft.moment ?? ''} onChange={e => { setSceneDraft({ ...sceneDraft, moment: e.target.value }) }} />\n </div>\n <textarea className={css.input} style={{ fontSize: 12, padding: '4px 8px', minHeight: 48 }} placeholder=\"关键镜头(每行一条:人物动作+情绪+镜头)\" value={(sceneDraft.beats ?? []).join('\\n')} onChange={e => { setSceneDraft({ ...sceneDraft, beats: e.target.value.split(/\\n+/).map(x => x.trim()).filter(Boolean) }) }} />\n <input className={css.input} style={{ fontSize: 12, padding: '4px 8px' }} placeholder=\"人物在场状态(含标志物细节)\" value={sceneDraft.characterState ?? ''} onChange={e => { setSceneDraft({ ...sceneDraft, characterState: e.target.value }) }} />\n <textarea className={css.input} style={{ fontSize: 12, padding: '4px 8px', minHeight: 60 }} placeholder=\"环境构成(每行一项)\" value={(sceneDraft.elements ?? []).join('\\n')} onChange={e => { setSceneDraft({ ...sceneDraft, elements: e.target.value.split(/\\n+/).map(x => x.trim()).filter(Boolean) }) }} />\n <textarea className={css.input} style={{ fontSize: 12, padding: '4px 8px', minHeight: 60 }} placeholder=\"中文生图提示词\" value={sceneDraft.zh} onChange={e => { setSceneDraft({ ...sceneDraft, zh: e.target.value }) }} />\n <textarea className={css.input} style={{ fontSize: 12, padding: '4px 8px', minHeight: 60 }} placeholder=\"英文生图提示词\" value={sceneDraft.en} onChange={e => { setSceneDraft({ ...sceneDraft, en: e.target.value }) }} />\n <div className={css.row} style={{ gap: 6 }}>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy || sceneDraft.name.trim() === ''} onClick={() => { void (async () => {\n setBusy(true)\n try {\n await api.scenes({ op: 'update', scene: { ...sceneDraft, name: sceneDraft.name.trim() } })\n await refresh(false)\n setSceneDraft(null)\n pushProgress(`已保存场景「${sceneDraft.name.trim()}」`, 'done')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n })() }}>保存</button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setSceneDraft(null) }}>取消</button>\n </div>\n </div>\n )}\n\n {sceneCandidates !== null && sceneCandidates.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, marginBottom: 10 }}>\n {sceneCandidates.map(s => (\n <div key={s.name} style={{ border: '1px solid var(--nf-accent)', borderRadius: 10, padding: '8px 10px', fontSize: 12 }}>\n <div className={css.row} style={{ flexWrap: 'wrap', gap: 6, justifyContent: 'space-between' }}>\n <span><b>{s.name}</b> <span className={css.meta}>· {(s.moods ?? []).join('、')}</span></span>\n <span className={css.row} style={{ gap: 4 }}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { void (async () => {\n try {\n await api.scenes({ op: 'adopt', scene: s })\n setSceneCandidates((sceneCandidates ?? []).filter(x => x.name !== s.name))\n await refresh(false)\n pushProgress(`已采纳场景「${s.name}」`, 'done')\n } catch (err) { setError((err as Error).message) }\n })() }}>采纳</button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setSceneDraft(s); setSceneCandidates(null) }}>修改后采纳</button>\n </span>\n </div>\n <div className={css.meta} style={{ marginTop: 2 }}>{s.summary}</div>\n <div className={css.meta} style={{ marginTop: 2, fontSize: 11 }}>要素:{(s.elements ?? []).join(';')}</div>\n </div>\n ))}\n </div>\n )}\n\n {(() => {\n const scenes = project?.scenes ?? []\n const detail = sceneDetailName !== null ? scenes.find(s => s.name === sceneDetailName) : undefined\n if (scenes.length === 0 && sceneCandidates === null) {\n return (\n <div className={css.shelfEmpty} style={{ minHeight: 140, flex: 1 }}>\n <span className={css.shelfEmptyIcon}>🏞️</span>\n <span className={css.shelfEmptyTitle}>场景库为空</span>\n <span className={css.meta}>点「✨ 从全书提炼场景」自动建立,或手动新增</span>\n </div>\n )\n }\n return (\n <>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(180px, 1fr))', gap: 10 }}>\n {scenes.map(s => {\n const cover = (s.gallery ?? [])[0]\n return (\n <div key={s.name} onClick={() => { setSceneDetailName(s.name); setSceneUploadLabel('全景') }} style={{ cursor: 'pointer', border: '1px solid var(--nf-border)', borderRadius: 12, overflow: 'hidden', background: 'var(--nf-bg-inset)', display: 'flex', flexDirection: 'column' }}>\n <div style={{ height: 100, display: 'flex', alignItems: 'center', justifyContent: 'center', background: 'var(--nf-bg-inset)', borderBottom: '1px solid var(--nf-border)', position: 'relative' }}>\n {cover !== undefined\n ? <img src={cover.dataUrl} alt={s.name} style={{ width: '100%', height: '100%', objectFit: 'cover' }} />\n : <span className={css.meta}>暂无场景图</span>}\n <span style={{ position: 'absolute', bottom: 4, right: 4, background: 'rgba(0,0,0,0.6)', color: '#fff', fontSize: 10, borderRadius: 6, padding: '1px 6px' }}>🖼 {(s.gallery ?? []).length}</span>\n </div>\n <div style={{ padding: 6, display: 'flex', flexDirection: 'column', gap: 2 }}>\n <b style={{ fontSize: 13 }}>{s.name}</b>\n <div className={css.meta} style={{ fontSize: 10 }}>{(s.moods ?? []).join('、') || s.summary.slice(0, 16)}</div>\n </div>\n </div>\n )\n })}\n </div>\n\n {detail !== undefined && (\n <div style={{ position: 'fixed', inset: 0, background: 'rgba(0,0,0,0.55)', zIndex: 1000, display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 24 }} onClick={() => { setSceneDetailName(null) }}>\n <div style={{ background: 'var(--nf-bg)', border: '1px solid var(--nf-border)', borderRadius: 16, width: 'min(860px, 100%)', maxHeight: '92vh', overflowY: 'auto', padding: 20, position: 'relative' }} onClick={e => e.stopPropagation()}>\n <button type=\"button\" className={css.iconButton} style={{ position: 'absolute', top: 12, right: 12, fontSize: 18 }} title=\"关闭\" aria-label=\"关闭\" onClick={() => { setSceneDetailName(null) }}>✕</button>\n <div style={{ marginBottom: 12 }}>\n <b style={{ fontSize: 20 }}>{detail.name}</b>\n <div className={css.meta} style={{ marginTop: 4 }}>{detail.summary}</div>\n </div>\n\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(160px, 1fr))', gap: 8, marginBottom: 12 }}>\n {(detail.gallery ?? []).map(img => (\n <div key={img.label} style={{ border: '1px solid var(--nf-border)', borderRadius: 10, overflow: 'hidden', position: 'relative' }}>\n <img src={img.dataUrl} alt={img.label} style={{ width: '100%', height: 100, objectFit: 'cover', display: 'block' }} />\n <div style={{ background: 'rgba(0,0,0,0.55)', color: '#fff', fontSize: 10, padding: '1px 6px', textAlign: 'center' }}>{img.label}</div>\n <button type=\"button\" className={css.iconButton} style={{ position: 'absolute', top: 2, right: 2, fontSize: 11 }} title=\"删除\" aria-label=\"删除\" onClick={() => { void (async () => {\n try {\n await api.scenes({ op: 'removeImage', name: detail.name, label: img.label })\n await refresh(false)\n pushProgress(`已删除「${detail.name}」${img.label}`, 'done')\n } catch (err) { setError((err as Error).message) }\n })() }}>×</button>\n </div>\n ))}\n {(detail.gallery ?? []).length === 0 && <span className={css.meta}>暂无场景图</span>}\n </div>\n\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(260px, 1fr))', gap: 14, marginBottom: 12 }}>\n <div style={{ fontSize: 12, lineHeight: 1.8 }}>\n {(detail.act !== undefined || detail.moment !== undefined) && (\n <div style={{ marginBottom: 6 }}>\n {(detail.act !== undefined && detail.act !== '') && <span className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)', marginRight: 6 }}>{detail.act}</span>}\n {(detail.moment !== undefined && detail.moment !== '') && <span className={css.meta}>{detail.moment}</span>}\n </div>\n )}\n {(detail.beats ?? []).length > 0 && (\n <div style={{ marginBottom: 8 }}>\n <b style={{ fontSize: 13 }}>关键镜头</b>\n <div style={{ marginTop: 4 }}>{(detail.beats ?? []).map((b, i) => <div key={i} style={{ fontSize: 11, color: 'var(--nf-text-2)', marginTop: 2 }}>🎬 {b}</div>)}</div>\n </div>\n )}\n {detail.characterState !== undefined && detail.characterState !== '' && (\n <div style={{ marginBottom: 8 }}>\n <b style={{ fontSize: 13 }}>人物状态</b>\n <div className={css.meta} style={{ marginTop: 2 }}>{detail.characterState}</div>\n </div>\n )}\n <b style={{ fontSize: 13 }}>环境构成</b>\n <div style={{ marginTop: 4 }}>{(detail.elements ?? []).map(e => <span key={e} style={{ border: '1px solid var(--nf-border)', borderRadius: 999, padding: '1px 8px', fontSize: 11, margin: '0 4px 4px 0', display: 'inline-block' }}>{e}</span>)}</div>\n <div style={{ marginTop: 8 }}><b style={{ fontSize: 13 }}>色调光影</b></div>\n <div style={{ marginTop: 4 }}>{(detail.palette ?? []).join(';') || '—'}</div>\n <div style={{ marginTop: 8 }}><b style={{ fontSize: 13 }}>氛围</b></div>\n <div style={{ marginTop: 4 }}>{(detail.moods ?? []).join('、') || '—'}</div>\n <div style={{ marginTop: 8 }}><b style={{ fontSize: 13 }}>依据</b></div>\n <div className={css.meta} style={{ marginTop: 4 }}>{detail.source || '—'}</div>\n </div>\n <div>\n <b style={{ fontSize: 13 }}>生图提示词</b>\n <div className={css.meta} style={{ fontSize: 11, lineHeight: 1.6, marginTop: 4 }}>{detail.zh}</div>\n <div className={css.meta} style={{ fontSize: 10, fontFamily: 'monospace', marginTop: 4, wordBreak: 'break-all' }}>{detail.en}</div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4, marginTop: 8 }}>\n {(detail.tags ?? []).map(t => <span key={t} style={{ border: '1px solid var(--nf-border)', borderRadius: 999, padding: '2px 8px', fontSize: 11 }}>{t}</span>)}\n </div>\n </div>\n </div>\n\n <div style={{ borderTop: '1px solid var(--nf-border)', paddingTop: 10, display: 'flex', flexWrap: 'wrap', gap: 6, alignItems: 'center' }}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => {\n const text = [detail.en, detail.tags.join(', ')].filter(Boolean).join('\\n')\n void navigator.clipboard?.writeText(text).then(() => { pushProgress(`已复制「${detail.name}」英文生图提示词`, 'done') }).catch(() => { /* ignore */ })\n }}>复制提示词</button>\n <input className={css.input} style={{ width: 130, fontSize: 12, padding: '3px 6px' }} placeholder=\"图集标签\" value={sceneUploadLabel} onChange={e => { setSceneUploadLabel(e.target.value) }} />\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => {\n setRoleImageLabel(sceneUploadLabel.trim() !== '' ? sceneUploadLabel.trim() : '全景')\n setSceneUploadLabel(sceneUploadLabel.trim() !== '' ? sceneUploadLabel.trim() : '全景')\n setRoleImageTarget(detail.name + '||scene')\n roleImageInputRef.current?.click()\n }}>📤 上传场景图</button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setSceneDraft(detail); setSceneDetailName(null) }}>✏️ 编辑</button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} style={{ color: 'var(--nf-danger, #e05)' }} onClick={() => { void (async () => {\n if (!window.confirm(`确定删除场景「${detail.name}」?`)) return\n try {\n await api.scenes({ op: 'remove', name: detail.name })\n await refresh(false)\n setSceneDetailName(null)\n pushProgress(`已删除场景「${detail.name}」`, 'done')\n } catch (err) { setError((err as Error).message) }\n })() }}>🗑 删除</button>\n </div>\n </div>\n </div>\n )}\n </>\n )\n })()}\n </div>\n )}\n\n </>)}\n </div>\n </div>\n </>\n )}\n\n {/* AI 助手悬浮窗:可拖动、可拉大小,不占用工作台 */}\n {assistantOpen && (\n <div\n className={css.assistantFloat}\n style={{ left: assistantPos.x, top: assistantPos.y, width: assistantSize.w, height: assistantSize.h }}\n >\n <div\n className={css.assistantFloatHeader}\n onMouseDown={e => {\n e.preventDefault()\n dragState.current = { type: 'move', target: 'assistant', startX: e.clientX, startY: e.clientY, origX: assistantPos.x, origY: assistantPos.y, origW: assistantSize.w, origH: assistantSize.h }\n }}\n >\n <span>💬 AI 助手 <span className={css.meta}>(拖动标题栏移动 · 右下角拉大小)</span></span>\n <button type=\"button\" className={css.iconButton} title=\"关闭\" aria-label=\"关闭 AI 助手\" onClick={() => { setAssistantOpen(false) }}>×</button>\n </div>\n <div className={css.assistantFloatBody}>\n <AssistantTab api={api} />\n </div>\n <div\n className={css.assistantResize}\n onMouseDown={e => {\n e.preventDefault()\n e.stopPropagation()\n dragState.current = { type: 'resize', target: 'assistant', startX: e.clientX, startY: e.clientY, origX: assistantPos.x, origY: assistantPos.y, origW: assistantSize.w, origH: assistantSize.h }\n }}\n />\n </div>\n )}\n\n {/* 工作进度悬浮窗:可拖动、可拉大小(同 AI 助手),承接活动输出 + 当前任务进度 */}\n {progressOpen && (\n <div\n className={css.assistantFloat}\n style={{ left: progressPos.x, top: progressPos.y, width: progressSize.w, height: progressSize.h }}\n >\n <div\n className={css.assistantFloatHeader}\n onMouseDown={e => {\n e.preventDefault()\n dragState.current = { type: 'move', target: 'progress', startX: e.clientX, startY: e.clientY, origX: progressPos.x, origY: progressPos.y, origW: progressSize.w, origH: progressSize.h }\n }}\n >\n <span>\n 📊 工作进度\n {busy && <span style={{ color: 'var(--nf-accent)' }}> 🟢 任务进行中</span>}\n <span className={css.meta}>(拖动标题栏移动 · 右下角拉大小)</span>\n </span>\n <span style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n {progress.length > 0 && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setProgress([]) }} title=\"清空活动记录\">\n 清空\n </button>\n )}\n <button type=\"button\" className={css.iconButton} title=\"关闭\" aria-label=\"关闭工作进度\" onClick={() => { setProgressOpen(false) }}>×</button>\n </span>\n </div>\n <div className={css.assistantFloatBody} style={{ padding: 10, display: 'flex', flexDirection: 'column', gap: 8, overflow: 'hidden' }}>\n {/* 当前任务大进度条:进行中显示 */}\n {(busy && (busyLabel !== '' || liveBar !== null)) && (\n <div style={{ border: '1px solid var(--nf-accent)', borderRadius: 10, padding: '8px 12px', display: 'flex', flexDirection: 'column', gap: 5, background: 'color-mix(in srgb, var(--nf-accent) 6%, transparent)' }}>\n <span style={{ fontSize: 12, fontWeight: 600, color: 'var(--nf-accent)' }}>\n ✍ {busyLabel !== '' ? busyLabel : (liveBar?.text ?? '任务进行中')}…\n </span>\n {liveBar?.ratio !== undefined && (\n <div className={css.bigProgressBar}>\n <div className={css.bigProgressBarFill} style={{ width: `${Math.round(liveBar.ratio * 100)}%` }} />\n </div>\n )}\n {liveBar?.text !== undefined && <span className={css.liveText}>{liveBar.text}</span>}\n </div>\n )}\n {/* 活动记录列表(标题行已并入窗口标题栏,清空按钮在右上角) */}\n <div className={css.progress} style={{ flex: 1, minHeight: 0, overflowY: 'auto', border: '1px solid var(--nf-border)', borderRadius: 10, background: 'var(--nf-bg-inset)', padding: 8, display: 'flex', flexDirection: 'column' }}>\n {progress.length === 0 ? (\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', gap: 4, color: 'var(--nf-text-3)', fontSize: 12, minHeight: 120 }}>\n <span style={{ fontSize: 22 }}>📭</span>\n <span>暂无活动记录</span>\n <span>生成、审稿等操作会显示在这里</span>\n </div>\n ) : (\n progress.map(line => (\n <div key={line.id} className={line.kind === 'done' ? css.progressLineDone : line.kind === 'error' ? css.progressLineError : line.live === true ? css.progressLineLive : css.progressLine}>\n {line.live === true && (\n <span className={css.progressBar}>\n <span className={css.progressBarFill} style={{ width: `${Math.round((line.ratio ?? 0) * 100)}%` }} />\n </span>\n )}\n {line.text}\n </div>\n ))\n )}\n <div ref={progressEndRef} />\n </div>\n </div>\n <div\n className={css.assistantResize}\n onMouseDown={e => {\n e.preventDefault()\n e.stopPropagation()\n dragState.current = { type: 'resize', target: 'progress', startX: e.clientX, startY: e.clientY, origX: progressPos.x, origY: progressPos.y, origW: progressSize.w, origH: progressSize.h }\n }}\n />\n </div>\n )}\n </div>\n )\n}\n","/**\n * Panel view mounting — mirrors the family plugins: a container appended\n * inside the conversation grid item, hidden while inactive; toggling is a\n * data attribute on <html>, with cross-plugin activation events.\n */\nimport { createRoot, type Root } from 'react-dom/client'\nimport type { NovelApi } from './api.ts'\nimport type { PanelController } from './panel/controller.ts'\nimport { NovelPanel } from './panel/NovelPanel.tsx'\nimport css from './panel/panel.module.css'\n\n/** The injected panel container. */\nexport const PANEL_VIEW_SELECTOR = '[data-dsh-novelforge-view]'\n\nconst CONVERSATION_COLUMN_SELECTOR = '[data-pane=\"conversation\"]'\nconst ACTIVE_ATTR = 'data-dsh-novelforge-active'\n/** Sibling panels' activation attributes (evicted when this panel opens). */\nconst OTHER_ACTIVE_ATTRS = ['data-dsh-taskboard-active', 'data-dsh-ssh-active']\n/** Cross-plugin activation event; detail is the activating panel name. */\nconst ACTIVATE_EVENT = 'dsh-panel-activate'\nconst PANEL_NAME = 'novelforge'\n\n/** Find the center column, or undefined while the frame is not mounted. */\nfunction conversationColumn(): HTMLElement | undefined {\n return document.querySelector<HTMLElement>(CONVERSATION_COLUMN_SELECTOR) ?? undefined\n}\n\n/**\n * Mount the panel React tree into the center column and bind visibility to\n * the controller.\n */\nexport function mountPanel(controller: PanelController, api: NovelApi): () => void {\n let root: Root | undefined\n let container: HTMLDivElement | undefined\n\n const ensure = (): void => {\n if (container !== undefined) {\n if (container.isConnected) return\n root?.unmount()\n root = undefined\n container.remove()\n container = undefined\n }\n const column = conversationColumn()\n if (column === undefined) return\n container = document.createElement('div')\n container.dataset.dshNovelforgeView = 'true'\n container.className = css.view\n column.appendChild(container)\n root = createRoot(container)\n root.render(<NovelPanel controller={controller} api={api} />)\n }\n\n const waitObserver = new MutationObserver(() => { ensure() })\n waitObserver.observe(document.body, { childList: true, subtree: true })\n\n const applyActive = (): void => {\n if (controller.getSnapshot().panelOpen) {\n for (const attr of OTHER_ACTIVE_ATTRS) document.documentElement.removeAttribute(attr)\n document.documentElement.setAttribute(ACTIVE_ATTR, '')\n document.dispatchEvent(new CustomEvent(ACTIVATE_EVENT, { detail: PANEL_NAME }))\n } else {\n document.documentElement.removeAttribute(ACTIVE_ATTR)\n }\n }\n const onOtherActivate = (event: Event): void => {\n const detail = (event as CustomEvent).detail\n if ((detail === 'taskboard' || detail === 'ssh') && controller.getSnapshot().panelOpen) {\n controller.close()\n }\n }\n // Jump out on sidebar context clicks.\n const SIDEBAR_ROW_SELECTOR = '[class*=\"sessionRow\"], [class*=\"projectRow\"], [class*=\"searchResultRow\"], [class*=\"searchResultWorkspace\"], [class*=\"newSession\"]'\n const onClickSidebarRow = (event: MouseEvent): void => {\n if (!controller.getSnapshot().panelOpen) return\n const target = event.target as HTMLElement | null\n if (target === null) return\n if (target.closest(SIDEBAR_ROW_SELECTOR) !== null) controller.close()\n }\n document.addEventListener('click', onClickSidebarRow, true)\n document.addEventListener(ACTIVATE_EVENT, onOtherActivate)\n const unsubscribe = controller.subscribe(applyActive)\n applyActive()\n ensure()\n\n return () => {\n document.removeEventListener('click', onClickSidebarRow, true)\n document.removeEventListener(ACTIVATE_EVENT, onOtherActivate)\n waitObserver.disconnect()\n unsubscribe()\n document.documentElement.removeAttribute(ACTIVE_ATTR)\n root?.unmount()\n root = undefined\n container?.remove()\n container = undefined\n }\n}\n","/**\n * Novel-forge panel controller: the single owner of the panel's open/closed\n * state (framework-free, mirroring the family plugins' controllers).\n */\n\n/** Immutable controller snapshot for UI subscriptions. */\nexport interface PanelControllerSnapshot {\n panelOpen: boolean\n}\n\n/** The panel state owner the sidebar entry toggles and the view renders from. */\nexport class PanelController {\n private panelOpen = false\n private listeners = new Set<() => void>()\n\n getSnapshot(): PanelControllerSnapshot {\n return { panelOpen: this.panelOpen }\n }\n\n subscribe(fn: () => void): () => void {\n this.listeners.add(fn)\n return () => { this.listeners.delete(fn) }\n }\n\n open(): void {\n if (this.panelOpen) return\n this.panelOpen = true\n this.notify()\n }\n\n close(): void {\n if (!this.panelOpen) return\n this.panelOpen = false\n this.notify()\n }\n\n toggle(): void {\n if (this.panelOpen) this.close()\n else this.open()\n }\n\n private notify(): void {\n for (const fn of [...this.listeners]) fn()\n }\n}\n","/**\n * Sidebar entry injection — mirrors the family plugins' DOM-level pattern:\n * the shell exposes no external slot, so the entry row is injected after the\n * sibling plugin entries and self-heals via MutationObserver.\n */\nimport type { PanelController } from './panel/controller.ts'\nimport { tt } from './panel/helpers.ts'\nimport css from './panel/panel.module.css'\n\n/** Stable data attribute identifying the injected entry row. */\nexport const ENTRY_SELECTOR = '[data-dsh-novelforge-entry]'\n\n/** Inline icon: an open book / writing glyph. */\nconst ICON = '<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2.5 3.5h4a2 2 0 0 1 2 2v7a2 2 0 0 0-2-2h-4z\"/><path d=\"M13.5 3.5h-4a2 2 0 0 0-2 2v7a2 2 0 0 1 2-2h4z\"/><path d=\"M8 5.5v7\"/></svg>'\n\n/** Find the sidebar shell root element. */\nfunction sidebarRoot(): HTMLElement | undefined {\n const column = document.querySelector<HTMLElement>('[data-pane=\"sidebar\"], [class*=\"sidebarCol\"]')\n if (column === null) return undefined\n const logoOwner = column.querySelector<HTMLElement>('[class*=\"logoRow\"]')?.parentElement\n return logoOwner ?? (column.firstElementChild as HTMLElement | undefined)\n}\n\n/** The New Session button (nested in the logo row on current shells). */\nfunction newSessionButton(root: HTMLElement): HTMLButtonElement | undefined {\n const nested = root.querySelector<HTMLButtonElement>('button[class*=\"newSession\"]')\n if (nested !== null) return nested\n for (const child of root.children) {\n if (child.tagName === 'BUTTON') return child as HTMLButtonElement\n }\n return undefined\n}\n\n/** Build the entry row (a detached button; insert once the shell is up). */\nfunction createEntry(controller: PanelController): HTMLButtonElement {\n const entry = document.createElement('button')\n entry.type = 'button'\n entry.dataset.dshNovelforgeEntry = 'true'\n entry.className = css.entry\n entry.setAttribute('aria-label', tt('entry.label'))\n entry.setAttribute('title', tt('entry.tooltip'))\n entry.innerHTML = '<span class=\"' + css.entryIcon + '\">' + ICON + '</span><span class=\"' + css.entryLabel + '\">' + tt('entry.label') + '</span>'\n entry.addEventListener('click', () => { controller.toggle() })\n return entry\n}\n\n/** Re-insert the entry after the sibling plugin entry block. */\nfunction placeEntry(root: HTMLElement, entry: HTMLButtonElement): boolean {\n const button = newSessionButton(root)\n if (button === undefined) return false\n if (entry.parentElement !== root) {\n const row = button.closest('[class*=\"logoRow\"]')\n const base = (row !== null && row.parentElement === root) ? row : button\n const family = Array.from(root.children).filter(\n (el): el is HTMLElement => el instanceof HTMLElement && el.matches('[data-dsh-taskboard-entry], [data-dsh-ssh-entry], [data-dsh-novelforge-entry]'),\n )\n const last = family.length > 0 ? family[family.length - 1] : undefined\n const anchor = last !== undefined ? last.nextElementSibling : base.nextElementSibling\n root.insertBefore(entry, anchor)\n }\n return true\n}\n\n/**\n * Mount the sidebar entry, waiting for the shell and self-healing on\n * re-renders.\n */\nexport function mountSidebarEntry(controller: PanelController): () => void {\n const entry = createEntry(controller)\n let root: HTMLElement | undefined\n let placed = false\n\n const tryPlace = (): void => {\n if (root !== undefined && !root.isConnected) {\n rootObserver.disconnect()\n root = undefined\n placed = false\n }\n if (placed) {\n if (document.body.contains(entry)) return\n rootObserver.disconnect()\n root = undefined\n placed = false\n }\n root ??= sidebarRoot()\n if (root === undefined) return\n placed = placeEntry(root, entry)\n if (placed) {\n rootObserver.observe(root, { childList: true, subtree: true })\n }\n }\n\n const waitObserver = new MutationObserver(() => { tryPlace() })\n waitObserver.observe(document.body, { childList: true, subtree: true })\n\n const rootObserver = new MutationObserver(() => {\n if (root === undefined || !root.isConnected) {\n placed = false\n tryPlace()\n return\n }\n if (!root.contains(entry)) {\n placed = placeEntry(root, entry)\n }\n })\n\n const syncActive = () => {\n if (controller.getSnapshot().panelOpen) entry.dataset.active = 'true'\n else delete entry.dataset.active\n }\n const unsubscribe = controller.subscribe(syncActive)\n syncActive()\n\n tryPlace()\n\n return () => {\n waitObserver.disconnect()\n rootObserver.disconnect()\n unsubscribe()\n entry.remove()\n }\n}\n","/**\n * Browser-half entry for the dsh-novel-forge plugin — runs inside the dsh web\n * GUI. Registers the sidebar entry row and the workbench panel. DOM mounting\n * problems are logged, never thrown — the web shell fails the whole boot when\n * a plugin apply throws.\n */\nimport type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport { NovelApi } from './api.ts'\nimport { mountPanel } from './mount.tsx'\nimport { PanelController } from './panel/controller.ts'\nimport { mountSidebarEntry } from './sidebar-entry.ts'\n\n/** Required services (fiber inject waiting). */\nexport const inject = ['slots', 'locale']\n\n/**\n * Mount the novel-forge workbench.\n * @param ctx - client root context.\n */\nexport function apply(ctx: ClientContext): void {\n const controller = new PanelController()\n const api = new NovelApi()\n const disposers: Array<() => void> = []\n try {\n disposers.push(mountSidebarEntry(controller))\n disposers.push(mountPanel(controller, api))\n } catch (error) {\n // DOM failures degrade the panel, never the GUI.\n console.warn('[dsh-novel-forge] mount failed:', error)\n }\n ctx.effect(() => () => {\n for (const dispose of disposers.splice(0)) dispose()\n }, 'dsh-novel-forge: ui mounts')\n}\n"],"x_google_ignoreList":[9],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["zh","zh","css","css","css","statusBadge","css","css","css","css","css","css","css","css"],"sources":["../src/protocol.ts","../src/client/api.ts","../src/client/locales.ts","../src/client/panel/helpers.ts","../src/client/panel/AssistantTab.tsx","../src/client/panel/AssetsTab.tsx","../src/client/panel/ShelfView.tsx","../src/client/panel/ReaderView.tsx","../src/client/panel/RunPanel.tsx","../node_modules/.pnpm/fflate@0.8.3/node_modules/fflate/esm/browser.js","../src/client/docx.ts","../src/client/panel/CreateBookView.tsx","../src/client/panel/WorldTab.tsx","../src/client/panel/views.tsx","../src/client/panel/NovelPanel.tsx","../src/client/mount.tsx","../src/client/panel/controller.ts","../src/client/sidebar-entry.ts","../src/client/index.ts"],"sourcesContent":["/**\n * dsh-novel-forge — shared protocol between the host half (Node) and the\n * browser half (web GUI). Route paths, request/response shapes, the project\n * state file format, and the NDJSON generation stream frames all live here so\n * both halves spell exactly one vocabulary.\n */\n\n/** The /api/dsh-novel-forge route family (same-origin, loopback-fenced). */\nexport const NOVEL_API = {\n status: '/api/dsh-novel-forge/status',\n loadOutline: '/api/dsh-novel-forge/load-outline',\n saveOutline: '/api/dsh-novel-forge/save-outline',\n plan: '/api/dsh-novel-forge/plan',\n volumes: '/api/dsh-novel-forge/volumes',\n bible: '/api/dsh-novel-forge/bible',\n assets: '/api/dsh-novel-forge/assets',\n styleEngine: '/api/dsh-novel-forge/style-engine',\n generate: '/api/dsh-novel-forge/generate',\n review: '/api/dsh-novel-forge/review',\n rewrite: '/api/dsh-novel-forge/rewrite',\n polish: '/api/dsh-novel-forge/polish',\n /** 采纳待确认草稿(润色/重写产物)覆盖正文文件。 */\n draftApply: '/api/dsh-novel-forge/draft/apply',\n /** 放弃待确认草稿,保留原稿。 */\n draftDiscard: '/api/dsh-novel-forge/draft/discard',\n summary: '/api/dsh-novel-forge/summary',\n foreshadow: '/api/dsh-novel-forge/foreshadow',\n exportBook: '/api/dsh-novel-forge/export',\n chapter: '/api/dsh-novel-forge/chapter',\n /** 审查任意正文文本(作者手动编辑后,不落盘)。 */\n chapterCheck: '/api/dsh-novel-forge/chapter/check',\n /** 保存手动编辑的正文(自动备份 .bak)。 */\n chapterSave: '/api/dsh-novel-forge/chapter/save',\n assistant: '/api/dsh-novel-forge/assistant',\n assistantHistory: '/api/dsh-novel-forge/assistant-history',\n /** 清空助手对话记录。 */\n assistantClear: '/api/dsh-novel-forge/assistant/clear',\n bookshelf: '/api/dsh-novel-forge/bookshelf',\n /** 重置项目(可选携带新大纲):清空设定/卷/章节/伏笔/资产/事实库。 */\n reset: '/api/dsh-novel-forge/reset',\n /** 全书一致性质检:LLM 扫描已生成章节,输出矛盾问题清单。 */\n audit: '/api/dsh-novel-forge/audit',\n /** 角色卡刷新:基于事实库与各章摘要聚合角色当前状态。 */\n charactersRefresh: '/api/dsh-novel-forge/characters/refresh',\n /** 事实库回填:对历史已生成章节批量抽取事实(旧章节无事实记录时用)。 */\n factsBackfill: '/api/dsh-novel-forge/facts/backfill',\n /** 设定圣经局部修补(如世界观规则编辑)。 */\n biblePatch: '/api/dsh-novel-forge/bible/patch',\n /** 小说简介:生成(AI)/补全(AI)/保存。 */\n blurb: '/api/dsh-novel-forge/blurb',\n /** 重命名当前书(同步项目与书架条目)。 */\n rename: '/api/dsh-novel-forge/rename',\n /** 大世界:AI 提炼 / 保存结构化数据(境界/区域/势力)。 */\n world: '/api/dsh-novel-forge/world',\n /** 封面:GET 读取(dataUrl)/ POST 上传或移除。 */\n cover: '/api/dsh-novel-forge/blurb/cover',\n /** 剧情线管理:增删改 + 关联章节。 */\n plotlines: '/api/dsh-novel-forge/plotlines',\n /** 角色库:AI 提炼 / 采纳 / 更新 / 删除。 */\n roles: '/api/dsh-novel-forge/roles',\n scenes: '/api/dsh-novel-forge/scenes',\n visualRules: '/api/dsh-novel-forge/visual-rules',\n /** 作者复盘补跑:对已写章节补齐 authorReview(全书流式 / 单章 JSON)。 */\n reviewBackfill: '/api/dsh-novel-forge/review/backfill',\n /** 章节复位:generating 卡死 → pending(可重新生成)。 */\n chapterReset: '/api/dsh-novel-forge/chapter/reset',\n /** 章节直接通过:作者对 rejected/written 章节行使最终决定权。 */\n chapterApprove: '/api/dsh-novel-forge/chapter/approve',\n /** 敏感词检查:全书已写章节或指定文本。 */\n sensitiveCheck: '/api/dsh-novel-forge/sensitive-check',\n /** 开书想法 → AI 补全大纲:输入一句话想法,生成 2-3 个可选大纲方案。 */\n outlineSuggest: '/api/dsh-novel-forge/outline/suggest',\n /** 拆书分析:对已写章节做结构/人物/文风/卖点四维体检(两阶段:源笔记→分节分析)。 */\n breakdown: '/api/dsh-novel-forge/breakdown',\n /** 漫剧分镜生成:章节 → 角色锚点 + 分镜表(可适配豆包/Seedance/SD)。 */\n /** 漫剧分集计划:读一卷 → 按故事弧线分集(高潮拆集/过渡并章)。 */\n /** 漫画脚本:章节 → 分页分格漫画脚本(含角色视觉锚点)。 */\n /** 生产单:启动批量生产(计划补足 + 逐章生成 + 被拒分级处理)。 */\n runStart: '/api/dsh-novel-forge/run/start',\n /** 生产单控制:pause / resume / stop。 */\n runControl: '/api/dsh-novel-forge/run/control',\n /** 生产单状态(含进度统计与日志)。 */\n runStatus: '/api/dsh-novel-forge/run/status',\n config: '/api/dsh-novel-forge/config',\n openFolder: '/api/dsh-novel-forge/open-folder',\n} as const\n\n/** 书架:一本书的条目。 */\nexport interface BookEntry {\n /** 稳定 id。 */\n id: string\n /** 书名。 */\n bookName: string\n /** 该书输出目录(独立项目目录)。 */\n outputDir: string\n /** 创建时间。 */\n createdAt: string\n /** 最后活动时间。 */\n updatedAt: string\n}\n\n/** 书架快照(含每本书的进度摘要)。 */\nexport interface BookshelfSnapshot {\n books: Array<BookEntry & { done: number; total: number; hasProject: boolean; hasCover: boolean; blurb?: string }>\n /** 当前激活的书 id(无则 null)。 */\n activeBookId: string | null\n}\n\n/** POST /bookshelf 请求:创建新书。 */\nexport interface BookCreateRequest {\n bookName: string\n outputDir?: string\n /** 开书向导:创建时直接导入的大纲文本(提供则立即建立项目)。 */\n outline?: string\n}\n\n/** POST /reset 请求:重置项目(可选更新大纲)。 */\nexport interface ResetRequest {\n /** 新大纲文本;提供则替换 outline,否则保留原大纲。 */\n outline?: string\n}\n\n/** POST /bookshelf/activate 请求:切换当前书。 */\nexport interface BookActivateRequest {\n id: string\n}\n\n/** POST /bookshelf/remove 请求:移除书架条目。 */\nexport interface BookRemoveRequest {\n id: string\n}\n\n/** Chapter lifecycle states (the writing pipeline's state machine). */\nexport type ChapterStatus =\n | 'pending' // planned, not started\n | 'generating' // LLM writing right now\n | 'written' // body on disk, awaiting review\n | 'reviewing' // review in progress\n | 'approved' // passed review (or user-approved)\n | 'rejected' // review found problems\n | 'error' // generation failed\n\n/** One chapter in the plan. */\nexport interface ChapterPlan {\n /** 1-based chapter number (stable identity; files are named from it). */\n no: number\n /** Volume this chapter belongs to (1-based; 0 = unassigned). */\n volume: number\n /** Chapter title, decided by the LLM plan step. */\n title: string\n /** Story beats / plot points for this chapter (model-facing guidance). */\n beats: string\n /** Target character count (defaults to the configured chapter size). */\n targetChars: number\n /** Generation/review state. */\n status: ChapterStatus\n /** 进入 generating 的时间(用于超时自动复位;未在生成时无此字段)。 */\n generatingAt?: string\n /** Actual character count once generated. */\n chars?: number\n /** Failure message when status is 'error'. */\n error?: string\n /** Output file name once generated (relative to the output dir). */\n file?: string\n /** LLM summary of the chapter (narrative memory for later chapters). */\n summary?: string\n /** Latest review report (present once reviewed). */\n review?: ReviewReport\n /** 作者复盘:钩子兑现/结尾钩子/剧情线推进/连续性/节奏趋势(生成后自动)。 */\n authorReview?: AuthorReview\n /**\n * 待确认草稿:润色(去AI味)或整章重写的产物正文。生成时先存这里,\n * 用户看过对比后点「采纳」才覆盖正文文件;点「放弃」则丢弃。刷新页面不丢失。\n */\n pendingDraft?: string\n}\n\n/** 作者复盘:叙事结构层面的逐章检查(钩子/推进/连续性/趋势)。 */\nexport interface AuthorReview {\n /** 上一章结尾钩子是否在本章兑现。 */\n hookHonored: boolean\n /** 钩子兑现说明(未兑现时给出建议)。 */\n hookNote: string\n /** 本章结尾钩子强度 0-10。 */\n endingHook: number\n /** 剧情线推进情况(推进了哪条线/或未推进)。 */\n plotlineProgress: string\n /** 结构化:本章推进的剧情线名称列表(与项目剧情线 name 精确匹配,复盘后自动关联章节)。 */\n advancedLines?: string[]\n /** 连续性检查(人物位置/时间/伤势/资源是否与上章衔接)。 */\n continuity: string\n /** 近期节奏趋势提示(拖沓/爽点密度等)。 */\n trend: string\n /** 复盘时间。 */\n reviewedAt: string\n}\n\n/** One review finding. */\nexport interface ReviewIssue {\n /** Severity: high = must fix, medium = should fix, low = suggestion. */\n severity: 'high' | 'medium' | 'low'\n /** What the problem is. */\n item: string\n /** Concrete suggestion for fixing it. */\n suggestion: string\n}\n\n/** AI review report for one chapter. */\nexport interface ReviewReport {\n /** Overall score 0-100. */\n score: number\n /** Pass threshold (config; 70 default). */\n passed: boolean\n /** One-line verdict. */\n verdict: string\n /** Individual findings. */\n issues: ReviewIssue[]\n /** When the review ran. */\n reviewedAt: string\n}\n\n/** A volume of the book. */\nexport interface Volume {\n /** 1-based volume number. */\n no: number\n /** Volume title. */\n title: string\n /** Volume positioning / summary. */\n summary: string\n /** First chapter number of this volume. */\n chapterStart: number\n /** Last chapter number (inclusive). */\n chapterEnd: number\n}\n\n/** A character card from the story bible. */\nexport interface CharacterCard {\n name: string\n role: 'protagonist' | 'supporting' | 'antagonist' | 'other'\n /** Personality / traits (short lines). */\n traits: string[]\n /** Goals and motivations. */\n goals: string\n /** Key relations to other characters. */\n relations: string\n /** 知情度:该角色已经知道的事实/秘密(未列出的信息该角色不知道)。 */\n knowledge?: string[]\n}\n\n/** The structured story bible (worldbuilding extracted from the outline). */\nexport interface StoryBible {\n /** Genre + tone tags. */\n genre: string\n /** Worldbuilding rules (power system, geography, factions...). */\n worldRules: string[]\n /** Character cards. */\n characters: CharacterCard[]\n /** Writing red lines (forbidden content / must-avoid tropes). */\n redLines: string[]\n /** Style guidance (pacing, pov, tone). */\n style: string[]\n /** When the bible was generated. */\n generatedAt?: string\n}\n\n/** A planted/active/resolved foreshadowing thread. */\nexport interface Foreshadow {\n /** Stable id. */\n id: string\n /** What the foreshadow is. */\n description: string\n /** Chapter where it was planted (undefined = planned). */\n plantedChapter?: number\n /** Chapter where it should be paid off. */\n targetChapter?: number\n /** Lifecycle state. */\n status: 'planned' | 'planted' | 'progressing' | 'resolved' | 'abandoned'\n /** Resolution note when resolved. */\n resolvedNote?: string\n}\n\n/** 一条已确立的叙事事实(事实库/时间线,注入后续章节生成)。 */\nexport interface ChapterFact {\n /** 来源章节号。 */\n chapterNo: number\n /** 事实文本(人物状态/境界资源/关系变化/伏笔落地等)。 */\n text: string\n}\n\n/** 一条全书质检发现的问题(一致性矛盾,定位到章)。 */\nexport interface AuditIssue {\n /** 问题所在章节号(无法定位时 0)。 */\n chapterNo: number\n severity: 'high' | 'medium' | 'low'\n /** 矛盾描述。 */\n item: string\n /** 修改建议。 */\n suggestion: string\n}\n\n/** POST /audit 响应。 */\nexport interface AuditResponse {\n issues: AuditIssue[]\n /** 参与质检的章节数。 */\n auditedChapters: number\n /** 质检时间。 */\n auditedAt: string\n}\n\n/** 全书质检的实时状态(通过 /status 暴露给面板/外部读取)。 */\nexport interface AuditStatus {\n status: 'idle' | 'running' | 'done' | 'error'\n /** 开始时间(ISO)。 */\n startedAt?: string\n /** 结束时间(ISO)。 */\n finishedAt?: string\n /** 总批次数(0 = 尚未开始/无章节)。 */\n totalBatches: number\n /** 已完成批次数。 */\n completedBatches: number\n /** 参与质检的章节数。 */\n auditedChapters?: number\n /** 发现的问题数(done 后有效)。 */\n issuesCount?: number\n /** 最近一次质检的问题清单(done 后有效;error 时为空)。 */\n issues?: AuditIssue[]\n /** 失败信息(error 时有效)。 */\n error?: string\n}\n\n/** 一条剧情线(主线/支线/人物线/悬念线)。 */\nexport interface Plotline {\n /** 稳定 id。 */\n id: string\n /** 线名。 */\n name: string\n /** 类型:主线 / 支线 / 人物线 / 悬念线。 */\n kind: 'main' | 'branch' | 'character' | 'mystery'\n /** 目标/终点(这条线最终要完成什么)。 */\n goal: string\n /** 当前进度说明(最近推进到哪)。 */\n progress: string\n /** 生命周期状态。 */\n status: 'active' | 'paused' | 'resolved' | 'abandoned'\n /** 关联章节号(推进/落地的章节)。 */\n chapters: number[]\n /** 创建时间。 */\n createdAt: string\n}\n\n/** POST /plotlines 请求:剧情线增删改 + 关联章节 + AI 辅助。 */\nexport interface PlotlinesRequest {\n op: 'add' | 'update' | 'remove' | 'link' | 'suggest' | 'refresh' | 'health' | 'plan'\n /** add / update 时传入的完整剧情线。 */\n line?: Plotline\n /** remove / link / refresh 时的目标线 id。 */\n id?: string\n /** link 时关联的章节号。 */\n chapterNo?: number\n}\n\n/** 剧情线健康检查报告。 */\nexport interface PlotlineHealthReport {\n /** 是否需要新线(需要 / 暂不需要 / 再写 X 章后需要)。 */\n verdict: string\n /** 建议添加新线的时机说明。 */\n timing: string\n /** 依据(基于数据的理由,每条一句)。 */\n reasons: string[]\n /** 各线健康度。 */\n lines: Array<{\n name: string\n /** ok=健康 / warning=预警 / stale=搁置过久。 */\n health: 'ok' | 'warning' | 'stale'\n note: string\n }>\n}\n\n/** AI 剧情方案:下一阶段目标 + 建议新线。 */\nexport interface PlotlinePlan {\n /** 下一阶段(未来 5-10 章)剧情方向。 */\n direction: string\n /** 建议的新线(可逐条采纳)。 */\n suggestions: Plotline[]\n}\n\n/** POST /plotlines 响应。 */\nexport interface PlotlinesResponse {\n plotlines: Plotline[]\n /** op=suggest 时的 AI 建议候选线。 */\n suggestions?: Plotline[]\n /** op=health 时的健康检查报告。 */\n health?: PlotlineHealthReport\n /** op=plan 时的剧情方案。 */\n plan?: PlotlinePlan\n}\n\n/** 一条敏感词命中。 */\nexport interface SensitiveHit {\n /** 命中章节号(文本检测时为 0)。 */\n chapterNo: number\n /** 命中的违禁词。 */\n word: string\n /** 类别:政治 / 擦边 / 暴力 / 辱骂 / 广告 / 其他。 */\n category: string\n /** 出现次数。 */\n count: number\n}\n\n/** POST /sensitive-check 请求:检测指定章节/任意文本/全书。 */\nexport interface SensitiveCheckRequest {\n /** 检测该章正文。 */\n chapterNo?: number\n /** 检测任意文本(优先于 chapterNo)。 */\n text?: string\n /** 扫描全部已写章节。 */\n all?: boolean\n}\n\n/** POST /sensitive-check 响应。 */\nexport interface SensitiveCheckResponse {\n hits: SensitiveHit[]\n /** 参与扫描的章节数。 */\n scannedChapters: number\n}\n\n/** 开书想法 → AI 大纲方案(一个候选)。 */\nexport interface OutlineCandidate {\n /** 唯一 id(前端暂留/换批用)。 */\n id: string\n /** 推荐书名。 */\n bookName: string\n /** 题材(如 仙侠修真 / 都市)。 */\n genre: string\n /** 核心卖点一句话。 */\n sellingPoint: string\n /** 完整大纲文本(可直接用作项目大纲,≥800 字)。 */\n outline: string\n}\n\n/** POST /outline/suggest 请求:想法 → 2-3 个可选大纲。 */\nexport interface OutlineSuggestRequest {\n /** 作者想法(一两句话,≥50 字)。 */\n idea: string\n /** 本次要生成的候选数(默认 3,最多 3)。 */\n count?: number\n /** 已暂留方案的剧情方向摘要(换批时让 LLM 避开,防止与已留方案重复)。 */\n exclude?: string[]\n}\n\n/** POST /outline/suggest 响应。 */\nexport interface OutlineSuggestResponse {\n candidates: OutlineCandidate[]\n}\n\n/** 拆书分析:一个分析小节。 */\nexport interface BreakdownSection {\n /** 小节键:overview / plot / character / style / market。 */\n key: string\n /** 小节标题(如「拆书总览」)。 */\n title: string\n /** 可读分析稿(markdown)。 */\n markdown: string\n /** 结构化数据(程序可消费)。 */\n structured: Record<string, unknown>\n}\n\n/** 拆书分析:一条证据(结论→原文回溯)。 */\nexport interface BreakdownEvidence {\n label: string\n excerpt: string\n /** 来源章节号(0 = 未定位)。 */\n chapterNo: number\n /** 指向的结构化字段。 */\n fieldKey?: string\n}\n\n/** POST /breakdown 请求:对已写章节做拆书分析。 */\nexport interface BreakdownRequest {\n /** 分析范围:'recent'=最近 20 章 / 'volume:N'=第 N 卷 / 'all'=全书(默认 recent)。 */\n scope?: string\n /** 分析档位:'quick'=4 维(总览/剧情/人物/文风)/ 'standard'=5 维(+卖点)。 */\n preset?: 'quick' | 'standard'\n /** token 预算上限(默认 50000)。 */\n budgetTokens?: number\n}\n\n/** POST /breakdown 响应。 */\nexport interface BreakdownResponse {\n sections: BreakdownSection[]\n evidence: BreakdownEvidence[]\n /** 参与分析的章节数。 */\n chaptersScanned: number\n /** 估算消耗 token。 */\n usedTokens: number\n}\n\n/** 角色卡:角色当前状态(从事实库聚合)。 */\nexport interface RoleStatusCard {\n name: string\n /** protagonist / supporting / antagonist / other。 */\n role: string\n /** 当前状态一句话(境界/资源/伤势/心境)。 */\n status: string\n /** 最近出场章节。 */\n lastChapter: number\n /** 出场次数。 */\n appearances: number\n}\n\n/** 角色库条目(主表:作者维护 + AI 提炼 + 编年录自动聚合)。 */\nexport interface RoleRecord {\n /** 角色名(唯一键)。 */\n name: string\n /** 定位:主角 / 女主 / 女配 / 配角 / 反派 / 路人。 */\n roleLabel: 'protagonist' | 'female_lead' | 'female_support' | 'support' | 'antagonist' | 'extra'\n /** 身份一句话(如:祭族后裔、青云宗杂役)。 */\n identity: string\n /** 性格标签。 */\n traits: string[]\n /** 目标与动机。 */\n goals: string\n /** 关系网:[角色名](关系)。 */\n relations: string[]\n /** 成长线:阶段 → 说明(可含章节)。 */\n arc: string[]\n /** 知情度:该角色已经知道的信息。 */\n knowledge: string[]\n /** 首次出场章节(编年录聚合,可手动修正)。 */\n firstChapter?: number\n /** 动漫形象描述词(AI 绘图用:中文描述 + 英文标签 + 关键外貌标签)。 */\n imagePrompt?: {\n /** 中文外貌描述:连贯一段(发色/瞳色/服装/气质/标志物)。 */\n zh: string\n /** 英文绘图标签:booru 风格逗号分隔。 */\n en: string\n /** 中文关键标签(发色/瞳色/服装/气质/标志物)。 */\n tags: string[]\n /** 依据来源说明(哪几章哪些描写)。 */\n source?: string\n }\n /** 角色参考图(dataURL 或 URL)。用于漫画/漫剧出图时锁定角色一致性。 */\n imageUrl?: string\n /** 角色图集(图像锚点):立绘/四视图/表情/场景/细节等,label 标注用途。 */\n gallery?: RoleImage[]\n /** 该角色所需的情绪表情清单(提炼时 LLM 补全 6-12 个,如\"疲惫/麻木/压抑悲伤\")。 */\n expressions?: string[]\n /** LLM 精修的四类生图提示词包(前端拼装版之外的高质量版,promptKit 接口生成)。 */\n promptKit?: {\n /** 立绘:全身/半身正视图。 */\n portrait: { zh: string; en: string }\n /** 四视图:正面/侧面/背面设定表。 */\n sheet: { zh: string; en: string }\n /** 表情:同一脸部锚换情绪,每表情一段。 */\n expressions: { name: string; zh: string; en: string }[]\n /** 细节:标志物局部特写。 */\n details: { zh: string; en: string }\n }\n /** 漫画/漫剧重要性:main=必须建卡保证一致;support=有锚点即可;extra=路人随机生成不约束。 */\n importance?: 'main' | 'support' | 'extra'\n}\n\n/** 角色图集条目:一张已定型的角色图(图像锚点)。 */\nexport interface RoleImage {\n /** 用途标签:立绘 / 四视图 / 表情-疲惫 / 场景 / 细节 等。 */\n label: string\n /** dataURL 或 URL。 */\n dataUrl: string\n}\n\n/** 场景库条目:从正文提炼的「镜头场景」视觉锚点(漫剧分镜/生图用)。 */\nexport interface SceneCard {\n /** 场景名(唯一键),如「旧茶渡·地下石殿」。 */\n name: string\n /** 一句话定位:空间/氛围/功能。 */\n summary: string\n /** 幕归属:第一幕·后场 / 第二幕·卖场 / …(便于按剧情段落组织)。 */\n act?: string\n /** 时间光态:夜间闭店后 / 雨夜 / 凌晨 / 频闪灯… */\n moment?: string\n /** 关键情节镜头 1-3 条:该场景拍什么(人物动作+情绪+镜头推进)。 */\n beats?: string[]\n /** 人物在场状态:主角/关键角色在该场景的状态一句话。 */\n characterState?: string\n /** 环境构成:空间结构/陈设/标志物。 */\n elements: string[]\n /** 色调与光影(含 HEX 色板,可空)。 */\n palette: string[]\n /** 氛围关键词:压抑/神秘/空旷… */\n moods: string[]\n /** 中文生图提示词(连贯一段,写实电影感)。 */\n zh: string\n /** 英文生图提示词(逗号分隔标签)。 */\n en: string\n /** 关键标签。 */\n tags: string[]\n /** 依据来源(哪几章哪些描写)。 */\n source?: string\n /** 场景图集(图像锚点):全景/局部/氛围 等。 */\n gallery?: RoleImage[]\n}\n\n/** POST /scenes 请求:场景库提炼 / 采纳 / 更新 / 删除 / 图集。 */\nexport interface ScenesRequest {\n op: 'extract' | 'adopt' | 'update' | 'remove' | 'image' | 'removeImage'\n /** adopt / update 时传入的场景卡(adopt 可修改后采纳)。 */\n scene?: SceneCard\n /** remove / image 时的场景名。 */\n name?: string\n /** op='image' 时的图片 dataURL 与用途标签(全景/局部/氛围)。 */\n dataUrl?: string\n label?: string\n}\n\n/** POST /visual-rules 请求:视觉世界观规则提炼 / 保存。 */\nexport interface VisualRulesRequest {\n op: 'extract' | 'save'\n /** op=save 时的规则数组。 */\n rules?: string[]\n}\n\n/** POST /visual-rules 响应。 */\nexport interface VisualRulesResponse {\n rules: string[]\n}\n\n/** POST /scenes 响应。 */\nexport interface ScenesResponse {\n scenes: SceneCard[]\n /** op=extract 时的 AI 候选场景。 */\n candidates?: SceneCard[]\n}\n\n/** POST /roles 请求:角色库增删改 + AI 提炼 + 参考图上传。 */\nexport interface RolesRequest {\n op: 'extract' | 'adopt' | 'update' | 'remove' | 'visual' | 'image' | 'removeImage' | 'imageGenerate' | 'promptKit'\n /** adopt / update 时传入的角色(adopt 可修改后采纳)。 */\n role?: RoleRecord\n /** remove 时的角色名。 */\n name?: string\n /** op='image' 时的参考图 dataURL。 */\n dataUrl?: string\n /** op='image' 时的图集用途标签(立绘/四视图/表情-x/场景/细节);缺省视为角色参考图(imageUrl)。 */\n label?: string\n /** op='imageGenerate' 时的漫画风格预设 id(用于统一角色图与漫画页风格)。 */\n style?: string\n}\n\n/** POST /roles 响应。 */\nexport interface RolesResponse {\n roles: RoleRecord[]\n /** op=extract 时的 AI 候选角色。 */\n candidates?: RoleRecord[]\n /** op=visual 时的动漫形象描述词(已写入角色卡)。 */\n visual?: RoleRecord['imagePrompt']\n /** op=promptKit 时的四类提示词精修包(已写入角色卡)。 */\n promptKit?: RoleRecord['promptKit']\n /** op=image 时的角色参考图 dataURL。 */\n imageUrl?: string\n}\n\n/** POST /bible/patch 请求:局部修补设定圣经。 */\nexport interface BiblePatchRequest {\n worldRules?: string[]\n redLines?: string[]\n style?: string[]\n /** 角色卡整体替换(人物志编辑知情度等)。 */\n characters?: CharacterCard[]\n}\n\n/** POST /blurb 请求:AI 生成/补全或手动保存小说简介。 */\nexport interface BlurbRequest {\n action: 'generate' | 'save'\n /** 已写好的开头(AI 补全时使用;留空 = 全量生成)。 */\n partial?: string\n /** 手动保存的完整简介(action=save 时)。 */\n text?: string\n}\n\n/** POST /chapter/check|save 请求:审查/保存手动编辑的正文。 */\nexport interface ChapterTextRequest {\n chapterNo: number\n /** 当前编辑中的正文全文。 */\n text: string\n /** 保存时携带:已在工作区审查过的报告(沿用落盘,不重复审);缺省则保存后自动正式审稿一次。 */\n report?: ReviewReport\n /** 审查/验证时携带:上一轮审稿报告。传入后进入「验证模式」——逐条核对原意见是否解决、\n * 只挑新增 high,不再全新找茬(防止\"越修 high 越多\")。 */\n previousReport?: ReviewReport\n}\n\n/** POST /chapter/save 响应。 */\nexport interface ChapterSaveResponse {\n ok: boolean\n chars: number\n file: string\n /** 落盘的审稿报告(沿用工作区报告或保存后自动审稿)。 */\n report?: ReviewReport\n}\n\n/** POST /cover 请求:上传或移除封面。 */\nexport interface CoverRequest {\n action: 'upload' | 'remove'\n /** 上传时:data:image/...;base64,... 格式的图片数据。 */\n dataUrl?: string\n}\n\n/** POST /rename 请求:重命名当前书。 */\nexport interface RenameRequest {\n bookName: string\n}\n\n/** 大世界:一个境界等级。 */\nexport interface WorldRealm {\n /** 境界名(练气/筑基/金丹…)。 */\n name: string\n /** 描述:突破条件/寿命/标志等。 */\n description: string\n}\n\n/** 大世界:一个地理区域。 */\nexport interface WorldRegion {\n name: string\n description: string\n /** 关联势力名(可空)。 */\n faction?: string\n}\n\n/** 大世界:一方势力。 */\nexport interface WorldFaction {\n name: string\n /** 类型:宗门/家族/王朝/组织… */\n kind: string\n description: string\n /** 驻地区域(可空)。 */\n region?: string\n}\n\n/** 大世界结构化数据。 */\nexport interface WorldState {\n realms: WorldRealm[]\n regions: WorldRegion[]\n factions: WorldFaction[]\n}\n\n/** POST /world 请求:AI 提炼或手动保存。 */\nexport interface WorldRequest {\n action: 'generate' | 'save'\n /** action=save 时的完整世界数据。 */\n world?: WorldState\n}\n\n/** GET /cover 响应:封面的 dataUrl(无封面为 null)。 */\nexport interface CoverResponse {\n dataUrl: string | null\n}\n\n/** The persisted project: outline + bible + plan + progress. */\nexport interface ProjectState {\n /** Book title (first non-empty line of the outline, usually). */\n bookName: string\n /** Full outline text (docx-extracted or pasted). */\n outline: string\n /** Source outline path when loaded from a docx. */\n outlinePath?: string\n /** Structured story bible (worldbuilding), if generated. */\n bible?: StoryBible\n /** Volumes, if planned. */\n volumes?: Volume[]\n /** Chapter plan. */\n chapters: ChapterPlan[]\n /** Foreshadowing threads. */\n foreshadows: Foreshadow[]\n /** 写作资产(题材基底/推进模式/反AI规则/写法资产)。 */\n assets?: ProjectAssets\n /** 事实库/时间线:每章生成后抽取,注入后续章节保持一致性。 */\n facts?: ChapterFact[]\n /** 小说简介(面向读者的作品门面,AI 生成或手动保存)。 */\n blurb?: string\n /** 封面文件名(相对输出目录,如 cover.png)。 */\n coverPath?: string\n /** 大世界结构化数据(境界体系/区域/势力)。 */\n world?: WorldState\n /** 剧情线(主线/支线/人物线/悬念线)。 */\n plotlines?: Plotline[]\n /** 角色库(作者维护 + AI 提炼的主表)。 */\n roles?: RoleRecord[]\n /** 场景库(作者维护 + AI 提炼的主表)。 */\n scenes?: SceneCard[]\n /** 视觉世界观规则(生图/生视频必须遵守,从道藏提炼,注入所有提示词)。 */\n visualRules?: string[]\n /** 人物志:角色当前状态聚合结果(从编年录刷新后存档,打开页面直接显示)。 */\n roleStatus?: RoleStatusCard[]\n /** 漫剧分镜结果缓存:章号 → 分镜(持久化,刷新不丢)。 */\n /** 漫剧分集计划缓存:卷号/0=全书 → 分集计划(持久化,刷新不丢)。 */\n /** 漫画脚本缓存:章号 → 漫画脚本(持久化,刷新不丢)。 */\n /** ISO timestamps. */\n createdAt: string\n updatedAt: string\n}\n\n/** Runtime config surface exposed to the panel (subset of plugin Config). */\nexport interface NovelConfig {\n /** Absolute path of the default docx outline to load. */\n outlinePath: string\n /** Absolute output directory for chapters + project state. */\n outputDir: string\n /** LLM provider route (e.g. deepseek-official). */\n provider: string\n /** LLM model id (e.g. deepseek-v4-flash). */\n model: string\n /** LLM reasoning effort: off = no thinking; low/high/max = thinking intensity. */\n reasoningEffort: 'off' | 'low' | 'high' | 'max'\n /** Target characters per chapter. */\n chapterChars: number\n /** Max output tokens per chapter call. */\n maxTokens: number\n /** Review pass threshold (0-100). */\n reviewPassScore: number\n /** Whether generation auto-runs review after writing. */\n autoReview: boolean\n /** Whether generation auto-runs the author review (hook/continuity/trend) after writing. */\n autoAuthorReview: boolean\n /** 修订/润色产出草稿后是否自动附带一次 AI 审查(工作区显示新稿评分与剩余问题)。 */\n autoReviewAfterRevise: boolean\n /** 豆包/Seedream 生图 API Key(保存在服务端配置,不暴露给前端明文回显)。 */\n imageApiKey?: string\n /** 豆包/Seedream 生图模型 ID(如 doubao-seedream-5-0-pro-260628)。 */\n imageApiModel?: string\n /** 是否启用豆包生图(默认关,避免误调用付费 API)。 */\n imageApiEnabled?: boolean\n}\n\n/** GET /status response. */\nexport interface StatusResponse {\n config: NovelConfig\n /** The persisted project, when one exists in the output dir. */\n project?: ProjectState\n /** Chapter files already on disk (basenames, sorted). */\n generatedFiles: string[]\n /** 全书质检实时状态(用于面板/外部读取进度)。 */\n audit?: AuditStatus\n}\n\n/** 生产单状态(生产单 = 区间批量生产执行器:计划补足 + 逐章生成 + 被拒分级处理)。 */\nexport interface RunState {\n runId: string\n /** 区间起点(含)。 */\n startNo: number\n /** 区间终点(含)。 */\n endNo: number\n status: 'running' | 'paused' | 'done' | 'stopped' | 'error'\n /** 当前处理到的章号(已 approved 的章会快进)。 */\n currentNo: number\n stats: {\n /** 新生成(含审稿)的章数。 */\n generated: number\n /** 被拒后按意见修订并通过的章数。 */\n revised: number\n /** 被拒后豁免通过(无 high)的章数。 */\n exempted: number\n /** error 后重新生成的章数。 */\n regenerated: number\n /** 生成失败的章数。 */\n error: number\n }\n /** 两轮修订仍不过、保留草稿待人工的章号。 */\n pendingManual: number[]\n /** 运行日志(保留最近 300 条)。 */\n log: Array<{ at: string; text: string }>\n startedAt: string\n updatedAt: string\n error?: string\n}\n\n/** POST /run/start request. */\nexport interface RunStartRequest {\n /** 起始章号(默认 1)。 */\n startNo?: number\n /** 结束章号(含;超出计划时自动补计划)。 */\n endNo?: number\n /** 或指定新增章数(从当前最后一章 +1 起)。 */\n count?: number\n}\n\n/** POST /run/control request. */\nexport interface RunControlRequest {\n action: 'pause' | 'resume' | 'stop'\n}\n\n/** POST /load-outline request: either a docx path or raw text. */\nexport interface LoadOutlineRequest {\n /** Absolute docx path; defaults to the configured outline path. */\n path?: string\n /** Raw outline text (takes precedence over path when present). */\n text?: string\n}\n\n/** POST /load-outline response. */\nexport interface LoadOutlineResponse {\n outline: string\n bookName: string\n chars: number\n path?: string\n}\n\n/** POST /plan request. */\nexport interface PlanRequest {\n /** Outline to plan from; defaults to the persisted project's outline. */\n outline?: string\n /** Number of chapters to plan (default: 30). */\n chapterCount?: number\n /** Volume to plan (1-based); when given, plans only that volume's chapters. */\n volume?: number\n}\n\n/** POST /plan response. */\nexport interface PlanResponse {\n chapters: ChapterPlan[]\n volumes?: Volume[]\n}\n\n/** POST /volumes request/response. */\nexport interface VolumesRequest {\n /** Outline to split into volumes; defaults to the project outline. */\n outline?: string\n}\nexport interface VolumesResponse {\n volumes: Volume[]\n}\n\n/** POST /bible request/response. */\nexport interface BibleRequest {\n /** Outline to extract from; defaults to the project outline. */\n outline?: string\n}\nexport interface BibleResponse {\n bible: StoryBible\n}\n\n/** POST /generate request: one chapter of the current project. */\nexport interface GenerateRequest {\n chapterNo: number\n /** When true, skips the auto-review step. */\n skipReview?: boolean\n}\n\n/** One NDJSON frame of a generation/review/rewrite stream. */\nexport type JobFrame =\n | { type: 'start'; no: number; title: string }\n | { type: 'delta'; text: string }\n | { type: 'progress'; chars: number }\n | { type: 'done'; no: number; file: string; chars: number; title: string }\n | { type: 'review'; no: number; report: ReviewReport }\n | { type: 'author-review'; no: number; review: AuthorReview }\n | { type: 'author-backfill-done'; count: number }\n | { type: 'rewritten'; no: number; file: string; chars: number }\n /** 润色/重写完成,产物作为待确认草稿(尚未覆盖正文)。 */\n | { type: 'drafted'; no: number; chars: number; draft: string }\n | { type: 'error'; no: number; message: string }\n\n/** POST /review request: review one written chapter. */\nexport interface ReviewRequest {\n chapterNo: number\n}\n\n/** POST /rewrite request: rewrite one chapter (optionally per review issues). */\nexport interface RewriteRequest {\n chapterNo: number\n /** Free-form instructions; defaults to fixing the review's high issues. */\n instructions?: string\n /**\n * 局部修订:正文中的一段原文(无需完全精确,取一个自然段内的片段即可)。\n * 提供时只重写该段,其余正文保持不变;不提供时整章重写。\n */\n target?: string\n}\n\n/** POST /polish request: de-AI-ify one chapter. */\nexport interface PolishRequest {\n chapterNo: number\n}\n\n/** POST /draft/apply | /draft/discard request: 采纳或放弃待确认草稿。 */\nexport interface DraftDecisionRequest {\n chapterNo: number\n /** apply 时可携带审查报告(沿用结论定状态;不携带则置 written)。 */\n report?: ReviewReport\n}\n\n/** POST /summary request: (re)generate a chapter summary. */\nexport interface SummaryRequest {\n chapterNo: number\n}\n\n/** POST /foreshadow request: create, update, or AI-suggest foreshadows. */\nexport interface ForeshadowRequest {\n /** When true, runs the LLM suggestion pass (ignores other fields). */\n suggest?: boolean\n /** When given, updates that foreshadow instead of creating one. */\n id?: string\n description?: string\n plantedChapter?: number\n targetChapter?: number\n status?: Foreshadow['status']\n resolvedNote?: string\n}\nexport interface ForeshadowResponse {\n foreshadows: Foreshadow[]\n}\n\n/** GET /chapter response. */\nexport interface ChapterResponse {\n no: number\n title: string\n markdown: string\n}\n\n/** POST /export request/response. */\nexport interface ExportRequest {\n format: 'txt' | 'md'\n}\nexport interface ExportResponse {\n file: string\n chars: number\n chapters: number\n}\n\n/** POST /config request: patch any subset of the runtime config. */\nexport interface ConfigPatch {\n outlinePath?: string\n outputDir?: string\n provider?: string\n model?: string\n reasoningEffort?: 'off' | 'low' | 'high' | 'max'\n chapterChars?: number\n maxTokens?: number\n reviewPassScore?: number\n autoReview?: boolean\n autoAuthorReview?: boolean\n autoReviewAfterRevise?: boolean\n imageApiKey?: string\n imageApiModel?: string\n imageApiEnabled?: boolean\n}\n\n// ------------------------------------------------------------ assistant\n\n/** One assistant conversation message (persisted per project). */\nexport interface AssistantMessage {\n role: 'user' | 'assistant' | 'tool'\n /** Message text (tool messages carry the tool result). */\n content: string\n /** ISO timestamp. */\n ts: string\n /** For tool messages: which tool ran. */\n tool?: string\n}\n\n/** POST /assistant request: one user turn. */\nexport interface AssistantRequest {\n message: string\n}\n\n/** One NDJSON frame of the assistant stream. */\nexport type AssistantFrame =\n | { type: 'delta'; text: string }\n | { type: 'tool'; name: string; status: 'start' | 'done' | 'error'; detail?: string }\n /** Live output while a tool runs (e.g. chapter text being generated). */\n | { type: 'toolDelta'; name: string; text: string }\n | { type: 'done' }\n | { type: 'error'; message: string }\n\n/** GET /assistant-history response. */\nexport interface AssistantHistoryResponse {\n messages: AssistantMessage[]\n}\n\n// ---------------------------------------------------------- writing assets\n\n/** 题材基底库:一本书属于哪个阅读市场。树形(题材→子题材→下级)。 */\nexport interface GenreNode {\n /** 题材名称(标签,如「仙侠修真」「都市异能」)。 */\n name: string\n /** 题材特征、常见爽点、叙事重心或读者期待。 */\n description: string\n /** 子题材。 */\n children: GenreNode[]\n}\n\n/** 推进模式库:读者为什么继续看下一章。 */\nexport interface ProgressionMode {\n /** 模式名称(如「升级变强」「经营扩张」「解谜揭露」)。 */\n name: string\n /** 核心驱动力:靠什么制造追读动力。 */\n driver: string\n /** 读者期待:每隔几章获得什么变化或回报。 */\n readerExpectation: string\n /** 常见兑现方式(爽点如何落地)。 */\n payoffs: string[]\n /** 节奏风险:最怕什么(重复升级、冲突变弱、谜题拖太久…)。 */\n risks: string[]\n /** 主模式或辅助模式。 */\n primary: boolean\n}\n\n/** 反 AI 规则:一条「要避免的问题 + 修正方向」。 */\nexport interface AntiAiRule {\n /** 规则名(如「禁止解释型心理描写」「AI 高频套话」)。 */\n name: string\n /** 要避免的表达问题,具体可检查。 */\n avoid: string\n /** 推荐修正方向。 */\n fix: string\n /** 命中即告警的具体表达模式(用于审稿逐条核对与去 AI 味检测)。 */\n detectPatterns?: string[]\n /** 是否内置全局规则(内置规则随插件发布,项目规则为用户自定义)。 */\n builtin?: boolean\n}\n\n/** 预置写法模板(来自 AI-Novel-Writing-Assistant 内置数据,一键绑定无需样本文本)。 */\nexport interface StyleTemplate {\n /** 模板 key(如 power-up-escalation)。 */\n key: string\n /** 模板名(如「爽文递进推进流」)。 */\n name: string\n /** 模板说明。 */\n description: string\n /** 分类(如「爽文流」「悬疑流」)。 */\n category: string\n /** 适用题材。 */\n applicableGenres: string[]\n /** 叙述规则。 */\n proseRules: string[]\n /** 角色/台词规则。 */\n dialogueRules: string[]\n /** 语言规则。 */\n languageRules: string[]\n /** 节奏规则。 */\n rhythmRules: string[]\n /** 该模板默认绑定的反 AI 规则 key(内置规则名)。 */\n defaultAntiAiRuleKeys: string[]\n}\n\n/** 写法引擎:从样本文本提取的叙事风格资产。 */\nexport interface StyleAsset {\n /** 资产名(如「林越式痞坏」「冷峻猎手风」)。 */\n name: string\n /** 叙述视角与句式节奏。 */\n proseRules: string[]\n /** 角色台词风格。 */\n dialogueRules: string[]\n /** 描写密度与情绪表达。 */\n descriptionRules: string[]\n /** 表达边界(不要做什么)。 */\n boundaries: string[]\n /** 来源样本文本(可空)。 */\n sourceText?: string\n /** 创建时间。 */\n createdAt: string\n}\n\n/** 项目写作资产(题材基底 + 推进模式 + 反 AI 规则 + 写法资产)。 */\nexport interface ProjectAssets {\n /** 本书选用的题材(可以是题材基底库中某节点名)。 */\n genre?: GenreNode\n /** 主推进模式。 */\n primaryProgression?: ProgressionMode\n /** 辅助推进模式。 */\n auxiliaryProgressions: ProgressionMode[]\n /** 生效的反 AI 规则(内置 + 自定义)。 */\n antiAiRules: AntiAiRule[]\n /** 绑定的写法资产。 */\n styleAssets: StyleAsset[]\n /** 资产更新时间。 */\n updatedAt?: string\n}\n\n/** GET /assets response(含全局题材库与反 AI 规则库)。 */\nexport interface AssetsResponse {\n projectAssets: ProjectAssets\n /** 全局题材基底库(可复用资产,跨书)。 */\n genreLibrary: GenreNode[]\n /** 全局反 AI 规则库(内置默认规则)。 */\n antiAiLibrary: AntiAiRule[]\n /** 预置写法模板(一键绑定,无需样本文本)。 */\n styleTemplates: StyleTemplate[]\n /** 内置推进模式候选。 */\n progressionLibrary: ProgressionMode[]\n}\n\n/** POST /assets request:更新项目写作资产(部分字段可选)。 */\nexport interface AssetsPatch {\n genre?: GenreNode\n primaryProgression?: ProgressionMode\n auxiliaryProgressions?: ProgressionMode[]\n antiAiRules?: AntiAiRule[]\n styleAssets?: StyleAsset[]\n}\n\n/** POST /style-engine request:从样本文本提取写法资产。 */\nexport interface StyleEngineRequest {\n /** 样本文本(风格来源)。 */\n sampleText: string\n /** 资产名(可选,默认「风格资产 N」)。 */\n name?: string\n}\n","/**\n * Browser-side API client for the /api/dsh-novel-forge route family. Plain\n * fetch, same origin; generation/rewrite/polish ride NDJSON streams read\n * incrementally.\n */\n\nimport {\n NOVEL_API,\n type AssetsPatch,\n type AssetsResponse,\n type BibleResponse,\n type ChapterResponse,\n type ConfigPatch,\n type ExportResponse,\n type ForeshadowRequest,\n type ForeshadowResponse,\n type JobFrame,\n type LoadOutlineResponse,\n type NovelConfig,\n type PlanResponse,\n type ReviewReport,\n type StatusResponse,\n type StyleEngineRequest,\n type StyleAsset,\n type VolumesResponse,\n} from '../protocol.ts'\n\n/** Error carrying the route's JSON error message. */\nexport class NovelApiError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'NovelApiError'\n }\n}\n\n/** Parse a JSON response or throw a NovelApiError. */\nasync function readJson<T>(response: Response): Promise<T> {\n let body: unknown\n try {\n body = await response.json()\n } catch {\n throw new NovelApiError(`HTTP ${response.status}: invalid JSON response`)\n }\n if (!response.ok) {\n const message = typeof body === 'object' && body !== null && typeof (body as { error?: unknown }).error === 'string'\n ? (body as { error: string }).error\n : `HTTP ${response.status}`\n throw new NovelApiError(message)\n }\n return body as T\n}\n\n/** POST JSON, return parsed JSON. */\nasync function postJson<T>(path: string, payload: unknown): Promise<T> {\n const response = await fetch(path, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n })\n return readJson<T>(response)\n}\n\n/** The browser half's only data entry point. */\nexport class NovelApi {\n async status(): Promise<StatusResponse> {\n const response = await fetch(NOVEL_API.status)\n return readJson<StatusResponse>(response)\n }\n\n async loadOutline(path?: string, text?: string): Promise<LoadOutlineResponse> {\n return postJson<LoadOutlineResponse>(NOVEL_API.loadOutline, { path, text })\n }\n\n async saveOutline(text: string): Promise<{ ok: boolean; bookName: string }> {\n return postJson<{ ok: boolean; bookName: string }>(NOVEL_API.saveOutline, { text })\n }\n\n /** 开书想法 → AI 大纲:生成 count 个方案(换批时传 exclude 避开已暂留方向)。 */\n async outlineSuggest(idea: string, count?: number, exclude?: string[]): Promise<import('../protocol.ts').OutlineSuggestResponse> {\n return postJson<import('../protocol.ts').OutlineSuggestResponse>(NOVEL_API.outlineSuggest, { idea, count, exclude })\n }\n\n /** 拆书分析:对已写章节做结构/人物/文风/卖点体检。 */\n async breakdown(scope?: string, preset?: 'quick' | 'standard', budgetTokens?: number): Promise<import('../protocol.ts').BreakdownResponse> {\n return postJson<import('../protocol.ts').BreakdownResponse>(NOVEL_API.breakdown, { scope, preset, budgetTokens })\n }\n\n async plan(outline?: string, chapterCount?: number, volume?: number): Promise<PlanResponse> {\n return postJson<PlanResponse>(NOVEL_API.plan, { outline, chapterCount, volume })\n }\n\n async volumes(outline?: string): Promise<VolumesResponse> {\n return postJson<VolumesResponse>(NOVEL_API.volumes, { outline })\n }\n\n async bible(outline?: string): Promise<BibleResponse> {\n return postJson<BibleResponse>(NOVEL_API.bible, { outline })\n }\n\n async review(chapterNo: number): Promise<{ report: ReviewReport }> {\n return postJson<{ report: ReviewReport }>(NOVEL_API.review, { chapterNo })\n }\n\n async summarize(chapterNo: number): Promise<{ summary: string }> {\n return postJson<{ summary: string }>(NOVEL_API.summary, { chapterNo })\n }\n\n async foreshadow(req: ForeshadowRequest): Promise<ForeshadowResponse> {\n return postJson<ForeshadowResponse>(NOVEL_API.foreshadow, req)\n }\n\n async exportBook(format: 'txt' | 'md'): Promise<ExportResponse> {\n return postJson<ExportResponse>(NOVEL_API.exportBook, { format })\n }\n\n async chapter(no: number): Promise<ChapterResponse> {\n const response = await fetch(`${NOVEL_API.chapter}?no=${no}`)\n return readJson<ChapterResponse>(response)\n }\n\n /** 审查手动编辑的正文(不落盘)。previousReport 传入时走「验证模式」(核对原意见解决 + 只挑新增 high)。 */\n async chapterCheck(no: number, text: string, previousReport?: ReviewReport): Promise<{ report: ReviewReport }> {\n return postJson<{ report: ReviewReport }>(NOVEL_API.chapterCheck, { chapterNo: no, text, previousReport })\n }\n\n /** 保存手动编辑的正文(自动备份 .bak;带报告则沿用落盘,否则保存后自动审稿)。 */\n async chapterSave(no: number, text: string, report?: ReviewReport): Promise<import('../protocol.ts').ChapterSaveResponse> {\n return postJson<import('../protocol.ts').ChapterSaveResponse>(NOVEL_API.chapterSave, { chapterNo: no, text, report })\n }\n\n async patchConfig(patch: ConfigPatch): Promise<{ config: NovelConfig }> {\n return postJson<{ config: NovelConfig }>(NOVEL_API.config, patch)\n }\n\n async openFolder(): Promise<void> {\n await fetch(NOVEL_API.openFolder, { method: 'POST', headers: { 'content-type': 'application/json' }, body: '{}' })\n }\n\n /** 书架快照。 */\n async bookshelf(): Promise<import('../protocol.ts').BookshelfSnapshot> {\n const response = await fetch(NOVEL_API.bookshelf)\n return readJson<import('../protocol.ts').BookshelfSnapshot>(response)\n }\n\n /** 新建书并激活(开书向导:可携带大纲文本,创建即建项目)。 */\n async bookCreate(bookName: string, outputDir?: string, outline?: string): Promise<import('../protocol.ts').BookshelfSnapshot> {\n return postJson<import('../protocol.ts').BookshelfSnapshot>(NOVEL_API.bookshelf, { bookName, outputDir, outline })\n }\n\n /** 重置项目(清空进度;可携带新大纲)。 */\n async reset(outline?: string): Promise<{ ok: boolean; bookName: string }> {\n return postJson<{ ok: boolean; bookName: string }>(NOVEL_API.reset, { outline })\n }\n\n /** 全书一致性质检。 */\n async audit(): Promise<import('../protocol.ts').AuditResponse> {\n return postJson<import('../protocol.ts').AuditResponse>(NOVEL_API.audit, {})\n }\n\n /** 角色卡刷新(基于事实库聚合)。 */\n async charactersRefresh(): Promise<{ cards: import('../protocol.ts').RoleStatusCard[] }> {\n return postJson<{ cards: import('../protocol.ts').RoleStatusCard[] }>(NOVEL_API.charactersRefresh, {})\n }\n\n /** 事实库回填:对历史已生成章节批量抽取事实。 */\n async factsBackfill(): Promise<{ ok: boolean; filled: number }> {\n return postJson<{ ok: boolean; filled: number }>(NOVEL_API.factsBackfill, {})\n }\n\n /** 设定圣经局部修补。 */\n async biblePatch(patch: import('../protocol.ts').BiblePatchRequest): Promise<{ bible: import('../protocol.ts').StoryBible }> {\n return postJson<{ bible: import('../protocol.ts').StoryBible }>(NOVEL_API.biblePatch, patch)\n }\n\n /** 剧情线管理:增删改 + 关联章节。 */\n async plotlines(req: import('../protocol.ts').PlotlinesRequest): Promise<import('../protocol.ts').PlotlinesResponse> {\n return postJson<import('../protocol.ts').PlotlinesResponse>(NOVEL_API.plotlines, req)\n }\n\n /** 敏感词检查:指定章节 / 任意文本 / 全书。 */\n async sensitiveCheck(req: import('../protocol.ts').SensitiveCheckRequest): Promise<import('../protocol.ts').SensitiveCheckResponse> {\n return postJson<import('../protocol.ts').SensitiveCheckResponse>(NOVEL_API.sensitiveCheck, req)\n }\n\n /** 作者复盘补跑:单章(JSON)。 */\n async reviewBackfillChapter(no: number): Promise<{ no: number; review: import('../protocol.ts').AuthorReview }> {\n return postJson<{ no: number; review: import('../protocol.ts').AuthorReview }>(NOVEL_API.reviewBackfill, { chapterNo: no })\n }\n\n /** 作者复盘补跑:全书缺失章节(NDJSON 流)。 */\n async reviewBackfillAll(onFrame: (frame: JobFrame) => void): Promise<void> {\n await this.streamJob(NOVEL_API.reviewBackfill, {}, onFrame)\n }\n\n /** 章节复位:generating 卡死 → pending。 */\n async chapterReset(no: number): Promise<{ ok: boolean; no: number }> {\n return postJson<{ ok: boolean; no: number }>(NOVEL_API.chapterReset, { chapterNo: no })\n }\n\n /** 章节直接通过(作者行使最终决定权)。 */\n async chapterApprove(no: number): Promise<{ ok: boolean; no: number }> {\n return postJson<{ ok: boolean; no: number }>(NOVEL_API.chapterApprove, { chapterNo: no })\n }\n\n /** 角色库:AI 提炼 / 采纳 / 更新 / 删除。 */\n async roles(req: import('../protocol.ts').RolesRequest): Promise<import('../protocol.ts').RolesResponse> {\n return postJson<import('../protocol.ts').RolesResponse>(NOVEL_API.roles, req)\n }\n\n /** 场景库:AI 提炼 / 采纳 / 更新 / 删除 / 图集。 */\n async scenes(req: import('../protocol.ts').ScenesRequest): Promise<import('../protocol.ts').ScenesResponse> {\n return postJson<import('../protocol.ts').ScenesResponse>(NOVEL_API.scenes, req)\n }\n\n /** 视觉世界观规则:提炼 / 保存。 */\n async visualRules(req: import('../protocol.ts').VisualRulesRequest): Promise<import('../protocol.ts').VisualRulesResponse> {\n return postJson<import('../protocol.ts').VisualRulesResponse>(NOVEL_API.visualRules, req)\n }\n\n /** 小说简介:AI 生成/补全(partial 留空 = 全量),或手动保存。 */\n async blurb(action: 'generate' | 'save', text?: string, partial?: string): Promise<{ blurb: string }> {\n return postJson<{ blurb: string }>(NOVEL_API.blurb, { action, text, partial })\n }\n\n /** 封面:读取(dataUrl;dir 指定某本书的输出目录,省略为当前书)。 */\n async coverGet(dir?: string): Promise<import('../protocol.ts').CoverResponse> {\n const query = dir !== undefined ? `?dir=${encodeURIComponent(dir)}` : ''\n const response = await fetch(NOVEL_API.cover + query)\n return readJson<import('../protocol.ts').CoverResponse>(response)\n }\n\n /** 封面:上传(base64 data URL)或移除。 */\n async coverPost(action: 'upload' | 'remove', dataUrl?: string): Promise<{ ok: boolean; coverPath?: string | null }> {\n return postJson<{ ok: boolean; coverPath?: string | null }>(NOVEL_API.cover, { action, dataUrl })\n }\n\n /** 重命名当前书(同步项目与书架条目)。 */\n async rename(bookName: string): Promise<{ bookName: string }> {\n return postJson<{ bookName: string }>(NOVEL_API.rename, { bookName })\n }\n\n /** 大世界:AI 提炼(generate)或手动保存(save)。 */\n async world(action: 'generate' | 'save', world?: import('../protocol.ts').WorldState): Promise<{ world: import('../protocol.ts').WorldState }> {\n return postJson<{ world: import('../protocol.ts').WorldState }>(NOVEL_API.world, { action, world })\n }\n\n /** 切换当前书。 */\n async bookActivate(id: string): Promise<import('../protocol.ts').BookshelfSnapshot> {\n return postJson<import('../protocol.ts').BookshelfSnapshot>('/api/dsh-novel-forge/bookshelf/activate', { id })\n }\n\n /** 移除书架条目。 */\n async bookRemove(id: string): Promise<import('../protocol.ts').BookshelfSnapshot> {\n return postJson<import('../protocol.ts').BookshelfSnapshot>('/api/dsh-novel-forge/bookshelf/remove', { id })\n }\n\n /** 生产单:启动批量生产(区间或新增 N 章;计划不足自动补)。 */\n async runStart(req: import('../protocol.ts').RunStartRequest): Promise<import('../protocol.ts').RunState> {\n return postJson<import('../protocol.ts').RunState>(NOVEL_API.runStart, req)\n }\n\n /** 生产单控制:pause / resume / stop。 */\n async runControl(action: 'pause' | 'resume' | 'stop'): Promise<import('../protocol.ts').RunState | null> {\n const response = await fetch(NOVEL_API.runControl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ action }),\n })\n if (response.status === 400) return null\n return readJson<import('../protocol.ts').RunState>(response)\n }\n\n /** 生产单状态(无生产单返回 null)。 */\n async runStatus(): Promise<import('../protocol.ts').RunState | null> {\n const response = await fetch(NOVEL_API.runStatus)\n if (response.status === 404) return null\n return readJson<import('../protocol.ts').RunState | null>(response)\n }\n\n /** Get project writing assets + built-in libraries. */\n async assets(): Promise<AssetsResponse> {\n const response = await fetch(NOVEL_API.assets)\n return readJson<AssetsResponse>(response)\n }\n\n /** Patch project writing assets. */\n async patchAssets(patch: AssetsPatch): Promise<AssetsResponse> {\n return postJson<AssetsResponse>(NOVEL_API.assets, patch)\n }\n\n /** Extract a style asset from sample text. */\n async styleEngine(req: StyleEngineRequest): Promise<{ styleAsset: StyleAsset }> {\n return postJson<{ styleAsset: StyleAsset }>(NOVEL_API.styleEngine, req)\n }\n\n /**\n * Consume an NDJSON job stream (generate / rewrite / polish).\n * @param path - the route to POST to.\n * @param payload - the JSON body.\n * @param onFrame - receives every frame as it lands.\n */\n private async streamJob(path: string, payload: unknown, onFrame: (frame: JobFrame) => void): Promise<void> {\n const response = await fetch(path, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n })\n if (!response.ok) {\n await readJson<{ error?: string }>(response)\n return\n }\n if (response.body === null) throw new NovelApiError('job: no response body')\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n for (const line of lines) {\n if (line.trim() === '') continue\n let frame: JobFrame\n try {\n frame = JSON.parse(line) as JobFrame\n } catch {\n continue\n }\n onFrame(frame)\n if (frame.type === 'error') {\n throw new NovelApiError(frame.message)\n }\n }\n }\n }\n\n /** Generate one chapter. */\n async generate(chapterNo: number, skipReview: boolean, onFrame: (frame: JobFrame) => void): Promise<void> {\n await this.streamJob(NOVEL_API.generate, { chapterNo, skipReview }, onFrame)\n }\n\n /** Rewrite one chapter (whole-chapter, or local when `target` is given). */\n async rewrite(chapterNo: number, instructions: string, target: string, onFrame: (frame: JobFrame) => void): Promise<void> {\n await this.streamJob(NOVEL_API.rewrite, { chapterNo, instructions, target }, onFrame)\n }\n\n /** Polish (de-AI-ify) one chapter. */\n async polish(chapterNo: number, onFrame: (frame: JobFrame) => void): Promise<void> {\n await this.streamJob(NOVEL_API.polish, { chapterNo }, onFrame)\n }\n\n /** 采纳待确认草稿(润色/重写产物),覆盖正文文件。返回采纳后的新正文(markdown)。\n * 可携带审查报告(沿用结论定状态:通过 → approved)。 */\n async draftApply(chapterNo: number, report?: import('../protocol.ts').ReviewReport): Promise<{ ok: boolean; chars: number; file: string; markdown: string }> {\n return postJson<{ ok: boolean; chars: number; file: string; markdown: string }>(NOVEL_API.draftApply, { chapterNo, report })\n }\n\n /** 放弃待确认草稿,保留原稿。 */\n async draftDiscard(chapterNo: number): Promise<{ ok: boolean }> {\n return postJson<{ ok: boolean }>(NOVEL_API.draftDiscard, { chapterNo })\n }\n\n /** Run one assistant turn (NDJSON stream). */\n async assistant(message: string, onFrame: (frame: import('../protocol.ts').AssistantFrame) => void): Promise<void> {\n const response = await fetch(NOVEL_API.assistant, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ message }),\n })\n if (!response.ok) {\n await readJson<{ error?: string }>(response)\n return\n }\n if (response.body === null) throw new NovelApiError('assistant: no response body')\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n for (const line of lines) {\n if (line.trim() === '') continue\n let frame: import('../protocol.ts').AssistantFrame\n try {\n frame = JSON.parse(line) as import('../protocol.ts').AssistantFrame\n } catch {\n continue\n }\n onFrame(frame)\n if (frame.type === 'error') throw new NovelApiError(frame.message)\n }\n }\n }\n\n /** Load the persisted assistant conversation. */\n async assistantHistory(): Promise<import('../protocol.ts').AssistantMessage[]> {\n const response = await fetch(NOVEL_API.assistantHistory)\n const body = await readJson<{ messages: import('../protocol.ts').AssistantMessage[] }>(response)\n return body.messages\n }\n\n /** 清空助手对话记录。 */\n async assistantClear(): Promise<{ ok: boolean }> {\n return postJson<{ ok: boolean }>(NOVEL_API.assistantClear, {})\n }\n}\n","/**\n * dsh-novel-forge — locale dictionaries (zh / en).\n */\n\n/** zh dictionary. */\nexport const zh = {\n 'entry.label': '小说工坊',\n 'entry.tooltip': 'AI 编译小说工作台:总纲 → 道藏 → 卷计划 → 章节计划 → 逐章生成+审稿',\n 'panel.title': '小说工坊',\n 'common.close': '关闭',\n 'common.loading': '加载中…',\n 'common.save': '保存',\n 'common.error': '错误',\n 'common.success': '成功',\n 'common.generating': '生成中…',\n 'common.chars': '字',\n 'tab.workflow': '工作台',\n 'tab.overview': '总纲',\n 'tab.plan': '章节',\n 'tab.bible': '道藏',\n 'tab.foreshadow': '暗线',\n 'tab.assistant': 'AI 助手',\n 'tab.settings': '设置',\n 'workflow.title': '创作工作台',\n 'workflow.step1': '① 加载总纲',\n 'workflow.step2': '② 提炼道藏',\n 'workflow.step3': '③ 规划卷',\n 'workflow.step4': '④ 生成章节计划',\n 'workflow.step5': '⑤ 逐章写作 + AI 审稿',\n 'workflow.step6': '⑥ 润色 / 导出',\n 'workflow.loadOutline': '读取总纲',\n 'workflow.genBible': '提炼道藏',\n 'workflow.genVolumes': '生成卷计划',\n 'workflow.genPlan': '生成章节计划',\n 'workflow.done': '已完成',\n 'workflow.todo': '待办',\n 'workflow.bibleDone': '道藏已生成({n} 条规则 / {c} 个人物 / {r} 条红线)',\n 'workflow.volumesDone': '卷计划已生成({n} 卷)',\n 'workflow.planDone': '章节计划已生成({n} 章)',\n 'workflow.progress': '进度:总纲 ✓ · 道藏 {bible} · 卷 {volumes} · 计划 {plan} · 已完成 {done}/{total} 章',\n 'overview.loadDocx': '从 docx 读取总纲',\n 'overview.loadDocxDefault': '读取默认总纲',\n 'overview.loadingOutline': '正在解析 docx…',\n 'overview.outlineHint': '总纲文本(可编辑)',\n 'overview.outlineChars': '总纲字数',\n 'overview.saveOutline': '保存总纲',\n 'overview.saved': '总纲已保存',\n 'overview.bookName': '书名',\n 'overview.loadCustom': '指定 docx 路径',\n 'overview.loadCustomHint': '绝对路径,留空使用默认',\n 'plan.generate': '生成章节计划',\n 'plan.generateHint': '章节数量',\n 'plan.count': '章',\n 'plan.empty': '暂无章节计划,请先生成',\n 'plan.chapter': '章',\n 'plan.pending': '待生成',\n 'plan.generating': '生成中',\n 'plan.written': '待审稿',\n 'plan.reviewing': '审稿中',\n 'plan.approved': '已通过',\n 'plan.rejected': '待修订',\n 'plan.error': '失败',\n 'plan.write': '生成本章',\n 'plan.rewrite': '修订',\n 'plan.review': '审稿',\n 'plan.polish': '去AI味',\n 'plan.writeAll': '批量生成全部',\n 'plan.writeAllPending': '批量生成剩余',\n 'plan.generated': '已生成',\n 'plan.progress': '进度',\n 'plan.beats': '剧情要点',\n 'plan.reviewReport': '审稿报告',\n 'plan.reviewScore': '评分',\n 'plan.reviewVerdict': '总评',\n 'plan.reviewIssues': '问题清单',\n 'plan.reviewPass': '通过',\n 'plan.reviewFail': '未通过',\n 'plan.approve': '手动通过',\n 'plan.summary': '章节摘要',\n 'plan.volumes': '卷',\n 'plan.noVolume': '未分卷',\n 'bible.title': '道藏',\n 'bible.gen': 'AI 提炼道藏',\n 'bible.genre': '题材基调',\n 'bible.worldRules': '世界规则',\n 'bible.characters': '人物志',\n 'bible.redLines': '写作红线',\n 'bible.style': '风格要求',\n 'bible.none': '尚未生成道藏。生成后写作会严格遵守人设与金手指规则,审稿也会按红线检查。',\n 'foreshadow.title': '暗线管理',\n 'foreshadow.suggest': 'AI 建议暗线',\n 'foreshadow.none': '暂无暗线',\n 'foreshadow.status': '状态',\n 'foreshadow.planned': '计划中',\n 'foreshadow.planted': '已埋设',\n 'foreshadow.progressing': '推进中',\n 'foreshadow.resolved': '已回收',\n 'foreshadow.abandoned': '已放弃',\n 'foreshadow.target': '预计回收',\n 'foreshadow.plantedAt': '埋设于',\n 'foreshadow.setPlanted': '标记已埋设',\n 'foreshadow.setResolved': '标记已回收',\n 'tab.facts': '编年录',\n 'tab.plotlines': '剧情线',\n 'plotlines.hint': '主线/支线/人物线/悬念线的推进管理:章节生成时会注入未完结的线,要求每章至少推进一条;关联章节记录推进节点。',\n 'plotlines.empty': '还没有剧情线——长篇小说建议先建主线与几条支线。',\n 'plotlines.new': '+ 新建剧情线',\n 'plotlines.name': '线名',\n 'plotlines.kind': '类型',\n 'plotlines.kindMain': '主线',\n 'plotlines.kindBranch': '支线',\n 'plotlines.kindCharacter': '人物线',\n 'plotlines.kindMystery': '悬念线',\n 'plotlines.goal': '目标/终点',\n 'plotlines.progress': '当前进度',\n 'plotlines.status': '状态',\n 'plotlines.statusActive': '推进中',\n 'plotlines.statusPaused': '暂停',\n 'plotlines.statusResolved': '已完结',\n 'plotlines.statusAbandoned': '已废弃',\n 'plotlines.save': '保存',\n 'plotlines.cancel': '取消',\n 'plotlines.edit': '编辑',\n 'plotlines.remove': '删除',\n 'plotlines.linkChapter': '关联本章',\n 'plotlines.chapters': '已关联',\n 'plotlines.workflowTitle': '剧情线进度',\n 'plotlines.workflowEmpty': '未建剧情线(去「剧情线」页创建)',\n 'sensitive.title': '敏感词检查',\n 'sensitive.scanAll': '🔞 全书敏感词检查',\n 'sensitive.hint': '内置违禁词库硬匹配(政治/擦边/暴力/辱骂/广告/其他),发布前建议检查;只做提示,是否修改由你判断。',\n 'sensitive.clean': '✅ 未命中任何违禁词(扫描 {n} 章)',\n 'sensitive.hits': '命中 {n} 处({chapters} 章受影响)',\n 'sensitive.goFix': '去修订',\n 'sensitive.fixPrefill': '请删除或替换正文中的违禁表达「{word}」(类别:{category}),用含蓄/间接的写法替代。',\n 'facts.title': '编年录 / 时间线({n} 条)',\n 'facts.hint': '每章生成后自动抽取「已确立事实」(人物状态/境界资源/关系变化/伏笔落地),最近 20 条注入后续章节生成,保证长期一致。',\n 'facts.backfill': '回填历史章节事实',\n 'facts.backfilled': '已从历史章节回填 {n} 条事实',\n 'settings.title': '设置',\n 'settings.outlinePath': '默认大纲路径',\n 'settings.outputDir': '输出目录',\n 'settings.provider': '模型提供商',\n 'settings.model': '模型',\n 'settings.modelCustom': '自定义…',\n 'settings.modelCustomPlaceholder': '输入任意模型 id',\n 'settings.reasoningEffort': '思考强度 (reasoningEffort)',\n 'settings.reasoning.off': 'off · 关闭思考(推荐日常写文)',\n 'settings.reasoning.low': 'low · 低思考',\n 'settings.reasoning.high': 'high · 高思考',\n 'settings.reasoning.max': 'max · 最高思考(质检/推演)',\n 'settings.reasoningHint': 'off 最快最省;high/max 更慢更贵但推理更强',\n 'settings.theme': '主题',\n 'settings.themeLiquid': 'iOS 液态玻璃(绿)',\n 'settings.themeClassic': '经典毛玻璃(蓝)',\n 'settings.themeNeumorph': '新拟物(双阴影)',\n 'settings.themeHint': '存于浏览器本地,即时生效',\n 'settings.chapterChars': '每章目标字数',\n 'settings.maxTokens': '单章最大输出 tokens',\n 'settings.reviewPassScore': '审稿通过分数(0-100)',\n 'settings.editorFontSize': '编辑器字号(仅编辑页显示)',\n 'settings.editorFontSizeHint': '存于浏览器本地,不影响其他设备',\n 'settings.autoReview': '生成后自动审稿',\n 'settings.autoAuthorReview': '生成后自动作者复盘',\n 'settings.autoAuthorReviewHint': '复盘钩子兑现/结尾钩子/剧情线推进/连续性/节奏趋势,每章约 2000 token',\n 'settings.autoReviewAfterRevise': '修订后自动审查',\n 'settings.autoReviewAfterReviseHint': '按意见修订/润色产出草稿后自动附带一次 AI 审查,直接显示新稿评分与剩余问题(每章约 2-3k token,可关)',\n 'settings.save': '保存设置',\n 'settings.saved': '设置已保存',\n 'settings.openFolder': '打开输出文件夹',\n 'settings.export': '导出',\n 'settings.exportTxt': '导出 TXT',\n 'settings.exportMd': '导出 Markdown',\n 'settings.exported': '已导出:{file}({chars} 字,{chapters} 章)',\n 'progress.generating': '正在生成第 {no} 章《{title}》…',\n 'progress.done': '第 {no} 章完成({chars} 字)→ {file}',\n 'progress.reviewed': '第 {no} 章审稿:{score} 分 — {verdict}',\n 'progress.error': '第 {no} 章失败:{message}',\n 'progress.rewriting': '正在修订第 {no} 章…',\n 'progress.polishing': '正在润色第 {no} 章…',\n 'progress.empty': '生成/审稿进度将显示在这里',\n 'assistant.hint': '和 AI 编辑讨论剧情、人设、暗线;达成一致后可让它直接修改总纲、道藏、章节内容。',\n 'assistant.placeholder': '例如:我想让第 2 章结尾加一个悬念——墟境里传来爷爷的声音…',\n 'assistant.send': '发送',\n 'assistant.toolStart': '⚙ 执行操作:{name}…',\n 'assistant.toolDone': '✓ {name} 完成:{detail}',\n 'assistant.toolError': '✗ {name} 失败:{detail}',\n 'assistant.empty': '还没有对话。和 AI 编辑聊聊剧情吧。',\n 'status.projectNone': '输出目录中还没有项目。请先加载大纲。',\n 'status.files': '已生成文件',\n 'api.error': '请求失败',\n} as const\n\n/** en dictionary (fallback). */\nexport const en: Record<string, string> = {\n 'entry.label': 'Novel Forge',\n 'entry.tooltip': 'AI novel workbench: outline → bible → volumes → plan → write + review',\n 'panel.title': 'Novel Forge',\n 'common.close': 'Close',\n 'common.loading': 'Loading…',\n 'common.save': 'Save',\n 'common.error': 'Error',\n 'common.success': 'Success',\n 'common.generating': 'Generating…',\n 'common.chars': ' chars',\n 'tab.workflow': 'Workbench',\n 'tab.overview': 'Outline',\n 'tab.plan': 'Chapters',\n 'tab.bible': 'Bible',\n 'tab.foreshadow': 'Foreshadow',\n 'tab.settings': 'Settings',\n 'workflow.title': 'Writing workbench',\n 'workflow.step1': '① Load outline',\n 'workflow.step2': '② Extract story bible',\n 'workflow.step3': '③ Plan volumes',\n 'workflow.step4': '④ Plan chapters',\n 'workflow.step5': '⑤ Write + AI review',\n 'workflow.step6': '⑥ Polish / export',\n 'workflow.loadOutline': 'Load outline',\n 'workflow.genBible': 'Extract bible',\n 'workflow.genVolumes': 'Plan volumes',\n 'workflow.genPlan': 'Plan chapters',\n 'workflow.done': 'done',\n 'workflow.todo': 'todo',\n 'workflow.bibleDone': 'Bible ready ({n} rules / {c} characters / {r} red lines)',\n 'workflow.volumesDone': 'Volumes ready ({n})',\n 'workflow.planDone': 'Plan ready ({n} chapters)',\n 'workflow.progress': 'Outline ✓ · bible {bible} · volumes {volumes} · plan {plan} · {done}/{total} chapters',\n 'overview.loadDocx': 'Load outline from docx',\n 'overview.loadDocxDefault': 'Load default outline',\n 'overview.loadingOutline': 'Parsing docx…',\n 'overview.outlineHint': 'Outline text (editable)',\n 'overview.outlineChars': 'Outline length',\n 'overview.saveOutline': 'Save outline',\n 'overview.saved': 'Outline saved',\n 'overview.bookName': 'Book',\n 'overview.loadCustom': 'Custom docx path',\n 'overview.loadCustomHint': 'Absolute path; empty = default',\n 'plan.generate': 'Plan chapters',\n 'plan.generateHint': 'Chapter count',\n 'plan.count': ' chapters',\n 'plan.empty': 'No plan yet — generate one first',\n 'plan.chapter': 'Ch.',\n 'plan.pending': 'pending',\n 'plan.generating': 'writing',\n 'plan.written': 'to review',\n 'plan.reviewing': 'reviewing',\n 'plan.approved': 'approved',\n 'plan.rejected': 'to revise',\n 'plan.error': 'failed',\n 'plan.write': 'Write',\n 'plan.rewrite': 'Revise',\n 'plan.review': 'Review',\n 'plan.polish': 'De-AI',\n 'plan.writeAll': 'Write all',\n 'plan.writeAllPending': 'Write remaining',\n 'plan.generated': 'generated',\n 'plan.progress': 'progress',\n 'plan.beats': 'Beats',\n 'plan.reviewReport': 'Review report',\n 'plan.reviewScore': 'Score',\n 'plan.reviewVerdict': 'Verdict',\n 'plan.reviewIssues': 'Issues',\n 'plan.reviewPass': 'Passed',\n 'plan.reviewFail': 'Failed',\n 'plan.approve': 'Approve',\n 'plan.summary': 'Summary',\n 'plan.volumes': 'Volumes',\n 'plan.noVolume': 'No volume',\n 'bible.title': 'Story bible',\n 'bible.gen': 'Extract bible with AI',\n 'bible.genre': 'Genre',\n 'bible.worldRules': 'World rules',\n 'bible.characters': 'Characters',\n 'bible.redLines': 'Red lines',\n 'bible.style': 'Style',\n 'bible.none': 'No bible yet. Generation and review follow it strictly once extracted.',\n 'foreshadow.title': 'Foreshadowing',\n 'foreshadow.suggest': 'Suggest with AI',\n 'foreshadow.none': 'No foreshadows',\n 'foreshadow.status': 'Status',\n 'foreshadow.planned': 'planned',\n 'foreshadow.planted': 'planted',\n 'foreshadow.progressing': 'progressing',\n 'foreshadow.resolved': 'resolved',\n 'foreshadow.abandoned': 'abandoned',\n 'foreshadow.target': 'target',\n 'foreshadow.plantedAt': 'planted at',\n 'foreshadow.setPlanted': 'Mark planted',\n 'foreshadow.setResolved': 'Mark resolved',\n 'settings.title': 'Settings',\n 'settings.outlinePath': 'Default outline path',\n 'settings.outputDir': 'Output directory',\n 'settings.provider': 'Provider',\n 'settings.model': 'Model',\n 'settings.modelCustom': 'Custom…',\n 'settings.modelCustomPlaceholder': 'Type any model id',\n 'settings.reasoningEffort': 'Reasoning effort',\n 'settings.reasoning.off': 'off · no thinking (recommended)',\n 'settings.reasoning.low': 'low',\n 'settings.reasoning.high': 'high',\n 'settings.reasoning.max': 'max (audit/reasoning)',\n 'settings.reasoningHint': 'off is fastest/cheapest; high/max are slower and stronger',\n 'settings.theme': 'Theme',\n 'settings.themeLiquid': 'iOS Liquid Glass (green)',\n 'settings.themeClassic': 'Classic frosted (blue)',\n 'settings.themeNeumorph': 'Neumorphism (dual-shadow)',\n 'settings.themeHint': 'Stored in browser localStorage; applies instantly',\n 'settings.chapterChars': 'Chars per chapter',\n 'settings.maxTokens': 'Max output tokens',\n 'settings.reviewPassScore': 'Review pass score (0-100)',\n 'settings.editorFontSize': 'Editor font size (workspace only)',\n 'settings.editorFontSizeHint': 'Stored in browser localStorage; display-only',\n 'settings.autoReview': 'Auto-review after writing',\n 'settings.autoAuthorReview': 'Auto author review after writing',\n 'settings.autoAuthorReviewHint': 'Reviews hook payoff / ending hook / plotline progress / continuity / pacing trend (~2000 tokens per chapter)',\n 'settings.autoReviewAfterRevise': 'Auto review after revise',\n 'settings.autoReviewAfterReviseHint': 'Automatically runs one AI review on the produced draft after revise/polish, showing the new score and remaining issues (~2-3k tokens, can be disabled)',\n 'settings.save': 'Save settings',\n 'settings.saved': 'Settings saved',\n 'settings.openFolder': 'Open output folder',\n 'settings.export': 'Export',\n 'settings.exportTxt': 'Export TXT',\n 'settings.exportMd': 'Export Markdown',\n 'settings.exported': 'Exported: {file} ({chars} chars, {chapters} chapters)',\n 'tab.facts': 'Chronicle',\n 'tab.plotlines': 'Plotlines',\n 'plotlines.hint': 'Track main/branch/character/mystery arcs: unfinished arcs are injected into chapter writing so each chapter advances at least one; linked chapters record progress nodes.',\n 'plotlines.empty': 'No plotlines yet — consider creating the main arc and a few branches.',\n 'plotlines.new': '+ New plotline',\n 'plotlines.name': 'Name',\n 'plotlines.kind': 'Type',\n 'plotlines.kindMain': 'Main',\n 'plotlines.kindBranch': 'Branch',\n 'plotlines.kindCharacter': 'Character',\n 'plotlines.kindMystery': 'Mystery',\n 'plotlines.goal': 'Goal',\n 'plotlines.progress': 'Current progress',\n 'plotlines.status': 'Status',\n 'plotlines.statusActive': 'Active',\n 'plotlines.statusPaused': 'Paused',\n 'plotlines.statusResolved': 'Resolved',\n 'plotlines.statusAbandoned': 'Abandoned',\n 'plotlines.save': 'Save',\n 'plotlines.cancel': 'Cancel',\n 'plotlines.edit': 'Edit',\n 'plotlines.remove': 'Remove',\n 'plotlines.linkChapter': 'Link chapter',\n 'plotlines.chapters': 'Linked',\n 'plotlines.workflowTitle': 'Plotline progress',\n 'plotlines.workflowEmpty': 'No plotlines yet (create them in the Plotlines tab)',\n 'sensitive.title': 'Sensitive-word check',\n 'sensitive.scanAll': '🔞 Scan all chapters',\n 'sensitive.hint': 'Built-in banned-word library (politics/erotica/violence/abuse/ads/other). Run before publishing; suggestions only.',\n 'sensitive.clean': '✅ No banned words found ({n} chapters scanned)',\n 'sensitive.hits': '{n} hits across {chapters} chapters',\n 'sensitive.goFix': 'Fix',\n 'sensitive.fixPrefill': 'Remove or rephrase the banned expression \"{word}\" (category: {category}) with an indirect alternative.',\n 'facts.title': 'Chronicle / timeline ({n} facts)',\n 'facts.hint': 'Auto-extracted established facts per chapter (state/resources/relations/foreshadow landings); the latest 20 are injected into later chapters for consistency.',\n 'facts.backfill': 'Backfill facts from historical chapters',\n 'facts.backfilled': 'Backfilled {n} facts from historical chapters',\n 'progress.generating': 'Writing chapter {no} “{title}”…',\n 'progress.done': 'Chapter {no} done ({chars} chars) → {file}',\n 'progress.reviewed': 'Chapter {no} review: {score} — {verdict}',\n 'progress.error': 'Chapter {no} failed: {message}',\n 'progress.rewriting': 'Revising chapter {no}…',\n 'progress.polishing': 'Polishing chapter {no}…',\n 'progress.empty': 'Generation/review progress appears here',\n 'assistant.hint': 'Discuss plot, characters, foreshadowing with the AI editor; once agreed, let it edit the outline, bible, or chapters directly.',\n 'assistant.placeholder': 'e.g. Add a hook at the end of chapter 2…',\n 'assistant.send': 'Send',\n 'assistant.toolStart': '⚙ Running {name}…',\n 'assistant.toolDone': '✓ {name} done: {detail}',\n 'assistant.toolError': '✗ {name} failed: {detail}',\n 'assistant.empty': 'No conversation yet. Chat with the AI editor.',\n 'status.projectNone': 'No project in the output directory yet. Load an outline first.',\n 'status.files': 'Generated files',\n 'api.error': 'Request failed',\n}\n\n/** Keys type for the zh dictionary. */\nexport type NovelKey = keyof typeof zh\n","/**\n * Tiny translation helper for the panel: reads the zh dict with the en dict\n * as fallback (the family plugins use a full locale registry; the panel keeps\n * a dependency-free helper so the client bundle stays self-contained).\n */\nimport { zh, en, type NovelKey } from '../locales.ts'\n\n/** Translate one key with optional {placeholder} substitution. */\nexport function tt(key: NovelKey, params?: Record<string, string | number>): string {\n let text: string = zh[key] ?? en[key] ?? key\n if (params !== undefined) {\n for (const [name, value] of Object.entries(params)) {\n text = text.replaceAll(`{${name}}`, String(value))\n }\n }\n return text\n}\n\n// ------------------------------------------------------------ shared constants\n\n/** 角色定位中文名(角色库/提炼候选共用,收敛自多份复制)。 */\nexport const ROLE_LABELS: Record<string, string> = {\n protagonist: '主角',\n female_lead: '女主',\n female_support: '女配',\n support: '配角',\n antagonist: '反派',\n extra: '路人',\n}\n\n/** 角色定位徽章颜色。 */\nexport function roleColor(label: string): string {\n if (label === 'protagonist') return 'var(--nf-success)'\n if (label === 'female_lead') return 'var(--nf-accent)'\n if (label === 'antagonist') return 'var(--nf-error)'\n return 'var(--nf-text-3)'\n}\n\n/** 剧情线类型中文名(与 locale 对齐)。 */\nexport function kindLabel(kind: string): string {\n switch (kind) {\n case 'main': return tt('plotlines.kindMain')\n case 'branch': return tt('plotlines.kindBranch')\n case 'character': return tt('plotlines.kindCharacter')\n case 'mystery': return tt('plotlines.kindMystery')\n default: return kind\n }\n}\n\n/** 剧情线状态中文名。 */\nexport function plotlineStatusLabel(status: string): string {\n switch (status) {\n case 'active': return tt('plotlines.statusActive')\n case 'paused': return tt('plotlines.statusPaused')\n case 'resolved': return tt('plotlines.statusResolved')\n case 'abandoned': return tt('plotlines.statusAbandoned')\n default: return status\n }\n}\n\n/** 剧情线状态颜色。 */\nexport function plotlineStatusColor(status: string): string {\n if (status === 'resolved') return 'var(--nf-success)'\n if (status === 'abandoned') return 'var(--nf-text-3)'\n if (status === 'paused') return 'var(--nf-warn)'\n return 'var(--nf-accent)'\n}\n","/**\n * AI 助手(编辑老师):与 AI 编辑对话讨论剧情,助手通过动作指令直接修改\n * 大纲 / 设定圣经 / 章节。流式渲染回复;工具调用显示为步骤卡片(中文名 +\n * 状态 + 耗时),顶部状态条展示当前在做什么;支持清空对话记录。\n */\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport { tt } from './helpers.ts'\nimport type { AssistantFrame, AssistantMessage } from '../../protocol.ts'\nimport css from './panel.module.css'\n\n/** 工具中文名 + 图标映射(作者看得懂)。 */\nconst TOOL_LABELS: Record<string, { icon: string; label: string }> = {\n book_overview: { icon: '📖', label: '读取全书上下文' },\n impact_analysis: { icon: '🔗', label: '影响分析' },\n outline_text: { icon: '📄', label: '读取大纲' },\n outline_replace: { icon: '📝', label: '修改大纲' },\n bible_set_rule: { icon: '📖', label: '修改设定规则' },\n bible_set_redline: { icon: '🚫', label: '修改写作红线' },\n chapter_text: { icon: '📄', label: '读取章节' },\n chapter_rewrite: { icon: '✏️', label: '修订章节' },\n chapter_generate: { icon: '✨', label: '生成章节' },\n chapter_review: { icon: '🔍', label: 'AI 审稿' },\n foreshadow_add: { icon: '🪤', label: '新增伏笔' },\n foreshadow_update: { icon: '🪤', label: '更新伏笔' },\n export_txt: { icon: '📦', label: '导出 TXT' },\n assets_status: { icon: '🎨', label: '查看写作资产' },\n assets_set_genre: { icon: '🏷️', label: '设置题材' },\n assets_set_progression: { icon: '📈', label: '设置推进模式' },\n assets_add_rule: { icon: '🚫', label: '新增反AI规则' },\n error: { icon: '⚠️', label: '出错了' },\n}\n\n/** One chat bubble (either side). */\ninterface ChatLine {\n id: number\n role: 'user' | 'assistant'\n text: string\n /** Tool steps interleaved with the assistant reply. */\n tools: Array<{ name: string; status: 'start' | 'done' | 'error'; detail?: string; startedAt?: number; elapsedMs?: number }>\n /** Live output while a tool runs (generated text streamed into the bubble). */\n live?: string\n}\n\n/** Props. */\nexport interface AssistantTabProps {\n api: NovelApi\n}\n\n/** The assistant conversation tab. */\nexport function AssistantTab({ api }: AssistantTabProps) {\n const [lines, setLines] = useState<ChatLine[]>([])\n const [input, setInput] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const [notice, setNotice] = useState('')\n /** 思考耗时(秒,busy 时每秒刷新)。 */\n const [thinkSeconds, setThinkSeconds] = useState(0)\n const idRef = useRef(0)\n const scrollRef = useRef<HTMLDivElement | null>(null)\n\n /** busy 计时:显示\"已思考 Xs\",让作者知道在干活。 */\n useEffect(() => {\n if (!busy) {\n setThinkSeconds(0)\n return\n }\n const started = Date.now()\n const timer = window.setInterval(() => {\n setThinkSeconds(Math.floor((Date.now() - started) / 1000))\n }, 1000)\n return () => { window.clearInterval(timer) }\n }, [busy])\n\n /** Append a bubble (or extend the current assistant bubble). */\n const pushLine = useCallback((line: Omit<ChatLine, 'id'>) => {\n setLines(prev => {\n const last = prev[prev.length - 1]\n // Extend the live assistant bubble while streaming.\n if (line.role === 'assistant' && last !== undefined && last.role === 'assistant' && last.tools.length === 0) {\n return [...prev.slice(0, -1), { ...last, text: last.text + line.text }]\n }\n return [...prev, { ...line, id: idRef.current++ }]\n })\n }, [])\n\n /** Push a tool event: start 创建步骤,done/error 更新同名步骤(含耗时)。 */\n const pushTool = useCallback((tool: ChatLine['tools'][number]) => {\n setLines(prev => {\n const last = prev[prev.length - 1]\n if (last === undefined || last.role !== 'assistant') {\n return [...prev, {\n id: idRef.current++,\n role: 'assistant',\n text: '',\n tools: [{ ...tool, startedAt: tool.status === 'start' ? Date.now() : undefined }],\n }]\n }\n const tools = [...last.tools]\n if (tool.status === 'start') {\n tools.push({ ...tool, startedAt: Date.now() })\n } else {\n // 找到同名未完成的步骤,更新状态与耗时。\n for (let i = tools.length - 1; i >= 0; i--) {\n const step = tools[i]!\n if (step.name === tool.name && step.status === 'start') {\n tools[i] = {\n ...step,\n status: tool.status,\n detail: tool.detail,\n elapsedMs: Date.now() - (step.startedAt ?? Date.now()),\n }\n break\n }\n }\n }\n return [...prev.slice(0, -1), { ...last, tools, live: undefined }]\n })\n }, [])\n\n /** Append live tool output onto the current assistant bubble. */\n const pushToolDelta = useCallback((text: string) => {\n setLines(prev => {\n const last = prev[prev.length - 1]\n if (last === undefined || last.role !== 'assistant') return prev\n return [...prev.slice(0, -1), { ...last, live: (last.live ?? '') + text }]\n })\n }, [])\n\n /** 当前进行中的工具(状态条显示)。 */\n const activeTool = (() => {\n if (!busy) return null\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i]!\n if (line.role !== 'assistant') continue\n for (let j = line.tools.length - 1; j >= 0; j--) {\n if (line.tools[j]!.status === 'start') return line.tools[j]!\n }\n }\n return null\n })()\n\n /** Load persisted history on mount. */\n useEffect(() => {\n let cancelled = false\n void (async () => {\n try {\n const history = await api.assistantHistory()\n if (cancelled) return\n const restored: ChatLine[] = []\n for (const entry of history) {\n if (entry.role === 'user') {\n restored.push({ id: idRef.current++, role: 'user', text: entry.content, tools: [] })\n } else if (entry.role === 'assistant') {\n restored.push({ id: idRef.current++, role: 'assistant', text: entry.content, tools: [] })\n }\n }\n setLines(restored)\n } catch (err) {\n if (!cancelled) setError((err as Error).message)\n }\n })()\n return () => { cancelled = true }\n }, [api])\n\n /** Auto-scroll to the newest line. */\n useEffect(() => {\n scrollRef.current?.scrollTo({ top: scrollRef.current.scrollHeight })\n }, [lines])\n\n /** 清空对话记录(服务端删除历史 + 本地清空)。 */\n const handleClear = async (): Promise<void> => {\n if (!window.confirm('清空全部聊天记录?此操作不可恢复(不影响大纲/设定/章节)。')) return\n setBusy(true)\n setError('')\n try {\n await api.assistantClear()\n setLines([])\n setNotice('对话已清空,编辑老师会重新了解项目')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** Send one message. */\n const handleSend = async (): Promise<void> => {\n const message = input.trim()\n if (message === '' || busy) return\n setInput('')\n setError('')\n setNotice('')\n pushLine({ role: 'user', text: message, tools: [] })\n // Start an empty assistant bubble.\n setLines(prev => [...prev, { id: idRef.current++, role: 'assistant', text: '', tools: [] }])\n setBusy(true)\n try {\n await api.assistant(message, (frame: AssistantFrame) => {\n if (frame.type === 'delta') {\n pushLine({ role: 'assistant', text: frame.text, tools: [] })\n } else if (frame.type === 'tool') {\n pushTool({\n name: frame.name,\n status: frame.status,\n detail: frame.detail,\n })\n } else if (frame.type === 'toolDelta') {\n pushToolDelta(frame.text)\n } else if (frame.type === 'error') {\n pushTool({ name: 'error', status: 'error', detail: frame.message })\n }\n })\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <div className={css.card} style={{ flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' }}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>{tt('tab.assistant')}</span>\n <button type=\"button\" className={css.iconButton} title=\"清空聊天记录\" aria-label=\"清空聊天记录\" onClick={() => { void handleClear() }}>\n 🗑️\n </button>\n </div>\n <span className={css.meta}>{tt('assistant.hint')}</span>\n {notice !== '' && <span style={{ color: 'var(--nf-success)', fontSize: 12 }}>{notice}</span>}\n {error !== '' && <span style={{ color: 'var(--nf-error)', fontSize: 12 }}>{tt('common.error')}: {error}</span>}\n {/* 状态条:编辑老师正在做什么 */}\n <div className={`${css.assistantStatus} ${busy ? css.assistantStatusBusy : ''}`}>\n {busy\n ? `🤖 编辑老师 · ${activeTool !== null ? `正在「${TOOL_LABELS[activeTool.name]?.label ?? activeTool.name}」` : `正在思考…(已 ${thinkSeconds}s)`}`\n : '💬 编辑老师 · 等你开口'}\n </div>\n <div\n ref={scrollRef}\n className={css.chatScroll}\n >\n {lines.length === 0 && <span className={css.meta}>{tt('assistant.empty')}</span>}\n {lines.map(line => (\n <div key={line.id} className={line.role === 'user' ? css.chatBubbleUser : css.chatBubbleAssistant}>\n {line.role === 'user' && <div className={css.chatRole}>你</div>}\n {line.text !== '' && <div style={{ whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>{line.text}</div>}\n {line.live !== undefined && line.live !== '' && (\n <div className={css.toolLive}>{line.live}</div>\n )}\n {/* 步骤卡片 */}\n {line.tools.length > 0 && (\n <div className={css.toolSteps}>\n {line.tools.map((tool, i) => {\n const meta = TOOL_LABELS[tool.name] ?? { icon: '⚙️', label: tool.name }\n return (\n <div\n key={i}\n className={`${css.toolStep} ${tool.status === 'error' ? css.toolStepError : tool.status === 'start' ? css.toolStepActive : ''}`}\n >\n <span className={css.toolStepIcon}>{meta.icon}</span>\n <span className={css.toolStepName}>{meta.label}</span>\n <span className={css.toolStepStatus}>\n {tool.status === 'start'\n ? '⏳ 进行中'\n : tool.status === 'done'\n ? `✓ ${tool.elapsedMs !== undefined ? `${(tool.elapsedMs / 1000).toFixed(1)}s` : ''}`\n : '✗ 失败'}\n </span>\n {tool.status === 'error' && tool.detail !== undefined && (\n <span className={css.toolStepDetail}>{tool.detail}</span>\n )}\n </div>\n )\n })}\n </div>\n )}\n </div>\n ))}\n {busy && <span className={css.meta} style={{ color: 'var(--nf-accent)' }}>…</span>}\n </div>\n <div className={css.row} style={{ marginTop: 8 }}>\n <textarea\n className={css.textarea}\n style={{ minHeight: 64, flex: 1 }}\n placeholder={tt('assistant.placeholder')}\n value={input}\n onChange={e => { setInput(e.target.value) }}\n onKeyDown={e => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n void handleSend()\n }\n }}\n />\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy || input.trim() === ''} onClick={() => { void handleSend() }}>\n {tt('assistant.send')}\n </button>\n </div>\n </div>\n )\n}\n","/**\n * 写作资产页签:题材基底库 / 推进模式库 / 反 AI 规则 / 写法引擎。\n * 学习自 AI-Novel-Writing-Assistant 的四大资产模块,注入到生成与审稿提示词中。\n */\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport { tt } from './helpers.ts'\nimport type { AntiAiRule, AssetsResponse, GenreNode, ProgressionMode, StyleAsset, StyleTemplate } from '../../protocol.ts'\nimport css from './panel.module.css'\n\n/** Props. */\nexport interface AssetsTabProps {\n api: NovelApi\n /** 初始子页(左侧导航直达对应资产分类)。 */\n initialTab?: AssetSubTab\n}\n\n/** 渲染题材树(带勾选当前题材)。 */\nfunction GenreTree({ node, selected, onSelect }: { node: GenreNode; selected: string; onSelect: (node: GenreNode) => void }) {\n return (\n <div>\n <label style={{ display: 'flex', alignItems: 'flex-start', gap: 6, cursor: 'pointer' }}>\n <input type=\"radio\" name=\"genre\" checked={selected === node.name} onChange={() => { onSelect(node) }} />\n <span>\n <b>{node.name}</b>\n {node.description !== '' && (\n <span\n className={`${css.meta} ${css.genreDesc}`}\n title={node.description}\n >\n — {node.description}\n </span>\n )}\n </span>\n </label>\n {node.children.length > 0 && (\n <div style={{ marginLeft: 22, display: 'flex', flexDirection: 'column', gap: 4 }}>\n {node.children.map(child => (\n <GenreTree key={child.name} node={child} selected={selected} onSelect={onSelect} />\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/** 写作资产子页签。 */\ntype AssetSubTab = 'genre' | 'progression' | 'templates' | 'rules' | 'style'\n\n/** 子页签定义。 */\nconst SUB_TABS: ReadonlyArray<{ id: AssetSubTab; label: string }> = [\n { id: 'genre', label: '题材基底' },\n { id: 'progression', label: '推进模式' },\n { id: 'templates', label: '笔法帖' },\n { id: 'rules', label: '文戒' },\n { id: 'style', label: '心法' },\n]\n\n/** 写作资产页签。 */\nexport function AssetsTab({ api, initialTab = 'genre' }: AssetsTabProps) {\n const [assetTab, setAssetTab] = useState<AssetSubTab>(initialTab)\n const [data, setData] = useState<AssetsResponse | null>(null)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const [notice, setNotice] = useState('')\n const [sampleText, setSampleText] = useState('')\n const [styleName, setStyleName] = useState('')\n const [newRule, setNewRule] = useState('')\n const [newProgression, setNewProgression] = useState('')\n /** 正在行内编辑的自定义反 AI 规则(下标 + 草稿字段)。 */\n const [editingRule, setEditingRule] = useState<{ index: number; name: string; avoid: string; fix: string } | null>(null)\n const loadId = useRef(0)\n\n /** Load assets (or reset from a new call). */\n const refresh = useCallback(async () => {\n try {\n const result = await api.assets()\n setData(result)\n } catch (err) {\n setError((err as Error).message)\n }\n }, [api])\n\n useEffect(() => {\n void refresh()\n }, [refresh])\n\n /** Patch assets and refresh. */\n const patch = async (patch: Parameters<NovelApi['patchAssets']>[0]): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.patchAssets(patch)\n setData(result)\n setNotice('已保存')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 提取写法资产。 */\n const handleExtractStyle = async (): Promise<void> => {\n if (sampleText.trim().length < 50) {\n setError(tt('settings.exported') === '' ? '样本文本过短' : '样本文本过短(<50 字符)')\n return\n }\n setBusy(true)\n setError('')\n try {\n const result = await api.styleEngine({ sampleText, name: styleName })\n setData(prev => prev === null ? prev : {\n ...prev,\n projectAssets: {\n ...prev.projectAssets,\n styleAssets: [...(prev.projectAssets.styleAssets ?? []), result.styleAsset],\n updatedAt: new Date().toISOString(),\n },\n })\n setNotice(`写法资产「${result.styleAsset.name}」已提取并绑定`)\n setSampleText('')\n setStyleName('')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 添加自定义反 AI 规则(一行 \"名称:要避免的\" 简单格式由用户填写 JSON)。 */\n const handleAddRule = async (): Promise<void> => {\n const text = newRule.trim()\n if (text === '') return\n let rule: AntiAiRule\n try {\n const parsed = JSON.parse(text) as AntiAiRule\n rule = { name: parsed.name ?? '自定义规则', avoid: parsed.avoid ?? '', fix: parsed.fix ?? '' }\n } catch {\n // Fallback: treat as \"避免什么\" text.\n rule = { name: `自定义规则 ${(data?.projectAssets.antiAiRules ?? []).length + 1}`, avoid: text, fix: '' }\n }\n if (rule.avoid === '' && rule.fix === '') return\n const next = [...(data?.projectAssets.antiAiRules ?? []), rule]\n await patch({ antiAiRules: next })\n setNewRule('')\n }\n\n /** 保存行内编辑的自定义规则。 */\n const handleSaveRuleEdit = async (): Promise<void> => {\n if (editingRule === null) return\n const rules = [...(data?.projectAssets.antiAiRules ?? [])]\n if (editingRule.index < 0 || editingRule.index >= rules.length) return\n const name = editingRule.name.trim() || rules[editingRule.index]!.name\n if (editingRule.avoid.trim() === '' && editingRule.fix.trim() === '') return\n rules[editingRule.index] = { name, avoid: editingRule.avoid.trim(), fix: editingRule.fix.trim() }\n await patch({ antiAiRules: rules })\n setEditingRule(null)\n }\n\n /** 删除一条自定义规则。 */\n const handleRemoveRule = async (index: number): Promise<void> => {\n const rules = [...(data?.projectAssets.antiAiRules ?? [])]\n rules.splice(index, 1)\n setEditingRule(null)\n await patch({ antiAiRules: rules })\n }\n\n /** 把内置规则复制为自定义副本(同名覆盖生效),并打开行内编辑。 */\n const handleOverrideBuiltin = (rule: AntiAiRule): void => {\n const rules = data?.projectAssets.antiAiRules ?? []\n const existing = rules.findIndex(r => r.name === rule.name)\n if (existing >= 0) {\n setEditingRule({ index: existing, name: rules[existing]!.name, avoid: rules[existing]!.avoid, fix: rules[existing]!.fix ?? '' })\n } else {\n const next = [...rules, { ...rule, fix: rule.fix ?? '' }]\n setEditingRule({ index: next.length - 1, name: rule.name, avoid: rule.avoid, fix: rule.fix ?? '' })\n void patch({ antiAiRules: next })\n }\n }\n\n /** 设置题材。 */\n const handleSelectGenre = (node: GenreNode): void => {\n void patch({ genre: node })\n }\n\n /** 添加推进模式(从内置库选择)。 */\n const handleAddProgression = async (mode: ProgressionMode): Promise<void> => {\n const current = data?.projectAssets\n const isPrimary = (data?.projectAssets.primaryProgression ?? undefined) === undefined\n if (isPrimary) {\n await patch({ primaryProgression: { ...mode, primary: true } })\n } else {\n await patch({ auxiliaryProgressions: [...(current?.auxiliaryProgressions ?? []), { ...mode, primary: false }] })\n }\n }\n\n if (data === null) {\n return <div className={css.card}><span className={css.meta}>{tt('common.loading')}</span></div>\n }\n\n const assets = data.projectAssets\n const builtinRules = data.antiAiLibrary\n const customRules = assets.antiAiRules ?? []\n const genreLibrary = data.genreLibrary\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12, flex: 1, minHeight: 0 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle} style={{ fontSize: 17, fontWeight: 700 }}>🧰 创作资产</span>\n <span className={css.meta}>题材基底 / 推进模式 / 笔法帖 / 文戒 / 心法</span>\n </div>\n {error !== '' && <div className={css.card} style={{ borderColor: 'var(--nf-error)' }}><span style={{ color: 'var(--nf-error)' }}>{tt('common.error')}: {error}</span></div>}\n {notice !== '' && <div className={css.card}><span style={{ color: 'var(--nf-success)' }}>{notice}</span></div>}\n\n {/* 资产状态总览(参照 AI-Novel-Writing-Assistant 状态网格) */}\n <div className={css.assetGrid}>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>当前题材</span>\n <span className={css.assetStatValue}>{assets.genre?.name ?? '未设置'}</span>\n {assets.genre !== undefined && <span className={css.assetStatDetail} title={assets.genre.description}>{assets.genre.description}</span>}\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>主推进模式</span>\n <span className={css.assetStatValue}>{assets.primaryProgression?.name ?? '未设置'}</span>\n {assets.primaryProgression !== undefined && <span className={css.assetStatDetail} title={assets.primaryProgression.driver}>{assets.primaryProgression.driver}</span>}\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>已绑定写法</span>\n <span className={css.assetStatValue}>{assets.styleAssets?.length ?? 0} 套</span>\n <span className={css.assetStatDetail} title={(assets.styleAssets ?? []).map(s => s.name).join('、')}>\n {(assets.styleAssets ?? []).map(s => s.name).join('、') || '未绑定(可在「笔法帖」一键选用)'}\n </span>\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>文戒</span>\n <span className={css.assetStatValue}>{builtinRules.length} 内置 + {(assets.antiAiRules ?? []).length} 自定义</span>\n <span className={css.assetStatDetail}>全部生效于生成与审稿提示词</span>\n </div>\n </div>\n\n {/* 子页签:题材基底 / 推进模式 / 笔法帖 / 文戒 / 心法 */}\n <div className={css.row} style={{ flexWrap: 'wrap', gap: 6 }}>\n {SUB_TABS.map(t => (\n <button\n key={t.id}\n type=\"button\"\n className={`${css.button} ${assetTab === t.id ? css.buttonPrimary : ''}`}\n style={{ fontSize: 14, flex: 1 }}\n onClick={() => { setAssetTab(t.id) }}\n >\n {t.label}\n </button>\n ))}\n </div>\n\n {/* 题材基底库 */}\n {assetTab === 'genre' && (\n <div className={css.card}>\n <span className={css.cardTitle}>题材基底库</span>\n <span className={css.meta}>这本书属于哪个阅读市场?题材定位会注入章节生成与审稿提示词。</span>\n {assets.genre !== undefined && (\n <div style={{ border: '1px solid var(--nf-border)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <b>当前题材:{assets.genre.name}</b> — {assets.genre.description}\n </div>\n )}\n {/* 题材基底库:自然展开,不套内部滚动条(描述两行截断,悬停看全文) */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {genreLibrary.map(root => <GenreTree key={root.name} node={root} selected={assets.genre?.name ?? ''} onSelect={handleSelectGenre} />)}\n </div>\n </div>\n )}\n\n {/* 推进模式库 */}\n {assetTab === 'progression' && (\n <div className={css.card} style={{ flex: 1, minHeight: 0 }}>\n <span className={css.cardTitle}>推进模式库</span>\n <span className={css.meta}>读者为什么继续看下一章?主模式 + 辅助模式注入卷规划与章节生成。</span>\n {assets.primaryProgression !== undefined && (\n <div style={{ border: '1px solid var(--nf-accent)', borderRadius: 6, padding: '6px 10px', fontSize: 12, color: 'var(--nf-accent)' }}>\n <b>主推进:{assets.primaryProgression.name}</b> — {assets.primaryProgression.driver}\n </div>\n )}\n {assets.auxiliaryProgressions.map(mode => (\n <div key={mode.name} style={{ border: '1px solid var(--nf-border)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <b>{mode.name}</b> — {mode.driver}\n </div>\n ))}\n <span className={css.meta}>从内置推进模式库选择添加(第一个设为主推进):</span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, flex: 1, minHeight: 0, overflowY: 'auto' }}>\n {data.progressionLibrary.map(mode => {\n const alreadyPrimary = assets.primaryProgression?.name === mode.name\n const alreadyAux = assets.auxiliaryProgressions.some(m => m.name === mode.name)\n if (alreadyPrimary || alreadyAux) return null\n return (\n <button key={mode.name} className={css.button} disabled={busy} onClick={() => { void handleAddProgression(mode) }}>\n + {assets.primaryProgression === undefined ? `主推进:` : '辅助:'}{mode.name} — {mode.driver.slice(0, 40)}…\n </button>\n )\n })}\n </div>\n </div>\n )}\n\n {/* 笔法帖(一键绑定) */}\n {assetTab === 'templates' && (\n <div className={css.card} style={{ flex: 1, minHeight: 0 }}>\n <span className={css.cardTitle}>笔法帖</span>\n <span className={css.meta}>从内置 8 套叙事风格模板中一键选用(来自 AI-Novel-Writing-Assistant 写法引擎),无需样本文本;绑定后生成与润色都遵循该风格。</span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, flex: 1, minHeight: 0, overflowY: 'auto' }}>\n {data.styleTemplates.map(template => {\n const bound = assets.styleAssets.some(s => s.name === template.name)\n return (\n <div key={template.key} style={{ border: `1px solid ${bound ? 'var(--nf-accent)' : 'var(--nf-border)'}`, borderRadius: 6, padding: '8px 10px', fontSize: 12 }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>\n <span><b>{template.name}</b> <span className={css.badge} style={{ borderColor: 'var(--nf-text-3)', color: 'var(--nf-text-3)' }}>{template.category}</span></span>\n <button\n className={`${css.button} ${css.buttonSmall} ${bound ? '' : css.buttonPrimary}`}\n disabled={busy || bound}\n onClick={() => {\n const styleAsset: StyleAsset = {\n name: template.name,\n proseRules: [...template.proseRules, ...template.rhythmRules.map(r => `节奏:${r}`)],\n dialogueRules: template.dialogueRules,\n descriptionRules: template.languageRules,\n boundaries: [`模板「${template.name}」适用题材:${template.applicableGenres.join('、')}`, '不要违背模板的叙事单元结构与节奏约束'],\n createdAt: new Date().toISOString(),\n }\n void patch({ styleAssets: [...(data.projectAssets.styleAssets ?? []), styleAsset] })\n }}\n >\n {bound ? '✓ 已绑定' : '+ 绑定'}\n </button>\n </div>\n <div className={css.meta}>{template.description}</div>\n <div className={css.meta}>叙述:{template.proseRules.slice(0, 2).join(';')}</div>\n <div className={css.meta}>台词:{template.dialogueRules.slice(0, 1).join(';')}</div>\n </div>\n )\n })}\n </div>\n </div>\n )}\n\n {/* 文戒 */}\n {assetTab === 'rules' && (\n <div className={css.card} style={{ flex: 1, minHeight: 0 }}>\n <span className={css.cardTitle}>文戒</span>\n <span className={css.meta}>写作时必须遵守的表达边界(内置全局 + 项目自定义),生成与审稿都会检查。内置规则可用「覆盖编辑」复制为自定义版本调整。</span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, flex: 1, minHeight: 0, overflowY: 'auto' }}>\n {builtinRules.map(rule => {\n const overridden = customRules.some(r => r.name === rule.name)\n return (\n <div key={rule.name} style={{ border: '1px solid var(--nf-border)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>\n <span>\n <b>{rule.name}</b>{' '}\n <span className={css.badge} style={{ borderColor: overridden ? 'var(--nf-accent)' : 'var(--nf-text-3)', color: overridden ? 'var(--nf-accent)' : 'var(--nf-text-3)' }}>\n {overridden ? '自定义覆盖中' : '内置'}\n </span>\n </span>\n <button className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { handleOverrideBuiltin(rule) }}>\n {overridden ? '✎ 编辑覆盖' : '+ 覆盖编辑'}\n </button>\n </div>\n <div className={css.meta}>避免:{rule.avoid}</div>\n <div className={css.meta}>修正:{rule.fix}</div>\n </div>\n )\n })}\n {customRules.map((rule, index) => (\n <div key={`${rule.name}-${index}`} style={{ border: '1px solid var(--nf-accent)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>\n <span>\n <b>{rule.name}</b>{' '}\n <span className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)' }}>自定义</span>\n </span>\n <span style={{ display: 'flex', gap: 6 }}>\n <button className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { setEditingRule({ index, name: rule.name, avoid: rule.avoid, fix: rule.fix ?? '' }) }}>\n 编辑\n </button>\n <button className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void handleRemoveRule(index) }}>\n 删除\n </button>\n </span>\n </div>\n {editingRule !== null && editingRule.index === index ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, marginTop: 6 }}>\n <input className={css.input} placeholder=\"规则名\" value={editingRule.name} onChange={e => { setEditingRule({ ...editingRule, name: e.target.value }) }} />\n <input className={css.input} placeholder=\"避免(要杜绝的表达)\" value={editingRule.avoid} onChange={e => { setEditingRule({ ...editingRule, avoid: e.target.value }) }} />\n <input className={css.input} placeholder=\"修正(改写方向,可留空)\" value={editingRule.fix} onChange={e => { setEditingRule({ ...editingRule, fix: e.target.value }) }} />\n <div className={css.row}>\n <button className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy || (editingRule.avoid.trim() === '' && editingRule.fix.trim() === '')} onClick={() => { void handleSaveRuleEdit() }}>\n 保存\n </button>\n <button className={`${css.button} ${css.buttonSmall}`} onClick={() => { setEditingRule(null) }}>\n 取消\n </button>\n </div>\n </div>\n ) : (\n <>\n <div className={css.meta}>避免:{rule.avoid}</div>\n {rule.fix !== '' && <div className={css.meta}>修正:{rule.fix}</div>}\n </>\n )}\n </div>\n ))}\n </div>\n <div className={css.row}>\n <input\n className={css.input}\n style={{ flex: 1 }}\n placeholder='新增规则(格式:{\"name\":\"规则名\",\"avoid\":\"要避免的\",\"fix\":\"修正方向\"};或直接填要避免的问题)'\n value={newRule}\n onChange={e => { setNewRule(e.target.value) }}\n />\n <button className={`${css.button} ${css.buttonPrimary}`} disabled={busy || newRule.trim() === ''} onClick={() => { void handleAddRule() }}>+ 添加</button>\n </div>\n </div>\n )}\n\n {/* 心法(自定义写法引擎) */}\n {assetTab === 'style' && (\n <div className={css.card}>\n <span className={css.cardTitle}>心法</span>\n <span className={css.meta}>粘贴一段你喜欢的样本文本,AI 提取叙事风格规则并绑定到本书,后续章节保持同一味道。</span>\n {assets.styleAssets.map(style => (\n <div key={style.name} style={{ border: '1px solid var(--nf-border)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <b>{style.name}</b>\n <div className={css.meta}>叙述:{style.proseRules.slice(0, 3).join(';')}</div>\n {style.dialogueRules.length > 0 && <div className={css.meta}>台词:{style.dialogueRules.slice(0, 2).join(';')}</div>}\n </div>\n ))}\n <textarea\n className={css.textarea}\n style={{ minHeight: 90 }}\n placeholder=\"粘贴样本文本(一段能代表目标风格的文字,50 字以上)…\"\n value={sampleText}\n onChange={e => { setSampleText(e.target.value) }}\n />\n <div className={css.row}>\n <input\n className={css.input}\n style={{ flex: 1 }}\n placeholder=\"写法资产名(可选)\"\n value={styleName}\n onChange={e => { setStyleName(e.target.value) }}\n />\n <button className={`${css.button} ${css.buttonPrimary}`} disabled={busy || sampleText.trim().length < 50} onClick={() => { void handleExtractStyle() }}>\n 提取并绑定\n </button>\n </div>\n </div>\n )}\n </div>\n )\n}\n","/**\n * 书架首页视图:书卡网格(封面/书名/简介/进度)+ 搜索筛选 + 开书入口。\n * 进入小说工坊默认展示;点击书卡进入该书工作台,+ 进入开书向导页。\n */\nimport { useEffect, useMemo, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport type { BookshelfSnapshot } from '../../protocol.ts'\nimport css from './panel.module.css'\n\n/** 相对时间(人性化:刚刚 / N 分钟前 / N 小时前 / N 天前 / 日期)。 */\nfunction relativeTime(iso: string): string {\n const t = new Date(iso).getTime()\n if (!Number.isFinite(t)) return '—'\n const diff = Date.now() - t\n if (diff < 60_000) return '刚刚'\n if (diff < 3_600_000) return `${Math.floor(diff / 60_000)} 分钟前`\n if (diff < 86_400_000) return `${Math.floor(diff / 3_600_000)} 小时前`\n if (diff < 7 * 86_400_000) return `${Math.floor(diff / 86_400_000)} 天前`\n return new Date(t).toLocaleDateString('zh-CN', { month: 'numeric', day: 'numeric' })\n}\n\n/** 一本书的状态标签。 */\nfunction bookStatus(book: BookshelfSnapshot['books'][number]): 'none' | 'done' | 'active' {\n if (!book.hasProject) return 'none'\n return book.total > 0 && book.done >= book.total ? 'done' : 'active'\n}\n\n/** 一张书卡(封面懒加载)。 */\nfunction BookCard({\n api,\n book,\n active,\n onOpen,\n onRead,\n}: {\n api: NovelApi\n book: BookshelfSnapshot['books'][number]\n active: boolean\n onOpen: () => void\n onRead: () => void\n}) {\n const [cover, setCover] = useState<string | null>(null)\n\n useEffect(() => {\n if (!book.hasCover) return\n let cancelled = false\n void api.coverGet(book.outputDir).then(result => {\n if (!cancelled) setCover(result.dataUrl)\n }).catch(() => { /* best-effort */ })\n return () => { cancelled = true }\n }, [api, book.hasCover, book.outputDir])\n\n const ratio = book.total > 0 ? Math.min(book.done / book.total, 1) : 0\n const status = bookStatus(book)\n const statusLabel = status === 'none' ? '未开书' : status === 'done' ? '已完结' : '进行中'\n\n return (\n <div\n className={`${css.bookCard} ${active ? css.bookCardActive : ''}`}\n onClick={onOpen}\n title={`打开《${book.bookName}》`}\n >\n <div className={css.bookCardCover}>\n {cover !== null ? (\n <img src={cover} alt={`《${book.bookName}》封面`} />\n ) : (\n <div className={css.bookCardCoverFallback}>\n <span className={css.bookCardCoverTitle}>{book.bookName.slice(0, 4)}</span>\n <span className={css.meta}>暂无封面</span>\n </div>\n )}\n </div>\n <div className={css.bookCardBody}>\n <div className={css.bookCardTitleRow}>\n <span className={css.bookCardName}>{book.bookName}</span>\n <span className={`${css.badge} ${status === 'none' ? css.badgePending : status === 'done' ? css.badgeDone : css.badgeWritten}`}>\n {statusLabel}\n </span>\n </div>\n <span className={`${css.meta} ${css.bookCardBlurb}`} title={book.blurb ?? ''}>\n {book.blurb !== undefined && book.blurb !== '' ? book.blurb : '暂无简介'}\n </span>\n <div className={css.bookCardProgressBar}>\n <div className={css.bookCardProgressFill} style={{ width: `${Math.round(ratio * 100)}%` }} />\n </div>\n <div className={css.bookCardMetaRow}>\n <span className={css.meta}>{book.total > 0 ? `已完成 ${book.done} / ${book.total} 章` : '尚未规划章节'}</span>\n {book.hasProject && <span className={css.meta} title=\"最近活动时间\">更新于 {relativeTime(book.updatedAt)}</span>}\n </div>\n <div className={css.bookCardActions} onClick={e => { e.stopPropagation() }}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n onClick={onOpen}\n title=\"进入创作工作台(大纲/章节/审稿/设定)\"\n >\n 📝 进入工作台\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={!book.hasProject || book.done === 0}\n onClick={onRead}\n title={book.hasProject && book.done > 0 ? '沉浸式阅读已写章节' : '尚无已写章节,先去工作台创作'}\n >\n 📖 阅读\n </button>\n </div>\n </div>\n </div>\n )\n}\n\n/** 书架首页。 */\nexport function ShelfView({\n api,\n shelf,\n onOpenBook,\n onReadBook,\n onAddBook,\n}: {\n api: NovelApi\n shelf: BookshelfSnapshot\n /** 点击书卡:激活该书并进入工作台。 */\n onOpenBook: (id: string) => void\n /** 点击「阅读」:激活该书并进入沉浸式阅读页。 */\n onReadBook: (id: string) => void\n /** 点击+:进入开书向导页。 */\n onAddBook: () => void\n}) {\n const [query, setQuery] = useState('')\n /** 筛选:all=全部 / active=进行中 / done=已完结 / none=未开书。 */\n const [filter, setFilter] = useState<'all' | 'active' | 'done' | 'none'>('all')\n\n const stats = useMemo(() => {\n let active = 0, done = 0, none = 0\n for (const b of shelf.books) {\n const s = bookStatus(b)\n if (s === 'none') none++\n else if (s === 'done') done++\n else active++\n }\n return { active, done, none }\n }, [shelf.books])\n\n const visible = useMemo(() => {\n const q = query.trim().toLowerCase()\n return shelf.books.filter(b => {\n if (filter !== 'all' && bookStatus(b) !== filter) return false\n if (q === '') return true\n return b.bookName.toLowerCase().includes(q) || (b.blurb ?? '').toLowerCase().includes(q)\n })\n }, [shelf.books, query, filter])\n\n const filters: Array<{ id: 'all' | 'active' | 'done' | 'none'; label: string; count: number }> = [\n { id: 'all', label: '全部', count: shelf.books.length },\n { id: 'active', label: '进行中', count: stats.active },\n { id: 'done', label: '已完结', count: stats.done },\n { id: 'none', label: '未开书', count: stats.none },\n ]\n\n return (\n <div className={css.shelfView}>\n <div className={css.shelfHeader}>\n <div className={css.shelfTitleRow}>\n <h2 className={css.panelTitle} style={{ margin: 0 }}>📚 书架</h2>\n {shelf.books.length > 0 && (\n <span className={css.meta}>\n {shelf.books.length} 本书 · {stats.active} 进行中 · {stats.done} 已完结 · {stats.none} 未开书\n </span>\n )}\n </div>\n <div className={css.shelfToolbar}>\n <input\n className={`${css.input} ${css.shelfSearch}`}\n type=\"search\"\n placeholder=\"🔍 搜索书名 / 简介…\"\n value={query}\n onChange={e => { setQuery(e.target.value) }}\n />\n </div>\n <div className={css.shelfFilters} style={{ display: 'flex', gap: 6, flexWrap: 'wrap' }}>\n {filters.map(f => (\n <button\n key={f.id}\n type=\"button\"\n className={`${css.button} ${filter === f.id ? css.buttonPrimary : ''}`}\n style={{ fontSize: 14, flex: 1 }}\n onClick={() => { setFilter(f.id) }}\n >\n {f.label}{f.count > 0 ? `(${f.count})` : ''}\n </button>\n ))}\n </div>\n </div>\n\n {shelf.books.length === 0 ? (\n /* 空书架引导卡 */\n <div className={css.shelfEmpty}>\n <span className={css.shelfEmptyIcon}>📖</span>\n <span className={css.shelfEmptyTitle}>你的创作从这里开始</span>\n <span className={css.meta}>开一本书:粘贴大纲或导入 docx,书名自动识别,开书即建项目</span>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} onClick={onAddBook}>\n + 开第一本书\n </button>\n </div>\n ) : visible.length === 0 ? (\n <div className={css.shelfEmpty} style={{ minHeight: 160 }}>\n <span className={css.shelfEmptyIcon}>🔍</span>\n <span className={css.shelfEmptyTitle}>没有符合条件的书</span>\n <span className={css.meta}>换个关键词或筛选条件试试</span>\n </div>\n ) : (\n <div className={css.shelfGrid}>\n {visible.map(book => (\n <BookCard\n key={book.id}\n api={api}\n book={book}\n active={book.id === shelf.activeBookId}\n onOpen={() => { onOpenBook(book.id) }}\n onRead={() => { onReadBook(book.id) }}\n />\n ))}\n\n {/* 开书入口:进入独立向导页 */}\n <div className={`${css.bookCard} ${css.bookAddCard}`} onClick={onAddBook}>\n <div className={css.bookAddIcon}>+</div>\n <span>开一本新书</span>\n <span className={css.meta}>书名 + 大纲,开书即建项目</span>\n </div>\n </div>\n )}\n </div>\n )\n}\n","/**\n * 阅读页:沉浸式章节阅读(纯只读,零 LLM 消耗)。\n * 布局:顶部工具栏 + 左侧可折叠目录栏(按卷分组)+ 阅读区。\n * 轻量渲染:去掉 md 首行标题,按行分段;字号/主题/阅读进度 localStorage 记忆。\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport type { ProjectState, ChapterPlan } from '../../protocol.ts'\nimport css from './panel.module.css'\n\nconst FONT_SIZES = [\n { id: 'sm', px: 15, label: 'A-' },\n { id: 'md', px: 17, label: 'A' },\n { id: 'lg', px: 20, label: 'A+' },\n] as const\n\nconst THEMES = [\n { id: 'paper', label: '📄 纸白', bg: '#f7f1e3', fg: '#3b3226', accent: '#8b6f47', dim: '#8a7d66' },\n { id: 'eye', label: '🌿 护眼', bg: '#e8f0e3', fg: '#2f3d2e', accent: '#5f7d5a', dim: '#6f836b' },\n { id: 'night', label: '🌙 夜间', bg: '#1d2226', fg: '#c9d1d9', accent: '#8aa5c0', dim: '#6d7882' },\n] as const\n\ntype FontId = typeof FONT_SIZES[number]['id']\ntype ThemeId = typeof THEMES[number]['id']\n\nfunction readPref<T>(key: string, fallback: T): T {\n try {\n const raw = window.localStorage.getItem(key)\n if (raw !== null) return JSON.parse(raw) as T\n } catch { /* ignore */ }\n return fallback\n}\n\nfunction writePref(key: string, value: unknown): void {\n try { window.localStorage.setItem(key, JSON.stringify(value)) } catch { /* ignore */ }\n}\n\n/** 章节状态小标(阅读视角)。 */\nfunction statusBadge(ch: ChapterPlan): { label: string; cls: string } {\n switch (ch.status) {\n case 'approved': return { label: '✅', cls: css.badgeDone }\n case 'written': return { label: '📝', cls: css.badgeWritten }\n case 'rejected': return { label: '⚠️', cls: css.badgePending }\n default: return { label: '', cls: css.badgePending }\n }\n}\n\n/** 目录分组:按卷区间过滤可读章节;卷外章节归入「未分卷」。 */\nfunction buildGroups(project: ProjectState, readable: ChapterPlan[]): Array<{ title: string; no: number; chapters: ChapterPlan[] }> {\n const vols = project.volumes ?? []\n if (vols.length === 0) return [{ title: '全部章节', no: 0, chapters: readable }]\n const groups: Array<{ title: string; no: number; chapters: ChapterPlan[] }> = []\n for (const v of vols) {\n const inVol = readable.filter(c => c.no >= v.chapterStart && c.no <= v.chapterEnd)\n if (inVol.length > 0) groups.push({ title: `第${v.no}卷 ${v.title}`, no: v.no, chapters: inVol })\n }\n const rest = readable.filter(c => !vols.some(v => c.no >= v.chapterStart && c.no <= v.chapterEnd))\n if (rest.length > 0) groups.push({ title: '未分卷', no: 0, chapters: rest })\n return groups\n}\n\nexport function ReaderView({\n api,\n project,\n onBack,\n onOpenWorkspace,\n}: {\n api: NovelApi\n project: ProjectState\n onBack: () => void\n onOpenWorkspace: () => void\n}) {\n const prefKey = useMemo(() => {\n const id = project.bookName || 'book'\n return `dsh-novel-forge.reader.${id}`\n }, [project.bookName])\n\n /** 可读章节(有正文落盘):approved / written / rejected。 */\n const readable = useMemo(() => project.chapters.filter(c =>\n c.status === 'approved' || c.status === 'written' || c.status === 'rejected',\n ), [project.chapters])\n\n const groups = useMemo(() => buildGroups(project, readable), [project, readable])\n\n const [currentNo, setCurrentNo] = useState<number>(() => {\n const saved = readPref<number | null>(`${prefKey}.no`, null)\n if (saved !== null && readable.some(c => c.no === saved)) return saved\n // 无记忆 → 最后一章已通过\n const lastApproved = [...readable].reverse().find(c => c.status === 'approved')\n return lastApproved?.no ?? readable[0]?.no ?? 0\n })\n const [markdown, setMarkdown] = useState<string>('')\n const [loading, setLoading] = useState(false)\n const [loadError, setLoadError] = useState<string>('')\n const [font, setFont] = useState<FontId>(() => readPref(`${prefKey}.font`, 'md'))\n const [theme, setTheme] = useState<ThemeId>(() => readPref(`${prefKey}.theme`, 'paper'))\n const [navOpen, setNavOpen] = useState<boolean>(() => readPref(`${prefKey}.nav`, true))\n /** 折叠的卷号(点击卷标题切换;记忆在 localStorage)。 */\n const [collapsedVols, setCollapsedVols] = useState<number[]>(() => readPref(`${prefKey}.collapsed`, []))\n const sidebarRef = useRef<HTMLDivElement>(null)\n\n const toggleVol = useCallback((no: number) => {\n setCollapsedVols(prev => {\n const next = prev.includes(no) ? prev.filter(v => v !== no) : [...prev, no]\n writePref(`${prefKey}.collapsed`, next)\n return next\n })\n }, [prefKey])\n\n const current = useMemo(() => project.chapters.find(c => c.no === currentNo), [project.chapters, currentNo])\n const idx = readable.findIndex(c => c.no === currentNo)\n const prevCh = idx > 0 ? readable[idx - 1] : undefined\n const nextCh = idx >= 0 && idx < readable.length - 1 ? readable[idx + 1] : undefined\n\n const load = useCallback(async (no: number) => {\n if (no === 0) return\n setLoading(true)\n setLoadError('')\n try {\n const res = await api.chapter(no)\n setMarkdown(res.markdown)\n setCurrentNo(no)\n writePref(`${prefKey}.no`, no)\n } catch (err) {\n setLoadError((err as Error).message)\n } finally {\n setLoading(false)\n }\n }, [api, prefKey])\n\n // 初始加载\n const initialNo = useRef<number>(0)\n useEffect(() => {\n if (initialNo.current === currentNo && markdown !== '') return\n if (currentNo === 0) return\n initialNo.current = currentNo\n void load(currentNo)\n }, [currentNo, load, markdown])\n\n // 键盘翻章\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return\n if (e.key === 'ArrowLeft' && prevCh !== undefined) void load(prevCh.no)\n if (e.key === 'ArrowRight' && nextCh !== undefined) void load(nextCh.no)\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [prevCh, nextCh, load])\n\n // 当前章滚动到可见(目录栏内)\n useEffect(() => {\n sidebarRef.current?.querySelector<HTMLElement>(`[data-no=\"${currentNo}\"]`)?.scrollIntoView({ block: 'nearest', behavior: 'smooth' })\n }, [currentNo])\n\n const themeMeta = THEMES.find(t => t.id === theme) ?? THEMES[0]\n const fontMeta = FONT_SIZES.find(f => f.id === font) ?? FONT_SIZES[1]\n\n /** 轻量渲染:去标题行、按行分段(网文每行一段)。 */\n const paragraphs = useMemo(() => {\n return markdown\n .split(/\\r?\\n/)\n .map(l => l.replace(/^#{1,6}\\s*/, '').trim())\n .filter(Boolean)\n }, [markdown])\n\n const itemBg = theme === 'night' ? 'rgba(255,255,255,0.03)' : 'rgba(0,0,0,0.025)'\n\n return (\n <div className={css.readerView} style={{ background: themeMeta.bg, color: themeMeta.fg }}>\n {/* 顶部栏 */}\n <div className={css.readerHeader} style={{ borderColor: themeMeta.dim }}>\n <button type=\"button\" className={css.iconButton} title=\"返回书架\" aria-label=\"返回书架\" onClick={onBack}>←</button>\n <span className={css.readerTitle}>📖 《{project.bookName}》</span>\n <span className={css.meta} style={{ color: themeMeta.dim }}>\n {readable.length > 0 && currentNo > 0 ? `第 ${currentNo} 章 · ${idx + 1}/${readable.length}` : ''}\n </span>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${navOpen ? css.buttonPrimary : ''}`}\n style={{ marginLeft: 4 }}\n onClick={() => { setNavOpen(v => { const next = !v; writePref(`${prefKey}.nav`, next); return next }) }}\n title={navOpen ? '收起目录' : '展开目录'}\n >\n ☰ 目录\n </button>\n <div style={{ flex: 1 }} />\n <span className={css.meta} style={{ color: themeMeta.dim }}>字号</span>\n <div className={css.readerSeg}>\n {FONT_SIZES.map(f => (\n <button\n key={f.id}\n type=\"button\"\n className={`${css.readerSegBtn} ${font === f.id ? css.readerSegActive : ''}`}\n style={font === f.id ? { background: themeMeta.accent, color: themeMeta.bg } : undefined}\n onClick={() => { setFont(f.id); writePref(`${prefKey}.font`, f.id) }}\n title={`字号 ${f.label}`}\n >\n {f.label}\n </button>\n ))}\n </div>\n <div className={css.readerSeg} style={{ marginLeft: 8 }}>\n {THEMES.map(t => (\n <button\n key={t.id}\n type=\"button\"\n className={`${css.readerSegBtn} ${theme === t.id ? css.readerSegActive : ''}`}\n style={theme === t.id ? { background: themeMeta.accent, color: themeMeta.bg } : undefined}\n onClick={() => { setTheme(t.id); writePref(`${prefKey}.theme`, t.id) }}\n title={t.label}\n >\n {t.label}\n </button>\n ))}\n </div>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} style={{ marginLeft: 10 }} onClick={onOpenWorkspace} title=\"回到创作工作台\">\n ✏️ 去工作台\n </button>\n </div>\n\n {/* 主体:左目录 + 右阅读区 */}\n <div className={css.readerBody}>\n {navOpen && (\n <aside className={css.readerSidebar} style={{ borderColor: themeMeta.dim, background: theme === 'night' ? 'rgba(0,0,0,0.25)' : 'rgba(255,255,255,0.35)' }} ref={sidebarRef}>\n {groups.length === 0 ? (\n <div className={css.meta} style={{ color: themeMeta.dim, padding: 12 }}>还没有已写章节,先去工作台创作吧</div>\n ) : groups.map(g => {\n const collapsed = collapsedVols.includes(g.no)\n return (\n <div key={g.no} className={css.readerGroup}>\n <button\n type=\"button\"\n className={css.readerGroupTitle}\n style={{ color: themeMeta.accent }}\n onClick={() => { toggleVol(g.no) }}\n title={collapsed ? `展开${g.title}` : `收起${g.title}`}\n >\n <span className={css.readerGroupArrow}>{collapsed ? '▸' : '▾'}</span>\n <span>{g.title}</span>\n <span className={css.readerGroupCount}>{g.chapters.length}</span>\n </button>\n {!collapsed && g.chapters.map(ch => {\n const badge = statusBadge(ch)\n const active = ch.no === currentNo\n return (\n <button\n key={ch.no}\n type=\"button\"\n data-no={ch.no}\n className={`${css.readerItem} ${active ? css.readerItemActive : ''}`}\n style={active ? { background: themeMeta.accent, color: themeMeta.bg, borderColor: themeMeta.accent } : { borderColor: 'transparent', color: themeMeta.fg }}\n onClick={() => { void load(ch.no) }}\n title={`第${ch.no}章 ${ch.title}`}\n >\n <span className={css.readerItemNo}>{ch.no}</span>\n <span className={css.readerItemTitle}>{ch.title}</span>\n {badge.label !== '' && <span className={css.readerItemBadge}>{badge.label}</span>}\n </button>\n )\n })}\n </div>\n )\n })}\n </aside>\n )}\n\n {/* 阅读区 */}\n <div className={css.readerMain} style={{ background: itemBg }}>\n {loadError !== '' ? (\n <div className={css.readerError}>{loadError}</div>\n ) : loading && markdown === '' ? (\n <div className={css.readerLoading}>⏳ 加载中…</div>\n ) : current !== undefined && currentNo > 0 ? (\n <article className={css.readerArticle} style={{ maxWidth: 720 }}>\n <h1 className={css.readerChapterTitle} style={{ color: themeMeta.accent }}>{current.title}</h1>\n <div className={css.readerChapterMeta} style={{ color: themeMeta.dim }}>\n <span>{statusBadge(current).label}</span>\n <span>第 {current.no} 章</span>\n {current.chars !== undefined && <span> · {current.chars.toLocaleString()} 字</span>}\n </div>\n <div className={css.readerText} style={{ fontSize: fontMeta.px, lineHeight: 1.9 }}>\n {paragraphs.map((p, i) => <p key={i} className={css.readerPara}>{p}</p>)}\n </div>\n <div className={css.readerFoot}>\n {prevCh !== undefined && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} style={{ borderColor: themeMeta.dim, color: themeMeta.fg }} onClick={() => { void load(prevCh.no) }} title=\"← 上一章\">\n ← 第{prevCh.no}章\n </button>\n )}\n <span className={css.meta} style={{ color: themeMeta.dim }}>← → 键盘翻章</span>\n {nextCh !== undefined && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} style={{ borderColor: themeMeta.accent, color: themeMeta.accent }} onClick={() => { void load(nextCh.no) }} title=\"下一章 →\">\n 第{nextCh.no}章 →\n </button>\n )}\n </div>\n </article>\n ) : (\n <div className={css.readerLoading}>暂无内容</div>\n )}\n </div>\n </div>\n </div>\n )\n}\n","/**\n * 生产单面板:区间批量生产(计划补足 → 逐章生成 → 被拒分级处理 → 断点续跑)。\n * 与「工作进度」悬浮窗不同:这是标准流水线设备,一键下单、实时进度、日志可查。\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport type { RunState } from '../../protocol.ts'\nimport css from './panel.module.css'\n\nexport function RunPanel({ api, totalChapters }: { api: NovelApi; totalChapters: number }) {\n const [run, setRun] = useState<RunState | null>(null)\n const [startNo, setStartNo] = useState<number>(1)\n const [endNo, setEndNo] = useState<number>(0)\n const [count, setCount] = useState<number>(30)\n const [mode, setMode] = useState<'count' | 'range'>('count')\n const [busy, setBusy] = useState(false)\n const [err, setErr] = useState('')\n const logRef = useRef<HTMLDivElement>(null)\n\n // 默认起点:最后一章 + 1;count 模式终点 = 起点 + count - 1\n useEffect(() => {\n setStartNo(totalChapters + 1)\n setEndNo(totalChapters + 30)\n }, [totalChapters])\n\n const poll = useCallback(async () => {\n try {\n const s = await api.runStatus()\n setRun(s)\n } catch { /* 静默 */ }\n }, [api])\n\n // 运行期间每 5 秒轮询一次状态。\n useEffect(() => {\n void poll()\n const timer = window.setInterval(() => { void poll() }, 5000)\n return () => window.clearInterval(timer)\n }, [poll])\n\n // 日志自动滚底。\n useEffect(() => {\n logRef.current?.scrollTo({ top: logRef.current.scrollHeight })\n }, [run?.log.length])\n\n const effectiveEnd = mode === 'count' ? startNo + count - 1 : endNo\n\n const handleStart = async (): Promise<void> => {\n setBusy(true)\n setErr('')\n try {\n const req = mode === 'count'\n ? { startNo, count }\n : { startNo, endNo }\n const s = await api.runStart(req)\n setRun(s)\n } catch (e) {\n setErr((e as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n const handleControl = async (action: 'pause' | 'resume' | 'stop'): Promise<void> => {\n setBusy(true)\n setErr('')\n try {\n const s = await api.runControl(action)\n if (s !== null) setRun(s)\n } catch (e) {\n setErr((e as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n const statusLabel = useMemo(() => {\n if (run === null) return '未启动'\n return {\n running: '🏭 生产中',\n paused: '⏸ 已暂停',\n done: '✅ 已完成',\n stopped: '⏹ 已停止',\n error: '❌ 异常',\n }[run.status] ?? run.status\n }, [run])\n\n const ratio = run !== null && run.endNo > run.startNo\n ? Math.min(Math.max((run.currentNo - run.startNo) / (run.endNo - run.startNo), 0), 1)\n : 0\n\n return (\n <div className={css.card} style={{ flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column', gap: 10 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>🏭 生产单(标准流水线:计划 → 生成 → 审稿 → 分级处理)</span>\n <span className={`${css.badge} ${run?.status === 'running' ? css.badgeWritten : run?.status === 'done' ? css.badgeDone : css.badgePending}`}>{statusLabel}</span>\n </div>\n\n <div className={css.meta}>\n 一键下生产单:自动补计划 → 逐章生成(完整质量门:生成→摘要+事实→审稿→作者复盘)→ 被拒章分级处理(无 high 豁免 / 有 high 按意见修订+验证 / 两轮不过转待人工)。中断后可从断点继续。\n </div>\n\n {/* 下单区 */}\n <div className={css.row} style={{ flexWrap: 'wrap', gap: 8, alignItems: 'flex-end' }}>\n <div style={{ display: 'flex', gap: 4, alignItems: 'center' }}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${mode === 'count' ? css.buttonPrimary : ''}`}\n onClick={() => { setMode('count') }}\n title=\"从当前末章 +1 起,新增 N 章\"\n >\n 新增 N 章\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${mode === 'range' ? css.buttonPrimary : ''}`}\n onClick={() => { setMode('range') }}\n title=\"指定起止章号区间\"\n >\n 指定区间\n </button>\n </div>\n {mode === 'count' ? (\n <>\n <div className={css.field} style={{ flex: 'none', minWidth: 90 }}>\n <label className={css.fieldLabel}>起始章</label>\n <input className={css.input} type=\"number\" min={1} value={startNo} onChange={e => { setStartNo(Math.max(1, Number(e.target.value) || 1)) }} />\n </div>\n <div className={css.field} style={{ flex: 'none', minWidth: 90 }}>\n <label className={css.fieldLabel}>新增章数</label>\n <input className={css.input} type=\"number\" min={1} max={200} value={count} onChange={e => { setCount(Math.max(1, Math.min(200, Number(e.target.value) || 1))) }} />\n </div>\n </>\n ) : (\n <>\n <div className={css.field} style={{ flex: 'none', minWidth: 90 }}>\n <label className={css.fieldLabel}>起始章</label>\n <input className={css.input} type=\"number\" min={1} value={startNo} onChange={e => { setStartNo(Math.max(1, Number(e.target.value) || 1)) }} />\n </div>\n <div className={css.field} style={{ flex: 'none', minWidth: 90 }}>\n <label className={css.fieldLabel}>结束章</label>\n <input className={css.input} type=\"number\" min={1} value={endNo} onChange={e => { setEndNo(Math.max(1, Number(e.target.value) || 1)) }} />\n </div>\n </>\n )}\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy || (run?.status === 'running')} onClick={() => { void handleStart() }} title=\"启动生产单\">\n {run?.status === 'running' ? '生产中…' : run?.status === 'paused' ? '▶ 继续' : '▶ 下单生产'}\n </button>\n {run !== null && run.status !== 'done' && (\n <>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || run.status !== 'running'} onClick={() => { void handleControl('pause') }}>\n ⏸ 暂停\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || run.status === 'stopped'} onClick={() => { void handleControl('stop') }}>\n ⏹ 停止\n </button>\n </>\n )}\n {run !== null && run.status === 'paused' && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleControl('resume') }}>\n ▶ 继续\n </button>\n )}\n </div>\n\n {err !== '' && <div style={{ color: 'var(--nf-error)', fontSize: 12 }}>{err}</div>}\n\n {/* 进度区 */}\n {run !== null && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n <div className={css.row} style={{ flexWrap: 'wrap', gap: 8 }}>\n <span className={css.meta}>范围:第 {run.startNo} - {run.endNo} 章 · 当前:第 {run.currentNo} 章</span>\n <span className={css.meta}>新生成 {run.stats.generated} · 修订通过 {run.stats.revised} · 豁免 {run.stats.exempted} · 重生成 {run.stats.regenerated} · 失败 {run.stats.error}</span>\n </div>\n <div className={css.bigProgressBar}>\n <div className={css.bigProgressBarFill} style={{ width: `${Math.round(ratio * 100)}%` }} />\n </div>\n {run.pendingManual.length > 0 && (\n <div className={css.meta} style={{ color: 'var(--nf-warn)' }}>\n ⚠️ 待人工:第 {run.pendingManual.join('、')} 章(两轮修订仍不过,保留草稿,可在章节列表处理)\n </div>\n )}\n {run.status === 'done' && <div className={css.meta} style={{ color: 'var(--nf-success)' }}>✅ 生产单完成:{run.startNo}-{run.endNo} 章处理完毕,待人工 {run.pendingManual.length} 章。</div>}\n {run.error !== undefined && <div className={css.meta} style={{ color: 'var(--nf-error)' }}>异常:{run.error}</div>}\n </div>\n )}\n\n {/* 日志区 */}\n <div className={css.meta} style={{ fontWeight: 600 }}>运行日志({run?.log.length ?? 0})</div>\n <div\n ref={logRef}\n style={{ flex: 1, minHeight: 120, overflowY: 'auto', border: '1px solid var(--nf-border)', borderRadius: 10, background: 'var(--nf-bg-inset)', padding: 8, display: 'flex', flexDirection: 'column', gap: 2, fontSize: 12 }}\n >\n {run === null || run.log.length === 0 ? (\n <span className={css.meta}>尚无日志——下单后这里会实时显示每章进度。</span>\n ) : run.log.map((l, i) => (\n <div key={i} style={{ display: 'flex', gap: 6, opacity: 0.85 }}>\n <span style={{ color: 'var(--nf-text-3)', flex: 'none' }}>{new Date(l.at).toLocaleTimeString('zh-CN', { hour12: false })}</span>\n <span>{l.text}</span>\n </div>\n ))}\n </div>\n </div>\n )\n}\n","// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n ], { type: 'text/javascript' }))));\n w.onmessage = function (e) {\n var d = e.data, ed = d.$e$;\n if (ed) {\n var err = new Error(ed[0]);\n err['code'] = ed[1];\n err.stack = ed[2];\n cb(err, null);\n }\n else\n cb(null, d);\n };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new i32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i) {\n if (cd[i])\n ++l[cd[i] - 1];\n }\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 1; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n UnexpectedEOF: 0,\n InvalidBlockType: 1,\n InvalidLengthLiteral: 2,\n InvalidDistance: 3,\n StreamFinished: 4,\n NoStreamHandler: 5,\n InvalidHeader: 6,\n NoCallback: 7,\n InvalidUTF8: 8,\n ExtraFieldTooLong: 9,\n InvalidDate: 10,\n FilenameTooLong: 11,\n StreamFinishing: 12,\n InvalidZipData: 13,\n UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n 'unexpected EOF',\n 'invalid block type',\n 'invalid length/literal',\n 'invalid distance',\n 'stream finished',\n 'no stream handler',\n , // determined by compression function\n 'no callback',\n 'invalid UTF-8 data',\n 'extra field too long',\n 'date not in range 1980-2099',\n 'filename too long',\n 'stream finishing',\n 'invalid zip data'\n // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n // source length dict length\n var sl = dat.length, dl = dict ? dict.length : 0;\n if (!sl || st.f && !st.l)\n return buf || new u8(0);\n var noBuf = !buf;\n // have to estimate size\n var resize = noBuf || st.i != 2;\n // no state\n var noSt = st.i;\n // Assumes roughly 33% compression ratio average\n if (noBuf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n err(0);\n break;\n }\n // ensure size\n if (resize)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8, st.f = final;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n err(1);\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17\n if (resize)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (!c)\n err(2);\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n if (!d)\n err(3);\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (resize)\n cbuf(bt + 131072);\n var end = bt + add;\n if (bt < dt) {\n var shift = dl - dt, dend = Math.min(dt, end);\n if (shift + bt < 0)\n err(3);\n for (; bt < dend; ++bt)\n buf[bt] = dict[shift + bt];\n }\n for (; bt < end; ++bt)\n buf[bt] = buf[bt - dt];\n }\n }\n st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n // don't reallocate for streams or user buffers\n return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return { t: et, l: 0 };\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return { t: v, l: 1 };\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n ++lcfreq[lclt[i] & 31];\n for (var i = 0; i < lcdt.length; ++i)\n ++lcfreq[lcdt[i] & 31];\n var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n var sym = syms[i];\n if (sym > 255) {\n var len = (sym >> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n var dst = sym & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[sym]), p += ll[sym];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n var s = st.z || dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var lst = st.l;\n var pos = (st.r || 0) & 7;\n if (lvl) {\n if (pos)\n w[0] = st.r >> 3;\n var opt = deo[lvl - 1];\n var n = opt >> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new i32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx blkpos\n var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n for (; i + 2 < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = i - dif + j & 32767;\n var pti = prev[ti];\n var cd = ti - pti & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += imod - pimod & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one int32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n for (i = Math.max(i, wi); i < s; ++i) {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n if (!lst) {\n st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n // shft(pos) now 1 less if pos & 7 != 0\n pos -= 7;\n st.h = head, st.p = prev, st.i = i, st.w = wi;\n }\n }\n else {\n for (var i = st.w || 0; i < s + lst; i += 65535) {\n // end\n var e = i + 65535;\n if (e >= s) {\n // write final block\n w[(pos / 8) | 0] = lst;\n e = s;\n }\n pos = wfblk(w, pos + 1, dat.subarray(i, e));\n }\n st.i = s;\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new Int32Array(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && -306674912) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Adler32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length | 0;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n if (!st) {\n st = { l: 1 };\n if (opt.dictionary) {\n var dict = opt.dictionary.subarray(-32768);\n var newDat = new u8(dict.length + dat.length);\n newDat.set(dict);\n newDat.set(dat, dict.length);\n dat = newDat;\n st.w = dict.length;\n }\n }\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k].buffer) {\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n fnStr = wcln(fns[i], fnStr, td_1);\n ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n }\n var td = mrg({}, ch[id].e);\n return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n out: o.size && new u8(o.size),\n dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) {\n if (ev.data[0]) {\n strm.push(ev.data[0], ev.data[1]);\n postMessage([ev.data[0].length]);\n }\n else\n strm.flush(ev.data[1]);\n };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else if (!Array.isArray(dat))\n ext(dat);\n else if (dat.length == 1) {\n strm.queuedSize -= dat[0];\n if (strm.ondrain)\n strm.ondrain(dat[0]);\n }\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.queuedSize = 0;\n strm.push = function (d, f) {\n if (!strm.ondata)\n err(5);\n if (t)\n strm.ondata(err(4, 0, 1), null, !!f);\n strm.queuedSize += d.length;\n // can fail for cross-realm Uint8Array, but ok - only a small performance penalty\n w.postMessage([d, t = f], d.buffer instanceof ArrayBuffer ? [d.buffer] : []);\n };\n strm.terminate = function () { w.terminate(); };\n if (flush) {\n strm.flush = function (sync) { w.postMessage([0, sync]); };\n }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\n// read 8 bytes\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n err(6, 'invalid gzip data');\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += (d[10] | d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n if (o.dictionary) {\n var h = adler();\n h.p(o.dictionary);\n wbytes(c, 2, h.d());\n }\n};\n// zlib start\nvar zls = function (d, dict) {\n if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n err(6, 'invalid zlib data');\n if ((d[1] >> 5 & 1) == +!dict)\n err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n // 98304 = 32768 (lookback) + 65536 (common chunk size)\n this.b = new u8(98304);\n if (this.o.dictionary) {\n var dict = this.o.dictionary.subarray(-32768);\n this.b.set(dict, 32768 - dict.length);\n this.s.i = 32768 - dict.length;\n }\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n var endLen = chunk.length + this.s.z;\n if (endLen > this.b.length) {\n if (endLen > 2 * this.b.length - 32768) {\n var newBuf = new u8(endLen & -32768);\n newBuf.set(this.b.subarray(0, this.s.z));\n this.b = newBuf;\n }\n var split = this.b.length - this.s.z;\n this.b.set(chunk.subarray(0, split), this.s.z);\n this.s.z = this.b.length;\n this.p(this.b, false);\n this.b.set(this.b.subarray(-32768));\n this.b.set(chunk.subarray(split), 32768);\n this.s.z = chunk.length - split + 32768;\n this.s.i = 32766, this.s.w = 32768;\n }\n else {\n this.b.set(chunk, this.s.z);\n this.s.z += chunk.length;\n }\n this.s.l = final & 1;\n if (this.s.z > this.s.w + 8191 || final) {\n this.p(this.b, final || false);\n this.s.w = this.s.i, this.s.i -= 2;\n }\n if (final) {\n // cleanup unneeded buffers/state to reduce memory usage\n this.s = this.o = {};\n this.b = et;\n }\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * deflated output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible. A separate DEFLATE stream may be concatenated\n * with the current output after a sync flush.\n */\n Deflate.prototype.flush = function (sync) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n this.p(this.b, false);\n this.s.w = this.s.i, this.s.i -= 2;\n // could technically skip writing the type-0 block for (this.s.r & 7) == 0,\n // but the deterministic trailer (00 00 FF FF) is useful in some situations\n if (sync) {\n var c = new u8(6);\n c[0] = this.s.r >> 3;\n // write empty, non-final type-0 block\n var ep = wfblk(c, this.s.r, et);\n this.s.r = 0;\n this.ondata(c.subarray(0, ep >> 3), false);\n }\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6, 1);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n function Inflate(opts, cb) {\n // no StrmOpt here to avoid adding to workerizer\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n this.s = { i: 0, b: dict ? dict.length : 0 };\n this.o = new u8(32768);\n this.p = new u8(0);\n if (dict)\n this.o.set(dict);\n }\n Inflate.prototype.e = function (c) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n if (!this.p.length)\n this.p = c;\n else if (c.length) {\n var n = new u8(this.p.length + c.length);\n n.set(this.p), n.set(c, this.p.length), this.p = n;\n }\n };\n Inflate.prototype.c = function (final) {\n this.s.i = +(this.d = final || false);\n var bts = this.s.b;\n var dt = inflt(this.p, this.s, this.o);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n function AsyncInflate(opts, cb) {\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Inflate(ev.data);\n onmessage = astrm(strm);\n }, 7, 0);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\nexport function inflateSync(data, opts) {\n return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n this.l += chunk.length;\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * GZIPped output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Gzip.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8, 1);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n function Gunzip(opts, cb) {\n this.v = 1;\n this.r = 0;\n Inflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n this.r += chunk.length;\n if (this.v) {\n var p = this.p.subarray(this.v - 1);\n var s = p.length > 3 ? gzs(p) : 4;\n if (s > p.length) {\n if (!final)\n return;\n }\n else if (this.v > 1 && this.onmember) {\n this.onmember(this.r - p.length);\n }\n this.p = p.subarray(s), this.v = 0;\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, 0);\n // process concatenated GZIP\n if (this.s.f && !this.s.l) {\n this.v = shft(this.s.p) + 9;\n this.s = { i: 0 };\n this.o = new u8(0);\n this.push(new u8(0), final);\n }\n else if (final) {\n Inflate.prototype.c.call(this, final);\n }\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n function AsyncGunzip(opts, cb) {\n var _this = this;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gunzip(ev.data);\n strm.onmember = function (offset) { return postMessage(offset); };\n onmessage = astrm(strm);\n }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\nexport function gunzipSync(data, opts) {\n var st = gzs(data);\n if (st + 8 > data.length)\n err(6, 'invalid gzip data');\n return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * zlibbed output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Zlib.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10, 1);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n function Unzlib(opts, cb) {\n Inflate.call(this, opts, cb);\n this.v = opts && opts.dictionary ? 2 : 1;\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 6 && !final)\n return;\n this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n err(6, 'invalid zlib data');\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n function AsyncUnzlib(opts, cb) {\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Unzlib(ev.data);\n onmessage = astrm(strm);\n }, 11, 0);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\nexport function unzlibSync(data, opts) {\n return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n function Decompress(opts, cb) {\n this.o = StrmOpt.call(this, opts, cb) || {};\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n }\n // init substream\n // overriden by AsyncDecompress\n Decompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (dat, final) {\n _this.ondata(dat, final);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(this.o)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(this.o)\n : new this.Z(this.o);\n this.i();\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n function AsyncDecompress(opts, cb) {\n Decompress.call(this, opts, cb);\n this.queuedSize = 0;\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n }\n AsyncDecompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (err, dat, final) {\n _this.ondata(err, dat, final);\n };\n this.s.ondrain = function (size) {\n _this.queuedSize -= size;\n if (_this.ondrain)\n _this.ondrain(size);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n this.queuedSize += chunk.length;\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, opts)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, opts)\n : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k, op = o;\n if (Array.isArray(val))\n op = mrg(o, val[1]), val = val[0];\n if (ArrayBuffer.isView(val))\n t[n] = [val, op];\n else {\n t[n += '/'] = [new u8(0), op];\n fltn(val, n, t, o);\n }\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return { s: r, r: slc(d, i - 1) };\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n err(8);\n this.t = null;\n }\n return;\n }\n if (!this.p)\n err(4);\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (final) {\n if (r.length)\n err(8);\n this.p = null;\n }\n else\n this.p = r;\n this.ondata(s, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td) {\n return td.decode(dat);\n }\n else {\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (r.length)\n err(8);\n return s;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), efl = b2(d, b + 30), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl;\n var _a = z64hs(d, es, efl, z, b4(d, b + 20), b4(d, b + 24), b4(d, b + 42)), sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + efl + b2(d, b + 32), off];\n};\n// read zip64 header sizes\nvar z64hs = function (d, b, l, z, sc, su, off) {\n var nsc = sc == 4294967295, nsu = su == 4294967295, noff = off == 4294967295, e = b + l;\n var nf = nsc + nsu + noff;\n if (z && nf) {\n for (; b + 4 < e; b += 4 + b2(d, b + 2)) {\n if (b2(d, b) == 1) {\n return [\n nsc ? b8(d, b + 4 + 8 * nsu) : sc,\n nsu ? b8(d, b + 4) : su,\n noff ? b8(d, b + 4 + 8 * (nsu + nsc)) : off,\n 1\n ];\n }\n }\n // z == 2 for unknown whether or not zip64\n if (z < 2)\n err(13);\n }\n return [sc, su, off, 0];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n err(9);\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n err(10);\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n if (c != -1) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n // we shouldn't really do this cast, but properly handling ArrayBufferLike\n // makes the API unergonomic with Buffer\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this = this;\n if (!this.ondata)\n err(5);\n // finishing or finished\n if (this.d & 2)\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n else {\n var f = strToU8(file.filename), fl_1 = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n var hl_1 = fl_1 + exfl(file.extra) + 30;\n if (fl_1 > 65535)\n this.ondata(err(11, 0, 1), null, false);\n var header = new u8(hl_1);\n wzh(header, 0, file, f, u, -1);\n var chks_1 = [header];\n var pAll_1 = function () {\n for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n var chk = chks_2[_i];\n _this.ondata(null, chk, false);\n }\n chks_1 = [];\n };\n var tr_1 = this.d;\n this.d = 0;\n var ind_1 = this.u.length;\n var uf_1 = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll_1();\n if (tr_1) {\n var nxt = _this.u[ind_1 + 1];\n if (nxt)\n nxt.r();\n else\n _this.d = 1;\n }\n tr_1 = 1;\n }\n });\n var cl_1 = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this.ondata(err, dat, final);\n _this.terminate();\n }\n else {\n cl_1 += dat.length;\n chks_1.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl_1);\n wbytes(dd, 12, file.size);\n chks_1.push(dd);\n uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n if (tr_1)\n uf_1.r();\n tr_1 = 1;\n }\n else if (tr_1)\n pAll_1();\n }\n };\n this.u.push(uf_1);\n }\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this = this;\n if (this.d & 2) {\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n return;\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this.d & 1))\n return;\n _this.u.splice(-1, 1);\n _this.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cbd(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cbd(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl(err(11, 0, 1), null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n err(11);\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (chunk, final) {\n // same as ZipPassThrough: cast to retain Buffer ergonomics\n this.ondata(null, chunk, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this = this;\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (chunk, final) {\n try {\n this.i.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (chunk, final) {\n if (this.i.terminate)\n chunk = slc(chunk, 0);\n this.i.push(chunk, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this = this;\n if (!this.onfile)\n err(5);\n if (!this.p)\n err(4);\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_3 = [];\n this_1.k.unshift(chks_3);\n f = 2;\n var lsc = b4(buf, i + 18), lsu = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n var _a = z64hs(buf, i, es, 2, lsc, lsu, 0), sc_1 = _a[0], su_1 = _a[1], z64 = _a[3];\n if (dd)\n sc_1 = -1 - z64;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n err(5);\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this.o[cmp_1];\n if (!ctr)\n file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n var dat = chks_4[_i];\n d_1.push(dat, false);\n }\n if (_this.k[0] == chks_3 && _this.c)\n _this.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n err(13);\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (lft) {\n var c = lft;\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = lft = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n if (d)\n files[fn] = d;\n if (!--lft)\n cbd(null, files);\n }\n };\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_1\n })) {\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n // Synchronously decompress under 512KB, or barely-compressed data\n if (su < 524288 || sc > 0.8 * su) {\n try {\n cbl(null, inflateSync(infl, { out: new u8(su) }));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n }\n else\n cbl(null, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n }\n else\n cbd(null, {});\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n err(13);\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_2\n })) {\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n else\n err(14, 'unknown compression type ' + c_2);\n }\n }\n return files;\n}\n","/**\n * Browser-side docx outline extraction: a .docx is a zip whose\n * word/document.xml holds the body text in <w:t> runs inside <w:p> paragraphs.\n * Uses fflate (inlined into the client bundle) so the user can pick or drag a\n * docx without any server upload.\n *\n * Import from 'fflate/browser' (not 'fflate'): the default entry resolves to\n * the Node build (esm/index.mjs), which calls module.createRequire() for the\n * optional worker_threads path — inlining that into the browser bundle leaves\n * a bare require(\"module\") the client-modules table cannot answer.\n */\n\nimport { unzipSync, strFromU8 } from 'fflate/browser'\n\n/** Decode the handful of XML entities docx bodies actually use. */\nfunction decodeEntities(text: string): string {\n return text\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/&amp;/g, '&')\n .replace(/&nbsp;/g, ' ')\n}\n\n/** Extract plain text from a docx buffer: one line per <w:p> paragraph. */\nexport function extractDocxTextFromBuffer(buffer: ArrayBuffer | Uint8Array): string {\n const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer)\n let files: ReturnType<typeof unzipSync>\n try {\n files = unzipSync(bytes)\n } catch (error) {\n throw new Error(`不是有效的 docx(zip 解压失败):${(error as Error).message}`)\n }\n const document = files['word/document.xml']\n if (document === undefined) {\n throw new Error('不是有效的 docx(缺少 word/document.xml)')\n }\n const xml = strFromU8(document)\n\n const paragraphs: string[] = []\n const parts = xml.split(/<w:p\\b[^>]*>/)\n for (let i = 1; i < parts.length; i++) {\n const segment = parts[i]!\n const runs: string[] = []\n const runRe = /<w:t(?:\\s[^>]*)?>([\\s\\S]*?)<\\/w:t>|<w:tab\\b[^>]*\\/>|<w:br\\b[^>]*\\/>/g\n for (const match of segment.matchAll(runRe)) {\n if (match[0].startsWith('<w:tab')) {\n runs.push('\\t')\n } else if (match[0].startsWith('<w:br')) {\n runs.push('\\n')\n } else {\n runs.push(decodeEntities(match[1] ?? ''))\n }\n }\n paragraphs.push(runs.join('').replace(/\\u00a0/g, ' ').trimEnd())\n }\n\n const text = paragraphs.join('\\n').replace(/\\n{3,}/g, '\\n\\n').trim()\n if (text.length === 0) {\n throw new Error('docx 中没有可提取的文本')\n }\n return text\n}\n\n/** Read a File as ArrayBuffer. */\nexport function readFileAsArrayBuffer(file: File): Promise<ArrayBuffer> {\n return file.arrayBuffer()\n}\n","/**\n * 开书向导:独立页面视图 —— 书名 + 大纲(选择 docx / 拖拽 / 粘贴),\n * 实时书名识别与题材提示,开书即建项目并进入工作台。\n * 另含「想法 → AI 大纲」:输入一句话想法生成 2-3 个方案,可暂留换批,选中后回填大纲框。\n */\nimport { useRef, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport type { OutlineCandidate } from '../../protocol.ts'\nimport { extractDocxTextFromBuffer } from '../docx.ts'\nimport css from './panel.module.css'\n\n/** 从大纲首行推断书名(与服务端 inferBookName 一致,供实时预览)。 */\nfunction inferBookNamePreview(outline: string): string {\n const line = outline.split('\\n').map(l => l.trim()).find(l => l.length > 0)\n if (line === undefined) return ''\n return line.replace(/^《/, '').replace(/》.*$/, '').slice(0, 40)\n}\n\n/** 简单题材识别(提示用)。 */\nfunction guessGenre(outline: string): string | null {\n const map: Array<[string, string[]]> = [\n ['仙侠修真', ['仙', '修', '灵根', '元婴', '宗门', '飞升']],\n ['都市', ['都市', '公司', '外卖', '职场', '总裁']],\n ['玄幻', ['斗气', '魂力', '大陆', '斗罗', '神']],\n ['悬疑', ['悬疑', '密室', '案件', '推理', '凶']],\n ['科幻', ['机甲', '星舰', 'AI', '未来', '星际']],\n ['历史', ['朝代', '皇帝', '将军', '古代', '王朝']],\n ['游戏', ['游戏', '副本', '装备', '等级', '职业']],\n ]\n for (const [genre, keywords] of map) {\n if (keywords.some(k => outline.includes(k))) return genre\n }\n return null\n}\n\n/** 开书向导页。 */\nexport function CreateBookView({\n api,\n onBack,\n onCreated,\n}: {\n api: NovelApi\n /** 返回书架。 */\n onBack: () => void\n /** 开书成功:进入新书工作台。 */\n onCreated: (id: string) => void\n}) {\n const [name, setName] = useState('')\n const [outlineText, setOutlineText] = useState('')\n const [outlineName, setOutlineName] = useState('')\n const [dragActive, setDragActive] = useState(false)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n const outlineFileRef = useRef<HTMLInputElement | null>(null)\n\n // ---- 想法 → AI 大纲状态 ----\n const [ideaOpen, setIdeaOpen] = useState(false)\n const [idea, setIdea] = useState('')\n const [suggesting, setSuggesting] = useState(false)\n const [candidates, setCandidates] = useState<OutlineCandidate[]>([])\n const [pinned, setPinned] = useState<string[]>([])\n /** 回填后提示(如「已填入方案A,可继续修改」)。 */\n const [fillNotice, setFillNotice] = useState('')\n\n const autoName = inferBookNamePreview(outlineText)\n const effectiveName = name.trim() !== '' ? name.trim() : autoName\n const genre = guessGenre(outlineText)\n\n const handlePickOutlineFile = async (file: File | undefined): Promise<void> => {\n if (file === undefined) return\n try {\n const buffer = await file.arrayBuffer()\n const text = extractDocxTextFromBuffer(buffer)\n if (text.length < 50) {\n setError('大纲内容过短(<50 字符),请检查文件')\n return\n }\n setOutlineText(text)\n setOutlineName(file.name)\n if (name.trim() === '') setName(inferBookNamePreview(text))\n setError('')\n } catch (err) {\n setError(`读取大纲失败:${(err as Error).message}`)\n }\n }\n\n /** 生成/换批:只补未暂留的空槽;exclude 传已暂留方案的卖点方向。 */\n const handleSuggest = async (): Promise<void> => {\n if (idea.trim().length < 10) {\n setError('想法太短(<10 字):至少写一句完整想法,如「男主穿越修仙界靠做菜无敌」')\n return\n }\n setSuggesting(true)\n setError('')\n try {\n const exclude = candidates\n .filter(c => pinned.includes(c.id))\n .map(c => `${c.bookName}:${c.sellingPoint}${c.genre !== '' ? `(${c.genre})` : ''}`)\n const count = Math.max(1, 3 - pinned.length)\n const result = await api.outlineSuggest(idea.trim(), count, exclude)\n // 换批合并:已暂留的原地保留,新生成的补充进空槽。\n setCandidates(prev => {\n const kept = prev.filter(c => pinned.includes(c.id))\n return [...kept, ...result.candidates].slice(0, 3)\n })\n setFillNotice('')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setSuggesting(false)\n }\n }\n\n /** 暂留/取消暂留。 */\n const togglePin = (id: string): void => {\n setPinned(prev => prev.includes(id) ? prev.filter(x => x !== id) : [...prev, id])\n }\n\n /** 选中方案:回填大纲框 + 书名,滚动到上方。 */\n const handlePick = (candidate: OutlineCandidate): void => {\n setOutlineText(candidate.outline)\n setName(candidate.bookName)\n setFillNotice(`已填入方案《${candidate.bookName}》(${candidate.genre}),可继续修改后开书`)\n setIdeaOpen(false)\n window.scrollTo({ top: 0, behavior: 'smooth' })\n }\n\n const handleCreate = async (): Promise<void> => {\n if (effectiveName === '') {\n setError('请填写书名,或提供大纲自动识别')\n return\n }\n setBusy(true)\n setError('')\n try {\n const snapshot = await api.bookCreate(effectiveName, undefined, outlineText.trim() !== '' ? outlineText.trim() : undefined)\n const created = snapshot.books.find(b => b.id === snapshot.activeBookId)\n if (created !== undefined) {\n onCreated(created.id)\n } else {\n setError('开书失败:未找到新书')\n }\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <div className={css.createBookView}>\n <div className={css.createBookTop}>\n <button type=\"button\" className={css.iconButton} title=\"返回书架\" aria-label=\"返回书架\" onClick={onBack}>\n ← 书架\n </button>\n </div>\n\n <div className={css.createBookCard}>\n <span className={css.createBookIcon}>✒️</span>\n <h2 className={css.createBookTitle}>开书向导</h2>\n <span className={css.meta}>把一份大纲「编译」成一本完整的小说</span>\n\n {error !== '' && (\n <div className={css.card} style={{ borderColor: 'var(--nf-error)', padding: '8px 12px' }}>\n <span style={{ color: 'var(--nf-error)', fontSize: 12 }}>{error}</span>\n </div>\n )}\n\n {fillNotice !== '' && (\n <div className={css.card} style={{ borderColor: 'var(--nf-success)', padding: '8px 12px' }}>\n <span style={{ color: 'var(--nf-success)', fontSize: 12 }}>✅ {fillNotice}</span>\n </div>\n )}\n\n <div className={css.field}>\n <label className={css.fieldLabel}>书名</label>\n <input\n className={css.input}\n placeholder={autoName !== '' ? `自动识别:${autoName}` : '输入书名(提供大纲后自动识别)'}\n value={name}\n onChange={e => { setName(e.target.value) }}\n onKeyDown={e => { if (e.key === 'Enter') void handleCreate() }}\n autoFocus\n />\n </div>\n\n <div className={css.field}>\n <label className={css.fieldLabel}>大纲</label>\n <div\n className={`${css.dropzone} ${dragActive ? css.dropzoneActive : ''}`}\n onClick={() => { outlineFileRef.current?.click() }}\n onDragOver={e => { e.preventDefault(); setDragActive(true) }}\n onDragLeave={() => { setDragActive(false) }}\n onDrop={e => {\n e.preventDefault()\n setDragActive(false)\n void handlePickOutlineFile(e.dataTransfer.files?.[0])\n }}\n >\n <span className={css.dropzoneIcon}>📄</span>\n <span>{outlineName !== '' ? `已选择:${outlineName}` : '点击选择 docx 大纲,或将文件拖到这里'}</span>\n <span className={css.meta}>推荐提供大纲:开书即建立项目,书名自动识别</span>\n <input\n ref={outlineFileRef}\n type=\"file\"\n accept=\".docx,application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n style={{ display: 'none' }}\n onChange={e => {\n void handlePickOutlineFile(e.target.files?.[0])\n e.target.value = ''\n }}\n />\n </div>\n <textarea\n className={css.textarea}\n style={{ minHeight: 130 }}\n placeholder=\"或直接粘贴大纲文本(50 字以上)…\"\n value={outlineText}\n onChange={e => { setOutlineText(e.target.value) }}\n spellCheck={false}\n />\n </div>\n\n {(outlineText.trim().length > 0 || effectiveName !== '') && (\n <div className={css.row} style={{ flexWrap: 'wrap' }}>\n {outlineText.trim().length > 0 && <span className={css.meta}>大纲 {outlineText.length} 字</span>}\n {effectiveName !== '' && <span className={css.meta}>书名:{effectiveName}</span>}\n {genre !== null && <span className={css.meta}>题材:{genre}</span>}\n </div>\n )}\n\n {/* 想法 → AI 大纲(可折叠) */}\n <div className={css.ideaCard}>\n <button\n type=\"button\"\n className={css.ideaToggle}\n onClick={() => { setIdeaOpen(v => !v) }}\n aria-expanded={ideaOpen}\n >\n ✨ {ideaOpen ? '▾' : '▸'} 没有大纲?用一句话想法让 AI 生成\n </button>\n {ideaOpen && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n <textarea\n className={css.textarea}\n style={{ minHeight: 60 }}\n placeholder=\"例如:现代外卖员被雷劈穿越到修仙世界,靠祖传古玉捡漏发育,苟着苟着成了大佬…(≥50 字)\"\n value={idea}\n onChange={e => { setIdea(e.target.value) }}\n spellCheck={false}\n />\n <div className={css.row} style={{ flexWrap: 'wrap' }}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n disabled={suggesting || idea.trim().length < 10}\n onClick={() => { void handleSuggest() }}\n title=\"生成 3 个方向不同的大纲方案供选择(约消耗 6-8k token)\"\n >\n {suggesting ? '⏳ 生成中…' : candidates.length === 0 ? '✨ 生成大纲方案' : `↻ 换一批(${Math.max(1, 3 - pinned.length)} 个)`}\n </button>\n {candidates.length > 0 && (\n <span className={css.meta}>\n 已暂留 {pinned.length}/3 · 换批保留已暂留,只补新方案\n </span>\n )}\n </div>\n\n {/* 方案卡 */}\n {candidates.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {candidates.map(candidate => {\n const isPinned = pinned.includes(candidate.id)\n return (\n <div\n key={candidate.id}\n className={css.ideaCandidate}\n style={isPinned ? { borderColor: 'var(--nf-accent)', boxShadow: '0 0 0 2px var(--nf-accent-soft)' } : undefined}\n >\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap', gap: 6 }}>\n <span style={{ display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' }}>\n <b>《{candidate.bookName}》</b>\n {candidate.genre !== '' && <span className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)' }}>{candidate.genre}</span>}\n {isPinned && <span className={css.badge} style={{ borderColor: 'var(--nf-warn)', color: 'var(--nf-warn)' }}>★ 已暂留</span>}\n </span>\n <span style={{ display: 'flex', gap: 6 }}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${isPinned ? '' : css.buttonPrimary}`}\n onClick={() => { togglePin(candidate.id) }}\n title={isPinned ? '取消暂留:下次换批会覆盖此槽位' : '暂留此方案:换批时保留,继续对比新方案'}\n >\n {isPinned ? '★ 取消暂留' : '☆ 暂留'}\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n onClick={() => { handlePick(candidate) }}\n title=\"将这份大纲填入上方大纲框(可继续修改后开书)\"\n >\n 选这个\n </button>\n </span>\n </div>\n {candidate.sellingPoint !== '' && (\n <div className={css.meta}><b>卖点:</b>{candidate.sellingPoint}</div>\n )}\n <div\n className={css.meta}\n style={{\n display: '-webkit-box',\n WebkitLineClamp: 4,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n whiteSpace: 'pre-wrap',\n }}\n title={candidate.outline}\n >\n {candidate.outline}\n </div>\n </div>\n )\n })}\n {pinned.length >= 3 && (\n <span className={css.meta}>已暂留全部方案——直接挑一个「选这个」即可;换批需先取消某个暂留。</span>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonPrimary}`}\n style={{ width: '100%', padding: '10px 0', fontSize: 14 }}\n disabled={busy || effectiveName === ''}\n onClick={() => { void handleCreate() }}\n >\n ✨ 开书并进入工作台\n </button>\n <span className={css.meta} style={{ textAlign: 'center' }}>\n 未提供大纲也能开书,稍后可在大纲页导入\n </span>\n </div>\n </div>\n )\n}\n","/**\n * 大世界页签:境界体系 / 地理区域 / 势力分布 的结构化编辑 + AI 提炼。\n * 数据注入每章生成与审稿提示词(renderWorld),保证设定不写飞。\n */\nimport { useEffect, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport type { WorldFaction, WorldRealm, WorldRegion, WorldState } from '../../protocol.ts'\nimport css from './panel.module.css'\n\nconst EMPTY: WorldState = { realms: [], regions: [], factions: [] }\n\n/** 一个可编辑条目行。 */\nfunction EditableRow({\n name,\n detail,\n onName,\n onDetail,\n onRemove,\n namePlaceholder,\n detailPlaceholder,\n}: {\n name: string\n detail: string\n onName: (v: string) => void\n onDetail: (v: string) => void\n onRemove: () => void\n namePlaceholder: string\n detailPlaceholder: string\n}) {\n return (\n <div style={{ display: 'flex', gap: 6, alignItems: 'flex-start' }}>\n <input className={css.input} style={{ flex: 2, minWidth: 0 }} placeholder={namePlaceholder} value={name} onChange={e => { onName(e.target.value) }} />\n <input className={css.input} style={{ flex: 3, minWidth: 0 }} placeholder={detailPlaceholder} value={detail} onChange={e => { onDetail(e.target.value) }} />\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} title=\"删除\" onClick={onRemove}>×</button>\n </div>\n )\n}\n\n/** 大世界页签。 */\nexport function WorldTab({\n api,\n world,\n onChanged,\n}: {\n api: NovelApi\n /** 当前项目的大世界数据(可能为空)。 */\n world: WorldState | undefined\n /** 保存/提炼成功后由父组件刷新项目状态。 */\n onChanged: (world: WorldState) => void\n}) {\n const [draft, setDraft] = useState<WorldState>(() => world ?? EMPTY)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n\n // 外部数据变化时同步草稿(提炼/保存/切换书后)。\n useEffect(() => {\n setDraft(world ?? EMPTY)\n }, [world])\n\n const handleGenerate = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.world('generate')\n setDraft(result.world)\n onChanged(result.world)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n const handleSave = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.world('save', draft)\n onChanged(result.world)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n const setRealms = (realms: WorldRealm[]): void => setDraft(prev => ({ ...prev, realms }))\n const setRegions = (regions: WorldRegion[]): void => setDraft(prev => ({ ...prev, regions }))\n const setFactions = (factions: WorldFaction[]): void => setDraft(prev => ({ ...prev, factions }))\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n {error !== '' && <div className={css.card} style={{ borderColor: 'var(--nf-error)' }}><span style={{ color: 'var(--nf-error)' }}>{error}</span></div>}\n\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>大世界</span>\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleGenerate() }}>\n ✨ AI 提炼\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void handleSave() }}>\n 💾 保存\n </button>\n </div>\n </div>\n <span className={css.meta}>\n 境界体系按由低到高排序注入章节生成提示词,模型不得随意跳级或自创境界;区域与势力约束地理/势力设定。AI 提炼不满意可逐条编辑后保存。\n </span>\n </div>\n\n {/* 境界体系 */}\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>境界体系({draft.realms.length})</span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setRealms([...draft.realms, { name: '', description: '' }]) }}>\n + 新增境界\n </button>\n </div>\n {draft.realms.length === 0 ? (\n <span className={css.meta}>暂无境界体系 — 点击 ✨AI 提炼 或手动添加(由低到高)。</span>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {draft.realms.map((realm, i) => (\n <EditableRow\n key={i}\n name={realm.name}\n detail={realm.description}\n onName={v => { const next = [...draft.realms]; next[i] = { ...next[i]!, name: v }; setRealms(next) }}\n onDetail={v => { const next = [...draft.realms]; next[i] = { ...next[i]!, description: v }; setRealms(next) }}\n onRemove={() => { setRealms(draft.realms.filter((_, idx) => idx !== i)) }}\n namePlaceholder={`第 ${i + 1} 阶境界名`}\n detailPlaceholder=\"突破条件 / 寿命 / 标志…\"\n />\n ))}\n </div>\n )}\n </div>\n\n {/* 地理区域 */}\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>地理区域({draft.regions.length})</span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setRegions([...draft.regions, { name: '', description: '' }]) }}>\n + 新增区域\n </button>\n </div>\n {draft.regions.length === 0 ? (\n <span className={css.meta}>暂无地理区域 — 大陆 / 海域 / 秘境 / 遗迹…</span>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {draft.regions.map((region, i) => (\n <EditableRow\n key={i}\n name={region.name}\n detail={region.description}\n onName={v => { const next = [...draft.regions]; next[i] = { ...next[i]!, name: v }; setRegions(next) }}\n onDetail={v => { const next = [...draft.regions]; next[i] = { ...next[i]!, description: v }; setRegions(next) }}\n onRemove={() => { setRegions(draft.regions.filter((_, idx) => idx !== i)) }}\n namePlaceholder=\"区域名(如大荒 / 青云山脉)\"\n detailPlaceholder=\"描述…\"\n />\n ))}\n </div>\n )}\n </div>\n\n {/* 势力分布 */}\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>势力分布({draft.factions.length})</span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setFactions([...draft.factions, { name: '', kind: '宗门', description: '' }]) }}>\n + 新增势力\n </button>\n </div>\n {draft.factions.length === 0 ? (\n <span className={css.meta}>暂无势力 — 宗门 / 家族 / 王朝 / 组织…</span>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {draft.factions.map((faction, i) => (\n <EditableRow\n key={i}\n name={`${faction.name}(${faction.kind})`}\n detail={faction.description}\n onName={v => {\n const next = [...draft.factions]\n const match = /^(.*)((.*))$/.exec(v)\n next[i] = { ...next[i]!, name: (match?.[1] ?? v).trim(), kind: (match?.[2] ?? next[i]!.kind).trim() || '宗门' }\n setFactions(next)\n }}\n onDetail={v => { const next = [...draft.factions]; next[i] = { ...next[i]!, description: v }; setFactions(next) }}\n onRemove={() => { setFactions(draft.factions.filter((_, idx) => idx !== i)) }}\n namePlaceholder=\"势力名(类型)如:青云宗(宗门)\"\n detailPlaceholder=\"描述…\"\n />\n ))}\n </div>\n )}\n </div>\n </div>\n )\n}\n","/**\n * 纯展示组件(views):所有状态与事件处理器都留在 NovelPanel,\n * 这里只接收 props 渲染。便于单独维护与复用。\n */\nimport type { ReactElement } from 'react'\nimport type { AuditIssue, Plotline, PlotlineHealthReport, PlotlinePlan, RoleRecord, RoleStatusCard } from '../../protocol.ts'\nimport { tt, ROLE_LABELS, roleColor, kindLabel, plotlineStatusLabel, plotlineStatusColor } from './helpers.ts'\nimport css from './panel.module.css'\n\n/** 统计格:状态摘要条 / 资产健康通用。 */\nexport function StatCell(props: {\n label: string\n value: string\n detail: string\n /** 值颜色(可选)。 */\n valueColor?: string\n /** 值字号覆盖(如长文本用 13)。 */\n valueFontSize?: number\n /** detail 悬浮提示(可选)。 */\n detailTitle?: string\n}): ReactElement {\n return (\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>{props.label}</span>\n <span className={css.assetStatValue} style={{ color: props.valueColor, fontSize: props.valueFontSize }}>\n {props.value}\n </span>\n <span className={css.assetStatDetail} title={props.detailTitle}>{props.detail}</span>\n </div>\n )\n}\n\n/** 待办队列行。 */\nexport function TodoRow(props: {\n tone: 'danger' | 'warning' | 'info' | 'success'\n title: string\n description: string\n actionLabel: string\n disabled: boolean\n onAction: () => void\n}): ReactElement {\n return (\n <div className={`${css.todoItem} ${props.tone === 'danger' ? css.todoDanger : props.tone === 'warning' ? css.todoWarning : css.todoInfo}`}>\n <span className={css.todoText}>\n {props.title}\n {props.description !== '' && <span className={css.meta}> — {props.description}</span>}\n </span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={props.disabled} onClick={props.onAction}>\n {props.actionLabel}\n </button>\n </div>\n )\n}\n\n/** 全书质检问题行。 */\nexport function AuditIssueRow(props: {\n issue: AuditIssue\n disabled: boolean\n onFix: () => void\n}): ReactElement {\n const { issue } = props\n return (\n <div className={`${css.todoItem} ${issue.severity === 'high' ? css.todoDanger : issue.severity === 'medium' ? css.todoWarning : css.todoInfo}`}>\n <span className={css.todoText}>\n <span>\n {issue.chapterNo > 0 ? `第 ${issue.chapterNo} 章` : '未定位章节'} · [{issue.severity}] {issue.item}\n </span>\n {issue.suggestion !== '' && <span className={css.meta}>建议:{issue.suggestion}</span>}\n </span>\n {issue.chapterNo > 0 && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={props.disabled} onClick={props.onFix}>\n 去修订\n </button>\n )}\n </div>\n )\n}\n\n/** 剧情线卡片(列表主体)。 */\nexport function PlotlineCard(props: {\n line: Plotline\n disabled: boolean\n onRefresh: () => void\n onEdit: () => void\n onRemove: () => void\n}): ReactElement {\n const { line } = props\n return (\n <div key={line.id} style={{ border: '1px solid var(--nf-border)', borderRadius: 10, padding: '8px 12px', fontSize: 12, display: 'flex', flexDirection: 'column', gap: 4 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span style={{ display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>\n <b>{line.name}</b>\n <span className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)' }}>{kindLabel(line.kind)}</span>\n <span className={css.badge} style={{ borderColor: plotlineStatusColor(line.status), color: plotlineStatusColor(line.status) }}>{plotlineStatusLabel(line.status)}</span>\n </span>\n <span style={{ display: 'flex', gap: 6 }}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={props.disabled}\n onClick={props.onRefresh}\n title=\"AI 结合编年录与章节摘要,自动更新这条线的当前进度\"\n >\n ↻ AI 刷新进度\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={props.disabled} onClick={props.onEdit}>\n {tt('plotlines.edit')}\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={props.disabled} onClick={props.onRemove}>\n {tt('plotlines.remove')}\n </button>\n </span>\n </div>\n {line.goal !== '' && <div className={css.meta}><b>{tt('plotlines.goal')}:</b>{line.goal}</div>}\n {line.progress !== '' && <div className={css.meta}><b>{tt('plotlines.progress')}:</b>{line.progress}</div>}\n <div className={css.meta}>\n {tt('plotlines.chapters')}:{line.chapters.length > 0 ? line.chapters.map(n => `第${n}章`).join('、') : '—'}\n </div>\n </div>\n )\n}\n\n/** AI 候选角色行(提炼结果,可采纳/修改后采纳)。 */\nexport function RoleCandidateRow(props: {\n candidate: RoleRecord\n disabled: boolean\n onAdopt: () => void\n onEdit: () => void\n}): ReactElement {\n const { candidate: r } = props\n const label = ROLE_LABELS[r.roleLabel] ?? r.roleLabel\n const color = roleColor(r.roleLabel)\n return (\n <div key={r.name} style={{ border: '1px solid var(--nf-border)', borderRadius: 8, padding: '6px 10px', fontSize: 12 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span style={{ display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>\n <b>{r.name}</b>\n <span className={css.badge} style={{ borderColor: color, color }}>{label}</span>\n {r.identity !== '' && <span className={css.meta}>{r.identity}</span>}\n </span>\n <span style={{ display: 'flex', gap: 6 }}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={props.disabled} onClick={props.onAdopt}>\n + 采纳\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={props.disabled} onClick={props.onEdit} title=\"修改后再采纳(候选列表保留)\">\n ✏️ 修改后采纳\n </button>\n </span>\n </div>\n {r.goals !== '' && <div className={css.meta}>目标:{r.goals}</div>}\n {r.relations.length > 0 && <div className={css.meta}>关系:{r.relations.join('、')}</div>}\n </div>\n )\n}\n\n/** 已收录角色卡(含从编年录刷新的当前状态行)。 */\nexport function RoleCard(props: {\n role: RoleRecord\n status?: RoleStatusCard\n disabled: boolean\n onEdit: () => void\n onRemove: () => void\n}): ReactElement {\n const { role: r, status: st } = props\n const label = ROLE_LABELS[r.roleLabel] ?? r.roleLabel\n const color = roleColor(r.roleLabel)\n return (\n <div key={r.name} style={{ border: '1px solid var(--nf-border)', borderRadius: 8, padding: '6px 10px', fontSize: 12 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span style={{ display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>\n <b>{r.name}</b>\n <span className={css.badge} style={{ borderColor: color, color }}>{label}</span>\n {r.identity !== '' && <span className={css.meta}>{r.identity}</span>}\n </span>\n <span style={{ display: 'flex', gap: 6 }}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={props.disabled} onClick={props.onEdit}>编辑</button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={props.disabled} onClick={props.onRemove}>删除</button>\n </span>\n </div>\n {r.goals !== '' && <div className={css.meta}>目标:{r.goals}</div>}\n {st !== undefined && (\n <div className={css.meta} style={{ color: 'var(--nf-accent)' }}>\n <b>当前状态:</b>{st.status !== '' ? st.status : '(编年录暂无该角色记录)'}\n {' · 出场 '}{st.appearances} 次 · 最近 第 {st.lastChapter} 章\n </div>\n )}\n {r.relations.length > 0 && <div className={css.meta}>关系:{r.relations.join('、')}</div>}\n {r.arc.length > 0 && <div className={css.meta}>成长线:{r.arc.join(' → ')}</div>}\n {r.knowledge.length > 0 && <div className={css.meta}>知情度:{r.knowledge.join(';')}</div>}\n </div>\n )\n}\n\n/** 🩺 剧情健康检查报告面板。 */\nexport function PlotlineHealthPanel(props: {\n report: PlotlineHealthReport\n disabled: boolean\n onPlan: () => void\n onClose: () => void\n}): ReactElement {\n const { report } = props\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, border: '1px solid var(--nf-info)', borderRadius: 12, padding: 10 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <b>🩺 剧情健康检查</b>\n <span style={{ display: 'flex', gap: 8 }}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={props.disabled}\n onClick={props.onPlan}\n title=\"基于本次诊断生成下一阶段剧情方案\"\n >\n ✨ 基于此设计方案\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={props.onClose}>收起</button>\n </span>\n </div>\n <div style={{ fontSize: 12, fontWeight: 700, color: 'var(--nf-accent)' }}>判定:{report.verdict}</div>\n {report.timing !== '' && <div className={css.meta}><b>建议时机:</b>{report.timing}</div>}\n {report.reasons.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2, fontSize: 12 }}>\n {report.reasons.map((r, i) => <div key={i} className={css.meta}>· {r}</div>)}\n </div>\n )}\n {report.lines.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, fontSize: 12 }}>\n {report.lines.map((l, i) => {\n const color = l.health === 'ok' ? 'var(--nf-success)' : l.health === 'warning' ? 'var(--nf-warn)' : 'var(--nf-error)'\n const label = l.health === 'ok' ? '健康' : l.health === 'warning' ? '预警' : '搁置过久'\n return (\n <div key={i} style={{ display: 'flex', gap: 8, alignItems: 'flex-start' }}>\n <span className={css.badge} style={{ borderColor: color, color, flex: 'none', marginTop: 1 }}>{label}</span>\n <span className={css.meta}><b>{l.name}</b>:{l.note}</span>\n </div>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\n/** ✨ AI 剧情方案面板。 */\nexport function PlotlinePlanPanel(props: {\n plan: PlotlinePlan\n disabled: boolean\n onAdopt: (suggestion: Plotline) => void\n onClose: () => void\n}): ReactElement {\n const { plan } = props\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, border: '1px solid var(--nf-accent)', borderRadius: 12, padding: 10 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <b>✨ AI 剧情方案</b>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={props.onClose}>收起</button>\n </div>\n {plan.direction !== '' && (\n <div className={css.meta} style={{ fontSize: 12 }}><b>下一阶段方向:</b>{plan.direction}</div>\n )}\n {plan.suggestions.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, fontSize: 12 }}>\n {plan.suggestions.map((s, i) => (\n <div key={i} style={{ border: '1px solid var(--nf-border)', borderRadius: 8, padding: '6px 10px' }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span style={{ display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>\n <b>{s.name}</b>\n <span className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)' }}>{kindLabel(s.kind)}</span>\n </span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={props.disabled} onClick={() => { props.onAdopt(s) }}>\n + 采纳\n </button>\n </div>\n {s.goal !== '' && <div className={css.meta}>{s.goal}</div>}\n {s.progress !== '' && <div className={css.meta}>初始进度:{s.progress}</div>}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/** ✨ AI 建议剧情线面板。 */\nexport function PlotlineSuggestionPanel(props: {\n suggestions: Plotline[]\n disabled: boolean\n onAdopt: (suggestion: Plotline) => void\n onClose: () => void\n}): ReactElement {\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, border: '1px solid var(--nf-info)', borderRadius: 12, padding: 10 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <b>✨ AI 建议({props.suggestions.length} 条)</b>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={props.onClose}>收起</button>\n </div>\n {props.suggestions.length === 0 && <span className={css.meta}>没有候选线。</span>}\n {props.suggestions.map((s, i) => (\n <div key={i} style={{ border: '1px solid var(--nf-border)', borderRadius: 8, padding: '6px 10px', fontSize: 12 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span style={{ display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>\n <b>{s.name}</b>\n <span className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)' }}>{kindLabel(s.kind)}</span>\n </span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={props.disabled} onClick={() => { props.onAdopt(s) }}>\n + 采纳\n </button>\n </div>\n {s.goal !== '' && <div className={css.meta}>{s.goal}</div>}\n </div>\n ))}\n </div>\n )\n}\n","/**\n * The novel-forge workbench panel: tabs — 工作流 (guided pipeline), 大纲\n * (outline), 章节 (chapter plan + per-chapter write/review/rewrite/polish),\n * 设定库 (story bible), 伏笔 (foreshadows), 设置 (config). Generation and\n * review streams land in the progress console.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport type { ReactElement } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport type { PanelController } from './controller.ts'\nimport { tt } from './helpers.ts'\nimport { AssistantTab } from './AssistantTab.tsx'\nimport { AssetsTab } from './AssetsTab.tsx'\nimport { ShelfView } from './ShelfView.tsx'\nimport { ReaderView } from './ReaderView.tsx'\nimport { RunPanel } from './RunPanel.tsx'\nimport { CreateBookView } from './CreateBookView.tsx'\nimport { WorldTab } from './WorldTab.tsx'\nimport { AuditIssueRow, PlotlineCard, PlotlineHealthPanel, PlotlinePlanPanel, PlotlineSuggestionPanel, RoleCandidateRow, RoleCard, StatCell, TodoRow } from './views.tsx'\nimport { extractDocxTextFromBuffer } from '../docx.ts'\nimport type {\n AuditStatus,\n BookshelfSnapshot,\n ChapterPlan,\n Foreshadow,\n JobFrame,\n NovelConfig,\n Plotline,\n PlotlineHealthReport,\n PlotlinePlan,\n ProjectState,\n ReviewReport,\n RoleRecord,\n SensitiveHit,\n StoryBible,\n Volume,\n} from '../../protocol.ts'\nimport css from './panel.module.css'\n\n/** The panel's tab identifiers. */\nexport type NovelTab =\n | 'workflow' | 'overview' | 'blurb' | 'plan' | 'bible' | 'world' | 'foreshadow' | 'assistant' | 'settings'\n | 'characters' | 'roles' | 'facts' | 'plotlines' | 'reviews' | 'progress' | 'breakdown'\n | 'roleImage' | 'scenes'\n | 'assetsGenre' | 'assetsProgression' | 'assetsTemplates' | 'assetsRules' | 'assetsStyle' | 'run'\n | 'book' | 'assets'\n\n/** Panel shell props. */\nexport interface NovelPanelProps {\n /** The panel state owner (open/close/toggle). */\n controller: PanelController\n /** The API client every tab operates through. */\n api: NovelApi\n}\n\n/** One progress console line. */\ninterface ProgressLine {\n id: number\n text: string\n kind: 'info' | 'done' | 'error'\n /** Live line: a single in-place-updating row (generation counter + bar). */\n live?: boolean\n /** 0..1 completion ratio for the live line's progress bar. */\n ratio?: number\n}\n\n/** The navigation groups (AI-Novel-Writing-Assistant style grouping). */\nconst NAV_GROUPS: ReadonlyArray<{ id: string; label: string; items: ReadonlyArray<{ id: NovelTab; label: string; icon: string }> }> = [\n {\n id: 'create',\n label: '创作',\n items: [\n { id: 'workflow', label: tt('tab.workflow'), icon: '🛠️' },\n { id: 'overview', label: tt('tab.overview'), icon: '📄' },\n { id: 'blurb', label: '简介 / 封面', icon: '📖' },\n { id: 'plan', label: tt('tab.plan'), icon: '📚' },\n { id: 'plotlines', label: '长线管理', icon: '📜' },\n { id: 'book', label: '本书设定', icon: '📚' },\n ],\n },\n {\n id: 'tools',\n label: '工具',\n items: [\n { id: 'assistant', label: tt('tab.assistant'), icon: '💬' },\n { id: 'progress', label: '工作进度', icon: '📊' },\n { id: 'breakdown', label: '拆书分析', icon: '🔍' },\n { id: 'roleImage', label: '角色形象', icon: '🖼️' },\n { id: 'scenes', label: '场景库', icon: '🏞️' },\n { id: 'run', label: '生产单', icon: '🏭' },\n ],\n },\n {\n id: 'assets',\n label: '资产',\n items: [\n { id: 'assets', label: '创作资产', icon: '🧰' },\n ],\n },\n]\n\n/** Settings tab — pinned to the bottom of the nav rail. */\nconst SETTINGS_TAB: { id: NovelTab; label: string; icon: string } = { id: 'settings', label: tt('tab.settings'), icon: '⚙️' }\n\n/** Common DeepSeek model presets shown in settings; users can also type any model id. */\nconst MODEL_PRESETS = ['deepseek-v4-flash', 'deepseek-v4-pro', 'deepseek-chat', 'deepseek-reasoner'] as const\nconst REASONING_OPTIONS = ['off', 'low', 'high', 'max'] as const\n\n/** 构建时注入的插件版本(tsdown define 替换为字符串字面量)。 */\ndeclare const __NOVEL_FORGE_VERSION__: string | undefined\nconst PLUGIN_VERSION: string = typeof __NOVEL_FORGE_VERSION__ !== 'undefined' ? __NOVEL_FORGE_VERSION__ : '0.0.0'\n/** GitHub 仓库地址(关于区块点击跳转)。 */\nconst REPO_URL = 'https://github.com/watersxya/dsh-novel-forge'\n\n/** Whether any chapter is being generated right now. */\nfunction anyGenerating(chapters: ChapterPlan[] | undefined): boolean {\n return (chapters ?? []).some(c => c.status === 'generating' || c.status === 'reviewing')\n}\n\n/** Status badge class + label. */\nfunction statusBadge(chapter: ChapterPlan): { cls: string; label: string } {\n switch (chapter.status) {\n case 'pending': return { cls: css.badgePending, label: tt('plan.pending') }\n case 'generating': return { cls: css.badgeGenerating, label: tt('plan.generating') }\n case 'written': return { cls: css.badgeWritten, label: tt('plan.written') }\n case 'reviewing': return { cls: css.badgeGenerating, label: tt('plan.reviewing') }\n case 'approved': return { cls: css.badgeDone, label: tt('plan.approved') }\n case 'rejected': return { cls: css.badgeRejected, label: tt('plan.rejected') }\n case 'error': return { cls: css.badgeError, label: tt('plan.error') }\n }\n}\n\n/** One review issue line (severity-colored, theme-aware). */\nfunction severityColor(severity: string): string {\n return severity === 'high' ? 'var(--nf-error)' : severity === 'medium' ? 'var(--nf-warn)' : 'var(--nf-info)'\n}\n\n/** One row of a chapter-level diff (paragraph granularity). */\ntype DiffRow =\n | { kind: 'same'; text: string }\n | { kind: 'change'; old: string; neu: string }\n | { kind: 'del'; text: string }\n | { kind: 'add'; text: string }\n\n/**\n * Paragraph-level LCS diff between an original chapter body and its\n * rewrite/polish draft. Adjacent delete+add runs merge into \"change\" pairs\n * (the common case: a reworded paragraph shown as old → new).\n */\nfunction paragraphDiff(oldText: string, newText: string): DiffRow[] {\n const split = (t: string): string[] =>\n t.replace(/^#\\s+.*$/m, '').trim().split(/\\n{2,}/).map(p => p.trim()).filter(p => p !== '')\n const a = split(oldText)\n const b = split(newText)\n const n = a.length\n const m = b.length\n const dp: number[][] = Array.from({ length: n + 1 }, () => new Array<number>(m + 1).fill(0))\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n dp[i]![j] = a[i] === b[j] ? dp[i + 1]![j + 1]! + 1 : Math.max(dp[i + 1]![j]!, dp[i]![j + 1]!)\n }\n }\n const rows: DiffRow[] = []\n let i = 0\n let j = 0\n while (i < n || j < m) {\n if (i < n && j < m && a[i] === b[j]) {\n rows.push({ kind: 'same', text: a[i]! })\n i++\n j++\n } else if (i < n && (j >= m || dp[i + 1]![j]! >= dp[i]![j + 1]!)) {\n rows.push({ kind: 'del', text: a[i]! })\n i++\n } else if (j < m) {\n rows.push({ kind: 'add', text: b[j]! })\n j++\n } else if (i < n) {\n rows.push({ kind: 'del', text: a[i]! })\n i++\n } else {\n rows.push({ kind: 'add', text: b[j]! })\n j++\n }\n }\n // Merge adjacent del/add runs into change pairs.\n const merged: DiffRow[] = []\n let k = 0\n while (k < rows.length) {\n const row = rows[k]!\n if (row.kind !== 'del' && row.kind !== 'add') {\n merged.push(row)\n k++\n continue\n }\n const dels: string[] = []\n const adds: string[] = []\n while (k < rows.length && (rows[k]!.kind === 'del' || rows[k]!.kind === 'add')) {\n if (rows[k]!.kind === 'del') dels.push((rows[k] as { text: string }).text)\n else adds.push((rows[k] as { text: string }).text)\n k++\n }\n if (dels.length > 0 && adds.length > 0) {\n merged.push({ kind: 'change', old: dels.join('\\n\\n'), neu: adds.join('\\n\\n') })\n } else if (dels.length > 0) {\n for (const d of dels) merged.push({ kind: 'del', text: d })\n } else {\n for (const ad of adds) merged.push({ kind: 'add', text: ad })\n }\n }\n return merged\n}\n\n/** 把章节 beats 按结构标签渲染(本章目标/剧情要点/爽点/结尾钩子 等)。 */\nfunction renderBeats(beats: string): ReactElement {\n const lines = beats.split('\\n')\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n {lines.map((line, i) => {\n const trimmed = line.trim()\n const match = /^([^::]{2,14})[::]/.exec(trimmed)\n if (match !== null) {\n return (\n <div key={i}>\n <b style={{ color: 'var(--nf-accent)' }}>{match[1]}</b>\n {trimmed.slice(match[0].length)}\n </div>\n )\n }\n return <div key={i}>{line}</div>\n })}\n </div>\n )\n}\n\n/** The diff list of a draft-vs-original comparison (scrollable). */\nfunction DiffList({ original, draft, fontSize }: { original: string; draft: string; fontSize?: number }): ReactElement { const rows = useMemo(() => paragraphDiff(original, draft), [original, draft])\n const changed = rows.filter(r => r.kind === 'change').length\n const added = rows.filter(r => r.kind === 'add').length\n const removed = rows.filter(r => r.kind === 'del').length\n const [onlyChanges, setOnlyChanges] = useState(false)\n const shown = onlyChanges ? rows.filter(r => r.kind !== 'same') : rows\n return (\n <>\n <div className={css.diffLegend}>\n <span className={css.legendOld}>■ 原稿</span>\n <span className={css.legendNew}>■ 新稿</span>\n <span className={css.meta}>\n 原 {original.length} 字 → 新 {draft.length} 字 · 修改 {changed} · 新增 {added} · 删除 {removed}\n </span>\n <label className={css.onlyChanges}>\n <input\n type=\"checkbox\"\n checked={onlyChanges}\n onChange={e => { setOnlyChanges(e.target.checked) }}\n />\n 只看改动\n </label>\n </div>\n <div className={css.diffList} style={fontSize !== undefined ? { fontSize } : undefined}>\n {shown.map((row, idx) => {\n if (row.kind === 'same') {\n return (\n <details key={idx} className={css.diffSame}>\n <summary>第 {idx + 1} 段 · 未改动(点击展开)</summary>\n <div className={css.diffSameBody}>{row.text}</div>\n </details>\n )\n }\n if (row.kind === 'change') {\n return (\n <div key={idx} className={css.diffChange}>\n <div className={css.diffColumn}>\n <span className={css.diffTagOld}>原稿</span>\n <div className={css.diffOld}>{row.old}</div>\n </div>\n <div className={css.diffColumn}>\n <span className={css.diffTagNew}>新稿</span>\n <div className={css.diffNew}>{row.neu}</div>\n </div>\n </div>\n )\n }\n if (row.kind === 'del') {\n return (\n <div key={idx} className={css.diffDel}>\n <span className={css.diffTagOld}>原稿</span>\n <span className={css.diffText}>{row.text}</span>\n </div>\n )\n }\n return (\n <div key={idx} className={css.diffAdd}>\n <span className={css.diffTagNew}>新稿</span>\n <span className={css.diffText}>{row.text}</span>\n </div>\n )\n })}\n </div>\n </>\n )\n}\n\n/** The novel-forge panel. */\nexport function NovelPanel({ controller, api }: NovelPanelProps) {\n const [activeTab, setActiveTab] = useState<NovelTab>('workflow')\n const [config, setConfig] = useState<NovelConfig | null>(null)\n const [project, setProject] = useState<ProjectState | null>(null)\n const [generatedFiles, setGeneratedFiles] = useState<string[]>([])\n const [outlineText, setOutlineText] = useState('')\n const [customDocxPath, setCustomDocxPath] = useState('')\n const [shelf, setShelf] = useState<BookshelfSnapshot | null>(null)\n const [dragActive, setDragActive] = useState(false)\n const fileInputRef = useRef<HTMLInputElement | null>(null)\n const [planCount, setPlanCount] = useState(30)\n const [busy, setBusy] = useState(false)\n const [busyLabel, setBusyLabel] = useState('')\n const [error, setError] = useState('')\n const [notice, setNotice] = useState('')\n const [progress, setProgress] = useState<ProgressLine[]>([])\n const [configDraft, setConfigDraft] = useState<NovelConfig | null>(null)\n const [modelCustomMode, setModelCustomMode] = useState(false)\n const [expandedChapter, setExpandedChapter] = useState<number | null>(null)\n /** 复盘记录页:当前展开的章节号。 */\n const [expandedReviewChapter, setExpandedReviewChapter] = useState<number | null>(null)\n /** 复盘记录页:按卷折叠,卷号 → 是否展开(默认全部收起)。 */\n const [expandedVolumes, setExpandedVolumes] = useState<Record<number, boolean>>({})\n const [chapterText, setChapterText] = useState('')\n const progressId = useRef(0)\n /** id of the single live progress row (generation counter), if any. */\n const liveProgressId = useRef<number | null>(null)\n /** last chars value rendered into the live row (throttle for streaming). */\n const lastDeltaChars = useRef(0)\n /** cumulative chars received this job (delta frames carry increments). */\n const liveChars = useRef(0)\n /** chapter no of the job currently streaming (delta frames carry no `no`). */\n const currentJobNo = useRef(0)\n /** prominent top-of-panel progress bar while a chapter is being written. */\n const [liveBar, setLiveBar] = useState<{ text: string; ratio?: number } | null>(null)\n /** 润色/修订工作区:左栏原文(可选中局部目标)+ 右栏指令/预览/应用。 */\n const [workspace, setWorkspace] = useState<{\n no: number\n title: string\n original: string\n instruction: string\n draft: string | null\n /** 已采纳草稿(原地结论态):显示已采纳横幅 + 自动审稿结果,返回时才关闭工作区。 */\n applied?: boolean\n } | null>(null)\n /** 工作区左栏当前选中的文字(局部修订目标)。 */\n const [wsSelected, setWsSelected] = useState('')\n /** 工作区预览区:diff 对比视图开关。 */\n const [wsShowDiff, setWsShowDiff] = useState(false)\n /** 工作区原文 textarea 引用(用于捕获选中文字)。 */\n const wsEditorRef = useRef<HTMLTextAreaElement | null>(null)\n /** 工作区:手动编辑后的 AI 审查结果(不落盘)。 */\n const [wsCheckReport, setWsCheckReport] = useState<ReviewReport | null>(null)\n /** 手动审查结果中作者勾选要修复的问题(issue 下标)。 */\n const [wsChecked, setWsChecked] = useState<number[]>([])\n /** 工作区「一键修订结果」模式:顶部显示「✅ 修订完成」横幅,不展示旧意见选择。 */\n const [wsResultMode, setWsResultMode] = useState(false)\n /** 编辑页字号(localStorage 记忆,仅影响显示)。 */\n const [editorFontSize, setEditorFontSize] = useState<number>(() => {\n try {\n const v = Number(window.localStorage.getItem('dsh-novel-forge.editor.fontSize'))\n return v >= 12 && v <= 24 ? v : 14\n } catch { return 14 }\n })\n const changeEditorFontSize = (next: number): void => {\n const v = Math.min(24, Math.max(12, next))\n setEditorFontSize(v)\n try { window.localStorage.setItem('dsh-novel-forge.editor.fontSize', String(v)) } catch { /* ignore */ }\n }\n /** 面板主题(localStorage 记忆):'liquid'=iOS 液态玻璃(绿) / 'classic'=经典毛玻璃(蓝) / 'neumorph'=新拟物(浅色)。 */\n const [panelTheme, setPanelTheme] = useState<'liquid' | 'classic' | 'neumorph'>(() => {\n try {\n const v = window.localStorage.getItem('dsh-novel-forge.theme')\n return v === 'classic' || v === 'neumorph' ? v : 'liquid'\n } catch { return 'liquid' }\n })\n const changePanelTheme = (next: 'liquid' | 'classic' | 'neumorph'): void => {\n setPanelTheme(next)\n try { window.localStorage.setItem('dsh-novel-forge.theme', next) } catch { /* ignore */ }\n }\n /** 有未采纳草稿的章节号(refresh 后检测到遗留草稿时提示)。 */\n const [draftNo, setDraftNo] = useState<number | null>(null)\n /** 大纲页「更新大纲」编辑区是否展开。 */\n const [updatingOutline, setUpdatingOutline] = useState(false)\n /** 全书质检结果(null = 未运行)。 */\n const [auditIssues, setAuditIssues] = useState<import('../../protocol.ts').AuditIssue[] | null>(null)\n /** 全书质检实时状态(来自 /status,用于显示进度)。 */\n const [auditStatus, setAuditStatus] = useState<AuditStatus | null>(null)\n /** 角色卡(从事实库聚合)。 */\n const [charCards, setCharCards] = useState<import('../../protocol.ts').RoleStatusCard[] | null>(null)\n /** 世界观规则编辑草稿(bible tab,每行一条)。 */\n const [worldRulesDraft, setWorldRulesDraft] = useState('')\n /** 小说简介编辑草稿。 */\n const [blurbDraft, setBlurbDraft] = useState('')\n /** 书名编辑草稿(简介页改名用)。 */\n const [bookNameDraft, setBookNameDraft] = useState('')\n /** 封面 dataUrl(无封面为 null)。 */\n const [coverDataUrl, setCoverDataUrl] = useState<string | null>(null)\n /** 封面文件选择。 */\n const coverFileRef = useRef<HTMLInputElement | null>(null)\n /** 章节列表按卷折叠(存已折叠的卷号)。 */\n const [collapsedVolumes, setCollapsedVolumes] = useState<number[]>([])\n /** 章节页当前选中的卷('all' = 全部卷显示在一起)。 */\n const [selectedVolume, setSelectedVolume] = useState<number | 'all'>('all')\n /** 待办/主行动卡「定位章节」的目标章号(用于展开+滚动+高亮,消费后清空)。 */\n const [focusNo, setFocusNo] = useState<number | null>(null)\n /** 剧情线编辑草稿(null = 未在编辑)。 */\n const [plotlineDraft, setPlotlineDraft] = useState<{\n id: string\n name: string\n kind: Plotline['kind']\n goal: string\n progress: string\n status: Plotline['status']\n } | null>(null)\n /** 长线管理页:子页签(剧情线 / 伏笔),localStorage 记忆。 */\n const [longlineTab, setLonglineTab] = useState<'plotlines' | 'foreshadow'>(() => {\n try {\n const v = window.localStorage.getItem('dsh-novel-forge.longline.tab')\n return v === 'foreshadow' ? 'foreshadow' : 'plotlines'\n } catch { return 'plotlines' }\n })\n const changeLonglineTab = (next: 'plotlines' | 'foreshadow'): void => {\n setLonglineTab(next)\n try { window.localStorage.setItem('dsh-novel-forge.longline.tab', next) } catch { /* ignore */ }\n }\n /** 编年 / 复盘页:子页签(编年录 / 复盘记录),localStorage 记忆。 */\n const [archiveTab, setArchiveTab] = useState<'facts' | 'reviews'>(() => {\n try {\n const v = window.localStorage.getItem('dsh-novel-forge.archive.tab')\n return v === 'reviews' ? 'reviews' : 'facts'\n } catch { return 'facts' }\n })\n const changeArchiveTab = (next: 'facts' | 'reviews'): void => {\n setArchiveTab(next)\n try { window.localStorage.setItem('dsh-novel-forge.archive.tab', next) } catch { /* ignore */ }\n }\n /** 本书设定页:子页签(设定库 / 大世界 / 角色库 / 编年·复盘),localStorage 记忆。 */\n const [bookTab, setBookTab] = useState<'bible' | 'world' | 'roles' | 'facts'>(() => {\n try {\n const v = window.localStorage.getItem('dsh-novel-forge.book.tab')\n return v === 'world' || v === 'roles' || v === 'facts' ? v : 'bible'\n } catch { return 'bible' }\n })\n const changeBookTab = (next: 'bible' | 'world' | 'roles' | 'facts'): void => {\n setBookTab(next)\n try { window.localStorage.setItem('dsh-novel-forge.book.tab', next) } catch { /* ignore */ }\n }\n /** 角色知情度编辑草稿(角色名 → 文本,每行一条)。 */\n const [knowledgeDraft, setKnowledgeDraft] = useState<Record<string, string>>({})\n /** 角色库:AI 提炼候选(null = 未运行;localStorage 持久化,刷新不丢)。 */\n const [roleCandidates, setRoleCandidates] = useState<RoleRecord[] | null>(() => {\n try {\n const raw = window.localStorage.getItem('dsh-novel-forge.role.candidates')\n if (raw !== null) {\n const parsed = JSON.parse(raw) as RoleRecord[]\n return Array.isArray(parsed) && parsed.length > 0 ? parsed : null\n }\n } catch { /* ignore */ }\n return null\n })\n /** 角色库:编辑草稿(null = 不在编辑)。 */\n const [roleDraft, setRoleDraft] = useState<RoleRecord | null>(null)\n /** 角色库候选持久化:提炼/采纳后写回 localStorage。 */\n useEffect(() => {\n try {\n if (roleCandidates !== null && roleCandidates.length > 0) {\n window.localStorage.setItem('dsh-novel-forge.role.candidates', JSON.stringify(roleCandidates))\n } else {\n window.localStorage.removeItem('dsh-novel-forge.role.candidates')\n }\n } catch { /* ignore */ }\n }, [roleCandidates])\n /** 全书敏感词检查结果(null = 未运行)。 */\n const [sensHits, setSensHits] = useState<SensitiveHit[] | null>(null)\n const [sensScanned, setSensScanned] = useState(0)\n /** 拆书分析结果(null = 未运行)。 */\n const [breakdownResult, setBreakdownResult] = useState<import('../../protocol.ts').BreakdownResponse | null>(null)\n const [breakdownScope, setBreakdownScope] = useState<'recent' | 'volume:2' | 'volume:3' | 'all'>('recent')\n const [breakdownPreset, setBreakdownPreset] = useState<'quick' | 'standard'>('quick')\n /** 角色图集上传:当前等待上传的角色名。 */\n const [roleImageTarget, setRoleImageTarget] = useState<string | null>(null)\n /** 角色图集上传:当前用途标签(立绘/四视图/表情-x/场景/细节)。 */\n const [roleImageLabel, setRoleImageLabel] = useState('立绘')\n /** 角色形象详情:当前打开的角色名(null = 关闭)。 */\n const [detailRoleName, setDetailRoleName] = useState<string | null>(null)\n /** 详情面板:上传标签输入。 */\n const [detailUploadLabel, setDetailUploadLabel] = useState('立绘')\n /** 场景库:AI 提炼候选(null = 未运行)。 */\n const [sceneCandidates, setSceneCandidates] = useState<import('../../protocol.ts').SceneCard[] | null>(null)\n /** 场景库:当前打开的场景名。 */\n const [sceneDetailName, setSceneDetailName] = useState<string | null>(null)\n /** 场景库:上传标签输入。 */\n const [sceneUploadLabel, setSceneUploadLabel] = useState('全景')\n /** 场景库:编辑草稿(null = 不在编辑)。 */\n const [sceneDraft, setSceneDraft] = useState<import('../../protocol.ts').SceneCard | null>(null)\n const roleImageInputRef = useRef<HTMLInputElement | null>(null)\n /** AI 建议的剧情线候选(null = 未运行)。 */\n const [plotlineSuggestions, setPlotlineSuggestions] = useState<Plotline[] | null>(null)\n /** 剧情健康检查报告(null = 未运行)。 */\n const [plotlineHealth, setPlotlineHealth] = useState<PlotlineHealthReport | null>(null)\n /** AI 剧情方案(null = 未运行)。 */\n const [plotlinePlan, setPlotlinePlan] = useState<PlotlinePlan | null>(null)\n /** npm 最新版本(更新检测;null = 未检测/检测失败)。 */\n const [npmLatest, setNpmLatest] = useState<string | null>(null)\n /** 活动输出容器:自动滚动锚点(有新活动时跟随到底部)。 */\n const progressEndRef = useRef<HTMLDivElement | null>(null)\n useEffect(() => {\n progressEndRef.current?.scrollIntoView({ behavior: 'smooth', block: 'nearest' })\n }, [progress])\n\n /** 后台检测 npm 最新版本(失败静默,不打扰)。 */\n useEffect(() => {\n let cancelled = false\n void fetch('https://registry.npmjs.org/@waterwx%2Fdsh-novel-forge')\n .then(response => response.json() as Promise<{ 'dist-tags'?: { latest?: string } }>)\n .then(data => {\n if (!cancelled && data['dist-tags']?.latest !== undefined) setNpmLatest(data['dist-tags'].latest)\n })\n .catch(() => { /* best-effort */ })\n return () => { cancelled = true }\n }, [])\n /** AI 助手悬浮窗:是否打开。 */\n const [assistantOpen, setAssistantOpen] = useState(false)\n /** 工作进度悬浮窗:是否打开。 */\n const [progressOpen, setProgressOpen] = useState(false)\n /** 工作进度悬浮窗位置(localStorage 记忆)。 */\n const [progressPos, setProgressPos] = useState(() => {\n try {\n const raw = window.localStorage.getItem('dsh-novel-forge.progress.float')\n if (raw !== null) {\n const parsed = JSON.parse(raw) as { x?: unknown; y?: unknown }\n return { x: typeof parsed.x === 'number' ? parsed.x : 60, y: typeof parsed.y === 'number' ? parsed.y : 120 }\n }\n } catch { /* ignore */ }\n return { x: 60, y: 120 }\n })\n /** 工作进度悬浮窗尺寸(localStorage 记忆)。 */\n const [progressSize, setProgressSize] = useState(() => {\n try {\n const raw = window.localStorage.getItem('dsh-novel-forge.progress.size')\n if (raw !== null) {\n const parsed = JSON.parse(raw) as { w?: unknown; h?: unknown }\n return { w: typeof parsed.w === 'number' ? parsed.w : 460, h: typeof parsed.h === 'number' ? parsed.h : 420 }\n }\n } catch { /* ignore */ }\n return { w: 460, h: 420 }\n })\n /** 悬浮窗位置(相对面板,localStorage 记忆)。 */\n const [assistantPos, setAssistantPos] = useState(() => {\n try {\n const raw = window.localStorage.getItem('dsh-novel-forge.assistant.float')\n if (raw !== null) {\n const parsed = JSON.parse(raw) as { x?: unknown; y?: unknown }\n return { x: typeof parsed.x === 'number' ? parsed.x : 260, y: typeof parsed.y === 'number' ? parsed.y : 60 }\n }\n } catch { /* ignore */ }\n return { x: 260, y: 60 }\n })\n /** 悬浮窗尺寸(localStorage 记忆)。 */\n const [assistantSize, setAssistantSize] = useState(() => {\n try {\n const raw = window.localStorage.getItem('dsh-novel-forge.assistant.size')\n if (raw !== null) {\n const parsed = JSON.parse(raw) as { w?: unknown; h?: unknown }\n return { w: typeof parsed.w === 'number' ? parsed.w : 420, h: typeof parsed.h === 'number' ? parsed.h : 460 }\n }\n } catch { /* ignore */ }\n return { w: 420, h: 460 }\n })\n /** 拖拽/缩放状态(target 区分 AI 助手 / 工作进度两个悬浮窗)。 */\n const dragState = useRef<{ type: 'move' | 'resize'; target: 'assistant' | 'progress'; startX: number; startY: number; origX: number; origY: number; origW: number; origH: number } | null>(null)\n\n /** 悬浮窗位置/尺寸持久化。 */\n useEffect(() => {\n try {\n window.localStorage.setItem('dsh-novel-forge.assistant.float', JSON.stringify(assistantPos))\n window.localStorage.setItem('dsh-novel-forge.assistant.size', JSON.stringify(assistantSize))\n window.localStorage.setItem('dsh-novel-forge.progress.float', JSON.stringify(progressPos))\n window.localStorage.setItem('dsh-novel-forge.progress.size', JSON.stringify(progressSize))\n } catch { /* ignore */ }\n }, [assistantPos, assistantSize, progressPos, progressSize])\n\n /** 全局拖拽/缩放监听(挂一次,靠 dragState 判断)。 */\n useEffect(() => {\n const onMove = (e: MouseEvent): void => {\n const s = dragState.current\n if (s === null) return\n if (s.type === 'move') {\n const next = {\n x: Math.max(-340, Math.min(s.origX + e.clientX - s.startX, 3000)),\n y: Math.max(0, Math.min(s.origY + e.clientY - s.startY, 3000)),\n }\n if (s.target === 'assistant') setAssistantPos(next)\n else setProgressPos(next)\n } else {\n const next = {\n w: Math.max(320, Math.min(s.origW + e.clientX - s.startX, 1400)),\n h: Math.max(220, Math.min(s.origH + e.clientY - s.startY, 1200)),\n }\n if (s.target === 'assistant') setAssistantSize(next)\n else setProgressSize(next)\n }\n }\n const onUp = (): void => { dragState.current = null }\n window.addEventListener('mousemove', onMove)\n window.addEventListener('mouseup', onUp)\n return () => {\n window.removeEventListener('mousemove', onMove)\n window.removeEventListener('mouseup', onUp)\n }\n }, [])\n /** 左侧导航折叠状态(localStorage 记忆,参照 AI-Novel-Writing-Assistant 侧边栏)。 */\n const [navCollapsed, setNavCollapsed] = useState(() => {\n try { return window.localStorage.getItem('dsh-novel-forge.nav.collapsed') === 'true' } catch { return false }\n })\n /** 视图:shelf = 书架首页;create = 开书向导;workspace = 当前书工作台。 */\n const [viewMode, setViewMode] = useState<'shelf' | 'create' | 'workspace' | 'reader'>('shelf')\n\n /** Refresh bookshelf. */\n const refreshShelf = useCallback(async () => {\n try {\n const snapshot = await api.bookshelf()\n setShelf(snapshot)\n } catch { /* shelf is best-effort */ }\n }, [api])\n\n /** Append a progress console line. */\n const pushProgress = useCallback((text: string, kind: ProgressLine['kind'] = 'info') => {\n setProgress(prev => [...prev.slice(-300), { id: progressId.current++, text, kind }])\n }, [])\n\n /** Update the single live progress row in place (create it on first call). */\n const setLiveProgress = useCallback((text: string, ratio?: number) => {\n setProgress(prev => {\n if (liveProgressId.current !== null) {\n return prev.map(l => l.id === liveProgressId.current ? { ...l, text, ratio } : l)\n }\n const id = progressId.current++\n liveProgressId.current = id\n return [...prev.slice(-300), { id, text, kind: 'info', live: true, ratio }]\n })\n }, [])\n\n /** Remove the live progress row (a job finished / failed). */\n const clearLiveProgress = useCallback(() => {\n if (liveProgressId.current === null) return\n const id = liveProgressId.current\n liveProgressId.current = null\n setProgress(prev => prev.filter(l => l.id !== id))\n }, [])\n\n /** Refresh status (config + project + files). */\n const refresh = useCallback(async (showError = true, forceOutline = false) => {\n try {\n const status = await api.status()\n setConfig(status.config)\n setConfigDraft(status.config)\n setModelCustomMode(!(MODEL_PRESETS as readonly string[]).includes(status.config.model))\n setAuditStatus(status.audit ?? null)\n setProject(status.project ?? null)\n // 人物志存档同步:有 roleStatus 存档直接显示,无需重新刷新计算。\n if (status.project?.roleStatus !== undefined) {\n setCharCards(status.project.roleStatus)\n } else {\n setCharCards(null)\n }\n setGeneratedFiles(status.generatedFiles)\n const withDraft = status.project?.chapters.find(c => c.pendingDraft !== undefined && c.pendingDraft !== '')\n setDraftNo(withDraft?.no ?? null)\n const nextOutline = status.project?.outline\n // forceOutline:切换书/开书后强制同步大纲(refresh 闭包里的\n // outlineText 可能是旧值,导致 `=== ''` 条件失效、大纲不同步、\n // 「生成章节计划」按钮被禁用)。\n if (forceOutline || (nextOutline !== undefined && outlineText === '')) {\n setOutlineText(nextOutline ?? '')\n }\n } catch (err) {\n if (showError) setError((err as Error).message)\n }\n }, [api, outlineText])\n\n /** 激活一本书(书架入口共用):重置本地编辑状态 → 拉取目标书 → 进入工作台或阅读页。 */\n const activateBook = useCallback(async (id: string, mode: 'workspace' | 'reader') => {\n setBusy(true)\n setError('')\n try {\n await api.bookActivate(id)\n // 切换书后重置本地编辑状态,重新拉取目标书。\n setOutlineText('')\n setProject(null)\n setGeneratedFiles([])\n setChapterText('')\n setExpandedChapter(null)\n setProgress([])\n setAuditIssues(null)\n setCharCards(null)\n await refresh(false, true)\n await refreshShelf()\n setViewMode(mode)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }, [api, refresh, refreshShelf])\n\n /** Handle a docx file (pick or drag): parse locally, save outline. */\n const handleDocxFile = useCallback(async (file: File) => {\n setBusy(true)\n setBusyLabel(tt('overview.loadingOutline'))\n setError('')\n try {\n const buffer = await file.arrayBuffer()\n const outline = extractDocxTextFromBuffer(buffer)\n if (outline.length < 50) {\n throw new Error('大纲内容过短(<50 字符),请检查文件')\n }\n setOutlineText(outline)\n await api.saveOutline(outline)\n await refresh(false)\n pushProgress(`已从「${file.name}」读取大纲(${outline.length} 字)`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`读取大纲失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }, [api, pushProgress, refresh])\n\n useEffect(() => {\n void refresh()\n void refreshShelf()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n /** 进入简介页时预填已保存的简介。 */\n useEffect(() => {\n if (activeTab === 'blurb') {\n if (blurbDraft === '' && project?.blurb !== undefined && project.blurb !== '') {\n setBlurbDraft(project.blurb)\n }\n if (bookNameDraft === '' && project?.bookName !== undefined && project.bookName !== '') {\n setBookNameDraft(project.bookName)\n }\n void loadCover()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeTab, project?.blurb, project?.bookName])\n\n /** Load the outline from docx (default path or custom). */\n const handleLoadDocx = async (useCustom: boolean): Promise<void> => {\n setBusy(true)\n setBusyLabel(tt('overview.loadingOutline'))\n setError('')\n try {\n const result = await api.loadOutline(useCustom ? customDocxPath || undefined : undefined)\n setOutlineText(result.outline)\n // Persist into the project (load-or-create).\n await api.saveOutline(result.outline)\n await refresh(false)\n pushProgress(`大纲已读取(${result.chars} 字):${result.bookName}${result.path !== undefined ? ` ← ${result.path}` : ''}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`读取大纲失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** Save the edited outline. */\n const handleSaveOutline = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await api.saveOutline(outlineText)\n setNotice(tt('overview.saved'))\n pushProgress(tt('overview.saved'), 'done')\n await refresh(false)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 大纲页「更新大纲」展开/收起(展开时预填当前大纲文本)。 */\n const handleToggleUpdateOutline = (): void => {\n if (!updatingOutline && project !== null) setOutlineText(project.outline)\n setUpdatingOutline(v => !v)\n }\n\n /** 重置项目:清空全部进度,从新大纲重新开始(二次确认)。 */\n const handleResetProject = async (): Promise<void> => {\n if (project === null) return\n if (!window.confirm('将清空本书全部进度(道藏/卷计划/章节计划/已生成章节/暗线/写作资产/编年录),且不可恢复。确定用新总纲重置?')) return\n setBusy(true)\n setError('')\n try {\n const result = await api.reset(outlineText)\n setUpdatingOutline(false)\n pushProgress(`已重置项目:${result.bookName}(从新大纲重新开始)`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`重置失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\n\n /** 全书一致性质检(LLM 扫描已生成章节)。 */\n const handleAudit = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel('全书一致性质检中…')\n setError('')\n setAuditStatus({ status: 'running', totalBatches: 0, completedBatches: 0 })\n let stopped = false\n const poll = window.setInterval(async () => {\n if (stopped) return\n try {\n const s = await api.status()\n if (s.audit !== undefined) setAuditStatus(s.audit)\n } catch { /* 轮询失败忽略,主请求仍会给出最终结果 */ }\n }, 1000)\n try {\n const result = await api.audit()\n if (stopped) return\n setAuditIssues(result.issues)\n pushProgress(result.issues.length === 0\n ? `全书质检完成:${result.auditedChapters} 章未发现矛盾 🎉`\n : `全书质检完成:发现 ${result.issues.length} 处疑似矛盾`, result.issues.length === 0 ? 'done' : 'error')\n } catch (err) {\n if (stopped) return\n setError((err as Error).message)\n pushProgress(`全书质检失败:${(err as Error).message}`, 'error')\n } finally {\n stopped = true\n window.clearInterval(poll)\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\n\n /** 角色卡刷新。 */\n const handleCharactersRefresh = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel('聚合角色状态中…')\n setError('')\n try {\n const result = await api.charactersRefresh()\n setCharCards(result.cards)\n // 同步到项目存档(角色库卡片显示当前状态)。\n setProject(prev => prev === null ? prev : { ...prev, roleStatus: result.cards, updatedAt: new Date().toISOString() })\n pushProgress(`角色状态已刷新:${result.cards.length} 个角色`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`角色状态刷新失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 事实库回填(历史章节批量抽取)。 */\n const handleFactsBackfill = async (): Promise<void> => { if (doneCount === 0) return\n setBusy(true)\n setBusyLabel('回填历史章节事实中…')\n setError('')\n try {\n const result = await api.factsBackfill()\n pushProgress(result.filled > 0\n ? `事实库回填完成:${result.filled} 章已抽取事实`\n : '事实库无需回填(所有章节都已有事实记录)', 'done')\n await refresh(false)\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`事实库回填失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 章节复位:generating 卡死 → pending(可重新生成)。 */\n const handleChapterReset = async (no: number): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await api.chapterReset(no)\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === no ? { ...c, status: 'pending', error: undefined } : c),\n })\n pushProgress(`第 ${no} 章已复位为待生成,可重新生成`, 'info')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`复位失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n }\n }\n\n /** 章节直接通过(作者行使最终决定权)。 */\n const handleChapterApprove = async (no: number): Promise<void> => {\n if (!window.confirm(`确定直接通过第 ${no} 章?(跳过审稿判定,保留审稿记录)`)) return\n setBusy(true)\n setError('')\n try {\n await api.chapterApprove(no)\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === no ? { ...c, status: 'approved' } : c),\n })\n pushProgress(`第 ${no} 章已直接通过`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`操作失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n }\n }\n\n /** 剧情线:保存草稿(新增或更新)。 */\n const handlePlotlineSave = async (): Promise<void> => {\n if (plotlineDraft === null) return\n const line: Plotline = {\n id: plotlineDraft.id,\n name: plotlineDraft.name.trim(),\n kind: plotlineDraft.kind,\n goal: plotlineDraft.goal.trim(),\n progress: plotlineDraft.progress.trim(),\n status: plotlineDraft.status,\n chapters: plotlineDraft.id !== ''\n ? (project?.plotlines?.find(l => l.id === plotlineDraft.id)?.chapters ?? [])\n : [],\n createdAt: plotlineDraft.id !== ''\n ? (project?.plotlines?.find(l => l.id === plotlineDraft.id)?.createdAt ?? new Date().toISOString())\n : new Date().toISOString(),\n }\n if (line.name === '') {\n setError('剧情线名称不能为空')\n return\n }\n setBusy(true)\n setError('')\n try {\n const result = await api.plotlines({ op: plotlineDraft.id !== '' ? 'update' : 'add', line })\n setProject(prev => prev === null ? prev : { ...prev, plotlines: result.plotlines, updatedAt: new Date().toISOString() })\n setPlotlineDraft(null)\n pushProgress(plotlineDraft.id !== '' ? `剧情线已更新:${line.name}` : `剧情线已创建:${line.name}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`保存剧情线失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n }\n }\n\n /** 剧情线:删除。 */\n const handlePlotlineRemove = async (id: string): Promise<void> => {\n if (!window.confirm('确定删除这条剧情线?关联章节记录会一并移除。')) return\n setBusy(true)\n setError('')\n try {\n const result = await api.plotlines({ op: 'remove', id })\n setProject(prev => prev === null ? prev : { ...prev, plotlines: result.plotlines, updatedAt: new Date().toISOString() })\n pushProgress('剧情线已删除', 'done')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 剧情线:把本章关联到某条线(推进节点)。 */\n const handlePlotlineLink = async (id: string, chapterNo: number): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.plotlines({ op: 'link', id, chapterNo })\n setProject(prev => prev === null ? prev : { ...prev, plotlines: result.plotlines, updatedAt: new Date().toISOString() })\n pushProgress(`已把第 ${chapterNo} 章关联到剧情线`, 'done')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 剧情线:AI 建议候选线。 */\n const handlePlotlineSuggest = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel('AI 分析剧情线中…')\n setError('')\n try {\n const result = await api.plotlines({ op: 'suggest' })\n setPlotlineSuggestions(result.suggestions ?? [])\n pushProgress(result.suggestions !== undefined && result.suggestions.length > 0\n ? `AI 建议了 ${result.suggestions.length} 条剧情线,可逐条采纳`\n : 'AI 没有给出剧情线建议,请检查大纲是否已加载', 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`AI 建议剧情线失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 剧情线:采纳一条 AI 建议。 */\n const handlePlotlineAdopt = async (suggestion: Plotline): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.plotlines({ op: 'add', line: { ...suggestion, id: '' } })\n setProject(prev => prev === null ? prev : { ...prev, plotlines: result.plotlines, updatedAt: new Date().toISOString() })\n setPlotlineSuggestions(prev => prev === null ? prev : prev.filter(s => s !== suggestion))\n pushProgress(`已采纳剧情线:${suggestion.name}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 剧情线:AI 刷新单条线进度。 */\n const handlePlotlineRefresh = async (id: string): Promise<void> => {\n setBusy(true)\n setBusyLabel('AI 刷新剧情线进度中…')\n setError('')\n try {\n const result = await api.plotlines({ op: 'refresh', id })\n setProject(prev => prev === null ? prev : { ...prev, plotlines: result.plotlines, updatedAt: new Date().toISOString() })\n const line = result.plotlines.find(l => l.id === id)\n pushProgress(`剧情线进度已刷新:${line?.progress ?? ''}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`刷新剧情线进度失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 🩺 剧情健康检查:判断是否需要新线、多少章后添加。 */\n const handlePlotlineHealth = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel('🩺 剧情健康检查中…')\n setError('')\n try {\n const result = await api.plotlines({ op: 'health' })\n setPlotlineHealth(result.health ?? null)\n pushProgress(`剧情健康检查完成:${result.health?.verdict ?? '无结论'}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`剧情健康检查失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** ✨ AI 设计剧情方案:下一阶段方向 + 建议新线(含健康检查)。 */\n const handlePlotlinePlan = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel('✨ 设计剧情方案中…')\n setError('')\n try {\n const result = await api.plotlines({ op: 'plan' })\n setPlotlineHealth(result.health ?? null)\n setPlotlinePlan(result.plan ?? null)\n pushProgress(`剧情方案已生成:${result.plan?.suggestions.length ?? 0} 条建议新线`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`剧情方案生成失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 采纳方案里的一条建议线。 */\n const handlePlanAdopt = async (suggestion: Plotline): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.plotlines({ op: 'add', line: { ...suggestion, id: '' } })\n setProject(prev => prev === null ? prev : { ...prev, plotlines: result.plotlines, updatedAt: new Date().toISOString() })\n setPlotlinePlan(prev => prev === null ? prev : { ...prev, suggestions: prev.suggestions.filter(s => s !== suggestion) })\n pushProgress(`已采纳剧情线:${suggestion.name}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 全书敏感词检查(硬匹配内置词库)。 */\n const handleSensitiveScan = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel('敏感词检查中…')\n setError('')\n try {\n const result = await api.sensitiveCheck({ all: true })\n setSensHits(result.hits)\n setSensScanned(result.scannedChapters)\n pushProgress(result.hits.length > 0\n ? `敏感词检查:${result.hits.length} 处命中(${new Set(result.hits.map(h => h.chapterNo)).size} 章受影响)`\n : `敏感词检查完成:扫描 ${result.scannedChapters} 章,未命中违禁词`, result.hits.length > 0 ? 'error' : 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`敏感词检查失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 拆书分析:对已写章节做结构/人物/文风/卖点体检(两阶段 LLM 管道,约 1-3 分钟)。 */\n const handleBreakdown = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel('拆书分析中…')\n setError('')\n try {\n const result = await api.breakdown(breakdownScope, breakdownPreset)\n setBreakdownResult(result)\n pushProgress(`拆书分析完成:${result.chaptersScanned} 章 · ${result.sections.length} 个小节 · 约 ${result.usedTokens} token`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`拆书分析失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 生成单个角色的形象锚点(复用角色库 visual 能力)。 */\n const handleRoleVisual = async (name: string): Promise<void> => {\n setBusy(true)\n setBusyLabel(`生成「${name}」形象锚点…`)\n setError('')\n try {\n await api.roles({ op: 'visual', name })\n await refresh(false)\n pushProgress(`已生成「${name}」形象锚点`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`生成「${name}」形象锚点失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 上传角色图:读取本地图片为 dataURL 并写入角色卡(带用途标签 → 图集)。 */\n const handleRoleImageUpload = async (name: string, file: File, label = '立绘'): Promise<void> => {\n const dataUrl = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(String(reader.result))\n reader.onerror = () => reject(reader.error ?? new Error('读取图片失败'))\n reader.readAsDataURL(file)\n })\n setBusy(true)\n setBusyLabel(`上传「${name}」${label}…`)\n setError('')\n try {\n await api.roles({ op: 'image', name, dataUrl, label })\n await refresh(false)\n pushProgress(`已上传「${name}」${label}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`上传「${name}」${label}失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n setRoleImageTarget(null)\n if (roleImageInputRef.current !== null) roleImageInputRef.current.value = ''\n }\n }\n\n /** 用豆包/Seedream 为角色生成参考图。 */\n const handleRoleImageGenerate = async (name: string): Promise<void> => {\n setBusy(true)\n setBusyLabel(`用豆包生成「${name}」参考图…`)\n setError('')\n try {\n await api.roles({ op: 'imageGenerate', name })\n await refresh(false)\n pushProgress(`已生成「${name}」参考图`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`生成「${name}」参考图失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 作者复盘补跑:全书缺失章节(流式)。 */\n const handleAuthorBackfillAll = async (): Promise<void> => {\n const missing = chapters.filter(c => c.status !== 'pending' && c.status !== 'generating' && c.status !== 'error' && c.authorReview === undefined).length\n setBusy(true)\n setBusyLabel(`补齐历史章节作者复盘(${missing} 章)…`)\n setError('')\n try {\n await api.reviewBackfillAll(frame => { applyJobFrame(frame, () => '') })\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`补齐作者复盘失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 作者复盘补跑:单章。 */\n const handleAuthorBackfillChapter = async (no: number): Promise<void> => {\n setBusy(true)\n setBusyLabel(`生成第 ${no} 章作者复盘…`)\n setError('')\n try {\n const result = await api.reviewBackfillChapter(no)\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === result.no ? { ...c, authorReview: result.review } : c),\n })\n const r = result.review\n pushProgress(\n `📋 第${no}章作者复盘:钩子${r.hookHonored ? '已兑现 ✓' : '未兑现 ✗'} · 结尾钩子 ${r.endingHook}/10`,\n r.hookHonored && r.endingHook >= 6 ? 'done' : 'error',\n )\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`生成第 ${no} 章作者复盘失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 保存角色知情度(bible.characters 整体更新)。 */\n const handleKnowledgeSave = async (): Promise<void> => {\n if (bible === undefined) return\n const characters = bible.characters.map(card => ({\n ...card,\n knowledge: (knowledgeDraft[card.name] ?? (card.knowledge ?? []).join('\\n'))\n .split('\\n').map(l => l.trim()).filter(l => l !== ''),\n }))\n setBusy(true)\n setError('')\n try {\n const result = await api.biblePatch({ characters })\n setProject(prev => prev === null || prev.bible === undefined ? prev : { ...prev, bible: result.bible, updatedAt: new Date().toISOString() })\n pushProgress('角色知情度已保存(生成/审稿都会严格遵守信息差)', 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`保存知情度失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n }\n }\n\n /** 角色库:AI 从全书提炼角色候选。 */\n const handleRolesExtract = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel('✨ 提炼角色库中…')\n setError('')\n try {\n const result = await api.roles({ op: 'extract' })\n // 双保险:过滤掉已入库的同名角色(服务端已排除,这里兜底)。\n const inLibrary = new Set((project?.roles ?? []).map(r => r.name))\n const fresh = (result.candidates ?? []).filter(r => !inLibrary.has(r.name))\n setRoleCandidates(prev => {\n const merged = [...(prev ?? []).filter(p => !fresh.some(f => f.name === p.name)), ...fresh]\n return merged\n })\n pushProgress(`AI 提炼出 ${fresh.length} 个新角色(已排除 ${(result.candidates?.length ?? 0) - fresh.length} 个已收录)`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`角色提炼失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 角色库:采纳候选(或修改后采纳)。 */\n const handleRoleAdopt = async (role: RoleRecord): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.roles({ op: 'adopt', role })\n setProject(prev => prev === null ? prev : { ...prev, roles: result.roles, updatedAt: new Date().toISOString() })\n setRoleCandidates(prev => prev === null ? prev : prev.filter(r => r !== role))\n pushProgress(`已加入角色库:${role.name}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 角色库:保存编辑草稿。 */\n const handleRoleSave = async (): Promise<void> => {\n if (roleDraft === null) return\n if (roleDraft.name.trim() === '') {\n setError('角色名不能为空')\n return\n }\n setBusy(true)\n setError('')\n try {\n const result = await api.roles({ op: 'update', role: roleDraft })\n setProject(prev => prev === null ? prev : { ...prev, roles: result.roles, updatedAt: new Date().toISOString() })\n setRoleDraft(null)\n pushProgress(`角色已保存:${roleDraft.name}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 角色库:删除角色。 */\n const handleRoleRemove = async (name: string): Promise<void> => {\n if (!window.confirm(`确定从角色库删除「${name}」?`)) return\n setBusy(true)\n setError('')\n try {\n const result = await api.roles({ op: 'remove', name })\n setProject(prev => prev === null ? prev : { ...prev, roles: result.roles, updatedAt: new Date().toISOString() })\n pushProgress(`已从角色库删除:${name}`, 'info')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 保存世界观规则编辑(bible tab,每行一条)。 */\n const handleSaveWorldRules = async (): Promise<void> => {\n if (bible === undefined) return\n const rules = worldRulesDraft.split('\\n').map(line => line.trim()).filter(line => line !== '')\n setBusy(true)\n setError('')\n try {\n const result = await api.biblePatch({ worldRules: rules })\n setProject(prev => prev === null ? prev : { ...prev, bible: result.bible, updatedAt: new Date().toISOString() })\n pushProgress(`世界观规则已保存(${rules.length} 条)`, 'done')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 简介:AI 全量生成。 */\n const handleBlurbGenerate = async (): Promise<void> => {\n if (project === null) return\n setBusy(true)\n setBusyLabel('AI 生成简介中…')\n setError('')\n try {\n const result = await api.blurb('generate')\n setBlurbDraft(result.blurb)\n pushProgress(`简介已生成(${result.blurb.length} 字)`, 'done')\n await refresh(false)\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`简介生成失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 简介:按已写开头 AI 补全。 */\n const handleBlurbComplete = async (): Promise<void> => {\n if (project === null) return\n if (blurbDraft.trim() === '') return\n setBusy(true)\n setBusyLabel('AI 补全简介中…')\n setError('')\n try {\n const result = await api.blurb('generate', undefined, blurbDraft)\n setBlurbDraft(result.blurb)\n pushProgress(`简介已补全(${result.blurb.length} 字)`, 'done')\n await refresh(false)\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`简介补全失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 简介:手动保存。 */\n const handleBlurbSave = async (): Promise<void> => {\n if (project === null) return\n setBusy(true)\n setError('')\n try {\n const result = await api.blurb('save', blurbDraft)\n pushProgress(`简介已保存(${result.blurb.length} 字)`, 'done')\n await refresh(false)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 加载封面(进入简介页时)。 */\n const loadCover = useCallback(async (): Promise<void> => {\n try {\n const result = await api.coverGet()\n setCoverDataUrl(result.dataUrl)\n } catch { /* best-effort */ }\n }, [api])\n\n /** 封面上传(本地预览 + 落盘)。 */\n const handleCoverUpload = (file: File | undefined): void => {\n if (file === undefined) return\n const reader = new FileReader()\n reader.onload = () => {\n const dataUrl = typeof reader.result === 'string' ? reader.result : null\n if (dataUrl === null) return\n setCoverDataUrl(dataUrl)\n void (async () => {\n setBusy(true)\n setError('')\n try {\n await api.coverPost('upload', dataUrl)\n pushProgress(`封面已上传:${file.name}`, 'done')\n await refresh(false)\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`封面上传失败:${(err as Error).message}`, 'error')\n await loadCover()\n } finally {\n setBusy(false)\n }\n })()\n }\n reader.readAsDataURL(file)\n }\n\n /** 工作区:AI 审查当前编辑的正文(不落盘)。 */\n const handleWsCheck = async (): Promise<void> => {\n if (workspace === null) return\n if (workspace.original.trim().length < 50) {\n setError('正文过短(<50 字),请先编辑内容')\n return\n }\n setBusy(true)\n setBusyLabel(`AI 审查 第${workspace.no}章`)\n setError('')\n try {\n const result = await api.chapterCheck(workspace.no, workspace.original)\n setWsCheckReport(result.report)\n // 默认勾选 high 问题(无 high 则勾选全部 medium),作者可自行增删。\n const highIdx = result.report.issues.map((it, i) => ({ it, i })).filter(x => x.it.severity === 'high').map(x => x.i)\n const mediumIdx = result.report.issues.map((it, i) => ({ it, i })).filter(x => x.it.severity === 'medium').map(x => x.i)\n setWsChecked(highIdx.length > 0 ? highIdx : mediumIdx)\n pushProgress(`审查完成:${result.report.score} 分 — ${result.report.verdict}`, result.report.passed ? 'done' : 'error')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`AI 审查失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 工作区「应用并保存」:有草稿(修订/润色产物)→ 应用草稿落盘;无草稿(手动编辑)→ 保存原文。\n * 沿用已有审查报告(wsCheckReport)或后端自动审稿;成功后原地进入「已采纳」结论态,返回定位到该章。 */\n const handleWsSave = async (): Promise<void> => {\n if (workspace === null) return\n if (workspace.original.trim().length < 50) {\n setError('正文过短(<50 字),未保存')\n return\n }\n setBusy(true)\n setError('')\n const no = workspace.no\n try {\n let report: ReviewReport | undefined = undefined\n let chars = workspace.original.length\n if (workspace.draft !== null) {\n // 有草稿:应用草稿(draftApply 已返回新正文 markdown;携带审查报告沿用结论定状态)。\n setBusyLabel(`应用草稿 第${no}章`)\n const result = await api.draftApply(no, wsCheckReport ?? undefined)\n report = wsCheckReport ?? undefined\n chars = result.chars\n setWorkspace(prev => prev === null ? prev : {\n ...prev,\n original: result.markdown ?? prev.original,\n draft: null,\n applied: true,\n })\n } else {\n // 无草稿:保存当前原文(沿用报告或后端自动审稿,1-2 分钟)。\n setBusyLabel(`AI 审查 第${no}章`)\n const result = await api.chapterSave(no, workspace.original, wsCheckReport ?? undefined)\n report = result.report\n setWorkspace(prev => prev === null ? prev : { ...prev, applied: true })\n }\n setDraftNo(null)\n if (report !== undefined) {\n pushProgress(`已保存并审稿:${report.score} 分 — ${report.verdict}(${report.passed ? '通过' : '未通过'})`, report.passed ? 'done' : 'error')\n } else {\n pushProgress(`已保存第 ${no} 章(${chars} 字,原稿已备份 .bak)`, 'done')\n }\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`保存失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\n\n /** 移除封面。 */\n const handleCoverRemove = async (): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await api.coverPost('remove')\n setCoverDataUrl(null)\n pushProgress('封面已移除', 'info')\n await refresh(false)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** 重命名当前书(同步项目与书架)。 */\n const handleRename = async (): Promise<void> => {\n const name = bookNameDraft.trim()\n if (name === '' || project === null || name === project.bookName) return\n setBusy(true)\n setError('')\n try {\n const result = await api.rename(name)\n pushProgress(`书名已改为《${result.bookName}》`, 'done')\n await refresh(false)\n await refreshShelf()\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`改名失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n }\n }\n\n /** Extract the story bible. */\n const handleBible = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel(tt('bible.gen'))\n setError('')\n try {\n const result = await api.bible(outlineText || undefined)\n setProject(prev => prev === null ? prev : { ...prev, bible: result.bible, updatedAt: new Date().toISOString() })\n const bible: StoryBible = result.bible\n pushProgress(tt('workflow.bibleDone', {\n n: bible.worldRules.length,\n c: bible.characters.length,\n r: bible.redLines.length,\n }), 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`提炼道藏失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** Plan volumes. */\n const handleVolumes = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel(tt('workflow.genVolumes'))\n setError('')\n try {\n const result = await api.volumes(outlineText || undefined)\n setProject(prev => prev === null ? prev : { ...prev, volumes: result.volumes, updatedAt: new Date().toISOString() })\n pushProgress(tt('workflow.volumesDone', { n: result.volumes.length }), 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`生成卷计划失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** Generate the chapter plan via LLM. */\n const handlePlan = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel(tt('plan.generate'))\n setError('')\n try {\n const result = await api.plan(outlineText || undefined, planCount)\n let freshCount = 0\n setProject(prev => {\n const base = prev ?? {\n bookName: '', outline: outlineText, chapters: [] as ChapterPlan[],\n foreshadows: [] as Foreshadow[], createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(),\n }\n // 追加时按标题去重,避免重复生成计划导致剧情「重头再来」。\n const existingTitles = new Set(base.chapters.map(c => c.title))\n const fresh = result.chapters.filter(c => !existingTitles.has(c.title))\n freshCount = fresh.length\n if (fresh.length === 0) return base\n return { ...base, chapters: [...base.chapters, ...fresh], updatedAt: new Date().toISOString() }\n })\n pushProgress(tt('workflow.planDone', { n: freshCount }), 'done')\n if (freshCount < result.chapters.length) {\n pushProgress(`已跳过 ${result.chapters.length - freshCount} 个与已有章节同名的重复章节`, 'error')\n }\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`生成章节计划失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 打开某章的工作区(读取服务器原文;有遗留草稿时预载草稿;可预填修订指令)。 */\n const openWorkspace = useCallback(async (no: number, instruction?: string, mode?: 'pick' | 'result'): Promise<void> => {\n try {\n const [chapterRes, statusRes] = await Promise.all([api.chapter(no), api.status()])\n const chapter = statusRes.project?.chapters.find(c => c.no === no)\n if (chapter === undefined) return\n // 指令框只承载「显式传入的指令」(如按质检/敏感词意见修订);\n // 审稿意见统一由下方可勾选列表承载,不再自动预填文字,避免重复。\n const autoInstruction = instruction ?? ''\n setWorkspace({\n no,\n title: chapter.title,\n original: chapterRes.markdown,\n instruction: autoInstruction,\n draft: chapter.pendingDraft !== undefined && chapter.pendingDraft !== '' ? chapter.pendingDraft : null,\n })\n setWsSelected('')\n setWsShowDiff(true)\n if (mode === 'result') {\n // 一键修订结果模式:不再加载旧审稿意见(修订已按意见执行完),\n // 直接展示草稿;wsResultMode 标记用于顶部「✅ 修订完成」横幅。\n setWsCheckReport(null)\n setWsChecked([])\n setWsResultMode(true)\n } else {\n // 意见统一为「当前意见」:进工作区即加载已有审稿意见为可勾选列表,\n // 默认勾选 high(无 high 则勾选全部 medium),作者可自行增删。\n setWsResultMode(false)\n const carried = chapter.review\n setWsCheckReport(carried ?? null)\n if (carried !== undefined && carried.issues.length > 0) {\n const highIdx = carried.issues.map((it, i) => ({ it, i })).filter(x => x.it.severity === 'high').map(x => x.i)\n const mediumIdx = carried.issues.map((it, i) => ({ it, i })).filter(x => x.it.severity === 'medium').map(x => x.i)\n setWsChecked(highIdx.length > 0 ? highIdx : mediumIdx)\n } else {\n setWsChecked([])\n }\n }\n } catch { /* best-effort */ }\n }, [api])\n\n /** 捕获工作区原文 textarea 中选中的文字(局部修订目标)。 */\n const captureWsSelection = (): void => {\n const el = wsEditorRef.current\n if (el === null) return\n const start = el.selectionStart ?? 0\n const end = el.selectionEnd ?? 0\n if (end > start) setWsSelected(el.value.slice(start, end).trim())\n else setWsSelected('')\n }\n\n /** 工作区:去 AI 味润色(流式 → 预览草稿)。 */\n const handleWsPolish = async (): Promise<void> => {\n if (workspace === null) return\n setBusy(true)\n setBusyLabel(`${tt('plan.polish')} 第${workspace.no}章`)\n setError('')\n try {\n await api.polish(workspace.no, frame => { applyJobFrame(frame, n => tt('progress.polishing', { no: n })) })\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`第 ${workspace.no} 章润色失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\n\n /** 工作区:按指令修订(whole=true 整章,false 仅修订选中片段)。 */\n /** 工作区:对草稿自动跑一次 AI 审查(不落盘),刷新「当前意见」为草稿版本。 */\n /**\n * 主观项豁免判定(方案 B):修订后审查中,剩余问题若没有 high(逻辑/设定/事实矛盾),\n * 即使分数未达阈值也视为可接受——主观项(文笔/节奏/套话)不再无限循环卡修订。\n */\n const reviseAcceptable = (report: ReviewReport): boolean =>\n report.passed || report.issues.every(i => i.severity !== 'high')\n\n const autoCheckDraft = async (no: number, previousReport?: ReviewReport | null): Promise<void> => {\n const draft = project?.chapters.find(c => c.no === no)?.pendingDraft\n if (draft === undefined || draft === '') return\n setBusyLabel(`AI 审查草稿 第${no}章`)\n try {\n // 携带上一轮审稿报告 → 后端走「验证模式」:核对原意见是否解决 + 只挑新增 high,防止越修越多。\n const result = await api.chapterCheck(no, draft, previousReport ?? undefined)\n // 主观项豁免:无 high 即视为通过(passed 置 true,供保存沿用与横幅展示)。\n const acceptable = reviseAcceptable(result.report)\n const report: ReviewReport = acceptable ? { ...result.report, passed: true } : result.report\n setWsCheckReport(report)\n const highIdx = report.issues.map((it, i) => ({ it, i })).filter(x => x.it.severity === 'high').map(x => x.i)\n const mediumIdx = report.issues.map((it, i) => ({ it, i })).filter(x => x.it.severity === 'medium').map(x => x.i)\n setWsChecked(highIdx.length > 0 ? highIdx : mediumIdx)\n if (acceptable && !result.report.passed) {\n pushProgress(`草稿审查:${report.score} 分 — 可接受(剩余均为主观项,无逻辑/设定矛盾)`, 'done')\n } else {\n pushProgress(`草稿审查:${report.score} 分 — ${report.verdict}`, report.passed ? 'done' : 'error')\n }\n } catch (err) {\n pushProgress(`草稿审查失败:${(err as Error).message}`, 'error')\n } finally {\n setBusyLabel('')\n }\n }\n\n const handleWsRewrite = async (whole: boolean, overrideInstruction?: string): Promise<void> => {\n if (workspace === null) return\n const target = whole ? '' : wsSelected\n const instruction = overrideInstruction ?? workspace.instruction\n // 新一轮修订开始:清掉「已采纳」结论态(横幅只在采纳后短暂停留)。\n if (workspace.applied === true) {\n setWorkspace({ ...workspace, applied: false })\n }\n setBusy(true)\n setBusyLabel(`${tt('plan.rewrite')} 第${workspace.no}章`)\n setError('')\n const no = workspace.no\n try {\n await api.rewrite(no, instruction, target, frame => { applyJobFrame(frame, n => tt('progress.rewriting', { no: n })) })\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`第 ${no} 章修订失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n // 修订后自动审查(设置开关,默认开):草稿 → 验证模式审查(携带本次修订所依据的报告),\n // 核对原意见解决情况 + 只挑新增 high,防止\"越修 high 越多\"。\n if (config?.autoReviewAfterRevise !== false) {\n setBusy(true)\n await autoCheckDraft(no, wsCheckReport)\n setBusy(false)\n }\n }\n }\n\n /** 工作区:按审查报告中勾选的问题一键修订(按勾选意见整章修订到草稿,不污染指令框)。 */\n const handleWsReviseByReport = async (): Promise<void> => {\n if (workspace === null || wsCheckReport === null) return\n const picked = wsChecked\n .map(i => wsCheckReport.issues[i])\n .filter((it): it is ReviewReport['issues'][number] => it !== undefined)\n .slice(0, 5)\n if (picked.length === 0) return\n const instruction = '按审稿意见修订(优先处理):\\n' + picked.map(i => `[${i.severity}] ${i.item} → ${i.suggestion}`).join('\\n')\n await handleWsRewrite(true, instruction)\n }\n\n /** 列表页「按意见修订」一键直达:不进工作区,直接按该章审稿意见全部修订(high 优先,\n * 无 high 用 medium,不足取前 3 条),修订完自动打开工作区展示草稿 + 自动审查结果。 */\n const handleReviseNow = async (no: number): Promise<void> => {\n const chapter = chapters.find(c => c.no === no)\n if (chapter?.review === undefined || chapter.review.issues.length === 0) {\n openWorkspace(no)\n return\n }\n const issues = chapter.review.issues\n const high = issues.filter(i => i.severity === 'high')\n const medium = issues.filter(i => i.severity === 'medium')\n const picked = high.length > 0 ? high : medium.length > 0 ? medium : issues\n const top = picked.slice(0, 5)\n const instruction = '按审稿意见修订(优先处理):\\n' + top.map(i => `[${i.severity}] ${i.item} → ${i.suggestion}`).join('\\n')\n setBusy(true)\n setBusyLabel(`${tt('plan.rewrite')} 第${no}章`)\n setError('')\n try {\n await api.rewrite(no, instruction, '', frame => { applyJobFrame(frame, n => tt('progress.rewriting', { no: n })) })\n await refresh(false)\n // 结果模式打开工作区:不展示旧意见,直接看草稿;开启自动审查时以「验证模式」跑一次\n // (携带本章原审稿报告:核对原意见解决情况 + 只挑新增 high,防止越修越多)。\n await openWorkspace(no, undefined, 'result')\n if (config?.autoReviewAfterRevise !== false) {\n setBusy(true)\n await autoCheckDraft(no, chapter.review)\n }\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`第 ${no} 章修订失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** 放弃草稿:保留原稿,仅清空草稿。 */\n const handleDraftDiscard = async (no: number): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await api.draftDiscard(no)\n setWorkspace(null)\n setWsResultMode(false)\n setDraftNo(null)\n pushProgress(`已放弃第 ${no} 章草稿,保留原稿`, 'info')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`放弃第 ${no} 章草稿失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\n\n /** Shared frame handler for generate/rewrite/polish streams. */\n const applyJobFrame = useCallback((frame: JobFrame, label: (no: number) => string) => {\n if (frame.type === 'start') {\n clearLiveProgress()\n setLiveBar(null)\n lastDeltaChars.current = 0\n liveChars.current = 0\n currentJobNo.current = frame.no\n // 任务开始:不自动弹出进度悬浮窗(导航「工作进度」显示呼吸绿点提示,\n // 想看进度时手动点导航打开;liveBar 数据照常累积)。\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === frame.no ? { ...c, status: 'generating', error: undefined } : c),\n })\n pushProgress(label(frame.no))\n } else if (frame.type === 'delta') {\n // One live row updated in place — no per-token console spam. The\n // server streams incremental text, so accumulate locally.\n const chars = (liveChars.current += frame.text.length)\n const target = project?.chapters.find(c => c.no === currentJobNo.current)?.targetChars ?? 0\n if (chars < 50 || chars - lastDeltaChars.current >= 200) {\n lastDeltaChars.current = chars\n const text = target > 0 ? `已生成 ${chars} / ${target} 字` : `已生成 ${chars} 字`\n const ratio = target > 0 ? Math.min(chars / target, 1) : undefined\n setLiveProgress(text, ratio)\n setLiveBar({ text, ratio })\n }\n } else if (frame.type === 'done' || frame.type === 'rewritten') {\n clearLiveProgress()\n setLiveBar(null)\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === frame.no ? { ...c, status: 'written', chars: frame.chars, file: frame.file, review: undefined } : c),\n })\n pushProgress(tt('progress.done', { no: frame.no, chars: frame.chars, file: frame.file }), 'done')\n setGeneratedFiles(prev => prev.includes(frame.file) ? prev : [...prev, frame.file])\n } else if (frame.type === 'review') {\n clearLiveProgress()\n setLiveBar(null)\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === frame.no ? { ...c, status: frame.report.passed ? 'approved' : 'rejected', review: frame.report } : c),\n })\n pushProgress(tt('progress.reviewed', {\n no: frame.no,\n score: frame.report.score,\n verdict: frame.report.verdict,\n }), frame.report.passed ? 'done' : 'error')\n } else if (frame.type === 'author-review') {\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === frame.no ? { ...c, authorReview: frame.review } : c),\n })\n const r = frame.review\n pushProgress(\n `📋 第${frame.no}章作者复盘:钩子${r.hookHonored ? '已兑现 ✓' : '未兑现 ✗'} · 结尾钩子 ${r.endingHook}/10 · ${r.plotlineProgress !== '' ? r.plotlineProgress : '无实质推进'}`,\n r.hookHonored && r.endingHook >= 6 ? 'done' : r.endingHook < 6 || !r.hookHonored ? 'error' : 'info',\n )\n } else if (frame.type === 'author-backfill-done') {\n clearLiveProgress()\n setLiveBar(null)\n pushProgress(`✅ 历史章节作者复盘补齐完成(共 ${frame.count} 章)`, 'done')\n void refresh(false)\n } else if (frame.type === 'drafted') {\n // 润色/重写完成:产物作为待确认草稿,展示在工作区预览,由用户决定。\n clearLiveProgress()\n setLiveBar(null)\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === frame.no ? { ...c, pendingDraft: frame.draft } : c),\n })\n pushProgress(`第 ${frame.no} 章润色完成(${frame.chars} 字),请查看预览后应用或放弃`)\n setDraftNo(frame.no)\n setWsShowDiff(false)\n setWorkspace(prev => prev !== null && prev.no === frame.no ? { ...prev, draft: frame.draft } : prev)\n } else if (frame.type === 'error') {\n clearLiveProgress()\n setLiveBar(null)\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === frame.no ? { ...c, status: 'error', error: frame.message } : c),\n })\n pushProgress(tt('progress.error', { no: frame.no, message: frame.message }), 'error')\n }\n }, [pushProgress, setLiveProgress, clearLiveProgress, project])\n\n /** Generate one chapter, streaming frames into the console. */\n const handleWriteChapter = async (no: number, skipReview: boolean): Promise<void> => {\n setBusy(true)\n setBusyLabel(`${tt('plan.write')} 第${no}章`)\n setError('')\n try {\n await api.generate(no, skipReview, frame => { applyJobFrame(frame, n => tt('progress.generating', { no: n, title: (project?.chapters.find(c => c.no === n)?.title ?? '') })) })\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`第 ${no} 章失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\n\n /** Batch-write all remaining chapters in sequence (auto-retry once per chapter). */\n const handleWriteAll = async (): Promise<void> => {\n const remaining = chapters.filter(c => c.status === 'pending' || c.status === 'error')\n if (remaining.length === 0) return\n setBusy(true)\n setBusyLabel(`${tt('plan.writeAllPending')}(共 ${remaining.length} 章)`)\n setError('')\n let failed = 0\n const sleep = (ms: number): Promise<void> => new Promise(resolve => setTimeout(resolve, ms))\n for (const chapter of remaining) {\n pushProgress(`▶ 开始生成第 ${chapter.no} 章《${chapter.title}》`)\n let lastError: unknown = null\n // 失败自动重试:最多尝试 2 次,间隔 3 秒(网络抖动/LLM 偶发失败自愈)。\n for (let attempt = 1; attempt <= 2; attempt++) {\n try {\n // 批量连写也走完整质量门:生成 → 自动审稿 → 作者复盘(false = 不跳过审稿)。\n await api.generate(chapter.no, false, frame => { applyJobFrame(frame, n => tt('progress.generating', { no: n, title: (project?.chapters.find(c => c.no === n)?.title ?? '') })) })\n lastError = null\n break\n } catch (err) {\n lastError = err\n if (attempt < 2) {\n pushProgress(`第 ${chapter.no} 章第 ${attempt} 次尝试失败(${(err as Error).message}),3 秒后自动重试…`, 'error')\n await sleep(3000)\n }\n }\n }\n if (lastError !== null) {\n failed++\n pushProgress(`第 ${chapter.no} 章失败:${(lastError as Error).message}`, 'error')\n }\n }\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n pushProgress(failed === 0\n ? `批量生成完成:${remaining.length} 章全部完成`\n : `批量生成结束:${remaining.length - failed} 章完成,${failed} 章失败`, failed === 0 ? 'done' : 'error')\n }\n\n /** Review one chapter. */\n const handleReview = async (no: number): Promise<void> => {\n setBusy(true)\n setBusyLabel(`${tt('plan.review')} 第${no}章`)\n setError('')\n try {\n const result = await api.review(no)\n const report: ReviewReport = result.report\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === no ? { ...c, status: report.passed ? 'approved' : 'rejected', review: report } : c),\n })\n pushProgress(tt('progress.reviewed', { no, score: report.score, verdict: report.verdict }), report.passed ? 'done' : 'error')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** Toggle chapter preview. */\n const handleToggleChapter = async (no: number): Promise<void> => {\n if (expandedChapter === no) {\n setExpandedChapter(null)\n setChapterText('')\n return\n }\n setExpandedChapter(no)\n setChapterText('')\n try {\n const result = await api.chapter(no)\n setChapterText(result.markdown)\n } catch (err) {\n setChapterText(`(${(err as Error).message})`)\n }\n }\n\n /** Suggest foreshadows via LLM. */\n const handleSuggestForeshadows = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel(tt('foreshadow.suggest'))\n setError('')\n try {\n const result = await api.foreshadow({ suggest: true })\n setProject(prev => prev === null ? prev : { ...prev, foreshadows: [...(prev?.foreshadows ?? []), ...result.foreshadows], updatedAt: new Date().toISOString() })\n pushProgress(`AI 已建议 ${result.foreshadows.length} 条伏笔`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`伏笔建议失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n }\n\n /** Save the settings draft. */\n const handleSaveConfig = async (): Promise<void> => {\n if (configDraft === null) return\n setBusy(true)\n setError('')\n try {\n const result = await api.patchConfig({\n outlinePath: configDraft.outlinePath,\n outputDir: configDraft.outputDir,\n provider: configDraft.provider,\n model: configDraft.model,\n reasoningEffort: configDraft.reasoningEffort ?? 'off',\n chapterChars: configDraft.chapterChars,\n maxTokens: configDraft.maxTokens,\n reviewPassScore: configDraft.reviewPassScore,\n autoReview: configDraft.autoReview,\n autoAuthorReview: configDraft.autoAuthorReview,\n autoReviewAfterRevise: configDraft.autoReviewAfterRevise,\n imageApiKey: configDraft.imageApiKey,\n imageApiModel: configDraft.imageApiModel,\n imageApiEnabled: configDraft.imageApiEnabled ?? false,\n })\n setConfig(result.config)\n setConfigDraft(result.config)\n setNotice(tt('settings.saved'))\n pushProgress(tt('settings.saved'), 'done')\n await refresh(false)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n /** Export the book. */\n const handleExport = async (format: 'txt' | 'md'): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.exportBook(format)\n setNotice(tt('settings.exported', { file: result.file, chars: result.chars, chapters: result.chapters }))\n pushProgress(tt('settings.exported', { file: result.file, chars: result.chars, chapters: result.chapters }), 'done')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n const busyAny = anyGenerating(project?.chapters)\n const chapters = project?.chapters ?? []\n const doneCount = chapters.filter(c => c.status === 'approved' || c.status === 'written' || c.status === 'rejected').length\n const pendingCount = chapters.filter(c => c.status === 'pending' || c.status === 'error').length\n const bible: StoryBible | undefined = project?.bible\n const volumes: Volume[] | undefined = project?.volumes\n const foreshadows: Foreshadow[] = project?.foreshadows ?? []\n\n /**\n * 定位章节:从待办/主行动卡跳到章节页的目标章——切 tab、解除卷筛选、\n * 展开所在卷,并滚动高亮(focusNo 驱动 useEffect 执行)。\n * 不强行展开章节详情:保持章节原有收起/展开状态,避免页面被撑开。\n */\n const gotoChapter = useCallback((no: number): void => {\n setActiveTab('plan')\n setSelectedVolume('all')\n // 展开目标章所在卷(从折叠列表移除该卷号)。\n const chapter = chapters.find(c => c.no === no)\n if (chapter !== undefined && chapter.volume > 0) {\n setCollapsedVolumes(prev => prev.filter(v => v !== chapter.volume))\n }\n setFocusNo(no)\n }, [chapters])\n\n /** focusNo 驱动:等 DOM 渲染后滚动到目标章并短暂高亮(3 秒后清除)。 */\n useEffect(() => {\n if (focusNo === null) return\n const timer = window.setTimeout(() => {\n const el = document.querySelector(`[data-chapter-no=\"${focusNo}\"]`)\n if (el !== null) {\n el.scrollIntoView({ behavior: 'smooth', block: 'center' })\n el.classList.add(css.chapterFocus)\n window.setTimeout(() => { el.classList.remove(css.chapterFocus) }, 3000)\n }\n setFocusNo(null)\n }, 350)\n return () => { window.clearTimeout(timer) }\n }, [focusNo])\n\n /** 章节按卷分组(未分卷章节单独一组;章节多时可按卷折叠浏览)。 */\n const chapterGroups = useMemo(() => {\n const groups: Array<{ no: number; title: string; chapters: ChapterPlan[] }> = []\n if (volumes !== undefined) {\n for (const v of volumes) {\n const list = chapters.filter(c => c.volume === v.no)\n if (list.length > 0) groups.push({ no: v.no, title: `第${v.no}卷 · ${v.title}`, chapters: list })\n }\n }\n const unassigned = chapters.filter(c => c.volume === 0)\n if (unassigned.length > 0) groups.push({ no: 0, title: '未分卷', chapters: unassigned })\n if (groups.length === 0) groups.push({ no: 0, title: '全部章节', chapters })\n return groups\n }, [chapters, volumes])\n\n // --------------------------------------------------- dashboard (workflow)\n const approvedCount = chapters.filter(c => c.status === 'approved').length\n const reviewPendingCount = chapters.filter(c => c.status === 'written' || c.status === 'rejected').length\n const writingNow = chapters.find(c => c.status === 'generating' || c.status === 'reviewing')\n const totalChars = chapters.reduce((sum, c) => sum + (c.chars ?? 0), 0)\n const firstChapter = chapters[0]\n const currentVolumeName = (() => {\n if (firstChapter === undefined || volumes === undefined || volumes.length === 0) return '—'\n const vol = volumes.find(v => v.no === firstChapter.volume)\n return vol !== undefined ? vol.title : `第 ${firstChapter.volume} 卷`\n })()\n const lastUpdated = project?.updatedAt !== undefined\n ? new Date(project.updatedAt).toLocaleString('zh-CN', { month: 'numeric', day: 'numeric', hour: '2-digit', minute: '2-digit' })\n : '—'\n\n /** 创作旅程 6 阶段(完成/当前/未到)。 */\n const journeyStages: Array<{ id: string; label: string; done: boolean }> = [\n { id: 'outline', label: '大纲', done: project !== null },\n { id: 'bible', label: '设定', done: bible !== undefined },\n { id: 'volumes', label: '卷计划', done: volumes !== undefined },\n { id: 'plan', label: '章节计划', done: chapters.length > 0 },\n { id: 'write', label: '正文', done: chapters.some(c => (c.chars ?? 0) > 0) },\n { id: 'review', label: '审稿', done: approvedCount > 0 },\n ]\n const journeyDoneCount = journeyStages.filter(s => s.done).length\n const journeyPercent = Math.round((journeyDoneCount / journeyStages.length) * 100)\n const currentStageId = journeyStages.find(s => !s.done)?.id\n\n /** 创作时间线阶段点击 → 跳转对应 tab。 */\n const jumpToStage = (id: string): void => {\n switch (id) {\n case 'outline': setActiveTab('overview'); break\n case 'bible': setActiveTab('book'); changeBookTab('bible'); break\n case 'volumes':\n case 'plan':\n case 'write': setActiveTab('plan'); break\n case 'review': setActiveTab('book'); changeBookTab('facts'); changeArchiveTab('reviews'); break\n }\n }\n\n /** 侧栏当前书卡(demo 风格):书架激活书 → 封面首字 / 书名 / 进度。 */\n const activeBook = shelf?.books.find(b => b.id === shelf?.activeBookId) ?? null\n const activeBookName = activeBook?.bookName ?? project?.bookName ?? '未选书'\n const activeBookMeta = activeBook !== null ? `${activeBook.done}/${activeBook.total} 章 · 点按打开书架` : '点按打开书架'\n const activeBookLetter = activeBookName.trim().charAt(0) || '书'\n\n /** 主行动卡片:推荐下一步(AI-Novel-Writing-Assistant 首页主卡模式)。 */\n const nextAction = useMemo((): { eyebrow: string; title: string; reason: string; actionLabel: string; onClick: () => void } | null => {\n if (project === null) {\n return {\n eyebrow: '开始你的第一本书',\n title: '导入小说大纲',\n reason: '从 docx 文件或粘贴文本开始,AI 会把一份大纲「编译」成完整的小说。',\n actionLabel: '导入大纲',\n onClick: () => { setActiveTab('overview') },\n }\n }\n if (bible === undefined) {\n return {\n eyebrow: '推荐下一步',\n title: '提炼道藏',\n reason: '人设、世界观、金手指规则、写作红线是后续所有生成的地基,越完整质量越高。',\n actionLabel: '生成道藏',\n onClick: () => { void handleBible() },\n }\n }\n if (volumes === undefined) {\n return {\n eyebrow: '推荐下一步',\n title: '规划全书卷结构',\n reason: '按剧情弧线划分卷,章节计划才有骨架可依。',\n actionLabel: '生成卷计划',\n onClick: () => { void handleVolumes() },\n }\n }\n if (chapters.length === 0) {\n return {\n eyebrow: '推荐下一步',\n title: '生成章节计划',\n reason: 'LLM 根据大纲拆解每章标题与剧情要点,然后就可以逐章生成正文。',\n actionLabel: '生成章节计划',\n onClick: () => { void handlePlan() },\n }\n }\n const drafting = chapters.find(c => c.pendingDraft !== undefined && c.pendingDraft !== '')\n if (drafting !== undefined) {\n return {\n eyebrow: '需要你确认',\n title: `第 ${drafting.no} 章有未采纳的润色草稿`,\n reason: '打开工作区查看对比,决定采纳新稿或保留原稿(原稿未被改动)。',\n actionLabel: '打开工作区',\n onClick: () => { void openWorkspace(drafting.no) },\n }\n }\n if (pendingCount > 0) {\n return {\n eyebrow: '继续创作',\n title: `还有 ${pendingCount} 章待生成`,\n reason: '批量生成剩余章节,顶部进度条会实时显示每章字数与进度。',\n actionLabel: `批量生成(${pendingCount})`,\n onClick: () => { void handleWriteAll() },\n }\n }\n if (reviewPendingCount > 0) {\n const firstPending = chapters.find(c => c.status === 'written' || c.status === 'rejected')\n return {\n eyebrow: '推荐下一步',\n title: `${reviewPendingCount} 章待审稿`,\n reason: '审稿通过后章节才算完成;不通过的可按意见在工作区修订。',\n actionLabel: '去审稿',\n onClick: () => { if (firstPending !== undefined) gotoChapter(firstPending.no) },\n }\n }\n return {\n eyebrow: '全部完成 🎉',\n title: '《' + project.bookName + '》已全部生成',\n reason: '可以去 AI 味润色(对比后采纳)、按卷复查或导出全本(TXT/MD)。',\n actionLabel: '导出全本',\n onClick: () => { void handleExport('txt') },\n }\n }, [project, bible, volumes, chapters, pendingCount, reviewPendingCount, openWorkspace, gotoChapter])\n\n /** 待办队列(失败/草稿/待审稿,点击直达)。 */\n const todos = useMemo(() => {\n const items: Array<{ tone: 'danger' | 'warning' | 'info' | 'success'; title: string; description: string; actionLabel: string; onClick: () => void }> = []\n for (const chapter of chapters) {\n if (chapter.status === 'error') {\n items.push({\n tone: 'danger',\n title: `第 ${chapter.no} 章《${chapter.title}》生成失败`,\n description: chapter.error ?? '',\n actionLabel: '去处理',\n onClick: () => { gotoChapter(chapter.no) },\n })\n }\n if (items.length >= 3) return items\n }\n const drafting = chapters.find(c => c.pendingDraft !== undefined && c.pendingDraft !== '')\n if (drafting !== undefined && items.length < 3) {\n items.push({\n tone: 'warning',\n title: `第 ${drafting.no} 章《${drafting.title}》有未采纳草稿`,\n description: '原稿未被改动,采纳或放弃由你决定',\n actionLabel: '打开工作区',\n onClick: () => { void openWorkspace(drafting.no) },\n })\n }\n for (const chapter of chapters) {\n if ((chapter.status === 'written' || chapter.status === 'rejected') && items.length < 3) {\n items.push({\n tone: 'info',\n title: `第 ${chapter.no} 章《${chapter.title}》待审稿`,\n description: chapter.status === 'rejected' ? '审稿未通过,可按意见修订' : '等待 AI 审稿确认',\n actionLabel: '去审稿',\n onClick: () => { gotoChapter(chapter.no) },\n })\n }\n }\n return items\n }, [chapters, openWorkspace, gotoChapter])\n\n /** 资产健康(设定/卷/写作资产/伏笔)。 */\n const assetSummary = (() => {\n const assets = project?.assets\n const parts: string[] = []\n if (assets?.genre !== undefined) parts.push(`题材:${assets.genre.name}`)\n if (assets?.primaryProgression !== undefined) parts.push(`推进:${assets.primaryProgression.name}`)\n if ((assets?.styleAssets?.length ?? 0) > 0) parts.push(`写法:${assets!.styleAssets!.length} 套`)\n return parts.length > 0 ? parts.join(' · ') : '题材 / 推进 / 写法未绑定'\n })()\n const assetCount = (() => {\n const assets = project?.assets\n let n = 0\n if (assets?.genre !== undefined) n++\n if (assets?.primaryProgression !== undefined) n++\n n += assets?.auxiliaryProgressions?.length ?? 0\n n += assets?.styleAssets?.length ?? 0\n n += assets?.antiAiRules?.length ?? 0\n return n\n })()\n\n return (\n <div className={css.panel} data-nf-theme={panelTheme}>\n {viewMode === 'shelf' ? (\n /* 书架首页:默认视图,选择一本书进入工作台或阅读页 */\n <ShelfView\n api={api}\n shelf={shelf ?? { books: [], activeBookId: null }}\n onOpenBook={async (id) => {\n await activateBook(id, 'workspace')\n }}\n onReadBook={async (id) => {\n await activateBook(id, 'reader')\n }}\n onAddBook={() => { setViewMode('create') }}\n />\n ) : viewMode === 'create' ? (\n /* 开书向导:独立页面 */\n <CreateBookView\n api={api}\n onBack={() => { setViewMode('shelf') }}\n onCreated={async (id) => {\n setBusy(true)\n try {\n setOutlineText('')\n setProject(null)\n setGeneratedFiles([])\n setChapterText('')\n setExpandedChapter(null)\n setProgress([])\n setAuditIssues(null)\n setCharCards(null)\n await refresh(false, true)\n await refreshShelf()\n setViewMode('workspace')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }}\n />\n ) : viewMode === 'reader' ? (\n /* 沉浸式阅读页:只读已写章节 */\n <ReaderView\n api={api}\n project={project ?? { bookName: '', outline: '', chapters: [], foreshadows: [], createdAt: '', updatedAt: '' }}\n onBack={() => { setViewMode('shelf') }}\n onOpenWorkspace={() => { setViewMode('workspace') }}\n />\n ) : (\n <>\n <div className={css.panelBody}>\n <nav className={`${css.panelNav} ${navCollapsed ? css.panelNavCollapsed : ''}`} role=\"tablist\" aria-label=\"工作台导航\">\n {/* 标题区:小说工坊 + 当前书名(顶部标题栏取消后移入侧栏) */}\n <div className={css.navTitle}>\n <div className={css.navTitleLogo}>书</div>\n {!navCollapsed && (\n <div style={{ minWidth: 0 }}>\n <div className={css.navTitleName}>小说工坊</div>\n <div className={css.navTitleBook} title={project?.bookName ?? ''}>\n {project?.bookName !== undefined && project.bookName !== '' ? `📖 ${project.bookName}` : '未选书'}\n </div>\n </div>\n )}\n </div>\n {/* 分组导航(创作 / 工具 / 数据库) */}\n {NAV_GROUPS.map(group => (\n <div key={group.id} className={css.navGroup}>\n {!navCollapsed && <div className={css.navGroupLabel}>{group.label}</div>}\n {group.items.map(tab => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={activeTab === tab.id || (tab.id === 'assistant' && assistantOpen) || (tab.id === 'progress' && progressOpen)}\n data-active={activeTab === tab.id || (tab.id === 'assistant' && assistantOpen) || (tab.id === 'progress' && progressOpen) ? '' : undefined}\n className={css.navTab}\n title={tab.label}\n onClick={() => {\n if (tab.id === 'assistant') {\n setAssistantOpen(true)\n } else if (tab.id === 'progress') {\n setProgressOpen(v => !v)\n } else {\n setActiveTab(tab.id)\n }\n }}\n >\n <span className={css.navTabIcon}>{tab.icon}</span>\n {!navCollapsed && <span className={css.navTabLabel}>{tab.label}</span>}\n {/* 状态角标:章节待办 / 伏笔待埋 / 工作流进度 */}\n {tab.id === 'plan' && (pendingCount > 0 || reviewPendingCount > 0) && (\n <span className={`${css.navTabBadge} ${chapters.some(c => c.status === 'error') ? css.navTabBadgeDanger : css.navTabBadgeWarn}`}>\n {chapters.some(c => c.status === 'error') ? `!${pendingCount + reviewPendingCount}` : pendingCount + reviewPendingCount}\n </span>\n )}\n {tab.id === 'plotlines' && foreshadows.some(f => f.status === 'planned') && (\n <span className={css.navTabBadge}>{foreshadows.filter(f => f.status === 'planned').length}</span>\n )}\n {tab.id === 'workflow' && chapters.length > 0 && (\n <span className={`${css.navTabBadge} ${css.navTabBadgeDone}`}>{journeyPercent}%</span>\n )}\n {/* 任务进行中:工作进度导航显示呼吸绿点(悬停看任务名),不自动弹窗 */}\n {tab.id === 'progress' && busy && (\n <span\n className={`${css.navTabBadge} ${css.navTabBadgeLive}`}\n title={busyLabel !== '' ? `任务中:${busyLabel}` : '任务进行中'}\n >\n ●\n </span>\n )}\n </button>\n ))}\n {!navCollapsed && <div className={css.navGroupSep} />}\n </div>\n ))}\n {/* 设置沉底 */}\n <div className={css.navSpacer} />\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={activeTab === SETTINGS_TAB.id}\n data-active={activeTab === SETTINGS_TAB.id ? '' : undefined}\n className={css.navTab}\n title={SETTINGS_TAB.label}\n onClick={() => { setActiveTab(SETTINGS_TAB.id) }}\n >\n <span className={css.navTabIcon}>{SETTINGS_TAB.icon}</span>\n {!navCollapsed && <span className={css.navTabLabel}>{SETTINGS_TAB.label}</span>}\n </button>\n {/* 当前书切换卡(demo 风格底部内容卡:封面首字 + 书名 + 进度,点击回书架) */}\n {!navCollapsed && shelf !== null && (\n <button\n type=\"button\"\n className={css.bookSwitch}\n title={activeBook !== null ? `当前书:${activeBook.bookName}(${activeBook.outputDir})· 点击打开书架` : '打开书架'}\n onClick={() => { setViewMode('shelf') }}\n >\n <span className={css.bookSwitchCover}>{activeBookLetter}</span>\n <span style={{ minWidth: 0, display: 'flex', flexDirection: 'column' }}>\n <span className={css.bookSwitchName}>{activeBookName}</span>\n <span className={css.bookSwitchMeta}>{activeBookMeta}</span>\n </span>\n <span className={css.bookSwitchArrow}>⌄</span>\n </button>\n )}\n {/* 关于:版本 + GitHub + 更新检测 */}\n <div className={css.navAbout}>\n <button\n type=\"button\"\n className={css.navAboutRow}\n title=\"打开 GitHub 仓库\"\n onClick={() => { window.open(REPO_URL, '_blank', 'noopener') }}\n >\n <span>ℹ️ v{PLUGIN_VERSION}</span>\n <span className={css.meta}>GitHub ↗</span>\n </button>\n {npmLatest !== null && npmLatest !== PLUGIN_VERSION && (\n <button\n type=\"button\"\n className={css.navAboutUpdate}\n title=\"查看更新方法\"\n onClick={() => {\n window.alert(\n `检测到新版本 v${npmLatest}(当前 v${PLUGIN_VERSION})\\n\\n更新方式:\\n\\n【npm 安装】\\ncd ~/.dsh/profiles/web && pnpm add @waterwx/dsh-novel-forge@latest\\n然后重启 dsh web\\n\\n【GitHub 安装】\\ndsh plugin --profile web add github:watersxya/dsh-novel-forge\\n\\n【本地开发】\\n拉取最新代码 → pnpm install && pnpm build → 重启 dsh web`,\n )\n }}\n >\n 📦 有新版本 v{npmLatest}\n </button>\n )}\n </div>\n {/* 操作行:收起导航 / 关闭面板(原顶部按钮下放,收起态保留图标) */}\n <div className={css.navActions}>\n <button\n type=\"button\"\n className={css.navActionBtn}\n title={navCollapsed ? '展开导航栏' : '收起导航栏'}\n aria-label={navCollapsed ? '展开导航栏' : '收起导航栏'}\n onClick={() => {\n setNavCollapsed(prev => {\n const next = !prev\n try { window.localStorage.setItem('dsh-novel-forge.nav.collapsed', String(next)) } catch { /* ignore */ }\n return next\n })\n }}\n >\n {navCollapsed ? '▸' : '◂'}\n </button>\n <button\n type=\"button\"\n className={css.navActionBtn}\n title={tt('common.close')}\n aria-label={tt('common.close')}\n onClick={() => { controller.close() }}\n >\n ×\n </button>\n </div>\n </nav>\n <div className={css.panelContent}>\n {error !== '' && <div className={css.card} style={{ borderColor: 'var(--nf-error)' }}><span style={{ color: 'var(--nf-error)' }}>{tt('common.error')}: {error}</span></div>}\n {notice !== '' && <div className={css.card}><span style={{ color: 'var(--nf-success)' }}>{notice}</span></div>}\n\n {/* 遗留草稿提示:刷新页面后仍有未采纳的润色/修订草稿 */}\n {workspace === null && draftNo !== null && (\n <div className={css.card} style={{ borderColor: 'var(--nf-info)' }}>\n <div className={css.busyRow}>\n <span style={{ color: 'var(--nf-info)' }}>第 {draftNo} 章有未采纳的润色/修订草稿(原稿未被改动)</span>\n <span style={{ display: 'flex', gap: 8 }}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void openWorkspace(draftNo) }}>\n 打开工作区\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void handleDraftDiscard(draftNo) }}>\n 放弃\n </button>\n </span>\n </div>\n </div>\n )}\n\n {/* 章节编辑页(独占整页:点「编辑」进入,返回后回到原页面;无卡片盒子,撑满内容区) */}\n {workspace !== null && (\n <div className={css.wsPage}>\n <div className={css.wsPageHeader}>\n {workspace.applied === true ? (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} onClick={() => { setWorkspace(null); setWsResultMode(false); gotoChapter(workspace.no) }} title=\"关闭工作区,返回章节页并定位到本章(滚动 + 高亮)\">\n ← 返回章节页\n </button>\n ) : (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setWorkspace(null); setWsResultMode(false) }} title=\"返回章节列表(草稿不丢失)\">\n ← 返回\n </button>\n )}\n <span className={css.cardTitle}>第 {workspace.no} 章《{workspace.title}》</span>\n <span className={css.meta}>{workspace.original.length} 字</span>\n <span style={{ display: 'flex', gap: 4, alignItems: 'center', marginLeft: 'auto' }}>\n <button type=\"button\" className={css.iconButton} title=\"减小字号\" aria-label=\"减小字号\" onClick={() => { changeEditorFontSize(editorFontSize - 1) }}>A−</button>\n <span className={css.meta}>{editorFontSize}px</span>\n <button type=\"button\" className={css.iconButton} title=\"增大字号\" aria-label=\"增大字号\" onClick={() => { changeEditorFontSize(editorFontSize + 1) }}>A+</button>\n <button type=\"button\" className={css.iconButton} title=\"关闭工作区\" aria-label=\"关闭工作区\" onClick={() => { setWorkspace(null); setWsResultMode(false) }}>×</button>\n </span>\n </div>\n {workspace.applied === true && (\n <div className={css.wsAppliedBanner}>\n ✅ 已采纳第 {workspace.no} 章新稿({workspace.original.length} 字)· 原稿已自动备份 .bak\n {wsCheckReport !== null ? (\n <span style={{ color: wsCheckReport.passed ? 'var(--nf-success)' : 'var(--nf-error)' }}>\n {' · '}修订时审查:{wsCheckReport.score} 分 — {wsCheckReport.passed ? '通过 ✓' : '未通过,可继续勾选意见修订'}\n </span>\n ) : (\n <span className={css.meta}>{' · '}需要结论?点「🔍 AI 审查」查看</span>\n )}\n </div>\n )}\n {workspace.applied !== true && wsResultMode && (\n <div className={css.wsAppliedBanner} style={{ borderColor: 'var(--nf-accent)', background: 'color-mix(in srgb, var(--nf-accent) 8%, transparent)' }}>\n ✅ 修订完成,请查看草稿对比\n {wsCheckReport !== null && (\n <span style={{ color: wsCheckReport.passed ? 'var(--nf-success)' : 'var(--nf-error)' }}>\n {' · '}草稿审查:{wsCheckReport.score} 分 — {wsCheckReport.passed ? '通过 ✓' : '未通过,可勾选意见继续修订'}\n </span>\n )}\n <span className={css.meta}>{' · '}满意后点「✅ 应用并保存」落盘</span>\n </div>\n )}\n <div className={css.wsColumns}>\n <div className={css.wsColumn}>\n <div className={css.meta}>\n 原文({workspace.original.length} 字)— 在正文中选中文字可作为「修订选中」的局部目标\n </div>\n <textarea\n ref={wsEditorRef}\n className={`${css.textarea} ${css.wsEditor}`}\n style={{ fontSize: editorFontSize }}\n value={workspace.original}\n onChange={e => { setWorkspace({ ...workspace, original: e.target.value }) }}\n onMouseUp={captureWsSelection}\n onKeyUp={captureWsSelection}\n onSelect={captureWsSelection}\n spellCheck={false}\n />\n </div>\n <div className={css.wsColumn}>\n <div className={css.meta} style={{ fontWeight: 600 }}>AI 修正指令</div>\n <textarea\n className={css.textarea}\n style={{ minHeight: 60 }}\n placeholder=\"输入修正要求,例如:压缩冗余、加强冲突、这段对话更口语化…(可留空)\"\n value={workspace.instruction}\n onChange={e => { setWorkspace({ ...workspace, instruction: e.target.value }) }}\n />\n {wsSelected !== '' ? (\n <div className={css.wsSelected}>\n <div className={css.meta}>当前选中内容(将用于精准修订)</div>\n <div className={css.wsSelectedText}>{wsSelected}</div>\n </div>\n ) : (\n <div className={css.meta}>未选中内容时仅支持整章润色/修订。</div>\n )}\n <div className={css.row} style={{ flexWrap: 'wrap' }}>\n {(wsCheckReport !== null && wsCheckReport.issues.length > 0) ? (\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n disabled={busy || wsChecked.length === 0}\n onClick={() => { void handleWsReviseByReport() }}\n title=\"按下方勾选的意见自动修订整章;产出草稿后自动附带一次 AI 审查\"\n >\n 🔧 按意见修订({wsChecked.length})\n </button>\n ) : (\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n disabled={busy || workspace.instruction.trim() === ''}\n onClick={() => { void handleWsRewrite(true) }}\n title=\"按指令框内容整章修订\"\n >\n 🔧 整章修订\n </button>\n )}\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleWsPolish() }}>\n ✨ 去AI味润色\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy || workspace.original.trim().length < 50} onClick={() => { void handleWsSave() }} title=\"有草稿则应用草稿,无草稿则保存当前编辑;沿用审查结论或自动审稿,落盘后原地显示结果\">\n ✅ 应用并保存\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || wsSelected === ''} onClick={() => { void handleWsRewrite(false) }} title=\"只修订在左栏选中的文字片段\">\n 📝 修订选中\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || workspace.original.trim().length < 50} onClick={() => { void handleWsCheck() }} title=\"对当前正文跑一次 AI 审查(不落盘)\">\n 🔍 AI 审查\n </button>\n {workspace.draft !== null && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void handleDraftDiscard(workspace.no) }} title=\"放弃草稿,保留原稿\">\n ↩️ 放弃草稿\n </button>\n )}\n </div>\n {/* 手动编辑后的 AI 审查结果 */}\n {wsCheckReport !== null && (\n <div className={css.wsPreview} style={{ borderColor: wsCheckReport.passed ? 'var(--nf-success)' : 'var(--nf-warn)' }}>\n <div className={css.busyRow}>\n <span className={css.meta} style={{ fontWeight: 600 }}>AI 审查结果</span>\n <span style={{ color: wsCheckReport.passed ? 'var(--nf-success)' : 'var(--nf-error)' }}>\n {wsCheckReport.score} 分 — {wsCheckReport.passed ? '通过' : '未通过'}\n </span>\n </div>\n <div className={css.meta}><b>总评:</b>{wsCheckReport.verdict}</div>\n {wsCheckReport.issues.length > 0 && (\n <ul style={{ margin: 0, paddingLeft: 16, display: 'flex', flexDirection: 'column', gap: 3, fontSize: editorFontSize - 1, maxHeight: '45vh', overflowY: 'auto' }}>\n {wsCheckReport.issues.map((issue, i) => (\n <li key={i} style={{ color: severityColor(issue.severity), display: 'flex', gap: 6, alignItems: 'flex-start' }}>\n <input\n type=\"checkbox\"\n style={{ marginTop: 1 }}\n checked={wsChecked.includes(i)}\n onChange={e => {\n setWsChecked(prev => e.target.checked ? [...prev, i] : prev.filter(x => x !== i))\n }}\n title=\"勾选后由「按意见修订」一起修订\"\n />\n <span>\n [{issue.severity}] {issue.item}\n {issue.suggestion !== '' && <span style={{ color: 'var(--nf-text-2)' }}> → {issue.suggestion}</span>}\n </span>\n </li>\n ))}\n </ul>\n )}\n <span className={css.meta}>\n {wsCheckReport.passed\n ? '当前意见:已通过。勾选想微调的问题点「按意见修订」,或直接「✅ 应用并保存」。'\n : '意见只读不落盘;勾选要修的问题点「🔧 按意见修订」一键修订(默认已勾 high),满意后点「✅ 应用并保存」写入文件(原稿自动备份 .bak)。'}\n </span>\n </div>\n )}\n {workspace.draft !== null && (\n <div className={css.wsPreview} style={{ flex: 1, minHeight: 0 }}>\n <div className={css.busyRow}>\n <span className={css.meta}>优化预览({workspace.draft.length} 字)</span>\n <span style={{ display: 'flex', gap: 8 }}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setWsShowDiff(v => !v) }}>\n {wsShowDiff ? '显示文本' : '查看对比'}\n </button>\n </span>\n </div>\n {wsShowDiff\n ? <DiffList original={workspace.original} draft={workspace.draft} fontSize={editorFontSize} />\n : <pre className={css.wsPreviewText} style={{ fontSize: editorFontSize }}>{workspace.draft}</pre>}\n <span className={css.meta}>满意后点上方「✅ 应用并保存」落盘(原稿自动备份 .bak);不满意可继续修订。</span>\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* 编辑页打开时独占整页:隐藏其余所有页面内容 */}\n {workspace === null && (<>\n {activeTab === 'workflow' && (\n <>\n {/* ⭐ 主行动大卡片 */}\n <div className={css.dashHero}>\n <div className={css.dashHeroEyebrow}>\n <span className={css.dashHeroSparkle}>✨</span>\n {nextAction?.eyebrow ?? '开始'}\n </div>\n {project !== null && (\n <div className={css.dashHeroTitle}>\n <span className={css.meta}>正在创作</span>\n <h3 className={css.dashHeroBook}>《{project.bookName}》</h3>\n </div>\n )}\n {nextAction !== null && (\n <div className={css.dashHeroAction}>\n <span className={css.dashHeroArrow}>→</span>\n <div className={css.dashHeroActionBody}>\n <div className={css.dashHeroActionTitle}>{nextAction.title}</div>\n <div className={css.meta}>{nextAction.reason}</div>\n </div>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { nextAction.onClick() }}>\n {nextAction.actionLabel}\n </button>\n </div>\n )}\n {/* 创作旅程进度 */}\n <div className={css.dashJourney}>\n <div className={css.busyRow}>\n <span className={css.meta} style={{ fontWeight: 600 }}>创作旅程</span>\n <span className={css.meta}>{journeyPercent}% · 已完成 {journeyDoneCount}/{journeyStages.length} 步</span>\n </div>\n <div className={css.tlBar}>\n {journeyStages.map(stage => (\n <button\n key={stage.id}\n type=\"button\"\n className={`${css.tlSeg} ${stage.done ? css.tlSegDone : stage.id === currentStageId ? css.tlSegCurrent : css.tlSegTodo}`}\n title={`${stage.label}${stage.done ? ' · 已完成' : stage.id === currentStageId ? ' · 进行中' : ' · 未开始'}(点击跳转)`}\n onClick={() => { jumpToStage(stage.id) }}\n >\n <span className={css.tlSegTrack}><span className={css.tlSegFill} /></span>\n <span className={css.tlSegLabel}>{stage.done ? '✓ ' : ''}{stage.label}</span>\n </button>\n ))}\n </div>\n </div>\n </div>\n\n {/* 统计卡(demo 风格:今日待写 / 写作中 / 已通过 / 待审稿) */}\n <div className={css.statRowD}>\n <div className={css.statCardD}>\n <div style={{ minWidth: 0 }}>\n <div className={css.statCardDLabel}>今日待写</div>\n <div className={css.statCardDValue}>{pendingCount} <span className={css.statCardDUnit}>章</span></div>\n <div className={css.statCardDDetail}>\n {chapters.some(c => c.status === 'error') ? `含 error ${chapters.filter(c => c.status === 'error').length} 章` : '待生成队列'}\n </div>\n </div>\n <div className={css.statCardDIcon}>📝</div>\n </div>\n <div className={css.statCardD}>\n <div style={{ minWidth: 0 }}>\n <div className={css.statCardDLabel}>写作中</div>\n <div className={css.statCardDValue}>{chapters.filter(c => c.status === 'generating' || c.status === 'reviewing').length} <span className={css.statCardDUnit}>章</span></div>\n <div className={css.statCardDDetail}>{writingNow !== undefined ? `第 ${writingNow.no} 章 · ${writingNow.title}` : '无进行中任务'}</div>\n </div>\n <div className={css.statCardDIcon}>✍️</div>\n </div>\n <div className={css.statCardD}>\n <div style={{ minWidth: 0 }}>\n <div className={css.statCardDLabel}>已通过</div>\n <div className={css.statCardDValue}>{approvedCount} <span className={css.statCardDUnit}>章</span></div>\n <div className={css.statCardDDetail}>{chapters.length > 0 ? `占全书 ${Math.round((approvedCount / chapters.length) * 100)}%` : '尚无已通过章节'}</div>\n </div>\n <div className={css.statCardDIcon}>✅</div>\n </div>\n <div className={css.statCardD}>\n <div style={{ minWidth: 0 }}>\n <div className={css.statCardDLabel}>待审稿</div>\n <div className={css.statCardDValue}>{reviewPendingCount} <span className={css.statCardDUnit}>章</span></div>\n <div className={`${css.statCardDDetail} ${reviewPendingCount > 0 ? css.statCardDDown : ''}`}>\n {`written ${chapters.filter(c => c.status === 'written').length} · rejected ${chapters.filter(c => c.status === 'rejected').length}`}\n </div>\n </div>\n <div className={`${css.statCardDIcon} ${css.statCardDIconRed}`}>⚠️</div>\n </div>\n </div>\n {/* 补充统计:总字数 / 当前卷 / 最近创作(原有数据保留) */}\n <div className={css.assetGrid}>\n <StatCell label=\"总字数\" value={String(totalChars)} detail=\"已生成正文累计\" />\n <StatCell label=\"当前卷\" value={currentVolumeName} valueFontSize={13} detail=\"正在推进的卷\" />\n <StatCell label=\"最近创作\" value={lastUpdated} valueFontSize={13} detail=\"最近生成/编辑时间\" />\n </div>\n\n {/* 资产健康:独占一行(道藏/卷计划/写作资产/伏笔 + 全书质检) */}\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>资产健康</span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || doneCount === 0} onClick={() => { void handleAudit() }} title=\"LLM 扫描全本已生成章节,检查人名/境界/资源/时间线矛盾\">\n 🔍 全书质检\n </button>\n </div>\n {auditStatus?.status === 'running' && (\n <div className={css.meta} style={{ marginTop: 8 }}>\n 🔍 全书质检中:{auditStatus.completedBatches}/{auditStatus.totalBatches > 0 ? auditStatus.totalBatches : '…'} 批\n {auditStatus.totalBatches > 0 && (\n <div className={css.dashJourneyBar} style={{ marginTop: 4 }}>\n <div className={css.dashJourneyFill} style={{ width: `${Math.round((auditStatus.completedBatches / auditStatus.totalBatches) * 100)}%` }} />\n </div>\n )}\n </div>\n )}\n {auditStatus?.status === 'error' && auditStatus.error !== undefined && (\n <div className={css.meta} style={{ color: 'var(--nf-error)', marginTop: 8 }}>全书质检失败:{auditStatus.error}</div>\n )}\n <div className={css.assetGrid}>\n <StatCell\n label=\"道藏\"\n value={bible !== undefined ? `✓ ${bible.worldRules.length} 条规则` : '未生成'}\n valueColor={bible !== undefined ? 'var(--nf-success)' : 'var(--nf-text-3)'}\n detail={bible !== undefined ? `${bible.characters.length} 人物 · ${bible.redLines.length} 红线` : '提炼人设 / 世界观 / 金手指'}\n />\n <StatCell\n label=\"卷计划\"\n value={volumes !== undefined ? `${volumes.length} 卷` : '未生成'}\n valueColor={volumes !== undefined ? 'var(--nf-success)' : 'var(--nf-text-3)'}\n detail={volumes !== undefined ? volumes.map(v => v.title).join(' / ') : '按剧情弧线划分全书'}\n detailTitle={volumes?.map(v => v.title).join(' / ')}\n />\n <StatCell\n label=\"写作资产\"\n value={`${assetCount} 项`}\n valueColor={assetCount > 0 ? 'var(--nf-success)' : 'var(--nf-text-3)'}\n detail={assetSummary}\n detailTitle={assetSummary}\n />\n <StatCell\n label=\"伏笔\"\n value={`${foreshadows.length} 条`}\n detail={`${foreshadows.filter(f => f.status === 'planned').length} 待埋 · ${foreshadows.filter(f => f.status === 'resolved').length} 已回收`}\n />\n </div>\n </div>\n\n {/* 剧情线进度 | 作者复盘趋势:精简摘要卡,并排(点击跳转详情页) */}\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))', gap: 14, alignItems: 'stretch' }}>\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>🧵 {tt('plotlines.workflowTitle')}({(project?.plotlines ?? []).length} 条)</span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setActiveTab('plotlines') }} title=\"查看完整剧情线管理页\">\n 查看全部 →\n </button>\n </div>\n {(() => {\n const all = project?.plotlines ?? []\n const active = all.filter(l => l.status === 'active').length\n const paused = all.filter(l => l.status === 'paused').length\n const resolved = all.filter(l => l.status === 'resolved').length\n const main = all.find(l => l.kind === 'main' && l.status === 'active')\n const withLinks = all.filter(l => l.chapters.length > 0)\n const latest = withLinks.sort((a, b) => Math.max(...b.chapters) - Math.max(...a.chapters))[0]\n if (all.length === 0) return <span className={css.meta}>{tt('plotlines.workflowEmpty')}</span>\n return (\n <span className={css.meta}>\n {active} 推进中 · {paused} 暂停 · {resolved} 已完结\n {main !== undefined && <> · 主线:{main.name}</>}\n {latest !== undefined && <> · 最近推进:{latest.name}(第 {Math.max(...latest.chapters)} 章)</>}\n </span>\n )\n })()}\n </div>\n\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>📋 作者复盘(最近 {Math.min(6, chapters.filter(c => c.authorReview !== undefined).length)} 章)</span>\n <div className={css.row}>\n {(() => {\n const missing = chapters.filter(c => c.status !== 'pending' && c.status !== 'generating' && c.status !== 'error' && c.authorReview === undefined).length\n return missing > 0 && (\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy}\n onClick={() => { void handleAuthorBackfillAll() }}\n title=\"对历史已写章节逐章补跑作者复盘(不重新生成正文,每章约 2000 token)\"\n >\n ↻ 补齐({missing})\n </button>\n )\n })()}\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setActiveTab('book'); changeBookTab('facts'); changeArchiveTab('reviews') }} title=\"查看按卷分组的全部复盘记录\">\n 查看全部 →\n </button>\n </div>\n </div>\n {(() => {\n const reviewed = chapters.filter(c => c.authorReview !== undefined)\n if (reviewed.length === 0) {\n return <span className={css.meta}>尚无作者复盘——生成/审稿后自动生成,或点「补齐」为已写章节补跑。</span>\n }\n const honored = reviewed.filter(c => c.authorReview!.hookHonored).length\n const avg = Math.round(reviewed.reduce((s, c) => s + c.authorReview!.endingHook, 0) / reviewed.length * 10) / 10\n const last = reviewed[reviewed.length - 1]!\n return (\n <span className={css.meta}>\n 钩子兑现 {honored}/{reviewed.length} · 结尾钩子均分 {avg} · 最近:第 {last.no} 章(钩子{last.authorReview!.hookHonored ? '✓' : '✗'} {last.authorReview!.endingHook}/10)\n </span>\n )\n })()}\n </div>\n </div>\n\n {/* 全书质检结果 */}\n {auditIssues !== null && (\n <div className={css.card} style={{ borderColor: auditIssues.length > 0 ? 'var(--nf-error)' : 'var(--nf-success)' }}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>\n 🔍 全书质检{auditIssues.length === 0 ? ':未发现矛盾 🎉' : `:${auditIssues.length} 处疑似矛盾`}\n </span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setAuditIssues(null) }}>\n 收起\n </button>\n </div>\n {auditIssues.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {auditIssues.map((issue, i) => (\n <AuditIssueRow\n key={i}\n issue={issue}\n disabled={busy}\n onFix={() => { void openWorkspace(issue.chapterNo, `按质检意见修订:${issue.item}(建议:${issue.suggestion})`) }}\n />\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* 待办队列(活动输出已移入「工具 → 工作进度」悬浮窗) */}\n <div className={css.card}>\n <span className={css.cardTitle}>待办队列</span>\n {todos.length === 0 ? (\n <span className={css.meta}>🎉 暂无待办,一切顺畅</span>\n ) : (\n todos.map((todo, i) => (\n <TodoRow\n key={i}\n tone={todo.tone}\n title={todo.title}\n description={todo.description}\n actionLabel={todo.actionLabel}\n disabled={busy}\n onAction={todo.onClick}\n />\n ))\n )}\n </div>\n </>\n )}\n\n {activeTab === 'overview' && (\n <>\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>{tt('tab.overview')}</span>\n {project !== null && (\n <div className={css.row}>\n <span className={css.meta}>\n {tt('overview.bookName')}: {project.bookName} · {project.outline.length} 字\n {project.outlinePath !== undefined && <span> · {project.outlinePath}</span>}\n </span>\n <button type=\"button\" className={css.button} disabled={busy} onClick={() => { handleToggleUpdateOutline() }}>\n {updatingOutline ? '收起' : '更新大纲'}\n </button>\n </div>\n )}\n </div>\n {project === null ? (\n <>\n {/* 未开书:导入大纲(开书动作) */}\n <div\n className={`${css.dropzone} ${dragActive ? css.dropzoneActive : ''}`}\n onClick={() => { fileInputRef.current?.click() }}\n onDragOver={e => { e.preventDefault(); setDragActive(true) }}\n onDragLeave={() => { setDragActive(false) }}\n onDrop={e => {\n e.preventDefault()\n setDragActive(false)\n const file = e.dataTransfer.files?.[0]\n if (file !== undefined) void handleDocxFile(file)\n }}\n >\n <span className={css.dropzoneIcon}>📄</span>\n <span>点击选择本机 docx 大纲,或将文件拖到这里</span>\n <span className={css.meta}>也支持粘贴文本到下方编辑区</span>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".docx,application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n style={{ display: 'none' }}\n onChange={e => {\n const file = e.target.files?.[0]\n if (file !== undefined) void handleDocxFile(file)\n e.target.value = ''\n }}\n />\n </div>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.meta}>{tt('overview.outlineChars')}: {outlineText.length}</span>\n <button type=\"button\" className={css.button} disabled={busy || outlineText.length < 50} onClick={() => { void handleSaveOutline() }}>\n {tt('overview.saveOutline')}\n </button>\n </div>\n <textarea\n className={css.textarea}\n value={outlineText}\n placeholder={tt('overview.outlineHint')}\n onChange={e => { setOutlineText(e.target.value) }}\n spellCheck={false}\n />\n </>\n ) : updatingOutline ? (\n <>\n <div className={css.meta}>\n 大纲是本书的「出生证明」。更新时请二选一:<b>仅更新文本</b>(保留设定/章节/正文全部进度),或\n <b>重置项目</b>(从新总纲重新开始,清空道藏/卷/章节/正文/暗线/资产/编年录,不可恢复)。\n </div>\n <textarea\n className={css.textarea}\n value={outlineText}\n placeholder=\"粘贴新版大纲文本…\"\n onChange={e => { setOutlineText(e.target.value) }}\n spellCheck={false}\n />\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy || outlineText.length < 50} onClick={() => { void handleSaveOutline() }}>\n 仅更新文本(保留进度)\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonDanger}`} disabled={busy || outlineText.length < 50} onClick={() => { void handleResetProject() }}>\n 重置项目并更新(清空进度)\n </button>\n <span className={css.meta}>{outlineText.length} 字</span>\n </div>\n </>\n ) : (\n /* 只读展示:大纲是开书时的出生证明 */\n <pre className={css.outlineReadonly}>{project.outline}</pre>\n )}\n </div>\n <div className={css.card}>\n <span className={css.cardTitle}>{tt('status.files')}({generatedFiles.length})</span>\n <div className={css.fileList}>\n {generatedFiles.length === 0 && <span>{tt('status.projectNone')}</span>}\n {generatedFiles.map(file => <span key={file}>{file}</span>)}\n </div>\n </div>\n </>\n )}\n\n {/* 卷首语:面向读者的作品门面 */}\n {activeTab === 'blurb' && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>📖 简介 / 封面</span>\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy || project === null} onClick={() => { void handleBlurbGenerate() }}>\n ✨ AI 生成\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || project === null || blurbDraft.trim() === ''} onClick={() => { void handleBlurbComplete() }}>\n ✍️ AI 补全\n </button>\n {project?.blurb !== undefined && (\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy || project === null}\n onClick={() => {\n if (window.confirm('重新生成会覆盖当前简介(可先复制保存),确定?')) void handleBlurbGenerate()\n }}\n >\n 🔄 重新生成\n </button>\n )}\n </div>\n </div>\n {/* 书名(可改名,同步书架) */}\n <div className={css.row}>\n <input\n className={css.input}\n style={{ flex: 1, maxWidth: 320 }}\n placeholder=\"书名\"\n value={bookNameDraft}\n onChange={e => { setBookNameDraft(e.target.value) }}\n onKeyDown={e => { if (e.key === 'Enter') void handleRename() }}\n />\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy || bookNameDraft.trim() === '' || bookNameDraft.trim() === project?.bookName}\n onClick={() => { void handleRename() }}\n >\n 💾 改书名\n </button>\n </div>\n {/* 封面 */}\n <div className={css.row} style={{ alignItems: 'flex-start', gap: 14 }}>\n <div className={css.coverPreview}>\n {coverDataUrl !== null ? (\n <img src={coverDataUrl} alt=\"封面\" />\n ) : (\n <span className={css.coverPlaceholder}>暂无封面</span>\n )}\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || project === null} onClick={() => { coverFileRef.current?.click() }}>\n 📤 上传封面\n </button>\n <input\n ref={coverFileRef}\n type=\"file\"\n accept=\"image/png,image/jpeg,image/webp\"\n style={{ display: 'none' }}\n onChange={e => {\n handleCoverUpload(e.target.files?.[0])\n e.target.value = ''\n }}\n />\n {coverDataUrl !== null && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void handleCoverRemove() }}>\n 🗑️ 移除\n </button>\n )}\n </div>\n <span className={css.meta}>支持 PNG / JPG / WebP,建议 3:4 竖版;保存于输出目录 cover.*。</span>\n </div>\n </div>\n <span className={css.meta}>\n 面向读者的作品门面(120-250 字):突出核心卖点与开局钩子,不剧透。点击 ✨AI 生成全量生成;或先写几句再点 ✍️AI 补全续写完整;不满意可 🔄 重新生成。\n </span>\n {project === null ? (\n <span className={css.meta}>请先在大纲页导入大纲建立项目。</span>\n ) : (\n <>\n <textarea\n className={css.textarea}\n style={{ minHeight: 140 }}\n placeholder=\"点击 ✨AI 生成,或先写下开头几句,再点 ✍️AI 补全…\"\n value={blurbDraft}\n onChange={e => { setBlurbDraft(e.target.value) }}\n spellCheck={false}\n />\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || blurbDraft.trim() === ''} onClick={() => { void handleBlurbSave() }}>\n 💾 保存简介\n </button>\n <span className={css.meta}>\n {blurbDraft.length} 字 · 已保存:{project.blurb !== undefined ? `${project.blurb.length} 字` : '无'}\n </span>\n </div>\n </>\n )}\n </div>\n )}\n\n {activeTab === 'plan' && (\n <>\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>{tt('tab.plan')}</span>\n <div className={css.row} style={{ flexWrap: 'wrap' }}>\n <span className={css.meta}>{tt('plan.generateHint')}</span>\n <input\n className={css.input}\n style={{ width: 72 }}\n type=\"number\"\n min={1}\n max={200}\n value={planCount}\n onChange={e => { const v = Number(e.target.value); if (Number.isInteger(v)) setPlanCount(v) }}\n />\n <span className={css.meta}>{tt('plan.count')}</span>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy || outlineText.length < 50} onClick={() => { void handlePlan() }}>\n {tt('plan.generate')}\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || doneCount === 0} onClick={() => { void handleSensitiveScan() }} title={tt('sensitive.hint')}>\n 🔞 {tt('sensitive.scanAll')}\n </button>\n </div>\n </div>\n </div>\n\n {sensHits !== null && (\n <div className={css.card} style={{ borderColor: sensHits.length > 0 ? 'var(--nf-warn)' : 'var(--nf-success)' }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>\n {sensHits.length === 0\n ? tt('sensitive.clean', { n: sensScanned })\n : tt('sensitive.hits', { n: sensHits.length, chapters: new Set(sensHits.map(h => h.chapterNo)).size })}\n </span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setSensHits(null) }}>收起</button>\n </div>\n <span className={css.meta}>{tt('sensitive.hint')}</span>\n {sensHits.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, maxHeight: 300, overflowY: 'auto', fontSize: 12 }}>\n {sensHits.map((hit, i) => (\n <div key={i} style={{ display: 'flex', gap: 8, alignItems: 'flex-start', border: '1px solid var(--nf-border)', borderRadius: 6, padding: '4px 8px' }}>\n <span className={css.badge} style={{ borderColor: 'var(--nf-warn)', color: 'var(--nf-warn)', flex: 'none' }}>\n {hit.chapterNo > 0 ? `第${hit.chapterNo}章` : '文本'}\n </span>\n <span className={css.meta} style={{ flex: 1 }}>\n <b style={{ color: 'var(--nf-error)' }}>{hit.word}</b> ×{hit.count} · [{hit.category}]\n </span>\n {hit.chapterNo > 0 && (\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy}\n onClick={() => { void openWorkspace(hit.chapterNo, tt('sensitive.fixPrefill', { word: hit.word, category: hit.category })) }}\n >\n {tt('sensitive.goFix')}\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n\n {chapters.length > 0 && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <div className={css.row} style={{ flexWrap: 'wrap', gap: 6 }}>\n {(volumes !== undefined && volumes.length > 0) && (\n <>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${selectedVolume === 'all' ? css.buttonPrimary : ''}`}\n onClick={() => { setSelectedVolume('all') }}\n >\n 全部卷\n </button>\n {volumes.map(v => (\n <button\n key={v.no}\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${selectedVolume === v.no ? css.buttonPrimary : ''}`}\n onClick={() => { setSelectedVolume(v.no) }}\n title={`第${v.no}卷 · ${v.chapterStart}-${v.chapterEnd} 章`}\n >\n {v.no}. {v.title}({v.chapterStart}-{v.chapterEnd})\n </button>\n ))}\n </>\n )}\n </div>\n {pendingCount > 0 && (\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleWriteAll() }}>\n {tt('plan.writeAllPending')}({pendingCount})\n </button>\n )}\n </div>\n <div className={css.chapterList}>\n {chapterGroups.filter(g => selectedVolume === 'all' || g.no === selectedVolume).map(group => {\n const collapsed = group.no !== 0 && collapsedVolumes.includes(group.no)\n const groupDone = group.chapters.filter(c => c.status === 'approved' || c.status === 'written' || c.status === 'rejected').length\n return (\n <div key={group.no} className={css.volumeGroup}>\n <div\n className={css.volumeGroupHeader}\n onClick={() => {\n if (group.no !== 0) {\n setCollapsedVolumes(prev => prev.includes(group.no) ? prev.filter(x => x !== group.no) : [...prev, group.no])\n }\n }}\n >\n <span className={css.volumeGroupToggle}>{group.no !== 0 ? (collapsed ? '▸' : '▾') : '📖'}</span>\n <b>{group.title}</b>\n <span className={css.meta}>({group.chapters.length} 章 · 已完成 {groupDone})</span>\n </div>\n {!collapsed && group.chapters.map(chapter => {\n const badge = statusBadge(chapter)\n const expanded = expandedChapter === chapter.no\n const review: ReviewReport | undefined = chapter.review\n return (\n <div key={chapter.no} className={css.chapter} data-chapter-no={chapter.no}>\n <span className={css.chapterNum}>{chapter.no}</span>\n <div className={css.chapterMain}>\n <div className={css.chapterTitle}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} style={{ padding: '1px 6px' }} onClick={() => { void handleToggleChapter(chapter.no) }}>\n {expanded ? '−' : '+'}\n </button>\n <span>{chapter.title}</span>\n {chapter.status === 'approved' && chapter.chars !== undefined && (\n <span className={css.meta}>{chapter.chars}{tt('common.chars')}</span>\n )}\n {chapter.volume > 0 && <span className={css.meta}>{tt('plan.volumes')}{chapter.volume}</span>}\n </div>\n {!expanded && <div className={css.chapterBeats} title={chapter.beats}>{chapter.beats}</div>}\n {expanded && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n <div className={css.meta}><b>{tt('plan.beats')}:</b></div>\n <div className={css.meta}>{renderBeats(chapter.beats)}</div>\n {chapter.summary !== undefined && chapter.summary !== '' && (\n <div className={css.meta}><b>{tt('plan.summary')}:</b> {chapter.summary}</div>\n )}\n <pre className={css.chapterPreview}>{chapterText || `(${tt('common.loading')})`}</pre>\n {review !== undefined && (\n <div className={css.reviewBox}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <b>{tt('plan.reviewReport')}</b>\n <span style={{ color: review.passed ? 'var(--nf-success)' : 'var(--nf-error)' }}>\n {tt('plan.reviewScore')}: {review.score} — {review.passed ? tt('plan.reviewPass') : tt('plan.reviewFail')}\n </span>\n </div>\n <div className={css.meta}><b>{tt('plan.reviewVerdict')}:</b> {review.verdict}</div>\n {review.issues.length > 0 && (\n <ul style={{ margin: 0, paddingLeft: 18, fontSize: 12 }}>\n {review.issues.map((issue, i) => (\n <li key={i} style={{ color: severityColor(issue.severity) }}>\n [{issue.severity}] {issue.item} → {issue.suggestion}\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n {chapter.authorReview === undefined && chapter.status !== 'pending' && chapter.status !== 'generating' && chapter.status !== 'error' && (\n <div className={css.row}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy}\n onClick={() => { void handleAuthorBackfillChapter(chapter.no) }}\n title=\"对该章补跑一次作者复盘(读取已落盘正文,不重新生成)\"\n >\n 📋 生成作者复盘\n </button>\n </div>\n )}\n {chapter.authorReview !== undefined && (\n <div className={css.reviewBox} style={{ borderColor: 'color-mix(in srgb, var(--nf-info) 45%, transparent)' }}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <b>📋 作者复盘</b>\n <span style={{ color: chapter.authorReview.hookHonored ? 'var(--nf-success)' : 'var(--nf-warn)' }}>\n 钩子{chapter.authorReview.hookHonored ? '已兑现 ✓' : '未兑现 ✗'} · 结尾钩子 {chapter.authorReview.endingHook}/10\n </span>\n </div>\n {chapter.authorReview.hookNote !== '' && (\n <div className={css.meta}><b>钩子:</b>{chapter.authorReview.hookNote}</div>\n )}\n {chapter.authorReview.plotlineProgress !== '' && (\n <div className={css.meta}><b>推进:</b>{chapter.authorReview.plotlineProgress}</div>\n )}\n {chapter.authorReview.continuity !== '' && (\n <div className={css.meta}><b>衔接:</b>{chapter.authorReview.continuity}</div>\n )}\n {chapter.authorReview.trend !== '' && (\n <div className={css.meta}><b>趋势:</b>{chapter.authorReview.trend}</div>\n )}\n </div>\n )}\n {(chapter.status === 'rejected' || chapter.status === 'written' || chapter.status === 'approved') && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n <div className={css.meta} style={{ fontWeight: 600 }}>\n 润色 / 修订 — 在右上角打开工作区:左栏原文可直接选中文字做局部修订,右栏输入指令后预览,确认后再应用(未应用不改动原稿)\n </div>\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy || busyAny} onClick={() => { void openWorkspace(chapter.no) }}>\n {tt('plan.rewrite')} / {tt('plan.polish')}\n </button>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n <span className={`${css.badge} ${badge.cls}`}>{badge.label}</span>\n <div className={css.chapterActions}>\n {(chapter.status === 'pending' || chapter.status === 'error') && (\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n disabled={busy || busyAny}\n onClick={() => { void handleWriteChapter(chapter.no, true) }}\n >\n {tt('plan.write')}\n </button>\n )}\n {chapter.status === 'generating' && (\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy}\n onClick={() => { void handleChapterReset(chapter.no) }}\n title=\"生成卡死/中断时可复位为待生成,重新生成\"\n >\n 🔄 复位\n </button>\n )}\n {(chapter.status === 'written' || chapter.status === 'rejected') && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { void handleReview(chapter.no) }}>\n {tt('plan.review')}\n </button>\n )}\n {(chapter.status === 'written' || chapter.status === 'rejected') && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { void handleChapterApprove(chapter.no) }} title=\"作者行使最终决定权:直接通过(不重审,保留审稿记录,落盘保存)\">\n ✔ 直接通过\n </button>\n )}\n {(chapter.status === 'written' || chapter.status === 'rejected' || chapter.status === 'approved') && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { void openWorkspace(chapter.no) }} title=\"手动编辑正文 → AI 审查 → 保存\">\n ✏️ 编辑\n </button>\n )}\n {(chapter.status === 'written' || chapter.status === 'rejected' || chapter.status === 'approved') && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { void openWorkspace(chapter.no) }}>\n {tt('plan.polish')}\n </button>\n )}\n {chapter.status === 'rejected' && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { void handleReviseNow(chapter.no) }} title=\"一键按该章审稿意见全部修订(high 优先,无需进工作区选择);修订完自动打开工作区看草稿与审查\">\n 按意见修订\n </button>\n )}\n {chapter.status === 'rejected' && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { void handleWriteChapter(chapter.no, true) }} title=\"整章重新生成\">\n 重新生成\n </button>\n )}\n </div>\n </div>\n )\n })}\n </div>\n )\n })}\n </div>\n </div>\n )}\n </>\n )}\n\n {activeTab === 'book' && (\n <div className={css.card} style={{ gap: 12 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle} style={{ fontSize: 17, fontWeight: 700 }}>📚 本书设定</span>\n <span className={css.meta}>当前书的知识与资料(参考 AI-Novel-Writing-Assistant:世界观/角色准备收进书内)</span>\n </div>\n <div className={css.row} style={{ flexWrap: 'wrap', gap: 6 }}>\n <button\n type=\"button\"\n className={`${css.button} ${bookTab === 'bible' ? css.buttonPrimary : ''}`}\n style={{ fontSize: 14, flex: 1 }}\n onClick={() => { changeBookTab('bible') }}\n title=\"设定库:题材 / 世界观规则 / 人物摘要 / 红线 / 文风\"\n >\n 📖 设定库\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${bookTab === 'world' ? css.buttonPrimary : ''}`}\n style={{ fontSize: 14, flex: 1 }}\n onClick={() => { changeBookTab('world') }}\n title=\"大世界:境界体系 / 地理区域 / 势力分布(注入生成与审稿提示词)\"\n >\n 🌍 大世界\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${bookTab === 'roles' ? css.buttonPrimary : ''}`}\n style={{ fontSize: 14, flex: 1 }}\n onClick={() => { changeBookTab('roles') }}\n title=\"角色库:全书角色主表(定位 / 关系网 / 成长线 / 知情度)\"\n >\n 👥 角色库({project?.roles?.length ?? 0})\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${bookTab === 'facts' ? css.buttonPrimary : ''}`}\n style={{ fontSize: 14, flex: 1 }}\n onClick={() => { changeBookTab('facts') }}\n title=\"编年录与复盘记录\"\n >\n 📚 编年 / 复盘\n </button>\n </div>\n </div>\n )}\n {activeTab === 'book' && bookTab === 'bible' && (\n <>\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.cardTitle}>{tt('bible.title')}</span>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleBible() }}>\n {tt('bible.gen')}\n </button>\n </div>\n {bible === undefined ? (\n <span className={css.meta}>{tt('bible.none')}</span>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n {bible.genre !== '' && (\n <div><b>{tt('bible.genre')}:</b> <span className={css.meta}>{bible.genre}</span></div>\n )}\n {/* 世界观规则独立卡片(可编辑,每行一条) */}\n {bible.worldRules.length > 0 && (\n <div style={{ border: '1px solid var(--nf-border)', borderRadius: 10, padding: '8px 10px' }}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <b>{tt('bible.worldRules')}({bible.worldRules.length})</b>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setWorldRulesDraft(bible.worldRules.join('\\n')) }}>\n 编辑\n </button>\n </div>\n {worldRulesDraft !== '' && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, marginTop: 6 }}>\n <textarea\n className={css.textarea}\n style={{ minHeight: 120 }}\n value={worldRulesDraft}\n onChange={e => { setWorldRulesDraft(e.target.value) }}\n placeholder=\"每条规则一行…\"\n />\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleSaveWorldRules() }}>\n 保存规则\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setWorldRulesDraft('') }}>\n 取消\n </button>\n </div>\n </div>\n )}\n {worldRulesDraft === '' && (\n <ul style={{ margin: '4px 0 0', paddingLeft: 18, fontSize: 12 }}>{bible.worldRules.map((r, i) => <li key={i}>{r}</li>)}</ul>\n )}\n </div>\n )}\n {bible.characters.length > 0 && (\n <div>\n <b>{tt('bible.characters')}({bible.characters.length})</b>\n {bible.characters.map(card => (\n <div key={card.name} style={{ marginTop: 4, fontSize: 12 }}>\n <b>{card.name}</b> <span className={css.meta}>[{card.role}] {card.traits.join('、')}</span>\n {card.goals !== '' && <div className={css.meta}>目标:{card.goals}</div>}\n {card.relations !== '' && <div className={css.meta}>关系:{card.relations}</div>}\n </div>\n ))}\n </div>\n )}\n {bible.redLines.length > 0 && (\n <div>\n <b>{tt('bible.redLines')}({bible.redLines.length})</b>\n <ul style={{ margin: 0, paddingLeft: 18, fontSize: 12, color: 'var(--nf-error)' }}>{bible.redLines.map((r, i) => <li key={i}>{r}</li>)}</ul>\n </div>\n )}\n {bible.style.length > 0 && (\n <div>\n <b>{tt('bible.style')}({bible.style.length})</b>\n <ul style={{ margin: 0, paddingLeft: 18, fontSize: 12 }}>{bible.style.map((r, i) => <li key={i}>{r}</li>)}</ul>\n </div>\n )}\n </div>\n )}\n </div>\n </>\n )}\n\n {/* 大世界:境界体系 / 区域 / 势力 */}\n {activeTab === 'book' && bookTab === 'world' && (\n <WorldTab\n api={api}\n world={project?.world}\n onChanged={w => {\n setProject(prev => prev === null ? prev : { ...prev, world: w, updatedAt: new Date().toISOString() })\n pushProgress(`大世界已保存:${w.realms.length} 境界 · ${w.regions.length} 区域 · ${w.factions.length} 势力`, 'done')\n }}\n />\n )}\n\n {/* 角色库:全书角色主表(独立导航页) */}\n {activeTab === 'book' && bookTab === 'roles' && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>👥 角色库({(project?.roles ?? []).length} 个)</span>\n <div className={css.row}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy || (project?.facts ?? []).length === 0}\n onClick={() => { void handleCharactersRefresh() }}\n title=\"从编年录聚合各角色当前状态(境界/伤势/心境/出场统计),显示在每张卡上\"\n >\n ↻ 从编年录刷新状态\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n disabled={busy || doneCount === 0}\n onClick={() => { void handleRolesExtract() }}\n title=\"AI 扫描大纲/编年录/已写章节,提炼完整角色库(含女主/女配/反派定位)\"\n >\n ✨ 从全书提炼角色\n </button>\n </div>\n </div>\n <span className={css.meta}>角色库是全书角色主表:定位(女主/女配/配角/反派)、身份、关系网、成长线、知情度——生成与审稿都会按定位规格刻画互动。点「从编年录刷新状态」可在每张卡上显示角色当前状态。</span>\n\n {roleCandidates !== null && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, border: '1px solid var(--nf-info)', borderRadius: 12, padding: 10 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <b>✨ AI 提炼候选({roleCandidates.length})</b>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setRoleCandidates(null) }}>收起</button>\n </div>\n {roleCandidates.length === 0 && <span className={css.meta}>未提炼到角色。</span>}\n {roleCandidates.map((r, i) => (\n <RoleCandidateRow\n key={i}\n candidate={r}\n disabled={busy}\n onAdopt={() => { void handleRoleAdopt(r) }}\n onEdit={() => { setRoleDraft(r) }}\n />\n ))}\n </div>\n )}\n\n {roleDraft !== null && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, border: '1px solid var(--nf-accent)', borderRadius: 12, padding: 10 }}>\n <div className={css.row} style={{ flexWrap: 'wrap' }}>\n <div className={css.field} style={{ flex: 1, minWidth: 140 }}>\n <label className={css.fieldLabel}>角色名</label>\n <input className={css.input} value={roleDraft.name} onChange={e => { setRoleDraft({ ...roleDraft, name: e.target.value }) }} />\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>定位</label>\n <select className={css.input} value={roleDraft.roleLabel} onChange={e => { setRoleDraft({ ...roleDraft, roleLabel: e.target.value as RoleRecord['roleLabel'] }) }}>\n <option value=\"protagonist\">主角</option>\n <option value=\"female_lead\">女主</option>\n <option value=\"female_support\">女配</option>\n <option value=\"support\">配角</option>\n <option value=\"antagonist\">反派</option>\n <option value=\"extra\">路人</option>\n </select>\n </div>\n <div className={css.field} style={{ flex: 2 }}>\n <label className={css.fieldLabel}>身份</label>\n <input className={css.input} value={roleDraft.identity} onChange={e => { setRoleDraft({ ...roleDraft, identity: e.target.value }) }} />\n </div>\n </div>\n <div className={css.field}>\n <label className={css.fieldLabel}>目标</label>\n <textarea className={css.textarea} style={{ minHeight: 44 }} value={roleDraft.goals} onChange={e => { setRoleDraft({ ...roleDraft, goals: e.target.value }) }} />\n </div>\n <div className={css.field}>\n <label className={css.fieldLabel}>关系网(每行一条:角色名(关系))</label>\n <textarea className={css.textarea} style={{ minHeight: 44 }} value={roleDraft.relations.join('\\n')} onChange={e => { setRoleDraft({ ...roleDraft, relations: e.target.value.split('\\n').map(l => l.trim()).filter(l => l !== '') }) }} />\n </div>\n <div className={css.field}>\n <label className={css.fieldLabel}>成长线(每行一条:阶段:说明)</label>\n <textarea className={css.textarea} style={{ minHeight: 44 }} value={roleDraft.arc.join('\\n')} onChange={e => { setRoleDraft({ ...roleDraft, arc: e.target.value.split('\\n').map(l => l.trim()).filter(l => l !== '') }) }} />\n </div>\n <div className={css.field}>\n <label className={css.fieldLabel}>知情度(每行一条该角色知道的信息)</label>\n <textarea className={css.textarea} style={{ minHeight: 44 }} value={roleDraft.knowledge.join('\\n')} onChange={e => { setRoleDraft({ ...roleDraft, knowledge: e.target.value.split('\\n').map(l => l.trim()).filter(l => l !== '') }) }} />\n </div>\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleRoleSave() }}>\n 保存\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setRoleDraft(null) }}>取消</button>\n </div>\n </div>\n )}\n\n {(project?.roles ?? []).length === 0 ? (\n <span className={css.meta}>角色库为空——点「✨ 从全书提炼角色」自动建立,或手动新增。</span>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {(project?.roles ?? []).map(r => (\n <RoleCard\n key={r.name}\n role={r}\n status={(project?.roleStatus ?? []).find(s => s.name === r.name)}\n disabled={busy}\n onEdit={() => { setRoleDraft(r) }}\n onRemove={() => { void handleRoleRemove(r.name) }}\n />\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* 写作资产 5 个子分类(左侧导航直达) */}\n {activeTab === 'assets' && <AssetsTab api={api} />}\n\n {activeTab === 'settings' && configDraft !== null && (\n <div className={css.card}>\n <span className={css.cardTitle}>{tt('settings.title')}</span>\n <div className={css.field}>\n <label className={css.fieldLabel}>{tt('settings.outlinePath')}</label>\n <input className={css.input} value={configDraft.outlinePath} onChange={e => { setConfigDraft({ ...configDraft, outlinePath: e.target.value }) }} />\n </div>\n <div className={css.field}>\n <label className={css.fieldLabel}>{tt('settings.outputDir')}</label>\n <input className={css.input} value={configDraft.outputDir} onChange={e => { setConfigDraft({ ...configDraft, outputDir: e.target.value }) }} />\n </div>\n <div className={css.row} style={{ alignItems: 'flex-start' }}>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.provider')}</label>\n <input className={css.input} value={configDraft.provider} onChange={e => { setConfigDraft({ ...configDraft, provider: e.target.value }) }} />\n </div>\n <div className={css.field} style={{ flex: 1.4 }}>\n <label className={css.fieldLabel}>{tt('settings.model')}</label>\n <select\n className={css.input}\n value={modelCustomMode ? '__custom__' : configDraft.model}\n onChange={e => {\n const v = e.target.value\n if (v === '__custom__') {\n setModelCustomMode(true)\n } else {\n setModelCustomMode(false)\n setConfigDraft({ ...configDraft, model: v })\n }\n }}\n >\n {MODEL_PRESETS.map(m => <option key={m} value={m}>{m}</option>)}\n <option value=\"__custom__\">{tt('settings.modelCustom')}</option>\n </select>\n {modelCustomMode && (\n <input\n className={css.input}\n style={{ marginTop: 6 }}\n value={configDraft.model}\n placeholder={tt('settings.modelCustomPlaceholder')}\n onChange={e => { setConfigDraft({ ...configDraft, model: e.target.value }) }}\n />\n )}\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.reasoningEffort')}</label>\n <select\n className={css.input}\n value={configDraft.reasoningEffort ?? 'off'}\n onChange={e => { setConfigDraft({ ...configDraft, reasoningEffort: e.target.value as NovelConfig['reasoningEffort'] }) }}\n >\n {REASONING_OPTIONS.map(v => <option key={v} value={v}>{tt(`settings.reasoning.${v}`)}</option>)}\n </select>\n <span className={css.meta}>{tt('settings.reasoningHint')}</span>\n </div>\n </div>\n <div className={css.row}>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>豆包 API Key(生图)</label>\n <input className={css.input} type=\"password\" placeholder=\"ark-...\" value={configDraft.imageApiKey ?? ''} onChange={e => { setConfigDraft({ ...configDraft, imageApiKey: e.target.value }) }} />\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>豆包生图模型</label>\n <input className={css.input} placeholder=\"doubao-seedream-5-0-pro-260628\" value={configDraft.imageApiModel ?? ''} onChange={e => { setConfigDraft({ ...configDraft, imageApiModel: e.target.value }) }} />\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>启用豆包生图</label>\n <select\n className={css.input}\n value={configDraft.imageApiEnabled ? '1' : '0'}\n onChange={e => { setConfigDraft({ ...configDraft, imageApiEnabled: e.target.value === '1' }) }}\n >\n <option value=\"0\">关(默认)</option>\n <option value=\"1\">开</option>\n </select>\n <span className={css.meta}>开启后角色详情显示「豆包生成」参考图按钮</span>\n </div>\n </div>\n <div className={css.row}>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.chapterChars')}</label>\n <input className={css.input} type=\"number\" min={1000} max={20000} value={configDraft.chapterChars} onChange={e => { setConfigDraft({ ...configDraft, chapterChars: Number(e.target.value) }) }} />\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.maxTokens')}</label>\n <input className={css.input} type=\"number\" min={2000} max={64000} value={configDraft.maxTokens} onChange={e => { setConfigDraft({ ...configDraft, maxTokens: Number(e.target.value) }) }} />\n </div>\n </div>\n <div className={css.row}>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.reviewPassScore')}</label>\n <input className={css.input} type=\"number\" min={0} max={100} value={configDraft.reviewPassScore} onChange={e => { setConfigDraft({ ...configDraft, reviewPassScore: Number(e.target.value) }) }} />\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.editorFontSize')}</label>\n <select\n className={css.input}\n value={editorFontSize}\n onChange={e => { changeEditorFontSize(Number(e.target.value)) }}\n >\n {[12, 13, 14, 15, 16, 18, 20, 22, 24].map(v => (\n <option key={v} value={v}>{v}px</option>\n ))}\n </select>\n <span className={css.meta}>{tt('settings.editorFontSizeHint')}</span>\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.autoReview')}</label>\n <select\n className={css.input}\n value={configDraft.autoReview ? '1' : '0'}\n onChange={e => { setConfigDraft({ ...configDraft, autoReview: e.target.value === '1' }) }}\n >\n <option value=\"1\">✓ 是</option>\n <option value=\"0\">✗ 否</option>\n </select>\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.autoAuthorReview')}</label>\n <select\n className={css.input}\n value={configDraft.autoAuthorReview ? '1' : '0'}\n onChange={e => { setConfigDraft({ ...configDraft, autoAuthorReview: e.target.value === '1' }) }}\n >\n <option value=\"1\">✓ 是</option>\n <option value=\"0\">✗ 否</option>\n </select>\n <span className={css.meta}>{tt('settings.autoAuthorReviewHint')}</span>\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('settings.autoReviewAfterRevise')}</label>\n <select\n className={css.input}\n value={configDraft.autoReviewAfterRevise ? '1' : '0'}\n onChange={e => { setConfigDraft({ ...configDraft, autoReviewAfterRevise: e.target.value === '1' }) }}\n >\n <option value=\"1\">✓ 是</option>\n <option value=\"0\">✗ 否</option>\n </select>\n <span className={css.meta}>{tt('settings.autoReviewAfterReviseHint')}</span>\n </div>\n </div>\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleSaveConfig() }}>\n {tt('settings.save')}\n </button>\n <button type=\"button\" className={css.button} onClick={() => { void api.openFolder() }}>\n {tt('settings.openFolder')}\n </button>\n <span className={css.meta}>当前:{config?.provider} / {config?.model} · {config?.outputDir}</span>\n </div>\n <div className={css.row}>\n <span className={css.cardTitle}>{tt('settings.export')}</span>\n <button type=\"button\" className={css.button} disabled={busy || chapters.length === 0} onClick={() => { void handleExport('txt') }}>\n {tt('settings.exportTxt')}\n </button>\n <button type=\"button\" className={css.button} disabled={busy || chapters.length === 0} onClick={() => { void handleExport('md') }}>\n {tt('settings.exportMd')}\n </button>\n </div>\n </div>\n )}\n\n {activeTab === 'settings' && (\n <div className={css.card}>\n <span className={css.cardTitle}>{tt('settings.theme')}</span>\n <div className={css.row} style={{ gap: 8, flexWrap: 'wrap' }}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${panelTheme === 'liquid' ? css.buttonPrimary : ''}`}\n onClick={() => { changePanelTheme('liquid') }}\n title=\"iOS 液态玻璃质感 · 绿色强调(当前默认)\"\n >\n 🧊 {tt('settings.themeLiquid')}\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${panelTheme === 'classic' ? css.buttonPrimary : ''}`}\n onClick={() => { changePanelTheme('classic') }}\n title=\"经典 iOS 毛玻璃 · 蓝色强调\"\n >\n 💠 {tt('settings.themeClassic')}\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${panelTheme === 'neumorph' ? css.buttonPrimary : ''}`}\n onClick={() => { changePanelTheme('neumorph') }}\n title=\"新拟物派 · 双阴影立体(仅浅色;深色下自动回退液态)\"\n >\n 🔘 {tt('settings.themeNeumorph')}\n </button>\n <span className={css.meta}>{tt('settings.themeHint')}</span>\n </div>\n </div>\n )}\n\n {activeTab === 'book' && bookTab === 'facts' && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle} style={{ fontSize: 17, fontWeight: 700 }}>📚 编年 / 复盘</span>\n </div>\n <div className={css.row} style={{ flexWrap: 'wrap', gap: 6 }}>\n <button\n type=\"button\"\n className={`${css.button} ${archiveTab === 'facts' ? css.buttonPrimary : ''}`}\n style={{ fontSize: 14, flex: 1 }}\n onClick={() => { changeArchiveTab('facts') }}\n title=\"编年录:客观事实流水(第 N 章 · 事件),生成/审稿查证用\"\n >\n 📜 编年录({(project?.facts ?? []).length})\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${archiveTab === 'reviews' ? css.buttonPrimary : ''}`}\n style={{ fontSize: 14, flex: 1 }}\n onClick={() => { changeArchiveTab('reviews') }}\n title=\"复盘记录:每章作者复盘(钩子 / 推进 / 衔接 / 趋势)\"\n >\n 📋 复盘记录({chapters.filter(c => c.authorReview !== undefined).length} 章)\n </button>\n </div>\n\n {archiveTab === 'reviews' ? (\n <>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>📋 复盘记录({chapters.filter(c => c.authorReview !== undefined).length} 章已复盘)</span>\n <div className={css.row}>\n {(() => {\n const missing = chapters.filter(c => c.status !== 'pending' && c.status !== 'generating' && c.status !== 'error' && c.authorReview === undefined).length\n return missing > 0 && (\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n disabled={busy}\n onClick={() => { void handleAuthorBackfillAll() }}\n title=\"对历史已写章节逐章补跑作者复盘\"\n >\n ↻ 补齐缺失复盘({missing})\n </button>\n )\n })()}\n </div>\n </div>\n {(() => {\n const reviewed = chapters.filter(c => c.authorReview !== undefined)\n if (reviewed.length === 0) {\n return <span className={css.meta}>尚无作者复盘——生成/审稿后自动生成,或点「补齐缺失复盘」为已写章节补跑。</span>\n }\n const honored = reviewed.filter(c => c.authorReview!.hookHonored).length\n const avg = Math.round(reviewed.reduce((s, c) => s + c.authorReview!.endingHook, 0) / reviewed.length * 10) / 10\n return (\n <span className={css.meta} style={{ fontWeight: 600 }}>\n 钩子兑现 {honored}/{reviewed.length} · 结尾钩子均分 {avg}/10\n </span>\n )\n })()}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10, overflowY: 'auto', flex: 1, minHeight: 0 }}>\n {(() => {\n const groupsWithReviews = chapterGroups.filter(group => group.chapters.some(c => c.authorReview !== undefined))\n if (groupsWithReviews.length === 0) return null\n return (\n <div className={css.row} style={{ justifyContent: 'flex-end', gap: 6 }}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n onClick={() => { setExpandedVolumes(Object.fromEntries(groupsWithReviews.map(g => [g.no, true]))) }}\n >\n 全部展开\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n onClick={() => { setExpandedVolumes({}) }}\n >\n 全部折叠\n </button>\n </div>\n )\n })()}\n {chapterGroups.map(group => {\n const groupReviewed = group.chapters.filter(c => c.authorReview !== undefined)\n if (groupReviewed.length === 0) return null\n const volumeExpanded = expandedVolumes[group.no] === true\n return (\n <div key={group.no} style={{ border: '1px solid var(--nf-border)', borderRadius: 10, overflow: 'hidden' }}>\n <button\n type=\"button\"\n style={{ width: '100%', textAlign: 'left', border: 'none', background: 'transparent', cursor: 'pointer', padding: '8px 12px', fontSize: 13, display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' }}\n onClick={() => { setExpandedVolumes(prev => ({ ...prev, [group.no]: !volumeExpanded })) }}\n >\n <span style={{ color: 'var(--nf-text-3)' }}>{volumeExpanded ? '▾' : '▸'}</span>\n <b>{group.title}</b>\n <span className={css.meta}>已复盘 {groupReviewed.length}/{group.chapters.length} 章</span>\n </button>\n {volumeExpanded && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, padding: '4px 8px 8px', borderTop: '1px solid var(--nf-border)' }}>\n {[...groupReviewed].reverse().map(c => {\n const ar = c.authorReview!\n const expanded = expandedReviewChapter === c.no\n return (\n <div key={c.no} style={{ border: '1px solid var(--nf-border)', borderRadius: 8, overflow: 'hidden' }}>\n <button\n type=\"button\"\n style={{ width: '100%', textAlign: 'left', border: 'none', background: 'transparent', cursor: 'pointer', padding: '6px 10px', fontSize: 12, display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}\n onClick={() => { setExpandedReviewChapter(expanded ? null : c.no) }}\n >\n <span style={{ color: 'var(--nf-text-3)' }}>{expanded ? '▾' : '▸'}</span>\n <b>第{c.no}章《{c.title}》</b>\n <span style={{ color: ar.hookHonored ? 'var(--nf-success)' : 'var(--nf-warn)' }}>钩子{ar.hookHonored ? '✓' : '✗'}</span>\n <span style={{ color: ar.endingHook >= 6 ? 'var(--nf-success)' : 'var(--nf-error)' }}>结尾钩子 {ar.endingHook}/10</span>\n {ar.plotlineProgress !== '' && <span className={css.meta} style={{ marginLeft: 4 }}>{ar.plotlineProgress.slice(0, 40)}{ar.plotlineProgress.length > 40 ? '…' : ''}</span>}\n </button>\n {expanded && (\n <div style={{ padding: '4px 10px 8px', fontSize: 12, display: 'flex', flexDirection: 'column', gap: 3, borderTop: '1px solid var(--nf-border)' }}>\n {ar.hookNote !== '' && <span className={css.meta}><b>钩子:</b>{ar.hookNote}</span>}\n {ar.plotlineProgress !== '' && <span className={css.meta}><b>推进:</b>{ar.plotlineProgress}</span>}\n {ar.continuity !== '' && <span className={css.meta}><b>衔接:</b>{ar.continuity}</span>}\n {ar.trend !== '' && <span className={css.meta}><b>趋势:</b>{ar.trend}</span>}\n </div>\n )}\n </div>\n )\n })}\n </div>\n )}\n </div>\n )\n })}\n </div>\n </>\n ) : (\n <>\n <div className={css.busyRow} style={{ flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>{tt('facts.title', { n: (project?.facts ?? []).length })}</span>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy || chapters.length === 0}\n onClick={() => { void handleFactsBackfill() }}\n title=\"用 LLM 从历史章节正文重新抽取事实,补齐缺失的编年录条目\"\n >\n 📥 {tt('facts.backfill')}\n </button>\n </div>\n <span className={css.meta}>{tt('facts.hint')}</span>\n {(project?.facts ?? []).length > 0 ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, maxHeight: '60vh', overflowY: 'auto', fontSize: 12 }}>\n {[...(project?.facts ?? [])].reverse().map((fact, i) => (\n <div key={i} style={{ display: 'flex', gap: 8, alignItems: 'flex-start' }}>\n <span className={css.badge} style={{ borderColor: 'var(--nf-text-3)', color: 'var(--nf-text-3)', flex: 'none', marginTop: 1 }}>\n 第 {fact.chapterNo} 章\n </span>\n <span className={css.meta}>{fact.text}</span>\n </div>\n ))}\n </div>\n ) : (\n <span className={css.meta}>暂无事实条目——写一章后会自动生成,或点击上方「回填」。</span>\n )}\n </>\n )}\n </div>\n )}\n\n {activeTab === 'plotlines' && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle} style={{ fontSize: 17, fontWeight: 700 }}>📜 长线管理</span>\n </div>\n <div className={css.row} style={{ flexWrap: 'wrap', gap: 6 }}>\n <button\n type=\"button\"\n className={`${css.button} ${longlineTab === 'plotlines' ? css.buttonPrimary : ''}`}\n style={{ fontSize: 14, flex: 1 }}\n onClick={() => { changeLonglineTab('plotlines') }}\n title=\"剧情线:故事明线(主线 / 支线 / 人物 / 悬念)\"\n >\n 🧵 剧情线({project?.plotlines?.length ?? 0})\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${longlineTab === 'foreshadow' ? css.buttonPrimary : ''}`}\n style={{ fontSize: 14, flex: 1 }}\n onClick={() => { changeLonglineTab('foreshadow') }}\n title=\"伏笔:道具 / 事件级暗线(埋设 → 回收)\"\n >\n 🔮 伏笔({foreshadows.length})\n </button>\n </div>\n\n {longlineTab === 'foreshadow' ? (\n <>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>🔮 {tt('foreshadow.title')}({foreshadows.length})</span>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleSuggestForeshadows() }}>\n {tt('foreshadow.suggest')}\n </button>\n </div>\n {foreshadows.length === 0 ? (\n <span className={css.meta}>{tt('foreshadow.none')}</span>\n ) : (\n <div className={css.chapterList}>\n {foreshadows.map(f => {\n const statusLabel = { planned: tt('foreshadow.planned'), planted: tt('foreshadow.planted'), progressing: tt('foreshadow.progressing'), resolved: tt('foreshadow.resolved'), abandoned: tt('foreshadow.abandoned') }[f.status]\n const statusColor = f.status === 'resolved' ? 'var(--nf-success)' : f.status === 'planted' || f.status === 'progressing' ? 'var(--nf-accent)' : f.status === 'abandoned' ? 'var(--nf-text-3)' : 'var(--nf-info)'\n return (\n <div key={f.id} className={css.chapter}>\n <div className={css.chapterMain}>\n <div className={css.chapterTitle}>\n <span>{f.description}</span>\n </div>\n <div className={css.meta}>\n {f.plantedChapter !== undefined && <span>{tt('foreshadow.plantedAt')} 第{f.plantedChapter}章 · </span>}\n {f.targetChapter !== undefined && <span>{tt('foreshadow.target')} 第{f.targetChapter}章 · </span>}\n {f.resolvedNote !== undefined && f.resolvedNote !== '' && <span>回收:{f.resolvedNote} · </span>}\n </div>\n </div>\n <span className={css.badge} style={{ borderColor: statusColor, color: statusColor }}>{statusLabel}</span>\n <div className={css.row} style={{ gap: 4 }}>\n {f.status === 'planned' && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => {\n void api.foreshadow({ id: f.id, status: 'planted', plantedChapter: doneCount + 1 }).then(r => setProject(prev => prev === null ? prev : { ...prev, foreshadows: r.foreshadows }))\n }}>\n {tt('foreshadow.setPlanted')}\n </button>\n )}\n {(f.status === 'planted' || f.status === 'progressing') && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => {\n void api.foreshadow({ id: f.id, status: 'resolved', resolvedNote: `第${doneCount}章回收` }).then(r => setProject(prev => prev === null ? prev : { ...prev, foreshadows: r.foreshadows }))\n }}>\n {tt('foreshadow.setResolved')}\n </button>\n )}\n </div>\n </div>\n )\n })}\n </div>\n )}\n </>\n ) : (\n <>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>🧵 {tt('tab.plotlines')}({project?.plotlines?.length ?? 0})</span>\n <div className={css.row} style={{ flexWrap: 'wrap' }}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy || outlineText.length < 50}\n onClick={() => { void handlePlotlineHealth() }}\n title=\"根据已写章节数与各线推进情况,判断是否需要新增剧情线、建议多少章后添加\"\n >\n 🩺 剧情健康检查\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy || outlineText.length < 50}\n onClick={() => { void handlePlotlinePlan() }}\n title=\"AI 设计下一阶段剧情方案:未来 5-10 章方向 + 2-3 条建议新线\"\n >\n ✨ 设计剧情方案\n </button>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy || outlineText.length < 50}\n onClick={() => { void handlePlotlineSuggest() }}\n title=\"AI 根据大纲/卷计划/已写章节/编年录,提炼候选剧情线\"\n >\n ✨ AI 建议剧情线\n </button>\n {plotlineDraft === null && (\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n onClick={() => { setPlotlineDraft({ id: '', name: '', kind: 'main', goal: '', progress: '', status: 'active' }) }}\n >\n {tt('plotlines.new')}\n </button>\n )}\n </div>\n </div>\n <span className={css.meta}>{tt('plotlines.hint')}</span>\n\n {plotlineHealth !== null && (\n <PlotlineHealthPanel\n report={plotlineHealth}\n disabled={busy}\n onPlan={() => { void handlePlotlinePlan() }}\n onClose={() => { setPlotlineHealth(null) }}\n />\n )}\n\n {plotlinePlan !== null && (\n <PlotlinePlanPanel\n plan={plotlinePlan}\n disabled={busy}\n onAdopt={(s) => { void handlePlanAdopt(s) }}\n onClose={() => { setPlotlinePlan(null) }}\n />\n )}\n\n {plotlineSuggestions !== null && (\n <PlotlineSuggestionPanel\n suggestions={plotlineSuggestions}\n disabled={busy}\n onAdopt={(s) => { void handlePlotlineAdopt(s) }}\n onClose={() => { setPlotlineSuggestions(null) }}\n />\n )}\n\n {plotlineDraft !== null && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, border: '1px solid var(--nf-accent)', borderRadius: 12, padding: 10 }}>\n <div className={css.row} style={{ flexWrap: 'wrap' }}>\n <div className={css.field} style={{ flex: 2, minWidth: 160 }}>\n <label className={css.fieldLabel}>{tt('plotlines.name')}</label>\n <input className={css.input} value={plotlineDraft.name} onChange={e => { setPlotlineDraft({ ...plotlineDraft, name: e.target.value }) }} placeholder=\"如:集齐古玉残片\" />\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('plotlines.kind')}</label>\n <select className={css.input} value={plotlineDraft.kind} onChange={e => { setPlotlineDraft({ ...plotlineDraft, kind: e.target.value as Plotline['kind'] }) }}>\n <option value=\"main\">{tt('plotlines.kindMain')}</option>\n <option value=\"branch\">{tt('plotlines.kindBranch')}</option>\n <option value=\"character\">{tt('plotlines.kindCharacter')}</option>\n <option value=\"mystery\">{tt('plotlines.kindMystery')}</option>\n </select>\n </div>\n <div className={css.field} style={{ flex: 1 }}>\n <label className={css.fieldLabel}>{tt('plotlines.status')}</label>\n <select className={css.input} value={plotlineDraft.status} onChange={e => { setPlotlineDraft({ ...plotlineDraft, status: e.target.value as Plotline['status'] }) }}>\n <option value=\"active\">{tt('plotlines.statusActive')}</option>\n <option value=\"paused\">{tt('plotlines.statusPaused')}</option>\n <option value=\"resolved\">{tt('plotlines.statusResolved')}</option>\n <option value=\"abandoned\">{tt('plotlines.statusAbandoned')}</option>\n </select>\n </div>\n </div>\n <div className={css.field}>\n <label className={css.fieldLabel}>{tt('plotlines.goal')}</label>\n <textarea className={css.textarea} style={{ minHeight: 48 }} value={plotlineDraft.goal} onChange={e => { setPlotlineDraft({ ...plotlineDraft, goal: e.target.value }) }} />\n </div>\n <div className={css.field}>\n <label className={css.fieldLabel}>{tt('plotlines.progress')}</label>\n <textarea className={css.textarea} style={{ minHeight: 40 }} value={plotlineDraft.progress} onChange={e => { setPlotlineDraft({ ...plotlineDraft, progress: e.target.value }) }} placeholder=\"如:已取得第二枚残片,正追踪第三枚线索\" />\n </div>\n <div className={css.row}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handlePlotlineSave() }}>\n {tt('plotlines.save')}\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setPlotlineDraft(null) }}>\n {tt('plotlines.cancel')}\n </button>\n </div>\n </div>\n )}\n\n {(project?.plotlines ?? []).length === 0 ? (\n <span className={css.meta}>{tt('plotlines.empty')}</span>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, overflowY: 'auto', flex: 1, minHeight: 0 }}>\n {(project?.plotlines ?? []).map(line => (\n <PlotlineCard\n key={line.id}\n line={line}\n disabled={busy}\n onRefresh={() => { void handlePlotlineRefresh(line.id) }}\n onEdit={() => { setPlotlineDraft({ id: line.id, name: line.name, kind: line.kind, goal: line.goal, progress: line.progress, status: line.status }) }}\n onRemove={() => { void handlePlotlineRemove(line.id) }}\n />\n ))}\n </div>\n )}\n </>\n )}\n </div>\n )}\n\n {activeTab === 'run' && (\n <RunPanel api={api} totalChapters={chapters.length} />\n )}\n\n {activeTab === 'breakdown' && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>🔍 拆书分析</span>\n <div className={css.row} style={{ flexWrap: 'wrap' }}>\n <select\n className={css.input}\n style={{ width: 160 }}\n value={breakdownScope}\n onChange={e => { setBreakdownScope(e.target.value as typeof breakdownScope) }}\n title=\"分析范围\"\n >\n <option value=\"recent\">最近 20 章</option>\n {volumes !== undefined && volumes.map(v => (\n <option key={v.no} value={`volume:${v.no}`}>第{v.no}卷</option>\n ))}\n <option value=\"all\">全书</option>\n </select>\n <select\n className={css.input}\n style={{ width: 150 }}\n value={breakdownPreset}\n onChange={e => { setBreakdownPreset(e.target.value as 'quick' | 'standard') }}\n title=\"分析档位\"\n >\n <option value=\"quick\">快速(4 维)</option>\n <option value=\"standard\">标准+卖点</option>\n </select>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleBreakdown() }} title=\"对已写章节做结构/人物/文风/卖点体检(约 1-3 分钟,消耗 LLM 额度)\">\n {busy ? '⏳ 分析中…' : '✨ 开始拆书'}\n </button>\n </div>\n </div>\n <span className={css.meta}>拆书分析 = 整卷复盘工具:定位、剧情结构、人物系统、文风技法(标准档加商业化卖点)。每条结论基于实际章节归纳,帮你发现「写偏了/人物变形/文风漂移」——与单章审稿互补。</span>\n\n {breakdownResult === null ? (\n <div className={css.shelfEmpty} style={{ minHeight: 140 }}>\n <span className={css.shelfEmptyIcon}>📖</span>\n <span className={css.shelfEmptyTitle}>尚未运行拆书分析</span>\n <span className={css.meta}>选择范围与档位,点「开始拆书」对已写章节做整卷体检</span>\n </div>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n <span className={css.meta}>\n 分析 {breakdownResult.chaptersScanned} 章 · {breakdownResult.sections.length} 个小节 · 约 {breakdownResult.usedTokens} token\n </span>\n {breakdownResult.sections.map(sec => (\n <div key={sec.key} className={css.wsPreview} style={{ borderColor: 'var(--nf-info)' }}>\n <div className={css.busyRow}>\n <b>{sec.title}</b>\n </div>\n {Object.keys(sec.structured).length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2, fontSize: 12, marginBottom: 6 }}>\n {Object.entries(sec.structured).map(([k, v]) => {\n const label = (typeof v === 'string') ? v : Array.isArray(v) ? (v as string[]).join('、') : JSON.stringify(v)\n return <div key={k} className={css.meta}><b>{k}:</b>{label}</div>\n })}\n </div>\n )}\n <div className={css.meta} style={{ whiteSpace: 'pre-wrap', fontSize: 12 }}>{sec.markdown}</div>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n\n {activeTab === 'roleImage' && (\n <div className={css.card} style={{ flex: 1, minHeight: 0 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle} style={{ fontSize: 17, fontWeight: 700 }}>🖼️ 角色形象</span>\n <span className={css.meta}>角色形象锚点 / 生图提示词包 / 参考图集——复制提示词即可在即梦、豆包等工具出图</span>\n </div>\n\n <input\n ref={roleImageInputRef}\n type=\"file\"\n accept=\"image/*\"\n style={{ display: 'none' }}\n onChange={e => {\n const file = e.target.files?.[0]\n const target = roleImageTarget\n if (file === undefined || target === null) return\n const readDataUrl = (): Promise<string> => new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(String(reader.result))\n reader.onerror = () => reject(reader.error ?? new Error('读取图片失败'))\n reader.readAsDataURL(file!)\n })\n void (async () => {\n const dataUrl = await readDataUrl()\n if (target.endsWith('||scene')) {\n const sceneName = target.slice(0, -'||scene'.length)\n setBusy(true)\n setBusyLabel(`上传场景图「${sceneName}」${roleImageLabel}…`)\n setError('')\n try {\n await api.scenes({ op: 'image', name: sceneName, dataUrl, label: roleImageLabel })\n await refresh(false)\n pushProgress(`已上传场景「${sceneName}」${roleImageLabel}`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`场景图上传失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n setRoleImageTarget(null)\n if (roleImageInputRef.current !== null) roleImageInputRef.current.value = ''\n }\n } else {\n await handleRoleImageUpload(target, file, roleImageLabel)\n }\n })()\n }}\n />\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10, flex: 1, minHeight: 0, overflowY: 'auto' }}>\n <div className={css.row} style={{ flexWrap: 'wrap', gap: 6, justifyContent: 'space-between' }}>\n <span className={css.row} style={{ gap: 6 }}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void (async () => {\n setBusy(true)\n setBusyLabel('⚠️ 提炼本书视觉规则…')\n setError('')\n try {\n const result = await api.visualRules({ op: 'extract' })\n await refresh(false)\n pushProgress(`已提炼 ${result.rules.length} 条视觉规则(已注入所有提示词)`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`视觉规则提炼失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n })() }}>⚠️ 提炼视觉规则</button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { void refresh(false); pushProgress('角色库已刷新', 'done') }}>🔄 刷新角色库</button>\n </span>\n </div>\n\n {(project?.visualRules ?? []).length > 0 && (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4, alignItems: 'center', marginTop: 6 }}>\n <span className={css.meta} style={{ fontSize: 11 }}>⚠️ 本书视觉规则:</span>\n {(project?.visualRules ?? []).map((r, i) => <span key={i} style={{ border: '1px solid var(--nf-warn, #b8860b)', borderRadius: 999, padding: '1px 8px', fontSize: 10, color: 'var(--nf-warn, #b8860b)' }}>{r}</span>)}\n </div>\n )}\n\n{(() => {\n const roles = project?.roles ?? []\n if (roles.length === 0) {\n return (\n <div className={css.shelfEmpty} style={{ minHeight: 140, flex: 1 }}>\n <span className={css.shelfEmptyIcon}>🎭</span>\n <span className={css.shelfEmptyTitle}>角色库为空</span>\n <span className={css.meta}>请先到「角色库」提炼角色并生成形象锚点</span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setActiveTab('roles') }}>去角色库</button>\n </div>\n )\n }\n const detailRole = detailRoleName !== null ? roles.find(r => r.name === detailRoleName) : undefined\n const group = (role: RoleRecord) => {\n const g = role.gallery ?? []\n const byLabel = (key: string) => g.filter(x => x.label === key)\n const byPrefix = (pre: string) => g.filter(x => x.label.startsWith(pre))\n return {\n portrait: byLabel('立绘')[0],\n sheet: byLabel('四视图')[0],\n expressions: byPrefix('表情-'),\n others: g.filter(x => x.label !== '立绘' && x.label !== '四视图' && !x.label.startsWith('表情-')),\n }\n }\n const uploadInDetail = (role: RoleRecord) => {\n setRoleImageLabel(detailUploadLabel.trim() !== '' ? detailUploadLabel.trim() : '立绘')\n setRoleImageTarget(role.name)\n roleImageInputRef.current?.click()\n }\n return (\n <>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(130px, 1fr))', gap: 10 }}>\n {roles.map(r => (\n <div key={r.name} onClick={() => { setDetailRoleName(r.name); setDetailUploadLabel('立绘') }} style={{ cursor: 'pointer', border: '1px solid var(--nf-border)', borderRadius: 12, overflow: 'hidden', background: 'var(--nf-bg-inset)', display: 'flex', flexDirection: 'column' }}>\n <div style={{ aspectRatio: '3/4', display: 'flex', alignItems: 'center', justifyContent: 'center', background: 'var(--nf-bg-inset)', borderBottom: '1px solid var(--nf-border)', position: 'relative', overflow: 'hidden' }}>\n {r.imageUrl !== undefined\n ? <img src={r.imageUrl} alt={r.name} style={{ width: '100%', height: '100%', objectFit: 'cover', objectPosition: 'center 20%' }} />\n : <span className={css.meta}>暂无形象</span>}\n <span style={{ position: 'absolute', bottom: 4, right: 4, background: 'rgba(0,0,0,0.6)', color: '#fff', fontSize: 10, borderRadius: 6, padding: '1px 6px' }}>🖼 {(r.gallery ?? []).length}</span>\n </div>\n <div style={{ padding: 6, display: 'flex', flexDirection: 'column', gap: 2 }}>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <b style={{ fontSize: 13 }}>{r.name}</b>\n <span className={css.meta} style={{ fontSize: 10 }}>{r.roleLabel}</span>\n </div>\n <div className={css.meta} style={{ fontSize: 10, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>\n {r.imagePrompt !== undefined ? '✓ 锚点' : '⚠ 无锚点'} · {(r.identity ?? '').slice(0, 16)}\n </div>\n </div>\n </div>\n ))}\n </div>\n\n {detailRole !== undefined && (\n <div style={{ position: 'fixed', inset: 0, background: 'rgba(0,0,0,0.55)', zIndex: 1000, display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 24 }} onClick={() => { setDetailRoleName(null) }}>\n <div style={{ background: 'var(--nf-bg)', border: '1px solid var(--nf-border)', borderRadius: 16, width: 'min(960px, 100%)', maxHeight: '92vh', overflowY: 'auto', padding: 20, position: 'relative' }} onClick={e => e.stopPropagation()}>\n <button type=\"button\" className={css.iconButton} style={{ position: 'absolute', top: 12, right: 12, fontSize: 18 }} title=\"关闭\" aria-label=\"关闭\" onClick={() => { setDetailRoleName(null) }}>✕</button>\n <div style={{ marginBottom: 12 }}>\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 10, flexWrap: 'wrap' }}>\n <b style={{ fontSize: 22 }}>{detailRole.name}</b>\n <span className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)' }}>{detailRole.roleLabel}</span>\n </div>\n <div className={css.meta} style={{ marginTop: 4 }}>{detailRole.identity}</div>\n </div>\n\n {(project?.visualRules ?? []).length > 0 && (\n <div style={{ border: '1px solid var(--nf-warn, #b8860b)', borderRadius: 10, padding: '6px 10px', marginBottom: 10, fontSize: 11 }}>\n <b>⚠️ 本书视觉规则(已内嵌到下方所有提示词)</b>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4, marginTop: 4 }}>\n {(project?.visualRules ?? []).map((r, i) => <span key={i} style={{ border: '1px solid var(--nf-border)', borderRadius: 999, padding: '1px 8px', fontSize: 10 }}>{r}</span>)}\n </div>\n </div>\n )}\n\n <details style={{ marginBottom: 10, fontSize: 12 }}>\n <summary style={{ cursor: 'pointer', color: 'var(--nf-text-2)' }}>🖼 图集({(detailRole.gallery ?? []).length} 张 · 点击展开/收起)</summary>\n <div style={{ marginTop: 8 }}>\n {(() => {\n const g = group(detailRole)\n const hasMain = g.portrait !== undefined || g.sheet !== undefined\n return (\n <>\n {hasMain && (\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(240px, 1fr))', gap: 10, marginBottom: 12 }}>\n {g.portrait !== undefined && (\n <div style={{ border: '1px solid var(--nf-border)', borderRadius: 12, overflow: 'hidden' }}>\n <img src={g.portrait.dataUrl} alt=\"立绘\" style={{ width: '100%', maxHeight: 380, objectFit: 'contain', display: 'block', background: '#111' }} />\n <div className={css.meta} style={{ padding: '2px 8px', fontSize: 11 }}>立绘</div>\n </div>\n )}\n {g.sheet !== undefined && (\n <div style={{ border: '1px solid var(--nf-border)', borderRadius: 12, overflow: 'hidden' }}>\n <img src={g.sheet.dataUrl} alt=\"四视图\" style={{ width: '100%', maxHeight: 380, objectFit: 'contain', display: 'block', background: '#111' }} />\n <div className={css.meta} style={{ padding: '2px 8px', fontSize: 11 }}>四视图</div>\n </div>\n )}\n </div>\n )}\n {g.expressions.length > 0 && (\n <div style={{ marginBottom: 12 }}>\n <b style={{ fontSize: 13 }}>表情设定</b>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(110px, 1fr))', gap: 8, marginTop: 6 }}>\n {g.expressions.map(img => (\n <div key={img.label} style={{ border: '1px solid var(--nf-border)', borderRadius: 10, overflow: 'hidden', position: 'relative' }}>\n <img src={img.dataUrl} alt={img.label} style={{ width: '100%', height: 110, objectFit: 'cover', display: 'block' }} />\n <div style={{ background: 'rgba(0,0,0,0.55)', color: '#fff', fontSize: 10, padding: '1px 6px', textAlign: 'center' }}>{img.label.replace('表情-', '')}</div>\n <button type=\"button\" className={css.iconButton} style={{ position: 'absolute', top: 2, right: 2, fontSize: 11 }} title=\"删除\" aria-label=\"删除\" onClick={() => { void (async () => {\n try {\n await api.roles({ op: 'removeImage', name: detailRole.name, label: img.label })\n await refresh(false)\n pushProgress(`已删除「${detailRole.name}」${img.label}`, 'done')\n } catch (err) { setError((err as Error).message) }\n })() }}>×</button>\n </div>\n ))}\n </div>\n </div>\n )}\n {g.others.length > 0 && (\n <div style={{ marginBottom: 12 }}>\n <b style={{ fontSize: 13 }}>场景 / 细节</b>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(140px, 1fr))', gap: 8, marginTop: 6 }}>\n {g.others.map(img => (\n <div key={img.label} style={{ border: '1px solid var(--nf-border)', borderRadius: 10, overflow: 'hidden', position: 'relative' }}>\n <img src={img.dataUrl} alt={img.label} style={{ width: '100%', height: 90, objectFit: 'cover', display: 'block' }} />\n <div style={{ background: 'rgba(0,0,0,0.55)', color: '#fff', fontSize: 10, padding: '1px 6px', textAlign: 'center' }}>{img.label}</div>\n <button type=\"button\" className={css.iconButton} style={{ position: 'absolute', top: 2, right: 2, fontSize: 11 }} title=\"删除\" aria-label=\"删除\" onClick={() => { void (async () => {\n try {\n await api.roles({ op: 'removeImage', name: detailRole.name, label: img.label })\n await refresh(false)\n pushProgress(`已删除「${detailRole.name}」${img.label}`, 'done')\n } catch (err) { setError((err as Error).message) }\n })() }}>×</button>\n </div>\n ))}\n </div>\n </div>\n )}\n </>\n )\n })()}\n </div>\n </details>\n\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(280px, 1fr))', gap: 14, marginBottom: 12 }}>\n <div>\n <b style={{ fontSize: 13 }}>基本信息</b>\n <div style={{ fontSize: 12, lineHeight: 1.8, marginTop: 4 }}>\n <div><span className={css.meta}>性格:</span>{(detailRole.traits ?? []).join('、') || '—'}</div>\n <div><span className={css.meta}>目标:</span>{detailRole.goals || '—'}</div>\n <div><span className={css.meta}>关系:</span>{(detailRole.relations ?? []).join(';') || '—'}</div>\n <div><span className={css.meta}>成长线:</span>{(detailRole.arc ?? []).join(';') || '—'}</div>\n </div>\n </div>\n <div>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <b style={{ fontSize: 13 }}>📄 提示词包</b>\n {detailRole.imagePrompt !== undefined && detailRole.promptKit === undefined && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void (async () => {\n setBusy(true)\n setBusyLabel(`精修「${detailRole.name}」提示词…`)\n setError('')\n try {\n await api.roles({ op: 'promptKit', name: detailRole.name })\n await refresh(false)\n pushProgress(`已生成「${detailRole.name}」四类精修提示词`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`提示词精修失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n })() }}>✨ 生成精修版</button>\n )}\n </div>\n {detailRole.imagePrompt === undefined && <span className={css.meta}>未生成锚点,先点「✨ 生成锚点」</span>}\n {(() => {\n const anchor = detailRole.imagePrompt\n if (anchor === undefined) return null\n const rules = project?.visualRules ?? []\n const rulesZh = rules.length > 0 ? '\\n【本书视觉规则】' + rules.join(';') : ''\n const expressions = detailRole.expressions ?? ['平静']\n const expName = (n: string) => n.replace(/^表情-/, '')\n const kit = detailRole.promptKit\n const blocks: Array<{ key: string; title: string; zh: string; en: string }> = []\n if (kit !== undefined) {\n blocks.push({ key: 'portrait', title: '立绘', zh: kit.portrait.zh, en: kit.portrait.en })\n blocks.push({ key: 'sheet', title: '四视图', zh: kit.sheet.zh, en: kit.sheet.en })\n for (const e of kit.expressions) blocks.push({ key: 'exp-' + e.name, title: `表情·${e.name}`, zh: e.zh, en: e.en })\n blocks.push({ key: 'details', title: '细节', zh: kit.details.zh, en: kit.details.en })\n } else {\n blocks.push({ key: 'portrait', title: '立绘', zh: '正面站立全身人像,3D动漫,超精细建模,纯白纯色背景,' + anchor.zh + '。角色设计稿,服装磨损、标志物细节完整展示,无多余杂物,全身完整无裁切。' + rulesZh, en: anchor.en + ', full body, front view, plain white background, 3d render, character design sheet' })\n blocks.push({ key: 'sheet', title: '四视图', zh: '角色设定四视图,3D动漫,超精细建模,纯白纯色背景,' + anchor.zh + '。同一角色正面/左侧面/右侧面/背面,四个视角分别描述,全身完整,服装与标志物细节完整展示,无多余杂物。' + rulesZh, en: anchor.en + ', character sheet, front view, left side view, right side view, back view, full body, plain white background, 3d render' })\n for (const n of expressions) blocks.push({ key: 'exp-' + n, title: `表情·${expName(n)}`, zh: '脸部特写(头部到锁骨),3D动漫,超精细建模,纯白纯色背景,' + anchor.zh + `。表情:${expName(n)},五官与角色定稿完全一致,皮肤纹理细节完整,无多余杂物。` + rulesZh, en: anchor.en + `, facial close-up, head to collarbone, expression: ${expName(n)}, plain white background, 3d render, consistent with character design, detailed skin texture, no extra objects` })\n blocks.push({ key: 'details', title: '细节', zh: `多组局部细节集合参考图,3D动漫,超精细建模,纯白纯色背景:${anchor.tags.map(t => t + '特写').join(';')}。细节清晰锐利,角色细节参考稿,无多余杂物。` + rulesZh, en: anchor.tags.join(', ') + ', multi-panel detail reference sheet, plain white background, 3d render, macro close-up, sharp details, character detail sheet, no extra objects' })\n }\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, marginTop: 8 }}>\n {blocks.map(b => (\n <div key={b.key} style={{ border: '1px solid var(--nf-border)', borderRadius: 8, padding: '6px 8px' }}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <b style={{ fontSize: 11 }}>{b.title}</b>\n <span className={css.row} style={{ gap: 4 }}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} style={{ fontSize: 10 }} onClick={() => {\n void navigator.clipboard?.writeText(b.zh).then(() => { pushProgress(`已复制「${detailRole.name}」${b.title}中文提示词`, 'done') }).catch(() => { /* ignore */ })\n }}>复制</button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} style={{ fontSize: 10 }} onClick={() => {\n void navigator.clipboard?.writeText(b.en).then(() => { pushProgress(`已复制「${detailRole.name}」${b.title}英文标签`, 'done') }).catch(() => { /* ignore */ })\n }}>EN</button>\n </span>\n </div>\n <div className={css.meta} style={{ fontSize: 11, lineHeight: 1.5, marginTop: 3 }}>{b.zh}</div>\n <details style={{ marginTop: 3 }}>\n <summary style={{ cursor: 'pointer', fontSize: 10, color: 'var(--nf-text-2)' }}>🌐 英文标签(点击展开)</summary>\n <div className={css.meta} style={{ fontSize: 9, fontFamily: 'monospace', marginTop: 2, wordBreak: 'break-all', color: 'var(--nf-text-2)' }}>{b.en}</div>\n </details>\n </div>\n ))}\n <div className={css.meta} style={{ fontSize: 10 }}>关键词:{(anchor.tags ?? []).join('、')}</div>\n </div>\n )\n })()}\n </div>\n </div>\n\n <div style={{ borderTop: '1px solid var(--nf-border)', paddingTop: 10, display: 'flex', flexWrap: 'wrap', gap: 6, alignItems: 'center' }}>\n {detailRole.imagePrompt === undefined && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void handleRoleVisual(detailRole.name) }}>✨ 生成锚点</button>\n )}\n {detailRole.imagePrompt !== undefined && config?.imageApiEnabled === true && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void handleRoleImageGenerate(detailRole.name) }}>豆包生成</button>\n )}\n {detailRole.imagePrompt !== undefined && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => {\n const text = [detailRole.imagePrompt!.en, detailRole.imagePrompt!.tags.join(', ')].filter(Boolean).join('\\n')\n void navigator.clipboard?.writeText(text).then(() => { pushProgress(`已复制「${detailRole.name}」英文生图提示词`, 'done') }).catch(() => { /* ignore */ })\n }}>复制提示词</button>\n )}\n <input\n className={css.input}\n style={{ width: 140, fontSize: 12, padding: '3px 6px' }}\n placeholder=\"图集标签\"\n value={detailUploadLabel}\n onChange={e => { setDetailUploadLabel(e.target.value) }}\n />\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { uploadInDetail(detailRole) }}>📤 上传图</button>\n </div>\n </div>\n </div>\n )}\n </>\n )\n })()}\n </div>\n </div>\n )}\n\n {activeTab === 'scenes' && (\n <div className={css.card} style={{ flex: 1, minHeight: 0 }}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle} style={{ fontSize: 17, fontWeight: 700 }}>🏞️ 场景库</span>\n <span className={css.meta}>场景视觉锚点:提炼自正文,供漫剧分镜/生图锁定\"在哪、什么氛围\"</span>\n </div>\n\n <div className={css.row} style={{ flexWrap: 'wrap', gap: 6, margin: '8px 0' }}>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void (async () => {\n setBusy(true)\n setBusyLabel('✨ 从全书提炼场景…')\n setError('')\n try {\n const result = await api.scenes({ op: 'extract' })\n setSceneCandidates(result.candidates ?? [])\n pushProgress(`提炼出 ${(result.candidates ?? []).length} 个候选场景,可采纳或修改后采纳`, 'done')\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`场景提炼失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n }\n })() }}>{busy ? '⏳ 提炼中…' : '✨ 从全书提炼场景'}</button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { void refresh(false); pushProgress('场景库已刷新', 'done') }}>🔄 刷新</button>\n {sceneCandidates !== null && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setSceneCandidates(null) }}>收起候选</button>\n )}\n </div>\n\n {sceneDraft !== null && (\n <div style={{ border: '1px solid var(--nf-accent)', borderRadius: 10, padding: 10, marginBottom: 10, display: 'flex', flexDirection: 'column', gap: 6 }}>\n <b style={{ fontSize: 13 }}>编辑场景</b>\n <input className={css.input} style={{ fontSize: 12, padding: '4px 8px' }} placeholder=\"场景名\" value={sceneDraft.name} onChange={e => { setSceneDraft({ ...sceneDraft, name: e.target.value }) }} />\n <input className={css.input} style={{ fontSize: 12, padding: '4px 8px' }} placeholder=\"一句话定位\" value={sceneDraft.summary} onChange={e => { setSceneDraft({ ...sceneDraft, summary: e.target.value }) }} />\n <div className={css.row} style={{ gap: 6 }}>\n <input className={css.input} style={{ fontSize: 12, padding: '4px 8px', flex: 1 }} placeholder=\"幕归属(第一幕后场…)\" value={sceneDraft.act ?? ''} onChange={e => { setSceneDraft({ ...sceneDraft, act: e.target.value }) }} />\n <input className={css.input} style={{ fontSize: 12, padding: '4px 8px', flex: 1 }} placeholder=\"时间光态(雨夜/闭店后…)\" value={sceneDraft.moment ?? ''} onChange={e => { setSceneDraft({ ...sceneDraft, moment: e.target.value }) }} />\n </div>\n <textarea className={css.input} style={{ fontSize: 12, padding: '4px 8px', minHeight: 48 }} placeholder=\"关键镜头(每行一条:人物动作+情绪+镜头)\" value={(sceneDraft.beats ?? []).join('\\n')} onChange={e => { setSceneDraft({ ...sceneDraft, beats: e.target.value.split(/\\n+/).map(x => x.trim()).filter(Boolean) }) }} />\n <input className={css.input} style={{ fontSize: 12, padding: '4px 8px' }} placeholder=\"人物在场状态(含标志物细节)\" value={sceneDraft.characterState ?? ''} onChange={e => { setSceneDraft({ ...sceneDraft, characterState: e.target.value }) }} />\n <textarea className={css.input} style={{ fontSize: 12, padding: '4px 8px', minHeight: 60 }} placeholder=\"环境构成(每行一项)\" value={(sceneDraft.elements ?? []).join('\\n')} onChange={e => { setSceneDraft({ ...sceneDraft, elements: e.target.value.split(/\\n+/).map(x => x.trim()).filter(Boolean) }) }} />\n <textarea className={css.input} style={{ fontSize: 12, padding: '4px 8px', minHeight: 60 }} placeholder=\"中文生图提示词\" value={sceneDraft.zh} onChange={e => { setSceneDraft({ ...sceneDraft, zh: e.target.value }) }} />\n <textarea className={css.input} style={{ fontSize: 12, padding: '4px 8px', minHeight: 60 }} placeholder=\"英文生图提示词\" value={sceneDraft.en} onChange={e => { setSceneDraft({ ...sceneDraft, en: e.target.value }) }} />\n <div className={css.row} style={{ gap: 6 }}>\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy || sceneDraft.name.trim() === ''} onClick={() => { void (async () => {\n setBusy(true)\n try {\n await api.scenes({ op: 'update', scene: { ...sceneDraft, name: sceneDraft.name.trim() } })\n await refresh(false)\n setSceneDraft(null)\n pushProgress(`已保存场景「${sceneDraft.name.trim()}」`, 'done')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n })() }}>保存</button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setSceneDraft(null) }}>取消</button>\n </div>\n </div>\n )}\n\n {sceneCandidates !== null && sceneCandidates.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, marginBottom: 10 }}>\n {sceneCandidates.map(s => (\n <div key={s.name} style={{ border: '1px solid var(--nf-accent)', borderRadius: 10, padding: '8px 10px', fontSize: 12 }}>\n <div className={css.row} style={{ flexWrap: 'wrap', gap: 6, justifyContent: 'space-between' }}>\n <span><b>{s.name}</b> <span className={css.meta}>· {(s.moods ?? []).join('、')}</span></span>\n <span className={css.row} style={{ gap: 4 }}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { void (async () => {\n try {\n await api.scenes({ op: 'adopt', scene: s })\n setSceneCandidates((sceneCandidates ?? []).filter(x => x.name !== s.name))\n await refresh(false)\n pushProgress(`已采纳场景「${s.name}」`, 'done')\n } catch (err) { setError((err as Error).message) }\n })() }}>采纳</button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setSceneDraft(s); setSceneCandidates(null) }}>修改后采纳</button>\n </span>\n </div>\n <div className={css.meta} style={{ marginTop: 2 }}>{s.summary}</div>\n <div className={css.meta} style={{ marginTop: 2, fontSize: 11 }}>要素:{(s.elements ?? []).join(';')}</div>\n </div>\n ))}\n </div>\n )}\n\n {(() => {\n const scenes = project?.scenes ?? []\n const detail = sceneDetailName !== null ? scenes.find(s => s.name === sceneDetailName) : undefined\n if (scenes.length === 0 && sceneCandidates === null) {\n return (\n <div className={css.shelfEmpty} style={{ minHeight: 140, flex: 1 }}>\n <span className={css.shelfEmptyIcon}>🏞️</span>\n <span className={css.shelfEmptyTitle}>场景库为空</span>\n <span className={css.meta}>点「✨ 从全书提炼场景」自动建立,或手动新增</span>\n </div>\n )\n }\n return (\n <>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(180px, 1fr))', gap: 10 }}>\n {scenes.map(s => {\n const cover = (s.gallery ?? [])[0]\n return (\n <div key={s.name} onClick={() => { setSceneDetailName(s.name); setSceneUploadLabel('全景') }} style={{ cursor: 'pointer', border: '1px solid var(--nf-border)', borderRadius: 12, overflow: 'hidden', background: 'var(--nf-bg-inset)', display: 'flex', flexDirection: 'column' }}>\n <div style={{ height: 100, display: 'flex', alignItems: 'center', justifyContent: 'center', background: 'var(--nf-bg-inset)', borderBottom: '1px solid var(--nf-border)', position: 'relative' }}>\n {cover !== undefined\n ? <img src={cover.dataUrl} alt={s.name} style={{ width: '100%', height: '100%', objectFit: 'cover' }} />\n : <span className={css.meta}>暂无场景图</span>}\n <span style={{ position: 'absolute', bottom: 4, right: 4, background: 'rgba(0,0,0,0.6)', color: '#fff', fontSize: 10, borderRadius: 6, padding: '1px 6px' }}>🖼 {(s.gallery ?? []).length}</span>\n </div>\n <div style={{ padding: 6, display: 'flex', flexDirection: 'column', gap: 2 }}>\n <b style={{ fontSize: 13 }}>{s.name}</b>\n <div className={css.meta} style={{ fontSize: 10 }}>{(s.moods ?? []).join('、') || s.summary.slice(0, 16)}</div>\n </div>\n </div>\n )\n })}\n </div>\n\n {detail !== undefined && (\n <div style={{ position: 'fixed', inset: 0, background: 'rgba(0,0,0,0.55)', zIndex: 1000, display: 'flex', alignItems: 'center', justifyContent: 'center', padding: 24 }} onClick={() => { setSceneDetailName(null) }}>\n <div style={{ background: 'var(--nf-bg)', border: '1px solid var(--nf-border)', borderRadius: 16, width: 'min(860px, 100%)', maxHeight: '92vh', overflowY: 'auto', padding: 20, position: 'relative' }} onClick={e => e.stopPropagation()}>\n <button type=\"button\" className={css.iconButton} style={{ position: 'absolute', top: 12, right: 12, fontSize: 18 }} title=\"关闭\" aria-label=\"关闭\" onClick={() => { setSceneDetailName(null) }}>✕</button>\n <div style={{ marginBottom: 12 }}>\n <b style={{ fontSize: 20 }}>{detail.name}</b>\n <div className={css.meta} style={{ marginTop: 4 }}>{detail.summary}</div>\n </div>\n\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(160px, 1fr))', gap: 8, marginBottom: 12 }}>\n {(detail.gallery ?? []).map(img => (\n <div key={img.label} style={{ border: '1px solid var(--nf-border)', borderRadius: 10, overflow: 'hidden', position: 'relative' }}>\n <img src={img.dataUrl} alt={img.label} style={{ width: '100%', height: 100, objectFit: 'cover', display: 'block' }} />\n <div style={{ background: 'rgba(0,0,0,0.55)', color: '#fff', fontSize: 10, padding: '1px 6px', textAlign: 'center' }}>{img.label}</div>\n <button type=\"button\" className={css.iconButton} style={{ position: 'absolute', top: 2, right: 2, fontSize: 11 }} title=\"删除\" aria-label=\"删除\" onClick={() => { void (async () => {\n try {\n await api.scenes({ op: 'removeImage', name: detail.name, label: img.label })\n await refresh(false)\n pushProgress(`已删除「${detail.name}」${img.label}`, 'done')\n } catch (err) { setError((err as Error).message) }\n })() }}>×</button>\n </div>\n ))}\n {(detail.gallery ?? []).length === 0 && <span className={css.meta}>暂无场景图</span>}\n </div>\n\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(260px, 1fr))', gap: 14, marginBottom: 12 }}>\n <div style={{ fontSize: 12, lineHeight: 1.8 }}>\n {(detail.act !== undefined || detail.moment !== undefined) && (\n <div style={{ marginBottom: 6 }}>\n {(detail.act !== undefined && detail.act !== '') && <span className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)', marginRight: 6 }}>{detail.act}</span>}\n {(detail.moment !== undefined && detail.moment !== '') && <span className={css.meta}>{detail.moment}</span>}\n </div>\n )}\n {(detail.beats ?? []).length > 0 && (\n <div style={{ marginBottom: 8 }}>\n <b style={{ fontSize: 13 }}>关键镜头</b>\n <div style={{ marginTop: 4 }}>{(detail.beats ?? []).map((b, i) => <div key={i} style={{ fontSize: 11, color: 'var(--nf-text-2)', marginTop: 2 }}>🎬 {b}</div>)}</div>\n </div>\n )}\n {detail.characterState !== undefined && detail.characterState !== '' && (\n <div style={{ marginBottom: 8 }}>\n <b style={{ fontSize: 13 }}>人物状态</b>\n <div className={css.meta} style={{ marginTop: 2 }}>{detail.characterState}</div>\n </div>\n )}\n <b style={{ fontSize: 13 }}>环境构成</b>\n <div style={{ marginTop: 4 }}>{(detail.elements ?? []).map(e => <span key={e} style={{ border: '1px solid var(--nf-border)', borderRadius: 999, padding: '1px 8px', fontSize: 11, margin: '0 4px 4px 0', display: 'inline-block' }}>{e}</span>)}</div>\n <div style={{ marginTop: 8 }}><b style={{ fontSize: 13 }}>色调光影</b></div>\n <div style={{ marginTop: 4 }}>{(detail.palette ?? []).join(';') || '—'}</div>\n <div style={{ marginTop: 8 }}><b style={{ fontSize: 13 }}>氛围</b></div>\n <div style={{ marginTop: 4 }}>{(detail.moods ?? []).join('、') || '—'}</div>\n <div style={{ marginTop: 8 }}><b style={{ fontSize: 13 }}>依据</b></div>\n <div className={css.meta} style={{ marginTop: 4 }}>{detail.source || '—'}</div>\n </div>\n <div>\n <b style={{ fontSize: 13 }}>生图提示词</b>\n <div className={css.meta} style={{ fontSize: 11, lineHeight: 1.6, marginTop: 4 }}>{detail.zh}</div>\n <div className={css.meta} style={{ fontSize: 10, fontFamily: 'monospace', marginTop: 4, wordBreak: 'break-all' }}>{detail.en}</div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4, marginTop: 8 }}>\n {(detail.tags ?? []).map(t => <span key={t} style={{ border: '1px solid var(--nf-border)', borderRadius: 999, padding: '2px 8px', fontSize: 11 }}>{t}</span>)}\n </div>\n </div>\n </div>\n\n <div style={{ borderTop: '1px solid var(--nf-border)', paddingTop: 10, display: 'flex', flexWrap: 'wrap', gap: 6, alignItems: 'center' }}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => {\n const text = [detail.en, detail.tags.join(', ')].filter(Boolean).join('\\n')\n void navigator.clipboard?.writeText(text).then(() => { pushProgress(`已复制「${detail.name}」英文生图提示词`, 'done') }).catch(() => { /* ignore */ })\n }}>复制提示词</button>\n <input className={css.input} style={{ width: 130, fontSize: 12, padding: '3px 6px' }} placeholder=\"图集标签\" value={sceneUploadLabel} onChange={e => { setSceneUploadLabel(e.target.value) }} />\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => {\n setRoleImageLabel(sceneUploadLabel.trim() !== '' ? sceneUploadLabel.trim() : '全景')\n setSceneUploadLabel(sceneUploadLabel.trim() !== '' ? sceneUploadLabel.trim() : '全景')\n setRoleImageTarget(detail.name + '||scene')\n roleImageInputRef.current?.click()\n }}>📤 上传场景图</button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setSceneDraft(detail); setSceneDetailName(null) }}>✏️ 编辑</button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} style={{ color: 'var(--nf-danger, #e05)' }} onClick={() => { void (async () => {\n if (!window.confirm(`确定删除场景「${detail.name}」?`)) return\n try {\n await api.scenes({ op: 'remove', name: detail.name })\n await refresh(false)\n setSceneDetailName(null)\n pushProgress(`已删除场景「${detail.name}」`, 'done')\n } catch (err) { setError((err as Error).message) }\n })() }}>🗑 删除</button>\n </div>\n </div>\n </div>\n )}\n </>\n )\n })()}\n </div>\n )}\n\n </>)}\n </div>\n </div>\n </>\n )}\n\n {/* AI 助手悬浮窗:可拖动、可拉大小,不占用工作台 */}\n {assistantOpen && (\n <div\n className={css.assistantFloat}\n style={{ left: assistantPos.x, top: assistantPos.y, width: assistantSize.w, height: assistantSize.h }}\n >\n <div\n className={css.assistantFloatHeader}\n onMouseDown={e => {\n e.preventDefault()\n dragState.current = { type: 'move', target: 'assistant', startX: e.clientX, startY: e.clientY, origX: assistantPos.x, origY: assistantPos.y, origW: assistantSize.w, origH: assistantSize.h }\n }}\n >\n <span>💬 AI 助手 <span className={css.meta}>(拖动标题栏移动 · 右下角拉大小)</span></span>\n <button type=\"button\" className={css.iconButton} title=\"关闭\" aria-label=\"关闭 AI 助手\" onClick={() => { setAssistantOpen(false) }}>×</button>\n </div>\n <div className={css.assistantFloatBody}>\n <AssistantTab api={api} />\n </div>\n <div\n className={css.assistantResize}\n onMouseDown={e => {\n e.preventDefault()\n e.stopPropagation()\n dragState.current = { type: 'resize', target: 'assistant', startX: e.clientX, startY: e.clientY, origX: assistantPos.x, origY: assistantPos.y, origW: assistantSize.w, origH: assistantSize.h }\n }}\n />\n </div>\n )}\n\n {/* 工作进度悬浮窗:可拖动、可拉大小(同 AI 助手),承接活动输出 + 当前任务进度 */}\n {progressOpen && (\n <div\n className={css.assistantFloat}\n style={{ left: progressPos.x, top: progressPos.y, width: progressSize.w, height: progressSize.h }}\n >\n <div\n className={css.assistantFloatHeader}\n onMouseDown={e => {\n e.preventDefault()\n dragState.current = { type: 'move', target: 'progress', startX: e.clientX, startY: e.clientY, origX: progressPos.x, origY: progressPos.y, origW: progressSize.w, origH: progressSize.h }\n }}\n >\n <span>\n 📊 工作进度\n {busy && <span style={{ color: 'var(--nf-accent)' }}> 🟢 任务进行中</span>}\n <span className={css.meta}>(拖动标题栏移动 · 右下角拉大小)</span>\n </span>\n <span style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n {progress.length > 0 && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setProgress([]) }} title=\"清空活动记录\">\n 清空\n </button>\n )}\n <button type=\"button\" className={css.iconButton} title=\"关闭\" aria-label=\"关闭工作进度\" onClick={() => { setProgressOpen(false) }}>×</button>\n </span>\n </div>\n <div className={css.assistantFloatBody} style={{ padding: 10, display: 'flex', flexDirection: 'column', gap: 8, overflow: 'hidden' }}>\n {/* 当前任务大进度条:进行中显示 */}\n {(busy && (busyLabel !== '' || liveBar !== null)) && (\n <div style={{ border: '1px solid var(--nf-accent)', borderRadius: 10, padding: '8px 12px', display: 'flex', flexDirection: 'column', gap: 5, background: 'color-mix(in srgb, var(--nf-accent) 6%, transparent)' }}>\n <span style={{ fontSize: 12, fontWeight: 600, color: 'var(--nf-accent)' }}>\n ✍ {busyLabel !== '' ? busyLabel : (liveBar?.text ?? '任务进行中')}…\n </span>\n {liveBar?.ratio !== undefined && (\n <div className={css.bigProgressBar}>\n <div className={css.bigProgressBarFill} style={{ width: `${Math.round(liveBar.ratio * 100)}%` }} />\n </div>\n )}\n {liveBar?.text !== undefined && <span className={css.liveText}>{liveBar.text}</span>}\n </div>\n )}\n {/* 活动记录列表(标题行已并入窗口标题栏,清空按钮在右上角) */}\n <div className={css.progress} style={{ flex: 1, minHeight: 0, overflowY: 'auto', border: '1px solid var(--nf-border)', borderRadius: 10, background: 'var(--nf-bg-inset)', padding: 8, display: 'flex', flexDirection: 'column' }}>\n {progress.length === 0 ? (\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', gap: 4, color: 'var(--nf-text-3)', fontSize: 12, minHeight: 120 }}>\n <span style={{ fontSize: 22 }}>📭</span>\n <span>暂无活动记录</span>\n <span>生成、审稿等操作会显示在这里</span>\n </div>\n ) : (\n progress.map(line => (\n <div key={line.id} className={line.kind === 'done' ? css.progressLineDone : line.kind === 'error' ? css.progressLineError : line.live === true ? css.progressLineLive : css.progressLine}>\n {line.live === true && (\n <span className={css.progressBar}>\n <span className={css.progressBarFill} style={{ width: `${Math.round((line.ratio ?? 0) * 100)}%` }} />\n </span>\n )}\n {line.text}\n </div>\n ))\n )}\n <div ref={progressEndRef} />\n </div>\n </div>\n <div\n className={css.assistantResize}\n onMouseDown={e => {\n e.preventDefault()\n e.stopPropagation()\n dragState.current = { type: 'resize', target: 'progress', startX: e.clientX, startY: e.clientY, origX: progressPos.x, origY: progressPos.y, origW: progressSize.w, origH: progressSize.h }\n }}\n />\n </div>\n )}\n </div>\n )\n}\n","/**\n * Panel view mounting — mirrors the family plugins: a container appended\n * inside the conversation grid item, hidden while inactive; toggling is a\n * data attribute on <html>, with cross-plugin activation events.\n */\nimport { createRoot, type Root } from 'react-dom/client'\nimport type { NovelApi } from './api.ts'\nimport type { PanelController } from './panel/controller.ts'\nimport { NovelPanel } from './panel/NovelPanel.tsx'\nimport css from './panel/panel.module.css'\n\n/** The injected panel container. */\nexport const PANEL_VIEW_SELECTOR = '[data-dsh-novelforge-view]'\n\nconst CONVERSATION_COLUMN_SELECTOR = '[data-pane=\"conversation\"]'\nconst ACTIVE_ATTR = 'data-dsh-novelforge-active'\n/** Sibling panels' activation attributes (evicted when this panel opens). */\nconst OTHER_ACTIVE_ATTRS = ['data-dsh-taskboard-active', 'data-dsh-ssh-active']\n/** Cross-plugin activation event; detail is the activating panel name. */\nconst ACTIVATE_EVENT = 'dsh-panel-activate'\nconst PANEL_NAME = 'novelforge'\n\n/** Find the center column, or undefined while the frame is not mounted. */\nfunction conversationColumn(): HTMLElement | undefined {\n return document.querySelector<HTMLElement>(CONVERSATION_COLUMN_SELECTOR) ?? undefined\n}\n\n/**\n * Mount the panel React tree into the center column and bind visibility to\n * the controller.\n */\nexport function mountPanel(controller: PanelController, api: NovelApi): () => void {\n let root: Root | undefined\n let container: HTMLDivElement | undefined\n\n const ensure = (): void => {\n if (container !== undefined) {\n if (container.isConnected) return\n root?.unmount()\n root = undefined\n container.remove()\n container = undefined\n }\n const column = conversationColumn()\n if (column === undefined) return\n container = document.createElement('div')\n container.dataset.dshNovelforgeView = 'true'\n container.className = css.view\n column.appendChild(container)\n root = createRoot(container)\n root.render(<NovelPanel controller={controller} api={api} />)\n }\n\n const waitObserver = new MutationObserver(() => { ensure() })\n waitObserver.observe(document.body, { childList: true, subtree: true })\n\n const applyActive = (): void => {\n if (controller.getSnapshot().panelOpen) {\n for (const attr of OTHER_ACTIVE_ATTRS) document.documentElement.removeAttribute(attr)\n document.documentElement.setAttribute(ACTIVE_ATTR, '')\n document.dispatchEvent(new CustomEvent(ACTIVATE_EVENT, { detail: PANEL_NAME }))\n } else {\n document.documentElement.removeAttribute(ACTIVE_ATTR)\n }\n }\n const onOtherActivate = (event: Event): void => {\n const detail = (event as CustomEvent).detail\n if ((detail === 'taskboard' || detail === 'ssh') && controller.getSnapshot().panelOpen) {\n controller.close()\n }\n }\n // Jump out on sidebar context clicks.\n const SIDEBAR_ROW_SELECTOR = '[class*=\"sessionRow\"], [class*=\"projectRow\"], [class*=\"searchResultRow\"], [class*=\"searchResultWorkspace\"], [class*=\"newSession\"]'\n const onClickSidebarRow = (event: MouseEvent): void => {\n if (!controller.getSnapshot().panelOpen) return\n const target = event.target as HTMLElement | null\n if (target === null) return\n if (target.closest(SIDEBAR_ROW_SELECTOR) !== null) controller.close()\n }\n document.addEventListener('click', onClickSidebarRow, true)\n document.addEventListener(ACTIVATE_EVENT, onOtherActivate)\n const unsubscribe = controller.subscribe(applyActive)\n applyActive()\n ensure()\n\n return () => {\n document.removeEventListener('click', onClickSidebarRow, true)\n document.removeEventListener(ACTIVATE_EVENT, onOtherActivate)\n waitObserver.disconnect()\n unsubscribe()\n document.documentElement.removeAttribute(ACTIVE_ATTR)\n root?.unmount()\n root = undefined\n container?.remove()\n container = undefined\n }\n}\n","/**\n * Novel-forge panel controller: the single owner of the panel's open/closed\n * state (framework-free, mirroring the family plugins' controllers).\n */\n\n/** Immutable controller snapshot for UI subscriptions. */\nexport interface PanelControllerSnapshot {\n panelOpen: boolean\n}\n\n/** The panel state owner the sidebar entry toggles and the view renders from. */\nexport class PanelController {\n private panelOpen = false\n private listeners = new Set<() => void>()\n\n getSnapshot(): PanelControllerSnapshot {\n return { panelOpen: this.panelOpen }\n }\n\n subscribe(fn: () => void): () => void {\n this.listeners.add(fn)\n return () => { this.listeners.delete(fn) }\n }\n\n open(): void {\n if (this.panelOpen) return\n this.panelOpen = true\n this.notify()\n }\n\n close(): void {\n if (!this.panelOpen) return\n this.panelOpen = false\n this.notify()\n }\n\n toggle(): void {\n if (this.panelOpen) this.close()\n else this.open()\n }\n\n private notify(): void {\n for (const fn of [...this.listeners]) fn()\n }\n}\n","/**\n * Sidebar entry injection — mirrors the family plugins' DOM-level pattern:\n * the shell exposes no external slot, so the entry row is injected after the\n * sibling plugin entries and self-heals via MutationObserver.\n */\nimport type { PanelController } from './panel/controller.ts'\nimport { tt } from './panel/helpers.ts'\nimport css from './panel/panel.module.css'\n\n/** Stable data attribute identifying the injected entry row. */\nexport const ENTRY_SELECTOR = '[data-dsh-novelforge-entry]'\n\n/** Inline icon: an open book / writing glyph. */\nconst ICON = '<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2.5 3.5h4a2 2 0 0 1 2 2v7a2 2 0 0 0-2-2h-4z\"/><path d=\"M13.5 3.5h-4a2 2 0 0 0-2 2v7a2 2 0 0 1 2-2h4z\"/><path d=\"M8 5.5v7\"/></svg>'\n\n/** Find the sidebar shell root element. */\nfunction sidebarRoot(): HTMLElement | undefined {\n const column = document.querySelector<HTMLElement>('[data-pane=\"sidebar\"], [class*=\"sidebarCol\"]')\n if (column === null) return undefined\n const logoOwner = column.querySelector<HTMLElement>('[class*=\"logoRow\"]')?.parentElement\n return logoOwner ?? (column.firstElementChild as HTMLElement | undefined)\n}\n\n/** The New Session button (nested in the logo row on current shells). */\nfunction newSessionButton(root: HTMLElement): HTMLButtonElement | undefined {\n const nested = root.querySelector<HTMLButtonElement>('button[class*=\"newSession\"]')\n if (nested !== null) return nested\n for (const child of root.children) {\n if (child.tagName === 'BUTTON') return child as HTMLButtonElement\n }\n return undefined\n}\n\n/** Build the entry row (a detached button; insert once the shell is up). */\nfunction createEntry(controller: PanelController): HTMLButtonElement {\n const entry = document.createElement('button')\n entry.type = 'button'\n entry.dataset.dshNovelforgeEntry = 'true'\n entry.className = css.entry\n entry.setAttribute('aria-label', tt('entry.label'))\n entry.setAttribute('title', tt('entry.tooltip'))\n entry.innerHTML = '<span class=\"' + css.entryIcon + '\">' + ICON + '</span><span class=\"' + css.entryLabel + '\">' + tt('entry.label') + '</span>'\n entry.addEventListener('click', () => { controller.toggle() })\n return entry\n}\n\n/** Re-insert the entry after the sibling plugin entry block. */\nfunction placeEntry(root: HTMLElement, entry: HTMLButtonElement): boolean {\n const button = newSessionButton(root)\n if (button === undefined) return false\n if (entry.parentElement !== root) {\n const row = button.closest('[class*=\"logoRow\"]')\n const base = (row !== null && row.parentElement === root) ? row : button\n const family = Array.from(root.children).filter(\n (el): el is HTMLElement => el instanceof HTMLElement && el.matches('[data-dsh-taskboard-entry], [data-dsh-ssh-entry], [data-dsh-novelforge-entry]'),\n )\n const last = family.length > 0 ? family[family.length - 1] : undefined\n const anchor = last !== undefined ? last.nextElementSibling : base.nextElementSibling\n root.insertBefore(entry, anchor)\n }\n return true\n}\n\n/**\n * Mount the sidebar entry, waiting for the shell and self-healing on\n * re-renders.\n */\nexport function mountSidebarEntry(controller: PanelController): () => void {\n const entry = createEntry(controller)\n let root: HTMLElement | undefined\n let placed = false\n\n const tryPlace = (): void => {\n if (root !== undefined && !root.isConnected) {\n rootObserver.disconnect()\n root = undefined\n placed = false\n }\n if (placed) {\n if (document.body.contains(entry)) return\n rootObserver.disconnect()\n root = undefined\n placed = false\n }\n root ??= sidebarRoot()\n if (root === undefined) return\n placed = placeEntry(root, entry)\n if (placed) {\n rootObserver.observe(root, { childList: true, subtree: true })\n }\n }\n\n const waitObserver = new MutationObserver(() => { tryPlace() })\n waitObserver.observe(document.body, { childList: true, subtree: true })\n\n const rootObserver = new MutationObserver(() => {\n if (root === undefined || !root.isConnected) {\n placed = false\n tryPlace()\n return\n }\n if (!root.contains(entry)) {\n placed = placeEntry(root, entry)\n }\n })\n\n const syncActive = () => {\n if (controller.getSnapshot().panelOpen) entry.dataset.active = 'true'\n else delete entry.dataset.active\n }\n const unsubscribe = controller.subscribe(syncActive)\n syncActive()\n\n tryPlace()\n\n return () => {\n waitObserver.disconnect()\n rootObserver.disconnect()\n unsubscribe()\n entry.remove()\n }\n}\n","/**\n * Browser-half entry for the dsh-novel-forge plugin — runs inside the dsh web\n * GUI. Registers the sidebar entry row and the workbench panel. DOM mounting\n * problems are logged, never thrown — the web shell fails the whole boot when\n * a plugin apply throws.\n */\nimport type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport { NovelApi } from './api.ts'\nimport { mountPanel } from './mount.tsx'\nimport { PanelController } from './panel/controller.ts'\nimport { mountSidebarEntry } from './sidebar-entry.ts'\n\n/** Required services (fiber inject waiting). */\nexport const inject = ['slots', 'locale']\n\n/**\n * Mount the novel-forge workbench.\n * @param ctx - client root context.\n */\nexport function apply(ctx: ClientContext): void {\n const controller = new PanelController()\n const api = new NovelApi()\n const disposers: Array<() => void> = []\n try {\n disposers.push(mountSidebarEntry(controller))\n disposers.push(mountPanel(controller, api))\n } catch (error) {\n // DOM failures degrade the panel, never the GUI.\n console.warn('[dsh-novel-forge] mount failed:', error)\n }\n ctx.effect(() => () => {\n for (const dispose of disposers.splice(0)) dispose()\n }, 'dsh-novel-forge: ui mounts')\n}\n"],"x_google_ignoreList":[9],"mappings":"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"}