{"version":3,"file":"client.cjs","names":["utils_1","selector","style","hash_1","hash_1","utils_1","utils_1","CssRender","exports","pages: Page[]","lastKey: string | null","trackTimer: ReturnType<typeof setInterval> | undefined","name","styleCleanup: (() => void) | undefined","navCleanup: (() => void) | undefined"],"sources":["../../../node_modules/.pnpm/css-render@0.15.14/node_modules/css-render/lib/parse.js","../../../node_modules/.pnpm/css-render@0.15.14/node_modules/css-render/lib/utils.js","../../../node_modules/.pnpm/css-render@0.15.14/node_modules/css-render/lib/render.js","../../../node_modules/.pnpm/@emotion+hash@0.8.0/node_modules/@emotion/hash/dist/hash.cjs.prod.js","../../../node_modules/.pnpm/@emotion+hash@0.8.0/node_modules/@emotion/hash/dist/hash.cjs.js","../../../node_modules/.pnpm/css-render@0.15.14/node_modules/css-render/lib/hash.js","../../../node_modules/.pnpm/css-render@0.15.14/node_modules/css-render/lib/mount.js","../../../node_modules/.pnpm/css-render@0.15.14/node_modules/css-render/lib/c.js","../../../node_modules/.pnpm/css-render@0.15.14/node_modules/css-render/lib/CssRender.js","../../../node_modules/.pnpm/css-render@0.15.14/node_modules/css-render/lib/types.js","../../../node_modules/.pnpm/css-render@0.15.14/node_modules/css-render/lib/exists.js","../../../node_modules/.pnpm/css-render@0.15.14/node_modules/css-render/lib/index.js","../src/client/constants.ts","../src/client/error.ts","../src/client/bridge.ts","../src/client/compat.ts","../src/client/store.ts","../src/client/index.ts"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseSelectorPath = void 0;\nfunction ampCount(selector) {\n    let cnt = 0;\n    for (let i = 0; i < selector.length; ++i) {\n        if (selector[i] === '&')\n            ++cnt;\n    }\n    return cnt;\n}\n/**\n * Don't just use ',' to separate css selector. For example:\n * x:(a, b) {} will be split into 'x:(a' and 'b)', which is not expected.\n * Make sure comma doesn't exist inside parentheses.\n */\nconst separatorRegex = /\\s*,(?![^(]*\\))\\s*/g;\nconst extraSpaceRegex = /\\s+/g;\n/**\n * selector must includes '&'\n * selector is trimmed\n * every part of amp is trimmed\n */\nfunction resolveSelectorWithAmp(amp, selector) {\n    const nextAmp = [];\n    selector.split(separatorRegex).forEach(partialSelector => {\n        let round = ampCount(partialSelector);\n        // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n        if (!round) {\n            amp.forEach(partialAmp => {\n                nextAmp.push(\n                // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n                (partialAmp && partialAmp + ' ') + partialSelector);\n            });\n            return;\n        }\n        else if (round === 1) {\n            amp.forEach(partialAmp => {\n                nextAmp.push(partialSelector.replace('&', partialAmp));\n            });\n            return;\n        }\n        let partialNextAmp = [\n            partialSelector\n        ];\n        // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n        while (round--) {\n            const nextPartialNextAmp = [];\n            partialNextAmp.forEach(selectorItr => {\n                amp.forEach(partialAmp => {\n                    nextPartialNextAmp.push(selectorItr.replace('&', partialAmp));\n                });\n            });\n            partialNextAmp = nextPartialNextAmp;\n        }\n        partialNextAmp.forEach(part => nextAmp.push(part));\n    });\n    return nextAmp;\n}\n/**\n * selector mustn't includes '&'\n * selector is trimmed\n */\nfunction resolveSelector(amp, selector) {\n    const nextAmp = [];\n    selector.split(separatorRegex).forEach(partialSelector => {\n        amp.forEach(partialAmp => {\n            // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n            nextAmp.push(((partialAmp && partialAmp + ' ') + partialSelector));\n        });\n    });\n    return nextAmp;\n}\nfunction parseSelectorPath(selectorPaths) {\n    let amp = [''];\n    selectorPaths.forEach(selector => {\n        // eslint-disable-next-line\n        selector = selector && selector.trim();\n        if (\n        // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n        !selector) {\n            /**\n             * if it's a empty selector, do nothing\n             */\n            return;\n        }\n        // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n        if (selector.includes('&')) {\n            amp = resolveSelectorWithAmp(amp, selector);\n        }\n        else {\n            amp = resolveSelector(amp, selector);\n        }\n    });\n    return amp.join(', ').replace(extraSpaceRegex, ' ');\n}\nexports.parseSelectorPath = parseSelectorPath;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isMediaOrSupports = exports.createElement = exports.queryElement = exports.removeElement = void 0;\nfunction removeElement(el) {\n    /* istanbul ignore if */\n    // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n    if (!el)\n        return;\n    const parentElement = el.parentElement;\n    /* istanbul ignore else */\n    // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n    if (parentElement)\n        parentElement.removeChild(el);\n}\nexports.removeElement = removeElement;\nfunction queryElement(id, parent) {\n    return (parent !== null && parent !== void 0 ? parent : document.head).querySelector(`style[cssr-id=\"${id}\"]`);\n}\nexports.queryElement = queryElement;\nfunction createElement(id) {\n    const el = document.createElement('style');\n    el.setAttribute('cssr-id', id);\n    return el;\n}\nexports.createElement = createElement;\nfunction isMediaOrSupports(selector) {\n    // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n    if (!selector)\n        return false;\n    return /^\\s*@(s|m)/.test(selector);\n}\nexports.isMediaOrSupports = isMediaOrSupports;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.render = void 0;\nconst parse_1 = require(\"./parse\");\nconst utils_1 = require(\"./utils\");\nconst kebabRegex = /[A-Z]/g;\nfunction kebabCase(pattern) {\n    return pattern.replace(kebabRegex, match => '-' + match.toLowerCase());\n}\n/** TODO: refine it to solve nested object */\nfunction unwrapProperty(prop, indent = '  ') {\n    if (typeof prop === 'object' && prop !== null) {\n        return (' {\\n' +\n            Object.entries(prop).map(v => {\n                return indent + `  ${kebabCase(v[0])}: ${v[1]};`;\n            }).join('\\n') +\n            '\\n' + indent + '}');\n    }\n    return `: ${prop};`;\n}\n/** unwrap properties */\nfunction unwrapProperties(props, instance, params) {\n    if (typeof props === 'function') {\n        return props({\n            context: instance.context,\n            props: params\n        });\n    }\n    return props;\n}\nfunction createStyle(selector, props, instance, params) {\n    if (!props)\n        return '';\n    // eslint-disable-next-line\n    const unwrappedProps = unwrapProperties(props, instance, params);\n    if (!unwrappedProps)\n        return '';\n    if (typeof unwrappedProps === 'string') {\n        return `${selector} {\\n${unwrappedProps}\\n}`;\n    }\n    const propertyNames = Object.keys(unwrappedProps);\n    if (propertyNames.length === 0) {\n        if (instance.config.keepEmptyBlock)\n            return selector + ' {\\n}';\n        return '';\n    }\n    const statements = selector\n        ? [\n            selector + ' {'\n        ]\n        : [];\n    propertyNames.forEach(propertyName => {\n        const property = unwrappedProps[propertyName];\n        if (propertyName === 'raw') {\n            statements.push('\\n' + property + '\\n');\n            return;\n        }\n        propertyName = kebabCase(propertyName);\n        if (property !== null && property !== undefined) {\n            statements.push(`  ${propertyName}${unwrapProperty(property)}`);\n        }\n    });\n    if (selector) {\n        statements.push('}');\n    }\n    return statements.join('\\n');\n}\nfunction loopCNodeListWithCallback(children, options, callback) {\n    /* istanbul ignore if */\n    if (!children)\n        return;\n    children.forEach(child => {\n        if (Array.isArray(child)) {\n            loopCNodeListWithCallback(child, options, callback);\n        }\n        else if (typeof child === 'function') {\n            const grandChildren = child(options);\n            if (Array.isArray(grandChildren)) {\n                loopCNodeListWithCallback(grandChildren, options, callback);\n            }\n            else if (grandChildren) {\n                callback(grandChildren);\n            }\n        }\n        else if (child) {\n            callback(child);\n        }\n    });\n}\nfunction traverseCNode(node, selectorPaths, styles, instance, params) {\n    const $ = node.$;\n    let blockSelector = '';\n    if (!$ || typeof $ === 'string') {\n        if ((0, utils_1.isMediaOrSupports)($)) {\n            blockSelector = $;\n        }\n        else {\n            // as a string selector\n            selectorPaths.push($);\n        }\n    }\n    else if (typeof $ === 'function') {\n        const selector = $({\n            context: instance.context,\n            props: params\n        });\n        if ((0, utils_1.isMediaOrSupports)(selector)) {\n            blockSelector = selector;\n        }\n        else {\n            // as a lazy selector\n            selectorPaths.push(selector);\n        }\n    }\n    else { // as a option selector\n        if ($.before)\n            $.before(instance.context);\n        if (!$.$ || typeof $.$ === 'string') {\n            if ((0, utils_1.isMediaOrSupports)($.$)) {\n                blockSelector = $.$;\n            }\n            else {\n                // as a string selector\n                selectorPaths.push($.$);\n            }\n        }\n        else /* istanbul ignore else */ if ($.$) {\n            const selector = $.$({\n                context: instance.context,\n                props: params\n            });\n            if ((0, utils_1.isMediaOrSupports)(selector)) {\n                blockSelector = selector;\n            }\n            else {\n                // as a lazy selector\n                selectorPaths.push(selector);\n            }\n        }\n    }\n    const selector = (0, parse_1.parseSelectorPath)(selectorPaths);\n    const style = createStyle(selector, node.props, instance, params);\n    if (blockSelector) {\n        styles.push(`${blockSelector} {`);\n    }\n    else if (style.length) {\n        styles.push(style);\n    }\n    if (node.children) {\n        loopCNodeListWithCallback(node.children, {\n            context: instance.context,\n            props: params\n        }, childNode => {\n            if (typeof childNode === 'string') {\n                const style = createStyle(selector, { raw: childNode }, instance, params);\n                styles.push(style);\n            }\n            else {\n                traverseCNode(childNode, selectorPaths, styles, instance, params);\n            }\n        });\n    }\n    selectorPaths.pop();\n    if (blockSelector) {\n        styles.push('}');\n    }\n    if ($ && $.after)\n        $.after(instance.context);\n}\nfunction render(node, instance, props) {\n    const styles = [];\n    traverseCNode(node, [], styles, instance, props);\n    return styles.join('\\n\\n');\n}\nexports.render = render;\n","\"use strict\";\n\nfunction murmur2(str) {\n  for (var k, h = 0, i = 0, len = str.length; len >= 4; ++i, len -= 4) k = 1540483477 * (65535 & (k = 255 & str.charCodeAt(i) | (255 & str.charCodeAt(++i)) << 8 | (255 & str.charCodeAt(++i)) << 16 | (255 & str.charCodeAt(++i)) << 24)) + (59797 * (k >>> 16) << 16), \n  h = 1540483477 * (65535 & (k ^= k >>> 24)) + (59797 * (k >>> 16) << 16) ^ 1540483477 * (65535 & h) + (59797 * (h >>> 16) << 16);\n  switch (len) {\n   case 3:\n    h ^= (255 & str.charCodeAt(i + 2)) << 16;\n\n   case 2:\n    h ^= (255 & str.charCodeAt(i + 1)) << 8;\n\n   case 1:\n    h = 1540483477 * (65535 & (h ^= 255 & str.charCodeAt(i))) + (59797 * (h >>> 16) << 16);\n  }\n  return (((h = 1540483477 * (65535 & (h ^= h >>> 13)) + (59797 * (h >>> 16) << 16)) ^ h >>> 15) >>> 0).toString(36);\n}\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: !0\n}), exports.default = murmur2;\n","'use strict';\n\nif (process.env.NODE_ENV === \"production\") {\n  module.exports = require(\"./hash.cjs.prod.js\");\n} else {\n  module.exports = require(\"./hash.cjs.dev.js\");\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = void 0;\nvar hash_1 = require(\"@emotion/hash\");\nObject.defineProperty(exports, \"default\", { enumerable: true, get: function () { return hash_1.default; } });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.mount = exports.unmount = void 0;\n/* eslint-disable @typescript-eslint/prefer-ts-expect-error */\n/* eslint-disable @typescript-eslint/strict-boolean-expressions */\nconst hash_1 = require(\"./hash\");\nconst utils_1 = require(\"./utils\");\nif (typeof window !== 'undefined') {\n    window.__cssrContext = {};\n}\nfunction unmount(instance, node, id, parent) {\n    const { els } = node;\n    // If id is undefined, unmount all styles\n    if (id === undefined) {\n        els.forEach(utils_1.removeElement);\n        node.els = [];\n    }\n    else {\n        const target = (0, utils_1.queryElement)(id, parent);\n        // eslint-disable-next-line\n        if (target && els.includes(target)) {\n            (0, utils_1.removeElement)(target);\n            node.els = els.filter((el) => el !== target);\n        }\n    }\n}\nexports.unmount = unmount;\nfunction addElementToList(els, target) {\n    els.push(target);\n}\nfunction mount(instance, node, id, props, head, force, anchorMetaName, parent, ssrAdapter\n// eslint-disable-next-line @typescript-eslint/no-invalid-void-type\n) {\n    let style;\n    if (id === undefined) {\n        style = node.render(props);\n        id = (0, hash_1.default)(style);\n    }\n    if (ssrAdapter) {\n        ssrAdapter.adapter(id, style !== null && style !== void 0 ? style : node.render(props));\n        return;\n    }\n    if (parent === undefined) {\n        parent = document.head;\n    }\n    const queriedTarget = (0, utils_1.queryElement)(id, parent);\n    if (queriedTarget !== null && !force) {\n        return queriedTarget;\n    }\n    const target = queriedTarget !== null && queriedTarget !== void 0 ? queriedTarget : (0, utils_1.createElement)(id);\n    if (style === undefined)\n        style = node.render(props);\n    target.textContent = style;\n    if (queriedTarget !== null)\n        return queriedTarget;\n    if (anchorMetaName) {\n        const anchorMetaEl = parent.querySelector(`meta[name=\"${anchorMetaName}\"]`);\n        if (anchorMetaEl) {\n            parent.insertBefore(target, anchorMetaEl);\n            addElementToList(node.els, target);\n            return target;\n        }\n    }\n    if (head) {\n        parent.insertBefore(target, parent.querySelector('style, link'));\n    }\n    else {\n        parent.appendChild(target);\n    }\n    addElementToList(node.els, target);\n    return target;\n}\nexports.mount = mount;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.c = void 0;\nconst render_1 = require(\"./render\");\nconst mount_1 = require(\"./mount\");\nfunction wrappedRender(props) {\n    return (0, render_1.render)(this, this.instance, props);\n}\n// do not guard node calling, it should throw an error.\nfunction wrappedMount(options = {}\n// eslint-disable-next-line @typescript-eslint/no-invalid-void-type\n) {\n    const { id, ssr, props, head = false, force = false, anchorMetaName, parent } = options;\n    const targetElement = (0, mount_1.mount)(this.instance, this, id, props, head, force, anchorMetaName, parent, ssr);\n    return targetElement;\n}\nfunction wrappedUnmount(options = {}) {\n    /* istanbul ignore next */\n    // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n    const { id, parent } = options;\n    (0, mount_1.unmount)(this.instance, this, id, parent);\n}\nconst createCNode = function (instance, $, props, children) {\n    return {\n        instance,\n        $,\n        props,\n        children,\n        els: [],\n        render: wrappedRender,\n        mount: wrappedMount,\n        unmount: wrappedUnmount\n    };\n};\nexports.c = function (instance, $, props, children) {\n    if (Array.isArray($)) {\n        return createCNode(instance, { $: null }, null, $);\n    }\n    else if (Array.isArray(props)) {\n        return createCNode(instance, $, null, props);\n    }\n    else if (Array.isArray(children)) {\n        return createCNode(instance, $, props, children);\n    }\n    else {\n        return createCNode(instance, $, props, null);\n    }\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CssRender = void 0;\nconst c_1 = require(\"./c\");\nconst utils_1 = require(\"./utils\");\nfunction CssRender(config = {}) {\n    const cssr = {\n        c: ((...args) => (0, c_1.c)(cssr, ...args)),\n        use: (plugin, ...args) => plugin.install(cssr, ...args),\n        find: utils_1.queryElement,\n        context: {},\n        config\n    };\n    return cssr;\n}\nexports.CssRender = CssRender;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.exists = void 0;\nconst utils_1 = require(\"./utils\");\nfunction exists(id, ssr) {\n    if (id === undefined)\n        return false;\n    if (ssr) {\n        const { context: { ids } } = ssr;\n        return ids.has(id);\n    }\n    return (0, utils_1.queryElement)(id) !== null;\n}\nexports.exists = exists;\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CssRender = exports.exists = exports.hash = void 0;\n/* istanbul ignore file */\nconst CssRender_1 = require(\"./CssRender\");\nObject.defineProperty(exports, \"CssRender\", { enumerable: true, get: function () { return CssRender_1.CssRender; } });\n__exportStar(require(\"./types\"), exports);\nvar hash_1 = require(\"./hash\");\nObject.defineProperty(exports, \"hash\", { enumerable: true, get: function () { return hash_1.default; } });\nvar exists_1 = require(\"./exists\");\nObject.defineProperty(exports, \"exists\", { enumerable: true, get: function () { return exists_1.exists; } });\nexports.default = CssRender_1.CssRender;\n","/** 宿主 → iframe 命令的 source。 */\nexport const SRC_HOST = 'dsh-desktop'\n\n/** iframe → 宿主事件的 source。 */\nexport const SRC_BRIDGE = 'dsh-nav-bridge'\n\n/** 宿主命令类型。 */\nexport const CMD_TOGGLE = 'dsh://sidebar:toggle'\nexport const CMD_PREV = 'dsh://page:prev'\nexport const CMD_NEXT = 'dsh://page:next'\n\n/** iframe → 宿主状态事件类型。 */\nexport const EVENT_SIDEBAR_COLLAPSED = 'dsh://sidebar:collapsed'\nexport const EVENT_PAGE_FIRSTED = 'dsh://page:firsted'\nexport const EVENT_PAGE_LASTED = 'dsh://page:lasted'\n\n/** 应用晚挂载时的导航桥探测参数。 */\nexport const TRACK_MAX_TRIES = 30\nexport const TRACK_INTERVAL_MS = 500\n\n/** 会话行菜单按钮的 aria-label 模板（zh/en），用于提取标题与按标题找行。 */\nexport const SESSION_LABEL_PATTERNS = [\n  /^会话“(.+)”的操作$/,\n  /^Session actions for (.+)$/,\n] as const\n\n/** 上报消息的 source key（宿主校验：`source === 'dsh-plugin-error-bridge'`）。 */\nexport const ERROR_SRC = 'dsh-plugin-error-bridge'\n\n/** 上报消息的 type key（宿主校验：`type === 'dsh://plugin-error'`）。 */\nexport const ERROR_TYPE = 'dsh://plugin-error'\n\n/** 插件 id（npm 包名）：宿主错误注册表与插件列表的主键。 */\nexport const PLUGIN_ID = 'dsh-tauri'\n\n/** 客户端插件元数据与生命周期标识。 */\nexport const PLUGIN_INJECT = ['layout']\nexport const SIDEBAR_TWEAKS_STYLE_ID = 'dsh-tauri:sidebar-tweaks'\nexport const SIDEBAR_TWEAKS_EFFECT_ID = 'dsh-tauri: sidebar tweaks (hide collapse toggle, center brand)'\nexport const NAV_BRIDGE_EFFECT_ID = 'dsh-tauri: nav bridge'\n\n/** 侧边栏稳定 ARIA 选择器。 */\nexport const COLLAPSE_SIDEBAR_SELECTOR = 'button[aria-label=\"收起侧边栏\"],button[aria-label=\"Collapse sidebar\"]'\nexport const NEW_SESSION_SELECTOR = 'button[aria-label=\"新建会话\"],button[aria-label=\"New session\"]'\n","/**\n * 错误上报桥（iframe 内 → 桌面宿主）。\n *\n * 与桌面端 `use-iframe-shim.ts` 的协议逐字一致 —— 宿主只接受完全匹配的 key，\n * 任何一处不一致都会被静默丢弃：\n *\n *   { source: 'dsh-plugin-error-bridge', type: 'dsh://plugin-error', id, error, action }\n *\n * 宿主收到后经 `report_plugin_error` 持久化到插件错误注册表\n * （plugin-errors.json，按插件 id 幂等覆盖并推送新列表），「插件」面板据此\n * 给本插件显示 danger 标记与更新/卸载入口。\n */\nimport type { ErrorAction } from './types'\nimport { ERROR_SRC, ERROR_TYPE, PLUGIN_ID } from './constants'\n\nexport { ERROR_SRC, ERROR_TYPE, PLUGIN_ID } from './constants'\nexport type { ErrorAction } from './types'\n\n/**\n * 上报插件运行期错误到宿主。\n * @param error 错误对象/消息（宿主截断保留 2000 字符）\n * @param action 记录动作，默认 runtime\n */\nexport function reportPluginError(error: unknown, action: ErrorAction = 'runtime'): void {\n  const message = (error instanceof Error ? `${error.name}: ${error.message}` : String(error))\n    .trim()\n    .slice(0, 2000)\n  if (!message)\n    return\n  const payload = { source: ERROR_SRC, type: ERROR_TYPE, id: PLUGIN_ID, error: message, action }\n  try {\n    window.parent.postMessage(payload, '*')\n  }\n  catch {\n    // 宿主已销毁等场景静默（与导航桥 post 的行为一致）\n  }\n}\n\n/**\n * 把可能抛错的回调包装成「捕获 + 上报 + 继续执行」的安全回调：\n * 观测器/监听器回调一旦抛错会变成 uncaught error，宿主无从知晓；包装后统一\n * 上报为本插件的 runtime 错误。\n *\n * 注意只包插件自身代码路径，**不**监听全局 error/unhandledrejection —— dsh\n * 应用与本插件共享同一页面，全量捕获会把整个应用的异常都记到本插件名下，\n * 污染宿主错误注册表。\n */\nexport function guard<T extends unknown[]>(fn: (...args: T) => void): (...args: T) => void {\n  return (...args: T) => {\n    try {\n      fn(...args)\n    }\n    catch (error) {\n      reportPluginError(error, 'runtime')\n    }\n  }\n}\n","/**\n * 导航桥核心（iframe 内）：宿主（桌面壳层 ShellNavBar）↔ dsh 应用的消息协议。\n *\n * 消息（postMessage，双向）：\n * - 宿主 → iframe（命令）：`{ source: 'dsh-desktop', type }`\n *   - `dsh://sidebar:toggle`  切换侧边栏（转发 ctx.layout.toggleSidebar）\n *   - `dsh://page:prev`       后退（会话访问栈回退）\n *   - `dsh://page:next`       前进（会话访问栈前进）\n * - iframe → 宿主（事件）：`{ source: 'dsh-nav-bridge', type, ... }`\n *   - `dsh://sidebar:collapsed` `{ collapsed }` 侧边栏折叠状态\n *   - `dsh://page:firsted`      `{ firsted }` 已到访问栈最前（宿主应禁用后退）\n *   - `dsh://page:lasted`       `{ lasted }` 已到访问栈最后（宿主应禁用前进）\n *\n * 页面模型：dsh 应用不产生浏览器历史（无 pushState/hash 路由），因此「页面」=\n * 侧边栏当前选中的会话（`[role=\"treeitem\"][aria-selected=\"true\"]`）。本桥观察\n * 选中会话变化维护一个**会话访问栈**（纯内存）：用户点击会话 → 截断前进记录后\n * 追加新页并上报；后退/前进 → 点击栈内对应会话行让应用切回。\n *\n * 本桥与桌面端注入脚本（NAV_SHIM_JS）语义完全一致；插件加载后设置\n * `window.__dsh_tauri_bridge__`，注入脚本据此让位（避免命令/事件双重执行）。\n * 宿主仅接受 iframe 直接发来的消息（event.source === window.parent）。\n *\n * 桥内代码路径（观测器回调、导航、命令分发）统一经 `error.ts` 上报宿主：\n * key 与桌面端 `use-iframe-shim.ts` 校验保持一致，宿主持久化后「插件」面板\n * 显示 danger 标记，避免静默失败。\n */\nimport type { NavBridgeHandlers, Page } from './types'\nimport {\n  CMD_NEXT,\n  CMD_PREV,\n  CMD_TOGGLE,\n  EVENT_PAGE_FIRSTED,\n  EVENT_PAGE_LASTED,\n  EVENT_SIDEBAR_COLLAPSED,\n  SESSION_LABEL_PATTERNS,\n  SRC_BRIDGE,\n  SRC_HOST,\n  TRACK_INTERVAL_MS,\n  TRACK_MAX_TRIES,\n} from './constants'\nimport { guard, reportPluginError } from './error'\n\nexport type { NavBridgeHandlers } from './types'\n\n/**\n * 安装导航桥：设置接管标记、挂载命令监听、侧边栏状态观察与会话访问栈跟踪。\n * @returns 卸载函数（插件重载/停用时清理，桌面端注入脚本随即恢复接管）。\n */\nexport function setupNavBridge(handlers: NavBridgeHandlers): () => void {\n  // 接管标记：置位后桌面端 NAV_SHIM_JS 的命令与事件都让位\n  window.__dsh_tauri_bridge__ = true\n\n  function post(message: Record<string, unknown>): void {\n    try {\n      window.parent.postMessage(Object.assign({ source: SRC_BRIDGE }, message), '*')\n    }\n    catch {\n      // 宿主已销毁等场景静默\n    }\n  }\n\n  // ── AppFrame：dsh 应用布局的根（shell.overlay 的父节点）───────\n  function findFrame(): HTMLElement | null {\n    const overlay = document.querySelector<HTMLElement>('[data-shell-overlay]')\n    return overlay ? (overlay.parentElement as HTMLElement | null) : null\n  }\n\n  // ── 侧边栏折叠状态（观察 AppFrame 的 data-sidebar-collapsed）────\n  function collapsedOf(): boolean {\n    const frame = findFrame()\n    return !!(frame && frame.hasAttribute('data-sidebar-collapsed'))\n  }\n\n  const sidebarObserver = new MutationObserver(guard(() => {\n    post({ type: EVENT_SIDEBAR_COLLAPSED, collapsed: collapsedOf() })\n  }))\n\n  // ── 会话访问栈（页面模型，纯内存）────────────────────────────\n  let pages: Page[] = []\n  let position = 0\n  let lastKey: string | null = null\n  /** 本桥触发的导航（后退/前进）落位中，观察器不应记录新页面。 */\n  let suppress = false\n\n  // 当前选中的会话行（AppFrame 侧边栏列内）\n  function currentSelected(): HTMLElement | null {\n    const frame = findFrame()\n    const col = frame ? frame.firstElementChild : null\n    if (!col)\n      return null\n    return col.querySelector<HTMLElement>('[role=\"treeitem\"][aria-selected=\"true\"]')\n  }\n\n  // 行标题：从行内菜单按钮 aria-label 提取（zh/en），失败回退整行文本\n  function rowTitle(row: HTMLElement | null): string {\n    if (!row)\n      return ''\n    const btn = row.querySelector<HTMLElement>('button[aria-label]')\n    const label = btn ? (btn.getAttribute('aria-label') || '') : ''\n    for (const pattern of SESSION_LABEL_PATTERNS) {\n      const match = pattern.exec(label)\n      if (match)\n        return match[1]!.trim()\n    }\n    return label || (row.textContent || '').trim()\n  }\n\n  // 按标题找会话行（行元素被重建后的兜底）\n  function findRowByTitle(title: string): HTMLElement | null {\n    if (!title)\n      return null\n    const frame = findFrame()\n    const col = frame ? frame.firstElementChild : null\n    if (!col)\n      return null\n    const rows = col.querySelectorAll<HTMLElement>('[role=\"treeitem\"]')\n    for (const row of rows) {\n      if (rowTitle(row) === title)\n        return row\n    }\n    return null\n  }\n\n  function reportPage(): void {\n    post({ type: EVENT_PAGE_FIRSTED, firsted: position <= 0 })\n    post({ type: EVENT_PAGE_LASTED, lasted: position >= pages.length - 1 })\n  }\n\n  // 用户导航到新会话：截断前进记录后追加\n  function pushPage(key: string, el: HTMLElement | null): void {\n    pages = pages.slice(0, position + 1).concat([{ key, el }])\n    position = pages.length - 1\n    reportPage()\n  }\n\n  // 后退/前进：切到栈内目标页（点击对应会话行让应用落位）\n  function navigateTo(index: number): void {\n    try {\n      if (index < 0 || index >= pages.length)\n        return\n      const page = pages[index]!\n      position = index\n      const target = page.el && page.el.isConnected ? page.el : findRowByTitle(page.key ?? '')\n      if (target) {\n        suppress = true\n        target.click()\n      }\n      reportPage()\n    }\n    catch (error) {\n      // 行元素被重建/点击触发应用异常等：上报宿主，栈内记录保持一致\n      reportPluginError(error, 'runtime')\n    }\n  }\n\n  const onDomChange = guard(() => {\n    const sel = currentSelected()\n    const key = rowTitle(sel)\n    if (key === lastKey)\n      return\n    lastKey = key\n    if (suppress) {\n      // 本桥导航落位：同步当前页记录（行元素可能被 React 重建）\n      suppress = false\n      if (pages[position] !== undefined) {\n        pages[position] = { key, el: sel }\n      }\n      return\n    }\n    // 用户主动切换会话（无选中 = 欢迎/归档态，不入栈）\n    if (key)\n      pushPage(key, sel)\n  })\n\n  const pageObserver = new MutationObserver(onDomChange)\n\n  // 初始化：应用挂载前无会话树，轮询补报直到拿到 AppFrame\n  function startTrack(): boolean {\n    try {\n      const frame = findFrame()\n      if (!frame)\n        return false\n      sidebarObserver.observe(frame, { attributes: true, attributeFilter: ['data-sidebar-collapsed'] })\n      post({ type: EVENT_SIDEBAR_COLLAPSED, collapsed: collapsedOf() })\n\n      const sel = currentSelected()\n      const key = rowTitle(sel)\n      lastKey = key\n      // 根页：当前选中的会话（无选中时以「欢迎页」为根，首个会话打开即入栈）\n      pages = [{ key: key || null, el: sel }]\n      position = 0\n      pageObserver.observe(document.body, {\n        childList: true,\n        subtree: true,\n        attributes: true,\n        attributeFilter: ['aria-selected'],\n      })\n      reportPage()\n      return true\n    }\n    catch (error) {\n      // 布局结构异常等：上报宿主并返回 false，轮询会继续补报直到成功\n      reportPluginError(error, 'runtime')\n      return false\n    }\n  }\n\n  // ── 宿主命令接收 ──────────────────────────────────────────────\n  function onMessage(event: MessageEvent<unknown>): void {\n    // 只接受宿主窗口直发的命令；不兼容多层嵌套 iframe\n    if (event.source !== window.parent)\n      return\n    const data = event.data as { source?: string, type?: string } | null\n    if (!data || typeof data !== 'object' || data.source !== SRC_HOST)\n      return\n    try {\n      switch (data.type) {\n        case CMD_TOGGLE:\n          handlers.toggleSidebar()\n          break\n        case CMD_PREV:\n          navigateTo(position - 1)\n          break\n        case CMD_NEXT:\n          navigateTo(position + 1)\n          break\n      }\n    }\n    catch (error) {\n      // 命令处理（layout 切换/导航）抛错：上报宿主，不中断后续命令\n      reportPluginError(error, 'runtime')\n    }\n  }\n  window.addEventListener('message', onMessage)\n\n  // ── 初始化 + 应用晚挂载的轮询补报 ──────────────────────────\n  let trackTimer: ReturnType<typeof setInterval> | undefined\n  if (!startTrack()) {\n    let tries = 0\n    trackTimer = setInterval(() => {\n      if (startTrack() || ++tries > TRACK_MAX_TRIES) {\n        clearInterval(trackTimer)\n      }\n    }, TRACK_INTERVAL_MS)\n  }\n\n  // ── 卸载 ──────────────────────────────────────────────────────\n  return () => {\n    delete window.__dsh_tauri_bridge__\n    window.removeEventListener('message', onMessage)\n    sidebarObserver.disconnect()\n    pageObserver.disconnect()\n    if (trackTimer !== undefined)\n      clearInterval(trackTimer)\n  }\n}\n","import type { ClientContext } from './types'\n\ntype RuntimeObject = Record<string, unknown>\nexport type StartSession = (workspaceId?: string) => unknown\n\n/** Read a service without triggering Cordis' inject-only property guard. */\nfunction lookup(ctx: ClientContext, name: string): unknown {\n  const anyCtx = ctx as unknown as { get?: (name: string) => unknown } & RuntimeObject\n  try {\n    return typeof anyCtx.get === 'function' ? anyCtx.get(name) : anyCtx[name]\n  }\n  catch {\n    return undefined\n  }\n}\n\n/** Resolve the navigation method across Alpha and rc.2 service layouts. */\nexport function resolveStartSession(ctx: ClientContext): StartSession | undefined {\n  const uiWorkspace = lookup(ctx, 'uiWorkspace') as RuntimeObject | undefined\n  const workspaces = lookup(ctx, 'workspaces') as RuntimeObject | undefined\n  const owner = uiWorkspace ?? workspaces\n  const fn = owner?.startSession\n  return typeof fn === 'function' ? (workspaceId?: string) => fn.call(owner, workspaceId) : undefined\n}\n\n/** Adapt alpha's nested list/navigation services to the rc.2 plugin contract. */\nexport function compat(ctx: ClientContext): ClientContext {\n  const safeLookup = (name: string): unknown => lookup(ctx, name)\n\n  // Inline Alpha Detection: 判断当前环境是否为 Alpha 版本\n  const alphaSessions = safeLookup('sessions') as RuntimeObject | undefined\n  const isAlpha\n    = (alphaSessions?.list !== undefined && typeof alphaSessions.getSnapshot !== 'function')\n      || safeLookup('uiWorkspace') !== undefined\n\n  if (!isAlpha)\n    return ctx\n\n  // 补全当前环境的对象引用\n  const rawSessions = (alphaSessions ?? {}) as RuntimeObject\n  const rawWorkspaces = (safeLookup('workspaces') ?? {}) as RuntimeObject\n  const uiWorkspace = safeLookup('uiWorkspace') as RuntimeObject | undefined\n  const uiSession = safeLookup('uiSession') as RuntimeObject | undefined\n\n  // Inline Auto-Bind Proxy: 为 snapshot 绑定 Proxy 实例\n  const createBoundProxy = (target: unknown): RuntimeObject | undefined => {\n    if (!target || (typeof target !== 'object' && typeof target !== 'function'))\n      return undefined\n    return new Proxy(target as object, {\n      get(t, p, r) {\n        const member = Reflect.get(t, p, r)\n        return typeof member === 'function' ? member.bind(t) : member\n      },\n    }) as RuntimeObject\n  }\n\n  const list = createBoundProxy(rawSessions.list)\n  const workspaceList = createBoundProxy(rawWorkspaces.list)\n\n  // 映射 sessions 适配层\n  const sessions = new Proxy(rawSessions as object, {\n    get(target, prop, receiver) {\n      if (prop === 'list')\n        return list\n      if (prop === 'getSnapshot')\n        return () => (list?.getSnapshot as (() => unknown) | undefined)?.()\n      if (prop === 'subscribe')\n        return (l: () => void) => (list?.subscribe as ((cb: () => void) => unknown) | undefined)?.(l)\n      if (prop === 'provideInfo')\n        return (id: string) => provideInfo(rawSessions, id, uiSession)\n      const member = Reflect.get(target, prop, receiver)\n      return typeof member === 'function' ? member.bind(target) : member\n    },\n  }) as unknown as RuntimeObject\n\n  // 映射 workspaces 适配层\n  const workspaces = new Proxy(rawWorkspaces as object, {\n    get(target, prop, receiver) {\n      if (prop === 'list')\n        return workspaceList\n      if (prop === 'startSession') {\n        // rc.2 官方运行时的 workspaces 自身已提供 startSession；旧 alpha 才经由\n        // 独立的 uiWorkspace 服务暴露。优先 uiWorkspace，缺失时回退到 rawWorkspaces，\n        // 避免按钮点击被静默吞掉。\n        const owner = uiWorkspace ?? rawWorkspaces\n        const fn = owner.startSession\n        return typeof fn === 'function' ? (id?: string) => fn.call(owner, id) : undefined\n      }\n      if (prop === 'connectWorkspace') {\n        const owner = uiWorkspace ?? rawWorkspaces\n        const fn = owner.connectWorkspace\n        return typeof fn === 'function' ? (id: string) => fn.call(owner, id) : undefined\n      }\n\n      return Reflect.get(target, prop, receiver)\n    },\n  }) as unknown as RuntimeObject\n\n  // 返回最终的上下文代理对象\n  return new Proxy(ctx, {\n    get(target, prop, receiver) {\n      if (prop === 'sessions')\n        return sessions\n      if (prop === 'workspaces')\n        return workspaces\n      return Reflect.get(target, prop, receiver)\n    },\n  })\n}\n\n/**\n * Alpha deliberately does not expose the old per-session info lookup. Try\n * documented scope/provide implementations when a shell supplies one, but\n * never make a plugin fail merely because that optional bridge is absent.\n */\nfunction provideInfo(sessions: RuntimeObject, id: string, uiSession: RuntimeObject | undefined): unknown {\n  const bindingFn = sessions.binding\n  const binding = typeof bindingFn === 'function' ? bindingFn.call(sessions, id) : undefined\n  if (!binding)\n    return undefined\n\n  const adapter = uiSession?.adapter as RuntimeObject | undefined\n  const resolveFn = adapter?.resolve\n\n  if (typeof resolveFn === 'function') {\n    try {\n      const projected = resolveFn.call(adapter, id) as RuntimeObject | undefined\n      const inputActions = (projected?.props as RuntimeObject | undefined)?.inputActions\n      if (inputActions !== undefined) {\n        return { props: { inputActions } }\n      }\n    }\n    catch {\n      // The binding can disappear while a newly-created session is materialized.\n    }\n  }\n  return undefined\n}\n","/**\n * Framework-neutral external state store.\n *\n * This store is intentionally independent of React and Cordis so it can be\n * shared by slot components, hydration/controllers, and DOM observers. React\n * consumers can connect it with `useSyncExternalStore`.\n *\n * State updates are immutable: callers return the next state instead of\n * mutating a draft. This avoids cloning the whole state tree for every update\n * and makes the ownership of each state transition explicit.\n */\n\nexport type StoreUpdater<T> = (current: T) => T\nexport type StoreValue<T> = T | StoreUpdater<T>\nexport type StoreListener = () => void\n\nexport interface ExternalStore<T> {\n  /** Returns the same reference until a real state change is committed. */\n  getSnapshot: () => T\n  /** Subscribes to committed state changes and returns an unsubscribe function. */\n  subscribe: (listener: StoreListener) => () => void\n  /** Replaces the state, or derives the next state from the current state. */\n  set: (next: StoreValue<T>) => void\n}\n\n/**\n * Creates a small external store for state shared across independent plugin\n * slots or non-React controllers.\n */\nexport function createExternalStore<T>(initial: T): ExternalStore<T> {\n  let state = initial\n  const listeners = new Set<StoreListener>()\n\n  function set(next: StoreValue<T>): void {\n    const nextState = typeof next === 'function'\n      ? (next as StoreUpdater<T>)(state)\n      : next\n\n    // Besides avoiding needless React renders, this preserves the\n    // useSyncExternalStore requirement that snapshots remain stable when\n    // nothing observable changed.\n    if (Object.is(nextState, state))\n      return\n\n    state = nextState\n    notify()\n  }\n\n  function subscribe(listener: StoreListener): () => void {\n    listeners.add(listener)\n    return () => {\n      listeners.delete(listener)\n    }\n  }\n\n  function notify(): void {\n    // Iterate over a snapshot so a listener may safely unsubscribe itself or\n    // another listener while notification is in progress.\n    for (const listener of [...listeners])\n      listener()\n  }\n\n  function getSnapshot(): T {\n    return state\n  }\n\n  return { getSnapshot, subscribe, set }\n}\n\n/**\n * A deliberately tiny signal for invalidating derived UI such as locale\n * revisions without allocating `{ rev: number }` snapshots.\n */\nexport interface RevisionSignal extends ExternalStore<number> {\n  bump: () => void\n}\n\nexport function createRevisionSignal(initial = 0): RevisionSignal {\n  const store = createExternalStore(initial)\n  return {\n    ...store,\n    bump: () => {\n      store.set(revision => revision + 1)\n    },\n  }\n}\n","import type {} from '@deepseek-ai/dsh-client-ui-layout/client'\n/**\n * dsh-tauri 客户端插件体（browser half）：纯消息桥，无 UI、无运行时依赖。\n *\n * 桌面端顶部导航栏（shell-nav-bar.tsx）常驻在 Tauri 宿主，其左侧三个控件\n * （侧边栏 / 后退 / 前进）通过 postMessage 操控 iframe 内的 dsh 应用；\n * 本插件是 iframe 内的接收端：把命令转发给 dsh（侧边栏切换走\n * `ctx.layout.toggleSidebar`，后退/前进走 `window.history`），并把 dsh 状态\n * （侧边栏折叠、页面历史边界）回报给宿主。协议详见 `./bridge.ts`。\n *\n * 另：官方侧边栏 logo 行自带的「收起侧边栏」按钮与宿主顶部导航栏的侧边栏\n * 开关重复，插件加载时用一条 CSS 规则把它隐藏（折叠态窄栏的「打开侧边栏」\n * 按钮保留，窄栏恢复仍靠它）；同时把品牌词标按钮（aria-label「新建会话」，\n * CSS module 类名是生成哈希、不稳定）的内容改为水平居中。\n *\n * 服务依赖（inject）：layout（侧边栏切换）。locale/slots 均不再需要。\n */\nimport type { ClientContext } from './types'\nimport { CssRender } from 'css-render'\nimport { setupNavBridge } from './bridge'\nimport {\n  COLLAPSE_SIDEBAR_SELECTOR,\n  NAV_BRIDGE_EFFECT_ID,\n  NEW_SESSION_SELECTOR,\n  PLUGIN_ID,\n  PLUGIN_INJECT,\n  SIDEBAR_TWEAKS_EFFECT_ID,\n  SIDEBAR_TWEAKS_STYLE_ID,\n} from './constants'\nimport { reportPluginError } from './error'\n\n/** 插件显示名（诊断元数据）。 */\nexport const name = PLUGIN_ID\n\n/** 需要的客户端服务：layout（侧边栏切换）。 */\nexport const inject = PLUGIN_INJECT\n\nexport { compat, resolveStartSession } from './compat'\nexport * from './store'\n\nexport type * from './types'\nexport { CssRender } from 'css-render'\n\n/**\n * 插件体：接管导航桥（置位接管标记 → 挂命令监听/状态观察/历史跟踪）。\n * @param ctx - 客户端根上下文。\n */\nexport function apply(ctx: ClientContext): void {\n  ;(window as Window & { ctx?: ClientContext }).ctx = ctx\n\n  ctx.effect(() => {\n    // 侧边栏 UI 微调（一律用稳定的 aria-label 属性选择器，不用生成哈希的\n    // CSS module 类名）：\n    // 1. 隐藏 logo 行的「收起侧边栏」按钮：宿主导航栏已有侧边栏开关，应用内\n    //    这个折叠按钮属于重复控件。只匹配折叠态文案（zh/en），窄栏恢复用的\n    //    「打开侧边栏」按钮保留。\n    // 2. 品牌词标按钮（与工具栏「新建会话」按钮共用 aria-label，后者本就\n    //    居中，此规则对其是 no-op）默认 flex-start，改为水平居中。\n    // CSS 选择器天然覆盖 React 后续重渲染，卸载时移除样式。\n    let styleCleanup: (() => void) | undefined\n    try {\n      const cssr = CssRender()\n      const { c } = cssr\n      const style = c([\n        c(COLLAPSE_SIDEBAR_SELECTOR, { display: 'none !important' }),\n        c(NEW_SESSION_SELECTOR, { justifyContent: 'center !important' }),\n      ])\n      style.mount({ id: SIDEBAR_TWEAKS_STYLE_ID, head: true })\n      styleCleanup = () => style.unmount({ id: SIDEBAR_TWEAKS_STYLE_ID })\n    }\n    catch (error) {\n      // 插件自身代码路径异常：上报宿主，避免静默失败\n      reportPluginError(error, 'runtime')\n    }\n    return () => styleCleanup?.()\n  }, SIDEBAR_TWEAKS_EFFECT_ID)\n\n  ctx.effect(() => {\n    // 导航桥启动：初始化失败也上报（桥内部有各自的 guard/兜底轮询，这里只\n    // 兜 setupNavBridge 首次同步执行期间的异常）。\n    let navCleanup: (() => void) | undefined\n    try {\n      navCleanup = setupNavBridge({\n        toggleSidebar: () => { ctx.layout.toggleSidebar() },\n      })\n    }\n    catch (error) {\n      reportPluginError(error, 'runtime')\n    }\n    return () => navCleanup?.()\n  }, NAV_BRIDGE_EFFECT_ID)\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11],"mappings":"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"}