vite-plugin-opencode-assistant 1.0.4 → 1.0.5

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.
Files changed (84) hide show
  1. package/es/client/index.d.ts +1 -0
  2. package/es/client/index.js +328 -0
  3. package/es/core/api.d.ts +14 -0
  4. package/es/core/api.js +294 -0
  5. package/es/core/injector.d.ts +2 -0
  6. package/es/core/injector.js +11 -0
  7. package/es/core/service.d.ts +18 -0
  8. package/es/core/service.js +163 -0
  9. package/es/endpoints/context.d.ts +3 -0
  10. package/es/endpoints/context.js +114 -0
  11. package/es/endpoints/index.d.ts +4 -0
  12. package/es/endpoints/index.js +16 -0
  13. package/es/endpoints/sessions.d.ts +3 -0
  14. package/es/endpoints/sessions.js +79 -0
  15. package/es/endpoints/sse.d.ts +3 -0
  16. package/es/endpoints/sse.js +56 -0
  17. package/es/endpoints/start.d.ts +3 -0
  18. package/es/endpoints/start.js +35 -0
  19. package/es/endpoints/types.d.ts +13 -0
  20. package/es/endpoints/widget.d.ts +3 -0
  21. package/es/endpoints/widget.js +57 -0
  22. package/{dist/vite → es}/index.d.ts +1 -1
  23. package/es/index.js +168 -0
  24. package/es/utils/paths.d.ts +3 -0
  25. package/es/utils/paths.js +38 -0
  26. package/es/utils/system.js +241 -0
  27. package/lib/client/index.d.ts +1 -0
  28. package/lib/client/index.js +328 -0
  29. package/lib/client.js +5597 -0
  30. package/lib/core/api.d.ts +14 -0
  31. package/lib/core/api.js +321 -0
  32. package/lib/core/injector.d.ts +2 -0
  33. package/lib/core/injector.js +34 -0
  34. package/lib/core/service.d.ts +18 -0
  35. package/lib/core/service.js +180 -0
  36. package/lib/endpoints/context.d.ts +3 -0
  37. package/lib/endpoints/context.js +137 -0
  38. package/lib/endpoints/index.d.ts +4 -0
  39. package/lib/endpoints/index.js +41 -0
  40. package/lib/endpoints/sessions.d.ts +3 -0
  41. package/lib/endpoints/sessions.js +102 -0
  42. package/lib/endpoints/sse.d.ts +3 -0
  43. package/lib/endpoints/sse.js +79 -0
  44. package/lib/endpoints/start.d.ts +3 -0
  45. package/lib/endpoints/start.js +58 -0
  46. package/lib/endpoints/types.d.ts +13 -0
  47. package/lib/endpoints/types.js +15 -0
  48. package/lib/endpoints/widget.d.ts +3 -0
  49. package/lib/endpoints/widget.js +90 -0
  50. package/lib/index.d.ts +3 -0
  51. package/lib/index.js +190 -0
  52. package/lib/style.css +1 -0
  53. package/lib/utils/paths.d.ts +3 -0
  54. package/lib/utils/paths.js +73 -0
  55. package/lib/utils/system.d.ts +5 -0
  56. package/lib/utils/system.js +274 -0
  57. package/package.json +28 -33
  58. package/README.md +0 -287
  59. package/dist/constants.d.ts +0 -74
  60. package/dist/constants.js +0 -75
  61. package/dist/constants.js.map +0 -1
  62. package/dist/logger.d.ts +0 -64
  63. package/dist/logger.js +0 -311
  64. package/dist/logger.js.map +0 -1
  65. package/dist/opencode/plugins/page-context.d.ts +0 -7
  66. package/dist/opencode/plugins/page-context.js +0 -372
  67. package/dist/opencode/plugins/page-context.js.map +0 -1
  68. package/dist/opencode/web.d.ts +0 -3
  69. package/dist/opencode/web.js +0 -81
  70. package/dist/opencode/web.js.map +0 -1
  71. package/dist/types.d.ts +0 -126
  72. package/dist/types.js +0 -2
  73. package/dist/types.js.map +0 -1
  74. package/dist/vite/client.js +0 -2468
  75. package/dist/vite/client.js.map +0 -1
  76. package/dist/vite/index.js +0 -697
  77. package/dist/vite/index.js.map +0 -1
  78. package/dist/vite/injector.d.ts +0 -2
  79. package/dist/vite/injector.js +0 -6
  80. package/dist/vite/injector.js.map +0 -1
  81. package/dist/vite/utils.js +0 -206
  82. package/dist/vite/utils.js.map +0 -1
  83. /package/{dist/vite/client.d.ts → es/endpoints/types.js} +0 -0
  84. /package/{dist/vite/utils.d.ts → es/utils/system.d.ts} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/vite/client.js"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview OpenCode 挂件客户端脚本\n * @description 用于在浏览器中显示 OpenCode AI 助手挂件\n */\n\n(function () {\n \"use strict\";\n\n /** @type {string} 初始化标记 */\n const INIT_MARKER = \"__OPENCODE_INITIALIZED__\";\n\n /** @type {string} 选中元素存储键 */\n const SELECTED_ELEMENTS_KEY = \"__opencode_selected_elements__\";\n\n /** @type {number} 服务器同步间隔(毫秒) */\n const SERVER_SYNC_INTERVAL = 2000;\n\n /** @type {number} 检查 Vue Inspector 间隔(毫秒) */\n const INSPECTOR_CHECK_INTERVAL = 500;\n\n /** @type {number} 自动打开延迟(毫秒) */\n const AUTO_OPEN_DELAY = 1000;\n\n /** @type {number} 通知显示时间(毫秒) */\n const NOTIFICATION_DURATION = 3000;\n\n /**\n * @typedef {Object} HotkeyConfig\n * @property {boolean} ctrl - 是否需要 Ctrl/Meta 键\n * @property {boolean} shift - 是否需要 Shift 键\n * @property {boolean} alt - 是否需要 Alt 键\n * @property {string} key - 主键\n */\n\n /**\n * @typedef {Object} SelectedElement\n * @property {string|null} filePath - 文件路径\n * @property {number|null} line - 行号\n * @property {number|null} column - 列号\n * @property {string} innerText - 元素内部文本\n * @property {string} description - 元素描述(标签名+选择器)\n */\n\n /**\n * @typedef {Object} WidgetConfig\n * @property {string} webUrl - Web 服务 URL\n * @property {string} position - 挂件位置\n * @property {string} theme - 主题模式\n * @property {boolean} open - 是否自动打开\n * @property {string} sessionUrl - 会话 URL\n * @property {boolean} lazy - 是否懒加载\n * @property {string} hotkey - 快捷键配置\n */\n\n /**\n * 初始化 OpenCode 挂件\n * @param {WidgetConfig} config - 挂件配置\n */\n function initOpenCodeWidget(config) {\n if (window[INIT_MARKER]) return;\n window[INIT_MARKER] = true;\n\n const {\n webUrl,\n position,\n theme,\n open,\n sessionUrl: initialSessionUrl,\n lazy,\n hotkey,\n cwd,\n } = config;\n\n /** @type {string|undefined} 会话 URL */\n let sessionUrl = initialSessionUrl;\n\n /** @type {string|null} 当前会话 ID */\n let currentSessionId = null;\n\n /**\n * 从 URL 中提取会话 ID\n */\n function extractSessionId(url) {\n if (!url) return null;\n const match = url.match(/\\/session\\/([^/?]+)/);\n return match ? match[1] : null;\n }\n\n // 从初始 URL 中提取会话 ID\n currentSessionId = extractSessionId(sessionUrl);\n\n /** @type {string} 当前页面 URL */\n let currentPageUrl = \"\";\n\n /** @type {string} 当前页面标题 */\n let currentPageTitle = \"\";\n\n /** @type {boolean} 服务是否已启动 */\n let servicesStarted = !lazy;\n\n /** @type {boolean} 挂件是否打开 */\n let isOpen = false;\n\n /**\n * 解析快捷键字符串\n * @param {string} hotkeyStr - 快捷键字符串,如 'ctrl+k'\n * @returns {HotkeyConfig} 快捷键配置\n */\n function parseHotkey(hotkeyStr) {\n if (!hotkeyStr) return { ctrl: true, shift: false, alt: false, key: \"k\" };\n\n const parts = hotkeyStr.toLowerCase().split(\"+\");\n const key = parts.pop();\n\n return {\n ctrl:\n parts.includes(\"ctrl\") ||\n parts.includes(\"cmd\") ||\n parts.includes(\"meta\"),\n shift: parts.includes(\"shift\"),\n alt: parts.includes(\"alt\"),\n key: key || \"k\",\n };\n }\n\n /** @type {HotkeyConfig} 主快捷键配置 */\n const mainHotkey = parseHotkey(hotkey);\n\n /** @type {HotkeyConfig} 选择模式快捷键配置 */\n const selectHotkey = parseHotkey(\"ctrl+p\");\n\n /**\n * 检查键盘事件是否匹配快捷键\n * @param {KeyboardEvent} e - 键盘事件\n * @param {HotkeyConfig} hotkeyConfig - 快捷键配置\n * @returns {boolean} 是否匹配\n */\n function matchHotkey(e, hotkeyConfig) {\n const ctrlMatch = hotkeyConfig.ctrl\n ? e.ctrlKey || e.metaKey\n : !(e.ctrlKey || e.metaKey);\n const shiftMatch = hotkeyConfig.shift ? e.shiftKey : !e.shiftKey;\n const altMatch = hotkeyConfig.alt ? e.altKey : !e.altKey;\n const keyMatch = e.key.toLowerCase() === hotkeyConfig.key.toLowerCase();\n\n return ctrlMatch && shiftMatch && altMatch && keyMatch;\n }\n\n /**\n * 从 sessionStorage 加载选中的元素\n * @returns {SelectedElement[]} 选中的元素列表\n */\n function loadSelectedElements() {\n try {\n const stored = sessionStorage.getItem(SELECTED_ELEMENTS_KEY);\n if (stored) {\n return JSON.parse(stored);\n }\n } catch (e) {\n // 忽略错误\n }\n return [];\n }\n\n /**\n * 保存选中的元素到 sessionStorage\n * @param {SelectedElement[]} elements - 选中的元素列表\n */\n function saveSelectedElements(elements) {\n try {\n sessionStorage.setItem(SELECTED_ELEMENTS_KEY, JSON.stringify(elements));\n } catch (e) {\n // 忽略错误\n }\n }\n\n /** @type {SelectedElement[]} 选中的元素列表 */\n let selectedElements = loadSelectedElements();\n\n /**\n * 确保服务已启动\n * @returns {Promise<boolean>} 是否成功启动\n */\n async function ensureServicesStarted() {\n if (servicesStarted) return true;\n\n try {\n const res = await fetch(\"/__opencode_start__\");\n const data = await res.json();\n if (data.success) {\n servicesStarted = true;\n if (data.sessionUrl) {\n sessionUrl = data.sessionUrl;\n currentSessionId = extractSessionId(sessionUrl);\n if (iframe) iframe.src = sessionUrl;\n } else {\n if (iframe) iframe.src = \"about:blank\";\n showLoading();\n }\n return true;\n }\n } catch (e) {\n console.error(\"[OpenCode Widget] Failed to start services:\", e);\n }\n return false;\n }\n\n /**\n * 更新页面上下文\n * @param {boolean} [force=false] - 是否强制更新\n */\n function updateContext(force = false) {\n if (!servicesStarted) return;\n\n const newUrl = window.location.href;\n const newTitle = document.title;\n\n if (force || newUrl !== currentPageUrl || newTitle !== currentPageTitle) {\n currentPageUrl = newUrl;\n currentPageTitle = newTitle;\n\n fetch(\"/__opencode_context__\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n url: newUrl,\n title: newTitle,\n selectedElements,\n }),\n }).catch(() => {});\n }\n }\n\n // 监听路由变化\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n history.pushState = function (...args) {\n originalPushState.apply(this, args);\n setTimeout(updateContext, 0);\n };\n\n history.replaceState = function (...args) {\n originalReplaceState.apply(this, args);\n setTimeout(updateContext, 0);\n };\n\n window.addEventListener(\"popstate\", () => setTimeout(updateContext, 0));\n window.addEventListener(\"hashchange\", () => setTimeout(updateContext, 0));\n\n // 监听标题变化\n const titleObserver = new MutationObserver(() => {\n if (document.title !== currentPageTitle) {\n updateContext();\n }\n });\n\n if (document.head) {\n titleObserver.observe(document.head, { childList: true, subtree: true });\n }\n\n /** @type {EventSource|null} SSE 连接实例 */\n let sseConnection = null;\n\n if (servicesStarted) {\n updateContext(true);\n setupSSEConnection();\n }\n\n // 创建样式\n const style = document.createElement(\"style\");\n style.textContent = buildWidgetStyles();\n document.head.appendChild(style);\n\n // 创建容器\n const container = document.createElement(\"div\");\n container.className = `opencode-widget ${position}`;\n\n // 创建按钮\n const button = document.createElement(\"button\");\n button.className = \"opencode-button\";\n button.innerHTML = `\n <svg t=\"1775402599580\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\" http://www.w3.org/2000/svg \" p-id=\"5390\" xmlns:xlink=\" http://www.w3.org/1999/xlink \" width=\"100%\" height=\"100%\"><path d=\"M512 981.33H85.34c-15.85 0-30.38-8.77-37.77-22.81a42.624 42.624 0 0 1 2.6-44.02L135 791.08C75.25 710.5 42.67 612.6 42.67 512 42.67 253.21 253.21 42.67 512 42.67S981.34 253.21 981.34 512 770.8 981.33 512 981.33zM166.44 896H512c211.73 0 384-172.27 384-384S723.73 128 512 128 128 300.27 128 512c0 91.29 32.83 179.9 92.46 249.46 12.58 14.69 13.73 36 2.77 51.94L166.44 896z\" fill=\"white\" p-id=\"5391\"></path><path d=\"M384 448m-64 0a64 64 0 1 0 128 0 64 64 0 1 0 -128 0Z\" fill=\"white\" p-id=\"5392\"></path><path d=\"M640 448m-64 0a64 64 0 1 0 128 0 64 64 0 1 0 -128 0Z\" fill=\"white\" p-id=\"5393\"></path></svg>\n `;\n button.setAttribute(\"aria-label\", \"打开 AI 助手\");\n button.title = `AI 助手 (${hotkey || \"Ctrl+K\"})`;\n\n // 创建聊天面板\n const chat = document.createElement(\"div\");\n chat.className = \"opencode-chat\";\n chat.setAttribute(\"role\", \"dialog\");\n chat.setAttribute(\"aria-modal\", \"true\");\n chat.setAttribute(\"aria-label\", \"AI 助手对话窗口\");\n\n // 创建面板头部操作栏\n const chatHeader = document.createElement(\"div\");\n chatHeader.className = \"opencode-chat-header\";\n\n // 左侧操作区\n const headerLeft = document.createElement(\"div\");\n headerLeft.className = \"opencode-chat-header-left\";\n\n // 会话列表折叠按钮\n const toggleBtn = document.createElement(\"button\");\n toggleBtn.className = \"opencode-header-btn session-toggle\";\n toggleBtn.innerHTML = `\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M4 6h16M4 12h16M4 18h16\" stroke-linecap=\"round\"/>\n </svg>\n `;\n toggleBtn.title = \"展开会话列表\";\n toggleBtn.setAttribute(\"aria-label\", \"展开会话列表\");\n toggleBtn.setAttribute(\"aria-expanded\", \"false\");\n\n // 选择元素按钮\n const selectButton = document.createElement(\"button\");\n selectButton.className = \"opencode-header-btn select-btn\";\n selectButton.innerHTML = `\n <svg viewBox=\"0 0 1024 1024\" width=\"16\" height=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill=\"currentColor\" d=\"M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768m0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896\"></path><path fill=\"currentColor\" d=\"M512 96a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V128a32 32 0 0 1 32-32m0 576a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V704a32 32 0 0 1 32-32M96 512a32 32 0 0 1 32-32h192a32 32 0 0 1 0 64H128a32 32 0 0 1-32-32m576 0a32 32 0 0 1 32-32h192a32 32 0 1 1 0 64H704a32 32 0 0 1-32-32\"></path>\n </svg>\n `;\n selectButton.title = \"选择页面元素 (Ctrl+P)\";\n selectButton.setAttribute(\"aria-label\", \"选择页面元素\");\n selectButton.setAttribute(\"aria-pressed\", \"false\");\n\n headerLeft.appendChild(toggleBtn);\n headerLeft.appendChild(selectButton);\n\n // 标题\n const headerTitle = document.createElement(\"span\");\n headerTitle.className = \"opencode-chat-header-title\";\n headerTitle.textContent = \"AI 助手\";\n\n // 右侧操作区\n const headerActions = document.createElement(\"div\");\n headerActions.className = \"opencode-chat-header-actions\";\n\n // 关闭按钮\n const closeBtn = document.createElement(\"button\");\n closeBtn.className = \"opencode-header-btn close\";\n closeBtn.innerHTML = `\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M18 6L6 18M6 6l12 12\"/>\n </svg>\n `;\n closeBtn.title = \"关闭\";\n closeBtn.setAttribute(\"aria-label\", \"关闭面板\");\n closeBtn.addEventListener(\"click\", () => {\n isOpen = false;\n chat.classList.remove(\"open\");\n button.classList.remove(\"active\");\n });\n\n headerActions.appendChild(closeBtn);\n chatHeader.appendChild(headerLeft);\n chatHeader.appendChild(headerTitle);\n chatHeader.appendChild(headerActions);\n\n // 创建会话列表\n const sessionList = document.createElement(\"div\");\n sessionList.className = \"opencode-session-list collapsed\";\n\n // 创建会话列表头部\n const sessionListHeader = document.createElement(\"div\");\n sessionListHeader.className = \"opencode-session-list-header\";\n sessionListHeader.innerHTML = `\n <span id=\"opencode-session-list-title\">会话列表</span>\n <button class=\"opencode-new-session-btn\" title=\"新建会话\" aria-label=\"新建会话\">+</button>\n `;\n\n // 创建会话列表头部骨架屏\n const sessionHeaderSkeleton = document.createElement(\"div\");\n sessionHeaderSkeleton.className = \"opencode-session-header-skeleton\";\n sessionHeaderSkeleton.innerHTML = `\n <div class=\"opencode-skeleton-header-title\"></div>\n <div class=\"opencode-skeleton-header-btn\"></div>\n `;\n\n // 创建会话列表内容\n const sessionListContent = document.createElement(\"div\");\n sessionListContent.className = \"opencode-session-list-content\";\n sessionListContent.setAttribute(\"role\", \"listbox\");\n sessionListContent.setAttribute(\n \"aria-labelledby\",\n \"opencode-session-list-title\",\n );\n\n // 创建会话列表内容骨架屏\n const sessionSkeleton = document.createElement(\"div\");\n sessionSkeleton.className = \"opencode-session-skeleton\";\n sessionSkeleton.innerHTML = `\n <div class=\"opencode-skeleton-item\">\n <div class=\"opencode-skeleton-title\"></div>\n <div class=\"opencode-skeleton-meta\"></div>\n </div>\n <div class=\"opencode-skeleton-item\">\n <div class=\"opencode-skeleton-title\"></div>\n <div class=\"opencode-skeleton-meta\"></div>\n </div>\n <div class=\"opencode-skeleton-item\">\n <div class=\"opencode-skeleton-title\"></div>\n <div class=\"opencode-skeleton-meta\"></div>\n </div>\n <div class=\"opencode-skeleton-item\">\n <div class=\"opencode-skeleton-title\"></div>\n <div class=\"opencode-skeleton-meta\"></div>\n </div>\n <div class=\"opencode-skeleton-item\">\n <div class=\"opencode-skeleton-title\"></div>\n <div class=\"opencode-skeleton-meta\"></div>\n </div>\n `;\n\n sessionList.appendChild(sessionHeaderSkeleton);\n sessionList.appendChild(sessionListHeader);\n sessionList.appendChild(sessionSkeleton);\n sessionList.appendChild(sessionListContent);\n\n // 折叠/展开会话列表\n let isSessionListCollapsed = true;\n function toggleSessionList() {\n isSessionListCollapsed = !isSessionListCollapsed;\n\n if (!isSessionListCollapsed) {\n sessionHeaderSkeleton.classList.add(\"visible\");\n sessionListHeader.style.display = \"none\";\n sessionSkeleton.classList.add(\"visible\");\n sessionListContent.style.display = \"none\";\n }\n\n sessionList.classList.toggle(\"collapsed\", isSessionListCollapsed);\n toggleBtn.title = isSessionListCollapsed\n ? \"展开会话列表\"\n : \"折叠会话列表\";\n toggleBtn.setAttribute(\n \"aria-label\",\n isSessionListCollapsed ? \"展开会话列表\" : \"折叠会话列表\",\n );\n toggleBtn.setAttribute(\"aria-expanded\", String(!isSessionListCollapsed));\n\n if (!isSessionListCollapsed) {\n setTimeout(() => {\n sessionHeaderSkeleton.classList.remove(\"visible\");\n sessionListHeader.style.display = \"\";\n sessionSkeleton.classList.remove(\"visible\");\n sessionListContent.style.display = \"\";\n }, 200);\n }\n }\n toggleBtn.addEventListener(\"click\", toggleSessionList);\n\n // 创建 iframe 容器\n const iframeContainer = document.createElement(\"div\");\n iframeContainer.className = \"opencode-iframe-container\";\n\n // 创建加载指示器\n const loadingOverlay = document.createElement(\"div\");\n loadingOverlay.className = \"opencode-loading-overlay\";\n loadingOverlay.innerHTML = `\n <div class=\"opencode-loading-spinner\"></div>\n <div class=\"opencode-loading-text\">加载中...</div>\n `;\n\n // 创建空状态提示\n const emptyStateOverlay = document.createElement(\"div\");\n emptyStateOverlay.className = \"opencode-empty-state-overlay\";\n emptyStateOverlay.innerHTML = `\n <div class=\"opencode-empty-state-icon\">\n <svg viewBox=\"0 0 24 24\" width=\"48\" height=\"48\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\" />\n </svg>\n </div>\n <div class=\"opencode-empty-state-text\">当前项目暂无会话</div>\n <button class=\"opencode-empty-state-btn\">立即创建</button>\n `;\n\n emptyStateOverlay\n .querySelector(\".opencode-empty-state-btn\")\n .addEventListener(\"click\", () => {\n createNewSession();\n });\n\n // 创建 iframe\n const iframe = document.createElement(\"iframe\");\n iframe.className = \"opencode-iframe\";\n iframe.src = servicesStarted && sessionUrl ? sessionUrl : \"about:blank\";\n iframe.allow = \"clipboard-write; clipboard-read\";\n iframe.referrerPolicy = \"origin\";\n\n if (servicesStarted && !sessionUrl) {\n showLoading();\n }\n\n iframe.onload = function () {\n if (\n servicesStarted &&\n iframe.src !== \"about:blank\" &&\n iframe.src !== window.location.href\n ) {\n updateContext();\n loadSessions();\n }\n if (iframe.src !== \"about:blank\" && iframe.src !== window.location.href) {\n hideLoading();\n }\n };\n\n iframeContainer.appendChild(emptyStateOverlay);\n iframeContainer.appendChild(loadingOverlay);\n iframeContainer.appendChild(iframe);\n\n // 创建右侧工具栏\n const rightToolbar = document.createElement(\"div\");\n rightToolbar.className = `opencode-right-toolbar${selectedElements.length === 0 ? \" collapsed\" : \"\"}`;\n\n // 创建已选节点标题\n const selectedNodesHeader = document.createElement(\"div\");\n selectedNodesHeader.className = \"opencode-selected-nodes-header\";\n selectedNodesHeader.innerHTML = `\n <div class=\"opencode-selected-nodes-title\">已选节点</div>\n <div class=\"opencode-selected-nodes-desc\">选中的节点会在对话时一起发送给助手</div>\n `;\n\n // 创建已选节点容器\n const selectedNodesContainer = document.createElement(\"div\");\n selectedNodesContainer.className = \"opencode-selected-nodes\";\n selectedNodesContainer.setAttribute(\"role\", \"list\");\n selectedNodesContainer.setAttribute(\"aria-label\", \"已选元素列表\");\n\n // 创建清空按钮\n const clearAllButton = document.createElement(\"button\");\n clearAllButton.className = \"opencode-clear-all-btn\";\n clearAllButton.setAttribute(\"aria-label\", \"清空所有已选节点\");\n clearAllButton.innerHTML = \"一键清空\";\n\n rightToolbar.appendChild(selectedNodesHeader);\n rightToolbar.appendChild(selectedNodesContainer);\n rightToolbar.appendChild(clearAllButton);\n\n // 创建选择模式常驻提示(固定到页面顶部)\n const selectModeHint = document.createElement(\"div\");\n selectModeHint.className = \"opencode-select-mode-hint\";\n selectModeHint.innerHTML = `\n <span>🎯 选择模式已开启 - 点击元素进行选择</span>\n <span class=\"opencode-hint-shortcut\">按 ESC 或 Ctrl+P 退出</span>\n `;\n\n // 创建元素高亮覆盖层\n const elementHighlight = document.createElement(\"div\");\n elementHighlight.className = \"opencode-element-highlight\";\n\n // 创建元素信息提示框\n const elementTooltip = document.createElement(\"div\");\n elementTooltip.className = \"opencode-element-tooltip\";\n\n // 创建已选节点气泡容器(气泡按钮上方)\n const selectedBubbles = document.createElement(\"div\");\n selectedBubbles.className = \"opencode-selected-bubbles\";\n selectedBubbles.setAttribute(\"role\", \"list\");\n selectedBubbles.setAttribute(\"aria-label\", \"已选元素列表\");\n\n // 创建内容容器\n const chatContent = document.createElement(\"div\");\n chatContent.className = \"opencode-chat-content\";\n\n chat.appendChild(chatHeader);\n chatContent.appendChild(sessionList);\n chatContent.appendChild(iframeContainer);\n chatContent.appendChild(rightToolbar);\n chat.appendChild(chatContent);\n\n container.appendChild(button);\n container.appendChild(selectedBubbles);\n container.appendChild(chat);\n document.body.appendChild(container);\n document.body.appendChild(selectModeHint);\n document.body.appendChild(elementHighlight);\n document.body.appendChild(elementTooltip);\n\n if (selectedElements.length > 0) {\n renderSelectedNodes();\n }\n\n /** @type {Array} 会话列表 */\n let sessions = [];\n\n /**\n * 显示加载状态\n */\n function showLoading() {\n loadingOverlay.classList.add(\"visible\");\n }\n\n /**\n * 隐藏加载状态\n */\n function hideLoading() {\n loadingOverlay.classList.remove(\"visible\");\n }\n\n /**\n * 加载会话列表\n */\n async function loadSessions() {\n try {\n const response = await fetch(\"/__opencode_sessions__\");\n sessions = await response.json();\n renderSessionList();\n } catch (e) {\n console.error(\"Failed to load sessions:\", e);\n }\n }\n\n /**\n * 渲染会话列表\n */\n function renderSessionList() {\n sessionListContent.innerHTML = \"\";\n\n const currentProjectSessions = sessions.filter(\n (session) => session.directory === cwd,\n );\n\n if (currentProjectSessions.length === 0) {\n emptyStateOverlay.classList.add(\"visible\");\n iframe.style.display = \"none\";\n } else {\n emptyStateOverlay.classList.remove(\"visible\");\n iframe.style.display = \"\";\n }\n\n currentProjectSessions.forEach((session) => {\n const item = document.createElement(\"div\");\n item.className = \"opencode-session-item\";\n item.setAttribute(\"role\", \"option\");\n item.setAttribute(\n \"aria-selected\",\n String(session.id === currentSessionId),\n );\n if (session.id === currentSessionId) {\n item.classList.add(\"active\");\n }\n\n const header = document.createElement(\"div\");\n header.className = \"opencode-session-header\";\n\n const title = document.createElement(\"div\");\n title.className = \"opencode-session-title\";\n title.textContent = session.title || \"新会话\";\n\n const deleteBtn = document.createElement(\"button\");\n deleteBtn.className = \"opencode-session-delete-btn\";\n deleteBtn.innerHTML = \"×\";\n deleteBtn.title = \"删除会话\";\n deleteBtn.setAttribute(\n \"aria-label\",\n `删除会话: ${session.title || \"新会话\"}`,\n );\n deleteBtn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n confirmDeleteSession(session);\n });\n\n header.appendChild(title);\n header.appendChild(deleteBtn);\n\n const meta = document.createElement(\"div\");\n meta.className = \"opencode-session-meta\";\n const date = new Date(session.time.updated);\n meta.textContent =\n date.toLocaleDateString() + \" \" + date.toLocaleTimeString();\n\n item.appendChild(header);\n item.appendChild(meta);\n\n item.addEventListener(\"click\", () => {\n switchSession(session);\n });\n\n sessionListContent.appendChild(item);\n });\n }\n\n /**\n * 切换会话\n */\n function switchSession(session) {\n if (session.id === currentSessionId) {\n return;\n }\n\n currentSessionId = session.id;\n const encodedDir = btoa(cwd);\n const baseUrl = webUrl;\n showLoading();\n iframe.src = `${baseUrl}/${encodedDir}/session/${session.id}`;\n renderSessionList();\n }\n\n /**\n * 创建新会话\n */\n async function createNewSession() {\n try {\n const response = await fetch(\"/__opencode_sessions__\", {\n method: \"POST\",\n });\n const newSession = await response.json();\n sessions.unshift(newSession);\n switchSession(newSession);\n } catch (e) {\n console.error(\"Failed to create session:\", e);\n showNotification(\"创建会话失败\");\n }\n }\n\n /**\n * 确认删除会话\n */\n async function confirmDeleteSession(session) {\n const confirmed = await showConfirmDialog(\n `确定要删除会话 \"${session.title || \"新会话\"}\" 吗?`,\n );\n if (confirmed) {\n deleteSession(session);\n }\n }\n\n /**\n * 删除会话\n */\n async function deleteSession(session) {\n try {\n const response = await fetch(\n `/__opencode_sessions__?id=${session.id}`,\n {\n method: \"DELETE\",\n },\n );\n\n if (!response.ok) {\n throw new Error(\"Delete failed\");\n }\n\n sessions = sessions.filter((s) => s.id !== session.id);\n\n if (session.id === currentSessionId) {\n const remainingSessions = sessions.filter((s) => s.directory === cwd);\n if (remainingSessions.length > 0) {\n switchSession(remainingSessions[0]);\n } else {\n currentSessionId = null;\n iframe.src = \"about:blank\";\n }\n }\n\n renderSessionList();\n showNotification(\"会话已删除\");\n } catch (e) {\n console.error(\"Failed to delete session:\", e);\n showNotification(\"删除会话失败\");\n }\n }\n\n // 绑定新建会话按钮\n sessionListHeader\n .querySelector(\".opencode-new-session-btn\")\n .addEventListener(\"click\", createNewSession);\n\n /**\n * 应用主题\n */\n function applyTheme() {\n const resolvedTheme =\n theme === \"auto\"\n ? window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\"\n : theme;\n\n container.classList.toggle(\"opencode-dark\", resolvedTheme === \"dark\");\n container.style.colorScheme = resolvedTheme;\n }\n\n applyTheme();\n\n if (theme === \"auto\") {\n window\n .matchMedia(\"(prefers-color-scheme: dark)\")\n .addEventListener(\"change\", applyTheme);\n }\n\n /**\n * 切换挂件显示状态\n */\n async function toggle() {\n if (lazy && !servicesStarted) {\n button.classList.add(\"loading\");\n const started = await ensureServicesStarted();\n button.classList.remove(\"loading\");\n if (!started) {\n showNotification(\"服务启动失败,请检查控制台\");\n return;\n }\n setupSSEConnection();\n }\n\n if (isSelectMode) {\n exitSelectMode();\n updateContext();\n return;\n }\n\n isOpen = !isOpen;\n chat.classList.toggle(\"open\", isOpen);\n button.classList.toggle(\"active\", isOpen);\n\n if (isOpen) {\n updateContext();\n }\n }\n\n button.addEventListener(\"click\", toggle);\n\n document.addEventListener(\"keydown\", (e) => {\n if (matchHotkey(e, mainHotkey)) {\n e.preventDefault();\n toggle();\n }\n\n if (matchHotkey(e, selectHotkey)) {\n e.preventDefault();\n if (window.__VUE_INSPECTOR__) {\n toggleSelectMode();\n } else {\n showNotification(\"Vue Inspector 未加载,无法使用元素选择功能\");\n }\n }\n });\n\n if (open && servicesStarted) {\n setTimeout(() => {\n toggle();\n }, AUTO_OPEN_DELAY);\n }\n\n /**\n * 显示自定义确认对话框\n * @param {string} message - 确认消息\n * @returns {Promise<boolean>} 用户选择结果\n */\n function showConfirmDialog(message) {\n return new Promise((resolve) => {\n const overlay = document.createElement(\"div\");\n overlay.className = \"opencode-dialog-overlay\";\n\n const dialog = document.createElement(\"div\");\n dialog.className = \"opencode-dialog\";\n dialog.setAttribute(\"role\", \"alertdialog\");\n dialog.setAttribute(\"aria-modal\", \"true\");\n dialog.setAttribute(\"aria-labelledby\", \"opencode-dialog-title\");\n dialog.setAttribute(\"aria-describedby\", \"opencode-dialog-desc\");\n\n dialog.innerHTML = `\n <div class=\"opencode-dialog-content\">\n <div id=\"opencode-dialog-desc\" class=\"opencode-dialog-message\">${message}</div>\n </div>\n <div class=\"opencode-dialog-actions\">\n <button class=\"opencode-dialog-btn cancel\" aria-label=\"取消\">取消</button>\n <button class=\"opencode-dialog-btn confirm\" aria-label=\"确认\">确认</button>\n </div>\n `;\n\n const handleConfirm = () => {\n overlay.remove();\n resolve(true);\n };\n\n const handleCancel = () => {\n overlay.remove();\n resolve(false);\n };\n\n dialog\n .querySelector(\".confirm\")\n .addEventListener(\"click\", handleConfirm);\n dialog.querySelector(\".cancel\").addEventListener(\"click\", handleCancel);\n\n overlay.addEventListener(\"click\", (e) => {\n if (e.target === overlay) {\n handleCancel();\n }\n });\n\n document.addEventListener(\"keydown\", function handleEscape(e) {\n if (e.key === \"Escape\") {\n document.removeEventListener(\"keydown\", handleEscape);\n handleCancel();\n }\n });\n\n overlay.appendChild(dialog);\n container.appendChild(overlay);\n\n dialog.querySelector(\".confirm\").focus();\n });\n }\n\n /**\n * 显示通知\n * @param {string} message - 通知消息\n */\n function showNotification(message) {\n const notification = document.createElement(\"div\");\n notification.className = \"opencode-notification\";\n notification.textContent = message;\n chat.appendChild(notification);\n\n setTimeout(() => {\n notification.remove();\n }, NOTIFICATION_DURATION);\n }\n\n /**\n * 添加选中元素\n * @param {SelectedElement} elementInfo - 元素信息\n */\n function addElement(elementInfo) {\n const key =\n elementInfo.filePath && elementInfo.line\n ? `${elementInfo.filePath}:${elementInfo.line}`\n : null;\n\n const exists =\n key &&\n selectedElements.some((el) => {\n const elKey =\n el.filePath && el.line ? `${el.filePath}:${el.line}` : null;\n return elKey === key;\n });\n\n if (!exists) {\n selectedElements.push(elementInfo);\n saveSelectedElements(selectedElements);\n renderSelectedNodes();\n if (isSelectMode) {\n renderSelectedBubbles();\n }\n showNotification(`已选中元素 (${selectedElements.length}个)`);\n } else {\n showNotification(\"该元素已选中\");\n }\n }\n\n /**\n * 移除选中元素\n * @param {number} index - 元素索引\n */\n function removeElement(index) {\n selectedElements.splice(index, 1);\n saveSelectedElements(selectedElements);\n renderSelectedNodes();\n updateToolbarState();\n sendSelectedElements();\n }\n\n /**\n * 清除所有选中元素\n */\n function clearAllElements() {\n selectedElements = [];\n saveSelectedElements(selectedElements);\n renderSelectedNodes();\n updateToolbarState();\n sendSelectedElements();\n showNotification(\"已清除所有选中元素\");\n }\n\n /**\n * 更新工具栏状态\n */\n function updateToolbarState() {\n if (selectedElements.length > 0) {\n rightToolbar.classList.remove(\"collapsed\");\n } else {\n rightToolbar.classList.add(\"collapsed\");\n }\n }\n\n /** @type {boolean} 是否处于元素选择模式 */\n let isSelectMode = false;\n\n /**\n * 处理鼠标移动事件(选择模式下高亮元素)\n * @param {MouseEvent} e - 鼠标事件\n */\n function handleMouseMove(e) {\n if (!isSelectMode) return;\n\n const inspector = window.__VUE_INSPECTOR__;\n if (!inspector) return;\n\n const { targetNode, params } = inspector.getTargetNode(e);\n\n if (targetNode && params) {\n const rect = targetNode.getBoundingClientRect();\n\n elementHighlight.style.display = \"block\";\n elementHighlight.style.top = `${rect.top}px`;\n elementHighlight.style.left = `${rect.left}px`;\n elementHighlight.style.width = `${rect.width}px`;\n elementHighlight.style.height = `${rect.height}px`;\n\n const description = getElementDescription(targetNode);\n const fileName = params.file ? params.file.split(\"/\").pop() : \"\";\n let lineInfo = \"\";\n if (params.line) {\n lineInfo = `:${params.line}`;\n if (params.column) {\n lineInfo += `:${params.column}`;\n }\n }\n\n elementTooltip.innerHTML = `\n <div class=\"opencode-tooltip-tag\">${description}</div>\n ${fileName ? `<div class=\"opencode-tooltip-file\">${fileName}${lineInfo}</div>` : \"\"}\n `;\n elementTooltip.style.display = \"block\";\n\n const tooltipRect = elementTooltip.getBoundingClientRect();\n let tooltipTop = rect.top - tooltipRect.height - 8;\n let tooltipLeft = rect.left;\n\n if (tooltipTop < 10) {\n tooltipTop = rect.bottom + 8;\n }\n if (tooltipLeft + tooltipRect.width > window.innerWidth - 10) {\n tooltipLeft = window.innerWidth - tooltipRect.width - 10;\n }\n\n elementTooltip.style.top = `${tooltipTop}px`;\n elementTooltip.style.left = `${tooltipLeft}px`;\n } else {\n elementHighlight.style.display = \"none\";\n elementTooltip.style.display = \"none\";\n }\n }\n\n /**\n * 切换元素选择模式\n */\n function toggleSelectMode() {\n const inspector = window.__VUE_INSPECTOR__;\n\n if (!inspector) {\n showNotification(\"Vue Inspector 未加载,无法使用元素选择功能\");\n return;\n }\n\n isSelectMode = !isSelectMode;\n selectButton.classList.toggle(\"active\", isSelectMode);\n selectButton.setAttribute(\"aria-pressed\", String(isSelectMode));\n selectModeHint.classList.toggle(\"visible\", isSelectMode);\n selectedBubbles.classList.toggle(\"visible\", isSelectMode);\n\n if (isSelectMode) {\n if (isOpen) {\n isOpen = false;\n chat.classList.remove(\"open\");\n button.classList.remove(\"active\");\n }\n chat.style.display = \"none\";\n inspector.enable();\n renderSelectedBubbles();\n document.addEventListener(\"mousemove\", handleMouseMove);\n } else {\n chat.style.display = \"\";\n isOpen = true;\n chat.classList.add(\"open\");\n button.classList.add(\"active\");\n inspector.disable();\n document.removeEventListener(\"mousemove\", handleMouseMove);\n elementHighlight.style.display = \"none\";\n elementTooltip.style.display = \"none\";\n }\n }\n\n /**\n * 退出选择模式\n */\n function exitSelectMode() {\n if (!isSelectMode) return;\n\n const inspector = window.__VUE_INSPECTOR__;\n if (inspector) {\n inspector.disable();\n }\n\n isSelectMode = false;\n selectButton.classList.remove(\"active\");\n selectModeHint.classList.remove(\"visible\");\n selectedBubbles.classList.remove(\"visible\");\n chat.style.display = \"\";\n\n isOpen = true;\n chat.classList.add(\"open\");\n button.classList.add(\"active\");\n\n document.removeEventListener(\"mousemove\", handleMouseMove);\n elementHighlight.style.display = \"none\";\n elementTooltip.style.display = \"none\";\n }\n\n // ESC 键退出选择模式(使用捕获阶段确保优先处理)\n document.addEventListener(\n \"keydown\",\n (e) => {\n if (e.key === \"Escape\" && isSelectMode) {\n e.preventDefault();\n e.stopPropagation();\n exitSelectMode();\n }\n },\n true,\n );\n\n /**\n * 建立 SSE 连接监听服务端事件\n */\n function setupSSEConnection() {\n if (!servicesStarted || sseConnection) return;\n\n sseConnection = new EventSource(\"/__opencode_events__\");\n\n sseConnection.onopen = () => {\n console.log(\"[OpenCode] SSE connected\");\n };\n\n sseConnection.onmessage = (event) => {\n try {\n const data = JSON.parse(event.data);\n console.log(\"[OpenCode] SSE message:\", data);\n\n if (data.type === \"CONNECTED\") {\n // 连接成功后,主动同步当前节点到服务端\n if (selectedElements.length > 0) {\n fetch(\"/__opencode_context__\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n url: window.location.href,\n title: document.title,\n selectedElements: selectedElements,\n }),\n }).catch(() => {});\n }\n }\n\n if (data.type === \"SESSION_READY\") {\n if (data.sessionUrl && !sessionUrl) {\n sessionUrl = data.sessionUrl;\n currentSessionId = extractSessionId(sessionUrl);\n if (iframe) {\n iframe.src = sessionUrl;\n }\n }\n }\n\n if (data.type === \"CLEAR_ELEMENTS\" && selectedElements.length > 0) {\n console.log(\"[OpenCode] Clearing elements\");\n selectedElements = [];\n saveSelectedElements(selectedElements);\n renderSelectedNodes();\n updateToolbarState();\n if (isSelectMode) {\n renderSelectedBubbles();\n }\n }\n } catch (e) {\n console.error(\"[OpenCode] SSE parse error:\", e);\n }\n };\n\n sseConnection.onerror = (e) => {\n console.error(\"[OpenCode] SSE error:\", e);\n // 连接失败时自动重连\n if (sseConnection) {\n sseConnection.close();\n sseConnection = null;\n }\n setTimeout(setupSSEConnection, 3000);\n };\n }\n\n /**\n * 渲染已选节点气泡\n */\n function renderSelectedBubbles() {\n selectedBubbles.innerHTML = \"\";\n\n if (selectedElements.length === 0) {\n selectedBubbles.innerHTML =\n '<div class=\"opencode-bubble-empty\">暂无选中元素</div>';\n return;\n }\n\n selectedElements.forEach((element, index) => {\n const bubble = document.createElement(\"div\");\n bubble.className = \"opencode-selected-bubble\";\n bubble.setAttribute(\"role\", \"listitem\");\n\n const description = element.description || \"未知元素\";\n const fileName = element.filePath\n ? element.filePath.split(\"/\").pop()\n : \"\";\n const lineInfo = element.line\n ? `:${element.line}${element.column ? `:${element.column}` : \"\"}`\n : \"\";\n\n bubble.innerHTML = `\n <span class=\"opencode-bubble-text\">${description}</span>\n ${fileName ? `<span class=\"opencode-bubble-file\">${fileName}${lineInfo}</span>` : \"\"}\n <button class=\"opencode-bubble-remove\" data-index=\"${index}\" aria-label=\"移除元素: ${description}\">×</button>\n `;\n\n bubble\n .querySelector(\".opencode-bubble-remove\")\n .addEventListener(\"click\", (e) => {\n e.stopPropagation();\n removeElement(index);\n renderSelectedBubbles();\n });\n\n selectedBubbles.appendChild(bubble);\n });\n }\n function renderSelectedNodes() {\n selectedNodesContainer.innerHTML = \"\";\n\n if (selectedElements.length === 0) {\n rightToolbar.classList.add(\"collapsed\");\n clearAllButton.style.display = \"none\";\n } else {\n rightToolbar.classList.remove(\"collapsed\");\n clearAllButton.style.display = \"block\";\n }\n\n selectedElements.forEach((element, index) => {\n const node = document.createElement(\"div\");\n node.className = \"opencode-selected-node\";\n node.setAttribute(\"role\", \"listitem\");\n\n const description = element.description || \"未知元素\";\n const textPreview = element.innerText\n ? element.innerText.substring(0, 30)\n : \"\";\n const fileName = element.filePath\n ? element.filePath.split(\"/\").pop()\n : \"未知文件\";\n const lineInfo = element.line\n ? `:${element.line}${element.column ? `:${element.column}` : \"\"}`\n : \"\";\n\n node.innerHTML = `\n <div class=\"opencode-node-content\">\n <span class=\"opencode-node-text\">${description}</span>\n <span class=\"opencode-node-file\">${textPreview ? textPreview + \" · \" : \"\"}${fileName}${lineInfo}</span>\n </div>\n <button class=\"opencode-node-remove\" data-index=\"${index}\" aria-label=\"移除元素: ${description}\">×</button>\n `;\n\n node\n .querySelector(\".opencode-node-remove\")\n .addEventListener(\"click\", (e) => {\n e.stopPropagation();\n removeElement(index);\n });\n\n node.addEventListener(\"click\", () => {\n highlightElement(element);\n });\n\n selectedNodesContainer.appendChild(node);\n });\n }\n\n // 绑定清空按钮点击事件\n clearAllButton.addEventListener(\"click\", async () => {\n if (selectedElements.length === 0) return;\n\n const confirmed = await showConfirmDialog(\n `确定要清空所有 ${selectedElements.length} 个已选节点吗?`,\n );\n if (confirmed) {\n clearAllElements();\n }\n });\n\n // 绑定选择按钮点击事件\n selectButton.addEventListener(\"click\", toggleSelectMode);\n\n /**\n * 高亮页面元素\n * @param {SelectedElement} element - 元素信息\n */\n function highlightElement(element) {\n try {\n const description = element.description;\n if (!description) return;\n\n let targetElement = null;\n\n if (description.includes(\"#\")) {\n const idMatch = description.match(/#([^\\.\\[\\s]+)/);\n if (idMatch) {\n targetElement = document.getElementById(idMatch[1]);\n }\n }\n\n if (!targetElement && description.includes(\".\")) {\n const classMatch = description.match(/^([a-z]+)\\.([^\\[\\s]+)/i);\n if (classMatch) {\n const tagName = classMatch[1];\n const classes = classMatch[2].split(\".\").filter(Boolean);\n const selector = `${tagName}.${classes.join(\".\")}`;\n targetElement = document.querySelector(selector);\n }\n }\n\n if (!targetElement) {\n const tagMatch = description.match(/^([a-z]+)/i);\n if (tagMatch) {\n const simpleSelector = description.split(/[\\.\\[\\s]/)[0];\n targetElement = document.querySelector(simpleSelector);\n }\n }\n\n if (targetElement) {\n targetElement.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n\n const highlightOverlay = document.createElement(\"div\");\n highlightOverlay.className = \"opencode-element-highlight-temp\";\n const rect = targetElement.getBoundingClientRect();\n highlightOverlay.style.top = `${rect.top + window.scrollY}px`;\n highlightOverlay.style.left = `${rect.left + window.scrollX}px`;\n highlightOverlay.style.width = `${rect.width}px`;\n highlightOverlay.style.height = `${rect.height}px`;\n document.body.appendChild(highlightOverlay);\n\n setTimeout(() => {\n highlightOverlay.remove();\n }, 2000);\n }\n } catch (e) {\n console.error(\"Failed to highlight element:\", e);\n }\n }\n\n /**\n * 发送选中元素到服务器\n */\n function sendSelectedElements() {\n if (!servicesStarted) {\n console.log(\"[OpenCode] sendSelectedElements: services not started\");\n return;\n }\n\n console.log(\"[OpenCode] Sending selected elements:\", selectedElements);\n fetch(\"/__opencode_context__\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n url: currentPageUrl,\n title: currentPageTitle,\n selectedElements: selectedElements,\n }),\n })\n .then(() => {\n console.log(\"[OpenCode] Selected elements sent successfully\");\n })\n .catch((e) => {\n console.error(\"[OpenCode] Failed to send selected elements:\", e);\n });\n }\n\n /**\n * 截断字符串\n * @param {string} str - 原字符串\n * @param {number} maxLength - 最大长度\n * @returns {string} 截断后的字符串\n */\n function truncate(str, maxLength) {\n if (!str) return \"\";\n return str.length > maxLength ? str.substring(0, maxLength) + \"...\" : str;\n }\n\n /**\n * 获取元素的直接文本内容\n * @param {Element} element - DOM 元素\n * @returns {string} 直接文本内容\n */\n function getDirectText(element) {\n let text = \"\";\n for (const child of element.childNodes) {\n if (child.nodeType === Node.TEXT_NODE) {\n text += child.textContent || \"\";\n }\n }\n return text.trim();\n }\n\n /**\n * 获取元素描述信息\n * @param {Element} element - DOM 元素\n * @returns {string} 元素描述\n */\n function getElementDescription(element) {\n const tag = element.tagName.toLowerCase();\n const parts = [tag];\n\n const id = element.id;\n if (id) parts.push(`#${id}`);\n\n const className =\n element.className && typeof element.className === \"string\"\n ? element.className\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .join(\".\")\n : \"\";\n if (className) parts.push(`.${className}`);\n\n const name = element.getAttribute(\"name\");\n if (name) parts.push(`[name=\"${name}\"]`);\n\n const placeholder = element.getAttribute(\"placeholder\");\n if (placeholder)\n parts.push(`[placeholder=\"${placeholder.substring(0, 20)}\"]`);\n\n const src = element.getAttribute(\"src\");\n if (src) parts.push(`[src]`);\n\n const href = element.getAttribute(\"href\");\n if (href && href !== \"#\") parts.push(`[href]`);\n\n return parts.join(\"\");\n }\n\n /**\n * 设置 Vue Inspector 钩子\n */\n function setupInspectorHook() {\n if (window.__VUE_INSPECTOR__) {\n const inspector = window.__VUE_INSPECTOR__;\n const originalHandleClick = inspector.handleClick.bind(inspector);\n\n inspector.handleClick = function (e) {\n if (isSelectMode) {\n const { targetNode, params } = inspector.getTargetNode(e);\n if (targetNode && params) {\n const innerText = getDirectText(targetNode);\n const description = getElementDescription(targetNode);\n\n const elementInfo = {\n filePath: params.file,\n line: params.line,\n column: params.column,\n innerText: truncate(innerText, 200),\n description,\n };\n addElement(elementInfo);\n sendSelectedElements();\n }\n return;\n }\n\n return originalHandleClick.call(inspector, e);\n };\n }\n }\n\n if (window.__VUE_INSPECTOR__) {\n setupInspectorHook();\n } else {\n const checkInspector = setInterval(() => {\n if (window.__VUE_INSPECTOR__) {\n setupInspectorHook();\n clearInterval(checkInspector);\n }\n }, INSPECTOR_CHECK_INTERVAL);\n }\n\n // 导出全局 API\n window.OpenCodeWidget = {\n open: () => {\n if (!isOpen) toggle();\n },\n close: () => {\n if (isOpen) toggle();\n },\n toggle,\n showNotification,\n updateContext,\n };\n }\n\n /**\n * 构建挂件样式\n * @returns {string} CSS 样式字符串\n */\n function buildWidgetStyles() {\n return `\n .opencode-widget {\n position: fixed;\n z-index: 999999;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n }\n\n .opencode-widget.bottom-right {\n bottom: 20px;\n right: 20px;\n }\n\n .opencode-widget.bottom-left {\n bottom: 20px;\n left: 20px;\n }\n\n .opencode-widget.top-right {\n top: 20px;\n right: 20px;\n }\n\n .opencode-widget.top-left {\n top: 20px;\n left: 20px;\n }\n\n .opencode-button {\n width: 44px;\n height: 44px;\n border-radius: 50%;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n border: none;\n cursor: pointer;\n box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4);\n transition: all 0.3s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n padding: 0;\n position: relative;\n }\n\n .opencode-button::before {\n content: '';\n position: absolute;\n top: -8px;\n left: -8px;\n right: -8px;\n bottom: -8px;\n border-radius: 50%;\n }\n\n .opencode-button:hover {\n transform: scale(1.1);\n box-shadow: 0 6px 20px rgba(102, 126, 234, 0.6);\n background: linear-gradient(135deg, #764ba2 0%, #667eea 100%);\n }\n\n .opencode-button.active {\n background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);\n box-shadow: 0 6px 20px rgba(240, 147, 251, 0.4);\n }\n\n .opencode-button.active svg {\n transform: rotate(180deg);\n }\n\n .opencode-button svg {\n transition: transform 0.3s ease;\n }\n\n .opencode-button.loading {\n animation: pulse 1s infinite;\n }\n\n @keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n\n .opencode-chat {\n position: absolute;\n width: 700px;\n height: 86vh;\n background: white;\n border-radius: 16px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);\n overflow: hidden;\n opacity: 0;\n visibility: hidden;\n transform: translateY(20px) scale(0.95);\n transition: all 0.3s ease;\n display: flex;\n flex-direction: column;\n }\n\n .opencode-chat-content {\n display: flex;\n flex: 1;\n overflow: hidden;\n }\n\n .opencode-widget.bottom-right .opencode-chat {\n bottom: 48px;\n right: 0;\n }\n\n .opencode-widget.bottom-left .opencode-chat {\n bottom: 48px;\n left: 0;\n }\n\n .opencode-widget.top-right .opencode-chat {\n top: 48px;\n right: 0;\n }\n\n .opencode-widget.top-left .opencode-chat {\n top: 48px;\n left: 0;\n }\n\n .opencode-chat.open {\n opacity: 1;\n visibility: visible;\n transform: translateY(0) scale(1);\n }\n\n .opencode-chat-header {\n position: relative;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 12px;\n height: 40px;\n background: #f8f9fa;\n border-bottom: 1px solid #282828;\n z-index: 5;\n }\n\n .opencode-chat-header-left {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .opencode-chat-header-title {\n font-size: 14px;\n font-weight: 600;\n color: #282828;\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n }\n\n .opencode-chat-header-actions {\n display: flex;\n gap: 4px;\n }\n\n .opencode-header-btn {\n width: 28px;\n height: 28px;\n border-radius: 6px;\n border: none;\n background: transparent;\n color: #6b7280;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s;\n }\n\n .opencode-header-btn:hover {\n background: #282828;\n color: #282828;\n }\n\n .opencode-header-btn.close:hover {\n background: #ef4444;\n color: white;\n }\n\n .opencode-header-btn.select-btn.active {\n background: #3b82f6;\n color: white;\n }\n\n .opencode-dark .opencode-chat-header {\n background: #121212;\n border-bottom-color: #282828;\n }\n\n .opencode-dark .opencode-chat-header-title {\n color: #f3f4f6;\n }\n\n .opencode-dark .opencode-header-btn {\n color: #9ca3af;\n }\n\n .opencode-dark .opencode-header-btn:hover {\n background: #282828;\n color: #f3f4f6;\n }\n\n .opencode-dark .opencode-header-btn.close:hover {\n background: #ef4444;\n color: white;\n }\n\n .opencode-session-list {\n width: 240px;\n background: #f8f9fa;\n border-right: 1px solid #282828;\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n transition: width 0.2s ease;\n }\n\n .opencode-session-list.collapsed {\n width: 0;\n overflow: hidden;\n }\n\n .opencode-session-list.collapsed .opencode-session-list-header,\n .opencode-session-list.collapsed .opencode-session-list-content {\n display: none;\n }\n\n .opencode-session-list-header {\n padding: 16px;\n border-bottom: 1px solid #282828;\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-weight: 600;\n font-size: 14px;\n color: #282828;\n }\n\n .opencode-new-session-btn {\n width: 28px;\n height: 28px;\n border-radius: 6px;\n border: none;\n background: #3b82f6;\n color: white;\n font-size: 18px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s;\n }\n\n .opencode-new-session-btn:hover {\n background: #2563eb;\n transform: scale(1.05);\n }\n\n .opencode-session-list-content {\n flex: 1;\n overflow-y: auto;\n padding: 8px;\n }\n\n .opencode-session-item {\n padding: 12px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s;\n margin-bottom: 4px;\n }\n\n .opencode-session-item:hover {\n background: #282828;\n }\n\n .opencode-session-item.active {\n background: #3b82f6;\n color: white;\n }\n\n .opencode-session-title {\n font-size: 14px;\n font-weight: 500;\n margin-bottom: 4px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .opencode-session-meta {\n font-size: 12px;\n opacity: 0.6;\n }\n\n .opencode-session-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 4px;\n }\n\n .opencode-session-delete-btn {\n width: 20px;\n height: 20px;\n border-radius: 4px;\n border: none;\n background: transparent;\n color: #6b7280;\n font-size: 16px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s;\n opacity: 0;\n flex-shrink: 0;\n }\n\n .opencode-session-item:hover .opencode-session-delete-btn {\n opacity: 1;\n }\n\n .opencode-session-delete-btn:hover {\n background: #ef4444;\n color: white;\n }\n\n .opencode-session-item.active .opencode-session-delete-btn {\n color: rgba(255, 255, 255, 0.7);\n }\n\n .opencode-session-item.active .opencode-session-delete-btn:hover {\n background: rgba(255, 255, 255, 0.2);\n color: white;\n }\n\n .opencode-session-header-skeleton {\n padding: 16px;\n border-bottom: 1px solid #282828;\n display: none;\n justify-content: space-between;\n align-items: center;\n }\n\n .opencode-session-header-skeleton.visible {\n display: flex;\n }\n\n .opencode-skeleton-header-title {\n height: 18px;\n width: 80px;\n background: #151515;\n background-size: 200% 100%;\n animation: skeleton-loading 1.5s ease-in-out infinite;\n border-radius: 4px;\n }\n\n .opencode-skeleton-header-btn {\n width: 28px;\n height: 28px;\n background: #151515;\n background-size: 200% 100%;\n animation: skeleton-loading 1.5s ease-in-out infinite;\n border-radius: 6px;\n }\n\n .opencode-session-skeleton {\n flex: 1;\n overflow-y: auto;\n padding: 8px;\n display: none;\n }\n\n .opencode-session-skeleton.visible {\n display: block;\n }\n\n .opencode-skeleton-item {\n padding: 12px;\n border-radius: 8px;\n margin-bottom: 4px;\n background: white;\n }\n\n .opencode-skeleton-title {\n height: 16px;\n background: #151515;\n background-size: 200% 100%;\n animation: skeleton-loading 1.5s ease-in-out infinite;\n border-radius: 4px;\n margin-bottom: 8px;\n width: 70%;\n }\n\n .opencode-skeleton-meta {\n height: 12px;\n background: #151515;\n background-size: 200% 100%;\n animation: skeleton-loading 1.5s ease-in-out infinite;\n border-radius: 4px;\n width: 50%;\n }\n\n @keyframes skeleton-loading {\n 0% {\n background-position: 200% 0;\n }\n 100% {\n background-position: -200% 0;\n }\n }\n\n .opencode-dark .opencode-skeleton-item {\n background: #1e1e1e;\n }\n\n .opencode-dark .opencode-skeleton-title,\n .opencode-dark .opencode-skeleton-meta {\n background: linear-gradient(90deg, #282828 25%, #4b5563 50%, #282828 75%);\n background-size: 200% 100%;\n }\n\n .opencode-dark .opencode-session-header-skeleton {\n border-bottom-color: #282828;\n }\n\n .opencode-dark .opencode-skeleton-header-title,\n .opencode-dark .opencode-skeleton-header-btn {\n background: linear-gradient(90deg, #282828 25%, #4b5563 50%, #282828 75%);\n background-size: 200% 100%;\n }\n\n .opencode-iframe-container {\n flex: 1;\n position: relative;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n margin-top: -42px;\n }\n\n .opencode-loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(255, 255, 255, 0.9);\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: 10;\n transition: opacity 0.3s ease;\n }\n\n .opencode-loading-overlay.visible {\n display: flex;\n }\n\n .opencode-loading-spinner {\n width: 40px;\n height: 40px;\n border: 3px solid #282828;\n border-top-color: #3b82f6;\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n }\n\n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n\n .opencode-loading-text {\n margin-top: 12px;\n font-size: 14px;\n color: #6b7280;\n }\n\n .opencode-empty-state-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: #f8f9fa;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: 5;\n transition: opacity 0.3s ease;\n margin-top: 42px;\n }\n\n .opencode-empty-state-overlay.visible {\n display: flex;\n }\n\n .opencode-empty-state-icon {\n color: #9ca3af;\n margin-bottom: 16px;\n }\n\n .opencode-empty-state-text {\n color: #4b5563;\n font-size: 16px;\n font-weight: 500;\n margin-bottom: 24px;\n }\n\n .opencode-empty-state-btn {\n padding: 10px 24px;\n border-radius: 8px;\n border: none;\n background: #3b82f6;\n color: white;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n box-shadow: 0 2px 4px rgba(59, 130, 246, 0.2);\n }\n\n .opencode-empty-state-btn:hover {\n background: #2563eb;\n transform: translateY(-1px);\n box-shadow: 0 4px 6px rgba(59, 130, 246, 0.3);\n }\n\n .opencode-empty-state-btn:active {\n transform: translateY(0);\n }\n\n .opencode-iframe {\n width: 100%;\n height: 100%;\n border: none;\n }\n\n .opencode-dark .opencode-chat {\n background: #1a1a1a;\n }\n\n .opencode-dark .opencode-session-list {\n background: #121212;\n border-right-color: #282828;\n }\n\n .opencode-dark .opencode-session-toggle {\n color: #9ca3af;\n border-bottom-color: #282828;\n }\n\n .opencode-dark .opencode-session-toggle:hover {\n background: #282828;\n color: #f3f4f6;\n }\n\n .opencode-dark .opencode-session-list-header {\n border-bottom-color: #282828;\n color: #f3f4f6;\n }\n\n .opencode-dark .opencode-session-item:hover {\n background: #282828;\n }\n\n .opencode-dark .opencode-session-item {\n color: #d1d5db;\n }\n\n .opencode-dark .opencode-session-item.active {\n background: #3b82f6;\n color: white;\n }\n\n .opencode-dark .opencode-loading-overlay {\n background: rgba(26, 26, 26, 0.9);\n }\n\n .opencode-dark .opencode-loading-spinner {\n border-color: #282828;\n border-top-color: #3b82f6;\n }\n\n .opencode-dark .opencode-loading-text {\n color: #9ca3af;\n }\n\n .opencode-dark .opencode-empty-state-overlay {\n background: #1a1a1a;\n }\n\n .opencode-dark .opencode-empty-state-icon {\n color: #4b5563;\n }\n\n .opencode-dark .opencode-empty-state-text {\n color: #d1d5db;\n }\n\n .opencode-right-toolbar {\n width: 140px;\n background: #f8f9fa;\n border-left: 1px solid #282828;\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n transition: width 0.2s ease;\n overflow: hidden;\n }\n\n .opencode-right-toolbar.collapsed {\n width: 0;\n overflow: hidden;\n }\n\n .opencode-right-toolbar.collapsed .opencode-selected-nodes-header,\n .opencode-right-toolbar.collapsed .opencode-selected-nodes,\n .opencode-right-toolbar.collapsed .opencode-clear-all-btn {\n display: none;\n }\n\n .opencode-selected-nodes-header {\n padding: 12px 8px 8px;\n border-bottom: 1px solid #282828;\n }\n\n .opencode-selected-nodes-title {\n font-size: 14px;\n font-weight: 600;\n color: #282828;\n margin-bottom: 4px;\n }\n\n .opencode-selected-nodes-desc {\n font-size: 11px;\n color: #9ca3af;\n line-height: 1.4;\n }\n\n .opencode-selected-nodes {\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 8px;\n gap: 6px;\n overflow-y: auto;\n overflow-x: hidden;\n }\n\n .opencode-selected-nodes:empty::before {\n content: '暂无选中元素';\n color: #9ca3af;\n font-size: 12px;\n text-align: center;\n padding: 20px 10px;\n }\n\n .opencode-selected-node {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n background: white;\n border: 1px solid #282828;\n border-radius: 6px;\n font-size: 12px;\n transition: all 0.2s;\n }\n\n .opencode-selected-node:hover {\n border-color: #3b82f6;\n box-shadow: 0 2px 4px rgba(59, 130, 246, 0.1);\n }\n\n .opencode-node-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .opencode-node-text {\n color: #282828;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .opencode-node-file {\n color: #9ca3af;\n font-size: 11px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .opencode-node-remove {\n width: 18px;\n height: 18px;\n border-radius: 4px;\n border: none;\n background: transparent;\n color: #9ca3af;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n transition: all 0.2s;\n flex-shrink: 0;\n }\n\n .opencode-node-remove:hover {\n background: #ef4444;\n color: white;\n }\n\n .opencode-clear-all-btn {\n width: calc(100% - 16px);\n margin: 8px;\n padding: 8px 12px;\n border-radius: 6px;\n border: none;\n background: #ef4444;\n color: white;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n transition: all 0.2s;\n }\n\n .opencode-clear-all-btn:hover {\n background: #dc2626;\n transform: scale(1.02);\n }\n\n .opencode-dark .opencode-right-toolbar {\n background: #121212;\n border-left-color: #282828;\n }\n\n .opencode-dark .opencode-selected-nodes-header {\n border-bottom-color: #282828;\n }\n\n .opencode-dark .opencode-selected-nodes-title {\n color: #f3f4f6;\n }\n\n .opencode-dark .opencode-selected-nodes-desc {\n color: #6b7280;\n }\n\n .opencode-dark .opencode-selected-nodes:empty::before {\n color: #6b7280;\n }\n\n .opencode-dark .opencode-selected-node {\n background: #1e1e1e;\n border-color: #282828;\n }\n\n .opencode-dark .opencode-selected-node:hover {\n border-color: #3b82f6;\n }\n\n .opencode-dark .opencode-node-text {\n color: #f3f4f6;\n }\n\n .opencode-dark .opencode-node-file {\n color: #6b7280;\n }\n\n .opencode-dark .opencode-node-remove {\n color: #6b7280;\n }\n\n .opencode-dark .opencode-node-remove:hover {\n background: #ef4444;\n color: white;\n }\n\n .opencode-dark .opencode-clear-all-btn {\n background: #dc2626;\n color: white;\n }\n\n .opencode-dark .opencode-clear-all-btn:hover {\n background: #b91c1c;\n }\n\n .opencode-dark .opencode-button {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n box-shadow: 0 4px 15px rgba(102, 126, 234, 0.5);\n }\n\n .opencode-notification {\n position: absolute;\n top: 20px;\n left: 50%;\n transform: translateX(-50%);\n padding: 12px 20px;\n background: #10b981;\n color: white;\n border-radius: 8px;\n font-size: 14px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n animation: slideDown 0.3s ease;\n z-index: 10;\n }\n\n .opencode-dialog-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 9999999;\n animation: fadeIn 0.2s ease;\n }\n\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n .opencode-dialog {\n background: white;\n border-radius: 12px;\n padding: 24px;\n min-width: 320px;\n max-width: 400px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n animation: scaleIn 0.2s ease;\n }\n\n @keyframes scaleIn {\n from { transform: scale(0.9); opacity: 0; }\n to { transform: scale(1); opacity: 1; }\n }\n\n .opencode-dialog-content {\n margin-bottom: 20px;\n }\n\n .opencode-dialog-message {\n font-size: 15px;\n color: #282828;\n line-height: 1.5;\n }\n\n .opencode-dialog-actions {\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n }\n\n .opencode-dialog-btn {\n padding: 10px 20px;\n border-radius: 8px;\n border: none;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .opencode-dialog-btn.cancel {\n background: #f3f4f6;\n color: #282828;\n }\n\n .opencode-dialog-btn.cancel:hover {\n background: #282828;\n color: white;\n }\n\n .opencode-dialog-btn.confirm {\n background: #ef4444;\n color: white;\n }\n\n .opencode-dialog-btn.confirm:hover {\n background: #dc2626;\n }\n\n .opencode-dark .opencode-dialog {\n background: #1e1e1e;\n }\n\n .opencode-dark .opencode-dialog-message {\n color: #f3f4f6;\n }\n\n .opencode-dark .opencode-dialog-btn.cancel {\n background: #282828;\n color: #f3f4f6;\n }\n\n .opencode-dark .opencode-dialog-btn.cancel:hover {\n background: #4b5563;\n }\n\n @keyframes slideDown {\n from {\n transform: translateX(-50%) translateY(-100%);\n opacity: 0;\n }\n to {\n transform: translateX(-50%) translateY(0);\n opacity: 1;\n }\n }\n\n .opencode-select-mode-hint {\n position: fixed;\n top: 20px;\n left: 50%;\n transform: translateX(-50%);\n padding: 10px 16px;\n background: #ef4444;\n color: white;\n border-radius: 8px;\n font-size: 13px;\n box-shadow: 0 4px 12px rgba(239, 68, 68, 0.3);\n z-index: 9999999;\n display: none;\n align-items: center;\n gap: 12px;\n }\n\n .opencode-select-mode-hint.visible {\n display: flex;\n animation: slideDown 0.3s ease;\n }\n\n .opencode-hint-shortcut {\n padding: 2px 6px;\n background: rgba(255, 255, 255, 0.2);\n border-radius: 4px;\n font-size: 12px;\n }\n\n .opencode-element-highlight {\n position: fixed;\n pointer-events: none;\n border: 2px solid #3b82f6;\n background: rgba(59, 130, 246, 0.1);\n z-index: 9999998;\n display: none;\n transition: all 0.1s ease;\n border-radius: 4px;\n }\n\n #vue-inspector-container {\n display: none !important;\n }\n\n .opencode-element-tooltip {\n position: fixed;\n background: #1e1e1e;\n color: white;\n padding: 8px 12px;\n border-radius: 6px;\n font-size: 12px;\n z-index: 9999998;\n display: none;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);\n max-width: 300px;\n pointer-events: none;\n }\n\n .opencode-tooltip-tag {\n font-weight: 500;\n margin-bottom: 4px;\n word-break: break-all;\n }\n\n .opencode-tooltip-file {\n font-size: 11px;\n color: #9ca3af;\n word-break: break-all;\n }\n\n .opencode-selected-bubbles {\n position: absolute;\n bottom: 44px;\n right: 0;\n display: none;\n flex-direction: column;\n gap: 6px;\n max-width: 220px;\n max-height: 300px;\n overflow-y: auto;\n }\n\n .opencode-selected-bubbles.visible {\n display: flex;\n }\n\n .opencode-selected-bubble {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 8px 10px;\n background: white;\n border: 1px solid #282828;\n border-radius: 8px;\n font-size: 12px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n position: relative;\n }\n\n .opencode-bubble-text {\n color: #282828;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .opencode-bubble-file {\n color: #9ca3af;\n font-size: 11px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .opencode-bubble-remove {\n position: absolute;\n top: 4px;\n right: 4px;\n width: 16px;\n height: 16px;\n border-radius: 50%;\n border: none;\n background: transparent;\n color: #9ca3af;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n transition: all 0.2s;\n }\n\n .opencode-bubble-remove:hover {\n background: #ef4444;\n color: white;\n }\n\n .opencode-bubble-empty {\n padding: 8px 12px;\n background: white;\n border: 1px dashed #d1d5db;\n border-radius: 8px;\n color: #9ca3af;\n font-size: 12px;\n text-align: center;\n }\n\n .opencode-dark .opencode-selected-bubble {\n background: #1e1e1e;\n border-color: #282828;\n }\n\n .opencode-dark .opencode-bubble-text {\n color: #f3f4f6;\n }\n\n .opencode-dark .opencode-bubble-file {\n color: #6b7280;\n }\n\n .opencode-dark .opencode-bubble-remove {\n color: #6b7280;\n }\n\n .opencode-dark .opencode-bubble-empty {\n background: #1e1e1e;\n border-color: #282828;\n color: #6b7280;\n }\n\n .opencode-element-highlight-temp {\n position: absolute;\n pointer-events: none;\n border: 3px solid #3b82f6;\n background: rgba(59, 130, 246, 0.1);\n z-index: 9999;\n border-radius: 4px;\n animation: highlight-pulse 2s ease-out forwards;\n }\n\n @keyframes highlight-pulse {\n 0% {\n opacity: 1;\n transform: scale(1);\n }\n 50% {\n opacity: 0.8;\n transform: scale(1.02);\n }\n 100% {\n opacity: 0;\n transform: scale(1);\n }\n }\n\n @media (max-width: 768px) {\n .opencode-chat {\n width: calc(100vw - 40px);\n height: calc(100vh - 100px);\n }\n }\n `;\n }\n\n /**\n * 自动初始化挂件\n */\n function autoInit() {\n const script =\n document.currentScript ||\n document.querySelector(\"script[data-opencode-config]\");\n if (script) {\n const configBase64 = script.getAttribute(\"data-opencode-config\");\n if (configBase64) {\n try {\n const config = JSON.parse(atob(configBase64));\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", function () {\n initOpenCodeWidget(config);\n });\n } else {\n initOpenCodeWidget(config);\n }\n } catch (e) {\n console.error(\"[OpenCode Widget] Failed to parse config:\", e);\n }\n }\n }\n }\n\n // 导出全局初始化函数\n window.initOpenCodeWidget = initOpenCodeWidget;\n\n // 自动初始化\n autoInit();\n})();\n"]}