dsh-novel 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 +21 -0
- package/README.md +149 -0
- package/cordis.patch.yml +3 -0
- package/lib/client.js +1560 -0
- package/lib/client.js.map +1 -0
- package/lib/index.js +1436 -0
- package/lib/index.js.map +1 -0
- package/lib/types/client/NovelWorkspaceView.d.ts +3 -0
- package/lib/types/client/entity-client.d.ts +17 -0
- package/lib/types/client/index.d.ts +3 -0
- package/lib/types/client/noveel-shapes.d.ts +1 -0
- package/lib/types/client/novel-api.d.ts +1 -0
- package/lib/types/client/section-icons.d.ts +5 -0
- package/lib/types/client/sections/ChapterSection.d.ts +2 -0
- package/lib/types/client/sections/LevelSection.d.ts +2 -0
- package/lib/types/client/sections/ListDetailSection.d.ts +13 -0
- package/lib/types/client/sections/OutlineSection.d.ts +2 -0
- package/lib/types/client/sections/OverviewSection.d.ts +2 -0
- package/lib/types/client/sections/SkillSection.d.ts +3 -0
- package/lib/types/client/sections/TimelineSection.d.ts +2 -0
- package/lib/types/client/sections/WorldSection.d.ts +2 -0
- package/lib/types/client/sections/owned-sections.d.ts +4 -0
- package/lib/types/client/sections/types.d.ts +14 -0
- package/lib/types/client/styles.d.ts +1 -0
- package/lib/types/client/ui/EntitySidebar.d.ts +10 -0
- package/lib/types/client/ui/RelationPanel.d.ts +6 -0
- package/lib/types/client/ui/TemplateRead.d.ts +13 -0
- package/lib/types/client/ui/TimelinePanel.d.ts +8 -0
- package/lib/types/client/ui/controls.d.ts +22 -0
- package/lib/types/client/ui/live-reload.d.ts +2 -0
- package/lib/types/index.d.ts +5 -0
- package/lib/types/novel/contract.d.ts +2 -0
- package/lib/types/novel/defaults.d.ts +66 -0
- package/lib/types/novel/domains.d.ts +12 -0
- package/lib/types/novel/host-skills.d.ts +58 -0
- package/lib/types/novel/http.d.ts +5 -0
- package/lib/types/novel/normalize-entity.d.ts +18 -0
- package/lib/types/novel/noveel-shapes.d.ts +98 -0
- package/lib/types/novel/outline-labels.d.ts +10 -0
- package/lib/types/novel/schema.d.ts +3 -0
- package/lib/types/novel/seed.d.ts +27 -0
- package/lib/types/novel/store.d.ts +96 -0
- package/lib/types/novel/template-fields.d.ts +17 -0
- package/lib/types/novel/timeline-labels.d.ts +2 -0
- package/lib/types/novel/tools.d.ts +3 -0
- package/package.json +77 -0
- package/seed/skills/chapter//345/216/273AI/345/221/263/344/270/216/350/264/250/346/243/200.md +34 -0
- package/seed/skills/chapter//345/257/271/350/257/235/344/270/216/346/203/205/347/273/252.md +52 -0
- package/seed/skills/chapter//347/253/240/350/212/202/346/225/260/346/215/256/347/273/264/346/212/244.md +61 -0
- package/seed/skills/chapter//347/253/240/350/212/202/350/212/202/345/245/217/344/270/216/345/274/200/345/244/264.md +61 -0
- package/seed/skills/chapter//347/253/240/351/246/226/351/222/251/345/255/220.md +40 -0
- package/seed/skills/creature//345/274/202/345/205/275/344/270/216/347/201/265/346/244/215.md +11 -0
- package/seed/skills/creature//347/224/237/347/211/251/346/241/243/346/241/210/350/246/201/347/264/240.md +13 -0
- package/seed/skills/genres//344/273/231/344/276/240/overview//351/242/230/346/235/220/350/247/204/345/210/231.md +32 -0
- package/seed/skills/genres//344/273/231/344/276/240/review/outline//345/244/247/347/272/262/345/256/241/346/237/245.md +21 -0
- package/seed/skills/genres//345/216/206/345/217/262/overview//351/242/230/346/235/220/350/247/204/345/210/231.md +32 -0
- package/seed/skills/genres//345/216/206/345/217/262/review/outline//345/244/247/347/272/262/345/256/241/346/237/245.md +21 -0
- package/seed/skills/genres//346/202/254/347/226/221/overview//351/242/230/346/235/220/350/247/204/345/210/231.md +33 -0
- package/seed/skills/genres//346/202/254/347/226/221/review/outline//345/244/247/347/272/262/345/256/241/346/237/245.md +21 -0
- package/seed/skills/genres//346/234/253/344/270/226/overview//351/242/230/346/235/220/350/247/204/345/210/231.md +33 -0
- package/seed/skills/genres//346/234/253/344/270/226/review/outline//345/244/247/347/272/262/345/256/241/346/237/245.md +21 -0
- package/seed/skills/genres//347/216/204/345/271/273/overview//351/242/230/346/235/220/350/247/204/345/210/231.md +32 -0
- package/seed/skills/genres//347/216/204/345/271/273/review/outline//345/244/247/347/272/262/345/256/241/346/237/245.md +22 -0
- package/seed/skills/genres//347/247/221/345/271/273/overview//351/242/230/346/235/220/350/247/204/345/210/231.md +33 -0
- package/seed/skills/genres//347/247/221/345/271/273/review/outline//345/244/247/347/272/262/345/256/241/346/237/245.md +21 -0
- package/seed/skills/genres//350/250/200/346/203/205/overview//351/242/230/346/235/220/350/247/204/345/210/231.md +31 -0
- package/seed/skills/genres//350/250/200/346/203/205/review/outline//345/244/247/347/272/262/345/256/241/346/237/245.md +21 -0
- package/seed/skills/genres//351/203/275/345/270/202/overview//351/242/230/346/235/220/350/247/204/345/210/231.md +32 -0
- package/seed/skills/genres//351/203/275/345/270/202/review/outline//345/244/247/347/272/262/345/256/241/346/237/245.md +21 -0
- package/seed/skills/item//346/265/201/350/275/254/344/270/216/345/275/222/345/261/236.md +22 -0
- package/seed/skills/item//347/211/251/345/223/201/346/241/243/346/241/210/350/246/201/347/264/240.md +13 -0
- package/seed/skills/level//346/210/220/351/225/277/344/270/216/347/210/275/347/202/271.md +44 -0
- package/seed/skills/level//350/203/275/345/212/233/344/270/216/344/273/243/344/273/267.md +42 -0
- package/seed/skills/outline//345/211/247/346/203/205/351/252/250/346/236/266/346/265/201/346/260/264/347/272/277.md +51 -0
- package/seed/skills/outline//347/273/223/346/236/204/344/270/216/345/215/267/347/253/240/346/250/241/346/235/277.md +68 -0
- package/seed/skills/outline//351/273/204/351/207/221/344/270/211/347/253/240/344/270/216/351/252/214/346/224/266.md +42 -0
- package/seed/skills/overview//345/215/226/347/202/271/344/270/216/345/256/232/344/275/215.md +52 -0
- package/seed/skills/overview//345/274/200/344/271/246/347/247/215/345/255/220.md +60 -0
- package/seed/skills/overview//346/240/207/351/242/230/345/210/233/344/275/234.md +43 -0
- package/seed/skills/review/chapter//347/253/240/350/212/202/345/256/241/346/237/245.md +72 -0
- package/seed/skills/review/outline//345/244/247/347/272/262/345/256/241/346/237/245.md +74 -0
- package/seed/skills/role//344/272/272/347/211/251/345/241/221/351/200/240.md +52 -0
- package/seed/skills/role//345/205/263/347/263/273/344/270/216/351/205/215/350/247/222.md +53 -0
- package/seed/skills/role//350/247/222/350/211/262/346/241/243/346/241/210.md +52 -0
- package/seed/skills/timeline//344/272/213/344/273/266/350/275/264/350/247/204/345/210/222.md +33 -0
- package/seed/skills/timeline//347/212/266/346/200/201/345/220/214/346/255/245.md +41 -0
- package/seed/skills/world//344/270/226/347/225/214/350/247/204/345/210/231.md +30 -0
- package/seed/skills/world//344/274/217/347/254/224/350/264/246/346/234/254.md +44 -0
- package/seed/skills/world//345/212/277/345/212/233/344/270/216/345/234/260/345/233/276.md +52 -0
- package/seed/skills/writing-style/da-feng-da-geng-ren/STYLE.md +132 -0
- package/seed/skills/writing-style/da-feng-da-geng-ren/meta.json +6 -0
- package/seed/skills/writing-style/hei-dao-da-feng/STYLE.md +144 -0
- package/seed/skills/writing-style/hei-dao-da-feng/meta.json +6 -0
- package/seed/skills/writing-style/hei-dao-xie-huang/STYLE.md +139 -0
- package/seed/skills/writing-style/hei-dao-xie-huang/meta.json +6 -0
- package/seed/templates//344/273/231/344/276/240.json +1322 -0
- package/seed/templates//345/216/206/345/217/262.json +1318 -0
- package/seed/templates//346/202/254/347/226/221.json +1318 -0
- package/seed/templates//346/234/253/344/270/226.json +1127 -0
- package/seed/templates//347/216/204/345/271/273.json +1322 -0
- package/seed/templates//347/247/221/345/271/273.json +1322 -0
- package/seed/templates//350/250/200/346/203/205.json +1318 -0
- package/seed/templates//351/203/275/345/270/202.json +1318 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","names":["err","asRecord","asRecord","IconGlobeOutline14","IconUserOutline16","IconArchiveOutline20","IconGoalOutline16","IconQueueOutline14","IconChecklistOutline14","IconListPenOutline16","IconSkillOutline16","asRecord","Input","IconSearchOutline16","IconChevronRightOutline14","IconFolderOpenOutline16","IconFolderClose16","IconListPenOutline16","asRecord","asRecord","Pill","labelData","MarkdownText","Tooltip"],"sources":["../src/novel/domains.ts","../src/novel/contract.ts","../src/client/novel-api.ts","../src/novel/outline-labels.ts","../src/novel/normalize-entity.ts","../src/client/entity-client.ts","../src/client/section-icons.tsx","../src/novel/template-fields.ts","../src/client/ui/TemplateRead.tsx","../src/client/ui/live-reload.ts","../src/client/sections/OverviewSection.tsx","../src/novel/noveel-shapes.ts","../src/client/ui/controls.tsx","../src/client/ui/EntitySidebar.tsx","../src/client/ui/TimelinePanel.tsx","../src/client/sections/WorldSection.tsx","../src/client/ui/RelationPanel.tsx","../src/client/sections/ListDetailSection.tsx","../src/client/sections/owned-sections.tsx","../src/client/sections/LevelSection.tsx","../src/novel/timeline-labels.ts","../src/client/sections/TimelineSection.tsx","../src/client/sections/OutlineSection.tsx","../src/client/sections/ChapterSection.tsx","../src/client/sections/SkillSection.tsx","../src/client/NovelWorkspaceView.tsx","../src/client/styles.ts","../src/client/index.ts"],"sourcesContent":["/** Entity domains aligned with Noveel registry names. */\nexport const ENTITY_DOMAINS = [\n 'role',\n 'roleRelation',\n 'roleTimeline',\n 'creature',\n 'creatureTimeline',\n 'item',\n 'itemTimeline',\n 'level',\n 'world',\n 'worldTimeline',\n 'timeline',\n 'outline',\n 'chapter',\n] as const\n\nexport type EntityDomain = (typeof ENTITY_DOMAINS)[number]\n\nexport const DOMAIN_LABELS: Record<EntityDomain | 'overview' | 'skill' | 'info', string> = {\n info: '基本信息',\n overview: '概述',\n world: '世界',\n role: '人物',\n creature: '生物',\n item: '物品',\n level: '等级',\n timeline: '时间线',\n outline: '大纲',\n chapter: '章节',\n skill: '技能',\n roleRelation: '人物关系',\n roleTimeline: '人物时间线',\n creatureTimeline: '生物时间线',\n itemTimeline: '物品时间线',\n worldTimeline: '世界时间线',\n}\n\n/** Conversation「内容」Tab 内的竖向分区;基本信息并入概述。模板为内置,不展示。 */\nexport const CONTENT_SECTIONS = [\n 'overview',\n 'world',\n 'role',\n 'creature',\n 'item',\n 'level',\n 'timeline',\n 'outline',\n 'chapter',\n 'skill',\n] as const\n\nexport type ContentSection = (typeof CONTENT_SECTIONS)[number]\n\nexport const TREE_SECTIONS = new Set<ContentSection>(['world', 'outline'])\n\nexport const LIST_SECTIONS = new Set<ContentSection>([\n 'world', 'role', 'creature', 'item', 'level', 'timeline', 'outline', 'chapter', 'skill',\n])\n\nexport const PANEL_TABS = CONTENT_SECTIONS\n\nexport type PanelTab = ContentSection\n\nexport function isEntityDomain(value: string): value is EntityDomain {\n return (ENTITY_DOMAINS as readonly string[]).includes(value)\n}\n","/** Same-origin HTTP prefix for the novel Host API. */\nexport const NOVEL_API_PREFIX = '/dsh-novel/api'\n","import { NOVEL_API_PREFIX } from '../novel/contract.ts'\n\nexport async function novelApi<T>(path: string, init?: RequestInit): Promise<T> {\n const response = await fetch(`${NOVEL_API_PREFIX}${path}`, {\n cache: 'no-store',\n headers: { 'content-type': 'application/json', ...(init?.headers ?? {}) },\n ...init,\n })\n const text = await response.text()\n const body = text.length === 0 ? undefined : JSON.parse(text) as T\n if (!response.ok) {\n const err = body as { error?: string } | undefined\n throw new Error(err?.error ?? `HTTP ${String(response.status)}`)\n }\n return body as T\n}\n","export function asOrdinal(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) return value\n if (typeof value === 'string' && value.trim() !== '') {\n const n = Number(value.trim())\n if (Number.isFinite(n)) return n\n }\n return undefined\n}\n\nexport function canonicalizeOutlineKind(raw: unknown): 'volume' | 'chapter_segment' | undefined {\n if (typeof raw !== 'string') return undefined\n const key = raw.trim()\n if (key === 'chapter_segment' || key === 'chapter' || key === '章') return 'chapter_segment'\n if (key === 'volume' || key === '卷') return 'volume'\n return undefined\n}\n\nexport function outlineKindOf(data: Record<string, unknown>): 'volume' | 'chapter_segment' {\n const explicit = canonicalizeOutlineKind(data.kind ?? data.nodeKind)\n if (explicit !== undefined) return explicit\n const parent = typeof data.parentId === 'string' && data.parentId.length > 0\n || typeof data.parentName === 'string' && data.parentName.length > 0\n return parent ? 'chapter_segment' : 'volume'\n}\n\nexport function volumeChapterLabel(ordinal: unknown, unit: '卷' | '章', name: string): string {\n const title = name.trim().length > 0 ? name.trim() : '未命名'\n const n = asOrdinal(ordinal)\n if (n === undefined) return title\n return `第${n}${unit} ${title}`\n}\n\nfunction shortName(data: Record<string, unknown>, fallback: string): string {\n return typeof data.name === 'string' && data.name.trim().length > 0 ? data.name.trim() : fallback\n}\n\nexport function outlineNodeLabel(data: Record<string, unknown>, fallback: string): string {\n const unit = outlineKindOf(data) === 'chapter_segment' ? '章' : '卷'\n return volumeChapterLabel(data.ordinal, unit, shortName(data, fallback))\n}\n\nexport function chapterNodeLabel(data: Record<string, unknown>, fallback: string): string {\n return volumeChapterLabel(data.ordinal ?? data.chapterNo, '章', shortName(data, fallback))\n}\n\nexport function compareOrdinal(a: unknown, b: unknown): number {\n const oa = asOrdinal(a)\n const ob = asOrdinal(b)\n if (oa === undefined && ob === undefined) return 0\n if (oa === undefined) return 1\n if (ob === undefined) return -1\n return oa - ob\n}\n\nexport function sortByOrdinalName<T extends { name?: string | null }>(\n items: T[],\n ordinalOf: (item: T) => unknown,\n): T[] {\n return [...items].sort((a, b) => {\n const cmp = compareOrdinal(ordinalOf(a), ordinalOf(b))\n if (cmp !== 0) return cmp\n return (a.name ?? '').localeCompare(b.name ?? '', 'zh')\n })\n}\n","import type { EntityDomain } from './domains.ts'\nimport { asOrdinal, outlineKindOf } from './outline-labels.ts'\n\nexport function asRecord(value: unknown): Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown>\n : {}\n}\n\nfunction asNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : undefined\n}\n\n/** Merge nested `profile` onto the root; existing top-level keys win. */\nexport function hoistProfile(data: Record<string, unknown>): Record<string, unknown> {\n return { ...asRecord(data.profile), ...data }\n}\n\n/** Merge outline `extra` onto the root; existing top-level keys win. */\nexport function hoistOutlineExtra(data: Record<string, unknown>): Record<string, unknown> {\n return { ...asRecord(data.extra), ...data }\n}\n\n/** Shape used by the content tab: hoist profile/extra so template keys resolve. */\nexport function displayEntityData(data: Record<string, unknown>): Record<string, unknown> {\n return hoistOutlineExtra(hoistProfile(data))\n}\n\nexport function levelNameOf(data: Record<string, unknown>): string | undefined {\n return asNonEmptyString(data.name)\n ?? asNonEmptyString(data.title)\n ?? asNonEmptyString(asRecord(data.system).name)\n}\n\nconst FROM_KEYS = ['roleId', 'from', 'fromName', 'source', 'fromRole'] as const\nconst TO_KEYS = ['targetRoleId', 'to', 'toName', 'target', 'toRole'] as const\n\nexport function pickFirstString(data: Record<string, unknown>, keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const value = asNonEmptyString(data[key])\n if (value !== undefined) return value\n }\n return undefined\n}\n\nexport interface NormalizeLookups {\n worldIdByName: Map<string, string>\n roleIdByRef: Map<string, string>\n outlineIdByName: Map<string, string>\n outlineChapterIdByName: Map<string, string>\n}\n\nfunction omitKeys(data: Record<string, unknown>, keys: string[]): Record<string, unknown> {\n const next = { ...data }\n for (const key of keys) delete next[key]\n return next\n}\n\nfunction resolveRef(ref: string, map: Map<string, string>, label: string): string {\n const id = map.get(ref)\n if (id === undefined) throw new Error(`${label} not found: ${ref}`)\n return id\n}\n\n/** Canonicalize mutate payloads so the content tab can read template keys. */\nexport function normalizeEntityPayload(\n domain: EntityDomain,\n raw: Record<string, unknown>,\n lookups: NormalizeLookups,\n): Record<string, unknown> {\n let data = hoistProfile(raw)\n if (domain === 'outline') data = hoistOutlineExtra(data)\n\n if (domain === 'level') {\n const name = levelNameOf(data)\n if (name !== undefined) data = { ...data, name }\n }\n\n if (domain === 'world') {\n const parentId = asNonEmptyString(data.parentId)\n const parentName = asNonEmptyString(data.parentName)\n if (parentId === undefined && parentName !== undefined) {\n data = { ...data, parentId: resolveRef(parentName, lookups.worldIdByName, 'world parent') }\n }\n data = omitKeys(data, ['parentName'])\n }\n\n if (domain === 'outline') {\n const parentId = asNonEmptyString(data.parentId)\n const parentName = asNonEmptyString(data.parentName)\n if (parentId === undefined && parentName !== undefined) {\n data = { ...data, parentId: resolveRef(parentName, lookups.outlineIdByName, 'outline parent') }\n }\n const ordinal = asOrdinal(data.ordinal) ?? asOrdinal(data.chapterNo)\n data = {\n ...data,\n kind: outlineKindOf(data),\n ...(ordinal !== undefined ? { ordinal } : {}),\n }\n data = omitKeys(data, ['parentName', 'nodeKind', 'volumeNo', 'chapterNo'])\n }\n\n if (domain === 'chapter') {\n const relatedId = asNonEmptyString(data.relatedOutlineId)\n const relatedName = asNonEmptyString(data.relatedOutlineName)\n if (relatedId === undefined && relatedName !== undefined) {\n const id = lookups.outlineChapterIdByName.get(relatedName) ?? lookups.outlineIdByName.get(relatedName)\n if (id === undefined) throw new Error(`outline chapter not found: ${relatedName}`)\n data = { ...data, relatedOutlineId: id }\n }\n const ordinal = asOrdinal(data.ordinal) ?? asOrdinal(data.chapterNo)\n if (ordinal !== undefined) data = { ...data, ordinal }\n data = omitKeys(data, ['relatedOutlineName', 'chapterNo', 'volumeNo'])\n }\n\n if (domain === 'roleRelation') {\n const fromRef = pickFirstString(data, FROM_KEYS)\n const toRef = pickFirstString(data, TO_KEYS)\n if (fromRef === undefined || toRef === undefined) {\n throw new Error('roleRelation requires both ends (roleId/from and targetRoleId/to)')\n }\n data = {\n ...data,\n roleId: resolveRef(fromRef, lookups.roleIdByRef, 'role'),\n targetRoleId: resolveRef(toRef, lookups.roleIdByRef, 'role'),\n }\n }\n\n return data\n}\n","import { displayEntityData } from '../novel/normalize-entity.ts'\nimport { novelApi } from './novel-api.ts'\n\nexport interface EntityItem {\n id: string\n name?: string | null\n data?: unknown\n}\n\nexport function asRecord(value: unknown): Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown>\n : {}\n}\n\nexport async function listEntities(path: string, domain: string): Promise<EntityItem[]> {\n return novelApi<EntityItem[]>(`/entities?path=${encodeURIComponent(path)}&domain=${encodeURIComponent(domain)}`)\n}\n\nexport async function upsertEntity(\n path: string,\n domain: string,\n data: Record<string, unknown>,\n id?: string,\n): Promise<EntityItem> {\n return novelApi<EntityItem>('/entities', {\n method: 'POST',\n body: JSON.stringify({ path, domain, id, data }),\n })\n}\n\nexport async function deleteEntity(path: string, id: string): Promise<void> {\n await novelApi('/entities', { method: 'DELETE', body: JSON.stringify({ path, id }) })\n}\n\nexport function dataOf(item: EntityItem): Record<string, unknown> {\n return asRecord(item.data)\n}\n\nexport function viewData(item: EntityItem | undefined): Record<string, unknown> {\n if (item === undefined) return {}\n return { name: item.name ?? '', ...displayEntityData(dataOf(item)) }\n}\n\nexport function parentIdOf(item: EntityItem, items: EntityItem[]): string | undefined {\n const data = asRecord(item.data)\n if (typeof data.parentId === 'string' && data.parentId.length > 0) return data.parentId\n if (typeof data.parentName === 'string' && data.parentName.length > 0) {\n return items.find(row => row.name === data.parentName)?.id\n }\n return undefined\n}\n\nexport function filterOwned(items: EntityItem[], ownerKey: string, ownerId: string): EntityItem[] {\n return items.filter(item => String(dataOf(item)[ownerKey] ?? '') === ownerId)\n}\n\nexport async function cascadeDelete(\n path: string,\n ownerId: string,\n related: Array<{ domain: string, ownerKey: string }>,\n): Promise<void> {\n for (const spec of related) {\n const all = await listEntities(path, spec.domain)\n const rows = spec.domain === 'roleRelation'\n ? all.filter(item => {\n const data = dataOf(item)\n return String(data.roleId ?? '') === ownerId || String(data.targetRoleId ?? '') === ownerId\n })\n : filterOwned(all, spec.ownerKey, ownerId)\n for (const row of rows) await deleteEntity(path, row.id)\n }\n await deleteEntity(path, ownerId)\n}\n","import type { ReactNode } from 'react'\nimport {\n IconArchiveOutline20,\n IconChecklistOutline14,\n IconGlobeOutline14,\n IconGoalOutline16,\n IconListPenOutline16,\n IconQueueOutline14,\n IconSkillOutline16,\n IconUserOutline16,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { ContentSection } from '../novel/domains.ts'\n\nfunction CreatureIcon() {\n return (\n <svg width={16} height={16} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M8 2.2c1.4 0 2.5 1.2 2.5 2.6 0 .5-.1 1-.4 1.4 1.3.5 2.2 1.8 2.2 3.3 0 2-1.9 3.6-4.3 3.6S3.7 11.5 3.7 9.5c0-1.5.9-2.8 2.2-3.3-.3-.4-.4-.9-.4-1.4C5.5 3.4 6.6 2.2 8 2.2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n />\n </svg>\n )\n}\n\nfunction BookIcon() {\n return (\n <svg width={16} height={16} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M8 3.2c-1.1-.8-2.6-1.1-4.4-.8v9.2c1.7-.3 3.2 0 4.4.8 1.1-.8 2.6-1.1 4.4-.8V2.4c-1.8-.3-3.3 0-4.4.8Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n strokeLinejoin=\"round\"\n />\n <path d=\"M8 3.2v9.2\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n )\n}\n\nexport function SectionIcon({ section }: { section: ContentSection }): ReactNode {\n switch (section) {\n case 'overview': return <BookIcon />\n case 'world': return <IconGlobeOutline14 />\n case 'role': return <IconUserOutline16 />\n case 'creature': return <CreatureIcon />\n case 'item': return <IconArchiveOutline20 size={16} />\n case 'level': return <IconGoalOutline16 />\n case 'timeline': return <IconQueueOutline14 />\n case 'outline': return <IconChecklistOutline14 />\n case 'chapter': return <IconListPenOutline16 />\n case 'skill': return <IconSkillOutline16 />\n }\n}\n","import type { ContentSection } from './domains.ts'\n\nexport const TEMPLATE_PRESET_MAIN_CATEGORIES = [\n '玄幻',\n '都市',\n '科幻',\n '末世',\n '仙侠',\n '言情',\n '悬疑',\n '历史',\n] as const\n\nexport type TemplatePresetMainCategory = (typeof TEMPLATE_PRESET_MAIN_CATEGORIES)[number]\n\nconst CATEGORY_ALIASES: Record<string, TemplatePresetMainCategory> = {\n 玄幻: '玄幻',\n 东方玄幻: '玄幻',\n 异世大陆: '玄幻',\n 高武世界: '玄幻',\n 都市: '都市',\n 都市异能: '都市',\n 科幻: '科幻',\n 星际: '科幻',\n 末世: '末世',\n 末日: '末世',\n 仙侠: '仙侠',\n 修真: '仙侠',\n 言情: '言情',\n 悬疑: '悬疑',\n 推理: '悬疑',\n 历史: '历史',\n}\n\nexport function normalizeTemplatePresetCategory(raw: string | null | undefined): TemplatePresetMainCategory {\n const t = (raw ?? '').trim()\n if (t.length === 0) return '玄幻'\n const direct = CATEGORY_ALIASES[t]\n if (direct !== undefined) return direct\n for (const main of TEMPLATE_PRESET_MAIN_CATEGORIES) {\n if (t.includes(main)) return main\n }\n return '玄幻'\n}\n\nexport interface FormField {\n key: string\n label: string\n component?: string\n options?: Array<{ label: string, value: string }>\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown>\n : {}\n}\n\nfunction asFields(raw: unknown): FormField[] {\n if (!Array.isArray(raw)) return []\n return raw.flatMap((row): FormField[] => {\n if (row === null || typeof row !== 'object') return []\n const rec = row as Record<string, unknown>\n if (typeof rec.key !== 'string' || typeof rec.label !== 'string') return []\n const options = flattenOptions(rec.options)\n const field: FormField = { key: rec.key, label: rec.label }\n if (typeof rec.component === 'string') field.component = rec.component\n if (options.length > 0) field.options = options\n return [field]\n })\n}\n\nfunction flattenOptions(raw: unknown): Array<{ label: string, value: string }> {\n if (!Array.isArray(raw)) return []\n const out: Array<{ label: string, value: string }> = []\n for (const entry of raw) {\n if (entry === null || typeof entry !== 'object') continue\n const rec = entry as Record<string, unknown>\n if (typeof rec.value === 'string' && typeof rec.label === 'string') {\n out.push({ label: rec.label, value: rec.value })\n continue\n }\n if (Array.isArray(rec.options)) {\n for (const nested of rec.options) {\n if (nested === null || typeof nested !== 'object') continue\n const item = nested as Record<string, unknown>\n if (typeof item.value === 'string' && typeof item.label === 'string') {\n out.push({ label: item.label, value: item.value })\n }\n }\n }\n }\n return out\n}\n\n/** Pick human-editable fields from a Noveel form_templates.config blob. */\nexport function fieldsOf(template: unknown, section: ContentSection, extra?: 'chapterSegment' | 'timeline'): FormField[] {\n const root = asRecord(template)\n const block = asRecord(root[section])\n switch (section) {\n case 'overview':\n return asFields(block.fields)\n case 'role':\n case 'creature':\n case 'item':\n return extra === 'timeline' ? asFields(asRecord(block.timeline).extraFields) : asFields(block.detailFields)\n case 'world':\n return extra === 'timeline'\n ? asFields(asRecord(block.timeline).extraFields)\n : asFields(block.defaultDetailFields)\n case 'level':\n return asFields(block.levelFields)\n case 'timeline':\n return asFields(block.extraFields)\n case 'outline':\n return extra === 'chapterSegment' ? asFields(block.chapterSegmentFields) : asFields(block.volumeFields)\n default:\n return asFields(block.fields ?? block.detailFields)\n }\n}\n\nexport function getByPath(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.').filter(Boolean)\n let cur: unknown = obj\n for (const part of parts) {\n if (cur == null || typeof cur !== 'object' || Array.isArray(cur)) return undefined\n cur = (cur as Record<string, unknown>)[part]\n }\n return cur\n}\n\nexport function setByPath(obj: Record<string, unknown>, path: string, value: unknown): Record<string, unknown> {\n const next = structuredClone(obj)\n const parts = path.split('.').filter(Boolean)\n if (parts.length === 0) return next\n let cur: Record<string, unknown> = next\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]!\n const child = cur[part]\n if (child == null || typeof child !== 'object' || Array.isArray(child)) cur[part] = {}\n cur = cur[part] as Record<string, unknown>\n }\n cur[parts[parts.length - 1]!] = value\n return next\n}\n","import { fieldsOf, getByPath } from '../../novel/template-fields.ts'\nimport type { ContentSection } from '../../novel/domains.ts'\n\nexport function ReadField({ label, children }: { label: string, children: React.ReactNode }) {\n return (\n <div className=\"dshNovelViewField\">\n <label>{label}</label>\n <div className=\"dshNovelReadValue\">{children === '' || children === undefined || children === null ? '—' : children}</div>\n </div>\n )\n}\n\nexport function displayText(value: unknown): string {\n if (value === undefined || value === null || value === '') return ''\n if (Array.isArray(value)) return value.map(item => String(item)).filter(Boolean).join('、')\n if (typeof value === 'boolean') return value ? '是' : '否'\n return String(value)\n}\n\nexport function TemplateRead({\n template,\n section,\n extra,\n value,\n omitKeys,\n}: {\n template: unknown\n section: ContentSection\n extra?: 'chapterSegment' | 'timeline' | undefined\n value: Record<string, unknown>\n omitKeys?: string[] | undefined\n}) {\n const skip = new Set(omitKeys ?? [])\n const fields = fieldsOf(template, section, extra).filter(field => !skip.has(field.key))\n return (\n <>\n {fields.map(field => (\n <ReadField key={field.key} label={field.label}>\n {displayText(getByPath(value, field.key))}\n </ReadField>\n ))}\n </>\n )\n}\n","import { useEffect } from 'react'\n\nconst HINT = '暂无。可在对话中让 AI 补充。'\n\nexport function emptyHint(hasFilter?: boolean): string {\n return hasFilter ? '无匹配项' : HINT\n}\n\nexport function useLiveReload(reload: () => void | Promise<void>, ms = 5000): void {\n useEffect(() => {\n const tick = () => { void reload() }\n const id = window.setInterval(tick, ms)\n const onVis = () => { if (document.visibilityState === 'visible') tick() }\n document.addEventListener('visibilitychange', onVis)\n return () => {\n window.clearInterval(id)\n document.removeEventListener('visibilitychange', onVis)\n }\n }, [reload, ms])\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { novelApi } from '../novel-api.ts'\nimport { asRecord } from '../entity-client.ts'\nimport { TemplateRead } from '../ui/TemplateRead.tsx'\nimport { useLiveReload } from '../ui/live-reload.ts'\nimport type { OverviewPageProps } from './types.ts'\n\nexport function OverviewSection({ path, template, styles }: OverviewPageProps) {\n const [row, setRow] = useState<Record<string, unknown>>({})\n const reload = useCallback(async () => {\n setRow(await novelApi<Record<string, unknown>>(`/novel?path=${encodeURIComponent(path)}`))\n }, [path])\n useEffect(() => { void reload() }, [reload])\n useLiveReload(reload)\n\n const blueprint = asRecord(row.blueprint_json)\n const styleName = styles.find(style => style.id === row.writing_style_id)?.name ?? String(row.writing_style_id ?? '')\n\n return (\n <section className=\"dshNovelViewForm\">\n <div className=\"dshNovelViewFormBody\">\n <h1 className=\"dshNovelTitle\">{String(row.title ?? '未命名')}</h1>\n <p className=\"dshNovelMeta\">\n {[row.category, styleName].filter(item => item !== undefined && item !== '').join(' · ') || '—'}\n </p>\n {row.description !== undefined && row.description !== '' && (\n <p className=\"dshNovelProse\">{String(row.description)}</p>\n )}\n <TemplateRead template={template} section=\"overview\" value={blueprint} />\n </div>\n </section>\n )\n}\n","export const WORLD_KINDS = [\n { value: 'universe', label: '宇宙' },\n { value: 'multiverse', label: '多元宇宙' },\n { value: 'galaxy', label: '星系' },\n { value: 'realm', label: '界域' },\n { value: 'domain', label: '域' },\n { value: 'plane', label: '位面' },\n { value: 'planet', label: '星球' },\n { value: 'continent', label: '大陆' },\n { value: 'mainland', label: '大陆' },\n { value: 'region', label: '地区' },\n { value: 'mountain', label: '山脉' },\n { value: 'secret_realm', label: '秘境/禁地' },\n { value: 'country', label: '国家' },\n { value: 'empire', label: '帝国' },\n { value: 'kingdom', label: '王国' },\n { value: 'city', label: '城市' },\n { value: 'town', label: '城镇' },\n { value: 'settlement', label: '聚落' },\n { value: 'faction', label: '势力' },\n { value: 'sect', label: '宗门/门派' },\n { value: 'clan', label: '家族/氏族' },\n { value: 'guild', label: '公会' },\n { value: 'army', label: '军队' },\n { value: 'corporation', label: '公司/集团' },\n { value: 'alliance', label: '联盟' },\n { value: 'cult', label: '教派' },\n { value: 'academy', label: '学院' },\n { value: 'custom', label: '其他' },\n] as const\n\nexport function emptyLevelSystem() {\n return {\n name: '自定义体系',\n category: '自定义',\n description: '',\n levels: [\n {\n name: '第一阶',\n subLevels: [{ name: '初期' }, { name: '中期' }, { name: '后期' }],\n promotionCondition: '达到上一阶大圆满,并满足作品内设定的突破条件。',\n abilities: '待补充该等级典型能力与表现。',\n },\n ],\n }\n}\n","import type { InputHTMLAttributes, ReactNode, SelectHTMLAttributes, TextareaHTMLAttributes } from 'react'\nimport { Input, IconSearchOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\n\nexport function Field({ label, htmlFor, children }: { label: string, htmlFor?: string, children: React.ReactNode }) {\n return (\n <div className=\"dshNovelViewField\">\n <label htmlFor={htmlFor}>{label}</label>\n {children}\n </div>\n )\n}\n\nexport function TextInput({ className, ...rest }: InputHTMLAttributes<HTMLInputElement>) {\n return <Input className={className === undefined ? 'dshNovelInput' : `dshNovelInput ${className}`} {...rest} />\n}\n\nexport function SearchField({ className: _className, ...rest }: InputHTMLAttributes<HTMLInputElement>) {\n return (\n <div className=\"dshNovelViewSearch\">\n <Input icon={<IconSearchOutline16 />} placeholder=\"搜索…\" {...rest} />\n </div>\n )\n}\n\nexport function TextArea(props: TextareaHTMLAttributes<HTMLTextAreaElement>) {\n const { className, ...rest } = props\n return <textarea className={`dshNovelControl ${className ?? ''}`} {...rest} />\n}\n\nexport function Select(props: SelectHTMLAttributes<HTMLSelectElement>) {\n return <select className=\"dshNovelControl\" {...props} />\n}\n\nexport function DetailTabs<T extends string>({\n tabs,\n value,\n onChange,\n}: {\n tabs: Array<{ id: T, label: string }>\n value: T\n onChange: (id: T) => void\n}) {\n return (\n <div className=\"dshNovelTabs\" role=\"tablist\">\n {tabs.map(tab => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={value === tab.id}\n data-active={value === tab.id || undefined}\n onClick={() => { onChange(tab.id) }}\n >\n {tab.label}\n </button>\n ))}\n </div>\n )\n}\n\nexport function SectionToolbar({ tabs, actions }: { tabs?: ReactNode | undefined, actions?: ReactNode | undefined }) {\n return (\n <div className=\"dshNovelViewFormHead\">\n <div className=\"dshNovelViewFormHeadTabs\">{tabs}</div>\n <div className=\"dshNovelViewFormHeadActions\">{actions}</div>\n </div>\n )\n}\n","import {\n IconChevronRightOutline14,\n IconFolderClose16,\n IconFolderOpenOutline16,\n IconListPenOutline16,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport { useEffect, useMemo, useState } from 'react'\nimport { asRecord, parentIdOf, type EntityItem } from '../entity-client.ts'\nimport { SearchField } from './controls.tsx'\n\nexport function EntitySidebar({\n items,\n selectedId,\n onSelect,\n tree,\n label,\n className,\n files,\n}: {\n items: EntityItem[]\n selectedId?: string | undefined\n onSelect: (id: string) => void\n tree?: boolean | undefined\n label?: ((item: EntityItem) => string) | undefined\n className?: string | undefined\n files?: boolean | undefined\n}) {\n const [filter, setFilter] = useState('')\n const [expanded, setExpanded] = useState<Set<string>>(new Set())\n const nameOf = label ?? ((item: EntityItem) => item.name ?? item.id)\n const q = filter.trim()\n\n const visibleItems = useMemo(() => {\n if (q.length === 0) return items\n const match = new Set<string>()\n for (const item of items) {\n if (nameOf(item).includes(q)) match.add(item.id)\n }\n for (const item of items) {\n if (!match.has(item.id)) continue\n let current = parentIdOf(item, items)\n while (current !== undefined) {\n match.add(current)\n const ancestor = items.find(row => row.id === current)\n current = ancestor === undefined ? undefined : parentIdOf(ancestor, items)\n }\n }\n return items.filter(item => match.has(item.id))\n }, [items, nameOf, q])\n\n useEffect(() => {\n if (q.length === 0) return\n setExpanded(current => {\n const next = new Set(current)\n for (const item of visibleItems) {\n let ancestor = parentIdOf(item, items)\n while (ancestor !== undefined) {\n next.add(ancestor)\n const row = items.find(entry => entry.id === ancestor)\n ancestor = row === undefined ? undefined : parentIdOf(row, items)\n }\n }\n return next\n })\n }, [items, q, visibleItems])\n\n const rows = useMemo(() => {\n if (!tree) return visibleItems.map(item => ({ ...item, depth: 0, hasChildren: false }))\n return buildTree(visibleItems, items)\n }, [tree, visibleItems, items])\n\n const shown = rows.filter((row) => {\n if (!tree) return true\n const parent = parentIdOf(row, items)\n if (parent === undefined) return true\n let current: string | undefined = parent\n while (current !== undefined) {\n if (!expanded.has(current)) return false\n const ancestor = items.find(item => item.id === current)\n current = ancestor === undefined ? undefined : parentIdOf(ancestor, items)\n }\n return true\n })\n\n const toggle = (id: string) => {\n setExpanded(current => {\n const next = new Set(current)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })\n }\n\n return (\n <aside className={`dshNovelViewList${className === undefined ? '' : ` ${className}`}`}>\n <div className=\"dshNovelViewListToolbar\">\n <SearchField value={filter} onChange={event => { setFilter(event.target.value) }} />\n </div>\n <div className=\"dshNovelViewListBody\">\n {shown.length === 0 && (\n <p className=\"dshNovelViewMuted\">{q ? '无匹配项' : '暂无。可在对话中让 AI 补充。'}</p>\n )}\n {shown.map(row => {\n const folder = isFolder(row)\n const open = expanded.has(row.id)\n return (\n <button\n key={row.id}\n type=\"button\"\n className=\"dshNovelViewRow\"\n data-kind={folder ? 'folder' : 'file'}\n data-active={(!folder && row.id === selectedId) ? true : undefined}\n style={{ paddingLeft: 8 + row.depth * 12 }}\n onClick={() => {\n if (folder) toggle(row.id)\n else onSelect(row.id)\n }}\n >\n {tree && row.hasChildren ? (\n <span\n className=\"dshNovelViewChevron\"\n data-open={open || undefined}\n onClick={event => {\n event.stopPropagation()\n toggle(row.id)\n }}\n >\n <IconChevronRightOutline14 />\n </span>\n ) : <span className=\"dshNovelViewChevron\" />}\n {files ? (\n <span className=\"dshNovelViewRowIcon\">\n {folder\n ? (open ? <IconFolderOpenOutline16 /> : <IconFolderClose16 />)\n : <IconListPenOutline16 />}\n </span>\n ) : null}\n {nameOf(row)}\n </button>\n )\n })}\n </div>\n </aside>\n )\n}\n\nfunction isFolder(item: EntityItem): boolean {\n return asRecord(item.data).kind === 'folder'\n}\n\nfunction buildTree(items: EntityItem[], all: EntityItem[]): Array<EntityItem & { depth: number, hasChildren: boolean }> {\n const byParent = new Map<string | undefined, EntityItem[]>()\n for (const item of items) {\n const parent = parentIdOf(item, all)\n const list = byParent.get(parent) ?? []\n list.push(item)\n byParent.set(parent, list)\n }\n const out: Array<EntityItem & { depth: number, hasChildren: boolean }> = []\n const walk = (parent: string | undefined, depth: number) => {\n for (const child of byParent.get(parent) ?? []) {\n out.push({ ...child, depth, hasChildren: (byParent.get(child.id) ?? []).length > 0 })\n walk(child.id, depth + 1)\n }\n }\n walk(undefined, 0)\n const seen = new Set(out.map(row => row.id))\n for (const item of items) {\n if (!seen.has(item.id)) out.push({ ...item, depth: 0, hasChildren: false })\n }\n return out\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { dataOf, filterOwned, listEntities, type EntityItem } from '../entity-client.ts'\nimport { emptyHint, useLiveReload } from './live-reload.ts'\n\nexport function TimelinePanel({\n path,\n domain,\n ownerKey,\n ownerId,\n chapters,\n}: {\n path: string\n domain: string\n ownerKey: string\n ownerId: string\n chapters: EntityItem[]\n}) {\n const [rows, setRows] = useState<EntityItem[]>([])\n const reload = useCallback(async () => {\n setRows(filterOwned(await listEntities(path, domain), ownerKey, ownerId))\n }, [path, domain, ownerId, ownerKey])\n useEffect(() => { void reload() }, [reload])\n useLiveReload(reload)\n\n return (\n <div className=\"dshNovelViewFormBody\">\n {rows.length === 0 && <p className=\"dshNovelViewMuted\">{emptyHint()}</p>}\n {rows.map(row => {\n const data = dataOf(row)\n const chapter = chapters.find(item => item.id === data.relatedChapterId)\n return (\n <article key={row.id} className=\"dshNovelEntry\">\n <div>\n <div className=\"dshNovelEntryTitle\">{String(data.title ?? row.name ?? '未命名')}</div>\n <div className=\"dshNovelViewMuted\">\n {[data.timeLabel, chapter?.name].filter(Boolean).map(String).join(' · ')}\n </div>\n {data.content !== undefined && data.content !== '' && (\n <p className=\"dshNovelProse\">{String(data.content)}</p>\n )}\n </div>\n </article>\n )\n })}\n </div>\n )\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { viewData, listEntities, parentIdOf, type EntityItem } from '../entity-client.ts'\nimport { WORLD_KINDS } from '../noveel-shapes.ts'\nimport { EntitySidebar } from '../ui/EntitySidebar.tsx'\nimport { DetailTabs, SectionToolbar } from '../ui/controls.tsx'\nimport { ReadField, TemplateRead } from '../ui/TemplateRead.tsx'\nimport { TimelinePanel } from '../ui/TimelinePanel.tsx'\nimport { emptyHint, useLiveReload } from '../ui/live-reload.ts'\nimport type { SectionPageProps } from './types.ts'\n\nexport function WorldSection({ path, template, chapters }: SectionPageProps) {\n const [items, setItems] = useState<EntityItem[]>([])\n const [selectedId, setSelectedId] = useState<string | undefined>()\n const [tab, setTab] = useState<'detail' | 'timeline'>('detail')\n const selected = items.find(item => item.id === selectedId)\n const data = viewData(selected)\n const kindLabel = WORLD_KINDS.find(kind => kind.value === data.kind)?.label ?? String(data.kind ?? '')\n const parentId = selected === undefined ? undefined : parentIdOf(selected, items)\n const parentName = parentId === undefined\n ? (typeof data.parentName === 'string' && data.parentName.length > 0 ? data.parentName : undefined)\n : items.find(item => item.id === parentId)?.name\n\n const reload = useCallback(async () => {\n const rows = await listEntities(path, 'world')\n setItems(rows)\n setSelectedId(current => (current !== undefined && rows.some(row => row.id === current) ? current : rows[0]?.id))\n }, [path])\n useEffect(() => { void reload() }, [reload])\n useLiveReload(reload)\n\n return (\n <>\n <EntitySidebar\n items={items}\n selectedId={selectedId}\n tree\n onSelect={(id) => { setSelectedId(id); setTab('detail') }}\n />\n <section className=\"dshNovelViewForm\">\n {selectedId !== undefined && (\n <SectionToolbar\n tabs={(\n <DetailTabs\n tabs={[{ id: 'detail', label: '详情' }, { id: 'timeline', label: '时间线' }]}\n value={tab}\n onChange={setTab}\n />\n )}\n />\n )}\n {selected === undefined ? (\n <div className=\"dshNovelViewFormBody\"><p className=\"dshNovelViewMuted\">{emptyHint()}</p></div>\n ) : tab === 'detail' ? (\n <div className=\"dshNovelViewFormBody\">\n <h2 className=\"dshNovelTitle\">{String(data.name ?? '未命名')}</h2>\n <p className=\"dshNovelMeta\">{[kindLabel, parentName].filter(Boolean).join(' · ')}</p>\n <ReadField label=\"类型\">{kindLabel}</ReadField>\n {parentName !== undefined && <ReadField label=\"父节点\">{parentName}</ReadField>}\n <TemplateRead template={template} section=\"world\" value={data} />\n </div>\n ) : (\n <TimelinePanel path={path} domain=\"worldTimeline\" ownerKey=\"worldNodeId\" ownerId={selectedId!} chapters={chapters} />\n )}\n </section>\n </>\n )\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { dataOf, listEntities, type EntityItem } from '../entity-client.ts'\nimport { emptyHint, useLiveReload } from './live-reload.ts'\n\nexport function RelationPanel({\n path,\n ownerId,\n roles,\n}: {\n path: string\n ownerId: string\n roles: EntityItem[]\n}) {\n const [rows, setRows] = useState<EntityItem[]>([])\n const reload = useCallback(async () => {\n const all = await listEntities(path, 'roleRelation')\n setRows(all.filter((item) => {\n const data = dataOf(item)\n return String(data.roleId ?? '') === ownerId || String(data.targetRoleId ?? '') === ownerId\n }))\n }, [path, ownerId])\n useEffect(() => { void reload() }, [reload])\n useLiveReload(reload)\n\n return (\n <div className=\"dshNovelViewFormBody\">\n {rows.length === 0 && <p className=\"dshNovelViewMuted\">{emptyHint()}</p>}\n {rows.map(row => {\n const data = dataOf(row)\n const otherId = String(data.roleId ?? '') === ownerId ? data.targetRoleId : data.roleId\n const other = roles.find(role => role.id === otherId)\n ?? roles.find(role => role.name === otherId)\n return (\n <article key={row.id} className=\"dshNovelEntry\">\n <div>\n <div className=\"dshNovelEntryTitle\">{other?.name ?? String(otherId ?? '')} · {String(data.relationType ?? '')}</div>\n {data.content !== undefined && data.content !== '' && (\n <p className=\"dshNovelProse\">{String(data.content)}</p>\n )}\n </div>\n </article>\n )\n })}\n </div>\n )\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { viewData, listEntities, type EntityItem } from '../entity-client.ts'\nimport { EntitySidebar } from '../ui/EntitySidebar.tsx'\nimport { DetailTabs, SectionToolbar } from '../ui/controls.tsx'\nimport { TemplateRead } from '../ui/TemplateRead.tsx'\nimport { TimelinePanel } from '../ui/TimelinePanel.tsx'\nimport { RelationPanel } from '../ui/RelationPanel.tsx'\nimport { emptyHint, useLiveReload } from '../ui/live-reload.ts'\nimport type { ContentSection } from '../../novel/domains.ts'\n\nexport function ListDetailSection({\n path,\n domain,\n template,\n templateSection,\n chapters,\n tree,\n tabs,\n timelineDomain,\n ownerKey,\n}: {\n path: string\n domain: string\n template: unknown\n templateSection: ContentSection\n chapters: EntityItem[]\n tree?: boolean | undefined\n tabs: Array<'detail' | 'timeline' | 'relation'>\n timelineDomain?: string | undefined\n ownerKey?: string | undefined\n}) {\n const [items, setItems] = useState<EntityItem[]>([])\n const [selectedId, setSelectedId] = useState<string | undefined>()\n const [tab, setTab] = useState<'detail' | 'timeline' | 'relation'>('detail')\n const selected = items.find(item => item.id === selectedId)\n const data = viewData(selected)\n\n const reload = useCallback(async () => {\n const rows = await listEntities(path, domain)\n setItems(rows)\n setSelectedId(current => {\n if (current !== undefined && rows.some(row => row.id === current)) return current\n return rows[0]?.id\n })\n }, [domain, path])\n\n useEffect(() => { void reload() }, [reload])\n useLiveReload(reload)\n\n return (\n <>\n <EntitySidebar\n items={items}\n selectedId={selectedId}\n tree={tree}\n onSelect={(id) => { setSelectedId(id); setTab('detail') }}\n />\n <section className=\"dshNovelViewForm\">\n {tabs.length > 1 && selectedId !== undefined && (\n <SectionToolbar\n tabs={(\n <DetailTabs\n tabs={tabs.map(id => ({ id, label: id === 'detail' ? '详情' : id === 'timeline' ? '时间线' : '关系' }))}\n value={tab}\n onChange={setTab}\n />\n )}\n />\n )}\n {selected === undefined ? (\n <div className=\"dshNovelViewFormBody\"><p className=\"dshNovelViewMuted\">{emptyHint()}</p></div>\n ) : tab === 'detail' ? (\n <div className=\"dshNovelViewFormBody\">\n <h2 className=\"dshNovelTitle\">{String(data.name ?? '未命名')}</h2>\n <TemplateRead template={template} section={templateSection} value={data} />\n </div>\n ) : tab === 'timeline' && timelineDomain && ownerKey ? (\n <TimelinePanel\n path={path}\n domain={timelineDomain}\n ownerKey={ownerKey}\n ownerId={selectedId!}\n chapters={chapters}\n />\n ) : tab === 'relation' ? (\n <RelationPanel path={path} ownerId={selectedId!} roles={items} />\n ) : null}\n </section>\n </>\n )\n}\n","import { ListDetailSection } from './ListDetailSection.tsx'\nimport type { SectionPageProps } from './types.ts'\n\nexport function RoleSection(props: SectionPageProps) {\n return (\n <ListDetailSection\n {...props}\n domain=\"role\"\n templateSection=\"role\"\n tabs={['detail', 'relation', 'timeline']}\n timelineDomain=\"roleTimeline\"\n ownerKey=\"roleId\"\n />\n )\n}\n\nexport function CreatureSection(props: SectionPageProps) {\n return (\n <ListDetailSection\n {...props}\n domain=\"creature\"\n templateSection=\"creature\"\n tabs={['detail', 'timeline']}\n timelineDomain=\"creatureTimeline\"\n ownerKey=\"creatureId\"\n />\n )\n}\n\nexport function ItemSection(props: SectionPageProps) {\n return (\n <ListDetailSection\n {...props}\n domain=\"item\"\n templateSection=\"item\"\n tabs={['detail', 'timeline']}\n timelineDomain=\"itemTimeline\"\n ownerKey=\"itemId\"\n />\n )\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { Pill } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { asRecord, viewData, listEntities, type EntityItem } from '../entity-client.ts'\nimport { emptyLevelSystem } from '../noveel-shapes.ts'\nimport { EntitySidebar } from '../ui/EntitySidebar.tsx'\nimport { DetailTabs, SectionToolbar } from '../ui/controls.tsx'\nimport { ReadField } from '../ui/TemplateRead.tsx'\nimport { emptyHint, useLiveReload } from '../ui/live-reload.ts'\nimport type { SectionPageProps } from './types.ts'\n\nfunction parseSystem(data: Record<string, unknown>) {\n const system = asRecord(data.system)\n const levels = Array.isArray(system.levels) ? system.levels : emptyLevelSystem().levels\n return {\n name: String(system.name ?? ''),\n description: String(system.description ?? ''),\n levels: levels.map((row) => {\n const rec = asRecord(row)\n const subs = Array.isArray(rec.subLevels) ? rec.subLevels : []\n return {\n name: String(rec.name ?? ''),\n promotionCondition: String(rec.promotionCondition ?? ''),\n abilities: String(rec.abilities ?? ''),\n subLevels: subs.map(sub => String(asRecord(sub).name ?? '')).filter(Boolean),\n }\n }),\n }\n}\n\nexport function LevelSection({ path }: SectionPageProps) {\n const [items, setItems] = useState<EntityItem[]>([])\n const [selectedId, setSelectedId] = useState<string | undefined>()\n const [tab, setTab] = useState<'detail' | 'tiers'>('detail')\n const selected = items.find(item => item.id === selectedId)\n const data = viewData(selected)\n const system = parseSystem(data)\n\n const reload = useCallback(async () => {\n const rows = await listEntities(path, 'level')\n setItems(rows)\n setSelectedId(current => (current !== undefined && rows.some(row => row.id === current) ? current : rows[0]?.id))\n }, [path])\n useEffect(() => { void reload() }, [reload])\n useLiveReload(reload)\n\n return (\n <>\n <EntitySidebar\n items={items}\n selectedId={selectedId}\n label={(item) => {\n const rec = asRecord(item.data)\n const system = asRecord(rec.system)\n const named = item.name ?? (typeof system.name === 'string' ? system.name : undefined)\n return named ?? item.id\n }}\n onSelect={(id) => { setSelectedId(id); setTab('detail') }}\n />\n <section className=\"dshNovelViewForm\">\n {selectedId !== undefined && (\n <SectionToolbar\n tabs={(\n <DetailTabs\n tabs={[{ id: 'detail', label: '详情' }, { id: 'tiers', label: '档位' }]}\n value={tab}\n onChange={setTab}\n />\n )}\n />\n )}\n {selected === undefined ? (\n <div className=\"dshNovelViewFormBody\"><p className=\"dshNovelViewMuted\">{emptyHint()}</p></div>\n ) : tab === 'detail' ? (\n <div className=\"dshNovelViewFormBody\">\n <h2 className=\"dshNovelTitle\">{String(data.name || system.name || '未命名')}</h2>\n {system.description !== '' && <p className=\"dshNovelProse\">{system.description}</p>}\n <ReadField label=\"体系\">{system.name}</ReadField>\n </div>\n ) : (\n <div className=\"dshNovelViewFormBody\">\n {system.levels.length === 0 && <p className=\"dshNovelViewMuted\">{emptyHint()}</p>}\n {system.levels.map((level, index) => (\n <article key={index} className=\"dshNovelTier\">\n <div className=\"dshNovelEntryTitle\">{level.name}</div>\n <div className=\"dshNovelPills\">\n {level.subLevels.map(sub => <Pill key={sub}>{sub}</Pill>)}\n </div>\n <ReadField label=\"突破条件\">{level.promotionCondition}</ReadField>\n <ReadField label=\"能力\">{level.abilities}</ReadField>\n </article>\n ))}\n </div>\n )}\n </section>\n </>\n )\n}\n","const EVENT_TYPE_LABELS: Record<string, string> = {\n plot: '主线',\n conflict: '冲突',\n suspense: '悬念',\n foreshadow: '伏笔',\n turning: '转折',\n resolution: '收束',\n other: '其他',\n}\n\nconst TRACKED_EVENT_TYPES = new Set(['conflict', 'suspense', 'foreshadow'])\n\nfunction asEventType(value: unknown): string | undefined {\n if (typeof value !== 'string') return undefined\n const key = value.trim()\n return key.length > 0 ? key : undefined\n}\n\nfunction asResolved(value: unknown): boolean | undefined {\n if (typeof value === 'boolean') return value\n if (value === 'true') return true\n if (value === 'false') return false\n return undefined\n}\n\nexport function timelineEventTypeLabel(eventType: unknown): string | undefined {\n const key = asEventType(eventType)\n if (key === undefined) return undefined\n return EVENT_TYPE_LABELS[key] ?? key\n}\n\nexport function timelineResolvedLabel(eventType: unknown, isResolved: unknown): string | undefined {\n const key = asEventType(eventType)\n if (key === undefined || !TRACKED_EVENT_TYPES.has(key)) return undefined\n const resolved = asResolved(isResolved)\n if (resolved === true) return '已解决'\n return '未解决'\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { viewData, listEntities, type EntityItem } from '../entity-client.ts'\nimport { EntitySidebar } from '../ui/EntitySidebar.tsx'\nimport { ReadField, TemplateRead } from '../ui/TemplateRead.tsx'\nimport { emptyHint, useLiveReload } from '../ui/live-reload.ts'\nimport { timelineEventTypeLabel, timelineResolvedLabel } from '../../novel/timeline-labels.ts'\nimport type { SectionPageProps } from './types.ts'\n\nexport function TimelineSection({ path, template, chapters }: SectionPageProps) {\n const [items, setItems] = useState<EntityItem[]>([])\n const [selectedId, setSelectedId] = useState<string | undefined>()\n const selected = items.find(item => item.id === selectedId)\n const data = viewData(selected)\n const chapter = chapters.find(item => item.id === data.relatedChapterId)\n const typeLabel = timelineEventTypeLabel(data.eventType)\n const resolvedLabel = timelineResolvedLabel(data.eventType, data.isResolved)\n\n const reload = useCallback(async () => {\n const rows = await listEntities(path, 'timeline')\n setItems(rows)\n setSelectedId(current => (current !== undefined && rows.some(row => row.id === current) ? current : rows[0]?.id))\n }, [path])\n useEffect(() => { void reload() }, [reload])\n useLiveReload(reload)\n\n return (\n <>\n <EntitySidebar items={items} selectedId={selectedId} onSelect={setSelectedId} />\n <section className=\"dshNovelViewForm\">\n {selected === undefined ? (\n <div className=\"dshNovelViewFormBody\"><p className=\"dshNovelViewMuted\">{emptyHint()}</p></div>\n ) : (\n <div className=\"dshNovelViewFormBody\">\n <h2 className=\"dshNovelTitle\">{String(data.title ?? data.name ?? '未命名')}</h2>\n <p className=\"dshNovelMeta\">\n {[data.timeLabel, typeLabel, resolvedLabel, chapter?.name].filter(Boolean).map(String).join(' · ')}\n </p>\n {typeLabel !== undefined && <ReadField label=\"类型\">{typeLabel}</ReadField>}\n {resolvedLabel !== undefined && (\n <ReadField label=\"状态\">\n {resolvedLabel === '已解决' && data.resolveChapterNo !== undefined && data.resolveChapterNo !== ''\n ? `${resolvedLabel} · 回收章 ${String(data.resolveChapterNo)}`\n : resolvedLabel}\n </ReadField>\n )}\n <TemplateRead template={template} section=\"timeline\" extra=\"timeline\" value={data} />\n </div>\n )}\n </section>\n </>\n )\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { dataOf, viewData, listEntities, type EntityItem } from '../entity-client.ts'\nimport { EntitySidebar } from '../ui/EntitySidebar.tsx'\nimport { TemplateRead } from '../ui/TemplateRead.tsx'\nimport { emptyHint, useLiveReload } from '../ui/live-reload.ts'\nimport { outlineKindOf, outlineNodeLabel, sortByOrdinalName } from '../../novel/outline-labels.ts'\nimport type { SectionPageProps } from './types.ts'\n\nfunction labelData(item: EntityItem): Record<string, unknown> {\n const data = dataOf(item)\n return { ...data, name: item.name ?? data.name }\n}\n\nexport function OutlineSection({ path, template }: SectionPageProps) {\n const [items, setItems] = useState<EntityItem[]>([])\n const [selectedId, setSelectedId] = useState<string | undefined>()\n const selected = items.find(item => item.id === selectedId)\n const data = viewData(selected)\n const isChapter = outlineKindOf(data) === 'chapter_segment'\n const parent = items.find(item => item.id === data.parentId)\n const parentLabel = parent === undefined ? undefined : outlineNodeLabel(labelData(parent), parent.name ?? parent.id)\n\n const reload = useCallback(async () => {\n const rows = sortByOrdinalName(await listEntities(path, 'outline'), item => dataOf(item).ordinal)\n setItems(rows)\n setSelectedId(current => (current !== undefined && rows.some(row => row.id === current) ? current : rows[0]?.id))\n }, [path])\n useEffect(() => { void reload() }, [reload])\n useLiveReload(reload)\n\n return (\n <>\n <EntitySidebar\n items={items}\n selectedId={selectedId}\n tree\n label={(item) => outlineNodeLabel(labelData(item), item.name ?? item.id)}\n onSelect={setSelectedId}\n />\n <section className=\"dshNovelViewForm\">\n {selected === undefined ? (\n <div className=\"dshNovelViewFormBody\"><p className=\"dshNovelViewMuted\">{emptyHint()}</p></div>\n ) : (\n <div className=\"dshNovelViewFormBody\">\n <h2 className=\"dshNovelTitle\">{outlineNodeLabel(data, String(data.name ?? '未命名'))}</h2>\n {parentLabel !== undefined && <p className=\"dshNovelMeta\">{parentLabel}</p>}\n <TemplateRead\n template={template}\n section=\"outline\"\n extra={isChapter ? 'chapterSegment' : undefined}\n value={data}\n omitKeys={['name']}\n />\n </div>\n )}\n </section>\n </>\n )\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { dataOf, viewData, listEntities, type EntityItem } from '../entity-client.ts'\nimport { EntitySidebar } from '../ui/EntitySidebar.tsx'\nimport { emptyHint, useLiveReload } from '../ui/live-reload.ts'\nimport { chapterNodeLabel, outlineNodeLabel, sortByOrdinalName } from '../../novel/outline-labels.ts'\nimport type { SectionPageProps } from './types.ts'\n\nfunction labelData(item: EntityItem): Record<string, unknown> {\n const data = dataOf(item)\n return { ...data, name: item.name ?? data.name }\n}\n\nexport function ChapterSection({ path }: SectionPageProps) {\n const [items, setItems] = useState<EntityItem[]>([])\n const [outlines, setOutlines] = useState<EntityItem[]>([])\n const [selectedId, setSelectedId] = useState<string | undefined>()\n const selected = items.find(item => item.id === selectedId)\n const data = viewData(selected)\n const related = outlines.find(item => item.id === data.relatedOutlineId)\n const outlineName = related === undefined\n ? undefined\n : outlineNodeLabel(labelData(related), related.name ?? related.id)\n\n const reload = useCallback(async () => {\n const [rows, outlineRows] = await Promise.all([listEntities(path, 'chapter'), listEntities(path, 'outline')])\n const sorted = sortByOrdinalName(rows, item => dataOf(item).ordinal ?? dataOf(item).chapterNo)\n setItems(sorted)\n setOutlines(outlineRows)\n setSelectedId(current => (current !== undefined && sorted.some(row => row.id === current) ? current : sorted[0]?.id))\n }, [path])\n useEffect(() => { void reload() }, [reload])\n useLiveReload(reload)\n\n return (\n <>\n <EntitySidebar\n items={items}\n selectedId={selectedId}\n label={(item) => chapterNodeLabel(labelData(item), item.name ?? item.id)}\n onSelect={setSelectedId}\n />\n <section className=\"dshNovelViewForm\">\n {selected === undefined ? (\n <div className=\"dshNovelViewFormBody\"><p className=\"dshNovelViewMuted\">{emptyHint()}</p></div>\n ) : (\n <div className=\"dshNovelViewFormBody\">\n <h2 className=\"dshNovelTitle\">{chapterNodeLabel(data, String(data.name ?? data.title ?? '未命名'))}</h2>\n {outlineName !== undefined && <p className=\"dshNovelMeta\">{outlineName}</p>}\n <div className=\"dshNovelProse\">{String(data.content ?? '') || '—'}</div>\n </div>\n )}\n </section>\n </>\n )\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react'\nimport { MarkdownText } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { novelApi } from '../novel-api.ts'\nimport { EntitySidebar } from '../ui/EntitySidebar.tsx'\nimport { emptyHint, useLiveReload } from '../ui/live-reload.ts'\nimport type { EntityItem } from '../entity-client.ts'\n\ninterface SkillItem {\n id: string\n section: string\n folder?: string\n agent_kind?: string\n title: string\n body: string\n}\n\nexport function SkillSection({ path }: { path: string }) {\n const [skills, setSkills] = useState<SkillItem[]>([])\n const [selectedId, setSelectedId] = useState<string | undefined>()\n const selected = skills.find(item => item.id === selectedId)\n\n const reload = useCallback(async () => {\n const rows = await novelApi<SkillItem[]>(`/skills?path=${encodeURIComponent(path)}`)\n setSkills(rows)\n setSelectedId(current => (current !== undefined && rows.some(row => row.id === current) ? current : undefined))\n }, [path])\n useEffect(() => { void reload() }, [reload])\n useLiveReload(reload)\n\n const items = useMemo(() => skillTreeItems(skills), [skills])\n\n return (\n <>\n <EntitySidebar\n className=\"dshNovelSkillTree\"\n files\n tree\n items={items}\n selectedId={selectedId}\n onSelect={setSelectedId}\n />\n <section className=\"dshNovelViewForm\">\n {selected === undefined ? (\n <div className=\"dshNovelViewFormBody\">\n <div className=\"dshNovelViewEmpty\">\n <p className=\"dshNovelViewMuted\">{skills.length === 0 ? emptyHint() : '选择一份技能阅读。'}</p>\n </div>\n </div>\n ) : (\n <div className=\"dshNovelViewFormBody\">\n <article className=\"dshNovelDoc\">\n <p className=\"dshNovelCrumb\">{crumbOf(selected)}</p>\n <div className=\"dshNovelMarkdown\">\n <MarkdownText text={selected.body} />\n </div>\n </article>\n </div>\n )}\n </section>\n </>\n )\n}\n\nfunction crumbOf(skill: SkillItem): string {\n const folder = (skill.folder ?? '').trim()\n return folder.length === 0 ? skill.title : `${folder.replaceAll('/', ' / ')} / ${skill.title}`\n}\n\nfunction skillTreeItems(skills: SkillItem[]): EntityItem[] {\n const folders = new Set<string>()\n for (const skill of skills) {\n const parts = (skill.folder ?? '').split('/').filter(Boolean)\n let acc = ''\n for (const part of parts) {\n acc = acc.length === 0 ? part : `${acc}/${part}`\n folders.add(acc)\n }\n }\n const nodes: EntityItem[] = []\n for (const folder of [...folders].sort()) {\n const parts = folder.split('/')\n const parent = parts.slice(0, -1).join('/')\n nodes.push({\n id: `dir:${folder}`,\n name: parts[parts.length - 1] ?? folder,\n data: { kind: 'folder', parentId: parent.length > 0 ? `dir:${parent}` : '' },\n })\n }\n for (const skill of skills) {\n const folder = (skill.folder ?? '').trim()\n nodes.push({\n id: skill.id,\n name: skill.title,\n data: { kind: 'file', parentId: folder.length > 0 ? `dir:${folder}` : '' },\n })\n }\n return nodes\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport type { ConvViewProps } from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport { Tooltip } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { CONTENT_SECTIONS, DOMAIN_LABELS, type ContentSection } from '../novel/domains.ts'\nimport { novelApi } from './novel-api.ts'\nimport { listEntities, type EntityItem } from './entity-client.ts'\nimport { SectionIcon } from './section-icons.tsx'\nimport { OverviewSection } from './sections/OverviewSection.tsx'\nimport { WorldSection } from './sections/WorldSection.tsx'\nimport { RoleSection, CreatureSection, ItemSection } from './sections/owned-sections.tsx'\nimport { LevelSection } from './sections/LevelSection.tsx'\nimport { TimelineSection } from './sections/TimelineSection.tsx'\nimport { OutlineSection } from './sections/OutlineSection.tsx'\nimport { ChapterSection } from './sections/ChapterSection.tsx'\nimport { SkillSection } from './sections/SkillSection.tsx'\nimport { useLiveReload } from './ui/live-reload.ts'\n\nconst sessionMemory = new Map<string, ContentSection>()\n\n/** Novel workspace occupying the conversation.view tab. Does not switch the active view. */\nexport function NovelWorkspaceView({ sessionId, useSessions }: ConvViewProps) {\n const workspacePath = useSessions((state) => {\n const session = state.byId[sessionId] as { cwd?: string, header?: { cwd?: string } } | undefined\n return session?.cwd ?? session?.header?.cwd\n })\n\n const [section, setSection] = useState<ContentSection>(sessionMemory.get(sessionId) ?? 'overview')\n const [isNovel, setIsNovel] = useState(false)\n const [template, setTemplate] = useState<unknown>()\n const [chapters, setChapters] = useState<EntityItem[]>([])\n const [styles, setStyles] = useState<Array<{ id: string, name: string }>>([])\n\n useEffect(() => { sessionMemory.set(sessionId, section) }, [section, sessionId])\n\n const refreshStatus = useCallback(async () => {\n if (workspacePath === undefined) {\n setIsNovel(false)\n return\n }\n const status = await novelApi<{ novel: boolean }>(`/status?path=${encodeURIComponent(workspacePath)}`)\n setIsNovel(status.novel)\n if (!status.novel) return\n const listed = await novelApi<Array<{ id: string, name: string }>>(`/styles?path=${encodeURIComponent(workspacePath)}`).catch(() => [])\n if (listed.length > 0) setStyles(listed)\n setTemplate(await novelApi<unknown>(`/template?path=${encodeURIComponent(workspacePath)}`))\n setChapters(await listEntities(workspacePath, 'chapter'))\n }, [workspacePath])\n\n useEffect(() => { void refreshStatus() }, [refreshStatus])\n useLiveReload(refreshStatus)\n\n const pageProps = {\n path: workspacePath ?? '',\n template,\n chapters,\n }\n\n if (workspacePath === undefined) {\n return (\n <div className=\"dshNovelView\">\n <div className=\"dshNovelViewEmpty\">\n <p>先在左侧打开或新建会话,并绑定工作区目录。</p>\n </div>\n </div>\n )\n }\n\n if (!isNovel) {\n return (\n <div className=\"dshNovelView\">\n <div className=\"dshNovelViewEmpty\">\n <p>当前目录还不是小说工作区。</p>\n <p className=\"dshNovelViewMuted\">在对话里让 AI 初始化小说工作区。</p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"dshNovelView\">\n <nav className=\"dshNovelViewRail\" aria-label=\"小说分区\">\n {CONTENT_SECTIONS.map(key => (\n <Tooltip key={key} label={DOMAIN_LABELS[key]} side=\"right\">\n <button\n type=\"button\"\n className=\"dshNovelViewRailBtn\"\n data-active={section === key || undefined}\n aria-label={DOMAIN_LABELS[key]}\n onClick={() => { setSection(key) }}\n >\n <SectionIcon section={key} />\n </button>\n </Tooltip>\n ))}\n </nav>\n {section === 'overview' && <OverviewSection path={workspacePath} template={template} styles={styles} />}\n {section === 'world' && <WorldSection {...pageProps} />}\n {section === 'role' && <RoleSection {...pageProps} />}\n {section === 'creature' && <CreatureSection {...pageProps} />}\n {section === 'item' && <ItemSection {...pageProps} />}\n {section === 'level' && <LevelSection {...pageProps} />}\n {section === 'timeline' && <TimelineSection {...pageProps} />}\n {section === 'outline' && <OutlineSection {...pageProps} />}\n {section === 'chapter' && <ChapterSection {...pageProps} />}\n {section === 'skill' && <SkillSection path={workspacePath} />}\n </div>\n )\n}\n","const NOVEL_STYLES = `\n.dshNovelView { display: flex; height: 100%; min-height: 0; width: 100%; overflow: hidden; color: var(--dsw-alias-label-primary, inherit); font-size: 13px; line-height: 1.45; background: var(--dsw-alias-bg-base); }\n.dshNovelViewRail { display: flex; flex-direction: column; gap: 2px; width: 46px; flex-shrink: 0; overflow: auto; padding: 8px 4px; border-right: 1px solid var(--dsw-alias-border-l2); }\n.dshNovelViewRail button { appearance: none; display: inline-flex; align-items: center; justify-content: center; width: 38px; height: 38px; padding: 0; border: 0; border-radius: 8px; background: transparent; color: var(--dsw-alias-label-secondary, inherit); cursor: pointer; transition-property: transform, background-color, color; transition-duration: 120ms; transition-timing-function: cubic-bezier(0.2, 0, 0, 1); }\n.dshNovelViewRail button:hover { background: var(--dsw-alias-interactive-bg-hover); color: var(--dsw-alias-label-primary, inherit); }\n.dshNovelViewRail button:active { transform: scale(0.96); }\n.dshNovelViewRail button[data-active] { background: var(--dsw-alias-interactive-bg-hover); color: var(--dsw-alias-label-primary, inherit); }\n.dshNovelViewList { display: flex; flex-direction: column; width: 200px; flex-shrink: 0; min-width: 0; min-height: 0; border-right: 1px solid var(--dsw-alias-border-l2); overflow: hidden; }\n.dshNovelSkillTree { width: 240px; }\n.dshNovelViewListToolbar { display: flex; align-items: center; gap: 4px; padding: 8px 8px 4px; min-width: 0; overflow: hidden; }\n.dshNovelViewSearch { display: flex; flex: 1; min-width: 0; overflow: hidden; box-sizing: border-box; }\n.dshNovelViewSearch > span, .dshNovelInput { display: flex !important; width: 100%; min-width: 0; max-width: 100%; box-sizing: border-box; }\n.dshNovelControl { display: block; width: 100%; max-width: 100%; box-sizing: border-box; min-width: 0; border: 1px solid var(--dsw-alias-border-l2); border-radius: 8px; background: var(--dsw-alias-bg-layer-1, var(--dsw-alias-bg-base)); color: var(--dsw-alias-label-primary, inherit); padding: 5px 8px; font-size: 14px; line-height: 22px; }\n.dshNovelControl:focus { outline: none; border-color: var(--dsw-alias-brand-primary); }\ntextarea.dshNovelControl { min-height: 88px; resize: vertical; }\n.dshNovelJsonEditor { flex: 1; min-height: 0; height: 100%; width: 100%; resize: none; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; line-height: 18px; padding: 12px; border: 0; border-radius: 12px; background: var(--dsw-alias-markdown-code-block, var(--dsw-alias-bg-layer-1)); color: var(--dsw-alias-label-primary, inherit); box-sizing: border-box; }\n.dshNovelJsonEditor:focus { outline: none; box-shadow: inset 0 0 0 1px var(--dsw-alias-brand-primary); }\n.dshNovelTabs { display: flex; gap: 36px; margin-top: 4px; padding-left: 8px; min-height: 0; }\n.dshNovelTabs button { appearance: none; position: relative; padding: 0 0 11px; border: 0; background: transparent; font-size: 13px; line-height: 16px; font-weight: 500; color: var(--dsw-alias-label-tertiary); cursor: pointer; }\n.dshNovelTabs button::after { content: \"\"; position: absolute; right: 0; bottom: 1px; left: 0; height: 2px; border-radius: 2px; background: transparent; }\n.dshNovelTabs button[data-active] { color: var(--dsw-alias-state-business-primary); }\n.dshNovelTabs button[data-active]::after { background: var(--dsw-alias-state-business-primary); }\n.dshNovelEntry { display: flex; flex-direction: column; gap: 6px; padding: 10px 12px; border: 1px solid var(--dsw-alias-border-l2); border-radius: 6px; }\n.dshNovelEntryTitle { font-size: 14px; font-weight: 500; line-height: 22px; }\n.dshNovelTier { display: flex; flex-direction: column; gap: 8px; padding: 12px; border: 1px solid var(--dsw-alias-border-l2); border-radius: 6px; }\n.dshNovelPills { display: flex; flex-wrap: wrap; gap: 6px; }\n.dshNovelTitle { margin: 0; font-size: 20px; font-weight: 600; line-height: 28px; }\n.dshNovelMeta { margin: 0; color: var(--dsw-alias-label-secondary); font-size: 13px; line-height: 20px; }\n.dshNovelProse { margin: 0; white-space: pre-wrap; font-size: 14px; line-height: 24px; }\n.dshNovelReadValue { white-space: pre-wrap; font-size: 14px; line-height: 22px; color: var(--dsw-alias-label-primary, inherit); }\n.dshNovelViewListBody { flex: 1; min-height: 0; overflow: auto; padding: 4px 6px 12px; }\n.dshNovelViewRow { appearance: none; display: flex; align-items: center; gap: 6px; width: 100%; min-height: 32px; text-align: left; border: 0; background: transparent; color: inherit; padding: 0 8px; border-radius: 6px; cursor: pointer; transition-property: transform, background-color, color; transition-duration: 120ms; transition-timing-function: cubic-bezier(0.2, 0, 0, 1); }\n.dshNovelViewRow:hover { background: var(--dsw-alias-interactive-bg-hover); }\n.dshNovelViewRow:active { transform: scale(0.96); }\n.dshNovelViewRow[data-active] { background: var(--dsw-alias-interactive-bg-hover); color: var(--dsw-alias-label-primary); }\n.dshNovelViewRow[data-kind=\"folder\"] { color: var(--dsw-alias-label-secondary); font-weight: 500; }\n.dshNovelViewRowIcon { display: inline-flex; width: 16px; height: 16px; flex-shrink: 0; color: currentColor; }\n.dshNovelViewChevron { display: inline-flex; align-items: center; justify-content: center; width: 14px; flex-shrink: 0; transition-property: transform; transition-duration: 120ms; color: var(--dsw-alias-label-tertiary, inherit); }\n.dshNovelViewChevron[data-open] { transform: rotate(90deg); }\n.dshNovelDoc { display: flex; flex-direction: column; gap: 12px; max-width: 680px; width: 100%; }\n.dshNovelCrumb { margin: 0; font-size: 12px; line-height: 18px; color: var(--dsw-alias-label-tertiary); }\n.dshNovelMarkdown { font-size: 14px; line-height: 24px; color: var(--dsw-alias-label-primary); }\n.dshNovelViewForm { flex: 1; min-width: 0; min-height: 0; display: flex; flex-direction: column; overflow: hidden; }\n.dshNovelViewFormHead { display: flex; align-items: flex-end; justify-content: space-between; gap: 12px; padding: 4px 16px 0 12px; border-bottom: 1px solid var(--dsw-alias-border-l2); min-width: 0; }\n.dshNovelViewFormHeadTabs { min-width: 0; overflow: hidden; }\n.dshNovelViewFormHeadActions { display: flex; flex: none; align-items: center; gap: 8px; margin-left: auto; padding-bottom: 6px; }\n.dshNovelViewFormBody { flex: 1; min-height: 0; overflow: auto; padding: 12px; display: flex; flex-direction: column; gap: 12px; }\n.dshNovelViewField { display: flex; flex-direction: column; gap: 4px; }\n.dshNovelViewField label { font-size: 12px; color: var(--dsw-alias-label-secondary, inherit); }\n.dshNovelViewEmpty { margin: auto; padding: 32px 20px; display: flex; flex-direction: column; gap: 12px; max-width: 420px; width: 100%; }\n.dshNovelViewMuted { color: var(--dsw-alias-label-secondary, inherit); font-size: 12px; }\n.dshNovelViewError { color: var(--dsw-alias-state-error-primary, tomato); font-size: 12px; }\n`\n\nexport function installNovelStyles(): () => void {\n const style = document.createElement('style')\n style.dataset.plugin = 'dsh-novel'\n style.dataset.pluginCss = 'dsh-novel/content'\n style.textContent = NOVEL_STYLES\n document.head.appendChild(style)\n return () => { style.remove() }\n}\n","import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport { NovelWorkspaceView } from './NovelWorkspaceView.tsx'\nimport { installNovelStyles } from './styles.ts'\n\nexport const inject = ['slots', 'sessions']\n\nexport function apply(ctx: ClientContext): void {\n ctx.effect(\n () => installNovelStyles(),\n 'dsh-novel: content tab styles',\n )\n ctx.slots.inject('conversation.view', () => ctx.slots.register({\n name: 'conversation.view',\n id: 'novel',\n order: 20,\n label: () => '内容',\n }, NovelWorkspaceView))\n}\n"],"mappings":"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"}
|