@oh-story/dsh 0.1.0 → 0.1.1
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 +3 -3
- package/lib/client.js +390 -144
- package/lib/client.js.map +4 -4
- package/lib/index.js +14742 -167
- package/lib/index.js.map +4 -4
- package/lib/types/client/file-activity.d.ts +8 -6
- package/lib/types/client/file-activity.d.ts.map +1 -1
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/file-activity-projection-types.d.ts +11 -0
- package/lib/types/file-activity-projection-types.d.ts.map +1 -0
- package/lib/types/file-activity-projection.d.ts +24 -0
- package/lib/types/file-activity-projection.d.ts.map +1 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/workspace-route.d.ts +1 -2
- package/lib/types/workspace-route.d.ts.map +1 -1
- package/package.json +16 -3
- package/lib/types/workspace-security.d.ts +0 -9
- package/lib/types/workspace-security.d.ts.map +0 -1
package/lib/client.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 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 type { AssistantBlock, ClientContext, RunningToolCall } from \"@deepseek-ai/dsh-client-runtime/client\";\nimport type { ConvViewProps } from \"@deepseek-ai/dsh-client-ui-conversation/client\";\nimport type { ToolCallViewProps } from \"@deepseek-ai/dsh-client-ui-tool/client\";\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n activeFileMutation,\n creativeRelativePath,\n previewMutation,\n workbenchModeForPath,\n type WorkbenchMode,\n type FileMutationActivity\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\ninterface WorkspaceFile { readonly path: string; readonly bytes: number }\ninterface WorkspacePayload {\n readonly cwd: string;\n readonly files: readonly WorkspaceFile[];\n readonly shortDrama: Record<string, unknown> | null;\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}\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\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\nconst EMPTY_BLOCKS: readonly AssistantBlock[] = [];\nconst EMPTY_CALLS: readonly RunningToolCall[] = [];\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 Error(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={{ paddingLeft: `${String(14 + depth * 14)}px` }}\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 = expanded[node.path] ?? selected?.startsWith(`${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={{ paddingLeft: `${String(7 + depth * 14)}px` }}>{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 reload: () => void;\n} {\n const [version, setVersion] = useState(0);\n const [workspace, setWorkspace] = useState<WorkspacePayload>();\n const [error, setError] = useState<string>();\n const reload = useCallback(() => { setVersion((value) => value + 1); }, []);\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 return () => { controller.abort(); };\n }, [sessionId, version]);\n return { workspace, error, reload };\n}\n\nfunction CreativeWorkbench({ sessionId, useSession }: Pick<ConvViewProps, \"sessionId\" | \"useSession\">) {\n const { workspace, error, reload } = useWorkspace(sessionId);\n const partialBlocks = useSession((value) => value.partial?.blocks ?? EMPTY_BLOCKS);\n const runningCalls = useSession((value) => value.runningCalls ?? EMPTY_CALLS);\n const activity = useMemo(() => activeFileMutation(partialBlocks, runningCalls), [partialBlocks, runningCalls]);\n const activityPath = creativeRelativePath(activity?.path, workspace?.cwd);\n const activityMode = workbenchModeForPath(activityPath);\n const [workbench, setWorkbench] = useState<WorkbenchMode>(\"story\");\n const initializedWorkbench = useRef(false);\n const [selected, setSelected] = useState<string>();\n const [buffers, setBuffers] = useState<Record<string, FileBuffer>>({});\n const buffersRef = useRef<Record<string, FileBuffer>>({});\n const [refreshVersion, setRefreshVersion] = useState(0);\n const [fileError, setFileError] = useState<string>();\n const [conflict, setConflict] = useState<string>();\n const [saving, setSaving] = useState(false);\n const [expanded, setExpanded] = useState<Record<string, boolean>>({});\n const surfaceRef = useRef<HTMLDivElement>(null);\n const navRef = useRef<HTMLElement>(null);\n const lastActivity = useRef<FileMutationActivity>();\n const settleTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const buffer = selected === undefined ? undefined : buffers[selected];\n const dirty = buffer?.source === \"human\" && buffer.content !== buffer.saved;\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, setEditorMode] = useState<\"preview\" | \"source\">(\"preview\");\n\n useEffect(() => { buffersRef.current = buffers; }, [buffers]);\n\n useEffect(() => {\n if (workspace === undefined || initializedWorkbench.current) return;\n const hasStory = workspace.files.some((file) => workbenchModeForPath(file.path) === \"story\");\n if (workspace.shortDrama !== null && !hasStory) setWorkbench(\"drama\");\n initializedWorkbench.current = true;\n }, [workspace]);\n\n useEffect(() => {\n if (activityMode !== undefined) setWorkbench(activityMode);\n }, [activityMode]);\n\n useEffect(() => {\n setEditorMode(previewable ? \"preview\" : \"source\");\n }, [previewable, selected]);\n\n useEffect(() => {\n if (activityPath !== undefined) { setSelected(activityPath); 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]);\n\n useEffect(() => {\n if (selected === undefined) return;\n const exists = workspace?.files.some((file) => file.path === selected) ?? false;\n if (activityPath === selected && !exists) return;\n const controller = new AbortController();\n setFileError(undefined);\n void fetch(endpoint(\"file\", sessionId, selected), { signal: controller.signal })\n .then((response) => json<FilePayload>(response))\n .then((file) => {\n const existing = buffersRef.current[file.path];\n if (existing?.source === \"human\" && existing.content !== existing.saved) {\n setConflict(`${file.path} \u5DF2\u88AB Agent \u66F4\u65B0\uFF1B\u4F60\u7684\u672A\u4FDD\u5B58\u7248\u672C\u4ECD\u4FDD\u7559\u3002`);\n return;\n }\n setBuffers((current) => ({\n ...current,\n [file.path]: { content: file.content, saved: file.content, source: \"disk\", version: file.version }\n }));\n })\n .catch((reason: unknown) => {\n if (!controller.signal.aborted) setFileError(reason instanceof Error ? reason.message : String(reason));\n });\n return () => { controller.abort(); };\n }, [activityPath, refreshVersion, selected, sessionId, workspace?.files]);\n\n useEffect(() => {\n if (activity === undefined || activityPath === undefined) return;\n setSelected(activityPath);\n const existing = buffers[activityPath];\n if (existing?.source === \"human\" && existing.content !== existing.saved) {\n setConflict(`${activityPath} \u6B63\u7531 Agent \u4FEE\u6539\uFF1B\u4F60\u7684\u672A\u4FDD\u5B58\u7248\u672C\u5DF2\u9501\u5B9A\uFF0C\u4E0D\u4F1A\u88AB\u8986\u76D6\u3002`);\n return;\n }\n const next = previewMutation(activity, existing?.saved ?? \"\");\n if (next === undefined) return;\n setConflict(undefined);\n setBuffers((current) => {\n const currentBuffer = current[activityPath];\n if (currentBuffer?.source === \"agent\" && currentBuffer.content === next) return current;\n return {\n ...current,\n [activityPath]: {\n content: next,\n saved: currentBuffer?.saved ?? \"\",\n source: \"agent\",\n version: currentBuffer?.version ?? \"\"\n }\n };\n });\n }, [activity, activityPath, buffers]);\n\n useEffect(() => {\n if (activity !== undefined) {\n if (settleTimer.current !== undefined) clearTimeout(settleTimer.current);\n lastActivity.current = activity;\n return;\n }\n if (lastActivity.current === undefined) return;\n settleTimer.current = setTimeout(() => {\n lastActivity.current = undefined;\n reload();\n setRefreshVersion((value) => value + 1);\n }, 180);\n return () => {\n if (settleTimer.current !== undefined) clearTimeout(settleTimer.current);\n };\n }, [activity, reload]);\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 (activity !== undefined || 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\\s+/u, \"\"), workspace.cwd);\n if (path === undefined || !knownPaths.has(path)) continue;\n event.preventDefault();\n event.stopPropagation();\n setConflict(undefined);\n setWorkbench(workbenchModeForPath(path) ?? \"story\");\n setSelected(path);\n break;\n }\n };\n sessionSurface.addEventListener(\"click\", followOfficialFileLink, true);\n return () => { sessionSurface.removeEventListener(\"click\", followOfficialFileLink, true); };\n }, [activity, workspace]);\n\n const save = useCallback(async () => {\n if (selected === undefined || buffer === undefined) return;\n const submitted = buffer;\n setSaving(true);\n setFileError(undefined);\n try {\n const file = await json<FilePayload>(await fetch(endpoint(\"file\", sessionId, selected), {\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[selected];\n if (latest === undefined) return current;\n const unchanged = latest.content === submitted.content;\n return {\n ...current,\n [selected]: {\n content: unchanged ? file.content : latest.content,\n saved: file.content,\n source: unchanged ? \"disk\" : \"human\",\n version: file.version\n }\n };\n });\n setConflict(undefined);\n reload();\n } catch (reason) {\n setFileError(reason instanceof Error ? reason.message : String(reason));\n } finally {\n setSaving(false);\n }\n }, [buffer, reload, selected, sessionId]);\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 });\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 setConflict(undefined);\n const target = workspace === undefined ? undefined : preferredFile(workspace.files, next);\n setSelected(target);\n };\n const selectedGroup = selected === undefined ? undefined : groupForPath(selected);\n const toggleGroup = (key: string, open: boolean): void => {\n setExpanded((current) => ({ ...current, [key]: open }));\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>\u2726 Oh Story</span>\n <button type=\"button\" onClick={reload} title=\"\u5237\u65B0\">\u21BB</button>\n </div>\n <div className=\"oh-story-mode-tabs\" role=\"tablist\" aria-label=\"\u521B\u4F5C\u5DE5\u4F5C\u53F0\">\n <button type=\"button\" role=\"tab\" aria-selected={workbench === \"story\"} onClick={() => { selectWorkbench(\"story\"); }}>\u5C0F\u8BF4</button>\n <button type=\"button\" role=\"tab\" aria-selected={workbench === \"drama\"} onClick={() => { selectWorkbench(\"drama\"); }}>\u77ED\u5267</button>\n </div>\n {error !== undefined && <div className=\"oh-story-error\">{error}</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 = expanded[directory] ?? selectedGroup === directory;\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={setSelected}\n />\n </details>;\n })}\n </nav>\n </aside>\n <main className=\"oh-story-editor\">\n <header>\n <span title={selected}>{selected ?? `\u5728\u5F53\u524D DSH workspace \u4E2D\u9009\u62E9${workbench === \"story\" ? \"\u5C0F\u8BF4\" : \"\u77ED\u5267\"}\u6587\u4EF6`}</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 <button type=\"button\" role=\"tab\" aria-selected={editorMode === \"preview\"} onClick={() => { setEditorMode(\"preview\"); }}>\u9884\u89C8</button>\n <button type=\"button\" role=\"tab\" aria-selected={editorMode === \"source\"} onClick={() => { setEditorMode(\"source\"); }}>\u6E90\u7801</button>\n </div>}\n {(dirty || saving) && <button className=\"oh-story-save\" type=\"button\" disabled={saving} onClick={() => { void save(); }}>\n {saving ? \"\u4FDD\u5B58\u4E2D\u2026\" : \"\u4FDD\u5B58\"}\n </button>}\n </div>\n </header>\n {activityPath === selected && <div className=\"oh-story-stream\" data-stage={activity?.stage}>\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\">{conflict}</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 : previewable && editorMode === \"preview\"\n ? markdown\n ? <MarkdownPreview content={buffer.content} label={selected} />\n : <JsonlPreview content={buffer.content} label={selected} />\n : <textarea\n value={buffer.content}\n data-format={structured ? \"structured\" : \"prose\"}\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 }\n }));\n }}\n onKeyDown={(event) => {\n if ((event.metaKey || event.ctrlKey) && event.key.toLocaleLowerCase() === \"s\") {\n event.preventDefault();\n void save();\n }\n }}\n spellCheck={!structured}\n aria-label={selected}\n />}\n </main>\n </div>;\n}\n\n/**\n * DSH's stable data-slot anchor is the supported addressable styling seam.\n * Portal the story surface beside the still-mounted official active view;\n * Chat, its child slots, store, composer, Todo, approvals, and scroll logic\n * remain owned by the official conversation plugin.\n */\nfunction CreativeSplitBridge(props: Pick<ConvViewProps, \"sessionId\" | \"useSession\">) {\n const marker = useRef<HTMLSpanElement>(null);\n const [target, setTarget] = useState<HTMLElement>();\n useLayoutEffect(() => {\n const root = marker.current?.closest<HTMLElement>(\"[data-phase]\");\n const anchor = root?.querySelector<HTMLElement>(\"[data-conversation-scroll] > [data-slot='conversation.session']\");\n setTarget(anchor ?? undefined);\n }, [props.sessionId]);\n useLayoutEffect(() => {\n const scroller = target?.parentElement;\n if (scroller === undefined || scroller === null) return;\n const publishHeight = (): void => {\n scroller.style.setProperty(\"--oh-story-scroll-height\", `${String(scroller.clientHeight)}px`);\n };\n publishHeight();\n const observer = new ResizeObserver(publishHeight);\n observer.observe(scroller);\n return () => {\n observer.disconnect();\n scroller.style.removeProperty(\"--oh-story-scroll-height\");\n };\n }, [target]);\n return <>\n <span ref={marker} className=\"oh-story-bridge-marker\" aria-hidden />\n {target === undefined ? null : createPortal(<CreativeWorkbench key={props.sessionId} {...props} />, target)}\n </>;\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(\"conversation.session.header.actions\", () => context.slots.register({\n name: \"conversation.session.header.actions\",\n id: \"oh-story-workspace\",\n order: -100\n }, CreativeSplitBridge));\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 { AssistantBlock, RunningToolCall } from \"@deepseek-ai/dsh-client-runtime/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}\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;\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 mutation(name: string, callId: string, argsRaw: string, stage: FileMutationActivity[\"stage\"]): FileMutationActivity | undefined {\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 };\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 };\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 };\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\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 };\n }\n // The command field itself may still be streaming. Returning the path lets\n // the tree focus as soon as enough arguments have arrived.\n return { callId, name, argsRaw, stage, path, operation: undefined, oldText: undefined, newText: undefined };\n}\n\n/** Prefer an executing call over the latest streamed tool-call block. */\nexport function activeFileMutation(\n partialBlocks: readonly AssistantBlock[],\n runningCalls: readonly RunningToolCall[]\n): FileMutationActivity | undefined {\n for (let index = runningCalls.length - 1; index >= 0; index -= 1) {\n const call = runningCalls[index];\n if (call === undefined) continue;\n const value = mutation(call.name, call.callId, call.argsRaw, \"running\");\n if (value !== undefined) return value;\n }\n for (let index = partialBlocks.length - 1; index >= 0; index -= 1) {\n const block = partialBlocks[index];\n if (block?.kind !== \"tool-call\") continue;\n const value = mutation(block.name, block.callId, block.argsRaw, \"streaming\");\n if (value !== undefined) return value;\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 relative = root !== undefined && normalized.startsWith(`${root}/`)\n ? normalized.slice(root.length + 1)\n : normalized.replace(/^\\.\\//u, \"\").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 === \"\")) 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/** Compatibility alias for consumers that only accept novel files. */\nexport function storyRelativePath(path: string | undefined, cwd: string | undefined): string | undefined {\n const relative = creativeRelativePath(path, cwd);\n return workbenchModeForPath(relative) === \"story\" ? relative : undefined;\n}\n\n/** Project a streamed mutation over the last authoritative disk content. */\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) return 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; }\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-tertiary);\n display: grid;\n grid-template-columns: clamp(108px, 16%, 190px) minmax(220px, 1fr) minmax(260px, 38%);\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; padding: 0 5px 10px 7px; font-size: 14px; 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 {\n display: grid;\n grid-template-columns: 1fr 1fr;\n margin: 0 4px 10px;\n border-bottom: 1px solid var(--os-border);\n}\n\n.oh-story-mode-tabs button,\n.oh-story-editor-tabs button {\n position: relative;\n min-height: 30px;\n border: 0;\n color: var(--os-muted);\n background: transparent;\n cursor: pointer;\n font: inherit;\n font-size: 12px;\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); font-weight: 500; }\n.oh-story-mode-tabs button[aria-selected=\"true\"]::after {\n position: absolute;\n right: 14px;\n bottom: -1px;\n left: 14px;\n height: 2px;\n border-radius: 2px 2px 0 0;\n background: var(--dsw-alias-state-business-primary);\n content: \"\";\n}\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-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-caption); font-weight: 400; }\n\n.oh-story-tree nav button {\n display: block;\n width: 100%;\n overflow: hidden;\n padding: 6px 8px;\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 header span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 12px;\n color: var(--os-muted);\n}\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-editor-tabs button[aria-selected=\"true\"] { background: var(--dsw-alias-bg-base); box-shadow: 0 1px 2px rgb(0 0 0 / 8%); }\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, 4vw, 48px) clamp(22px, 6vw, 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, 5vw, 56px) clamp(24px, 7vw, 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: ui-sans-serif, system-ui, \"PingFang SC\", sans-serif; 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 ui-sans-serif, system-ui, \"PingFang SC\", sans-serif; }\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 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\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@media (max-width: 980px) {\n [data-conversation-scroll]:has(> [data-slot=\"conversation.session\"] > .oh-story-split-surface) {\n grid-template-columns: 104px minmax(210px, 1fr) minmax(252px, 40%);\n }\n .oh-story-editor textarea { padding-right: 28px; padding-left: 28px; }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["name", "directory", "name", "import_jsx_runtime", "import_jsx_runtime", "directory"]
|
|
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", "../src/file-activity-projection-types.ts"],
|
|
4
|
+
"sourcesContent": ["import type { ClientContext, ConversationSnapshot, ISessions, RunningToolCall } from \"@deepseek-ai/dsh-client-runtime/client\";\nimport type {} from \"@deepseek-ai/dsh-client-ui-layout/client\";\nimport type { ToolCallViewProps } from \"@deepseek-ai/dsh-client-ui-tool/client\";\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n creativeRelativePath,\n fileMutations,\n mutatingCallIds,\n previewMutation,\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\";\nimport {\n FILE_ACTIVITY_PROJECTION_KEY,\n type FileActivityProjection,\n type ProjectedFileCall\n} from \"../file-activity-projection-types.js\";\n\nexport const name = \"oh-story\";\nexport const inject = [\"sessions\", \"slots\"];\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 readonly buffers: Record<string, FileBuffer>;\n readonly editorMode: \"preview\" | \"source\";\n readonly expanded: Record<string, boolean>;\n readonly selected: string | undefined;\n readonly workbench: WorkbenchMode;\n}\n\ninterface ConversationSnapshotStore {\n subscribe(listener: () => void): () => void;\n getSnapshot(): ConversationSnapshot;\n}\n\ninterface FileActivityProjectionStore {\n subscribe(listener: () => void): () => void;\n getSnapshot(): FileActivityProjection | undefined;\n}\n\nconst EMPTY_FILE_ACTIVITY_STORE: FileActivityProjectionStore = {\n subscribe: () => () => undefined,\n getSnapshot: () => undefined\n};\n\nclass WorkspaceRequestError extends Error {\n constructor(readonly status: number, message: string) { super(message); }\n}\n\nconst workbenchMemory = new Map<string, WorkbenchMemory>();\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\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\nconst EMPTY_CALLS: readonly RunningToolCall[] = [];\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={{ paddingLeft: `${String(14 + depth * 14)}px` }}\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={{ paddingLeft: `${String(7 + depth * 14)}px` }}>{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 projectedCalls\n}: {\n readonly sessionId: string;\n readonly runningCalls: readonly RunningToolCall[];\n readonly projectedCalls: readonly ProjectedFileCall[];\n}) {\n const { workspace, error, loading: workspaceLoading, reload } = useWorkspace(sessionId);\n const activities = useMemo(\n () => fileMutations(runningCalls, projectedCalls),\n [projectedCalls, 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 remembered = useMemo(() => workbenchMemory.get(sessionId), [sessionId]);\n const [workbench, setWorkbench] = useState<WorkbenchMode>(remembered?.workbench ?? \"story\");\n const initializedWorkbench = useRef(false);\n const [selected, setSelected] = useState<string | undefined>(remembered?.selected);\n const [buffers, setBuffers] = useState<Record<string, FileBuffer>>(remembered?.buffers ?? {});\n const buffersRef = useRef<Record<string, FileBuffer>>({});\n const [expanded, setExpanded] = useState<Record<string, boolean>>(remembered?.expanded ?? {});\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 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, setEditorMode] = useState<\"preview\" | \"source\">(remembered?.editorMode ?? \"preview\");\n const modeSelection = useRef(selected);\n\n useEffect(() => { buffersRef.current = buffers; }, [buffers]);\n\n useEffect(() => {\n workbenchMemory.set(sessionId, { buffers, editorMode, expanded, selected, workbench });\n }, [buffers, editorMode, expanded, selected, sessionId, workbench]);\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 revealPath = useCallback((path: string): void => {\n setWorkbench(workbenchModeForPath(path) ?? \"story\");\n setSelected(path);\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 useEffect(() => {\n if (workspace === undefined || initializedWorkbench.current) return;\n const hasStory = workspace.files.some((file) => workbenchModeForPath(file.path) === \"story\");\n if (workspace.shortDrama !== null && !hasStory) setWorkbench(\"drama\");\n initializedWorkbench.current = true;\n }, [workspace]);\n\n useEffect(() => {\n if (activityPath !== undefined) setEditorMode(\"source\");\n }, [activityPath]);\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) { revealPath(activityPath); 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, revealPath, 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) revealPath(path);\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 }, [normalizedActivities, revealPath]);\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 (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 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>\u2726 Oh Story</span>\n <button type=\"button\" onClick={reload} title=\"\u5237\u65B0\">\u21BB</button>\n </div>\n <div className=\"oh-story-mode-tabs\" role=\"tablist\" aria-label=\"\u521B\u4F5C\u5DE5\u4F5C\u53F0\">\n <button type=\"button\" role=\"tab\" aria-selected={workbench === \"story\"} onClick={() => { selectWorkbench(\"story\"); }}>\u5C0F\u8BF4</button>\n <button type=\"button\" role=\"tab\" aria-selected={workbench === \"drama\"} onClick={() => { selectWorkbench(\"drama\"); }}>\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 title={selected}>{selected ?? `\u5728\u5F53\u524D DSH workspace \u4E2D\u9009\u62E9${workbench === \"story\" ? \"\u5C0F\u8BF4\" : \"\u77ED\u5267\"}\u6587\u4EF6`}</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 <button type=\"button\" role=\"tab\" aria-selected={editorMode === \"preview\"} onClick={() => { setEditorMode(\"preview\"); }}>\u9884\u89C8</button>\n <button type=\"button\" role=\"tab\" aria-selected={editorMode === \"source\"} onClick={() => { setEditorMode(\"source\"); }}>\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 value={buffer.content}\n data-format={structured ? \"structured\" : \"prose\"}\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\n/** Mount beside the official conversation without replacing Chat or Composer. */\nfunction CreativeSplitBridge({ context }: { readonly context: ClientContext }) {\n const marker = useRef<HTMLSpanElement>(null);\n const [target, setTarget] = useState<HTMLElement>();\n const sessions = context.sessions as unknown as ISessions;\n const provideFace = sessions.currentProvideInfo;\n const subscribeProvide = useCallback((listener: () => void) => provideFace.subscribe(listener), [provideFace]);\n const getProvide = useCallback(() => provideFace.getSnapshot(), [provideFace]);\n const provide = useSyncExternalStore(subscribeProvide, getProvide, getProvide);\n const sessionId = provide.sessionId;\n const source = provide.hooks.session as ConversationSnapshotStore | undefined;\n const subscribe = useCallback((listener: () => void) => source?.subscribe(listener) ?? (() => undefined), [source]);\n const getSnapshot = useCallback(() => source?.getSnapshot(), [source]);\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n const projectionSource = useMemo(\n () => (provide.projections?.faceOf(FILE_ACTIVITY_PROJECTION_KEY) as FileActivityProjectionStore | undefined) ?? EMPTY_FILE_ACTIVITY_STORE,\n [provide.projections]\n );\n const subscribeProjection = useCallback((listener: () => void) => projectionSource.subscribe(listener), [projectionSource]);\n const getProjection = useCallback(() => projectionSource.getSnapshot(), [projectionSource]);\n const projection = useSyncExternalStore(subscribeProjection, getProjection, getProjection);\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 publishHeight = (): void => {\n scroller.style.setProperty(\"--oh-story-scroll-height\", `${String(scroller.clientHeight)}px`);\n };\n publishHeight();\n const observer = new ResizeObserver(publishHeight);\n observer.observe(scroller);\n return () => {\n observer.disconnect();\n scroller.style.removeProperty(\"--oh-story-scroll-height\");\n };\n }, [target]);\n return <>\n <span ref={marker} className=\"oh-story-bridge-marker\" aria-hidden />\n {target === undefined || sessionId === undefined ? null : createPortal(<CreativeWorkbench\n key={sessionId}\n sessionId={sessionId}\n runningCalls={snapshot?.runningCalls ?? EMPTY_CALLS}\n projectedCalls={projection?.calls ?? []}\n />, target)}\n </>;\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\", () => context.slots.register({\n name: \"shell.overlay\",\n id: \"oh-story-workspace\",\n order: -100\n }, () => <CreativeSplitBridge context={context} />));\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 { RunningToolCall, ToolCallBlock } from \"@deepseek-ai/dsh-client-runtime/client\";\nimport type { ProjectedFileCall } from \"../file-activity-projection-types.js\";\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\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 projectedCalls: readonly ProjectedFileCall[] = []\n): FileMutationActivity[] {\n const values: FileMutationActivity[] = [];\n visitRunning(runningCalls, (call) => { values.push(...mutationsFromRunning(call)); });\n for (const call of projectedCalls) {\n const value = mutationFromArgs(call.name, call.callId, call.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\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; }\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-tertiary);\n display: grid;\n grid-template-columns: clamp(96px, 16%, 190px) minmax(180px, 1fr) minmax(252px, 38%);\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; padding: 0 5px 10px 7px; font-size: 14px; 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 {\n display: grid;\n grid-template-columns: 1fr 1fr;\n margin: 0 4px 10px;\n border-bottom: 1px solid var(--os-border);\n}\n\n.oh-story-mode-tabs button,\n.oh-story-editor-tabs button {\n position: relative;\n min-height: 30px;\n border: 0;\n color: var(--os-muted);\n background: transparent;\n cursor: pointer;\n font: inherit;\n font-size: 12px;\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); font-weight: 500; }\n.oh-story-mode-tabs button[aria-selected=\"true\"]::after {\n position: absolute;\n right: 14px;\n bottom: -1px;\n left: 14px;\n height: 2px;\n border-radius: 2px 2px 0 0;\n background: var(--dsw-alias-state-business-primary);\n content: \"\";\n}\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-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-caption); font-weight: 400; }\n\n.oh-story-tree nav button {\n display: block;\n width: 100%;\n overflow: hidden;\n padding: 6px 8px;\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 header span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 12px;\n color: var(--os-muted);\n}\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-editor-tabs button[aria-selected=\"true\"] { background: var(--dsw-alias-bg-base); box-shadow: 0 1px 2px rgb(0 0 0 / 8%); }\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, 4vw, 48px) clamp(22px, 6vw, 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, 5vw, 56px) clamp(24px, 7vw, 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: ui-sans-serif, system-ui, \"PingFang SC\", sans-serif; 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 ui-sans-serif, system-ui, \"PingFang SC\", sans-serif; }\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@media (max-width: 980px) {\n [data-conversation-scroll]:has(> [data-slot=\"conversation.session\"] > .oh-story-split-surface) {\n grid-template-columns: 104px minmax(210px, 1fr) minmax(252px, 40%);\n }\n .oh-story-editor textarea { padding-right: 28px; padding-left: 28px; }\n}\n\n@media (max-width: 700px) {\n [data-conversation-scroll]:has(> [data-slot=\"conversation.session\"] > .oh-story-split-surface) {\n grid-template-columns: 72px minmax(0, 1fr) 236px;\n }\n .oh-story-tree { padding-inline: 5px; }\n .oh-story-brand { padding-inline: 3px; font-size: 11px; }\n .oh-story-brand button { width: 24px; }\n .oh-story-mode-tabs { margin-inline: 0; }\n .oh-story-mode-tabs button { font-size: 10px; }\n .oh-story-editor header { padding-inline: 7px; }\n .oh-story-editor header > span { display: none; }\n .oh-story-editor-tabs button { padding-inline: 6px; }\n .oh-story-jsonl summary > code,\n .oh-story-jsonl summary > em { display: none; }\n}\n", "export const FILE_ACTIVITY_PROJECTION_KEY = \"ohStoryFileActivity\";\n\nexport interface ProjectedFileCall {\n readonly callId: string;\n readonly name: string;\n readonly argsRaw: string;\n readonly slot: string;\n}\n\nexport interface FileActivityProjection {\n readonly calls: readonly ProjectedFileCall[];\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["name", "directory", "name", "import_jsx_runtime", "import_jsx_runtime", "activity", "directory"]
|
|
7
7
|
}
|