@weapp-vite/dashboard 7.3.0 → 7.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -51,46 +51,116 @@ weapp-vite dev --analyze
51
51
 
52
52
  `weapp-vite` 会在运行时检查当前项目中是否安装了 `@weapp-vite/dashboard`。如果存在,就读取本包 `dist/` 中的静态资源并启动本地 DevTools 页面。
53
53
 
54
- Dashboard 通过挂载在 `/__weapp-vite/` 下的 Devframe 1.0 bridge 连接 CLI([上游迁移说明](https://github.com/devframes/devframe/blob/v1.0.0/docs/content/7.migrations/1.migration-0.10.md)):
54
+ 独立 Dashboard 的页面与 Devframe 1.2 bridge 共同挂载在 `/__weapp-vite/` 下([上游更新日志](https://github.com/devframes/devframe/releases)、[1.0 迁移说明](https://github.com/devframes/devframe/blob/v1.1.0/docs/content/7.migrations/0.migration-1.0.md)):
55
55
 
56
56
  - Analyze 数据通过带 revision、SHA-256 描述符和固定页上限的只读 RPC 分页获取
57
57
  - revision 与最近运行事件通过服务端单向通知同步;WebSocket 断开后会重连并重新查询权威状态
58
- - Dashboard 不创建可由客户端回写的业务 shared state,并拒绝通用 shared-state set/patch
58
+ - Dashboard 不创建可由客户端回写的业务 shared state;独立宿主额外拒绝通用 shared-state set/patch,共享宿主不会覆盖这些全局 RPC
59
59
  - 源码读取保留当前报告 allowlist、符号链接和读取竞态防护;产物文本来自当前分析 revision 的只读快照,不回退到实时 `dist`
60
60
  - 单文件上限为 2 MiB,当前 revision 的产物保留预算按原始字节计为 32 MiB;超限明确报错,不读取其他 revision 或磁盘上的替代内容
61
- - Devframe 显式启用 OTP 与 loopback Origin 门禁;终端会输出可直接打开的 magic link
61
+ - 独立宿主显式启用 OTP 与 loopback Origin 门禁;终端会输出可直接打开的 magic link
62
62
  - 页面不再依赖 HTML 全局变量、业务 SSE 或 Vite HMR 作为业务数据通道
63
- - bridge 保持 `mcp: false`,不加载可选的 `@devframes/agentic`;仓库现有 MCP 服务不经由这个 bridge 提供
63
+ - 独立与 Hub 宿主都在同一端口开放 Dashboard scoped MCP,提供证据查询与受控调查元数据动作;校验真实 loopback 对端与规范 loopback Origin,不暴露通用 shared-state、任意文件写入或命令执行
64
+
65
+ 前端使用 Devframe 的已有连接继承与相对元数据发现,不再写死独立 bridge 地址。路由和复制视图链接保留实际挂载前缀;复制链接仅包含页面路径与查询参数,不携带认证 fragment。`devframe connect --base` 是 MCP connector 的探测选项,不是 Dashboard 的挂载配置。
64
66
 
65
67
  微信开发者工具继续负责模拟器、原生调试和真机能力;Dashboard 是构建、HMR、包体、诊断和自动化状态的伴随 DevTools。
66
68
 
67
- ## 面向 App 与小程序的演进边界
69
+ ### AI 查询当前 Dashboard 与对象调查
70
+
71
+ 独立与 Hub 模式共享 Dashboard 范围的 DevFrame MCP,提供对象型 `structuredContent`:九类报告/事件只读工具、调查列表与详情读取,以及领取、提案、开始和回报四个元数据动作。推荐先取状态和摘要,再定位目标并读取有界文件片段;常规诊断不必下载整份报告。页面、MCP 与 Markdown 报告复用 `weapp-vite/dashboard/analyze` 的纯预算、重复与比较计算,不启动另一份分析服务或 IDE 会话。
72
+
73
+ 分析查询按 revision/hash 固定快照,列表最多 100 项;没有上次报告时比较明确不可用。模块归属包含资源源码,但不等于完整源码引用链;重复节省量是估算,保留独立分包提示。事件只保留最近 24 条,并返回丢弃计数。文件片段按 UTF-16 码元取范围,最多 16384,仍受完整文件大小与读取边界限制;源码是实时受限读取,产物仅来自当前快照。
74
+
75
+ 预算与构建侧保持一致:缺失体积或运行时归因标记为 `unknown`,运行时预算单独返回 `runtimeBudget`,包统计不混入总包或运行时。预算摘要不附带全量文件列表;运行时告警在页面中可跨包定位贡献文件。预算沙盘同样使用共享计算,修改总包/包类型阈值时保留已有 `runtimeBytes` 与 `packageBytes`(包括零限额),不会将缺失测量误判为已解除告警,复制配置也保留这些约束。
76
+
77
+ 在项目中安装 `devframe@1.2.0` 与 `@devframes/agentic@1.2.0` 后,可使用 `pnpm exec devframe connect` 发现正在监听的实例,无需配置认证环境变量。直接 HTTP 地址为 `/__weapp-vite/__mcp`;浏览器仍使用 OTP 授权。关闭 / 重启清理旧实例记录。本机模式信任同机进程,不区分本机用户;不要通过代理、隧道或端口转发对外发布 Dashboard。
78
+
79
+ 完整客户端配置、`arg0` 参数、调查状态与授权边界见 [MCP 使用指南](../weapp-vite/docs/mcp.md#dashboard-证据查询与对象调查devframe)。既有 `wv mcp` / REST / 微信 IDE 自动化不受影响。Hub 的聚合 MCP 保持关闭,仅发布 Dashboard scoped 实例;嵌入 Vite DevTools 时仍由宿主决定 MCP、认证和发现策略,不能把共享宿主视为只读沙箱。
80
+
81
+
82
+ ## 导航与信息层级
83
+
84
+ - 品牌配色沿用[官网文档](https://vite.weapp.dev/guide/)的薄荷白/绿黑体系,由 `src/style.css` 的共享主题变量管理,页面不另设主色。亮色使用薄荷白画布与墨色正文,暗色使用绿黑画布与浅绿白正文;选中、焦点、主要操作与当前测量使用明暗各自的绿色强调色,预算风险、代码语法与增删标记保留独立语义色。正文、辅助文字及强调文字在共享背景和选中表面上保持至少 4.5:1 对比度;输入框提示使用不透明的辅助文字色,不通过统一降低文字透明度实现柔和效果。原生控件的 `color-scheme` 跟随所选主题,保留既有主题偏好;不引入官网首页的光晕、背景网格或装饰动效。
85
+ - “会话状态”用于确认连接、当前构建和提醒;“构建分析”是构建概况与问题诊断的唯一导航入口,不再并列展示指向同页的“构建诊断”。桌面保留完整全局侧栏,窄屏通过标题栏菜单访问相同导航,工作台只占右侧内容区。
86
+ - 常用分析入口依次为“构建分析、包体与分包、对象检查、体积地图”;加上首项“会话状态”后,“包体与分包”为第 03 项、“对象检查”为第 04 项、“体积地图”为第 05 项。评审、依赖与模块复用收在“更多分析”中;直接访问高级页面会自动展开所属导航。分析分组自身不再渲染链接或占用编号,可见入口连续编号;绿色编号、选中底和左侧边线标记当前页。窄屏菜单支持 Escape 与焦点返回。`/analyze` 与 `?tab=diagnostics` 都选中同一个“构建分析”入口。
87
+ - “构建分析”采用同一画布:内部左栏用包体分布条形图、总体积与预算状态交代整体情况,并承接问题索引;右侧直接显示所选对象的同尺度基线/当前/预算图和来源贡献图,不把摘要与诊断上下拼接。完整评分、指标、文件排行与全部包体收在一个明细展开区,文件排行保留前 18 个样本;完整产物可从“对象检查”或“体积地图”定位。图形不把缺测当零,不把模块贡献当作可相加的优化收益。
88
+ - “对照基线”可切换上次构建或浏览器保存的快照;不再展示历史管理、趋势预测大面板,也不改变 MCP 的比较报告。手动跟进清单收在高级“评审清单”页,只记录本地跟进状态,不执行修复或证明问题已解决。问题索引的搜索与筛选按需展开,收起后仍显示生效条件。
89
+ - “运行事件”先呈现事件列表与选中事件;额外筛选、事件统计和诊断按需展开,异常摘要在存在警告或严重事件时默认打开。
90
+ - 折叠区域支持 Tab 聚焦及 Enter / Space 展开;宽窄屏均保留完整对象名称,正文自然换行、随主内容区滚动,不通过缩小文本或多层内部滚动容纳信息。筛选入口使用漏斗、展开箭头和控件底色,收起后仍显示生效条件。
91
+ - 包体文件表格的类型、来源、体积与增量等固定短值保持单行,文件路径保留换行;窄容器沿用表格内部横向滚动,不撑宽页面。
92
+ - 包体健康将平均分、风险数量与需关注数量放在同一标题行,保留评分最低的三个包及其完整路径、体积、产物数、模块数、评分和主要风险;宽容器以分隔线分栏,窄容器改为逐行展示,不改变评分算法及预算、增长、重复模块的风险优先级。
93
+ - 主要风险为“重复模块”时可点击统计进入“模块与复用”,只筛选包含当前包的重复模块条目,条目内仍显示所有相关包体与产物;当前范围明确标注,可用“查看全部重复模块”清除范围及本地搜索条件。其他风险与“未发现主要风险”保持普通文本。模块列表的包体范围沿用当前会话的选择状态,刷新页面或在该视图收到新报告后不保留,不作为可分享的包级深链接;不改变体积地图在报告更新时保留有效选择的既有行为。
94
+ - 复制、导出、刷新等辅助操作使用图标按钮,与工具栏“更多”按钮在桌面和触屏下统一为 32px 高;悬停或键盘聚焦时显示完整动作名称,Escape 可关闭提示,触屏保留“复制 / 导出”等短文案,不依赖悬停。窄屏顶部的“重置视图”收进“更多”,避免挤占主要工具入口;定位、加入清单等工作流操作仍保留文字。
95
+ - 可点击按钮显示手型光标,禁用按钮显示禁止点击光标;拖拽手柄保留抓取光标,输入框保留文本光标。
96
+ - 常规导航不展示“界面令牌”;开发者仍可通过内部 `/tokens` 页面查看“界面样式预览”。它只用于检查 Dashboard 自身的主题、样式令牌和组件状态,不用于配置小程序业务界面。
97
+ - 包体、处理清单和搜索定位会在同一次导航中更新目标页签与筛选,保留当前着色等无关查询参数;连续选择不同包或文件时,即使页签和筛选不变,选中对象仍会更新。切换页面或分析页签时回到主内容顶部;同页筛选、着色、选择和后台数据更新不触发该重置。
98
+
99
+ 设计参考:[Vue DevTools](https://devtools.vuejs.org/getting-started/features) 的对象选择与状态详情、[Vite DevTools](https://devtools.vite.dev/guide/) 的宿主与工具分层,以及 [Nuxt DevTools](https://devtools.nuxt.com/guide/features) 的分组、过滤和按需展开。借鉴检查器的工作流,不用窄图标栏替代现有全局侧栏,也不把尚未被数据证明的来源关联画成依赖链。
100
+
101
+ ## 对象关联工作台
102
+
103
+ “对象检查”(`/analyze?tab=files`)统一原文件明细、源码入口和诊断对象下钻,不再保留单独的源码页或上下文处理计划。包 → 产物 → 模块落点来自完整报告,不截成最大文件样本;连线只表示当前可见的报告收录关系,不暗示未采集的 import 因果链。
68
104
 
69
- 当前页面仍是单项目构建工作台,不是跨设备调试器。`runtimeEvents` 记录的是 CLI/build/HMR/diagnostic 事件,不是被调试应用的 console 或 network 流;前后端也尚未建立 target identity、能力协商和多会话生命周期协议。
105
+ - 三列采用紧凑、连续滚动的对象列表,不再各自分页或跳页;搜索可以直接找到完整集合中的对象,包范围由显式筛选控制。选择不覆盖查询或缩小集合;首次打开或切换对象时,将相关包、产物及模块落点滚入各自列的可视范围,已可见的行保持原位。“定位当前对象”使用相同的关联链;这些定位只滚动相关列表,不移动外层页面、清除筛选或补回已过滤对象。同一对象的报告更新和手动浏览不触发重新定位;连线随滚动更新,仅连接当前可见的真实对象。
106
+ - 当前选中关系的绿色连线沿“包 → 产物 → 模块落点”方向呈现流动虚线,用于标记选择与归属方向,不表示实时传输或调用。未选中关系保持静态实线;开启系统“减少动态效果”时,选中关系也保留为绿色实线,不播放动画。窄屏仍隐藏连线,不改变列表、键盘操作或对象选择行为。
107
+ - 下方唯一上下文区显示证据、内容、构建变化与调查。模块下钻、查看证据和创建调查会定位该区并转移键盘焦点。长路径在节点提示和对象证据中完整可读,窄屏按列重排。
108
+ - 原始产物、Gzip、Brotli、模块归因和源码字节独立展示;缺测不是零,没有基线不推导增量。仅有模块落点、没有对应产物的记录保留归属证据,但不允许内容读取或调查提交。
109
+ - 源码/产物内容沿用报告 allowlist 与 revision 门禁;切换目标、报告、连接或卸载会作废旧请求。源码缺失、二进制内容与读取失败显示真实原因,不回退到其他文件。
110
+ - 调查草稿绑定创建时对象与报告,已有草稿遇到新调查请求先由用户决定保留或替换。提交后状态以服务端为准;断连或操作失败保留输入,不自动重放变更。
111
+ - 外部 Agent 领取和回传精确提案后,浏览器勾选确认才授权。真正执行仍在外部;Agent 名称、检查和回执均为自报,不是在线或执行证明。复制上下文只是辅助。
112
+ - 回报完成不等于验证通过:同一宿主须先产生更新报告,再填写实际检查摘要并明确确认。报告更新使未执行任务和旧授权失效;执行中任务保留原报告绑定。取消不能终止外部进程。
113
+ - 调查为宿主会话内的最多 32 项记录,不是持久历史;已结束的旧记录可能被移除。浏览器授权区分协议入口,不替代操作系统权限隔离。
70
114
 
71
- 源码对比使用与当前报告同一次生成过程采集的产物文本。完整分析从 `analyzeSubpackages` 的 `write: false` 构建输出捕获 chunk/asset;开发模式 fallback 则在扫描 `dist` 生成报告时保存本次读到的同一份字节,并丢弃失败分析的部分捕获。静态 `analyze`、`build --ui`、`dev --ui` 和 fallback 都随报告提交对应快照,不会为界面补写 bundle。
72
115
 
73
- 文件请求携带当前显示的 revision,报告更新会拒绝旧请求与过期异步响应;即使文件路径未变,对比面板也会重新读取。产物只保留当前报告对应的快照,不写入历史 JSON,也不证明目标设备正在运行的构建版本;源码仍读取工作区当前文件,不承诺历史源码快照。这条一致性链路不替代下述 target identity 和运行时 adapter。
116
+ ## 体积地图工作台
74
117
 
75
- | 目标 | 当前可复用部分 | 尚缺的边界 |
118
+ - 图表与节点详情同屏显示;窄屏时详情排在图表下方。可点击图块,也可用详情列表搜索、逐级选择小节点;面包屑和列表支持键盘操作。
119
+ - “显示”控制节点范围,“着色”独立选择所属分包、模块来源、重复打包或构建增量。换色不会改变当前筛选范围和图块面积;图例说明当前颜色含义。
120
+ - 工具栏下拉将标签和值放在同一个轻量触发器内;选项统一左对齐,右侧勾号标明当前选择。方向键移动、Enter 确认、Escape 取消,禁用项不会被键盘选中。
121
+ - “查重复”同时启用重复筛选和重复着色。重复按同一个模块 ID 出现在不同包中判断,不把同包多次引用、同名路径或多个 query 变体合并成跨包重复。
122
+ - “看增长”使用当前选中的基线或上次构建,只显示增长部分。增量比较同一包、文件、模块位置的已记录产物字节;缺失体积标为未知,新增单独标记,不用原始源码体积替代。没有比较快照时入口禁用;已删除节点不出现在当前产物图中。
123
+ - 详情区保留完整路径、模块 ID、所属包、实际产物大小和已记录模块贡献。模块贡献不等于独立文件大小;缺失贡献时图块可能使用原始模块体积估算,详情会明确区分。
124
+ - 详情标题在滚动时保留节点身份;子节点、跨包位置和各类引用可分别折叠,支持 Enter / Space。关闭的分组只有在相关内容实际变化时才显示“有更新”,打开后清除;同值报告、无关包更新和筛选 / 着色 / 列表搜索不会触发未读。
125
+ - 后台报告更新不会主动滚动或移动焦点。显式展开超出可视区域的分组时才调整所属滚动容器;后续切换、收起或手动滚动优先。通过详情列表导航后,焦点回到新节点标题,详情从头显示。
126
+ - 引用与被引用来自报告中的静态 / 动态 import;模块的跨包位置不是源码级依赖图。无法唯一定位的引用仅展示文本,点击当前筛选之外的已知产物会先恢复全部范围。
127
+ - “查看源码与产物”复用只读源码对比,覆盖报告中的全部产物;从模块进入时选择对应源码。第三方依赖不提供工作区源码入口,生成文件或已移除的源码仍可能返回明确的“文件不存在”提示,不回退到其他文件。
128
+ - 当前体积地图的选择会随报告更新按节点身份保留;节点移除时回到所属包,包被移除时恢复全部范围。
129
+
130
+ ## 产物依赖图
131
+
132
+ - 右侧以当前节点为中心:紧凑选择器、完整可换行路径、所属包与体积等事实、可操作的关系列表。点击画布节点和使用选择器共享同一选中状态。
133
+ - 代码产物分别显示“导入的产物”和“引用此产物”,保留静态/动态导入类型;包节点显示“包内代码产物”,明确区分归属与导入。点击关系只切换到当前视图中的节点,不清除搜索或包筛选,也不改变画布缩放与平移。
134
+ - 悬停圆形节点预览一跳关系,点击后保持聚焦;其他节点与连线仅淡化,不删除数据、不改变统计或重启布局。节点使用不透明的混合色淡化,画布连线不参与鼠标命中,避免密集连线抢占悬浮。选择器的空选项可退出聚焦,保留缩放与平移。
135
+ - 导入箭头按需显示:悬停右侧关系行或用键盘聚焦时,只突出该条关系及其端点,避免公共节点周围堆叠大量箭头。离开悬浮行后恢复仍有键盘焦点的关系,否则恢复节点的一跳关系;激活条目后切换节点并清除旧预览。包内归属不显示导入箭头。
136
+ - 节点数、关系数、静态/动态导入数都统计当前可见图;达到显示上限时提示省略数量。全包体积与文件数、未解析导入另行标明来自完整报告,不混作筛选后的统计。
137
+ - 桌面端右侧只有一个滚动区,窄屏排在画布下方自然展开;长路径不截断,关系行支持键盘操作。缩放、适配与平移控制留在画布区;图例直接展示实线箭头、虚线箭头、归属连线和节点色点,不用展开文字说明。
138
+ - 连线从源节点边缘出发,导入箭头停在目标节点边缘之外;节点不透明,圆内不透出经过的连线。拖动造成节点重叠、同坐标或不足以容纳箭头时,临时隐藏该线段,节点分开后恢复,不绘制反向线段。
139
+ - 画布尺寸由外层网格容器决定,SVG 绝对定位填满容器;尺寸监听不再观察 SVG 自身,避免 `viewBox` 影响布局后形成尺寸反馈环。真实尺寸或主题变化重建画布时清除旧圆形的悬浮状态,保留右侧仍有效的关系预览。
140
+ - 后台报告更新保留仍可见的选中节点,不主动滚动详情;筛选或报告变化移除选中节点后显示选择提示,空视图禁用节点选择器。
141
+
142
+ ## 宿主无关的 Devframe 核心
143
+
144
+ 分层参考 [Pinia Colada 的 Devframe 定义与宿主入口](https://github.com/posva/pinia-colada/tree/2f181cbcf5e1a9a9ce06599ae14acdedc24b48d3/devtools/src),通过 [Vite DevTools 官方适配器](https://devtools.vite.dev/kit/devtools-plugin) 挂载同一份定义,而不是另建 Dashboard、RPC 协议或多 target 框架。
145
+
146
+ | 职责 | 入口 | 边界 |
76
147
  | --- | --- | --- |
77
- | 真实微信 IDE | `@weapp-vite/devtools-runtime` 与 MCP 中的 automator 会话、页面数据/WXML 和 console 读取 | Dashboard 只读 adapter、按 target 隔离的日志、显式 detach |
78
- | Node headless / browser simulator | `mpcore` 的逻辑快照、页面操作和浏览器预览 | 各 provider 的能力声明与事件适配;不能把模拟结果当作真实 IDE 布局或宿主行为 |
79
- | 桌面 DevTools App 外壳 | 当前 Web Dashboard 与本地 CLI bridge | 桌面打包、进程所有权、安全 IPC、导航及权限隔离 |
80
- | 原生 iOS/Android App | Dashboard 展示层与 Devframe 连接层 | 原生 runtime/debugger adapter、设备发现、会话管理和平台能力协议 |
148
+ | 报告生产 | 现有 analyze/build/dev 调用方 | 编译、历史持久化和产物捕获在发布前完成 |
149
+ | 共享核心 | `weapp-vite/dashboard` | 持有报告、产物、事件、revision、调查状态及 scoped RPC,不启动服务器 |
150
+ | CLI 宿主 | CLI 的 `startAnalyzeDashboard` | 选择 standalone 或 Hub,持有 Vite、OTP、退出信号与 Dashboard scoped MCP |
151
+ | Vite DevTools 宿主 | `weapp-vite/dashboard/vite` | 使用 `createPluginFromDevframe`,复用现有宿主端口与传输,关闭时释放核心 |
152
+ | 前端 | `@weapp-vite/dashboard` | 同一份原生 Vite 构建的 SPA,不导入 Node 核心 |
153
+
154
+ `createAnalyzeDashboardDevframe` 返回 `definition`、`update`、`emitRuntimeEvents` 和 `dispose`。每个控制器对应一个宿主生命周期与稳定 sessionId;提交后的报告与产物 Map 不得继续修改。报告更新先完成报告、产物、事件、revision 和未执行调查失效的一致切换,再发送通知;事件和调查元数据更新不改变报告 revision。`update` 完成不代表浏览器已经渲染完成。
81
155
 
82
- Web/H5 backend 和 Donut 的多端小程序配置不等于已有通用原生 App 调试目标。桌面外壳也不会自动获得原生调试能力。
156
+ `resolveDashboardClientAssets` 返回可选前端包已构建 SPA 的绝对目录,未安装或未构建时返回 `undefined`。独立开发宿主仍可选择源码入口;Vite DevTools 挂载必须提供已构建资源。接入步骤和完整 Node 端示例见 [weapp-vite 的嵌入接口](../weapp-vite/README.md#dashboard-嵌入-vite-devtools)。
83
157
 
84
- 如果“App/小程序版本”指工作台本身运行在手机或小程序中,当前依赖浏览器 DOM 的 Dashboard 不能直接作为小程序原生页面运行。需要另行设计 WebView 或原生 UI 容器,以及设备到开发机的连接和鉴权;当前 loopback-only bridge 不提供远程设备接入,不能靠放开监听地址替代安全设计。
158
+ Vite 适配器只在开发模式启用,不向生产构建导出报告,也不向小程序 AppService 注入客户端脚本。默认面板目录为 `/__weapp-vite/`;显式 `base` 与 Vite 应用自身的 `base` 独立。一个共享宿主中的其他插件仍可使用其合法的 shared-state、编辑或命令能力;Dashboard 的只读查询不构成插件之间的安全沙箱。
85
159
 
86
- 推荐先落地一条只读链路:**真实微信 IDE attach → 当前页 route/data/WXML → 按会话隔离的 console → detach**。由 `packages/devtools-runtime` 持有窄的 target contract 和 adapter,Dashboard 只消费能力声明和结构化结果;随后再分别接入 headless、browser 和原生 App adapter。不在第一步暴露 `setData`、任意宿主 API、页面方法调用或任意路径写入。
160
+ 源码对比使用与当前报告同一次生成过程捕获的产物。完整分析从 `analyzeSubpackages` 的 `write: false` 输出捕获 chunk/asset;开发 fallback 在扫描产物生成报告时保存同一份字节。两者都不为界面补写 bundle。文件请求携带 revision,更新或关闭会拒绝旧请求及过期异步响应;产物只保留当前报告的快照,源码仍读取 allowlist 内的当前工作区文件。
87
161
 
88
- 多 target/Hub 化之前需要明确以下边界:
162
+ `runtimeEvents` 仍是 CLI/build/HMR/diagnostic 事件,不是应用 console/network,也不自动 attach 微信 IDE、模拟器或原生设备。此次抽取只改变 DevTools 的宿主边界。
89
163
 
90
- - 协议携带 target identity、协议版本、capabilities 和会话状态;构建 revision 与运行时事件序列分开,文件读取继续受 target/project allowlist 约束。
91
- - 当前独立 bridge 覆盖了 Devframe 通用 shared-state set/patch 并拒绝写入。这是单工具的只读策略,不能原样放进共享 Hub,否则会阻止其他 Devframe 的 shared-state 写入;需要隔离 bridge 或改为本工具范围内的权限边界。
92
- - 工作台直接依赖已升级至 Devframe 1.0;`@vitejs/devtools-kit` 的传递依赖仍使用自己的 Devframe/Hub 0.8。当前 bridge 独立运行,不强制覆盖上游 peer 版本;未来接入其 Hub 前需要先统一兼容契约。
93
- - 复用 automator 时区分释放引用与真正断开连接;日志订阅、缓存和清理必须归属具体 target。当前 MCP 日志池不是多 target 隔离协议,不能直接用作统一事件流。
94
164
 
95
165
  ## 项目结构
96
166
 
@@ -136,7 +206,7 @@ packages/dashboard
136
206
 
137
207
  ## 开发
138
208
 
139
- 源码构建使用的 `weapp-tailwindcss` 需要 Node.js `^22.18.0 || >=24.11.0`。发布包只包含预构建的静态资源,不会把该开发依赖带入用户运行时。
209
+ 源码构建使用的 `weapp-tailwindcss` 需要 Node.js `^22.18.0 || ^24.11.0 || >=26.0.0`。发布包只包含预构建的静态资源,不会把该开发依赖带入用户运行时。
140
210
 
141
211
  在仓库根目录执行:
142
212
 
@@ -156,6 +226,14 @@ pnpm --filter dashboard-ui-lab dev:ui
156
226
  pnpm --filter @weapp-vite/dashboard build
157
227
  ```
158
228
 
229
+ Devframe 浏览器回归(先完成上述构建,在沙箱外与其他 E2E、dev-watch 互斥运行):
230
+
231
+ ```bash
232
+ pnpm vitest run -c e2e/vitest.e2e.dashboard.config.ts
233
+ ```
234
+
235
+ 覆盖 OTP 鉴权、报告推送、断线重连后的新报告刷新、深链接 RPC、同路径 revision 产物更新,以及未授权页面和外部 WebSocket Origin 拒绝。连接恢复以真实报告数据更新为依据,不依赖状态栏的展示文案。
236
+
159
237
  Tailwind 配置矩阵与构建性能对照:
160
238
 
161
239
  ```bash
@@ -1 +1 @@
1
- import{B as e,C as t,F as n,P as r,R as i,X as a,_ as o,g as s,j as c,q as l,v as u,x as d,y as f}from"./vue.js";import{t as p}from"./vendor.js";import{D as m,E as h,T as g}from"./index.js";function _(e){let t=document.createElement(`textarea`);t.value=e,t.setAttribute(`readonly`,`true`),t.style.position=`fixed`,t.style.opacity=`0`,document.body.appendChild(t),t.select();let n=document.execCommand(`copy`);if(document.body.removeChild(t),!n)throw Error(`copy text failed`)}async function v(e){let t=null;try{await Promise.race([navigator.clipboard.writeText(e),new Promise((e,n)=>{t=setTimeout(()=>{n(Error(`clipboard write timeout`))},800)})])}finally{t&&clearTimeout(t)}}async function y(e){try{_(e);return}catch{if(navigator.clipboard&&window.isSecureContext){await v(e);return}}throw Error(`copy text failed`)}var b=p({base:`flex flex-col rounded-lg border shadow-(--dashboard-shadow)`,variants:{tone:{default:`border-(--dashboard-border) bg-(--dashboard-panel)`,strong:`border-(--dashboard-border-strong) bg-(--dashboard-panel-strong)`,muted:`border-(--dashboard-border) bg-(--dashboard-panel-muted)`},padding:{none:``,sm:`p-3`,md:`p-4`,header:`px-4 py-4 md:px-5`}},defaultVariants:{tone:`default`,padding:`md`}}),x=p({base:`flex items-center justify-center rounded-md bg-(--dashboard-accent-soft) text-(--dashboard-accent)`,variants:{size:{sm:`h-8 w-8`,md:`h-9 w-9`,lg:`h-10 w-10`}},defaultVariants:{size:`md`}}),S=p({base:`rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted)`,variants:{padding:{sm:`px-4 py-3`,md:`p-4`},interactive:{true:`transition hover:border-(--dashboard-border-strong) hover:bg-(--dashboard-panel)`,false:``}},defaultVariants:{padding:`md`,interactive:!1}}),C=p({base:`inline-flex items-center gap-2 rounded-full border transition`,variants:{kind:{nav:`px-3.5 py-1.5 text-sm`,theme:`px-3 py-1.5 text-xs font-medium`,badge:`px-2.5 py-1 text-[11px] uppercase tracking-[0.18em]`},active:{true:`border-(--dashboard-accent) bg-(--dashboard-accent-soft) text-(--dashboard-text)`,false:`border-(--dashboard-border) bg-(--dashboard-panel-muted) text-(--dashboard-text-soft) hover:border-(--dashboard-border-strong) hover:text-(--dashboard-text)`}},defaultVariants:{kind:`nav`,active:!1}}),w=p({base:`inline-flex shrink-0 items-center whitespace-nowrap rounded-full border px-2.5 py-1 text-[11px] font-medium uppercase tracking-[0.12em]`,variants:{tone:{neutral:`border-(--dashboard-border) bg-(--dashboard-panel-muted) text-(--dashboard-text-soft)`,info:`border-(--dashboard-border-strong) bg-(--dashboard-accent-soft) text-(--dashboard-accent)`,success:`border-emerald-200 bg-emerald-100 text-emerald-700 dark:border-emerald-500/30 dark:bg-emerald-500/12 dark:text-emerald-300`,warning:`border-amber-200 bg-amber-100 text-amber-700 dark:border-amber-500/30 dark:bg-amber-500/12 dark:text-amber-300`,error:`border-rose-200 bg-rose-100 text-rose-700 dark:border-rose-500/30 dark:bg-rose-500/12 dark:text-rose-300`}},defaultVariants:{tone:`neutral`}});p({base:`rounded-lg border border-(--dashboard-border) bg-(--dashboard-panel) px-4 py-3 text-[11px] uppercase tracking-[0.24em] text-(--dashboard-text-soft) shadow-(--dashboard-shadow)`});var T=t({__name:`AppSurfaceCard`,props:{title:{default:void 0},description:{default:void 0},eyebrow:{default:void 0},iconName:{default:void 0},tone:{default:`default`},padding:{default:`md`},contentClass:{default:``}},setup(e,{expose:t}){t();let n=e,r=i(),a={props:n,slots:r,hasHeader:!!(n.title||n.description||r.header),get cn(){return m},get iconFrameStyles(){return x},get surfaceStyles(){return b},DashboardIcon:g};return Object.defineProperty(a,"__isScriptSetup",{enumerable:!1,value:!0}),a}}),E={key:0,class:`flex items-start justify-between gap-4`},D={class:`flex min-w-0 items-start gap-3`},O={class:`h-5 w-5`},k={class:`min-w-0 sm:flex sm:flex-wrap sm:items-baseline sm:gap-x-2.5`},A={key:0,class:`text-[11px] uppercase tracking-[0.24em] text-(--dashboard-accent)`},j=[`title`],M={key:2,class:`mt-1 w-full text-sm leading-6 text-(--dashboard-text-muted)`};function N(e,t,n,i,o,p){return c(),f(`section`,{class:l(i.cn(i.surfaceStyles({tone:n.tone,padding:n.padding}),n.contentClass))},[i.hasHeader?(c(),f(`header`,E,[s(`div`,D,[n.iconName?(c(),f(`span`,{key:0,class:l([i.iconFrameStyles({size:`md`}),`shrink-0`])},[s(`span`,O,[d(i.DashboardIcon,{name:n.iconName},null,8,[`name`])])],2)):u(``,!0),s(`div`,k,[n.eyebrow?(c(),f(`p`,A,a(n.eyebrow),1)):u(``,!0),n.title?(c(),f(`h2`,{key:1,class:`truncate text-lg font-semibold tracking-tight`,title:n.title},a(n.title),9,j)):u(``,!0),n.description?(c(),f(`p`,M,a(n.description),1)):u(``,!0)])]),r(e.$slots,`header`)])):u(``,!0),s(`div`,{class:l(i.cn(`min-h-0 flex-1`,i.hasHeader?`mt-4`:``))},[r(e.$slots,`default`)],2)],2)}var P=h(T,[[`render`,N]]),F=t({__name:`AppEmptyState`,props:{as:{},compact:{type:Boolean}},setup(e,{expose:t}){t();let n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});function I(t,i,a,s,u,d){return c(),o(n(a.as??`div`),{class:l([`rounded-xl border border-dashed border-(--dashboard-border) bg-(--dashboard-panel-muted) text-sm text-(--dashboard-text-soft)`,a.compact?`px-3 py-4`:`p-5`])},{default:e(()=>[r(t.$slots,`default`)]),_:3},8,[`class`])}var L=h(F,[[`render`,I]]);export{C as a,y as c,S as i,P as n,w as o,x as r,b as s,L as t};
1
+ import{$ as e,F as t,H as n,I as r,M as i,S as a,X as o,_ as s,g as c,h as l,v as u,w as d,z as f}from"./vue.js";import{t as p}from"./vendor.js";import{F as m,O as h,P as g}from"./index.js";function _(e){let t=document.createElement(`textarea`);t.value=e,t.setAttribute(`readonly`,`true`),t.style.position=`fixed`,t.style.opacity=`0`,document.body.appendChild(t),t.select();try{if(!document.execCommand(`copy`))throw Error(`copy text failed`)}finally{t.remove()}}async function v(e){let t=null;try{await Promise.race([navigator.clipboard.writeText(e),new Promise((e,n)=>{t=setTimeout(()=>{n(Error(`clipboard write timeout`))},800)})])}finally{t&&clearTimeout(t)}}async function y(e){try{_(e);return}catch{if(navigator.clipboard&&window.isSecureContext){await v(e);return}}throw Error(`copy text failed`)}var b=p({base:`flex flex-col rounded-lg border shadow-(--dashboard-shadow)`,variants:{tone:{default:`border-(--dashboard-border) bg-(--dashboard-panel)`,strong:`border-(--dashboard-border-strong) bg-(--dashboard-panel-strong)`,muted:`border-(--dashboard-border) bg-(--dashboard-panel-muted)`},padding:{none:``,sm:`p-3`,md:`p-4`,header:`px-4 py-4 md:px-5`}},defaultVariants:{tone:`default`,padding:`md`}}),x=p({base:`flex items-center justify-center rounded-md bg-(--dashboard-accent-soft) text-(--dashboard-accent)`,variants:{size:{sm:`h-8 w-8`,md:`h-9 w-9`,lg:`h-10 w-10`}},defaultVariants:{size:`md`}}),S=p({base:`rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted)`,variants:{padding:{sm:`px-4 py-3`,md:`p-4`},interactive:{true:`transition hover:border-(--dashboard-border-strong) hover:bg-(--dashboard-panel)`,false:``}},defaultVariants:{padding:`md`,interactive:!1}}),C=p({base:`inline-flex items-center gap-2 rounded-full border transition`,variants:{kind:{nav:`px-3.5 py-1.5 text-sm`,theme:`px-3 py-1.5 text-xs font-medium`,badge:`px-2.5 py-1 text-[11px] uppercase tracking-[0.18em]`},active:{true:`border-(--dashboard-accent) bg-(--dashboard-accent-soft) text-(--dashboard-text)`,false:`border-(--dashboard-border) bg-(--dashboard-panel-muted) text-(--dashboard-text-soft) hover:border-(--dashboard-border-strong) hover:text-(--dashboard-text)`}},defaultVariants:{kind:`nav`,active:!1}}),w=p({base:`inline-flex shrink-0 items-center whitespace-nowrap rounded-full border px-2.5 py-1 text-[11px] font-medium uppercase tracking-[0.12em]`,variants:{tone:{neutral:`border-(--dashboard-border) bg-(--dashboard-panel-muted) text-(--dashboard-text-soft)`,info:`border-(--dashboard-border-strong) bg-(--dashboard-accent-soft) text-(--dashboard-accent)`,success:`border-emerald-200 bg-emerald-100 text-emerald-700 dark:border-emerald-500/30 dark:bg-emerald-500/12 dark:text-emerald-300`,warning:`border-amber-200 bg-amber-100 text-amber-700 dark:border-amber-500/30 dark:bg-amber-500/12 dark:text-amber-300`,error:`border-rose-200 bg-rose-100 text-rose-700 dark:border-rose-500/30 dark:bg-rose-500/12 dark:text-rose-300`}},defaultVariants:{tone:`neutral`}});p({base:`rounded-lg border border-(--dashboard-border) bg-(--dashboard-panel) px-4 py-3 text-[11px] uppercase tracking-[0.24em] text-(--dashboard-text-soft) shadow-(--dashboard-shadow)`});var T=d({__name:`AppSurfaceCard`,props:{title:{default:void 0},description:{default:void 0},eyebrow:{default:void 0},iconName:{default:void 0},tone:{default:`default`},padding:{default:`md`},contentClass:{default:``}},setup(e,{expose:t}){t();let n=e,r=f(),i={props:n,slots:r,hasHeader:!!(n.title||n.description||r.header),get cn(){return g},get iconFrameStyles(){return x},get surfaceStyles(){return b},DashboardIcon:h};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}}),E={key:0,class:`flex items-start justify-between gap-4`},D={class:`flex min-w-0 items-start gap-3`},O={class:`h-5 w-5`},k={class:`min-w-0 sm:flex sm:flex-wrap sm:items-baseline sm:gap-x-2.5`},A={key:0,class:`text-[11px] uppercase tracking-[0.24em] text-(--dashboard-accent)`},j=[`title`],M={key:2,class:`mt-1 w-full text-sm leading-6 text-(--dashboard-text-muted)`};function N(n,r,c,d,f,p){return i(),u(`section`,{class:o(d.cn(d.surfaceStyles({tone:c.tone,padding:c.padding}),c.contentClass))},[d.hasHeader?(i(),u(`header`,E,[l(`div`,D,[c.iconName?(i(),u(`span`,{key:0,class:o([d.iconFrameStyles({size:`md`}),`shrink-0`])},[l(`span`,O,[a(d.DashboardIcon,{name:c.iconName},null,8,[`name`])])],2)):s(``,!0),l(`div`,k,[c.eyebrow?(i(),u(`p`,A,e(c.eyebrow),1)):s(``,!0),c.title?(i(),u(`h2`,{key:1,class:`truncate text-lg font-semibold tracking-tight`,title:c.title},e(c.title),9,j)):s(``,!0),c.description?(i(),u(`p`,M,e(c.description),1)):s(``,!0)])]),t(n.$slots,`header`)])):s(``,!0),l(`div`,{class:o(d.cn(`min-h-0 flex-1`,d.hasHeader?`mt-4`:``))},[t(n.$slots,`default`)],2)],2)}var P=m(T,[[`render`,N]]),F=d({__name:`AppEmptyState`,props:{as:{},compact:{type:Boolean}},setup(e,{expose:t}){t();let n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});function I(e,a,s,l,u,d){return i(),c(r(s.as??`div`),{class:o([`rounded-xl border border-dashed border-(--dashboard-border) bg-(--dashboard-panel-muted) text-sm text-(--dashboard-text-soft)`,s.compact?`px-3 py-4`:`p-5`])},{default:n(()=>[t(e.$slots,`default`)]),_:3},8,[`class`])}var L=m(F,[[`render`,I]]);export{C as a,y as c,S as i,_ as l,P as n,w as o,x as r,b as s,L as t};
@@ -1 +1 @@
1
- import{B as e,C as t,P as n,X as r,b as i,g as a,j as o,q as s,x as c,y as l}from"./vue.js";import{E as u}from"./index.js";var d=t({__name:`AppMetaLabel`,props:{accent:{type:Boolean}},setup(e,{expose:t}){t();let n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});function f(e,t,r,i,a,c){return o(),l(`p`,{class:s([`text-[11px] uppercase tracking-[0.18em]`,r.accent?`text-(--dashboard-accent)`:`text-(--dashboard-text-soft)`])},[n(e.$slots,`default`)],2)}var p=u(d,[[`render`,f]]),m=`rounded-xl border border-(--dashboard-border) bg-(--dashboard-panel-muted) p-3`,h=t({__name:`AppMetricTile`,props:{label:{},value:{}},setup(e,{expose:t}){t();let n={panelClassName:m,AppMetaLabel:p};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),g={class:`mt-1.5 text-base font-semibold text-(--dashboard-text)`};function _(t,n,u,d,f,p){return o(),l(`div`,{class:s(d.panelClassName)},[c(d.AppMetaLabel,null,{default:e(()=>[i(r(u.label),1)]),_:1}),a(`p`,g,r(u.value),1)])}var v=u(h,[[`render`,_]]);export{p as n,v as t};
1
+ import{$ as e,A as t,F as n,H as r,K as i,L as a,M as o,O as s,Q as c,S as l,V as u,X as d,_ as f,f as p,g as m,h,k as g,p as _,v,w as y,x as b}from"./vue.js";import{F as x,O as S}from"./index.js";var C=y({inheritAttrs:!1,__name:`AppToolButton`,props:{label:{},iconName:{},touchLabel:{},disabled:{type:Boolean,default:!1}},emits:[`click`],setup(e,{expose:n,emit:r}){n();let o=e,s=r,c=a(),l=i(null),d=i(null),f=i(!1),p=i(null),m,h;function _(){clearTimeout(m),clearTimeout(h),m=void 0,h=void 0}function v(){_(),f.value=!1}function y(){_(),o.disabled||(f.value=!0)}function b(e){e.pointerType===`touch`||o.disabled||(_(),f.value||(m=setTimeout(y,200)))}function x(){_(),h=setTimeout(()=>{!l.value?.matches(`:focus-visible, :hover`)&&!d.value?.matches(`:hover`)&&v()},100)}function C(){l.value?.matches(`:focus-visible`)&&y()}function w(e){v(),s(`click`,e)}function T(e){e.key===`Escape`&&f.value&&(e.stopPropagation(),v())}async function E(){if(p.value=null,await g(),!f.value||!l.value||!d.value)return;let e=l.value.getBoundingClientRect(),t=d.value.getBoundingClientRect(),n=Math.max(8,Math.min(e.left+(e.width-t.width)/2,window.innerWidth-t.width-8)),r=e.top-t.height,i=r>=8?r:Math.min(e.bottom,window.innerHeight-t.height-8);p.value={left:`${n}px`,top:`${Math.max(8,i)}px`}}function D(){document.removeEventListener(`keydown`,T,!0),window.removeEventListener(`scroll`,v,!0),window.removeEventListener(`resize`,v),window.removeEventListener(`blur`,v)}u(f,e=>{e?(document.addEventListener(`keydown`,T,!0),window.addEventListener(`scroll`,v,!0),window.addEventListener(`resize`,v),window.addEventListener(`blur`,v),E()):D()}),u(()=>o.label,()=>{f.value&&E()}),u(()=>o.disabled,v),t(()=>{_(),D()});let O={props:o,emit:s,tooltipId:c,triggerRef:l,tooltipRef:d,isOpen:f,position:p,get showTimer(){return m},set showTimer(e){m=e},get hideTimer(){return h},set hideTimer(e){h=e},clearTimers:_,hideTooltip:v,showTooltip:y,handlePointerEnter:b,deferHide:x,handleFocus:C,handleClick:w,handleEscape:T,updatePosition:E,removeListeners:D,DashboardIcon:S};return Object.defineProperty(O,"__isScriptSetup",{enumerable:!1,value:!0}),O}}),w=[`aria-label`,`aria-describedby`,`disabled`],T={class:`size-4.5 shrink-0`,"aria-hidden":`true`},E={class:`hidden whitespace-nowrap pointer-coarse:inline`,"aria-hidden":`true`},D=[`id`],O={class:`block rounded-md border border-(--dashboard-border-strong) bg-(--dashboard-panel-strong) px-2.5 py-1.5 text-xs leading-5 text-(--dashboard-text) shadow-lg [overflow-wrap:anywhere]`};function k(t,n,r,i,a,u){return o(),v(p,null,[h(`button`,s(t.$attrs,{ref:`triggerRef`,type:`button`,class:`inline-flex size-8 shrink-0 items-center justify-center gap-1.5 rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) text-sm text-(--dashboard-text-soft) transition-colors hover:border-(--dashboard-border-strong) hover:text-(--dashboard-accent) focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--dashboard-accent) disabled:cursor-not-allowed disabled:opacity-50 motion-reduce:transition-none pointer-coarse:w-auto pointer-coarse:min-w-11 pointer-coarse:px-2.5`,"aria-label":r.label,"aria-describedby":i.isOpen?i.tooltipId:void 0,disabled:r.disabled,onPointerenter:i.handlePointerEnter,onPointerleave:i.deferHide,onFocus:i.handleFocus,onBlur:i.deferHide,onClick:i.handleClick}),[h(`span`,T,[l(i.DashboardIcon,{name:r.iconName},null,8,[`name`])]),h(`span`,E,e(r.touchLabel),1)],16,w),(o(),m(_,{to:`body`},[i.isOpen?(o(),v(`div`,{key:0,id:i.tooltipId,ref:`tooltipRef`,role:`tooltip`,class:`fixed z-[130] w-max max-w-[min(20rem,calc(100vw-1rem))] p-1`,style:c(i.position??{visibility:`hidden`}),onPointerenter:i.clearTimers,onPointerleave:i.deferHide},[h(`span`,O,e(r.label),1)],44,D)):f(``,!0)]))],64)}var A=x(C,[[`render`,k]]),j=y({__name:`AppMetaLabel`,props:{accent:{type:Boolean}},setup(e,{expose:t}){t();let n={};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});function M(e,t,r,i,a,s){return o(),v(`p`,{class:d([`text-[11px] uppercase tracking-[0.18em]`,r.accent?`text-(--dashboard-accent)`:`text-(--dashboard-text-soft)`])},[n(e.$slots,`default`)],2)}var N=x(j,[[`render`,M]]),P=`rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) p-3`,F=y({__name:`AppMetricTile`,props:{label:{},value:{}},setup(e,{expose:t}){t();let n={panelClassName:P,AppMetaLabel:N};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),I={class:`mt-1.5 text-base font-semibold tabular-nums text-(--dashboard-text)`};function L(t,n,i,a,s,c){return o(),v(`div`,{class:d(a.panelClassName)},[l(a.AppMetaLabel,null,{default:r(()=>[b(e(i.label),1)]),_:1}),h(`p`,I,e(i.value),1)])}var R=x(F,[[`render`,L]]);export{N as n,A as r,R as t};
@@ -1 +1 @@
1
- import{C as e,X as t,j as n,q as r,y as i}from"./vue.js";import{E as a}from"./index.js";import{o}from"./AppEmptyState.js";var s=e({__name:`AppRuntimeBadge`,props:{label:{},tone:{default:`neutral`}},setup(e,{expose:t}){t();let n={get runtimeBadgeStyles(){return o}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});function c(e,a,o,s,c,l){return n(),i(`span`,{class:r(s.runtimeBadgeStyles({tone:o.tone}))},t(o.label),3)}var l=a(s,[[`render`,c]]);export{l as t};
1
+ import{$ as e,M as t,X as n,v as r,w as i}from"./vue.js";import{F as a}from"./index.js";import{o}from"./AppEmptyState.js";var s=i({__name:`AppRuntimeBadge`,props:{label:{},tone:{default:`neutral`}},setup(e,{expose:t}){t();let n={get runtimeBadgeStyles(){return o}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}});function c(i,a,o,s,c,l){return t(),r(`span`,{class:n(s.runtimeBadgeStyles({tone:o.tone}))},e(o.label),3)}var l=a(s,[[`render`,c]]);export{l as t};
@@ -1 +1 @@
1
- import{A as e,C as t,N as n,O as r,U as i,V as a,W as o,X as s,b as c,g as l,h as u,j as d,k as f,l as p,p as m,u as h,v as g,x as _,y as v,z as y}from"./vue.js";import{E as b,f as x,x as ee}from"./index.js";import{a as te,c as S,i as C,l as w,n as T,o as E,r as D,s as O,t as k,u as A}from"./d3.js";function j(e){return e.replaceAll(`\\`,`/`).replace(/^\.\//,``).replace(/^\//,``).split(/[?#]/,1)[0]??``}function M(e,t){let n=j(t);if(!t.startsWith(`.`))return n;let r=[...j(e).split(`/`).slice(0,-1),...n.split(`/`)],i=[];for(let e of r)if(e&&e!==`.`){if(e===`..`){i.pop();continue}i.push(e)}return i.join(`/`)}function N(e,t,n){return{id:`chunk:${n.file}`,kind:`chunk`,label:n.file,packageId:e,packageLabel:t,size:n.size??0,isEntry:n.isEntry,moduleCount:n.modules?.length??0}}function P(e){let t=[],n=new Map,r=new Map,i=[];for(let a of e.packages){let e=a.files.filter(e=>e.type===`chunk`),o={id:`package:${a.id}`,kind:`package`,label:a.label,packageId:a.id,packageLabel:a.label,size:a.files.reduce((e,t)=>e+(t.size??0),0),fileCount:a.files.length};t.push(o);for(let s of e){let e=N(a.id,a.label,s);t.push(e),i.push({file:s,node:e}),r.set(j(s.file),e.id);let c={id:`${o.id}->${e.id}:contains`,kind:`contains`,source:o.id,target:e.id};n.set(c.id,c)}}let a=0,o=0,s=0;for(let{file:e,node:t}of i){let i=[...(e.imports??[]).map(e=>({file:e,kind:`static-import`})),...(e.dynamicImports??[]).map(e=>({file:e,kind:`dynamic-import`}))];for(let c of i){let i=r.get(M(e.file,c.file));if(!i){a+=1;continue}let l={id:`${t.id}->${i}:${c.kind}`,kind:c.kind,source:t.id,target:i};n.has(l.id)||(n.set(l.id,l),c.kind===`dynamic-import`?s+=1:o+=1)}}return{dynamicImportCount:s,edges:[...n.values()],nodes:t,staticImportCount:o,unresolvedImportCount:a}}function F(e,t){let n=e.nodes.filter(e=>e.kind===`package`),r=e.nodes.filter(e=>e.kind===`chunk`),i=t.query.trim().toLowerCase(),a=r.filter(e=>t.packageId===`all`||e.packageId===t.packageId).filter(e=>!i||e.label.toLowerCase().includes(i)).sort((e,t)=>t.size-e.size),o=new Set(a.map(e=>e.id)),s=new Set;for(let t of e.edges){if(t.kind===`contains`)continue;let e=o.has(t.source),n=o.has(t.target);e&&!n?s.add(t.target):n&&!e&&s.add(t.source)}let c=r.filter(e=>s.has(e.id)).sort((e,t)=>t.size-e.size),l=[...new Map([...a,...c].map(e=>[e.id,e])).values()],u=new Set(n.map(e=>e.packageId)),d=[],f=new Set,p=t.maxNodes;for(let e of l){let t=u.has(e.packageId)&&!f.has(e.packageId),n=t?2:1;n>p||(d.push(e),t&&f.add(e.packageId),p-=n)}let m=[...n.filter(e=>f.has(e.packageId)),...d],h=new Set(m.map(e=>e.id)),g=new Set(l.map(e=>e.packageId)),_=new Set([...l.map(e=>e.id),...n.filter(e=>g.has(e.packageId)).map(e=>e.id)]),v=e.edges.filter(e=>_.has(e.source)&&_.has(e.target)),y=e.edges.filter(e=>h.has(e.source)&&h.has(e.target)).sort((e,t)=>Number(e.kind===`contains`)-Number(t.kind===`contains`)).slice(0,t.maxEdges);return{edges:y,nodes:m,truncatedEdgeCount:Math.max(0,v.length-y.length),truncatedNodeCount:Math.max(0,_.size-m.length)}}var I=220,L=900,R=80,z=t({__name:`ChunkGraphPanel`,props:{result:{},theme:{}},setup(t,{expose:n}){n();let a=t,s=o(),c=i(`all`),l=i(``),d=i(null),p,m,h,g=u(()=>P(a.result)),_=u(()=>g.value.nodes.filter(e=>e.kind===`package`)),v=u(()=>[{label:`全部 package`,value:`all`},..._.value.map(e=>({label:e.packageLabel,value:e.packageId}))]),b=u(()=>F(g.value,{maxEdges:l.value.trim()?320:L,maxNodes:l.value.trim()?R:I,packageId:c.value,query:l.value})),j=u(()=>b.value.nodes.find(e=>e.id===d.value)??null),M=u(()=>new Map(b.value.nodes.map(e=>[e.id,e]))),N=u(()=>{let e=j.value;return e?b.value.edges.filter(t=>t.kind!==`contains`&&(t.source===e.id||t.target===e.id)).map(t=>{let n=t.source===e.id,r=M.value.get(n?t.target:t.source);return{id:t.id,kind:t.kind===`dynamic-import`?`动态`:`静态`,label:r?.label??(n?t.target:t.source),relation:n?`导入`:`被导入`}}):[]}),z=u(()=>{let e=a.theme===`dark`?[`#5eead4`,`#a78bfa`,`#60a5fa`,`#fbbf24`,`#fb7185`,`#34d399`,`#f472b6`,`#c4b5fd`]:[`#0f766e`,`#7c3aed`,`#2563eb`,`#b45309`,`#be123c`,`#047857`,`#be185d`,`#6d28d9`];return new Map(_.value.map((t,n)=>[t.packageId,e[n%e.length]??`#64748b`]))});function B(e){return e.length>20?`${e.slice(0,19)}…`:e}function V(e,t){return typeof e==`string`?t.get(e):e}function H(e){return e.graphNode.kind===`package`?3:e.graphNode.isEntry?2.5:1.5}function U(e){d.value=e.id}function W(e,t,n){if(n===`start`){e.active||m?.alphaTarget(.18).restart(),t.fx=t.x,t.fy=t.y;return}if(n===`update`){t.fx=e.x,t.fy=e.y;return}e.active||m?.alphaTarget(0),t.fx=null,t.fy=null}function G(e){s.value&&h&&A(s.value).call(h.scaleBy,e)}function K(e,t){s.value&&h&&A(s.value).call(h.translateBy,e,t)}function q(){d.value=null,s.value&&h&&A(s.value).call(h.transform,T)}async function J(){await r();let e=s.value;if(!e||e.clientWidth===0||e.clientHeight===0)return;m?.stop();let t=A(e);t.selectAll(`*`).remove();let n=e.clientWidth,i=e.clientHeight;t.attr(`viewBox`,`0 0 ${n} ${i}`);let o=t.append(`defs`);for(let e of[{id:`chunk-graph-arrow-static`,color:a.theme===`dark`?`#60a5fa`:`#2563eb`},{id:`chunk-graph-arrow-dynamic`,color:`#f59e0b`}])o.append(`marker`).attr(`id`,e.id).attr(`viewBox`,`0 -5 10 10`).attr(`refX`,16).attr(`refY`,0).attr(`markerWidth`,5).attr(`markerHeight`,5).attr(`orient`,`auto`).append(`path`).attr(`d`,`M0,-5L10,0L0,5`).attr(`fill`,e.color);let c=t.append(`g`);h=k().scaleExtent([.2,5]).on(`zoom`,e=>c.attr(`transform`,e.transform.toString())),t.call(h),c.attr(`transform`,D(e).toString());let l=b.value.nodes.map(e=>{let t=e.kind===`package`?18:Math.max(5,Math.min(14,5+Math.log2(Math.max(e.size,1))*.65));return{id:e.id,graphNode:e,color:z.value.get(e.packageId)??`#64748b`,radius:t}}),u=new Map(l.map(e=>[e.id,e])),d=b.value.edges.map(e=>({graphEdge:e,source:e.source,target:e.target})),f=c.append(`g`).attr(`fill`,`none`).selectAll(`line`).data(d).join(`line`).attr(`stroke`,e=>e.graphEdge.kind===`dynamic-import`?`#f59e0b`:e.graphEdge.kind===`static-import`?a.theme===`dark`?`#60a5fa`:`#2563eb`:a.theme===`dark`?`#292f3a`:`#d9dee7`).attr(`stroke-width`,e=>e.graphEdge.kind===`contains`?1:1.4).attr(`stroke-opacity`,e=>e.graphEdge.kind===`contains`?.26:.68).attr(`stroke-dasharray`,e=>e.graphEdge.kind===`dynamic-import`?`5 4`:null).attr(`marker-end`,e=>e.graphEdge.kind===`dynamic-import`?`url(#chunk-graph-arrow-dynamic)`:e.graphEdge.kind===`static-import`?`url(#chunk-graph-arrow-static)`:null),p=c.append(`g`).selectAll(`g`).data(l,e=>e.id).join(`g`).attr(`cursor`,`pointer`).on(`click`,(e,t)=>U(t)).call(w().on(`start`,(e,t)=>W(e,t,`start`)).on(`drag`,(e,t)=>W(e,t,`update`)).on(`end`,(e,t)=>W(e,t,`end`)));p.append(`circle`).attr(`r`,e=>e.radius).attr(`fill`,e=>e.graphNode.kind===`package`?e.color:`${e.color}cc`).attr(`stroke`,e=>e.graphNode.kind===`package`?e.color:a.theme===`dark`?`#11141a`:`#ffffff`).attr(`stroke-width`,e=>H(e)),p.append(`title`).text(e=>`${e.graphNode.label}\n${e.graphNode.packageLabel}\n${x(e.graphNode.size)}`),p.filter(e=>e.graphNode.kind===`package`).append(`text`).attr(`x`,0).attr(`y`,e=>e.radius+15).attr(`text-anchor`,`middle`).attr(`font-size`,11).attr(`font-weight`,600).attr(`fill`,a.theme===`dark`?`#d7dce5`:`#334155`).text(e=>B(e.graphNode.label)),m=te(l).force(`link`,E(d).id(e=>e.id).distance(e=>e.graphEdge.kind===`contains`?68:e.graphEdge.kind===`dynamic-import`?120:92).strength(e=>e.graphEdge.kind===`contains`?.2:.5)).force(`charge`,C().strength(l.length>180?-78:-120)).force(`collision`,O().radius(e=>e.graphNode.kind===`package`?52:e.radius+6).strength(.95)).force(`center`,S(n/2,i/2)).alphaDecay(.035).on(`tick`,()=>{for(let e of l){let t=e.graphNode.kind===`package`?58:e.radius+4;e.x=Math.max(t,Math.min(n-t,e.x??n/2)),e.y=Math.max(t,Math.min(i-t,e.y??i/2))}f.attr(`x1`,e=>V(e.source,u)?.x??0).attr(`y1`,e=>V(e.source,u)?.y??0).attr(`x2`,e=>V(e.target,u)?.x??0).attr(`y2`,e=>V(e.target,u)?.y??0),p.attr(`transform`,e=>`translate(${e.x??0},${e.y??0})`)})}e(()=>{s.value&&(p=new ResizeObserver(()=>void J()),p.observe(s.value)),J()}),f(()=>{p?.disconnect(),m?.stop(),m=void 0}),y(_,e=>{c.value!==`all`&&!e.some(e=>e.packageId===c.value)&&(c.value=`all`)}),y([b,z],([e])=>{d.value&&!e.nodes.some(e=>e.id===d.value)&&(d.value=null),J()},{deep:!0}),y(()=>a.theme,()=>void J());let Y={props:a,MAX_VISIBLE_NODES:I,MAX_VISIBLE_EDGES:L,MAX_SEARCH_NODES:R,svgRef:s,packageFilter:c,searchQuery:l,selectedNodeId:d,get resizeObserver(){return p},set resizeObserver(e){p=e},get simulation(){return m},set simulation(e){m=e},get zoomBehavior(){return h},set zoomBehavior(e){h=e},graph:g,packageOptions:_,packageFilterOptions:v,visibleGraph:b,selectedNode:j,visibleNodeById:M,selectedImportEdges:N,packageColorById:z,formatPackageLabel:B,resolveLinkNode:V,resolveNodeStrokeWidth:H,selectNode:U,bindNodeDrag:W,zoomGraph:G,panGraph:K,resetGraphView:q,renderGraph:J,get formatBytes(){return x},AppSelect:ee};return Object.defineProperty(Y,"__isScriptSetup",{enumerable:!1,value:!0}),Y}}),B={class:`grid min-h-[calc(100dvh-9rem)] min-w-0 overflow-hidden rounded-md border border-(--dashboard-border) bg-(--dashboard-panel) xl:grid-cols-[minmax(0,1fr)_18rem]`},V={class:`grid min-h-0 min-w-0 grid-rows-[auto_minmax(30rem,1fr)]`},H={class:`grid min-w-0 grid-cols-1 gap-2 border-b border-(--dashboard-border) px-3 py-2 sm:grid-cols-[minmax(0,1fr)_minmax(10rem,14rem)_auto]`},U={class:`relative min-w-0`},W={class:`flex items-center gap-1`,role:`group`,"aria-label":`依赖图视图控制`},G={ref:`svgRef`,class:`block h-full min-h-0 w-full min-w-0 max-w-full touch-none overflow-hidden`,"aria-hidden":`true`,focusable:`false`},K={class:`grid min-w-0 overflow-hidden border-t border-(--dashboard-border) bg-(--dashboard-panel-muted) sm:grid-cols-2 xl:block xl:border-t-0 xl:border-l`},q={class:`border-b border-(--dashboard-border) px-3 py-3`},J={class:`mt-2 grid grid-cols-2 gap-2 text-xs`},Y={class:`font-mono`},X={class:`font-mono`},Z={class:`font-mono text-blue-500`},Q={class:`font-mono text-amber-500`},ne={class:`mt-3 grid min-w-0 gap-1.5 text-[10px] font-medium uppercase tracking-[0.12em] text-(--dashboard-text-soft)`},re=[`value`],$={class:`mt-3 grid grid-cols-3 gap-1`,role:`group`,"aria-label":`依赖图平移控制`},ie={key:0,class:`min-w-0 border-l-0 border-(--dashboard-border) px-3 py-3 sm:border-l xl:border-l-0`},ae=[`title`],oe={class:`mt-3 grid min-w-0 gap-2 text-xs`},se={class:`grid min-w-0 grid-cols-[4.5rem_minmax(0,1fr)] gap-2`},ce={class:`min-w-0 truncate text-right`},le={class:`grid min-w-0 grid-cols-[4.5rem_minmax(0,1fr)] gap-2`},ue=[`title`],de={class:`grid min-w-0 grid-cols-[4.5rem_minmax(0,1fr)] gap-2`},fe={class:`min-w-0 truncate text-right font-mono`},pe={key:0,class:`grid min-w-0 grid-cols-[4.5rem_minmax(0,1fr)] gap-2`},me={class:`min-w-0 truncate text-right font-mono`},he={key:1,class:`grid min-w-0 grid-cols-[4.5rem_minmax(0,1fr)] gap-2`},ge={class:`min-w-0 truncate text-right font-mono`},_e={class:`mt-3 min-w-0`},ve={key:0,class:`mt-1 text-xs text-(--dashboard-text-soft)`},ye={key:1,class:`mt-1 grid max-h-32 gap-1 overflow-y-auto text-xs`},be={class:`font-medium`},xe={class:`ml-1 break-all text-(--dashboard-text-soft)`},Se={key:1,class:`min-w-0 border-l-0 border-(--dashboard-border) px-3 py-5 text-xs leading-5 text-(--dashboard-text-soft) sm:border-l xl:border-l-0`},Ce={key:2,class:`border-t border-(--dashboard-border) px-3 py-3 text-[11px] text-amber-500 sm:col-span-2 xl:col-auto`},we={key:3,class:`border-t border-(--dashboard-border) px-3 py-3 text-[11px] text-(--dashboard-text-soft) sm:col-span-2 xl:col-auto`};function Te(e,t,r,i,o,u){return d(),v(`section`,B,[l(`div`,V,[l(`header`,H,[l(`label`,U,[t[9]||=l(`span`,{class:`sr-only`},`搜索 chunk`,-1),a(l(`input`,{"onUpdate:modelValue":t[0]||=e=>i.searchQuery=e,class:`h-8 w-full min-w-0 rounded border border-(--dashboard-border) bg-(--dashboard-panel-muted) px-2.5 text-xs outline-none focus:border-(--dashboard-accent)`,placeholder:`搜索 chunk 文件`,type:`search`},null,512),[[h,i.searchQuery]])]),_(i.AppSelect,{modelValue:i.packageFilter,"onUpdate:modelValue":t[1]||=e=>i.packageFilter=e,class:`min-w-0`,label:`筛选依赖图 package`,options:i.packageFilterOptions,size:`sm`},null,8,[`modelValue`,`options`]),l(`div`,W,[l(`button`,{class:`h-8 w-8 rounded border border-(--dashboard-border) text-sm hover:bg-(--dashboard-panel-muted) focus-visible:ring-2 focus-visible:ring-(--dashboard-accent)`,type:`button`,"aria-label":`缩小依赖图`,title:`缩小(-)`,onClick:t[2]||=e=>i.zoomGraph(.8)},` − `),l(`button`,{class:`h-8 w-8 rounded border border-(--dashboard-border) text-sm hover:bg-(--dashboard-panel-muted) focus-visible:ring-2 focus-visible:ring-(--dashboard-accent)`,type:`button`,"aria-label":`放大依赖图`,title:`放大(+)`,onClick:t[3]||=e=>i.zoomGraph(1.25)},` + `),l(`button`,{class:`h-8 whitespace-nowrap rounded border border-(--dashboard-border) px-2 text-xs hover:bg-(--dashboard-panel-muted) focus-visible:ring-2 focus-visible:ring-(--dashboard-accent)`,type:`button`,"aria-label":`适配依赖图视图`,title:`适配视图(0)`,onClick:i.resetGraphView},` 适配 `)])]),(d(),v(`svg`,G,null,512))]),l(`aside`,K,[l(`div`,q,[t[17]||=l(`p`,{class:`text-[10px] font-medium uppercase tracking-[0.12em] text-(--dashboard-text-soft)`},`Graph summary`,-1),l(`dl`,J,[l(`div`,null,[t[10]||=l(`dt`,{class:`text-(--dashboard-text-soft)`},`Nodes`,-1),l(`dd`,Y,s(i.visibleGraph.nodes.length),1)]),l(`div`,null,[t[11]||=l(`dt`,{class:`text-(--dashboard-text-soft)`},`Edges`,-1),l(`dd`,X,s(i.visibleGraph.edges.length),1)]),l(`div`,null,[t[12]||=l(`dt`,{class:`text-(--dashboard-text-soft)`},`Static`,-1),l(`dd`,Z,s(i.graph.staticImportCount),1)]),l(`div`,null,[t[13]||=l(`dt`,{class:`text-(--dashboard-text-soft)`},`Dynamic`,-1),l(`dd`,Q,s(i.graph.dynamicImportCount),1)])]),l(`label`,ne,[t[14]||=c(` 节点选择 `,-1),a(l(`select`,{"onUpdate:modelValue":t[4]||=e=>i.selectedNodeId=e,class:`min-h-32 w-full min-w-0 rounded border border-(--dashboard-border) bg-(--dashboard-panel) p-1.5 text-xs normal-case tracking-normal text-(--dashboard-text)`,size:`6`},[(d(!0),v(m,null,n(i.visibleGraph.nodes,e=>(d(),v(`option`,{key:e.id,value:e.id},s(e.label)+` · `+s(e.packageLabel),9,re))),128))],512),[[p,i.selectedNodeId]])]),l(`div`,$,[t[15]||=l(`span`,{"aria-hidden":`true`},null,-1),l(`button`,{class:`h-7 rounded border border-(--dashboard-border) text-xs hover:bg-(--dashboard-panel)`,type:`button`,"aria-label":`向上平移依赖图`,onClick:t[5]||=e=>i.panGraph(0,-40)},`↑`),t[16]||=l(`span`,{"aria-hidden":`true`},null,-1),l(`button`,{class:`h-7 rounded border border-(--dashboard-border) text-xs hover:bg-(--dashboard-panel)`,type:`button`,"aria-label":`向左平移依赖图`,onClick:t[6]||=e=>i.panGraph(-40,0)},`←`),l(`button`,{class:`h-7 rounded border border-(--dashboard-border) text-xs hover:bg-(--dashboard-panel)`,type:`button`,"aria-label":`向下平移依赖图`,onClick:t[7]||=e=>i.panGraph(0,40)},`↓`),l(`button`,{class:`h-7 rounded border border-(--dashboard-border) text-xs hover:bg-(--dashboard-panel)`,type:`button`,"aria-label":`向右平移依赖图`,onClick:t[8]||=e=>i.panGraph(40,0)},`→`)])]),i.selectedNode?(d(),v(`div`,ie,[t[24]||=l(`p`,{class:`text-[10px] font-medium uppercase tracking-[0.12em] text-(--dashboard-text-soft)`},`Selected`,-1),l(`h3`,{class:`mt-2 overflow-hidden text-ellipsis whitespace-nowrap font-mono text-xs font-semibold text-(--dashboard-text)`,title:i.selectedNode.label},s(i.selectedNode.label),9,ae),l(`dl`,oe,[l(`div`,se,[t[18]||=l(`dt`,{class:`text-(--dashboard-text-soft)`},`Kind`,-1),l(`dd`,ce,s(i.selectedNode.kind),1)]),l(`div`,le,[t[19]||=l(`dt`,{class:`text-(--dashboard-text-soft)`},`Package`,-1),l(`dd`,{class:`min-w-0 truncate text-right`,title:i.selectedNode.packageLabel},s(i.selectedNode.packageLabel),9,ue)]),l(`div`,de,[t[20]||=l(`dt`,{class:`text-(--dashboard-text-soft)`},`Size`,-1),l(`dd`,fe,s(i.formatBytes(i.selectedNode.size)),1)]),i.selectedNode.moduleCount===void 0?g(``,!0):(d(),v(`div`,pe,[t[21]||=l(`dt`,{class:`text-(--dashboard-text-soft)`},`Modules`,-1),l(`dd`,me,s(i.selectedNode.moduleCount),1)])),i.selectedNode.fileCount===void 0?g(``,!0):(d(),v(`div`,he,[t[22]||=l(`dt`,{class:`text-(--dashboard-text-soft)`},`Files`,-1),l(`dd`,ge,s(i.selectedNode.fileCount),1)]))]),l(`div`,_e,[t[23]||=l(`h4`,{class:`text-[10px] font-medium uppercase tracking-[0.12em] text-(--dashboard-text-soft)`},` Import edges `,-1),i.selectedImportEdges.length?(d(),v(`ul`,ye,[(d(!0),v(m,null,n(i.selectedImportEdges,e=>(d(),v(`li`,{key:e.id,class:`min-w-0`},[l(`span`,be,s(e.relation)+` · `+s(e.kind),1),l(`span`,xe,s(e.label),1)]))),128))])):(d(),v(`p`,ve,` 当前节点没有可见的静态或动态 import。 `))])])):(d(),v(`div`,Se,` 使用节点选择器查看 package、体积和模块数;图中仍可滚轮缩放与拖动画布。蓝色实线是静态 import,橙色虚线是动态 import。 `)),i.graph.unresolvedImportCount?(d(),v(`div`,Ce,s(i.graph.unresolvedImportCount)+` 条 import 指向未输出或外部 chunk。 `,1)):g(``,!0),i.visibleGraph.truncatedNodeCount||i.visibleGraph.truncatedEdgeCount?(d(),v(`div`,we,` 为保持交互流畅,当前隐藏 `+s(i.visibleGraph.truncatedNodeCount)+` 个节点与 `+s(i.visibleGraph.truncatedEdgeCount)+` 条边。 `,1)):g(``,!0)])])}var Ee=b(z,[[`render`,Te]]);export{Ee as default};
1
+ import{$ as e,A as t,B as n,K as r,M as i,P as a,S as o,U as s,V as c,X as l,_ as u,b as d,f,h as p,j as m,k as h,l as g,m as _,q as v,v as y,w as b,x}from"./vue.js";import{F as S,k as C,y as w}from"./index.js";import{a as T,c as ee,i as te,l as ne,n as E,o as D,r as O,s as re,t as ie,u as k}from"./d3.js";import{n as A,r as j}from"./analyze.js";function M(e,t,n){let r=e.nodes.some(e=>e.id===t)?t:null;if(r===null)return{nodeIds:null,edgeIds:null,previewEdgeId:null};let i=n===null?void 0:e.edges.find(e=>e.id===n&&(e.source===r||e.target===r));if(i)return{nodeIds:new Set([i.source,i.target]),edgeIds:new Set([i.id]),previewEdgeId:i.id};let a=new Set([r]),o=new Set;for(let t of e.edges)(t.source===r||t.target===r)&&(a.add(t.source),a.add(t.target),o.add(t.id));return{nodeIds:a,edgeIds:o,previewEdgeId:null}}function N(e,t,n,r){let i=t.x??0,a=t.y??0,o=n.x??0,s=n.y??0,c=o-i,l=s-a,u=Math.hypot(c,l),d=t.radius+t.strokeWidth/2+2,f=n.radius+n.strokeWidth/2+2;if(e.visible=Number.isFinite(u)&&u>d+f+(r?7:0),!e.visible)return;let p=c/u,m=l/u;e.x1=i+p*d,e.y1=a+m*d,e.x2=o-p*f,e.y2=s-m*f}function P(e,t){let n=new Map;for(let t of e.nodes)n.set(t.id,t);let r=t===null?null:n.get(t)??null,i={selected:r,outgoing:[],incoming:[],children:[],staticImportCount:0,dynamicImportCount:0};for(let t of e.edges)if(t.kind===`contains`){if(r?.kind===`package`&&t.source===r.id){let e=n.get(t.target);e?.kind===`chunk`&&i.children.push({id:t.id,kind:t.kind,node:e})}}else if(t.kind===`static-import`?i.staticImportCount+=1:i.dynamicImportCount+=1,r){if(t.source===r.id){let e=n.get(t.target);e&&i.outgoing.push({id:t.id,kind:t.kind,node:e})}if(t.target===r.id){let e=n.get(t.source);e&&i.incoming.push({id:t.id,kind:t.kind,node:e})}}return i}var F=b({__name:`Inspector`,props:{view:{},selectedId:{},previewEdgeId:{},unresolvedImportCount:{}},emits:[`selectNode`,`hoverRelation`,`focusRelation`],setup(e,{expose:t,emit:r}){t();let i=e,a=r,o=n(`selectionHeading`),s=_(()=>P(i.view,i.selectedId)),c=_(()=>[{label:i.view.nodes.length?`选择当前视图中的节点`:`当前视图没有节点`,value:``},...i.view.nodes.map(e=>({label:e.kind===`package`?`包 · ${e.label}`:`${e.label} · ${e.packageLabel}`,value:e.id}))]),l={contains:`包内归属`,"dynamic-import":`动态导入`,"static-import":`静态导入`},u=_(()=>s.value.selected?.kind===`package`?[{id:`children`,title:`包内代码产物`,relations:s.value.children,empty:`当前视图中未显示此包与代码产物的归属关系。`}]:[{id:`outgoing`,title:`导入的产物`,relations:s.value.outgoing,empty:`当前视图中未显示此产物的静态或动态导入。`},{id:`incoming`,title:`引用此产物`,relations:s.value.incoming,empty:`当前视图中未显示引用此产物的静态或动态导入。`}]);async function d(e){a(`selectNode`,e),await h(),o.value?.focus({preventScroll:!0}),o.value?.scrollIntoView({block:`nearest`,behavior:`instant`})}let f={props:i,emit:a,selectionHeading:o,details:s,nodeOptions:c,relationKindLabels:l,relationSections:u,selectRelatedNode:d,get formatBytes(){return w},AppSelect:C};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}}),I={"aria-label":`依赖图节点详情`,class:`min-h-0 min-w-0 border-t border-(--dashboard-border) bg-(--dashboard-panel) text-sm leading-6 text-(--dashboard-text) xl:overflow-y-auto xl:border-t-0 xl:border-l`},L={class:`border-b border-(--dashboard-border) px-4 py-4`},R={class:`min-w-0 px-4 py-4`,"aria-label":`当前节点信息`},z={class:`mt-4 grid grid-cols-[auto_minmax(0,1fr)] gap-x-4 gap-y-2`},B={class:`min-w-0 [overflow-wrap:anywhere]`},V={class:`min-w-0 font-mono [overflow-wrap:anywhere]`},H={class:`text-(--dashboard-text-soft)`},U={class:`font-mono tabular-nums`},W={class:`font-mono tabular-nums`},G={class:`font-mono tabular-nums`},K={key:0,class:`mt-3 text-(--dashboard-text-soft)`},q={class:`border-t border-(--dashboard-border) px-4 pt-4 text-(--dashboard-text-soft)`},J={key:0,class:`mt-2`},Y=[`aria-label`],ae={class:`flex flex-wrap items-baseline justify-between gap-x-3 gap-y-1 font-semibold`},oe={class:`font-normal text-(--dashboard-text-soft)`},se={class:`font-mono tabular-nums`},ce={key:0,class:`mt-2 text-(--dashboard-text-soft)`},le={key:1,class:`mt-2 divide-y divide-(--dashboard-border)`},X=[`aria-label`,`onMouseenter`,`onFocus`,`onClick`],ue={class:`min-w-0 flex-1`},de={class:`block font-mono [overflow-wrap:anywhere] group-hover:text-(--dashboard-accent)`},fe={class:`mt-1 block text-(--dashboard-text-soft) [overflow-wrap:anywhere]`},pe={key:1,class:`px-4 py-6`,"aria-label":`节点选择提示`},me={class:`font-semibold`},he={class:`mt-2 text-(--dashboard-text-soft)`},ge={class:`border-t border-(--dashboard-border) px-4 py-4`,"aria-label":`当前视图概览`},_e={class:`mt-3 grid grid-cols-2 gap-x-4 gap-y-3`},ve={class:`font-mono tabular-nums`},ye={class:`font-mono tabular-nums`},be={class:`font-mono tabular-nums`},xe={class:`font-mono tabular-nums`},Se={key:0,class:`mt-3 border-l-2 border-(--dashboard-border-strong) pl-3 text-(--dashboard-text-muted)`},Ce={key:1,class:`mt-3 border-l-2 border-(--dashboard-border-strong) pl-3 text-(--dashboard-text-muted)`};function we(t,n,r,s,c,m){return i(),y(`aside`,I,[p(`header`,L,[n[3]||=p(`h3`,{class:`text-base font-semibold`},` 节点详情 `,-1),o(s.AppSelect,{class:`mt-3`,label:`选择依赖图节点`,"model-value":s.details.selected?.id??``,options:s.nodeOptions,disabled:r.view.nodes.length===0,"onUpdate:modelValue":n[0]||=e=>s.emit(`selectNode`,e||null)},null,8,[`model-value`,`options`,`disabled`])]),s.details.selected?(i(),y(f,{key:0},[p(`section`,R,[p(`h4`,{ref:`selectionHeading`,tabindex:`-1`,class:l([`min-w-0 rounded-sm text-base leading-6 font-semibold [overflow-wrap:anywhere] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--dashboard-accent)`,s.details.selected.kind===`chunk`?`font-mono`:void 0])},e(s.details.selected.label),3),p(`dl`,z,[n[8]||=p(`dt`,{class:`text-(--dashboard-text-soft)`},` 类型 `,-1),p(`dd`,null,e(s.details.selected.kind===`package`?`包`:`代码产物`),1),s.details.selected.kind===`chunk`?(i(),y(f,{key:0},[n[4]||=p(`dt`,{class:`text-(--dashboard-text-soft)`},` 入口状态 `,-1),p(`dd`,null,e(s.details.selected.isEntry===void 0?`未标注`:s.details.selected.isEntry?`入口产物`:`非入口产物`),1),n[5]||=p(`dt`,{class:`text-(--dashboard-text-soft)`},` 所属包 `,-1),p(`dd`,B,e(s.details.selected.packageLabel),1)],64)):u(``,!0),n[9]||=p(`dt`,{class:`text-(--dashboard-text-soft)`},` 包标识 `,-1),p(`dd`,V,e(s.details.selected.packageId),1),p(`dt`,H,e(s.details.selected.kind===`package`?`全包体积`:`产物体积`),1),p(`dd`,U,e(s.formatBytes(s.details.selected.size)),1),s.details.selected.kind===`chunk`&&s.details.selected.moduleCount!==void 0?(i(),y(f,{key:1},[n[6]||=p(`dt`,{class:`text-(--dashboard-text-soft)`},` 模块数 `,-1),p(`dd`,W,e(s.details.selected.moduleCount),1)],64)):u(``,!0),s.details.selected.kind===`package`&&s.details.selected.fileCount!==void 0?(i(),y(f,{key:2},[n[7]||=p(`dt`,{class:`text-(--dashboard-text-soft)`},` 全包文件数 `,-1),p(`dd`,G,e(s.details.selected.fileCount),1)],64)):u(``,!0)]),s.details.selected.kind===`package`?(i(),y(`p`,K,` 全包体积与文件数来自完整报告,包含非代码文件,不随当前视图筛选变化。 `)):u(``,!0)]),p(`div`,q,[n[10]||=p(`p`,null,`悬停或用键盘聚焦条目,突出对应连线;点击切换节点,不改变筛选。`,-1),s.details.selected.kind===`package`?(i(),y(`p`,J,` 包内归属不是导入关系;选择代码产物可查看它的导入与引用。 `)):u(``,!0)]),(i(!0),y(f,null,a(s.relationSections,t=>(i(),y(`section`,{key:t.id,class:`min-w-0 px-4 py-4`,"aria-label":t.title},[p(`h4`,ae,[p(`span`,null,e(t.title),1),p(`span`,oe,[p(`span`,se,e(t.relations.length),1),n[11]||=x(` 条关系`,-1)])]),t.relations.length?(i(),y(`ul`,le,[(i(!0),y(f,null,a(t.relations,a=>(i(),y(`li`,{key:a.id,class:`min-w-0`},[p(`button`,{type:`button`,class:l([`group -mx-1 flex min-h-11 w-[calc(100%+0.5rem)] items-start gap-2 rounded-sm px-1 py-3 text-left hover:bg-(--dashboard-panel-muted) focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--dashboard-accent)`,{"bg-(--dashboard-panel-muted)":r.previewEdgeId===a.id}]),"aria-label":`${t.title}:查看 ${a.node.label},${s.relationKindLabels[a.kind]},所属包 ${a.node.packageLabel}(${a.node.packageId})`,onMouseenter:e=>s.emit(`hoverRelation`,a.id),onMouseleave:n[1]||=e=>s.emit(`hoverRelation`,null),onFocus:e=>s.emit(`focusRelation`,a.id),onBlur:n[2]||=e=>s.emit(`focusRelation`,null),onClick:e=>s.selectRelatedNode(a.node.id)},[p(`span`,ue,[p(`span`,de,e(a.node.label),1),p(`span`,fe,e(s.relationKindLabels[a.kind])+` · `+e(a.node.packageLabel),1)]),n[12]||=p(`span`,{"aria-hidden":`true`,class:`icon-[mdi--arrow-top-right] mt-1 size-4 shrink-0 text-(--dashboard-text-soft) group-hover:text-(--dashboard-accent)`},null,-1)],42,X)]))),128))])):(i(),y(`p`,ce,e(t.empty),1))],8,Y))),128))],64)):(i(),y(`section`,pe,[p(`h4`,me,e(r.view.nodes.length?`选择一个节点开始查看`:`当前视图没有节点`),1),p(`p`,he,e(r.view.nodes.length?`点击图中节点,或使用上方选择器,查看完整路径、体积与可见关系。`:`当前筛选下没有可显示的代码产物。可调整搜索或包筛选后继续查看。`),1)])),p(`section`,ge,[n[17]||=p(`h4`,{class:`font-semibold`},` 当前视图 `,-1),p(`dl`,_e,[p(`div`,null,[n[13]||=p(`dt`,{class:`text-(--dashboard-text-soft)`},`可见节点`,-1),p(`dd`,ve,e(r.view.nodes.length),1)]),p(`div`,null,[n[14]||=p(`dt`,{class:`text-(--dashboard-text-soft)`},`可见关系`,-1),p(`dd`,ye,e(r.view.edges.length),1)]),p(`div`,null,[n[15]||=p(`dt`,{class:`text-(--dashboard-text-soft)`},`静态导入`,-1),p(`dd`,be,e(s.details.staticImportCount),1)]),p(`div`,null,[n[16]||=p(`dt`,{class:`text-(--dashboard-text-soft)`},`动态导入`,-1),p(`dd`,xe,e(s.details.dynamicImportCount),1)])]),n[18]||=p(`p`,{class:`mt-3 text-(--dashboard-text-soft)`},` 仅统计画布中的可见节点与关系;可见关系包含包内归属,不等同于导入数量。 `,-1),r.view.truncatedNodeCount||r.view.truncatedEdgeCount?(i(),y(`p`,Se,` 为保持交互流畅,当前范围另有 `+e(r.view.truncatedNodeCount)+` 个节点与 `+e(r.view.truncatedEdgeCount)+` 条关系未显示。以上统计和关系列表仅覆盖可见部分。 `,1)):u(``,!0),r.unresolvedImportCount?(i(),y(`p`,Ce,` 完整报告有 `+e(r.unresolvedImportCount)+` 条导入未解析为图中产物,可能指向外部或未输出的产物,不计入当前视图的导入数量。 `,1)):u(``,!0),n[19]||=d(`<div class="mt-4"><h5 class="text-(--dashboard-text-muted)">图例</h5><ul class="mt-2 grid grid-cols-2 gap-x-3 gap-y-2 text-(--dashboard-text-soft)" aria-label="依赖图图例"><li class="flex items-center gap-2"><svg aria-hidden="true" class="h-4 w-12 shrink-0 text-[#2563eb] dark:text-[#60a5fa]" viewBox="0 0 48 16"><path d="M2 8H40" fill="none" stroke="currentColor" stroke-width="1.5"></path><path d="m36 4 8 4-8 4Z" fill="currentColor"></path></svg><span>静态导入</span></li><li class="flex items-center gap-2"><svg aria-hidden="true" class="h-4 w-12 shrink-0 text-[#f59e0b]" viewBox="0 0 48 16"><path d="M2 8H40" fill="none" stroke="currentColor" stroke-width="1.5" stroke-dasharray="5 4"></path><path d="m36 4 8 4-8 4Z" fill="currentColor"></path></svg><span>动态导入</span></li><li class="flex items-center gap-2"><svg aria-hidden="true" class="h-4 w-12 shrink-0 text-(--dashboard-border-strong)" viewBox="0 0 48 16"><path d="M2 8H44" fill="none" stroke="currentColor"></path></svg><span>包内归属</span></li><li class="flex items-center gap-2"><svg aria-hidden="true" class="h-4 w-12 shrink-0" viewBox="0 0 48 16"><circle cx="8" cy="8" r="4" class="fill-[#0f766e] dark:fill-[#5eead4]"></circle><circle cx="24" cy="8" r="4" class="fill-[#7c3aed] dark:fill-[#a78bfa]"></circle><circle cx="40" cy="8" r="4" class="fill-[#2563eb] dark:fill-[#60a5fa]"></circle></svg><span>节点所属包</span></li></ul></div>`,1)])])}var Te=S(F,[[`render`,we]]),Z=220,Q=900,$=80,Ee=b({__name:`ChunkGraphPanel`,props:{result:{},theme:{}},setup(e,{expose:n}){n();let i=e,a=v(),o=v(),s=r(`all`),l=r(``),u=r(null),d=v(null),f=v(null),p=v(null),g,y,b,x,S=_(()=>A(i.result)),P=_(()=>S.value.nodes.filter(e=>e.kind===`package`)),F=_(()=>[{label:`全部 package`,value:`all`},...P.value.map(e=>({label:e.packageLabel,value:e.packageId}))]),I=_(()=>j(S.value,{maxEdges:l.value.trim()?320:Q,maxNodes:l.value.trim()?$:Z,packageId:s.value,query:l.value})),L=_(()=>M(I.value,d.value??u.value,d.value?null:f.value??p.value)),R=_(()=>{let e=i.theme===`dark`?[`#5eead4`,`#a78bfa`,`#60a5fa`,`#fbbf24`,`#fb7185`,`#34d399`,`#f472b6`,`#c4b5fd`]:[`#0f766e`,`#7c3aed`,`#2563eb`,`#b45309`,`#be123c`,`#047857`,`#be185d`,`#6d28d9`];return new Map(P.value.map((t,n)=>[t.packageId,e[n%e.length]??`#64748b`]))});function z(e){return e.length>20?`${e.slice(0,19)}…`:e}function B(e,t){return typeof e==`string`?t.get(e):e}function V(e){u.value=e.id}function H(){d.value=null,f.value=null,p.value=null}function U(e,t,n){n===`start`?(e.active||b?.alphaTarget(.18).restart(),t.fx=t.x,t.fy=t.y):n===`update`?(t.fx=e.x,t.fy=e.y):(e.active||b?.alphaTarget(0),t.fx=null,t.fy=null)}function W(e){a.value&&x&&k(a.value).call(x.scaleBy,e)}function G(e,t){a.value&&x&&k(a.value).call(x.translateBy,e,t)}function K(){u.value=null,H(),a.value&&x&&k(a.value).call(x.transform,E)}async function q(){await h();let e=a.value,t=o.value;if(!e||!t||t.clientWidth===0||t.clientHeight===0)return;b?.stop(),g=void 0,d.value=null;let n=k(e);n.selectAll(`*`).remove();let r=t.clientWidth,s=t.clientHeight;n.attr(`viewBox`,`0 0 ${r} ${s}`);let c=n.append(`defs`);for(let e of[{id:`chunk-graph-arrow-static`,color:i.theme===`dark`?`#60a5fa`:`#2563eb`},{id:`chunk-graph-arrow-dynamic`,color:`#f59e0b`}])c.append(`marker`).attr(`id`,e.id).attr(`viewBox`,`0 -5 10 10`).attr(`refX`,10).attr(`refY`,0).attr(`markerUnits`,`userSpaceOnUse`).attr(`markerWidth`,7).attr(`markerHeight`,7).attr(`orient`,`auto`).append(`path`).attr(`d`,`M0,-5L10,0L0,5`).attr(`fill`,e.color);let l=n.append(`g`);x=ie().scaleExtent([.2,5]).on(`zoom`,e=>l.attr(`transform`,e.transform.toString())),n.call(x),l.attr(`transform`,O(e).toString());let f=I.value.nodes.map(e=>{let t=e.kind===`package`?18:Math.max(5,Math.min(14,5+Math.log2(Math.max(e.size,1))*.65)),n=R.value.get(e.packageId)??`#64748b`;return{id:e.id,graphNode:e,color:n,mutedColor:`color-mix(in srgb, ${n} 18%, var(--dashboard-panel))`,radius:t,strokeWidth:e.kind===`package`?3:e.isEntry?2.5:1.5}}),p=new Map(f.map(e=>[e.id,e])),m=I.value.edges.map(e=>({graphEdge:e,source:e.source,target:e.target,x1:0,y1:0,x2:0,y2:0,visible:!1})),_=l.append(`g`).attr(`fill`,`none`).attr(`pointer-events`,`none`).selectAll(`line`).data(m).join(`line`).attr(`visibility`,`hidden`).attr(`stroke`,e=>e.graphEdge.kind===`dynamic-import`?`#f59e0b`:e.graphEdge.kind===`static-import`?i.theme===`dark`?`#60a5fa`:`#2563eb`:i.theme===`dark`?`#292f3a`:`#d9dee7`).attr(`stroke-dasharray`,e=>e.graphEdge.kind===`dynamic-import`?`5 4`:null),v=l.append(`g`).selectAll(`g`).data(f,e=>e.id).join(`g`).attr(`cursor`,`pointer`).on(`click`,(e,t)=>V(t)).on(`mouseenter`,(e,t)=>{d.value=t.id}).on(`mouseleave`,(e,t)=>{d.value===t.id&&(d.value=null)}).call(ne().on(`start`,(e,t)=>U(e,t,`start`)).on(`drag`,(e,t)=>U(e,t,`update`)).on(`end`,(e,t)=>U(e,t,`end`)));v.append(`circle`).attr(`r`,e=>e.radius).attr(`stroke-width`,e=>e.strokeWidth),v.append(`title`).text(e=>`${e.graphNode.label}\n${e.graphNode.packageLabel}\n${w(e.graphNode.size)}`),v.filter(e=>e.graphNode.kind===`package`).append(`text`).attr(`x`,0).attr(`y`,e=>e.radius+15).attr(`text-anchor`,`middle`).attr(`font-size`,11).attr(`font-weight`,600).attr(`fill`,i.theme===`dark`?`#d7dce5`:`#334155`).text(e=>z(e.graphNode.label)),g=()=>{let e=L.value;_.attr(`stroke-opacity`,t=>e.previewEdgeId===t.graphEdge.id?1:e.edgeIds&&!e.edgeIds.has(t.graphEdge.id)?.06:t.graphEdge.kind===`contains`?.26:.68).attr(`stroke-width`,t=>e.previewEdgeId===t.graphEdge.id?2.5:t.graphEdge.kind===`contains`?1:1.4).attr(`marker-end`,t=>e.previewEdgeId!==t.graphEdge.id||t.graphEdge.kind===`contains`?null:t.graphEdge.kind===`dynamic-import`?`url(#chunk-graph-arrow-dynamic)`:`url(#chunk-graph-arrow-static)`),v.select(`circle`).attr(`fill`,t=>e.nodeIds&&!e.nodeIds.has(t.id)?t.mutedColor:t.color).attr(`stroke`,t=>t.id===u.value?`var(--dashboard-text)`:t.graphNode.kind===`package`?e.nodeIds&&!e.nodeIds.has(t.id)?t.mutedColor:t.color:i.theme===`dark`?`#11141a`:`#ffffff`),v.select(`text`).attr(`opacity`,t=>e.nodeIds&&!e.nodeIds.has(t.id)?.35:1)},g(),b=T(f).force(`link`,D(m).id(e=>e.id).distance(e=>e.graphEdge.kind===`contains`?68:e.graphEdge.kind===`dynamic-import`?120:92).strength(e=>e.graphEdge.kind===`contains`?.2:.5)).force(`charge`,te().strength(f.length>180?-78:-120)).force(`collision`,re().radius(e=>e.graphNode.kind===`package`?52:e.radius+6).strength(.95)).force(`center`,ee(r/2,s/2)).alphaDecay(.035).on(`tick`,()=>{for(let e of f){let t=e.graphNode.kind===`package`?58:e.radius+4;e.x=Math.max(t,Math.min(r-t,e.x??r/2)),e.y=Math.max(t,Math.min(s-t,e.y??s/2))}_.each(e=>{let t=B(e.source,p),n=B(e.target,p);e.visible=!1,t&&n&&N(e,t,n,e.graphEdge.kind!==`contains`)}).attr(`visibility`,e=>e.visible?null:`hidden`).attr(`x1`,e=>e.x1).attr(`y1`,e=>e.y1).attr(`x2`,e=>e.x2).attr(`y2`,e=>e.y2),v.attr(`transform`,e=>`translate(${e.x??0},${e.y??0})`)})}m(()=>{o.value&&(y=new ResizeObserver(()=>void q()),y.observe(o.value))}),t(()=>{y?.disconnect(),b?.stop(),b=void 0,g=void 0}),c(P,e=>{s.value!==`all`&&!e.some(e=>e.packageId===s.value)&&(s.value=`all`)}),c([u,I],H),c(L,()=>g?.()),c([I,R],([e])=>{u.value&&!e.nodes.some(e=>e.id===u.value)&&(u.value=null),q()},{deep:!0}),c(()=>i.theme,()=>void q());let J={props:i,MAX_VISIBLE_NODES:Z,MAX_VISIBLE_EDGES:Q,MAX_SEARCH_NODES:$,svgRef:a,canvasRef:o,packageFilter:s,searchQuery:l,selectedNodeId:u,hoveredNodeId:d,hoveredEdgeId:f,focusedEdgeId:p,get applyGraphFocus(){return g},set applyGraphFocus(e){g=e},get resizeObserver(){return y},set resizeObserver(e){y=e},get simulation(){return b},set simulation(e){b=e},get zoomBehavior(){return x},set zoomBehavior(e){x=e},graph:S,packageOptions:P,packageFilterOptions:F,visibleGraph:I,graphFocus:L,packageColorById:R,formatPackageLabel:z,resolveLinkNode:B,selectNode:V,clearGraphPreview:H,bindNodeDrag:U,zoomGraph:W,panGraph:G,resetGraphView:K,renderGraph:q,AppSelect:C,ChunkGraphInspector:Te};return Object.defineProperty(J,"__isScriptSetup",{enumerable:!1,value:!0}),J}}),De={class:`grid min-h-0 min-w-0 overflow-hidden rounded-md border border-(--dashboard-border) bg-(--dashboard-panel) xl:h-[calc(100dvh-10rem)] xl:min-h-[36rem] xl:grid-cols-[minmax(0,1fr)_22rem]`},Oe={class:`grid min-h-0 min-w-0 grid-rows-[auto_minmax(30rem,1fr)_auto]`},ke={class:`grid min-w-0 grid-cols-1 gap-2 border-b border-(--dashboard-border) px-3 py-2 sm:grid-cols-[minmax(0,1fr)_minmax(10rem,14rem)_auto]`},Ae={class:`relative min-w-0`},je={class:`flex items-center gap-1`,role:`group`,"aria-label":`依赖图视图控制`},Me={ref:`canvasRef`,class:`relative min-h-0 min-w-0`},Ne={ref:`svgRef`,class:`absolute inset-0 block size-full touch-none overflow-hidden`,"aria-hidden":`true`,focusable:`false`},Pe={class:`flex min-w-0 flex-wrap items-center justify-between gap-2 border-t border-(--dashboard-border) px-3 py-2`},Fe={class:`flex gap-1`,role:`group`,"aria-label":`依赖图平移控制`};function Ie(e,t,n,r,a,c){return i(),y(`section`,De,[p(`div`,Oe,[p(`header`,ke,[p(`label`,Ae,[t[11]||=p(`span`,{class:`sr-only`},`搜索 chunk`,-1),s(p(`input`,{"onUpdate:modelValue":t[0]||=e=>r.searchQuery=e,class:`h-8 w-full min-w-0 rounded border border-(--dashboard-border) bg-(--dashboard-panel-muted) px-2.5 text-xs outline-none focus:border-(--dashboard-accent)`,placeholder:`搜索 chunk 文件`,type:`search`},null,512),[[g,r.searchQuery]])]),o(r.AppSelect,{modelValue:r.packageFilter,"onUpdate:modelValue":t[1]||=e=>r.packageFilter=e,class:`min-w-0`,label:`筛选依赖图 package`,options:r.packageFilterOptions,size:`sm`},null,8,[`modelValue`,`options`]),p(`div`,je,[p(`button`,{class:`h-8 w-8 rounded border border-(--dashboard-border) text-sm hover:bg-(--dashboard-panel-muted) focus-visible:ring-2 focus-visible:ring-(--dashboard-accent)`,type:`button`,"aria-label":`缩小依赖图`,title:`缩小(-)`,onClick:t[2]||=e=>r.zoomGraph(.8)},` − `),p(`button`,{class:`h-8 w-8 rounded border border-(--dashboard-border) text-sm hover:bg-(--dashboard-panel-muted) focus-visible:ring-2 focus-visible:ring-(--dashboard-accent)`,type:`button`,"aria-label":`放大依赖图`,title:`放大(+)`,onClick:t[3]||=e=>r.zoomGraph(1.25)},` + `),p(`button`,{class:`h-8 whitespace-nowrap rounded border border-(--dashboard-border) px-2 text-xs hover:bg-(--dashboard-panel-muted) focus-visible:ring-2 focus-visible:ring-(--dashboard-accent)`,type:`button`,"aria-label":`适配依赖图视图`,title:`适配视图(0)`,onClick:r.resetGraphView},` 适配 `)])]),p(`div`,Me,[(i(),y(`svg`,Ne,null,512))],512),p(`footer`,Pe,[t[12]||=p(`p`,{class:`text-xs text-(--dashboard-text-soft)`},` 悬停节点预览,点击保持聚焦;在右侧关系中查看单条连线方向。 `,-1),p(`div`,Fe,[p(`button`,{class:`size-8 rounded border border-(--dashboard-border) text-sm hover:bg-(--dashboard-panel-muted) focus-visible:outline-2 focus-visible:outline-(--dashboard-accent) pointer-coarse:size-11`,type:`button`,"aria-label":`向上平移依赖图`,onClick:t[4]||=e=>r.panGraph(0,-40)},`↑`),p(`button`,{class:`size-8 rounded border border-(--dashboard-border) text-sm hover:bg-(--dashboard-panel-muted) focus-visible:outline-2 focus-visible:outline-(--dashboard-accent) pointer-coarse:size-11`,type:`button`,"aria-label":`向左平移依赖图`,onClick:t[5]||=e=>r.panGraph(-40,0)},`←`),p(`button`,{class:`size-8 rounded border border-(--dashboard-border) text-sm hover:bg-(--dashboard-panel-muted) focus-visible:outline-2 focus-visible:outline-(--dashboard-accent) pointer-coarse:size-11`,type:`button`,"aria-label":`向下平移依赖图`,onClick:t[6]||=e=>r.panGraph(0,40)},`↓`),p(`button`,{class:`size-8 rounded border border-(--dashboard-border) text-sm hover:bg-(--dashboard-panel-muted) focus-visible:outline-2 focus-visible:outline-(--dashboard-accent) pointer-coarse:size-11`,type:`button`,"aria-label":`向右平移依赖图`,onClick:t[7]||=e=>r.panGraph(40,0)},`→`)])])]),o(r.ChunkGraphInspector,{view:r.visibleGraph,"selected-id":r.selectedNodeId,"unresolved-import-count":r.graph.unresolvedImportCount,"preview-edge-id":r.graphFocus.previewEdgeId,onHoverRelation:t[8]||=e=>r.hoveredEdgeId=e,onFocusRelation:t[9]||=e=>r.focusedEdgeId=e,onSelectNode:t[10]||=e=>r.selectedNodeId=e},null,8,[`view`,`selected-id`,`unresolved-import-count`,`preview-edge-id`])])}var Le=S(Ee,[[`render`,Ie]]);export{Le as default};
@@ -1,5 +1,5 @@
1
- import{B as e,C as t,D as n,E as r,J as i,L as a,N as o,P as s,U as c,X as l,_ as u,b as d,g as f,h as p,j as m,k as h,p as g,q as _,v,w as y,x as b,y as x,z as ee}from"./vue.js";import{E as S,T as te,_ as C,c as w,g as T,l as ne,o as re,p as E,s as ie,t as ae,v as D,x as O}from"./index.js";import{a as k,c as A,i as j,n as M,t as N}from"./AppEmptyState.js";import{t as P}from"./AppRuntimeBadge.js";import{n as F,t as I}from"./AppMetricTile.js";var L=t({__name:`ActivityEventSortBar`,props:r({events:{},filteredCount:{},totalCount:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:[`update:modelValue`],setup(e,{expose:t}){t();let n=e,r=a(e,`modelValue`),i=[{label:`按时间`,value:`time`},{label:`按耗时`,value:`duration`},{label:`按等级`,value:`severity`},{label:`按来源`,value:`source`}],o=c(``),s=null;function l(e){return e.replaceAll(`|`,`\\|`).replaceAll(`
2
- `,` `)}let u=p(()=>[`# dashboard 事件流`,``,`事件数量:${n.events.length}`,``,`| 时间 | 等级 | 类型 | 来源 | 标题 | 耗时 | 标签 |`,`| --- | --- | --- | --- | --- | ---: | --- |`,...n.events.map(e=>[e.timestamp,C(e.level),T(e.kind),e.source??`dashboard`,e.title,E(e.durationMs),e.tags?.join(`, `)||`-`].map(l).join(` | `)).map(e=>`| ${e} |`),``].join(`
3
- `));function d(e){o.value=e,s&&clearTimeout(s),s=setTimeout(()=>{o.value=``,s=null},1800)}async function f(){try{await A(u.value),d(`已复制`)}catch{d(`复制失败`)}}function m(){let e=new Blob([`${JSON.stringify(n.events,null,2)}\n`],{type:`application/json`}),t=URL.createObjectURL(e),r=document.createElement(`a`);r.href=t,r.download=`weapp-vite-dashboard-events.json`,r.click(),URL.revokeObjectURL(t),d(`已导出`)}h(()=>{s&&clearTimeout(s)});let g={props:n,sortMode:r,sortOptions:i,actionStatus:o,get actionStatusTimer(){return s},set actionStatusTimer(e){s=e},escapeMarkdownCell:l,reportText:u,setActionStatus:d,copyEventReport:f,exportEventJson:m,AppSelect:O};return Object.defineProperty(g,"__isScriptSetup",{enumerable:!1,value:!0}),g}}),R={class:`flex flex-wrap items-center justify-between gap-2 rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) px-3 py-2`},z={class:`text-xs text-(--dashboard-text-soft)`},B={class:`flex flex-wrap items-center gap-2`},V={key:0,class:`text-xs font-medium text-(--dashboard-accent)`},H=[`disabled`],U=[`disabled`];function W(e,t,n,r,i,a){return m(),x(`div`,R,[f(`p`,z,` 匹配 `+l(n.filteredCount)+` / `+l(n.totalCount)+` 条事件 `,1),f(`div`,B,[r.actionStatus?(m(),x(`span`,V,l(r.actionStatus),1)):v(``,!0),f(`button`,{type:`button`,class:`h-9 rounded-md border border-(--dashboard-border) bg-(--dashboard-panel) px-3 text-sm text-(--dashboard-text-soft) transition hover:border-(--dashboard-border-strong) hover:text-(--dashboard-accent) focus:border-(--dashboard-border-strong) focus:outline-none disabled:opacity-50`,disabled:n.events.length===0,onClick:r.copyEventReport},` 复制事件 `,8,H),f(`button`,{type:`button`,class:`h-9 rounded-md border border-(--dashboard-border) bg-(--dashboard-panel) px-3 text-sm text-(--dashboard-text-soft) transition hover:border-(--dashboard-border-strong) hover:text-(--dashboard-accent) focus:border-(--dashboard-border-strong) focus:outline-none disabled:opacity-50`,disabled:n.events.length===0,onClick:r.exportEventJson},` 导出 JSON `,8,U),b(r.AppSelect,{modelValue:r.sortMode,"onUpdate:modelValue":t[0]||=e=>r.sortMode=e,class:`w-28`,label:`排序运行事件`,options:r.sortOptions},null,8,[`modelValue`])])])}var G=S(L,[[`render`,W]]),K=t({__name:`AppRuntimeFocusCard`,props:{event:{},eyebrow:{},emptyTitle:{},emptyDetail:{},durationText:{}},setup(e,{expose:t}){t();let n=e,r={props:n,badge:p(()=>n.event?w(n.event):null),titleText:p(()=>n.event?.title??n.emptyTitle??`尚无运行事件`),detailText:p(()=>n.event?.detail??n.emptyDetail??`当前工作区还没有推入结构化运行事件。`),eventMeta:p(()=>n.event?D(n.event):null),get mutedPanelStyles(){return j},AppRuntimeBadge:P};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),q={class:`flex items-start justify-between gap-3`},J={key:0,class:`text-[11px] uppercase tracking-[0.18em] text-(--dashboard-accent)`},oe={class:`mt-1 text-lg font-semibold tracking-tight`},se={class:`mt-3 text-sm leading-6 text-(--dashboard-text-muted)`},ce={key:0,class:`mt-3 text-[11px] uppercase tracking-[0.18em] text-(--dashboard-text-soft)`},le={key:1,class:`mt-2 text-sm font-medium text-(--dashboard-text)`};function ue(e,t,r,a,o,c){return m(),x(`div`,{class:_(a.mutedPanelStyles())},[f(`div`,q,[f(`div`,null,[a.props.eyebrow?(m(),x(`p`,J,l(a.props.eyebrow),1)):v(``,!0),f(`h3`,oe,l(a.titleText),1)]),a.badge?(m(),u(a.AppRuntimeBadge,i(n({key:0},a.badge)),null,16)):v(``,!0)]),f(`p`,se,l(a.detailText),1),a.props.event?(m(),x(`p`,ce,l(a.eventMeta),1)):v(``,!0),a.props.durationText?(m(),x(`p`,le,l(a.props.durationText),1)):v(``,!0),s(e.$slots,`default`)],2)}var de=S(K,[[`render`,ue]]),fe=t({__name:`ActivitySelectedEventPanel`,props:{event:{}},setup(e,{expose:t}){t();let n=e,r={props:n,durationText:p(()=>n.event?.durationMs===void 0?void 0:`耗时 ${E(n.event.durationMs)}`),profileMetrics:p(()=>{let e=n.event?.profile;return e?[{label:`总耗时`,value:E(e.totalMs)},{label:`构建核心`,value:E(e.buildCoreMs)},{label:`转换`,value:E(e.transformMs)},{label:`写入`,value:E(e.writeMs)},{label:`监听到脏标记`,value:E(e.watchToDirtyMs)},{label:`产物发射`,value:E(e.emitMs)},{label:`共享 chunk`,value:E(e.sharedChunkResolveMs)}].filter(e=>e.value!==`未记录`):[]}),profileCounts:p(()=>{let e=n.event?.profile;return e?[{label:`脏入口`,value:e.dirtyCount},{label:`待处理`,value:e.pendingCount},{label:`已发射`,value:e.emittedCount}].filter(e=>typeof e.value==`number`):[]}),profileFile:p(()=>n.event?.profile?.sourceRootFile??n.event?.profile?.relativeFile??n.event?.profile?.file),AppRuntimeBadge:P,AppRuntimeFocusCard:de,AppSurfaceCard:M};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),pe={key:0,class:`mt-3 flex flex-wrap gap-1.5`},me={key:1,class:`mt-4 grid gap-3 rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) p-3`},he={class:`flex min-w-0 items-start justify-between gap-3`},ge={class:`min-w-0`},_e={key:0,class:`mt-1 truncate font-mono text-xs text-(--dashboard-text-soft)`},ve={key:0,class:`grid gap-2 sm:grid-cols-2`},ye={class:`text-[11px] text-(--dashboard-text-soft)`},be={class:`mt-1 text-sm font-semibold text-(--dashboard-text)`},xe={key:1,class:`flex flex-wrap gap-1.5`},Se={key:2,class:`grid gap-2 text-xs leading-5 text-(--dashboard-text-muted)`},Ce={key:0},we={key:1};function Te(t,n,r,i,a,s){return m(),u(i.AppSurfaceCard,{eyebrow:`Selected`,title:`当前事件`,"icon-name":`metric-search`},{default:e(()=>[b(i.AppRuntimeFocusCard,{event:r.event,eyebrow:`focus`,"empty-title":`未选择事件`,"empty-detail":`选择左侧事件后查看详情。`,"duration-text":i.durationText},{default:e(()=>[r.event?.tags?.length?(m(),x(`div`,pe,[(m(!0),x(g,null,o(r.event.tags,e=>(m(),u(i.AppRuntimeBadge,{key:e,label:e,tone:`neutral`},null,8,[`label`]))),128))])):v(``,!0),r.event?.profile?(m(),x(`div`,me,[f(`div`,he,[f(`div`,ge,[n[0]||=f(`p`,{class:`text-sm font-semibold text-(--dashboard-text)`},` HMR 阶段明细 `,-1),i.profileFile?(m(),x(`p`,_e,l(i.profileFile),1)):v(``,!0)]),r.event.profile.event?(m(),u(i.AppRuntimeBadge,{key:0,label:r.event.profile.event,tone:`info`},null,8,[`label`])):v(``,!0)]),i.profileMetrics.length>0?(m(),x(`dl`,ve,[(m(!0),x(g,null,o(i.profileMetrics,e=>(m(),x(`div`,{key:e.label,class:`rounded-md border border-(--dashboard-border) bg-(--dashboard-panel) px-3 py-2`},[f(`dt`,ye,l(e.label),1),f(`dd`,be,l(e.value),1)]))),128))])):v(``,!0),i.profileCounts.length>0?(m(),x(`div`,xe,[(m(!0),x(g,null,o(i.profileCounts,e=>(m(),u(i.AppRuntimeBadge,{key:e.label,label:`${e.label} ${e.value}`,tone:`neutral`},null,8,[`label`]))),128))])):v(``,!0),r.event.profile.dirtyReasonSummary?.length||r.event.profile.pendingReasonSummary?.length?(m(),x(`div`,Se,[r.event.profile.dirtyReasonSummary?.length?(m(),x(`p`,Ce,` 脏标记:`+l(r.event.profile.dirtyReasonSummary.join(`、`)),1)):v(``,!0),r.event.profile.pendingReasonSummary?.length?(m(),x(`p`,we,` 待处理:`+l(r.event.profile.pendingReasonSummary.join(`、`)),1)):v(``,!0)])):v(``,!0)])):v(``,!0)]),_:1},8,[`event`,`duration-text`])]),_:1})}var Ee=S(fe,[[`render`,Te]]),De=t({__name:`AppRuntimeSourceCard`,props:{source:{},count:{},errorCount:{},averageDuration:{},latestTimestamp:{},countLabel:{}},setup(e,{expose:t}){t();let n=e,r={props:n,badge:p(()=>ne(n)),subtitle:p(()=>n.latestTimestamp?`最近事件 ${n.latestTimestamp}`:`${n.count} ${n.countLabel??`条事件`}`),detailItems:p(()=>[{key:`error-count`,label:`错误 ${n.errorCount}`},{key:`average-duration`,label:`平均耗时 ${n.averageDuration}`}]),summaryText:p(()=>`平均耗时 ${n.averageDuration}`),get mutedPanelStyles(){return j},AppRuntimeBadge:P};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),Oe={class:`flex items-start justify-between gap-3`},ke={class:`min-w-0`},Ae={class:`truncate font-medium text-(--dashboard-text)`},je={class:`mt-1 text-[11px] uppercase tracking-[0.16em] text-(--dashboard-text-soft)`},Me={key:0,class:`mt-3 flex flex-wrap gap-2 text-[11px] uppercase tracking-[0.14em] text-(--dashboard-text-soft)`},Ne={key:1,class:`mt-3 text-sm text-(--dashboard-text-muted)`};function Pe(e,t,n,r,a,s){return m(),x(`div`,{class:_(r.mutedPanelStyles({padding:`sm`}))},[f(`div`,Oe,[f(`div`,ke,[f(`p`,Ae,l(r.props.source),1),f(`p`,je,l(r.subtitle),1)]),b(r.AppRuntimeBadge,i(y(r.badge)),null,16)]),r.props.latestTimestamp?(m(),x(`div`,Me,[(m(!0),x(g,null,o(r.detailItems,e=>(m(),x(`span`,{key:e.key,class:`rounded-full border border-(--dashboard-border) px-2 py-0.5`},l(e.label),1))),128))])):(m(),x(`p`,Ne,l(r.summaryText),1))],2)}var Fe=S(De,[[`render`,Pe]]),Ie=t({__name:`AppStatCard`,props:{label:{},value:{}},setup(e,{expose:t}){t();let n={panelClassName:j({padding:`sm`}),AppMetaLabel:F};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),Le={class:`mt-1 text-lg font-semibold`};function Re(t,n,r,i,a,o){return m(),x(`div`,{class:_(i.panelClassName)},[b(i.AppMetaLabel,null,{default:e(()=>[d(l(r.label),1)]),_:1}),f(`p`,Le,l(r.value),1)],2)}var ze=S(Ie,[[`render`,Re]]),Be=t({__name:`RuntimeIncidentDigestPanel`,props:{digest:{}},setup(e,{expose:t}){t();let n=e,r=c(``),i=null,a=p(()=>n.digest.status===`critical`?`error`:n.digest.status===`warning`?`warning`:`success`);function o(e){return e===`error`?`text-rose-600 dark:text-rose-300`:e===`warning`?`text-amber-600 dark:text-amber-300`:`text-(--dashboard-accent)`}function s(e){return e===`critical`?`border-rose-400/60 bg-(--dashboard-panel-muted)`:e===`warning`?`border-amber-400/60 bg-(--dashboard-panel-muted)`:`border-emerald-400/60 bg-(--dashboard-panel-muted)`}function l(e){r.value=e,i&&clearTimeout(i),i=setTimeout(()=>{r.value=``,i=null},1800)}async function u(){try{await A(n.digest.report),l(`摘要已复制`)}catch{l(`复制失败`)}}h(()=>{i&&clearTimeout(i)});let d={props:n,copyStatus:r,get copyStatusTimer(){return i},set copyStatusTimer(e){i=e},badgeTone:a,getLevelClassName:o,getStatusAccentClassName:s,setCopyStatus:l,copyDigestReport:u,AppEmptyState:N,AppMetricTile:I,AppRuntimeBadge:P,AppSurfaceCard:M,DashboardIcon:te};return Object.defineProperty(d,"__isScriptSetup",{enumerable:!1,value:!0}),d}}),Ve={class:`flex shrink-0 items-center gap-2`},He={key:0,class:`text-xs font-medium text-(--dashboard-accent)`},Ue={class:`h-3.5 w-3.5`},We={class:`grid gap-3`},Ge={class:`flex items-start justify-between gap-3`},Ke={class:`min-w-0`},qe={class:`text-sm font-semibold text-(--dashboard-text)`},Je={class:`mt-1 text-xs leading-5 text-(--dashboard-text-muted)`},Ye={class:`grid grid-cols-2 gap-2 sm:grid-cols-5 xl:grid-cols-2 2xl:grid-cols-5`},Xe={key:0,class:`grid max-h-52 gap-2 overflow-y-auto pr-1`},Ze={class:`flex items-start justify-between gap-3`},Qe={class:`min-w-0`},$e={class:`truncate text-sm font-medium text-(--dashboard-text)`},et={class:`mt-1 truncate text-xs text-(--dashboard-text-soft)`},tt={class:`mt-2 line-clamp-2 text-xs leading-5 text-(--dashboard-text-muted)`};function nt(t,n,r,i,a,s){return m(),u(i.AppSurfaceCard,{eyebrow:`Incident`,title:`事故摘要`,"icon-name":`metric-quality`},{header:e(()=>[f(`div`,Ve,[i.copyStatus?(m(),x(`span`,He,l(i.copyStatus),1)):v(``,!0),f(`button`,{type:`button`,class:`inline-flex h-8 items-center gap-1.5 rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) px-3 text-xs text-(--dashboard-text-soft) transition hover:border-(--dashboard-border-strong) hover:text-(--dashboard-accent) focus:border-(--dashboard-border-strong) focus:outline-none`,onClick:i.copyDigestReport},[f(`span`,Ue,[b(i.DashboardIcon,{name:`metric-copy`})]),n[0]||=d(` 复制 `,-1)])])]),default:e(()=>[f(`div`,We,[f(`div`,{class:_([`rounded-md border px-3 py-2.5`,i.getStatusAccentClassName(r.digest.status)])},[f(`div`,Ge,[f(`div`,Ke,[f(`p`,qe,l(r.digest.statusLabel),1),f(`p`,Je,l(r.digest.statusDetail),1)]),b(i.AppRuntimeBadge,{label:r.digest.statusLabel,tone:i.badgeTone},null,8,[`label`,`tone`])])],2),f(`div`,Ye,[(m(!0),x(g,null,o(r.digest.metrics,e=>(m(),u(i.AppMetricTile,{key:e.label,label:e.label,value:e.value},null,8,[`label`,`value`]))),128))]),r.digest.incidents.length>0?(m(),x(`div`,Xe,[(m(!0),x(g,null,o(r.digest.incidents,e=>(m(),x(`article`,{key:e.id,class:`rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) px-3 py-2.5`},[f(`div`,Ze,[f(`div`,Qe,[f(`p`,$e,l(e.title),1),f(`p`,et,l(e.source)+` · `+l(e.kindLabel)+` · `+l(e.timestamp)+` · `+l(e.duration),1)]),f(`span`,{class:_([`shrink-0 text-xs font-semibold`,i.getLevelClassName(e.level)])},l(e.levelLabel),3)]),f(`p`,tt,l(e.reason)+` · `+l(e.detail),1)]))),128))])):(m(),u(i.AppEmptyState,{key:1,compact:``},{default:e(()=>[...n[1]||=[d(` 当前筛选范围内没有需要处理的运行时事件。 `,-1)]]),_:1}))])]),_:1})}var rt=S(Be,[[`render`,nt]]),it=t({__name:`ActivityInsightPanel`,props:{selectedEvent:{},incidentDigest:{},eventSummary:{},filteredEventSummary:{},diagnostics:{},sourceBreakdown:{}},setup(e,{expose:t}){t();let n={ActivitySelectedEventPanel:Ee,AppRuntimeBadge:P,AppRuntimeSourceCard:Fe,AppStatCard:ze,AppSurfaceCard:M,RuntimeIncidentDigestPanel:rt};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),at={class:`grid min-h-0 content-start gap-3 overflow-y-auto pr-1`},ot={class:`grid gap-2 sm:grid-cols-2`},st={class:`grid max-h-44 gap-2 overflow-y-auto pr-1`},ct={class:`flex items-start justify-between gap-3`},lt={class:`font-medium`},ut={class:`mt-1 text-sm leading-6 text-(--dashboard-text-muted)`},dt={key:0,class:`grid max-h-full gap-2 overflow-y-auto pr-1`};function ft(t,r,i,a,s,c){return m(),x(`div`,at,[b(a.ActivitySelectedEventPanel,{event:i.selectedEvent},null,8,[`event`]),b(a.RuntimeIncidentDigestPanel,{digest:i.incidentDigest},null,8,[`digest`]),b(a.AppSurfaceCard,{eyebrow:`Runtime`,title:`事件摘要`,"icon-name":`metric-time`},{default:e(()=>[f(`div`,ot,[(m(!0),x(g,null,o([...i.eventSummary,...i.filteredEventSummary],e=>(m(),u(a.AppStatCard,n({key:e.label},{ref_for:!0},e),null,16))),128))])]),_:1}),b(a.AppSurfaceCard,{eyebrow:`Diagnostics`,title:`当前诊断队列`,"icon-name":`metric-health`,"content-class":`min-h-0 overflow-hidden`},{default:e(()=>[f(`ul`,st,[(m(!0),x(g,null,o(i.diagnostics,e=>(m(),x(`li`,{key:e.label,class:`rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) px-4 py-3`},[f(`div`,ct,[f(`div`,null,[f(`p`,lt,l(e.label),1),f(`p`,ut,l(e.detail),1)]),b(a.AppRuntimeBadge,{label:e.status,tone:`info`},null,8,[`label`])])]))),128))])]),_:1}),b(a.AppSurfaceCard,{eyebrow:`Sources`,title:`事件来源`,"icon-name":`hero-system`,"content-class":`min-h-0 overflow-hidden`},{default:e(()=>[i.sourceBreakdown.length>0?(m(),x(`div`,dt,[(m(!0),x(g,null,o(i.sourceBreakdown,e=>(m(),u(a.AppRuntimeSourceCard,n({key:e.source},{ref_for:!0},e),null,16))),128))])):v(``,!0)]),_:1})])}var pt=S(it,[[`render`,ft]]),mt=t({__name:`AppInsetPanel`,props:{eyebrow:{}},setup(e,{expose:t}){t();let n={get mutedPanelStyles(){return j}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),ht={key:0,class:`text-[11px] uppercase tracking-[0.18em] text-(--dashboard-text-soft)`};function gt(e,t,n,r,i,a){return m(),x(`div`,{class:_(r.mutedPanelStyles())},[n.eyebrow?(m(),x(`p`,ht,l(n.eyebrow),1)):v(``,!0),f(`div`,{class:_(n.eyebrow?`mt-3`:void 0)},[s(e.$slots,`default`)],2)],2)}var _t=S(mt,[[`render`,gt]]),vt=t({__name:`AppEventFilterPanel`,props:{searchQuery:{},presetDescription:{},filterPresets:{},eventKindOptions:{},eventLevelOptions:{},eventSourceOptions:{},eventKindFilter:{},eventLevelFilter:{},eventSourceFilter:{}},emits:[`update:searchQuery`,`update:eventKindFilter`,`update:eventLevelFilter`,`update:eventSourceFilter`,`applyPreset`],setup(e,{expose:t,emit:n}){t();let r=e,i=n;function a(){return k({kind:`theme`,active:!1})}function o(e,t){return k({kind:`theme`,active:e===t})}let s={props:r,emit:i,getPresetClassName:a,getOptionClassName:o,AppInsetPanel:_t,AppMetaLabel:F};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}}),yt={class:`grid gap-3 xl:grid-cols-[minmax(14rem,0.85fr)_minmax(0,1.15fr)]`},bt={for:`dashboard-event-search`},xt=[`value`],St={class:`grid gap-3`},Ct={class:`mt-2 flex flex-wrap gap-2`},wt=[`onClick`],Tt={key:0,class:`mt-2 text-xs leading-5 text-(--dashboard-text-soft)`},Et={class:`grid gap-3 md:grid-cols-3`},Dt={class:`mt-2 flex flex-wrap gap-2`},Ot=[`onClick`],kt={class:`mt-2 flex flex-wrap gap-2`},At=[`onClick`],jt={class:`mt-2 flex flex-wrap gap-2`},Mt=[`onClick`];function Nt(t,n,r,i,a,s){return m(),u(i.AppInsetPanel,null,{default:e(()=>[f(`div`,yt,[f(`div`,null,[f(`label`,bt,[b(i.AppMetaLabel,null,{default:e(()=>[...n[1]||=[d(` 搜索事件 `,-1)]]),_:1})]),f(`input`,{id:`dashboard-event-search`,value:r.searchQuery,type:`text`,placeholder:`搜索标题、详情、来源或标签`,class:`mt-2 w-full rounded-md border border-(--dashboard-border) bg-(--dashboard-panel) px-3 py-2 text-sm text-(--dashboard-text) outline-none transition focus:border-(--dashboard-border-strong)`,onInput:n[0]||=e=>i.emit(`update:searchQuery`,e.target.value)},null,40,xt)]),f(`div`,St,[f(`div`,null,[b(i.AppMetaLabel,null,{default:e(()=>[...n[2]||=[d(` 快速预设 `,-1)]]),_:1}),f(`div`,Ct,[(m(!0),x(g,null,o(r.filterPresets,e=>(m(),x(`button`,{key:e.key,class:_(i.getPresetClassName()),onClick:t=>i.emit(`applyPreset`,e.key)},l(e.label),11,wt))),128))]),r.presetDescription?(m(),x(`p`,Tt,l(r.presetDescription),1)):v(``,!0)]),f(`div`,Et,[f(`div`,null,[b(i.AppMetaLabel,null,{default:e(()=>[...n[3]||=[d(` 类型过滤 `,-1)]]),_:1}),f(`div`,Dt,[(m(!0),x(g,null,o(r.eventKindOptions,e=>(m(),x(`button`,{key:e.value,class:_(i.getOptionClassName(i.props.eventKindFilter,e.value)),onClick:t=>i.emit(`update:eventKindFilter`,e.value)},l(e.label),11,Ot))),128))])]),f(`div`,null,[b(i.AppMetaLabel,null,{default:e(()=>[...n[4]||=[d(` 等级过滤 `,-1)]]),_:1}),f(`div`,kt,[(m(!0),x(g,null,o(r.eventLevelOptions,e=>(m(),x(`button`,{key:e.value,class:_(i.getOptionClassName(i.props.eventLevelFilter,e.value)),onClick:t=>i.emit(`update:eventLevelFilter`,e.value)},l(e.label),11,At))),128))])]),f(`div`,null,[b(i.AppMetaLabel,null,{default:e(()=>[...n[5]||=[d(` 来源过滤 `,-1)]]),_:1}),f(`div`,jt,[(m(!0),x(g,null,o(r.eventSourceOptions,e=>(m(),x(`button`,{key:e.value,class:_(i.getOptionClassName(i.props.eventSourceFilter,e.value)),onClick:t=>i.emit(`update:eventSourceFilter`,e.value)},l(e.label),11,Mt))),128))])])])])])]),_:1})}var Pt=S(vt,[[`render`,Nt]]),Ft=t({__name:`AppRuntimeEventListItem`,props:{event:{},selected:{type:Boolean}},setup(e,{expose:t}){t();let n=e,r={props:n,badge:p(()=>w(n.event)),eventMeta:p(()=>D(n.event)),panelClassName:p(()=>n.selected?`border-(--dashboard-border-strong) bg-(--dashboard-panel)`:`border-(--dashboard-border)`),AppMetaLabel:F,AppRuntimeBadge:P};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),It={class:`flex min-w-0 items-start justify-between gap-3`},Lt={class:`min-w-0`},Rt=[`title`];function zt(t,r,i,a,o,s){return m(),x(`li`,{class:_([`rounded-md border bg-(--dashboard-panel-muted) px-4 py-3 transition`,a.panelClassName])},[f(`div`,It,[f(`div`,Lt,[f(`p`,{class:`truncate font-medium text-(--dashboard-text)`,title:a.props.event.title},l(a.props.event.title),9,Rt),b(a.AppMetaLabel,{class:`mt-1`},{default:e(()=>[d(l(a.eventMeta),1)]),_:1})]),b(a.AppRuntimeBadge,n({class:`shrink-0`},a.badge),null,16)])],2)}var Bt=S(Ft,[[`render`,zt]]),Vt=1e3,Ht=5,Y={error:4,warning:3,success:2,info:1};function X(e){let t=Date.parse(e.timestamp);return Number.isFinite(t)?t:0}function Z(e,t){return typeof e.durationMs==`number`&&e.durationMs>=t}function Ut(e,t){return e.level===`error`||e.level===`warning`||Z(e,t)}function Wt(e,t){let n=[];return e.level===`error`?n.push(`错误事件`):e.level===`warning`&&n.push(`警告事件`),Z(e,t)&&n.push(`耗时 ${E(e.durationMs)}`),n.join(` · `)||`需要关注`}function Gt(e,t){return{id:e.id,title:e.title,detail:e.detail,level:e.level,levelLabel:C(e.level),kindLabel:T(e.kind),source:e.source??`dashboard`,timestamp:e.timestamp,duration:E(e.durationMs),reason:Wt(e,t)}}function Kt(e,t,n){return e>0?`critical`:t>0||n>0?`warning`:`healthy`}function qt(e){return e===`critical`?`需要立即处理`:e===`warning`?`需要关注`:`运行平稳`}function Jt(e,t,n,r){return e===`critical`?`检测到 ${t} 个错误事件,优先排查失败来源。`:e===`warning`?`检测到 ${n} 个警告和 ${r} 个慢事件,建议跟进。`:`当前筛选范围内没有错误、警告或慢事件。`}function Yt(e){let t=e.incidents.length>0?e.incidents.map(e=>`- [${e.levelLabel}] ${e.title}(${e.source} · ${e.kindLabel} · ${e.timestamp} · ${e.duration}):${e.detail}`):[`- 当前筛选范围内没有需要处理的事件。`];return[`# dashboard 运行时事故摘要`,``,`状态:${e.statusLabel}`,`说明:${e.statusDetail}`,``,`## 指标`,...e.metrics.map(e=>`- ${e.label}:${e.value}`),``,`## 影响来源`,e.affectedSources.length>0?e.affectedSources.map(e=>`- ${e}`).join(`
1
+ import{$ as e,A as t,D as n,F as r,H as i,K as a,M as o,O as s,P as c,R as l,S as u,T as d,V as f,X as p,Z as m,_ as h,f as g,g as _,h as v,m as y,v as b,w as x,x as S}from"./vue.js";import{C,F as w,T,b as E,g as ee,h as D,k as O,m as te,p as ne,t as re,w as k}from"./index.js";import{a as ie,c as A,i as j,n as M,t as N}from"./AppEmptyState.js";import{n as P,r as F,t as ae}from"./AppMetricTile.js";import{t as I}from"./AppRuntimeBadge.js";var L=x({__name:`ActivityEventSortBar`,props:n({events:{},filteredCount:{},totalCount:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:[`update:modelValue`],setup(e,{expose:n}){n();let r=e,i=l(e,`modelValue`),o=[{label:`按时间`,value:`time`},{label:`按耗时`,value:`duration`},{label:`按等级`,value:`severity`},{label:`按来源`,value:`source`}],s=a(``),c=null;function u(e){return e.replaceAll(`|`,`\\|`).replaceAll(`
2
+ `,` `)}let d=y(()=>[`# dashboard 事件流`,``,`事件数量:${r.events.length}`,``,`| 时间 | 等级 | 类型 | 来源 | 标题 | 耗时 | 标签 |`,`| --- | --- | --- | --- | --- | ---: | --- |`,...r.events.map(e=>[e.timestamp,k(e.level),C(e.kind),e.source??`dashboard`,e.title,E(e.durationMs),e.tags?.join(`, `)||`-`].map(u).join(` | `)).map(e=>`| ${e} |`),``].join(`
3
+ `));function f(e){s.value=e,c&&clearTimeout(c),c=setTimeout(()=>{s.value=``,c=null},1800)}async function p(){try{await A(d.value),f(`已复制`)}catch{f(`复制失败`)}}function m(){let e=new Blob([`${JSON.stringify(r.events,null,2)}\n`],{type:`application/json`}),t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`weapp-vite-dashboard-events.json`,n.click(),URL.revokeObjectURL(t),f(`已导出`)}t(()=>{c&&clearTimeout(c)});let h={props:r,sortMode:i,sortOptions:o,actionStatus:s,get actionStatusTimer(){return c},set actionStatusTimer(e){c=e},escapeMarkdownCell:u,reportText:d,setActionStatus:f,copyEventReport:p,exportEventJson:m,AppSelect:O,AppToolButton:F};return Object.defineProperty(h,"__isScriptSetup",{enumerable:!1,value:!0}),h}}),R={class:`flex flex-wrap items-center justify-between gap-2 rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) px-3 py-2`},z={class:`text-xs text-(--dashboard-text-soft)`},B={class:`flex min-w-0 flex-wrap items-center gap-2`},V={key:0,class:`text-xs font-medium text-(--dashboard-accent)`},H={class:`flex shrink-0 flex-nowrap items-center gap-2`};function U(t,n,r,i,a,s){return o(),b(`div`,R,[v(`p`,z,` 匹配 `+e(r.filteredCount)+` / `+e(r.totalCount)+` 条事件 `,1),v(`div`,B,[i.actionStatus?(o(),b(`span`,V,e(i.actionStatus),1)):h(``,!0),v(`div`,H,[u(i.AppToolButton,{label:`复制运行事件`,"icon-name":`metric-copy`,"touch-label":`复制`,disabled:r.events.length===0,onClick:i.copyEventReport},null,8,[`disabled`]),u(i.AppToolButton,{label:`导出运行事件 JSON`,"icon-name":`metric-entries`,"touch-label":`导出`,disabled:r.events.length===0,onClick:i.exportEventJson},null,8,[`disabled`])]),u(i.AppSelect,{modelValue:i.sortMode,"onUpdate:modelValue":n[0]||=e=>i.sortMode=e,class:`w-28`,label:`排序运行事件`,options:i.sortOptions},null,8,[`modelValue`])])])}var W=w(L,[[`render`,U]]),G=x({__name:`AppRuntimeFocusCard`,props:{event:{},eyebrow:{},emptyTitle:{},emptyDetail:{},durationText:{}},setup(e,{expose:t}){t();let n=e,r={props:n,badge:y(()=>n.event?D(n.event):null),titleText:y(()=>n.event?.title??n.emptyTitle??`尚无运行事件`),detailText:y(()=>n.event?.detail??n.emptyDetail??`当前工作区还没有推入结构化运行事件。`),eventMeta:y(()=>n.event?T(n.event):null),get mutedPanelStyles(){return j},AppRuntimeBadge:I};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),K={class:`flex items-start justify-between gap-3`},q={key:0,class:`text-[11px] uppercase tracking-[0.18em] text-(--dashboard-accent)`},J={class:`mt-1 text-lg font-semibold tracking-tight`},oe={class:`mt-3 text-sm leading-6 text-(--dashboard-text-muted)`},se={key:0,class:`mt-3 text-[11px] uppercase tracking-[0.18em] text-(--dashboard-text-soft)`},ce={key:1,class:`mt-2 text-sm font-medium text-(--dashboard-text)`};function le(t,n,i,a,c,l){return o(),b(`div`,{class:p(a.mutedPanelStyles())},[v(`div`,K,[v(`div`,null,[a.props.eyebrow?(o(),b(`p`,q,e(a.props.eyebrow),1)):h(``,!0),v(`h3`,J,e(a.titleText),1)]),a.badge?(o(),_(a.AppRuntimeBadge,m(s({key:0},a.badge)),null,16)):h(``,!0)]),v(`p`,oe,e(a.detailText),1),a.props.event?(o(),b(`p`,se,e(a.eventMeta),1)):h(``,!0),a.props.durationText?(o(),b(`p`,ce,e(a.props.durationText),1)):h(``,!0),r(t.$slots,`default`)],2)}var ue=w(G,[[`render`,le]]),de=x({__name:`ActivitySelectedEventPanel`,props:{event:{}},setup(e,{expose:t}){t();let n=e,r={props:n,durationText:y(()=>n.event?.durationMs===void 0?void 0:`耗时 ${E(n.event.durationMs)}`),profileMetrics:y(()=>{let e=n.event?.profile;return e?[{label:`总耗时`,value:E(e.totalMs)},{label:`构建核心`,value:E(e.buildCoreMs)},{label:`转换`,value:E(e.transformMs)},{label:`写入`,value:E(e.writeMs)},{label:`监听到脏标记`,value:E(e.watchToDirtyMs)},{label:`产物发射`,value:E(e.emitMs)},{label:`共享 chunk`,value:E(e.sharedChunkResolveMs)}].filter(e=>e.value!==`未记录`):[]}),profileCounts:y(()=>{let e=n.event?.profile;return e?[{label:`脏入口`,value:e.dirtyCount},{label:`待处理`,value:e.pendingCount},{label:`已发射`,value:e.emittedCount}].filter(e=>typeof e.value==`number`):[]}),profileFile:y(()=>n.event?.profile?.sourceRootFile??n.event?.profile?.relativeFile??n.event?.profile?.file),AppRuntimeBadge:I,AppRuntimeFocusCard:ue,AppSurfaceCard:M};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),fe={key:0,class:`mt-3 flex flex-wrap gap-1.5`},pe={key:1,class:`mt-4 grid gap-3 rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) p-3`},me={class:`flex min-w-0 items-start justify-between gap-3`},he={class:`min-w-0`},ge={key:0,class:`mt-1 truncate font-mono text-xs text-(--dashboard-text-soft)`},_e={key:0,class:`grid gap-2 sm:grid-cols-2`},ve={class:`text-[11px] text-(--dashboard-text-soft)`},ye={class:`mt-1 text-sm font-semibold text-(--dashboard-text)`},be={key:1,class:`flex flex-wrap gap-1.5`},xe={key:2,class:`grid gap-2 text-xs leading-5 text-(--dashboard-text-muted)`},Se={key:0},Ce={key:1};function we(t,n,r,a,s,l){return o(),_(a.AppSurfaceCard,{eyebrow:`Selected`,title:`当前事件`,"icon-name":`metric-search`},{default:i(()=>[u(a.AppRuntimeFocusCard,{event:r.event,eyebrow:`focus`,"empty-title":`未选择事件`,"empty-detail":`选择左侧事件后查看详情。`,"duration-text":a.durationText},{default:i(()=>[r.event?.tags?.length?(o(),b(`div`,fe,[(o(!0),b(g,null,c(r.event.tags,e=>(o(),_(a.AppRuntimeBadge,{key:e,label:e,tone:`neutral`},null,8,[`label`]))),128))])):h(``,!0),r.event?.profile?(o(),b(`div`,pe,[v(`div`,me,[v(`div`,he,[n[0]||=v(`p`,{class:`text-sm font-semibold text-(--dashboard-text)`},` HMR 阶段明细 `,-1),a.profileFile?(o(),b(`p`,ge,e(a.profileFile),1)):h(``,!0)]),r.event.profile.event?(o(),_(a.AppRuntimeBadge,{key:0,label:r.event.profile.event,tone:`info`},null,8,[`label`])):h(``,!0)]),a.profileMetrics.length>0?(o(),b(`dl`,_e,[(o(!0),b(g,null,c(a.profileMetrics,t=>(o(),b(`div`,{key:t.label,class:`rounded-md border border-(--dashboard-border) bg-(--dashboard-panel) px-3 py-2`},[v(`dt`,ve,e(t.label),1),v(`dd`,ye,e(t.value),1)]))),128))])):h(``,!0),a.profileCounts.length>0?(o(),b(`div`,be,[(o(!0),b(g,null,c(a.profileCounts,e=>(o(),_(a.AppRuntimeBadge,{key:e.label,label:`${e.label} ${e.value}`,tone:`neutral`},null,8,[`label`]))),128))])):h(``,!0),r.event.profile.dirtyReasonSummary?.length||r.event.profile.pendingReasonSummary?.length?(o(),b(`div`,xe,[r.event.profile.dirtyReasonSummary?.length?(o(),b(`p`,Se,` 脏标记:`+e(r.event.profile.dirtyReasonSummary.join(`、`)),1)):h(``,!0),r.event.profile.pendingReasonSummary?.length?(o(),b(`p`,Ce,` 待处理:`+e(r.event.profile.pendingReasonSummary.join(`、`)),1)):h(``,!0)])):h(``,!0)])):h(``,!0)]),_:1},8,[`event`,`duration-text`])]),_:1})}var Te=w(de,[[`render`,we]]),Ee=x({__name:`AppRuntimeSourceCard`,props:{source:{},count:{},errorCount:{},averageDuration:{},latestTimestamp:{},countLabel:{}},setup(e,{expose:t}){t();let n=e,r={props:n,badge:y(()=>ee(n)),subtitle:y(()=>n.latestTimestamp?`最近事件 ${n.latestTimestamp}`:`${n.count} ${n.countLabel??`条事件`}`),detailItems:y(()=>[{key:`error-count`,label:`错误 ${n.errorCount}`},{key:`average-duration`,label:`平均耗时 ${n.averageDuration}`}]),summaryText:y(()=>`平均耗时 ${n.averageDuration}`),get mutedPanelStyles(){return j},AppRuntimeBadge:I};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),De={class:`flex items-start justify-between gap-3`},Oe={class:`min-w-0`},ke={class:`truncate font-medium text-(--dashboard-text)`},Ae={class:`mt-1 text-[11px] uppercase tracking-[0.16em] text-(--dashboard-text-soft)`},je={key:0,class:`mt-3 flex flex-wrap gap-2 text-[11px] uppercase tracking-[0.14em] text-(--dashboard-text-soft)`},Me={key:1,class:`mt-3 text-sm text-(--dashboard-text-muted)`};function Ne(t,n,r,i,a,s){return o(),b(`div`,{class:p(i.mutedPanelStyles({padding:`sm`}))},[v(`div`,De,[v(`div`,Oe,[v(`p`,ke,e(i.props.source),1),v(`p`,Ae,e(i.subtitle),1)]),u(i.AppRuntimeBadge,m(d(i.badge)),null,16)]),i.props.latestTimestamp?(o(),b(`div`,je,[(o(!0),b(g,null,c(i.detailItems,t=>(o(),b(`span`,{key:t.key,class:`rounded-full border border-(--dashboard-border) px-2 py-0.5`},e(t.label),1))),128))])):(o(),b(`p`,Me,e(i.summaryText),1))],2)}var Pe=w(Ee,[[`render`,Ne]]),Fe=x({__name:`AppStatCard`,props:{label:{},value:{}},setup(e,{expose:t}){t();let n={panelClassName:j({padding:`sm`}),AppMetaLabel:P};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),Ie={class:`mt-1 text-lg font-semibold`};function Le(t,n,r,a,s,c){return o(),b(`div`,{class:p(a.panelClassName)},[u(a.AppMetaLabel,null,{default:i(()=>[S(e(r.label),1)]),_:1}),v(`p`,Ie,e(r.value),1)],2)}var Re=w(Fe,[[`render`,Le]]),ze=x({__name:`RuntimeIncidentDigestPanel`,props:{digest:{}},setup(e,{expose:n}){n();let r=e,i=a(``),o=null,s=y(()=>r.digest.status===`critical`?`error`:r.digest.status===`warning`?`warning`:`success`);function c(e){return e===`error`?`text-rose-600 dark:text-rose-300`:e===`warning`?`text-amber-600 dark:text-amber-300`:`text-(--dashboard-accent)`}function l(e){return e===`critical`?`border-rose-400/60 bg-(--dashboard-panel-muted)`:e===`warning`?`border-amber-400/60 bg-(--dashboard-panel-muted)`:`border-emerald-400/60 bg-(--dashboard-panel-muted)`}function u(e){i.value=e,o&&clearTimeout(o),o=setTimeout(()=>{i.value=``,o=null},1800)}async function d(){try{await A(r.digest.report),u(`摘要已复制`)}catch{u(`复制失败`)}}t(()=>{o&&clearTimeout(o)});let f={props:r,copyStatus:i,get copyStatusTimer(){return o},set copyStatusTimer(e){o=e},badgeTone:s,getLevelClassName:c,getStatusAccentClassName:l,setCopyStatus:u,copyDigestReport:d,AppEmptyState:N,AppMetricTile:ae,AppRuntimeBadge:I,AppSurfaceCard:M,AppToolButton:F};return Object.defineProperty(f,"__isScriptSetup",{enumerable:!1,value:!0}),f}}),Be={class:`flex min-w-0 flex-wrap items-center justify-end gap-2`},Ve={key:0,class:`text-xs font-medium text-(--dashboard-accent)`},He={class:`grid gap-3`},Ue={class:`flex items-start justify-between gap-3`},We={class:`min-w-0`},Ge={class:`text-sm font-semibold text-(--dashboard-text)`},Ke={class:`mt-1 text-xs leading-5 text-(--dashboard-text-muted)`},qe={class:`grid grid-cols-2 gap-2 sm:grid-cols-5 xl:grid-cols-2 2xl:grid-cols-5`},Je={key:0,class:`grid max-h-52 gap-2 overflow-y-auto pr-1`},Ye={class:`flex items-start justify-between gap-3`},Xe={class:`min-w-0`},Ze={class:`truncate text-sm font-medium text-(--dashboard-text)`},Qe={class:`mt-1 truncate text-xs text-(--dashboard-text-soft)`},$e={class:`mt-2 line-clamp-2 text-xs leading-5 text-(--dashboard-text-muted)`};function et(t,n,r,a,s,l){return o(),_(a.AppSurfaceCard,{title:`异常摘要`,"icon-name":`metric-quality`},{header:i(()=>[v(`div`,Be,[a.copyStatus?(o(),b(`span`,Ve,e(a.copyStatus),1)):h(``,!0),u(a.AppToolButton,{label:`复制运行时异常摘要`,"icon-name":`metric-copy`,"touch-label":`复制`,onClick:a.copyDigestReport})])]),default:i(()=>[v(`div`,He,[v(`div`,{class:p([`rounded-md border px-3 py-2.5`,a.getStatusAccentClassName(r.digest.status)])},[v(`div`,Ue,[v(`div`,We,[v(`p`,Ge,e(r.digest.statusLabel),1),v(`p`,Ke,e(r.digest.statusDetail),1)]),u(a.AppRuntimeBadge,{label:r.digest.statusLabel,tone:a.badgeTone},null,8,[`label`,`tone`])])],2),v(`div`,qe,[(o(!0),b(g,null,c(r.digest.metrics,e=>(o(),_(a.AppMetricTile,{key:e.label,label:e.label,value:e.value},null,8,[`label`,`value`]))),128))]),r.digest.incidents.length>0?(o(),b(`div`,Je,[(o(!0),b(g,null,c(r.digest.incidents,t=>(o(),b(`article`,{key:t.id,class:`rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) px-3 py-2.5`},[v(`div`,Ye,[v(`div`,Xe,[v(`p`,Ze,e(t.title),1),v(`p`,Qe,e(t.source)+` · `+e(t.kindLabel)+` · `+e(t.timestamp)+` · `+e(t.duration),1)]),v(`span`,{class:p([`shrink-0 text-xs font-semibold`,a.getLevelClassName(t.level)])},e(t.levelLabel),3)]),v(`p`,$e,e(t.reason)+` · `+e(t.detail),1)]))),128))])):(o(),_(a.AppEmptyState,{key:1,compact:``},{default:i(()=>[...n[0]||=[S(` 当前筛选范围内没有需要处理的运行时事件。 `,-1)]]),_:1}))])]),_:1})}var tt=w(ze,[[`render`,et]]),nt=x({__name:`ActivityInsightPanel`,props:{selectedEvent:{},incidentDigest:{},eventSummary:{},filteredEventSummary:{},diagnostics:{},sourceBreakdown:{}},setup(e,{expose:t}){t();let n={ActivitySelectedEventPanel:Te,AppRuntimeBadge:I,AppRuntimeSourceCard:Pe,AppStatCard:Re,AppSurfaceCard:M,RuntimeIncidentDigestPanel:tt};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}}),rt={class:`grid min-h-0 min-w-0 content-start gap-4`},it=[`open`],at={class:`flex min-h-11 cursor-pointer list-none flex-wrap items-center gap-2 rounded-md px-2 text-sm text-(--dashboard-text-muted) hover:bg-(--dashboard-panel-muted) focus-visible:outline-2 focus-visible:outline-(--dashboard-accent)`},ot={class:`text-(--dashboard-text)`},st={class:`group min-w-0`},ct={class:`grid min-w-0 gap-3 pt-2`},lt={class:`grid gap-2 sm:grid-cols-2`},ut={class:`grid max-h-44 gap-2 overflow-y-auto pr-1`},dt={class:`flex items-start justify-between gap-3`},ft={class:`font-medium`},pt={class:`mt-1 text-sm leading-6 text-(--dashboard-text-muted)`},mt={key:0,class:`grid max-h-full gap-2 overflow-y-auto pr-1`};function ht(t,n,r,a,l,d){return o(),b(`div`,rt,[u(a.ActivitySelectedEventPanel,{event:r.selectedEvent},null,8,[`event`]),v(`details`,{class:`group min-w-0`,open:r.incidentDigest.status===`critical`||r.incidentDigest.status===`warning`},[v(`summary`,at,[n[0]||=v(`span`,{class:`icon-[mdi--chevron-right] size-4 shrink-0 group-open:rotate-90`,"aria-hidden":`true`},null,-1),n[1]||=S(` 当前筛选的运行异常 `,-1),v(`span`,ot,e(r.selectedEvent?r.incidentDigest.statusLabel:`暂无可判断的事件`),1)]),u(a.RuntimeIncidentDigestPanel,{digest:r.incidentDigest},null,8,[`digest`])],8,it),v(`details`,st,[n[2]||=v(`summary`,{class:`flex min-h-11 cursor-pointer list-none items-center gap-2 rounded-md px-2 text-sm text-(--dashboard-text-muted) hover:bg-(--dashboard-panel-muted) focus-visible:outline-2 focus-visible:outline-(--dashboard-accent)`},[v(`span`,{class:`icon-[mdi--chevron-right] size-4 shrink-0 group-open:rotate-90`,"aria-hidden":`true`}),S(` 事件统计与诊断 `)],-1),v(`div`,ct,[u(a.AppSurfaceCard,{title:`事件摘要`,"icon-name":`metric-time`},{default:i(()=>[v(`div`,lt,[(o(!0),b(g,null,c([...r.eventSummary,...r.filteredEventSummary],e=>(o(),_(a.AppStatCard,s({key:e.label},{ref_for:!0},e),null,16))),128))])]),_:1}),u(a.AppSurfaceCard,{title:`当前诊断队列`,"icon-name":`metric-health`,"content-class":`min-h-0 overflow-hidden`},{default:i(()=>[v(`ul`,ut,[(o(!0),b(g,null,c(r.diagnostics,t=>(o(),b(`li`,{key:t.label,class:`rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) px-4 py-3`},[v(`div`,dt,[v(`div`,null,[v(`p`,ft,e(t.label),1),v(`p`,pt,e(t.detail),1)]),u(a.AppRuntimeBadge,{label:t.status,tone:`info`},null,8,[`label`])])]))),128))])]),_:1}),u(a.AppSurfaceCard,{title:`事件来源`,"icon-name":`hero-system`,"content-class":`min-h-0 overflow-hidden`},{default:i(()=>[r.sourceBreakdown.length>0?(o(),b(`div`,mt,[(o(!0),b(g,null,c(r.sourceBreakdown,e=>(o(),_(a.AppRuntimeSourceCard,s({key:e.source},{ref_for:!0},e),null,16))),128))])):h(``,!0)]),_:1})])])])}var gt=w(nt,[[`render`,ht]]),_t=x({__name:`AppEventFilterPanel`,props:{searchQuery:{},presetDescription:{},filterPresets:{},eventKindOptions:{},eventLevelOptions:{},eventSourceOptions:{},eventKindFilter:{},eventLevelFilter:{},eventSourceFilter:{}},emits:[`update:searchQuery`,`update:eventKindFilter`,`update:eventLevelFilter`,`update:eventSourceFilter`,`applyPreset`],setup(e,{expose:t,emit:n}){t();let r=e,i={props:r,emit:n,presetClassName:ie({kind:`theme`,active:!1}),activeFilterSummary:y(()=>[r.eventKindFilter===`all`?``:r.eventKindOptions.find(e=>e.value===r.eventKindFilter)?.label,r.eventLevelFilter===`all`?``:r.eventLevelOptions.find(e=>e.value===r.eventLevelFilter)?.label,r.eventSourceFilter===`all`?``:r.eventSourceOptions.find(e=>e.value===r.eventSourceFilter)?.label].filter(Boolean).join(` · `)),AppSelect:O};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}}),vt={class:`grid min-w-0 gap-3`},yt=[`value`],bt={class:`flex flex-wrap gap-2`,role:`group`,"aria-label":`常用事件筛选`},xt=[`onClick`],St={key:0,class:`sr-only`,role:`status`},Ct=[`open`],wt={class:`flex min-h-11 cursor-pointer list-none items-center gap-2 rounded-md border border-(--dashboard-border) bg-(--dashboard-panel-muted) px-3 py-2 text-sm text-(--dashboard-text-muted) hover:border-(--dashboard-border-strong) hover:text-(--dashboard-text) focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--dashboard-accent)`},Tt={class:`flex min-w-0 flex-1 flex-wrap items-center gap-x-2 gap-y-1`},Et={key:0,class:`text-(--dashboard-accent) [overflow-wrap:anywhere]`},Dt={class:`grid gap-3 pt-2 pb-2 md:grid-cols-3`};function Ot(t,n,r,i,a,s){return o(),b(`div`,vt,[v(`div`,null,[n[4]||=v(`label`,{for:`dashboard-event-search`,class:`block text-sm font-medium text-(--dashboard-text)`},` 搜索事件 `,-1),v(`input`,{id:`dashboard-event-search`,value:r.searchQuery,type:`search`,placeholder:`搜索标题、详情或来源`,class:`mt-2 w-full rounded-md border border-(--dashboard-border) bg-(--dashboard-panel) px-3 py-2 text-sm text-(--dashboard-text) outline-none transition focus:border-(--dashboard-accent)`,onInput:n[0]||=e=>i.emit(`update:searchQuery`,e.target.value)},null,40,yt)]),v(`div`,bt,[(o(!0),b(g,null,c(r.filterPresets,t=>(o(),b(`button`,{key:t.key,type:`button`,class:p(i.presetClassName),onClick:e=>i.emit(`applyPreset`,t.key)},e(t.label),11,xt))),128))]),r.presetDescription?(o(),b(`p`,St,e(r.presetDescription),1)):h(``,!0),v(`details`,{class:`group`,open:!!i.activeFilterSummary},[v(`summary`,wt,[n[6]||=v(`span`,{class:`icon-[mdi--filter-outline] size-4 shrink-0`,"aria-hidden":`true`},null,-1),v(`span`,Tt,[n[5]||=v(`span`,null,`更多筛选`,-1),i.activeFilterSummary?(o(),b(`span`,Et,e(i.activeFilterSummary),1)):h(``,!0)]),n[7]||=v(`span`,{class:`icon-[mdi--chevron-right] size-4 shrink-0 group-open:rotate-90`,"aria-hidden":`true`},null,-1)]),v(`div`,Dt,[u(i.AppSelect,{"model-value":r.eventKindFilter,options:r.eventKindOptions,label:`事件类型`,"onUpdate:modelValue":n[1]||=e=>i.emit(`update:eventKindFilter`,e)},null,8,[`model-value`,`options`]),u(i.AppSelect,{"model-value":r.eventLevelFilter,options:r.eventLevelOptions,label:`事件等级`,"onUpdate:modelValue":n[2]||=e=>i.emit(`update:eventLevelFilter`,e)},null,8,[`model-value`,`options`]),u(i.AppSelect,{"model-value":r.eventSourceFilter,options:r.eventSourceOptions,label:`事件来源`,"onUpdate:modelValue":n[3]||=e=>i.emit(`update:eventSourceFilter`,e)},null,8,[`model-value`,`options`])])],8,Ct)])}var kt=w(_t,[[`render`,Ot]]),At=x({__name:`AppRuntimeEventListItem`,props:{event:{},selected:{type:Boolean}},setup(e,{expose:t}){t();let n=e,r={props:n,badge:y(()=>D(n.event)),eventMeta:y(()=>T(n.event)),panelClassName:y(()=>n.selected?`border-(--dashboard-border-strong) bg-(--dashboard-panel)`:`border-(--dashboard-border)`),AppMetaLabel:P,AppRuntimeBadge:I};return Object.defineProperty(r,"__isScriptSetup",{enumerable:!1,value:!0}),r}}),jt={class:`flex min-w-0 items-start justify-between gap-3`},Mt={class:`min-w-0`},Nt=[`title`];function Pt(t,n,r,a,c,l){return o(),b(`li`,{class:p([`rounded-md border bg-(--dashboard-panel-muted) px-4 py-3 transition`,a.panelClassName])},[v(`div`,jt,[v(`div`,Mt,[v(`p`,{class:`truncate font-medium text-(--dashboard-text)`,title:a.props.event.title},e(a.props.event.title),9,Nt),u(a.AppMetaLabel,{class:`mt-1`},{default:i(()=>[S(e(a.eventMeta),1)]),_:1})]),u(a.AppRuntimeBadge,s({class:`shrink-0`},a.badge),null,16)])],2)}var Ft=w(At,[[`render`,Pt]]),It=1e3,Lt=5,Y={error:4,warning:3,success:2,info:1};function X(e){let t=Date.parse(e.timestamp);return Number.isFinite(t)?t:0}function Z(e,t){return typeof e.durationMs==`number`&&e.durationMs>=t}function Rt(e,t){return e.level===`error`||e.level===`warning`||Z(e,t)}function zt(e,t){let n=[];return e.level===`error`?n.push(`错误事件`):e.level===`warning`&&n.push(`警告事件`),Z(e,t)&&n.push(`耗时 ${E(e.durationMs)}`),n.join(` · `)||`需要关注`}function Bt(e,t){return{id:e.id,title:e.title,detail:e.detail,level:e.level,levelLabel:k(e.level),kindLabel:C(e.kind),source:e.source??`dashboard`,timestamp:e.timestamp,duration:E(e.durationMs),reason:zt(e,t)}}function Vt(e,t,n){return e>0?`critical`:t>0||n>0?`warning`:`healthy`}function Q(e){return e===`critical`?`需要立即处理`:e===`warning`?`需要关注`:`运行平稳`}function Ht(e,t,n,r){return e===`critical`?`检测到 ${t} 个错误事件,优先排查失败来源。`:e===`warning`?`检测到 ${n} 个警告和 ${r} 个慢事件,建议跟进。`:`当前筛选范围内没有错误、警告或慢事件。`}function Ut(e){let t=e.incidents.length>0?e.incidents.map(e=>`- [${e.levelLabel}] ${e.title}(${e.source} · ${e.kindLabel} · ${e.timestamp} · ${e.duration}):${e.detail}`):[`- 当前筛选范围内没有需要处理的事件。`];return[`# dashboard 运行时事故摘要`,``,`状态:${e.statusLabel}`,`说明:${e.statusDetail}`,``,`## 指标`,...e.metrics.map(e=>`- ${e.label}:${e.value}`),``,`## 影响来源`,e.affectedSources.length>0?e.affectedSources.map(e=>`- ${e}`).join(`
4
4
  `):`- 无`,``,`## 优先处理`,...t,``].join(`
5
- `)}function Xt(e,t={}){let n=t.slowEventThresholdMs??Vt,r=e.filter(e=>e.level===`error`).length,i=e.filter(e=>e.level===`warning`).length,a=e.filter(e=>Z(e,n)).length,o=e.filter(e=>Ut(e,n)),s=[...new Set(o.map(e=>e.source??`dashboard`))].sort((e,t)=>e.localeCompare(t,`zh-CN`)),c=Kt(r,i,a),l=o.toSorted((e,t)=>Y[t.level]-Y[e.level]||(t.durationMs??-1)-(e.durationMs??-1)||X(t)-X(e)).slice(0,Ht).map(e=>Gt(e,n)),u={status:c,statusLabel:qt(c),statusDetail:Jt(c,r,i,a),metrics:[{label:`事件总数`,value:e.length},{label:`错误`,value:r},{label:`警告`,value:i},{label:`慢事件`,value:a},{label:`影响来源`,value:s.length}],affectedSources:s,incidents:l};return{...u,report:Yt(u)}}var Q={error:4,warning:3,success:2,info:1},Zt=[{value:`all`,label:`全部类型`},{value:`command`,label:`命令`},{value:`build`,label:`构建`},{value:`diagnostic`,label:`诊断`},{value:`hmr`,label:`HMR`},{value:`system`,label:`系统`}],Qt=[{value:`all`,label:`全部等级`},{value:`info`,label:`信息`},{value:`success`,label:`成功`},{value:`warning`,label:`警告`},{value:`error`,label:`错误`}];function $t(e,t){return[e.title,e.detail,e.kind,e.level,e.source??``,...e.tags??[]].join(` `).toLowerCase().includes(t)}function $(e,t){return[...e].sort((e,n)=>t===`duration`?(n.durationMs??-1)-(e.durationMs??-1)||Date.parse(n.timestamp)-Date.parse(e.timestamp):t===`severity`?Q[n.level]-Q[e.level]||Date.parse(n.timestamp)-Date.parse(e.timestamp):t===`source`&&(e.source??`dashboard`).localeCompare(n.source??`dashboard`)||Date.parse(n.timestamp)-Date.parse(e.timestamp))}function en(e){let t=c(`all`),n=c(`all`),r=c(`all`),i=c(`time`),a=c(``),o=c(null),s=[{key:`all`,label:`查看全部`,description:`回到完整事件流`,apply(){t.value=`all`,n.value=`all`,r.value=`all`,a.value=``}},{key:`issues`,label:`异常优先`,description:`只看警告和错误`,apply(){t.value=`all`,n.value=`warning`,r.value=`all`,a.value=``}},{key:`commands`,label:`命令流`,description:`聚焦命令执行事件`,apply(){t.value=`command`,n.value=`all`,r.value=`all`,a.value=``}},{key:`hmr`,label:`HMR`,description:`观察热更新相关事件`,apply(){t.value=`hmr`,n.value=`all`,r.value=`all`,a.value=``}}],l=p(()=>[{value:`all`,label:`全部来源`},...[...new Set(e.value.map(e=>e.source??`dashboard`).filter(Boolean))].sort((e,t)=>e.localeCompare(t,`zh-CN`)).map(e=>({value:e,label:e}))]),u=p(()=>{let o=a.value.trim().toLowerCase();return $(e.value.filter(e=>t.value!==`all`&&e.kind!==t.value||n.value!==`all`&&e.level!==n.value||r.value!==`all`&&(e.source??`dashboard`)!==r.value?!1:!o||$t(e,o)),i.value)}),d=p(()=>{let e=u.value.filter(e=>typeof e.durationMs==`number`),i=e.length>0?Math.round(e.reduce((e,t)=>e+(t.durationMs??0),0)/e.length):void 0;return[{label:`筛选后事件`,value:String(u.value.length)},{label:`当前类型`,value:t.value===`all`?`全部`:T(t.value)},{label:`当前等级`,value:n.value===`all`?`全部`:C(n.value)},{label:`当前来源`,value:r.value===`all`?`全部`:r.value},{label:`搜索关键字`,value:a.value.trim()||`未设置`},{label:`筛选平均耗时`,value:E(i)}]}),f=p(()=>re(ie(u.value))),m=p(()=>Xt(u.value)),h=p(()=>u.value.find(e=>e.id===o.value)??u.value[0]??null),g=p(()=>s.find(e=>e.key===`issues`?t.value===`all`&&n.value===`warning`&&r.value===`all`&&a.value===``:e.key===`commands`?t.value===`command`&&n.value===`all`&&r.value===`all`&&a.value===``:e.key===`hmr`?t.value===`hmr`&&n.value===`all`&&r.value===`all`&&a.value===``:t.value===`all`&&n.value===`all`&&r.value===`all`&&a.value===``)?.description??``);return ee(u,e=>{if(e.length===0){o.value=null;return}e.some(e=>e.id===o.value)||(o.value=e[0]?.id??null)},{immediate:!0}),{eventKindFilter:t,eventKindOptions:Zt,eventLevelFilter:n,eventLevelOptions:Qt,eventSortMode:i,eventSourceFilter:r,eventSourceOptions:l,filteredEventSummary:d,filteredRuntimeEvents:u,filterPresets:s,incidentDigest:m,presetDescription:g,searchQuery:a,selectedEvent:h,selectedEventId:o,sourceBreakdown:f}}var tn=t({__name:`activity`,setup(e,{expose:t}){t();let{diagnostics:n,eventSummary:r,runtimeEvents:i}=ae(),{eventKindFilter:a,eventKindOptions:o,eventLevelFilter:s,eventLevelOptions:c,eventSortMode:l,eventSourceFilter:u,eventSourceOptions:d,filteredEventSummary:f,filteredRuntimeEvents:p,filterPresets:m,incidentDigest:h,presetDescription:g,searchQuery:_,selectedEvent:v,selectedEventId:y,sourceBreakdown:b}=en(i),x={diagnostics:n,eventSummary:r,runtimeEvents:i,eventKindFilter:a,eventKindOptions:o,eventLevelFilter:s,eventLevelOptions:c,eventSortMode:l,eventSourceFilter:u,eventSourceOptions:d,filteredEventSummary:f,filteredRuntimeEvents:p,filterPresets:m,incidentDigest:h,presetDescription:g,searchQuery:_,selectedEvent:v,selectedEventId:y,sourceBreakdown:b,ActivityEventSortBar:G,ActivityInsightPanel:pt,AppEmptyState:N,AppEventFilterPanel:Pt,AppRuntimeEventListItem:Bt,AppSurfaceCard:M};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}}),nn={class:`grid min-h-[40rem] min-w-0 items-start gap-3 xl:grid-cols-[minmax(0,1.25fr)_minmax(18rem,0.75fr)] xl:items-stretch`},rn={class:`grid min-h-0 min-w-0 grid-rows-[auto_auto_minmax(14rem,1fr)] gap-3 overflow-visible xl:h-full xl:grid-rows-[auto_auto_minmax(6rem,1fr)] xl:overflow-hidden`},an={class:`grid min-h-0 gap-2 overflow-y-auto pr-1 text-sm leading-6 text-(--dashboard-text-muted)`};function on(t,n,r,i,a,s){return m(),x(`div`,nn,[b(i.AppSurfaceCard,{eyebrow:`Event Feed`,title:`事件控制台`,"icon-name":`hero-commands`,"content-class":`min-h-[36rem] min-w-0`},{default:e(()=>[f(`div`,rn,[b(i.AppEventFilterPanel,{class:`min-h-0 min-w-0`,"search-query":i.searchQuery,"preset-description":i.presetDescription,"filter-presets":i.filterPresets,"event-kind-options":i.eventKindOptions,"event-level-options":i.eventLevelOptions,"event-source-options":i.eventSourceOptions,"event-kind-filter":i.eventKindFilter,"event-level-filter":i.eventLevelFilter,"event-source-filter":i.eventSourceFilter,"onUpdate:searchQuery":n[0]||=e=>i.searchQuery=e,"onUpdate:eventKindFilter":n[1]||=e=>i.eventKindFilter=e,"onUpdate:eventLevelFilter":n[2]||=e=>i.eventLevelFilter=e,"onUpdate:eventSourceFilter":n[3]||=e=>i.eventSourceFilter=e,onApplyPreset:n[4]||=e=>i.filterPresets.find(t=>t.key===e)?.apply()},null,8,[`search-query`,`preset-description`,`filter-presets`,`event-kind-options`,`event-level-options`,`event-source-options`,`event-kind-filter`,`event-level-filter`,`event-source-filter`]),b(i.ActivityEventSortBar,{modelValue:i.eventSortMode,"onUpdate:modelValue":n[5]||=e=>i.eventSortMode=e,events:i.filteredRuntimeEvents,"filtered-count":i.filteredRuntimeEvents.length,"total-count":i.runtimeEvents.length},null,8,[`modelValue`,`events`,`filtered-count`,`total-count`]),i.filteredRuntimeEvents.length===0?(m(),u(i.AppEmptyState,{key:0,as:`p`},{default:e(()=>[...n[6]||=[d(` 当前过滤条件下没有匹配事件。 `,-1)]]),_:1})):v(``,!0),f(`ul`,an,[(m(!0),x(g,null,o(i.filteredRuntimeEvents,e=>(m(),u(i.AppRuntimeEventListItem,{key:e.id,event:e,selected:i.selectedEvent?.id===e.id,onClick:t=>i.selectedEventId=e.id},null,8,[`event`,`selected`,`onClick`]))),128))])])]),_:1}),b(i.ActivityInsightPanel,{"selected-event":i.selectedEvent,"incident-digest":i.incidentDigest,"event-summary":i.eventSummary,"filtered-event-summary":i.filteredEventSummary,diagnostics:i.diagnostics,"source-breakdown":i.sourceBreakdown},null,8,[`selected-event`,`incident-digest`,`event-summary`,`filtered-event-summary`,`diagnostics`,`source-breakdown`])])}var sn=S(tn,[[`render`,on]]);export{sn as default};
5
+ `)}function Wt(e,t={}){let n=t.slowEventThresholdMs??It,r=e.filter(e=>e.level===`error`).length,i=e.filter(e=>e.level===`warning`).length,a=e.filter(e=>Z(e,n)).length,o=e.filter(e=>Rt(e,n)),s=[...new Set(o.map(e=>e.source??`dashboard`))].sort((e,t)=>e.localeCompare(t,`zh-CN`)),c=Vt(r,i,a),l=o.toSorted((e,t)=>Y[t.level]-Y[e.level]||(t.durationMs??-1)-(e.durationMs??-1)||X(t)-X(e)).slice(0,Lt).map(e=>Bt(e,n)),u={status:c,statusLabel:Q(c),statusDetail:Ht(c,r,i,a),metrics:[{label:`事件总数`,value:e.length},{label:`错误`,value:r},{label:`警告`,value:i},{label:`慢事件`,value:a},{label:`影响来源`,value:s.length}],affectedSources:s,incidents:l};return{...u,report:Ut(u)}}var $={error:4,warning:3,success:2,info:1},Gt=[{value:`all`,label:`全部类型`},{value:`command`,label:`命令`},{value:`build`,label:`构建`},{value:`diagnostic`,label:`诊断`},{value:`hmr`,label:`HMR`},{value:`system`,label:`系统`}],Kt=[{value:`all`,label:`全部等级`},{value:`info`,label:`信息`},{value:`success`,label:`成功`},{value:`warning`,label:`警告`},{value:`error`,label:`错误`}];function qt(e,t){return[e.title,e.detail,e.kind,e.level,e.source??``,...e.tags??[]].join(` `).toLowerCase().includes(t)}function Jt(e,t){return[...e].sort((e,n)=>t===`duration`?(n.durationMs??-1)-(e.durationMs??-1)||Date.parse(n.timestamp)-Date.parse(e.timestamp):t===`severity`?$[n.level]-$[e.level]||Date.parse(n.timestamp)-Date.parse(e.timestamp):t===`source`&&(e.source??`dashboard`).localeCompare(n.source??`dashboard`)||Date.parse(n.timestamp)-Date.parse(e.timestamp))}function Yt(e){let t=a(`all`),n=a(`all`),r=a(`all`),i=a(`time`),o=a(``),s=a(null),c=[{key:`all`,label:`查看全部`,description:`回到完整事件流`,apply(){t.value=`all`,n.value=`all`,r.value=`all`,o.value=``}},{key:`issues`,label:`异常优先`,description:`只看警告和错误`,apply(){t.value=`all`,n.value=`warning`,r.value=`all`,o.value=``}},{key:`commands`,label:`命令流`,description:`聚焦命令执行事件`,apply(){t.value=`command`,n.value=`all`,r.value=`all`,o.value=``}},{key:`hmr`,label:`HMR`,description:`观察热更新相关事件`,apply(){t.value=`hmr`,n.value=`all`,r.value=`all`,o.value=``}}],l=y(()=>{let t=new Set(e.value.map(e=>e.source??`dashboard`).filter(Boolean));return r.value!==`all`&&t.add(r.value),[{value:`all`,label:`全部来源`},...[...t].sort((e,t)=>e.localeCompare(t,`zh-CN`)).map(e=>({value:e,label:e}))]}),u=y(()=>{let a=o.value.trim().toLowerCase();return Jt(e.value.filter(e=>t.value!==`all`&&e.kind!==t.value||n.value!==`all`&&e.level!==n.value||r.value!==`all`&&(e.source??`dashboard`)!==r.value?!1:!a||qt(e,a)),i.value)}),d=y(()=>{let e=u.value.filter(e=>typeof e.durationMs==`number`),i=e.length>0?Math.round(e.reduce((e,t)=>e+(t.durationMs??0),0)/e.length):void 0;return[{label:`筛选后事件`,value:String(u.value.length)},{label:`当前类型`,value:t.value===`all`?`全部`:C(t.value)},{label:`当前等级`,value:n.value===`all`?`全部`:k(n.value)},{label:`当前来源`,value:r.value===`all`?`全部`:r.value},{label:`搜索关键字`,value:o.value.trim()||`未设置`},{label:`筛选平均耗时`,value:E(i)}]}),p=y(()=>ne(te(u.value))),m=y(()=>Wt(u.value)),h=y(()=>u.value.find(e=>e.id===s.value)??u.value[0]??null),g=y(()=>c.find(e=>e.key===`issues`?t.value===`all`&&n.value===`warning`&&r.value===`all`&&o.value===``:e.key===`commands`?t.value===`command`&&n.value===`all`&&r.value===`all`&&o.value===``:e.key===`hmr`?t.value===`hmr`&&n.value===`all`&&r.value===`all`&&o.value===``:t.value===`all`&&n.value===`all`&&r.value===`all`&&o.value===``)?.description??``);return f(u,e=>{e.length===0?s.value=null:e.some(e=>e.id===s.value)||(s.value=e[0]?.id??null)},{immediate:!0}),{eventKindFilter:t,eventKindOptions:Gt,eventLevelFilter:n,eventLevelOptions:Kt,eventSortMode:i,eventSourceFilter:r,eventSourceOptions:l,filteredEventSummary:d,filteredRuntimeEvents:u,filterPresets:c,incidentDigest:m,presetDescription:g,searchQuery:o,selectedEvent:h,selectedEventId:s,sourceBreakdown:p}}var Xt=x({__name:`activity`,setup(e,{expose:t}){t();let{diagnostics:n,eventSummary:r,runtimeEvents:i}=re(),{eventKindFilter:a,eventKindOptions:o,eventLevelFilter:s,eventLevelOptions:c,eventSortMode:l,eventSourceFilter:u,eventSourceOptions:d,filteredEventSummary:f,filteredRuntimeEvents:p,filterPresets:m,incidentDigest:h,presetDescription:g,searchQuery:_,selectedEvent:v,selectedEventId:y,sourceBreakdown:b}=Yt(i),x={diagnostics:n,eventSummary:r,runtimeEvents:i,eventKindFilter:a,eventKindOptions:o,eventLevelFilter:s,eventLevelOptions:c,eventSortMode:l,eventSourceFilter:u,eventSourceOptions:d,filteredEventSummary:f,filteredRuntimeEvents:p,filterPresets:m,incidentDigest:h,presetDescription:g,searchQuery:_,selectedEvent:v,selectedEventId:y,sourceBreakdown:b,ActivityEventSortBar:W,ActivityInsightPanel:gt,AppEmptyState:N,AppEventFilterPanel:kt,AppRuntimeEventListItem:Ft,AppSurfaceCard:M};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}}),Zt={class:`grid min-w-0 items-start gap-4 xl:grid-cols-[minmax(0,1.4fr)_minmax(18rem,0.8fr)]`},Qt={class:`grid min-h-0 min-w-0 content-start gap-3`},$t={class:`grid min-h-0 min-w-0 content-start gap-2 text-sm leading-6 text-(--dashboard-text-muted)`};function en(e,t,n,r,a,s){return o(),b(`div`,Zt,[u(r.AppSurfaceCard,{title:`事件列表`,"icon-name":`hero-commands`,"content-class":`min-h-0 min-w-0`},{default:i(()=>[v(`div`,Qt,[u(r.AppEventFilterPanel,{class:`min-h-0 min-w-0`,"search-query":r.searchQuery,"preset-description":r.presetDescription,"filter-presets":r.filterPresets,"event-kind-options":r.eventKindOptions,"event-level-options":r.eventLevelOptions,"event-source-options":r.eventSourceOptions,"event-kind-filter":r.eventKindFilter,"event-level-filter":r.eventLevelFilter,"event-source-filter":r.eventSourceFilter,"onUpdate:searchQuery":t[0]||=e=>r.searchQuery=e,"onUpdate:eventKindFilter":t[1]||=e=>r.eventKindFilter=e,"onUpdate:eventLevelFilter":t[2]||=e=>r.eventLevelFilter=e,"onUpdate:eventSourceFilter":t[3]||=e=>r.eventSourceFilter=e,onApplyPreset:t[4]||=e=>r.filterPresets.find(t=>t.key===e)?.apply()},null,8,[`search-query`,`preset-description`,`filter-presets`,`event-kind-options`,`event-level-options`,`event-source-options`,`event-kind-filter`,`event-level-filter`,`event-source-filter`]),u(r.ActivityEventSortBar,{modelValue:r.eventSortMode,"onUpdate:modelValue":t[5]||=e=>r.eventSortMode=e,events:r.filteredRuntimeEvents,"filtered-count":r.filteredRuntimeEvents.length,"total-count":r.runtimeEvents.length},null,8,[`modelValue`,`events`,`filtered-count`,`total-count`]),r.filteredRuntimeEvents.length===0?(o(),_(r.AppEmptyState,{key:0,as:`p`},{default:i(()=>[...t[6]||=[S(` 当前过滤条件下没有匹配事件。 `,-1)]]),_:1})):h(``,!0),v(`ul`,$t,[(o(!0),b(g,null,c(r.filteredRuntimeEvents,e=>(o(),_(r.AppRuntimeEventListItem,{key:e.id,event:e,selected:r.selectedEvent?.id===e.id,onClick:t=>r.selectedEventId=e.id},null,8,[`event`,`selected`,`onClick`]))),128))])])]),_:1}),u(r.ActivityInsightPanel,{"selected-event":r.selectedEvent,"incident-digest":r.incidentDigest,"event-summary":r.eventSummary,"filtered-event-summary":r.filteredEventSummary,diagnostics:r.diagnostics,"source-breakdown":r.sourceBreakdown},null,8,[`selected-event`,`incident-digest`,`event-summary`,`filtered-event-summary`,`diagnostics`,`source-breakdown`])])}var tn=w(Xt,[[`render`,en]]);export{tn as default};
@@ -1 +1 @@
1
- .diagnostics-split[data-v-a5f11dba]{align-items:start;gap:.5rem;min-width:0;min-height:0;display:grid;overflow:visible}@media (width>=1280px){.diagnostics-split[data-v-a5f11dba]{grid-template-columns:minmax(32rem, var(--diagnostics-primary)) .75rem minmax(20rem, 1fr);align-items:stretch;height:100%;overflow:hidden}}
1
+ @container artifact-evidence (width>=44rem){.artifact-evidence-grid[data-v-d04f9a1a]{grid-template-columns:minmax(0,1.35fr) minmax(0,1fr)}.artifact-measurements[data-v-d04f9a1a]{padding-right:1.5rem}.artifact-sources[data-v-d04f9a1a]{border-top:0;border-left:1px solid var(--dashboard-border);padding-left:1.5rem}}@container source-evidence (width>=40rem){.source-evidence-row[data-v-d4528f4c]{grid-template-columns:minmax(0,1.3fr) minmax(0,1fr);column-gap:2rem}}.diagnostic-workspace[data-v-dc397ef9]{container:diagnostics/inline-size}@container diagnostics (width>=52rem){.diagnostic-columns[data-v-dc397ef9]{grid-template-columns:17rem minmax(0,1fr)}.diagnostic-index[data-v-dc397ef9]{border-right:1px solid var(--dashboard-border);border-bottom:0;align-self:stretch}}@container diagnostics (width>=76rem){.diagnostic-columns[data-v-dc397ef9]{grid-template-columns:20rem minmax(0,1fr);gap:0}.diagnostic-verification[data-v-dc397ef9]{grid-template-columns:repeat(2,minmax(0,1fr))}}.investigation-panel[data-v-daaf89ae]{container:investigation-panel/inline-size}.task-option[data-v-daaf89ae]{background:var(--dashboard-panel);border-color:var(--dashboard-border)}.task-option[data-v-daaf89ae]:hover{background:var(--dashboard-panel-muted)}.task-option[aria-pressed=true][data-v-daaf89ae]{background:var(--dashboard-accent-soft);border-color:var(--dashboard-accent);box-shadow:inset 2px 0 var(--dashboard-accent)}@container investigation-panel (width>=44rem){.investigation-layout[data-v-daaf89ae]{grid-template-columns:minmax(0,1.4fr) minmax(12rem,.6fr)}}.content-reader[data-v-02c96028]{min-width:0}.content-toolbar[data-v-02c96028]{flex-wrap:wrap;justify-content:space-between;gap:12px;display:flex}.content-toolbar h3[data-v-02c96028]{margin:0;font-size:15px;font-weight:550}.content-toolbar p[data-v-02c96028]{max-width:680px;color:var(--dashboard-text-muted);margin:8px 0 0;font-size:13px;line-height:1.6}.content-actions[data-v-02c96028]{flex-wrap:wrap;align-items:flex-start;gap:8px;display:flex}.content-actions button[data-v-02c96028]{min-height:38px;color:var(--dashboard-text);background:var(--dashboard-panel);border:1px solid var(--dashboard-border);border-radius:6px;padding:7px 10px}.content-actions button[data-v-02c96028]:disabled{opacity:.5}.content-message[data-v-02c96028]{background:var(--dashboard-panel-muted);border-left:2px solid var(--dashboard-accent);margin:12px 0;padding:10px 12px;font-size:13px;line-height:1.6}.content-paths[data-v-02c96028]{color:var(--dashboard-text-muted);margin:12px 0;font-size:12px}.content-paths p[data-v-02c96028]{margin:6px 0}.content-paths code[data-v-02c96028]{font-family:var(--dashboard-code);overflow-wrap:anywhere}.editor-frame[data-v-02c96028]{background:var(--dashboard-panel);border:1px solid var(--dashboard-border);border-radius:6px;min-width:0;height:420px;position:relative;overflow:hidden}.editor-host[data-v-02c96028]{position:absolute;inset:0}.build-changes h3[data-v-41651bdc]{margin:0 0 12px;font-size:15px;font-weight:550}.change-note[data-v-41651bdc]{color:var(--dashboard-text-muted);margin:12px 0;font-size:13px;line-height:1.7}.change-metrics[data-v-41651bdc]{grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:16px;margin:18px 0;display:grid}.change-metric[data-v-41651bdc]{background:var(--dashboard-panel);border:1px solid var(--dashboard-border);border-radius:6px;padding:12px}.change-metric dt[data-v-41651bdc]{color:var(--dashboard-text-muted);font-size:13px}.change-metric dd[data-v-41651bdc]{font-variant-numeric:tabular-nums;gap:8px;margin:10px 0 0;font-size:13px;display:grid}.change-metric strong[data-v-41651bdc]{margin-top:4px;font-size:18px;font-weight:500}.object-evidence[data-v-344f4442]{grid-template-columns:minmax(0,1fr) minmax(0,.8fr);gap:28px;display:grid}.object-evidence h3[data-v-344f4442]{margin:0 0 16px;font-size:15px;font-weight:550}.evidence-facts[data-v-344f4442]{flex-wrap:wrap;gap:18px 28px;margin:0;display:flex}.evidence-facts dt[data-v-344f4442],.evidence-context dt[data-v-344f4442]{color:var(--dashboard-text-soft);margin-bottom:5px;font-size:12px}.evidence-facts dd[data-v-344f4442]{font-variant-numeric:tabular-nums;margin:0;font-size:18px}.evidence-note[data-v-344f4442],.evidence-context p[data-v-344f4442]{color:var(--dashboard-text-muted);margin:16px 0 0;font-size:13px;line-height:1.7}.evidence-context[data-v-344f4442]{border-left:1px solid var(--dashboard-border);padding-left:24px}.evidence-context dl[data-v-344f4442]{gap:12px;margin:0;display:grid}.evidence-context dd[data-v-344f4442]{margin:0;font-size:13px}.evidence-context code[data-v-344f4442]{font-family:var(--dashboard-code);overflow-wrap:anywhere}.evidence-context button[data-v-344f4442]{min-height:40px;color:var(--dashboard-accent);text-align:left;text-underline-offset:4px;background:0 0;border:0;margin-top:12px;padding:5px 0;font-size:13px;text-decoration:underline;display:block}@media (width<=760px){.object-evidence[data-v-344f4442]{grid-template-columns:minmax(0,1fr)}.evidence-context[data-v-344f4442]{border-top:1px solid var(--dashboard-border);border-left:0;padding-top:18px;padding-left:0}}.relation-lane[data-v-375c9747]{z-index:1;min-width:0;position:relative}.lane-heading[data-v-375c9747]{gap:8px;margin-bottom:12px;display:grid}.lane-heading h3[data-v-375c9747]{margin:0;font-size:13px;font-weight:500}.lane-number[data-v-375c9747]{font-family:var(--dashboard-code);color:var(--dashboard-accent);margin-right:9px}.lane-count[data-v-375c9747]{color:var(--dashboard-text-soft);margin-left:6px}.lane-search input[data-v-375c9747]{width:100%;min-width:0;height:38px;color:var(--dashboard-text);background:var(--dashboard-bg);border:1px solid var(--dashboard-border);border-radius:6px;padding:8px 10px;font-size:13px}.lane-nodes[data-v-375c9747]{scrollbar-gutter:stable;scrollbar-color:var(--dashboard-border-strong) transparent;scrollbar-width:thin;align-content:start;gap:4px;max-height:392px;padding:4px;display:grid;position:relative;overflow-y:auto}.relation-node[data-v-375c9747]{width:100%;min-height:76px;color:var(--dashboard-text);text-align:left;background:var(--dashboard-panel);border:1px solid #0000;border-radius:4px;flex-direction:column;justify-content:center;gap:3px;padding:8px;transition:border-color .12s,background-color .12s;display:flex}.relation-node[data-v-375c9747]:hover{background:var(--dashboard-panel-muted);border-color:var(--dashboard-border-strong)}.relation-node[aria-pressed=true][data-v-375c9747]{background:var(--dashboard-accent-soft);border-color:var(--dashboard-accent);box-shadow:inset 3px 0 var(--dashboard-accent)}.node-type[data-v-375c9747],.node-facts[data-v-375c9747]{color:var(--dashboard-text-muted);flex-wrap:wrap;justify-content:space-between;gap:4px 8px;font-size:12px;display:flex}.node-type[data-v-375c9747]{flex-wrap:nowrap;align-items:baseline}.node-type>span[data-v-375c9747]:not(.node-context){flex-shrink:0}.selected-marker[data-v-375c9747]{color:var(--dashboard-accent)}.node-path[data-v-375c9747]{-webkit-line-clamp:2;font-family:var(--dashboard-code);overflow-wrap:anywhere;-webkit-box-orient:vertical;font-size:13px;line-height:1.4;display:-webkit-box;overflow:hidden}.node-facts strong[data-v-375c9747]{font-variant-numeric:tabular-nums;color:var(--dashboard-text);font-size:13px;font-weight:500}.node-context[data-v-375c9747]{text-overflow:ellipsis;min-width:0;color:var(--dashboard-text-soft);white-space:nowrap;flex:1;font-size:12px;overflow:hidden}.lane-empty[data-v-375c9747]{color:var(--dashboard-text-muted);border:1px dashed var(--dashboard-border);border-radius:6px;margin:0;padding:24px 12px;font-size:13px}@media (width<=760px){.lane-nodes[data-v-375c9747]{max-height:320px}.relation-node[data-v-375c9747]{min-height:76px}.node-path[data-v-375c9747]{display:block}.node-context[data-v-375c9747]{overflow-wrap:anywhere;white-space:normal}}@media (prefers-reduced-motion:reduce){.relation-node[data-v-375c9747]{transition:none}}.relation-wires[data-v-0f049a39]{pointer-events:none;width:100%;height:100%;position:absolute;inset:0;overflow:visible}.relation-wires path[data-v-0f049a39]{fill:none;stroke:var(--dashboard-border-strong);stroke-width:1.3px;vector-effect:non-scaling-stroke;transition:stroke .12s,stroke-width .12s}.relation-wires path.active[data-v-0f049a39]{stroke:var(--dashboard-accent);stroke-width:1.8px}@keyframes relation-flow-0f049a39{to{stroke-dashoffset:-24px}}@media (prefers-reduced-motion:no-preference){.relation-wires path.active[data-v-0f049a39]{stroke-linecap:round;stroke-dasharray:6 6;animation:1.2s linear infinite relation-flow-0f049a39}}@media (width<=760px){.relation-wires[data-v-0f049a39]{display:none}}@media (prefers-reduced-motion:reduce){.relation-wires path[data-v-0f049a39]{transition:none}}.relation-grid[data-v-284ff41f]{grid-template-columns:minmax(140px,.7fr) minmax(190px,1fr) minmax(220px,1.15fr);gap:42px;display:grid;position:relative}.relation-caption[data-v-284ff41f]{color:var(--dashboard-text-soft);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 16px;padding:8px 0;font-size:12px;display:flex}.legend-line[data-v-284ff41f]{vertical-align:4px;background:var(--dashboard-accent);width:20px;height:1px;margin-right:8px;display:inline-block}.relation-caption button[data-v-284ff41f]{min-height:38px;color:var(--dashboard-accent);border:1px solid var(--dashboard-border);background:0 0;border-radius:6px;padding:6px 10px}@media (width<=1050px){.relation-grid[data-v-284ff41f]{grid-template-columns:minmax(0,.8fr) minmax(0,1fr) minmax(0,1.1fr);gap:24px}}@media (width<=760px){.relation-grid[data-v-284ff41f]{grid-template-columns:minmax(0,1fr);gap:24px}}.object-workbench[data-v-5c3069c3]{min-width:0;color:var(--dashboard-text);padding:4px 0 20px}.workbench-heading[data-v-5c3069c3]{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;padding:8px 0 12px;display:flex}.workbench-heading>div[data-v-5c3069c3]{flex:1;min-width:0}.workbench-heading h2[data-v-5c3069c3]{letter-spacing:-.4px;margin:0 0 6px;font-size:21px;font-weight:600}.current-object[data-v-5c3069c3]{align-items:baseline;gap:10px;margin:0;font-size:13px;display:flex}.current-object span[data-v-5c3069c3]{color:var(--dashboard-accent);flex-shrink:0}.current-object code[data-v-5c3069c3]{font-family:var(--dashboard-code);overflow-wrap:anywhere}.context-line[data-v-5c3069c3]{color:var(--dashboard-text-muted);margin:6px 0 0;font-size:12px;line-height:1.6}.inspect-button[data-v-5c3069c3]{min-height:40px;color:var(--dashboard-accent);background:0 0;border:0;padding:8px;font-size:13px}.investigate-button[data-v-5c3069c3]{min-height:40px;color:var(--dashboard-text);background:var(--dashboard-accent-soft);border:1px solid var(--dashboard-accent);border-radius:6px;padding:9px 15px;font-size:13px;font-weight:600}.investigate-button[data-v-5c3069c3]:disabled{opacity:.5}.workbench-notice[data-v-5c3069c3]{background:var(--dashboard-panel);border-left:2px solid var(--dashboard-accent);margin:0 0 16px;padding:12px 15px;font-size:13px;line-height:1.7}.stage-heading[data-v-5c3069c3]{border-top:1px solid var(--dashboard-border);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;padding:8px 0;display:flex}.stage-heading h3[data-v-5c3069c3]{margin:0;font-size:14px;font-weight:550}.stage-heading p[data-v-5c3069c3]{color:var(--dashboard-text-soft);margin:6px 0 0;font-size:12px}.package-filter[data-v-5c3069c3]{width:260px;max-width:100%}.context-dock[data-v-5c3069c3]{background:var(--dashboard-shell);border-top:2px solid var(--dashboard-border-strong);scroll-margin-top:12px}.dock-toolbar[data-v-5c3069c3]{border-bottom:1px solid var(--dashboard-border);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px 18px;padding:0 18px;display:flex}.dock-tabs[data-v-5c3069c3]{flex-wrap:wrap;gap:20px;display:flex}.dock-tabs button[data-v-5c3069c3]{min-height:46px;color:var(--dashboard-text-muted);background:0 0;border:0;border-bottom:2px solid #0000;padding:12px 0 10px;font-size:13px}.dock-tabs button[aria-pressed=true][data-v-5c3069c3]{color:var(--dashboard-text);border-bottom-color:var(--dashboard-accent)}.dock-status[data-v-5c3069c3]{color:var(--dashboard-text-soft);padding:8px 0;font-size:12px}.dock-body[data-v-5c3069c3]{padding:20px;font-size:13px}.content-note[data-v-5c3069c3]{color:var(--dashboard-text-muted);margin:0 0 14px;line-height:1.7}@media (width<=760px){.workbench-heading>div[data-v-5c3069c3]{flex-basis:100%}.dock-body[data-v-5c3069c3]{padding:16px 12px}.dock-toolbar[data-v-5c3069c3]{padding:0 12px}.dock-tabs[data-v-5c3069c3]{gap:16px}}.package-health[data-v-d5476e17]{container:package-health/inline-size}.package-health-item[data-v-d5476e17]{grid-template:"kind status""name name""detail detail""risk score"/minmax(0,1fr) auto;align-items:baseline;gap:0 .75rem;min-width:0;padding:1rem;display:grid}.package-health-item+.package-health-item[data-v-d5476e17]{border-top:1px solid var(--dashboard-border)}.package-health-kind[data-v-d5476e17]{grid-area:kind}.package-health-status[data-v-d5476e17]{grid-area:status;justify-self:end;align-items:center;gap:.375rem;display:inline-flex}.package-health-name[data-v-d5476e17]{overflow-wrap:anywhere;grid-area:name;min-width:0;margin-top:.25rem}.package-health-detail[data-v-d5476e17]{grid-area:detail;margin-top:.375rem}.package-health-score[data-v-d5476e17]{white-space:nowrap;grid-area:score;align-self:center;margin-top:.75rem;font-size:1.625rem;line-height:1.15}.package-health-risk[data-v-d5476e17]{overflow-wrap:anywhere;grid-area:risk;align-self:center;min-width:0;margin-top:.75rem}@container package-health (width>=22.5rem){.package-health-item[data-v-d5476e17]{grid-template-areas:"kind status""name score""detail score""risk risk"}.package-health-score[data-v-d5476e17]{margin-top:.25rem}.package-health-risk[data-v-d5476e17]{margin-top:.375rem}}@container package-health (width>=45rem){.package-health-items[data-v-d5476e17]{grid-auto-columns:minmax(0,1fr);grid-auto-flow:column;padding-block:1rem;display:grid}.package-health-item[data-v-d5476e17]{grid-template:"kind status""name name""detail detail"1fr"score risk"/auto minmax(0,1fr);padding-block:0}.package-health-item+.package-health-item[data-v-d5476e17]{border-top:0;border-left:1px solid var(--dashboard-border)}.package-health-score[data-v-d5476e17]{margin-top:.875rem;font-size:1.75rem}.package-health-risk[data-v-d5476e17]{text-align:right;align-self:end;margin-top:.875rem}}