@oh-story/dsh 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/lib/client.js +7 -0
- package/lib/client.js.map +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,14 +18,14 @@
|
|
|
18
18
|
## 安装
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
|
-
npx -y @deepseek-ai/dsh@0.1.1-rc.1 plugin --profile web add @oh-story/dsh@0.1.
|
|
21
|
+
npx -y @deepseek-ai/dsh@0.1.1-rc.1 plugin --profile web add @oh-story/dsh@0.1.3
|
|
22
22
|
npx -y @deepseek-ai/dsh@0.1.1-rc.1 web
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
也可以直接安装 GitHub Release 中的预构建包:
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
-
npx -y @deepseek-ai/dsh@0.1.1-rc.1 plugin --profile web add https://github.com/worldwonderer/oh-story-dsh/releases/download/v0.1.
|
|
28
|
+
npx -y @deepseek-ai/dsh@0.1.1-rc.1 plugin --profile web add https://github.com/worldwonderer/oh-story-dsh/releases/download/v0.1.3/oh-story-dsh-0.1.3.tgz
|
|
29
29
|
npx -y @deepseek-ai/dsh@0.1.1-rc.1 web
|
|
30
30
|
```
|
|
31
31
|
|
package/lib/client.js
CHANGED
|
@@ -542,8 +542,10 @@ var plugin_default = `.oh-story-bridge-marker { display: none; }
|
|
|
542
542
|
overflow-y: auto;
|
|
543
543
|
position: relative;
|
|
544
544
|
scrollbar-gutter: stable;
|
|
545
|
+
scroll-padding-bottom: calc(var(--dsh-composer-height, 152px) + 16px);
|
|
545
546
|
}
|
|
546
547
|
|
|
548
|
+
/* Keep the final Chat flow above the overlapping official Composer. */
|
|
547
549
|
[data-conversation-scroll]:has(> [data-slot="conversation.session"] > .oh-story-split-surface)
|
|
548
550
|
> [data-slot="conversation.session"] > :not(.oh-story-split-surface) {
|
|
549
551
|
grid-column: 3;
|
|
@@ -553,6 +555,11 @@ var plugin_default = `.oh-story-bridge-marker { display: none; }
|
|
|
553
555
|
border-left: 1px solid var(--os-border);
|
|
554
556
|
}
|
|
555
557
|
|
|
558
|
+
[data-conversation-scroll]:has(> [data-slot="conversation.session"] > .oh-story-split-surface)
|
|
559
|
+
[data-chat-flow] {
|
|
560
|
+
padding-bottom: calc(var(--dsh-composer-height, 152px) + 16px);
|
|
561
|
+
}
|
|
562
|
+
|
|
556
563
|
[data-conversation-scroll]:has(> [data-slot="conversation.session"] > .oh-story-split-surface)
|
|
557
564
|
> [data-composer-seat] {
|
|
558
565
|
grid-column: 3;
|
package/lib/client.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/client/index.tsx", "../src/client/file-activity.ts", "../src/client/file-tree.ts", "../src/client/jsonl-preview.tsx", "../src/client/markdown-preview.tsx", "inline-css:/home/runner/work/oh-story-dsh/oh-story-dsh/packages/dsh-plugin/src/client/plugin.css"],
|
|
4
|
-
"sourcesContent": ["import { defineStore, type ClientContext, type PartialAssistant, type RunningToolCall } from \"@deepseek-ai/dsh-client-runtime/client\";\nimport type {} from \"@deepseek-ai/dsh-client-ui-layout/client\";\nimport type { PropsRenderSlots, PropsRuntime, PropsStore } from \"@deepseek-ai/dsh-client-ui-slots\";\nimport type { ToolCallViewProps } from \"@deepseek-ai/dsh-client-ui-tool/client\";\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, type CSSProperties, type KeyboardEvent as ReactKeyboardEvent } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n creativeRelativePath,\n fileMutations,\n latestSettledMutation,\n mutatingCallIds,\n previewMutation,\n streamingAssistant,\n workbenchModeForPath,\n type WorkbenchMode\n} from \"./file-activity.js\";\nimport { buildFileTree, type FileTreeNode } from \"./file-tree.js\";\nimport { JsonlPreview } from \"./jsonl-preview.js\";\nimport { MarkdownPreview } from \"./markdown-preview.js\";\nimport styles from \"./plugin.css?inline\";\n\nexport const name = \"oh-story\";\nexport const inject = [\"slots\"];\n\ndeclare module \"@deepseek-ai/dsh-client-ui-slots\" {\n interface SlotMap {\n \"oh-story.workspace\": { kind: \"single\"; scope: \"session\" };\n }\n}\n\ninterface WorkspaceFile { readonly path: string; readonly bytes: number; readonly version: string }\ninterface WorkspacePayload {\n readonly cwd: string;\n readonly files: readonly WorkspaceFile[];\n readonly shortDrama: Record<string, unknown> | null;\n readonly metadataErrors: readonly string[];\n readonly mode: \"dsh-session\";\n}\ninterface FilePayload {\n readonly path: string;\n readonly content: string;\n readonly bytes: number;\n readonly version: string;\n}\ninterface FileBuffer {\n readonly content: string;\n readonly saved: string;\n readonly source: \"disk\" | \"human\" | \"agent\";\n readonly version: string;\n readonly saving?: boolean | undefined;\n readonly error?: string | undefined;\n readonly missing?: boolean | undefined;\n readonly conflict?: {\n readonly message: string;\n readonly theirs?: string | undefined;\n readonly theirsVersion?: string | undefined;\n } | undefined;\n}\n\ninterface WorkbenchMemory {\n buffers: Record<string, FileBuffer>;\n editorMode: \"preview\" | \"source\";\n expanded: Record<string, boolean>;\n selected: string | undefined;\n workbench: WorkbenchMode;\n}\n\ntype Update<T> = T | ((current: T) => T);\n\nfunction applyUpdate<T>(current: T, update: Update<T>): T {\n return typeof update === \"function\" ? (update as (value: T) => T)(current) : update;\n}\n\nfunction createWorkbenchStore() {\n return defineStore({\n init: (): WorkbenchMemory => ({\n buffers: {},\n editorMode: \"preview\",\n expanded: {},\n selected: undefined,\n workbench: \"story\"\n }),\n actions: {\n setBuffers: (draft, update: Update<Record<string, FileBuffer>>) => {\n draft.buffers = applyUpdate(draft.buffers, update);\n },\n setEditorMode: (draft, update: Update<WorkbenchMemory[\"editorMode\"]>) => {\n draft.editorMode = applyUpdate(draft.editorMode, update);\n },\n setExpanded: (draft, update: Update<Record<string, boolean>>) => {\n draft.expanded = applyUpdate(draft.expanded, update);\n },\n setSelected: (draft, update: Update<string | undefined>) => {\n draft.selected = applyUpdate(draft.selected, update);\n },\n setWorkbench: (draft, update: Update<WorkbenchMode>) => {\n draft.workbench = applyUpdate(draft.workbench, update);\n }\n }\n });\n}\n\nclass WorkspaceRequestError extends Error {\n constructor(readonly status: number, message: string) { super(message); }\n}\n\nconst GROUP_ORDER: Readonly<Record<WorkbenchMode, readonly string[]>> = {\n story: [\"\u6B63\u6587\", \"\u5927\u7EB2\", \"\u8BBE\u5B9A\", \"\u8FFD\u8E2A\", \"\u5BF9\u6807\", \"\u53C2\u8003\u8D44\u6599\"],\n drama: [\"\u9879\u76EE\", \"\u8F93\u5165\", \"\u9879\u76EE\u5F00\u53D1\", \"\u8BBE\u5B9A\u96C6\", \"\u5267\u96C6\", \"\u5BA1\u67E5\", \"\u521B\u4F5C\u8005\u51B3\u7B56\", \"\u4EA4\u4ED8\"]\n};\n\nconst WORKBENCH_MODES = [\"story\", \"drama\"] as const;\nconst EDITOR_MODES = [\"preview\", \"source\"] as const;\n\nfunction handleTabKey<T extends string>(\n event: ReactKeyboardEvent<HTMLButtonElement>,\n values: readonly T[],\n current: T,\n select: (value: T) => void\n): void {\n let index: number | undefined;\n if (event.key === \"Home\") index = 0;\n else if (event.key === \"End\") index = values.length - 1;\n else if (event.key === \"ArrowRight\") index = (values.indexOf(current) + 1) % values.length;\n else if (event.key === \"ArrowLeft\") index = (values.indexOf(current) - 1 + values.length) % values.length;\n if (index === undefined) return;\n event.preventDefault();\n const value = values[index];\n if (value === undefined) return;\n select(value);\n event.currentTarget.parentElement?.querySelectorAll<HTMLButtonElement>(\"[role='tab']\")[index]?.focus();\n}\n\nfunction groupForPath(path: string): string {\n return path === \"short-drama.json\" ? \"\u9879\u76EE\" : path.split(\"/\", 1)[0] ?? \"\u5176\u4ED6\";\n}\n\nfunction preferredFile(files: readonly WorkspaceFile[], mode: WorkbenchMode): string | undefined {\n const matching = files.filter((file) => workbenchModeForPath(file.path) === mode);\n const preferences = mode === \"story\"\n ? [/^\u6B63\u6587\\/.*\\.md$/u, /^\u5927\u7EB2\\/.*\\.md$/u, /\\.md$/u]\n : [/^\u5267\u96C6\\/EP0*1\\/screenplay\\.md$/iu, /^\u5267\u96C6\\/.*\\/screenplay\\.md$/iu, /^\u9879\u76EE\u5F00\u53D1\\/creative-brief\\.md$/u, /^\u8F93\u5165\\/.*\\.md$/u, /\\.md$/u, /^short-drama\\.json$/u];\n for (const pattern of preferences) {\n const match = matching.find((file) => pattern.test(file.path));\n if (match !== undefined) return match.path;\n }\n return matching[0]?.path;\n}\n\nfunction endpoint(path: string, sessionId: string, file?: string): string {\n const url = new URL(`/oh-story/${path}`, globalThis.location.origin);\n url.searchParams.set(\"sessionId\", sessionId);\n if (file !== undefined) url.searchParams.set(\"path\", file);\n return url.toString();\n}\n\nasync function json<T>(response: Response): Promise<T> {\n const value = await response.json() as T & { readonly error?: string };\n if (!response.ok) throw new WorkspaceRequestError(response.status, value.error ?? `HTTP ${String(response.status)}`);\n return value;\n}\n\nfunction FileTreeNodes({\n nodes,\n depth,\n expanded,\n selected,\n activityPath,\n onToggle,\n onSelect\n}: {\n readonly nodes: readonly FileTreeNode[];\n readonly depth: number;\n readonly expanded: Readonly<Record<string, boolean>>;\n readonly selected: string | undefined;\n readonly activityPath: string | undefined;\n readonly onToggle: (path: string, open: boolean) => void;\n readonly onSelect: (path: string) => void;\n}) {\n return <>{nodes.map((node) => {\n if (node.kind === \"file\") return <button\n type=\"button\"\n key={node.path}\n style={{ \"--oh-story-indent\": `${String(depth * 14)}px` } as CSSProperties}\n title={node.path}\n aria-label={node.path}\n data-file-path={node.path}\n data-agent-target={node.path === activityPath || undefined}\n aria-current={node.path === selected ? \"page\" : undefined}\n onClick={() => { onSelect(node.path); }}\n >{node.name}</button>;\n const open = selected?.startsWith(`${node.path}/`) === true || expanded[node.path] === true;\n return <details className=\"oh-story-file-folder\" key={node.path} open={open} onToggle={(event) => { onToggle(node.path, event.currentTarget.open); }}>\n <summary style={{ \"--oh-story-indent\": `${String(depth * 14)}px` } as CSSProperties} title={node.path}>{node.name}<span>{node.fileCount}</span></summary>\n <FileTreeNodes\n nodes={node.children}\n depth={depth + 1}\n expanded={expanded}\n selected={selected}\n activityPath={activityPath}\n onToggle={onToggle}\n onSelect={onSelect}\n />\n </details>;\n })}</>;\n}\n\nfunction useWorkspace(sessionId: string): {\n readonly workspace: WorkspacePayload | undefined;\n readonly error: string | undefined;\n readonly loading: boolean;\n readonly reload: () => void;\n} {\n const [version, setVersion] = useState(0);\n const [workspace, setWorkspace] = useState<WorkspacePayload>();\n const [error, setError] = useState<string>();\n const [loading, setLoading] = useState(true);\n const reload = useCallback(() => {\n setLoading(true);\n setVersion((value) => value + 1);\n }, []);\n useEffect(() => {\n const controller = new AbortController();\n setError(undefined);\n void fetch(endpoint(\"workspace\", sessionId), { signal: controller.signal })\n .then((response) => json<WorkspacePayload>(response))\n .then(setWorkspace)\n .catch((reason: unknown) => {\n if (!controller.signal.aborted) setError(reason instanceof Error ? reason.message : String(reason));\n })\n .finally(() => { if (!controller.signal.aborted) setLoading(false); });\n return () => { controller.abort(); };\n }, [sessionId, version]);\n return { workspace, error, loading, reload };\n}\n\nfunction CreativeWorkbench({\n sessionId,\n runningCalls,\n partial,\n settledMutation,\n useStore,\n actions\n}: {\n readonly sessionId: string;\n readonly runningCalls: readonly RunningToolCall[];\n readonly partial: PartialAssistant | null;\n readonly settledMutation: string | undefined;\n} & Pick<WorkbenchSlotProps, \"useStore\" | \"actions\">) {\n const { workspace, error, loading: workspaceLoading, reload } = useWorkspace(sessionId);\n const activities = useMemo(\n () => fileMutations(runningCalls, partial),\n [partial, runningCalls]\n );\n const normalizedActivities = useMemo(() => activities.flatMap((activity) => {\n const path = creativeRelativePath(activity.path, workspace?.cwd);\n return path === undefined ? [] : [{ activity, path }];\n }), [activities, workspace?.cwd]);\n const primaryActivity = normalizedActivities.at(-1);\n const activityPaths = useMemo(() => new Set(normalizedActivities.map((value) => value.path)), [normalizedActivities]);\n const activity = primaryActivity?.activity;\n const activityPath = primaryActivity?.path;\n const workbench = useStore((memory) => memory.workbench);\n const setWorkbench = actions.setWorkbench;\n const initializedWorkbench = useRef(false);\n const selected = useStore((memory) => memory.selected);\n const setSelected = actions.setSelected;\n const buffers = useStore((memory) => memory.buffers);\n const setBuffers = actions.setBuffers;\n const buffersRef = useRef<Record<string, FileBuffer>>({});\n const expanded = useStore((memory) => memory.expanded);\n const setExpanded = actions.setExpanded;\n const surfaceRef = useRef<HTMLDivElement>(null);\n const navRef = useRef<HTMLElement>(null);\n const activityBases = useRef(new Map<string, { readonly path: string; readonly base: string }>());\n const previousSignals = useRef<ReadonlySet<string>>(new Set());\n const previousSettledMutation = useRef(settledMutation);\n const saveLocks = useRef(new Set<string>());\n const buffer = selected === undefined ? undefined : buffers[selected];\n const dirty = buffer?.source === \"human\" && buffer.content !== buffer.saved;\n const saving = buffer?.saving === true;\n const fileError = buffer?.error;\n const conflict = buffer?.conflict;\n const selectedLower = selected?.toLocaleLowerCase();\n const markdown = selectedLower?.endsWith(\".md\") === true;\n const jsonl = selectedLower?.endsWith(\".jsonl\") === true;\n const structured = jsonl || selectedLower?.endsWith(\".json\") === true;\n const previewable = markdown || jsonl;\n const editorMode = useStore((memory) => memory.editorMode);\n const setEditorMode = actions.setEditorMode;\n const modeSelection = useRef(selected);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const editorPositions = useRef(new Map<string, { readonly scrollTop: number; readonly selectionStart: number; readonly selectionEnd: number }>());\n const editorReady = buffer !== undefined && buffer.missing !== true;\n const availableModes = useMemo(() => {\n const value = new Set<WorkbenchMode>();\n for (const file of workspace?.files ?? []) {\n const mode = workbenchModeForPath(file.path);\n if (mode !== undefined) value.add(mode);\n }\n return WORKBENCH_MODES.filter((mode) => value.has(mode));\n }, [workspace?.files]);\n const showModeTabs = workspace !== undefined && availableModes.length !== 1;\n const workspaceKind = availableModes.length === 1 ? availableModes[0] : undefined;\n\n useEffect(() => { buffersRef.current = buffers; }, [buffers]);\n\n const rememberEditorPosition = useCallback((): void => {\n const element = textareaRef.current;\n if (element === null || selected === undefined || element.getAttribute(\"aria-label\") !== selected) return;\n editorPositions.current.set(selected, {\n scrollTop: element.scrollTop,\n selectionStart: element.selectionStart,\n selectionEnd: element.selectionEnd\n });\n }, [selected]);\n\n useLayoutEffect(() => {\n if (editorMode !== \"source\" || selected === undefined || !editorReady) return;\n const element = textareaRef.current;\n const position = editorPositions.current.get(selected);\n if (element === null || position === undefined) return;\n const end = Math.min(position.selectionEnd, element.value.length);\n element.setSelectionRange(Math.min(position.selectionStart, end), end);\n element.scrollTop = position.scrollTop;\n }, [editorMode, editorReady, selected]);\n\n useEffect(() => {\n const warn = (event: BeforeUnloadEvent): void => {\n if (!Object.values(buffersRef.current).some((value) => value.source === \"human\" && value.content !== value.saved)) return;\n event.preventDefault();\n };\n globalThis.addEventListener(\"beforeunload\", warn);\n return () => { globalThis.removeEventListener(\"beforeunload\", warn); };\n }, []);\n\n const expandPath = useCallback((path: string): void => {\n const segments = path.split(\"/\");\n const ancestors = [groupForPath(path)];\n for (let index = 1; index < segments.length - 1; index += 1) ancestors.push(segments.slice(0, index + 1).join(\"/\"));\n setExpanded((current) => {\n const next = { ...current };\n for (const ancestor of ancestors) next[ancestor] = true;\n return next;\n });\n }, []);\n\n const revealPath = useCallback((path: string): void => {\n rememberEditorPosition();\n setWorkbench(workbenchModeForPath(path) ?? \"story\");\n setSelected(path);\n expandPath(path);\n }, [expandPath, rememberEditorPosition]);\n\n const followAgentPath = useCallback((path: string): void => {\n expandPath(path);\n const current = selected === undefined ? undefined : buffersRef.current[selected];\n const preserveFocusedDraft = path !== selected\n && current?.source === \"human\"\n && current.content !== current.saved\n && surfaceRef.current?.ownerDocument.activeElement === textareaRef.current;\n if (preserveFocusedDraft) return;\n revealPath(path);\n }, [expandPath, revealPath, selected]);\n\n useEffect(() => {\n if (workspace === undefined || initializedWorkbench.current) return;\n if (availableModes.length === 1) setWorkbench(availableModes[0] ?? \"story\");\n initializedWorkbench.current = true;\n }, [availableModes, workspace]);\n\n useEffect(() => {\n if (activityPath !== undefined && activityPath === selected) setEditorMode(\"source\");\n }, [activityPath, selected]);\n\n useEffect(() => {\n if (modeSelection.current === selected) return;\n modeSelection.current = selected;\n setEditorMode(activityPath === selected ? \"source\" : previewable ? \"preview\" : \"source\");\n }, [activityPath, previewable, selected]);\n\n useEffect(() => {\n if (workspaceLoading) return;\n if (activityPath !== undefined) return;\n if (selected !== undefined && (\n (workspace?.files.some((file) => file.path === selected) ?? false)\n || buffers[selected] !== undefined\n ) && workbenchModeForPath(selected) === workbench) return;\n setSelected(workspace === undefined ? undefined : preferredFile(workspace.files, workbench));\n }, [activityPath, buffers, selected, workbench, workspace, workspaceLoading]);\n\n useEffect(() => {\n if (workspace === undefined || workspaceLoading) return;\n const paths = new Set(workspace.files.map((file) => file.path));\n setBuffers((current) => {\n let changed = false;\n const next = { ...current };\n for (const [path, value] of Object.entries(current)) {\n if (paths.has(path) || activityPaths.has(path)) continue;\n if (value.source === \"human\" && value.content !== value.saved) {\n if (value.missing !== true) {\n next[path] = { ...value, missing: true, error: \"\u6587\u4EF6\u5DF2\u4ECE workspace \u79FB\u9664\u3002\u672C\u5730\u8349\u7A3F\u4ECD\u4FDD\u7559\uFF0C\u53EF\u590D\u5236\u540E\u653E\u5F03\u8349\u7A3F\u3002\" };\n changed = true;\n }\n } else {\n delete next[path];\n changed = true;\n }\n }\n return changed ? next : current;\n });\n }, [activityPaths, workspace, workspaceLoading]);\n\n useEffect(() => {\n if (selected === undefined || activityPaths.has(selected)) return;\n if (!(workspace?.files.some((file) => file.path === selected) ?? false)) return;\n const controller = new AbortController();\n setBuffers((current) => {\n const existing = current[selected];\n return existing === undefined ? current : { ...current, [selected]: { ...existing, error: undefined } };\n });\n void fetch(endpoint(\"file\", sessionId, selected), { signal: controller.signal })\n .then((response) => json<FilePayload>(response))\n .then((file) => {\n setBuffers((current) => {\n const existing = current[file.path];\n if (existing?.source === \"human\" && existing.content !== existing.saved) {\n if (existing.version === file.version) return { ...current, [file.path]: { ...existing, missing: false, error: undefined } };\n return {\n ...current,\n [file.path]: {\n ...existing,\n missing: false,\n error: undefined,\n conflict: {\n message: `${file.path} \u5DF2\u5728\u78C1\u76D8\u4E0A\u66F4\u65B0\uFF1B\u4F60\u7684\u672C\u5730\u8349\u7A3F\u6CA1\u6709\u88AB\u8986\u76D6\u3002`,\n theirs: file.content,\n theirsVersion: file.version\n }\n }\n };\n }\n return {\n ...current,\n [file.path]: { content: file.content, saved: file.content, source: \"disk\", version: file.version }\n };\n });\n })\n .catch((reason: unknown) => {\n if (controller.signal.aborted) return;\n setBuffers((current) => {\n const existing = current[selected];\n return existing === undefined ? current : {\n ...current,\n [selected]: { ...existing, error: reason instanceof Error ? reason.message : String(reason) }\n };\n });\n });\n return () => { controller.abort(); };\n }, [activityPaths, selected, sessionId, workspace?.files]);\n\n useEffect(() => {\n if (normalizedActivities.length === 0) return;\n for (const { path } of normalizedActivities) expandPath(path);\n if (activityPath !== undefined) followAgentPath(activityPath);\n setBuffers((current) => {\n let next = current;\n for (const { activity: currentActivity, path } of normalizedActivities) {\n const existing = next[path];\n if (existing?.source === \"human\" && existing.content !== existing.saved) {\n next = {\n ...next,\n [path]: {\n ...existing,\n conflict: { message: `${path} \u6B63\u7531 Agent \u4FEE\u6539\uFF1B\u4F60\u7684\u672C\u5730\u8349\u7A3F\u5DF2\u9501\u5B9A\uFF0C\u4E0D\u4F1A\u88AB\u8986\u76D6\u3002` }\n }\n };\n continue;\n }\n let basis = activityBases.current.get(currentActivity.callId);\n if (basis === undefined || basis.path !== path) {\n basis = { path, base: existing?.content ?? \"\" };\n activityBases.current.set(currentActivity.callId, basis);\n }\n const preview = previewMutation(currentActivity, basis.base);\n if (preview === undefined || (existing?.source === \"agent\" && existing.content === preview)) continue;\n next = {\n ...next,\n [path]: {\n content: preview,\n saved: existing?.saved ?? \"\",\n source: \"agent\",\n version: existing?.version ?? \"\"\n }\n };\n }\n return next;\n });\n }, [activityPath, expandPath, followAgentPath, normalizedActivities]);\n\n useEffect(() => {\n const signals = new Set(mutatingCallIds(runningCalls));\n for (const { activity: currentActivity } of normalizedActivities) signals.add(currentActivity.callId.split(\":\", 1)[0] ?? currentActivity.callId);\n const settled = [...previousSignals.current].some((callId) => !signals.has(callId));\n for (const callId of activityBases.current.keys()) {\n if (!signals.has(callId.split(\":\", 1)[0] ?? callId)) activityBases.current.delete(callId);\n }\n previousSignals.current = signals;\n if (!settled) return;\n reload();\n }, [normalizedActivities, reload, runningCalls]);\n\n useEffect(() => {\n if (settledMutation === undefined || settledMutation === previousSettledMutation.current) return;\n previousSettledMutation.current = settledMutation;\n const path = creativeRelativePath(settledMutation.slice(settledMutation.indexOf(\"\\0\") + 1), workspace?.cwd);\n if (path !== undefined) followAgentPath(path);\n reload();\n }, [followAgentPath, reload, settledMutation, workspace?.cwd]);\n\n useEffect(() => {\n if (selected === undefined) return;\n for (const button of navRef.current?.querySelectorAll<HTMLButtonElement>(\"button[data-file-path]\") ?? []) {\n if (button.dataset.filePath === selected) {\n button.scrollIntoView({ block: \"nearest\" });\n break;\n }\n }\n }, [selected]);\n\n useEffect(() => {\n if (normalizedActivities.length > 0 || workspace === undefined) return;\n const sessionSurface = surfaceRef.current?.parentElement;\n if (sessionSurface === undefined || sessionSurface === null) return;\n const knownPaths = new Set(workspace.files.map((file) => file.path));\n const followOfficialFileLink = (event: MouseEvent): void => {\n const origin = event.target;\n if (!(origin instanceof Element)) return;\n const control = origin.closest<HTMLElement>(\"button, a\");\n if (control === null || control.closest(\".oh-story-split-surface\") !== null) return;\n const candidates = [control.title, control.getAttribute(\"aria-label\"), control.textContent];\n for (const candidate of candidates) {\n const path = creativeRelativePath(candidate?.trim().replace(/^(?:Open|\u6253\u5F00)\\s+/u, \"\"), workspace.cwd);\n if (path === undefined || !knownPaths.has(path)) continue;\n event.preventDefault();\n event.stopPropagation();\n revealPath(path);\n break;\n }\n };\n sessionSurface.addEventListener(\"click\", followOfficialFileLink, true);\n return () => { sessionSurface.removeEventListener(\"click\", followOfficialFileLink, true); };\n }, [normalizedActivities.length, revealPath, workspace]);\n\n const savePath = useCallback(async (path: string) => {\n if (saveLocks.current.has(path)) return;\n const submitted = buffersRef.current[path];\n if (submitted === undefined || submitted.missing === true || submitted.content === submitted.saved) return;\n saveLocks.current.add(path);\n setBuffers((current) => {\n const existing = current[path];\n return existing === undefined ? current : { ...current, [path]: { ...existing, saving: true, error: undefined } };\n });\n try {\n const file = await json<FilePayload>(await fetch(endpoint(\"file\", sessionId, path), {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ content: submitted.content, baseVersion: submitted.version })\n }));\n setBuffers((current) => {\n const latest = current[path];\n if (latest === undefined) return current;\n const unchanged = latest.content === submitted.content;\n return {\n ...current,\n [path]: {\n content: unchanged ? file.content : latest.content,\n saved: file.content,\n source: unchanged ? \"disk\" : \"human\",\n version: file.version,\n saving: false\n }\n };\n });\n reload();\n } catch (reason) {\n if (reason instanceof WorkspaceRequestError && reason.status === 412) {\n try {\n const theirs = await json<FilePayload>(await fetch(endpoint(\"file\", sessionId, path)));\n setBuffers((current) => {\n const latest = current[path];\n if (latest === undefined) return current;\n return {\n ...current,\n [path]: {\n ...latest,\n saving: false,\n conflict: {\n message: `${path} \u5DF2\u5728\u78C1\u76D8\u4E0A\u66F4\u65B0\uFF1B\u8BF7\u9009\u62E9\u4FDD\u7559\u54EA\u4E00\u7248\u3002`,\n theirs: theirs.content,\n theirsVersion: theirs.version\n }\n }\n };\n });\n } catch (refreshError) {\n setBuffers((current) => {\n const existing = current[path];\n return existing === undefined ? current : {\n ...current,\n [path]: { ...existing, saving: false, error: refreshError instanceof Error ? refreshError.message : String(refreshError) }\n };\n });\n }\n } else {\n setBuffers((current) => {\n const existing = current[path];\n return existing === undefined ? current : {\n ...current,\n [path]: { ...existing, saving: false, error: reason instanceof Error ? reason.message : String(reason) }\n };\n });\n }\n } finally {\n saveLocks.current.delete(path);\n }\n }, [reload, sessionId]);\n\n useEffect(() => {\n const saveShortcut = (event: KeyboardEvent): void => {\n if (!(event.metaKey || event.ctrlKey) || event.key.toLocaleLowerCase() !== \"s\") return;\n event.preventDefault();\n if (selected !== undefined) void savePath(selected);\n };\n globalThis.addEventListener(\"keydown\", saveShortcut);\n return () => { globalThis.removeEventListener(\"keydown\", saveShortcut); };\n }, [savePath, selected]);\n\n const groups = useMemo(() => {\n const value = new Map<string, WorkspaceFile[]>();\n const all = [...(workspace?.files ?? [])].filter((file) => workbenchModeForPath(file.path) === workbench);\n if (activityPath !== undefined && !all.some((file) => file.path === activityPath)) all.push({ path: activityPath, bytes: 0, version: \"\" });\n all.sort((left, right) => left.path.localeCompare(right.path, \"zh-Hans-CN\"));\n for (const file of all) {\n const directory = groupForPath(file.path);\n const files = value.get(directory) ?? [];\n files.push(file);\n value.set(directory, files);\n }\n const order = GROUP_ORDER[workbench];\n return [...value.entries()].sort(([left], [right]) => {\n const leftIndex = order.indexOf(left);\n const rightIndex = order.indexOf(right);\n return (leftIndex < 0 ? order.length : leftIndex) - (rightIndex < 0 ? order.length : rightIndex)\n || left.localeCompare(right, \"zh-Hans-CN\");\n });\n }, [activityPath, workbench, workspace]);\n\n const selectWorkbench = (next: WorkbenchMode): void => {\n setWorkbench(next);\n const target = workspace === undefined ? undefined : preferredFile(workspace.files, next);\n if (target === undefined) setSelected(undefined);\n else revealPath(target);\n };\n const selectEditorMode = (next: WorkbenchMemory[\"editorMode\"]): void => {\n if (next === \"preview\") rememberEditorPosition();\n setEditorMode(next);\n };\n const selectedLabel = selected ?? `\u5728\u5F53\u524D DSH workspace \u4E2D\u9009\u62E9${workbench === \"story\" ? \"\u5C0F\u8BF4\" : \"\u77ED\u5267\"}\u6587\u4EF6`;\n const selectedBasename = selected?.split(\"/\").at(-1) ?? selectedLabel;\n const selectedGroup = selected === undefined ? undefined : groupForPath(selected);\n const toggleGroup = (key: string, open: boolean): void => {\n setExpanded((current) => ({ ...current, [key]: open }));\n };\n const resolveConflict = (keepLocal: boolean): void => {\n if (selected === undefined || conflict?.theirs === undefined || conflict.theirsVersion === undefined) return;\n const theirs = conflict.theirs;\n const theirsVersion = conflict.theirsVersion;\n setBuffers((current) => {\n const existing = current[selected];\n if (existing === undefined) return current;\n return {\n ...current,\n [selected]: keepLocal\n ? { ...existing, saved: theirs, version: theirsVersion, source: \"human\", conflict: undefined }\n : { content: theirs, saved: theirs, source: \"disk\", version: theirsVersion }\n };\n });\n };\n\n return <div ref={surfaceRef} className=\"oh-story-split-surface\">\n <style>{styles}</style>\n <aside className=\"oh-story-tree\">\n <div className=\"oh-story-brand\">\n <span className=\"oh-story-brand-cluster\"><strong>\u2726 <span>Oh Story</span></strong>{workspaceKind !== undefined && <span className=\"oh-story-kind\">{workspaceKind === \"story\" ? \"\u5C0F\u8BF4\" : \"\u77ED\u5267\"}</span>}</span>\n <button type=\"button\" onClick={reload} title=\"\u5237\u65B0\" aria-label=\"\u5237\u65B0\u9879\u76EE\u6587\u4EF6\">\u21BB</button>\n </div>\n {showModeTabs && <div className=\"oh-story-mode-tabs\" role=\"tablist\" aria-label=\"\u521B\u4F5C\u5DE5\u4F5C\u53F0\">\n {WORKBENCH_MODES.map((mode) => <button\n type=\"button\"\n role=\"tab\"\n key={mode}\n tabIndex={workbench === mode ? 0 : -1}\n aria-selected={workbench === mode}\n onKeyDown={(event) => { handleTabKey(event, WORKBENCH_MODES, workbench, selectWorkbench); }}\n onClick={() => { selectWorkbench(mode); }}\n >{mode === \"story\" ? \"\u5C0F\u8BF4\" : \"\u77ED\u5267\"}</button>)}\n </div>}\n {error !== undefined && <div className=\"oh-story-error\">{error}</div>}\n {workspace?.metadataErrors.map((message) => <div className=\"oh-story-warning\" key={message}>{message}</div>)}\n <nav ref={navRef} aria-label={workbench === \"story\" ? \"\u5C0F\u8BF4\u9879\u76EE\u6587\u4EF6\" : \"\u77ED\u5267\u9879\u76EE\u6587\u4EF6\"}>\n {groups.map(([directory, files]) => {\n const groupOpen = selectedGroup === directory || expanded[directory] === true;\n return <details className=\"oh-story-file-group\" key={directory} open={groupOpen} onToggle={(event) => { toggleGroup(directory, event.currentTarget.open); }}>\n <summary>{directory}<span>{files.length}</span></summary>\n <FileTreeNodes\n nodes={buildFileTree(files, directory)}\n depth={1}\n expanded={expanded}\n selected={selected}\n activityPath={activityPath}\n onToggle={toggleGroup}\n onSelect={revealPath}\n />\n </details>;\n })}\n </nav>\n </aside>\n <main className=\"oh-story-editor\">\n <header>\n <span className=\"oh-story-editor-path\" title={selected}><span>{selectedLabel}</span><strong>{selectedBasename}</strong></span>\n <div className=\"oh-story-editor-actions\">\n {previewable && <div className=\"oh-story-editor-tabs\" role=\"tablist\" aria-label={markdown ? \"Markdown \u67E5\u770B\u65B9\u5F0F\" : \"JSONL \u67E5\u770B\u65B9\u5F0F\"}>\n {EDITOR_MODES.map((mode) => <button\n type=\"button\"\n role=\"tab\"\n key={mode}\n tabIndex={editorMode === mode ? 0 : -1}\n aria-selected={editorMode === mode}\n onKeyDown={(event) => { handleTabKey(event, EDITOR_MODES, editorMode, selectEditorMode); }}\n onClick={() => { selectEditorMode(mode); }}\n >{mode === \"preview\" ? \"\u9884\u89C8\" : \"\u6E90\u7801\"}</button>)}\n </div>}\n {(dirty || saving) && selected !== undefined && <button className=\"oh-story-save\" type=\"button\" disabled={saving || buffer?.missing === true} onClick={() => { void savePath(selected); }}>\n {saving ? \"\u4FDD\u5B58\u4E2D\u2026\" : \"\u4FDD\u5B58\"}\n </button>}\n </div>\n </header>\n {activity !== undefined && activityPath !== undefined && activityPath === selected && <div className=\"oh-story-stream\" data-stage={activity.stage} role=\"status\" aria-live=\"polite\">\u25CF {activity.stage === \"running\" ? \"Agent \u6B63\u5728\u5E94\u7528\u4FEE\u6539\" : \"Agent \u6B63\u5728\u751F\u6210\u6587\u4EF6\u5185\u5BB9\"}</div>}\n {conflict !== undefined && <div className=\"oh-story-conflict\" role=\"alert\">\n <span>{conflict.message}</span>\n {conflict.theirs !== undefined && conflict.theirsVersion !== undefined && selected !== undefined && <div>\n <button type=\"button\" onClick={() => { resolveConflict(false); }}>\u8F7D\u5165\u78C1\u76D8\u7248\u672C</button>\n <button type=\"button\" onClick={() => { resolveConflict(true); }}>\u4FDD\u7559\u672C\u5730\u8349\u7A3F</button>\n </div>}\n </div>}\n {fileError !== undefined && <div className=\"oh-story-error\">{fileError}</div>}\n {selected === undefined\n ? <div className=\"oh-story-empty\">{workbench === \"story\"\n ? <>\u5F53\u524D workspace \u8FD8\u6CA1\u6709\u5C0F\u8BF4\u6587\u4EF6\u3002\u53EF\u5728\u53F3\u4FA7 Chat \u4E2D\u8FD0\u884C <code>/story-setup</code>\u3002</>\n : <>\u5F53\u524D workspace \u8FD8\u6CA1\u6709\u77ED\u5267\u9879\u76EE\u3002\u53EF\u5728\u53F3\u4FA7 Chat \u4E2D\u8FD0\u884C <code>/short-drama</code>\u3002</>}</div>\n : buffer === undefined\n ? <div className=\"oh-story-empty\">\u6B63\u5728\u52A0\u8F7D {selected}\u2026</div>\n : buffer.missing === true\n ? <div className=\"oh-story-empty\">\u6587\u4EF6\u5DF2\u4ECE workspace \u79FB\u9664\uFF0C\u672C\u5730\u8349\u7A3F\u4ECD\u4FDD\u7559\u3002\u8BF7\u5148\u590D\u5236\u9700\u8981\u7684\u5185\u5BB9\uFF0C\u518D\u653E\u5F03\u8349\u7A3F\u3002<button type=\"button\" onClick={() => {\n setBuffers((current) => {\n const next = { ...current };\n delete next[selected];\n return next;\n });\n setSelected(workspace === undefined ? undefined : preferredFile(workspace.files, workbench));\n }}>\u653E\u5F03\u672C\u5730\u8349\u7A3F</button></div>\n : previewable && editorMode === \"preview\"\n ? markdown\n ? <MarkdownPreview content={buffer.content} label={selected} />\n : <JsonlPreview content={buffer.content} label={selected} />\n : <textarea\n ref={textareaRef}\n value={buffer.content}\n data-format={structured ? \"structured\" : \"prose\"}\n onBlur={rememberEditorPosition}\n onScroll={rememberEditorPosition}\n onSelect={rememberEditorPosition}\n onChange={(event) => {\n const content = event.target.value;\n setBuffers((current) => ({\n ...current,\n [selected]: {\n content,\n saved: current[selected]?.saved ?? \"\",\n source: \"human\",\n version: current[selected]?.version ?? \"\",\n conflict: current[selected]?.conflict,\n saving: current[selected]?.saving\n }\n }));\n }}\n spellCheck={!structured}\n aria-label={selected}\n />}\n </main>\n </div>;\n}\n\ntype WorkbenchSlotProps = PropsRuntime<\"oh-story.workspace\"> & PropsStore<ReturnType<typeof createWorkbenchStore>>;\n\n/** Mount beside the official conversation without replacing Chat or Composer. */\nfunction CreativeSplitBridge({ sessionId, useSession, useStore, actions }: WorkbenchSlotProps) {\n const marker = useRef<HTMLSpanElement>(null);\n const [target, setTarget] = useState<HTMLElement>();\n const runningCalls = useSession((snapshot) => snapshot.runningCalls);\n const partial = useSession((snapshot) => streamingAssistant(snapshot.chat.timeline));\n const settledMutation = useSession((snapshot) => latestSettledMutation(snapshot.chat));\n useLayoutEffect(() => {\n const document = marker.current?.ownerDocument;\n if (document === undefined) return;\n const locate = (): void => {\n const anchor = document.querySelector<HTMLElement>(\"[data-conversation-scroll] > [data-slot='conversation.session']\");\n setTarget((current) => current === anchor ? current : anchor ?? undefined);\n };\n locate();\n const observer = new MutationObserver(locate);\n observer.observe(document.body, { childList: true, subtree: true });\n return () => { observer.disconnect(); };\n }, [sessionId]);\n useLayoutEffect(() => {\n const scroller = target?.parentElement;\n if (scroller === undefined || scroller === null) return;\n const publishLayout = (): void => {\n scroller.style.setProperty(\"--oh-story-scroll-height\", `${String(scroller.clientHeight)}px`);\n const layout = scroller.clientWidth < 620 ? \"compact\" : scroller.clientWidth < 900 ? \"medium\" : \"wide\";\n if (scroller.dataset.ohStoryLayout !== layout) scroller.dataset.ohStoryLayout = layout;\n };\n publishLayout();\n const observer = new ResizeObserver(publishLayout);\n observer.observe(scroller);\n return () => {\n observer.disconnect();\n scroller.style.removeProperty(\"--oh-story-scroll-height\");\n delete scroller.dataset.ohStoryLayout;\n };\n }, [target]);\n return <>\n <span ref={marker} className=\"oh-story-bridge-marker\" aria-hidden />\n {target === undefined ? null : createPortal(<CreativeWorkbench\n sessionId={sessionId}\n runningCalls={runningCalls}\n partial={partial}\n settledMutation={settledMutation}\n useStore={useStore}\n actions={actions}\n />, target)}\n </>;\n}\n\ntype WorkbenchSeatProps = PropsRuntime<\"shell.overlay\"> & PropsRenderSlots<\"oh-story.workspace\">;\n\nfunction WorkbenchSeat({ SessionProvider, renderSlot }: WorkbenchSeatProps) {\n return <SessionProvider>{() => renderSlot(\"oh-story.workspace\", {})}</SessionProvider>;\n}\n\nfunction argsOf(block: ToolCallViewProps[\"block\"]): Record<string, unknown> {\n const raw = (\"kind\" in block ? block.call?.argsRaw : block.argsRaw) ?? \"{}\";\n try {\n const value = JSON.parse(raw) as unknown;\n return typeof value === \"object\" && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : {};\n } catch { return {}; }\n}\n\nfunction resultOf(block: ToolCallViewProps[\"block\"]): string | undefined {\n if (!(\"kind\" in block)) return undefined;\n return block.content.map((item) => item.type === \"text\" ? item.text : JSON.stringify(item, null, 2)).join(\"\\n\");\n}\n\nfunction RoleToolView({ block, inspect }: ToolCallViewProps) {\n const args = argsOf(block);\n const role = typeof args.role === \"string\" ? args.role : \"story-role\";\n const output = resultOf(block);\n const state = !(\"kind\" in block) ? \"running\" : block.isError ? \"error\" : \"done\";\n return <details className=\"oh-story-role\" data-state={state}>\n <style>{styles}</style>\n <summary><span>\u2726 Role</span><strong>{role}</strong><em>{state === \"running\" ? \"\u8FD0\u884C\u4E2D\" : state === \"error\" ? \"\u5931\u8D25\" : \"\u5B8C\u6210\"}</em></summary>\n {output !== undefined && <pre>{output}</pre>}\n {inspect !== undefined && <button type=\"button\" onClick={inspect}>\u5728\u8F68\u8FF9\u4E2D\u68C0\u67E5</button>}\n </details>;\n}\n\n/** Register only official DSH surfaces; the split bridge never replaces Chat. */\nexport function apply(context: ClientContext): void {\n context.slots.inject(\"shell.overlay\", () => {\n const disposeSeat = context.slots.register({\n name: \"shell.overlay\",\n id: \"oh-story-workspace\",\n order: -100,\n children: { \"oh-story.workspace\": { kind: \"single\", scope: \"session\" } }\n }, WorkbenchSeat);\n const disposeWorkbench = context.slots.register({\n name: \"oh-story.workspace\",\n store: createWorkbenchStore\n }, CreativeSplitBridge);\n return [disposeSeat, disposeWorkbench];\n });\n context.slots.inject(\"tool.call.toolview\", () => context.slots.register({\n name: \"tool.call.toolview\",\n key: \"oh_story_role\"\n }, RoleToolView));\n}\n\nexport default { name, inject, apply };\n", "import type {\n ChatSnapshot,\n ConversationTimelineSnapshot,\n PartialAssistant,\n RunningToolCall,\n ToolCallBlock\n} from \"@deepseek-ai/dsh-client-runtime/client\";\nimport type { AssistantChatData } from \"@deepseek-ai/dsh-client-ui-conversation/client\";\n\nexport type MutationToolName = \"write\" | \"edit\" | \"str_replace_editor\";\n\nexport interface FileMutationActivity {\n readonly callId: string;\n readonly name: MutationToolName;\n readonly argsRaw: string;\n readonly stage: \"streaming\" | \"running\";\n readonly path: string | undefined;\n readonly operation: \"replace-file\" | \"replace-text\" | \"insert-text\" | undefined;\n readonly oldText: string | undefined;\n readonly newText: string | undefined;\n readonly replaceAll: boolean;\n}\n\ninterface JsonStringPrefix {\n readonly value: string;\n readonly complete: boolean;\n}\n\nexport type WorkbenchMode = \"story\" | \"drama\";\n\nconst STORY_DIRECTORIES = new Set([\"\u6B63\u6587\", \"\u5927\u7EB2\", \"\u8BBE\u5B9A\", \"\u8FFD\u8E2A\", \"\u5BF9\u6807\", \"\u53C2\u8003\u8D44\u6599\"]);\nconst DRAMA_DIRECTORIES = new Set([\"\u8F93\u5165\", \"\u9879\u76EE\u5F00\u53D1\", \"\u8BBE\u5B9A\u96C6\", \"\u5267\u96C6\", \"\u4EA4\u4ED8\", \"\u521B\u4F5C\u8005\u51B3\u7B56\", \"\u5BA1\u67E5\"]);\nconst EDITABLE_EXTENSION = /\\.(?:md|txt|json|jsonl)$/iu;\nconst MUTATING_CALLS = new Set([\"write\", \"edit\", \"str_replace_editor\", \"bash\", \"run_code\", \"oh_story_role\"]);\n\n/** Read the latest running Assistant step, including tool-only steps hidden from the Chat list. */\nexport function streamingAssistant(timeline: ConversationTimelineSnapshot): PartialAssistant | null {\n for (const turnNumber of timeline.turnOrder.toReversed()) {\n const turn = timeline.turns.get(turnNumber);\n if (turn === undefined) continue;\n for (const step of turn.steps.toReversed()) {\n const assistant: AssistantChatData | undefined = step.data.get(\"assistant-step\");\n if (assistant?.status === \"running\") return assistant;\n }\n }\n return null;\n}\n\nfunction decodeEscape(character: string): string | undefined {\n switch (character) {\n case \"\\\"\": return \"\\\"\";\n case \"\\\\\": return \"\\\\\";\n case \"/\": return \"/\";\n case \"b\": return \"\\b\";\n case \"f\": return \"\\f\";\n case \"n\": return \"\\n\";\n case \"r\": return \"\\r\";\n case \"t\": return \"\\t\";\n default: return undefined;\n }\n}\n\n/** Read a JSON string even while the model is still streaming its closing quote. */\nexport function jsonStringPrefix(raw: string, key: string): JsonStringPrefix | undefined {\n const match = new RegExp(`\"${key.replace(/[.*+?^${}()|[\\]\\\\]/gu, \"\\\\$&\")}\"\\\\s*:\\\\s*\"`, \"u\").exec(raw);\n if (match === null) return undefined;\n let value = \"\";\n for (let index = match.index + match[0].length; index < raw.length; index += 1) {\n const character = raw[index] ?? \"\";\n if (character === \"\\\"\") return { value, complete: true };\n if (character !== \"\\\\\") { value += character; continue; }\n const escape = raw[index + 1];\n if (escape === undefined) return { value, complete: false };\n if (escape === \"u\") {\n const hex = raw.slice(index + 2, index + 6);\n if (!/^[\\da-f]{4}$/iu.test(hex)) return { value, complete: false };\n value += String.fromCharCode(Number.parseInt(hex, 16));\n index += 5;\n continue;\n }\n const decoded = decodeEscape(escape);\n if (decoded === undefined) return { value, complete: false };\n value += decoded;\n index += 1;\n }\n return { value, complete: false };\n}\n\nfunction completedString(raw: string, key: string): string | undefined {\n const value = jsonStringPrefix(raw, key);\n return value?.complete === true ? value.value : undefined;\n}\n\nfunction parsedArgs(raw: string): Record<string, unknown> | undefined {\n try {\n const value = JSON.parse(raw) as unknown;\n return typeof value === \"object\" && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n } catch { return undefined; }\n}\n\nfunction mutationFromArgs(name: string, callId: string, argsRaw: string, stage: FileMutationActivity[\"stage\"]): FileMutationActivity | undefined {\n const complete = parsedArgs(argsRaw);\n if (name === \"write\") {\n return {\n callId, name, argsRaw, stage,\n path: jsonStringPrefix(argsRaw, \"file_path\")?.value,\n operation: \"replace-file\",\n oldText: undefined,\n newText: jsonStringPrefix(argsRaw, \"content\")?.value,\n replaceAll: false\n };\n }\n if (name === \"edit\") {\n return {\n callId, name, argsRaw, stage,\n path: jsonStringPrefix(argsRaw, \"file_path\")?.value,\n operation: \"replace-text\",\n oldText: completedString(argsRaw, \"old_string\"),\n newText: jsonStringPrefix(argsRaw, \"new_string\")?.value,\n replaceAll: complete?.replace_all === true\n };\n }\n if (name !== \"str_replace_editor\") return undefined;\n const command = completedString(argsRaw, \"command\");\n if (command === \"view\") return undefined;\n const path = jsonStringPrefix(argsRaw, \"path\")?.value;\n if (command === \"create\") {\n return {\n callId, name, argsRaw, stage, path,\n operation: \"replace-file\",\n oldText: undefined,\n newText: jsonStringPrefix(argsRaw, \"file_text\")?.value,\n replaceAll: false\n };\n }\n if (command === \"str_replace\") {\n return {\n callId, name, argsRaw, stage, path,\n operation: \"replace-text\",\n oldText: completedString(argsRaw, \"old_str\"),\n newText: jsonStringPrefix(argsRaw, \"new_str\")?.value ?? (complete !== undefined ? \"\" : undefined),\n replaceAll: complete?.replace_all === true\n };\n }\n if (command === \"insert\") {\n return {\n callId, name, argsRaw, stage, path,\n operation: \"insert-text\",\n oldText: undefined,\n newText: jsonStringPrefix(argsRaw, \"new_str\")?.value,\n replaceAll: false\n };\n }\n return { callId, name, argsRaw, stage, path, operation: undefined, oldText: undefined, newText: undefined, replaceAll: false };\n}\n\nfunction mutationsFromRunning(call: RunningToolCall): FileMutationActivity[] {\n const direct = mutationFromArgs(call.name, call.callId, call.argsRaw, \"running\");\n if (direct === undefined) return [];\n const view = call.callView;\n if (view?.card !== \"diff\" || view.diffs.length === 0) return [direct];\n return view.diffs.map((diff, index) => ({\n ...direct,\n callId: view.diffs.length === 1 ? call.callId : `${call.callId}:${String(index)}`,\n path: diff.path,\n operation: diff.oldText === null ? \"replace-file\" : \"replace-text\",\n oldText: diff.oldText ?? undefined,\n newText: diff.newText\n }));\n}\n\nfunction visitRunning(blocks: readonly ToolCallBlock[], visit: (call: RunningToolCall) => void): void {\n for (const block of blocks) {\n if (!(\"kind\" in block)) visit(block);\n visitRunning(block.subCalls, visit);\n }\n}\n\n/** Return every active file mutation in official DSH dispatch order, including nested Code Mode calls. */\nexport function fileMutations(\n runningCalls: readonly RunningToolCall[],\n partial: PartialAssistant | null = null\n): FileMutationActivity[] {\n const values: FileMutationActivity[] = [];\n visitRunning(runningCalls, (call) => { values.push(...mutationsFromRunning(call)); });\n for (const block of partial?.blocks ?? []) {\n if (block.kind !== \"tool-call\") continue;\n const value = mutationFromArgs(block.name, block.callId, block.argsRaw, \"streaming\");\n if (value !== undefined && !values.some((candidate) => candidate.callId === value.callId)) values.push(value);\n }\n return values;\n}\n\n/** Running calls whose settlement may have changed creative files. */\nexport function mutatingCallIds(runningCalls: readonly RunningToolCall[]): ReadonlySet<string> {\n const ids = new Set<string>();\n visitRunning(runningCalls, (call) => { if (MUTATING_CALLS.has(call.name)) ids.add(call.callId); });\n return ids;\n}\n\nfunction settledMutationSignals(block: ToolCallBlock): string[] {\n const nested = block.subCalls.flatMap(settledMutationSignals);\n if (!(\"kind\" in block) || block.isError) return nested;\n const diffs = block.resultView?.card === \"diff\"\n ? block.resultView.diffs\n : block.callView?.card === \"diff\" ? block.callView.diffs : undefined;\n if (diffs !== undefined) return [\n ...diffs.map((diff, index) => `${block.callId}:${String(index)}\\0${diff.path}`),\n ...nested\n ];\n if (block.call === null) return nested;\n const mutation = mutationFromArgs(block.call.name, block.callId, block.call.argsRaw, \"running\");\n return mutation?.path === undefined ? nested : [`${block.callId}\\0${mutation.path}`, ...nested];\n}\n\n/** Latest durable successful mutation, used when a fast call skips the live render window. */\nexport function latestSettledMutation(chat: ChatSnapshot): string | undefined {\n for (const key of chat.order.toReversed()) {\n const node = chat.nodes.get(key);\n if (node?.kind !== \"tool-call\") continue;\n const root = (node.data as { readonly root?: ToolCallBlock }).root;\n const signal = root === undefined ? undefined : settledMutationSignals(root).at(-1);\n if (signal !== undefined) return signal;\n }\n return undefined;\n}\n\n/** Convert a DSH tool path to the creative-relative path accepted by the narrow route. */\nexport function creativeRelativePath(path: string | undefined, cwd: string | undefined): string | undefined {\n if (path === undefined || path === \"\") return undefined;\n const normalized = path.replaceAll(\"\\\\\", \"/\");\n const root = cwd?.replaceAll(\"\\\\\", \"/\").replace(/\\/$/u, \"\");\n const insideRoot = root !== undefined && normalized.startsWith(`${root}/`);\n if ((normalized.startsWith(\"/\") || /^[a-z]:\\//iu.test(normalized) || normalized.startsWith(\"file:\")) && !insideRoot) return undefined;\n const relative = insideRoot ? normalized.slice(root.length + 1) : normalized.replace(/^\\.\\//u, \"\");\n const [directory] = relative.split(\"/\", 1);\n const creative = directory !== undefined && (STORY_DIRECTORIES.has(directory) || DRAMA_DIRECTORIES.has(directory));\n if ((!creative && relative !== \"short-drama.json\") || !EDITABLE_EXTENSION.test(relative)) return undefined;\n if (relative.split(\"/\").some((part) => part === \"..\" || part === \".\" || part === \"\")) return undefined;\n return relative;\n}\n\nexport function workbenchModeForPath(path: string | undefined): WorkbenchMode | undefined {\n if (path === \"short-drama.json\") return \"drama\";\n const directory = path?.split(\"/\", 1)[0];\n if (directory !== undefined && STORY_DIRECTORIES.has(directory)) return \"story\";\n if (directory !== undefined && DRAMA_DIRECTORIES.has(directory)) return \"drama\";\n return undefined;\n}\n\n/** Project one streamed mutation over its immediate predecessor. */\nexport function previewMutation(activity: FileMutationActivity, base: string): string | undefined {\n if (activity.operation === \"replace-file\") return activity.newText;\n if (activity.operation === \"replace-text\") {\n if (activity.oldText === undefined || activity.newText === undefined || activity.oldText === \"\") return undefined;\n if (activity.replaceAll) return base.includes(activity.oldText) ? base.split(activity.oldText).join(activity.newText) : undefined;\n const at = base.indexOf(activity.oldText);\n return at < 0 ? undefined : `${base.slice(0, at)}${activity.newText}${base.slice(at + activity.oldText.length)}`;\n }\n if (activity.operation === \"insert-text\") {\n if (activity.newText === undefined) return undefined;\n const rawLine = /\"insert_line\"\\s*:\\s*(\\d+)/u.exec(activity.argsRaw)?.[1];\n if (rawLine === undefined) return undefined;\n const line = Number.parseInt(rawLine, 10);\n const parts = base.split(\"\\n\");\n const at = Math.max(0, Math.min(parts.length, line));\n parts.splice(at, 0, activity.newText);\n return parts.join(\"\\n\");\n }\n return undefined;\n}\n", "export interface FileTreeInput {\n readonly path: string;\n readonly bytes: number;\n}\n\nexport interface FileTreeFile {\n readonly kind: \"file\";\n readonly name: string;\n readonly path: string;\n readonly bytes: number;\n}\n\nexport interface FileTreeDirectory {\n readonly kind: \"directory\";\n readonly name: string;\n readonly path: string;\n readonly fileCount: number;\n readonly children: readonly FileTreeNode[];\n}\n\nexport type FileTreeNode = FileTreeFile | FileTreeDirectory;\n\ninterface MutableDirectory {\n readonly name: string;\n readonly path: string;\n readonly directories: Map<string, MutableDirectory>;\n readonly files: FileTreeFile[];\n}\n\nfunction directory(name: string, path: string): MutableDirectory {\n return { name, path, directories: new Map(), files: [] };\n}\n\nfunction compareNames(left: { readonly name: string }, right: { readonly name: string }): number {\n return left.name.localeCompare(right.name, \"zh-Hans-CN\", { numeric: true });\n}\n\nfunction freezeDirectory(value: MutableDirectory): FileTreeDirectory {\n const directories = [...value.directories.values()].map(freezeDirectory).sort(compareNames);\n const files = [...value.files].sort(compareNames);\n return {\n kind: \"directory\",\n name: value.name,\n path: value.path,\n fileCount: files.length + directories.reduce((sum, child) => sum + child.fileCount, 0),\n children: [...directories, ...files]\n };\n}\n\nexport function buildFileTree(files: readonly FileTreeInput[], group: string): readonly FileTreeNode[] {\n const root = directory(group, group);\n for (const file of files) {\n const relative = file.path.startsWith(`${group}/`) ? file.path.slice(group.length + 1) : file.path;\n const segments = relative.split(\"/\").filter((segment) => segment !== \"\");\n const name = segments.pop();\n if (name === undefined) continue;\n let parent = root;\n for (const segment of segments) {\n const path = `${parent.path}/${segment}`;\n const child = parent.directories.get(segment) ?? directory(segment, path);\n parent.directories.set(segment, child);\n parent = child;\n }\n parent.files.push({ kind: \"file\", name, path: file.path, bytes: file.bytes });\n }\n return freezeDirectory(root).children;\n}\n", "const TITLE_KEYS = [\n \"display_name\", \"title\", \"name\", \"shot_id\", \"scene_id\", \"episode_id\", \"character_id\",\n \"location_id\", \"view_id\", \"prop_id\", \"state_id\", \"decision_id\", \"occurrence_id\", \"record_id\", \"id\"\n] as const;\n\nexport interface JsonlRecord {\n readonly line: number;\n readonly raw: string;\n readonly value?: unknown;\n readonly title: string;\n readonly type?: string;\n readonly status?: string;\n readonly error?: string;\n}\n\nfunction objectRecord(value: unknown): Record<string, unknown> | undefined {\n return typeof value === \"object\" && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n}\n\nfunction stringField(record: Record<string, unknown>, keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const value = record[key];\n if (typeof value === \"string\" && value.trim() !== \"\") return value;\n }\n return undefined;\n}\n\nfunction metadata(value: unknown, line: number): Pick<JsonlRecord, \"title\" | \"type\" | \"status\"> {\n const record = objectRecord(value);\n if (record === undefined) return { title: typeof value === \"string\" ? value : JSON.stringify(value) ?? `\u7B2C ${String(line)} \u884C` };\n const type = stringField(record, [\"record_type\", \"type\", \"kind\"]);\n const acceptance = objectRecord(record.creator_acceptance);\n const status = stringField(record, [\"status\"]) ?? (acceptance === undefined ? undefined : stringField(acceptance, [\"status\"]));\n return {\n title: stringField(record, TITLE_KEYS) ?? `\u8BB0\u5F55 ${String(line)}`,\n ...(type === undefined ? {} : { type }),\n ...(status === undefined ? {} : { status })\n };\n}\n\nexport function parseJsonl(content: string): JsonlRecord[] {\n const records: JsonlRecord[] = [];\n const lines = content.replaceAll(\"\\r\\n\", \"\\n\").split(\"\\n\");\n for (const [index, raw] of lines.entries()) {\n if (raw.trim() === \"\") continue;\n try {\n const value = JSON.parse(raw) as unknown;\n records.push({ line: index + 1, raw, value, ...metadata(value, index + 1) });\n } catch (error) {\n records.push({\n line: index + 1,\n raw,\n title: `\u7B2C ${String(index + 1)} \u884C\u683C\u5F0F\u9519\u8BEF`,\n error: error instanceof Error ? error.message : String(error)\n });\n }\n }\n return records;\n}\n\nconst PREVIEW_LIMIT = 200;\n\nexport function JsonlPreview({ content, label }: { readonly content: string; readonly label: string }) {\n const records = parseJsonl(content);\n if (records.length === 0) return <div className=\"oh-story-markdown-empty\">\u8FD9\u4E2A JSONL \u6587\u4EF6\u8FD8\u662F\u7A7A\u7684\u3002</div>;\n const valid = records.filter((record) => record.error === undefined).length;\n const errors = records.length - valid;\n const visible = records.slice(0, PREVIEW_LIMIT);\n return <section className=\"oh-story-jsonl\" aria-label={`${label} \u7ED3\u6784\u5316\u9884\u89C8`}>\n <header className=\"oh-story-jsonl-summary\">\n <strong>{errors === 0 ? `${String(valid)} \u6761\u8BB0\u5F55` : `${String(valid)} \u6761\u6709\u6548\u8BB0\u5F55`}</strong>\n {errors > 0 && <span>{String(errors)} \u6761\u683C\u5F0F\u9519\u8BEF</span>}\n {records.length > PREVIEW_LIMIT && <span>\u4EC5\u663E\u793A\u524D {String(PREVIEW_LIMIT)} \u6761</span>}\n </header>\n <div className=\"oh-story-jsonl-records\">\n {visible.map((record) => record.error === undefined\n ? <details key={record.line} open={records.length <= 2}>\n <summary>\n <span>\u7B2C {String(record.line)} \u884C</span>\n <strong>{record.title}</strong>\n {record.type !== undefined && <code>{record.type}</code>}\n {record.status !== undefined && <em>{record.status}</em>}\n </summary>\n <pre><code>{JSON.stringify(record.value, null, 2)}</code></pre>\n </details>\n : <div className=\"oh-story-jsonl-error\" key={record.line} role=\"alert\">\n <strong>{record.title}</strong>\n <span>{record.error}</span>\n <pre>{record.raw}</pre>\n </div>)}\n </div>\n </section>;\n}\n", "import type { ReactNode } from \"react\";\n\nconst INLINE = /(`[^`\\n]+`|\\*\\*[^*\\n]+\\*\\*|~~[^~\\n]+~~|\\[[^\\]\\n]+\\]\\(https?:\\/\\/[^)\\s]+\\)|\\*[^*\\n]+\\*)/gu;\n\nfunction inline(source: string, key: string): ReactNode[] {\n const nodes: ReactNode[] = [];\n let cursor = 0;\n for (const match of source.matchAll(INLINE)) {\n const token = match[0];\n const index = match.index;\n if (index > cursor) nodes.push(source.slice(cursor, index));\n if (token.startsWith(\"`\")) nodes.push(<code key={`${key}-${String(index)}`}>{token.slice(1, -1)}</code>);\n else if (token.startsWith(\"**\")) nodes.push(<strong key={`${key}-${String(index)}`}>{token.slice(2, -2)}</strong>);\n else if (token.startsWith(\"~~\")) nodes.push(<del key={`${key}-${String(index)}`}>{token.slice(2, -2)}</del>);\n else if (token.startsWith(\"*\")) nodes.push(<em key={`${key}-${String(index)}`}>{token.slice(1, -1)}</em>);\n else {\n const link = /^\\[([^\\]]+)\\]\\((https?:\\/\\/[^)\\s]+)\\)$/u.exec(token);\n nodes.push(link === null ? token : <a key={`${key}-${String(index)}`} href={link[2]} target=\"_blank\" rel=\"noreferrer\">{link[1]}</a>);\n }\n cursor = index + token.length;\n }\n if (cursor < source.length) nodes.push(source.slice(cursor));\n return nodes;\n}\n\ntype Alignment = \"left\" | \"center\" | \"right\" | undefined;\ninterface ListItem { readonly text: string; readonly checked?: boolean }\n\nexport type MarkdownBlock =\n | { readonly kind: \"code\"; readonly lines: readonly string[]; readonly language?: string }\n | { readonly kind: \"heading\"; readonly text: string; readonly level: number }\n | { readonly kind: \"quote\"; readonly lines: readonly string[] }\n | { readonly kind: \"ul\" | \"ol\"; readonly items: readonly ListItem[]; readonly start?: number }\n | { readonly kind: \"table\"; readonly headers: readonly string[]; readonly rows: readonly (readonly string[])[]; readonly alignments: readonly Alignment[] }\n | { readonly kind: \"rule\" }\n | { readonly kind: \"paragraph\"; readonly lines: readonly string[] };\n\nfunction splitTableRow(line: string): string[] {\n let source = line.trim();\n if (source.startsWith(\"|\")) source = source.slice(1);\n if (source.endsWith(\"|\")) source = source.slice(0, -1);\n const cells: string[] = [];\n let cell = \"\";\n for (let index = 0; index < source.length; index += 1) {\n const character = source[index] ?? \"\";\n if (character === \"\\\\\" && source[index + 1] === \"|\") {\n cell += \"|\";\n index += 1;\n } else if (character === \"|\") {\n cells.push(cell.trim());\n cell = \"\";\n } else cell += character;\n }\n cells.push(cell.trim());\n return cells;\n}\n\nfunction tableAlignments(line: string): Alignment[] | undefined {\n const cells = splitTableRow(line);\n if (cells.length === 0 || !cells.every((cell) => /^:?-{3,}:?$/u.test(cell))) return undefined;\n return cells.map((cell) => {\n if (cell.startsWith(\":\") && cell.endsWith(\":\")) return \"center\";\n if (cell.endsWith(\":\")) return \"right\";\n if (cell.startsWith(\":\")) return \"left\";\n return undefined;\n });\n}\n\nfunction beginsBlock(lines: readonly string[], index: number): boolean {\n const line = lines[index] ?? \"\";\n return /^(`{3,}|~{3,})\\s*[\\w-]*\\s*$/u.test(line)\n || /^#{1,6}\\s+/u.test(line)\n || /^(?:-{3,}|\\*{3,}|_{3,})\\s*$/u.test(line)\n || /^>\\s?/u.test(line)\n || /^[-*+]\\s+/u.test(line)\n || /^\\d+[.)]\\s+/u.test(line)\n || (line.includes(\"|\") && tableAlignments(lines[index + 1] ?? \"\") !== undefined);\n}\n\nexport function parseMarkdownBlocks(markdown: string): MarkdownBlock[] {\n const lines = markdown.replaceAll(\"\\r\\n\", \"\\n\").split(\"\\n\");\n const result: MarkdownBlock[] = [];\n for (let index = 0; index < lines.length;) {\n const line = lines[index] ?? \"\";\n if (line.trim() === \"\") { index += 1; continue; }\n\n const fence = /^(`{3,}|~{3,})\\s*([\\w-]*)\\s*$/u.exec(line);\n if (fence !== null) {\n const marker = fence[1] ?? \"```\";\n const markerCharacter = marker[0] ?? \"`\";\n const closing = new RegExp(`^${markerCharacter}{${String(marker.length)},}\\\\s*$`, \"u\");\n const code: string[] = [];\n index += 1;\n while (index < lines.length && !closing.test(lines[index] ?? \"\")) { code.push(lines[index] ?? \"\"); index += 1; }\n if (index < lines.length) index += 1;\n result.push({ kind: \"code\", lines: code, ...(fence[2] === undefined || fence[2] === \"\" ? {} : { language: fence[2] }) });\n continue;\n }\n\n const heading = /^(#{1,6})\\s+(.+)$/u.exec(line);\n if (heading !== null) {\n result.push({ kind: \"heading\", text: heading[2] ?? \"\", level: heading[1]?.length ?? 1 });\n index += 1;\n continue;\n }\n if (/^(?:-{3,}|\\*{3,}|_{3,})\\s*$/u.test(line)) { result.push({ kind: \"rule\" }); index += 1; continue; }\n\n const alignments = line.includes(\"|\") ? tableAlignments(lines[index + 1] ?? \"\") : undefined;\n if (alignments !== undefined) {\n const headers = splitTableRow(line);\n const rows: string[][] = [];\n index += 2;\n while (index < lines.length && (lines[index] ?? \"\").includes(\"|\") && (lines[index] ?? \"\").trim() !== \"\") {\n rows.push(splitTableRow(lines[index] ?? \"\"));\n index += 1;\n }\n result.push({ kind: \"table\", headers, rows, alignments });\n continue;\n }\n\n if (/^>\\s?/u.test(line)) {\n const quote: string[] = [];\n while (index < lines.length && /^>\\s?/u.test(lines[index] ?? \"\")) {\n quote.push((lines[index] ?? \"\").replace(/^>\\s?/u, \"\"));\n index += 1;\n }\n result.push({ kind: \"quote\", lines: quote });\n continue;\n }\n\n const unordered = /^[-*+]\\s+(.+)$/u.exec(line);\n const ordered = /^(\\d+)[.)]\\s+(.+)$/u.exec(line);\n if (unordered !== null || ordered !== null) {\n const kind = unordered !== null ? \"ul\" : \"ol\";\n const items: ListItem[] = [];\n const pattern = kind === \"ul\" ? /^[-*+]\\s+(.+)$/u : /^\\d+[.)]\\s+(.+)$/u;\n const start = ordered === null ? undefined : Number(ordered[1]);\n while (index < lines.length) {\n const item = pattern.exec(lines[index] ?? \"\");\n if (item === null) break;\n const source = item[1] ?? \"\";\n const task = /^\\[([ xX])\\]\\s+(.+)$/u.exec(source);\n items.push(task === null ? { text: source } : { text: task[2] ?? \"\", checked: task[1]?.toLocaleLowerCase() === \"x\" });\n index += 1;\n }\n result.push({ kind, items, ...(start === undefined ? {} : { start }) });\n continue;\n }\n\n const paragraph: string[] = [line];\n index += 1;\n while (index < lines.length) {\n const next = lines[index] ?? \"\";\n if (next.trim() === \"\" || beginsBlock(lines, index)) break;\n paragraph.push(next);\n index += 1;\n }\n result.push({ kind: \"paragraph\", lines: paragraph });\n }\n return result;\n}\n\nfunction Heading({ block, blockKey }: { readonly block: Extract<MarkdownBlock, { readonly kind: \"heading\" }>; readonly blockKey: string }) {\n const children = inline(block.text, blockKey);\n switch (block.level) {\n case 1: return <h1>{children}</h1>;\n case 2: return <h2>{children}</h2>;\n case 3: return <h3>{children}</h3>;\n case 4: return <h4>{children}</h4>;\n case 5: return <h5>{children}</h5>;\n default: return <h6>{children}</h6>;\n }\n}\n\nexport function MarkdownPreview({ content, label }: { readonly content: string; readonly label: string }) {\n const parsed = parseMarkdownBlocks(content);\n if (parsed.length === 0) return <div className=\"oh-story-markdown-empty\">\u8FD9\u4E2A Markdown \u6587\u4EF6\u8FD8\u662F\u7A7A\u7684\u3002</div>;\n return <article className=\"oh-story-markdown\" aria-label={`${label} \u6E32\u67D3\u9884\u89C8`}>\n {parsed.map((block, index) => {\n const key = `block-${String(index)}`;\n if (block.kind === \"code\") return <pre key={key}><code data-language={block.language}>{block.lines.join(\"\\n\")}</code></pre>;\n if (block.kind === \"rule\") return <hr key={key} />;\n if (block.kind === \"quote\") return <blockquote key={key}>{block.lines.map((line, lineIndex) => <p key={`${key}-${String(lineIndex)}`}>{inline(line, `${key}-${String(lineIndex)}`)}</p>)}</blockquote>;\n if (block.kind === \"ul\" || block.kind === \"ol\") {\n const items = block.items.map((item, itemIndex) => <li key={`${key}-${String(itemIndex)}`} className={item.checked === undefined ? undefined : \"oh-story-task-item\"}>\n {item.checked === undefined ? null : <input type=\"checkbox\" checked={item.checked} readOnly disabled aria-label={item.checked ? \"\u5DF2\u5B8C\u6210\" : \"\u672A\u5B8C\u6210\"} />}\n {inline(item.text, `${key}-${String(itemIndex)}`)}\n </li>);\n return block.kind === \"ul\" ? <ul key={key}>{items}</ul> : <ol key={key} start={block.start}>{items}</ol>;\n }\n if (block.kind === \"table\") return <div className=\"oh-story-markdown-table\" key={key}>\n <table>\n <thead><tr>{block.headers.map((cell, cellIndex) => <th key={`${key}-h-${String(cellIndex)}`} style={{ textAlign: block.alignments[cellIndex] }}>{inline(cell, `${key}-h-${String(cellIndex)}`)}</th>)}</tr></thead>\n <tbody>{block.rows.map((row, rowIndex) => <tr key={`${key}-r-${String(rowIndex)}`}>{block.headers.map((_, cellIndex) => <td key={`${key}-r-${String(rowIndex)}-${String(cellIndex)}`} style={{ textAlign: block.alignments[cellIndex] }}>{inline(row[cellIndex] ?? \"\", `${key}-r-${String(rowIndex)}-${String(cellIndex)}`)}</td>)}</tr>)}</tbody>\n </table>\n </div>;\n if (block.kind === \"heading\") return <Heading key={key} block={block} blockKey={key} />;\n if (block.kind === \"paragraph\") return <p key={key}>{block.lines.map((line, lineIndex) => <span key={`${key}-${String(lineIndex)}`}>{lineIndex === 0 ? null : <br />}{inline(line, `${key}-${String(lineIndex)}`)}</span>)}</p>;\n return null;\n })}\n </article>;\n}\n", ".oh-story-bridge-marker { display: none; }\n.oh-story-split-surface { display: contents; font-family: var(--dsw-font-family); }\n\n/* DSH documents every [data-slot] wrapper as a stable addressable styling\n seam. The official Session body and composer stay mounted; this only turns\n their scroll host into a three-column writing surface. */\n[data-conversation-scroll]:has(> [data-slot=\"conversation.session\"] > .oh-story-split-surface) {\n --os-border: var(--dsw-alias-border-l2);\n --os-muted: var(--dsw-alias-label-secondary);\n display: grid;\n grid-template-columns: clamp(184px, 16%, 200px) minmax(240px, 1fr) clamp(408px, 40%, 520px);\n grid-template-rows: minmax(0, 1fr);\n min-height: 0;\n overflow-x: hidden;\n overflow-y: auto;\n position: relative;\n scrollbar-gutter: stable;\n}\n\n[data-conversation-scroll]:has(> [data-slot=\"conversation.session\"] > .oh-story-split-surface)\n > [data-slot=\"conversation.session\"] > :not(.oh-story-split-surface) {\n grid-column: 3;\n grid-row: 1;\n min-width: 0;\n min-height: 100%;\n border-left: 1px solid var(--os-border);\n}\n\n[data-conversation-scroll]:has(> [data-slot=\"conversation.session\"] > .oh-story-split-surface)\n > [data-composer-seat] {\n grid-column: 3;\n grid-row: 1;\n align-self: start;\n min-width: 0;\n width: 100%;\n position: sticky;\n top: calc(var(--oh-story-scroll-height, 720px) - var(--dsh-composer-height, 152px));\n bottom: auto;\n}\n\n.oh-story-tree,\n.oh-story-editor {\n box-sizing: border-box;\n grid-row: 1;\n position: sticky;\n top: 0;\n align-self: start;\n min-width: 0;\n min-height: 0;\n height: 100%;\n color: inherit;\n background: var(--dsw-alias-bg-base);\n}\n\n.oh-story-tree {\n grid-column: 1;\n overflow: auto;\n padding: 14px 10px 24px;\n border-right: 1px solid var(--os-border);\n background: var(--dsw-specific-sidebar-fill);\n}\n\n.oh-story-editor {\n display: flex;\n grid-column: 2;\n overflow: hidden;\n flex-direction: column;\n}\n\n.oh-story-brand,\n.oh-story-editor header,\n.oh-story-role summary {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n\n.oh-story-brand { min-height: 28px; gap: 8px; padding: 0 5px 8px 7px; font-size: 14px; font-weight: 500; white-space: nowrap; }\n.oh-story-brand-cluster { display: flex; min-width: 0; align-items: center; gap: 6px; }\n.oh-story-brand-cluster strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: inherit; }\n.oh-story-kind { flex: none; padding: 1px 6px; border-radius: 5px; color: var(--dsw-alias-label-secondary); background: var(--dsw-alias-button-ghost-active-fill); font-size: 11px; line-height: 16px; font-weight: 500; }\n\n.oh-story-brand button,\n.oh-story-save,\n.oh-story-role button {\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-base);\n padding: 3px 9px;\n cursor: pointer;\n font: inherit;\n}\n\n.oh-story-brand button { display: grid; width: 28px; height: 28px; place-items: center; border: 0; padding: 0; background: transparent; font-size: 16px; }\n.oh-story-brand button:hover,\n.oh-story-save:hover:not(:disabled),\n.oh-story-role button:hover { color: var(--dsw-alias-label-primary); background: var(--dsw-alias-interactive-bg-hover); }\n.oh-story-brand button:focus-visible,\n.oh-story-save:focus-visible,\n.oh-story-mode-tabs button:focus-visible,\n.oh-story-editor-tabs button:focus-visible,\n.oh-story-tree nav button:focus-visible,\n.oh-story-role button:focus-visible { outline: 2px solid var(--dsw-alias-state-business-primary); outline-offset: -2px; }\n.oh-story-save:disabled { opacity: .48; cursor: default; }\n\n.oh-story-mode-tabs { display: flex; margin: 0 4px 8px; padding: 2px; border: 1px solid var(--os-border); border-radius: 7px; background: var(--dsw-alias-bg-layer-1); }\n\n.oh-story-mode-tabs button,\n.oh-story-editor-tabs button {\n position: relative;\n min-height: 24px;\n flex: 1;\n border: 0;\n color: var(--os-muted);\n background: transparent;\n border-radius: 5px;\n cursor: pointer;\n font: inherit;\n font-size: 11px;\n}\n\n.oh-story-mode-tabs button:hover,\n.oh-story-editor-tabs button:hover { color: var(--dsw-alias-label-primary); }\n.oh-story-mode-tabs button[aria-selected=\"true\"],\n.oh-story-editor-tabs button[aria-selected=\"true\"] { color: var(--dsw-alias-label-primary); background: var(--dsw-alias-bg-base); box-shadow: 0 1px 2px rgb(0 0 0 / 8%); font-weight: 500; }\n\n.oh-story-file-group,\n.oh-story-file-folder { margin: 0; }\n.oh-story-file-group > summary,\n.oh-story-file-folder > summary {\n display: flex;\n align-items: center;\n gap: 5px;\n min-height: 26px;\n padding: 0 7px;\n border-radius: 6px;\n color: var(--os-muted);\n cursor: pointer;\n list-style: none;\n font-size: 11px;\n font-weight: 600;\n}\n.oh-story-file-folder > summary { padding-left: min(calc(7px + var(--oh-story-indent, 0px)), 49px); }\n.oh-story-file-group > summary { margin-top: 3px; }\n.oh-story-file-group > summary::-webkit-details-marker,\n.oh-story-file-folder > summary::-webkit-details-marker { display: none; }\n.oh-story-file-group > summary::before,\n.oh-story-file-folder > summary::before { width: 8px; content: \"\u203A\"; transform: rotate(0); transition: transform .12s ease; }\n.oh-story-file-group[open] > summary::before,\n.oh-story-file-folder[open] > summary::before { transform: rotate(90deg); }\n.oh-story-file-group > summary:hover,\n.oh-story-file-folder > summary:hover { color: var(--dsw-alias-label-primary); background: var(--dsw-alias-interactive-bg-hover); }\n.oh-story-file-group > summary span,\n.oh-story-file-folder > summary span { margin-left: auto; color: var(--dsw-alias-label-secondary); font-weight: 400; }\n\n.oh-story-tree nav button {\n display: block;\n width: 100%;\n overflow: hidden;\n padding: 6px 8px 6px min(calc(14px + var(--oh-story-indent, 0px)), 56px);\n border: 0;\n border-radius: 6px;\n color: inherit;\n background: transparent;\n text-align: left;\n text-overflow: ellipsis;\n white-space: nowrap;\n cursor: pointer;\n font: inherit;\n font-size: 12px;\n}\n.oh-story-tree nav button:hover { background: var(--dsw-alias-interactive-bg-hover); }\n.oh-story-tree nav button[aria-current=\"page\"] { background: var(--dsw-alias-button-ghost-active-fill); color: var(--dsw-alias-label-primary); }\n.oh-story-tree nav button[data-agent-target] { box-shadow: inset 2px 0 var(--dsw-alias-state-business-primary); }\n\n.oh-story-editor header {\n min-height: 44px;\n flex: none;\n padding: 0 14px;\n border-bottom: 1px solid var(--os-border);\n}\n\n.oh-story-editor-path {\n overflow: hidden;\n min-width: 0;\n flex: 1;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 12px;\n color: var(--os-muted);\n}\n.oh-story-editor-path > span { overflow: hidden; display: block; text-overflow: ellipsis; }\n.oh-story-editor-path > strong { display: none; overflow: hidden; text-overflow: ellipsis; font: inherit; }\n\n.oh-story-editor-actions { display: flex; flex: none; align-items: center; gap: 8px; }\n.oh-story-editor-tabs {\n display: flex;\n padding: 2px;\n border: 1px solid var(--os-border);\n border-radius: 7px;\n background: var(--dsw-alias-bg-layer-1);\n}\n.oh-story-editor-tabs button { min-height: 24px; padding: 0 9px; border-radius: 5px; font-size: 11px; }\n.oh-story-save { min-height: 28px; }\n\n.oh-story-editor textarea {\n box-sizing: border-box;\n width: 100%;\n min-height: 0;\n flex: 1;\n resize: none;\n border: 0;\n outline: 0;\n padding: clamp(20px, 6%, 48px) clamp(22px, 10%, 84px) 48px;\n color: var(--dsw-alias-label-primary);\n background: transparent;\n font: 16px/1.9 ui-serif, \"Songti SC\", \"STSong\", Georgia, serif;\n}\n.oh-story-editor textarea[data-format=\"structured\"] {\n tab-size: 2;\n font: 13px/1.65 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n}\n\n.oh-story-markdown {\n box-sizing: border-box;\n width: 100%;\n min-height: 0;\n flex: 1;\n overflow: auto;\n padding: clamp(24px, 8%, 56px) clamp(24px, 10%, 92px) 64px;\n color: var(--dsw-alias-label-primary);\n font: 16px/1.85 ui-serif, \"Songti SC\", \"STSong\", Georgia, serif;\n overflow-wrap: anywhere;\n}\n.oh-story-markdown > :first-child { margin-top: 0; }\n.oh-story-markdown > :last-child { margin-bottom: 0; }\n.oh-story-markdown h1,\n.oh-story-markdown h2,\n.oh-story-markdown h3,\n.oh-story-markdown h4,\n.oh-story-markdown h5,\n.oh-story-markdown h6 { margin: 1.45em 0 .6em; font-family: var(--dsw-font-family); line-height: 1.35; letter-spacing: -.01em; }\n.oh-story-markdown h1 { font-size: 1.75em; }\n.oh-story-markdown h2 { padding-bottom: .35em; border-bottom: 1px solid var(--os-border); font-size: 1.35em; }\n.oh-story-markdown h3 { font-size: 1.15em; }\n.oh-story-markdown p { margin: .75em 0; }\n.oh-story-markdown ul,\n.oh-story-markdown ol { margin: .75em 0; padding-left: 1.6em; }\n.oh-story-markdown li { margin: .28em 0; }\n.oh-story-markdown .oh-story-task-item { list-style: none; margin-left: -1.35em; }\n.oh-story-task-item input { margin: 0 .55em 0 0; accent-color: var(--dsw-alias-state-business-primary); }\n.oh-story-markdown blockquote { margin: 1em 0; padding: .1em 1em; border-left: 3px solid var(--dsw-alias-state-business-primary); color: var(--dsw-alias-label-secondary); }\n/* DSH gives inline code its own alias; the block fill is a different surface. */\n.oh-story-markdown code { padding: .15em .4em; border-radius: 4px; background: var(--dsw-alias-markdown-inline-code); font: .86em/1.6 ui-monospace, SFMono-Regular, Menlo, monospace; }\n.oh-story-markdown pre { overflow: auto; margin: 1em 0; padding: 14px 16px; border: 1px solid var(--dsw-alias-border-l1); border-radius: 10px; background: var(--dsw-alias-markdown-code-block); }\n.oh-story-markdown pre code { padding: 0; background: transparent; }\n.oh-story-markdown a { color: var(--dsw-alias-state-business-primary); text-decoration-thickness: 1px; text-underline-offset: 3px; }\n.oh-story-markdown del { color: var(--os-muted); }\n.oh-story-markdown-table { overflow-x: auto; margin: 1em 0; border: 1px solid var(--os-border); border-radius: 10px; }\n.oh-story-markdown table { width: 100%; border-collapse: collapse; font-family: ui-sans-serif, system-ui, \"PingFang SC\", sans-serif; font-size: 13px; line-height: 1.55; }\n.oh-story-markdown th,\n.oh-story-markdown td { min-width: 96px; padding: 9px 12px; border-right: 1px solid var(--os-border); border-bottom: 1px solid var(--os-border); vertical-align: top; }\n.oh-story-markdown th:last-child,\n.oh-story-markdown td:last-child { border-right: 0; }\n.oh-story-markdown tbody tr:last-child td { border-bottom: 0; }\n.oh-story-markdown th { background: var(--dsw-alias-bg-layer-1); font-weight: 600; }\n.oh-story-markdown hr { margin: 2em 0; border: 0; border-top: 1px solid var(--os-border); }\n.oh-story-markdown-empty { margin: auto; color: var(--os-muted); font-size: 13px; }\n\n.oh-story-jsonl {\n box-sizing: border-box;\n display: flex;\n width: 100%;\n min-height: 0;\n flex: 1;\n overflow: hidden;\n flex-direction: column;\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-base);\n}\n.oh-story-jsonl-summary { display: flex; min-height: 42px; flex: none; align-items: center; gap: 10px; padding: 0 18px; border-bottom: 1px solid var(--os-border); font-size: 12px; }\n.oh-story-jsonl-summary strong { font-weight: 600; }\n.oh-story-jsonl-summary span { color: var(--os-muted); }\n.oh-story-jsonl-records { overflow: auto; padding: 14px 18px 36px; }\n.oh-story-jsonl details,\n.oh-story-jsonl-error { overflow: hidden; margin-bottom: 10px; border: 1px solid var(--os-border); border-radius: 10px; background: var(--dsw-alias-bg-layer-1); }\n.oh-story-jsonl summary { display: flex; min-height: 42px; align-items: center; gap: 9px; padding: 0 12px; cursor: pointer; list-style: none; font: 12px/1.4 var(--dsw-font-family); }\n.oh-story-jsonl summary::-webkit-details-marker { display: none; }\n.oh-story-jsonl summary::before { content: \"\u203A\"; color: var(--os-muted); font-size: 16px; transition: transform .12s ease; }\n.oh-story-jsonl details[open] summary::before { transform: rotate(90deg); }\n.oh-story-jsonl summary > span { flex: none; color: var(--os-muted); font-variant-numeric: tabular-nums; }\n.oh-story-jsonl summary > strong { overflow: hidden; min-width: 80px; flex: 1; text-overflow: ellipsis; white-space: nowrap; font-weight: 600; }\n.oh-story-jsonl summary > code,\n.oh-story-jsonl summary > em { flex: none; padding: 2px 6px; border-radius: 5px; background: var(--dsw-alias-button-ghost-active-fill); color: var(--dsw-alias-label-secondary); font: 11px/1.35 ui-monospace, SFMono-Regular, Menlo, monospace; font-style: normal; }\n.oh-story-jsonl pre { overflow: auto; max-height: 520px; margin: 0; padding: 14px 16px; border-top: 1px solid var(--os-border); background: var(--dsw-alias-markdown-code-block); color: var(--dsw-alias-label-secondary); white-space: pre-wrap; overflow-wrap: anywhere; font: 12px/1.6 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; }\n.oh-story-jsonl-error { display: grid; gap: 5px; padding: 12px; border-color: var(--dsw-alias-state-error-primary); font-size: 12px; }\n.oh-story-jsonl-error > strong { color: var(--dsw-alias-state-error-primary); }\n.oh-story-jsonl-error > span { color: var(--os-muted); }\n.oh-story-jsonl-error pre { margin: 3px -12px -12px; }\n\n.oh-story-stream,\n.oh-story-conflict,\n.oh-story-warning {\n flex: none;\n padding: 7px 12px;\n border-bottom: 1px solid var(--os-border);\n font-size: 11px;\n line-height: 1.4;\n}\n\n.oh-story-stream { color: var(--dsw-alias-state-business-primary); background: var(--dsw-alias-button-ghost-active-fill); }\n.oh-story-stream[data-stage=\"streaming\"] { animation: oh-story-pulse 1.2s ease-in-out infinite alternate; }\n.oh-story-conflict { color: var(--dsw-alias-state-warn-label); background: var(--dsw-specific-tip); }\n.oh-story-conflict > div { display: flex; gap: 6px; margin-top: 6px; }\n.oh-story-conflict button,\n.oh-story-empty button {\n border: 1px solid var(--os-border);\n border-radius: 6px;\n color: inherit;\n background: var(--dsw-alias-bg-base);\n padding: 3px 8px;\n cursor: pointer;\n font: inherit;\n}\n.oh-story-warning { color: var(--dsw-alias-state-warn-label); background: var(--dsw-specific-tip); }\n\n@keyframes oh-story-pulse { to { opacity: .62; } }\n@media (prefers-reduced-motion: reduce) { .oh-story-stream[data-stage=\"streaming\"] { animation: none; } }\n\n.oh-story-empty { margin: auto; max-width: 480px; padding: 30px; color: var(--os-muted); line-height: 1.7; text-align: center; }\n.oh-story-error { margin: 8px; padding: 8px 10px; border-radius: 8px; color: var(--dsw-alias-state-error-primary); background: var(--dsw-specific-tip); font-size: 12px; }\n\n.oh-story-role { display: flex; flex-direction: column; margin: 0; overflow: hidden; }\n.oh-story-role summary { min-height: 24px; padding: 0; cursor: pointer; list-style: none; font-size: 14px; line-height: 24px; }\n.oh-story-role summary::-webkit-details-marker { display: none; }\n.oh-story-role summary span { color: var(--dsw-alias-state-business-primary); }\n.oh-story-role summary strong { margin-right: auto; color: var(--dsw-alias-label-secondary); font-weight: 500; }\n.oh-story-role summary em { color: var(--dsw-alias-label-caption); font-style: normal; font-size: 12px; }\n.oh-story-role[data-state=\"error\"] summary em { color: var(--dsw-alias-state-error-primary); }\n.oh-story-role pre { max-height: 260px; overflow: auto; margin: 4px 0 4px 4px; padding: 12px 16px; border: 1px solid var(--dsw-alias-border-l1); border-radius: 12px; color: var(--dsw-alias-label-secondary); background: var(--dsw-alias-markdown-code-block); white-space: pre-wrap; font: var(--dsw-font-markdown-code-block-small); }\n.oh-story-role > button { align-self: flex-start; margin: 4px 0 2px 4px; font-size: 11px; }\n\n[data-conversation-scroll][data-oh-story-layout=\"medium\"]:has(> [data-slot=\"conversation.session\"] > .oh-story-split-surface) {\n grid-template-columns: clamp(104px, 18%, 184px) minmax(200px, 1fr) clamp(300px, 45%, 408px);\n}\n\n[data-conversation-scroll][data-oh-story-layout=\"compact\"]:has(> [data-slot=\"conversation.session\"] > .oh-story-split-surface) {\n grid-template-columns: clamp(80px, 16%, 104px) minmax(0, 1fr) clamp(228px, 48%, 300px);\n}\n\n[data-oh-story-layout=\"medium\"] .oh-story-file-folder > summary { padding-left: min(calc(7px + var(--oh-story-indent, 0px)), 35px); }\n[data-oh-story-layout=\"medium\"] .oh-story-tree nav button { padding-left: min(calc(14px + var(--oh-story-indent, 0px)), 42px); }\n[data-oh-story-layout=\"medium\"] .oh-story-editor textarea { padding-right: 28px; padding-left: 28px; }\n\n[data-oh-story-layout=\"compact\"] .oh-story-tree { padding-inline: 4px; }\n[data-oh-story-layout=\"compact\"] .oh-story-brand { gap: 4px; padding-inline: 2px; font-size: 11px; }\n[data-oh-story-layout=\"compact\"] .oh-story-brand-cluster { gap: 4px; }\n[data-oh-story-layout=\"compact\"] .oh-story-brand-cluster strong > span { display: none; }\n[data-oh-story-layout=\"compact\"] .oh-story-kind { padding-inline: 4px; font-size: 11px; }\n[data-oh-story-layout=\"compact\"] .oh-story-brand button { width: 24px; height: 24px; }\n[data-oh-story-layout=\"compact\"] .oh-story-mode-tabs { margin-inline: 0; }\n[data-oh-story-layout=\"compact\"] .oh-story-mode-tabs button { padding-inline: 3px; font-size: 11px; }\n[data-oh-story-layout=\"compact\"] .oh-story-file-folder > summary { padding-left: min(calc(5px + var(--oh-story-indent, 0px)), 19px); }\n[data-oh-story-layout=\"compact\"] .oh-story-tree nav button { padding-right: 4px; padding-left: min(calc(7px + var(--oh-story-indent, 0px)), 21px); }\n[data-oh-story-layout=\"compact\"] .oh-story-editor header {\n display: grid;\n min-height: 68px;\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: 24px 36px;\n align-content: center;\n gap: 0;\n padding: 4px 3px;\n}\n[data-oh-story-layout=\"compact\"] .oh-story-editor-path > span { display: none; }\n[data-oh-story-layout=\"compact\"] .oh-story-editor-path > strong { display: block; font-size: 11px; line-height: 24px; }\n[data-oh-story-layout=\"compact\"] .oh-story-editor-actions { width: 100%; min-width: 0; justify-content: flex-end; gap: 4px; }\n[data-oh-story-layout=\"compact\"] .oh-story-editor-tabs { min-width: 0; flex: 1; }\n[data-oh-story-layout=\"compact\"] .oh-story-editor-tabs button { min-width: 0; padding-inline: 2px; white-space: nowrap; }\n[data-oh-story-layout=\"compact\"] .oh-story-save { flex: none; padding-inline: 4px; white-space: nowrap; font-size: 11px; }\n[data-oh-story-layout=\"compact\"] .oh-story-editor textarea { padding: 16px 12px 40px; }\n[data-oh-story-layout=\"compact\"] .oh-story-markdown { padding: 18px 12px 48px; }\n[data-oh-story-layout=\"compact\"] .oh-story-jsonl-summary { padding-inline: 10px; }\n[data-oh-story-layout=\"compact\"] .oh-story-jsonl-records { padding: 8px 7px 28px; }\n[data-oh-story-layout=\"compact\"] .oh-story-jsonl summary { gap: 6px; padding-inline: 7px; }\n[data-oh-story-layout=\"compact\"] .oh-story-jsonl summary > span { display: none; }\n[data-oh-story-layout=\"compact\"] .oh-story-jsonl summary > strong { min-width: 32px; }\n[data-oh-story-layout=\"compact\"] .oh-story-jsonl summary > code,\n[data-oh-story-layout=\"compact\"] .oh-story-jsonl summary > em { display: none; }\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA6F,mDAI7F,eAAiJ,kBACjJ,mBAA6B;;;ACyB7B,IAAM,oBAAoB,oBAAI,IAAI,CAAC,gBAAM,gBAAM,gBAAM,gBAAM,gBAAM,0BAAM,CAAC,GAClE,oBAAoB,oBAAI,IAAI,CAAC,gBAAM,4BAAQ,sBAAO,gBAAM,gBAAM,kCAAS,cAAI,CAAC,GAC5E,qBAAqB,8BACrB,iBAAiB,oBAAI,IAAI,CAAC,SAAS,QAAQ,sBAAsB,QAAQ,YAAY,eAAe,CAAC;AAGpG,SAAS,mBAAmB,UAAiE;AAClG,WAAW,cAAc,SAAS,UAAU,WAAW,GAAG;AACxD,QAAM,OAAO,SAAS,MAAM,IAAI,UAAU;AAC1C,QAAI,SAAS;AACb,eAAW,QAAQ,KAAK,MAAM,WAAW,GAAG;AAC1C,YAAM,YAA2C,KAAK,KAAK,IAAI,gBAAgB;AAC/E,YAAI,WAAW,WAAW,UAAW,QAAO;AAAA,MAC9C;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aAAa,WAAuC;AAC3D,UAAQ,WAAW;AAAA,IACjB,KAAK;AAAM,aAAO;AAAA,IAClB,KAAK;AAAM,aAAO;AAAA,IAClB,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAK,aAAO;AAAA;AAAA,IACjB,KAAK;AAAK,aAAO;AAAA,IACjB,KAAK;AAAK,aAAO;AAAA,IACjB;AAAS;AAAA,EACX;AACF;AAGO,SAAS,iBAAiB,KAAa,KAA2C;AACvF,MAAM,QAAQ,IAAI,OAAO,IAAI,IAAI,QAAQ,wBAAwB,MAAM,CAAC,eAAe,GAAG,EAAE,KAAK,GAAG;AACpG,MAAI,UAAU,KAAM;AACpB,MAAI,QAAQ;AACZ,WAAS,QAAQ,MAAM,QAAQ,MAAM,CAAC,EAAE,QAAQ,QAAQ,IAAI,QAAQ,SAAS,GAAG;AAC9E,QAAM,YAAY,IAAI,KAAK,KAAK;AAChC,QAAI,cAAc,IAAM,QAAO,EAAE,OAAO,UAAU,GAAK;AACvD,QAAI,cAAc,MAAM;AAAE,eAAS;AAAW;AAAA,IAAU;AACxD,QAAM,SAAS,IAAI,QAAQ,CAAC;AAC5B,QAAI,WAAW,OAAW,QAAO,EAAE,OAAO,UAAU,GAAM;AAC1D,QAAI,WAAW,KAAK;AAClB,UAAM,MAAM,IAAI,MAAM,QAAQ,GAAG,QAAQ,CAAC;AAC1C,UAAI,CAAC,iBAAiB,KAAK,GAAG,EAAG,QAAO,EAAE,OAAO,UAAU,GAAM;AACjE,eAAS,OAAO,aAAa,OAAO,SAAS,KAAK,EAAE,CAAC,GACrD,SAAS;AACT;AAAA,IACF;AACA,QAAM,UAAU,aAAa,MAAM;AACnC,QAAI,YAAY,OAAW,QAAO,EAAE,OAAO,UAAU,GAAM;AAC3D,aAAS,SACT,SAAS;AAAA,EACX;AACA,SAAO,EAAE,OAAO,UAAU,GAAM;AAClC;AAEA,SAAS,gBAAgB,KAAa,KAAiC;AACrE,MAAM,QAAQ,iBAAiB,KAAK,GAAG;AACvC,SAAO,OAAO,aAAa,KAAO,MAAM,QAAQ;AAClD;AAEA,SAAS,WAAW,KAAkD;AACpE,MAAI;AACF,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,WAAO,OAAO,SAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,IAAI,QAAmC;AAAA,EACnH,QAAQ;AAAE;AAAA,EAAkB;AAC9B;AAEA,SAAS,iBAAiBA,OAAc,QAAgB,SAAiB,OAAwE;AAC/I,MAAM,WAAW,WAAW,OAAO;AACnC,MAAIA,UAAS;AACX,WAAO;AAAA,MACL;AAAA,MAAQ,MAAAA;AAAA,MAAM;AAAA,MAAS;AAAA,MACvB,MAAM,iBAAiB,SAAS,WAAW,GAAG;AAAA,MAC9C,WAAW;AAAA,MACX,SAAS;AAAA,MACT,SAAS,iBAAiB,SAAS,SAAS,GAAG;AAAA,MAC/C,YAAY;AAAA,IACd;AAEF,MAAIA,UAAS;AACX,WAAO;AAAA,MACL;AAAA,MAAQ,MAAAA;AAAA,MAAM;AAAA,MAAS;AAAA,MACvB,MAAM,iBAAiB,SAAS,WAAW,GAAG;AAAA,MAC9C,WAAW;AAAA,MACX,SAAS,gBAAgB,SAAS,YAAY;AAAA,MAC9C,SAAS,iBAAiB,SAAS,YAAY,GAAG;AAAA,MAClD,YAAY,UAAU,gBAAgB;AAAA,IACxC;AAEF,MAAIA,UAAS,qBAAsB;AACnC,MAAM,UAAU,gBAAgB,SAAS,SAAS;AAClD,MAAI,YAAY,OAAQ;AACxB,MAAM,OAAO,iBAAiB,SAAS,MAAM,GAAG;AAChD,SAAI,YAAY,WACP;AAAA,IACL;AAAA,IAAQ,MAAAA;AAAA,IAAM;AAAA,IAAS;AAAA,IAAO;AAAA,IAC9B,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS,iBAAiB,SAAS,WAAW,GAAG;AAAA,IACjD,YAAY;AAAA,EACd,IAEE,YAAY,gBACP;AAAA,IACL;AAAA,IAAQ,MAAAA;AAAA,IAAM;AAAA,IAAS;AAAA,IAAO;AAAA,IAC9B,WAAW;AAAA,IACX,SAAS,gBAAgB,SAAS,SAAS;AAAA,IAC3C,SAAS,iBAAiB,SAAS,SAAS,GAAG,UAAU,aAAa,SAAY,KAAK;AAAA,IACvF,YAAY,UAAU,gBAAgB;AAAA,EACxC,IAEE,YAAY,WACP;AAAA,IACL;AAAA,IAAQ,MAAAA;AAAA,IAAM;AAAA,IAAS;AAAA,IAAO;AAAA,IAC9B,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS,iBAAiB,SAAS,SAAS,GAAG;AAAA,IAC/C,YAAY;AAAA,EACd,IAEK,EAAE,QAAQ,MAAAA,OAAM,SAAS,OAAO,MAAM,WAAW,QAAW,SAAS,QAAW,SAAS,QAAW,YAAY,GAAM;AAC/H;AAEA,SAAS,qBAAqB,MAA+C;AAC3E,MAAM,SAAS,iBAAiB,KAAK,MAAM,KAAK,QAAQ,KAAK,SAAS,SAAS;AAC/E,MAAI,WAAW,OAAW,QAAO,CAAC;AAClC,MAAM,OAAO,KAAK;AAClB,SAAI,MAAM,SAAS,UAAU,KAAK,MAAM,WAAW,IAAU,CAAC,MAAM,IAC7D,KAAK,MAAM,IAAI,CAAC,MAAM,WAAW;AAAA,IACtC,GAAG;AAAA,IACH,QAAQ,KAAK,MAAM,WAAW,IAAI,KAAK,SAAS,GAAG,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC;AAAA,IAC/E,MAAM,KAAK;AAAA,IACX,WAAW,KAAK,YAAY,OAAO,iBAAiB;AAAA,IACpD,SAAS,KAAK,WAAW;AAAA,IACzB,SAAS,KAAK;AAAA,EAChB,EAAE;AACJ;AAEA,SAAS,aAAa,QAAkC,OAA8C;AACpG,WAAW,SAAS;AAClB,IAAM,UAAU,SAAQ,MAAM,KAAK,GACnC,aAAa,MAAM,UAAU,KAAK;AAEtC;AAGO,SAAS,cACd,cACA,UAAmC,MACX;AACxB,MAAM,SAAiC,CAAC;AACxC,eAAa,cAAc,CAAC,SAAS;AAAE,WAAO,KAAK,GAAG,qBAAqB,IAAI,CAAC;AAAA,EAAG,CAAC;AACpF,WAAW,SAAS,SAAS,UAAU,CAAC,GAAG;AACzC,QAAI,MAAM,SAAS,YAAa;AAChC,QAAM,QAAQ,iBAAiB,MAAM,MAAM,MAAM,QAAQ,MAAM,SAAS,WAAW;AACnF,IAAI,UAAU,UAAa,CAAC,OAAO,KAAK,CAAC,cAAc,UAAU,WAAW,MAAM,MAAM,KAAG,OAAO,KAAK,KAAK;AAAA,EAC9G;AACA,SAAO;AACT;AAGO,SAAS,gBAAgB,cAA+D;AAC7F,MAAM,MAAM,oBAAI,IAAY;AAC5B,sBAAa,cAAc,CAAC,SAAS;AAAE,IAAI,eAAe,IAAI,KAAK,IAAI,KAAG,IAAI,IAAI,KAAK,MAAM;AAAA,EAAG,CAAC,GAC1F;AACT;AAEA,SAAS,uBAAuB,OAAgC;AAC9D,MAAM,SAAS,MAAM,SAAS,QAAQ,sBAAsB;AAC5D,MAAI,EAAE,UAAU,UAAU,MAAM,QAAS,QAAO;AAChD,MAAM,QAAQ,MAAM,YAAY,SAAS,SACrC,MAAM,WAAW,QACjB,MAAM,UAAU,SAAS,SAAS,MAAM,SAAS,QAAQ;AAC7D,MAAI,UAAU,OAAW,QAAO;AAAA,IAC9B,GAAG,MAAM,IAAI,CAAC,MAAM,UAAU,GAAG,MAAM,MAAM,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE;AAAA,IAC9E,GAAG;AAAA,EACL;AACA,MAAI,MAAM,SAAS,KAAM,QAAO;AAChC,MAAM,WAAW,iBAAiB,MAAM,KAAK,MAAM,MAAM,QAAQ,MAAM,KAAK,SAAS,SAAS;AAC9F,SAAO,UAAU,SAAS,SAAY,SAAS,CAAC,GAAG,MAAM,MAAM,KAAK,SAAS,IAAI,IAAI,GAAG,MAAM;AAChG;AAGO,SAAS,sBAAsB,MAAwC;AAC5E,WAAW,OAAO,KAAK,MAAM,WAAW,GAAG;AACzC,QAAM,OAAO,KAAK,MAAM,IAAI,GAAG;AAC/B,QAAI,MAAM,SAAS,YAAa;AAChC,QAAM,OAAQ,KAAK,KAA2C,MACxD,SAAS,SAAS,SAAY,SAAY,uBAAuB,IAAI,EAAE,GAAG,EAAE;AAClF,QAAI,WAAW,OAAW,QAAO;AAAA,EACnC;AAEF;AAGO,SAAS,qBAAqB,MAA0B,KAA6C;AAC1G,MAAI,SAAS,UAAa,SAAS,GAAI;AACvC,MAAM,aAAa,KAAK,WAAW,MAAM,GAAG,GACtC,OAAO,KAAK,WAAW,MAAM,GAAG,EAAE,QAAQ,QAAQ,EAAE,GACpD,aAAa,SAAS,UAAa,WAAW,WAAW,GAAG,IAAI,GAAG;AACzE,OAAK,WAAW,WAAW,GAAG,KAAK,cAAc,KAAK,UAAU,KAAK,WAAW,WAAW,OAAO,MAAM,CAAC,WAAY;AACrH,MAAM,WAAW,aAAa,WAAW,MAAM,KAAK,SAAS,CAAC,IAAI,WAAW,QAAQ,UAAU,EAAE,GAC3F,CAACC,UAAS,IAAI,SAAS,MAAM,KAAK,CAAC;AAEzC,MAAK,IADYA,eAAc,WAAc,kBAAkB,IAAIA,UAAS,KAAK,kBAAkB,IAAIA,UAAS,OAC9F,aAAa,sBAAuB,CAAC,mBAAmB,KAAK,QAAQ,MACnF,UAAS,MAAM,GAAG,EAAE,KAAK,CAAC,SAAS,SAAS,QAAQ,SAAS,OAAO,SAAS,EAAE;AACnF,WAAO;AACT;AAEO,SAAS,qBAAqB,MAAqD;AACxF,MAAI,SAAS,mBAAoB,QAAO;AACxC,MAAMA,aAAY,MAAM,MAAM,KAAK,CAAC,EAAE,CAAC;AACvC,MAAIA,eAAc,UAAa,kBAAkB,IAAIA,UAAS,EAAG,QAAO;AACxE,MAAIA,eAAc,UAAa,kBAAkB,IAAIA,UAAS,EAAG,QAAO;AAE1E;AAGO,SAAS,gBAAgB,UAAgC,MAAkC;AAChG,MAAI,SAAS,cAAc,eAAgB,QAAO,SAAS;AAC3D,MAAI,SAAS,cAAc,gBAAgB;AACzC,QAAI,SAAS,YAAY,UAAa,SAAS,YAAY,UAAa,SAAS,YAAY,GAAI;AACjG,QAAI,SAAS,WAAY,QAAO,KAAK,SAAS,SAAS,OAAO,IAAI,KAAK,MAAM,SAAS,OAAO,EAAE,KAAK,SAAS,OAAO,IAAI;AACxH,QAAM,KAAK,KAAK,QAAQ,SAAS,OAAO;AACxC,WAAO,KAAK,IAAI,SAAY,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC,GAAG,SAAS,OAAO,GAAG,KAAK,MAAM,KAAK,SAAS,QAAQ,MAAM,CAAC;AAAA,EAChH;AACA,MAAI,SAAS,cAAc,eAAe;AACxC,QAAI,SAAS,YAAY,OAAW;AACpC,QAAM,UAAU,6BAA6B,KAAK,SAAS,OAAO,IAAI,CAAC;AACvE,QAAI,YAAY,OAAW;AAC3B,QAAM,OAAO,OAAO,SAAS,SAAS,EAAE,GAClC,QAAQ,KAAK,MAAM;AAAA,CAAI,GACvB,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,QAAQ,IAAI,CAAC;AACnD,iBAAM,OAAO,IAAI,GAAG,SAAS,OAAO,GAC7B,MAAM,KAAK;AAAA,CAAI;AAAA,EACxB;AAEF;;;ACjPA,SAAS,UAAUC,OAAc,MAAgC;AAC/D,SAAO,EAAE,MAAAA,OAAM,MAAM,aAAa,oBAAI,IAAI,GAAG,OAAO,CAAC,EAAE;AACzD;AAEA,SAAS,aAAa,MAAiC,OAA0C;AAC/F,SAAO,KAAK,KAAK,cAAc,MAAM,MAAM,cAAc,EAAE,SAAS,GAAK,CAAC;AAC5E;AAEA,SAAS,gBAAgB,OAA4C;AACnE,MAAM,cAAc,CAAC,GAAG,MAAM,YAAY,OAAO,CAAC,EAAE,IAAI,eAAe,EAAE,KAAK,YAAY,GACpF,QAAQ,CAAC,GAAG,MAAM,KAAK,EAAE,KAAK,YAAY;AAChD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,MAAM;AAAA,IACZ,MAAM,MAAM;AAAA,IACZ,WAAW,MAAM,SAAS,YAAY,OAAO,CAAC,KAAK,UAAU,MAAM,MAAM,WAAW,CAAC;AAAA,IACrF,UAAU,CAAC,GAAG,aAAa,GAAG,KAAK;AAAA,EACrC;AACF;AAEO,SAAS,cAAc,OAAiC,OAAwC;AACrG,MAAM,OAAO,UAAU,OAAO,KAAK;AACnC,WAAW,QAAQ,OAAO;AAExB,QAAM,YADW,KAAK,KAAK,WAAW,GAAG,KAAK,GAAG,IAAI,KAAK,KAAK,MAAM,MAAM,SAAS,CAAC,IAAI,KAAK,MACpE,MAAM,GAAG,EAAE,OAAO,CAAC,YAAY,YAAY,EAAE,GACjEA,QAAO,SAAS,IAAI;AAC1B,QAAIA,UAAS,OAAW;AACxB,QAAI,SAAS;AACb,aAAW,WAAW,UAAU;AAC9B,UAAM,OAAO,GAAG,OAAO,IAAI,IAAI,OAAO,IAChC,QAAQ,OAAO,YAAY,IAAI,OAAO,KAAK,UAAU,SAAS,IAAI;AACxE,aAAO,YAAY,IAAI,SAAS,KAAK,GACrC,SAAS;AAAA,IACX;AACA,WAAO,MAAM,KAAK,EAAE,MAAM,QAAQ,MAAAA,OAAM,MAAM,KAAK,MAAM,OAAO,KAAK,MAAM,CAAC;AAAA,EAC9E;AACA,SAAO,gBAAgB,IAAI,EAAE;AAC/B;;;ACFmC,uDAhE7B,aAAa;AAAA,EACjB;AAAA,EAAgB;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAW;AAAA,EAAY;AAAA,EAAc;AAAA,EACtE;AAAA,EAAe;AAAA,EAAW;AAAA,EAAW;AAAA,EAAY;AAAA,EAAe;AAAA,EAAiB;AAAA,EAAa;AAChG;AAYA,SAAS,aAAa,OAAqD;AACzE,SAAO,OAAO,SAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,IAAI,QAAmC;AACnH;AAEA,SAAS,YAAY,QAAiC,MAA6C;AACjG,WAAW,OAAO,MAAM;AACtB,QAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,OAAO,SAAU,YAAY,MAAM,KAAK,MAAM,GAAI,QAAO;AAAA,EAC/D;AAEF;AAEA,SAAS,SAAS,OAAgB,MAA8D;AAC9F,MAAM,SAAS,aAAa,KAAK;AACjC,MAAI,WAAW,OAAW,QAAO,EAAE,OAAO,OAAO,SAAU,WAAW,QAAQ,KAAK,UAAU,KAAK,KAAK,UAAK,OAAO,IAAI,CAAC,UAAK;AAC7H,MAAM,OAAO,YAAY,QAAQ,CAAC,eAAe,QAAQ,MAAM,CAAC,GAC1D,aAAa,aAAa,OAAO,kBAAkB,GACnD,SAAS,YAAY,QAAQ,CAAC,QAAQ,CAAC,MAAM,eAAe,SAAY,SAAY,YAAY,YAAY,CAAC,QAAQ,CAAC;AAC5H,SAAO;AAAA,IACL,OAAO,YAAY,QAAQ,UAAU,KAAK,gBAAM,OAAO,IAAI,CAAC;AAAA,IAC5D,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,KAAK;AAAA,IACrC,GAAI,WAAW,SAAY,CAAC,IAAI,EAAE,OAAO;AAAA,EAC3C;AACF;AAEO,SAAS,WAAW,SAAgC;AACzD,MAAM,UAAyB,CAAC,GAC1B,QAAQ,QAAQ,WAAW;AAAA,GAAQ;AAAA,CAAI,EAAE,MAAM;AAAA,CAAI;AACzD,WAAW,CAAC,OAAO,GAAG,KAAK,MAAM,QAAQ;AACvC,QAAI,IAAI,KAAK,MAAM;AACnB,UAAI;AACF,YAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,gBAAQ,KAAK,EAAE,MAAM,QAAQ,GAAG,KAAK,OAAO,GAAG,SAAS,OAAO,QAAQ,CAAC,EAAE,CAAC;AAAA,MAC7E,SAAS,OAAO;AACd,gBAAQ,KAAK;AAAA,UACX,MAAM,QAAQ;AAAA,UACd;AAAA,UACA,OAAO,UAAK,OAAO,QAAQ,CAAC,CAAC;AAAA,UAC7B,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,CAAC;AAAA,MACH;AAEF,SAAO;AACT;AAEA,IAAM,gBAAgB;AAEf,SAAS,aAAa,EAAE,SAAS,MAAM,GAAyD;AACrG,MAAM,UAAU,WAAW,OAAO;AAClC,MAAI,QAAQ,WAAW,EAAG,QAAO,4CAAC,SAAI,WAAU,2BAA0B,2EAAgB;AAC1F,MAAM,QAAQ,QAAQ,OAAO,CAAC,WAAW,OAAO,UAAU,MAAS,EAAE,QAC/D,SAAS,QAAQ,SAAS,OAC1B,UAAU,QAAQ,MAAM,GAAG,aAAa;AAC9C,SAAO,6CAAC,aAAQ,WAAU,kBAAiB,cAAY,GAAG,KAAK,mCAC7D;AAAA,iDAAC,YAAO,WAAU,0BAChB;AAAA,kDAAC,YAAQ,qBAAW,IAAI,GAAG,OAAO,KAAK,CAAC,wBAAS,GAAG,OAAO,KAAK,CAAC,mCAAS;AAAA,MACzE,SAAS,KAAK,6CAAC,UAAM;AAAA,eAAO,MAAM;AAAA,QAAE;AAAA,SAAM;AAAA,MAC1C,QAAQ,SAAS,iBAAiB,6CAAC,UAAK;AAAA;AAAA,QAAM,OAAO,aAAa;AAAA,QAAE;AAAA,SAAE;AAAA,OACzE;AAAA,IACA,4CAAC,SAAI,WAAU,0BACZ,kBAAQ,IAAI,CAAC,WAAW,OAAO,UAAU,SACtC,6CAAC,aAA0B,MAAM,QAAQ,UAAU,GACnD;AAAA,mDAAC,aACC;AAAA,qDAAC,UAAK;AAAA;AAAA,UAAG,OAAO,OAAO,IAAI;AAAA,UAAE;AAAA,WAAE;AAAA,QAC/B,4CAAC,YAAQ,iBAAO,OAAM;AAAA,QACrB,OAAO,SAAS,UAAa,4CAAC,UAAM,iBAAO,MAAK;AAAA,QAChD,OAAO,WAAW,UAAa,4CAAC,QAAI,iBAAO,QAAO;AAAA,SACrD;AAAA,MACA,4CAAC,SAAI,sDAAC,UAAM,eAAK,UAAU,OAAO,OAAO,MAAM,CAAC,GAAE,GAAO;AAAA,SAP3C,OAAO,IAQvB,IACE,6CAAC,SAAI,WAAU,wBAAyC,MAAK,SAC7D;AAAA,kDAAC,YAAQ,iBAAO,OAAM;AAAA,MACtB,4CAAC,UAAM,iBAAO,OAAM;AAAA,MACpB,4CAAC,SAAK,iBAAO,KAAI;AAAA,SAH0B,OAAO,IAIpD,CAAM,GACV;AAAA,KACF;AACF;;;ACjF0C,IAAAC,sBAAA,8BATpC,SAAS;AAEf,SAAS,OAAO,QAAgB,KAA0B;AACxD,MAAM,QAAqB,CAAC,GACxB,SAAS;AACb,WAAW,SAAS,OAAO,SAAS,MAAM,GAAG;AAC3C,QAAM,QAAQ,MAAM,CAAC,GACf,QAAQ,MAAM;AAEpB,QADI,QAAQ,UAAQ,MAAM,KAAK,OAAO,MAAM,QAAQ,KAAK,CAAC,GACtD,MAAM,WAAW,GAAG,EAAG,OAAM,KAAK,6CAAC,UAAsC,gBAAM,MAAM,GAAG,EAAE,KAA7C,GAAG,GAAG,IAAI,OAAO,KAAK,CAAC,EAAwB,CAAO;AAAA,aAC9F,MAAM,WAAW,IAAI,EAAG,OAAM,KAAK,6CAAC,YAAwC,gBAAM,MAAM,GAAG,EAAE,KAA7C,GAAG,GAAG,IAAI,OAAO,KAAK,CAAC,EAAwB,CAAS;AAAA,aACxG,MAAM,WAAW,IAAI,EAAG,OAAM,KAAK,6CAAC,SAAqC,gBAAM,MAAM,GAAG,EAAE,KAA7C,GAAG,GAAG,IAAI,OAAO,KAAK,CAAC,EAAwB,CAAM;AAAA,aAClG,MAAM,WAAW,GAAG,EAAG,OAAM,KAAK,6CAAC,QAAoC,gBAAM,MAAM,GAAG,EAAE,KAA7C,GAAG,GAAG,IAAI,OAAO,KAAK,CAAC,EAAwB,CAAK;AAAA,SACnG;AACH,UAAM,OAAO,0CAA0C,KAAK,KAAK;AACjE,YAAM,KAAK,SAAS,OAAO,QAAQ,6CAAC,OAAkC,MAAM,KAAK,CAAC,GAAG,QAAO,UAAS,KAAI,cAAc,eAAK,CAAC,KAAlF,GAAG,GAAG,IAAI,OAAO,KAAK,CAAC,EAA6D,CAAI;AAAA,IACrI;AACA,aAAS,QAAQ,MAAM;AAAA,EACzB;AACA,SAAI,SAAS,OAAO,UAAQ,MAAM,KAAK,OAAO,MAAM,MAAM,CAAC,GACpD;AACT;AAcA,SAAS,cAAc,MAAwB;AAC7C,MAAI,SAAS,KAAK,KAAK;AACvB,EAAI,OAAO,WAAW,GAAG,MAAG,SAAS,OAAO,MAAM,CAAC,IAC/C,OAAO,SAAS,GAAG,MAAG,SAAS,OAAO,MAAM,GAAG,EAAE;AACrD,MAAM,QAAkB,CAAC,GACrB,OAAO;AACX,WAAS,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS,GAAG;AACrD,QAAM,YAAY,OAAO,KAAK,KAAK;AACnC,IAAI,cAAc,QAAQ,OAAO,QAAQ,CAAC,MAAM,OAC9C,QAAQ,KACR,SAAS,KACA,cAAc,OACvB,MAAM,KAAK,KAAK,KAAK,CAAC,GACtB,OAAO,MACF,QAAQ;AAAA,EACjB;AACA,eAAM,KAAK,KAAK,KAAK,CAAC,GACf;AACT;AAEA,SAAS,gBAAgB,MAAuC;AAC9D,MAAM,QAAQ,cAAc,IAAI;AAChC,MAAI,QAAM,WAAW,KAAK,CAAC,MAAM,MAAM,CAAC,SAAS,eAAe,KAAK,IAAI,CAAC;AAC1E,WAAO,MAAM,IAAI,CAAC,SAAS;AACzB,UAAI,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,EAAG,QAAO;AACvD,UAAI,KAAK,SAAS,GAAG,EAAG,QAAO;AAC/B,UAAI,KAAK,WAAW,GAAG,EAAG,QAAO;AAAA,IAEnC,CAAC;AACH;AAEA,SAAS,YAAY,OAA0B,OAAwB;AACrE,MAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,SAAO,+BAA+B,KAAK,IAAI,KAC1C,cAAc,KAAK,IAAI,KACvB,+BAA+B,KAAK,IAAI,KACxC,SAAS,KAAK,IAAI,KAClB,aAAa,KAAK,IAAI,KACtB,eAAe,KAAK,IAAI,KACvB,KAAK,SAAS,GAAG,KAAK,gBAAgB,MAAM,QAAQ,CAAC,KAAK,EAAE,MAAM;AAC1E;AAEO,SAAS,oBAAoB,UAAmC;AACrE,MAAM,QAAQ,SAAS,WAAW;AAAA,GAAQ;AAAA,CAAI,EAAE,MAAM;AAAA,CAAI,GACpD,SAA0B,CAAC;AACjC,WAAS,QAAQ,GAAG,QAAQ,MAAM,UAAS;AACzC,QAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,QAAI,KAAK,KAAK,MAAM,IAAI;AAAE,eAAS;AAAG;AAAA,IAAU;AAEhD,QAAM,QAAQ,iCAAiC,KAAK,IAAI;AACxD,QAAI,UAAU,MAAM;AAClB,UAAM,SAAS,MAAM,CAAC,KAAK,OACrB,kBAAkB,OAAO,CAAC,KAAK,KAC/B,UAAU,IAAI,OAAO,IAAI,eAAe,IAAI,OAAO,OAAO,MAAM,CAAC,WAAW,GAAG,GAC/E,OAAiB,CAAC;AAExB,WADA,SAAS,GACF,QAAQ,MAAM,UAAU,CAAC,QAAQ,KAAK,MAAM,KAAK,KAAK,EAAE;AAAK,aAAK,KAAK,MAAM,KAAK,KAAK,EAAE,GAAG,SAAS;AAC5G,MAAI,QAAQ,MAAM,WAAQ,SAAS,IACnC,OAAO,KAAK,EAAE,MAAM,QAAQ,OAAO,MAAM,GAAI,MAAM,CAAC,MAAM,UAAa,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,UAAU,MAAM,CAAC,EAAE,EAAG,CAAC;AACvH;AAAA,IACF;AAEA,QAAM,UAAU,qBAAqB,KAAK,IAAI;AAC9C,QAAI,YAAY,MAAM;AACpB,aAAO,KAAK,EAAE,MAAM,WAAW,MAAM,QAAQ,CAAC,KAAK,IAAI,OAAO,QAAQ,CAAC,GAAG,UAAU,EAAE,CAAC,GACvF,SAAS;AACT;AAAA,IACF;AACA,QAAI,+BAA+B,KAAK,IAAI,GAAG;AAAE,aAAO,KAAK,EAAE,MAAM,OAAO,CAAC,GAAG,SAAS;AAAG;AAAA,IAAU;AAEtG,QAAM,aAAa,KAAK,SAAS,GAAG,IAAI,gBAAgB,MAAM,QAAQ,CAAC,KAAK,EAAE,IAAI;AAClF,QAAI,eAAe,QAAW;AAC5B,UAAM,UAAU,cAAc,IAAI,GAC5B,OAAmB,CAAC;AAE1B,WADA,SAAS,GACF,QAAQ,MAAM,WAAW,MAAM,KAAK,KAAK,IAAI,SAAS,GAAG,MAAM,MAAM,KAAK,KAAK,IAAI,KAAK,MAAM;AACnG,aAAK,KAAK,cAAc,MAAM,KAAK,KAAK,EAAE,CAAC,GAC3C,SAAS;AAEX,aAAO,KAAK,EAAE,MAAM,SAAS,SAAS,MAAM,WAAW,CAAC;AACxD;AAAA,IACF;AAEA,QAAI,SAAS,KAAK,IAAI,GAAG;AACvB,UAAM,QAAkB,CAAC;AACzB,aAAO,QAAQ,MAAM,UAAU,SAAS,KAAK,MAAM,KAAK,KAAK,EAAE;AAC7D,cAAM,MAAM,MAAM,KAAK,KAAK,IAAI,QAAQ,UAAU,EAAE,CAAC,GACrD,SAAS;AAEX,aAAO,KAAK,EAAE,MAAM,SAAS,OAAO,MAAM,CAAC;AAC3C;AAAA,IACF;AAEA,QAAM,YAAY,kBAAkB,KAAK,IAAI,GACvC,UAAU,sBAAsB,KAAK,IAAI;AAC/C,QAAI,cAAc,QAAQ,YAAY,MAAM;AAC1C,UAAM,OAAO,cAAc,OAAO,OAAO,MACnC,QAAoB,CAAC,GACrB,UAAU,SAAS,OAAO,oBAAoB,qBAC9C,QAAQ,YAAY,OAAO,SAAY,OAAO,QAAQ,CAAC,CAAC;AAC9D,aAAO,QAAQ,MAAM,UAAQ;AAC3B,YAAM,OAAO,QAAQ,KAAK,MAAM,KAAK,KAAK,EAAE;AAC5C,YAAI,SAAS,KAAM;AACnB,YAAM,SAAS,KAAK,CAAC,KAAK,IACpB,OAAO,wBAAwB,KAAK,MAAM;AAChD,cAAM,KAAK,SAAS,OAAO,EAAE,MAAM,OAAO,IAAI,EAAE,MAAM,KAAK,CAAC,KAAK,IAAI,SAAS,KAAK,CAAC,GAAG,kBAAkB,MAAM,IAAI,CAAC,GACpH,SAAS;AAAA,MACX;AACA,aAAO,KAAK,EAAE,MAAM,OAAO,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM,EAAG,CAAC;AACtE;AAAA,IACF;AAEA,QAAM,YAAsB,CAAC,IAAI;AAEjC,SADA,SAAS,GACF,QAAQ,MAAM,UAAQ;AAC3B,UAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,UAAI,KAAK,KAAK,MAAM,MAAM,YAAY,OAAO,KAAK,EAAG;AACrD,gBAAU,KAAK,IAAI,GACnB,SAAS;AAAA,IACX;AACA,WAAO,KAAK,EAAE,MAAM,aAAa,OAAO,UAAU,CAAC;AAAA,EACrD;AACA,SAAO;AACT;AAEA,SAAS,QAAQ,EAAE,OAAO,SAAS,GAAwG;AACzI,MAAM,WAAW,OAAO,MAAM,MAAM,QAAQ;AAC5C,UAAQ,MAAM,OAAO;AAAA,IACnB,KAAK;AAAG,aAAO,6CAAC,QAAI,UAAS;AAAA,IAC7B,KAAK;AAAG,aAAO,6CAAC,QAAI,UAAS;AAAA,IAC7B,KAAK;AAAG,aAAO,6CAAC,QAAI,UAAS;AAAA,IAC7B,KAAK;AAAG,aAAO,6CAAC,QAAI,UAAS;AAAA,IAC7B,KAAK;AAAG,aAAO,6CAAC,QAAI,UAAS;AAAA,IAC7B;AAAS,aAAO,6CAAC,QAAI,UAAS;AAAA,EAChC;AACF;AAEO,SAAS,gBAAgB,EAAE,SAAS,MAAM,GAAyD;AACxG,MAAM,SAAS,oBAAoB,OAAO;AAC1C,SAAI,OAAO,WAAW,IAAU,6CAAC,SAAI,WAAU,2BAA0B,8EAAmB,IACrF,6CAAC,aAAQ,WAAU,qBAAoB,cAAY,GAAG,KAAK,6BAC/D,iBAAO,IAAI,CAAC,OAAO,UAAU;AAC5B,QAAM,MAAM,SAAS,OAAO,KAAK,CAAC;AAClC,QAAI,MAAM,SAAS,OAAQ,QAAO,6CAAC,SAAc,uDAAC,UAAK,iBAAe,MAAM,UAAW,gBAAM,MAAM,KAAK;AAAA,CAAI,GAAE,KAAlE,GAAyE;AACrH,QAAI,MAAM,SAAS,OAAQ,QAAO,6CAAC,UAAQ,GAAK;AAChD,QAAI,MAAM,SAAS,QAAS,QAAO,6CAAC,gBAAsB,gBAAM,MAAM,IAAI,CAAC,MAAM,cAAc,6CAAC,OAAuC,iBAAO,MAAM,GAAG,GAAG,IAAI,OAAO,SAAS,CAAC,EAAE,KAA1E,GAAG,GAAG,IAAI,OAAO,SAAS,CAAC,EAAiD,CAAI,KAAnI,GAAqI;AACzL,QAAI,MAAM,SAAS,QAAQ,MAAM,SAAS,MAAM;AAC9C,UAAM,QAAQ,MAAM,MAAM,IAAI,CAAC,MAAM,cAAc,8CAAC,QAAuC,WAAW,KAAK,YAAY,SAAY,SAAY,sBAC5I;AAAA,aAAK,YAAY,SAAY,OAAO,6CAAC,WAAM,MAAK,YAAW,SAAS,KAAK,SAAS,UAAQ,IAAC,UAAQ,IAAC,cAAY,KAAK,UAAU,uBAAQ,sBAAO;AAAA,QAC9I,OAAO,KAAK,MAAM,GAAG,GAAG,IAAI,OAAO,SAAS,CAAC,EAAE;AAAA,WAFU,GAAG,GAAG,IAAI,OAAO,SAAS,CAAC,EAGvF,CAAK;AACL,aAAO,MAAM,SAAS,OAAO,6CAAC,QAAc,mBAAN,GAAY,IAAQ,6CAAC,QAAa,OAAO,MAAM,OAAQ,mBAA1B,GAAgC;AAAA,IACrG;AACA,WAAI,MAAM,SAAS,UAAgB,6CAAC,SAAI,WAAU,2BAChD,wDAAC,WACC;AAAA,mDAAC,WAAM,uDAAC,QAAI,gBAAM,QAAQ,IAAI,CAAC,MAAM,cAAc,6CAAC,QAAyC,OAAO,EAAE,WAAW,MAAM,WAAW,SAAS,EAAE,GAAI,iBAAO,MAAM,GAAG,GAAG,MAAM,OAAO,SAAS,CAAC,EAAE,KAAjI,GAAG,GAAG,MAAM,OAAO,SAAS,CAAC,EAAsG,CAAK,GAAE,GAAK;AAAA,MAC3M,6CAAC,WAAO,gBAAM,KAAK,IAAI,CAAC,KAAK,aAAa,6CAAC,QAAyC,gBAAM,QAAQ,IAAI,CAAC,GAAG,cAAc,6CAAC,QAA6D,OAAO,EAAE,WAAW,MAAM,WAAW,SAAS,EAAE,GAAI,iBAAO,IAAI,SAAS,KAAK,IAAI,GAAG,GAAG,MAAM,OAAO,QAAQ,CAAC,IAAI,OAAO,SAAS,CAAC,EAAE,KAAzL,GAAG,GAAG,MAAM,OAAO,QAAQ,CAAC,IAAI,OAAO,SAAS,CAAC,EAA0I,CAAK,KAA9Q,GAAG,GAAG,MAAM,OAAO,QAAQ,CAAC,EAAoP,CAAK,GAAE;AAAA,OAC5U,KAJ+E,GAKjF,IACI,MAAM,SAAS,YAAkB,6CAAC,WAAkB,OAAc,UAAU,OAA7B,GAAkC,IACjF,MAAM,SAAS,cAAoB,6CAAC,OAAa,gBAAM,MAAM,IAAI,CAAC,MAAM,cAAc,8CAAC,UAA0C;AAAA,oBAAc,IAAI,OAAO,6CAAC,QAAG;AAAA,MAAI,OAAO,MAAM,GAAG,GAAG,IAAI,OAAO,SAAS,CAAC,EAAE;AAAA,SAA3G,GAAG,GAAG,IAAI,OAAO,SAAS,CAAC,EAAkF,CAAO,KAA1K,GAA4K,IACpN;AAAA,EACT,CAAC,GACH;AACF;;;ACzMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ALmLS,IAAAC,sBAAA,8BA9JI,OAAO,YACP,SAAS,CAAC,OAAO;AA+C9B,SAAS,YAAe,SAAY,QAAsB;AACxD,SAAO,OAAO,UAAW,aAAc,OAA2B,OAAO,IAAI;AAC/E;AAEA,SAAS,uBAAuB;AAC9B,aAAO,2BAAY;AAAA,IACjB,MAAM,OAAwB;AAAA,MAC5B,SAAS,CAAC;AAAA,MACV,YAAY;AAAA,MACZ,UAAU,CAAC;AAAA,MACX,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AAAA,IACA,SAAS;AAAA,MACP,YAAY,CAAC,OAAO,WAA+C;AACjE,cAAM,UAAU,YAAY,MAAM,SAAS,MAAM;AAAA,MACnD;AAAA,MACA,eAAe,CAAC,OAAO,WAAkD;AACvE,cAAM,aAAa,YAAY,MAAM,YAAY,MAAM;AAAA,MACzD;AAAA,MACA,aAAa,CAAC,OAAO,WAA4C;AAC/D,cAAM,WAAW,YAAY,MAAM,UAAU,MAAM;AAAA,MACrD;AAAA,MACA,aAAa,CAAC,OAAO,WAAuC;AAC1D,cAAM,WAAW,YAAY,MAAM,UAAU,MAAM;AAAA,MACrD;AAAA,MACA,cAAc,CAAC,OAAO,WAAkC;AACtD,cAAM,YAAY,YAAY,MAAM,WAAW,MAAM;AAAA,MACvD;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,IAAM,wBAAN,cAAoC,MAAM;AAAA,EACxC,YAAqB,QAAgB,SAAiB;AAAE,UAAM,OAAO;AAAhD;AAAA,EAAmD;AAAA,EAAnD;AACvB,GAEM,cAAkE;AAAA,EACtE,OAAO,CAAC,gBAAM,gBAAM,gBAAM,gBAAM,gBAAM,0BAAM;AAAA,EAC5C,OAAO,CAAC,gBAAM,gBAAM,4BAAQ,sBAAO,gBAAM,gBAAM,kCAAS,cAAI;AAC9D,GAEM,kBAAkB,CAAC,SAAS,OAAO,GACnC,eAAe,CAAC,WAAW,QAAQ;AAEzC,SAAS,aACP,OACA,QACA,SACA,QACM;AACN,MAAI;AAKJ,MAJI,MAAM,QAAQ,SAAQ,QAAQ,IACzB,MAAM,QAAQ,QAAO,QAAQ,OAAO,SAAS,IAC7C,MAAM,QAAQ,eAAc,SAAS,OAAO,QAAQ,OAAO,IAAI,KAAK,OAAO,SAC3E,MAAM,QAAQ,gBAAa,SAAS,OAAO,QAAQ,OAAO,IAAI,IAAI,OAAO,UAAU,OAAO,SAC/F,UAAU,OAAW;AACzB,QAAM,eAAe;AACrB,MAAM,QAAQ,OAAO,KAAK;AAC1B,EAAI,UAAU,WACd,OAAO,KAAK,GACZ,MAAM,cAAc,eAAe,iBAAoC,cAAc,EAAE,KAAK,GAAG,MAAM;AACvG;AAEA,SAAS,aAAa,MAAsB;AAC1C,SAAO,SAAS,qBAAqB,iBAAO,KAAK,MAAM,KAAK,CAAC,EAAE,CAAC,KAAK;AACvE;AAEA,SAAS,cAAc,OAAiC,MAAyC;AAC/F,MAAM,WAAW,MAAM,OAAO,CAAC,SAAS,qBAAqB,KAAK,IAAI,MAAM,IAAI,GAC1E,cAAc,SAAS,UACzB,CAAC,iBAAiB,iBAAiB,QAAQ,IAC3C,CAAC,iCAAiC,8BAA8B,+BAA+B,iBAAiB,UAAU,sBAAsB;AACpJ,WAAW,WAAW,aAAa;AACjC,QAAM,QAAQ,SAAS,KAAK,CAAC,SAAS,QAAQ,KAAK,KAAK,IAAI,CAAC;AAC7D,QAAI,UAAU,OAAW,QAAO,MAAM;AAAA,EACxC;AACA,SAAO,SAAS,CAAC,GAAG;AACtB;AAEA,SAAS,SAAS,MAAc,WAAmB,MAAuB;AACxE,MAAM,MAAM,IAAI,IAAI,aAAa,IAAI,IAAI,WAAW,SAAS,MAAM;AACnE,aAAI,aAAa,IAAI,aAAa,SAAS,GACvC,SAAS,UAAW,IAAI,aAAa,IAAI,QAAQ,IAAI,GAClD,IAAI,SAAS;AACtB;AAEA,eAAe,KAAQ,UAAgC;AACrD,MAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,sBAAsB,SAAS,QAAQ,MAAM,SAAS,QAAQ,OAAO,SAAS,MAAM,CAAC,EAAE;AACnH,SAAO;AACT;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQG;AACD,SAAO,6EAAG,gBAAM,IAAI,CAAC,SAAS;AAC5B,QAAI,KAAK,SAAS,OAAQ,QAAO;AAAA,MAAC;AAAA;AAAA,QAChC,MAAK;AAAA,QAEL,OAAO,EAAE,qBAAqB,GAAG,OAAO,QAAQ,EAAE,CAAC,KAAK;AAAA,QACxD,OAAO,KAAK;AAAA,QACZ,cAAY,KAAK;AAAA,QACjB,kBAAgB,KAAK;AAAA,QACrB,qBAAmB,KAAK,SAAS,gBAAgB;AAAA,QACjD,gBAAc,KAAK,SAAS,WAAW,SAAS;AAAA,QAChD,SAAS,MAAM;AAAE,mBAAS,KAAK,IAAI;AAAA,QAAG;AAAA,QACtC,eAAK;AAAA;AAAA,MARA,KAAK;AAAA,IAQA;AACZ,QAAM,OAAO,UAAU,WAAW,GAAG,KAAK,IAAI,GAAG,MAAM,MAAQ,SAAS,KAAK,IAAI,MAAM;AACvF,WAAO,8CAAC,aAAQ,WAAU,wBAAuC,MAAY,UAAU,CAAC,UAAU;AAAE,eAAS,KAAK,MAAM,MAAM,cAAc,IAAI;AAAA,IAAG,GACjJ;AAAA,oDAAC,aAAQ,OAAO,EAAE,qBAAqB,GAAG,OAAO,QAAQ,EAAE,CAAC,KAAK,GAAoB,OAAO,KAAK,MAAO;AAAA,aAAK;AAAA,QAAK,6CAAC,UAAM,eAAK,WAAU;AAAA,SAAO;AAAA,MAC/I;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,KAAK;AAAA,UACZ,OAAO,QAAQ;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,SAVoD,KAAK,IAW3D;AAAA,EACF,CAAC,GAAE;AACL;AAEA,SAAS,aAAa,WAKpB;AACA,MAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,CAAC,GAClC,CAAC,WAAW,YAAY,QAAI,uBAA2B,GACvD,CAAC,OAAO,QAAQ,QAAI,uBAAiB,GACrC,CAAC,SAAS,UAAU,QAAI,uBAAS,EAAI,GACrC,aAAS,0BAAY,MAAM;AAC/B,eAAW,EAAI,GACf,WAAW,CAAC,UAAU,QAAQ,CAAC;AAAA,EACjC,GAAG,CAAC,CAAC;AACL,qCAAU,MAAM;AACd,QAAM,aAAa,IAAI,gBAAgB;AACvC,oBAAS,MAAS,GACb,MAAM,SAAS,aAAa,SAAS,GAAG,EAAE,QAAQ,WAAW,OAAO,CAAC,EACvE,KAAK,CAAC,aAAa,KAAuB,QAAQ,CAAC,EACnD,KAAK,YAAY,EACjB,MAAM,CAAC,WAAoB;AAC1B,MAAK,WAAW,OAAO,WAAS,SAAS,kBAAkB,QAAQ,OAAO,UAAU,OAAO,MAAM,CAAC;AAAA,IACpG,CAAC,EACA,QAAQ,MAAM;AAAE,MAAK,WAAW,OAAO,WAAS,WAAW,EAAK;AAAA,IAAG,CAAC,GAChE,MAAM;AAAE,iBAAW,MAAM;AAAA,IAAG;AAAA,EACrC,GAAG,CAAC,WAAW,OAAO,CAAC,GAChB,EAAE,WAAW,OAAO,SAAS,OAAO;AAC7C;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKsD;AACpD,MAAM,EAAE,WAAW,OAAO,SAAS,kBAAkB,OAAO,IAAI,aAAa,SAAS,GAChF,iBAAa;AAAA,IACjB,MAAM,cAAc,cAAc,OAAO;AAAA,IACzC,CAAC,SAAS,YAAY;AAAA,EACxB,GACM,2BAAuB,sBAAQ,MAAM,WAAW,QAAQ,CAACC,cAAa;AAC1E,QAAM,OAAO,qBAAqBA,UAAS,MAAM,WAAW,GAAG;AAC/D,WAAO,SAAS,SAAY,CAAC,IAAI,CAAC,EAAE,UAAAA,WAAU,KAAK,CAAC;AAAA,EACtD,CAAC,GAAG,CAAC,YAAY,WAAW,GAAG,CAAC,GAC1B,kBAAkB,qBAAqB,GAAG,EAAE,GAC5C,oBAAgB,sBAAQ,MAAM,IAAI,IAAI,qBAAqB,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAC9G,WAAW,iBAAiB,UAC5B,eAAe,iBAAiB,MAChC,YAAY,SAAS,CAAC,WAAW,OAAO,SAAS,GACjD,eAAe,QAAQ,cACvB,2BAAuB,qBAAO,EAAK,GACnC,WAAW,SAAS,CAAC,WAAW,OAAO,QAAQ,GAC/C,cAAc,QAAQ,aACtB,UAAU,SAAS,CAAC,WAAW,OAAO,OAAO,GAC7C,aAAa,QAAQ,YACrB,iBAAa,qBAAmC,CAAC,CAAC,GAClD,WAAW,SAAS,CAAC,WAAW,OAAO,QAAQ,GAC/C,cAAc,QAAQ,aACtB,iBAAa,qBAAuB,IAAI,GACxC,aAAS,qBAAoB,IAAI,GACjC,oBAAgB,qBAAO,oBAAI,IAA8D,CAAC,GAC1F,sBAAkB,qBAA4B,oBAAI,IAAI,CAAC,GACvD,8BAA0B,qBAAO,eAAe,GAChD,gBAAY,qBAAO,oBAAI,IAAY,CAAC,GACpC,SAAS,aAAa,SAAY,SAAY,QAAQ,QAAQ,GAC9D,QAAQ,QAAQ,WAAW,WAAW,OAAO,YAAY,OAAO,OAChE,SAAS,QAAQ,WAAW,IAC5B,YAAY,QAAQ,OACpB,WAAW,QAAQ,UACnB,gBAAgB,UAAU,kBAAkB,GAC5C,WAAW,eAAe,SAAS,KAAK,MAAM,IAC9C,QAAQ,eAAe,SAAS,QAAQ,MAAM,IAC9C,aAAa,SAAS,eAAe,SAAS,OAAO,MAAM,IAC3D,cAAc,YAAY,OAC1B,aAAa,SAAS,CAAC,WAAW,OAAO,UAAU,GACnD,gBAAgB,QAAQ,eACxB,oBAAgB,qBAAO,QAAQ,GAC/B,kBAAc,qBAA4B,IAAI,GAC9C,sBAAkB,qBAAO,oBAAI,IAA4G,CAAC,GAC1I,cAAc,WAAW,UAAa,OAAO,YAAY,IACzD,qBAAiB,sBAAQ,MAAM;AACnC,QAAM,QAAQ,oBAAI,IAAmB;AACrC,aAAW,QAAQ,WAAW,SAAS,CAAC,GAAG;AACzC,UAAM,OAAO,qBAAqB,KAAK,IAAI;AAC3C,MAAI,SAAS,UAAW,MAAM,IAAI,IAAI;AAAA,IACxC;AACA,WAAO,gBAAgB,OAAO,CAAC,SAAS,MAAM,IAAI,IAAI,CAAC;AAAA,EACzD,GAAG,CAAC,WAAW,KAAK,CAAC,GACf,eAAe,cAAc,UAAa,eAAe,WAAW,GACpE,gBAAgB,eAAe,WAAW,IAAI,eAAe,CAAC,IAAI;AAExE,8BAAU,MAAM;AAAE,eAAW,UAAU;AAAA,EAAS,GAAG,CAAC,OAAO,CAAC;AAE5D,MAAM,6BAAyB,0BAAY,MAAY;AACrD,QAAM,UAAU,YAAY;AAC5B,IAAI,YAAY,QAAQ,aAAa,UAAa,QAAQ,aAAa,YAAY,MAAM,YACzF,gBAAgB,QAAQ,IAAI,UAAU;AAAA,MACpC,WAAW,QAAQ;AAAA,MACnB,gBAAgB,QAAQ;AAAA,MACxB,cAAc,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH,GAAG,CAAC,QAAQ,CAAC;AAEb,oCAAgB,MAAM;AACpB,QAAI,eAAe,YAAY,aAAa,UAAa,CAAC,YAAa;AACvE,QAAM,UAAU,YAAY,SACtB,WAAW,gBAAgB,QAAQ,IAAI,QAAQ;AACrD,QAAI,YAAY,QAAQ,aAAa,OAAW;AAChD,QAAM,MAAM,KAAK,IAAI,SAAS,cAAc,QAAQ,MAAM,MAAM;AAChE,YAAQ,kBAAkB,KAAK,IAAI,SAAS,gBAAgB,GAAG,GAAG,GAAG,GACrE,QAAQ,YAAY,SAAS;AAAA,EAC/B,GAAG,CAAC,YAAY,aAAa,QAAQ,CAAC,OAEtC,wBAAU,MAAM;AACd,QAAM,OAAO,CAAC,UAAmC;AAC/C,MAAK,OAAO,OAAO,WAAW,OAAO,EAAE,KAAK,CAAC,UAAU,MAAM,WAAW,WAAW,MAAM,YAAY,MAAM,KAAK,KAChH,MAAM,eAAe;AAAA,IACvB;AACA,sBAAW,iBAAiB,gBAAgB,IAAI,GACzC,MAAM;AAAE,iBAAW,oBAAoB,gBAAgB,IAAI;AAAA,IAAG;AAAA,EACvE,GAAG,CAAC,CAAC;AAEL,MAAM,iBAAa,0BAAY,CAAC,SAAuB;AACrD,QAAM,WAAW,KAAK,MAAM,GAAG,GACzB,YAAY,CAAC,aAAa,IAAI,CAAC;AACrC,aAAS,QAAQ,GAAG,QAAQ,SAAS,SAAS,GAAG,SAAS,EAAG,WAAU,KAAK,SAAS,MAAM,GAAG,QAAQ,CAAC,EAAE,KAAK,GAAG,CAAC;AAClH,gBAAY,CAAC,YAAY;AACvB,UAAM,OAAO,EAAE,GAAG,QAAQ;AAC1B,eAAW,YAAY,UAAW,MAAK,QAAQ,IAAI;AACnD,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC,GAEC,iBAAa,0BAAY,CAAC,SAAuB;AACrD,2BAAuB,GACvB,aAAa,qBAAqB,IAAI,KAAK,OAAO,GAClD,YAAY,IAAI,GAChB,WAAW,IAAI;AAAA,EACjB,GAAG,CAAC,YAAY,sBAAsB,CAAC,GAEjC,sBAAkB,0BAAY,CAAC,SAAuB;AAC1D,eAAW,IAAI;AACf,QAAM,UAAU,aAAa,SAAY,SAAY,WAAW,QAAQ,QAAQ;AAKhF,IAJ6B,SAAS,YACjC,SAAS,WAAW,WACpB,QAAQ,YAAY,QAAQ,SAC5B,WAAW,SAAS,cAAc,kBAAkB,YAAY,WAErE,WAAW,IAAI;AAAA,EACjB,GAAG,CAAC,YAAY,YAAY,QAAQ,CAAC;AAErC,8BAAU,MAAM;AACd,IAAI,cAAc,UAAa,qBAAqB,YAChD,eAAe,WAAW,KAAG,aAAa,eAAe,CAAC,KAAK,OAAO,GAC1E,qBAAqB,UAAU;AAAA,EACjC,GAAG,CAAC,gBAAgB,SAAS,CAAC,OAE9B,wBAAU,MAAM;AACd,IAAI,iBAAiB,UAAa,iBAAiB,YAAU,cAAc,QAAQ;AAAA,EACrF,GAAG,CAAC,cAAc,QAAQ,CAAC,OAE3B,wBAAU,MAAM;AACd,IAAI,cAAc,YAAY,aAC9B,cAAc,UAAU,UACxB,cAAc,iBAAiB,WAAW,WAAW,cAAc,YAAY,QAAQ;AAAA,EACzF,GAAG,CAAC,cAAc,aAAa,QAAQ,CAAC,OAExC,wBAAU,MAAM;AACd,IAAI,oBACA,iBAAiB,WACjB,aAAa,YACd,WAAW,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,QAAQ,KAAK,OACzD,QAAQ,QAAQ,MAAM,WACtB,qBAAqB,QAAQ,MAAM,aACxC,YAAY,cAAc,SAAY,SAAY,cAAc,UAAU,OAAO,SAAS,CAAC;AAAA,EAC7F,GAAG,CAAC,cAAc,SAAS,UAAU,WAAW,WAAW,gBAAgB,CAAC,OAE5E,wBAAU,MAAM;AACd,QAAI,cAAc,UAAa,iBAAkB;AACjD,QAAM,QAAQ,IAAI,IAAI,UAAU,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;AAC9D,eAAW,CAAC,YAAY;AACtB,UAAI,UAAU,IACR,OAAO,EAAE,GAAG,QAAQ;AAC1B,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO;AAChD,QAAI,MAAM,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,MACzC,MAAM,WAAW,WAAW,MAAM,YAAY,MAAM,QAClD,MAAM,YAAY,OACpB,KAAK,IAAI,IAAI,EAAE,GAAG,OAAO,SAAS,IAAM,OAAO,8JAAsC,GACrF,UAAU,OAGZ,OAAO,KAAK,IAAI,GAChB,UAAU;AAGd,aAAO,UAAU,OAAO;AAAA,IAC1B,CAAC;AAAA,EACH,GAAG,CAAC,eAAe,WAAW,gBAAgB,CAAC,OAE/C,wBAAU,MAAM;AAEd,QADI,aAAa,UAAa,cAAc,IAAI,QAAQ,KACpD,EAAE,WAAW,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,QAAQ,KAAK,IAAQ;AACzE,QAAM,aAAa,IAAI,gBAAgB;AACvC,sBAAW,CAAC,YAAY;AACtB,UAAM,WAAW,QAAQ,QAAQ;AACjC,aAAO,aAAa,SAAY,UAAU,EAAE,GAAG,SAAS,CAAC,QAAQ,GAAG,EAAE,GAAG,UAAU,OAAO,OAAU,EAAE;AAAA,IACxG,CAAC,GACI,MAAM,SAAS,QAAQ,WAAW,QAAQ,GAAG,EAAE,QAAQ,WAAW,OAAO,CAAC,EAC5E,KAAK,CAAC,aAAa,KAAkB,QAAQ,CAAC,EAC9C,KAAK,CAAC,SAAS;AACd,iBAAW,CAAC,YAAY;AACtB,YAAM,WAAW,QAAQ,KAAK,IAAI;AAClC,eAAI,UAAU,WAAW,WAAW,SAAS,YAAY,SAAS,QAC5D,SAAS,YAAY,KAAK,UAAgB,EAAE,GAAG,SAAS,CAAC,KAAK,IAAI,GAAG,EAAE,GAAG,UAAU,SAAS,IAAO,OAAO,OAAU,EAAE,IACpH;AAAA,UACL,GAAG;AAAA,UACH,CAAC,KAAK,IAAI,GAAG;AAAA,YACX,GAAG;AAAA,YACH,SAAS;AAAA,YACT,OAAO;AAAA,YACP,UAAU;AAAA,cACR,SAAS,GAAG,KAAK,IAAI;AAAA,cACrB,QAAQ,KAAK;AAAA,cACb,eAAe,KAAK;AAAA,YACtB;AAAA,UACF;AAAA,QACF,IAEK;AAAA,UACL,GAAG;AAAA,UACH,CAAC,KAAK,IAAI,GAAG,EAAE,SAAS,KAAK,SAAS,OAAO,KAAK,SAAS,QAAQ,QAAQ,SAAS,KAAK,QAAQ;AAAA,QACnG;AAAA,MACF,CAAC;AAAA,IACH,CAAC,EACA,MAAM,CAAC,WAAoB;AAC1B,MAAI,WAAW,OAAO,WACtB,WAAW,CAAC,YAAY;AACtB,YAAM,WAAW,QAAQ,QAAQ;AACjC,eAAO,aAAa,SAAY,UAAU;AAAA,UACxC,GAAG;AAAA,UACH,CAAC,QAAQ,GAAG,EAAE,GAAG,UAAU,OAAO,kBAAkB,QAAQ,OAAO,UAAU,OAAO,MAAM,EAAE;AAAA,QAC9F;AAAA,MACF,CAAC;AAAA,IACH,CAAC,GACI,MAAM;AAAE,iBAAW,MAAM;AAAA,IAAG;AAAA,EACrC,GAAG,CAAC,eAAe,UAAU,WAAW,WAAW,KAAK,CAAC,OAEzD,wBAAU,MAAM;AACd,QAAI,qBAAqB,WAAW,GACpC;AAAA,eAAW,EAAE,KAAK,KAAK,qBAAsB,YAAW,IAAI;AAC5D,MAAI,iBAAiB,UAAW,gBAAgB,YAAY,GAC5D,WAAW,CAAC,YAAY;AACtB,YAAI,OAAO;AACX,iBAAW,EAAE,UAAU,iBAAiB,KAAK,KAAK,sBAAsB;AACtE,cAAM,WAAW,KAAK,IAAI;AAC1B,cAAI,UAAU,WAAW,WAAW,SAAS,YAAY,SAAS,OAAO;AACvE,mBAAO;AAAA,cACL,GAAG;AAAA,cACH,CAAC,IAAI,GAAG;AAAA,gBACN,GAAG;AAAA,gBACH,UAAU,EAAE,SAAS,GAAG,IAAI,yIAAgC;AAAA,cAC9D;AAAA,YACF;AACA;AAAA,UACF;AACA,cAAI,QAAQ,cAAc,QAAQ,IAAI,gBAAgB,MAAM;AAC5D,WAAI,UAAU,UAAa,MAAM,SAAS,UACxC,QAAQ,EAAE,MAAM,MAAM,UAAU,WAAW,GAAG,GAC9C,cAAc,QAAQ,IAAI,gBAAgB,QAAQ,KAAK;AAEzD,cAAM,UAAU,gBAAgB,iBAAiB,MAAM,IAAI;AAC3D,UAAI,YAAY,UAAc,UAAU,WAAW,WAAW,SAAS,YAAY,YACnF,OAAO;AAAA,YACL,GAAG;AAAA,YACH,CAAC,IAAI,GAAG;AAAA,cACN,SAAS;AAAA,cACT,OAAO,UAAU,SAAS;AAAA,cAC1B,QAAQ;AAAA,cACR,SAAS,UAAU,WAAW;AAAA,YAChC;AAAA,UACF;AAAA,QACF;AACA,eAAO;AAAA,MACT,CAAC;AAAA;AAAA,EACH,GAAG,CAAC,cAAc,YAAY,iBAAiB,oBAAoB,CAAC,OAEpE,wBAAU,MAAM;AACd,QAAM,UAAU,IAAI,IAAI,gBAAgB,YAAY,CAAC;AACrD,aAAW,EAAE,UAAU,gBAAgB,KAAK,qBAAsB,SAAQ,IAAI,gBAAgB,OAAO,MAAM,KAAK,CAAC,EAAE,CAAC,KAAK,gBAAgB,MAAM;AAC/I,QAAM,UAAU,CAAC,GAAG,gBAAgB,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,QAAQ,IAAI,MAAM,CAAC;AAClF,aAAW,UAAU,cAAc,QAAQ,KAAK;AAC9C,MAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,CAAC,EAAE,CAAC,KAAK,MAAM,KAAG,cAAc,QAAQ,OAAO,MAAM;AAG1F,IADA,gBAAgB,UAAU,SACrB,WACL,OAAO;AAAA,EACT,GAAG,CAAC,sBAAsB,QAAQ,YAAY,CAAC,OAE/C,wBAAU,MAAM;AACd,QAAI,oBAAoB,UAAa,oBAAoB,wBAAwB,QAAS;AAC1F,4BAAwB,UAAU;AAClC,QAAM,OAAO,qBAAqB,gBAAgB,MAAM,gBAAgB,QAAQ,IAAI,IAAI,CAAC,GAAG,WAAW,GAAG;AAC1G,IAAI,SAAS,UAAW,gBAAgB,IAAI,GAC5C,OAAO;AAAA,EACT,GAAG,CAAC,iBAAiB,QAAQ,iBAAiB,WAAW,GAAG,CAAC,OAE7D,wBAAU,MAAM;AACd,QAAI,aAAa;AACjB,eAAW,UAAU,OAAO,SAAS,iBAAoC,wBAAwB,KAAK,CAAC;AACrG,YAAI,OAAO,QAAQ,aAAa,UAAU;AACxC,iBAAO,eAAe,EAAE,OAAO,UAAU,CAAC;AAC1C;AAAA,QACF;AAAA;AAAA,EAEJ,GAAG,CAAC,QAAQ,CAAC,OAEb,wBAAU,MAAM;AACd,QAAI,qBAAqB,SAAS,KAAK,cAAc,OAAW;AAChE,QAAM,iBAAiB,WAAW,SAAS;AAC3C,QAAoC,kBAAmB,KAAM;AAC7D,QAAM,aAAa,IAAI,IAAI,UAAU,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,GAC7D,yBAAyB,CAAC,UAA4B;AAC1D,UAAM,SAAS,MAAM;AACrB,UAAI,EAAE,kBAAkB,SAAU;AAClC,UAAM,UAAU,OAAO,QAAqB,WAAW;AACvD,UAAI,YAAY,QAAQ,QAAQ,QAAQ,yBAAyB,MAAM,KAAM;AAC7E,UAAM,aAAa,CAAC,QAAQ,OAAO,QAAQ,aAAa,YAAY,GAAG,QAAQ,WAAW;AAC1F,eAAW,aAAa,YAAY;AAClC,YAAM,OAAO,qBAAqB,WAAW,KAAK,EAAE,QAAQ,oBAAoB,EAAE,GAAG,UAAU,GAAG;AAClG,YAAI,WAAS,UAAa,CAAC,WAAW,IAAI,IAAI,IAC9C;AAAA,gBAAM,eAAe,GACrB,MAAM,gBAAgB,GACtB,WAAW,IAAI;AACf;AAAA;AAAA,MACF;AAAA,IACF;AACA,0BAAe,iBAAiB,SAAS,wBAAwB,EAAI,GAC9D,MAAM;AAAE,qBAAe,oBAAoB,SAAS,wBAAwB,EAAI;AAAA,IAAG;AAAA,EAC5F,GAAG,CAAC,qBAAqB,QAAQ,YAAY,SAAS,CAAC;AAEvD,MAAM,eAAW,0BAAY,OAAO,SAAiB;AACnD,QAAI,UAAU,QAAQ,IAAI,IAAI,EAAG;AACjC,QAAM,YAAY,WAAW,QAAQ,IAAI;AACzC,QAAI,gBAAc,UAAa,UAAU,YAAY,MAAQ,UAAU,YAAY,UAAU,QAC7F;AAAA,gBAAU,QAAQ,IAAI,IAAI,GAC1B,WAAW,CAAC,YAAY;AACtB,YAAM,WAAW,QAAQ,IAAI;AAC7B,eAAO,aAAa,SAAY,UAAU,EAAE,GAAG,SAAS,CAAC,IAAI,GAAG,EAAE,GAAG,UAAU,QAAQ,IAAM,OAAO,OAAU,EAAE;AAAA,MAClH,CAAC;AACD,UAAI;AACF,YAAM,OAAO,MAAM,KAAkB,MAAM,MAAM,SAAS,QAAQ,WAAW,IAAI,GAAG;AAAA,UAClF,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,EAAE,SAAS,UAAU,SAAS,aAAa,UAAU,QAAQ,CAAC;AAAA,QACrF,CAAC,CAAC;AACF,mBAAW,CAAC,YAAY;AACtB,cAAM,SAAS,QAAQ,IAAI;AAC3B,cAAI,WAAW,OAAW,QAAO;AACjC,cAAM,YAAY,OAAO,YAAY,UAAU;AAC/C,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,CAAC,IAAI,GAAG;AAAA,cACN,SAAS,YAAY,KAAK,UAAU,OAAO;AAAA,cAC3C,OAAO,KAAK;AAAA,cACZ,QAAQ,YAAY,SAAS;AAAA,cAC7B,SAAS,KAAK;AAAA,cACd,QAAQ;AAAA,YACV;AAAA,UACF;AAAA,QACF,CAAC,GACD,OAAO;AAAA,MACT,SAAS,QAAQ;AACf,YAAI,kBAAkB,yBAAyB,OAAO,WAAW;AAC/D,cAAI;AACF,gBAAM,SAAS,MAAM,KAAkB,MAAM,MAAM,SAAS,QAAQ,WAAW,IAAI,CAAC,CAAC;AACrF,uBAAW,CAAC,YAAY;AACtB,kBAAM,SAAS,QAAQ,IAAI;AAC3B,qBAAI,WAAW,SAAkB,UAC1B;AAAA,gBACL,GAAG;AAAA,gBACH,CAAC,IAAI,GAAG;AAAA,kBACN,GAAG;AAAA,kBACH,QAAQ;AAAA,kBACR,UAAU;AAAA,oBACR,SAAS,GAAG,IAAI;AAAA,oBAChB,QAAQ,OAAO;AAAA,oBACf,eAAe,OAAO;AAAA,kBACxB;AAAA,gBACF;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH,SAAS,cAAc;AACrB,uBAAW,CAAC,YAAY;AACtB,kBAAM,WAAW,QAAQ,IAAI;AAC7B,qBAAO,aAAa,SAAY,UAAU;AAAA,gBACxC,GAAG;AAAA,gBACH,CAAC,IAAI,GAAG,EAAE,GAAG,UAAU,QAAQ,IAAO,OAAO,wBAAwB,QAAQ,aAAa,UAAU,OAAO,YAAY,EAAE;AAAA,cAC3H;AAAA,YACF,CAAC;AAAA,UACH;AAAA;AAEA,qBAAW,CAAC,YAAY;AACtB,gBAAM,WAAW,QAAQ,IAAI;AAC7B,mBAAO,aAAa,SAAY,UAAU;AAAA,cACxC,GAAG;AAAA,cACH,CAAC,IAAI,GAAG,EAAE,GAAG,UAAU,QAAQ,IAAO,OAAO,kBAAkB,QAAQ,OAAO,UAAU,OAAO,MAAM,EAAE;AAAA,YACzG;AAAA,UACF,CAAC;AAAA,MAEL,UAAE;AACA,kBAAU,QAAQ,OAAO,IAAI;AAAA,MAC/B;AAAA;AAAA,EACF,GAAG,CAAC,QAAQ,SAAS,CAAC;AAEtB,8BAAU,MAAM;AACd,QAAM,eAAe,CAAC,UAA+B;AACnD,MAAI,EAAE,MAAM,WAAW,MAAM,YAAY,MAAM,IAAI,kBAAkB,MAAM,QAC3E,MAAM,eAAe,GACjB,aAAa,UAAgB,SAAS,QAAQ;AAAA,IACpD;AACA,sBAAW,iBAAiB,WAAW,YAAY,GAC5C,MAAM;AAAE,iBAAW,oBAAoB,WAAW,YAAY;AAAA,IAAG;AAAA,EAC1E,GAAG,CAAC,UAAU,QAAQ,CAAC;AAEvB,MAAM,aAAS,sBAAQ,MAAM;AAC3B,QAAM,QAAQ,oBAAI,IAA6B,GACzC,MAAM,CAAC,GAAI,WAAW,SAAS,CAAC,CAAE,EAAE,OAAO,CAAC,SAAS,qBAAqB,KAAK,IAAI,MAAM,SAAS;AACxG,IAAI,iBAAiB,UAAa,CAAC,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,YAAY,KAAG,IAAI,KAAK,EAAE,MAAM,cAAc,OAAO,GAAG,SAAS,GAAG,CAAC,GACzI,IAAI,KAAK,CAAC,MAAM,UAAU,KAAK,KAAK,cAAc,MAAM,MAAM,YAAY,CAAC;AAC3E,aAAW,QAAQ,KAAK;AACtB,UAAMC,aAAY,aAAa,KAAK,IAAI,GAClC,QAAQ,MAAM,IAAIA,UAAS,KAAK,CAAC;AACvC,YAAM,KAAK,IAAI,GACf,MAAM,IAAIA,YAAW,KAAK;AAAA,IAC5B;AACA,QAAM,QAAQ,YAAY,SAAS;AACnC,WAAO,CAAC,GAAG,MAAM,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM;AACpD,UAAM,YAAY,MAAM,QAAQ,IAAI,GAC9B,aAAa,MAAM,QAAQ,KAAK;AACtC,cAAQ,YAAY,IAAI,MAAM,SAAS,cAAc,aAAa,IAAI,MAAM,SAAS,eAChF,KAAK,cAAc,OAAO,YAAY;AAAA,IAC7C,CAAC;AAAA,EACH,GAAG,CAAC,cAAc,WAAW,SAAS,CAAC,GAEjC,kBAAkB,CAAC,SAA8B;AACrD,iBAAa,IAAI;AACjB,QAAM,SAAS,cAAc,SAAY,SAAY,cAAc,UAAU,OAAO,IAAI;AACxF,IAAI,WAAW,SAAW,YAAY,MAAS,IAC1C,WAAW,MAAM;AAAA,EACxB,GACM,mBAAmB,CAAC,SAA8C;AACtE,IAAI,SAAS,aAAW,uBAAuB,GAC/C,cAAc,IAAI;AAAA,EACpB,GACM,gBAAgB,YAAY,sDAAwB,cAAc,UAAU,iBAAO,cAAI,gBACvF,mBAAmB,UAAU,MAAM,GAAG,EAAE,GAAG,EAAE,KAAK,eAClD,gBAAgB,aAAa,SAAY,SAAY,aAAa,QAAQ,GAC1E,cAAc,CAAC,KAAa,SAAwB;AACxD,gBAAY,CAAC,aAAa,EAAE,GAAG,SAAS,CAAC,GAAG,GAAG,KAAK,EAAE;AAAA,EACxD,GACM,kBAAkB,CAAC,cAA6B;AACpD,QAAI,aAAa,UAAa,UAAU,WAAW,UAAa,SAAS,kBAAkB,OAAW;AACtG,QAAM,SAAS,SAAS,QAClB,gBAAgB,SAAS;AAC/B,eAAW,CAAC,YAAY;AACtB,UAAM,WAAW,QAAQ,QAAQ;AACjC,aAAI,aAAa,SAAkB,UAC5B;AAAA,QACL,GAAG;AAAA,QACH,CAAC,QAAQ,GAAG,YACR,EAAE,GAAG,UAAU,OAAO,QAAQ,SAAS,eAAe,QAAQ,SAAS,UAAU,OAAU,IAC3F,EAAE,SAAS,QAAQ,OAAO,QAAQ,QAAQ,QAAQ,SAAS,cAAc;AAAA,MAC/E;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,8CAAC,SAAI,KAAK,YAAY,WAAU,0BACrC;AAAA,iDAAC,WAAO,0BAAO;AAAA,IACf,8CAAC,WAAM,WAAU,iBACf;AAAA,oDAAC,SAAI,WAAU,kBACb;AAAA,sDAAC,UAAK,WAAU,0BAAyB;AAAA,wDAAC,YAAO;AAAA;AAAA,YAAE,6CAAC,UAAK,sBAAQ;AAAA,aAAO;AAAA,UAAU,kBAAkB,UAAa,6CAAC,UAAK,WAAU,iBAAiB,4BAAkB,UAAU,iBAAO,gBAAK;AAAA,WAAQ;AAAA,QAClM,6CAAC,YAAO,MAAK,UAAS,SAAS,QAAQ,OAAM,gBAAK,cAAW,wCAAS,oBAAC;AAAA,SACzE;AAAA,MACC,gBAAgB,6CAAC,SAAI,WAAU,sBAAqB,MAAK,WAAU,cAAW,kCAC5E,0BAAgB,IAAI,CAAC,SAAS;AAAA,QAAC;AAAA;AAAA,UAC9B,MAAK;AAAA,UACL,MAAK;AAAA,UAEL,UAAU,cAAc,OAAO,IAAI;AAAA,UACnC,iBAAe,cAAc;AAAA,UAC7B,WAAW,CAAC,UAAU;AAAE,yBAAa,OAAO,iBAAiB,WAAW,eAAe;AAAA,UAAG;AAAA,UAC1F,SAAS,MAAM;AAAE,4BAAgB,IAAI;AAAA,UAAG;AAAA,UACxC,mBAAS,UAAU,iBAAO;AAAA;AAAA,QALrB;AAAA,MAK0B,CAAS,GAC5C;AAAA,MACC,UAAU,UAAa,6CAAC,SAAI,WAAU,kBAAkB,iBAAM;AAAA,MAC9D,WAAW,eAAe,IAAI,CAAC,YAAY,6CAAC,SAAI,WAAU,oBAAkC,qBAAV,OAAkB,CAAM;AAAA,MAC3G,6CAAC,SAAI,KAAK,QAAQ,cAAY,cAAc,UAAU,yCAAW,wCAC9D,iBAAO,IAAI,CAAC,CAACA,YAAW,KAAK,MAAM;AAClC,YAAM,YAAY,kBAAkBA,cAAa,SAASA,UAAS,MAAM;AACzE,eAAO,8CAAC,aAAQ,WAAU,uBAAsC,MAAM,WAAW,UAAU,CAAC,UAAU;AAAE,sBAAYA,YAAW,MAAM,cAAc,IAAI;AAAA,QAAG,GACxJ;AAAA,wDAAC,aAAS;AAAA,YAAAA;AAAA,YAAU,6CAAC,UAAM,gBAAM,QAAO;AAAA,aAAO;AAAA,UAC/C;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,cAAc,OAAOA,UAAS;AAAA,cACrC,OAAO;AAAA,cACP;AAAA,cACA;AAAA,cACA;AAAA,cACA,UAAU;AAAA,cACV,UAAU;AAAA;AAAA,UACZ;AAAA,aAVmDA,UAWrD;AAAA,MACF,CAAC,GACH;AAAA,OACF;AAAA,IACA,8CAAC,UAAK,WAAU,mBACd;AAAA,oDAAC,YACC;AAAA,sDAAC,UAAK,WAAU,wBAAuB,OAAO,UAAU;AAAA,uDAAC,UAAM,yBAAc;AAAA,UAAO,6CAAC,YAAQ,4BAAiB;AAAA,WAAS;AAAA,QACvH,8CAAC,SAAI,WAAU,2BACZ;AAAA,yBAAe,6CAAC,SAAI,WAAU,wBAAuB,MAAK,WAAU,cAAY,WAAW,sCAAkB,kCAC3G,uBAAa,IAAI,CAAC,SAAS;AAAA,YAAC;AAAA;AAAA,cAC3B,MAAK;AAAA,cACL,MAAK;AAAA,cAEL,UAAU,eAAe,OAAO,IAAI;AAAA,cACpC,iBAAe,eAAe;AAAA,cAC9B,WAAW,CAAC,UAAU;AAAE,6BAAa,OAAO,cAAc,YAAY,gBAAgB;AAAA,cAAG;AAAA,cACzF,SAAS,MAAM;AAAE,iCAAiB,IAAI;AAAA,cAAG;AAAA,cACzC,mBAAS,YAAY,iBAAO;AAAA;AAAA,YALvB;AAAA,UAK4B,CAAS,GAC9C;AAAA,WACE,SAAS,WAAW,aAAa,UAAa,6CAAC,YAAO,WAAU,iBAAgB,MAAK,UAAS,UAAU,UAAU,QAAQ,YAAY,IAAM,SAAS,MAAM;AAAE,YAAK,SAAS,QAAQ;AAAA,UAAG,GACrL,mBAAS,6BAAS,gBACrB;AAAA,WACF;AAAA,SACF;AAAA,MACC,aAAa,UAAa,iBAAiB,UAAa,iBAAiB,YAAY,8CAAC,SAAI,WAAU,mBAAkB,cAAY,SAAS,OAAO,MAAK,UAAS,aAAU,UAAS;AAAA;AAAA,QAAG,SAAS,UAAU,YAAY,+CAAiB;AAAA,SAAiB;AAAA,MACvP,aAAa,UAAa,8CAAC,SAAI,WAAU,qBAAoB,MAAK,SACjE;AAAA,qDAAC,UAAM,mBAAS,SAAQ;AAAA,QACvB,SAAS,WAAW,UAAa,SAAS,kBAAkB,UAAa,aAAa,UAAa,8CAAC,SACnG;AAAA,uDAAC,YAAO,MAAK,UAAS,SAAS,MAAM;AAAE,4BAAgB,EAAK;AAAA,UAAG,GAAG,kDAAM;AAAA,UACxE,6CAAC,YAAO,MAAK,UAAS,SAAS,MAAM;AAAE,4BAAgB,EAAI;AAAA,UAAG,GAAG,kDAAM;AAAA,WACzE;AAAA,SACF;AAAA,MACC,cAAc,UAAa,6CAAC,SAAI,WAAU,kBAAkB,qBAAU;AAAA,MACtE,aAAa,SACV,6CAAC,SAAI,WAAU,kBAAkB,wBAAc,UAC3C,8EAAE;AAAA;AAAA,QAAmC,6CAAC,UAAK,0BAAY;AAAA,QAAO;AAAA,SAAC,IAC/D,8EAAE;AAAA;AAAA,QAAmC,6CAAC,UAAK,0BAAY;AAAA,QAAO;AAAA,SAAC,GAAI,IACvE,WAAW,SACT,8CAAC,SAAI,WAAU,kBAAiB;AAAA;AAAA,QAAM;AAAA,QAAS;AAAA,SAAC,IAClD,OAAO,YAAY,KACjB,8CAAC,SAAI,WAAU,kBAAiB;AAAA;AAAA,QAA0C,6CAAC,YAAO,MAAK,UAAS,SAAS,MAAM;AAC/G,qBAAW,CAAC,YAAY;AACtB,gBAAM,OAAO,EAAE,GAAG,QAAQ;AAC1B,0BAAO,KAAK,QAAQ,GACb;AAAA,UACT,CAAC,GACD,YAAY,cAAc,SAAY,SAAY,cAAc,UAAU,OAAO,SAAS,CAAC;AAAA,QAC7F,GAAG,kDAAM;AAAA,SAAS,IAClB,eAAe,eAAe,YAC5B,WACE,6CAAC,mBAAgB,SAAS,OAAO,SAAS,OAAO,UAAU,IAC3D,6CAAC,gBAAa,SAAS,OAAO,SAAS,OAAO,UAAU,IAC1D;AAAA,QAAC;AAAA;AAAA,UACD,KAAK;AAAA,UACL,OAAO,OAAO;AAAA,UACd,eAAa,aAAa,eAAe;AAAA,UACzC,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,UAAU;AAAA,UACV,UAAU,CAAC,UAAU;AACnB,gBAAM,UAAU,MAAM,OAAO;AAC7B,uBAAW,CAAC,aAAa;AAAA,cACvB,GAAG;AAAA,cACH,CAAC,QAAQ,GAAG;AAAA,gBACV;AAAA,gBACA,OAAO,QAAQ,QAAQ,GAAG,SAAS;AAAA,gBACnC,QAAQ;AAAA,gBACR,SAAS,QAAQ,QAAQ,GAAG,WAAW;AAAA,gBACvC,UAAU,QAAQ,QAAQ,GAAG;AAAA,gBAC7B,QAAQ,QAAQ,QAAQ,GAAG;AAAA,cAC7B;AAAA,YACF,EAAE;AAAA,UACJ;AAAA,UACA,YAAY,CAAC;AAAA,UACb,cAAY;AAAA;AAAA,MACd;AAAA,OACN;AAAA,KACF;AACF;AAKA,SAAS,oBAAoB,EAAE,WAAW,YAAY,UAAU,QAAQ,GAAuB;AAC7F,MAAM,aAAS,qBAAwB,IAAI,GACrC,CAAC,QAAQ,SAAS,QAAI,uBAAsB,GAC5C,eAAe,WAAW,CAAC,aAAa,SAAS,YAAY,GAC7D,UAAU,WAAW,CAAC,aAAa,mBAAmB,SAAS,KAAK,QAAQ,CAAC,GAC7E,kBAAkB,WAAW,CAAC,aAAa,sBAAsB,SAAS,IAAI,CAAC;AACrF,2CAAgB,MAAM;AACpB,QAAM,WAAW,OAAO,SAAS;AACjC,QAAI,aAAa,OAAW;AAC5B,QAAM,SAAS,MAAY;AACzB,UAAM,SAAS,SAAS,cAA2B,iEAAiE;AACpH,gBAAU,CAAC,YAAY,YAAY,SAAS,UAAU,UAAU,MAAS;AAAA,IAC3E;AACA,WAAO;AACP,QAAM,WAAW,IAAI,iBAAiB,MAAM;AAC5C,oBAAS,QAAQ,SAAS,MAAM,EAAE,WAAW,IAAM,SAAS,GAAK,CAAC,GAC3D,MAAM;AAAE,eAAS,WAAW;AAAA,IAAG;AAAA,EACxC,GAAG,CAAC,SAAS,CAAC,OACd,8BAAgB,MAAM;AACpB,QAAM,WAAW,QAAQ;AACzB,QAA8B,YAAa,KAAM;AACjD,QAAM,gBAAgB,MAAY;AAChC,eAAS,MAAM,YAAY,4BAA4B,GAAG,OAAO,SAAS,YAAY,CAAC,IAAI;AAC3F,UAAM,SAAS,SAAS,cAAc,MAAM,YAAY,SAAS,cAAc,MAAM,WAAW;AAChG,MAAI,SAAS,QAAQ,kBAAkB,WAAQ,SAAS,QAAQ,gBAAgB;AAAA,IAClF;AACA,kBAAc;AACd,QAAM,WAAW,IAAI,eAAe,aAAa;AACjD,oBAAS,QAAQ,QAAQ,GAClB,MAAM;AACX,eAAS,WAAW,GACpB,SAAS,MAAM,eAAe,0BAA0B,GACxD,OAAO,SAAS,QAAQ;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,MAAM,CAAC,GACJ,8EACL;AAAA,iDAAC,UAAK,KAAK,QAAQ,WAAU,0BAAyB,eAAW,IAAC;AAAA,IACjE,WAAW,SAAY,WAAO,+BAAa;AAAA,MAAC;AAAA;AAAA,QAC3C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF,GAAI,MAAM;AAAA,KACZ;AACF;AAIA,SAAS,cAAc,EAAE,iBAAiB,WAAW,GAAuB;AAC1E,SAAO,6CAAC,mBAAiB,gBAAM,WAAW,sBAAsB,CAAC,CAAC,GAAE;AACtE;AAEA,SAAS,OAAO,OAA4D;AAC1E,MAAM,OAAO,UAAU,QAAQ,MAAM,MAAM,UAAU,MAAM,YAAY;AACvE,MAAI;AACF,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,WAAO,OAAO,SAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,IAAI,QAAmC,CAAC;AAAA,EACpH,QAAQ;AAAE,WAAO,CAAC;AAAA,EAAG;AACvB;AAEA,SAAS,SAAS,OAAuD;AACvE,MAAM,UAAU;AAChB,WAAO,MAAM,QAAQ,IAAI,CAAC,SAAS,KAAK,SAAS,SAAS,KAAK,OAAO,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC,EAAE,KAAK;AAAA,CAAI;AAChH;AAEA,SAAS,aAAa,EAAE,OAAO,QAAQ,GAAsB;AAC3D,MAAM,OAAO,OAAO,KAAK,GACnB,OAAO,OAAO,KAAK,QAAS,WAAW,KAAK,OAAO,cACnD,SAAS,SAAS,KAAK,GACvB,QAAU,UAAU,QAAqB,MAAM,UAAU,UAAU,SAAtC;AACnC,SAAO,8CAAC,aAAQ,WAAU,iBAAgB,cAAY,OACpD;AAAA,iDAAC,WAAO,0BAAO;AAAA,IACf,8CAAC,aAAQ;AAAA,mDAAC,UAAK,yBAAM;AAAA,MAAO,6CAAC,YAAQ,gBAAK;AAAA,MAAS,6CAAC,QAAI,oBAAU,YAAY,uBAAQ,UAAU,UAAU,iBAAO,gBAAK;AAAA,OAAK;AAAA,IAC1H,WAAW,UAAa,6CAAC,SAAK,kBAAO;AAAA,IACrC,YAAY,UAAa,6CAAC,YAAO,MAAK,UAAS,SAAS,SAAS,kDAAM;AAAA,KAC1E;AACF;AAGO,SAAS,MAAM,SAA8B;AAClD,UAAQ,MAAM,OAAO,iBAAiB,MAAM;AAC1C,QAAM,cAAc,QAAQ,MAAM,SAAS;AAAA,MACzC,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,UAAU,EAAE,sBAAsB,EAAE,MAAM,UAAU,OAAO,UAAU,EAAE;AAAA,IACzE,GAAG,aAAa,GACV,mBAAmB,QAAQ,MAAM,SAAS;AAAA,MAC9C,MAAM;AAAA,MACN,OAAO;AAAA,IACT,GAAG,mBAAmB;AACtB,WAAO,CAAC,aAAa,gBAAgB;AAAA,EACvC,CAAC,GACD,QAAQ,MAAM,OAAO,sBAAsB,MAAM,QAAQ,MAAM,SAAS;AAAA,IACtE,MAAM;AAAA,IACN,KAAK;AAAA,EACP,GAAG,YAAY,CAAC;AAClB;AAEA,IAAO,gBAAQ,EAAE,MAAM,QAAQ,MAAM;",
|
|
4
|
+
"sourcesContent": ["import { defineStore, type ClientContext, type PartialAssistant, type RunningToolCall } from \"@deepseek-ai/dsh-client-runtime/client\";\nimport type {} from \"@deepseek-ai/dsh-client-ui-layout/client\";\nimport type { PropsRenderSlots, PropsRuntime, PropsStore } from \"@deepseek-ai/dsh-client-ui-slots\";\nimport type { ToolCallViewProps } from \"@deepseek-ai/dsh-client-ui-tool/client\";\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, type CSSProperties, type KeyboardEvent as ReactKeyboardEvent } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n creativeRelativePath,\n fileMutations,\n latestSettledMutation,\n mutatingCallIds,\n previewMutation,\n streamingAssistant,\n workbenchModeForPath,\n type WorkbenchMode\n} from \"./file-activity.js\";\nimport { buildFileTree, type FileTreeNode } from \"./file-tree.js\";\nimport { JsonlPreview } from \"./jsonl-preview.js\";\nimport { MarkdownPreview } from \"./markdown-preview.js\";\nimport styles from \"./plugin.css?inline\";\n\nexport const name = \"oh-story\";\nexport const inject = [\"slots\"];\n\ndeclare module \"@deepseek-ai/dsh-client-ui-slots\" {\n interface SlotMap {\n \"oh-story.workspace\": { kind: \"single\"; scope: \"session\" };\n }\n}\n\ninterface WorkspaceFile { readonly path: string; readonly bytes: number; readonly version: string }\ninterface WorkspacePayload {\n readonly cwd: string;\n readonly files: readonly WorkspaceFile[];\n readonly shortDrama: Record<string, unknown> | null;\n readonly metadataErrors: readonly string[];\n readonly mode: \"dsh-session\";\n}\ninterface FilePayload {\n readonly path: string;\n readonly content: string;\n readonly bytes: number;\n readonly version: string;\n}\ninterface FileBuffer {\n readonly content: string;\n readonly saved: string;\n readonly source: \"disk\" | \"human\" | \"agent\";\n readonly version: string;\n readonly saving?: boolean | undefined;\n readonly error?: string | undefined;\n readonly missing?: boolean | undefined;\n readonly conflict?: {\n readonly message: string;\n readonly theirs?: string | undefined;\n readonly theirsVersion?: string | undefined;\n } | undefined;\n}\n\ninterface WorkbenchMemory {\n buffers: Record<string, FileBuffer>;\n editorMode: \"preview\" | \"source\";\n expanded: Record<string, boolean>;\n selected: string | undefined;\n workbench: WorkbenchMode;\n}\n\ntype Update<T> = T | ((current: T) => T);\n\nfunction applyUpdate<T>(current: T, update: Update<T>): T {\n return typeof update === \"function\" ? (update as (value: T) => T)(current) : update;\n}\n\nfunction createWorkbenchStore() {\n return defineStore({\n init: (): WorkbenchMemory => ({\n buffers: {},\n editorMode: \"preview\",\n expanded: {},\n selected: undefined,\n workbench: \"story\"\n }),\n actions: {\n setBuffers: (draft, update: Update<Record<string, FileBuffer>>) => {\n draft.buffers = applyUpdate(draft.buffers, update);\n },\n setEditorMode: (draft, update: Update<WorkbenchMemory[\"editorMode\"]>) => {\n draft.editorMode = applyUpdate(draft.editorMode, update);\n },\n setExpanded: (draft, update: Update<Record<string, boolean>>) => {\n draft.expanded = applyUpdate(draft.expanded, update);\n },\n setSelected: (draft, update: Update<string | undefined>) => {\n draft.selected = applyUpdate(draft.selected, update);\n },\n setWorkbench: (draft, update: Update<WorkbenchMode>) => {\n draft.workbench = applyUpdate(draft.workbench, update);\n }\n }\n });\n}\n\nclass WorkspaceRequestError extends Error {\n constructor(readonly status: number, message: string) { super(message); }\n}\n\nconst GROUP_ORDER: Readonly<Record<WorkbenchMode, readonly string[]>> = {\n story: [\"\u6B63\u6587\", \"\u5927\u7EB2\", \"\u8BBE\u5B9A\", \"\u8FFD\u8E2A\", \"\u5BF9\u6807\", \"\u53C2\u8003\u8D44\u6599\"],\n drama: [\"\u9879\u76EE\", \"\u8F93\u5165\", \"\u9879\u76EE\u5F00\u53D1\", \"\u8BBE\u5B9A\u96C6\", \"\u5267\u96C6\", \"\u5BA1\u67E5\", \"\u521B\u4F5C\u8005\u51B3\u7B56\", \"\u4EA4\u4ED8\"]\n};\n\nconst WORKBENCH_MODES = [\"story\", \"drama\"] as const;\nconst EDITOR_MODES = [\"preview\", \"source\"] as const;\n\nfunction handleTabKey<T extends string>(\n event: ReactKeyboardEvent<HTMLButtonElement>,\n values: readonly T[],\n current: T,\n select: (value: T) => void\n): void {\n let index: number | undefined;\n if (event.key === \"Home\") index = 0;\n else if (event.key === \"End\") index = values.length - 1;\n else if (event.key === \"ArrowRight\") index = (values.indexOf(current) + 1) % values.length;\n else if (event.key === \"ArrowLeft\") index = (values.indexOf(current) - 1 + values.length) % values.length;\n if (index === undefined) return;\n event.preventDefault();\n const value = values[index];\n if (value === undefined) return;\n select(value);\n event.currentTarget.parentElement?.querySelectorAll<HTMLButtonElement>(\"[role='tab']\")[index]?.focus();\n}\n\nfunction groupForPath(path: string): string {\n return path === \"short-drama.json\" ? \"\u9879\u76EE\" : path.split(\"/\", 1)[0] ?? \"\u5176\u4ED6\";\n}\n\nfunction preferredFile(files: readonly WorkspaceFile[], mode: WorkbenchMode): string | undefined {\n const matching = files.filter((file) => workbenchModeForPath(file.path) === mode);\n const preferences = mode === \"story\"\n ? [/^\u6B63\u6587\\/.*\\.md$/u, /^\u5927\u7EB2\\/.*\\.md$/u, /\\.md$/u]\n : [/^\u5267\u96C6\\/EP0*1\\/screenplay\\.md$/iu, /^\u5267\u96C6\\/.*\\/screenplay\\.md$/iu, /^\u9879\u76EE\u5F00\u53D1\\/creative-brief\\.md$/u, /^\u8F93\u5165\\/.*\\.md$/u, /\\.md$/u, /^short-drama\\.json$/u];\n for (const pattern of preferences) {\n const match = matching.find((file) => pattern.test(file.path));\n if (match !== undefined) return match.path;\n }\n return matching[0]?.path;\n}\n\nfunction endpoint(path: string, sessionId: string, file?: string): string {\n const url = new URL(`/oh-story/${path}`, globalThis.location.origin);\n url.searchParams.set(\"sessionId\", sessionId);\n if (file !== undefined) url.searchParams.set(\"path\", file);\n return url.toString();\n}\n\nasync function json<T>(response: Response): Promise<T> {\n const value = await response.json() as T & { readonly error?: string };\n if (!response.ok) throw new WorkspaceRequestError(response.status, value.error ?? `HTTP ${String(response.status)}`);\n return value;\n}\n\nfunction FileTreeNodes({\n nodes,\n depth,\n expanded,\n selected,\n activityPath,\n onToggle,\n onSelect\n}: {\n readonly nodes: readonly FileTreeNode[];\n readonly depth: number;\n readonly expanded: Readonly<Record<string, boolean>>;\n readonly selected: string | undefined;\n readonly activityPath: string | undefined;\n readonly onToggle: (path: string, open: boolean) => void;\n readonly onSelect: (path: string) => void;\n}) {\n return <>{nodes.map((node) => {\n if (node.kind === \"file\") return <button\n type=\"button\"\n key={node.path}\n style={{ \"--oh-story-indent\": `${String(depth * 14)}px` } as CSSProperties}\n title={node.path}\n aria-label={node.path}\n data-file-path={node.path}\n data-agent-target={node.path === activityPath || undefined}\n aria-current={node.path === selected ? \"page\" : undefined}\n onClick={() => { onSelect(node.path); }}\n >{node.name}</button>;\n const open = selected?.startsWith(`${node.path}/`) === true || expanded[node.path] === true;\n return <details className=\"oh-story-file-folder\" key={node.path} open={open} onToggle={(event) => { onToggle(node.path, event.currentTarget.open); }}>\n <summary style={{ \"--oh-story-indent\": `${String(depth * 14)}px` } as CSSProperties} title={node.path}>{node.name}<span>{node.fileCount}</span></summary>\n <FileTreeNodes\n nodes={node.children}\n depth={depth + 1}\n expanded={expanded}\n selected={selected}\n activityPath={activityPath}\n onToggle={onToggle}\n onSelect={onSelect}\n />\n </details>;\n })}</>;\n}\n\nfunction useWorkspace(sessionId: string): {\n readonly workspace: WorkspacePayload | undefined;\n readonly error: string | undefined;\n readonly loading: boolean;\n readonly reload: () => void;\n} {\n const [version, setVersion] = useState(0);\n const [workspace, setWorkspace] = useState<WorkspacePayload>();\n const [error, setError] = useState<string>();\n const [loading, setLoading] = useState(true);\n const reload = useCallback(() => {\n setLoading(true);\n setVersion((value) => value + 1);\n }, []);\n useEffect(() => {\n const controller = new AbortController();\n setError(undefined);\n void fetch(endpoint(\"workspace\", sessionId), { signal: controller.signal })\n .then((response) => json<WorkspacePayload>(response))\n .then(setWorkspace)\n .catch((reason: unknown) => {\n if (!controller.signal.aborted) setError(reason instanceof Error ? reason.message : String(reason));\n })\n .finally(() => { if (!controller.signal.aborted) setLoading(false); });\n return () => { controller.abort(); };\n }, [sessionId, version]);\n return { workspace, error, loading, reload };\n}\n\nfunction CreativeWorkbench({\n sessionId,\n runningCalls,\n partial,\n settledMutation,\n useStore,\n actions\n}: {\n readonly sessionId: string;\n readonly runningCalls: readonly RunningToolCall[];\n readonly partial: PartialAssistant | null;\n readonly settledMutation: string | undefined;\n} & Pick<WorkbenchSlotProps, \"useStore\" | \"actions\">) {\n const { workspace, error, loading: workspaceLoading, reload } = useWorkspace(sessionId);\n const activities = useMemo(\n () => fileMutations(runningCalls, partial),\n [partial, runningCalls]\n );\n const normalizedActivities = useMemo(() => activities.flatMap((activity) => {\n const path = creativeRelativePath(activity.path, workspace?.cwd);\n return path === undefined ? [] : [{ activity, path }];\n }), [activities, workspace?.cwd]);\n const primaryActivity = normalizedActivities.at(-1);\n const activityPaths = useMemo(() => new Set(normalizedActivities.map((value) => value.path)), [normalizedActivities]);\n const activity = primaryActivity?.activity;\n const activityPath = primaryActivity?.path;\n const workbench = useStore((memory) => memory.workbench);\n const setWorkbench = actions.setWorkbench;\n const initializedWorkbench = useRef(false);\n const selected = useStore((memory) => memory.selected);\n const setSelected = actions.setSelected;\n const buffers = useStore((memory) => memory.buffers);\n const setBuffers = actions.setBuffers;\n const buffersRef = useRef<Record<string, FileBuffer>>({});\n const expanded = useStore((memory) => memory.expanded);\n const setExpanded = actions.setExpanded;\n const surfaceRef = useRef<HTMLDivElement>(null);\n const navRef = useRef<HTMLElement>(null);\n const activityBases = useRef(new Map<string, { readonly path: string; readonly base: string }>());\n const previousSignals = useRef<ReadonlySet<string>>(new Set());\n const previousSettledMutation = useRef(settledMutation);\n const saveLocks = useRef(new Set<string>());\n const buffer = selected === undefined ? undefined : buffers[selected];\n const dirty = buffer?.source === \"human\" && buffer.content !== buffer.saved;\n const saving = buffer?.saving === true;\n const fileError = buffer?.error;\n const conflict = buffer?.conflict;\n const selectedLower = selected?.toLocaleLowerCase();\n const markdown = selectedLower?.endsWith(\".md\") === true;\n const jsonl = selectedLower?.endsWith(\".jsonl\") === true;\n const structured = jsonl || selectedLower?.endsWith(\".json\") === true;\n const previewable = markdown || jsonl;\n const editorMode = useStore((memory) => memory.editorMode);\n const setEditorMode = actions.setEditorMode;\n const modeSelection = useRef(selected);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const editorPositions = useRef(new Map<string, { readonly scrollTop: number; readonly selectionStart: number; readonly selectionEnd: number }>());\n const editorReady = buffer !== undefined && buffer.missing !== true;\n const availableModes = useMemo(() => {\n const value = new Set<WorkbenchMode>();\n for (const file of workspace?.files ?? []) {\n const mode = workbenchModeForPath(file.path);\n if (mode !== undefined) value.add(mode);\n }\n return WORKBENCH_MODES.filter((mode) => value.has(mode));\n }, [workspace?.files]);\n const showModeTabs = workspace !== undefined && availableModes.length !== 1;\n const workspaceKind = availableModes.length === 1 ? availableModes[0] : undefined;\n\n useEffect(() => { buffersRef.current = buffers; }, [buffers]);\n\n const rememberEditorPosition = useCallback((): void => {\n const element = textareaRef.current;\n if (element === null || selected === undefined || element.getAttribute(\"aria-label\") !== selected) return;\n editorPositions.current.set(selected, {\n scrollTop: element.scrollTop,\n selectionStart: element.selectionStart,\n selectionEnd: element.selectionEnd\n });\n }, [selected]);\n\n useLayoutEffect(() => {\n if (editorMode !== \"source\" || selected === undefined || !editorReady) return;\n const element = textareaRef.current;\n const position = editorPositions.current.get(selected);\n if (element === null || position === undefined) return;\n const end = Math.min(position.selectionEnd, element.value.length);\n element.setSelectionRange(Math.min(position.selectionStart, end), end);\n element.scrollTop = position.scrollTop;\n }, [editorMode, editorReady, selected]);\n\n useEffect(() => {\n const warn = (event: BeforeUnloadEvent): void => {\n if (!Object.values(buffersRef.current).some((value) => value.source === \"human\" && value.content !== value.saved)) return;\n event.preventDefault();\n };\n globalThis.addEventListener(\"beforeunload\", warn);\n return () => { globalThis.removeEventListener(\"beforeunload\", warn); };\n }, []);\n\n const expandPath = useCallback((path: string): void => {\n const segments = path.split(\"/\");\n const ancestors = [groupForPath(path)];\n for (let index = 1; index < segments.length - 1; index += 1) ancestors.push(segments.slice(0, index + 1).join(\"/\"));\n setExpanded((current) => {\n const next = { ...current };\n for (const ancestor of ancestors) next[ancestor] = true;\n return next;\n });\n }, []);\n\n const revealPath = useCallback((path: string): void => {\n rememberEditorPosition();\n setWorkbench(workbenchModeForPath(path) ?? \"story\");\n setSelected(path);\n expandPath(path);\n }, [expandPath, rememberEditorPosition]);\n\n const followAgentPath = useCallback((path: string): void => {\n expandPath(path);\n const current = selected === undefined ? undefined : buffersRef.current[selected];\n const preserveFocusedDraft = path !== selected\n && current?.source === \"human\"\n && current.content !== current.saved\n && surfaceRef.current?.ownerDocument.activeElement === textareaRef.current;\n if (preserveFocusedDraft) return;\n revealPath(path);\n }, [expandPath, revealPath, selected]);\n\n useEffect(() => {\n if (workspace === undefined || initializedWorkbench.current) return;\n if (availableModes.length === 1) setWorkbench(availableModes[0] ?? \"story\");\n initializedWorkbench.current = true;\n }, [availableModes, workspace]);\n\n useEffect(() => {\n if (activityPath !== undefined && activityPath === selected) setEditorMode(\"source\");\n }, [activityPath, selected]);\n\n useEffect(() => {\n if (modeSelection.current === selected) return;\n modeSelection.current = selected;\n setEditorMode(activityPath === selected ? \"source\" : previewable ? \"preview\" : \"source\");\n }, [activityPath, previewable, selected]);\n\n useEffect(() => {\n if (workspaceLoading) return;\n if (activityPath !== undefined) return;\n if (selected !== undefined && (\n (workspace?.files.some((file) => file.path === selected) ?? false)\n || buffers[selected] !== undefined\n ) && workbenchModeForPath(selected) === workbench) return;\n setSelected(workspace === undefined ? undefined : preferredFile(workspace.files, workbench));\n }, [activityPath, buffers, selected, workbench, workspace, workspaceLoading]);\n\n useEffect(() => {\n if (workspace === undefined || workspaceLoading) return;\n const paths = new Set(workspace.files.map((file) => file.path));\n setBuffers((current) => {\n let changed = false;\n const next = { ...current };\n for (const [path, value] of Object.entries(current)) {\n if (paths.has(path) || activityPaths.has(path)) continue;\n if (value.source === \"human\" && value.content !== value.saved) {\n if (value.missing !== true) {\n next[path] = { ...value, missing: true, error: \"\u6587\u4EF6\u5DF2\u4ECE workspace \u79FB\u9664\u3002\u672C\u5730\u8349\u7A3F\u4ECD\u4FDD\u7559\uFF0C\u53EF\u590D\u5236\u540E\u653E\u5F03\u8349\u7A3F\u3002\" };\n changed = true;\n }\n } else {\n delete next[path];\n changed = true;\n }\n }\n return changed ? next : current;\n });\n }, [activityPaths, workspace, workspaceLoading]);\n\n useEffect(() => {\n if (selected === undefined || activityPaths.has(selected)) return;\n if (!(workspace?.files.some((file) => file.path === selected) ?? false)) return;\n const controller = new AbortController();\n setBuffers((current) => {\n const existing = current[selected];\n return existing === undefined ? current : { ...current, [selected]: { ...existing, error: undefined } };\n });\n void fetch(endpoint(\"file\", sessionId, selected), { signal: controller.signal })\n .then((response) => json<FilePayload>(response))\n .then((file) => {\n setBuffers((current) => {\n const existing = current[file.path];\n if (existing?.source === \"human\" && existing.content !== existing.saved) {\n if (existing.version === file.version) return { ...current, [file.path]: { ...existing, missing: false, error: undefined } };\n return {\n ...current,\n [file.path]: {\n ...existing,\n missing: false,\n error: undefined,\n conflict: {\n message: `${file.path} \u5DF2\u5728\u78C1\u76D8\u4E0A\u66F4\u65B0\uFF1B\u4F60\u7684\u672C\u5730\u8349\u7A3F\u6CA1\u6709\u88AB\u8986\u76D6\u3002`,\n theirs: file.content,\n theirsVersion: file.version\n }\n }\n };\n }\n return {\n ...current,\n [file.path]: { content: file.content, saved: file.content, source: \"disk\", version: file.version }\n };\n });\n })\n .catch((reason: unknown) => {\n if (controller.signal.aborted) return;\n setBuffers((current) => {\n const existing = current[selected];\n return existing === undefined ? current : {\n ...current,\n [selected]: { ...existing, error: reason instanceof Error ? reason.message : String(reason) }\n };\n });\n });\n return () => { controller.abort(); };\n }, [activityPaths, selected, sessionId, workspace?.files]);\n\n useEffect(() => {\n if (normalizedActivities.length === 0) return;\n for (const { path } of normalizedActivities) expandPath(path);\n if (activityPath !== undefined) followAgentPath(activityPath);\n setBuffers((current) => {\n let next = current;\n for (const { activity: currentActivity, path } of normalizedActivities) {\n const existing = next[path];\n if (existing?.source === \"human\" && existing.content !== existing.saved) {\n next = {\n ...next,\n [path]: {\n ...existing,\n conflict: { message: `${path} \u6B63\u7531 Agent \u4FEE\u6539\uFF1B\u4F60\u7684\u672C\u5730\u8349\u7A3F\u5DF2\u9501\u5B9A\uFF0C\u4E0D\u4F1A\u88AB\u8986\u76D6\u3002` }\n }\n };\n continue;\n }\n let basis = activityBases.current.get(currentActivity.callId);\n if (basis === undefined || basis.path !== path) {\n basis = { path, base: existing?.content ?? \"\" };\n activityBases.current.set(currentActivity.callId, basis);\n }\n const preview = previewMutation(currentActivity, basis.base);\n if (preview === undefined || (existing?.source === \"agent\" && existing.content === preview)) continue;\n next = {\n ...next,\n [path]: {\n content: preview,\n saved: existing?.saved ?? \"\",\n source: \"agent\",\n version: existing?.version ?? \"\"\n }\n };\n }\n return next;\n });\n }, [activityPath, expandPath, followAgentPath, normalizedActivities]);\n\n useEffect(() => {\n const signals = new Set(mutatingCallIds(runningCalls));\n for (const { activity: currentActivity } of normalizedActivities) signals.add(currentActivity.callId.split(\":\", 1)[0] ?? currentActivity.callId);\n const settled = [...previousSignals.current].some((callId) => !signals.has(callId));\n for (const callId of activityBases.current.keys()) {\n if (!signals.has(callId.split(\":\", 1)[0] ?? callId)) activityBases.current.delete(callId);\n }\n previousSignals.current = signals;\n if (!settled) return;\n reload();\n }, [normalizedActivities, reload, runningCalls]);\n\n useEffect(() => {\n if (settledMutation === undefined || settledMutation === previousSettledMutation.current) return;\n previousSettledMutation.current = settledMutation;\n const path = creativeRelativePath(settledMutation.slice(settledMutation.indexOf(\"\\0\") + 1), workspace?.cwd);\n if (path !== undefined) followAgentPath(path);\n reload();\n }, [followAgentPath, reload, settledMutation, workspace?.cwd]);\n\n useEffect(() => {\n if (selected === undefined) return;\n for (const button of navRef.current?.querySelectorAll<HTMLButtonElement>(\"button[data-file-path]\") ?? []) {\n if (button.dataset.filePath === selected) {\n button.scrollIntoView({ block: \"nearest\" });\n break;\n }\n }\n }, [selected]);\n\n useEffect(() => {\n if (normalizedActivities.length > 0 || workspace === undefined) return;\n const sessionSurface = surfaceRef.current?.parentElement;\n if (sessionSurface === undefined || sessionSurface === null) return;\n const knownPaths = new Set(workspace.files.map((file) => file.path));\n const followOfficialFileLink = (event: MouseEvent): void => {\n const origin = event.target;\n if (!(origin instanceof Element)) return;\n const control = origin.closest<HTMLElement>(\"button, a\");\n if (control === null || control.closest(\".oh-story-split-surface\") !== null) return;\n const candidates = [control.title, control.getAttribute(\"aria-label\"), control.textContent];\n for (const candidate of candidates) {\n const path = creativeRelativePath(candidate?.trim().replace(/^(?:Open|\u6253\u5F00)\\s+/u, \"\"), workspace.cwd);\n if (path === undefined || !knownPaths.has(path)) continue;\n event.preventDefault();\n event.stopPropagation();\n revealPath(path);\n break;\n }\n };\n sessionSurface.addEventListener(\"click\", followOfficialFileLink, true);\n return () => { sessionSurface.removeEventListener(\"click\", followOfficialFileLink, true); };\n }, [normalizedActivities.length, revealPath, workspace]);\n\n const savePath = useCallback(async (path: string) => {\n if (saveLocks.current.has(path)) return;\n const submitted = buffersRef.current[path];\n if (submitted === undefined || submitted.missing === true || submitted.content === submitted.saved) return;\n saveLocks.current.add(path);\n setBuffers((current) => {\n const existing = current[path];\n return existing === undefined ? current : { ...current, [path]: { ...existing, saving: true, error: undefined } };\n });\n try {\n const file = await json<FilePayload>(await fetch(endpoint(\"file\", sessionId, path), {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ content: submitted.content, baseVersion: submitted.version })\n }));\n setBuffers((current) => {\n const latest = current[path];\n if (latest === undefined) return current;\n const unchanged = latest.content === submitted.content;\n return {\n ...current,\n [path]: {\n content: unchanged ? file.content : latest.content,\n saved: file.content,\n source: unchanged ? \"disk\" : \"human\",\n version: file.version,\n saving: false\n }\n };\n });\n reload();\n } catch (reason) {\n if (reason instanceof WorkspaceRequestError && reason.status === 412) {\n try {\n const theirs = await json<FilePayload>(await fetch(endpoint(\"file\", sessionId, path)));\n setBuffers((current) => {\n const latest = current[path];\n if (latest === undefined) return current;\n return {\n ...current,\n [path]: {\n ...latest,\n saving: false,\n conflict: {\n message: `${path} \u5DF2\u5728\u78C1\u76D8\u4E0A\u66F4\u65B0\uFF1B\u8BF7\u9009\u62E9\u4FDD\u7559\u54EA\u4E00\u7248\u3002`,\n theirs: theirs.content,\n theirsVersion: theirs.version\n }\n }\n };\n });\n } catch (refreshError) {\n setBuffers((current) => {\n const existing = current[path];\n return existing === undefined ? current : {\n ...current,\n [path]: { ...existing, saving: false, error: refreshError instanceof Error ? refreshError.message : String(refreshError) }\n };\n });\n }\n } else {\n setBuffers((current) => {\n const existing = current[path];\n return existing === undefined ? current : {\n ...current,\n [path]: { ...existing, saving: false, error: reason instanceof Error ? reason.message : String(reason) }\n };\n });\n }\n } finally {\n saveLocks.current.delete(path);\n }\n }, [reload, sessionId]);\n\n useEffect(() => {\n const saveShortcut = (event: KeyboardEvent): void => {\n if (!(event.metaKey || event.ctrlKey) || event.key.toLocaleLowerCase() !== \"s\") return;\n event.preventDefault();\n if (selected !== undefined) void savePath(selected);\n };\n globalThis.addEventListener(\"keydown\", saveShortcut);\n return () => { globalThis.removeEventListener(\"keydown\", saveShortcut); };\n }, [savePath, selected]);\n\n const groups = useMemo(() => {\n const value = new Map<string, WorkspaceFile[]>();\n const all = [...(workspace?.files ?? [])].filter((file) => workbenchModeForPath(file.path) === workbench);\n if (activityPath !== undefined && !all.some((file) => file.path === activityPath)) all.push({ path: activityPath, bytes: 0, version: \"\" });\n all.sort((left, right) => left.path.localeCompare(right.path, \"zh-Hans-CN\"));\n for (const file of all) {\n const directory = groupForPath(file.path);\n const files = value.get(directory) ?? [];\n files.push(file);\n value.set(directory, files);\n }\n const order = GROUP_ORDER[workbench];\n return [...value.entries()].sort(([left], [right]) => {\n const leftIndex = order.indexOf(left);\n const rightIndex = order.indexOf(right);\n return (leftIndex < 0 ? order.length : leftIndex) - (rightIndex < 0 ? order.length : rightIndex)\n || left.localeCompare(right, \"zh-Hans-CN\");\n });\n }, [activityPath, workbench, workspace]);\n\n const selectWorkbench = (next: WorkbenchMode): void => {\n setWorkbench(next);\n const target = workspace === undefined ? undefined : preferredFile(workspace.files, next);\n if (target === undefined) setSelected(undefined);\n else revealPath(target);\n };\n const selectEditorMode = (next: WorkbenchMemory[\"editorMode\"]): void => {\n if (next === \"preview\") rememberEditorPosition();\n setEditorMode(next);\n };\n const selectedLabel = selected ?? `\u5728\u5F53\u524D DSH workspace \u4E2D\u9009\u62E9${workbench === \"story\" ? \"\u5C0F\u8BF4\" : \"\u77ED\u5267\"}\u6587\u4EF6`;\n const selectedBasename = selected?.split(\"/\").at(-1) ?? selectedLabel;\n const selectedGroup = selected === undefined ? undefined : groupForPath(selected);\n const toggleGroup = (key: string, open: boolean): void => {\n setExpanded((current) => ({ ...current, [key]: open }));\n };\n const resolveConflict = (keepLocal: boolean): void => {\n if (selected === undefined || conflict?.theirs === undefined || conflict.theirsVersion === undefined) return;\n const theirs = conflict.theirs;\n const theirsVersion = conflict.theirsVersion;\n setBuffers((current) => {\n const existing = current[selected];\n if (existing === undefined) return current;\n return {\n ...current,\n [selected]: keepLocal\n ? { ...existing, saved: theirs, version: theirsVersion, source: \"human\", conflict: undefined }\n : { content: theirs, saved: theirs, source: \"disk\", version: theirsVersion }\n };\n });\n };\n\n return <div ref={surfaceRef} className=\"oh-story-split-surface\">\n <style>{styles}</style>\n <aside className=\"oh-story-tree\">\n <div className=\"oh-story-brand\">\n <span className=\"oh-story-brand-cluster\"><strong>\u2726 <span>Oh Story</span></strong>{workspaceKind !== undefined && <span className=\"oh-story-kind\">{workspaceKind === \"story\" ? \"\u5C0F\u8BF4\" : \"\u77ED\u5267\"}</span>}</span>\n <button type=\"button\" onClick={reload} title=\"\u5237\u65B0\" aria-label=\"\u5237\u65B0\u9879\u76EE\u6587\u4EF6\">\u21BB</button>\n </div>\n {showModeTabs && <div className=\"oh-story-mode-tabs\" role=\"tablist\" aria-label=\"\u521B\u4F5C\u5DE5\u4F5C\u53F0\">\n {WORKBENCH_MODES.map((mode) => <button\n type=\"button\"\n role=\"tab\"\n key={mode}\n tabIndex={workbench === mode ? 0 : -1}\n aria-selected={workbench === mode}\n onKeyDown={(event) => { handleTabKey(event, WORKBENCH_MODES, workbench, selectWorkbench); }}\n onClick={() => { selectWorkbench(mode); }}\n >{mode === \"story\" ? \"\u5C0F\u8BF4\" : \"\u77ED\u5267\"}</button>)}\n </div>}\n {error !== undefined && <div className=\"oh-story-error\">{error}</div>}\n {workspace?.metadataErrors.map((message) => <div className=\"oh-story-warning\" key={message}>{message}</div>)}\n <nav ref={navRef} aria-label={workbench === \"story\" ? \"\u5C0F\u8BF4\u9879\u76EE\u6587\u4EF6\" : \"\u77ED\u5267\u9879\u76EE\u6587\u4EF6\"}>\n {groups.map(([directory, files]) => {\n const groupOpen = selectedGroup === directory || expanded[directory] === true;\n return <details className=\"oh-story-file-group\" key={directory} open={groupOpen} onToggle={(event) => { toggleGroup(directory, event.currentTarget.open); }}>\n <summary>{directory}<span>{files.length}</span></summary>\n <FileTreeNodes\n nodes={buildFileTree(files, directory)}\n depth={1}\n expanded={expanded}\n selected={selected}\n activityPath={activityPath}\n onToggle={toggleGroup}\n onSelect={revealPath}\n />\n </details>;\n })}\n </nav>\n </aside>\n <main className=\"oh-story-editor\">\n <header>\n <span className=\"oh-story-editor-path\" title={selected}><span>{selectedLabel}</span><strong>{selectedBasename}</strong></span>\n <div className=\"oh-story-editor-actions\">\n {previewable && <div className=\"oh-story-editor-tabs\" role=\"tablist\" aria-label={markdown ? \"Markdown \u67E5\u770B\u65B9\u5F0F\" : \"JSONL \u67E5\u770B\u65B9\u5F0F\"}>\n {EDITOR_MODES.map((mode) => <button\n type=\"button\"\n role=\"tab\"\n key={mode}\n tabIndex={editorMode === mode ? 0 : -1}\n aria-selected={editorMode === mode}\n onKeyDown={(event) => { handleTabKey(event, EDITOR_MODES, editorMode, selectEditorMode); }}\n onClick={() => { selectEditorMode(mode); }}\n >{mode === \"preview\" ? \"\u9884\u89C8\" : \"\u6E90\u7801\"}</button>)}\n </div>}\n {(dirty || saving) && selected !== undefined && <button className=\"oh-story-save\" type=\"button\" disabled={saving || buffer?.missing === true} onClick={() => { void savePath(selected); }}>\n {saving ? \"\u4FDD\u5B58\u4E2D\u2026\" : \"\u4FDD\u5B58\"}\n </button>}\n </div>\n </header>\n {activity !== undefined && activityPath !== undefined && activityPath === selected && <div className=\"oh-story-stream\" data-stage={activity.stage} role=\"status\" aria-live=\"polite\">\u25CF {activity.stage === \"running\" ? \"Agent \u6B63\u5728\u5E94\u7528\u4FEE\u6539\" : \"Agent \u6B63\u5728\u751F\u6210\u6587\u4EF6\u5185\u5BB9\"}</div>}\n {conflict !== undefined && <div className=\"oh-story-conflict\" role=\"alert\">\n <span>{conflict.message}</span>\n {conflict.theirs !== undefined && conflict.theirsVersion !== undefined && selected !== undefined && <div>\n <button type=\"button\" onClick={() => { resolveConflict(false); }}>\u8F7D\u5165\u78C1\u76D8\u7248\u672C</button>\n <button type=\"button\" onClick={() => { resolveConflict(true); }}>\u4FDD\u7559\u672C\u5730\u8349\u7A3F</button>\n </div>}\n </div>}\n {fileError !== undefined && <div className=\"oh-story-error\">{fileError}</div>}\n {selected === undefined\n ? <div className=\"oh-story-empty\">{workbench === \"story\"\n ? <>\u5F53\u524D workspace \u8FD8\u6CA1\u6709\u5C0F\u8BF4\u6587\u4EF6\u3002\u53EF\u5728\u53F3\u4FA7 Chat \u4E2D\u8FD0\u884C <code>/story-setup</code>\u3002</>\n : <>\u5F53\u524D workspace \u8FD8\u6CA1\u6709\u77ED\u5267\u9879\u76EE\u3002\u53EF\u5728\u53F3\u4FA7 Chat \u4E2D\u8FD0\u884C <code>/short-drama</code>\u3002</>}</div>\n : buffer === undefined\n ? <div className=\"oh-story-empty\">\u6B63\u5728\u52A0\u8F7D {selected}\u2026</div>\n : buffer.missing === true\n ? <div className=\"oh-story-empty\">\u6587\u4EF6\u5DF2\u4ECE workspace \u79FB\u9664\uFF0C\u672C\u5730\u8349\u7A3F\u4ECD\u4FDD\u7559\u3002\u8BF7\u5148\u590D\u5236\u9700\u8981\u7684\u5185\u5BB9\uFF0C\u518D\u653E\u5F03\u8349\u7A3F\u3002<button type=\"button\" onClick={() => {\n setBuffers((current) => {\n const next = { ...current };\n delete next[selected];\n return next;\n });\n setSelected(workspace === undefined ? undefined : preferredFile(workspace.files, workbench));\n }}>\u653E\u5F03\u672C\u5730\u8349\u7A3F</button></div>\n : previewable && editorMode === \"preview\"\n ? markdown\n ? <MarkdownPreview content={buffer.content} label={selected} />\n : <JsonlPreview content={buffer.content} label={selected} />\n : <textarea\n ref={textareaRef}\n value={buffer.content}\n data-format={structured ? \"structured\" : \"prose\"}\n onBlur={rememberEditorPosition}\n onScroll={rememberEditorPosition}\n onSelect={rememberEditorPosition}\n onChange={(event) => {\n const content = event.target.value;\n setBuffers((current) => ({\n ...current,\n [selected]: {\n content,\n saved: current[selected]?.saved ?? \"\",\n source: \"human\",\n version: current[selected]?.version ?? \"\",\n conflict: current[selected]?.conflict,\n saving: current[selected]?.saving\n }\n }));\n }}\n spellCheck={!structured}\n aria-label={selected}\n />}\n </main>\n </div>;\n}\n\ntype WorkbenchSlotProps = PropsRuntime<\"oh-story.workspace\"> & PropsStore<ReturnType<typeof createWorkbenchStore>>;\n\n/** Mount beside the official conversation without replacing Chat or Composer. */\nfunction CreativeSplitBridge({ sessionId, useSession, useStore, actions }: WorkbenchSlotProps) {\n const marker = useRef<HTMLSpanElement>(null);\n const [target, setTarget] = useState<HTMLElement>();\n const runningCalls = useSession((snapshot) => snapshot.runningCalls);\n const partial = useSession((snapshot) => streamingAssistant(snapshot.chat.timeline));\n const settledMutation = useSession((snapshot) => latestSettledMutation(snapshot.chat));\n useLayoutEffect(() => {\n const document = marker.current?.ownerDocument;\n if (document === undefined) return;\n const locate = (): void => {\n const anchor = document.querySelector<HTMLElement>(\"[data-conversation-scroll] > [data-slot='conversation.session']\");\n setTarget((current) => current === anchor ? current : anchor ?? undefined);\n };\n locate();\n const observer = new MutationObserver(locate);\n observer.observe(document.body, { childList: true, subtree: true });\n return () => { observer.disconnect(); };\n }, [sessionId]);\n useLayoutEffect(() => {\n const scroller = target?.parentElement;\n if (scroller === undefined || scroller === null) return;\n const publishLayout = (): void => {\n scroller.style.setProperty(\"--oh-story-scroll-height\", `${String(scroller.clientHeight)}px`);\n const layout = scroller.clientWidth < 620 ? \"compact\" : scroller.clientWidth < 900 ? \"medium\" : \"wide\";\n if (scroller.dataset.ohStoryLayout !== layout) scroller.dataset.ohStoryLayout = layout;\n };\n publishLayout();\n const observer = new ResizeObserver(publishLayout);\n observer.observe(scroller);\n return () => {\n observer.disconnect();\n scroller.style.removeProperty(\"--oh-story-scroll-height\");\n delete scroller.dataset.ohStoryLayout;\n };\n }, [target]);\n return <>\n <span ref={marker} className=\"oh-story-bridge-marker\" aria-hidden />\n {target === undefined ? null : createPortal(<CreativeWorkbench\n sessionId={sessionId}\n runningCalls={runningCalls}\n partial={partial}\n settledMutation={settledMutation}\n useStore={useStore}\n actions={actions}\n />, target)}\n </>;\n}\n\ntype WorkbenchSeatProps = PropsRuntime<\"shell.overlay\"> & PropsRenderSlots<\"oh-story.workspace\">;\n\nfunction WorkbenchSeat({ SessionProvider, renderSlot }: WorkbenchSeatProps) {\n return <SessionProvider>{() => renderSlot(\"oh-story.workspace\", {})}</SessionProvider>;\n}\n\nfunction argsOf(block: ToolCallViewProps[\"block\"]): Record<string, unknown> {\n const raw = (\"kind\" in block ? block.call?.argsRaw : block.argsRaw) ?? \"{}\";\n try {\n const value = JSON.parse(raw) as unknown;\n return typeof value === \"object\" && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : {};\n } catch { return {}; }\n}\n\nfunction resultOf(block: ToolCallViewProps[\"block\"]): string | undefined {\n if (!(\"kind\" in block)) return undefined;\n return block.content.map((item) => item.type === \"text\" ? item.text : JSON.stringify(item, null, 2)).join(\"\\n\");\n}\n\nfunction RoleToolView({ block, inspect }: ToolCallViewProps) {\n const args = argsOf(block);\n const role = typeof args.role === \"string\" ? args.role : \"story-role\";\n const output = resultOf(block);\n const state = !(\"kind\" in block) ? \"running\" : block.isError ? \"error\" : \"done\";\n return <details className=\"oh-story-role\" data-state={state}>\n <style>{styles}</style>\n <summary><span>\u2726 Role</span><strong>{role}</strong><em>{state === \"running\" ? \"\u8FD0\u884C\u4E2D\" : state === \"error\" ? \"\u5931\u8D25\" : \"\u5B8C\u6210\"}</em></summary>\n {output !== undefined && <pre>{output}</pre>}\n {inspect !== undefined && <button type=\"button\" onClick={inspect}>\u5728\u8F68\u8FF9\u4E2D\u68C0\u67E5</button>}\n </details>;\n}\n\n/** Register only official DSH surfaces; the split bridge never replaces Chat. */\nexport function apply(context: ClientContext): void {\n context.slots.inject(\"shell.overlay\", () => {\n const disposeSeat = context.slots.register({\n name: \"shell.overlay\",\n id: \"oh-story-workspace\",\n order: -100,\n children: { \"oh-story.workspace\": { kind: \"single\", scope: \"session\" } }\n }, WorkbenchSeat);\n const disposeWorkbench = context.slots.register({\n name: \"oh-story.workspace\",\n store: createWorkbenchStore\n }, CreativeSplitBridge);\n return [disposeSeat, disposeWorkbench];\n });\n context.slots.inject(\"tool.call.toolview\", () => context.slots.register({\n name: \"tool.call.toolview\",\n key: \"oh_story_role\"\n }, RoleToolView));\n}\n\nexport default { name, inject, apply };\n", "import type {\n ChatSnapshot,\n ConversationTimelineSnapshot,\n PartialAssistant,\n RunningToolCall,\n ToolCallBlock\n} from \"@deepseek-ai/dsh-client-runtime/client\";\nimport type { AssistantChatData } from \"@deepseek-ai/dsh-client-ui-conversation/client\";\n\nexport type MutationToolName = \"write\" | \"edit\" | \"str_replace_editor\";\n\nexport interface FileMutationActivity {\n readonly callId: string;\n readonly name: MutationToolName;\n readonly argsRaw: string;\n readonly stage: \"streaming\" | \"running\";\n readonly path: string | undefined;\n readonly operation: \"replace-file\" | \"replace-text\" | \"insert-text\" | undefined;\n readonly oldText: string | undefined;\n readonly newText: string | undefined;\n readonly replaceAll: boolean;\n}\n\ninterface JsonStringPrefix {\n readonly value: string;\n readonly complete: boolean;\n}\n\nexport type WorkbenchMode = \"story\" | \"drama\";\n\nconst STORY_DIRECTORIES = new Set([\"\u6B63\u6587\", \"\u5927\u7EB2\", \"\u8BBE\u5B9A\", \"\u8FFD\u8E2A\", \"\u5BF9\u6807\", \"\u53C2\u8003\u8D44\u6599\"]);\nconst DRAMA_DIRECTORIES = new Set([\"\u8F93\u5165\", \"\u9879\u76EE\u5F00\u53D1\", \"\u8BBE\u5B9A\u96C6\", \"\u5267\u96C6\", \"\u4EA4\u4ED8\", \"\u521B\u4F5C\u8005\u51B3\u7B56\", \"\u5BA1\u67E5\"]);\nconst EDITABLE_EXTENSION = /\\.(?:md|txt|json|jsonl)$/iu;\nconst MUTATING_CALLS = new Set([\"write\", \"edit\", \"str_replace_editor\", \"bash\", \"run_code\", \"oh_story_role\"]);\n\n/** Read the latest running Assistant step, including tool-only steps hidden from the Chat list. */\nexport function streamingAssistant(timeline: ConversationTimelineSnapshot): PartialAssistant | null {\n for (const turnNumber of timeline.turnOrder.toReversed()) {\n const turn = timeline.turns.get(turnNumber);\n if (turn === undefined) continue;\n for (const step of turn.steps.toReversed()) {\n const assistant: AssistantChatData | undefined = step.data.get(\"assistant-step\");\n if (assistant?.status === \"running\") return assistant;\n }\n }\n return null;\n}\n\nfunction decodeEscape(character: string): string | undefined {\n switch (character) {\n case \"\\\"\": return \"\\\"\";\n case \"\\\\\": return \"\\\\\";\n case \"/\": return \"/\";\n case \"b\": return \"\\b\";\n case \"f\": return \"\\f\";\n case \"n\": return \"\\n\";\n case \"r\": return \"\\r\";\n case \"t\": return \"\\t\";\n default: return undefined;\n }\n}\n\n/** Read a JSON string even while the model is still streaming its closing quote. */\nexport function jsonStringPrefix(raw: string, key: string): JsonStringPrefix | undefined {\n const match = new RegExp(`\"${key.replace(/[.*+?^${}()|[\\]\\\\]/gu, \"\\\\$&\")}\"\\\\s*:\\\\s*\"`, \"u\").exec(raw);\n if (match === null) return undefined;\n let value = \"\";\n for (let index = match.index + match[0].length; index < raw.length; index += 1) {\n const character = raw[index] ?? \"\";\n if (character === \"\\\"\") return { value, complete: true };\n if (character !== \"\\\\\") { value += character; continue; }\n const escape = raw[index + 1];\n if (escape === undefined) return { value, complete: false };\n if (escape === \"u\") {\n const hex = raw.slice(index + 2, index + 6);\n if (!/^[\\da-f]{4}$/iu.test(hex)) return { value, complete: false };\n value += String.fromCharCode(Number.parseInt(hex, 16));\n index += 5;\n continue;\n }\n const decoded = decodeEscape(escape);\n if (decoded === undefined) return { value, complete: false };\n value += decoded;\n index += 1;\n }\n return { value, complete: false };\n}\n\nfunction completedString(raw: string, key: string): string | undefined {\n const value = jsonStringPrefix(raw, key);\n return value?.complete === true ? value.value : undefined;\n}\n\nfunction parsedArgs(raw: string): Record<string, unknown> | undefined {\n try {\n const value = JSON.parse(raw) as unknown;\n return typeof value === \"object\" && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n } catch { return undefined; }\n}\n\nfunction mutationFromArgs(name: string, callId: string, argsRaw: string, stage: FileMutationActivity[\"stage\"]): FileMutationActivity | undefined {\n const complete = parsedArgs(argsRaw);\n if (name === \"write\") {\n return {\n callId, name, argsRaw, stage,\n path: jsonStringPrefix(argsRaw, \"file_path\")?.value,\n operation: \"replace-file\",\n oldText: undefined,\n newText: jsonStringPrefix(argsRaw, \"content\")?.value,\n replaceAll: false\n };\n }\n if (name === \"edit\") {\n return {\n callId, name, argsRaw, stage,\n path: jsonStringPrefix(argsRaw, \"file_path\")?.value,\n operation: \"replace-text\",\n oldText: completedString(argsRaw, \"old_string\"),\n newText: jsonStringPrefix(argsRaw, \"new_string\")?.value,\n replaceAll: complete?.replace_all === true\n };\n }\n if (name !== \"str_replace_editor\") return undefined;\n const command = completedString(argsRaw, \"command\");\n if (command === \"view\") return undefined;\n const path = jsonStringPrefix(argsRaw, \"path\")?.value;\n if (command === \"create\") {\n return {\n callId, name, argsRaw, stage, path,\n operation: \"replace-file\",\n oldText: undefined,\n newText: jsonStringPrefix(argsRaw, \"file_text\")?.value,\n replaceAll: false\n };\n }\n if (command === \"str_replace\") {\n return {\n callId, name, argsRaw, stage, path,\n operation: \"replace-text\",\n oldText: completedString(argsRaw, \"old_str\"),\n newText: jsonStringPrefix(argsRaw, \"new_str\")?.value ?? (complete !== undefined ? \"\" : undefined),\n replaceAll: complete?.replace_all === true\n };\n }\n if (command === \"insert\") {\n return {\n callId, name, argsRaw, stage, path,\n operation: \"insert-text\",\n oldText: undefined,\n newText: jsonStringPrefix(argsRaw, \"new_str\")?.value,\n replaceAll: false\n };\n }\n return { callId, name, argsRaw, stage, path, operation: undefined, oldText: undefined, newText: undefined, replaceAll: false };\n}\n\nfunction mutationsFromRunning(call: RunningToolCall): FileMutationActivity[] {\n const direct = mutationFromArgs(call.name, call.callId, call.argsRaw, \"running\");\n if (direct === undefined) return [];\n const view = call.callView;\n if (view?.card !== \"diff\" || view.diffs.length === 0) return [direct];\n return view.diffs.map((diff, index) => ({\n ...direct,\n callId: view.diffs.length === 1 ? call.callId : `${call.callId}:${String(index)}`,\n path: diff.path,\n operation: diff.oldText === null ? \"replace-file\" : \"replace-text\",\n oldText: diff.oldText ?? undefined,\n newText: diff.newText\n }));\n}\n\nfunction visitRunning(blocks: readonly ToolCallBlock[], visit: (call: RunningToolCall) => void): void {\n for (const block of blocks) {\n if (!(\"kind\" in block)) visit(block);\n visitRunning(block.subCalls, visit);\n }\n}\n\n/** Return every active file mutation in official DSH dispatch order, including nested Code Mode calls. */\nexport function fileMutations(\n runningCalls: readonly RunningToolCall[],\n partial: PartialAssistant | null = null\n): FileMutationActivity[] {\n const values: FileMutationActivity[] = [];\n visitRunning(runningCalls, (call) => { values.push(...mutationsFromRunning(call)); });\n for (const block of partial?.blocks ?? []) {\n if (block.kind !== \"tool-call\") continue;\n const value = mutationFromArgs(block.name, block.callId, block.argsRaw, \"streaming\");\n if (value !== undefined && !values.some((candidate) => candidate.callId === value.callId)) values.push(value);\n }\n return values;\n}\n\n/** Running calls whose settlement may have changed creative files. */\nexport function mutatingCallIds(runningCalls: readonly RunningToolCall[]): ReadonlySet<string> {\n const ids = new Set<string>();\n visitRunning(runningCalls, (call) => { if (MUTATING_CALLS.has(call.name)) ids.add(call.callId); });\n return ids;\n}\n\nfunction settledMutationSignals(block: ToolCallBlock): string[] {\n const nested = block.subCalls.flatMap(settledMutationSignals);\n if (!(\"kind\" in block) || block.isError) return nested;\n const diffs = block.resultView?.card === \"diff\"\n ? block.resultView.diffs\n : block.callView?.card === \"diff\" ? block.callView.diffs : undefined;\n if (diffs !== undefined) return [\n ...diffs.map((diff, index) => `${block.callId}:${String(index)}\\0${diff.path}`),\n ...nested\n ];\n if (block.call === null) return nested;\n const mutation = mutationFromArgs(block.call.name, block.callId, block.call.argsRaw, \"running\");\n return mutation?.path === undefined ? nested : [`${block.callId}\\0${mutation.path}`, ...nested];\n}\n\n/** Latest durable successful mutation, used when a fast call skips the live render window. */\nexport function latestSettledMutation(chat: ChatSnapshot): string | undefined {\n for (const key of chat.order.toReversed()) {\n const node = chat.nodes.get(key);\n if (node?.kind !== \"tool-call\") continue;\n const root = (node.data as { readonly root?: ToolCallBlock }).root;\n const signal = root === undefined ? undefined : settledMutationSignals(root).at(-1);\n if (signal !== undefined) return signal;\n }\n return undefined;\n}\n\n/** Convert a DSH tool path to the creative-relative path accepted by the narrow route. */\nexport function creativeRelativePath(path: string | undefined, cwd: string | undefined): string | undefined {\n if (path === undefined || path === \"\") return undefined;\n const normalized = path.replaceAll(\"\\\\\", \"/\");\n const root = cwd?.replaceAll(\"\\\\\", \"/\").replace(/\\/$/u, \"\");\n const insideRoot = root !== undefined && normalized.startsWith(`${root}/`);\n if ((normalized.startsWith(\"/\") || /^[a-z]:\\//iu.test(normalized) || normalized.startsWith(\"file:\")) && !insideRoot) return undefined;\n const relative = insideRoot ? normalized.slice(root.length + 1) : normalized.replace(/^\\.\\//u, \"\");\n const [directory] = relative.split(\"/\", 1);\n const creative = directory !== undefined && (STORY_DIRECTORIES.has(directory) || DRAMA_DIRECTORIES.has(directory));\n if ((!creative && relative !== \"short-drama.json\") || !EDITABLE_EXTENSION.test(relative)) return undefined;\n if (relative.split(\"/\").some((part) => part === \"..\" || part === \".\" || part === \"\")) return undefined;\n return relative;\n}\n\nexport function workbenchModeForPath(path: string | undefined): WorkbenchMode | undefined {\n if (path === \"short-drama.json\") return \"drama\";\n const directory = path?.split(\"/\", 1)[0];\n if (directory !== undefined && STORY_DIRECTORIES.has(directory)) return \"story\";\n if (directory !== undefined && DRAMA_DIRECTORIES.has(directory)) return \"drama\";\n return undefined;\n}\n\n/** Project one streamed mutation over its immediate predecessor. */\nexport function previewMutation(activity: FileMutationActivity, base: string): string | undefined {\n if (activity.operation === \"replace-file\") return activity.newText;\n if (activity.operation === \"replace-text\") {\n if (activity.oldText === undefined || activity.newText === undefined || activity.oldText === \"\") return undefined;\n if (activity.replaceAll) return base.includes(activity.oldText) ? base.split(activity.oldText).join(activity.newText) : undefined;\n const at = base.indexOf(activity.oldText);\n return at < 0 ? undefined : `${base.slice(0, at)}${activity.newText}${base.slice(at + activity.oldText.length)}`;\n }\n if (activity.operation === \"insert-text\") {\n if (activity.newText === undefined) return undefined;\n const rawLine = /\"insert_line\"\\s*:\\s*(\\d+)/u.exec(activity.argsRaw)?.[1];\n if (rawLine === undefined) return undefined;\n const line = Number.parseInt(rawLine, 10);\n const parts = base.split(\"\\n\");\n const at = Math.max(0, Math.min(parts.length, line));\n parts.splice(at, 0, activity.newText);\n return parts.join(\"\\n\");\n }\n return undefined;\n}\n", "export interface FileTreeInput {\n readonly path: string;\n readonly bytes: number;\n}\n\nexport interface FileTreeFile {\n readonly kind: \"file\";\n readonly name: string;\n readonly path: string;\n readonly bytes: number;\n}\n\nexport interface FileTreeDirectory {\n readonly kind: \"directory\";\n readonly name: string;\n readonly path: string;\n readonly fileCount: number;\n readonly children: readonly FileTreeNode[];\n}\n\nexport type FileTreeNode = FileTreeFile | FileTreeDirectory;\n\ninterface MutableDirectory {\n readonly name: string;\n readonly path: string;\n readonly directories: Map<string, MutableDirectory>;\n readonly files: FileTreeFile[];\n}\n\nfunction directory(name: string, path: string): MutableDirectory {\n return { name, path, directories: new Map(), files: [] };\n}\n\nfunction compareNames(left: { readonly name: string }, right: { readonly name: string }): number {\n return left.name.localeCompare(right.name, \"zh-Hans-CN\", { numeric: true });\n}\n\nfunction freezeDirectory(value: MutableDirectory): FileTreeDirectory {\n const directories = [...value.directories.values()].map(freezeDirectory).sort(compareNames);\n const files = [...value.files].sort(compareNames);\n return {\n kind: \"directory\",\n name: value.name,\n path: value.path,\n fileCount: files.length + directories.reduce((sum, child) => sum + child.fileCount, 0),\n children: [...directories, ...files]\n };\n}\n\nexport function buildFileTree(files: readonly FileTreeInput[], group: string): readonly FileTreeNode[] {\n const root = directory(group, group);\n for (const file of files) {\n const relative = file.path.startsWith(`${group}/`) ? file.path.slice(group.length + 1) : file.path;\n const segments = relative.split(\"/\").filter((segment) => segment !== \"\");\n const name = segments.pop();\n if (name === undefined) continue;\n let parent = root;\n for (const segment of segments) {\n const path = `${parent.path}/${segment}`;\n const child = parent.directories.get(segment) ?? directory(segment, path);\n parent.directories.set(segment, child);\n parent = child;\n }\n parent.files.push({ kind: \"file\", name, path: file.path, bytes: file.bytes });\n }\n return freezeDirectory(root).children;\n}\n", "const TITLE_KEYS = [\n \"display_name\", \"title\", \"name\", \"shot_id\", \"scene_id\", \"episode_id\", \"character_id\",\n \"location_id\", \"view_id\", \"prop_id\", \"state_id\", \"decision_id\", \"occurrence_id\", \"record_id\", \"id\"\n] as const;\n\nexport interface JsonlRecord {\n readonly line: number;\n readonly raw: string;\n readonly value?: unknown;\n readonly title: string;\n readonly type?: string;\n readonly status?: string;\n readonly error?: string;\n}\n\nfunction objectRecord(value: unknown): Record<string, unknown> | undefined {\n return typeof value === \"object\" && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : undefined;\n}\n\nfunction stringField(record: Record<string, unknown>, keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const value = record[key];\n if (typeof value === \"string\" && value.trim() !== \"\") return value;\n }\n return undefined;\n}\n\nfunction metadata(value: unknown, line: number): Pick<JsonlRecord, \"title\" | \"type\" | \"status\"> {\n const record = objectRecord(value);\n if (record === undefined) return { title: typeof value === \"string\" ? value : JSON.stringify(value) ?? `\u7B2C ${String(line)} \u884C` };\n const type = stringField(record, [\"record_type\", \"type\", \"kind\"]);\n const acceptance = objectRecord(record.creator_acceptance);\n const status = stringField(record, [\"status\"]) ?? (acceptance === undefined ? undefined : stringField(acceptance, [\"status\"]));\n return {\n title: stringField(record, TITLE_KEYS) ?? `\u8BB0\u5F55 ${String(line)}`,\n ...(type === undefined ? {} : { type }),\n ...(status === undefined ? {} : { status })\n };\n}\n\nexport function parseJsonl(content: string): JsonlRecord[] {\n const records: JsonlRecord[] = [];\n const lines = content.replaceAll(\"\\r\\n\", \"\\n\").split(\"\\n\");\n for (const [index, raw] of lines.entries()) {\n if (raw.trim() === \"\") continue;\n try {\n const value = JSON.parse(raw) as unknown;\n records.push({ line: index + 1, raw, value, ...metadata(value, index + 1) });\n } catch (error) {\n records.push({\n line: index + 1,\n raw,\n title: `\u7B2C ${String(index + 1)} \u884C\u683C\u5F0F\u9519\u8BEF`,\n error: error instanceof Error ? error.message : String(error)\n });\n }\n }\n return records;\n}\n\nconst PREVIEW_LIMIT = 200;\n\nexport function JsonlPreview({ content, label }: { readonly content: string; readonly label: string }) {\n const records = parseJsonl(content);\n if (records.length === 0) return <div className=\"oh-story-markdown-empty\">\u8FD9\u4E2A JSONL \u6587\u4EF6\u8FD8\u662F\u7A7A\u7684\u3002</div>;\n const valid = records.filter((record) => record.error === undefined).length;\n const errors = records.length - valid;\n const visible = records.slice(0, PREVIEW_LIMIT);\n return <section className=\"oh-story-jsonl\" aria-label={`${label} \u7ED3\u6784\u5316\u9884\u89C8`}>\n <header className=\"oh-story-jsonl-summary\">\n <strong>{errors === 0 ? `${String(valid)} \u6761\u8BB0\u5F55` : `${String(valid)} \u6761\u6709\u6548\u8BB0\u5F55`}</strong>\n {errors > 0 && <span>{String(errors)} \u6761\u683C\u5F0F\u9519\u8BEF</span>}\n {records.length > PREVIEW_LIMIT && <span>\u4EC5\u663E\u793A\u524D {String(PREVIEW_LIMIT)} \u6761</span>}\n </header>\n <div className=\"oh-story-jsonl-records\">\n {visible.map((record) => record.error === undefined\n ? <details key={record.line} open={records.length <= 2}>\n <summary>\n <span>\u7B2C {String(record.line)} \u884C</span>\n <strong>{record.title}</strong>\n {record.type !== undefined && <code>{record.type}</code>}\n {record.status !== undefined && <em>{record.status}</em>}\n </summary>\n <pre><code>{JSON.stringify(record.value, null, 2)}</code></pre>\n </details>\n : <div className=\"oh-story-jsonl-error\" key={record.line} role=\"alert\">\n <strong>{record.title}</strong>\n <span>{record.error}</span>\n <pre>{record.raw}</pre>\n </div>)}\n </div>\n </section>;\n}\n", "import type { ReactNode } from \"react\";\n\nconst INLINE = /(`[^`\\n]+`|\\*\\*[^*\\n]+\\*\\*|~~[^~\\n]+~~|\\[[^\\]\\n]+\\]\\(https?:\\/\\/[^)\\s]+\\)|\\*[^*\\n]+\\*)/gu;\n\nfunction inline(source: string, key: string): ReactNode[] {\n const nodes: ReactNode[] = [];\n let cursor = 0;\n for (const match of source.matchAll(INLINE)) {\n const token = match[0];\n const index = match.index;\n if (index > cursor) nodes.push(source.slice(cursor, index));\n if (token.startsWith(\"`\")) nodes.push(<code key={`${key}-${String(index)}`}>{token.slice(1, -1)}</code>);\n else if (token.startsWith(\"**\")) nodes.push(<strong key={`${key}-${String(index)}`}>{token.slice(2, -2)}</strong>);\n else if (token.startsWith(\"~~\")) nodes.push(<del key={`${key}-${String(index)}`}>{token.slice(2, -2)}</del>);\n else if (token.startsWith(\"*\")) nodes.push(<em key={`${key}-${String(index)}`}>{token.slice(1, -1)}</em>);\n else {\n const link = /^\\[([^\\]]+)\\]\\((https?:\\/\\/[^)\\s]+)\\)$/u.exec(token);\n nodes.push(link === null ? token : <a key={`${key}-${String(index)}`} href={link[2]} target=\"_blank\" rel=\"noreferrer\">{link[1]}</a>);\n }\n cursor = index + token.length;\n }\n if (cursor < source.length) nodes.push(source.slice(cursor));\n return nodes;\n}\n\ntype Alignment = \"left\" | \"center\" | \"right\" | undefined;\ninterface ListItem { readonly text: string; readonly checked?: boolean }\n\nexport type MarkdownBlock =\n | { readonly kind: \"code\"; readonly lines: readonly string[]; readonly language?: string }\n | { readonly kind: \"heading\"; readonly text: string; readonly level: number }\n | { readonly kind: \"quote\"; readonly lines: readonly string[] }\n | { readonly kind: \"ul\" | \"ol\"; readonly items: readonly ListItem[]; readonly start?: number }\n | { readonly kind: \"table\"; readonly headers: readonly string[]; readonly rows: readonly (readonly string[])[]; readonly alignments: readonly Alignment[] }\n | { readonly kind: \"rule\" }\n | { readonly kind: \"paragraph\"; readonly lines: readonly string[] };\n\nfunction splitTableRow(line: string): string[] {\n let source = line.trim();\n if (source.startsWith(\"|\")) source = source.slice(1);\n if (source.endsWith(\"|\")) source = source.slice(0, -1);\n const cells: string[] = [];\n let cell = \"\";\n for (let index = 0; index < source.length; index += 1) {\n const character = source[index] ?? \"\";\n if (character === \"\\\\\" && source[index + 1] === \"|\") {\n cell += \"|\";\n index += 1;\n } else if (character === \"|\") {\n cells.push(cell.trim());\n cell = \"\";\n } else cell += character;\n }\n cells.push(cell.trim());\n return cells;\n}\n\nfunction tableAlignments(line: string): Alignment[] | undefined {\n const cells = splitTableRow(line);\n if (cells.length === 0 || !cells.every((cell) => /^:?-{3,}:?$/u.test(cell))) return undefined;\n return cells.map((cell) => {\n if (cell.startsWith(\":\") && cell.endsWith(\":\")) return \"center\";\n if (cell.endsWith(\":\")) return \"right\";\n if (cell.startsWith(\":\")) return \"left\";\n return undefined;\n });\n}\n\nfunction beginsBlock(lines: readonly string[], index: number): boolean {\n const line = lines[index] ?? \"\";\n return /^(`{3,}|~{3,})\\s*[\\w-]*\\s*$/u.test(line)\n || /^#{1,6}\\s+/u.test(line)\n || /^(?:-{3,}|\\*{3,}|_{3,})\\s*$/u.test(line)\n || /^>\\s?/u.test(line)\n || /^[-*+]\\s+/u.test(line)\n || /^\\d+[.)]\\s+/u.test(line)\n || (line.includes(\"|\") && tableAlignments(lines[index + 1] ?? \"\") !== undefined);\n}\n\nexport function parseMarkdownBlocks(markdown: string): MarkdownBlock[] {\n const lines = markdown.replaceAll(\"\\r\\n\", \"\\n\").split(\"\\n\");\n const result: MarkdownBlock[] = [];\n for (let index = 0; index < lines.length;) {\n const line = lines[index] ?? \"\";\n if (line.trim() === \"\") { index += 1; continue; }\n\n const fence = /^(`{3,}|~{3,})\\s*([\\w-]*)\\s*$/u.exec(line);\n if (fence !== null) {\n const marker = fence[1] ?? \"```\";\n const markerCharacter = marker[0] ?? \"`\";\n const closing = new RegExp(`^${markerCharacter}{${String(marker.length)},}\\\\s*$`, \"u\");\n const code: string[] = [];\n index += 1;\n while (index < lines.length && !closing.test(lines[index] ?? \"\")) { code.push(lines[index] ?? \"\"); index += 1; }\n if (index < lines.length) index += 1;\n result.push({ kind: \"code\", lines: code, ...(fence[2] === undefined || fence[2] === \"\" ? {} : { language: fence[2] }) });\n continue;\n }\n\n const heading = /^(#{1,6})\\s+(.+)$/u.exec(line);\n if (heading !== null) {\n result.push({ kind: \"heading\", text: heading[2] ?? \"\", level: heading[1]?.length ?? 1 });\n index += 1;\n continue;\n }\n if (/^(?:-{3,}|\\*{3,}|_{3,})\\s*$/u.test(line)) { result.push({ kind: \"rule\" }); index += 1; continue; }\n\n const alignments = line.includes(\"|\") ? tableAlignments(lines[index + 1] ?? \"\") : undefined;\n if (alignments !== undefined) {\n const headers = splitTableRow(line);\n const rows: string[][] = [];\n index += 2;\n while (index < lines.length && (lines[index] ?? \"\").includes(\"|\") && (lines[index] ?? \"\").trim() !== \"\") {\n rows.push(splitTableRow(lines[index] ?? \"\"));\n index += 1;\n }\n result.push({ kind: \"table\", headers, rows, alignments });\n continue;\n }\n\n if (/^>\\s?/u.test(line)) {\n const quote: string[] = [];\n while (index < lines.length && /^>\\s?/u.test(lines[index] ?? \"\")) {\n quote.push((lines[index] ?? \"\").replace(/^>\\s?/u, \"\"));\n index += 1;\n }\n result.push({ kind: \"quote\", lines: quote });\n continue;\n }\n\n const unordered = /^[-*+]\\s+(.+)$/u.exec(line);\n const ordered = /^(\\d+)[.)]\\s+(.+)$/u.exec(line);\n if (unordered !== null || ordered !== null) {\n const kind = unordered !== null ? \"ul\" : \"ol\";\n const items: ListItem[] = [];\n const pattern = kind === \"ul\" ? /^[-*+]\\s+(.+)$/u : /^\\d+[.)]\\s+(.+)$/u;\n const start = ordered === null ? undefined : Number(ordered[1]);\n while (index < lines.length) {\n const item = pattern.exec(lines[index] ?? \"\");\n if (item === null) break;\n const source = item[1] ?? \"\";\n const task = /^\\[([ xX])\\]\\s+(.+)$/u.exec(source);\n items.push(task === null ? { text: source } : { text: task[2] ?? \"\", checked: task[1]?.toLocaleLowerCase() === \"x\" });\n index += 1;\n }\n result.push({ kind, items, ...(start === undefined ? {} : { start }) });\n continue;\n }\n\n const paragraph: string[] = [line];\n index += 1;\n while (index < lines.length) {\n const next = lines[index] ?? \"\";\n if (next.trim() === \"\" || beginsBlock(lines, index)) break;\n paragraph.push(next);\n index += 1;\n }\n result.push({ kind: \"paragraph\", lines: paragraph });\n }\n return result;\n}\n\nfunction Heading({ block, blockKey }: { readonly block: Extract<MarkdownBlock, { readonly kind: \"heading\" }>; readonly blockKey: string }) {\n const children = inline(block.text, blockKey);\n switch (block.level) {\n case 1: return <h1>{children}</h1>;\n case 2: return <h2>{children}</h2>;\n case 3: return <h3>{children}</h3>;\n case 4: return <h4>{children}</h4>;\n case 5: return <h5>{children}</h5>;\n default: return <h6>{children}</h6>;\n }\n}\n\nexport function MarkdownPreview({ content, label }: { readonly content: string; readonly label: string }) {\n const parsed = parseMarkdownBlocks(content);\n if (parsed.length === 0) return <div className=\"oh-story-markdown-empty\">\u8FD9\u4E2A Markdown \u6587\u4EF6\u8FD8\u662F\u7A7A\u7684\u3002</div>;\n return <article className=\"oh-story-markdown\" aria-label={`${label} \u6E32\u67D3\u9884\u89C8`}>\n {parsed.map((block, index) => {\n const key = `block-${String(index)}`;\n if (block.kind === \"code\") return <pre key={key}><code data-language={block.language}>{block.lines.join(\"\\n\")}</code></pre>;\n if (block.kind === \"rule\") return <hr key={key} />;\n if (block.kind === \"quote\") return <blockquote key={key}>{block.lines.map((line, lineIndex) => <p key={`${key}-${String(lineIndex)}`}>{inline(line, `${key}-${String(lineIndex)}`)}</p>)}</blockquote>;\n if (block.kind === \"ul\" || block.kind === \"ol\") {\n const items = block.items.map((item, itemIndex) => <li key={`${key}-${String(itemIndex)}`} className={item.checked === undefined ? undefined : \"oh-story-task-item\"}>\n {item.checked === undefined ? null : <input type=\"checkbox\" checked={item.checked} readOnly disabled aria-label={item.checked ? \"\u5DF2\u5B8C\u6210\" : \"\u672A\u5B8C\u6210\"} />}\n {inline(item.text, `${key}-${String(itemIndex)}`)}\n </li>);\n return block.kind === \"ul\" ? <ul key={key}>{items}</ul> : <ol key={key} start={block.start}>{items}</ol>;\n }\n if (block.kind === \"table\") return <div className=\"oh-story-markdown-table\" key={key}>\n <table>\n <thead><tr>{block.headers.map((cell, cellIndex) => <th key={`${key}-h-${String(cellIndex)}`} style={{ textAlign: block.alignments[cellIndex] }}>{inline(cell, `${key}-h-${String(cellIndex)}`)}</th>)}</tr></thead>\n <tbody>{block.rows.map((row, rowIndex) => <tr key={`${key}-r-${String(rowIndex)}`}>{block.headers.map((_, cellIndex) => <td key={`${key}-r-${String(rowIndex)}-${String(cellIndex)}`} style={{ textAlign: block.alignments[cellIndex] }}>{inline(row[cellIndex] ?? \"\", `${key}-r-${String(rowIndex)}-${String(cellIndex)}`)}</td>)}</tr>)}</tbody>\n </table>\n </div>;\n if (block.kind === \"heading\") return <Heading key={key} block={block} blockKey={key} />;\n if (block.kind === \"paragraph\") return <p key={key}>{block.lines.map((line, lineIndex) => <span key={`${key}-${String(lineIndex)}`}>{lineIndex === 0 ? null : <br />}{inline(line, `${key}-${String(lineIndex)}`)}</span>)}</p>;\n return null;\n })}\n </article>;\n}\n", ".oh-story-bridge-marker { display: none; }\n.oh-story-split-surface { display: contents; font-family: var(--dsw-font-family); }\n\n/* DSH documents every [data-slot] wrapper as a stable addressable styling\n seam. The official Session body and composer stay mounted; this only turns\n their scroll host into a three-column writing surface. */\n[data-conversation-scroll]:has(> [data-slot=\"conversation.session\"] > .oh-story-split-surface) {\n --os-border: var(--dsw-alias-border-l2);\n --os-muted: var(--dsw-alias-label-secondary);\n display: grid;\n grid-template-columns: clamp(184px, 16%, 200px) minmax(240px, 1fr) clamp(408px, 40%, 520px);\n grid-template-rows: minmax(0, 1fr);\n min-height: 0;\n overflow-x: hidden;\n overflow-y: auto;\n position: relative;\n scrollbar-gutter: stable;\n scroll-padding-bottom: calc(var(--dsh-composer-height, 152px) + 16px);\n}\n\n/* Keep the final Chat flow above the overlapping official Composer. */\n[data-conversation-scroll]:has(> [data-slot=\"conversation.session\"] > .oh-story-split-surface)\n > [data-slot=\"conversation.session\"] > :not(.oh-story-split-surface) {\n grid-column: 3;\n grid-row: 1;\n min-width: 0;\n min-height: 100%;\n border-left: 1px solid var(--os-border);\n}\n\n[data-conversation-scroll]:has(> [data-slot=\"conversation.session\"] > .oh-story-split-surface)\n [data-chat-flow] {\n padding-bottom: calc(var(--dsh-composer-height, 152px) + 16px);\n}\n\n[data-conversation-scroll]:has(> [data-slot=\"conversation.session\"] > .oh-story-split-surface)\n > [data-composer-seat] {\n grid-column: 3;\n grid-row: 1;\n align-self: start;\n min-width: 0;\n width: 100%;\n position: sticky;\n top: calc(var(--oh-story-scroll-height, 720px) - var(--dsh-composer-height, 152px));\n bottom: auto;\n}\n\n.oh-story-tree,\n.oh-story-editor {\n box-sizing: border-box;\n grid-row: 1;\n position: sticky;\n top: 0;\n align-self: start;\n min-width: 0;\n min-height: 0;\n height: 100%;\n color: inherit;\n background: var(--dsw-alias-bg-base);\n}\n\n.oh-story-tree {\n grid-column: 1;\n overflow: auto;\n padding: 14px 10px 24px;\n border-right: 1px solid var(--os-border);\n background: var(--dsw-specific-sidebar-fill);\n}\n\n.oh-story-editor {\n display: flex;\n grid-column: 2;\n overflow: hidden;\n flex-direction: column;\n}\n\n.oh-story-brand,\n.oh-story-editor header,\n.oh-story-role summary {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n\n.oh-story-brand { min-height: 28px; gap: 8px; padding: 0 5px 8px 7px; font-size: 14px; font-weight: 500; white-space: nowrap; }\n.oh-story-brand-cluster { display: flex; min-width: 0; align-items: center; gap: 6px; }\n.oh-story-brand-cluster strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: inherit; }\n.oh-story-kind { flex: none; padding: 1px 6px; border-radius: 5px; color: var(--dsw-alias-label-secondary); background: var(--dsw-alias-button-ghost-active-fill); font-size: 11px; line-height: 16px; font-weight: 500; }\n\n.oh-story-brand button,\n.oh-story-save,\n.oh-story-role button {\n border: 1px solid var(--dsw-alias-border-l2);\n border-radius: 999px;\n color: var(--dsw-alias-label-secondary);\n background: var(--dsw-alias-bg-base);\n padding: 3px 9px;\n cursor: pointer;\n font: inherit;\n}\n\n.oh-story-brand button { display: grid; width: 28px; height: 28px; place-items: center; border: 0; padding: 0; background: transparent; font-size: 16px; }\n.oh-story-brand button:hover,\n.oh-story-save:hover:not(:disabled),\n.oh-story-role button:hover { color: var(--dsw-alias-label-primary); background: var(--dsw-alias-interactive-bg-hover); }\n.oh-story-brand button:focus-visible,\n.oh-story-save:focus-visible,\n.oh-story-mode-tabs button:focus-visible,\n.oh-story-editor-tabs button:focus-visible,\n.oh-story-tree nav button:focus-visible,\n.oh-story-role button:focus-visible { outline: 2px solid var(--dsw-alias-state-business-primary); outline-offset: -2px; }\n.oh-story-save:disabled { opacity: .48; cursor: default; }\n\n.oh-story-mode-tabs { display: flex; margin: 0 4px 8px; padding: 2px; border: 1px solid var(--os-border); border-radius: 7px; background: var(--dsw-alias-bg-layer-1); }\n\n.oh-story-mode-tabs button,\n.oh-story-editor-tabs button {\n position: relative;\n min-height: 24px;\n flex: 1;\n border: 0;\n color: var(--os-muted);\n background: transparent;\n border-radius: 5px;\n cursor: pointer;\n font: inherit;\n font-size: 11px;\n}\n\n.oh-story-mode-tabs button:hover,\n.oh-story-editor-tabs button:hover { color: var(--dsw-alias-label-primary); }\n.oh-story-mode-tabs button[aria-selected=\"true\"],\n.oh-story-editor-tabs button[aria-selected=\"true\"] { color: var(--dsw-alias-label-primary); background: var(--dsw-alias-bg-base); box-shadow: 0 1px 2px rgb(0 0 0 / 8%); font-weight: 500; }\n\n.oh-story-file-group,\n.oh-story-file-folder { margin: 0; }\n.oh-story-file-group > summary,\n.oh-story-file-folder > summary {\n display: flex;\n align-items: center;\n gap: 5px;\n min-height: 26px;\n padding: 0 7px;\n border-radius: 6px;\n color: var(--os-muted);\n cursor: pointer;\n list-style: none;\n font-size: 11px;\n font-weight: 600;\n}\n.oh-story-file-folder > summary { padding-left: min(calc(7px + var(--oh-story-indent, 0px)), 49px); }\n.oh-story-file-group > summary { margin-top: 3px; }\n.oh-story-file-group > summary::-webkit-details-marker,\n.oh-story-file-folder > summary::-webkit-details-marker { display: none; }\n.oh-story-file-group > summary::before,\n.oh-story-file-folder > summary::before { width: 8px; content: \"\u203A\"; transform: rotate(0); transition: transform .12s ease; }\n.oh-story-file-group[open] > summary::before,\n.oh-story-file-folder[open] > summary::before { transform: rotate(90deg); }\n.oh-story-file-group > summary:hover,\n.oh-story-file-folder > summary:hover { color: var(--dsw-alias-label-primary); background: var(--dsw-alias-interactive-bg-hover); }\n.oh-story-file-group > summary span,\n.oh-story-file-folder > summary span { margin-left: auto; color: var(--dsw-alias-label-secondary); font-weight: 400; }\n\n.oh-story-tree nav button {\n display: block;\n width: 100%;\n overflow: hidden;\n padding: 6px 8px 6px min(calc(14px + var(--oh-story-indent, 0px)), 56px);\n border: 0;\n border-radius: 6px;\n color: inherit;\n background: transparent;\n text-align: left;\n text-overflow: ellipsis;\n white-space: nowrap;\n cursor: pointer;\n font: inherit;\n font-size: 12px;\n}\n.oh-story-tree nav button:hover { background: var(--dsw-alias-interactive-bg-hover); }\n.oh-story-tree nav button[aria-current=\"page\"] { background: var(--dsw-alias-button-ghost-active-fill); color: var(--dsw-alias-label-primary); }\n.oh-story-tree nav button[data-agent-target] { box-shadow: inset 2px 0 var(--dsw-alias-state-business-primary); }\n\n.oh-story-editor header {\n min-height: 44px;\n flex: none;\n padding: 0 14px;\n border-bottom: 1px solid var(--os-border);\n}\n\n.oh-story-editor-path {\n overflow: hidden;\n min-width: 0;\n flex: 1;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 12px;\n color: var(--os-muted);\n}\n.oh-story-editor-path > span { overflow: hidden; display: block; text-overflow: ellipsis; }\n.oh-story-editor-path > strong { display: none; overflow: hidden; text-overflow: ellipsis; font: inherit; }\n\n.oh-story-editor-actions { display: flex; flex: none; align-items: center; gap: 8px; }\n.oh-story-editor-tabs {\n display: flex;\n padding: 2px;\n border: 1px solid var(--os-border);\n border-radius: 7px;\n background: var(--dsw-alias-bg-layer-1);\n}\n.oh-story-editor-tabs button { min-height: 24px; padding: 0 9px; border-radius: 5px; font-size: 11px; }\n.oh-story-save { min-height: 28px; }\n\n.oh-story-editor textarea {\n box-sizing: border-box;\n width: 100%;\n min-height: 0;\n flex: 1;\n resize: none;\n border: 0;\n outline: 0;\n padding: clamp(20px, 6%, 48px) clamp(22px, 10%, 84px) 48px;\n color: var(--dsw-alias-label-primary);\n background: transparent;\n font: 16px/1.9 ui-serif, \"Songti SC\", \"STSong\", Georgia, serif;\n}\n.oh-story-editor textarea[data-format=\"structured\"] {\n tab-size: 2;\n font: 13px/1.65 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n}\n\n.oh-story-markdown {\n box-sizing: border-box;\n width: 100%;\n min-height: 0;\n flex: 1;\n overflow: auto;\n padding: clamp(24px, 8%, 56px) clamp(24px, 10%, 92px) 64px;\n color: var(--dsw-alias-label-primary);\n font: 16px/1.85 ui-serif, \"Songti SC\", \"STSong\", Georgia, serif;\n overflow-wrap: anywhere;\n}\n.oh-story-markdown > :first-child { margin-top: 0; }\n.oh-story-markdown > :last-child { margin-bottom: 0; }\n.oh-story-markdown h1,\n.oh-story-markdown h2,\n.oh-story-markdown h3,\n.oh-story-markdown h4,\n.oh-story-markdown h5,\n.oh-story-markdown h6 { margin: 1.45em 0 .6em; font-family: var(--dsw-font-family); line-height: 1.35; letter-spacing: -.01em; }\n.oh-story-markdown h1 { font-size: 1.75em; }\n.oh-story-markdown h2 { padding-bottom: .35em; border-bottom: 1px solid var(--os-border); font-size: 1.35em; }\n.oh-story-markdown h3 { font-size: 1.15em; }\n.oh-story-markdown p { margin: .75em 0; }\n.oh-story-markdown ul,\n.oh-story-markdown ol { margin: .75em 0; padding-left: 1.6em; }\n.oh-story-markdown li { margin: .28em 0; }\n.oh-story-markdown .oh-story-task-item { list-style: none; margin-left: -1.35em; }\n.oh-story-task-item input { margin: 0 .55em 0 0; accent-color: var(--dsw-alias-state-business-primary); }\n.oh-story-markdown blockquote { margin: 1em 0; padding: .1em 1em; border-left: 3px solid var(--dsw-alias-state-business-primary); color: var(--dsw-alias-label-secondary); }\n/* DSH gives inline code its own alias; the block fill is a different surface. */\n.oh-story-markdown code { padding: .15em .4em; border-radius: 4px; background: var(--dsw-alias-markdown-inline-code); font: .86em/1.6 ui-monospace, SFMono-Regular, Menlo, monospace; }\n.oh-story-markdown pre { overflow: auto; margin: 1em 0; padding: 14px 16px; border: 1px solid var(--dsw-alias-border-l1); border-radius: 10px; background: var(--dsw-alias-markdown-code-block); }\n.oh-story-markdown pre code { padding: 0; background: transparent; }\n.oh-story-markdown a { color: var(--dsw-alias-state-business-primary); text-decoration-thickness: 1px; text-underline-offset: 3px; }\n.oh-story-markdown del { color: var(--os-muted); }\n.oh-story-markdown-table { overflow-x: auto; margin: 1em 0; border: 1px solid var(--os-border); border-radius: 10px; }\n.oh-story-markdown table { width: 100%; border-collapse: collapse; font-family: ui-sans-serif, system-ui, \"PingFang SC\", sans-serif; font-size: 13px; line-height: 1.55; }\n.oh-story-markdown th,\n.oh-story-markdown td { min-width: 96px; padding: 9px 12px; border-right: 1px solid var(--os-border); border-bottom: 1px solid var(--os-border); vertical-align: top; }\n.oh-story-markdown th:last-child,\n.oh-story-markdown td:last-child { border-right: 0; }\n.oh-story-markdown tbody tr:last-child td { border-bottom: 0; }\n.oh-story-markdown th { background: var(--dsw-alias-bg-layer-1); font-weight: 600; }\n.oh-story-markdown hr { margin: 2em 0; border: 0; border-top: 1px solid var(--os-border); }\n.oh-story-markdown-empty { margin: auto; color: var(--os-muted); font-size: 13px; }\n\n.oh-story-jsonl {\n box-sizing: border-box;\n display: flex;\n width: 100%;\n min-height: 0;\n flex: 1;\n overflow: hidden;\n flex-direction: column;\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-base);\n}\n.oh-story-jsonl-summary { display: flex; min-height: 42px; flex: none; align-items: center; gap: 10px; padding: 0 18px; border-bottom: 1px solid var(--os-border); font-size: 12px; }\n.oh-story-jsonl-summary strong { font-weight: 600; }\n.oh-story-jsonl-summary span { color: var(--os-muted); }\n.oh-story-jsonl-records { overflow: auto; padding: 14px 18px 36px; }\n.oh-story-jsonl details,\n.oh-story-jsonl-error { overflow: hidden; margin-bottom: 10px; border: 1px solid var(--os-border); border-radius: 10px; background: var(--dsw-alias-bg-layer-1); }\n.oh-story-jsonl summary { display: flex; min-height: 42px; align-items: center; gap: 9px; padding: 0 12px; cursor: pointer; list-style: none; font: 12px/1.4 var(--dsw-font-family); }\n.oh-story-jsonl summary::-webkit-details-marker { display: none; }\n.oh-story-jsonl summary::before { content: \"\u203A\"; color: var(--os-muted); font-size: 16px; transition: transform .12s ease; }\n.oh-story-jsonl details[open] summary::before { transform: rotate(90deg); }\n.oh-story-jsonl summary > span { flex: none; color: var(--os-muted); font-variant-numeric: tabular-nums; }\n.oh-story-jsonl summary > strong { overflow: hidden; min-width: 80px; flex: 1; text-overflow: ellipsis; white-space: nowrap; font-weight: 600; }\n.oh-story-jsonl summary > code,\n.oh-story-jsonl summary > em { flex: none; padding: 2px 6px; border-radius: 5px; background: var(--dsw-alias-button-ghost-active-fill); color: var(--dsw-alias-label-secondary); font: 11px/1.35 ui-monospace, SFMono-Regular, Menlo, monospace; font-style: normal; }\n.oh-story-jsonl pre { overflow: auto; max-height: 520px; margin: 0; padding: 14px 16px; border-top: 1px solid var(--os-border); background: var(--dsw-alias-markdown-code-block); color: var(--dsw-alias-label-secondary); white-space: pre-wrap; overflow-wrap: anywhere; font: 12px/1.6 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; }\n.oh-story-jsonl-error { display: grid; gap: 5px; padding: 12px; border-color: var(--dsw-alias-state-error-primary); font-size: 12px; }\n.oh-story-jsonl-error > strong { color: var(--dsw-alias-state-error-primary); }\n.oh-story-jsonl-error > span { color: var(--os-muted); }\n.oh-story-jsonl-error pre { margin: 3px -12px -12px; }\n\n.oh-story-stream,\n.oh-story-conflict,\n.oh-story-warning {\n flex: none;\n padding: 7px 12px;\n border-bottom: 1px solid var(--os-border);\n font-size: 11px;\n line-height: 1.4;\n}\n\n.oh-story-stream { color: var(--dsw-alias-state-business-primary); background: var(--dsw-alias-button-ghost-active-fill); }\n.oh-story-stream[data-stage=\"streaming\"] { animation: oh-story-pulse 1.2s ease-in-out infinite alternate; }\n.oh-story-conflict { color: var(--dsw-alias-state-warn-label); background: var(--dsw-specific-tip); }\n.oh-story-conflict > div { display: flex; gap: 6px; margin-top: 6px; }\n.oh-story-conflict button,\n.oh-story-empty button {\n border: 1px solid var(--os-border);\n border-radius: 6px;\n color: inherit;\n background: var(--dsw-alias-bg-base);\n padding: 3px 8px;\n cursor: pointer;\n font: inherit;\n}\n.oh-story-warning { color: var(--dsw-alias-state-warn-label); background: var(--dsw-specific-tip); }\n\n@keyframes oh-story-pulse { to { opacity: .62; } }\n@media (prefers-reduced-motion: reduce) { .oh-story-stream[data-stage=\"streaming\"] { animation: none; } }\n\n.oh-story-empty { margin: auto; max-width: 480px; padding: 30px; color: var(--os-muted); line-height: 1.7; text-align: center; }\n.oh-story-error { margin: 8px; padding: 8px 10px; border-radius: 8px; color: var(--dsw-alias-state-error-primary); background: var(--dsw-specific-tip); font-size: 12px; }\n\n.oh-story-role { display: flex; flex-direction: column; margin: 0; overflow: hidden; }\n.oh-story-role summary { min-height: 24px; padding: 0; cursor: pointer; list-style: none; font-size: 14px; line-height: 24px; }\n.oh-story-role summary::-webkit-details-marker { display: none; }\n.oh-story-role summary span { color: var(--dsw-alias-state-business-primary); }\n.oh-story-role summary strong { margin-right: auto; color: var(--dsw-alias-label-secondary); font-weight: 500; }\n.oh-story-role summary em { color: var(--dsw-alias-label-caption); font-style: normal; font-size: 12px; }\n.oh-story-role[data-state=\"error\"] summary em { color: var(--dsw-alias-state-error-primary); }\n.oh-story-role pre { max-height: 260px; overflow: auto; margin: 4px 0 4px 4px; padding: 12px 16px; border: 1px solid var(--dsw-alias-border-l1); border-radius: 12px; color: var(--dsw-alias-label-secondary); background: var(--dsw-alias-markdown-code-block); white-space: pre-wrap; font: var(--dsw-font-markdown-code-block-small); }\n.oh-story-role > button { align-self: flex-start; margin: 4px 0 2px 4px; font-size: 11px; }\n\n[data-conversation-scroll][data-oh-story-layout=\"medium\"]:has(> [data-slot=\"conversation.session\"] > .oh-story-split-surface) {\n grid-template-columns: clamp(104px, 18%, 184px) minmax(200px, 1fr) clamp(300px, 45%, 408px);\n}\n\n[data-conversation-scroll][data-oh-story-layout=\"compact\"]:has(> [data-slot=\"conversation.session\"] > .oh-story-split-surface) {\n grid-template-columns: clamp(80px, 16%, 104px) minmax(0, 1fr) clamp(228px, 48%, 300px);\n}\n\n[data-oh-story-layout=\"medium\"] .oh-story-file-folder > summary { padding-left: min(calc(7px + var(--oh-story-indent, 0px)), 35px); }\n[data-oh-story-layout=\"medium\"] .oh-story-tree nav button { padding-left: min(calc(14px + var(--oh-story-indent, 0px)), 42px); }\n[data-oh-story-layout=\"medium\"] .oh-story-editor textarea { padding-right: 28px; padding-left: 28px; }\n\n[data-oh-story-layout=\"compact\"] .oh-story-tree { padding-inline: 4px; }\n[data-oh-story-layout=\"compact\"] .oh-story-brand { gap: 4px; padding-inline: 2px; font-size: 11px; }\n[data-oh-story-layout=\"compact\"] .oh-story-brand-cluster { gap: 4px; }\n[data-oh-story-layout=\"compact\"] .oh-story-brand-cluster strong > span { display: none; }\n[data-oh-story-layout=\"compact\"] .oh-story-kind { padding-inline: 4px; font-size: 11px; }\n[data-oh-story-layout=\"compact\"] .oh-story-brand button { width: 24px; height: 24px; }\n[data-oh-story-layout=\"compact\"] .oh-story-mode-tabs { margin-inline: 0; }\n[data-oh-story-layout=\"compact\"] .oh-story-mode-tabs button { padding-inline: 3px; font-size: 11px; }\n[data-oh-story-layout=\"compact\"] .oh-story-file-folder > summary { padding-left: min(calc(5px + var(--oh-story-indent, 0px)), 19px); }\n[data-oh-story-layout=\"compact\"] .oh-story-tree nav button { padding-right: 4px; padding-left: min(calc(7px + var(--oh-story-indent, 0px)), 21px); }\n[data-oh-story-layout=\"compact\"] .oh-story-editor header {\n display: grid;\n min-height: 68px;\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: 24px 36px;\n align-content: center;\n gap: 0;\n padding: 4px 3px;\n}\n[data-oh-story-layout=\"compact\"] .oh-story-editor-path > span { display: none; }\n[data-oh-story-layout=\"compact\"] .oh-story-editor-path > strong { display: block; font-size: 11px; line-height: 24px; }\n[data-oh-story-layout=\"compact\"] .oh-story-editor-actions { width: 100%; min-width: 0; justify-content: flex-end; gap: 4px; }\n[data-oh-story-layout=\"compact\"] .oh-story-editor-tabs { min-width: 0; flex: 1; }\n[data-oh-story-layout=\"compact\"] .oh-story-editor-tabs button { min-width: 0; padding-inline: 2px; white-space: nowrap; }\n[data-oh-story-layout=\"compact\"] .oh-story-save { flex: none; padding-inline: 4px; white-space: nowrap; font-size: 11px; }\n[data-oh-story-layout=\"compact\"] .oh-story-editor textarea { padding: 16px 12px 40px; }\n[data-oh-story-layout=\"compact\"] .oh-story-markdown { padding: 18px 12px 48px; }\n[data-oh-story-layout=\"compact\"] .oh-story-jsonl-summary { padding-inline: 10px; }\n[data-oh-story-layout=\"compact\"] .oh-story-jsonl-records { padding: 8px 7px 28px; }\n[data-oh-story-layout=\"compact\"] .oh-story-jsonl summary { gap: 6px; padding-inline: 7px; }\n[data-oh-story-layout=\"compact\"] .oh-story-jsonl summary > span { display: none; }\n[data-oh-story-layout=\"compact\"] .oh-story-jsonl summary > strong { min-width: 32px; }\n[data-oh-story-layout=\"compact\"] .oh-story-jsonl summary > code,\n[data-oh-story-layout=\"compact\"] .oh-story-jsonl summary > em { display: none; }\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["name", "directory", "name", "import_jsx_runtime", "import_jsx_runtime", "activity", "directory"]
|
|
7
7
|
}
|