{"version":3,"file":"client.cjs","names":["en: Record<keyof typeof zh, string>","conversationSeat: (() => void) | undefined","currentSpec: PanelContentSpec | undefined","rootCtx: Context | undefined","api: PanelProtocol","SlotOutlet","SlotOutlet"],"sources":["../src/client/locale.ts","../src/client/constants.ts","../src/client/service.tsx","../src/client/icons.tsx","../src/client/sidebar.tsx","../src/client/styles.ts","../src/client/index.ts"],"sourcesContent":["import type { Context } from '@deepseek-ai/cordis'\n\n/**\n * locale.ts — 本插件文案（zh/en 双语）。命名空间 `panel`：\n * 克隆 SidebarRoot 的壳控制文案（新会话/折叠开关，与官方 sidebar NS 同值，\n * 但独立命名空间，互不干扰）。\n */\nexport const NS = 'panel'\n\nconst zh = {\n  'session.new': '新会话',\n  'session.new.label': '新建会话',\n  'toggle.open': '打开侧边栏',\n  'toggle.collapse': '收起侧边栏',\n}\n\nconst en: Record<keyof typeof zh, string> = {\n  'session.new': 'New Session',\n  'session.new.label': 'New session',\n  'toggle.open': 'Open sidebar',\n  'toggle.collapse': 'Collapse sidebar',\n}\n\n/** 注册面板文案命名空间（effect 生命周期，随插件卸载注销）。 */\nexport function installPanelLocale(ctx: Context): void {\n  ctx.effect(\n    () => {\n      const disposeZh = ctx.locale.register(NS, 'zh', zh)\n      const disposeEn = ctx.locale.register(NS, 'en', en)\n      return () => {\n        disposeZh()\n        disposeEn()\n      }\n    },\n    'dsh-tauri-panel: dictionaries',\n  )\n}\n","/** Stable client-side identifiers shared by the panel implementation. */\nexport const PANEL_PROTOCOL_SERVICE = 'panel.protocol'\nexport const PANEL_VIEW_SLOT = 'conversation'\nexport const PANEL_VIEW_COMPONENT_ID = 'dsh-tauri-panel-conversation-seat'\nexport const PANEL_STYLE_ID = 'dsh-tauri-panel-styles'\nexport const COLLAPSE_SETTLE_MS = 150\nexport const SCROLLBAR_LINGER_MS = 2000\nexport const SIDEBAR_INTERACTIVE_SELECTOR = 'button,a[href],input,select,textarea,summary,[role=\"button\"],[role=\"link\"],[role=\"menuitem\"],[role=\"option\"],[role=\"tab\"],[role=\"treeitem\"][aria-selected]'\nexport const WORKSPACE_GROUP_SELECTOR = '[role=\"treeitem\"][aria-expanded]'\n\n/**\n * 只改变侧栏呈现、不应关闭面板的官方控件。dsh-client-ui-workspace 的工作区头部\n * “分组方式”（viewOptions.label）与“添加工作区”（workspace.add）按钮的\n * aria-label 随 locale 变化（仓库仅内置 zh/en 两组），这里同时匹配两种语言。\n */\nexport const SIDEBAR_KEEP_OPEN_SELECTOR = 'button[aria-label=\"视图选项\"],button[aria-label=\"View options\"],button[aria-label=\"添加工作区\"],button[aria-label=\"Add workspace\"]'\n\nexport const PANEL_CLASSES = {\n  root: 'dshp-root',\n  collapsed: 'dshp-collapsed',\n  railIn: 'dshp-railIn',\n  fading: 'dshp-fading',\n  quietBars: 'dshp-quietBars',\n  wide: 'dshp-wide',\n  logoRow: 'dshp-logoRow',\n  brand: 'dshp-brand',\n  brandIdentity: 'dshp-brandIdentity',\n  brandMark: 'dshp-brandMark',\n  brandName: 'dshp-brandName',\n  fallbackBrandName: 'dshp-fallbackBrandName',\n  iconButton: 'dshp-iconButton',\n  toggle: 'dshp-toggle',\n  railMark: 'dshp-railMark',\n  panelArea: 'dshp-panelArea',\n  menuItem: 'dshp-menuItem',\n  menuItemSelected: 'dshp-menuItemSelected',\n  newSession: 'dshp-newSession',\n  menuItemIcon: 'dshp-menuItemIcon',\n  menuItemLabel: 'dshp-menuItemLabel',\n  regionArea: 'dshp-regionArea',\n  footArea: 'dshp-footArea',\n  footerActions: 'dshp-footerActions',\n  settingsArea: 'dshp-settingsArea',\n  panelView: 'dshp-panelView',\n  panelViewColumn: 'dshp-panelViewColumn',\n} as const\n\nexport const PANEL_DATA_ATTRIBUTES = {\n  sidebar: 'data-dshp-panel-sidebar',\n  active: 'data-dshp-panel-active',\n  action: 'data-dshp-panel-action',\n  view: 'data-dshp-panel-view',\n} as const\n","import type { Context } from '@deepseek-ai/cordis'\nimport type { ReactElement } from 'react'\nimport type { PanelActionItemProps, PanelContentSpec, PanelProtocol } from './types'\nimport { createExternalStore } from 'dsh-tauri/client'\nimport { useSyncExternalStore } from 'react'\nimport { PANEL_CLASSES, PANEL_DATA_ATTRIBUTES, PANEL_PROTOCOL_SERVICE, PANEL_VIEW_COMPONENT_ID, PANEL_VIEW_SLOT, SIDEBAR_INTERACTIVE_SELECTOR, SIDEBAR_KEEP_OPEN_SELECTOR, WORKSPACE_GROUP_SELECTOR } from './constants'\nimport { NS } from './locale'\n\nexport type { PanelActionItemProps, PanelContentSpec, PanelProtocol } from './types'\n\n/**\n * service.tsx — 面板协议宿主服务（协议能力，见 PROTOCOL.md）。\n *\n * 宿主对外只暴露两个构件，子插件无需处理任何状态/机制：\n *   - `<ActionItem>`：面板区条目组件（样式、折叠态、active 态全由宿主承担）；\n *   - `renderPanelContent(spec)`：切换会话区替换（conversation 槽条件 shadow），\n *     子插件在 ActionItem 的 onClick 里调用。\n *\n * 机制（全部在宿主，单一权威）：\n *   - 服务经 ctx.reflect.provide('panel.protocol', api) 暴露（cordis\n *     ReflectService，官方 runtime 同款用法 ctx.reflect.provide(\"sessions\", this)）；\n *   - renderPanelContent：conversation 槽（single/session-maybe，layout 声明、\n *     官方 ui-conversation priority 0 是唯一注册者）以 priority -1 **动态注册**\n *     → 整个右侧会话区被替换（CenterColumn 内、零定位层）；官方条目被\n *     shadow 但仍 live（children/locale 有效）。再调（同 id）→ dispose 句柄\n *     → 官方恢复（toggle 语义）。\n *   - 替换状态存共享 snapshot store：ActionItem 经 useSyncExternalStore\n *     感知「当前替换 id === 自己 id」→ 保持 active（hover）样式。\n *   - 退出时机：无关闭按钮——document capture 层监听 pointerdown，只在侧栏\n *     内的有效导航/操作控件被点击时恢复官方会话界面；空白区、面板条目和只\n *     改变工作区列表呈现的控件（工作区折叠行、分组、添加工作区）保持面板。\n *     右侧区域（第三方悬浮按钮等）不影响替换，避免误关。\n *\n * 不能常驻注册 + SlotOutlet 透传：SlotOutlet 对 single 槽只渲染 live 条目，\n * 自己 live 后渲染官方条目 = 自递归（无公开 API 渲染被 shadow 条目）。\n */\n\n/** 当前 conversation 替换的 inject 句柄（undefined = 官方会话区 live）。 */\nlet conversationSeat: (() => void) | undefined\n/** 当前替换视图规格。 */\nlet currentSpec: PanelContentSpec | undefined\n/** 替换状态（ActionItem active 样式订阅源）。 */\nconst panelViewStore = createExternalStore<{ id: string } | null>(null)\n/** 根上下文（renderPanelContent 内部注册用）。 */\nlet rootCtx: Context | undefined\n\n/** 渲染 conversation 槽条目：包标记容器 + 宿主内容列（宽度约束由宿主决定，见 styles.ts）。 */\nfunction ConversationSeat({ t }: { t: (key: string) => string }): ReactElement | null {\n  const spec = currentSpec\n  if (!spec)\n    return null\n  const View = spec.render\n  return (\n    <div {...{ [PANEL_DATA_ATTRIBUTES.view]: '' }} className={PANEL_CLASSES.panelView}>\n      {/* 内容列：对齐官方内容列宽度（max-width var(--dsh-chat-content-width, 748px)），\n          子插件零宽度关注，只负责内容自身布局（垂直方向自定）。 */}\n      <div style={{ padding: '16px 16px 16px 8px' }}>\n        <div className={PANEL_CLASSES.panelViewColumn}>\n          <View t={t} />\n        </div>\n      </div>\n    </div>\n  )\n}\n\n/**\n * 判断侧栏 pointerdown 是否代表离开当前面板的导航动作：\n *   - 面板视图/条目与空白区不是动作，保持面板；\n *   - 只改变侧栏呈现的控件保持面板（工作区“分组方式”“添加工作区”按钮，\n *     以及工作区折叠行本体——折叠行内的菜单/新建按钮仍是动作，会关闭）；\n *   - 其余在侧栏内的可交互控件（会话行、搜索结果、设置等）视为导航，关闭。\n */\nexport function shouldClosePanelForSidebarTarget(target: Element | null): boolean {\n  if (!target)\n    return false\n  const sidebar = target.closest(`[${PANEL_DATA_ATTRIBUTES.sidebar}]`)\n  if (!sidebar)\n    return false\n  if (target.closest(`[${PANEL_DATA_ATTRIBUTES.view}],[${PANEL_DATA_ATTRIBUTES.action}]`))\n    return false\n  if (target.closest(SIDEBAR_KEEP_OPEN_SELECTOR))\n    return false\n\n  const interactive = target.closest(SIDEBAR_INTERACTIVE_SELECTOR)\n  if (!interactive || !sidebar.contains(interactive))\n    return false\n\n  // 工作区折叠行本身不在可交互集合内（自然保持面板）；嵌套按钮（工作区菜单、\n  // 新建会话）是真实动作，按自身语义关闭。\n  const workspaceGroup = target.closest(WORKSPACE_GROUP_SELECTOR)\n  return workspaceGroup === null || interactive !== workspaceGroup\n}\n\n/** 捕获侧栏导航动作并在目标自身的 click 行为执行前恢复官方会话区。 */\nfunction onPointerDownCapture(event: PointerEvent): void {\n  if (!conversationSeat)\n    return\n  if (shouldClosePanelForSidebarTarget(event.target instanceof Element ? event.target : null))\n    closeConversation()\n}\n\n/** 将面板激活态投影到侧栏根，供官方工作区行的跨插件样式协议使用。 */\nfunction setSidebarPanelActive(active: boolean): void {\n  const sidebar = document.querySelector(`[${PANEL_DATA_ATTRIBUTES.sidebar}]`)\n  if (active)\n    sidebar?.setAttribute(PANEL_DATA_ATTRIBUTES.active, '')\n  else\n    sidebar?.removeAttribute(PANEL_DATA_ATTRIBUTES.active)\n}\n\n/** 打开会话区替换：动态注册 priority -1 的 conversation 条目。 */\nfunction openConversation(ctx: Context, spec: PanelContentSpec): void {\n  if (currentSpec && currentSpec.id === spec.id)\n    return\n  if (conversationSeat)\n    closeConversation()\n  currentSpec = spec\n  panelViewStore.set({ id: spec.id })\n  conversationSeat = ctx.slots.inject(PANEL_VIEW_SLOT as never, () =>\n    ctx.slots.register(\n      {\n        name: PANEL_VIEW_SLOT,\n        id: PANEL_VIEW_COMPONENT_ID,\n        priority: -1,\n        locale: spec.locale ?? NS,\n      } as never,\n      ConversationSeat,\n    ))\n  document.addEventListener('pointerdown', onPointerDownCapture, true)\n  setSidebarPanelActive(true)\n}\n\n/** 关闭会话区替换：dispose inject 句柄 → 注销条目 → 官方 ui-conversation 恢复。 */\nfunction closeConversation(): void {\n  conversationSeat?.()\n  conversationSeat = undefined\n  currentSpec = undefined\n  panelViewStore.set(null)\n  document.removeEventListener('pointerdown', onPointerDownCapture, true)\n  setSidebarPanelActive(false)\n}\n\n/** 订阅当前替换 id（null = 官方会话区）。 */\nfunction usePanelViewId(): { id: string } | null {\n  return useSyncExternalStore(\n    fn => panelViewStore.subscribe(fn),\n    () => panelViewStore.getSnapshot(),\n  )\n}\n\n/** ActionItem：面板区条目（样式/折叠/active 态全宿主，子插件只填内容与行为）。 */\nexport function PanelActionItem({ id, icon, onClick, children }: PanelActionItemProps): ReactElement {\n  const active = usePanelViewId()?.id === id\n  return (\n    <button\n      type=\"button\"\n      className={active ? `${PANEL_CLASSES.menuItem} ${PANEL_CLASSES.menuItemSelected}` : PANEL_CLASSES.menuItem}\n      {...{ [PANEL_DATA_ATTRIBUTES.action]: '' }}\n      onClick={onClick}\n    >\n      {icon !== undefined && <span className={PANEL_CLASSES.menuItemIcon}>{icon}</span>}\n      <span className={PANEL_CLASSES.menuItemLabel}>{children}</span>\n    </button>\n  )\n}\n\n/**\n * 切换会话区替换：未替换则打开（conversation 槽动态注册 spec.render），\n * 已替换则关闭恢复官方会话界面。子插件在 ActionItem 的 onClick 里调用。\n * @param spec - 内容区规格。\n */\nexport function renderPanelContent(spec: PanelContentSpec): void {\n  if (!rootCtx)\n    return\n  if (conversationSeat)\n    closeConversation()\n  else\n    openConversation(rootCtx, spec)\n}\n\n/** 显式关闭当前面板内容；未打开面板时为空操作。 */\nexport function closePanelContent(): void {\n  if (conversationSeat)\n    closeConversation()\n}\n\n/**\n * 安装宿主服务：经 ctx.reflect.provide 暴露 panel.protocol（effect 生命周期，\n * 插件卸载即注销）。不依赖 renderer 补丁（conversation 注册只走 slots\n * runtime）——旧核心下内容区替换仍可用（仅面板区条目需 renderer）。\n * @param ctx - 客户端根上下文。\n */\nexport function installPanelService(ctx: Context): void {\n  const api: PanelProtocol = {\n    ActionItem: PanelActionItem,\n    renderPanelContent,\n    closePanelContent,\n  }\n  // Publish synchronously during apply: alpha slot injections can run before\n  // sibling effects, so publishing from inside ctx.effect makes consumers see\n  // an absent protocol and permanently skip their action registration.\n  rootCtx = ctx\n  const disposeProtocol = ctx.reflect.provide(PANEL_PROTOCOL_SERVICE, api)\n  ctx.effect(() => {\n    return () => {\n      if (rootCtx === ctx) {\n        closePanelContent()\n        rootCtx = undefined\n      }\n      disposeProtocol()\n    }\n  }, 'dsh-tauri-panel: panel.protocol host service')\n}\n","import type { ReactElement } from 'react'\nimport type { IconProps } from './types'\n\nexport type { IconProps } from './types'\n\n/**\n * icons.tsx — 自绘内联 SVG 图标（Gravity 风格描边，currentColor）。\n * 不依赖 @deepseek-ai/dsh-client-ui-primitives 的类型/运行时（loader 模块表\n * 虽提供该模块，但自绘零外部表面、跨部署更稳）。\n */\n\n/**\n * 新会话：官方 ChatOutline16 同款（聊天气泡 + 加号，fill 风格）。\n * primitives 包为 loader 运行时提供、不打进产物；此处自绘官方同一 path——\n * 取自桌面前端 bundle（dsh-web-frontend/dist/assets/index-ClqxG24t.js，导出表\n * ChatOutline16:V9），保证与官方「新会话」图标完全一致。\n */\nexport function ChatOutline({ size = 16, className }: IconProps): ReactElement {\n  return (\n    <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" className={className} aria-hidden=\"true\">\n      <path d=\"M8.00003 0.3237C3.76075 0.3237 0.32373 3.76072 0.32373 8C0.32373 9.17603 0.589121 10.2922 1.0632 11.2901L1.35291 11.8989L2.5705 11.3205L2.28079 10.7117C1.89079 9.89074 1.67301 8.97167 1.67301 8C1.67301 4.50546 4.50549 1.67298 8.00003 1.67298C11.4946 1.67298 14.3271 4.50546 14.3271 8C14.3271 11.4945 11.4946 14.327 8.00003 14.327C7.28473 14.327 6.76077 14.277 6.29621 14.1487C5.83857 14.0224 5.40441 13.8109 4.88514 13.4488C4.12569 12.919 3.03778 12.7316 2.141 13.2978L2.12682 13.307L2.11264 13.3171L1.34886 13.854L1.79659 15.188L2.86122 14.4384C3.19068 14.2305 3.68325 14.2542 4.11326 14.5539C4.72789 14.9826 5.30042 15.2724 5.93762 15.4484C6.56803 15.6224 7.22776 15.6763 8.00003 15.6763C12.2393 15.6763 15.6763 12.2393 15.6763 8C15.6763 3.76072 12.2393 0.3237 8.00003 0.3237ZM7.32033 4.82535V7.32536H4.82538V8.67464H7.32033V11.1747H8.6696V8.67464H11.1747V7.32536H8.6696V4.82535H7.32033Z\" fill=\"currentColor\" />\n    </svg>\n  )\n}\n\n/** 侧栏折叠开关：左侧面板轮廓（16 基准）。 */\nexport function PanelLeftOutline({ size = 16, className }: IconProps): ReactElement {\n  return (\n    <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" className={className} aria-hidden=\"true\">\n      <rect x=\"2\" y=\"3\" width=\"12\" height=\"10\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n      <path d=\"M6.5 3v10\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n    </svg>\n  )\n}\n\n/** 品牌 fallback：简化鱼形（sidebar.brand.mark 槽无 live 条目时的兜底，24 基准）。 */\nexport function FishMark({ size = 24, className }: IconProps): ReactElement {\n  return (\n    <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" className={className} aria-hidden=\"true\">\n      <path d=\"M4 12c3-4.5 9-6 16-6 0 7-13 9-16 6Zm0 0c3 2.5 16 4.5 16-6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n      <circle cx=\"15.5\" cy=\"9.5\" r=\"1\" fill=\"currentColor\" />\n    </svg>\n  )\n}\n","import type { Context } from '@deepseek-ai/cordis'\nimport type { ClientContext, WorkspaceId } from 'dsh-tauri/client'\nimport type { CSSProperties, ReactElement } from 'react'\nimport type { SidebarRootProps } from './types'\nimport { SlotOutlet } from '@deepseek-ai/dsh-client-ui-renderer'\nimport { resolveStartSession } from 'dsh-tauri/client'\nimport { useEffect, useRef, useState } from 'react'\nimport { COLLAPSE_SETTLE_MS, PANEL_CLASSES, PANEL_DATA_ATTRIBUTES, SCROLLBAR_LINGER_MS } from './constants'\nimport { ChatOutline, FishMark } from './icons'\nimport { NS } from './locale'\n\n/**\n * sidebar.tsx — sidebar 槽的整槽替换（priority -1 shadow 官方 ui-sidebar）。\n *\n * 结构为官方 SidebarRoot（dsh-client-ui-sidebar 0.1.1-rc.2）的克隆，改动点：\n *   - logoRow 高度 60px → 32px、底部间距 8px → 4px（需求①②）；\n *   - 「新会话」按钮从 logoRow 下方移入**面板区**（需求③），样式改为\n *     workspace 菜单项行样式（需求④，镜像官方 Rows.module.css .sessionRow）；\n *   - 面板区 = 新会话菜单项 + 第三方功能项（槽 `sidebar.panel.action`，\n *     list/root，本条目 children 声明，协议⑤，见 PROTOCOL.md）。\n *\n * 渲染官方子槽（brand.mark/brand.name/workspaces/footer.action/settings）一律\n * 走 <SlotOutlet>（无 children 所有权检查）：官方条目仍 live（被 shadow），\n * 其 children 声明与 locale 注册继续生效；本条目**只**声明新增槽\n * sidebar.panel.action（子槽 key 全局唯一，绝不重声明官方子槽）。\n *\n * 交互行为镜像官方：折叠 settled（COLLAPSE_SETTLE_MS=150）→ wide 判定、\n * rail-in/fading 动画类、滚动条 linger（quietBars）。\n */\n\n/** 简易 classnames 拼接。 */\nfunction cx(...parts: Array<string | false | undefined>): string {\n  return parts.filter(Boolean).join(' ')\n}\n\n/** 克隆的 SidebarRoot：紧凑 logoRow + 面板区 + 官方子槽透传。 */\nfunction SidebarRootClone({ collapsed, width, startSession, toggleSidebar, t }: SidebarRootProps): ReactElement {\n  const [settled, setSettled] = useState(false)\n  useEffect(() => {\n    setSettled(false)\n    const timer = window.setTimeout(() => {\n      setSettled(true)\n    }, COLLAPSE_SETTLE_MS)\n    return () => {\n      window.clearTimeout(timer)\n    }\n  }, [collapsed])\n\n  const wide = !collapsed || !settled\n  const lastWideWidth = useRef(width)\n  if (!collapsed)\n    lastWideWidth.current = width\n  const everWide = useRef(!collapsed)\n  if (!collapsed)\n    everWide.current = true\n\n  // 滚动条 linger：指针进入取消计时，离开后 2s 把滚动条 thumb 变透明。\n  const [pointerInside, setPointerInside] = useState(false)\n  const lingerTimer = useRef<number | undefined>(undefined)\n  const armLinger = (): void => {\n    if (lingerTimer.current !== undefined)\n      return\n    lingerTimer.current = window.setTimeout(() => {\n      lingerTimer.current = undefined\n      setPointerInside(false)\n    }, SCROLLBAR_LINGER_MS)\n  }\n  const cancelLinger = (): void => {\n    window.clearTimeout(lingerTimer.current)\n    lingerTimer.current = undefined\n  }\n\n  return (\n    <div\n      className={cx(\n        PANEL_CLASSES.root,\n        !wide && PANEL_CLASSES.collapsed,\n        !wide && everWide.current && PANEL_CLASSES.railIn,\n        collapsed && wide && PANEL_CLASSES.fading,\n        !pointerInside && PANEL_CLASSES.quietBars,\n        wide && PANEL_CLASSES.wide,\n      )}\n      {...{ [PANEL_DATA_ATTRIBUTES.sidebar]: '' }}\n      style={wide ? { '--dshp-width': `${collapsed ? lastWideWidth.current : width}px` } as CSSProperties : undefined}\n      onPointerEnter={() => {\n        cancelLinger()\n        setPointerInside(true)\n      }}\n      onPointerLeave={() => {\n        armLinger()\n      }}\n    >\n      <div className={PANEL_CLASSES.logoRow}>\n        {wide && (\n          <button\n            type=\"button\"\n            className={PANEL_CLASSES.brand}\n            aria-label={t('session.new.label')}\n            onClick={() => {\n              console.warn('[dsh-tauri-panel] new session requested', { source: 'brand' })\n              try {\n                startSession()\n              }\n              catch (error) {\n                console.error('[dsh-tauri-panel] new session failed', error)\n              }\n            }}\n          >\n            <span className={PANEL_CLASSES.brandIdentity} aria-hidden=\"true\">\n              <span className={PANEL_CLASSES.brandMark}>\n                <SlotOutlet\n                  slotKey=\"sidebar.brand.mark\"\n                  ownerProps={{ size: 24 }}\n                  opts={{ fallback: <FishMark size={24} /> }}\n                />\n              </span>\n              <span className={PANEL_CLASSES.brandName}>\n                <SlotOutlet\n                  slotKey=\"sidebar.brand.name\"\n                  ownerProps={{}}\n                  opts={{ fallback: <span className={PANEL_CLASSES.fallbackBrandName}>DSH Local Build</span> }}\n                />\n              </span>\n            </span>\n          </button>\n        )}\n        <button\n          type=\"button\"\n          className={`${PANEL_CLASSES.iconButton} ${PANEL_CLASSES.toggle}`}\n          aria-label={collapsed ? t('toggle.open') : t('toggle.collapse')}\n          title={collapsed ? t('toggle.open') : t('toggle.collapse')}\n          onClick={() => toggleSidebar()}\n        >\n          {!wide && (\n            <span className={PANEL_CLASSES.railMark} aria-hidden=\"true\">\n              <SlotOutlet\n                slotKey=\"sidebar.brand.mark\"\n                ownerProps={{ size: 24 }}\n                opts={{ fallback: <FishMark size={24} /> }}\n              />\n            </span>\n          )}\n        </button>\n      </div>\n      {/* <div className=\"dshp-sectionHeader\">\n        <span className=\"dshp-sectionHeaderTitle\">工作面板</span>\n      </div> */}\n      <div className={PANEL_CLASSES.panelArea}>\n        <button\n          type=\"button\"\n          className={`${PANEL_CLASSES.menuItem} ${PANEL_CLASSES.newSession}`}\n          title={t('session.new.label')}\n          onClick={() => {\n            console.warn('[dsh-tauri-panel] new session requested', { source: 'menu' })\n            try {\n              startSession()\n            }\n            catch (error) {\n              console.error('[dsh-tauri-panel] new session failed', error)\n            }\n          }}\n        >\n          <span className={PANEL_CLASSES.menuItemIcon}><ChatOutline size={wide ? 14 : 18} /></span>\n          <span className={PANEL_CLASSES.menuItemLabel}>{t('session.new')}</span>\n        </button>\n        <SlotOutlet slotKey=\"sidebar.panel.action\" ownerProps={{ wide }} />\n      </div>\n\n      <div className={PANEL_CLASSES.regionArea}>\n        <SlotOutlet\n          slotKey=\"sidebar.workspaces\"\n          ownerProps={{\n            wide,\n            expandSidebar: () => {\n              if (collapsed)\n                toggleSidebar()\n            },\n          }}\n        />\n      </div>\n\n      <div className={PANEL_CLASSES.footArea}>\n        <div className={PANEL_CLASSES.footerActions}>\n          <SlotOutlet slotKey=\"sidebar.footer.action\" ownerProps={{ wide }} />\n        </div>\n        <div className={PANEL_CLASSES.settingsArea}>\n          <SlotOutlet slotKey=\"sidebar.settings\" ownerProps={{ wide }} />\n        </div>\n      </div>\n    </div>\n  )\n}\n\n/**\n * 注册：等待 sidebar 槽声明（layout 的 AppFrame renderSlot(\"sidebar\")）后，\n * 以 priority -1 shadow 官方 ui-sidebar 条目；children 仅声明新增的\n * sidebar.panel.action 协议槽。\n * @param ctx - 客户端根上下文。\n */\nexport function installSidebarRoot(ctx: Context): void {\n  ctx.slots.inject('sidebar' as never, () =>\n    ctx.slots.register(\n      {\n        name: 'sidebar',\n        id: 'dsh-tauri-panel',\n        priority: -1,\n        locale: NS,\n        children: {\n          'sidebar.panel.action': { kind: 'list', scope: 'root' },\n        },\n        inject: () => ({\n          startSession: (workspaceId?: WorkspaceId) => {\n            const start = resolveStartSession(ctx as ClientContext)\n            if (start === undefined) {\n              console.error('[dsh-tauri-panel] new session unavailable: no workspace navigation service')\n              return\n            }\n            void start(workspaceId)\n          },\n          toggleSidebar: () => ctx.layout.toggleSidebar(),\n        }),\n      } as never,\n      SidebarRootClone,\n    ))\n}\n","/** CSS generated as css-render nodes so every declaration remains structured. */\nimport { CssRender } from 'dsh-tauri/client'\nimport { PANEL_DATA_ATTRIBUTES, PANEL_STYLE_ID } from './constants'\n\nconst cssr = CssRender()\nconst { c } = cssr\n\nconst panelStyle = c([\n  c('.dshp-sectionHeader', {\n    boxSizing: 'border-box',\n    height: '36px',\n    color: 'var(--dsw-alias-label-tertiary)',\n    borderRadius: '12px',\n    flex: 'none',\n    alignItems: 'center',\n    gap: '4px',\n    marginBottom: '4px',\n    paddingLeft: '8px',\n    display: 'flex',\n    overflow: 'hidden',\n  }),\n  c('.dshp-sectionHeaderTitle', {\n    whiteSpace: 'nowrap',\n    opacity: 1,\n    visibility: 'visible',\n    minWidth: 0,\n    maxWidth: '45%',\n    transition: 'max-width .18s var(--ds-ease-in-out), margin-right .18s var(--ds-ease-in-out), opacity .12s var(--ds-ease-in-out), transform .18s var(--ds-ease-in-out), visibility 0s linear',\n    flex: 'none',\n    lineHeight: '20px',\n    overflow: 'hidden',\n  }),\n  c('.dshp-collapsed .dshp-sectionHeaderTitle', { opacity: 0, visibility: 'hidden', maxWidth: 0 }),\n  c('.dshp-root', {\n    '--dshp-padding': '12px',\n    'height': '100%',\n    'padding': '6px var(--dshp-padding)',\n    'boxSizing': 'border-box',\n    'background': 'var(--dsw-specific-sidebar-fill)',\n    'color': 'var(--dsw-alias-label-primary)',\n    '--dsh-scrollbar-thumb': 'var(--dsw-alias-scrollbar-bg-l2)',\n    '--dsh-scrollbar-thumb-hover': 'var(--dsw-alias-scrollbar-hover-l2)',\n    'flexDirection': 'column',\n    'fontSize': '14px',\n    'display': 'flex',\n    '--dsh-sidebar-inline-padding': 'var(--dshp-padding)',\n  }),\n  c('.dshp-root.dshp-collapsed', { padding: '18px 10px 6px' }),\n  c('.dshp-root.dshp-wide', { width: 'var(--dshp-width)' }),\n  c('.dshp-root.dshp-quietBars', { '--dsh-scrollbar-thumb': 'transparent', '--dsh-scrollbar-thumb-hover': 'transparent' }),\n  c('.dshp-fading>*', { opacity: 0, transition: 'opacity .15s var(--ds-ease-in-out)' }),\n  c('.dshp-logoRow', { boxSizing: 'border-box', flex: 'none', justifyContent: 'flex-end', alignItems: 'center', gap: '8px', height: '60px', marginBottom: '4px', padding: '4px 0 4px 4px', display: 'flex', overflow: 'hidden' }),\n  c('.dshp-collapsed .dshp-logoRow', { justifyContent: 'flex-start', height: '40px', marginBottom: '4px', padding: 0 }),\n  c('.dshp-brand', { minWidth: 0, color: 'inherit', cursor: 'pointer', background: 'transparent', border: 'none', flex: 1, alignItems: 'center', padding: 0, display: 'inline-flex', overflow: 'hidden' }),\n  c('.dshp-brandIdentity', { alignItems: 'center', gap: '8px', minWidth: 0, height: '24px', display: 'inline-flex' }),\n  c('.dshp-brandMark', { flex: 'none', justifyContent: 'center', alignItems: 'center', display: 'inline-flex' }),\n  c('.dshp-brandName', { letterSpacing: '.04em', alignItems: 'center', gap: '6px', minWidth: 0, height: '24px', fontSize: '18px', fontWeight: 600, lineHeight: '24px', display: 'inline-flex' }),\n  c('.dshp-fallbackBrandName', { letterSpacing: 0, whiteSpace: 'nowrap', fontSize: '17px' }),\n  c('.dshp-iconButton', { cursor: 'pointer', width: '28px', height: '28px', color: 'var(--dsw-alias-label-secondary)', background: 'transparent', border: 'none', borderRadius: '50%', flex: 'none', justifyContent: 'center', alignItems: 'center', padding: 0, display: 'inline-flex' }, [c('&:hover', { background: 'var(--dsw-alias-interactive-bg-hover)' })]),\n  c('.dshp-collapsed .dshp-iconButton', { width: '36px', height: '36px', color: 'var(--dsw-alias-label-primary)' }),\n  c('.dshp-railMark', { justifyContent: 'center', alignItems: 'center', display: 'inline-flex' }),\n  c('.dshp-panelArea', { flex: 'none', flexDirection: 'column', alignItems: 'stretch', gap: '2px', margin: 0, display: 'flex', marginRight: 'var(--dsh-session-list-scrollbar-offset)', paddingLeft: '4px', paddingRight: 'calc(var(--dsh-session-list-edge-inset) - var(--dsh-session-list-scrollbar-width) - var(--dsh-session-list-scrollbar-offset))' }),\n  c('.dshp-collapsed .dshp-panelArea', { alignItems: 'center', gap: '4px' }),\n  c('.dshp-menuItem', {\n    boxSizing: 'border-box',\n    appearance: 'none',\n    cursor: 'pointer',\n    userSelect: 'none',\n    width: '100%',\n    minWidth: 0,\n    height: '34px',\n    flex: 'none',\n    display: 'flex',\n    alignItems: 'center',\n    gap: '6px',\n    padding: '0 8px',\n    border: 0,\n    borderRadius: '8px',\n    overflow: 'hidden',\n    background: 'transparent',\n    color: 'var(--dsw-alias-label-primary)',\n    fontFamily: 'inherit',\n    fontSize: '14px',\n    fontWeight: 400,\n    lineHeight: '22px',\n    textAlign: 'left',\n    whiteSpace: 'nowrap',\n    transition: 'background-color .12s var(--ds-ease-in-out), color .12s var(--ds-ease-in-out)',\n  }, [c('&:hover', { background: 'var(--dsw-alias-interactive-bg-hover)' }), c('&:focus-visible', { outline: '2px solid var(--dsw-alias-border-focus)', outlineOffset: '-2px' })]),\n  c('.dshp-menuItemSelected,.dshp-menuItemSelected:hover', { background: 'var(--dsw-alias-interactive-bg-hover)' }),\n  c('.dshp-newSession', { width: '100%', height: '38px', margin: '0 0 4px', padding: '8px 16px', border: '1px solid var(--dsw-alias-border-l2)', borderRadius: '12px', background: 'var(--dsw-alias-button-elevated-fill)', justifyContent: 'center', alignItems: 'center', gap: '6px', fontWeight: 500 }, [c('&:hover', { background: 'var(--dsw-alias-button-floating-hover)' })]),\n  c('.dshp-menuItemIcon', {\n    boxSizing: 'border-box',\n    flex: 'none',\n    justifyContent: 'center',\n    alignItems: 'center',\n    display: 'inline-flex',\n    fontSize: '16px',\n  }),\n  c('.dshp-menuItemLabel', { minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', margin: '0 6px 0 0' }),\n  c('.dshp-collapsed .dshp-menuItem', { justifyContent: 'center', alignSelf: 'flex-start', width: '36px', minWidth: '36px', height: '36px', padding: 0, gap: 0, borderRadius: '12px' }),\n  c('.dshp-collapsed .dshp-menuItemLabel', { display: 'none' }),\n  c('.dshp-collapsed .dshp-panelArea', { marginBottom: '12px', paddingLeft: 0 }),\n  c('.dshp-collapsed .dshp-menuItemIcon', {\n    fontSize: '18px',\n    color: 'var(--dsw-alias-label-primary)',\n  }),\n  c('.dshp-collapsed .dshp-newSession', { borderColor: 'transparent', justifyContent: 'center', width: '36px', height: '36px', margin: 0, padding: 0, gap: 0 }),\n  c('.dshp-regionArea', { minHeight: 0, marginRight: 'calc(-1 * var(--dshp-padding))', flexDirection: 'column', flex: 1, padding: '0 4px', display: 'flex', overflow: 'hidden' }),\n  c('.dshp-collapsed .dshp-regionArea', { marginLeft: 0, marginRight: 0, padding: 0 }),\n  c('.dshp-footArea', { flexDirection: 'column', flex: 'none', display: 'flex' }),\n  c('.dshp-settingsArea,.dshp-footerActions', { flex: 'none', width: '100%', minWidth: 0 }),\n  c('.dshp-footerActions', { display: 'flex' }),\n  c('.dshp-collapsed .dshp-footArea', { alignItems: 'center' }),\n  c('.dshp-collapsed .dshp-settingsArea,.dshp-collapsed .dshp-footerActions', { justifyContent: 'center', width: 'auto', display: 'flex' }),\n  c('.dshp-panelView', { height: '100%', boxSizing: 'border-box', minWidth: 0, overflowY: 'auto', scrollbarGutter: 'stable' }),\n  c('.dshp-panelViewColumn', { maxWidth: 'var(--dsh-chat-content-width,780px)', minHeight: '100%', width: '100%', margin: '0 auto', flexDirection: 'column', gap: '16px', display: 'flex' }),\n  // 面板激活期间，侧栏工作区单项撤销 hover 底色（仅非选中行；选中行保留\n  // 自己的选中态，避免点按目标不可辨）。语义选择器按官方 aria 状态匹配，\n  // 不依赖 css-module hash。\n  c(`[${PANEL_DATA_ATTRIBUTES.active}] [role=\"treeitem\"]:not([aria-selected=\"true\"]):hover`, { background: 'transparent' }),\n  c('@keyframes dshp-rail-in', [c('from', { opacity: 0, transform: 'translate(49px)' })]),\n  c('@keyframes dshp-rail-fade-in', [c('from', { opacity: 0 })]),\n  c('@media (prefers-reduced-motion: reduce)', [c('.dshp-fading>*', { transition: 'none' }), c('.dshp-railIn .dshp-iconButton,.dshp-railIn .dshp-menuItem,.dshp-railIn .dshp-footArea,.dshp-railIn .dshp-regionArea', { animation: 'none' })]),\n])\n\nexport function mountPanelStyles(): () => void {\n  if (typeof document === 'undefined')\n    return () => {}\n  if (cssr.find(PANEL_STYLE_ID) !== null)\n    return () => {}\n  panelStyle.mount({ id: PANEL_STYLE_ID, head: true })\n  return () => panelStyle.unmount({ id: PANEL_STYLE_ID })\n}\n","import type {} from '@deepseek-ai/dsh-client-ui-layout/client'\n/**\n * dsh-tauri-panel 客户端插件体（browser half）：工作区上方面板 UI。\n *\n * 能力（全部 slot-shadow，零结构补丁，零新增依赖）：\n *   整槽替换 sidebar（priority -1 shadow 官方 ui-sidebar）：克隆\n *   SidebarRoot —— 紧凑 logoRow（32px、底距 4px）、面板区（新会话菜单项\n *   + 协议槽 sidebar.panel.action 的第三方功能项）、官方子槽（workspaces/\n *   settings/footer/brand）经 <SlotOutlet> 透传。\n *\n * 协议：第三方插件向面板区添加功能项 = 注册 `sidebar.panel.action`\n * （list/root，本插件声明），详见 PROTOCOL.md。\n *\n * 依赖：renderer 补丁导出的 <SlotOutlet>（任意槽渲染入口）。核心未带补丁时\n * （旧安装）SlotOutlet 为 undefined —— 此时整体不注册（官方侧栏原样工作），\n * 绝不白屏。\n */\nimport type { ClientContext } from 'dsh-tauri/client'\nimport { SlotOutlet } from '@deepseek-ai/dsh-client-ui-renderer'\nimport { installPanelLocale } from './locale'\nimport { installPanelService } from './service'\nimport { installSidebarRoot } from './sidebar'\nimport { mountPanelStyles } from './styles'\n\nexport { PANEL_PROTOCOL_SERVICE } from './constants'\nexport type { IconProps } from './icons'\nexport type { PanelActionItemProps, PanelContentSpec, SidebarRootProps } from './types'\n\n/** 插件显示名（诊断元数据）。 */\nexport const name = 'dsh-tauri-panel'\n\n/**\n * 需要的客户端服务：slots（注册点位）、layout（折叠/宽度）、locale（双语文案）。\n *\n * `workspaces` 不能列为强制注入：Alpha 将会话导航放在 `uiWorkspace`，而\n * rc.2 才把 `startSession` 暴露在 `workspaces` 上。运行时差异由 compat(ctx)\n * 在 apply 内探测，避免 Alpha 在执行 apply 前因缺少 workspaces 而被 Cordis 跳过。\n */\nexport const inject = ['slots', 'layout', 'locale']\n\n/**\n * 插件体：注册面板侧栏（整槽替换）。\n * @param ctx - 客户端根上下文。\n */\nexport function apply(ctx: ClientContext): void {\n  ctx.effect(\n    () => mountPanelStyles(),\n    'dsh-tauri-panel: styles',\n  )\n  installPanelLocale(ctx)\n  // 面板协议宿主服务（panel.protocol：ActionItem + renderPanelContent）：\n  // 只走 slots runtime，不依赖 renderer 补丁——无补丁时内容区替换仍可用。\n  installPanelService(ctx)\n\n  // 侧栏面板依赖 renderer 补丁导出的 <SlotOutlet>；无补丁时不注册任何条目，\n  // 官方侧栏原样工作。\n  if (typeof SlotOutlet !== 'function') {\n    console.warn(\n      '[dsh-tauri-panel] <SlotOutlet> unavailable (renderer patch missing) — panel sidebar disabled, official UI stays.',\n    )\n    return\n  }\n\n  installSidebarRoot(ctx)\n}\n"],"mappings":"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"}