dsh-side-chat-plus 0.3.2 → 0.3.4
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 +327 -326
- package/README.zh.md +269 -268
- package/dsh.plugin.json +3 -3
- package/lib/client-registry.js +397 -181
- package/lib/client-registry.js.map +1 -1
- package/lib/client.js +397 -181
- package/lib/client.js.map +1 -1
- package/lib/index.js +22 -7
- package/lib/types/client/locales.d.ts +18 -0
- package/lib/types/context-types.d.ts +36 -4
- package/lib/types/settings-shared.d.ts +4 -0
- package/package.json +37 -37
- package/src/client/attachments/AttachmentRail.module.css +89 -89
- package/src/client/attachments/AttachmentRail.tsx +173 -173
- package/src/client/attachments/DropOverlay.module.css +38 -38
- package/src/client/attachments/DropOverlay.tsx +62 -62
- package/src/client/attachments/ImageLightbox.module.css +44 -44
- package/src/client/attachments/ImageLightbox.tsx +58 -58
- package/src/client/attachments/MessageImage.module.css +61 -61
- package/src/client/attachments/MessageImage.tsx +120 -120
- package/src/client/attachments/index.ts +19 -19
- package/src/client/client.module.css +1051 -1032
- package/src/client/index.tsx +2209 -1966
- package/src/client/locales.ts +191 -173
- package/src/context-types.ts +415 -384
- package/src/index.ts +29 -9
- package/src/settings-shared.ts +6 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-registry.js","names":["useRef","useState","useCallback","css","IconChevronLeftOutline14","IconCloseFill14","IconChevronRightOutline14","createPortal","css","useRef","createPortal","css","IconCloseOutline16","useState","useCallback","useMemo","css","useState","DisclosureRow","IconThinkOutline14","css","useRef","IconChevronDownOutline14","IconChevronRightOutline14","IconCheckOutline16","Menu","useSyncExternalStore","useCallback","Tooltip","IconPanelLeftOutline16","useMemo","MarkdownText","IconStopFill16","IconSendOutline16","createRoot"],"sources":["../../../src/client/attachments/AttachmentRail.tsx","../../../src/client/attachments/DropOverlay.tsx","../../../src/client/attachments/ImageLightbox.tsx","../../../src/client/attachments/MessageImage.tsx","../../../src/client/api.ts","../../../src/client/locales.ts","../../../src/settings-shared.ts","../../../src/client/index.tsx"],"sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'\r\nimport {\r\n IconChevronLeftOutline14,\r\n IconChevronRightOutline14,\r\n IconCloseFill14,\r\n} from '@deepseek-ai/dsh-client-ui-primitives'\r\nimport css from './AttachmentRail.module.css'\r\n\r\n/** One rail thumbnail; strings arrive resolved (zero-cordis atom). */\r\nexport interface AttachmentRailItem {\r\n /** Stable identity for the React key. */\r\n id: string\r\n /** Object or data URL rendered as the thumbnail. */\r\n previewUrl: string\r\n /** Image alt text (display name with the owner's fallback applied). */\r\n alt: string\r\n /** Accessible label of the item's remove control. */\r\n removeLabel: string\r\n}\r\n\r\n/** Rail-level strings the owner resolves from its own locale namespace. */\r\nexport interface AttachmentRailLabels {\r\n /** Accessible name of the rail group. */\r\n group: string\r\n /** Thumbnail tooltip inviting the original-image preview. */\r\n open: string\r\n /** Accessible label of the left paging arrow. */\r\n scrollLeft: string\r\n /** Accessible label of the right paging arrow. */\r\n scrollRight: string\r\n}\r\n\r\n/** Approximate pixels per wheel step for `deltaMode` LINE deltas (Firefox notch wheels report lines). */\r\nconst WHEEL_LINE_PX = 16\r\n\r\n/** Smooth paging unless the user asked for reduced motion. */\r\nfunction pageBehavior(): ScrollBehavior {\r\n return window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ? 'auto' : 'smooth'\r\n}\r\n\r\n/**\r\n * Horizontal thumbnail rail over the caller's draft attachments.\r\n *\r\n * The rail scrolls with its scrollbar hidden; overflow is announced by edge\r\n * arrows recomputed from scroll geometry on scroll, item-count changes, and\r\n * rail size changes (a ResizeObserver on the rail element, so sidebar or panel\r\n * resizes count, not only window resizes). A vertical wheel pans the rail\r\n * horizontally and is consumed exclusively, a newly added item is revealed at\r\n * the rail's end, and each thumbnail opens on a single click while its remove\r\n * control sits inside the card. The owner decides mounting.\r\n */\r\nexport function AttachmentRail<T extends AttachmentRailItem>({ items, labels, onOpen, onRemove }: {\r\n items: readonly T[]\r\n labels: AttachmentRailLabels\r\n onOpen: (item: T) => void\r\n onRemove: (item: T) => void\r\n}) {\r\n const railRef = useRef<HTMLDivElement | null>(null)\r\n // null marks the first layout pass: a rail that MOUNTS over an existing\r\n // draft is initial display, not growth, and must not jump to the end.\r\n const countRef = useRef<number | null>(null)\r\n const [edges, setEdges] = useState({ left: false, right: false })\r\n const updateEdges = useCallback(() => {\r\n const el = railRef.current\r\n if (el === null) return\r\n // 1px slack: engines report fractional scroll positions at the edges.\r\n const left = el.scrollLeft > 1\r\n const right = el.scrollLeft < el.scrollWidth - el.clientWidth - 1\r\n setEdges(prev => prev.left === left && prev.right === right ? prev : { left, right })\r\n }, [])\r\n useLayoutEffect(() => {\r\n const grew = countRef.current !== null && items.length > countRef.current\r\n countRef.current = items.length\r\n const el = railRef.current\r\n if (el === null) return\r\n // A newly added attachment lands at the rail's end: reveal it.\r\n if (grew) el.scrollLeft = el.scrollWidth - el.clientWidth\r\n updateEdges()\r\n }, [items.length, updateEdges])\r\n useEffect(() => {\r\n const el = railRef.current\r\n if (el === null) return\r\n // The rail's width follows the composer, which resizes with sidebars and\r\n // panels, not only the window — observe the element itself.\r\n let disconnect = (): void => {}\r\n if (typeof ResizeObserver !== 'undefined') {\r\n const observer = new ResizeObserver(updateEdges)\r\n observer.observe(el)\r\n disconnect = () => { observer.disconnect() }\r\n }\r\n // The rail scrolls horizontally ONLY: any wheel tick with a vertical\r\n // component is consumed — without preventDefault it would also scroll the\r\n // conversation behind the composer, and React's root wheel listener is\r\n // passive, so the exclusion needs this manually attached non-passive\r\n // listener.\r\n const onWheel = (event: globalThis.WheelEvent): void => {\r\n if (event.deltaY === 0) return\r\n const scale = event.deltaMode === WheelEvent.DOM_DELTA_LINE\r\n ? WHEEL_LINE_PX\r\n : event.deltaMode === WheelEvent.DOM_DELTA_PAGE ? el.clientWidth : 1\r\n event.preventDefault()\r\n el.scrollBy({\r\n left: event.deltaX !== 0\r\n ? event.deltaX * scale\r\n : Math.sign(event.deltaY) * Math.min(Math.abs(event.deltaY) * scale, 60),\r\n behavior: 'auto',\r\n })\r\n }\r\n el.addEventListener('wheel', onWheel, { passive: false })\r\n return () => {\r\n disconnect()\r\n el.removeEventListener('wheel', onWheel)\r\n }\r\n }, [updateEdges])\r\n const page = (direction: -1 | 1): void => {\r\n const el = railRef.current\r\n if (el === null) return\r\n // One viewport minus a card keeps the last visible thumbnail as context.\r\n el.scrollBy({ left: direction * Math.max(el.clientWidth - 64, 200), behavior: pageBehavior() })\r\n }\r\n return (\r\n <div className={css.root}>\r\n {edges.left && (\r\n <button\r\n type=\"button\"\r\n className={`${css.arrow} ${css.arrowLeft}`}\r\n aria-label={labels.scrollLeft}\r\n onClick={() => { page(-1) }}\r\n >\r\n <IconChevronLeftOutline14 />\r\n </button>\r\n )}\r\n <div\r\n ref={railRef}\r\n className={css.rail}\r\n role=\"group\"\r\n aria-label={labels.group}\r\n onScroll={updateEdges}\r\n >\r\n {items.map(item => (\r\n <div key={item.id} className={css.item}>\r\n <button\r\n type=\"button\"\r\n className={css.thumbnail}\r\n title={labels.open}\r\n onClick={() => { onOpen(item) }}\r\n >\r\n <img src={item.previewUrl} alt={item.alt} />\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={css.remove}\r\n aria-label={item.removeLabel}\r\n onClick={() => { onRemove(item) }}\r\n >\r\n <IconCloseFill14 size={12} />\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n {edges.right && (\r\n <button\r\n type=\"button\"\r\n className={`${css.arrow} ${css.arrowRight}`}\r\n aria-label={labels.scrollRight}\r\n onClick={() => { page(1) }}\r\n >\r\n <IconChevronRightOutline14 />\r\n </button>\r\n )}\r\n </div>\r\n )\r\n}\r\n","import { createPortal } from 'react-dom'\r\nimport css from './DropOverlay.module.css'\r\n\r\n/** Drop-overlay strings the owner resolves from its own locale namespace. */\r\nexport interface DropOverlayLabels {\r\n /** Headline inviting the drop, or naming why it is unavailable. */\r\n title: string\r\n /** Limits line under the title; shown only while drops are accepted. */\r\n desc?: string | undefined\r\n}\r\n\r\n/**\r\n * Full-viewport invitation shown while a file drag is over the page.\r\n * Decoration only: `pointer-events: none` keeps drag targeting on the page\r\n * below, so the owner's document-level listeners keep an accurate enter/leave\r\n * count and own accept/reject. Rendered through a body portal for the same\r\n * transformed-ancestor reason as the lightbox.\r\n */\r\nexport function DropOverlay({ disabled, labels }: {\r\n disabled: boolean\r\n labels: DropOverlayLabels\r\n}) {\r\n return createPortal(\r\n <div className={css.mask} role=\"status\">\r\n <div className={css.wrap}>\r\n <div className={css.illustration} aria-hidden=\"true\">\r\n {disabled ? <BlockedIllustration /> : <UploadIllustration />}\r\n </div>\r\n <div className={css.title}>{labels.title}</div>\r\n {!disabled && labels.desc !== undefined && <div className={css.desc}>{labels.desc}</div>}\r\n </div>\r\n </div>,\r\n document.body,\r\n )\r\n}\r\n\r\n/** Tilted photo-and-note cards. */\r\nconst UploadIllustration = () => (\r\n <svg width=\"96\" height=\"72\" viewBox=\"0 0 96 72\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"14\" width=\"38\" height=\"38\" rx=\"10\" transform=\"rotate(-22 0 14)\" fill=\"#9ce5ed\" />\r\n <rect x=\"62\" y=\"7\" width=\"37\" height=\"43\" rx=\"8\" transform=\"rotate(17 62 7)\" fill=\"#679efe\" />\r\n <rect x=\"26\" y=\"30\" width=\"38\" height=\"38\" rx=\"10\" fill=\"#3964fe\" />\r\n <path\r\n d=\"M33 62c1-2 4-8 7-14 1-2 5-2 6 1 2 5 5 9 7 10 3 1 7-9 17 2\"\r\n stroke=\"#fff\"\r\n strokeWidth=\"3\"\r\n fill=\"none\"\r\n />\r\n <circle cx=\"53\" cy=\"43\" r=\"4\" fill=\"#fff\" />\r\n </svg>\r\n)\r\n\r\n/** Greyed cards with a blocked badge. */\r\nconst BlockedIllustration = () => (\r\n <svg width=\"96\" height=\"72\" viewBox=\"0 0 96 72\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect y=\"14\" width=\"38\" height=\"38\" rx=\"10\" transform=\"rotate(-22 0 14)\" fill=\"#c4c9d0\" />\r\n <rect x=\"62\" y=\"7\" width=\"37\" height=\"43\" rx=\"8\" transform=\"rotate(17 62 7)\" fill=\"#b0b6be\" />\r\n <rect x=\"26\" y=\"30\" width=\"38\" height=\"38\" rx=\"10\" fill=\"#d8dce1\" />\r\n <circle cx=\"45\" cy=\"49\" r=\"12\" stroke=\"#fff\" strokeWidth=\"3\" fill=\"none\" />\r\n <path d=\"M36 40l18 18\" stroke=\"#fff\" strokeWidth=\"3\" strokeLinecap=\"round\" />\r\n </svg>\r\n)\r\n","import { useEffect, useRef } from 'react'\r\nimport { createPortal } from 'react-dom'\r\nimport { IconCloseOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\r\nimport css from './ImageLightbox.module.css'\r\n\r\n/** Preview strings the owner resolves from its own locale namespace. */\r\nexport interface ImageLightboxLabels {\r\n /** Accessible name of the preview dialog. */\r\n dialog: string\r\n /** Accessible label of the close control. */\r\n close: string\r\n}\r\n\r\n/**\r\n * Document-level original-image preview opened by clicking a thumbnail.\r\n * Closes on Escape, backdrop press, or the close control, and restores focus\r\n * to the opener on unmount. Rendered through a body portal: an opener inside\r\n * a transformed or filtered ancestor would otherwise trap the fixed backdrop\r\n * in that ancestor's box instead of covering the viewport.\r\n */\r\nexport function ImageLightbox({ src, alt, labels, onClose }: {\r\n src: string\r\n alt: string\r\n labels: ImageLightboxLabels\r\n onClose: () => void\r\n}) {\r\n const closeRef = useRef<HTMLButtonElement | null>(null)\r\n const restoreRef = useRef<HTMLElement | null>(null)\r\n\r\n useEffect(() => {\r\n restoreRef.current = document.activeElement instanceof HTMLElement ? document.activeElement : null\r\n closeRef.current?.focus()\r\n const onKeyDown = (event: globalThis.KeyboardEvent): void => {\r\n if (event.key === 'Escape') onClose()\r\n }\r\n window.addEventListener('keydown', onKeyDown)\r\n return () => {\r\n window.removeEventListener('keydown', onKeyDown)\r\n restoreRef.current?.focus()\r\n }\r\n }, [onClose])\r\n\r\n return createPortal(\r\n <div\r\n className={css.backdrop}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-label={labels.dialog}\r\n >\r\n <div className={css.mask} aria-hidden=\"true\" onMouseDown={onClose} />\r\n <img className={css.image} src={src} alt={alt} />\r\n <button ref={closeRef} type=\"button\" className={css.close} aria-label={labels.close} onClick={onClose}>\r\n <IconCloseOutline16 size={16} />\r\n </button>\r\n </div>,\r\n document.body,\r\n )\r\n}\r\n","import { useCallback, useEffect, useMemo, useState } from 'react'\r\nimport type { SidechatImageRef } from '../api.ts'\r\nimport { ImageLightbox } from './ImageLightbox.tsx'\r\nimport type { ImageLightboxLabels } from './ImageLightbox.tsx'\r\nimport css from './MessageImage.module.css'\r\n\r\n/** Loads one durable image's bytes into a displayable URL. */\r\nexport type ImageLoader = (ref: SidechatImageRef) => Promise<string>\r\n\r\n/** Message-image strings the owner resolves from its own locale namespace. */\r\nexport interface MessageImageLabels {\r\n /** Fallback display name for an unnamed image. */\r\n image: string\r\n /** Thumbnail tooltip inviting the original-image preview. */\r\n open: string\r\n /** Accessible thumbnail label; receives the image's display name. */\r\n openNamed: (label: string) => string\r\n /** Loading placeholder shown until bytes resolve. */\r\n loading: string\r\n /** Retry-control label shown when the load fails. */\r\n loadFailed: string\r\n /** Lightbox strings forwarded to the opened preview. */\r\n lightbox: ImageLightboxLabels\r\n}\r\n\r\n/** Display box for a lone image: long edge 240px with the rendered aspect\r\n * ratio clamped to [0.25, 4] — the overflow is cropped by\r\n * `object-fit: cover` — and never upscaled past the image's natural size. The\r\n * crop anchor keeps the top of very tall images and the left of very wide\r\n * ones, where the informative content usually starts. */\r\nfunction singleFit(\r\n dimensions: { readonly width: number; readonly height: number },\r\n): { width: number; height: number; objectPosition: string } {\r\n const natural = dimensions.width / dimensions.height\r\n const ratio = Math.min(4, Math.max(0.25, natural))\r\n const box = ratio >= 1 ? { width: 240, height: 240 / ratio } : { width: 240 * ratio, height: 240 }\r\n const scale = Math.min(1, dimensions.width / box.width, dimensions.height / box.height)\r\n return {\r\n width: Math.max(1, Math.round(box.width * scale)),\r\n height: Math.max(1, Math.round(box.height * scale)),\r\n objectPosition: natural < 0.25 ? 'center top' : natural > 4 ? 'left center' : 'center',\r\n }\r\n}\r\n\r\n/**\r\n * Compact history renderer with retryable loading and click-to-open original\r\n * preview. A lone image renders at its `singleFit` size; an image among\r\n * several renders as a fixed 64px square tile.\r\n */\r\nexport function MessageImage({ image, load, variant, labels }: {\r\n image: SidechatImageRef\r\n load: ImageLoader\r\n variant: 'single' | 'tile'\r\n labels: MessageImageLabels\r\n}) {\r\n const [loaded, setLoaded] = useState<string | null>(null)\r\n const [error, setError] = useState(false)\r\n const [open, setOpen] = useState(false)\r\n // Retry re-arms the one load effect below, so every attempt — first load or\r\n // retry — runs under the same liveness guard and the same reset.\r\n const [attempt, setAttempt] = useState(0)\r\n const request = useCallback(() => { setAttempt(a => a + 1) }, [])\r\n const close = useCallback(() => { setOpen(false) }, [])\r\n const label = image.name === undefined || image.name === '' ? labels.image : image.name\r\n const fit = useMemo(() => (variant === 'single' ? singleFit(image) : undefined), [image, variant])\r\n\r\n useEffect(() => {\r\n let live = true\r\n setError(false)\r\n setLoaded(null)\r\n void load(image).then((url) => { if (live) setLoaded(url) }).catch(() => { if (live) setError(true) })\r\n return () => { live = false }\r\n }, [image, load, attempt])\r\n\r\n if (error) return <button type=\"button\" className={css.error} data-variant={variant} onClick={request}>{labels.loadFailed}</button>\r\n const src = loaded\r\n return (\r\n <>\r\n <button\r\n type=\"button\"\r\n className={css.frame}\r\n data-variant={variant}\r\n style={fit === undefined ? undefined : { width: fit.width, height: fit.height }}\r\n title={labels.open}\r\n aria-label={labels.openNamed(label)}\r\n onClick={() => { if (src !== null) setOpen(true) }}\r\n >\r\n {src === null\r\n ? <span className={css.loading}>{labels.loading}</span>\r\n : <img src={src} alt={label} style={fit === undefined ? undefined : { objectPosition: fit.objectPosition }} />}\r\n </button>\r\n {open && src !== null && <ImageLightbox src={src} alt={label} labels={labels.lightbox} onClose={close} />}\r\n </>\r\n )\r\n}\r\n\r\n/** Wrapping image group: a lone image renders large, several render as 64px\r\n * square tiles. */\r\nexport function ImageGallery({ images, load, align, labels }: {\r\n images: readonly SidechatImageRef[]\r\n load: ImageLoader\r\n align: 'start' | 'end'\r\n labels: MessageImageLabels\r\n}) {\r\n if (images.length === 0) return null\r\n const variant = images.length === 1 ? 'single' : 'tile'\r\n return (\r\n <div className={css.gallery} data-align={align}>\r\n {images.map((image, index) => (\r\n <MessageImage\r\n key={`${image.attachmentId}:${index}`}\r\n image={image}\r\n load={load}\r\n variant={variant}\r\n labels={labels}\r\n />\r\n ))}\r\n </div>\r\n )\r\n}\r\n","/**\n * Client API client for the /sidechat JSON routes (same fetch pattern the\n * better-sidebar built-ins use). All requests are same-origin POSTs; the host\n * fence (loopback/trusted authority) passes them naturally.\n */\n\n/** One API failure envelope. */\nexport interface SidechatApiError {\n code: string\n message: string\n}\n\n/** The unwrapped success value of one API method. */\nexport type SidechatResult<T> = { ok: true; value: T } | { ok: false; error: SidechatApiError }\n\n/** Side-chat list row. */\nexport interface SidechatListItem {\n childId: string\n running: boolean\n runningSince?: number\n}\n\n/** Browser-submitted prompt content part (text or base64 image). */\nexport type PromptContentPart = { type: 'text'; text: string } | { type: 'image'; mediaType: string; data: string; name?: string }\n\n/** One durable image reference returned by the host transcript. */\nexport interface SidechatImageRef {\n attachmentId: string\n mediaType: string\n bytes: number\n width: number\n height: number\n name?: string\n}\n\n/** One transcript message block. */\nexport type SidechatMessageBlock = { type: 'text'; text: string } | { type: 'image'; ref: SidechatImageRef } | { type: 'reasoning'; text: string }\n\n/** One transcript message. */\nexport interface SidechatMessage {\n role: 'user' | 'assistant'\n blocks: SidechatMessageBlock[]\n}\n\n/** Model / effort directory (provider groups → models → reasoning efforts). */\nexport interface SidechatDirectory {\n groups: Array<{\n id: string\n name: string\n models: Array<{\n id: string\n name: string\n description?: string\n reasoning?: { efforts: Array<{ id: string; name: string }>; defaultEffort?: string }\n }>\n }>\n}\n\n/** Permission options. */\nexport interface SidechatPermissions {\n options: Array<{ value: string; name: string; description?: string }>\n current: string\n}\n\n/** Call one /sidechat/api method. */\nasync function call<T>(method: string, payload: Record<string, unknown>): Promise<SidechatResult<T>> {\n const res = await fetch(`/sidechat/api/${method}`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n })\n return (await res.json()) as SidechatResult<T>\n}\n\nexport const api = {\n start: (args: { parentSessionId: string; content: PromptContentPart[]; lookupEnabled: boolean; provider?: string; model?: string; reasoningEffort?: string; preset?: string }) =>\n call<{ childId: string; provider: string; model: string; reasoningEffort?: string }>('sidechat.start', args),\n followup: (args: { childId: string; content: PromptContentPart[]; lookupEnabled: boolean }) =>\n call<{ accepted: true }>('sidechat.followup', args),\n list: (args: { parentSessionId: string }) =>\n call<{ items: SidechatListItem[] }>('sidechat.list', args),\n history: (args: { childId: string }) =>\n call<{ messages: SidechatMessage[] }>('sidechat.history', args),\n stop: (args: { childId: string }) =>\n call<{ accepted: true }>('sidechat.stop', args),\n selectModel: (args: { childId: string; provider: string; model: string; reasoningEffort?: string }) =>\n call<{ accepted: true }>('sidechat.selectModel', args),\n selectPermission: (args: { childId: string; presetName: string }) =>\n call<{ accepted: true }>('sidechat.selectPermission', args),\n summarize: (args: { parentSessionId: string; text: string; provider?: string; model?: string; reasoningEffort?: string; locale?: string }) =>\n call<{ summary: string }>('sidechat.summarize', args),\n inject: (args: { parentSessionId: string; text: string; summary?: string }) =>\n call<{ accepted: true }>('sidechat.inject', args),\n directory: () => call<SidechatDirectory>('sidechat.directory', {}),\n permissions: () => call<SidechatPermissions>('sidechat.permissions', {}),\n limits: () => call<{ mediaTypes: string[]; maxImageBytes: number; maxImagesPerMessage: number; maxMessageImageBytes: number; maxImagePixels: number }>('sidechat.limits', {}),\n attachment: (args: { childId: string; attachmentId: string }) =>\n call<{ mediaType: string; data: string }>('sidechat.attachment', args),\n inherit: (args: { parentSessionId: string }) =>\n call<{ provider: string; model: string; reasoningEffort?: string }>('sidechat.inherit', args),\n commands: (args: { childId: string }) =>\n call<{ commands: Array<{ name: string; description: string }> }>('sidechat.commands', args),\n command: (args: { childId: string; line: string }) =>\n call<{ executed: boolean }>('sidechat.command', args),\n state: (args: { childId: string }) =>\n call<{ plan: { active: boolean; pending: boolean }; goal: { id: string; objective: string } | null }>('sidechat.state', args),\n settingsGet: () => call<{ value?: unknown; revision?: number }>('settings.get', {}),\n settingsUpdate: (patch: Record<string, unknown>, expectedRevision?: number) =>\n call<{ value?: unknown; revision?: number }>('settings.update', { patch, expectedRevision }),\n dispose: (args: { childId: string }) =>\n call<{ accepted: true }>('sidechat.dispose', args),\n}\n","/**\r\n * Client locale dictionaries for dsh-side-chat (zh + en), registered under the\r\n * `sidechat` namespace.\r\n */\r\nexport const LOCALE_NS = 'sidechat'\r\n\r\nexport const zh = {\r\n 'ask.new': '在侧边聊天中提问',\r\n 'ask.continue': '继续在激活的侧边聊天中提问',\r\n 'panel.title': '侧边聊天',\r\n 'panel.empty': '当前会话还没有侧边聊天。选中消息文本后点「在侧边聊天中提问」即可发起。',\r\n 'panel.close': '关闭',\r\n 'panel.input.placeholder': '输入消息,回车发送',\r\n 'panel.send': '发送',\r\n 'panel.stop': '停止',\r\n 'panel.lookup': '需要时从工作区 / 主会话查信息',\r\n 'panel.model': '模型',\r\n 'panel.provider': '服务商',\r\n 'panel.effort': '思考难度',\r\n 'panel.permission': '权限',\r\n 'panel.noModel': '(继承)',\r\n 'panel.effortDefault': '默认',\r\n 'panel.expand': '展开侧边聊天',\r\n 'panel.collapse': '收起侧边聊天',\r\n 'panel.dispose': '结束此侧边聊天',\r\n 'panel.delete': '删除',\r\n 'panel.deleteAll': '删除全部',\r\n 'panel.error': '侧边聊天出错',\r\n 'panel.running': '思考中…',\r\n 'panel.copy': '复制',\n 'panel.copied': '已复制',\n 'panel.footnotes': '脚注',\n 'panel.think': '思考',\n 'panel.commands': '命令',\r\n 'command.model': '/model 模型',\r\n 'command.permission': '/permission 权限',\r\n 'plan.chipTitle': '计划模式已开启 — 点击关闭(/plan off)',\r\n 'plan.chipAria': '计划模式已开启,按下关闭',\r\n 'goal.label': '目标',\r\n 'image.railGroup': '图片附件',\r\n 'image.railOpen': '查看原图',\r\n 'image.railScrollLeft': '向左滚动',\r\n 'image.railScrollRight': '向右滚动',\r\n 'image.remove': '移除图片',\r\n 'image.label': '图片',\r\n 'image.open': '查看原图',\r\n 'image.loading': '加载中…',\r\n 'image.loadFailed': '加载失败',\r\n 'image.lightboxDialog': '图片预览',\r\n 'image.close': '关闭',\r\n 'image.dropTitle': '拖放图片到此处',\r\n 'image.dropDesc': '支持 PNG / JPEG / WebP / GIF',\r\n 'image.unsupported': '不支持的图片格式',\r\n 'image.tooMany': '图片数量超出限制',\r\n 'image.fileTooLarge': '图片过大',\r\n 'settingsNav': '侧边聊天',\r\n 'settings.lookupTitle': '默认勾选「需要时从工作区 / 主会话查信息」',\r\n 'settings.lookupDesc': '新会话的侧边聊天默认打开此开关;可在每次聊天中临时更改',\r\n 'settings.sendImmediatelyTitle': '选中内容后立即发送',\r\n 'settings.sendImmediatelyDesc': '关闭后,选中的内容会作为附件先放进侧边聊天输入框,由你确认后再发送',\r\n 'settings.defaultPromptTitle': '默认用户提示词',\r\n 'settings.defaultPromptDesc': '「立即发送」开启时,选中的内容会自动附加这段提示词,让回答更符合你的需求',\r\n 'settings.defaultPromptPlaceholder': '例如:请用中文回答,并尽量简洁…',\r\n 'settings.bringModeTitle': '带回内容的方式',\r\n 'settings.bringModeDesc': '把侧边聊天的 AI 回复带回主会话时,内容落在哪里(两种方式都不会立即发送)',\r\n 'settings.bringModeDraftTitle': '写入输入框草稿',\r\n 'settings.bringModeDraftDesc': '内容进入主会话输入框,可直接编辑后再发送',\r\n 'settings.bringModeContextTitle': '注入为折叠提示行',\r\n 'settings.bringModeContextDesc': '内容作为一条折叠的上下文提示行注入主会话(带来源标记),不写输入框;下次对话时模型可见',\r\n 'insert.direct': '直接带回',\r\n 'insert.summarize': '摘要后带回',\r\n 'insert.summarizing': '摘要中…',\r\n 'insert.failed': '无法写入主会话输入框',\r\n 'insert.summarizeFailed': '摘要失败',\r\n 'insert.contextSummary': '侧边聊天带回',\r\n 'insert.summarizeContextSummary': '侧边聊天摘要',\r\n 'question.options': '可选选项',\r\n 'question.option': '选项',\r\n 'question.bringAll': '带入全部',\r\n 'question.bringAllNew': '新会话全部',\r\n 'question.bringOne': '带入',\r\n 'question.bringOneNew': '新会话',\r\n 'question.bringing': '带入中…',\r\n 'question.failed': '带入侧边聊天失败',\r\n 'question.delete': '删除',\r\n 'question.deleteAll': '删除全部',\r\n 'question.collapse': '折叠',\r\n 'question.expand': '展开',\r\n 'question.allPrompt': '请帮我理解上面的问题和各个选项的含义,并给出选择建议。',\r\n 'question.onePrompt': '请帮我理解这个选项的含义,以及它在这个问题中的利弊。',\r\n 'question.openHint': '主会话有一个问题弹框,点击在侧边聊天里询问',\r\n}\r\n\r\nexport const en = {\r\n 'ask.new': 'Ask in side chat',\r\n 'ask.continue': 'Continue active side chat',\r\n 'panel.title': 'Side chat',\r\n 'panel.empty': 'No side chat for this conversation yet. Select some message text and choose \"Ask in side chat\".',\r\n 'panel.close': 'Close',\r\n 'panel.input.placeholder': 'Type a message, Enter to send',\r\n 'panel.send': 'Send',\r\n 'panel.stop': 'Stop',\r\n 'panel.lookup': 'Look up workspace / parent when needed',\r\n 'panel.model': 'Model',\r\n 'panel.provider': 'Provider',\r\n 'panel.effort': 'Effort',\r\n 'panel.permission': 'Permission',\r\n 'panel.noModel': '(inherited)',\r\n 'panel.effortDefault': 'Default',\r\n 'panel.expand': 'Expand side chat',\r\n 'panel.collapse': 'Collapse side chat',\r\n 'panel.dispose': 'End this side chat',\r\n 'panel.delete': 'Delete',\r\n 'panel.deleteAll': 'Delete all',\r\n 'panel.error': 'Side chat error',\r\n 'panel.running': 'Thinking…',\r\n 'panel.copy': 'Copy',\n 'panel.copied': 'Copied',\n 'panel.footnotes': 'Footnotes',\n 'panel.think': 'Think',\n 'panel.commands': 'Commands',\r\n 'command.model': '/model Model',\r\n 'command.permission': '/permission Permission',\r\n 'plan.chipTitle': 'Plan mode on — click to turn off (/plan off)',\r\n 'plan.chipAria': 'Plan mode on, press to turn off',\r\n 'goal.label': 'Goal',\r\n 'image.railGroup': 'Image attachments',\r\n 'image.railOpen': 'Open original',\r\n 'image.railScrollLeft': 'Scroll left',\r\n 'image.railScrollRight': 'Scroll right',\r\n 'image.remove': 'Remove image',\r\n 'image.label': 'Image',\r\n 'image.open': 'Open original',\r\n 'image.loading': 'Loading…',\r\n 'image.loadFailed': 'Load failed',\r\n 'image.lightboxDialog': 'Image preview',\r\n 'image.close': 'Close',\r\n 'image.dropTitle': 'Drop images here',\r\n 'image.dropDesc': 'PNG / JPEG / WebP / GIF',\r\n 'image.unsupported': 'Unsupported image type',\r\n 'image.tooMany': 'Too many images',\r\n 'image.fileTooLarge': 'Image too large',\r\n 'settingsNav': 'Side chat',\r\n 'settings.lookupTitle': 'Default on: \"look up workspace / parent when needed\"',\r\n 'settings.lookupDesc': 'New conversations start with this switch on; you can still change it per chat',\r\n 'settings.sendImmediatelyTitle': 'Send selected text immediately',\r\n 'settings.sendImmediatelyDesc': 'When off, the selection is staged as an attachment in the composer for you to confirm before sending',\r\n 'settings.defaultPromptTitle': 'Default prompt',\r\n 'settings.defaultPromptDesc': 'When \"send immediately\" is on, this prompt is appended to the selection so the answer matches your needs',\r\n 'settings.defaultPromptPlaceholder': 'e.g. Answer in Chinese and keep it concise…',\r\n 'settings.bringModeTitle': 'Bring-back target',\r\n 'settings.bringModeDesc': 'Where a side-chat AI reply lands when brought back (neither mode sends immediately)',\r\n 'settings.bringModeDraftTitle': 'Into the composer draft',\r\n 'settings.bringModeDraftDesc': 'Text lands in the main composer so you can edit before sending',\r\n 'settings.bringModeContextTitle': 'As a collapsed context row',\r\n 'settings.bringModeContextDesc': 'Text is injected as a collapsed, source-tagged context row — not into the composer; the model sees it next turn',\r\n 'insert.direct': 'Insert directly',\r\n 'insert.summarize': 'Summarize & insert',\r\n 'insert.summarizing': 'Summarizing…',\r\n 'insert.failed': 'Could not write to the main composer',\r\n 'insert.summarizeFailed': 'Summarization failed',\r\n 'insert.contextSummary': 'Brought from side chat',\r\n 'insert.summarizeContextSummary': 'Side chat summary',\r\n 'question.options': 'Options',\r\n 'question.option': 'Option',\r\n 'question.bringAll': 'Bring all',\r\n 'question.bringAllNew': 'New chat (all)',\r\n 'question.bringOne': 'Bring',\r\n 'question.bringOneNew': 'New chat',\r\n 'question.bringing': 'Bringing…',\r\n 'question.failed': 'Failed to bring into the side chat',\r\n 'question.delete': 'Delete',\r\n 'question.deleteAll': 'Delete all',\r\n 'question.collapse': 'Collapse',\r\n 'question.expand': 'Expand',\r\n 'question.allPrompt': 'Please explain what this question is asking and what each option means, and advise how I should choose.',\r\n 'question.onePrompt': 'Please explain what this option means and its trade-offs for this question.',\r\n 'question.openHint': 'The main conversation has a question dialog — click to ask in the side chat',\r\n}\r\n\r\nexport type SidechatLocaleKey = keyof typeof zh\r\n","/**\n * Shared side-chat preference vocabulary (types + constants), consumed by\n * BOTH halves: the host registers the schemastery schema over these values\n * (index.ts) and the client reads/writes them through the plugin's own\n * fenced /sidechat settings routes. Kept free of schemastery so the browser\n * bundle never pulls the schema runtime in.\n */\n\n/** The user-settings namespace holding the side-chat preferences. */\nexport const SUBCHAT_PREFS_NS = 'dsh-side-chat'\n\n/** How a brought-back reply lands in the main conversation. */\nexport type BringMode = 'draft' | 'context'\n\n/** User-facing side-chat preferences. */\nexport interface SubchatPrefs {\n /** Whether the \"look up workspace / parent when needed\" switch defaults on. */\n lookupDefault: boolean\n /** Whether selecting text sends it immediately (true) or stages it as an attachment (false). */\n sendImmediately: boolean\n /** Extra prompt appended when the selection is sent immediately (empty = none). */\n defaultPrompt: string\n /** How brought-back content lands: into the composer draft, or as a collapsed context row. */\n bringMode: BringMode\n}\n\n/** Fallback prefs used whenever the settings document is unreachable or malformed. */\nexport const SUBCHAT_PREFS_DEFAULTS: SubchatPrefs = {\n lookupDefault: false,\n sendImmediately: true,\n defaultPrompt: '',\n bringMode: 'draft',\n}\n","/**\r\n * Client half of dsh-side-chat: a text-selection floating menu, a right-side\r\n * side-chat panel (drag-resizable + collapsible), the main-conversation-style\r\n * model/permission selectors and send/stop buttons, and a \"Side chat\" settings\r\n * section. The panel is isolated per current conversation and talks to the\r\n * host /sidechat API.\r\n */\r\nimport { useCallback, useEffect, useMemo, useRef, useState, type CSSProperties, type MouseEvent as ReactMouseEvent } from 'react'\r\nimport { useSyncExternalStore } from 'react'\r\nimport { createRoot, type Root } from 'react-dom/client'\r\nimport {\r\n DisclosureRow,\r\n IconCheckOutline16,\r\n IconChevronDownOutline14,\r\n IconChevronRightOutline14,\r\n IconPanelLeftOutline16,\r\n IconSendOutline16,\r\n IconStopFill16,\r\n IconThinkOutline14,\r\n MarkdownText,\r\n Menu,\r\n Tooltip,\r\n} from '@deepseek-ai/dsh-client-ui-primitives'\r\nimport {\r\n AttachmentRail,\r\n DropOverlay,\r\n ImageGallery,\r\n ImageLightbox,\r\n type ImageLoader,\r\n} from './attachments/index.ts'\r\nimport type { Context, SideQuestionItem, SideQuestionOption } from '../context-types.ts'\r\nimport {\r\n api,\r\n type PromptContentPart,\r\n type SidechatDirectory,\r\n type SidechatImageRef,\r\n type SidechatListItem,\r\n type SidechatMessage,\r\n type SidechatPermissions,\r\n} from './api.ts'\r\nimport { en, LOCALE_NS, zh, type SidechatLocaleKey } from './locales.ts'\r\nimport { SUBCHAT_PREFS_DEFAULTS, type SubchatPrefs } from '../settings-shared.ts'\r\nimport css from './client.module.css'\r\nimport './layout.css'\r\n\r\n/** Services required before mounting. */\r\nexport const inject = ['sessions', 'locale', 'slots', 'conversation', 'uiSession']\r\n\r\n/** A text selection the floating menu anchors to. */\r\ninterface SelectionAnchor {\r\n text: string\r\n x: number\r\n y: number\r\n}\r\n\r\n/** The panel UI state, per current parent conversation. */\r\ninterface PanelState {\r\n open: boolean\r\n parentSessionId: string\r\n activeChildId: string | null\r\n items: SidechatListItem[]\r\n messages: SidechatMessage[]\r\n draft: string\r\n /** Staged selection shown as an attachment while \"send immediately\" is off. */\r\n attachment: string | null\r\n /** Browser-owned draft images (object URLs); serialized on send. */\r\n attachments: ComposerAttachment[]\r\n lookup: boolean\r\n directory: SidechatDirectory | null\r\n permissions: SidechatPermissions | null\r\n provider: string\r\n model: string\r\n effort: string\r\n preset: string\r\n /** Which selector the command menu asked to open (consumed once). */\r\n commandOpen: 'model' | 'permission' | null\r\n planActive: boolean\r\n planPending: boolean\r\n goalObjective: string | null\r\n error: string | null\r\n}\r\n\r\n/** The whole browser-side snapshot. */\r\ninterface SidechatSnapshot {\r\n current: string | undefined\r\n panel: PanelState\r\n anchor: SelectionAnchor | null\r\n prefs: SubchatPrefs\r\n /** The current main conversation's pending user-question dialog (null = none). */\r\n mainQuestion: SideQuestionItem[] | null\r\n /** Question ids the user deleted from the panel list. */\r\n dismissedQuestionIds: string[]\r\n}\r\n\r\n/** The whole browser-side store (one per activation). */\r\ninterface SidechatStore {\r\n getSnapshot(): SidechatSnapshot\r\n subscribe(fn: () => void): () => void\r\n setCurrent(current: string | undefined): void\r\n setAnchor(anchor: SelectionAnchor | null): void\r\n setPrefs(prefs: SubchatPrefs): void\r\n setMainQuestion(questions: SideQuestionItem[] | null): void\r\n dismissQuestion(id: string): void\r\n dismissAllQuestions(ids: string[]): void\r\n openPanel(parentSessionId: string): void\r\n closePanel(): void\r\n setActive(childId: string): void\r\n patch(partial: Partial<PanelState>): void\r\n}\r\n\r\nfunction emptyPanel(): PanelState {\r\n return {\r\n open: false,\r\n parentSessionId: '',\r\n activeChildId: null,\r\n items: [],\r\n messages: [],\r\n draft: '',\r\n attachment: null,\r\n attachments: [],\r\n lookup: false,\r\n directory: null,\r\n permissions: null,\r\n provider: '',\r\n model: '',\r\n effort: '',\r\n preset: '',\r\n commandOpen: null,\r\n planActive: false,\r\n planPending: false,\r\n goalObjective: null,\r\n error: null,\r\n }\r\n}\r\n\r\n/** Create the browser store (one instance per activation, per the factory rule). */\r\nfunction createStore(): SidechatStore {\r\n let current: string | undefined\r\n let panel: PanelState = emptyPanel()\r\n let anchor: SelectionAnchor | null = null\r\n let prefs: SubchatPrefs = { ...SUBCHAT_PREFS_DEFAULTS }\r\n let mainQuestion: SideQuestionItem[] | null = null\r\n let dismissedQuestionIds: string[] = []\r\n // Per-conversation panel state so switching away and back restores the side\r\n // chats instead of resetting them. The side chats stay live on the host, so\r\n // the client must remember each conversation's open panel + active child.\r\n const bySession = new Map<string, PanelState>()\r\n const listeners = new Set<() => void>()\r\n // Cached snapshot: useSyncExternalStore compares identity, so the object is\r\n // only rebuilt on a mutation — never inside getSnapshot itself.\r\n let snapshot: SidechatSnapshot = { current, panel, anchor, prefs, mainQuestion, dismissedQuestionIds }\r\n\r\n const notify = (): void => {\r\n snapshot = { current, panel, anchor, prefs, mainQuestion, dismissedQuestionIds }\r\n for (const fn of [...listeners]) fn()\r\n }\r\n\r\n return {\r\n getSnapshot: () => snapshot,\r\n subscribe: (fn) => {\r\n listeners.add(fn)\r\n return () => { listeners.delete(fn) }\r\n },\r\n setCurrent(next) {\r\n if (next === current) return\r\n if (current !== undefined) bySession.set(current, panel)\r\n current = next\r\n panel = next === undefined\r\n ? emptyPanel()\r\n : (bySession.get(next) ?? { ...emptyPanel(), parentSessionId: next, lookup: prefs.lookupDefault })\r\n anchor = null\r\n mainQuestion = null\r\n dismissedQuestionIds = []\r\n notify()\r\n },\r\n setAnchor(next) {\r\n anchor = next\r\n notify()\r\n },\r\n setPrefs(next) {\r\n prefs = next\r\n notify()\r\n },\r\n setMainQuestion(questions) {\r\n mainQuestion = questions\r\n // Keep dismissal state: a dismissed question must not reappear just\r\n // because the pending snapshot re-publishes while the dialog is still open.\r\n notify()\r\n },\r\n dismissQuestion(id) {\r\n if (!dismissedQuestionIds.includes(id)) {\r\n dismissedQuestionIds = [...dismissedQuestionIds, id]\r\n notify()\r\n }\r\n },\r\n dismissAllQuestions(ids) {\r\n dismissedQuestionIds = [...new Set([...dismissedQuestionIds, ...ids])]\r\n notify()\r\n },\r\n openPanel(parentSessionId) {\r\n panel = { ...panel, open: true, parentSessionId }\r\n notify()\r\n },\r\n closePanel() {\r\n panel = { ...panel, open: false }\r\n notify()\r\n },\r\n setActive(childId) {\r\n panel = { ...panel, activeChildId: childId, messages: [], error: null }\r\n notify()\r\n },\r\n patch(partial) {\r\n panel = { ...panel, ...partial }\r\n notify()\r\n },\r\n }\r\n}\r\n\r\n/** Resolve the localized label for one locale key (module-level active locale). */\r\nfunction translate(activeLocale: string, key: SidechatLocaleKey): string {\r\n const dict = activeLocale === 'en' ? en : zh\r\n return dict[key] ?? key\r\n}\r\n\r\n/** Format a run duration like the main conversation: \"Xs\" / \"Xm SSs\" (or Chinese). */\r\nfunction formatRunDuration(ms: number, activeLocale: string): string {\r\n const total = Math.max(0, Math.floor(ms / 1000))\r\n const minutes = Math.floor(total / 60)\r\n const seconds = total % 60\r\n if (minutes > 0) {\r\n return activeLocale === 'en'\r\n ? `${minutes}m ${String(seconds).padStart(2, '0')}s`\r\n : `${minutes}分${String(seconds).padStart(2, '0')}秒`\r\n }\r\n return activeLocale === 'en' ? `${seconds}s` : `${seconds}秒`\r\n}\r\n\r\n/** Browser-owned draft image (object URL preview). */\r\ninterface ComposerAttachment {\r\n id: string\r\n file: File\r\n previewUrl: string\r\n}\r\n\r\n/** Accepted image media types (mirror of dsh-attachment's ImageMediaType). */\r\nconst IMAGE_MEDIA_TYPES = ['image/png', 'image/jpeg', 'image/webp', 'image/gif']\r\n\r\n/** Create runtime draft images with object URLs (validates media type). */\r\nfunction createDraftImages(files: readonly File[]): ComposerAttachment[] {\r\n return files.map((file) => {\r\n if (!IMAGE_MEDIA_TYPES.includes(file.type)) {\r\n throw new Error(`unsupported image type: ${file.type || 'unknown'}`)\r\n }\r\n return { id: crypto.randomUUID(), file, previewUrl: URL.createObjectURL(file) }\r\n })\r\n}\r\n\r\n/** Revoke one draft image's preview URL. */\r\nfunction releaseDraftImage(attachment: ComposerAttachment): void {\r\n URL.revokeObjectURL(attachment.previewUrl)\r\n}\r\n\r\n/** Serialize draft images to base64 prompt parts (mirror of main sendSession). */\r\nasync function serializeImages(attachments: readonly ComposerAttachment[]): Promise<PromptContentPart[]> {\r\n return Promise.all(attachments.map(async (a) => {\r\n const bytes = new Uint8Array(await a.file.arrayBuffer())\r\n let binary = ''\r\n const chunk = 32768\r\n for (let offset = 0; offset < bytes.length; offset += chunk) {\r\n binary += String.fromCharCode(...bytes.subarray(offset, offset + chunk))\r\n }\r\n return {\r\n type: 'image',\r\n mediaType: a.file.type,\r\n data: btoa(binary),\r\n ...(a.file.name === '' ? {} : { name: a.file.name }),\r\n }\r\n }))\r\n}\r\n\r\n/** Convert a base64 string to an object URL for transcript image rendering. */\r\nfunction base64ObjectUrl(mediaType: string, data: string): string {\r\n const binary = atob(data)\r\n const bytes = new Uint8Array(binary.length)\r\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i)\r\n return URL.createObjectURL(new Blob([bytes], { type: mediaType }))\r\n}\r\n\r\n/** Pull the side-chat list for one parent conversation. */\r\nasync function refreshList(store: SidechatStore, parentSessionId: string): Promise<void> {\r\n const result = await api.list({ parentSessionId })\r\n if (result.ok) store.patch({ items: result.value.items })\r\n}\r\n\r\n/** Optimistically flip one side-chat's running flag before the list round-trip. */\r\nfunction setItemRunning(store: SidechatStore, childId: string, running: boolean): void {\r\n const items = store.getSnapshot().panel.items\r\n store.patch({ items: items.map((i) => (i.childId === childId ? { ...i, running } : i)) })\r\n}\r\n\r\n/** Pull the active side chat's transcript. */\r\nasync function refreshHistory(store: SidechatStore, childId: string): Promise<void> {\r\n const result = await api.history({ childId })\r\n if (result.ok) store.patch({ messages: result.value.messages })\r\n}\r\n\r\n/** Pull the model directory + permission catalog once. */\r\nasync function refreshDirectory(store: SidechatStore): Promise<void> {\r\n const [directoryResult, permissionsResult] = await Promise.all([\r\n api.directory(),\r\n api.permissions(),\r\n ])\r\n const patch: Partial<PanelState> = {}\r\n if (directoryResult.ok) patch.directory = directoryResult.value\r\n if (permissionsResult.ok) {\r\n patch.permissions = permissionsResult.value\r\n // Only seed the preset on first load; never clobber an explicit user pick.\r\n if (store.getSnapshot().panel.preset === '') {\r\n patch.preset = permissionsResult.value.current\r\n }\r\n }\r\n store.patch(patch)\r\n}\r\n\r\n/** The side-chat's current model selection (provider + model + effort). */\r\ninterface ModelSelection {\r\n provider: string\r\n model: string\r\n effort: string\r\n}\r\n\r\n/** One directory model's reasoning slice. */\r\ntype DirectoryReasoning = SidechatDirectory['groups'][number]['models'][number]['reasoning']\r\n\r\n/** The first non-empty line of a reasoning block (collapsed summary). */\r\nfunction firstLine(text: string): string {\r\n const end = text.indexOf('\\n')\r\n return end === -1 ? text : text.slice(0, end)\r\n}\r\n\r\n/** Main-conversation-style reasoning disclosure row (Think). */\r\nfunction ReasoningRow(props: { text: string; t: (key: SidechatLocaleKey) => string }) {\r\n const [expanded, setExpanded] = useState(false)\r\n const summary = firstLine(props.text)\r\n return (\r\n <DisclosureRow\r\n icon={<IconThinkOutline14 size={14} />}\r\n title={props.t('panel.think')}\r\n open={expanded}\r\n expandable={true}\r\n expandOnRowClick={true}\r\n onToggle={() => { setExpanded((value) => !value) }}\r\n collapsedContent={<span className={css.reasoningSummary}>{summary}</span>}\r\n >\r\n <div className={css.reasoningBody}>{props.text}</div>\r\n </DisclosureRow>\r\n )\r\n}\r\n\r\n/**\r\n * Main-conversation-style model selector: a compact trigger showing\r\n * `model · effort`, opening a two-level menu (provider groups → models, then\r\n * effort levels). UI mirrors dsh-client-ui-model-selection's ModelSelect.\r\n */\r\nfunction ModelSelect(props: {\r\n directory: SidechatDirectory | null\r\n selection: ModelSelection\r\n onSelect: (provider: string, model: string, effort?: string) => void\r\n t: (key: SidechatLocaleKey) => string\r\n openSignal?: boolean\r\n onOpenConsumed?: () => void\r\n}) {\r\n const { directory, selection, onSelect, t, openSignal, onOpenConsumed } = props\r\n const [open, setOpen] = useState(false)\r\n const [pane, setPane] = useState<'root' | 'model' | 'effort'>('root')\r\n const rootRef = useRef<HTMLDivElement | null>(null)\r\n\r\n // External open signal (the + command menu asks the selector to open).\r\n useEffect(() => {\r\n if (openSignal === true) {\r\n setPane('root')\r\n setOpen(true)\r\n onOpenConsumed?.()\r\n }\r\n }, [openSignal, onOpenConsumed])\r\n\r\n // Current model entry across all provider groups.\r\n let currentChoice: { name: string; reasoning?: DirectoryReasoning } | undefined\r\n for (const group of directory?.groups ?? []) {\r\n const model = group.models.find((m) => m.id === selection.model && group.id === selection.provider)\r\n if (model !== undefined) {\r\n currentChoice = { name: model.name, reasoning: model.reasoning }\r\n break\r\n }\r\n }\r\n const reasoning = currentChoice?.reasoning\r\n const effectiveEffort = selection.effort !== '' ? selection.effort : reasoning?.defaultEffort\r\n const effortLabel = reasoning === undefined\r\n ? undefined\r\n : effectiveEffort === undefined\r\n ? t('panel.effortDefault')\r\n : reasoning.efforts.find((e) => e.id === effectiveEffort)?.name ?? effectiveEffort\r\n const modelLabel = currentChoice?.name ?? t('panel.noModel')\r\n const effortChoices = reasoning === undefined\r\n ? []\r\n : [\r\n ...(reasoning.defaultEffort === undefined ? [{ key: 'default', effort: undefined as string | undefined, label: t('panel.effortDefault') }] : []),\r\n ...reasoning.efforts.map((e) => ({ key: e.id, effort: e.id, label: e.name })),\r\n ]\r\n\r\n // Close on outside pointer-down / Escape.\r\n useEffect(() => {\r\n if (!open) return\r\n const onDown = (e: globalThis.MouseEvent): void => {\r\n if (rootRef.current !== null && !rootRef.current.contains(e.target as Node)) setOpen(false)\r\n }\r\n const onKey = (e: KeyboardEvent): void => {\r\n if (e.key === 'Escape') setOpen(false)\r\n }\r\n document.addEventListener('mousedown', onDown)\r\n document.addEventListener('keydown', onKey)\r\n return () => {\r\n document.removeEventListener('mousedown', onDown)\r\n document.removeEventListener('keydown', onKey)\r\n }\r\n }, [open])\r\n\r\n const triggerLabel = effortLabel === undefined ? modelLabel : `${modelLabel} · ${effortLabel}`\r\n\r\n return (\r\n <div ref={rootRef} className={css.modelSelect}>\r\n <button\r\n type=\"button\"\r\n className={css.modelSelectTrigger}\r\n aria-haspopup=\"menu\"\r\n aria-expanded={open}\r\n title={triggerLabel}\r\n onClick={() => {\r\n if (open) setOpen(false)\r\n else { setPane('root'); setOpen(true) }\r\n }}\r\n >\r\n <span className={css.modelSelectLabel}>{modelLabel}</span>\r\n {effortLabel !== undefined && <span className={css.modelSelectEffort}>{effortLabel}</span>}\r\n <IconChevronDownOutline14 className={open ? css.chevronOpen : undefined} />\r\n </button>\r\n\r\n {open && (\r\n <div className={css.modelSelectMenu} role=\"menu\">\r\n {pane === 'root' && (\r\n <>\r\n <button type=\"button\" role=\"menuitem\" className={css.modelCell} onClick={() => { setPane('model') }}>\r\n <span className={css.modelCellLabel}>{t('panel.model')}</span>\r\n <span className={css.modelCellValue}>{modelLabel}</span>\r\n <IconChevronRightOutline14 className={css.modelCellChevron} />\r\n </button>\r\n {reasoning !== undefined && (\r\n <button type=\"button\" role=\"menuitem\" className={css.modelCell} onClick={() => { setPane('effort') }}>\r\n <span className={css.modelCellLabel}>{t('panel.effort')}</span>\r\n <span className={css.modelCellValue}>{effortLabel}</span>\r\n <IconChevronRightOutline14 className={css.modelCellChevron} />\r\n </button>\r\n )}\r\n </>\r\n )}\r\n\r\n {pane === 'model' && (\r\n <div className={css.modelGroups}>\r\n {(directory?.groups ?? []).map((group) => (\r\n <section key={group.id} role=\"group\" aria-label={group.name} className={css.modelGroup}>\r\n <div className={css.modelGroupTitle}>{group.name}</div>\r\n {group.models.map((model) => {\r\n const selected = selection.provider === group.id && selection.model === model.id\r\n return (\r\n <button\r\n key={model.id}\r\n type=\"button\"\r\n role=\"menuitemradio\"\r\n aria-checked={selected}\r\n className={selected ? `${css.modelOption} ${css.modelOptionSelected}` : css.modelOption}\r\n title={model.name}\r\n onClick={() => {\r\n onSelect(group.id, model.id)\r\n setOpen(false)\r\n }}\r\n >\r\n <span className={css.modelOptionCopy}>\r\n <span className={css.modelName}>{model.name}</span>\r\n {model.description !== undefined && <span className={css.modelDescription}>{model.description}</span>}\r\n </span>\r\n <span className={css.modelCheck}>{selected ? <IconCheckOutline16 /> : null}</span>\r\n </button>\r\n )\r\n })}\r\n </section>\r\n ))}\r\n {(directory?.groups ?? []).length === 0 && <div className={css.modelEmpty}>{t('panel.noModel')}</div>}\r\n </div>\r\n )}\r\n\r\n {pane === 'effort' && (\r\n <>\r\n {effortChoices.length === 0\r\n ? <div className={css.modelEmpty}>{t('panel.effort')}</div>\r\n : effortChoices.map((level) => {\r\n const selected = effectiveEffort === level.effort\r\n return (\r\n <button\r\n key={level.key}\r\n type=\"button\"\r\n role=\"menuitemradio\"\r\n aria-checked={selected}\r\n className={selected ? `${css.modelOption} ${css.modelOptionSelected}` : css.modelOption}\r\n onClick={() => {\r\n onSelect(selection.provider, selection.model, level.effort)\r\n setOpen(false)\r\n }}\r\n >\r\n <span className={css.modelOptionCopy}>\r\n <span className={css.modelName}>{level.label}</span>\r\n </span>\r\n <span className={css.modelCheck}>{selected ? <IconCheckOutline16 /> : null}</span>\r\n </button>\r\n )\r\n })}\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\n/** Main-conversation-style permission selector (Menu + compact trigger). */\r\nfunction PermissionSelect(props: {\r\n permissions: SidechatPermissions | null\r\n preset: string\r\n onSelect: (preset: string) => void\r\n t: (key: SidechatLocaleKey) => string\r\n openSignal?: boolean\r\n onOpenConsumed?: () => void\r\n}) {\r\n const { permissions, preset, onSelect, openSignal, onOpenConsumed } = props\r\n const [open, setOpen] = useState(false)\r\n const options = (permissions?.options ?? []).filter((o) => o.value !== 'custom')\r\n const current = options.find((o) => o.value === preset)\r\n const items = options.map((o) => ({ id: o.value, label: o.name }))\r\n\r\n // External open signal (the + command menu asks the selector to open).\r\n useEffect(() => {\r\n if (openSignal === true) {\r\n setOpen(true)\r\n onOpenConsumed?.()\r\n }\r\n }, [openSignal, onOpenConsumed])\r\n\r\n return (\r\n <Menu\r\n open={open}\r\n side=\"top\"\r\n align=\"end\"\r\n items={items}\r\n selectedId={preset}\r\n onSelect={(id) => { setOpen(false); onSelect(id) }}\r\n onClose={() => { setOpen(false) }}\r\n anchor={(\r\n <button\r\n type=\"button\"\r\n className={css.modelSelectTrigger}\r\n aria-haspopup=\"menu\"\r\n aria-expanded={open}\r\n title={current?.description}\r\n onClick={() => { setOpen(!open) }}\r\n >\r\n <span className={css.modelSelectLabel}>{current?.name ?? preset}</span>\r\n <IconChevronDownOutline14 />\r\n </button>\r\n )}\r\n />\r\n )\r\n}\r\n\r\n/**\r\n * The floating selection menu: listens to the document selection and shows\r\n * one or two buttons (start / continue), dispatching to the host API.\r\n */\r\nfunction SelectionMenu(props: { store: SidechatStore; t: (key: SidechatLocaleKey) => string }) {\r\n const { anchor, current, panel, prefs } = useSyncExternalStore(props.store.subscribe, props.store.getSnapshot)\r\n const [local, setLocal] = useState<SelectionAnchor | null>(null)\r\n\r\n useEffect(() => {\r\n const compute = (): void => {\r\n const selection = window.getSelection()\r\n if (selection === null || selection.isCollapsed) {\r\n setLocal(null)\r\n return\r\n }\r\n const text = selection.toString().trim()\r\n if (text === '') {\r\n setLocal(null)\r\n return\r\n }\r\n const range = selection.getRangeAt(0)\r\n const node = range.startContainer\r\n const element = node.nodeType === 1 ? (node as Element) : node.parentElement\r\n if (element !== null && element.closest('input, textarea, [contenteditable=\"true\"]') !== null) {\r\n setLocal(null)\r\n return\r\n }\r\n // Never offer \"ask in side chat\" for selections inside the side-chat panel\r\n // (those belong to the bring-back-to-main menu instead).\r\n if (element !== null && element.closest('[data-dsh-side-chat]') !== null) {\r\n setLocal(null)\r\n return\r\n }\r\n const rect = range.getBoundingClientRect()\r\n if (rect.width === 0 && rect.height === 0) {\r\n setLocal(null)\r\n return\r\n }\r\n setLocal({ text, x: rect.left + rect.width / 2, y: rect.top })\r\n }\r\n const onMouseUp = (): void => { window.setTimeout(compute, 0) }\r\n document.addEventListener('mouseup', onMouseUp)\r\n document.addEventListener('selectionchange', compute)\r\n return () => {\r\n document.removeEventListener('mouseup', onMouseUp)\r\n document.removeEventListener('selectionchange', compute)\r\n }\r\n }, [])\r\n\r\n const start = useCallback(() => {\r\n if (local === null || current === undefined) return\r\n const parentSessionId = current\r\n const text = local.text\r\n const snap = props.store.getSnapshot().panel\r\n if (prefs.sendImmediately) {\r\n const content: PromptContentPart[] = [\r\n { type: 'text', text },\r\n ...(prefs.defaultPrompt.trim() !== '' ? [{ type: 'text' as const, text: prefs.defaultPrompt.trim() }] : []),\r\n ]\r\n void api.start({\r\n parentSessionId,\r\n content,\r\n lookupEnabled: prefs.lookupDefault,\r\n ...(snap.provider !== '' ? { provider: snap.provider } : {}),\r\n ...(snap.model !== '' ? { model: snap.model } : {}),\r\n ...(snap.effort !== '' ? { reasoningEffort: snap.effort } : {}),\r\n }).then((result) => {\r\n if (result.ok) {\r\n props.store.openPanel(parentSessionId)\r\n props.store.setActive(result.value.childId)\r\n props.store.patch({\r\n provider: result.value.provider,\r\n model: result.value.model,\r\n effort: result.value.reasoningEffort ?? '',\r\n })\r\n void refreshList(props.store, parentSessionId)\r\n void refreshDirectory(props.store)\r\n }\r\n })\r\n } else {\r\n // Stage the selection as an attachment; a new side chat is created on\r\n // send. Detach from any previously active child, but show the parent's\r\n // inherited model until the user picks one.\r\n props.store.openPanel(parentSessionId)\r\n props.store.patch({ attachment: text, activeChildId: null, messages: [], draft: '', provider: '', model: '', effort: '' })\r\n void api.inherit({ parentSessionId }).then((result) => {\r\n if (result.ok) {\r\n props.store.patch({\r\n provider: result.value.provider,\r\n model: result.value.model,\r\n effort: result.value.reasoningEffort ?? '',\r\n })\r\n }\r\n })\r\n void refreshDirectory(props.store)\r\n }\r\n setLocal(null)\r\n }, [local, current, prefs, props.store])\r\n\r\n const continueChat = useCallback(() => {\r\n if (local === null || current === undefined) return\r\n const parentSessionId = current\r\n const text = local.text\r\n const active = props.store.getSnapshot().panel.activeChildId\r\n if (active === null) return\r\n props.store.openPanel(parentSessionId)\r\n if (prefs.sendImmediately) {\r\n const content: PromptContentPart[] = [\r\n { type: 'text', text },\r\n ...(prefs.defaultPrompt.trim() !== '' ? [{ type: 'text' as const, text: prefs.defaultPrompt.trim() }] : []),\r\n ]\r\n setItemRunning(props.store, active, true)\r\n void api.followup({ childId: active, content, lookupEnabled: prefs.lookupDefault }).then((result) => {\r\n if (!result.ok) props.store.patch({ error: result.error.message })\r\n void refreshList(props.store, parentSessionId)\r\n void refreshHistory(props.store, active)\r\n })\r\n } else {\r\n props.store.patch({ attachment: text })\r\n }\r\n setLocal(null)\r\n }, [local, current, prefs, props.store])\r\n\r\n if (local === null || current === undefined) return null\r\n const hasActive = panel.activeChildId !== null\r\n return (\r\n <div className={css.selectionMenu} style={{ left: local.x, top: local.y - 46 }}>\r\n <button type=\"button\" className={css.selectionButton} onClick={start}>{props.t('ask.new')}</button>\r\n {hasActive && <button type=\"button\" className={css.selectionButton} onClick={continueChat}>{props.t('ask.continue')}</button>}\r\n </div>\r\n )\r\n}\r\n\r\n/**\r\n * The floating bring-back-to-main menu: listens to the document selection and,\r\n * when the selection is inside an assistant reply in the side-chat panel, shows\r\n * two actions — \"insert directly\" and \"summarize then insert\" — both appending\r\n * into the main composer without sending.\r\n */\r\nfunction BringBackMenu(props: {\r\n store: SidechatStore\r\n t: (key: SidechatLocaleKey) => string\r\n bringToMain: (text: string) => Promise<boolean>\r\n summarizeBring: (text: string) => Promise<boolean>\r\n}) {\r\n const [local, setLocal] = useState<SelectionAnchor | null>(null)\r\n const [summarizing, setSummarizing] = useState(false)\r\n\r\n useEffect(() => {\r\n const compute = (): void => {\r\n const selection = window.getSelection()\r\n if (selection === null || selection.isCollapsed) {\r\n setLocal(null)\r\n return\r\n }\r\n const text = selection.toString().trim()\r\n if (text === '') {\r\n setLocal(null)\r\n return\r\n }\r\n const range = selection.getRangeAt(0)\r\n const node = range.startContainer\r\n const element = node.nodeType === 1 ? (node as Element) : node.parentElement\r\n if (element !== null && element.closest('input, textarea, [contenteditable=\"true\"]') !== null) {\r\n setLocal(null)\r\n return\r\n }\r\n if (element === null || element.closest('[data-sidechat-role=\"assistant\"]') === null) {\r\n setLocal(null)\r\n return\r\n }\r\n const rect = range.getBoundingClientRect()\r\n if (rect.width === 0 && rect.height === 0) {\r\n setLocal(null)\r\n return\r\n }\r\n setLocal({ text, x: rect.left + rect.width / 2, y: rect.top })\r\n }\r\n const onMouseUp = (): void => { window.setTimeout(compute, 0) }\r\n document.addEventListener('mouseup', onMouseUp)\r\n document.addEventListener('selectionchange', compute)\r\n return () => {\r\n document.removeEventListener('mouseup', onMouseUp)\r\n document.removeEventListener('selectionchange', compute)\r\n }\r\n }, [])\r\n\r\n if (local === null) return null\r\n\r\n const summarize = async (): Promise<void> => {\r\n setSummarizing(true)\r\n const ok = await props.summarizeBring(local.text)\r\n setSummarizing(false)\r\n if (!ok) props.store.patch({ error: props.t('insert.summarizeFailed') })\r\n else setLocal(null)\r\n }\r\n\r\n return (\r\n <div className={css.selectionMenu} style={{ left: local.x, top: local.y - 46 }}>\r\n <button\r\n type=\"button\"\r\n className={css.selectionButton}\r\n onClick={() => {\r\n void props.bringToMain(local.text).then((ok) => {\r\n if (!ok) props.store.patch({ error: props.t('insert.failed') })\r\n else setLocal(null)\r\n })\r\n }}\r\n >\r\n {props.t('insert.direct')}\r\n </button>\r\n <button type=\"button\" className={css.selectionButton} disabled={summarizing} onClick={() => { void summarize() }}>\r\n {summarizing ? props.t('insert.summarizing') : props.t('insert.summarize')}\r\n </button>\r\n </div>\r\n )\r\n}\r\n\r\n/**\r\n * Floating entry shown while the panel is closed and the main conversation has\r\n * a pending question dialog. It anchors beside the dialog's header (without\r\n * covering its text) and disappears once clicked (the panel opens instead).\r\n */\r\nfunction QuestionFab(props: {\r\n store: SidechatStore\r\n t: (key: SidechatLocaleKey) => string\r\n onOpen: () => void\r\n}) {\r\n const [pos, setPos] = useState<{ left: number; top: number } | null>(null)\r\n\r\n useEffect(() => {\r\n let raf = 0\r\n let missing = 0\r\n const tick = (): void => {\r\n const el = document.querySelector<HTMLElement>('[data-question-key], [data-approval-key]')\r\n if (el === null) {\r\n missing += 1\r\n // A brief grace period covers the initial render; if the dialog stays\r\n // absent, clear the tracked question so this entry disappears too.\r\n if (missing > 30) {\r\n props.store.setMainQuestion(null)\r\n return\r\n }\r\n setPos(null)\r\n raf = requestAnimationFrame(tick)\r\n return\r\n }\r\n missing = 0\r\n // The dialog's header (its title/eyebrow block) is the anchor. Newer DSH\r\n // wraps it as `section > header` inside the data-question frame, so locate\r\n // the `header` tag generically (older builds had it as the first child).\r\n const header = el.querySelector<HTMLElement>('header') ?? (el.firstElementChild as HTMLElement | null) ?? el\r\n const rect = header.getBoundingClientRect()\r\n const size = 32\r\n const left = Math.min(rect.right + 8, window.innerWidth - size - 8)\r\n const top = rect.top + rect.height / 2\r\n setPos({ left, top })\r\n raf = requestAnimationFrame(tick)\r\n }\r\n tick()\r\n return () => { cancelAnimationFrame(raf) }\r\n }, [props.store])\r\n\r\n const style: CSSProperties = pos !== null\r\n ? { left: pos.left, top: pos.top, transform: 'translateY(-50%)' }\r\n : { left: '50%', bottom: 160, transform: 'translateX(-50%)' }\r\n\r\n return (\r\n <Tooltip label={props.t('question.openHint')} side=\"top\">\r\n <button\r\n type=\"button\"\r\n className={css.questionFab}\r\n style={style}\r\n aria-label={props.t('question.openHint')}\r\n onClick={props.onOpen}\r\n >\r\n <IconPanelLeftOutline16 size={16} />\r\n <span className={css.questionFabDot} />\r\n </button>\r\n </Tooltip>\r\n )\r\n}\r\n\r\n/** Panel width bounds. The panel never takes more than ~40% of the window and\r\n * never squeezes the main chat below a usable minimum — so the panel adapts to\r\n * whatever resolution / zoom the browser window is at. */\r\nconst PANEL_MIN_WIDTH = 280\r\nconst PANEL_MAX_WIDTH = 720\r\nconst PANEL_DEFAULT_WIDTH = 360\r\nconst MAIN_CHAT_MIN_WIDTH = 480\r\n/** localStorage key remembering the last panel width across reloads. */\r\nconst PANEL_WIDTH_KEY = 'dsh-side-chat.panelWidth'\r\n\r\n/** The viewport-aware maximum panel width for the current window. */\r\nfunction panelCap(): number {\r\n const vw = window.innerWidth\r\n return Math.max(PANEL_MIN_WIDTH, Math.min(PANEL_MAX_WIDTH, vw * 0.4, vw - MAIN_CHAT_MIN_WIDTH))\r\n}\r\n\r\n/** The last user-chosen width, if any (re-clamped to the viewport on load). */\r\nfunction savedPanelWidth(): number | null {\r\n try {\r\n const raw = window.localStorage.getItem(PANEL_WIDTH_KEY)\r\n if (raw === null) return null\r\n const n = Number(raw)\r\n return Number.isFinite(n) && n > 0 ? n : null\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\n/** The side-chat panel body. */\r\nfunction SidechatPanel(props: {\r\n store: SidechatStore\r\n t: (key: SidechatLocaleKey) => string\r\n formatDuration: (ms: number) => string\r\n bringToMain: (text: string) => Promise<boolean>\r\n summarizeBring: (text: string) => Promise<boolean>\r\n askSidechat: (text: string) => Promise<boolean>\r\n askSidechatNew: (text: string) => Promise<boolean>\r\n}) {\r\n const { panel, mainQuestion, dismissedQuestionIds } = useSyncExternalStore(props.store.subscribe, props.store.getSnapshot)\r\n const scrollRef = useRef<HTMLDivElement | null>(null)\r\n const markdownLabels = useMemo(() => ({\r\n code: { copyLabel: props.t('panel.copy'), copiedLabel: props.t('panel.copied') },\r\n footnotes: props.t('panel.footnotes'),\r\n }), [props.t])\r\n const attachmentRailLabels = useMemo(() => ({\r\n group: props.t('image.railGroup'),\r\n open: props.t('image.railOpen'),\r\n scrollLeft: props.t('image.railScrollLeft'),\r\n scrollRight: props.t('image.railScrollRight'),\r\n }), [props.t])\r\n const messageImageLabels = useMemo(() => ({\r\n image: props.t('image.label'),\r\n open: props.t('image.open'),\r\n openNamed: (name: string): string => name,\r\n loading: props.t('image.loading'),\r\n loadFailed: props.t('image.loadFailed'),\r\n lightbox: { dialog: props.t('image.lightboxDialog'), close: props.t('image.close') },\r\n }), [props.t])\r\n const dropOverlayLabels = useMemo(() => ({\r\n title: props.t('image.dropTitle'),\r\n desc: props.t('image.dropDesc'),\r\n }), [props.t])\r\n // Width starts at the user's last choice when it fits the current window,\r\n // otherwise adapts to the viewport (small screens get a smaller default).\r\n const [width, setWidth] = useState(() => {\r\n const base = savedPanelWidth() ?? PANEL_DEFAULT_WIDTH\r\n return Math.max(PANEL_MIN_WIDTH, Math.min(panelCap(), base))\r\n })\r\n const [collapsed, setCollapsed] = useState(false)\r\n const [now, setNow] = useState(() => Date.now())\r\n const [dragActive, setDragActive] = useState(false)\r\n const [lightbox, setLightbox] = useState<ComposerAttachment | null>(null)\r\n const [limits, setLimits] = useState<{ mediaTypes: string[]; maxImageBytes: number; maxImagesPerMessage: number; maxMessageImageBytes: number } | null>(null)\r\n /** Index of the assistant message whose \"summarize then insert\" is in flight. */\r\n const [summarizingIndex, setSummarizingIndex] = useState<number | null>(null)\r\n /** Which question-dialog item is being brought into the side chat ('all' or an option label). */\r\n const [bringingKey, setBringingKey] = useState<string | null>(null)\r\n /** Whether the question-dialog list is collapsed (headers only). */\r\n const [questionCollapsed, setQuestionCollapsed] = useState(false)\r\n\r\n // Auto-expand the panel whenever a side chat is started or activated, so\r\n // starting from a collapsed panel still reveals the conversation.\r\n useEffect(() => {\r\n if (panel.open && panel.activeChildId !== null) setCollapsed(false)\r\n }, [panel.open, panel.activeChildId])\r\n\r\n // Open (and expand) the panel to show the pending question dialog.\r\n const openQuestionPanel = useCallback(() => {\r\n props.store.openPanel(panel.parentSessionId)\r\n setCollapsed(false)\r\n }, [props.store, panel.parentSessionId])\r\n\r\n /** Assemble one question + all its options into a prompt. */\r\n const buildAllText = (q: SideQuestionItem): string => {\r\n const lines: string[] = []\r\n if (q.header !== undefined && q.header !== '') lines.push(`【${q.header}】`)\r\n lines.push(q.question)\r\n if (q.detail !== undefined && q.detail !== '') lines.push(q.detail)\r\n const options = q.options ?? []\r\n if (options.length > 0) {\r\n lines.push(props.t('question.options'))\r\n for (const o of options) {\r\n lines.push(`- ${o.label}${o.description !== undefined && o.description !== '' ? ` — ${o.description}` : ''}`)\r\n }\r\n }\r\n lines.push(props.t('question.allPrompt'))\r\n return lines.join('\\n')\r\n }\r\n\r\n /** Assemble one question + one specific option into a prompt. */\r\n const buildOneText = (q: SideQuestionItem, o: SideQuestionOption): string => {\r\n const lines: string[] = []\r\n if (q.header !== undefined && q.header !== '') lines.push(`【${q.header}】`)\r\n lines.push(q.question)\r\n if (q.detail !== undefined && q.detail !== '') lines.push(q.detail)\r\n lines.push(`${props.t('question.option')}:${o.label}${o.description !== undefined && o.description !== '' ? ` — ${o.description}` : ''}`)\r\n lines.push(props.t('question.onePrompt'))\r\n return lines.join('\\n')\r\n }\r\n\r\n const bringQuestionText = (text: string, key: string, useNew: boolean): void => {\r\n setBringingKey(key)\r\n const fn = useNew ? props.askSidechatNew : props.askSidechat\r\n void fn(text).then((ok) => {\r\n setBringingKey(null)\r\n if (!ok) props.store.patch({ error: props.t('question.failed') })\r\n })\r\n }\r\n\r\n const activeItem = panel.items.find((i) => i.childId === panel.activeChildId)\r\n const activeRunning = activeItem?.running ?? false\r\n const [anchor, setAnchor] = useState<number | null>(null)\r\n\r\n useEffect(() => {\r\n const w = panel.open && !collapsed ? `${width}px` : '0px'\r\n document.documentElement.style.setProperty('--dsh-subchat-width', w)\r\n return () => { document.documentElement.style.setProperty('--dsh-subchat-width', '0px') }\r\n }, [panel.open, collapsed, width])\r\n\r\n // Re-adapt the panel width when the window is resized: if the viewport\r\n // shrinks (smaller window, different monitor, higher zoom), the panel is\r\n // clamped to the new cap and the layout margin follows via the effect above.\r\n useEffect(() => {\r\n const onResize = (): void => {\r\n setWidth((w) => Math.min(w, panelCap()))\r\n }\r\n window.addEventListener('resize', onResize)\r\n return () => { window.removeEventListener('resize', onResize) }\r\n }, [])\r\n\r\n // Remember the width across reloads; on the next load it is re-clamped to\r\n // whatever window is present then.\r\n useEffect(() => {\r\n try {\r\n window.localStorage.setItem(PANEL_WIDTH_KEY, String(width))\r\n } catch {\r\n // Storage unavailable (private mode etc.) — the width just won't persist.\r\n }\r\n }, [width])\r\n\r\n // Lazy-load the model/permission directory whenever the panel is open but the\r\n // directory has not hydrated yet (covers page reload + continue + direct open).\r\n useEffect(() => {\r\n if (panel.open && panel.directory === null) {\r\n void refreshDirectory(props.store)\r\n }\r\n }, [panel.open, panel.directory, props.store])\r\n\r\n useEffect(() => {\r\n if (activeRunning) {\r\n if (anchor === null) setAnchor(activeItem?.runningSince ?? Date.now())\r\n } else if (anchor !== null) {\r\n setAnchor(null)\r\n }\r\n }, [activeRunning, activeItem?.runningSince, anchor])\r\n\r\n useEffect(() => {\r\n if (!activeRunning) return\r\n const id = window.setInterval(() => { setNow(Date.now()) }, 1000)\r\n return () => { window.clearInterval(id) }\r\n }, [activeRunning])\r\n\r\n useEffect(() => {\r\n const el = scrollRef.current\r\n if (el !== null) el.scrollTop = el.scrollHeight\r\n }, [panel.messages.length, panel.activeChildId])\r\n\r\n useEffect(() => {\r\n if (!panel.open || panel.activeChildId === null) return\r\n const tick = (): void => {\r\n const snap = props.store.getSnapshot().panel\r\n const childId = snap.activeChildId\r\n if (childId === null) return\r\n void refreshList(props.store, snap.parentSessionId)\r\n void refreshHistory(props.store, childId)\r\n }\r\n tick()\r\n const id = window.setInterval(tick, 1200)\r\n return () => { window.clearInterval(id) }\r\n }, [panel.open, panel.activeChildId, props.store])\r\n\r\n const send = useCallback(() => {\r\n const draft = panel.draft.trim()\r\n const attachment = panel.attachment === null ? '' : panel.attachment\r\n const text = attachment === '' ? draft : (draft === '' ? attachment : `${attachment}\\n\\n${draft}`)\r\n void serializeImages(panel.attachments).then((imageParts) => {\r\n const content: PromptContentPart[] = [...imageParts, ...(text === '' ? [] : [{ type: 'text', text }] as PromptContentPart[])]\r\n if (content.length === 0) return\r\n const toRelease = panel.attachments\r\n props.store.patch({ draft: '', attachment: null, attachments: [] })\r\n toRelease.forEach(releaseDraftImage)\r\n\r\n if (panel.activeChildId === null) {\r\n void api.start({\r\n parentSessionId: panel.parentSessionId,\r\n content,\r\n lookupEnabled: panel.lookup,\r\n ...(panel.provider !== '' ? { provider: panel.provider } : {}),\r\n ...(panel.model !== '' ? { model: panel.model } : {}),\r\n ...(panel.effort !== '' ? { reasoningEffort: panel.effort } : {}),\r\n ...(panel.preset !== '' ? { preset: panel.preset } : {}),\r\n }).then((result) => {\r\n if (result.ok) {\r\n props.store.setActive(result.value.childId)\r\n props.store.patch({\r\n provider: result.value.provider,\r\n model: result.value.model,\r\n effort: result.value.reasoningEffort ?? '',\r\n })\r\n void refreshList(props.store, panel.parentSessionId)\r\n void refreshDirectory(props.store)\r\n } else {\r\n props.store.patch({ error: result.error.message })\r\n }\r\n })\r\n return\r\n }\r\n\r\n const childId = panel.activeChildId\r\n setItemRunning(props.store, childId, true)\r\n void api.followup({ childId, content, lookupEnabled: panel.lookup }).then((result) => {\r\n if (!result.ok) {\r\n setItemRunning(props.store, childId, false)\r\n props.store.patch({ error: result.error.message })\r\n }\r\n void refreshList(props.store, panel.parentSessionId)\r\n void refreshHistory(props.store, childId)\r\n })\r\n }).catch((error: unknown) => {\r\n props.store.patch({ error: error instanceof Error ? error.message : String(error) })\r\n })\r\n }, [panel, props.store])\r\n\r\n const stop = useCallback(() => {\r\n if (panel.activeChildId === null) return\r\n const childId = panel.activeChildId\r\n setItemRunning(props.store, childId, false)\r\n void api.stop({ childId }).then(() => {\r\n void refreshList(props.store, panel.parentSessionId)\r\n void refreshHistory(props.store, childId)\r\n })\r\n }, [panel, props.store])\r\n\r\n const onModelSelect = useCallback((provider: string, model: string, effort?: string) => {\r\n // Always update the panel selection; only a live child can receive the\r\n // selection immediately (staged mode applies it at creation instead).\r\n props.store.patch({ provider, model, effort: effort ?? '' })\r\n if (panel.activeChildId !== null) {\r\n void api.selectModel({ childId: panel.activeChildId, provider, model, ...(effort === undefined ? {} : { reasoningEffort: effort }) })\r\n }\r\n }, [panel.activeChildId, props.store])\r\n\r\n const onPresetChange = useCallback((value: string) => {\r\n if (value === 'custom' || value === '') return\r\n props.store.patch({ preset: value })\r\n if (panel.activeChildId !== null) {\r\n void api.selectPermission({ childId: panel.activeChildId, presetName: value }).then((result) => {\r\n if (!result.ok) props.store.patch({ error: result.error.message })\r\n })\r\n }\r\n }, [panel.activeChildId, props.store])\r\n\r\n const dispose = useCallback(() => {\r\n if (panel.activeChildId === null) return\r\n const childId = panel.activeChildId\r\n void api.dispose({ childId }).then(() => {\r\n void refreshList(props.store, panel.parentSessionId)\r\n props.store.patch({ activeChildId: null, messages: [] })\r\n })\r\n }, [panel, props.store])\r\n\r\n /** Delete one side chat from the list. */\r\n const disposeItem = useCallback((childId: string) => {\r\n void api.dispose({ childId }).then(() => {\r\n void refreshList(props.store, panel.parentSessionId)\r\n if (panel.activeChildId === childId) {\r\n props.store.patch({ activeChildId: null, messages: [] })\r\n }\r\n })\r\n }, [panel.activeChildId, panel.parentSessionId, props.store])\r\n\r\n /** Delete every side chat of this conversation at once. */\r\n const disposeAll = useCallback(() => {\r\n const ids = panel.items.map((i) => i.childId)\r\n if (ids.length === 0) return\r\n void Promise.all(ids.map((id) => api.dispose({ childId: id }))).then(() => {\r\n void refreshList(props.store, panel.parentSessionId)\r\n props.store.patch({ activeChildId: null, messages: [] })\r\n })\r\n }, [panel.items, panel.parentSessionId, props.store])\r\n\r\n const startResize = useCallback((e: ReactMouseEvent<HTMLDivElement>) => {\r\n e.preventDefault()\r\n const startX = e.clientX\r\n const startWidth = width\r\n const onMove = (ev: globalThis.MouseEvent): void => {\r\n setWidth(Math.max(PANEL_MIN_WIDTH, Math.min(panelCap(), startWidth + (startX - ev.clientX))))\r\n }\r\n const onUp = (): void => {\r\n window.removeEventListener('mousemove', onMove)\r\n window.removeEventListener('mouseup', onUp)\r\n }\r\n window.addEventListener('mousemove', onMove)\r\n window.addEventListener('mouseup', onUp)\r\n }, [width])\r\n\r\n const intakeImages = useCallback((files: File[]) => {\r\n if (files.length === 0) return\r\n const images = files.filter((f) => f.type.startsWith('image/'))\r\n if (images.length === 0) {\r\n props.store.patch({ error: props.t('image.unsupported') })\r\n return\r\n }\r\n try {\r\n if (limits !== null) {\r\n if (images.some((f) => !limits.mediaTypes.includes(f.type))) {\r\n props.store.patch({ error: props.t('image.unsupported') })\r\n return\r\n }\r\n if (panel.attachments.length + images.length > limits.maxImagesPerMessage) {\r\n props.store.patch({ error: props.t('image.tooMany') })\r\n return\r\n }\r\n if (images.some((f) => f.size > limits.maxImageBytes)) {\r\n props.store.patch({ error: props.t('image.fileTooLarge') })\r\n return\r\n }\r\n }\r\n const created = createDraftImages(images)\r\n props.store.patch({ attachments: [...panel.attachments, ...created], error: null })\r\n } catch (error) {\r\n props.store.patch({ error: error instanceof Error ? error.message : String(error) })\r\n }\r\n }, [limits, panel.attachments, props.store, props.t])\r\n\r\n // Load the deployment image policy once (fast-path checks mirror the host).\r\n useEffect(() => {\r\n void api.limits().then((result) => {\r\n if (result.ok) setLimits(result.value)\r\n })\r\n }, [])\r\n\r\n // Full-page file drag: track enter/leave depth and accept image drops.\r\n useEffect(() => {\r\n if (!panel.open || collapsed) return\r\n const dragDepth = { value: 0 }\r\n const hasFiles = (event: DragEvent): boolean => event.dataTransfer?.types.includes('Files') ?? false\r\n const reset = (): void => { dragDepth.value = 0; setDragActive(false) }\r\n const onDragEnter = (event: DragEvent): void => {\r\n if (!hasFiles(event)) return\r\n event.preventDefault()\r\n dragDepth.value += 1\r\n setDragActive(true)\r\n }\r\n const onDragOver = (event: DragEvent): void => {\r\n if (!hasFiles(event) || event.dataTransfer === null) return\r\n event.preventDefault()\r\n event.dataTransfer.dropEffect = 'copy'\r\n }\r\n const onDragLeave = (event: DragEvent): void => {\r\n if (!hasFiles(event)) return\r\n dragDepth.value = Math.max(0, dragDepth.value - 1)\r\n if (dragDepth.value === 0) setDragActive(false)\r\n }\r\n const onDrop = (event: DragEvent): void => {\r\n if (!hasFiles(event)) return\r\n event.preventDefault()\r\n reset()\r\n intakeImages([...event.dataTransfer?.files ?? []])\r\n }\r\n document.addEventListener('dragenter', onDragEnter)\r\n document.addEventListener('dragover', onDragOver)\r\n document.addEventListener('dragleave', onDragLeave)\r\n document.addEventListener('drop', onDrop)\r\n window.addEventListener('dragend', reset)\r\n return () => {\r\n document.removeEventListener('dragenter', onDragEnter)\r\n document.removeEventListener('dragover', onDragOver)\r\n document.removeEventListener('dragleave', onDragLeave)\r\n document.removeEventListener('drop', onDrop)\r\n window.removeEventListener('dragend', reset)\r\n }\r\n }, [panel.open, collapsed, intakeImages])\r\n\r\n const onPaste = useCallback((e: React.ClipboardEvent<HTMLTextAreaElement>) => {\r\n const files = Array.from(e.clipboardData.items).filter((item) => item.kind === 'file').map((item) => item.getAsFile()).filter((f): f is File => f !== null)\r\n if (files.length === 0) return\r\n e.preventDefault()\r\n intakeImages(files)\r\n }, [intakeImages])\r\n\r\n const removeImage = useCallback((id: string) => {\r\n const target = panel.attachments.find((a) => a.id === id)\r\n if (target !== undefined) releaseDraftImage(target)\r\n props.store.patch({ attachments: panel.attachments.filter((a) => a.id !== id) })\r\n }, [panel.attachments, props.store])\r\n\r\n // Load one durable image's bytes → object URL for history rendering.\r\n const imageLoader: ImageLoader = useCallback(async (ref) => {\r\n const result = await api.attachment({ childId: panel.activeChildId ?? '', attachmentId: ref.attachmentId })\r\n if (!result.ok) throw new Error(result.error.message)\r\n return base64ObjectUrl(result.value.mediaType, result.value.data)\r\n }, [panel.activeChildId])\r\n\r\n if (!panel.open) {\r\n // Panel closed but the main conversation has a pending question dialog:\r\n // show a floating entry anchored beside the dialog header.\r\n if (mainQuestion !== null) {\r\n return <QuestionFab store={props.store} t={props.t} onOpen={openQuestionPanel} />\r\n }\r\n return null\r\n }\r\n\r\n if (collapsed) {\r\n // Collapsed but a question dialog is pending: keep the floating entry so it\r\n // can still be opened from beside the dialog (not just the collapsed handle).\r\n if (mainQuestion !== null) {\r\n return <QuestionFab store={props.store} t={props.t} onOpen={openQuestionPanel} />\r\n }\r\n return (\r\n <Tooltip label={props.t('panel.expand')} side=\"bottom\">\r\n <button type=\"button\" className={css.collapsedHandle} onClick={() => { setCollapsed(false) }}>\r\n <IconPanelLeftOutline16 size={16} />\r\n </button>\r\n </Tooltip>\r\n )\r\n }\r\n\r\n const elapsedMs = anchor === null ? 0 : Math.max(0, now - anchor)\r\n const showClock = elapsedMs >= 15000\r\n\r\n return (\r\n <div className={css.panel} style={{ width }}>\r\n <div className={css.panelResize} onMouseDown={startResize} />\r\n <div className={css.panelHeader}>\r\n <span className={css.panelTitle}>{props.t('panel.title')}</span>\r\n <div className={css.panelHeaderActions}>\r\n <Tooltip label={props.t('panel.collapse')} side=\"bottom\">\r\n <button type=\"button\" className={css.panelIconButton} onClick={() => { setCollapsed(true) }}>\r\n <IconPanelLeftOutline16 size={16} />\r\n </button>\r\n </Tooltip>\r\n </div>\r\n </div>\r\n\r\n {mainQuestion !== null && (() => {\r\n const visible = mainQuestion.filter((q) => !dismissedQuestionIds.includes(q.id))\r\n if (visible.length === 0) return null\r\n return (\r\n <div className={css.questionBlock}>\r\n <div className={css.questionBlockActions}>\r\n <button\r\n type=\"button\"\r\n className={css.questionToggle}\r\n onClick={() => { setQuestionCollapsed(!questionCollapsed) }}\r\n >\r\n {questionCollapsed ? props.t('question.expand') : props.t('question.collapse')}\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={css.questionDeleteAll}\r\n onClick={() => { props.store.dismissAllQuestions(visible.map((q) => q.id)) }}\r\n >\r\n {props.t('question.deleteAll')}\r\n </button>\r\n </div>\r\n {visible.map((q) => {\r\n if (questionCollapsed) {\r\n return (\r\n <div key={q.id} className={`${css.questionItem} ${css.questionItemCollapsed}`}>\r\n <span className={css.questionHeaderText}>{q.header ?? q.question}</span>\r\n </div>\r\n )\r\n }\r\n const options = q.options ?? []\r\n return (\r\n <div key={q.id} className={css.questionItem}>\r\n <div className={css.questionHeader}>\r\n <span className={css.questionHeaderText}>{q.header ?? q.question}</span>\r\n <div className={css.questionHeaderActions}>\r\n <button\r\n type=\"button\"\r\n className={css.questionBringButton}\r\n disabled={bringingKey !== null}\r\n onClick={() => { bringQuestionText(buildAllText(q), `newall:${q.id}`, true) }}\r\n >\r\n {bringingKey === `newall:${q.id}` ? props.t('question.bringing') : props.t('question.bringAllNew')}\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={css.questionBringButton}\r\n disabled={bringingKey !== null}\r\n onClick={() => { bringQuestionText(buildAllText(q), `all:${q.id}`, false) }}\r\n >\r\n {bringingKey === `all:${q.id}` ? props.t('question.bringing') : props.t('question.bringAll')}\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={css.questionDelete}\r\n aria-label={props.t('question.delete')}\r\n title={props.t('question.delete')}\r\n onClick={() => { props.store.dismissQuestion(q.id) }}\r\n >\r\n ×\r\n </button>\r\n </div>\r\n </div>\r\n <div className={css.questionBody}>{q.question}</div>\r\n {q.detail !== undefined && q.detail !== '' && <div className={css.questionDetail}>{q.detail}</div>}\r\n {options.map((o) => {\r\n const key = `${q.id}:${o.label}`\r\n return (\r\n <div key={o.label} className={css.questionOption}>\r\n <span className={css.questionOptionText}>\r\n <span className={css.questionOptionLabel}>{o.label}</span>\r\n {o.description !== undefined && o.description !== '' && <span className={css.questionOptionDesc}> — {o.description}</span>}\r\n </span>\r\n <button\r\n type=\"button\"\r\n className={css.questionBringButton}\r\n disabled={bringingKey !== null}\r\n onClick={() => { bringQuestionText(buildOneText(q, o), `new:${key}`, true) }}\r\n >\r\n {bringingKey === `new:${key}` ? props.t('question.bringing') : props.t('question.bringOneNew')}\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={css.questionBringButton}\r\n disabled={bringingKey !== null}\r\n onClick={() => { bringQuestionText(buildOneText(q, o), key, false) }}\r\n >\r\n {bringingKey === key ? props.t('question.bringing') : props.t('question.bringOne')}\r\n </button>\r\n </div>\r\n )\r\n })}\r\n </div>\r\n )\r\n })}\r\n </div>\r\n )\r\n })()}\r\n\r\n <div className={css.panelList}>\r\n {panel.items.length === 0\r\n ? <div className={css.panelEmpty}>{props.t('panel.empty')}</div>\r\n : (\r\n <>\r\n <div className={css.panelListActions}>\r\n <button type=\"button\" className={css.panelListDeleteAll} onClick={disposeAll}>\r\n {props.t('panel.deleteAll')}\r\n </button>\r\n </div>\r\n {panel.items.map((item) => (\r\n <div key={item.childId} className={css.panelListItemRow}>\r\n <button\r\n type=\"button\"\r\n className={`${css.panelListItem} ${item.childId === panel.activeChildId ? css.panelListItemActive : ''}`}\r\n onClick={() => { props.store.setActive(item.childId); void refreshHistory(props.store, item.childId) }}\r\n >\r\n <span className={css.panelListItemDot} data-running={item.running ? '1' : undefined} />\r\n <span className={css.panelListItemLabel}>{item.childId}</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={css.panelListItemRemove}\r\n aria-label={props.t('panel.delete')}\r\n title={props.t('panel.delete')}\r\n onClick={() => { disposeItem(item.childId) }}\r\n >\r\n ×\r\n </button>\r\n </div>\r\n ))}\r\n </>\r\n )}\r\n </div>\r\n\r\n <div className={css.panelTranscript} ref={scrollRef}>\r\n {panel.messages.map((message, index) => {\r\n const textBlocks = message.blocks.filter((b) => b.type === 'text')\r\n const imageBlocks = message.blocks.filter((b) => b.type === 'image')\r\n const reasoningBlocks = message.blocks.filter((b) => b.type === 'reasoning')\r\n const text = textBlocks.map((b) => (b.type === 'text' ? b.text : '')).join('\\n')\r\n const images = imageBlocks.map((b) => (b.type === 'image' ? { attachment: b.ref } : null)).filter((x): x is { attachment: SidechatImageRef } => x !== null)\r\n if (message.role === 'user') {\r\n return (\r\n <div key={index} className={css.messageUser}>\r\n {text !== '' && <span className={css.messageUserText}>{text}</span>}\r\n {images.length > 0 && (\r\n <ImageGallery images={images.map((image) => image.attachment)} load={imageLoader} align=\"end\" labels={messageImageLabels} />\r\n )}\r\n </div>\r\n )\r\n }\r\n return (\r\n <div key={index} className={css.messageAssistant} data-sidechat-role=\"assistant\">\r\n {reasoningBlocks.map((block, rIndex) => (\r\n <ReasoningRow key={rIndex} text={block.type === 'reasoning' ? block.text : ''} t={props.t} />\r\n ))}\r\n {text !== '' && <MarkdownText text={text} labels={markdownLabels} />}\r\n {text !== '' && (\r\n <div className={css.messageActions}>\r\n <button\r\n type=\"button\"\r\n className={css.messageInsertButton}\r\n onClick={() => {\r\n void props.bringToMain(text).then((ok) => {\r\n if (!ok) props.store.patch({ error: props.t('insert.failed') })\r\n })\r\n }}\r\n >\r\n {props.t('insert.direct')}\r\n </button>\r\n <button\r\n type=\"button\"\r\n className={css.messageInsertButton}\r\n disabled={summarizingIndex === index}\r\n onClick={() => {\r\n setSummarizingIndex(index)\r\n void props.summarizeBring(text).then((ok) => {\r\n setSummarizingIndex(null)\r\n if (!ok) props.store.patch({ error: props.t('insert.summarizeFailed') })\r\n })\r\n }}\r\n >\r\n {summarizingIndex === index ? props.t('insert.summarizing') : props.t('insert.summarize')}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n })}\r\n {activeRunning && (\r\n <div className={css.panelRunning} role=\"status\" aria-live=\"polite\">\r\n <span className={css.panelRunningDot} />\r\n <span>{props.t('panel.running')}</span>\r\n {showClock && <span className={css.panelRunningClock}>{props.formatDuration(elapsedMs)}</span>}\r\n </div>\r\n )}\r\n {panel.error !== null && <div className={css.panelError}>{props.t('panel.error')}: {panel.error}</div>}\r\n </div>\r\n\r\n <div className={css.panelComposer}>\r\n {panel.attachment !== null && (\r\n <div className={css.panelAttachment}>\r\n <span className={css.panelAttachmentText}>{panel.attachment}</span>\r\n <button type=\"button\" className={css.panelAttachmentRemove} onClick={() => { props.store.patch({ attachment: null }) }}>×</button>\r\n </div>\r\n )}\r\n {panel.attachments.length > 0 && (\r\n <div className={css.panelAttachmentRail}>\r\n <AttachmentRail\r\n items={panel.attachments.map((a) => ({ id: a.id, previewUrl: a.previewUrl, alt: a.file.name || props.t('image.label'), removeLabel: props.t('image.remove') }))}\r\n labels={attachmentRailLabels}\r\n onOpen={(item) => { const a = panel.attachments.find((x) => x.id === item.id); if (a !== undefined) setLightbox(a) }}\r\n onRemove={(item) => { removeImage(item.id) }}\r\n />\r\n </div>\r\n )}\r\n <textarea\r\n className={css.panelTextarea}\r\n placeholder={props.t('panel.input.placeholder')}\r\n value={panel.draft}\r\n onChange={(e) => { props.store.patch({ draft: e.target.value }) }}\r\n onPaste={onPaste}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter' && !e.shiftKey) {\r\n e.preventDefault()\r\n send()\r\n }\r\n }}\r\n />\r\n <div className={css.panelToolbar}>\r\n <ModelSelect\r\n directory={panel.directory}\r\n selection={{ provider: panel.provider, model: panel.model, effort: panel.effort }}\r\n onSelect={onModelSelect}\r\n t={props.t}\r\n />\r\n <PermissionSelect\r\n permissions={panel.permissions}\r\n preset={panel.preset}\r\n onSelect={onPresetChange}\r\n t={props.t}\r\n />\r\n <Tooltip label={activeRunning ? props.t('panel.stop') : props.t('panel.send')} side=\"top\" delayMs={500}>\r\n <button\r\n type=\"button\"\r\n className={css.primary}\r\n aria-label={activeRunning ? props.t('panel.stop') : props.t('panel.send')}\r\n onClick={activeRunning ? stop : send}\r\n >\r\n {activeRunning ? <IconStopFill16 size={16} /> : <IconSendOutline16 size={16} />}\r\n </button>\r\n </Tooltip>\r\n </div>\r\n\r\n <label className={css.panelLookup}>\r\n <input\r\n type=\"checkbox\"\r\n checked={panel.lookup}\r\n onChange={(e) => { props.store.patch({ lookup: e.target.checked }) }}\r\n />\r\n <span>{props.t('panel.lookup')}</span>\r\n </label>\r\n </div>\r\n\r\n <div className={css.panelFooter}>\r\n <button type=\"button\" className={css.panelDispose} onClick={dispose}>{props.t('panel.dispose')}</button>\r\n </div>\r\n\r\n {dragActive && <DropOverlay disabled={false} labels={dropOverlayLabels} />}\r\n {lightbox !== null && (\r\n <ImageLightbox\r\n src={lightbox.previewUrl}\r\n alt={lightbox.file.name || props.t('image.label')}\r\n labels={{ dialog: props.t('image.lightboxDialog'), close: props.t('image.close') }}\r\n onClose={() => { setLightbox(null) }}\r\n />\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\n/** The \"Side chat\" settings section (two switches + a prompt textarea). */\r\nfunction SettingsSection(props: { store: SidechatStore; t: (key: SidechatLocaleKey) => string }) {\r\n const { store, t } = props\r\n const { prefs } = useSyncExternalStore(store.subscribe, store.getSnapshot)\r\n const [promptDraft, setPromptDraft] = useState(prefs.defaultPrompt)\r\n\r\n // Keep the local textarea in sync with the persisted value.\r\n useEffect(() => { setPromptDraft(prefs.defaultPrompt) }, [prefs.defaultPrompt])\r\n\r\n const toggle = useCallback((patch: Partial<SubchatPrefs>) => {\r\n const previous = prefs\r\n const next = { ...previous, ...patch }\r\n store.setPrefs(next)\r\n void api.settingsUpdate(patch).then((result) => {\r\n if (!result.ok) store.setPrefs(previous)\r\n })\r\n }, [prefs, store])\r\n\r\n const commitPrompt = useCallback(() => {\r\n const value = promptDraft.trim()\r\n if (value !== prefs.defaultPrompt) toggle({ defaultPrompt: value })\r\n }, [promptDraft, prefs.defaultPrompt, toggle])\r\n\r\n return (\r\n <div className={css.settingsSection}>\r\n <label className={css.settingsRow}>\r\n <span className={css.settingsRowText}>\r\n <span className={css.settingsRowTitle}>{t('settings.lookupTitle')}</span>\r\n <span className={css.settingsRowDesc}>{t('settings.lookupDesc')}</span>\r\n </span>\r\n <input\r\n type=\"checkbox\"\r\n className={css.settingsToggle}\r\n checked={prefs.lookupDefault}\r\n aria-label={t('settings.lookupTitle')}\r\n onChange={(e) => { toggle({ lookupDefault: e.currentTarget.checked }) }}\r\n />\r\n </label>\r\n <label className={css.settingsRow}>\r\n <span className={css.settingsRowText}>\r\n <span className={css.settingsRowTitle}>{t('settings.sendImmediatelyTitle')}</span>\r\n <span className={css.settingsRowDesc}>{t('settings.sendImmediatelyDesc')}</span>\r\n </span>\r\n <input\r\n type=\"checkbox\"\r\n className={css.settingsToggle}\r\n checked={prefs.sendImmediately}\r\n aria-label={t('settings.sendImmediatelyTitle')}\r\n onChange={(e) => { toggle({ sendImmediately: e.currentTarget.checked }) }}\r\n />\r\n </label>\r\n <div className={css.settingsRow}>\r\n <span className={css.settingsRowText}>\r\n <span className={css.settingsRowTitle}>{t('settings.bringModeTitle')}</span>\r\n <span className={css.settingsRowDesc}>{t('settings.bringModeDesc')}</span>\r\n </span>\r\n </div>\r\n <div className={css.settingsBringMode}>\r\n <label className={`${css.settingsBringOption} ${prefs.bringMode === 'draft' ? css.settingsBringOptionActive : ''}`}>\r\n <input\r\n type=\"radio\"\r\n name=\"dsh-side-chat-bring-mode\"\r\n className={css.settingsToggle}\r\n checked={prefs.bringMode === 'draft'}\r\n onChange={() => { toggle({ bringMode: 'draft' }) }}\r\n />\r\n <span className={css.settingsRowText}>\r\n <span className={css.settingsRowTitle}>{t('settings.bringModeDraftTitle')}</span>\r\n <span className={css.settingsRowDesc}>{t('settings.bringModeDraftDesc')}</span>\r\n </span>\r\n </label>\r\n <label className={`${css.settingsBringOption} ${prefs.bringMode === 'context' ? css.settingsBringOptionActive : ''}`}>\r\n <input\r\n type=\"radio\"\r\n name=\"dsh-side-chat-bring-mode\"\r\n className={css.settingsToggle}\r\n checked={prefs.bringMode === 'context'}\r\n onChange={() => { toggle({ bringMode: 'context' }) }}\r\n />\r\n <span className={css.settingsRowText}>\r\n <span className={css.settingsRowTitle}>{t('settings.bringModeContextTitle')}</span>\r\n <span className={css.settingsRowDesc}>{t('settings.bringModeContextDesc')}</span>\r\n </span>\r\n </label>\r\n </div>\r\n <div className={css.settingsRow}>\r\n <span className={css.settingsRowText}>\r\n <span className={css.settingsRowTitle}>{t('settings.defaultPromptTitle')}</span>\r\n <span className={css.settingsRowDesc}>{t('settings.defaultPromptDesc')}</span>\r\n </span>\r\n </div>\r\n <textarea\r\n className={css.settingsPromptInput}\r\n value={promptDraft}\r\n placeholder={t('settings.defaultPromptPlaceholder')}\r\n aria-label={t('settings.defaultPromptTitle')}\r\n onChange={(e) => { setPromptDraft(e.currentTarget.value) }}\r\n onBlur={commitPrompt}\r\n />\r\n </div>\r\n )\r\n}\r\n\r\n/** Client plugin body. */\r\nexport function apply(ctx: Context): void {\r\n const store = createStore()\r\n\r\n // Localized copy follows the DSH locale (module-level mirror for callbacks).\r\n let activeLocale = ctx.locale.getSnapshot().active\r\n\r\n /** Append text to the main composer draft (draft bring mode). */\r\n const draftBring = (text: string): boolean => {\r\n const trimmed = text.trim()\r\n if (trimmed === '') return false\r\n const sessionId = ctx.sessions.list.getSnapshot().current\r\n if (sessionId === undefined) return false\r\n try {\r\n const actx = ctx.sessions.scope(sessionId)\r\n if (actx === undefined) return false\r\n const input = ctx.conversation.input.for(actx)\r\n const draft = input.state.getSnapshot().draft\r\n input.setDraft(draft === '' ? trimmed : `${draft}\\n\\n${trimmed}`)\r\n return true\r\n } catch {\r\n return false\r\n }\r\n }\r\n\r\n /** Inject text into the main conversation as a collapsed, source-tagged context row. */\r\n const injectBring = async (text: string, summary: string): Promise<boolean> => {\r\n const trimmed = text.trim()\r\n if (trimmed === '') return false\r\n const sessionId = ctx.sessions.list.getSnapshot().current\r\n if (sessionId === undefined) return false\r\n const result = await api.inject({ parentSessionId: sessionId, text: trimmed, summary })\r\n return result.ok\r\n }\r\n\r\n /** Land text in the main conversation per the configured bring mode. */\r\n const landText = async (text: string, summaryKey: SidechatLocaleKey): Promise<boolean> => {\r\n const mode = store.getSnapshot().prefs.bringMode\r\n if (mode === 'context') {\r\n return injectBring(text, translate(activeLocale, summaryKey))\r\n }\r\n return draftBring(text)\r\n }\r\n\r\n /** Bring a reply back directly (routed through the configured mode). */\r\n const bringToMain = (text: string): Promise<boolean> => landText(text, 'insert.contextSummary')\r\n\r\n /** Summarize text with the side chat's inherited model, then bring the summary back. */\r\n const summarizeBring = async (text: string): Promise<boolean> => {\r\n const trimmed = text.trim()\r\n if (trimmed === '') return false\r\n const snap = store.getSnapshot().panel\r\n if (snap.parentSessionId === '') return false\r\n const result = await api.summarize({\r\n parentSessionId: snap.parentSessionId,\r\n text: trimmed,\r\n ...(snap.provider !== '' ? { provider: snap.provider } : {}),\r\n ...(snap.model !== '' ? { model: snap.model } : {}),\r\n ...(snap.effort !== '' ? { reasoningEffort: snap.effort } : {}),\r\n locale: activeLocale,\r\n })\r\n if (!result.ok) return false\r\n return landText(result.value.summary, 'insert.summarizeContextSummary')\r\n }\r\n\r\n /** Ask a piece of text in the side chat (start a new one, or continue the active one). */\r\n const askSidechat = async (text: string): Promise<boolean> => {\r\n const trimmed = text.trim()\r\n if (trimmed === '') return false\r\n const parentSessionId = ctx.sessions.list.getSnapshot().current\r\n if (parentSessionId === undefined) return false\r\n const panel = store.getSnapshot().panel\r\n const content: PromptContentPart[] = [{ type: 'text', text: trimmed }]\r\n\r\n // Reuse the active side chat, else the first existing one, else create one —\r\n // so bringing dialog questions in doesn't pile up a new side chat per ask.\r\n const target = panel.activeChildId ?? panel.items[0]?.childId ?? null\r\n\r\n if (target === null) {\r\n const result = await api.start({\r\n parentSessionId,\r\n content,\r\n lookupEnabled: panel.lookup,\r\n ...(panel.provider !== '' ? { provider: panel.provider } : {}),\r\n ...(panel.model !== '' ? { model: panel.model } : {}),\r\n ...(panel.effort !== '' ? { reasoningEffort: panel.effort } : {}),\r\n })\r\n if (result.ok) {\r\n store.openPanel(parentSessionId)\r\n store.setActive(result.value.childId)\r\n store.patch({ provider: result.value.provider, model: result.value.model, effort: result.value.reasoningEffort ?? '' })\r\n void refreshList(store, parentSessionId)\r\n void refreshDirectory(store)\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n const childId = target\r\n if (childId !== panel.activeChildId) store.setActive(childId)\r\n setItemRunning(store, childId, true)\r\n const result = await api.followup({ childId, content, lookupEnabled: panel.lookup })\r\n if (!result.ok) {\r\n setItemRunning(store, childId, false)\r\n store.patch({ error: result.error.message })\r\n }\r\n void refreshList(store, parentSessionId)\r\n void refreshHistory(store, childId)\r\n return result.ok\r\n }\r\n\r\n /** Ask a piece of text in a brand-new side chat (never reuses an existing one). */\r\n const askSidechatNew = async (text: string): Promise<boolean> => {\r\n const trimmed = text.trim()\r\n if (trimmed === '') return false\r\n const parentSessionId = ctx.sessions.list.getSnapshot().current\r\n if (parentSessionId === undefined) return false\r\n const panel = store.getSnapshot().panel\r\n const content: PromptContentPart[] = [{ type: 'text', text: trimmed }]\r\n const result = await api.start({\r\n parentSessionId,\r\n content,\r\n lookupEnabled: panel.lookup,\r\n ...(panel.provider !== '' ? { provider: panel.provider } : {}),\r\n ...(panel.model !== '' ? { model: panel.model } : {}),\r\n ...(panel.effort !== '' ? { reasoningEffort: panel.effort } : {}),\r\n })\r\n if (result.ok) {\r\n store.openPanel(parentSessionId)\r\n store.setActive(result.value.childId)\r\n store.patch({ provider: result.value.provider, model: result.value.model, effort: result.value.reasoningEffort ?? '' })\r\n void refreshList(store, parentSessionId)\r\n void refreshDirectory(store)\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n ctx.effect(() => {\r\n const offZh = ctx.locale.register(LOCALE_NS, 'zh', zh)\r\n const offEn = ctx.locale.register(LOCALE_NS, 'en', en)\r\n const offSub = ctx.locale.subscribe(() => {\r\n activeLocale = ctx.locale.getSnapshot().active\r\n store.patch({})\r\n })\r\n return () => { offZh(); offEn(); offSub() }\r\n }, 'dsh-side-chat: dictionaries')\r\n\r\n // Load the persisted preferences once.\r\n void api.settingsGet().then((result) => {\r\n if (!result.ok) return\r\n const raw = result.value.value as Partial<SubchatPrefs> | null | undefined\r\n if (raw === null || raw === undefined) return\r\n store.setPrefs({\r\n lookupDefault: typeof raw.lookupDefault === 'boolean' ? raw.lookupDefault : SUBCHAT_PREFS_DEFAULTS.lookupDefault,\r\n sendImmediately: typeof raw.sendImmediately === 'boolean' ? raw.sendImmediately : SUBCHAT_PREFS_DEFAULTS.sendImmediately,\r\n defaultPrompt: typeof raw.defaultPrompt === 'string' ? raw.defaultPrompt : SUBCHAT_PREFS_DEFAULTS.defaultPrompt,\r\n bringMode: raw.bringMode === 'context' ? 'context' : 'draft',\r\n })\r\n })\r\n\r\n // Track the current conversation (per-conversation panel state).\r\n ctx.effect(() => {\r\n let lastId: string | undefined\r\n const sync = (): void => {\r\n const next = ctx.sessions.list.getSnapshot().current\r\n if (next === lastId) return\r\n lastId = next\r\n store.setCurrent(next)\r\n if (next === undefined) return\r\n void refreshList(store, next)\r\n const panel = store.getSnapshot().panel\r\n if (panel.open && panel.activeChildId !== null) {\r\n void refreshHistory(store, panel.activeChildId)\r\n }\r\n }\r\n sync()\r\n return ctx.sessions.list.subscribe(sync)\r\n }, 'dsh-side-chat: follow current conversation')\r\n\r\n // Track the main conversation's pending user-question dialog so the panel can\r\n // list its questions/options with per-item bring-back buttons. DSH surfaces\r\n // the pending interaction through the `uiSession.pendingInteractions` service\r\n // (a per-session interaction), so we read it there instead of a session\r\n // snapshot. Only re-publishes when the question object identity changes.\r\n ctx.effect(() => {\r\n let lastQuestion: unknown = undefined\r\n const read = (): void => {\r\n const sessionId = ctx.sessions.list.getSnapshot().current\r\n if (sessionId === undefined) {\r\n store.setMainQuestion(null)\r\n return\r\n }\r\n const interaction = ctx.uiSession.pendingInteractions.getSnapshot().get(sessionId)\r\n const isQuestion = interaction !== undefined && (interaction.kind === 'question' || interaction.kind === 'plan-review')\r\n const question = isQuestion ? interaction : undefined\r\n if (question === lastQuestion) return\r\n lastQuestion = question\r\n const questions = question?.questions ?? null\r\n store.setMainQuestion(questions === null ? null : [...questions])\r\n }\r\n read()\r\n const offPending = ctx.uiSession.pendingInteractions.subscribe(read)\r\n const offList = ctx.sessions.list.subscribe(read)\r\n return () => { offPending(); offList() }\r\n }, 'dsh-side-chat: track main question dialog')\r\n\r\n // Safety net: once the main conversation no longer has a pending question\r\n // dialog, clear the tracked question so the side-panel list disappears too\r\n // (covers cases where the subscription misses the settlement edge).\r\n ctx.effect(() => {\r\n const timer = window.setInterval(() => {\r\n if (store.getSnapshot().mainQuestion === null) return\r\n const sessionId = ctx.sessions.list.getSnapshot().current\r\n if (sessionId === undefined) return\r\n const interaction = ctx.uiSession.pendingInteractions.getSnapshot().get(sessionId)\r\n const hasQuestion = interaction !== undefined && (interaction.kind === 'question' || interaction.kind === 'plan-review')\r\n if (!hasQuestion) store.setMainQuestion(null)\r\n }, 1200)\r\n return () => { window.clearInterval(timer) }\r\n }, 'dsh-side-chat: clear stale question dialog')\r\n\r\n // The \"Side chat\" settings section.\r\n const settingsT = (key: SidechatLocaleKey): string => translate(activeLocale, key)\r\n ctx.slots.inject('settings.section', () => ctx.slots.register({\r\n name: 'settings.section',\r\n id: 'dsh-side-chat',\r\n order: 110,\r\n label: () => settingsT('settingsNav'),\r\n inject: () => ({ store, t: settingsT }),\r\n }, SettingsSection))\r\n\r\n // Mount the portalled tree onto document.body.\r\n ctx.effect(() => {\r\n const host = document.createElement('div')\r\n host.setAttribute('data-dsh-side-chat', '')\r\n document.body.appendChild(host)\r\n const root = createRoot(host)\r\n\r\n const t = (key: SidechatLocaleKey): string => translate(activeLocale, key)\r\n const formatDuration = (ms: number): string => formatRunDuration(ms, activeLocale)\r\n root.render(<>\r\n <SelectionMenu store={store} t={t} />\r\n <BringBackMenu store={store} t={t} bringToMain={bringToMain} summarizeBring={summarizeBring} />\r\n <SidechatPanel store={store} t={t} formatDuration={formatDuration} bringToMain={bringToMain} summarizeBring={summarizeBring} askSidechat={askSidechat} askSidechatNew={askSidechatNew} />\r\n </>)\r\n\r\n return () => {\r\n root.unmount()\r\n host.remove()\r\n }\r\n }, 'dsh-side-chat: panel mount')\r\n}\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client-registry.js","names":["useRef","useState","useCallback","css","IconChevronLeftOutline14","IconCloseFill14","IconChevronRightOutline14","createPortal","css","useRef","createPortal","css","IconCloseOutline16","useState","useCallback","useMemo","css","useState","DisclosureRow","IconThinkOutline14","css","useRef","IconChevronDownOutline14","IconChevronRightOutline14","IconCheckOutline16","Menu","useSyncExternalStore","useCallback","Tooltip","IconPanelLeftOutline16","useMemo","MarkdownText","IconStopFill16","IconSendOutline16","createRoot"],"sources":["../../../src/client/attachments/AttachmentRail.tsx","../../../src/client/attachments/DropOverlay.tsx","../../../src/client/attachments/ImageLightbox.tsx","../../../src/client/attachments/MessageImage.tsx","../../../src/client/api.ts","../../../src/client/locales.ts","../../../src/settings-shared.ts","../../../src/client/index.tsx"],"sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport {\n IconChevronLeftOutline14,\n IconChevronRightOutline14,\n IconCloseFill14,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport css from './AttachmentRail.module.css'\n\n/** One rail thumbnail; strings arrive resolved (zero-cordis atom). */\nexport interface AttachmentRailItem {\n /** Stable identity for the React key. */\n id: string\n /** Object or data URL rendered as the thumbnail. */\n previewUrl: string\n /** Image alt text (display name with the owner's fallback applied). */\n alt: string\n /** Accessible label of the item's remove control. */\n removeLabel: string\n}\n\n/** Rail-level strings the owner resolves from its own locale namespace. */\nexport interface AttachmentRailLabels {\n /** Accessible name of the rail group. */\n group: string\n /** Thumbnail tooltip inviting the original-image preview. */\n open: string\n /** Accessible label of the left paging arrow. */\n scrollLeft: string\n /** Accessible label of the right paging arrow. */\n scrollRight: string\n}\n\n/** Approximate pixels per wheel step for `deltaMode` LINE deltas (Firefox notch wheels report lines). */\nconst WHEEL_LINE_PX = 16\n\n/** Smooth paging unless the user asked for reduced motion. */\nfunction pageBehavior(): ScrollBehavior {\n return window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ? 'auto' : 'smooth'\n}\n\n/**\n * Horizontal thumbnail rail over the caller's draft attachments.\n *\n * The rail scrolls with its scrollbar hidden; overflow is announced by edge\n * arrows recomputed from scroll geometry on scroll, item-count changes, and\n * rail size changes (a ResizeObserver on the rail element, so sidebar or panel\n * resizes count, not only window resizes). A vertical wheel pans the rail\n * horizontally and is consumed exclusively, a newly added item is revealed at\n * the rail's end, and each thumbnail opens on a single click while its remove\n * control sits inside the card. The owner decides mounting.\n */\nexport function AttachmentRail<T extends AttachmentRailItem>({ items, labels, onOpen, onRemove }: {\n items: readonly T[]\n labels: AttachmentRailLabels\n onOpen: (item: T) => void\n onRemove: (item: T) => void\n}) {\n const railRef = useRef<HTMLDivElement | null>(null)\n // null marks the first layout pass: a rail that MOUNTS over an existing\n // draft is initial display, not growth, and must not jump to the end.\n const countRef = useRef<number | null>(null)\n const [edges, setEdges] = useState({ left: false, right: false })\n const updateEdges = useCallback(() => {\n const el = railRef.current\n if (el === null) return\n // 1px slack: engines report fractional scroll positions at the edges.\n const left = el.scrollLeft > 1\n const right = el.scrollLeft < el.scrollWidth - el.clientWidth - 1\n setEdges(prev => prev.left === left && prev.right === right ? prev : { left, right })\n }, [])\n useLayoutEffect(() => {\n const grew = countRef.current !== null && items.length > countRef.current\n countRef.current = items.length\n const el = railRef.current\n if (el === null) return\n // A newly added attachment lands at the rail's end: reveal it.\n if (grew) el.scrollLeft = el.scrollWidth - el.clientWidth\n updateEdges()\n }, [items.length, updateEdges])\n useEffect(() => {\n const el = railRef.current\n if (el === null) return\n // The rail's width follows the composer, which resizes with sidebars and\n // panels, not only the window — observe the element itself.\n let disconnect = (): void => {}\n if (typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver(updateEdges)\n observer.observe(el)\n disconnect = () => { observer.disconnect() }\n }\n // The rail scrolls horizontally ONLY: any wheel tick with a vertical\n // component is consumed — without preventDefault it would also scroll the\n // conversation behind the composer, and React's root wheel listener is\n // passive, so the exclusion needs this manually attached non-passive\n // listener.\n const onWheel = (event: globalThis.WheelEvent): void => {\n if (event.deltaY === 0) return\n const scale = event.deltaMode === WheelEvent.DOM_DELTA_LINE\n ? WHEEL_LINE_PX\n : event.deltaMode === WheelEvent.DOM_DELTA_PAGE ? el.clientWidth : 1\n event.preventDefault()\n el.scrollBy({\n left: event.deltaX !== 0\n ? event.deltaX * scale\n : Math.sign(event.deltaY) * Math.min(Math.abs(event.deltaY) * scale, 60),\n behavior: 'auto',\n })\n }\n el.addEventListener('wheel', onWheel, { passive: false })\n return () => {\n disconnect()\n el.removeEventListener('wheel', onWheel)\n }\n }, [updateEdges])\n const page = (direction: -1 | 1): void => {\n const el = railRef.current\n if (el === null) return\n // One viewport minus a card keeps the last visible thumbnail as context.\n el.scrollBy({ left: direction * Math.max(el.clientWidth - 64, 200), behavior: pageBehavior() })\n }\n return (\n <div className={css.root}>\n {edges.left && (\n <button\n type=\"button\"\n className={`${css.arrow} ${css.arrowLeft}`}\n aria-label={labels.scrollLeft}\n onClick={() => { page(-1) }}\n >\n <IconChevronLeftOutline14 />\n </button>\n )}\n <div\n ref={railRef}\n className={css.rail}\n role=\"group\"\n aria-label={labels.group}\n onScroll={updateEdges}\n >\n {items.map(item => (\n <div key={item.id} className={css.item}>\n <button\n type=\"button\"\n className={css.thumbnail}\n title={labels.open}\n onClick={() => { onOpen(item) }}\n >\n <img src={item.previewUrl} alt={item.alt} />\n </button>\n <button\n type=\"button\"\n className={css.remove}\n aria-label={item.removeLabel}\n onClick={() => { onRemove(item) }}\n >\n <IconCloseFill14 size={12} />\n </button>\n </div>\n ))}\n </div>\n {edges.right && (\n <button\n type=\"button\"\n className={`${css.arrow} ${css.arrowRight}`}\n aria-label={labels.scrollRight}\n onClick={() => { page(1) }}\n >\n <IconChevronRightOutline14 />\n </button>\n )}\n </div>\n )\n}\n","import { createPortal } from 'react-dom'\nimport css from './DropOverlay.module.css'\n\n/** Drop-overlay strings the owner resolves from its own locale namespace. */\nexport interface DropOverlayLabels {\n /** Headline inviting the drop, or naming why it is unavailable. */\n title: string\n /** Limits line under the title; shown only while drops are accepted. */\n desc?: string | undefined\n}\n\n/**\n * Full-viewport invitation shown while a file drag is over the page.\n * Decoration only: `pointer-events: none` keeps drag targeting on the page\n * below, so the owner's document-level listeners keep an accurate enter/leave\n * count and own accept/reject. Rendered through a body portal for the same\n * transformed-ancestor reason as the lightbox.\n */\nexport function DropOverlay({ disabled, labels }: {\n disabled: boolean\n labels: DropOverlayLabels\n}) {\n return createPortal(\n <div className={css.mask} role=\"status\">\n <div className={css.wrap}>\n <div className={css.illustration} aria-hidden=\"true\">\n {disabled ? <BlockedIllustration /> : <UploadIllustration />}\n </div>\n <div className={css.title}>{labels.title}</div>\n {!disabled && labels.desc !== undefined && <div className={css.desc}>{labels.desc}</div>}\n </div>\n </div>,\n document.body,\n )\n}\n\n/** Tilted photo-and-note cards. */\nconst UploadIllustration = () => (\n <svg width=\"96\" height=\"72\" viewBox=\"0 0 96 72\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect y=\"14\" width=\"38\" height=\"38\" rx=\"10\" transform=\"rotate(-22 0 14)\" fill=\"#9ce5ed\" />\n <rect x=\"62\" y=\"7\" width=\"37\" height=\"43\" rx=\"8\" transform=\"rotate(17 62 7)\" fill=\"#679efe\" />\n <rect x=\"26\" y=\"30\" width=\"38\" height=\"38\" rx=\"10\" fill=\"#3964fe\" />\n <path\n d=\"M33 62c1-2 4-8 7-14 1-2 5-2 6 1 2 5 5 9 7 10 3 1 7-9 17 2\"\n stroke=\"#fff\"\n strokeWidth=\"3\"\n fill=\"none\"\n />\n <circle cx=\"53\" cy=\"43\" r=\"4\" fill=\"#fff\" />\n </svg>\n)\n\n/** Greyed cards with a blocked badge. */\nconst BlockedIllustration = () => (\n <svg width=\"96\" height=\"72\" viewBox=\"0 0 96 72\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect y=\"14\" width=\"38\" height=\"38\" rx=\"10\" transform=\"rotate(-22 0 14)\" fill=\"#c4c9d0\" />\n <rect x=\"62\" y=\"7\" width=\"37\" height=\"43\" rx=\"8\" transform=\"rotate(17 62 7)\" fill=\"#b0b6be\" />\n <rect x=\"26\" y=\"30\" width=\"38\" height=\"38\" rx=\"10\" fill=\"#d8dce1\" />\n <circle cx=\"45\" cy=\"49\" r=\"12\" stroke=\"#fff\" strokeWidth=\"3\" fill=\"none\" />\n <path d=\"M36 40l18 18\" stroke=\"#fff\" strokeWidth=\"3\" strokeLinecap=\"round\" />\n </svg>\n)\n","import { useEffect, useRef } from 'react'\nimport { createPortal } from 'react-dom'\nimport { IconCloseOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport css from './ImageLightbox.module.css'\n\n/** Preview strings the owner resolves from its own locale namespace. */\nexport interface ImageLightboxLabels {\n /** Accessible name of the preview dialog. */\n dialog: string\n /** Accessible label of the close control. */\n close: string\n}\n\n/**\n * Document-level original-image preview opened by clicking a thumbnail.\n * Closes on Escape, backdrop press, or the close control, and restores focus\n * to the opener on unmount. Rendered through a body portal: an opener inside\n * a transformed or filtered ancestor would otherwise trap the fixed backdrop\n * in that ancestor's box instead of covering the viewport.\n */\nexport function ImageLightbox({ src, alt, labels, onClose }: {\n src: string\n alt: string\n labels: ImageLightboxLabels\n onClose: () => void\n}) {\n const closeRef = useRef<HTMLButtonElement | null>(null)\n const restoreRef = useRef<HTMLElement | null>(null)\n\n useEffect(() => {\n restoreRef.current = document.activeElement instanceof HTMLElement ? document.activeElement : null\n closeRef.current?.focus()\n const onKeyDown = (event: globalThis.KeyboardEvent): void => {\n if (event.key === 'Escape') onClose()\n }\n window.addEventListener('keydown', onKeyDown)\n return () => {\n window.removeEventListener('keydown', onKeyDown)\n restoreRef.current?.focus()\n }\n }, [onClose])\n\n return createPortal(\n <div\n className={css.backdrop}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={labels.dialog}\n >\n <div className={css.mask} aria-hidden=\"true\" onMouseDown={onClose} />\n <img className={css.image} src={src} alt={alt} />\n <button ref={closeRef} type=\"button\" className={css.close} aria-label={labels.close} onClick={onClose}>\n <IconCloseOutline16 size={16} />\n </button>\n </div>,\n document.body,\n )\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react'\nimport type { SidechatImageRef } from '../api.ts'\nimport { ImageLightbox } from './ImageLightbox.tsx'\nimport type { ImageLightboxLabels } from './ImageLightbox.tsx'\nimport css from './MessageImage.module.css'\n\n/** Loads one durable image's bytes into a displayable URL. */\nexport type ImageLoader = (ref: SidechatImageRef) => Promise<string>\n\n/** Message-image strings the owner resolves from its own locale namespace. */\nexport interface MessageImageLabels {\n /** Fallback display name for an unnamed image. */\n image: string\n /** Thumbnail tooltip inviting the original-image preview. */\n open: string\n /** Accessible thumbnail label; receives the image's display name. */\n openNamed: (label: string) => string\n /** Loading placeholder shown until bytes resolve. */\n loading: string\n /** Retry-control label shown when the load fails. */\n loadFailed: string\n /** Lightbox strings forwarded to the opened preview. */\n lightbox: ImageLightboxLabels\n}\n\n/** Display box for a lone image: long edge 240px with the rendered aspect\n * ratio clamped to [0.25, 4] — the overflow is cropped by\n * `object-fit: cover` — and never upscaled past the image's natural size. The\n * crop anchor keeps the top of very tall images and the left of very wide\n * ones, where the informative content usually starts. */\nfunction singleFit(\n dimensions: { readonly width: number; readonly height: number },\n): { width: number; height: number; objectPosition: string } {\n const natural = dimensions.width / dimensions.height\n const ratio = Math.min(4, Math.max(0.25, natural))\n const box = ratio >= 1 ? { width: 240, height: 240 / ratio } : { width: 240 * ratio, height: 240 }\n const scale = Math.min(1, dimensions.width / box.width, dimensions.height / box.height)\n return {\n width: Math.max(1, Math.round(box.width * scale)),\n height: Math.max(1, Math.round(box.height * scale)),\n objectPosition: natural < 0.25 ? 'center top' : natural > 4 ? 'left center' : 'center',\n }\n}\n\n/**\n * Compact history renderer with retryable loading and click-to-open original\n * preview. A lone image renders at its `singleFit` size; an image among\n * several renders as a fixed 64px square tile.\n */\nexport function MessageImage({ image, load, variant, labels }: {\n image: SidechatImageRef\n load: ImageLoader\n variant: 'single' | 'tile'\n labels: MessageImageLabels\n}) {\n const [loaded, setLoaded] = useState<string | null>(null)\n const [error, setError] = useState(false)\n const [open, setOpen] = useState(false)\n // Retry re-arms the one load effect below, so every attempt — first load or\n // retry — runs under the same liveness guard and the same reset.\n const [attempt, setAttempt] = useState(0)\n const request = useCallback(() => { setAttempt(a => a + 1) }, [])\n const close = useCallback(() => { setOpen(false) }, [])\n const label = image.name === undefined || image.name === '' ? labels.image : image.name\n const fit = useMemo(() => (variant === 'single' ? singleFit(image) : undefined), [image, variant])\n\n useEffect(() => {\n let live = true\n setError(false)\n setLoaded(null)\n void load(image).then((url) => { if (live) setLoaded(url) }).catch(() => { if (live) setError(true) })\n return () => { live = false }\n }, [image, load, attempt])\n\n if (error) return <button type=\"button\" className={css.error} data-variant={variant} onClick={request}>{labels.loadFailed}</button>\n const src = loaded\n return (\n <>\n <button\n type=\"button\"\n className={css.frame}\n data-variant={variant}\n style={fit === undefined ? undefined : { width: fit.width, height: fit.height }}\n title={labels.open}\n aria-label={labels.openNamed(label)}\n onClick={() => { if (src !== null) setOpen(true) }}\n >\n {src === null\n ? <span className={css.loading}>{labels.loading}</span>\n : <img src={src} alt={label} style={fit === undefined ? undefined : { objectPosition: fit.objectPosition }} />}\n </button>\n {open && src !== null && <ImageLightbox src={src} alt={label} labels={labels.lightbox} onClose={close} />}\n </>\n )\n}\n\n/** Wrapping image group: a lone image renders large, several render as 64px\n * square tiles. */\nexport function ImageGallery({ images, load, align, labels }: {\n images: readonly SidechatImageRef[]\n load: ImageLoader\n align: 'start' | 'end'\n labels: MessageImageLabels\n}) {\n if (images.length === 0) return null\n const variant = images.length === 1 ? 'single' : 'tile'\n return (\n <div className={css.gallery} data-align={align}>\n {images.map((image, index) => (\n <MessageImage\n key={`${image.attachmentId}:${index}`}\n image={image}\n load={load}\n variant={variant}\n labels={labels}\n />\n ))}\n </div>\n )\n}\n","/**\n * Client API client for the /sidechat JSON routes (same fetch pattern the\n * better-sidebar built-ins use). All requests are same-origin POSTs; the host\n * fence (loopback/trusted authority) passes them naturally.\n */\n\n/** One API failure envelope. */\nexport interface SidechatApiError {\n code: string\n message: string\n}\n\n/** The unwrapped success value of one API method. */\nexport type SidechatResult<T> = { ok: true; value: T } | { ok: false; error: SidechatApiError }\n\n/** Side-chat list row. */\nexport interface SidechatListItem {\n childId: string\n running: boolean\n runningSince?: number\n}\n\n/** Browser-submitted prompt content part (text or base64 image). */\nexport type PromptContentPart = { type: 'text'; text: string } | { type: 'image'; mediaType: string; data: string; name?: string }\n\n/** One durable image reference returned by the host transcript. */\nexport interface SidechatImageRef {\n attachmentId: string\n mediaType: string\n bytes: number\n width: number\n height: number\n name?: string\n}\n\n/** One transcript message block. */\nexport type SidechatMessageBlock = { type: 'text'; text: string } | { type: 'image'; ref: SidechatImageRef } | { type: 'reasoning'; text: string }\n\n/** One transcript message. */\nexport interface SidechatMessage {\n role: 'user' | 'assistant'\n blocks: SidechatMessageBlock[]\n}\n\n/** Model / effort directory (provider groups → models → reasoning efforts). */\nexport interface SidechatDirectory {\n groups: Array<{\n id: string\n name: string\n models: Array<{\n id: string\n name: string\n description?: string\n reasoning?: { efforts: Array<{ id: string; name: string }>; defaultEffort?: string }\n }>\n }>\n}\n\n/** Permission options. */\nexport interface SidechatPermissions {\n options: Array<{ value: string; name: string; description?: string }>\n current: string\n}\n\n/** Call one /sidechat/api method. */\nasync function call<T>(method: string, payload: Record<string, unknown>): Promise<SidechatResult<T>> {\n const res = await fetch(`/sidechat/api/${method}`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(payload),\n })\n return (await res.json()) as SidechatResult<T>\n}\n\nexport const api = {\n start: (args: { parentSessionId: string; content: PromptContentPart[]; lookupEnabled: boolean; provider?: string; model?: string; reasoningEffort?: string; preset?: string }) =>\n call<{ childId: string; provider: string; model: string; reasoningEffort?: string }>('sidechat.start', args),\n followup: (args: { childId: string; content: PromptContentPart[]; lookupEnabled: boolean }) =>\n call<{ accepted: true }>('sidechat.followup', args),\n list: (args: { parentSessionId: string }) =>\n call<{ items: SidechatListItem[] }>('sidechat.list', args),\n history: (args: { childId: string }) =>\n call<{ messages: SidechatMessage[] }>('sidechat.history', args),\n stop: (args: { childId: string }) =>\n call<{ accepted: true }>('sidechat.stop', args),\n selectModel: (args: { childId: string; provider: string; model: string; reasoningEffort?: string }) =>\n call<{ accepted: true }>('sidechat.selectModel', args),\n selectPermission: (args: { childId: string; presetName: string }) =>\n call<{ accepted: true }>('sidechat.selectPermission', args),\n summarize: (args: { parentSessionId: string; text: string; provider?: string; model?: string; reasoningEffort?: string; locale?: string }) =>\n call<{ summary: string }>('sidechat.summarize', args),\n inject: (args: { parentSessionId: string; text: string; summary?: string }) =>\n call<{ accepted: true }>('sidechat.inject', args),\n directory: () => call<SidechatDirectory>('sidechat.directory', {}),\n permissions: () => call<SidechatPermissions>('sidechat.permissions', {}),\n limits: () => call<{ mediaTypes: string[]; maxImageBytes: number; maxImagesPerMessage: number; maxMessageImageBytes: number; maxImagePixels: number }>('sidechat.limits', {}),\n attachment: (args: { childId: string; attachmentId: string }) =>\n call<{ mediaType: string; data: string }>('sidechat.attachment', args),\n inherit: (args: { parentSessionId: string }) =>\n call<{ provider: string; model: string; reasoningEffort?: string }>('sidechat.inherit', args),\n commands: (args: { childId: string }) =>\n call<{ commands: Array<{ name: string; description: string }> }>('sidechat.commands', args),\n command: (args: { childId: string; line: string }) =>\n call<{ executed: boolean }>('sidechat.command', args),\n state: (args: { childId: string }) =>\n call<{ plan: { active: boolean; pending: boolean }; goal: { id: string; objective: string } | null }>('sidechat.state', args),\n settingsGet: () => call<{ value?: unknown; revision?: number }>('settings.get', {}),\n settingsUpdate: (patch: Record<string, unknown>, expectedRevision?: number) =>\n call<{ value?: unknown; revision?: number }>('settings.update', { patch, expectedRevision }),\n dispose: (args: { childId: string }) =>\n call<{ accepted: true }>('sidechat.dispose', args),\n}\n","/**\n * Client locale dictionaries for dsh-side-chat (zh + en), registered under the\n * `sidechat` namespace.\n */\nexport const LOCALE_NS = 'sidechat'\n\nexport const zh = {\n 'ask.new': '在侧边聊天中提问',\n 'ask.continue': '继续在激活的侧边聊天中提问',\n 'panel.title': '侧边聊天',\n 'panel.empty': '当前会话还没有侧边聊天。选中消息文本后点「在侧边聊天中提问」即可发起。',\n 'panel.close': '关闭',\n 'panel.input.placeholder': '输入消息,回车发送',\n 'panel.send': '发送',\n 'panel.stop': '停止',\n 'panel.lookup': '需要时从工作区 / 主会话查信息',\n 'panel.model': '模型',\n 'panel.provider': '服务商',\n 'panel.effort': '思考难度',\n 'panel.permission': '权限',\n 'panel.noModel': '(继承)',\n 'panel.effortDefault': '默认',\n 'panel.expand': '展开侧边聊天',\n 'panel.collapse': '收起侧边聊天',\n 'panel.dispose': '结束此侧边聊天',\n 'panel.delete': '删除',\n 'panel.deleteAll': '删除全部',\n 'panel.error': '侧边聊天出错',\n 'panel.running': '思考中…',\n 'panel.copy': '复制',\n 'panel.copied': '已复制',\n 'panel.footnotes': '脚注',\n 'panel.think': '思考',\n 'panel.commands': '命令',\n 'command.model': '/model 模型',\n 'command.permission': '/permission 权限',\n 'plan.chipTitle': '计划模式已开启 — 点击关闭(/plan off)',\n 'plan.chipAria': '计划模式已开启,按下关闭',\n 'goal.label': '目标',\n 'image.railGroup': '图片附件',\n 'image.railOpen': '查看原图',\n 'image.railScrollLeft': '向左滚动',\n 'image.railScrollRight': '向右滚动',\n 'image.remove': '移除图片',\n 'image.label': '图片',\n 'image.open': '查看原图',\n 'image.loading': '加载中…',\n 'image.loadFailed': '加载失败',\n 'image.lightboxDialog': '图片预览',\n 'image.close': '关闭',\n 'image.dropTitle': '拖放图片到此处',\n 'image.dropDesc': '支持 PNG / JPEG / WebP / GIF',\n 'image.unsupported': '不支持的图片格式',\n 'image.tooMany': '图片数量超出限制',\n 'image.fileTooLarge': '图片过大',\n 'settingsNav': '侧边聊天',\n 'settings.lookupTitle': '默认勾选「需要时从工作区 / 主会话查信息」',\n 'settings.lookupDesc': '新会话的侧边聊天默认打开此开关;可在每次聊天中临时更改',\n 'settings.sendImmediatelyTitle': '选中内容后立即发送',\n 'settings.sendImmediatelyDesc': '关闭后,选中的内容会作为附件先放进侧边聊天输入框,由你确认后再发送',\n 'settings.defaultPromptTitle': '默认用户提示词',\n 'settings.defaultPromptDesc': '「立即发送」开启时,选中的内容会自动附加这段提示词,让回答更符合你的需求',\n 'settings.defaultPromptPlaceholder': '例如:请用中文回答,并尽量简洁…',\n 'settings.bringModeTitle': '带回内容的方式',\n 'settings.bringModeDesc': '把侧边聊天的 AI 回复带回主会话时,内容落在哪里(两种方式都不会立即发送)',\n 'settings.bringModeDraftTitle': '写入输入框草稿',\n 'settings.bringModeDraftDesc': '内容进入主会话输入框,可直接编辑后再发送',\n 'settings.bringModeContextTitle': '注入为折叠提示行',\n 'settings.bringModeContextDesc': '内容作为一条折叠的上下文提示行注入主会话(带来源标记),不写输入框;下次对话时模型可见',\n 'settings.panelHomeTitle': '侧边聊天面板位置',\n 'settings.panelHomeDesc': '浮动面板固定在窗口右缘;停靠模式把侧聊放进新版右侧栏(与文档预览同一区域),两种模式都不会与内置右侧栏互相遮挡',\n 'settings.panelHomeFloatingTitle': '浮动面板(经典)',\n 'settings.panelHomeFloatingDesc': '固定在窗口右缘,可拖拽调宽、独立收起',\n 'settings.panelHomeDockTitle': '停靠到右侧栏',\n 'settings.panelHomeDockDesc': '作为「侧边聊天」标签停靠在新版右侧栏,与文档预览共用同一边栏',\n 'dock.title': '侧边聊天',\n 'dock.unavailable': '当前部署未提供新版右侧栏,已回退为浮动面板',\n 'dock.openFailed': '无法打开右侧栏侧边标签',\n 'insert.direct': '直接带回',\n 'insert.summarize': '摘要后带回',\n 'insert.summarizing': '摘要中…',\n 'insert.failed': '无法写入主会话输入框',\n 'insert.summarizeFailed': '摘要失败',\n 'insert.contextSummary': '侧边聊天带回',\n 'insert.summarizeContextSummary': '侧边聊天摘要',\n 'question.options': '可选选项',\n 'question.option': '选项',\n 'question.bringAll': '带入全部',\n 'question.bringAllNew': '新会话全部',\n 'question.bringOne': '带入',\n 'question.bringOneNew': '新会话',\n 'question.bringing': '带入中…',\n 'question.failed': '带入侧边聊天失败',\n 'question.delete': '删除',\n 'question.deleteAll': '删除全部',\n 'question.collapse': '折叠',\n 'question.expand': '展开',\n 'question.allPrompt': '请帮我理解上面的问题和各个选项的含义,并给出选择建议。',\n 'question.onePrompt': '请帮我理解这个选项的含义,以及它在这个问题中的利弊。',\n 'question.openHint': '主会话有一个问题弹框,点击在侧边聊天里询问',\n}\n\nexport const en = {\n 'ask.new': 'Ask in side chat',\n 'ask.continue': 'Continue active side chat',\n 'panel.title': 'Side chat',\n 'panel.empty': 'No side chat for this conversation yet. Select some message text and choose \"Ask in side chat\".',\n 'panel.close': 'Close',\n 'panel.input.placeholder': 'Type a message, Enter to send',\n 'panel.send': 'Send',\n 'panel.stop': 'Stop',\n 'panel.lookup': 'Look up workspace / parent when needed',\n 'panel.model': 'Model',\n 'panel.provider': 'Provider',\n 'panel.effort': 'Effort',\n 'panel.permission': 'Permission',\n 'panel.noModel': '(inherited)',\n 'panel.effortDefault': 'Default',\n 'panel.expand': 'Expand side chat',\n 'panel.collapse': 'Collapse side chat',\n 'panel.dispose': 'End this side chat',\n 'panel.delete': 'Delete',\n 'panel.deleteAll': 'Delete all',\n 'panel.error': 'Side chat error',\n 'panel.running': 'Thinking…',\n 'panel.copy': 'Copy',\n 'panel.copied': 'Copied',\n 'panel.footnotes': 'Footnotes',\n 'panel.think': 'Think',\n 'panel.commands': 'Commands',\n 'command.model': '/model Model',\n 'command.permission': '/permission Permission',\n 'plan.chipTitle': 'Plan mode on — click to turn off (/plan off)',\n 'plan.chipAria': 'Plan mode on, press to turn off',\n 'goal.label': 'Goal',\n 'image.railGroup': 'Image attachments',\n 'image.railOpen': 'Open original',\n 'image.railScrollLeft': 'Scroll left',\n 'image.railScrollRight': 'Scroll right',\n 'image.remove': 'Remove image',\n 'image.label': 'Image',\n 'image.open': 'Open original',\n 'image.loading': 'Loading…',\n 'image.loadFailed': 'Load failed',\n 'image.lightboxDialog': 'Image preview',\n 'image.close': 'Close',\n 'image.dropTitle': 'Drop images here',\n 'image.dropDesc': 'PNG / JPEG / WebP / GIF',\n 'image.unsupported': 'Unsupported image type',\n 'image.tooMany': 'Too many images',\n 'image.fileTooLarge': 'Image too large',\n 'settingsNav': 'Side chat',\n 'settings.lookupTitle': 'Default on: \"look up workspace / parent when needed\"',\n 'settings.lookupDesc': 'New conversations start with this switch on; you can still change it per chat',\n 'settings.sendImmediatelyTitle': 'Send selected text immediately',\n 'settings.sendImmediatelyDesc': 'When off, the selection is staged as an attachment in the composer for you to confirm before sending',\n 'settings.defaultPromptTitle': 'Default prompt',\n 'settings.defaultPromptDesc': 'When \"send immediately\" is on, this prompt is appended to the selection so the answer matches your needs',\n 'settings.defaultPromptPlaceholder': 'e.g. Answer in Chinese and keep it concise…',\n 'settings.bringModeTitle': 'Bring-back target',\n 'settings.bringModeDesc': 'Where a side-chat AI reply lands when brought back (neither mode sends immediately)',\n 'settings.bringModeDraftTitle': 'Into the composer draft',\n 'settings.bringModeDraftDesc': 'Text lands in the main composer so you can edit before sending',\n 'settings.bringModeContextTitle': 'As a collapsed context row',\n 'settings.bringModeContextDesc': 'Text is injected as a collapsed, source-tagged context row — not into the composer; the model sees it next turn',\n 'settings.panelHomeTitle': 'Side-chat panel location',\n 'settings.panelHomeDesc': 'The classic panel floats on the window\\u2019s right edge; dock mode puts the side chat inside the new right sidebar (the same rail as document previews). Neither mode covers the built-in sidebar',\n 'settings.panelHomeFloatingTitle': 'Floating panel (classic)',\n 'settings.panelHomeFloatingDesc': 'Fixed to the window\\u2019s right edge; drag to resize and collapse independently',\n 'settings.panelHomeDockTitle': 'Dock in the right sidebar',\n 'settings.panelHomeDockDesc': 'Lives as a \"Side chat\" tab in the new right sidebar, sharing the rail with document previews',\n 'dock.title': 'Side chat',\n 'dock.unavailable': 'This deployment has no right sidebar; fell back to the floating panel',\n 'dock.openFailed': 'Could not open the side-chat tab in the right sidebar',\n 'insert.direct': 'Insert directly',\n 'insert.summarize': 'Summarize & insert',\n 'insert.summarizing': 'Summarizing…',\n 'insert.failed': 'Could not write to the main composer',\n 'insert.summarizeFailed': 'Summarization failed',\n 'insert.contextSummary': 'Brought from side chat',\n 'insert.summarizeContextSummary': 'Side chat summary',\n 'question.options': 'Options',\n 'question.option': 'Option',\n 'question.bringAll': 'Bring all',\n 'question.bringAllNew': 'New chat (all)',\n 'question.bringOne': 'Bring',\n 'question.bringOneNew': 'New chat',\n 'question.bringing': 'Bringing…',\n 'question.failed': 'Failed to bring into the side chat',\n 'question.delete': 'Delete',\n 'question.deleteAll': 'Delete all',\n 'question.collapse': 'Collapse',\n 'question.expand': 'Expand',\n 'question.allPrompt': 'Please explain what this question is asking and what each option means, and advise how I should choose.',\n 'question.onePrompt': 'Please explain what this option means and its trade-offs for this question.',\n 'question.openHint': 'The main conversation has a question dialog — click to ask in the side chat',\n}\n\nexport type SidechatLocaleKey = keyof typeof zh\n","/**\n * Shared side-chat preference vocabulary (types + constants), consumed by\n * BOTH halves: the host registers the schemastery schema over these values\n * (index.ts) and the client reads/writes them through the plugin's own\n * fenced /sidechat settings routes. Kept free of schemastery so the browser\n * bundle never pulls the schema runtime in.\n */\n\n/** The user-settings namespace holding the side-chat preferences. */\nexport const SUBCHAT_PREFS_NS = 'dsh-side-chat'\n\n/** How a brought-back reply lands in the main conversation. */\nexport type BringMode = 'draft' | 'context'\n\n/** Where the side-chat panel lives when a side chat is open. */\nexport type PanelHome = 'floating' | 'sidebar-right'\n\n/** User-facing side-chat preferences. */\nexport interface SubchatPrefs {\n /** Whether the \"look up workspace / parent when needed\" switch defaults on. */\n lookupDefault: boolean\n /** Whether selecting text sends it immediately (true) or stages it as an attachment (false). */\n sendImmediately: boolean\n /** Extra prompt appended when the selection is sent immediately (empty = none). */\n defaultPrompt: string\n /** How brought-back content lands: into the composer draft, or as a collapsed context row. */\n bringMode: BringMode\n /** Which container hosts the panel: the classic floating right-edge panel, or the new built-in right sidebar. */\n panelHome: PanelHome\n}\n\n/** Fallback prefs used whenever the settings document is unreachable or malformed. */\nexport const SUBCHAT_PREFS_DEFAULTS: SubchatPrefs = {\n lookupDefault: false,\n sendImmediately: true,\n defaultPrompt: '',\n bringMode: 'draft',\n panelHome: 'sidebar-right',\n}\n","/**\n * Client half of dsh-side-chat: a text-selection floating menu, a right-side\n * side-chat panel (drag-resizable + collapsible), the main-conversation-style\n * model/permission selectors and send/stop buttons, and a \"Side chat\" settings\n * section. The panel is isolated per current conversation and talks to the\n * host /sidechat API.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState, type CSSProperties, type MouseEvent as ReactMouseEvent } from 'react'\nimport { useSyncExternalStore } from 'react'\nimport { createRoot, type Root } from 'react-dom/client'\nimport {\n DisclosureRow,\n IconCheckOutline16,\n IconChevronDownOutline14,\n IconChevronRightOutline14,\n IconPanelLeftOutline16,\n IconSendOutline16,\n IconStopFill16,\n IconThinkOutline14,\n MarkdownText,\n Menu,\n Tooltip,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport {\n AttachmentRail,\n DropOverlay,\n ImageGallery,\n ImageLightbox,\n type ImageLoader,\n} from './attachments/index.ts'\nimport type { Context, SideQuestionItem, SideQuestionOption, SideSidebarRight } from '../context-types.ts'\nimport {\n api,\n type PromptContentPart,\n type SidechatDirectory,\n type SidechatImageRef,\n type SidechatListItem,\n type SidechatMessage,\n type SidechatPermissions,\n} from './api.ts'\nimport { en, LOCALE_NS, zh, type SidechatLocaleKey } from './locales.ts'\nimport { SUBCHAT_PREFS_DEFAULTS, type SubchatPrefs } from '../settings-shared.ts'\nimport css from './client.module.css'\nimport './layout.css'\n\n/** Services required before mounting. */\nexport const inject = ['sessions', 'locale', 'slots', 'conversation', 'uiSession']\n\n/** A text selection the floating menu anchors to. */\ninterface SelectionAnchor {\n text: string\n x: number\n y: number\n}\n\n/** The panel UI state, per current parent conversation. */\ninterface PanelState {\n open: boolean\n parentSessionId: string\n activeChildId: string | null\n items: SidechatListItem[]\n messages: SidechatMessage[]\n draft: string\n /** Staged selection shown as an attachment while \"send immediately\" is off. */\n attachment: string | null\n /** Browser-owned draft images (object URLs); serialized on send. */\n attachments: ComposerAttachment[]\n lookup: boolean\n directory: SidechatDirectory | null\n permissions: SidechatPermissions | null\n provider: string\n model: string\n effort: string\n preset: string\n /** Which selector the command menu asked to open (consumed once). */\n commandOpen: 'model' | 'permission' | null\n planActive: boolean\n planPending: boolean\n goalObjective: string | null\n error: string | null\n}\n\n/** The whole browser-side snapshot. */\ninterface SidechatSnapshot {\n current: string | undefined\n panel: PanelState\n anchor: SelectionAnchor | null\n prefs: SubchatPrefs\n /** The current main conversation's pending user-question dialog (null = none). */\n mainQuestion: SideQuestionItem[] | null\n /** Question ids the user deleted from the panel list. */\n dismissedQuestionIds: string[]\n}\n\n/** The whole browser-side store (one per activation). */\ninterface SidechatStore {\n getSnapshot(): SidechatSnapshot\n subscribe(fn: () => void): () => void\n setCurrent(current: string | undefined): void\n setAnchor(anchor: SelectionAnchor | null): void\n setPrefs(prefs: SubchatPrefs): void\n setMainQuestion(questions: SideQuestionItem[] | null): void\n dismissQuestion(id: string): void\n dismissAllQuestions(ids: string[]): void\n openPanel(parentSessionId: string): void\n closePanel(): void\n /** Install (or clear) the dock-mode launcher; openPanel() fires it after opening. */\n setDockLaunch(fn: (() => void) | null): void\n setActive(childId: string): void\n patch(partial: Partial<PanelState>): void\n}\n\nfunction emptyPanel(): PanelState {\n return {\n open: false,\n parentSessionId: '',\n activeChildId: null,\n items: [],\n messages: [],\n draft: '',\n attachment: null,\n attachments: [],\n lookup: false,\n directory: null,\n permissions: null,\n provider: '',\n model: '',\n effort: '',\n preset: '',\n commandOpen: null,\n planActive: false,\n planPending: false,\n goalObjective: null,\n error: null,\n }\n}\n\n/** Create the browser store (one instance per activation, per the factory rule). */\nfunction createStore(): SidechatStore {\n let current: string | undefined\n let panel: PanelState = emptyPanel()\n let anchor: SelectionAnchor | null = null\n let prefs: SubchatPrefs = { ...SUBCHAT_PREFS_DEFAULTS }\n let mainQuestion: SideQuestionItem[] | null = null\n let dismissedQuestionIds: string[] = []\n // Per-conversation panel state so switching away and back restores the side\n // chats instead of resetting them. The side chats stay live on the host, so\n // the client must remember each conversation's open panel + active child.\n const bySession = new Map<string, PanelState>()\n const listeners = new Set<() => void>()\n // Dock mode: while the panel lives in the built-in right sidebar, opening the\n // panel also reveals the tab (registered by the dock effect; null otherwise).\n let dockLaunch: (() => void) | null = null\n // Cached snapshot: useSyncExternalStore compares identity, so the object is\n // only rebuilt on a mutation — never inside getSnapshot itself.\n let snapshot: SidechatSnapshot = { current, panel, anchor, prefs, mainQuestion, dismissedQuestionIds }\n\n const notify = (): void => {\n snapshot = { current, panel, anchor, prefs, mainQuestion, dismissedQuestionIds }\n for (const fn of [...listeners]) fn()\n }\n\n return {\n getSnapshot: () => snapshot,\n subscribe: (fn) => {\n listeners.add(fn)\n return () => { listeners.delete(fn) }\n },\n setCurrent(next) {\n if (next === current) return\n if (current !== undefined) bySession.set(current, panel)\n current = next\n panel = next === undefined\n ? emptyPanel()\n : (bySession.get(next) ?? { ...emptyPanel(), parentSessionId: next, lookup: prefs.lookupDefault })\n anchor = null\n mainQuestion = null\n dismissedQuestionIds = []\n notify()\n },\n setAnchor(next) {\n anchor = next\n notify()\n },\n setPrefs(next) {\n prefs = next\n notify()\n },\n setMainQuestion(questions) {\n mainQuestion = questions\n // Keep dismissal state: a dismissed question must not reappear just\n // because the pending snapshot re-publishes while the dialog is still open.\n notify()\n },\n dismissQuestion(id) {\n if (!dismissedQuestionIds.includes(id)) {\n dismissedQuestionIds = [...dismissedQuestionIds, id]\n notify()\n }\n },\n dismissAllQuestions(ids) {\n dismissedQuestionIds = [...new Set([...dismissedQuestionIds, ...ids])]\n notify()\n },\n openPanel(parentSessionId) {\n panel = { ...panel, open: true, parentSessionId }\n dockLaunch?.()\n notify()\n },\n closePanel() {\n panel = { ...panel, open: false }\n notify()\n },\n setDockLaunch(fn) {\n dockLaunch = fn\n },\n setActive(childId) {\n panel = { ...panel, activeChildId: childId, messages: [], error: null }\n notify()\n },\n patch(partial) {\n panel = { ...panel, ...partial }\n notify()\n },\n }\n}\n\n/** Resolve the localized label for one locale key (module-level active locale). */\nfunction translate(activeLocale: string, key: SidechatLocaleKey): string {\n const dict = activeLocale === 'en' ? en : zh\n return dict[key] ?? key\n}\n\n/** Format a run duration like the main conversation: \"Xs\" / \"Xm SSs\" (or Chinese). */\nfunction formatRunDuration(ms: number, activeLocale: string): string {\n const total = Math.max(0, Math.floor(ms / 1000))\n const minutes = Math.floor(total / 60)\n const seconds = total % 60\n if (minutes > 0) {\n return activeLocale === 'en'\n ? `${minutes}m ${String(seconds).padStart(2, '0')}s`\n : `${minutes}分${String(seconds).padStart(2, '0')}秒`\n }\n return activeLocale === 'en' ? `${seconds}s` : `${seconds}秒`\n}\n\n/** Browser-owned draft image (object URL preview). */\ninterface ComposerAttachment {\n id: string\n file: File\n previewUrl: string\n}\n\n/** Accepted image media types (mirror of dsh-attachment's ImageMediaType). */\nconst IMAGE_MEDIA_TYPES = ['image/png', 'image/jpeg', 'image/webp', 'image/gif']\n\n/** Create runtime draft images with object URLs (validates media type). */\nfunction createDraftImages(files: readonly File[]): ComposerAttachment[] {\n return files.map((file) => {\n if (!IMAGE_MEDIA_TYPES.includes(file.type)) {\n throw new Error(`unsupported image type: ${file.type || 'unknown'}`)\n }\n return { id: crypto.randomUUID(), file, previewUrl: URL.createObjectURL(file) }\n })\n}\n\n/** Revoke one draft image's preview URL. */\nfunction releaseDraftImage(attachment: ComposerAttachment): void {\n URL.revokeObjectURL(attachment.previewUrl)\n}\n\n/** Serialize draft images to base64 prompt parts (mirror of main sendSession). */\nasync function serializeImages(attachments: readonly ComposerAttachment[]): Promise<PromptContentPart[]> {\n return Promise.all(attachments.map(async (a) => {\n const bytes = new Uint8Array(await a.file.arrayBuffer())\n let binary = ''\n const chunk = 32768\n for (let offset = 0; offset < bytes.length; offset += chunk) {\n binary += String.fromCharCode(...bytes.subarray(offset, offset + chunk))\n }\n return {\n type: 'image',\n mediaType: a.file.type,\n data: btoa(binary),\n ...(a.file.name === '' ? {} : { name: a.file.name }),\n }\n }))\n}\n\n/** Convert a base64 string to an object URL for transcript image rendering. */\nfunction base64ObjectUrl(mediaType: string, data: string): string {\n const binary = atob(data)\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i)\n return URL.createObjectURL(new Blob([bytes], { type: mediaType }))\n}\n\n/** Pull the side-chat list for one parent conversation. */\nasync function refreshList(store: SidechatStore, parentSessionId: string): Promise<void> {\n const result = await api.list({ parentSessionId })\n if (result.ok) store.patch({ items: result.value.items })\n}\n\n/** Optimistically flip one side-chat's running flag before the list round-trip. */\nfunction setItemRunning(store: SidechatStore, childId: string, running: boolean): void {\n const items = store.getSnapshot().panel.items\n store.patch({ items: items.map((i) => (i.childId === childId ? { ...i, running } : i)) })\n}\n\n/** Pull the active side chat's transcript. */\nasync function refreshHistory(store: SidechatStore, childId: string): Promise<void> {\n const result = await api.history({ childId })\n if (result.ok) store.patch({ messages: result.value.messages })\n}\n\n/** Pull the model directory + permission catalog once. */\nasync function refreshDirectory(store: SidechatStore): Promise<void> {\n const [directoryResult, permissionsResult] = await Promise.all([\n api.directory(),\n api.permissions(),\n ])\n const patch: Partial<PanelState> = {}\n if (directoryResult.ok) patch.directory = directoryResult.value\n if (permissionsResult.ok) {\n patch.permissions = permissionsResult.value\n // Only seed the preset on first load; never clobber an explicit user pick.\n if (store.getSnapshot().panel.preset === '') {\n patch.preset = permissionsResult.value.current\n }\n }\n store.patch(patch)\n}\n\n/** The side-chat's current model selection (provider + model + effort). */\ninterface ModelSelection {\n provider: string\n model: string\n effort: string\n}\n\n/** One directory model's reasoning slice. */\ntype DirectoryReasoning = SidechatDirectory['groups'][number]['models'][number]['reasoning']\n\n/** The first non-empty line of a reasoning block (collapsed summary). */\nfunction firstLine(text: string): string {\n const end = text.indexOf('\\n')\n return end === -1 ? text : text.slice(0, end)\n}\n\n/** Main-conversation-style reasoning disclosure row (Think). */\nfunction ReasoningRow(props: { text: string; t: (key: SidechatLocaleKey) => string }) {\n const [expanded, setExpanded] = useState(false)\n const summary = firstLine(props.text)\n return (\n <DisclosureRow\n icon={<IconThinkOutline14 size={14} />}\n title={props.t('panel.think')}\n open={expanded}\n expandable={true}\n expandOnRowClick={true}\n onToggle={() => { setExpanded((value) => !value) }}\n collapsedContent={<span className={css.reasoningSummary}>{summary}</span>}\n >\n <div className={css.reasoningBody}>{props.text}</div>\n </DisclosureRow>\n )\n}\n\n/**\n * Main-conversation-style model selector: a compact trigger showing\n * `model · effort`, opening a two-level menu (provider groups → models, then\n * effort levels). UI mirrors dsh-client-ui-model-selection's ModelSelect.\n */\nfunction ModelSelect(props: {\n directory: SidechatDirectory | null\n selection: ModelSelection\n onSelect: (provider: string, model: string, effort?: string) => void\n t: (key: SidechatLocaleKey) => string\n openSignal?: boolean\n onOpenConsumed?: () => void\n}) {\n const { directory, selection, onSelect, t, openSignal, onOpenConsumed } = props\n const [open, setOpen] = useState(false)\n const [pane, setPane] = useState<'root' | 'model' | 'effort'>('root')\n const rootRef = useRef<HTMLDivElement | null>(null)\n\n // External open signal (the + command menu asks the selector to open).\n useEffect(() => {\n if (openSignal === true) {\n setPane('root')\n setOpen(true)\n onOpenConsumed?.()\n }\n }, [openSignal, onOpenConsumed])\n\n // Current model entry across all provider groups.\n let currentChoice: { name: string; reasoning?: DirectoryReasoning } | undefined\n for (const group of directory?.groups ?? []) {\n const model = group.models.find((m) => m.id === selection.model && group.id === selection.provider)\n if (model !== undefined) {\n currentChoice = { name: model.name, reasoning: model.reasoning }\n break\n }\n }\n const reasoning = currentChoice?.reasoning\n const effectiveEffort = selection.effort !== '' ? selection.effort : reasoning?.defaultEffort\n const effortLabel = reasoning === undefined\n ? undefined\n : effectiveEffort === undefined\n ? t('panel.effortDefault')\n : reasoning.efforts.find((e) => e.id === effectiveEffort)?.name ?? effectiveEffort\n const modelLabel = currentChoice?.name ?? t('panel.noModel')\n const effortChoices = reasoning === undefined\n ? []\n : [\n ...(reasoning.defaultEffort === undefined ? [{ key: 'default', effort: undefined as string | undefined, label: t('panel.effortDefault') }] : []),\n ...reasoning.efforts.map((e) => ({ key: e.id, effort: e.id, label: e.name })),\n ]\n\n // Close on outside pointer-down / Escape.\n useEffect(() => {\n if (!open) return\n const onDown = (e: globalThis.MouseEvent): void => {\n if (rootRef.current !== null && !rootRef.current.contains(e.target as Node)) setOpen(false)\n }\n const onKey = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') setOpen(false)\n }\n document.addEventListener('mousedown', onDown)\n document.addEventListener('keydown', onKey)\n return () => {\n document.removeEventListener('mousedown', onDown)\n document.removeEventListener('keydown', onKey)\n }\n }, [open])\n\n const triggerLabel = effortLabel === undefined ? modelLabel : `${modelLabel} · ${effortLabel}`\n\n return (\n <div ref={rootRef} className={css.modelSelect}>\n <button\n type=\"button\"\n className={css.modelSelectTrigger}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n title={triggerLabel}\n onClick={() => {\n if (open) setOpen(false)\n else { setPane('root'); setOpen(true) }\n }}\n >\n <span className={css.modelSelectLabel}>{modelLabel}</span>\n {effortLabel !== undefined && <span className={css.modelSelectEffort}>{effortLabel}</span>}\n <IconChevronDownOutline14 className={open ? css.chevronOpen : undefined} />\n </button>\n\n {open && (\n <div className={css.modelSelectMenu} role=\"menu\">\n {pane === 'root' && (\n <>\n <button type=\"button\" role=\"menuitem\" className={css.modelCell} onClick={() => { setPane('model') }}>\n <span className={css.modelCellLabel}>{t('panel.model')}</span>\n <span className={css.modelCellValue}>{modelLabel}</span>\n <IconChevronRightOutline14 className={css.modelCellChevron} />\n </button>\n {reasoning !== undefined && (\n <button type=\"button\" role=\"menuitem\" className={css.modelCell} onClick={() => { setPane('effort') }}>\n <span className={css.modelCellLabel}>{t('panel.effort')}</span>\n <span className={css.modelCellValue}>{effortLabel}</span>\n <IconChevronRightOutline14 className={css.modelCellChevron} />\n </button>\n )}\n </>\n )}\n\n {pane === 'model' && (\n <div className={css.modelGroups}>\n {(directory?.groups ?? []).map((group) => (\n <section key={group.id} role=\"group\" aria-label={group.name} className={css.modelGroup}>\n <div className={css.modelGroupTitle}>{group.name}</div>\n {group.models.map((model) => {\n const selected = selection.provider === group.id && selection.model === model.id\n return (\n <button\n key={model.id}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={selected}\n className={selected ? `${css.modelOption} ${css.modelOptionSelected}` : css.modelOption}\n title={model.name}\n onClick={() => {\n onSelect(group.id, model.id)\n setOpen(false)\n }}\n >\n <span className={css.modelOptionCopy}>\n <span className={css.modelName}>{model.name}</span>\n {model.description !== undefined && <span className={css.modelDescription}>{model.description}</span>}\n </span>\n <span className={css.modelCheck}>{selected ? <IconCheckOutline16 /> : null}</span>\n </button>\n )\n })}\n </section>\n ))}\n {(directory?.groups ?? []).length === 0 && <div className={css.modelEmpty}>{t('panel.noModel')}</div>}\n </div>\n )}\n\n {pane === 'effort' && (\n <>\n {effortChoices.length === 0\n ? <div className={css.modelEmpty}>{t('panel.effort')}</div>\n : effortChoices.map((level) => {\n const selected = effectiveEffort === level.effort\n return (\n <button\n key={level.key}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={selected}\n className={selected ? `${css.modelOption} ${css.modelOptionSelected}` : css.modelOption}\n onClick={() => {\n onSelect(selection.provider, selection.model, level.effort)\n setOpen(false)\n }}\n >\n <span className={css.modelOptionCopy}>\n <span className={css.modelName}>{level.label}</span>\n </span>\n <span className={css.modelCheck}>{selected ? <IconCheckOutline16 /> : null}</span>\n </button>\n )\n })}\n </>\n )}\n </div>\n )}\n </div>\n )\n}\n\n/** Main-conversation-style permission selector (Menu + compact trigger). */\nfunction PermissionSelect(props: {\n permissions: SidechatPermissions | null\n preset: string\n onSelect: (preset: string) => void\n t: (key: SidechatLocaleKey) => string\n openSignal?: boolean\n onOpenConsumed?: () => void\n}) {\n const { permissions, preset, onSelect, openSignal, onOpenConsumed } = props\n const [open, setOpen] = useState(false)\n const options = (permissions?.options ?? []).filter((o) => o.value !== 'custom')\n const current = options.find((o) => o.value === preset)\n const items = options.map((o) => ({ id: o.value, label: o.name }))\n\n // External open signal (the + command menu asks the selector to open).\n useEffect(() => {\n if (openSignal === true) {\n setOpen(true)\n onOpenConsumed?.()\n }\n }, [openSignal, onOpenConsumed])\n\n return (\n <Menu\n open={open}\n side=\"top\"\n align=\"end\"\n items={items}\n selectedId={preset}\n onSelect={(id) => { setOpen(false); onSelect(id) }}\n onClose={() => { setOpen(false) }}\n anchor={(\n <button\n type=\"button\"\n className={css.modelSelectTrigger}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n title={current?.description}\n onClick={() => { setOpen(!open) }}\n >\n <span className={css.modelSelectLabel}>{current?.name ?? preset}</span>\n <IconChevronDownOutline14 />\n </button>\n )}\n />\n )\n}\n\n/**\n * The floating selection menu: listens to the document selection and shows\n * one or two buttons (start / continue), dispatching to the host API.\n */\nfunction SelectionMenu(props: { store: SidechatStore; t: (key: SidechatLocaleKey) => string }) {\n const { anchor, current, panel, prefs } = useSyncExternalStore(props.store.subscribe, props.store.getSnapshot)\n const [local, setLocal] = useState<SelectionAnchor | null>(null)\n\n useEffect(() => {\n const compute = (): void => {\n const selection = window.getSelection()\n if (selection === null || selection.isCollapsed) {\n setLocal(null)\n return\n }\n const text = selection.toString().trim()\n if (text === '') {\n setLocal(null)\n return\n }\n const range = selection.getRangeAt(0)\n const node = range.startContainer\n const element = node.nodeType === 1 ? (node as Element) : node.parentElement\n if (element !== null && element.closest('input, textarea, [contenteditable=\"true\"]') !== null) {\n setLocal(null)\n return\n }\n // Never offer \"ask in side chat\" for selections inside the side-chat panel\n // (those belong to the bring-back-to-main menu instead).\n if (element !== null && element.closest('[data-dsh-side-chat]') !== null) {\n setLocal(null)\n return\n }\n const rect = range.getBoundingClientRect()\n if (rect.width === 0 && rect.height === 0) {\n setLocal(null)\n return\n }\n setLocal({ text, x: rect.left + rect.width / 2, y: rect.top })\n }\n const onMouseUp = (): void => { window.setTimeout(compute, 0) }\n document.addEventListener('mouseup', onMouseUp)\n document.addEventListener('selectionchange', compute)\n return () => {\n document.removeEventListener('mouseup', onMouseUp)\n document.removeEventListener('selectionchange', compute)\n }\n }, [])\n\n const start = useCallback(() => {\n if (local === null || current === undefined) return\n const parentSessionId = current\n const text = local.text\n const snap = props.store.getSnapshot().panel\n if (prefs.sendImmediately) {\n const content: PromptContentPart[] = [\n { type: 'text', text },\n ...(prefs.defaultPrompt.trim() !== '' ? [{ type: 'text' as const, text: prefs.defaultPrompt.trim() }] : []),\n ]\n void api.start({\n parentSessionId,\n content,\n lookupEnabled: prefs.lookupDefault,\n ...(snap.provider !== '' ? { provider: snap.provider } : {}),\n ...(snap.model !== '' ? { model: snap.model } : {}),\n ...(snap.effort !== '' ? { reasoningEffort: snap.effort } : {}),\n }).then((result) => {\n if (result.ok) {\n props.store.openPanel(parentSessionId)\n props.store.setActive(result.value.childId)\n props.store.patch({\n provider: result.value.provider,\n model: result.value.model,\n effort: result.value.reasoningEffort ?? '',\n })\n void refreshList(props.store, parentSessionId)\n void refreshDirectory(props.store)\n }\n })\n } else {\n // Stage the selection as an attachment; a new side chat is created on\n // send. Detach from any previously active child, but show the parent's\n // inherited model until the user picks one.\n props.store.openPanel(parentSessionId)\n props.store.patch({ attachment: text, activeChildId: null, messages: [], draft: '', provider: '', model: '', effort: '' })\n void api.inherit({ parentSessionId }).then((result) => {\n if (result.ok) {\n props.store.patch({\n provider: result.value.provider,\n model: result.value.model,\n effort: result.value.reasoningEffort ?? '',\n })\n }\n })\n void refreshDirectory(props.store)\n }\n setLocal(null)\n }, [local, current, prefs, props.store])\n\n const continueChat = useCallback(() => {\n if (local === null || current === undefined) return\n const parentSessionId = current\n const text = local.text\n const active = props.store.getSnapshot().panel.activeChildId\n if (active === null) return\n props.store.openPanel(parentSessionId)\n if (prefs.sendImmediately) {\n const content: PromptContentPart[] = [\n { type: 'text', text },\n ...(prefs.defaultPrompt.trim() !== '' ? [{ type: 'text' as const, text: prefs.defaultPrompt.trim() }] : []),\n ]\n setItemRunning(props.store, active, true)\n void api.followup({ childId: active, content, lookupEnabled: prefs.lookupDefault }).then((result) => {\n if (!result.ok) props.store.patch({ error: result.error.message })\n void refreshList(props.store, parentSessionId)\n void refreshHistory(props.store, active)\n })\n } else {\n props.store.patch({ attachment: text })\n }\n setLocal(null)\n }, [local, current, prefs, props.store])\n\n if (local === null || current === undefined) return null\n const hasActive = panel.activeChildId !== null\n return (\n <div className={css.selectionMenu} style={{ left: local.x, top: local.y - 46 }}>\n <button type=\"button\" className={css.selectionButton} onClick={start}>{props.t('ask.new')}</button>\n {hasActive && <button type=\"button\" className={css.selectionButton} onClick={continueChat}>{props.t('ask.continue')}</button>}\n </div>\n )\n}\n\n/**\n * The floating bring-back-to-main menu: listens to the document selection and,\n * when the selection is inside an assistant reply in the side-chat panel, shows\n * two actions — \"insert directly\" and \"summarize then insert\" — both appending\n * into the main composer without sending.\n */\nfunction BringBackMenu(props: {\n store: SidechatStore\n t: (key: SidechatLocaleKey) => string\n bringToMain: (text: string) => Promise<boolean>\n summarizeBring: (text: string) => Promise<boolean>\n}) {\n const [local, setLocal] = useState<SelectionAnchor | null>(null)\n const [summarizing, setSummarizing] = useState(false)\n\n useEffect(() => {\n const compute = (): void => {\n const selection = window.getSelection()\n if (selection === null || selection.isCollapsed) {\n setLocal(null)\n return\n }\n const text = selection.toString().trim()\n if (text === '') {\n setLocal(null)\n return\n }\n const range = selection.getRangeAt(0)\n const node = range.startContainer\n const element = node.nodeType === 1 ? (node as Element) : node.parentElement\n if (element !== null && element.closest('input, textarea, [contenteditable=\"true\"]') !== null) {\n setLocal(null)\n return\n }\n if (element === null || element.closest('[data-sidechat-role=\"assistant\"]') === null) {\n setLocal(null)\n return\n }\n const rect = range.getBoundingClientRect()\n if (rect.width === 0 && rect.height === 0) {\n setLocal(null)\n return\n }\n setLocal({ text, x: rect.left + rect.width / 2, y: rect.top })\n }\n const onMouseUp = (): void => { window.setTimeout(compute, 0) }\n document.addEventListener('mouseup', onMouseUp)\n document.addEventListener('selectionchange', compute)\n return () => {\n document.removeEventListener('mouseup', onMouseUp)\n document.removeEventListener('selectionchange', compute)\n }\n }, [])\n\n if (local === null) return null\n\n const summarize = async (): Promise<void> => {\n setSummarizing(true)\n const ok = await props.summarizeBring(local.text)\n setSummarizing(false)\n if (!ok) props.store.patch({ error: props.t('insert.summarizeFailed') })\n else setLocal(null)\n }\n\n return (\n <div className={css.selectionMenu} style={{ left: local.x, top: local.y - 46 }}>\n <button\n type=\"button\"\n className={css.selectionButton}\n onClick={() => {\n void props.bringToMain(local.text).then((ok) => {\n if (!ok) props.store.patch({ error: props.t('insert.failed') })\n else setLocal(null)\n })\n }}\n >\n {props.t('insert.direct')}\n </button>\n <button type=\"button\" className={css.selectionButton} disabled={summarizing} onClick={() => { void summarize() }}>\n {summarizing ? props.t('insert.summarizing') : props.t('insert.summarize')}\n </button>\n </div>\n )\n}\n\n/**\n * Floating entry shown while the panel is closed and the main conversation has\n * a pending question dialog. It anchors beside the dialog's header (without\n * covering its text) and disappears once clicked (the panel opens instead).\n */\nfunction QuestionFab(props: {\n store: SidechatStore\n t: (key: SidechatLocaleKey) => string\n onOpen: () => void\n}) {\n const [pos, setPos] = useState<{ left: number; top: number } | null>(null)\n\n useEffect(() => {\n let raf = 0\n let missing = 0\n const tick = (): void => {\n const el = document.querySelector<HTMLElement>('[data-question-key], [data-approval-key]')\n if (el === null) {\n missing += 1\n // A brief grace period covers the initial render; if the dialog stays\n // absent, clear the tracked question so this entry disappears too.\n if (missing > 30) {\n props.store.setMainQuestion(null)\n return\n }\n setPos(null)\n raf = requestAnimationFrame(tick)\n return\n }\n missing = 0\n // The dialog's header (its title/eyebrow block) is the anchor. Newer DSH\n // wraps it as `section > header` inside the data-question frame, so locate\n // the `header` tag generically (older builds had it as the first child).\n const header = el.querySelector<HTMLElement>('header') ?? (el.firstElementChild as HTMLElement | null) ?? el\n const rect = header.getBoundingClientRect()\n const size = 32\n const left = Math.min(rect.right + 8, window.innerWidth - size - 8)\n const top = rect.top + rect.height / 2\n setPos({ left, top })\n raf = requestAnimationFrame(tick)\n }\n tick()\n return () => { cancelAnimationFrame(raf) }\n }, [props.store])\n\n const style: CSSProperties = pos !== null\n ? { left: pos.left, top: pos.top, transform: 'translateY(-50%)' }\n : { left: '50%', bottom: 160, transform: 'translateX(-50%)' }\n\n return (\n <Tooltip label={props.t('question.openHint')} side=\"top\">\n <button\n type=\"button\"\n className={css.questionFab}\n style={style}\n aria-label={props.t('question.openHint')}\n onClick={props.onOpen}\n >\n <IconPanelLeftOutline16 size={16} />\n <span className={css.questionFabDot} />\n </button>\n </Tooltip>\n )\n}\n\n/** Panel width bounds. The panel never takes more than ~40% of the window and\n * never squeezes the main chat below a usable minimum — so the panel adapts to\n * whatever resolution / zoom the browser window is at. */\nconst PANEL_MIN_WIDTH = 280\nconst PANEL_MAX_WIDTH = 720\nconst PANEL_DEFAULT_WIDTH = 360\nconst MAIN_CHAT_MIN_WIDTH = 480\n/** localStorage key remembering the last panel width across reloads. */\nconst PANEL_WIDTH_KEY = 'dsh-side-chat.panelWidth'\n\n/** Right-sidebar dock identity (kind is the `openTab` discriminator; id keys the body seat). */\nconst SIDEBAR_TAB_ID = 'dsh-side-chat-plus/side-chat'\nconst SIDEBAR_TAB_KIND = 'side-chat'\n\n/** The viewport-aware maximum panel width for the current window. */\nfunction panelCap(): number {\n const vw = window.innerWidth\n return Math.max(PANEL_MIN_WIDTH, Math.min(PANEL_MAX_WIDTH, vw * 0.4, vw - MAIN_CHAT_MIN_WIDTH))\n}\n\n/** The last user-chosen width, if any (re-clamped to the viewport on load). */\nfunction savedPanelWidth(): number | null {\n try {\n const raw = window.localStorage.getItem(PANEL_WIDTH_KEY)\n if (raw === null) return null\n const n = Number(raw)\n return Number.isFinite(n) && n > 0 ? n : null\n } catch {\n return null\n }\n}\n\n/** The side-chat panel body. */\nfunction SidechatPanel(props: {\n store: SidechatStore\n t: (key: SidechatLocaleKey) => string\n formatDuration: (ms: number) => string\n bringToMain: (text: string) => Promise<boolean>\n summarizeBring: (text: string) => Promise<boolean>\n askSidechat: (text: string) => Promise<boolean>\n askSidechatNew: (text: string) => Promise<boolean>\n /** Render inside the built-in right sidebar's tab pane (no floating chrome). */\n embedded?: boolean\n /** A built-in sidebar overlay (fullscreen preview / floating panel) owns the viewport: hide this panel. */\n conflictHidden?: boolean\n}) {\n const { panel, mainQuestion, dismissedQuestionIds } = useSyncExternalStore(props.store.subscribe, props.store.getSnapshot)\n const scrollRef = useRef<HTMLDivElement | null>(null)\n const markdownLabels = useMemo(() => ({\n code: { copyLabel: props.t('panel.copy'), copiedLabel: props.t('panel.copied') },\n footnotes: props.t('panel.footnotes'),\n }), [props.t])\n const attachmentRailLabels = useMemo(() => ({\n group: props.t('image.railGroup'),\n open: props.t('image.railOpen'),\n scrollLeft: props.t('image.railScrollLeft'),\n scrollRight: props.t('image.railScrollRight'),\n }), [props.t])\n const messageImageLabels = useMemo(() => ({\n image: props.t('image.label'),\n open: props.t('image.open'),\n openNamed: (name: string): string => name,\n loading: props.t('image.loading'),\n loadFailed: props.t('image.loadFailed'),\n lightbox: { dialog: props.t('image.lightboxDialog'), close: props.t('image.close') },\n }), [props.t])\n const dropOverlayLabels = useMemo(() => ({\n title: props.t('image.dropTitle'),\n desc: props.t('image.dropDesc'),\n }), [props.t])\n // Width starts at the user's last choice when it fits the current window,\n // otherwise adapts to the viewport (small screens get a smaller default).\n const [width, setWidth] = useState(() => {\n const base = savedPanelWidth() ?? PANEL_DEFAULT_WIDTH\n return Math.max(PANEL_MIN_WIDTH, Math.min(panelCap(), base))\n })\n const [collapsed, setCollapsed] = useState(false)\n const [now, setNow] = useState(() => Date.now())\n const [dragActive, setDragActive] = useState(false)\n const [lightbox, setLightbox] = useState<ComposerAttachment | null>(null)\n const [limits, setLimits] = useState<{ mediaTypes: string[]; maxImageBytes: number; maxImagesPerMessage: number; maxMessageImageBytes: number } | null>(null)\n /** Index of the assistant message whose \"summarize then insert\" is in flight. */\n const [summarizingIndex, setSummarizingIndex] = useState<number | null>(null)\n /** Which question-dialog item is being brought into the side chat ('all' or an option label). */\n const [bringingKey, setBringingKey] = useState<string | null>(null)\n /** Whether the question-dialog list is collapsed (headers only). */\n const [questionCollapsed, setQuestionCollapsed] = useState(false)\n\n // Auto-expand the panel whenever a side chat is started or activated, so\n // starting from a collapsed panel still reveals the conversation.\n useEffect(() => {\n if (panel.open && panel.activeChildId !== null) setCollapsed(false)\n }, [panel.open, panel.activeChildId])\n\n // Open (and expand) the panel to show the pending question dialog.\n const openQuestionPanel = useCallback(() => {\n props.store.openPanel(panel.parentSessionId)\n setCollapsed(false)\n }, [props.store, panel.parentSessionId])\n\n /** Assemble one question + all its options into a prompt. */\n const buildAllText = (q: SideQuestionItem): string => {\n const lines: string[] = []\n if (q.header !== undefined && q.header !== '') lines.push(`【${q.header}】`)\n lines.push(q.question)\n if (q.detail !== undefined && q.detail !== '') lines.push(q.detail)\n const options = q.options ?? []\n if (options.length > 0) {\n lines.push(props.t('question.options'))\n for (const o of options) {\n lines.push(`- ${o.label}${o.description !== undefined && o.description !== '' ? ` — ${o.description}` : ''}`)\n }\n }\n lines.push(props.t('question.allPrompt'))\n return lines.join('\\n')\n }\n\n /** Assemble one question + one specific option into a prompt. */\n const buildOneText = (q: SideQuestionItem, o: SideQuestionOption): string => {\n const lines: string[] = []\n if (q.header !== undefined && q.header !== '') lines.push(`【${q.header}】`)\n lines.push(q.question)\n if (q.detail !== undefined && q.detail !== '') lines.push(q.detail)\n lines.push(`${props.t('question.option')}:${o.label}${o.description !== undefined && o.description !== '' ? ` — ${o.description}` : ''}`)\n lines.push(props.t('question.onePrompt'))\n return lines.join('\\n')\n }\n\n const bringQuestionText = (text: string, key: string, useNew: boolean): void => {\n setBringingKey(key)\n const fn = useNew ? props.askSidechatNew : props.askSidechat\n void fn(text).then((ok) => {\n setBringingKey(null)\n if (!ok) props.store.patch({ error: props.t('question.failed') })\n })\n }\n\n const activeItem = panel.items.find((i) => i.childId === panel.activeChildId)\n const activeRunning = activeItem?.running ?? false\n const [anchor, setAnchor] = useState<number | null>(null)\n\n useEffect(() => {\n if (props.embedded) return\n const w = panel.open && !collapsed && !props.conflictHidden ? `${width}px` : '0px'\n document.documentElement.style.setProperty('--dsh-subchat-width', w)\n return () => { document.documentElement.style.setProperty('--dsh-subchat-width', '0px') }\n }, [props.embedded, panel.open, collapsed, width, props.conflictHidden])\n\n // Re-adapt the panel width when the window is resized: if the viewport\n // shrinks (smaller window, different monitor, higher zoom), the panel is\n // clamped to the new cap and the layout margin follows via the effect above.\n useEffect(() => {\n const onResize = (): void => {\n setWidth((w) => Math.min(w, panelCap()))\n }\n window.addEventListener('resize', onResize)\n return () => { window.removeEventListener('resize', onResize) }\n }, [])\n\n // Remember the width across reloads; on the next load it is re-clamped to\n // whatever window is present then.\n useEffect(() => {\n try {\n window.localStorage.setItem(PANEL_WIDTH_KEY, String(width))\n } catch {\n // Storage unavailable (private mode etc.) — the width just won't persist.\n }\n }, [width])\n\n // Lazy-load the model/permission directory whenever the panel is open but the\n // directory has not hydrated yet (covers page reload + continue + direct open).\n useEffect(() => {\n if (panel.open && panel.directory === null) {\n void refreshDirectory(props.store)\n }\n }, [panel.open, panel.directory, props.store])\n\n useEffect(() => {\n if (activeRunning) {\n if (anchor === null) setAnchor(activeItem?.runningSince ?? Date.now())\n } else if (anchor !== null) {\n setAnchor(null)\n }\n }, [activeRunning, activeItem?.runningSince, anchor])\n\n useEffect(() => {\n if (!activeRunning) return\n const id = window.setInterval(() => { setNow(Date.now()) }, 1000)\n return () => { window.clearInterval(id) }\n }, [activeRunning])\n\n useEffect(() => {\n const el = scrollRef.current\n if (el !== null) el.scrollTop = el.scrollHeight\n }, [panel.messages.length, panel.activeChildId])\n\n useEffect(() => {\n if (!panel.open || panel.activeChildId === null) return\n const tick = (): void => {\n const snap = props.store.getSnapshot().panel\n const childId = snap.activeChildId\n if (childId === null) return\n void refreshList(props.store, snap.parentSessionId)\n void refreshHistory(props.store, childId)\n }\n tick()\n const id = window.setInterval(tick, 1200)\n return () => { window.clearInterval(id) }\n }, [panel.open, panel.activeChildId, props.store])\n\n const send = useCallback(() => {\n const draft = panel.draft.trim()\n const attachment = panel.attachment === null ? '' : panel.attachment\n const text = attachment === '' ? draft : (draft === '' ? attachment : `${attachment}\\n\\n${draft}`)\n void serializeImages(panel.attachments).then((imageParts) => {\n const content: PromptContentPart[] = [...imageParts, ...(text === '' ? [] : [{ type: 'text', text }] as PromptContentPart[])]\n if (content.length === 0) return\n const toRelease = panel.attachments\n props.store.patch({ draft: '', attachment: null, attachments: [] })\n toRelease.forEach(releaseDraftImage)\n\n if (panel.activeChildId === null) {\n void api.start({\n parentSessionId: panel.parentSessionId,\n content,\n lookupEnabled: panel.lookup,\n ...(panel.provider !== '' ? { provider: panel.provider } : {}),\n ...(panel.model !== '' ? { model: panel.model } : {}),\n ...(panel.effort !== '' ? { reasoningEffort: panel.effort } : {}),\n ...(panel.preset !== '' ? { preset: panel.preset } : {}),\n }).then((result) => {\n if (result.ok) {\n props.store.setActive(result.value.childId)\n props.store.patch({\n provider: result.value.provider,\n model: result.value.model,\n effort: result.value.reasoningEffort ?? '',\n })\n void refreshList(props.store, panel.parentSessionId)\n void refreshDirectory(props.store)\n } else {\n props.store.patch({ error: result.error.message })\n }\n })\n return\n }\n\n const childId = panel.activeChildId\n setItemRunning(props.store, childId, true)\n void api.followup({ childId, content, lookupEnabled: panel.lookup }).then((result) => {\n if (!result.ok) {\n setItemRunning(props.store, childId, false)\n props.store.patch({ error: result.error.message })\n }\n void refreshList(props.store, panel.parentSessionId)\n void refreshHistory(props.store, childId)\n })\n }).catch((error: unknown) => {\n props.store.patch({ error: error instanceof Error ? error.message : String(error) })\n })\n }, [panel, props.store])\n\n const stop = useCallback(() => {\n if (panel.activeChildId === null) return\n const childId = panel.activeChildId\n setItemRunning(props.store, childId, false)\n void api.stop({ childId }).then(() => {\n void refreshList(props.store, panel.parentSessionId)\n void refreshHistory(props.store, childId)\n })\n }, [panel, props.store])\n\n const onModelSelect = useCallback((provider: string, model: string, effort?: string) => {\n // Always update the panel selection; only a live child can receive the\n // selection immediately (staged mode applies it at creation instead).\n props.store.patch({ provider, model, effort: effort ?? '' })\n if (panel.activeChildId !== null) {\n void api.selectModel({ childId: panel.activeChildId, provider, model, ...(effort === undefined ? {} : { reasoningEffort: effort }) })\n }\n }, [panel.activeChildId, props.store])\n\n const onPresetChange = useCallback((value: string) => {\n if (value === 'custom' || value === '') return\n props.store.patch({ preset: value })\n if (panel.activeChildId !== null) {\n void api.selectPermission({ childId: panel.activeChildId, presetName: value }).then((result) => {\n if (!result.ok) props.store.patch({ error: result.error.message })\n })\n }\n }, [panel.activeChildId, props.store])\n\n const dispose = useCallback(() => {\n if (panel.activeChildId === null) return\n const childId = panel.activeChildId\n void api.dispose({ childId }).then(() => {\n void refreshList(props.store, panel.parentSessionId)\n props.store.patch({ activeChildId: null, messages: [] })\n })\n }, [panel, props.store])\n\n /** Delete one side chat from the list. */\n const disposeItem = useCallback((childId: string) => {\n void api.dispose({ childId }).then(() => {\n void refreshList(props.store, panel.parentSessionId)\n if (panel.activeChildId === childId) {\n props.store.patch({ activeChildId: null, messages: [] })\n }\n })\n }, [panel.activeChildId, panel.parentSessionId, props.store])\n\n /** Delete every side chat of this conversation at once. */\n const disposeAll = useCallback(() => {\n const ids = panel.items.map((i) => i.childId)\n if (ids.length === 0) return\n void Promise.all(ids.map((id) => api.dispose({ childId: id }))).then(() => {\n void refreshList(props.store, panel.parentSessionId)\n props.store.patch({ activeChildId: null, messages: [] })\n })\n }, [panel.items, panel.parentSessionId, props.store])\n\n const startResize = useCallback((e: ReactMouseEvent<HTMLDivElement>) => {\n e.preventDefault()\n const startX = e.clientX\n const startWidth = width\n const onMove = (ev: globalThis.MouseEvent): void => {\n setWidth(Math.max(PANEL_MIN_WIDTH, Math.min(panelCap(), startWidth + (startX - ev.clientX))))\n }\n const onUp = (): void => {\n window.removeEventListener('mousemove', onMove)\n window.removeEventListener('mouseup', onUp)\n }\n window.addEventListener('mousemove', onMove)\n window.addEventListener('mouseup', onUp)\n }, [width])\n\n const intakeImages = useCallback((files: File[]) => {\n if (files.length === 0) return\n const images = files.filter((f) => f.type.startsWith('image/'))\n if (images.length === 0) {\n props.store.patch({ error: props.t('image.unsupported') })\n return\n }\n try {\n if (limits !== null) {\n if (images.some((f) => !limits.mediaTypes.includes(f.type))) {\n props.store.patch({ error: props.t('image.unsupported') })\n return\n }\n if (panel.attachments.length + images.length > limits.maxImagesPerMessage) {\n props.store.patch({ error: props.t('image.tooMany') })\n return\n }\n if (images.some((f) => f.size > limits.maxImageBytes)) {\n props.store.patch({ error: props.t('image.fileTooLarge') })\n return\n }\n }\n const created = createDraftImages(images)\n props.store.patch({ attachments: [...panel.attachments, ...created], error: null })\n } catch (error) {\n props.store.patch({ error: error instanceof Error ? error.message : String(error) })\n }\n }, [limits, panel.attachments, props.store, props.t])\n\n // Load the deployment image policy once (fast-path checks mirror the host).\n useEffect(() => {\n void api.limits().then((result) => {\n if (result.ok) setLimits(result.value)\n })\n }, [])\n\n // Full-page file drag: track enter/leave depth and accept image drops.\n useEffect(() => {\n if (!panel.open || collapsed) return\n const dragDepth = { value: 0 }\n const hasFiles = (event: DragEvent): boolean => event.dataTransfer?.types.includes('Files') ?? false\n const reset = (): void => { dragDepth.value = 0; setDragActive(false) }\n const onDragEnter = (event: DragEvent): void => {\n if (!hasFiles(event)) return\n event.preventDefault()\n dragDepth.value += 1\n setDragActive(true)\n }\n const onDragOver = (event: DragEvent): void => {\n if (!hasFiles(event) || event.dataTransfer === null) return\n event.preventDefault()\n event.dataTransfer.dropEffect = 'copy'\n }\n const onDragLeave = (event: DragEvent): void => {\n if (!hasFiles(event)) return\n dragDepth.value = Math.max(0, dragDepth.value - 1)\n if (dragDepth.value === 0) setDragActive(false)\n }\n const onDrop = (event: DragEvent): void => {\n if (!hasFiles(event)) return\n event.preventDefault()\n reset()\n intakeImages([...event.dataTransfer?.files ?? []])\n }\n document.addEventListener('dragenter', onDragEnter)\n document.addEventListener('dragover', onDragOver)\n document.addEventListener('dragleave', onDragLeave)\n document.addEventListener('drop', onDrop)\n window.addEventListener('dragend', reset)\n return () => {\n document.removeEventListener('dragenter', onDragEnter)\n document.removeEventListener('dragover', onDragOver)\n document.removeEventListener('dragleave', onDragLeave)\n document.removeEventListener('drop', onDrop)\n window.removeEventListener('dragend', reset)\n }\n }, [panel.open, collapsed, intakeImages])\n\n const onPaste = useCallback((e: React.ClipboardEvent<HTMLTextAreaElement>) => {\n const files = Array.from(e.clipboardData.items).filter((item) => item.kind === 'file').map((item) => item.getAsFile()).filter((f): f is File => f !== null)\n if (files.length === 0) return\n e.preventDefault()\n intakeImages(files)\n }, [intakeImages])\n\n const removeImage = useCallback((id: string) => {\n const target = panel.attachments.find((a) => a.id === id)\n if (target !== undefined) releaseDraftImage(target)\n props.store.patch({ attachments: panel.attachments.filter((a) => a.id !== id) })\n }, [panel.attachments, props.store])\n\n // Load one durable image's bytes → object URL for history rendering.\n const imageLoader: ImageLoader = useCallback(async (ref) => {\n const result = await api.attachment({ childId: panel.activeChildId ?? '', attachmentId: ref.attachmentId })\n if (!result.ok) throw new Error(result.error.message)\n return base64ObjectUrl(result.value.mediaType, result.value.data)\n }, [panel.activeChildId])\n\n // The pending-question entry floats in the portal (SideChatShell), where it is\n // mounted in both modes; only the floating-mode collapsed handle still lives\n // here, next to the collapsed state it belongs to.\n if (!props.embedded) {\n if (!panel.open) return null\n\n if (collapsed) {\n // Collapsed but a question dialog is pending: keep the floating entry so it\n // can still be opened from beside the dialog (not just the collapsed handle).\n if (mainQuestion !== null) {\n return <QuestionFab store={props.store} t={props.t} onOpen={openQuestionPanel} />\n }\n // Collapsed handle: a floating round button on the right edge.\n return (\n <Tooltip label={props.t('panel.expand')} side=\"bottom\">\n <button type=\"button\" className={css.collapsedHandle} onClick={() => { setCollapsed(false) }}>\n <IconPanelLeftOutline16 size={16} />\n </button>\n </Tooltip>\n )\n }\n }\n\n const elapsedMs = anchor === null ? 0 : Math.max(0, now - anchor)\n const showClock = elapsedMs >= 15000\n\n const panelClass = props.embedded\n ? `${css.panel} ${css.panelEmbedded}`\n : `${css.panel}${props.conflictHidden ? ` ${css.panelConflictHidden}` : ''}`\n\n return (\n <div\n className={panelClass}\n style={props.embedded ? undefined : { width }}\n data-sidechat-panel={props.embedded ? 'embedded' : 'floating'}\n >\n {!props.embedded && <div className={css.panelResize} onMouseDown={startResize} />}\n {!props.embedded && (\n <div className={css.panelHeader}>\n <span className={css.panelTitle}>{props.t('panel.title')}</span>\n <div className={css.panelHeaderActions}>\n <Tooltip label={props.t('panel.collapse')} side=\"bottom\">\n <button type=\"button\" className={css.panelIconButton} onClick={() => { setCollapsed(true) }}>\n <IconPanelLeftOutline16 size={16} />\n </button>\n </Tooltip>\n </div>\n </div>\n )}\n\n {mainQuestion !== null && (() => {\n const visible = mainQuestion.filter((q) => !dismissedQuestionIds.includes(q.id))\n if (visible.length === 0) return null\n return (\n <div className={css.questionBlock}>\n <div className={css.questionBlockActions}>\n <button\n type=\"button\"\n className={css.questionToggle}\n onClick={() => { setQuestionCollapsed(!questionCollapsed) }}\n >\n {questionCollapsed ? props.t('question.expand') : props.t('question.collapse')}\n </button>\n <button\n type=\"button\"\n className={css.questionDeleteAll}\n onClick={() => { props.store.dismissAllQuestions(visible.map((q) => q.id)) }}\n >\n {props.t('question.deleteAll')}\n </button>\n </div>\n {visible.map((q) => {\n if (questionCollapsed) {\n return (\n <div key={q.id} className={`${css.questionItem} ${css.questionItemCollapsed}`}>\n <span className={css.questionHeaderText}>{q.header ?? q.question}</span>\n </div>\n )\n }\n const options = q.options ?? []\n return (\n <div key={q.id} className={css.questionItem}>\n <div className={css.questionHeader}>\n <span className={css.questionHeaderText}>{q.header ?? q.question}</span>\n <div className={css.questionHeaderActions}>\n <button\n type=\"button\"\n className={css.questionBringButton}\n disabled={bringingKey !== null}\n onClick={() => { bringQuestionText(buildAllText(q), `newall:${q.id}`, true) }}\n >\n {bringingKey === `newall:${q.id}` ? props.t('question.bringing') : props.t('question.bringAllNew')}\n </button>\n <button\n type=\"button\"\n className={css.questionBringButton}\n disabled={bringingKey !== null}\n onClick={() => { bringQuestionText(buildAllText(q), `all:${q.id}`, false) }}\n >\n {bringingKey === `all:${q.id}` ? props.t('question.bringing') : props.t('question.bringAll')}\n </button>\n <button\n type=\"button\"\n className={css.questionDelete}\n aria-label={props.t('question.delete')}\n title={props.t('question.delete')}\n onClick={() => { props.store.dismissQuestion(q.id) }}\n >\n ×\n </button>\n </div>\n </div>\n <div className={css.questionBody}>{q.question}</div>\n {q.detail !== undefined && q.detail !== '' && <div className={css.questionDetail}>{q.detail}</div>}\n {options.map((o) => {\n const key = `${q.id}:${o.label}`\n return (\n <div key={o.label} className={css.questionOption}>\n <span className={css.questionOptionText}>\n <span className={css.questionOptionLabel}>{o.label}</span>\n {o.description !== undefined && o.description !== '' && <span className={css.questionOptionDesc}> — {o.description}</span>}\n </span>\n <button\n type=\"button\"\n className={css.questionBringButton}\n disabled={bringingKey !== null}\n onClick={() => { bringQuestionText(buildOneText(q, o), `new:${key}`, true) }}\n >\n {bringingKey === `new:${key}` ? props.t('question.bringing') : props.t('question.bringOneNew')}\n </button>\n <button\n type=\"button\"\n className={css.questionBringButton}\n disabled={bringingKey !== null}\n onClick={() => { bringQuestionText(buildOneText(q, o), key, false) }}\n >\n {bringingKey === key ? props.t('question.bringing') : props.t('question.bringOne')}\n </button>\n </div>\n )\n })}\n </div>\n )\n })}\n </div>\n )\n })()}\n\n <div className={css.panelList}>\n {panel.items.length === 0\n ? <div className={css.panelEmpty}>{props.t('panel.empty')}</div>\n : (\n <>\n <div className={css.panelListActions}>\n <button type=\"button\" className={css.panelListDeleteAll} onClick={disposeAll}>\n {props.t('panel.deleteAll')}\n </button>\n </div>\n {panel.items.map((item) => (\n <div key={item.childId} className={css.panelListItemRow}>\n <button\n type=\"button\"\n className={`${css.panelListItem} ${item.childId === panel.activeChildId ? css.panelListItemActive : ''}`}\n onClick={() => { props.store.setActive(item.childId); void refreshHistory(props.store, item.childId) }}\n >\n <span className={css.panelListItemDot} data-running={item.running ? '1' : undefined} />\n <span className={css.panelListItemLabel}>{item.childId}</span>\n </button>\n <button\n type=\"button\"\n className={css.panelListItemRemove}\n aria-label={props.t('panel.delete')}\n title={props.t('panel.delete')}\n onClick={() => { disposeItem(item.childId) }}\n >\n ×\n </button>\n </div>\n ))}\n </>\n )}\n </div>\n\n <div className={css.panelTranscript} ref={scrollRef}>\n {panel.messages.map((message, index) => {\n const textBlocks = message.blocks.filter((b) => b.type === 'text')\n const imageBlocks = message.blocks.filter((b) => b.type === 'image')\n const reasoningBlocks = message.blocks.filter((b) => b.type === 'reasoning')\n const text = textBlocks.map((b) => (b.type === 'text' ? b.text : '')).join('\\n')\n const images = imageBlocks.map((b) => (b.type === 'image' ? { attachment: b.ref } : null)).filter((x): x is { attachment: SidechatImageRef } => x !== null)\n if (message.role === 'user') {\n return (\n <div key={index} className={css.messageUser}>\n {text !== '' && <span className={css.messageUserText}>{text}</span>}\n {images.length > 0 && (\n <ImageGallery images={images.map((image) => image.attachment)} load={imageLoader} align=\"end\" labels={messageImageLabels} />\n )}\n </div>\n )\n }\n return (\n <div key={index} className={css.messageAssistant} data-sidechat-role=\"assistant\">\n {reasoningBlocks.map((block, rIndex) => (\n <ReasoningRow key={rIndex} text={block.type === 'reasoning' ? block.text : ''} t={props.t} />\n ))}\n {text !== '' && <MarkdownText text={text} labels={markdownLabels} />}\n {text !== '' && (\n <div className={css.messageActions}>\n <button\n type=\"button\"\n className={css.messageInsertButton}\n onClick={() => {\n void props.bringToMain(text).then((ok) => {\n if (!ok) props.store.patch({ error: props.t('insert.failed') })\n })\n }}\n >\n {props.t('insert.direct')}\n </button>\n <button\n type=\"button\"\n className={css.messageInsertButton}\n disabled={summarizingIndex === index}\n onClick={() => {\n setSummarizingIndex(index)\n void props.summarizeBring(text).then((ok) => {\n setSummarizingIndex(null)\n if (!ok) props.store.patch({ error: props.t('insert.summarizeFailed') })\n })\n }}\n >\n {summarizingIndex === index ? props.t('insert.summarizing') : props.t('insert.summarize')}\n </button>\n </div>\n )}\n </div>\n )\n })}\n {activeRunning && (\n <div className={css.panelRunning} role=\"status\" aria-live=\"polite\">\n <span className={css.panelRunningDot} />\n <span>{props.t('panel.running')}</span>\n {showClock && <span className={css.panelRunningClock}>{props.formatDuration(elapsedMs)}</span>}\n </div>\n )}\n {panel.error !== null && <div className={css.panelError}>{props.t('panel.error')}: {panel.error}</div>}\n </div>\n\n <div className={css.panelComposer}>\n {panel.attachment !== null && (\n <div className={css.panelAttachment}>\n <span className={css.panelAttachmentText}>{panel.attachment}</span>\n <button type=\"button\" className={css.panelAttachmentRemove} onClick={() => { props.store.patch({ attachment: null }) }}>×</button>\n </div>\n )}\n {panel.attachments.length > 0 && (\n <div className={css.panelAttachmentRail}>\n <AttachmentRail\n items={panel.attachments.map((a) => ({ id: a.id, previewUrl: a.previewUrl, alt: a.file.name || props.t('image.label'), removeLabel: props.t('image.remove') }))}\n labels={attachmentRailLabels}\n onOpen={(item) => { const a = panel.attachments.find((x) => x.id === item.id); if (a !== undefined) setLightbox(a) }}\n onRemove={(item) => { removeImage(item.id) }}\n />\n </div>\n )}\n <textarea\n className={css.panelTextarea}\n placeholder={props.t('panel.input.placeholder')}\n value={panel.draft}\n onChange={(e) => { props.store.patch({ draft: e.target.value }) }}\n onPaste={onPaste}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n send()\n }\n }}\n />\n <div className={css.panelToolbar}>\n <ModelSelect\n directory={panel.directory}\n selection={{ provider: panel.provider, model: panel.model, effort: panel.effort }}\n onSelect={onModelSelect}\n t={props.t}\n />\n <PermissionSelect\n permissions={panel.permissions}\n preset={panel.preset}\n onSelect={onPresetChange}\n t={props.t}\n />\n <Tooltip label={activeRunning ? props.t('panel.stop') : props.t('panel.send')} side=\"top\" delayMs={500}>\n <button\n type=\"button\"\n className={css.primary}\n aria-label={activeRunning ? props.t('panel.stop') : props.t('panel.send')}\n onClick={activeRunning ? stop : send}\n >\n {activeRunning ? <IconStopFill16 size={16} /> : <IconSendOutline16 size={16} />}\n </button>\n </Tooltip>\n </div>\n\n <label className={css.panelLookup}>\n <input\n type=\"checkbox\"\n checked={panel.lookup}\n onChange={(e) => { props.store.patch({ lookup: e.target.checked }) }}\n />\n <span>{props.t('panel.lookup')}</span>\n </label>\n </div>\n\n <div className={css.panelFooter}>\n <button type=\"button\" className={css.panelDispose} onClick={dispose}>{props.t('panel.dispose')}</button>\n </div>\n\n {dragActive && <DropOverlay disabled={false} labels={dropOverlayLabels} />}\n {lightbox !== null && (\n <ImageLightbox\n src={lightbox.previewUrl}\n alt={lightbox.file.name || props.t('image.label')}\n labels={{ dialog: props.t('image.lightboxDialog'), close: props.t('image.close') }}\n onClose={() => { setLightbox(null) }}\n />\n )}\n </div>\n )\n}\n\n/** The \"Side chat\" settings section (two switches + a prompt textarea). */\n/** Dock-mode body: the side-chat panel embedded in the built-in right sidebar's tab pane. */\nfunction EmbeddedSidechatPanel(props: {\n store: SidechatStore\n t: (key: SidechatLocaleKey) => string\n formatDuration: (ms: number) => string\n bringToMain: (text: string) => Promise<boolean>\n summarizeBring: (text: string) => Promise<boolean>\n askSidechat: (text: string) => Promise<boolean>\n askSidechatNew: (text: string) => Promise<boolean>\n}) {\n // The tab seat only mounts for the current session, so the shared store's\n // current-conversation state is the right one to draw.\n return (\n <SidechatPanel\n embedded\n store={props.store}\n t={props.t}\n formatDuration={props.formatDuration}\n bringToMain={props.bringToMain}\n summarizeBring={props.summarizeBring}\n askSidechat={props.askSidechat}\n askSidechatNew={props.askSidechatNew}\n />\n )\n}\n\n/** The portalled shell: floating menus + the panel, switching on prefs.panelHome. */\nfunction SideChatShell(props: {\n store: SidechatStore\n t: (key: SidechatLocaleKey) => string\n formatDuration: (ms: number) => string\n bringToMain: (text: string) => Promise<boolean>\n summarizeBring: (text: string) => Promise<boolean>\n askSidechat: (text: string) => Promise<boolean>\n askSidechatNew: (text: string) => Promise<boolean>\n}) {\n const snap = useSyncExternalStore(props.store.subscribe, props.store.getSnapshot)\n const [builtinOverlay, setBuiltinOverlay] = useState(false)\n\n // While the built-in right sidebar actually shows its panel (docked, fullscreen\n // or a floated pane), the floating side-chat panel would sit on top of it: yield\n // — slide the side chat away and drop its layout margin until the built-in panel\n // is closed again. Docked mode shares the sidebar instead, so it never needs\n // this guard.\n useEffect(() => {\n const probe = (): boolean => {\n if (document.querySelector('[data-sidebar-right-panel][data-sidebar-right-open]') !== null) return true\n const floatHost = document.querySelector('[data-sidebar-right-float-host]')\n if (floatHost !== null && floatHost.childElementCount > 0) return true\n return false\n }\n let active = probe()\n const apply = (): void => {\n const next = probe()\n if (next !== active) {\n active = next\n setBuiltinOverlay(next)\n }\n }\n apply()\n const observer = new MutationObserver(apply)\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['data-sidebar-right-open', 'data-sidebar-right-panel', 'data-sidebar-right-float-host'],\n })\n window.addEventListener('resize', apply)\n return () => {\n observer.disconnect()\n window.removeEventListener('resize', apply)\n }\n }, [])\n\n return (\n <>\n <SelectionMenu store={props.store} t={props.t} />\n <BringBackMenu store={props.store} t={props.t} bringToMain={props.bringToMain} summarizeBring={props.summarizeBring} />\n {/* The pending-question entry floats in the portal, not inside the panel:\n in dock mode the panel (and its tab body) does not exist until the tab\n was opened at least once, but the entry must appear regardless. */}\n {snap.mainQuestion !== null && !snap.panel.open && (\n <QuestionFab\n store={props.store}\n t={props.t}\n onOpen={() => { props.store.openPanel(snap.panel.parentSessionId) }}\n />\n )}\n {snap.prefs.panelHome === 'floating' && (\n <SidechatPanel\n store={props.store}\n t={props.t}\n formatDuration={props.formatDuration}\n bringToMain={props.bringToMain}\n summarizeBring={props.summarizeBring}\n askSidechat={props.askSidechat}\n askSidechatNew={props.askSidechatNew}\n conflictHidden={builtinOverlay}\n />\n )}\n </>\n )\n}\n\nfunction SettingsSection(props: { store: SidechatStore; t: (key: SidechatLocaleKey) => string }) {\n const { store, t } = props\n const { prefs } = useSyncExternalStore(store.subscribe, store.getSnapshot)\n const [promptDraft, setPromptDraft] = useState(prefs.defaultPrompt)\n\n // Keep the local textarea in sync with the persisted value.\n useEffect(() => { setPromptDraft(prefs.defaultPrompt) }, [prefs.defaultPrompt])\n\n const toggle = useCallback((patch: Partial<SubchatPrefs>) => {\n const previous = prefs\n const next = { ...previous, ...patch }\n store.setPrefs(next)\n void api.settingsUpdate(patch).then((result) => {\n if (!result.ok) store.setPrefs(previous)\n })\n }, [prefs, store])\n\n const commitPrompt = useCallback(() => {\n const value = promptDraft.trim()\n if (value !== prefs.defaultPrompt) toggle({ defaultPrompt: value })\n }, [promptDraft, prefs.defaultPrompt, toggle])\n\n return (\n <div className={css.settingsSection}>\n <label className={css.settingsRow}>\n <span className={css.settingsRowText}>\n <span className={css.settingsRowTitle}>{t('settings.lookupTitle')}</span>\n <span className={css.settingsRowDesc}>{t('settings.lookupDesc')}</span>\n </span>\n <input\n type=\"checkbox\"\n className={css.settingsToggle}\n checked={prefs.lookupDefault}\n aria-label={t('settings.lookupTitle')}\n onChange={(e) => { toggle({ lookupDefault: e.currentTarget.checked }) }}\n />\n </label>\n <label className={css.settingsRow}>\n <span className={css.settingsRowText}>\n <span className={css.settingsRowTitle}>{t('settings.sendImmediatelyTitle')}</span>\n <span className={css.settingsRowDesc}>{t('settings.sendImmediatelyDesc')}</span>\n </span>\n <input\n type=\"checkbox\"\n className={css.settingsToggle}\n checked={prefs.sendImmediately}\n aria-label={t('settings.sendImmediatelyTitle')}\n onChange={(e) => { toggle({ sendImmediately: e.currentTarget.checked }) }}\n />\n </label>\n <div className={css.settingsRow}>\n <span className={css.settingsRowText}>\n <span className={css.settingsRowTitle}>{t('settings.bringModeTitle')}</span>\n <span className={css.settingsRowDesc}>{t('settings.bringModeDesc')}</span>\n </span>\n </div>\n <div className={css.settingsBringMode}>\n <label className={`${css.settingsBringOption} ${prefs.bringMode === 'draft' ? css.settingsBringOptionActive : ''}`}>\n <input\n type=\"radio\"\n name=\"dsh-side-chat-bring-mode\"\n className={css.settingsToggle}\n checked={prefs.bringMode === 'draft'}\n onChange={() => { toggle({ bringMode: 'draft' }) }}\n />\n <span className={css.settingsRowText}>\n <span className={css.settingsRowTitle}>{t('settings.bringModeDraftTitle')}</span>\n <span className={css.settingsRowDesc}>{t('settings.bringModeDraftDesc')}</span>\n </span>\n </label>\n <label className={`${css.settingsBringOption} ${prefs.bringMode === 'context' ? css.settingsBringOptionActive : ''}`}>\n <input\n type=\"radio\"\n name=\"dsh-side-chat-bring-mode\"\n className={css.settingsToggle}\n checked={prefs.bringMode === 'context'}\n onChange={() => { toggle({ bringMode: 'context' }) }}\n />\n <span className={css.settingsRowText}>\n <span className={css.settingsRowTitle}>{t('settings.bringModeContextTitle')}</span>\n <span className={css.settingsRowDesc}>{t('settings.bringModeContextDesc')}</span>\n </span>\n </label>\n </div>\n <div className={css.settingsRow}>\n <span className={css.settingsRowText}>\n <span className={css.settingsRowTitle}>{t('settings.panelHomeTitle')}</span>\n <span className={css.settingsRowDesc}>{t('settings.panelHomeDesc')}</span>\n </span>\n </div>\n <div className={css.settingsBringMode}>\n <label className={`${css.settingsBringOption} ${prefs.panelHome === 'floating' ? css.settingsBringOptionActive : ''}`}>\n <input\n type=\"radio\"\n name=\"dsh-side-chat-panel-home\"\n className={css.settingsToggle}\n checked={prefs.panelHome === 'floating'}\n onChange={() => { toggle({ panelHome: 'floating' }) }}\n />\n <span className={css.settingsRowText}>\n <span className={css.settingsRowTitle}>{t('settings.panelHomeFloatingTitle')}</span>\n <span className={css.settingsRowDesc}>{t('settings.panelHomeFloatingDesc')}</span>\n </span>\n </label>\n <label className={`${css.settingsBringOption} ${prefs.panelHome === 'sidebar-right' ? css.settingsBringOptionActive : ''}`}>\n <input\n type=\"radio\"\n name=\"dsh-side-chat-panel-home\"\n className={css.settingsToggle}\n checked={prefs.panelHome === 'sidebar-right'}\n onChange={() => { toggle({ panelHome: 'sidebar-right' }) }}\n />\n <span className={css.settingsRowText}>\n <span className={css.settingsRowTitle}>{t('settings.panelHomeDockTitle')}</span>\n <span className={css.settingsRowDesc}>{t('settings.panelHomeDockDesc')}</span>\n </span>\n </label>\n </div>\n <div className={css.settingsRow}>\n <span className={css.settingsRowText}>\n <span className={css.settingsRowTitle}>{t('settings.defaultPromptTitle')}</span>\n <span className={css.settingsRowDesc}>{t('settings.defaultPromptDesc')}</span>\n </span>\n </div>\n <textarea\n className={css.settingsPromptInput}\n value={promptDraft}\n placeholder={t('settings.defaultPromptPlaceholder')}\n aria-label={t('settings.defaultPromptTitle')}\n onChange={(e) => { setPromptDraft(e.currentTarget.value) }}\n onBlur={commitPrompt}\n />\n </div>\n )\n}\n\n/** Client plugin body. */\nexport function apply(ctx: Context): void {\n const store = createStore()\n\n // Localized copy follows the DSH locale (module-level mirror for callbacks).\n let activeLocale = ctx.locale.getSnapshot().active\n\n /** Append text to the main composer draft (draft bring mode). */\n const draftBring = (text: string): boolean => {\n const trimmed = text.trim()\n if (trimmed === '') return false\n const sessionId = ctx.sessions.list.getSnapshot().current\n if (sessionId === undefined) return false\n try {\n const actx = ctx.sessions.scope(sessionId)\n if (actx === undefined) return false\n const input = ctx.conversation.input.for(actx)\n const draft = input.state.getSnapshot().draft\n input.setDraft(draft === '' ? trimmed : `${draft}\\n\\n${trimmed}`)\n return true\n } catch {\n return false\n }\n }\n\n /** Inject text into the main conversation as a collapsed, source-tagged context row. */\n const injectBring = async (text: string, summary: string): Promise<boolean> => {\n const trimmed = text.trim()\n if (trimmed === '') return false\n const sessionId = ctx.sessions.list.getSnapshot().current\n if (sessionId === undefined) return false\n const result = await api.inject({ parentSessionId: sessionId, text: trimmed, summary })\n return result.ok\n }\n\n /** Land text in the main conversation per the configured bring mode. */\n const landText = async (text: string, summaryKey: SidechatLocaleKey): Promise<boolean> => {\n const mode = store.getSnapshot().prefs.bringMode\n if (mode === 'context') {\n return injectBring(text, translate(activeLocale, summaryKey))\n }\n return draftBring(text)\n }\n\n /** Bring a reply back directly (routed through the configured mode). */\n const bringToMain = (text: string): Promise<boolean> => landText(text, 'insert.contextSummary')\n\n /** Summarize text with the side chat's inherited model, then bring the summary back. */\n const summarizeBring = async (text: string): Promise<boolean> => {\n const trimmed = text.trim()\n if (trimmed === '') return false\n const snap = store.getSnapshot().panel\n if (snap.parentSessionId === '') return false\n const result = await api.summarize({\n parentSessionId: snap.parentSessionId,\n text: trimmed,\n ...(snap.provider !== '' ? { provider: snap.provider } : {}),\n ...(snap.model !== '' ? { model: snap.model } : {}),\n ...(snap.effort !== '' ? { reasoningEffort: snap.effort } : {}),\n locale: activeLocale,\n })\n if (!result.ok) return false\n return landText(result.value.summary, 'insert.summarizeContextSummary')\n }\n\n /** Ask a piece of text in the side chat (start a new one, or continue the active one). */\n const askSidechat = async (text: string): Promise<boolean> => {\n const trimmed = text.trim()\n if (trimmed === '') return false\n const parentSessionId = ctx.sessions.list.getSnapshot().current\n if (parentSessionId === undefined) return false\n const panel = store.getSnapshot().panel\n const content: PromptContentPart[] = [{ type: 'text', text: trimmed }]\n\n // Reuse the active side chat, else the first existing one, else create one —\n // so bringing dialog questions in doesn't pile up a new side chat per ask.\n const target = panel.activeChildId ?? panel.items[0]?.childId ?? null\n\n if (target === null) {\n const result = await api.start({\n parentSessionId,\n content,\n lookupEnabled: panel.lookup,\n ...(panel.provider !== '' ? { provider: panel.provider } : {}),\n ...(panel.model !== '' ? { model: panel.model } : {}),\n ...(panel.effort !== '' ? { reasoningEffort: panel.effort } : {}),\n })\n if (result.ok) {\n store.openPanel(parentSessionId)\n store.setActive(result.value.childId)\n store.patch({ provider: result.value.provider, model: result.value.model, effort: result.value.reasoningEffort ?? '' })\n void refreshList(store, parentSessionId)\n void refreshDirectory(store)\n return true\n }\n return false\n }\n\n const childId = target\n if (childId !== panel.activeChildId) store.setActive(childId)\n setItemRunning(store, childId, true)\n const result = await api.followup({ childId, content, lookupEnabled: panel.lookup })\n if (!result.ok) {\n setItemRunning(store, childId, false)\n store.patch({ error: result.error.message })\n }\n void refreshList(store, parentSessionId)\n void refreshHistory(store, childId)\n return result.ok\n }\n\n /** Ask a piece of text in a brand-new side chat (never reuses an existing one). */\n const askSidechatNew = async (text: string): Promise<boolean> => {\n const trimmed = text.trim()\n if (trimmed === '') return false\n const parentSessionId = ctx.sessions.list.getSnapshot().current\n if (parentSessionId === undefined) return false\n const panel = store.getSnapshot().panel\n const content: PromptContentPart[] = [{ type: 'text', text: trimmed }]\n const result = await api.start({\n parentSessionId,\n content,\n lookupEnabled: panel.lookup,\n ...(panel.provider !== '' ? { provider: panel.provider } : {}),\n ...(panel.model !== '' ? { model: panel.model } : {}),\n ...(panel.effort !== '' ? { reasoningEffort: panel.effort } : {}),\n })\n if (result.ok) {\n store.openPanel(parentSessionId)\n store.setActive(result.value.childId)\n store.patch({ provider: result.value.provider, model: result.value.model, effort: result.value.reasoningEffort ?? '' })\n void refreshList(store, parentSessionId)\n void refreshDirectory(store)\n return true\n }\n return false\n }\n\n ctx.effect(() => {\n const offZh = ctx.locale.register(LOCALE_NS, 'zh', zh)\n const offEn = ctx.locale.register(LOCALE_NS, 'en', en)\n const offSub = ctx.locale.subscribe(() => {\n activeLocale = ctx.locale.getSnapshot().active\n store.patch({})\n })\n return () => { offZh(); offEn(); offSub() }\n }, 'dsh-side-chat: dictionaries')\n\n // Load the persisted preferences once.\n void api.settingsGet().then((result) => {\n if (!result.ok) return\n const raw = result.value.value as Partial<SubchatPrefs> | null | undefined\n if (raw === null || raw === undefined) return\n store.setPrefs({\n lookupDefault: typeof raw.lookupDefault === 'boolean' ? raw.lookupDefault : SUBCHAT_PREFS_DEFAULTS.lookupDefault,\n sendImmediately: typeof raw.sendImmediately === 'boolean' ? raw.sendImmediately : SUBCHAT_PREFS_DEFAULTS.sendImmediately,\n defaultPrompt: typeof raw.defaultPrompt === 'string' ? raw.defaultPrompt : SUBCHAT_PREFS_DEFAULTS.defaultPrompt,\n bringMode: raw.bringMode === 'context' ? 'context' : 'draft',\n panelHome: raw.panelHome === 'floating' ? 'floating' : 'sidebar-right',\n })\n })\n\n // Track the current conversation (per-conversation panel state).\n ctx.effect(() => {\n let lastId: string | undefined\n const sync = (): void => {\n const next = ctx.sessions.list.getSnapshot().current\n if (next === lastId) return\n lastId = next\n store.setCurrent(next)\n if (next === undefined) return\n void refreshList(store, next)\n const panel = store.getSnapshot().panel\n if (panel.open && panel.activeChildId !== null) {\n void refreshHistory(store, panel.activeChildId)\n }\n }\n sync()\n return ctx.sessions.list.subscribe(sync)\n }, 'dsh-side-chat: follow current conversation')\n\n // Track the main conversation's pending user-question dialog so the panel can\n // list its questions/options with per-item bring-back buttons. DSH surfaces\n // the pending interaction through the `uiSession.pendingInteractions` service\n // (a per-session interaction), so we read it there instead of a session\n // snapshot. Only re-publishes when the question object identity changes.\n ctx.effect(() => {\n let lastQuestion: unknown = undefined\n const read = (): void => {\n const sessionId = ctx.sessions.list.getSnapshot().current\n if (sessionId === undefined) {\n store.setMainQuestion(null)\n return\n }\n const interaction = ctx.uiSession.pendingInteractions.getSnapshot().get(sessionId)\n const isQuestion = interaction !== undefined && (interaction.kind === 'question' || interaction.kind === 'plan-review')\n const question = isQuestion ? interaction : undefined\n if (question === lastQuestion) return\n lastQuestion = question\n const questions = question?.questions ?? null\n store.setMainQuestion(questions === null ? null : [...questions])\n }\n read()\n const offPending = ctx.uiSession.pendingInteractions.subscribe(read)\n const offList = ctx.sessions.list.subscribe(read)\n return () => { offPending(); offList() }\n }, 'dsh-side-chat: track main question dialog')\n\n // Safety net: once the main conversation no longer has a pending question\n // dialog, clear the tracked question so the side-panel list disappears too\n // (covers cases where the subscription misses the settlement edge).\n ctx.effect(() => {\n const timer = window.setInterval(() => {\n if (store.getSnapshot().mainQuestion === null) return\n const sessionId = ctx.sessions.list.getSnapshot().current\n if (sessionId === undefined) return\n const interaction = ctx.uiSession.pendingInteractions.getSnapshot().get(sessionId)\n const hasQuestion = interaction !== undefined && (interaction.kind === 'question' || interaction.kind === 'plan-review')\n if (!hasQuestion) store.setMainQuestion(null)\n }, 1200)\n return () => { window.clearInterval(timer) }\n }, 'dsh-side-chat: clear stale question dialog')\n\n // Optional dock mode: live inside the new built-in right sidebar\n // (dsh-client-ui-sidebar-right) as a \"Side chat\" tab instead of the floating\n // panel. Registered on demand; falls back to floating when the service is\n // absent (older deployments) without ever failing to mount.\n ctx.effect(() => {\n let cleanup: (() => void) | undefined\n // Explicit phase machine: sync() runs on every store notify, and patching\n // the store from inside sync() must never re-enter registration work.\n let phase: 'idle' | 'docked' | 'unavailable' = 'idle'\n\n const sync = (): void => {\n const docked = store.getSnapshot().prefs.panelHome === 'sidebar-right'\n if (docked) {\n if (phase === 'docked' || phase === 'unavailable') return\n const sidebarRight = ctx.get('sidebarRight') as SideSidebarRight | undefined\n if (sidebarRight === undefined) {\n phase = 'unavailable'\n store.patch({ error: translate(activeLocale, 'dock.unavailable') })\n return\n }\n const dockT = (key: SidechatLocaleKey): string => translate(activeLocale, key)\n\n const disposeType = sidebarRight.tabs.register({\n id: SIDEBAR_TAB_ID,\n kind: SIDEBAR_TAB_KIND,\n priority: 'extension',\n title: () => dockT('dock.title'),\n })\n // Body seat: rendered for the committed tab whose type id matches `key`.\n const disposeBody = ctx.slots.inject('sidebar.right.pane.tab', () => ctx.slots.register({\n name: 'sidebar.right.pane.tab',\n key: SIDEBAR_TAB_ID,\n inject: () => ({\n store,\n t: dockT,\n formatDuration,\n bringToMain,\n summarizeBring,\n askSidechat,\n askSidechatNew,\n }),\n }, EmbeddedSidechatPanel))\n const launch = (): void => {\n try {\n sidebarRight.openTab(SIDEBAR_TAB_KIND, { revealIfOpened: true })\n } catch (error) {\n store.patch({ error: `${translate(activeLocale, 'dock.openFailed')}: ${error instanceof Error ? error.message : String(error)}` })\n }\n }\n store.setDockLaunch(launch)\n cleanup = () => {\n store.setDockLaunch(null)\n disposeBody()\n disposeType()\n }\n phase = 'docked'\n return\n }\n if (phase === 'idle') return\n phase = 'idle'\n store.setDockLaunch(null)\n cleanup?.()\n cleanup = undefined\n }\n\n sync()\n const off = store.subscribe(sync)\n return () => {\n off()\n cleanup?.()\n }\n }, 'dsh-side-chat: right-sidebar dock')\n\n // The \"Side chat\" settings section.\n const settingsT = (key: SidechatLocaleKey): string => translate(activeLocale, key)\n const formatDuration = (ms: number): string => formatRunDuration(ms, activeLocale)\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'dsh-side-chat',\n order: 110,\n label: () => settingsT('settingsNav'),\n inject: () => ({ store, t: settingsT }),\n }, SettingsSection))\n\n // Mount the portalled tree onto document.body.\n ctx.effect(() => {\n const host = document.createElement('div')\n host.setAttribute('data-dsh-side-chat', '')\n document.body.appendChild(host)\n const root = createRoot(host)\n\n const t = (key: SidechatLocaleKey): string => translate(activeLocale, key)\n root.render(<SideChatShell\n store={store}\n t={t}\n formatDuration={formatDuration}\n bringToMain={bringToMain}\n summarizeBring={summarizeBring}\n askSidechat={askSidechat}\n askSidechatNew={askSidechatNew}\n />)\n\n return () => {\n root.unmount()\n host.remove()\n }\n }, 'dsh-side-chat: panel mount')\n}\n"],"mappings":"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"}
|