aitu-app 0.5.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/.DS_Store +0 -0
  2. package/README.md +47 -0
  3. package/_headers +84 -0
  4. package/_redirects +2 -0
  5. package/assets/ChatMessagesArea-CkUX81uB.js +251 -0
  6. package/assets/ChatMessagesArea-Di0Z80Zh.css +1 -0
  7. package/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  8. package/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  9. package/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  10. package/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  11. package/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  12. package/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  13. package/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  14. package/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  15. package/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  16. package/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  17. package/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  18. package/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  19. package/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  20. package/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  21. package/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  22. package/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  23. package/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  24. package/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  25. package/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  26. package/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  27. package/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  28. package/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  29. package/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  30. package/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  31. package/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  32. package/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  33. package/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  34. package/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  35. package/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  36. package/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  37. package/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  38. package/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  39. package/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  40. package/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  41. package/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  42. package/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  43. package/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  44. package/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  45. package/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  46. package/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  47. package/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  48. package/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  49. package/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  50. package/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  51. package/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  52. package/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  53. package/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  54. package/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  55. package/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  56. package/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  57. package/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  58. package/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  59. package/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  60. package/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  61. package/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  62. package/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  63. package/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  64. package/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  65. package/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  66. package/assets/Tableau10-B-NsZVaP.js +1 -0
  67. package/assets/Tableau10-Dnlau_Wv.js +1 -0
  68. package/assets/ToolboxDrawer-By1XMh8B.js +87 -0
  69. package/assets/ToolboxDrawer-fPqvDLQE.css +1 -0
  70. package/assets/__vite-browser-external-BIHI7g3E.js +1 -0
  71. package/assets/ai-analyze-Db-iXol6.js +1 -0
  72. package/assets/arc-BZXVqUcI.js +1 -0
  73. package/assets/arc-ajYHRRnk.js +1 -0
  74. package/assets/array-B5oSNiGi.js +1 -0
  75. package/assets/array-BKyUJesY.js +1 -0
  76. package/assets/batch-image-generation-Baqb01Lm.js +6 -0
  77. package/assets/batch-image-generation-CbLMWmjk.css +1 -0
  78. package/assets/blockDiagram-38ab4fdb-BT3H_WVv.js +118 -0
  79. package/assets/blockDiagram-38ab4fdb-u0xYP3Lt.js +118 -0
  80. package/assets/c4Diagram-3d4e48cf-CBvM6zjM.js +10 -0
  81. package/assets/c4Diagram-3d4e48cf-WOIEVidH.js +10 -0
  82. package/assets/channel-BP25wTsw.js +1 -0
  83. package/assets/channel-HzrLNFUg.js +1 -0
  84. package/assets/classDiagram-70f12bd4-BMutcvFi.js +2 -0
  85. package/assets/classDiagram-70f12bd4-Cl9U1r5F.js +2 -0
  86. package/assets/classDiagram-v2-f2320105-C0agtbR4.js +2 -0
  87. package/assets/classDiagram-v2-f2320105-tCBzATK6.js +2 -0
  88. package/assets/clone-B69pF7Y_.js +1 -0
  89. package/assets/clone-oX7o-l4R.js +1 -0
  90. package/assets/createText-2e5e7dd3-CZ9_fscE.js +5 -0
  91. package/assets/createText-2e5e7dd3-idrqgJjU.js +7 -0
  92. package/assets/edges-e0da2a9e-C-RyePMV.js +4 -0
  93. package/assets/edges-e0da2a9e-DJXAjJSL.js +4 -0
  94. package/assets/erDiagram-9861fffd-DWJR_3zL.js +51 -0
  95. package/assets/erDiagram-9861fffd-x2Kcy95-.js +51 -0
  96. package/assets/flowDb-956e92f1-BgKjOIdz.js +10 -0
  97. package/assets/flowDb-956e92f1-CF6y18Tn.js +10 -0
  98. package/assets/flowDiagram-66a62f08-BPPw0wPU.js +4 -0
  99. package/assets/flowDiagram-66a62f08-CSAllSFf.js +4 -0
  100. package/assets/flowDiagram-v2-96b9c2cf-B-UGyXRi.js +1 -0
  101. package/assets/flowDiagram-v2-96b9c2cf-Cm596kxZ.js +1 -0
  102. package/assets/flowchart-elk-definition-4a651766-9XSRJbsr.js +139 -0
  103. package/assets/flowchart-elk-definition-4a651766-DWFN9DN3.js +139 -0
  104. package/assets/ganttDiagram-c361ad54-D9tbz9tQ.js +257 -0
  105. package/assets/ganttDiagram-c361ad54-ot5pUYpT.js +257 -0
  106. package/assets/gitGraphDiagram-72cf32ee-BFV3Mt8C.js +70 -0
  107. package/assets/gitGraphDiagram-72cf32ee-C6qFzgGh.js +70 -0
  108. package/assets/graph-BxwlF7JS.js +1 -0
  109. package/assets/graph-D-2Ldvxg.js +1 -0
  110. package/assets/grid-image-cM9AmYC8.js +1 -0
  111. package/assets/has-CgdIPiQG.js +1 -0
  112. package/assets/hasIn-4iY02rGN.js +1 -0
  113. package/assets/index-3862675e-CVZnpwDN.js +1 -0
  114. package/assets/index-3862675e-DqdI9cab.js +1 -0
  115. package/assets/index-B2dvADz8.css +1 -0
  116. package/assets/index-BicRPzXC.js +1 -0
  117. package/assets/index-Bs7-jmv6.css +1 -0
  118. package/assets/index-BwSGXyRr.js +99 -0
  119. package/assets/index-C1XdOOAn.css +1 -0
  120. package/assets/index-C4AKKbpQ.css +1 -0
  121. package/assets/index-CkpXFt8n.js +1 -0
  122. package/assets/index-CrxF9gFe.js +42 -0
  123. package/assets/index-DBWqXBIQ.js +93 -0
  124. package/assets/index-DI_5V2-m.js +3 -0
  125. package/assets/index-DWUAFoZG.js +2064 -0
  126. package/assets/index-Dn0YtZ2R.js +3 -0
  127. package/assets/index-e05Rs4M6.js +12 -0
  128. package/assets/index.dom-C3-224fz.js +1 -0
  129. package/assets/infoDiagram-f8f76790-CnrpwoOt.js +7 -0
  130. package/assets/infoDiagram-f8f76790-FKC1Sy9Y.js +7 -0
  131. package/assets/init-A0kIFD9x.js +1 -0
  132. package/assets/init-Gi6I4Gst.js +1 -0
  133. package/assets/inspiration-board-B_-BBBHt.js +1 -0
  134. package/assets/isEmpty-Dj2GV0v-.js +1 -0
  135. package/assets/journeyDiagram-49397b02-B7fP21sU.js +139 -0
  136. package/assets/journeyDiagram-49397b02-Dp3X9XWq.js +139 -0
  137. package/assets/katex-BbEIqZs1.js +261 -0
  138. package/assets/katex-Cu_Erd72.js +261 -0
  139. package/assets/layout-BD3yCK_X.js +1 -0
  140. package/assets/layout-DHHYqX7p.js +1 -0
  141. package/assets/line-B3bNrkzn.js +1 -0
  142. package/assets/line-B86HLuqu.js +1 -0
  143. package/assets/linear-DU2Ciymb.js +1 -0
  144. package/assets/linear-wCAlMhOS.js +1 -0
  145. package/assets/mermaid.core-DfVvnpgz.js +91 -0
  146. package/assets/mindmap-definition-fc14e90a-D1sxE3xG.js +425 -0
  147. package/assets/mindmap-definition-fc14e90a-YuSOJC7P.js +425 -0
  148. package/assets/ordinal-BRr1uYdk.js +1 -0
  149. package/assets/ordinal-Cboi1Yqb.js +1 -0
  150. package/assets/path-CY0bYimO.js +1 -0
  151. package/assets/path-CbwjOpE9.js +1 -0
  152. package/assets/photo-wall-splitter-BVU2e0aS.js +1 -0
  153. package/assets/pick-Cvlwra4g.js +1 -0
  154. package/assets/pieDiagram-8a3498a8-B6mJUqro.js +35 -0
  155. package/assets/pieDiagram-8a3498a8-B91bWgo_.js +35 -0
  156. package/assets/quadrantDiagram-120e2f19-BxS8fQEz.js +7 -0
  157. package/assets/quadrantDiagram-120e2f19-DwudONqx.js +7 -0
  158. package/assets/requirementDiagram-deff3bca-DygaMIoy.js +52 -0
  159. package/assets/requirementDiagram-deff3bca-v9xlgfS8.js +52 -0
  160. package/assets/sankeyDiagram-04a897e0-BV23dp4l.js +8 -0
  161. package/assets/sankeyDiagram-04a897e0-BXCiXiyw.js +8 -0
  162. package/assets/sequenceDiagram-704730f1-CObRpNi4.js +122 -0
  163. package/assets/sequenceDiagram-704730f1-Ck69A6wI.js +122 -0
  164. package/assets/settings-dialog-BlCO49C4.js +1 -0
  165. package/assets/settings-dialog-QUxXj54T.css +1 -0
  166. package/assets/stateDiagram-587899a1-J_G6I0oo.js +1 -0
  167. package/assets/stateDiagram-587899a1-z-tKclr3.js +1 -0
  168. package/assets/stateDiagram-v2-d93cdb3a-DsThtOzP.js +1 -0
  169. package/assets/stateDiagram-v2-d93cdb3a-XIvq5t8a.js +1 -0
  170. package/assets/styles-6aaf32cf-1fjuNMUk.js +207 -0
  171. package/assets/styles-6aaf32cf-DT2rVNfQ.js +207 -0
  172. package/assets/styles-9a916d00-fLeUSina.js +160 -0
  173. package/assets/styles-9a916d00-q64Umkis.js +160 -0
  174. package/assets/styles-c10674c1-BWlxVc3Q.js +116 -0
  175. package/assets/styles-c10674c1-CtYpjMYU.js +116 -0
  176. package/assets/svgDrawCommon-08f97a94-C_DhKfny.js +1 -0
  177. package/assets/svgDrawCommon-08f97a94-DSBqmUv2.js +1 -0
  178. package/assets/timeline-definition-85554ec2-AKpzwLPN.js +61 -0
  179. package/assets/timeline-definition-85554ec2-dTkYwoLF.js +61 -0
  180. package/assets/ttd-dialog-CxiaIUuJ.js +47 -0
  181. package/assets/ttd-dialog-DCapefb6.css +1 -0
  182. package/assets/upload-4sxUU7q_.js +1 -0
  183. package/assets/video-recovery-service-BckHbSyK.js +1 -0
  184. package/assets/web-vitals-DcvjKPr-.js +1 -0
  185. package/assets/winbox.bundle.min-CoRPjCs5.js +1 -0
  186. package/assets/xlsx-CkFp8p6R.js +105 -0
  187. package/assets/xychartDiagram-e933f94c-DCmvL0ag.js +7 -0
  188. package/assets/xychartDiagram-e933f94c-aqOiXp_u.js +7 -0
  189. package/batch-image.html +1616 -0
  190. package/favicon.ico +0 -0
  191. package/icons/README.md +55 -0
  192. package/icons/aitu10.png +0 -0
  193. package/icons/android-chrome-192x192.png +0 -0
  194. package/icons/android-chrome-512x512.png +0 -0
  195. package/icons/apple-touch-icon.png +0 -0
  196. package/icons/favicon-16x16.png +0 -0
  197. package/icons/favicon-16x16.svg +539 -0
  198. package/icons/favicon-32x32.png +0 -0
  199. package/icons/favicon-32x32.svg +539 -0
  200. package/icons/favicon-new.svg +539 -0
  201. package/icons/favicon-new.svg.png +0 -0
  202. package/icons/icon-192x192.svg +539 -0
  203. package/icons/icon-512x512.svg +539 -0
  204. package/icons/icon-96x96.png +0 -0
  205. package/icons/icon-96x96.svg +539 -0
  206. package/iframe-test.html +340 -0
  207. package/index.html +105 -0
  208. package/init.json +6 -0
  209. package/logo/cardid.jpg +0 -0
  210. package/logo/group-qr.png +0 -0
  211. package/logo/logo_drawnix_h.svg +539 -0
  212. package/logo/logo_drawnix_h_dark.svg +539 -0
  213. package/logo/logo_drawnix_new.svg +539 -0
  214. package/manifest.json +52 -0
  215. package/package.json +31 -0
  216. package/product_showcase/aitu-01.png +0 -0
  217. package/product_showcase/aitu-02.png +0 -0
  218. package/product_showcase/aitu-03.png +0 -0
  219. package/product_showcase/aitu-04.png +0 -0
  220. package/product_showcase/aitu-05.png +0 -0
  221. package/product_showcase/aitu-06.png +0 -0
  222. package/product_showcase/case-1.png +0 -0
  223. package/product_showcase/case-2.png +0 -0
  224. package/robots.txt +13 -0
  225. package/sitemap.xml +29 -0
  226. package/sw-debug/app.js +3069 -0
  227. package/sw-debug/console-entry.js +80 -0
  228. package/sw-debug/log-entry.js +452 -0
  229. package/sw-debug/log-panel.js +309 -0
  230. package/sw-debug/postmessage-entry.js +117 -0
  231. package/sw-debug/status-panel.js +125 -0
  232. package/sw-debug/styles.css +2103 -0
  233. package/sw-debug/sw-communication.js +208 -0
  234. package/sw-debug/utils.js +112 -0
  235. package/sw-debug.html +685 -0
  236. package/sw.js +58 -0
  237. package/version.json +10 -0
package/sw-debug.html ADDED
@@ -0,0 +1,685 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Service Worker 调试面板</title>
7
+ <link rel="stylesheet" href="./sw-debug/styles.css">
8
+ </head>
9
+ <body>
10
+ <header>
11
+ <h1>
12
+ <span class="icon">⚙️</span>
13
+ Service Worker 调试面板
14
+ <span id="swStatus" class="status-indicator inactive">
15
+ <span class="dot"></span>
16
+ <span class="text">未连接</span>
17
+ </span>
18
+ </h1>
19
+ <div class="header-actions">
20
+ <button id="toggleTheme" class="icon-btn" title="切换深色/浅色主题">
21
+ <svg id="themeIcon" class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
22
+ <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>
23
+ </svg>
24
+ </button>
25
+ <button id="toggleDebug" class="danger">
26
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
27
+ <rect x="6" y="4" width="4" height="16"/><rect x="14" y="4" width="4" height="16"/>
28
+ </svg>
29
+ 停止调试
30
+ </button>
31
+ <button id="exportLogs" class="success">
32
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
33
+ <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3"/>
34
+ </svg>
35
+ 导出日志
36
+ </button>
37
+
38
+ <!-- 设置弹窗 -->
39
+ <div class="export-modal-overlay" id="settingsModalOverlay" style="display: none;">
40
+ <div class="export-modal" style="max-width: 450px;">
41
+ <div class="export-modal-header">
42
+ <h3>⚙️ 日志设置</h3>
43
+ <button class="close-btn" id="closeSettingsModal">&times;</button>
44
+ </div>
45
+ <div class="export-modal-content" style="padding: 16px;">
46
+ <div class="setting-group">
47
+ <label class="setting-label">日志最大保留条数</label>
48
+ <select id="settingMaxLogs" style="width: 100%; padding: 8px; border-radius: 4px; border: 1px solid var(--border-color);">
49
+ <option value="200">200 条</option>
50
+ <option value="500" selected>500 条(默认)</option>
51
+ <option value="1000">1000 条</option>
52
+ <option value="2000">2000 条</option>
53
+ </select>
54
+ </div>
55
+ <div class="setting-group" style="margin-top: 16px;">
56
+ <label class="setting-label">自动清理超过指定时间的日志</label>
57
+ <select id="settingAutoClean" style="width: 100%; padding: 8px; border-radius: 4px; border: 1px solid var(--border-color);">
58
+ <option value="0" selected>不自动清理</option>
59
+ <option value="30">30 分钟前</option>
60
+ <option value="60">1 小时前</option>
61
+ <option value="120">2 小时前</option>
62
+ </select>
63
+ </div>
64
+ <div class="setting-group" style="margin-top: 16px;">
65
+ <label style="display: flex; align-items: center; cursor: pointer;">
66
+ <input type="checkbox" id="settingKeepBookmarks" checked style="margin-right: 8px;">
67
+ 自动清理时保留收藏的日志
68
+ </label>
69
+ </div>
70
+ <div style="margin-top: 20px; text-align: right;">
71
+ <button id="saveSettings" class="primary" style="padding: 8px 24px;">保存</button>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>
76
+
77
+ <!-- 快捷键帮助弹窗 -->
78
+ <div class="export-modal-overlay" id="shortcutsModalOverlay" style="display: none;">
79
+ <div class="export-modal" style="max-width: 400px;">
80
+ <div class="export-modal-header">
81
+ <h3>⌨️ 键盘快捷键</h3>
82
+ <button class="close-btn" id="closeShortcutsModal">&times;</button>
83
+ </div>
84
+ <div class="export-modal-content" style="padding: 16px;">
85
+ <table style="width: 100%; border-collapse: collapse; font-size: 13px;">
86
+ <tr><td style="padding: 8px 0; width: 140px;"><kbd style="background:#e0e0e0;padding:2px 6px;border-radius:3px;">1</kbd> - <kbd style="background:#e0e0e0;padding:2px 6px;border-radius:3px;">5</kbd></td><td>切换 Tab</td></tr>
87
+ <tr><td style="padding: 8px 0;"><kbd style="background:#e0e0e0;padding:2px 6px;border-radius:3px;">Space</kbd></td><td>暂停/恢复实时日志</td></tr>
88
+ <tr><td style="padding: 8px 0;"><kbd style="background:#e0e0e0;padding:2px 6px;border-radius:3px;">Ctrl</kbd>+<kbd style="background:#e0e0e0;padding:2px 6px;border-radius:3px;">L</kbd></td><td>清空当前 Tab 日志</td></tr>
89
+ <tr><td style="padding: 8px 0;"><kbd style="background:#e0e0e0;padding:2px 6px;border-radius:3px;">Esc</kbd></td><td>关闭弹窗</td></tr>
90
+ <tr><td style="padding: 8px 0;"><kbd style="background:#e0e0e0;padding:2px 6px;border-radius:3px;">?</kbd></td><td>显示此帮助</td></tr>
91
+ </table>
92
+ </div>
93
+ </div>
94
+ </div>
95
+
96
+ <!-- 导出日志弹窗 -->
97
+ <div class="export-modal-overlay" id="exportModalOverlay">
98
+ <div class="export-modal">
99
+ <div class="export-modal-header">
100
+ <h3>📥 导出日志</h3>
101
+ <button class="export-modal-close" id="closeExportModal">&times;</button>
102
+ </div>
103
+ <div class="export-modal-body">
104
+ <!-- 全选 -->
105
+ <label class="export-checkbox export-select-all">
106
+ <input type="checkbox" id="selectAllExport">
107
+ <span>全选</span>
108
+ </label>
109
+
110
+ <!-- 基本信息 -->
111
+ <div class="export-section">
112
+ <label class="export-checkbox export-section-header">
113
+ <input type="checkbox" data-section="basic" checked>
114
+ <span>基本信息</span>
115
+ </label>
116
+ <div class="export-section-items">
117
+ <label class="export-checkbox">
118
+ <input type="checkbox" name="basic" value="swStatus" checked>
119
+ <span>SW 状态</span>
120
+ </label>
121
+ <label class="export-checkbox">
122
+ <input type="checkbox" name="basic" value="memory" checked>
123
+ <span>内存信息</span>
124
+ </label>
125
+ <label class="export-checkbox">
126
+ <input type="checkbox" name="basic" value="cache" checked>
127
+ <span>缓存信息</span>
128
+ </label>
129
+ </div>
130
+ </div>
131
+
132
+ <!-- Fetch 请求日志 -->
133
+ <div class="export-section">
134
+ <label class="export-checkbox export-section-header">
135
+ <input type="checkbox" data-section="fetch">
136
+ <span>Fetch 请求日志</span>
137
+ </label>
138
+ <div class="export-section-items">
139
+ <label class="export-checkbox">
140
+ <input type="checkbox" name="fetch" value="sw-internal">
141
+ <span>SW 内部 API</span>
142
+ </label>
143
+ <label class="export-checkbox">
144
+ <input type="checkbox" name="fetch" value="xhr">
145
+ <span>XHR/API</span>
146
+ </label>
147
+ <label class="export-checkbox">
148
+ <input type="checkbox" name="fetch" value="image">
149
+ <span>图片</span>
150
+ </label>
151
+ <label class="export-checkbox">
152
+ <input type="checkbox" name="fetch" value="video">
153
+ <span>视频</span>
154
+ </label>
155
+ <label class="export-checkbox">
156
+ <input type="checkbox" name="fetch" value="font">
157
+ <span>字体</span>
158
+ </label>
159
+ <label class="export-checkbox">
160
+ <input type="checkbox" name="fetch" value="static">
161
+ <span>静态资源</span>
162
+ </label>
163
+ <label class="export-checkbox">
164
+ <input type="checkbox" name="fetch" value="cache-url">
165
+ <span>缓存 URL</span>
166
+ </label>
167
+ <label class="export-checkbox">
168
+ <input type="checkbox" name="fetch" value="asset-library">
169
+ <span>素材库</span>
170
+ </label>
171
+ </div>
172
+ </div>
173
+
174
+ <!-- 控制台日志 -->
175
+ <div class="export-section">
176
+ <label class="export-checkbox export-section-header">
177
+ <input type="checkbox" data-section="console">
178
+ <span>控制台日志</span>
179
+ </label>
180
+ <div class="export-section-items">
181
+ <label class="export-checkbox">
182
+ <input type="checkbox" name="console" value="error">
183
+ <span>Error</span>
184
+ </label>
185
+ <label class="export-checkbox">
186
+ <input type="checkbox" name="console" value="warn">
187
+ <span>Warn</span>
188
+ </label>
189
+ <label class="export-checkbox">
190
+ <input type="checkbox" name="console" value="info">
191
+ <span>Info</span>
192
+ </label>
193
+ <label class="export-checkbox">
194
+ <input type="checkbox" name="console" value="log">
195
+ <span>Log</span>
196
+ </label>
197
+ <label class="export-checkbox">
198
+ <input type="checkbox" name="console" value="debug">
199
+ <span>Debug</span>
200
+ </label>
201
+ </div>
202
+ </div>
203
+
204
+ <!-- PostMessage 日志 -->
205
+ <div class="export-section">
206
+ <label class="export-checkbox export-section-header">
207
+ <input type="checkbox" data-section="postmessage">
208
+ <span>PostMessage 日志</span>
209
+ </label>
210
+ <div class="export-section-items">
211
+ <label class="export-checkbox">
212
+ <input type="checkbox" name="postmessage" value="send">
213
+ <span>发送 → SW</span>
214
+ </label>
215
+ <label class="export-checkbox">
216
+ <input type="checkbox" name="postmessage" value="receive">
217
+ <span>接收 ← SW</span>
218
+ </label>
219
+ </div>
220
+ </div>
221
+
222
+ <!-- LLM API 日志 -->
223
+ <div class="export-section">
224
+ <label class="export-checkbox export-section-header">
225
+ <input type="checkbox" data-section="llmapi" checked>
226
+ <span>LLM API 日志</span>
227
+ </label>
228
+ <div class="export-section-items">
229
+ <label class="export-checkbox">
230
+ <input type="checkbox" name="llmapi" value="image" checked>
231
+ <span>图片生成</span>
232
+ </label>
233
+ <label class="export-checkbox">
234
+ <input type="checkbox" name="llmapi" value="video" checked>
235
+ <span>视频生成</span>
236
+ </label>
237
+ <label class="export-checkbox">
238
+ <input type="checkbox" name="llmapi" value="chat" checked>
239
+ <span>对话</span>
240
+ </label>
241
+ <label class="export-checkbox">
242
+ <input type="checkbox" name="llmapi" value="character" checked>
243
+ <span>角色</span>
244
+ </label>
245
+ </div>
246
+ </div>
247
+
248
+ <!-- 内存日志 -->
249
+ <div class="export-section">
250
+ <label class="export-checkbox export-section-header">
251
+ <input type="checkbox" data-section="memory">
252
+ <span>内存日志</span>
253
+ </label>
254
+ <div class="export-section-items">
255
+ <label class="export-checkbox">
256
+ <input type="checkbox" name="memory" value="startup">
257
+ <span>启动快照</span>
258
+ </label>
259
+ <label class="export-checkbox">
260
+ <input type="checkbox" name="memory" value="periodic">
261
+ <span>定期快照</span>
262
+ </label>
263
+ <label class="export-checkbox">
264
+ <input type="checkbox" name="memory" value="error">
265
+ <span>错误</span>
266
+ </label>
267
+ <label class="export-checkbox">
268
+ <input type="checkbox" name="memory" value="freeze">
269
+ <span>卡死</span>
270
+ </label>
271
+ <label class="export-checkbox">
272
+ <input type="checkbox" name="memory" value="whitescreen">
273
+ <span>白屏</span>
274
+ </label>
275
+ <label class="export-checkbox">
276
+ <input type="checkbox" name="memory" value="longtask">
277
+ <span>长任务</span>
278
+ </label>
279
+ <label class="export-checkbox">
280
+ <input type="checkbox" name="memory" value="beforeunload">
281
+ <span>页面关闭</span>
282
+ </label>
283
+ </div>
284
+ </div>
285
+ </div>
286
+ <div class="export-modal-footer">
287
+ <button id="cancelExport" class="secondary">取消</button>
288
+ <button id="doExport" class="primary">确认导出</button>
289
+ </div>
290
+ </div>
291
+ </div>
292
+ <button id="clearLogs" class="danger">
293
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
294
+ <polyline points="3 6 5 6 21 6"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/>
295
+ </svg>
296
+ 清空日志
297
+ </button>
298
+ <button id="refreshStatus">
299
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
300
+ <polyline points="23 4 23 10 17 10"/><polyline points="1 20 1 14 7 14"/><path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"/>
301
+ </svg>
302
+ 刷新状态
303
+ </button>
304
+ </div>
305
+ </header>
306
+
307
+ <div class="container">
308
+ <div class="panels">
309
+ <!-- Left Panel: Status & Cache -->
310
+ <div class="left-panel">
311
+ <div class="panel">
312
+ <div class="panel-header">
313
+ SW 状态信息
314
+ </div>
315
+ <div class="panel-content">
316
+ <div class="stat-grid" id="statusGrid">
317
+ <div class="stat-item">
318
+ <span class="label">版本</span>
319
+ <span class="value" id="swVersion">-</span>
320
+ </div>
321
+ <div class="stat-item">
322
+ <span class="label">调试模式</span>
323
+ <span class="value" id="debugMode">关闭</span>
324
+ </div>
325
+ <div class="stat-item">
326
+ <span class="label">Pending 图片请求</span>
327
+ <span class="value" id="pendingImages">0</span>
328
+ </div>
329
+ <div class="stat-item">
330
+ <span class="label">Pending 视频请求</span>
331
+ <span class="value" id="pendingVideos">0</span>
332
+ </div>
333
+ <div class="stat-item">
334
+ <span class="label">视频 Blob 缓存</span>
335
+ <span class="value" id="videoBlobCache">0</span>
336
+ </div>
337
+ <div class="stat-item">
338
+ <span class="label">已完成请求缓存</span>
339
+ <span class="value" id="completedRequests">0</span>
340
+ </div>
341
+ <div class="stat-item">
342
+ <span class="label">工作流处理器</span>
343
+ <span class="value" id="workflowHandler">未初始化</span>
344
+ </div>
345
+ <div class="stat-item">
346
+ <span class="label">调试日志数</span>
347
+ <span class="value" id="debugLogsCount">0</span>
348
+ </div>
349
+ </div>
350
+
351
+ <div id="failedDomainsSection" style="margin-top: 16px; display: none;">
352
+ <div class="stat-item" style="flex-direction: column; align-items: flex-start;">
353
+ <span class="label">失败域名</span>
354
+ <div class="failed-domains" id="failedDomains"></div>
355
+ </div>
356
+ </div>
357
+ </div>
358
+ </div>
359
+
360
+ <div class="panel">
361
+ <div class="panel-header">
362
+ 内存监控
363
+ <span id="memoryUpdateTime" style="font-size: 11px; opacity: 0.6; margin-left: 10px;"></span>
364
+ </div>
365
+ <div class="panel-content">
366
+ <div class="stat-grid" id="memoryGrid">
367
+ <div class="stat-item">
368
+ <span class="label">JS 堆已使用</span>
369
+ <span class="value" id="memoryUsed">-</span>
370
+ </div>
371
+ <div class="stat-item">
372
+ <span class="label">JS 堆总大小</span>
373
+ <span class="value" id="memoryTotal">-</span>
374
+ </div>
375
+ <div class="stat-item">
376
+ <span class="label">JS 堆上限</span>
377
+ <span class="value" id="memoryLimit">-</span>
378
+ </div>
379
+ <div class="stat-item">
380
+ <span class="label">使用率</span>
381
+ <span class="value" id="memoryPercent">-</span>
382
+ </div>
383
+ </div>
384
+ <p id="memoryWarning" style="display: none; margin-top: 12px; padding: 8px; background: #fff3cd; border-radius: 4px; font-size: 12px; color: #856404;">
385
+ ⚠️ 内存使用率较高,可能导致页面崩溃
386
+ </p>
387
+ <p id="memoryNotSupported" style="display: none; margin-top: 8px; font-size: 11px; opacity: 0.6;">
388
+ 注:performance.memory 仅 Chrome 支持
389
+ </p>
390
+ </div>
391
+ </div>
392
+
393
+ <div class="panel">
394
+ <div class="panel-header">
395
+ 缓存统计
396
+ <button id="refreshCache">刷新</button>
397
+ </div>
398
+ <div class="panel-content">
399
+ <ul class="cache-list" id="cacheList">
400
+ <li class="cache-item">
401
+ <span class="name">加载中...</span>
402
+ </li>
403
+ </ul>
404
+ </div>
405
+ </div>
406
+ </div>
407
+
408
+ <!-- Right Panel: Logs -->
409
+ <div class="panel logs-panel">
410
+ <div class="tabs">
411
+ <div class="tab active" data-tab="fetch">Fetch 请求日志 <span id="fetchCount" style="opacity:0.6"></span></div>
412
+ <div class="tab" data-tab="console">控制台日志 <span id="consoleCount" style="opacity:0.6">(0)</span><span id="consoleErrorDot" class="error-dot" style="display:none"></span></div>
413
+ <div class="tab" data-tab="postmessage">PostMessage日志 <span id="postmessageCount" style="opacity:0.6">(0)</span></div>
414
+ <div class="tab" data-tab="llmapi">LLM API <span id="llmapiErrorDot" class="error-dot" style="display:none"></span></div>
415
+ <div class="tab" data-tab="crash">内存日志 <span id="crashCount" style="opacity:0.6">(0)</span><span id="crashErrorDot" class="error-dot" style="display:none"></span></div>
416
+ </div>
417
+
418
+ <!-- Fetch Logs Tab -->
419
+ <div class="tab-content active" id="fetchTab">
420
+ <div class="stats-bar" id="fetchStatsBar">
421
+ <div class="stat"><span>总请求:</span> <span class="stat-value" id="statTotalRequests">0</span></div>
422
+ <div class="stat"><span>成功率:</span> <span class="stat-value" id="statSuccessRate">-</span></div>
423
+ <div class="stat"><span>平均耗时:</span> <span class="stat-value" id="statAvgDuration">-</span></div>
424
+ <div class="stat"><span>缓存命中:</span> <span class="stat-value" id="statCacheHit">-</span></div>
425
+ <div class="stat stat-clickable" id="statSlowRequestsWrapper" title="点击过滤慢请求 (>1s)"><span>慢请求:</span> <span class="stat-value" id="statSlowRequests">0</span></div>
426
+ <div class="stat stat-chart" title="耗时分布: <100ms | 100-500ms | 500ms-1s | >1s">
427
+ <span>分布:</span>
428
+ <div class="duration-chart" id="durationChart">
429
+ <div class="chart-bar fast" id="chartFast" style="width: 0%"></div>
430
+ <div class="chart-bar medium" id="chartMedium" style="width: 0%"></div>
431
+ <div class="chart-bar slow" id="chartSlow" style="width: 0%"></div>
432
+ <div class="chart-bar very-slow" id="chartVerySlow" style="width: 0%"></div>
433
+ </div>
434
+ </div>
435
+ </div>
436
+ <div class="logs-toolbar">
437
+ <select id="filterType">
438
+ <option value="">全部类型</option>
439
+ <option value="xhr">XHR/API</option>
440
+ <option value="sw-internal" selected>SW内部API</option>
441
+ <option value="image">图片</option>
442
+ <option value="video">视频</option>
443
+ <option value="font">字体</option>
444
+ <option value="static">静态资源</option>
445
+ <option value="navigation">导航</option>
446
+ <option value="cache-url">缓存URL</option>
447
+ <option value="asset-library">素材库</option>
448
+ <option value="passthrough">放行</option>
449
+ </select>
450
+ <select id="filterStatus">
451
+ <option value="">全部状态</option>
452
+ <option value="error">❌ 失败请求</option>
453
+ <option value="200">200 OK</option>
454
+ <option value="206">206 Partial</option>
455
+ <option value="304">304 Not Modified</option>
456
+ <option value="404">404 Not Found</option>
457
+ <option value="500">5xx Error</option>
458
+ <option value="slow">慢请求 (>1s)</option>
459
+ </select>
460
+ <select id="filterTimeRange">
461
+ <option value="">全部时间</option>
462
+ <option value="5">最近 5 分钟</option>
463
+ <option value="15">最近 15 分钟</option>
464
+ <option value="30">最近 30 分钟</option>
465
+ <option value="60">最近 1 小时</option>
466
+ </select>
467
+ <input type="text" id="filterUrl" placeholder="搜索 URL...">
468
+ <label class="regex-toggle" title="启用正则表达式搜索">
469
+ <input type="checkbox" id="filterUrlRegex">
470
+ <span style="font-size: 11px; margin-left: 2px;">.*</span>
471
+ </label>
472
+ <button id="togglePause" title="暂停/恢复实时更新 (快捷键: Space)">
473
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="5 3 19 12 5 21 5 3"/></svg>
474
+ 实时
475
+ </button>
476
+ <button id="toggleSelectMode" title="批量选择模式">
477
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="9 11 12 14 22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg>
478
+ 选择
479
+ </button>
480
+ <div id="batchActions" class="batch-actions" style="display: none;">
481
+ <button id="selectAll">全选</button>
482
+ <button id="batchBookmark">
483
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
484
+ 收藏
485
+ </button>
486
+ <button id="batchDelete" class="danger">
487
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="3 6 5 6 21 6"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/></svg>
488
+ 删除
489
+ </button>
490
+ <span id="selectedCount" class="selected-count">已选 0 条</span>
491
+ </div>
492
+ <button id="copyFetchLogs" title="复制日志">
493
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>
494
+ 复制
495
+ </button>
496
+ <button id="exportFetchCSV" title="导出为 CSV">
497
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3"/></svg>
498
+ CSV
499
+ </button>
500
+ <button id="showShortcuts" class="icon-btn" title="显示快捷键帮助">
501
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="4" width="20" height="16" rx="2"/><path d="M6 8h.01M10 8h.01M14 8h.01M18 8h.01M8 12h8M6 16h.01M18 16h.01M10 16h4"/></svg>
502
+ </button>
503
+ <button id="showSettings" class="icon-btn" title="日志设置">
504
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"/></svg>
505
+ </button>
506
+ <label class="bookmark-toggle" title="只显示收藏的日志">
507
+ <input type="checkbox" id="showBookmarksOnly">
508
+ <span>⭐</span>
509
+ </label>
510
+ <label class="switch-toggle">
511
+ <span class="switch-label">自动滚动</span>
512
+ <input type="checkbox" id="autoScroll" checked>
513
+ <span class="switch-slider"></span>
514
+ </label>
515
+ </div>
516
+ <div class="logs-container" id="logsContainer">
517
+ <div class="empty-state">
518
+ <span class="icon">📋</span>
519
+ <p>暂无日志,请先启用调试模式</p>
520
+ <button id="enableDebugBtn" class="primary">启用调试</button>
521
+ </div>
522
+ </div>
523
+ </div>
524
+
525
+ <!-- Console Logs Tab -->
526
+ <div class="tab-content" id="consoleTab">
527
+ <div class="logs-toolbar">
528
+ <select id="filterConsoleLevel">
529
+ <option value="">全部级别</option>
530
+ <option value="error">Error</option>
531
+ <option value="warn">Warn</option>
532
+ <option value="info">Info</option>
533
+ <option value="log">Log</option>
534
+ <option value="debug">Debug</option>
535
+ </select>
536
+ <input type="text" id="filterConsoleText" placeholder="搜索日志内容...">
537
+ <button id="clearConsoleLogs">
538
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="3 6 5 6 21 6"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/></svg>
539
+ 清空
540
+ </button>
541
+ <button id="copyConsoleLogs">
542
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>
543
+ 复制
544
+ </button>
545
+ </div>
546
+ <div class="logs-container" id="consoleContainer">
547
+ <div id="consoleLogsContainer">
548
+ <div class="empty-state">
549
+ <span class="icon">📝</span>
550
+ <p>暂无控制台日志</p>
551
+ <p style="font-size: 12px; opacity: 0.7;">warn/error 始终捕获;开启调试后也捕获 log/info/debug(仅在调试模式启用时完整记录)</p>
552
+ </div>
553
+ </div>
554
+ </div>
555
+ </div>
556
+
557
+ <!-- PostMessage Logs Tab -->
558
+ <div class="tab-content" id="postmessageTab">
559
+ <div class="logs-toolbar">
560
+ <select id="filterMessageDirection">
561
+ <option value="">全部方向</option>
562
+ <option value="send">发送 → SW</option>
563
+ <option value="receive">接收 ← SW</option>
564
+ </select>
565
+ <select id="filterMessageTypeSelect">
566
+ <option value="">全部消息类型</option>
567
+ </select>
568
+ <select id="filterPmTimeRange">
569
+ <option value="">全部时间</option>
570
+ <option value="5">最近 5 分钟</option>
571
+ <option value="15">最近 15 分钟</option>
572
+ <option value="30">最近 30 分钟</option>
573
+ </select>
574
+ <input type="text" id="filterMessageType" placeholder="搜索消息类型...">
575
+ <button id="clearPostmessageLogs">
576
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="3 6 5 6 21 6"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/></svg>
577
+ 清空
578
+ </button>
579
+ <button id="copyPostmessageLogs">
580
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>
581
+ 复制
582
+ </button>
583
+ </div>
584
+ <div class="logs-container" id="postmessageContainer">
585
+ <div id="postmessageLogsContainer">
586
+ <div class="empty-state">
587
+ <span class="icon">📨</span>
588
+ <p>暂无 PostMessage 日志</p>
589
+ <p style="font-size: 12px; opacity: 0.7;">记录主线程与 Service Worker 之间的消息通信(仅在调试模式启用时记录)</p>
590
+ </div>
591
+ </div>
592
+ </div>
593
+ </div>
594
+
595
+ <!-- LLM API Logs Tab -->
596
+ <div class="tab-content" id="llmapiTab">
597
+ <div class="logs-toolbar">
598
+ <select id="filterLLMApiType">
599
+ <option value="">全部类型</option>
600
+ <option value="image">图片生成</option>
601
+ <option value="video">视频生成</option>
602
+ <option value="chat">对话</option>
603
+ <option value="character">角色</option>
604
+ </select>
605
+ <select id="filterLLMApiStatus">
606
+ <option value="">全部状态</option>
607
+ <option value="success">成功</option>
608
+ <option value="error">失败</option>
609
+ <option value="pending">进行中</option>
610
+ </select>
611
+ <button id="refreshLLMApiLogs">
612
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="23 4 23 10 17 10"/><polyline points="1 20 1 14 7 14"/><path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"/></svg>
613
+ 刷新
614
+ </button>
615
+ <button id="copyLLMApiLogs">
616
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>
617
+ 复制
618
+ </button>
619
+ <button id="exportLLMApiLogs" class="success">
620
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3"/></svg>
621
+ 导出
622
+ </button>
623
+ <button id="clearLLMApiLogs">
624
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="3 6 5 6 21 6"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/></svg>
625
+ 清空
626
+ </button>
627
+ </div>
628
+ <div class="logs-container" id="llmapiContainer">
629
+ <div id="llmapiLogsContainer">
630
+ <div class="empty-state">
631
+ <span class="icon">🤖</span>
632
+ <p>暂无 LLM API 调用记录</p>
633
+ <p style="font-size: 12px; opacity: 0.7;">图片/视频/对话等 AI 接口调用会自动记录</p>
634
+ </div>
635
+ </div>
636
+ </div>
637
+ </div>
638
+
639
+ <!-- Crash Logs Tab -->
640
+ <div class="tab-content" id="crashTab">
641
+ <div class="logs-toolbar">
642
+ <select id="filterCrashType">
643
+ <option value="">全部类型</option>
644
+ <option value="startup">启动快照</option>
645
+ <option value="periodic">定期快照</option>
646
+ <option value="error">错误</option>
647
+ <option value="beforeunload">页面关闭</option>
648
+ <option value="freeze">卡死</option>
649
+ <option value="whitescreen">白屏</option>
650
+ <option value="longtask">长任务</option>
651
+ </select>
652
+ <button id="refreshCrashLogs">
653
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="23 4 23 10 17 10"/><polyline points="1 20 1 14 7 14"/><path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"/></svg>
654
+ 刷新
655
+ </button>
656
+ <button id="copyCrashLogs">
657
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>
658
+ 复制
659
+ </button>
660
+ <button id="clearCrashLogs">
661
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="3 6 5 6 21 6"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/></svg>
662
+ 清空
663
+ </button>
664
+ <button id="exportCrashLogs">
665
+ <svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3"/></svg>
666
+ 导出
667
+ </button>
668
+ </div>
669
+ <div class="logs-container" id="crashContainer">
670
+ <div id="crashLogsContainer">
671
+ <div class="empty-state">
672
+ <span class="icon">💥</span>
673
+ <p>暂无内存日志</p>
674
+ <p style="font-size: 12px; opacity: 0.7;">页面启动、内存超限、错误和关闭时的快照会自动记录</p>
675
+ </div>
676
+ </div>
677
+ </div>
678
+ </div>
679
+ </div>
680
+ </div>
681
+ </div>
682
+
683
+ <script type="module" src="./sw-debug/app.js"></script>
684
+ </body>
685
+ </html>