@waterwx/dsh-novel-forge 0.1.0
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/LICENSE +202 -0
- package/README.md +180 -0
- package/cordis.patch.yml +13 -0
- package/lib/client.js +3924 -0
- package/lib/client.js.map +1 -0
- package/lib/index.js +3120 -0
- package/lib/index.js.map +1 -0
- package/lib/types/assets.d.ts +35 -0
- package/lib/types/assistant.d.ts +43 -0
- package/lib/types/bookshelf.d.ts +35 -0
- package/lib/types/client/api.d.ts +68 -0
- package/lib/types/client/docx.d.ts +15 -0
- package/lib/types/client/index.d.ts +14 -0
- package/lib/types/client/locales.d.ts +139 -0
- package/lib/types/client/mount.d.ts +9 -0
- package/lib/types/client/panel/AssetsTab.d.ts +7 -0
- package/lib/types/client/panel/AssistantTab.d.ts +7 -0
- package/lib/types/client/panel/BookshelfBar.d.ts +11 -0
- package/lib/types/client/panel/NovelPanel.d.ts +13 -0
- package/lib/types/client/panel/controller.d.ts +19 -0
- package/lib/types/client/panel/helpers.d.ts +8 -0
- package/lib/types/client/sidebar-entry.d.ts +13 -0
- package/lib/types/docx.d.ts +19 -0
- package/lib/types/engine.d.ts +95 -0
- package/lib/types/index.d.ts +55 -0
- package/lib/types/protocol.d.ts +521 -0
- package/lib/types/routes.d.ts +29 -0
- package/package.json +105 -0
- package/src/assets.ts +518 -0
- package/src/assistant.ts +547 -0
- package/src/bookshelf.ts +137 -0
- package/src/client/api.ts +254 -0
- package/src/client/css-modules.d.ts +8 -0
- package/src/client/docx.ts +69 -0
- package/src/client/index.ts +34 -0
- package/src/client/locales.ts +271 -0
- package/src/client/mount.tsx +97 -0
- package/src/client/panel/AssetsTab.tsx +341 -0
- package/src/client/panel/AssistantTab.tsx +188 -0
- package/src/client/panel/BookshelfBar.tsx +116 -0
- package/src/client/panel/NovelPanel.tsx +990 -0
- package/src/client/panel/controller.ts +45 -0
- package/src/client/panel/helpers.ts +17 -0
- package/src/client/panel/panel.module.css +894 -0
- package/src/client/sidebar-entry.ts +122 -0
- package/src/docx.ts +83 -0
- package/src/engine.ts +1019 -0
- package/src/index.ts +184 -0
- package/src/protocol.ts +539 -0
- package/src/routes.ts +955 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","names":["zh","zh","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/BookshelfBar.tsx","../node_modules/.pnpm/fflate@0.8.3/node_modules/fflate/esm/browser.js","../src/client/docx.ts","../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 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 assistant: '/api/dsh-novel-forge/assistant',\n assistantHistory: '/api/dsh-novel-forge/assistant-history',\n bookshelf: '/api/dsh-novel-forge/bookshelf',\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 }>\n /** 当前激活的书 id(无则 null)。 */\n activeBookId: string | null\n}\n\n/** POST /bookshelf 请求:创建新书。 */\nexport interface BookCreateRequest {\n bookName: string\n outputDir?: 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\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/** 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 /** 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 | { 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 /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 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): Promise<import('../protocol.ts').BookshelfSnapshot> {\n return postJson<import('../protocol.ts').BookshelfSnapshot>(NOVEL_API.bookshelf, { bookName, outputDir })\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 /** 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 * 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.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.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 */\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/** One chat bubble (either side). */\ninterface ChatLine {\n id: number\n role: 'user' | 'assistant'\n text: string\n /** Tool events interleaved with the assistant reply. */\n tools: Array<{ name: string; status: 'start' | 'done' | 'error'; detail?: string }>\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 idRef = useRef(0)\n const scrollRef = useRef<HTMLDivElement | null>(null)\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 onto the current assistant bubble. */\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, { id: idRef.current++, role: 'assistant', text: '', tools: [tool] }]\n }\n return [...prev.slice(0, -1), { ...last, tools: [...last.tools, tool], 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 /** 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 } else if (entry.role === 'tool') {\n const last = restored[restored.length - 1]\n if (last !== undefined && last.role === 'assistant') {\n last.tools.push({ name: entry.tool ?? 'tool', status: 'done', detail: entry.content.slice(0, 120) })\n }\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 /** Send one message. */\n const handleSend = async (): Promise<void> => {\n const message = input.trim()\n if (message === '' || busy) return\n setInput('')\n setError('')\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 <span className={css.cardTitle}>{tt('tab.assistant')}</span>\n <span className={css.meta}>{tt('assistant.hint')}</span>\n {error !== '' && <span style={{ color: 'var(--nf-error)', fontSize: 12 }}>{tt('common.error')}: {error}</span>}\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 {line.tools.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2, marginTop: 4, fontSize: 11 }}>\n {line.tools.map((tool, i) => (\n <span key={i} style={{ color: tool.status === 'error' ? 'var(--nf-error)' : tool.status === 'start' ? 'var(--nf-accent)' : 'var(--nf-success)' }}>\n {tool.status === 'start'\n ? tt('assistant.toolStart', { name: tool.name })\n : tool.status === 'done'\n ? tt('assistant.toolDone', { name: tool.name, detail: tool.detail ?? '' })\n : tt('assistant.toolError', { name: tool.name, detail: tool.detail ?? '' })}\n </span>\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\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 !== '' && <span className={css.meta}> — {node.description}</span>}\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: '反 AI 规则' },\n { id: 'style', label: '自定义写法' },\n]\n\n/** 写作资产页签。 */\nexport function AssetsTab({ api }: AssetsTabProps) {\n const [assetTab, setAssetTab] = useState<AssetSubTab>('genre')\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 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 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 {/* 子页签栏 */}\n <div className={css.tabBar} role=\"tablist\" style={{ padding: '0 0 8px', borderBottom: '1px solid var(--nf-border)' }}>\n {SUB_TABS.map(tab => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={assetTab === tab.id}\n data-active={assetTab === tab.id ? '' : undefined}\n className={css.tab}\n onClick={() => { setAssetTab(tab.id) }}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* 题材基底库 */}\n {assetTab === 'genre' && (\n <div className={css.card}>\n <span className={css.cardTitle}>题材基底库</span>\n <span className={css.meta}>这本书属于哪个阅读市场?题材定位会注入章节生成与审稿提示词。</span>\n {assets.genre !== undefined && (\n <div style={{ border: '1px solid var(--nf-border)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <b>当前题材:{assets.genre.name}</b> — {assets.genre.description}\n </div>\n )}\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, maxHeight: 340, overflowY: 'auto' }}>\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 {/* 反 AI 规则 */}\n {assetTab === 'rules' && (\n <div className={css.card}>\n <span className={css.cardTitle}>反 AI 规则</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 <div key={rule.name} style={{ border: '1px solid var(--nf-border)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <b>{rule.name}</b> <span className={css.badge} style={{ borderColor: 'var(--nf-text-3)', color: 'var(--nf-text-3)' }}>内置</span>\n <div className={css.meta}>避免:{rule.avoid}</div>\n <div className={css.meta}>修正:{rule.fix}</div>\n </div>\n ))}\n {customRules.map(rule => (\n <div key={rule.name} style={{ border: '1px solid var(--nf-accent)', borderRadius: 6, padding: '6px 10px', fontSize: 12 }}>\n <b>{rule.name}</b> <span className={css.badge} style={{ borderColor: 'var(--nf-accent)', color: 'var(--nf-accent)' }}>自定义</span>\n <div className={css.meta}>避免:{rule.avoid}</div>\n {rule.fix !== '' && <div className={css.meta}>修正:{rule.fix}</div>}\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 */\nimport { useState } from 'react'\nimport type { NovelApi } from '../api.ts'\nimport type { BookshelfSnapshot } from '../../protocol.ts'\nimport css from './panel.module.css'\n\n/** Props. */\nexport interface BookshelfBarProps {\n api: NovelApi\n shelf: BookshelfSnapshot\n /** 刷新整个面板(切换书后重新拉状态)。 */\n onSwitch: () => void\n}\n\n/** 书架条。 */\nexport function BookshelfBar({ api, shelf, onSwitch }: BookshelfBarProps) {\n const [creating, setCreating] = useState(false)\n const [name, setName] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState('')\n\n const handleCreate = async (): Promise<void> => {\n const bookName = name.trim()\n if (bookName === '') return\n setBusy(true)\n setError('')\n try {\n await api.bookCreate(bookName)\n setCreating(false)\n setName('')\n onSwitch()\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n const handleActivate = async (id: string): Promise<void> => {\n if (id === shelf.activeBookId) return\n setBusy(true)\n try {\n await api.bookActivate(id)\n onSwitch()\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n const handleRemove = async (id: string): Promise<void> => {\n setBusy(true)\n try {\n await api.bookRemove(id)\n onSwitch()\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setBusy(false)\n }\n }\n\n return (\n <div className={css.bookshelf}>\n <span className={css.bookshelfLabel}>书架</span>\n <div className={css.bookshelfList}>\n {shelf.books.map(book => (\n <div\n key={book.id}\n className={`${css.bookChip} ${book.id === shelf.activeBookId ? css.bookChipActive : ''}`}\n onClick={() => { void handleActivate(book.id) }}\n title={book.outputDir}\n >\n <span className={css.bookChipName}>{book.bookName}</span>\n <span className={css.bookChipMeta}>{book.hasProject ? `${book.done}/${book.total} 章` : '未开书'}</span>\n <button\n type=\"button\"\n className={css.bookChipRemove}\n title=\"从书架移除\"\n onClick={(e) => { e.stopPropagation(); void handleRemove(book.id) }}\n >\n ×\n </button>\n </div>\n ))}\n {!creating ? (\n <button type=\"button\" className={css.bookAdd} onClick={() => { setCreating(true) }}>\n + 新书\n </button>\n ) : (\n <div className={css.bookCreateForm}>\n <input\n className={css.input}\n style={{ width: 140 }}\n placeholder=\"书名\"\n value={name}\n onChange={e => { setName(e.target.value) }}\n onKeyDown={e => { if (e.key === 'Enter') void handleCreate() }}\n autoFocus\n />\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={busy || name.trim() === ''} onClick={() => { void handleCreate() }}>\n 创建\n </button>\n <button type=\"button\" className={`${css.button} ${css.buttonSmall}`} onClick={() => { setCreating(false) }}>\n 取消\n </button>\n </div>\n )}\n </div>\n {error !== '' && <span style={{ color: 'var(--nf-error)', fontSize: 12 }}>{error}</span>}\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(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&/g, '&')\n .replace(/ /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 * 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, useRef, useState } 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 { BookshelfBar } from './BookshelfBar.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 = 'workflow' | 'overview' | 'plan' | 'bible' | 'assets' | 'foreshadow' | 'assistant' | 'settings'\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}\n\n/** The tab bar definition. */\nconst TABS: ReadonlyArray<{ id: NovelTab; label: string }> = [\n { id: 'workflow', label: tt('tab.workflow') },\n { id: 'overview', label: tt('tab.overview') },\n { id: 'plan', label: tt('tab.plan') },\n { id: 'bible', label: tt('tab.bible') },\n { id: 'assets', label: '写作资产' },\n { id: 'foreshadow', label: tt('tab.foreshadow') },\n { id: 'assistant', label: tt('tab.assistant') },\n { id: 'settings', label: tt('tab.settings') },\n]\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/** 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 [rewriteInstruction, setRewriteInstruction] = useState('')\n const [localTarget, setLocalTarget] = useState('')\n const progressId = useRef(0)\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 /** Refresh status (config + project + files). */\n const refresh = useCallback(async (showError = true) => {\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 nextOutline = status.project?.outline\n if (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 /** 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 /** 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 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 return { ...base, chapters: [...base.chapters, ...result.chapters], updatedAt: new Date().toISOString() }\n })\n pushProgress(tt('workflow.planDone', { n: result.chapters.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 /** Shared frame handler for generate/rewrite/polish streams. */\n const applyJobFrame = useCallback((frame: JobFrame, label: (no: number) => string) => {\n if (frame.type === 'start') {\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 if (frame.text.length % 3000 < 600) {\n pushProgress(`…已生成 ${frame.text.length} 字`)\n }\n } else if (frame.type === 'done' || frame.type === 'rewritten') {\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 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 === 'error') {\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])\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. */\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 for (const chapter of remaining) {\n pushProgress(`▶ 开始生成第 ${chapter.no} 章《${chapter.title}》`)\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 } catch (err) {\n failed++\n pushProgress(`第 ${chapter.no} 章失败:${(err 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 /** Rewrite one chapter (whole-chapter or local target). */\n const handleRewrite = async (no: number): Promise<void> => {\n setBusy(true)\n setBusyLabel(`${tt('plan.rewrite')} 第${no}章`)\n setError('')\n try {\n await api.rewrite(no, rewriteInstruction, localTarget, frame => { applyJobFrame(frame, n => tt('progress.rewriting', { no: n })) })\n setRewriteInstruction('')\n setLocalTarget('')\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 /** Polish one chapter. */\n const handlePolish = async (no: number): Promise<void> => {\n setBusy(true)\n setBusyLabel(`${tt('plan.polish')} 第${no}章`)\n setError('')\n try {\n await api.polish(no, frame => { applyJobFrame(frame, n => tt('progress.polishing', { no: n })) })\n } catch (err) {\n setError((err as Error).message)\n pushProgress(`第 ${no} 章润色失败:${(err as Error).message}`, 'error')\n } finally {\n setBusy(false)\n setBusyLabel('')\n await refresh(false)\n }\n }\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 /** Workflow timeline row: step dot + connector + label + optional action. */\n const workflowRow = (stepNo: number, done: boolean, label: string, hint: string, buttonLabel: string, onClick: () => void, disabled: boolean) => (\n <div className={css.workflowRow}>\n <span className={`${css.workflowDot} ${done ? css.workflowDotDone : css.workflowDotActive}`}>{done ? '✓' : stepNo}</span>\n <div className={css.workflowBody}>\n <span className={css.workflowLabel}>{label}</span>\n <span className={css.workflowHint}>{hint}</span>\n </div>\n {!done && (\n <button type=\"button\" className={`${css.button} ${css.buttonSmall} ${css.buttonPrimary}`} disabled={disabled || busy} onClick={onClick}>\n {buttonLabel}\n </button>\n )}\n </div>\n )\n\n return (\n <div className={css.panel}>\n <div className={css.panelHeader}>\n <h2 className={css.panelTitle}>\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 </h2>\n <button type=\"button\" className={css.iconButton} title={tt('common.close')} aria-label={tt('common.close')} onClick={() => { controller.close() }}>×</button>\n </div>\n {shelf !== null && (\n <BookshelfBar\n api={api}\n shelf={shelf}\n onSwitch={() => {\n void refreshShelf()\n // 切换书后重置本地编辑状态,重新拉取目标书。\n setOutlineText('')\n setProject(null)\n setGeneratedFiles([])\n setChapterText('')\n setExpandedChapter(null)\n setProgress([])\n void refresh(false)\n }}\n />\n )}\n <div className={css.tabBar} role=\"tablist\">\n {TABS.map(tab => (\n <button key={tab.id} type=\"button\" role=\"tab\" aria-selected={activeTab === tab.id} data-active={activeTab === tab.id ? '' : undefined} className={css.tab} onClick={() => { setActiveTab(tab.id) }}>\n {tab.label}\n </button>\n ))}\n </div>\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 !== '' && <div className={css.card}><span style={{ color: 'var(--nf-accent)' }}>{busyLabel}…</span></div>}\n\n {activeTab === 'workflow' && (\n <div className={css.card}>\n <span className={css.cardTitle}>{tt('workflow.title')}</span>\n <div className={css.meta}>{tt('workflow.progress', {\n bible: bible !== undefined ? '✓' : '—',\n volumes: volumes !== undefined ? '✓' : '—',\n plan: chapters.length > 0 ? '✓' : '—',\n done: doneCount,\n total: chapters.length,\n })}</div>\n <div className={css.workflowList}>\n {workflowRow(1, project !== null, tt('workflow.step1'), '从 docx 或粘贴文本导入全书大纲', tt('workflow.loadOutline'), () => { void handleLoadDocx(false) }, false)}\n {workflowRow(2, bible !== undefined, tt('workflow.step2'), '提炼人设 / 世界观 / 金手指规则 / 写作红线', tt('workflow.genBible'), () => { void handleBible() }, project === null)}\n {workflowRow(3, volumes !== undefined, tt('workflow.step3'), '按剧情弧线划分全书卷结构', tt('workflow.genVolumes'), () => { void handleVolumes() }, project === null)}\n {workflowRow(4, chapters.length > 0, tt('workflow.step4'), '每章标题 + 剧情要点 + 字数目标', tt('workflow.genPlan'), () => { void handlePlan() }, project === null)}\n {workflowRow(5, doneCount > 0, tt('workflow.step5'), '逐章生成,自动摘要 + AI 审稿', tt('plan.write'), () => { setActiveTab('plan') }, false)}\n {workflowRow(6, doneCount > 0, tt('workflow.step6'), '去 AI 味润色 / 导出全本', tt('settings.exportTxt'), () => { void handleExport('txt') }, false)}\n </div>\n </div>\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 && <span className={css.meta}>{tt('overview.bookName')}: {project.bookName}</span>}\n </div>\n {/* 拖拽 / 文件选择导入 docx */}\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 </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 {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 {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> {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 }}>修订(可整章或局部)</div>\n <div className={css.field}>\n <label className={css.fieldLabel}>要修改的原文片段(从上面正文复制一段;留空 = 整章修订)</label>\n <textarea\n className={css.textarea}\n style={{ minHeight: 56 }}\n placeholder=\"例如:林越咬紧牙关:…(复制正文中的原句)\"\n value={localTarget}\n onChange={e => { setLocalTarget(e.target.value) }}\n />\n </div>\n <div className={css.row}>\n <input\n className={css.input}\n style={{ flex: 1 }}\n placeholder=\"修订指令(如:这段对话太生硬,改得更口语化)\"\n value={rewriteInstruction}\n onChange={e => { setRewriteInstruction(e.target.value) }}\n />\n <button type=\"button\" className={`${css.button} ${css.buttonPrimary}`} disabled={busy || busyAny} onClick={() => { void handleRewrite(chapter.no) }}>\n {tt('plan.rewrite')}\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 handlePolish(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 handleWriteChapter(chapter.no, true) }}>\n {tt('plan.rewrite')}\n </button>\n )}\n </div>\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 : css.progressLine}>\n {line.text}\n </div>\n ))}\n </div>\n </div>\n </>\n )}\n\n {activeTab === 'bible' && (\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 {bible.worldRules.length > 0 && (\n <div>\n <b>{tt('bible.worldRules')}({bible.worldRules.length})</b>\n <ul style={{ margin: 0, paddingLeft: 18, fontSize: 12 }}>{bible.worldRules.map((r, i) => <li key={i}>{r}</li>)}</ul>\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 {activeTab === 'assets' && (\n <AssetsTab api={api} />\n )}\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 === 'assistant' && (\n <AssistantTab api={api} />\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.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 </div>\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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"}
|