@waterwx/dsh-novel-forge 1.1.2 → 1.1.3

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","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","../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/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 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 /** 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 * 待确认草稿:润色(去AI味)或整章重写的产物正文。生成时先存这里,\n * 用户看过对比后点「采纳」才覆盖正文文件;点「放弃」则丢弃。刷新页面不丢失。\n */\n pendingDraft?: 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\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/** 角色卡:角色当前状态(从事实库聚合)。 */\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/** POST /bible/patch 请求:局部修补设定圣经。 */\nexport interface BiblePatchRequest {\n worldRules?: string[]\n redLines?: string[]\n style?: string[]\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\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 /** 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 /** 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}\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\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: '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}\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 chapterChars?: number\n maxTokens?: number\n reviewPassScore?: number\n autoReview?: 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 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 /** 审查手动编辑的正文(不落盘)。 */\n async chapterCheck(no: number, text: string): Promise<{ report: ReviewReport }> {\n return postJson<{ report: ReviewReport }>(NOVEL_API.chapterCheck, { chapterNo: no, text })\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 /** 小说简介: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 /** 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 /** 采纳待确认草稿(润色/重写产物),覆盖正文文件。 */\n async draftApply(chapterNo: number): Promise<{ ok: boolean; chars: number; file: string }> {\n return postJson<{ ok: boolean; chars: number; file: string }>(NOVEL_API.draftApply, { chapterNo })\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 'settings.title': '设置',\n 'settings.outlinePath': '默认大纲路径',\n 'settings.outputDir': '输出目录',\n 'settings.provider': '模型提供商',\n 'settings.model': '模型',\n 'settings.chapterChars': '每章目标字数',\n 'settings.maxTokens': '单章最大输出 tokens',\n 'settings.reviewPassScore': '审稿通过分数(0-100)',\n 'settings.editorFontSize': '编辑器字号(仅编辑页显示)',\n 'settings.editorFontSizeHint': '存于浏览器本地,不影响其他设备',\n 'settings.autoReview': '生成后自动审稿',\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': 'Workflow',\n 'tab.overview': 'Outline',\n 'tab.plan': 'Chapters',\n 'tab.bible': 'Bible',\n 'tab.foreshadow': 'Foreshadow',\n 'tab.settings': 'Settings',\n 'workflow.title': 'Writing workflow',\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.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.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 '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 * 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 }}>\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 {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}>\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, maxHeight: 260, 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}>\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, maxHeight: 420, 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}>\n <span className={css.cardTitle}>文戒</span>\n <span className={css.meta}>写作时必须遵守的表达边界(内置全局 + 项目自定义),生成与审稿都会检查。内置规则可用「覆盖编辑」复制为自定义版本调整。</span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, maxHeight: 280, 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, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport type { BookshelfSnapshot } from '../../protocol.ts'\nimport css from './panel.module.css'\n\n/** 一张书卡(封面懒加载)。 */\nfunction BookCard({\n api,\n book,\n active,\n onOpen,\n}: {\n api: NovelApi\n book: BookshelfSnapshot['books'][number]\n active: boolean\n onOpen: () => 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 statusLabel = !book.hasProject ? '未开书' : book.total > 0 && book.done >= book.total ? '已完结' : '进行中'\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} ${book.hasProject ? (book.total > 0 && book.done >= book.total ? css.badgeDone : css.badgeWritten) : css.badgePending}`}>\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 <span className={css.meta}>{book.total > 0 ? `已完成 ${book.done} / ${book.total} 章` : '尚未规划章节'}</span>\n </div>\n </div>\n )\n}\n\n/** 书架首页。 */\nexport function ShelfView({\n api,\n shelf,\n onOpenBook,\n onAddBook,\n}: {\n api: NovelApi\n shelf: BookshelfSnapshot\n /** 点击书卡:激活该书并进入工作台。 */\n onOpenBook: (id: string) => void\n /** 点击+:进入开书向导页。 */\n onAddBook: () => void\n}) {\n return (\n <div className={css.shelfView}>\n <div className={css.shelfHeader}>\n <h2 className={css.panelTitle} style={{ margin: 0 }}>📚 书架</h2>\n <span className={css.meta}>选择一本书进入工作台,或开一本新书</span>\n </div>\n\n <div className={css.shelfGrid}>\n {shelf.books.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 />\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 </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 */\nimport { useRef, useState } from 'react'\nimport type { NovelApi } from '../api.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 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 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 <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 <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 * 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 { CreateBookView } from './CreateBookView.tsx'\nimport { WorldTab } from './WorldTab.tsx'\nimport { extractDocxTextFromBuffer } from '../docx.ts'\nimport type {\n BookshelfSnapshot,\n ChapterPlan,\n Foreshadow,\n JobFrame,\n NovelConfig,\n ProjectState,\n ReviewReport,\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'\n | 'assetsGenre' | 'assetsProgression' | 'assetsTemplates' | 'assetsRules' | 'assetsStyle'\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 ],\n },\n {\n id: 'tools',\n label: '工具',\n items: [\n { id: 'assistant', label: tt('tab.assistant'), icon: '💬' },\n ],\n },\n {\n id: 'db',\n label: '数据库',\n items: [\n { id: 'bible', label: tt('tab.bible'), icon: '📖' },\n { id: 'world', label: '大世界', icon: '🌍' },\n { id: 'characters', label: '人物志', icon: '👥' },\n { id: 'foreshadow', label: tt('tab.foreshadow'), icon: '🔮' },\n { id: 'assetsGenre', label: '题材基底', icon: '🏷️' },\n { id: 'assetsProgression', label: '推进模式', icon: '📈' },\n { id: 'assetsTemplates', label: '笔法帖', icon: '🖋️' },\n { id: 'assetsRules', label: '文戒', icon: '🚫' },\n { id: 'assetsStyle', 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/** 构建时注入的插件版本(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 [expandedChapter, setExpandedChapter] = useState<number | null>(null)\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 } | 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 /** 编辑页字号(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 /** 有未采纳草稿的章节号(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 /** 角色卡(从事实库聚合)。 */\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 /** npm 最新版本(更新检测;null = 未检测/检测失败)。 */\n const [npmLatest, setNpmLatest] = useState<string | null>(null)\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 /** 悬浮窗位置(相对面板,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 /** 拖拽/缩放状态。 */\n const dragState = useRef<{ type: 'move' | 'resize'; 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 } catch { /* ignore */ }\n }, [assistantPos, assistantSize])\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 setAssistantPos({\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 } else {\n setAssistantSize({\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 }\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'>('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 setProject(status.project ?? null)\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 /** 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 try {\n const result = await api.audit()\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 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 handleCharactersRefresh = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel('聚合角色卡中…')\n setError('')\n try {\n const result = await api.charactersRefresh()\n setCharCards(result.cards)\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 /** 保存世界观规则编辑(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 /** 工作区:保存手动编辑的正文(备份 .bak;沿用审查报告或自动审稿,保存即出结论)。 */\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 try {\n const result = await api.chapterSave(workspace.no, workspace.original, wsCheckReport ?? undefined)\n const report = result.report\n setWorkspace(null)\n setDraftNo(null)\n setWsCheckReport(null)\n setWsChecked([])\n if (report !== undefined) {\n pushProgress(`已保存并审稿:${report.score} 分 — ${report.verdict}(${report.passed ? '通过' : '未通过'})`, report.passed ? 'done' : 'error')\n } else {\n pushProgress(`已保存第 ${workspace.no} 章编辑(${result.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): 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 let autoInstruction = instruction ?? ''\n if (autoInstruction === '' && chapter.review !== undefined && !chapter.review.passed) {\n const high = chapter.review.issues.filter(i => i.severity === 'high')\n const picked = high.length > 0 ? high.slice(0, 3) : chapter.review.issues.slice(0, 3)\n autoInstruction = '按审稿意见修订(优先处理):\\n' + picked.map(i => `[${i.severity}] ${i.item} → ${i.suggestion}`).join('\\n')\n }\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 setWsCheckReport(null)\n setWsChecked([])\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 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 setBusy(true)\n setBusyLabel(`${tt('plan.rewrite')} 第${workspace.no}章`)\n setError('')\n try {\n await api.rewrite(workspace.no, instruction, target, frame => { applyJobFrame(frame, n => tt('progress.rewriting', { 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 /** 工作区:按审查报告中勾选的问题一键修订(预填指令 + 立即整章修订到草稿)。 */\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 setWorkspace({ ...workspace, instruction })\n await handleWsRewrite(true, instruction)\n }\n\n /** 采纳草稿:覆盖正文文件并刷新。 */\n const handleDraftApply = async (no: number): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.draftApply(no)\n setWorkspace(null)\n setDraftNo(null)\n pushProgress(`已采纳第 ${no} 章新稿(${result.chars} 字)→ ${result.file}`, 'done')\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 /** 放弃草稿:保留原稿,仅清空草稿。 */\n const handleDraftDiscard = async (no: number): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await api.draftDiscard(no)\n setWorkspace(null)\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 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 === '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 await api.generate(chapter.no, true, 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 /** Approve a chapter manually. */\n const handleApprove = (no: number): void => {\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === no ? { ...c, status: 'approved' } : c),\n updatedAt: new Date().toISOString(),\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 chapterChars: configDraft.chapterChars,\n maxTokens: configDraft.maxTokens,\n reviewPassScore: configDraft.reviewPassScore,\n autoReview: configDraft.autoReview,\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 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 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 /** 主行动卡片:推荐下一步(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 return {\n eyebrow: '推荐下一步',\n title: `${reviewPendingCount} 章待审稿`,\n reason: '审稿通过后章节才算完成;不通过的可按意见在工作区修订。',\n actionLabel: '去审稿',\n onClick: () => { setActiveTab('plan') },\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])\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: () => { setActiveTab('plan') },\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: () => { setActiveTab('plan') },\n })\n }\n }\n return items\n }, [chapters, openWorkspace])\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}>\n {viewMode === 'shelf' ? (\n /* 书架首页:默认视图,选择一本书进入工作台 */\n <ShelfView\n api={api}\n shelf={shelf ?? { books: [], activeBookId: null }}\n onOpenBook={async (id) => {\n setBusy(true)\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('workspace')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\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 ) : (\n <>\n <div className={css.panelHeader}>\n <h2 className={css.panelTitle}>\n <button type=\"button\" className={css.iconButton} title=\"返回书架\" aria-label=\"返回书架\" onClick={() => { setViewMode('shelf') }}>\n ←\n </button>\n {tt('panel.title')}\n {project?.bookName !== '' && project?.bookName !== undefined && (\n <span className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)', fontSize: 11 }}>{project.bookName}</span>\n )}\n {chapters.length > 0 && (\n <span className={css.headerProgress}>\n 已完成 <b>{doneCount}</b>/{chapters.length} 章\n <span className={css.headerProgressDot} />\n 通过 <b>{chapters.filter(c => c.status === 'approved').length}</b>\n </span>\n )}\n </h2>\n <div style={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n <button\n type=\"button\"\n className={css.iconButton}\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 type=\"button\" className={css.iconButton} title={tt('common.close')} aria-label={tt('common.close')} onClick={() => { controller.close() }}>×</button>\n </div>\n </div>\n <div className={css.panelBody}>\n <nav className={`${css.panelNav} ${navCollapsed ? css.panelNavCollapsed : ''}`} role=\"tablist\" aria-label=\"工作台导航\">\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)}\n data-active={activeTab === tab.id || (tab.id === 'assistant' && assistantOpen) ? '' : undefined}\n className={css.navTab}\n title={tab.label}\n onClick={() => {\n if (tab.id === 'assistant') {\n setAssistantOpen(true)\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 === 'foreshadow' && 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 </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 {/* 关于:版本 + 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 </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 {busy && busyLabel !== '' && (\n <div className={css.card}>\n <div className={css.busyRow}>\n <span style={{ color: 'var(--nf-accent)' }}>{busyLabel}…</span>\n {liveBar !== null && <span className={css.liveText}>{liveBar.text}</span>}\n </div>\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 </div>\n )}\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.card} style={{ borderColor: 'var(--nf-accent)' }}>\n <div className={css.busyRow} style={{ flexWrap: 'wrap', gap: 8 }}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setWorkspace(null) }} title=\"返回章节列表(草稿不丢失)\">\n ← 返回\n </button>\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) }}>×</button>\n </span>\n </div>\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 {workspace.instruction.includes('按审稿意见修订') && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleWsRewrite(true) }} title=\"AI 按已预填的审稿意见自动修订整章(无需自己找问题)\">\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}`} disabled={busy || workspace.instruction.trim() === ''} onClick={() => { void handleWsRewrite(true) }}>\n 整章修订\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || wsSelected === ''} onClick={() => { void handleWsRewrite(false) }}>\n 修订选中\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || workspace.original.trim().length < 50} onClick={() => { void handleWsCheck() }}>\n 🔍 AI 审查\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || workspace.original.trim().length < 50} onClick={() => { void handleWsSave() }}>\n 💾 保存并审稿\n </button>\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}>审查只读不落盘;勾选要修的问题,点下方按钮一键修订;改完点「💾 保存为正文」才写入文件(原稿自动备份 .bak)。</span>\n {wsCheckReport.issues.length > 0 && wsChecked.length > 0 && (\n <div style={{ marginTop: 8 }}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n disabled={busy}\n onClick={() => { void handleWsReviseByReport() }}\n title=\"自动按勾选的问题修订整章,产出草稿预览(不落盘),对比后应用或放弃\"\n >\n 🔧 修复所选问题({wsChecked.length})\n </button>\n </div>\n )}\n </div>\n )}\n {workspace.draft !== null && (\n <div className={css.wsPreview}>\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 <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleDraftApply(workspace.no) }}>\n ✅ 应用预览\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void handleDraftDiscard(workspace.no) }}>\n ↩️ 放弃\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 </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.dashJourneyBar}>\n <div className={css.dashJourneyFill} style={{ width: `${journeyPercent}%` }} />\n </div>\n <div className={css.dashJourneyStages}>\n {journeyStages.map(stage => (\n <span\n key={stage.id}\n className={`${css.dashStage} ${stage.done ? css.dashStageDone : stage.id === currentStageId ? css.dashStageCurrent : ''}`}\n >\n <span className={css.dashStageDot}>{stage.done ? '✓' : stage.id === currentStageId ? '●' : '○'}</span>\n {stage.label}\n </span>\n ))}\n </div>\n </div>\n {/* HeroFact 4 格 */}\n <div className={css.dashFacts}>\n <div className={css.dashFact}><span className={css.meta}>已沉淀章节</span><b>{doneCount} 章</b></div>\n <div className={css.dashFact}><span className={css.meta}>累计字数</span><b>{totalChars} 字</b></div>\n <div className={css.dashFact}><span className={css.meta}>当前卷</span><b>{currentVolumeName}</b></div>\n <div className={css.dashFact}><span className={css.meta}>最近创作</span><b>{lastUpdated}</b></div>\n </div>\n </div>\n\n {/* 状态摘要条 */}\n <div className={css.assetGrid}>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>已通过审稿</span>\n <span className={css.assetStatValue} style={{ color: approvedCount > 0 ? 'var(--nf-success)' : undefined }}>{approvedCount}</span>\n <span className={css.assetStatDetail}>章节已 approved</span>\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>待生成</span>\n <span className={css.assetStatValue} style={{ color: pendingCount > 0 ? 'var(--nf-warn)' : undefined }}>{pendingCount}</span>\n <span className={css.assetStatDetail}>pending + error</span>\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>待审稿</span>\n <span className={css.assetStatValue} style={{ color: reviewPendingCount > 0 ? 'var(--nf-info)' : undefined }}>{reviewPendingCount}</span>\n <span className={css.assetStatDetail}>written + rejected</span>\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>总字数</span>\n <span className={css.assetStatValue}>{totalChars}</span>\n <span className={css.assetStatDetail}>已生成正文累计</span>\n </div>\n </div>\n\n {/* 双栏:左待办队列 + 右资产健康 */}\n <div className={css.dashGrid}>\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 <div key={i} className={`${css.todoItem} ${todo.tone === 'danger' ? css.todoDanger : todo.tone === 'warning' ? css.todoWarning : css.todoInfo}`}>\n <span className={css.todoText}>\n {todo.title}\n {todo.description !== '' && <span className={css.meta}> — {todo.description}</span>}\n </span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { todo.onClick() }}>\n {todo.actionLabel}\n </button>\n </div>\n ))\n )}\n </div>\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 <div className={css.assetGrid}>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>道藏</span>\n <span className={css.assetStatValue} style={{ color: bible !== undefined ? 'var(--nf-success)' : 'var(--nf-text-3)' }}>\n {bible !== undefined ? `✓ ${bible.worldRules.length} 条规则` : '未生成'}\n </span>\n <span className={css.assetStatDetail}>\n {bible !== undefined ? `${bible.characters.length} 人物 · ${bible.redLines.length} 红线` : '提炼人设 / 世界观 / 金手指'}\n </span>\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>卷计划</span>\n <span className={css.assetStatValue} style={{ color: volumes !== undefined ? 'var(--nf-success)' : 'var(--nf-text-3)' }}>\n {volumes !== undefined ? `${volumes.length} 卷` : '未生成'}\n </span>\n <span className={css.assetStatDetail} title={volumes?.map(v => v.title).join(' / ')}>\n {volumes !== undefined ? volumes.map(v => v.title).join(' / ') : '按剧情弧线划分全书'}\n </span>\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>写作资产</span>\n <span className={css.assetStatValue} style={{ color: assetCount > 0 ? 'var(--nf-success)' : 'var(--nf-text-3)' }}>\n {assetCount} 项\n </span>\n <span className={css.assetStatDetail} title={assetSummary}>{assetSummary}</span>\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>伏笔</span>\n <span className={css.assetStatValue}>{foreshadows.length} 条</span>\n <span className={css.assetStatDetail}>\n {foreshadows.filter(f => f.status === 'planned').length} 待埋 · {foreshadows.filter(f => f.status === 'resolved').length} 已回收\n </span>\n </div>\n </div>\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 <div key={i} 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\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy}\n onClick={() => { void openWorkspace(issue.chapterNo, `按质检意见修订:${issue.item}(建议:${issue.suggestion})`) }}\n >\n 去修订\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\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' }}>\n <span className={css.cardTitle}>{tt('tab.plan')}</span>\n <div className={css.row}>\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 </div>\n </div>\n {volumes !== undefined && volumes.length > 0 && (\n <div className={css.row}>\n {volumes.map(v => (\n <span key={v.no} className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)' }}>\n {v.no}. {v.title}({v.chapterStart}-{v.chapterEnd})\n </span>\n ))}\n </div>\n )}\n </div>\n\n {chapters.length > 0 && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <span className={css.meta}>共 {chapters.length} 章 · 已完成 {doneCount} · 待生成 {pendingCount}</span>\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.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}>\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.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 === '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' && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { handleApprove(chapter.no) }}>\n {tt('plan.approve')}\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 openWorkspace(chapter.no) }} title=\"按审稿意见修订(自动带入意见)\">\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 <div className={css.card}>\n <span className={css.cardTitle}>{tt('plan.progress')}</span>\n <div className={css.progress}>\n {progress.length === 0 && <span className={css.meta}>{tt('progress.empty')}</span>}\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 </div>\n </div>\n </>\n )}\n\n {activeTab === '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 === '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 === 'characters' && (\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}`} disabled={busy || doneCount === 0} onClick={() => { void handleFactsBackfill() }} title=\"历史章节(编年录功能上线前生成的)批量抽取事实\">\n 📥 回填编年录\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy || (project?.facts ?? []).length === 0} onClick={() => { void handleCharactersRefresh() }}>\n ↻ 从编年录刷新\n </button>\n </div>\n </div>\n {charCards === null ? (\n <span className={css.meta}>\n {(project?.facts ?? []).length === 0\n ? '暂无编年录(生成章节后自动积累人物状态/境界/资源/关系等事实),刷新按钮将在有事实后可用。'\n : '点击「从编年录刷新」聚合各人物当前状态(境界/资源/伤势/心境)。'}\n </span>\n ) : charCards.length === 0 ? (\n <span className={css.meta}>未识别到人物信息。</span>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {charCards.map(card => (\n <div key={card.name} style={{ border: '1px solid var(--nf-border)', borderRadius: 8, padding: '6px 10px', fontSize: 12 }}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <b>{card.name}</b>\n <span className={css.meta}>\n {card.role === 'protagonist' ? '主角' : card.role === 'supporting' ? '配角' : card.role === 'antagonist' ? '反派' : '其他'}\n {' · 出场 '}{card.appearances} 次 · 最近 第 {card.lastChapter} 章\n </span>\n </div>\n {card.status !== '' && <div className={css.meta}>状态:{card.status}</div>}\n </div>\n ))}\n </div>\n )}\n <span className={css.meta}>人物志由「道藏」人物名单 + 「编年录」聚合而来,随章节生成自动保持最新。</span>\n </div>\n )}\n\n {/* 写作资产 5 个子分类(左侧导航直达) */}\n {activeTab === 'assetsGenre' && <AssetsTab api={api} initialTab=\"genre\" />}\n {activeTab === 'assetsProgression' && <AssetsTab api={api} initialTab=\"progression\" />}\n {activeTab === 'assetsTemplates' && <AssetsTab api={api} initialTab=\"templates\" />}\n {activeTab === 'assetsRules' && <AssetsTab api={api} initialTab=\"rules\" />}\n {activeTab === 'assetsStyle' && <AssetsTab api={api} initialTab=\"style\" />}\n\n {activeTab === 'foreshadow' && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\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 </div>\n )}\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}>\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 }}>\n <label className={css.fieldLabel}>{tt('settings.model')}</label>\n <input className={css.input} value={configDraft.model} onChange={e => { setConfigDraft({ ...configDraft, model: 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.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>\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 {/* 编年录 / 时间线 */}\n {(project?.facts ?? []).length > 0 && (\n <div className={css.card}>\n <span className={css.cardTitle}>编年录 / 时间线({(project?.facts ?? []).length} 条)</span>\n <span className={css.meta}>\n 每章生成后自动抽取「已确立事实」(人物状态/境界资源/关系变化/伏笔落地),最近 20 条注入后续章节生成,保证长期一致。\n </span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, maxHeight: 300, overflowY: 'auto', fontSize: 12 }}>\n {[...(project?.facts ?? [])].reverse().slice(0, 60).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 </div>\n )}\n </div>\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', 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', startX: e.clientX, startY: e.clientY, origX: assistantPos.x, origY: assistantPos.y, origW: assistantSize.w, origH: assistantSize.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":[7],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["zh","zh","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","../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/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 /** 敏感词检查:全书已写章节或指定文本。 */\n sensitiveCheck: '/api/dsh-novel-forge/sensitive-check',\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 /** 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 * 待确认草稿:润色(去AI味)或整章重写的产物正文。生成时先存这里,\n * 用户看过对比后点「采纳」才覆盖正文文件;点「放弃」则丢弃。刷新页面不丢失。\n */\n pendingDraft?: 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/** 一条剧情线(主线/支线/人物线/悬念线)。 */\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 请求:剧情线增删改 + 关联章节。 */\nexport interface PlotlinesRequest {\n op: 'add' | 'update' | 'remove' | 'link'\n /** add / update 时传入的完整剧情线。 */\n line?: Plotline\n /** remove / link 时的目标线 id。 */\n id?: string\n /** link 时关联的章节号。 */\n chapterNo?: number\n}\n\n/** POST /plotlines 响应。 */\nexport interface PlotlinesResponse {\n plotlines: Plotline[]\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/** 角色卡:角色当前状态(从事实库聚合)。 */\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/** 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\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 /** 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 /** 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}\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\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: '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}\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 chapterChars?: number\n maxTokens?: number\n reviewPassScore?: number\n autoReview?: 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 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 /** 审查手动编辑的正文(不落盘)。 */\n async chapterCheck(no: number, text: string): Promise<{ report: ReviewReport }> {\n return postJson<{ report: ReviewReport }>(NOVEL_API.chapterCheck, { chapterNo: no, text })\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 /** 小说简介: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 /** 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 /** 采纳待确认草稿(润色/重写产物),覆盖正文文件。 */\n async draftApply(chapterNo: number): Promise<{ ok: boolean; chars: number; file: string }> {\n return postJson<{ ok: boolean; chars: number; file: string }>(NOVEL_API.draftApply, { chapterNo })\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.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.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': 'Workflow',\n 'tab.overview': 'Outline',\n 'tab.plan': 'Chapters',\n 'tab.bible': 'Bible',\n 'tab.foreshadow': 'Foreshadow',\n 'tab.settings': 'Settings',\n 'workflow.title': 'Writing workflow',\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.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.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 * 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 {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 {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, useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport type { BookshelfSnapshot } from '../../protocol.ts'\nimport css from './panel.module.css'\n\n/** 一张书卡(封面懒加载)。 */\nfunction BookCard({\n api,\n book,\n active,\n onOpen,\n}: {\n api: NovelApi\n book: BookshelfSnapshot['books'][number]\n active: boolean\n onOpen: () => 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 statusLabel = !book.hasProject ? '未开书' : book.total > 0 && book.done >= book.total ? '已完结' : '进行中'\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} ${book.hasProject ? (book.total > 0 && book.done >= book.total ? css.badgeDone : css.badgeWritten) : css.badgePending}`}>\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 <span className={css.meta}>{book.total > 0 ? `已完成 ${book.done} / ${book.total} 章` : '尚未规划章节'}</span>\n </div>\n </div>\n )\n}\n\n/** 书架首页。 */\nexport function ShelfView({\n api,\n shelf,\n onOpenBook,\n onAddBook,\n}: {\n api: NovelApi\n shelf: BookshelfSnapshot\n /** 点击书卡:激活该书并进入工作台。 */\n onOpenBook: (id: string) => void\n /** 点击+:进入开书向导页。 */\n onAddBook: () => void\n}) {\n return (\n <div className={css.shelfView}>\n <div className={css.shelfHeader}>\n <h2 className={css.panelTitle} style={{ margin: 0 }}>📚 书架</h2>\n <span className={css.meta}>选择一本书进入工作台,或开一本新书</span>\n </div>\n\n <div className={css.shelfGrid}>\n {shelf.books.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 />\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 </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 */\nimport { useRef, useState } from 'react'\nimport type { NovelApi } from '../api.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 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 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 <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 <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 * 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 { CreateBookView } from './CreateBookView.tsx'\nimport { WorldTab } from './WorldTab.tsx'\nimport { extractDocxTextFromBuffer } from '../docx.ts'\nimport type {\n BookshelfSnapshot,\n ChapterPlan,\n Foreshadow,\n JobFrame,\n NovelConfig,\n Plotline,\n ProjectState,\n ReviewReport,\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' | 'facts' | 'plotlines'\n | 'assetsGenre' | 'assetsProgression' | 'assetsTemplates' | 'assetsRules' | 'assetsStyle'\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: tt('tab.plotlines'), icon: '🧵' },\n ],\n },\n {\n id: 'tools',\n label: '工具',\n items: [\n { id: 'assistant', label: tt('tab.assistant'), icon: '💬' },\n ],\n },\n {\n id: 'db',\n label: '数据库',\n items: [\n { id: 'bible', label: tt('tab.bible'), icon: '📖' },\n { id: 'world', label: '大世界', icon: '🌍' },\n { id: 'characters', label: '人物志', icon: '👥' },\n { id: 'foreshadow', label: tt('tab.foreshadow'), icon: '🔮' },\n { id: 'facts', label: tt('tab.facts'), icon: '📜' },\n { id: 'assetsGenre', label: '题材基底', icon: '🏷️' },\n { id: 'assetsProgression', label: '推进模式', icon: '📈' },\n { id: 'assetsTemplates', label: '笔法帖', icon: '🖋️' },\n { id: 'assetsRules', label: '文戒', icon: '🚫' },\n { id: 'assetsStyle', 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/** 构建时注入的插件版本(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 [expandedChapter, setExpandedChapter] = useState<number | null>(null)\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 } | 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 /** 编辑页字号(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 /** 角色卡(从事实库聚合)。 */\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 /** 剧情线编辑草稿(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 /** 角色知情度编辑草稿(角色名 → 文本,每行一条)。 */\n const [knowledgeDraft, setKnowledgeDraft] = useState<Record<string, string>>({})\n /** 全书敏感词检查结果(null = 未运行)。 */\n const [sensHits, setSensHits] = useState<SensitiveHit[] | null>(null)\n const [sensScanned, setSensScanned] = useState(0)\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 /** 悬浮窗位置(相对面板,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 /** 拖拽/缩放状态。 */\n const dragState = useRef<{ type: 'move' | 'resize'; 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 } catch { /* ignore */ }\n }, [assistantPos, assistantSize])\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 setAssistantPos({\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 } else {\n setAssistantSize({\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 }\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'>('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 setProject(status.project ?? null)\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 /** 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 try {\n const result = await api.audit()\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 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 handleCharactersRefresh = async (): Promise<void> => {\n setBusy(true)\n setBusyLabel('聚合角色卡中…')\n setError('')\n try {\n const result = await api.charactersRefresh()\n setCharCards(result.cards)\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 /** 剧情线:保存草稿(新增或更新)。 */\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 /** 全书敏感词检查(硬匹配内置词库)。 */\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 /** 保存角色知情度(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 /** 保存世界观规则编辑(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 /** 工作区:保存手动编辑的正文(备份 .bak;沿用审查报告或自动审稿,保存即出结论)。 */\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 try {\n const result = await api.chapterSave(workspace.no, workspace.original, wsCheckReport ?? undefined)\n const report = result.report\n setWorkspace(null)\n setDraftNo(null)\n setWsCheckReport(null)\n setWsChecked([])\n if (report !== undefined) {\n pushProgress(`已保存并审稿:${report.score} 分 — ${report.verdict}(${report.passed ? '通过' : '未通过'})`, report.passed ? 'done' : 'error')\n } else {\n pushProgress(`已保存第 ${workspace.no} 章编辑(${result.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): 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 let autoInstruction = instruction ?? ''\n if (autoInstruction === '' && chapter.review !== undefined && !chapter.review.passed) {\n const high = chapter.review.issues.filter(i => i.severity === 'high')\n const picked = high.length > 0 ? high.slice(0, 3) : chapter.review.issues.slice(0, 3)\n autoInstruction = '按审稿意见修订(优先处理):\\n' + picked.map(i => `[${i.severity}] ${i.item} → ${i.suggestion}`).join('\\n')\n }\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 setWsCheckReport(null)\n setWsChecked([])\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 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 setBusy(true)\n setBusyLabel(`${tt('plan.rewrite')} 第${workspace.no}章`)\n setError('')\n try {\n await api.rewrite(workspace.no, instruction, target, frame => { applyJobFrame(frame, n => tt('progress.rewriting', { 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 /** 工作区:按审查报告中勾选的问题一键修订(预填指令 + 立即整章修订到草稿)。 */\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 setWorkspace({ ...workspace, instruction })\n await handleWsRewrite(true, instruction)\n }\n\n /** 采纳草稿:覆盖正文文件并刷新。 */\n const handleDraftApply = async (no: number): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n const result = await api.draftApply(no)\n setWorkspace(null)\n setDraftNo(null)\n pushProgress(`已采纳第 ${no} 章新稿(${result.chars} 字)→ ${result.file}`, 'done')\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 /** 放弃草稿:保留原稿,仅清空草稿。 */\n const handleDraftDiscard = async (no: number): Promise<void> => {\n setBusy(true)\n setError('')\n try {\n await api.draftDiscard(no)\n setWorkspace(null)\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 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 === '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 await api.generate(chapter.no, true, 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 /** Approve a chapter manually. */\n const handleApprove = (no: number): void => {\n setProject(prev => prev === null ? prev : {\n ...prev,\n chapters: prev.chapters.map(c => c.no === no ? { ...c, status: 'approved' } : c),\n updatedAt: new Date().toISOString(),\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 chapterChars: configDraft.chapterChars,\n maxTokens: configDraft.maxTokens,\n reviewPassScore: configDraft.reviewPassScore,\n autoReview: configDraft.autoReview,\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 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 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 /** 主行动卡片:推荐下一步(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 return {\n eyebrow: '推荐下一步',\n title: `${reviewPendingCount} 章待审稿`,\n reason: '审稿通过后章节才算完成;不通过的可按意见在工作区修订。',\n actionLabel: '去审稿',\n onClick: () => { setActiveTab('plan') },\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])\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: () => { setActiveTab('plan') },\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: () => { setActiveTab('plan') },\n })\n }\n }\n return items\n }, [chapters, openWorkspace])\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 setBusy(true)\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('workspace')\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\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 ) : (\n <>\n <div className={css.panelHeader}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2, minWidth: 0 }}>\n <h2 className={css.panelTitle}>\n <button type=\"button\" className={css.iconButton} title=\"返回书架\" aria-label=\"返回书架\" onClick={() => { setViewMode('shelf') }}>\n ←\n </button>\n {tt('panel.title')}\n </h2>\n {(project?.bookName !== '' && project?.bookName !== undefined) && (\n <div className={css.panelSubtitle}>\n <span>📖 {project.bookName}</span>\n {chapters.length > 0 && (\n <span className={css.headerProgress}>\n 已完成 <b>{doneCount}</b>/{chapters.length} 章\n <span className={css.headerProgressDot} />\n 通过 <b>{chapters.filter(c => c.status === 'approved').length}</b>\n </span>\n )}\n </div>\n )}\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n <button\n type=\"button\"\n className={css.iconButton}\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 type=\"button\" className={css.iconButton} title={tt('common.close')} aria-label={tt('common.close')} onClick={() => { controller.close() }}>×</button>\n </div>\n </div>\n <div className={css.panelBody}>\n <nav className={`${css.panelNav} ${navCollapsed ? css.panelNavCollapsed : ''}`} role=\"tablist\" aria-label=\"工作台导航\">\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)}\n data-active={activeTab === tab.id || (tab.id === 'assistant' && assistantOpen) ? '' : undefined}\n className={css.navTab}\n title={tab.label}\n onClick={() => {\n if (tab.id === 'assistant') {\n setAssistantOpen(true)\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 === 'foreshadow' && 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 </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 {/* 关于:版本 + 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 </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 {busy && busyLabel !== '' && (\n <div className={css.card}>\n <div className={css.busyRow}>\n <span style={{ color: 'var(--nf-accent)' }}>{busyLabel}…</span>\n {liveBar !== null && <span className={css.liveText}>{liveBar.text}</span>}\n </div>\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 </div>\n )}\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 <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setWorkspace(null) }} title=\"返回章节列表(草稿不丢失)\">\n ← 返回\n </button>\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) }}>×</button>\n </span>\n </div>\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 {workspace.instruction.includes('按审稿意见修订') && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleWsRewrite(true) }} title=\"AI 按已预填的审稿意见自动修订整章(无需自己找问题)\">\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}`} disabled={busy || workspace.instruction.trim() === ''} onClick={() => { void handleWsRewrite(true) }}>\n 整章修订\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || wsSelected === ''} onClick={() => { void handleWsRewrite(false) }}>\n 修订选中\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || workspace.original.trim().length < 50} onClick={() => { void handleWsCheck() }}>\n 🔍 AI 审查\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || workspace.original.trim().length < 50} onClick={() => { void handleWsSave() }}>\n 💾 保存并审稿\n </button>\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}>审查只读不落盘;勾选要修的问题,点下方按钮一键修订;改完点「💾 保存为正文」才写入文件(原稿自动备份 .bak)。</span>\n {wsCheckReport.issues.length > 0 && wsChecked.length > 0 && (\n <div style={{ marginTop: 8 }}>\n <button\n type=\"button\"\n className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`}\n disabled={busy}\n onClick={() => { void handleWsReviseByReport() }}\n title=\"自动按勾选的问题修订整章,产出草稿预览(不落盘),对比后应用或放弃\"\n >\n 🔧 修复所选问题({wsChecked.length})\n </button>\n </div>\n )}\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 <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy} onClick={() => { void handleDraftApply(workspace.no) }}>\n ✅ 应用预览\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void handleDraftDiscard(workspace.no) }}>\n ↩️ 放弃\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 </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.dashJourneyBar}>\n <div className={css.dashJourneyFill} style={{ width: `${journeyPercent}%` }} />\n </div>\n <div className={css.dashJourneyStages}>\n {journeyStages.map(stage => (\n <span\n key={stage.id}\n className={`${css.dashStage} ${stage.done ? css.dashStageDone : stage.id === currentStageId ? css.dashStageCurrent : ''}`}\n >\n <span className={css.dashStageDot}>{stage.done ? '✓' : stage.id === currentStageId ? '●' : '○'}</span>\n {stage.label}\n </span>\n ))}\n </div>\n </div>\n {/* HeroFact 4 格 */}\n <div className={css.dashFacts}>\n <div className={css.dashFact}><span className={css.meta}>已沉淀章节</span><b>{doneCount} 章</b></div>\n <div className={css.dashFact}><span className={css.meta}>累计字数</span><b>{totalChars} 字</b></div>\n <div className={css.dashFact}><span className={css.meta}>当前卷</span><b>{currentVolumeName}</b></div>\n <div className={css.dashFact}><span className={css.meta}>最近创作</span><b>{lastUpdated}</b></div>\n </div>\n </div>\n\n {/* 全书进度条(原章节页进度移入工作流) */}\n <div className={css.card} style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', flexWrap: 'wrap', gap: 8 }}>\n <span className={css.meta} style={{ fontWeight: 600 }}>\n 📊 全书进度:已完成 <b style={{ color: 'var(--nf-accent)' }}>{doneCount}</b>/{chapters.length} 章({chapters.length > 0 ? Math.round((doneCount / chapters.length) * 100) : 0}%)\n </span>\n <span className={css.meta}>\n 待生成 {pendingCount} · 待审稿 {reviewPendingCount} · 通过 {approvedCount}\n </span>\n </div>\n\n {/* 剧情线进度(工作流实时视图) */}\n <div className={css.card}>\n <span className={css.cardTitle}>🧵 {tt('plotlines.workflowTitle')}</span>\n {(project?.plotlines ?? []).filter(l => l.status === 'active' || l.status === 'paused').length === 0 ? (\n <span className={css.meta}>{tt('plotlines.workflowEmpty')}</span>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {(project?.plotlines ?? []).filter(l => l.status === 'active' || l.status === 'paused').map(line => {\n const kindLabel = { main: tt('plotlines.kindMain'), branch: tt('plotlines.kindBranch'), character: tt('plotlines.kindCharacter'), mystery: tt('plotlines.kindMystery') }[line.kind]\n return (\n <div key={line.id} 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 }}>\n <b>{line.name}</b>\n <span className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)' }}>{kindLabel}</span>\n {line.status === 'paused' && <span className={css.badge} style={{ borderColor: 'var(--nf-warn)', color: 'var(--nf-warn)' }}>{tt('plotlines.statusPaused')}</span>}\n </span>\n <span className={css.meta}>{tt('plotlines.chapters')} {line.chapters.length} 章</span>\n </div>\n {line.progress !== '' && <div className={css.meta}>{line.progress}</div>}\n </div>\n )\n })}\n </div>\n )}\n </div>\n\n {/* 状态摘要条 */}\n <div className={css.assetGrid}>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>已通过审稿</span>\n <span className={css.assetStatValue} style={{ color: approvedCount > 0 ? 'var(--nf-success)' : undefined }}>{approvedCount}</span>\n <span className={css.assetStatDetail}>章节已 approved</span>\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>待生成</span>\n <span className={css.assetStatValue} style={{ color: pendingCount > 0 ? 'var(--nf-warn)' : undefined }}>{pendingCount}</span>\n <span className={css.assetStatDetail}>pending + error</span>\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>待审稿</span>\n <span className={css.assetStatValue} style={{ color: reviewPendingCount > 0 ? 'var(--nf-info)' : undefined }}>{reviewPendingCount}</span>\n <span className={css.assetStatDetail}>written + rejected</span>\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>总字数</span>\n <span className={css.assetStatValue}>{totalChars}</span>\n <span className={css.assetStatDetail}>已生成正文累计</span>\n </div>\n </div>\n\n {/* 双栏:左待办队列 + 右资产健康 */}\n <div className={css.dashGrid}>\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 <div key={i} className={`${css.todoItem} ${todo.tone === 'danger' ? css.todoDanger : todo.tone === 'warning' ? css.todoWarning : css.todoInfo}`}>\n <span className={css.todoText}>\n {todo.title}\n {todo.description !== '' && <span className={css.meta}> — {todo.description}</span>}\n </span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { todo.onClick() }}>\n {todo.actionLabel}\n </button>\n </div>\n ))\n )}\n </div>\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 <div className={css.assetGrid}>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>道藏</span>\n <span className={css.assetStatValue} style={{ color: bible !== undefined ? 'var(--nf-success)' : 'var(--nf-text-3)' }}>\n {bible !== undefined ? `✓ ${bible.worldRules.length} 条规则` : '未生成'}\n </span>\n <span className={css.assetStatDetail}>\n {bible !== undefined ? `${bible.characters.length} 人物 · ${bible.redLines.length} 红线` : '提炼人设 / 世界观 / 金手指'}\n </span>\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>卷计划</span>\n <span className={css.assetStatValue} style={{ color: volumes !== undefined ? 'var(--nf-success)' : 'var(--nf-text-3)' }}>\n {volumes !== undefined ? `${volumes.length} 卷` : '未生成'}\n </span>\n <span className={css.assetStatDetail} title={volumes?.map(v => v.title).join(' / ')}>\n {volumes !== undefined ? volumes.map(v => v.title).join(' / ') : '按剧情弧线划分全书'}\n </span>\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>写作资产</span>\n <span className={css.assetStatValue} style={{ color: assetCount > 0 ? 'var(--nf-success)' : 'var(--nf-text-3)' }}>\n {assetCount} 项\n </span>\n <span className={css.assetStatDetail} title={assetSummary}>{assetSummary}</span>\n </div>\n <div className={css.assetStat}>\n <span className={css.assetStatLabel}>伏笔</span>\n <span className={css.assetStatValue}>{foreshadows.length} 条</span>\n <span className={css.assetStatDetail}>\n {foreshadows.filter(f => f.status === 'planned').length} 待埋 · {foreshadows.filter(f => f.status === 'resolved').length} 已回收\n </span>\n </div>\n </div>\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 <div key={i} 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\n type=\"button\"\n className={`${css.button} ${css.buttonSmall}`}\n disabled={busy}\n onClick={() => { void openWorkspace(issue.chapterNo, `按质检意见修订:${issue.item}(建议:${issue.suggestion})`) }}\n >\n 去修订\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* 📟 活动输出:无论生成 / 审稿 / 润色 / 质检 / 助手操作,全部活动实时显示于此 */}\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>📟 活动输出({progress.length})</span>\n <div className={css.row}>\n <span className={css.meta}>生成/审稿/润色/质检等所有操作都会记录在这里</span>\n {progress.length > 0 && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setProgress([]) }}>\n 清空\n </button>\n )}\n </div>\n </div>\n <div className={css.progress} style={{ maxHeight: 260, overflowY: 'auto' }}>\n {progress.length === 0 && <span className={css.meta}>{tt('progress.empty')}</span>}\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 <div ref={progressEndRef} />\n </div>\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}>\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.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 === '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' && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy || busyAny} onClick={() => { handleApprove(chapter.no) }}>\n {tt('plan.approve')}\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 openWorkspace(chapter.no) }} title=\"按审稿意见修订(自动带入意见)\">\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 === '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 === '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 === 'characters' && (\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}`} disabled={busy || doneCount === 0} onClick={() => { void handleFactsBackfill() }} title=\"历史章节(编年录功能上线前生成的)批量抽取事实\">\n 📥 回填编年录\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy || (project?.facts ?? []).length === 0} onClick={() => { void handleCharactersRefresh() }}>\n ↻ 从编年录刷新\n </button>\n </div>\n </div>\n {charCards === null ? (\n <span className={css.meta}>\n {(project?.facts ?? []).length === 0\n ? '暂无编年录(生成章节后自动积累人物状态/境界/资源/关系等事实),刷新按钮将在有事实后可用。'\n : '点击「从编年录刷新」聚合各人物当前状态(境界/资源/伤势/心境)。'}\n </span>\n ) : charCards.length === 0 ? (\n <span className={css.meta}>未识别到人物信息。</span>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {charCards.map(card => (\n <div key={card.name} style={{ border: '1px solid var(--nf-border)', borderRadius: 8, padding: '6px 10px', fontSize: 12 }}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <b>{card.name}</b>\n <span className={css.meta}>\n {card.role === 'protagonist' ? '主角' : card.role === 'supporting' ? '配角' : card.role === 'antagonist' ? '反派' : '其他'}\n {' · 出场 '}{card.appearances} 次 · 最近 第 {card.lastChapter} 章\n </span>\n </div>\n {card.status !== '' && <div className={css.meta}>状态:{card.status}</div>}\n </div>\n ))}\n </div>\n )}\n <span className={css.meta}>人物志由「道藏」人物名单 + 「编年录」聚合而来,随章节生成自动保持最新。</span>\n </div>\n )}\n\n {/* 角色知情度:信息差管理 */}\n {activeTab === 'characters' && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between', flexWrap: 'wrap' }}>\n <span className={css.cardTitle}>角色知情度(信息差管理)</span>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy || (bible?.characters ?? []).length === 0} onClick={() => { void handleKnowledgeSave() }}>\n 💾 保存知情度\n </button>\n </div>\n <span className={css.meta}>\n 填写每个角色「已经知道」的事实/秘密(每行一条)。生成与审稿会严格遵守:未列出的信息该角色一律不知道——避免\"不该知道的人知道了\"。\n </span>\n {(bible?.characters ?? []).length === 0 ? (\n <span className={css.meta}>暂无角色卡——先在「道藏」提炼设定。</span>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {bible!.characters.map(card => (\n <div key={card.name} style={{ border: '1px solid var(--nf-border)', borderRadius: 10, padding: '8px 10px', fontSize: 12 }}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\n <b>{card.name}</b>\n <span className={css.meta}>\n {card.role === 'protagonist' ? '主角' : card.role === 'supporting' ? '配角' : card.role === 'antagonist' ? '反派' : '其他'}\n </span>\n </div>\n <textarea\n className={css.textarea}\n style={{ minHeight: 52, fontSize: 12 }}\n placeholder=\"每行一条该角色知道的信息,例如:林越的真实身份 / 古玉残片的秘密…\"\n value={knowledgeDraft[card.name] ?? (card.knowledge ?? []).join('\\n')}\n onChange={e => { setKnowledgeDraft(prev => ({ ...prev, [card.name]: e.target.value })) }}\n />\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* 写作资产 5 个子分类(左侧导航直达) */}\n {activeTab === 'assetsGenre' && <AssetsTab api={api} initialTab=\"genre\" />}\n {activeTab === 'assetsProgression' && <AssetsTab api={api} initialTab=\"progression\" />}\n {activeTab === 'assetsTemplates' && <AssetsTab api={api} initialTab=\"templates\" />}\n {activeTab === 'assetsRules' && <AssetsTab api={api} initialTab=\"rules\" />}\n {activeTab === 'assetsStyle' && <AssetsTab api={api} initialTab=\"style\" />}\n\n {activeTab === 'foreshadow' && (\n <div className={css.card}>\n <div className={css.row} style={{ justifyContent: 'space-between' }}>\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 </div>\n )}\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}>\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 }}>\n <label className={css.fieldLabel}>{tt('settings.model')}</label>\n <input className={css.input} value={configDraft.model} onChange={e => { setConfigDraft({ ...configDraft, model: 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.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>\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 === 'facts' && (\n <div className={css.card}>\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 </div>\n )}\n\n {activeTab === 'plotlines' && (\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}>{tt('tab.plotlines')}({project?.plotlines?.length ?? 0})</span>\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 <span className={css.meta}>{tt('plotlines.hint')}</span>\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 const kindLabel = { main: tt('plotlines.kindMain'), branch: tt('plotlines.kindBranch'), character: tt('plotlines.kindCharacter'), mystery: tt('plotlines.kindMystery') }[line.kind]\n const statusLabel = { active: tt('plotlines.statusActive'), paused: tt('plotlines.statusPaused'), resolved: tt('plotlines.statusResolved'), abandoned: tt('plotlines.statusAbandoned') }[line.status]\n const statusColor = line.status === 'resolved' ? 'var(--nf-success)' : line.status === 'abandoned' ? 'var(--nf-text-3)' : line.status === 'paused' ? 'var(--nf-warn)' : 'var(--nf-accent)'\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}</span>\n <span className={css.badge} style={{ borderColor: statusColor, color: statusColor }}>{statusLabel}</span>\n </span>\n <span style={{ display: 'flex', gap: 6 }}>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { setPlotlineDraft({ id: line.id, name: line.name, kind: line.kind, goal: line.goal, progress: line.progress, status: line.status }) }}>\n {tt('plotlines.edit')}\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} disabled={busy} onClick={() => { void handlePlotlineRemove(line.id) }}>\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 </div>\n )}\n </div>\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', 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', startX: e.clientX, startY: e.clientY, origX: assistantPos.x, origY: assistantPos.y, origW: assistantSize.w, origH: assistantSize.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":[7],"mappings":"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"}