@icen.ai/ui 0.9.0 → 0.11.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.
Files changed (431) hide show
  1. package/AGENTS.md +82 -254
  2. package/LICENSE +21 -0
  3. package/README.md +60 -96
  4. package/dist/base.css +258 -188
  5. package/dist/behaviors/accordion.mjs +8 -8
  6. package/dist/behaviors/ai-branch.d.mts +1 -1
  7. package/dist/behaviors/ai-branch.mjs +1011 -94
  8. package/dist/behaviors/ai-chat.d.mts +9 -9
  9. package/dist/behaviors/ai-chat.mjs +1122 -169
  10. package/dist/behaviors/ai-composer.d.mts +47 -15
  11. package/dist/behaviors/ai-composer.mjs +2018 -534
  12. package/dist/behaviors/ai-core.d.mts +1 -1
  13. package/dist/behaviors/ai-core.mjs +1017 -107
  14. package/dist/behaviors/ai-diff.mjs +1020 -127
  15. package/dist/behaviors/ai-feedback.d.mts +1 -1
  16. package/dist/behaviors/ai-feedback.mjs +1036 -126
  17. package/dist/behaviors/ai-panel.d.mts +10 -10
  18. package/dist/behaviors/ai-panel.mjs +1285 -266
  19. package/dist/behaviors/ai-provider.d.mts +1 -1
  20. package/dist/behaviors/ai-provider.mjs +1004 -101
  21. package/dist/behaviors/ai-threads.d.mts +1 -1
  22. package/dist/behaviors/ai-threads.mjs +1069 -154
  23. package/dist/behaviors/ai-tool.d.mts +3 -3
  24. package/dist/behaviors/ai-tool.mjs +2087 -413
  25. package/dist/behaviors/ai-tools.d.mts +89 -16
  26. package/dist/behaviors/ai-tools.mjs +5365 -380
  27. package/dist/behaviors/autocomplete.d.mts +53 -0
  28. package/dist/behaviors/autocomplete.mjs +1601 -0
  29. package/dist/behaviors/back-top.d.mts +1 -1
  30. package/dist/behaviors/back-top.mjs +952 -14
  31. package/dist/behaviors/carousel.d.mts +1 -1
  32. package/dist/behaviors/carousel.mjs +914 -12
  33. package/dist/behaviors/cascader.d.mts +48 -0
  34. package/dist/behaviors/cascader.mjs +1867 -0
  35. package/dist/behaviors/charts.d.mts +72 -8
  36. package/dist/behaviors/charts.mjs +1953 -272
  37. package/dist/behaviors/code-block.d.mts +36 -0
  38. package/dist/behaviors/code-block.mjs +1619 -0
  39. package/dist/behaviors/command-palette.d.mts +9 -6
  40. package/dist/behaviors/command-palette.mjs +164 -62
  41. package/dist/behaviors/context-menu.d.mts +10 -9
  42. package/dist/behaviors/context-menu.mjs +1113 -44
  43. package/dist/behaviors/controls.d.mts +21 -21
  44. package/dist/behaviors/controls.mjs +1024 -134
  45. package/dist/behaviors/copy.d.mts +21 -2
  46. package/dist/behaviors/copy.mjs +1207 -42
  47. package/dist/behaviors/datatable.d.mts +55 -5
  48. package/dist/behaviors/datatable.mjs +2033 -212
  49. package/dist/behaviors/date-picker.d.mts +0 -1
  50. package/dist/behaviors/date-picker.mjs +1341 -293
  51. package/dist/behaviors/design.d.mts +54 -0
  52. package/dist/behaviors/design.mjs +109 -0
  53. package/dist/behaviors/dropdown.d.mts +5 -6
  54. package/dist/behaviors/dropdown.mjs +262 -110
  55. package/dist/behaviors/events.d.mts +127 -10
  56. package/dist/behaviors/events.mjs +58 -3
  57. package/dist/behaviors/feedback.d.mts +30 -0
  58. package/dist/behaviors/feedback.mjs +296 -0
  59. package/dist/behaviors/focus.d.mts +8 -0
  60. package/dist/behaviors/focus.mjs +24 -0
  61. package/dist/behaviors/form-validate.d.mts +111 -0
  62. package/dist/behaviors/form-validate.mjs +1746 -0
  63. package/dist/behaviors/i18n.d.mts +790 -0
  64. package/dist/behaviors/i18n.mjs +1713 -0
  65. package/dist/behaviors/icons.d.mts +93 -0
  66. package/dist/behaviors/icons.mjs +113 -0
  67. package/dist/behaviors/input.d.mts +9 -1
  68. package/dist/behaviors/input.mjs +1059 -60
  69. package/dist/behaviors/kb-access.d.mts +3 -3
  70. package/dist/behaviors/kb-access.mjs +2135 -239
  71. package/dist/behaviors/kb-acl.d.mts +8 -8
  72. package/dist/behaviors/kb-acl.mjs +1120 -179
  73. package/dist/behaviors/kb-answer.d.mts +2 -2
  74. package/dist/behaviors/kb-answer.mjs +2120 -435
  75. package/dist/behaviors/kb-audit.d.mts +3 -3
  76. package/dist/behaviors/kb-audit.mjs +1077 -154
  77. package/dist/behaviors/kb-canvas.d.mts +3 -3
  78. package/dist/behaviors/kb-canvas.mjs +1101 -177
  79. package/dist/behaviors/kb-chain.d.mts +2 -2
  80. package/dist/behaviors/kb-chain.mjs +1023 -100
  81. package/dist/behaviors/kb-checkpoint.d.mts +3 -3
  82. package/dist/behaviors/kb-checkpoint.mjs +1320 -169
  83. package/dist/behaviors/kb-chunks.d.mts +2 -2
  84. package/dist/behaviors/kb-chunks.mjs +1153 -213
  85. package/dist/behaviors/kb-citation.d.mts +3 -3
  86. package/dist/behaviors/kb-citation.mjs +1221 -185
  87. package/dist/behaviors/kb-clarify.d.mts +2 -2
  88. package/dist/behaviors/kb-clarify.mjs +1059 -130
  89. package/dist/behaviors/kb-conflict.d.mts +2 -2
  90. package/dist/behaviors/kb-conflict.mjs +1042 -119
  91. package/dist/behaviors/kb-connector.d.mts +2 -2
  92. package/dist/behaviors/kb-connector.mjs +1105 -176
  93. package/dist/behaviors/kb-core.d.mts +7 -2
  94. package/dist/behaviors/kb-core.mjs +1078 -162
  95. package/dist/behaviors/kb-eval.d.mts +2 -2
  96. package/dist/behaviors/kb-eval.mjs +1977 -144
  97. package/dist/behaviors/kb-explain.d.mts +3 -3
  98. package/dist/behaviors/kb-explain.mjs +1037 -104
  99. package/dist/behaviors/kb-filter.d.mts +2 -2
  100. package/dist/behaviors/kb-filter.mjs +2014 -178
  101. package/dist/behaviors/kb-gap.d.mts +3 -3
  102. package/dist/behaviors/kb-gap.mjs +1044 -121
  103. package/dist/behaviors/kb-hittest.d.mts +3 -3
  104. package/dist/behaviors/kb-hittest.mjs +1095 -151
  105. package/dist/behaviors/kb-metadata.mjs +1058 -130
  106. package/dist/behaviors/kb-passage.d.mts +4 -4
  107. package/dist/behaviors/kb-passage.mjs +1102 -161
  108. package/dist/behaviors/kb-pipeline.d.mts +4 -4
  109. package/dist/behaviors/kb-pipeline.mjs +1083 -162
  110. package/dist/behaviors/kb-qa.mjs +1089 -160
  111. package/dist/behaviors/kb-rerank.d.mts +2 -2
  112. package/dist/behaviors/kb-rerank.mjs +1048 -114
  113. package/dist/behaviors/kb-retrieval.d.mts +2 -2
  114. package/dist/behaviors/kb-retrieval.mjs +2079 -226
  115. package/dist/behaviors/kb-review.d.mts +2 -2
  116. package/dist/behaviors/kb-review.mjs +1996 -159
  117. package/dist/behaviors/kb-sandbox.d.mts +3 -3
  118. package/dist/behaviors/kb-sandbox.mjs +1033 -105
  119. package/dist/behaviors/kb-segment.d.mts +2 -2
  120. package/dist/behaviors/kb-segment.mjs +1112 -179
  121. package/dist/behaviors/kb-select.d.mts +24 -0
  122. package/dist/behaviors/kb-select.mjs +1995 -0
  123. package/dist/behaviors/kb-sources.d.mts +3 -3
  124. package/dist/behaviors/kb-sources.mjs +1085 -170
  125. package/dist/behaviors/kb-sql.d.mts +3 -3
  126. package/dist/behaviors/kb-sql.mjs +1144 -226
  127. package/dist/behaviors/kb-trace.d.mts +3 -3
  128. package/dist/behaviors/kb-trace.mjs +1051 -131
  129. package/dist/behaviors/kb-visibility.d.mts +2 -2
  130. package/dist/behaviors/kb-visibility.mjs +1087 -158
  131. package/dist/behaviors/kb-who-can.d.mts +2 -2
  132. package/dist/behaviors/kb-who-can.mjs +1980 -137
  133. package/dist/behaviors/mentions.d.mts +93 -0
  134. package/dist/behaviors/mentions.mjs +2153 -0
  135. package/dist/behaviors/modal.d.mts +4 -3
  136. package/dist/behaviors/modal.mjs +1056 -33
  137. package/dist/behaviors/nav.d.mts +1 -1
  138. package/dist/behaviors/nav.mjs +6 -6
  139. package/dist/behaviors/notification.d.mts +16 -8
  140. package/dist/behaviors/notification.mjs +1629 -268
  141. package/dist/behaviors/panel.d.mts +4 -0
  142. package/dist/behaviors/panel.mjs +995 -0
  143. package/dist/behaviors/popover.d.mts +28 -5
  144. package/dist/behaviors/popover.mjs +225 -24
  145. package/dist/behaviors/scroll-area.d.mts +17 -0
  146. package/dist/behaviors/scroll-area.mjs +59 -0
  147. package/dist/behaviors/select.d.mts +5 -2
  148. package/dist/behaviors/select.mjs +1416 -117
  149. package/dist/behaviors/sidebar.d.mts +1 -1
  150. package/dist/behaviors/sidebar.mjs +13 -13
  151. package/dist/behaviors/slider.d.mts +1 -1
  152. package/dist/behaviors/slider.mjs +12 -12
  153. package/dist/behaviors/split-pane.d.mts +1 -1
  154. package/dist/behaviors/split-pane.mjs +9 -7
  155. package/dist/behaviors/suggestions.d.mts +27 -0
  156. package/dist/behaviors/suggestions.mjs +1090 -0
  157. package/dist/behaviors/svg-parse.d.mts +14 -0
  158. package/dist/behaviors/svg-parse.mjs +37 -0
  159. package/dist/behaviors/tabs.d.mts +2 -2
  160. package/dist/behaviors/tabs.mjs +35 -25
  161. package/dist/behaviors/tag-input.d.mts +23 -5
  162. package/dist/behaviors/tag-input.mjs +1360 -104
  163. package/dist/behaviors/theme-switcher.d.mts +24 -0
  164. package/dist/behaviors/theme-switcher.mjs +1996 -0
  165. package/dist/behaviors/theme.d.mts +15 -8
  166. package/dist/behaviors/theme.mjs +406 -30
  167. package/dist/behaviors/toast.d.mts +24 -25
  168. package/dist/behaviors/toast.mjs +1267 -88
  169. package/dist/behaviors/tooltip.d.mts +4 -0
  170. package/dist/behaviors/tooltip.mjs +378 -0
  171. package/dist/behaviors/tree-select.d.mts +69 -0
  172. package/dist/behaviors/tree-select.mjs +1921 -0
  173. package/dist/behaviors/tree.d.mts +1 -1
  174. package/dist/behaviors/tree.mjs +18 -18
  175. package/dist/behaviors/upload.d.mts +3 -2
  176. package/dist/behaviors/upload.mjs +1077 -66
  177. package/dist/behaviors/url-safety.d.mts +8 -0
  178. package/dist/behaviors/url-safety.mjs +11 -0
  179. package/dist/cli.mjs +5 -6
  180. package/dist/components/accordion.d.mts +2 -0
  181. package/dist/components/ai-branch.d.mts +2 -0
  182. package/dist/components/ai-chat.css +682 -582
  183. package/dist/components/ai-chat.d.mts +2 -0
  184. package/dist/components/ai-composer.d.mts +2 -0
  185. package/dist/components/ai-context.d.mts +2 -0
  186. package/dist/components/ai-context.mjs +1 -0
  187. package/dist/components/ai-diff.css +153 -132
  188. package/dist/components/ai-diff.d.mts +2 -0
  189. package/dist/components/ai-feedback.d.mts +2 -0
  190. package/dist/components/ai-files.d.mts +2 -0
  191. package/dist/components/ai-message.d.mts +2 -0
  192. package/dist/components/ai-panel.css +353 -343
  193. package/dist/components/ai-reasoning.d.mts +2 -0
  194. package/dist/components/ai-subagent.d.mts +2 -0
  195. package/dist/components/ai-subagent.mjs +1 -0
  196. package/dist/components/ai-threads.d.mts +2 -0
  197. package/dist/components/ai-todo.d.mts +2 -0
  198. package/dist/components/ai-todo.mjs +1 -0
  199. package/dist/components/ai-tool-call.d.mts +2 -0
  200. package/dist/components/ai-tool-call.mjs +1 -0
  201. package/dist/components/ai-tool.css +397 -242
  202. package/dist/components/ai-usage.d.mts +2 -0
  203. package/dist/components/alert.d.mts +2 -0
  204. package/dist/components/autocomplete.css +61 -0
  205. package/dist/components/autocomplete.d.mts +2 -0
  206. package/dist/components/autocomplete.mjs +3 -0
  207. package/dist/components/avatar.d.mts +2 -0
  208. package/dist/components/back-top.css +74 -40
  209. package/dist/components/back-top.d.mts +2 -0
  210. package/dist/components/badge.css +44 -41
  211. package/dist/components/badge.d.mts +2 -0
  212. package/dist/components/breadcrumb.css +85 -46
  213. package/dist/components/breadcrumb.d.mts +2 -0
  214. package/dist/components/btn.css +105 -94
  215. package/dist/components/btn.d.mts +2 -0
  216. package/dist/components/card.css +124 -113
  217. package/dist/components/card.d.mts +2 -0
  218. package/dist/components/carousel.d.mts +2 -0
  219. package/dist/components/cascader.css +332 -0
  220. package/dist/components/cascader.d.mts +2 -0
  221. package/dist/components/cascader.mjs +3 -0
  222. package/dist/components/chart-area.css +54 -2
  223. package/dist/components/chart-area.d.mts +2 -0
  224. package/dist/components/chart-bar.css +147 -38
  225. package/dist/components/chart-bar.d.mts +2 -0
  226. package/dist/components/chart-calendar.d.mts +2 -0
  227. package/dist/components/chart-gauge.css +36 -13
  228. package/dist/components/chart-gauge.d.mts +2 -0
  229. package/dist/components/chart-graph.css +35 -20
  230. package/dist/components/chart-graph.d.mts +2 -0
  231. package/dist/components/chart-heatmap.css +67 -39
  232. package/dist/components/chart-heatmap.d.mts +2 -0
  233. package/dist/components/chart-line.css +62 -3
  234. package/dist/components/chart-line.d.mts +2 -0
  235. package/dist/components/chart-map.d.mts +2 -0
  236. package/dist/components/chart-pie.css +38 -6
  237. package/dist/components/chart-pie.d.mts +2 -0
  238. package/dist/components/chart-radar.css +57 -5
  239. package/dist/components/chart-radar.d.mts +2 -0
  240. package/dist/components/chart-scatter.css +47 -7
  241. package/dist/components/chart-scatter.d.mts +2 -0
  242. package/dist/components/chart-sparkline.css +25 -2
  243. package/dist/components/chart-sparkline.d.mts +2 -0
  244. package/dist/components/chart-stack.css +27 -13
  245. package/dist/components/chart-stack.d.mts +2 -0
  246. package/dist/components/charts.css +220 -84
  247. package/dist/components/charts.d.mts +2 -0
  248. package/dist/components/code-block.css +420 -0
  249. package/dist/components/code-block.d.mts +2 -0
  250. package/dist/components/code-block.mjs +4 -0
  251. package/dist/components/command-palette.css +150 -122
  252. package/dist/components/command-palette.d.mts +2 -0
  253. package/dist/components/content.css +274 -263
  254. package/dist/components/context-menu.d.mts +2 -0
  255. package/dist/components/copy.css +73 -45
  256. package/dist/components/copy.d.mts +2 -0
  257. package/dist/components/datatable.css +457 -202
  258. package/dist/components/datatable.d.mts +2 -0
  259. package/dist/components/date-picker.css +136 -105
  260. package/dist/components/date-picker.d.mts +2 -0
  261. package/dist/components/desc.d.mts +2 -0
  262. package/dist/components/dropdown.d.mts +2 -0
  263. package/dist/components/empty.css +72 -69
  264. package/dist/components/empty.d.mts +2 -0
  265. package/dist/components/feedback.css +211 -191
  266. package/dist/components/form-validate.css +134 -0
  267. package/dist/components/form-validate.d.mts +2 -0
  268. package/dist/components/form-validate.mjs +3 -0
  269. package/dist/components/form.css +157 -131
  270. package/dist/components/form.d.mts +2 -0
  271. package/dist/components/icon.css +113 -0
  272. package/dist/components/icon.d.mts +2 -0
  273. package/dist/components/icon.mjs +3 -0
  274. package/dist/components/input.css +163 -108
  275. package/dist/components/input.d.mts +2 -0
  276. package/dist/components/kb-access.d.mts +2 -0
  277. package/dist/components/kb-acl.d.mts +2 -0
  278. package/dist/components/kb-agent.css +300 -206
  279. package/dist/components/kb-answer.d.mts +2 -0
  280. package/dist/components/kb-audit.d.mts +2 -0
  281. package/dist/components/kb-canvas.d.mts +2 -0
  282. package/dist/components/kb-chain.d.mts +2 -0
  283. package/dist/components/kb-checkpoint.d.mts +2 -0
  284. package/dist/components/kb-chunks.d.mts +2 -0
  285. package/dist/components/kb-citation.d.mts +2 -0
  286. package/dist/components/kb-clarify.d.mts +2 -0
  287. package/dist/components/kb-conflict.d.mts +2 -0
  288. package/dist/components/kb-connector.d.mts +2 -0
  289. package/dist/components/kb-data.css +431 -315
  290. package/dist/components/kb-eval.d.mts +2 -0
  291. package/dist/components/kb-explain.d.mts +2 -0
  292. package/dist/components/kb-filter.d.mts +2 -0
  293. package/dist/components/kb-gap.d.mts +2 -0
  294. package/dist/components/kb-ground.css +333 -229
  295. package/dist/components/kb-hittest.d.mts +2 -0
  296. package/dist/components/kb-ingest.css +613 -434
  297. package/dist/components/kb-metadata.d.mts +2 -0
  298. package/dist/components/kb-ops.css +422 -302
  299. package/dist/components/kb-passage.d.mts +2 -0
  300. package/dist/components/kb-perm.css +374 -314
  301. package/dist/components/kb-pipeline.d.mts +2 -0
  302. package/dist/components/kb-qa.d.mts +2 -0
  303. package/dist/components/kb-rerank.d.mts +2 -0
  304. package/dist/components/kb-retrieval.d.mts +2 -0
  305. package/dist/components/kb-review.d.mts +2 -0
  306. package/dist/components/kb-sandbox.d.mts +2 -0
  307. package/dist/components/kb-search.css +653 -459
  308. package/dist/components/kb-segment.d.mts +2 -0
  309. package/dist/components/kb-sources.d.mts +2 -0
  310. package/dist/components/kb-sql.d.mts +2 -0
  311. package/dist/components/kb-trace.d.mts +2 -0
  312. package/dist/components/kb-visibility.d.mts +2 -0
  313. package/dist/components/kb-who-can.d.mts +2 -0
  314. package/dist/components/kb.css +170 -135
  315. package/dist/components/kb.d.mts +2 -0
  316. package/dist/components/kbd.d.mts +2 -0
  317. package/dist/components/layout.css +86 -83
  318. package/dist/components/layout.d.mts +2 -0
  319. package/dist/components/list.d.mts +2 -0
  320. package/dist/components/material-chinese.css +83 -0
  321. package/dist/components/material-soviet.css +86 -0
  322. package/dist/components/material.css +318 -0
  323. package/dist/components/media-card.d.mts +2 -0
  324. package/dist/components/media.css +225 -176
  325. package/dist/components/mentions.css +190 -0
  326. package/dist/components/mentions.d.mts +2 -0
  327. package/dist/components/mentions.mjs +3 -0
  328. package/dist/components/menu.css +121 -109
  329. package/dist/components/modal.css +116 -118
  330. package/dist/components/modal.d.mts +2 -0
  331. package/dist/components/nav.css +136 -129
  332. package/dist/components/nav.d.mts +2 -0
  333. package/dist/components/notification.css +247 -177
  334. package/dist/components/notification.d.mts +2 -0
  335. package/dist/components/pagination.css +62 -57
  336. package/dist/components/pagination.d.mts +2 -0
  337. package/dist/components/panel.css +70 -68
  338. package/dist/components/panel.d.mts +2 -0
  339. package/dist/components/panel.mjs +1 -0
  340. package/dist/components/pill.css +83 -72
  341. package/dist/components/pill.d.mts +2 -0
  342. package/dist/components/popover.css +80 -57
  343. package/dist/components/popover.d.mts +2 -0
  344. package/dist/components/progress.d.mts +2 -0
  345. package/dist/components/rating.d.mts +2 -0
  346. package/dist/components/result.d.mts +2 -0
  347. package/dist/components/scroll-area.css +29 -54
  348. package/dist/components/scroll-area.d.mts +2 -0
  349. package/dist/components/scroll-area.mjs +1 -0
  350. package/dist/components/segmented.css +167 -146
  351. package/dist/components/segmented.d.mts +2 -0
  352. package/dist/components/select.css +250 -191
  353. package/dist/components/select.d.mts +2 -0
  354. package/dist/components/sidebar.css +157 -143
  355. package/dist/components/sidebar.d.mts +2 -0
  356. package/dist/components/skeleton.d.mts +2 -0
  357. package/dist/components/slider.css +135 -128
  358. package/dist/components/slider.d.mts +2 -0
  359. package/dist/components/spinner.d.mts +2 -0
  360. package/dist/components/split-pane.css +120 -108
  361. package/dist/components/split-pane.d.mts +2 -0
  362. package/dist/components/stat.css +116 -109
  363. package/dist/components/stat.d.mts +2 -0
  364. package/dist/components/steps.css +114 -108
  365. package/dist/components/steps.d.mts +2 -0
  366. package/dist/components/switch.css +192 -149
  367. package/dist/components/switch.d.mts +2 -0
  368. package/dist/components/table.css +158 -112
  369. package/dist/components/table.d.mts +2 -0
  370. package/dist/components/tabs.css +143 -116
  371. package/dist/components/tabs.d.mts +2 -0
  372. package/dist/components/tag-input.css +52 -133
  373. package/dist/components/tag-input.d.mts +2 -0
  374. package/dist/components/tag.css +90 -72
  375. package/dist/components/tag.d.mts +2 -0
  376. package/dist/components/theme-switcher.css +105 -0
  377. package/dist/components/theme-switcher.d.mts +2 -0
  378. package/dist/components/theme-switcher.mjs +3 -0
  379. package/dist/components/timeline.d.mts +2 -0
  380. package/dist/components/toast.css +115 -97
  381. package/dist/components/toast.d.mts +2 -0
  382. package/dist/components/toolbar.css +47 -43
  383. package/dist/components/toolbar.d.mts +2 -0
  384. package/dist/components/tooltip.css +103 -43
  385. package/dist/components/tooltip.d.mts +2 -0
  386. package/dist/components/tooltip.mjs +1 -0
  387. package/dist/components/tree-select.css +439 -0
  388. package/dist/components/tree-select.d.mts +2 -0
  389. package/dist/components/tree-select.mjs +3 -0
  390. package/dist/components/tree.d.mts +2 -0
  391. package/dist/components/upload.css +138 -97
  392. package/dist/components/upload.d.mts +2 -0
  393. package/dist/fonts/LICENSES/ark-pixel/OFL.txt +96 -0
  394. package/dist/fonts/LICENSES/cubic-11/OFL.txt +108 -0
  395. package/dist/fonts/LICENSES/galmuri/LICENSE.txt +93 -0
  396. package/dist/fonts/OFL.txt +96 -0
  397. package/dist/fonts/README.md +14 -0
  398. package/dist/fonts/fusion-pixel-12px-zh-hans.woff2 +0 -0
  399. package/dist/index.d.mts +85 -70
  400. package/dist/index.mjs +17330 -5773
  401. package/dist/react.d.mts +91 -0
  402. package/dist/react.mjs +8307 -0
  403. package/dist/registry.json +918 -70
  404. package/dist/tokens/chinese.css +44 -0
  405. package/dist/tokens/colors.css +371 -1222
  406. package/dist/tokens/design.css +209 -0
  407. package/dist/tokens/dtcg.json +15926 -0
  408. package/dist/tokens/figma.variables.json +10779 -0
  409. package/dist/tokens/icon-masks.css +78 -0
  410. package/dist/tokens/pixel.css +53 -0
  411. package/dist/tokens/scrollbars.css +40 -0
  412. package/dist/tokens/soviet.css +44 -0
  413. package/dist/tokens/style-profiles.css +36 -547
  414. package/dist/tokens/themes.json +308 -0
  415. package/dist/tokens/tokens-studio.json +11648 -0
  416. package/dist/tokens/typography.css +21 -18
  417. package/dist/tokens.css +1783 -1806
  418. package/dist/ui.css +14796 -10750
  419. package/dist/vue.d.mts +344 -0
  420. package/dist/vue.mjs +7876 -0
  421. package/docs/spec/ai-input-experience.md +75 -0
  422. package/docs/spec/ai-native.md +238 -147
  423. package/docs/spec/design-philosophy.md +189 -0
  424. package/docs/spec/design-primitives.md +196 -0
  425. package/docs/spec/kb-family.md +147 -115
  426. package/docs/spec/scrollbars.md +46 -0
  427. package/package.json +56 -8
  428. package/dist/retro-effects.css +0 -255
  429. package/dist/tokens/retro-effects.css +0 -255
  430. package/docs/research/2026-10-03-ai-kb-components.md +0 -392
  431. package/docs/research/2026-10-03-kb-permissions.md +0 -992
@@ -1,3 +1,990 @@
1
+ // src/behaviors/icons.ts
2
+ var ICON_PATHS = {
3
+ file: "M6 2.5h5.5L16 7v9.5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-12a2 2 0 0 1 2-2ZM11.5 2.5V7H16",
4
+ folder: "M3 5a1.5 1.5 0 0 1 1.5-1.5H8l2 2h5.5A1.5 1.5 0 0 1 17 7v8a1.5 1.5 0 0 1-1.5 1.5h-11A1.5 1.5 0 0 1 3 15Z",
5
+ globe: "M17.5 10a7.5 7.5 0 1 1-15 0 7.5 7.5 0 0 1 15 0ZM2.5 10h15M10 2.5c-4 4-4 11 0 15 4-4 4-11 0-15Z",
6
+ document: "M6 2.5h5.5L16 7v9.5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-12a2 2 0 0 1 2-2ZM11.5 2.5V7H16M7 10.5h6M7 13.5h6",
7
+ agent: "M10 6V3M8 3h2M5 6h10a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2ZM1.5 10h1.5M17 10h1.5M7 10v2M13 10v2M8 14h4",
8
+ paperclip: "M14 7 8.3 12.7a1.6 1.6 0 0 1-2.3-2.3l6.3-6.3a3.2 3.2 0 0 1 4.5 4.5l-7 7a4.7 4.7 0 0 1-6.7-6.7l7-7",
9
+ stop: "M6.5 5h7A1.5 1.5 0 0 1 15 6.5v7a1.5 1.5 0 0 1-1.5 1.5h-7A1.5 1.5 0 0 1 5 13.5v-7A1.5 1.5 0 0 1 6.5 5Z",
10
+ terminal: "M5 3.5h10a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-9a2 2 0 0 1 2-2ZM6 7l3 3-3 3M11 13h3",
11
+ branch: "M6 6v8M14 6v2a4 4 0 0 1-4 4H6M8 4a2 2 0 1 1-4 0 2 2 0 0 1 4 0ZM8 16a2 2 0 1 1-4 0 2 2 0 0 1 4 0ZM16 4a2 2 0 1 1-4 0 2 2 0 0 1 4 0Z",
12
+ "line-numbers": "M3 5h2M3 10h2M3 15h2M8 5h9M8 10h9M8 15h9",
13
+ wrap: "M3 5h14M3 10h10a3 3 0 0 1 0 6h-3M12.5 13.5 10 16l2.5 2.5",
14
+ calendar: "M5.5 4h9A2.5 2.5 0 0 1 17 6.5v8a2.5 2.5 0 0 1-2.5 2.5h-9A2.5 2.5 0 0 1 3 14.5v-8A2.5 2.5 0 0 1 5.5 4ZM6.5 2.5v3M13.5 2.5v3M3 8h14M6.5 11h.1M10 11h.1M13.5 11h.1M6.5 14h.1M10 14h.1",
15
+ close: "M6 6l8 8M14 6l-8 8",
16
+ check: "M4.5 10.2l3.6 3.6 7.4-7.6",
17
+ "chevron-down": "M5.5 7.75 10 12.25l4.5-4.5",
18
+ "chevron-up": "M5.5 12.25 10 7.75l4.5 4.5",
19
+ "chevron-right": "M7.75 5.5 12.25 10l-4.5 4.5",
20
+ "chevron-left": "M12.25 5.5 7.75 10l4.5 4.5",
21
+ "arrow-right": "M3.5 10h13M11 4.5l5.5 5.5-5.5 5.5",
22
+ "arrow-left": "M16.5 10h-13M9 4.5 3.5 10 9 15.5",
23
+ "arrow-up": "M10 16.5v-13M4.5 9 10 3.5 15.5 9",
24
+ "arrow-down": "M10 3.5v13M4.5 11l5.5 5.5 5.5-5.5",
25
+ plus: "M10 4v12M4 10h12",
26
+ minus: "M4 10h12",
27
+ sort: "M6 15V4M3 7l3-3 3 3M14 5v11M11 13l3 3 3-3",
28
+ search: "M13.3 13.3 17 17M14.5 8.5a6 6 0 1 1-12 0 6 6 0 0 1 12 0",
29
+ sun: "M13.5 10a3.5 3.5 0 1 1-7 0 3.5 3.5 0 0 1 7 0M10 1.75v1.5M10 16.75v1.5M1.75 10h1.5M16.75 10h1.5M4.17 4.17l1.06 1.06M14.77 14.77l1.06 1.06M4.17 15.83l1.06-1.06M14.77 5.23l1.06-1.06",
30
+ moon: "M17.25 11.15A7.5 7.5 0 0 1 8.85 2.75a7.5 7.5 0 1 0 8.4 8.4Z",
31
+ modern: "M6.5 3h7A3.5 3.5 0 0 1 17 6.5v7a3.5 3.5 0 0 1-3.5 3.5h-7A3.5 3.5 0 0 1 3 13.5v-7A3.5 3.5 0 0 1 6.5 3ZM7 10l3-3 3 3-3 3Z",
32
+ pixel: "M3 3h5v5H3ZM12 3h5v5h-5ZM3 12h5v5H3ZM12 12h5v5h-5Z",
33
+ chinese: "M3 8c3 0 5-2 7-5 2 3 4 5 7 5M4 8h12M6 8v8m8-8v8M3 16h14M8 16v-5h4v5",
34
+ soviet: "M3 17h14M5 17V8h4v9m0-12h6v12M7 8V5h2m2 3h2m-2 3h2m-2 3h2M10 5V3h4v2",
35
+ more: "M4 9.9v.2M10 9.9v.2M16 9.9v.2",
36
+ copy: "M7 7h8a2 2 0 0 1 2 2v6a2 2 0 0 1-2 2H9a2 2 0 0 1-2-2V7ZM13 7V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2",
37
+ edit: "M11.5 4.5l4 4M4 12l9-9a1.4 1.4 0 0 1 2 0l2 2a1.4 1.4 0 0 1 0 2l-9 9-5 1Z",
38
+ link: "M8 6l2-2a4.2 4.2 0 0 1 6 6l-2 2M12 14l-2 2a4.2 4.2 0 0 1-6-6l2-2M7 13l6-6",
39
+ trash: "M3.5 5.5h13M7 5.5V3h6v2.5M5 5.5l.7 11.5h8.6L15 5.5M8 9v5M12 9v5",
40
+ spinner: "M10 3a7 7 0 1 1-7 7",
41
+ "circle-check": "M18 10a8 8 0 1 1-16 0 8 8 0 0 1 16 0ZM6 10l2.7 2.7 5.3-5.4",
42
+ "circle-error": "M18 10a8 8 0 1 1-16 0 8 8 0 0 1 16 0ZM7.2 7.2l5.6 5.6M12.8 7.2l-5.6 5.6",
43
+ "circle-info": "M18 10a8 8 0 1 1-16 0 8 8 0 0 1 16 0ZM10 9v5M10 6.1v.15",
44
+ "triangle-alert": "M8.7 3.5a1.5 1.5 0 0 1 2.6 0l6.4 11.3a1.5 1.5 0 0 1-1.3 2.2H3.6a1.5 1.5 0 0 1-1.3-2.2ZM10 7.2v4.4M10 14v.15",
45
+ refresh: "M16.5 7.2A7 7 0 0 0 4.3 5.9L2.5 8M2.5 3.5V8H7M3.5 12.8a7 7 0 0 0 12.2 1.3l1.8-2.1M13 12h4.5v4.5",
46
+ external: "M11.5 3H17v5.5M17 3l-8 8M8 3H5a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-3",
47
+ home: "M3.5 10.25 10 4l6.5 6.25M5.75 8.75v7a.75.75 0 0 0 .75.75h7.5a.75.75 0 0 0 .75-.75v-7",
48
+ settings: "M3.5 5.5h13M3.5 10h13M3.5 14.5h13M7 4v3M12.5 8.5v3M8 13v3",
49
+ star: "M10 2.5l2.4 5.1 5.6.4-4.2 3.7 1.3 5.5-5.1-3-5.1 3 1.3-5.5L1.8 8l5.6-.4Z",
50
+ eye: "M2.2 10s3-5.4 7.8-5.4S17.8 10 17.8 10s-3 5.4-7.8 5.4S2.2 10 2.2 10ZM10 12.4a2.4 2.4 0 1 0 0-4.8 2.4 2.4 0 0 0 0 4.8Z",
51
+ "eye-off": "M2.2 10s3-5.4 7.8-5.4S17.8 10 17.8 10s-3 5.4-7.8 5.4S2.2 10 2.2 10ZM10 12.4a2.4 2.4 0 1 0 0-4.8 2.4 2.4 0 0 0 0 4.8ZM3.5 3.5l13 13",
52
+ inbox: "M3.5 12.25h3.7l1.5 2.5h2.6l1.5-2.5h3.7M4.7 5.5l-1.2 6.75v3.25a1.5 1.5 0 0 0 1.5 1.5h10a1.5 1.5 0 0 0 1.5-1.5v-3.25L15.3 5.5a1.3 1.3 0 0 0-1.25-1H5.95a1.3 1.3 0 0 0-1.25 1Z",
53
+ bell: "M10 3.5a4.5 4.5 0 0 1 4.5 4.5c0 4.5 1.8 5.7 2.5 6.5H3c.7-.8 2.5-2 2.5-6.5A4.5 4.5 0 0 1 10 3.5ZM8.5 16.5a1.6 1.6 0 0 0 3 0",
54
+ users: "M13.8 16.5v-1.5a3.5 3.5 0 0 0-3.5-3.5H6.3a3.5 3.5 0 0 0-3.5 3.5v1.5M8.3 8.9a2.7 2.7 0 1 0 0-5.4 2.7 2.7 0 0 0 0 5.4ZM16.5 16.5v-1.3a3.3 3.3 0 0 0-2.3-3.1M12.3 3.7a2.7 2.7 0 0 1 0 5.2",
55
+ activity: "M17 10h-2.6l-2 5.8L8 4.2 6 10H3",
56
+ "trend-up": "M3.5 14.5l4.2-4.2 2.8 2.8 5.9-5.9M12.4 7.2h4.2v4.2",
57
+ "trend-down": "M3.5 5.5l4.2 4.2 2.8-2.8 5.9 5.9M12.4 12.8h4.2V8.6",
58
+ rocket: "M10 2.5c2 1.5 3.2 4 3.2 6.8 0 1.5-.3 2.9-.8 4.2H7.6c-.5-1.3-.8-2.7-.8-4.2 0-2.8 1.2-5.3 3.2-6.8ZM10 8.6a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM7.6 12.5 5.6 15.4c-.9.3-1.6 1-2 2M12.4 12.5l2 2.9c.9.3 1.6 1 2 2M8.7 13.8c0 1.8.5 3.1 1.3 4.2.8-1.1 1.3-2.4 1.3-4.2",
59
+ bold: "M6.5 4h4.2a3 3 0 0 1 0 6H6.5M6.5 10h5a3 3 0 0 1 0 6H6.5M6.5 4v12",
60
+ italic: "M8.5 4.5h7M4.5 15.5h7M12.5 4.5l-5 11",
61
+ underline: "M6 4v5.5a4 4 0 0 0 8 0V4M4.5 16h11",
62
+ "align-left": "M3.5 4.5h13M3.5 10h8.5M3.5 15.5h11",
63
+ "align-center": "M3.5 4.5h13M5.75 10h8.5M4.5 15.5h11",
64
+ "align-right": "M3.5 4.5h13M8 10h8.5M5.5 15.5h11",
65
+ list: "M6.5 5h10M6.5 10h10M6.5 15h10M3.5 5h.01M3.5 10h.01M3.5 15h.01",
66
+ server: "M3 3h14a1.5 1.5 0 0 1 1.5 1.5v2A1.5 1.5 0 0 1 17 8H3a1.5 1.5 0 0 1-1.5-1.5v-2A1.5 1.5 0 0 1 3 3ZM3 12h14a1.5 1.5 0 0 1 1.5 1.5v2A1.5 1.5 0 0 1 17 17H3a1.5 1.5 0 0 1-1.5-1.5v-2A1.5 1.5 0 0 1 3 12ZM5 5.5h.01M5 14.5h.01",
67
+ sparkle: "M10 2.5l1.6 4.3 4.3 1.6-4.3 1.6L10 14.3l-1.6-4.3-4.3-1.6 4.3-1.6ZM15.5 12.5l.8 2.1 2.1.8-2.1.8-.8 2.1-.8-2.1-2.1-.8 2.1-.8Z",
68
+ play: "M6.5 4.8v10.4c0 .9 1 1.5 1.8 1l8.3-5.2a1.2 1.2 0 0 0 0-2L8.3 3.8a1.2 1.2 0 0 0-1.8 1Z",
69
+ "chart-line": "M3.5 3.5v13h13M6.5 12l2.8-2.8 2.2 2.2 4-4.4",
70
+ layers: "M10 3.2 3.6 6.5 10 9.8l6.4-3.3ZM4.5 10.4 10 13.2l5.5-2.8M4.5 13.6 10 16.4l5.5-2.8",
71
+ box: "M17 6 10 3.2 3 6v8l7 2.8 7-2.8ZM3 6l7 2.8L17 6M10 9v7.8",
72
+ filter: "M4 4.5h12l-4.4 5.1v5l-3.2-1.6V9.6Z",
73
+ columns: "M3.5 4h13v12h-13ZM8.2 4v12M12.8 4v12",
74
+ download: "M10 3.5v8M6.8 8.3 10 11.5l3.2-3.2M4 15v2.5a1.5 1.5 0 0 0 1.5 1.5h9a1.5 1.5 0 0 0 1.5-1.5V15"
75
+ };
76
+ var custom = /* @__PURE__ */ new Map();
77
+ var escape = (s) => s.replace(/[&<>"']/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" })[c]);
78
+ function iconPath(name) {
79
+ return Object.hasOwn(ICON_PATHS, name) ? ICON_PATHS[name] : custom.get(name) ?? null;
80
+ }
81
+ function iconAttributes(o = {}) {
82
+ const size = Number.isFinite(o.size) && o.size > 0 ? o.size : 16;
83
+ return { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", width: String(size), height: String(size), fill: "none", stroke: "currentColor", "stroke-width": "1.6", "stroke-linecap": "round", "stroke-linejoin": "round", focusable: "false", class: ["icen-symbol", o.className].filter(Boolean).join(" "), ...o.label ? { role: "img", "aria-label": o.label } : { "aria-hidden": "true" } };
84
+ }
85
+ function iconHTML(name, o = {}) {
86
+ const path = iconPath(name);
87
+ if (!path) return "";
88
+ return `<svg${Object.entries(iconAttributes(o)).map(([k, v]) => ` ${k}="${escape(v)}"`).join("")}><path d="${escape(path)}"></path></svg>`;
89
+ }
90
+ function createIcon(name, o = {}) {
91
+ if (typeof document === "undefined") return null;
92
+ const path = iconPath(name);
93
+ if (!path) return null;
94
+ const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
95
+ for (const [key, value] of Object.entries(iconAttributes(o))) svg.setAttribute(key, value);
96
+ const line = document.createElementNS(svg.namespaceURI, "path");
97
+ line.setAttribute("d", path);
98
+ svg.append(line);
99
+ return svg;
100
+ }
101
+
102
+ // src/behaviors/events.ts
103
+ function emitIcen(source, type, detail) {
104
+ return source.dispatchEvent(
105
+ new CustomEvent(type, { detail, bubbles: true, composed: true, cancelable: true })
106
+ );
107
+ }
108
+
109
+ // src/behaviors/i18n.ts
110
+ var ICEN_LOCALE_ZH_CN = {
111
+ /* ── aiBranch ── */
112
+ "aiBranch.nextVersion": "\u4E0B\u4E00\u7248\u672C",
113
+ "aiBranch.prevVersion": "\u4E0A\u4E00\u7248\u672C",
114
+ "aiBranch.version": "\u5206\u652F\u7248\u672C",
115
+ /* ── aiChat ── */
116
+ "aiChat.backToBottom": "\u56DE\u5230\u5E95\u90E8",
117
+ "aiChat.backToBottomCount": "\u56DE\u5230\u5E95\u90E8 \xB7 {p0} \u6761\u65B0\u6D88\u606F",
118
+ "aiChat.continue": "\u7EE7\u7EED\u751F\u6210",
119
+ "aiChat.download": "\u4E0B\u8F7D",
120
+ "aiChat.file": "\u6587\u4EF6",
121
+ "aiChat.roleSystem": "\u7CFB",
122
+ "aiChat.roleTool": "\u5DE5",
123
+ "aiChat.roleUser": "\u6211",
124
+ "aiChat.thinking": "\u601D\u8003 {p0}",
125
+ "aiChat.thinkingNow": "\u6B63\u5728\u601D\u8003\u2026",
126
+ /* ── aiComposer ── */
127
+ "aiComposer.attachAgent": "\u4EE3\u7406",
128
+ "aiComposer.library": "\u6DFB\u52A0\u4E0A\u4E0B\u6587\u4E0E\u547D\u4EE4",
129
+ "aiComposer.searchLibrary": "\u641C\u7D22\u6280\u80FD\u3001\u5DE5\u5177\u3001\u6587\u4EF6\u4E0E\u547D\u4EE4",
130
+ "aiComposer.all": "\u5168\u90E8",
131
+ "aiComposer.skills": "\u6280\u80FD",
132
+ "aiComposer.tools": "\u5DE5\u5177",
133
+ "aiComposer.libraryHint": "\u4E0A\u4E0B\u6587\u968F\u6D88\u606F\u53D1\u9001 \xB7 \u547D\u4EE4\u5148\u586B\u5165\u8F93\u5165\u6846",
134
+ "aiComposer.commandHint": "\u2191 \u2193 \u6D4F\u89C8 \xB7 Enter \u6267\u884C \xB7 Esc \u8FD4\u56DE",
135
+ "aiComposer.refHint": "\u2191 \u2193 \u6D4F\u89C8 \xB7 Enter \u5F15\u7528 \xB7 Esc \u8FD4\u56DE",
136
+ "aiComposer.noLibraryMatch": "\u6CA1\u6709\u5339\u914D\u7684\u9879\u76EE\uFF0C\u8BD5\u8BD5\u5176\u4ED6\u5173\u952E\u8BCD",
137
+ "aiComposer.filesNeedAdapter": "\u9644\u4EF6\u5C1A\u672A\u63A5\u901A\u4E0A\u4F20\u3002\u8BF7\u914D\u7F6E prepareMessage \u540E\u91CD\u8BD5\uFF0C\u6587\u4EF6\u4ECD\u4FDD\u7559\u5728\u6B64\u8BF7\u6C42\u4E2D\u3002",
138
+ "aiComposer.attachDoc": "\u6587\u6863",
139
+ "aiComposer.attachFile": "\u6587\u4EF6",
140
+ "aiComposer.attachFolder": "\u6587\u4EF6\u5939",
141
+ "aiComposer.cacheInvalidHint": "\u5207\u6362\u6A21\u578B\u4F1A\u4F7F prompt \u7F13\u5B58\u5931\u6548",
142
+ "aiComposer.commands": "\u547D\u4EE4",
143
+ "aiComposer.currentTodos": "\u5F53\u524D\u5F85\u529E",
144
+ "aiComposer.done": "\u5B8C\u6210",
145
+ "aiComposer.justNow": "\u521A\u521A \xB7 {p0}",
146
+ "aiComposer.modelAria": "\u6A21\u578B {p0}\uFF08{p1}\uFF09",
147
+ "aiComposer.noCommandMatch": "\u65E0\u5339\u914D\u547D\u4EE4",
148
+ "aiComposer.noModelMatch": "\u65E0\u5339\u914D\u6A21\u578B",
149
+ "aiComposer.noRefMatch": "\u65E0\u5339\u914D\u5F15\u7528",
150
+ "aiComposer.placeholder": "\u8F93\u5165\u6D88\u606F\uFF0C/ \u547D\u4EE4 \xB7 @ \u5F15\u7528 \xB7 Enter \u53D1\u9001",
151
+ "aiComposer.refs": "\u5F15\u7528",
152
+ "aiComposer.removeAttachment": "\u79FB\u9664\u9644\u4EF6 {p0}",
153
+ "aiComposer.removeQueued": "\u79FB\u9664\u6392\u961F\u6D88\u606F {p0}",
154
+ "aiComposer.removeRef": "\u79FB\u9664\u5F15\u7528 {p0}",
155
+ "aiComposer.searchModels": "\u641C\u7D22\u6A21\u578B",
156
+ "aiComposer.selectModel": "\u9009\u62E9\u6A21\u578B",
157
+ "aiComposer.send": "\u53D1\u9001",
158
+ "aiComposer.stop": "\u505C\u6B62\u751F\u6210",
159
+ "aiComposer.stopped": "\u5DF2\u505C\u6B62",
160
+ "aiComposer.todoChip": "\u5F53\u524D\u5F85\u529E {p0}/{p1}{p2}",
161
+ "aiComposer.todoHasError": "\uFF08\u6709\u5931\u8D25\u9879\uFF09",
162
+ /* ── aiCore ── */
163
+ "aiCore.kindBrowser": "\u6D4F\u89C8",
164
+ "aiCore.kindChart": "\u56FE\u8868",
165
+ "aiCore.kindDelete": "\u5220\u9664",
166
+ "aiCore.kindEdit": "\u7F16\u8F91",
167
+ "aiCore.kindFetch": "\u8BF7\u6C42",
168
+ "aiCore.kindGlob": "\u5339\u914D",
169
+ "aiCore.kindGrep": "\u641C\u7D22",
170
+ "aiCore.kindNote": "\u7B14\u8BB0",
171
+ "aiCore.kindPlan": "\u8BA1\u5212",
172
+ "aiCore.kindRead": "\u8BFB\u53D6",
173
+ "aiCore.kindSearch": "\u68C0\u7D22",
174
+ "aiCore.kindShell": "\u547D\u4EE4",
175
+ "aiCore.kindSkill": "\u6280\u80FD",
176
+ "aiCore.kindSubagent": "\u5B50\u4EE3\u7406",
177
+ "aiCore.kindTodo": "\u5F85\u529E",
178
+ "aiCore.kindWrite": "\u5199\u5165",
179
+ "aiCore.statusApproval": "\u5F85\u786E\u8BA4",
180
+ "aiCore.statusCancelled": "\u5DF2\u53D6\u6D88",
181
+ "aiCore.statusDone": "\u5B8C\u6210",
182
+ "aiCore.statusError": "\u5931\u8D25",
183
+ "aiCore.statusPending": "\u7B49\u5F85",
184
+ "aiCore.statusRunning": "\u6267\u884C\u4E2D",
185
+ "aiCore.statusStreaming": "\u6D41\u5F0F\u4E2D",
186
+ "aiCore.todoProgress": "{p0}/{p1} \u5B8C\u6210",
187
+ /* ── aiDiff ── */
188
+ "aiDiff.accepted": "\u5DF2\u63A5\u53D7",
189
+ "aiDiff.binary": "\u4E8C\u8FDB\u5236\u6587\u4EF6\uFF0C\u65E0\u6CD5\u663E\u793A\u6587\u672C\u5DEE\u5F02",
190
+ "aiDiff.empty": "\u65E0\u5DEE\u5F02\u5185\u5BB9",
191
+ "aiDiff.rejected": "\u5DF2\u62D2\u7EDD",
192
+ /* ── aiFeedback ── */
193
+ "aiFeedback.helpful": "\u6709\u5E2E\u52A9",
194
+ "aiFeedback.notHelpful": "\u65E0\u5E2E\u52A9",
195
+ "aiFeedback.reasonCitationMismatch": "\u5F15\u7528\u4E0D\u7B26",
196
+ "aiFeedback.reasonOutdated": "\u5185\u5BB9\u8FC7\u65F6",
197
+ "aiFeedback.reasonUnauthorized": "\u8D8A\u6743\u4FE1\u606F",
198
+ "aiFeedback.reasonUnsourced": "\u65E0\u5F15\u7528\u4F9D\u636E",
199
+ "aiFeedback.reasonWrong": "\u7B54\u6848\u6709\u8BEF",
200
+ "aiFeedback.thanks": "\u611F\u8C22\u53CD\u9988\uFF0C\u5DF2\u5173\u8054\u5230\u8BE5\u6761\u56DE\u7B54\u7684\u8FFD\u8E2A\u8BB0\u5F55",
201
+ /* ── aiPanel ── */
202
+ "aiPanel.audit": "\u5BA1\u8BA1",
203
+ "aiPanel.cacheRead": "\u7F13\u5B58\u8BFB",
204
+ "aiPanel.cacheWrite": "\u7F13\u5B58\u5199",
205
+ "aiPanel.callsTokens": "{p0} \u6B21 \xB7 {p1} tok{p2}",
206
+ "aiPanel.clearAudit": "\u6E05\u9664\u5BA1\u8BA1",
207
+ "aiPanel.context": "\u4E0A\u4E0B\u6587",
208
+ "aiPanel.contextWindow": "\u4E0A\u4E0B\u6587\u7A97\u53E3",
209
+ "aiPanel.errorsCount": "{p0} \u5931\u8D25",
210
+ "aiPanel.files": "\u6587\u4EF6 ({p0})",
211
+ "aiPanel.itemStatus": "{p0}\uFF0C\u72B6\u6001\uFF1A{p1}",
212
+ "aiPanel.noAudit": "\u6682\u65E0\u5BA1\u8BA1\u8BB0\u5F55",
213
+ "aiPanel.noUsage": "\u6682\u65E0\u7528\u91CF",
214
+ "aiPanel.reasoning": "\u63A8\u7406",
215
+ "aiPanel.requestsCount": "{p0} \u6B21\u8BF7\u6C42",
216
+ "aiPanel.ringPercent": "\u4E0A\u4E0B\u6587\u7A97\u53E3\u5360\u7528 {p0}%\uFF0C\u70B9\u51FB\u67E5\u770B\u8BE6\u60C5",
217
+ "aiPanel.ringUsed": "\u5DF2\u7528 {p0}\uFF0C\u70B9\u51FB\u67E5\u770B\u8BE6\u60C5",
218
+ "aiPanel.taskProgress": "\u4EFB\u52A1\u8FDB\u5EA6",
219
+ "aiPanel.toolsCount": "{p0} \u5DE5\u5177",
220
+ "aiPanel.usage": "\u7528\u91CF",
221
+ "aiPanel.usageAria": "\u7528\u91CF\uFF1A{p0}",
222
+ /* ── aiProvider ── */
223
+ "aiProvider.audioUrlOnly": "\u4EC5 URL \u7684\u97F3\u9891\uFF08input_audio \u9700 base64\uFF0C\u8BF7\u5148\u53D6\u56DE\u5185\u8054\uFF09",
224
+ "aiProvider.audioUrlOnlyAnthropic": "\u4EC5 URL \u7684\u97F3\u9891\uFF08audio \u5757\u9700 base64 source\uFF09",
225
+ "aiProvider.base64File": "base64 \u6587\u4EF6\uFF08file \u90E8\u4EF6\u9700 Files API file_id\uFF0C\u8BF7\u7F6E\u4E8E url \u69FD\uFF09",
226
+ "aiProvider.corsHint": "\uFF1B\u6D4F\u89C8\u5668\u76F4\u8FDE {p0}\uFF08{p1}\uFF09\u5F88\u53EF\u80FD\u88AB CORS \u62E6\u622A\uFF0C\u5EFA\u8BAE\u7ECF\u4EE3\u7406/\u81EA\u5EFA\u7F51\u5173\u8F6C\u53D1",
227
+ "aiProvider.emptyResponse": "\u54CD\u5E94\u4E3A\u7A7A",
228
+ "aiProvider.glmLabel": "GLM\uFF08\u667A\u8C31\uFF09",
229
+ "aiProvider.invalidJson": "\u54CD\u5E94\u4E0D\u662F\u5408\u6CD5 JSON",
230
+ "aiProvider.kimiLabel": "Kimi\uFF08\u6708\u4E4B\u6697\u9762\uFF09",
231
+ "aiProvider.networkFailed": "\u7F51\u7EDC\u8BF7\u6C42\u5931\u8D25\uFF1A{p0}{p1}",
232
+ "aiProvider.nonPdfDocument": "\u975E PDF \u6587\u4EF6\u5757\uFF08document \u5757\u4E3A application/pdf\uFF0C\u6536\u5230 {p0}\uFF09",
233
+ "aiProvider.requestCancelled": "\u8BF7\u6C42\u5DF2\u53D6\u6D88",
234
+ "aiProvider.resourceRef": "[\u8D44\u6E90] {p0} ({p1})",
235
+ "aiProvider.streamError": "\u6D41\u5F0F\u54CD\u5E94\u9519\u8BEF",
236
+ "aiProvider.toolRoleNoCallId": "role 'tool' \u4E14\u7F3A toolCallId\uFF08openai \u65CF\u9700 tool_call_id\uFF09",
237
+ "aiProvider.toolRoleNoUseId": "role 'tool' \u4E14\u7F3A toolCallId\uFF08anthropic \u65CF\u6620\u5C04 tool_result \u9700 tool_use_id\uFF09",
238
+ "aiProvider.unsupported": "{p0} \u7EBF\u534F\u8BAE\u4E0D\u652F\u6301 {p1}",
239
+ "aiProvider.videoUnsupported": "video \u8F93\u5165\uFF08\u65E0\u4E3B\u6D41 chat API \u652F\u6301\uFF09",
240
+ "aiProvider.videoUnsupportedAnthropic": "video \u8F93\u5165",
241
+ /* ── aiThreads ── */
242
+ "aiThreads.actionsAria": "\u4F1A\u8BDD\u64CD\u4F5C",
243
+ "aiThreads.archived": "\u5DF2\u5F52\u6863",
244
+ /* ── aiTool ── */
245
+ "aiTool.allow": "\u5141\u8BB8",
246
+ "aiTool.reject": "\u62D2\u7EDD",
247
+ /* ── aiTools ── */
248
+ "aiTools.chart.area": "line \u591A\u7CFB\u5217\u586B\u5145\u9762\u79EF",
249
+ "aiTools.chart.data": "\u4EFB\u610F\u7EF4\u5EA6\u539F\u59CB\u8BB0\u5F55 + dims \u5B57\u6BB5\u6620\u5C04\uFF08\u81EA\u52A8\u900F\u89C6\u6210 \u7C7B\u76EE \xD7 \u7CFB\u5217\uFF09",
250
+ "aiTools.chart.dates": "\u8D21\u732E\u65E5\u5386 ISO \u65E5\u671F\uFF08\u4E0E values \u914D\u5BF9\uFF09",
251
+ "aiTools.chart.description": "\u5728\u7528\u6237\u754C\u9762\u6E32\u67D3\u4E00\u5F20\u56FE\u8868\u53EF\u89C6\u5316\u3002\u8F93\u5165\u4E00\u4EFD\u56FE\u8868\u89C4\u683C\uFF08\u7EAF JSON\uFF09\uFF1Alabels+values\uFF08\u7C7B\u76EE\u6570\u503C\uFF09\u3001series\uFF08\u591A\u7CFB\u5217\uFF09\u3001segments\uFF08\u5360\u6BD4\uFF09\u3001points\uFF08\u6563\u70B9\u6C14\u6CE1\uFF09\u3001dates\uFF08\u8D21\u732E\u65E5\u5386\uFF09\u4EFB\u7ED9\u5176\u4E00\uFF1Btype \u7F3A\u7701\u65F6\u6309\u6570\u636E\u5F62\u6001\u81EA\u52A8\u9009\u578B\uFF08\u65F6\u95F4\u5E8F\u5217\u2192\u6298\u7EBF\u3001\u5360\u6BD4\u2192\u73AF\u5F62\u3001\u65E5\u671F\u2192\u8D21\u732E\u65E5\u5386\u3001\u5750\u6807\u70B9\u2192\u6563\u70B9\uFF09\u3002\u56FE\u8868\u5E26\u4EA4\u4E92\uFF08\u60AC\u505C\u63D0\u793A/\u70B9\u51FB/\u53F3\u952E\uFF09\u4E0E\u53EF\u9690\u85CF\u56FE\u4F8B\u3002",
252
+ "aiTools.chart.dims": "data[] \u7684\u5B57\u6BB5\u6620\u5C04\uFF1A{label?, series?, value?, x?, y?}",
253
+ "aiTools.chart.format": "\u6570\u503C\u683C\u5F0F\u5316\uFF1A{notation?: compact|percent|ms, unit?}",
254
+ "aiTools.chart.labels": "\u7C7B\u76EE\u8F74\uFF08line/vbar/hbar\uFF09",
255
+ "aiTools.chart.legend": "false = \u521D\u59CB\u9690\u85CF\u56FE\u4F8B",
256
+ "aiTools.chart.lttb": "\u5927\u6570\u636E\u91CF\u964D\u91C7\u6837\uFF1Atrue=\u81EA\u52A8\u4E0A\u9650\uFF0C\u6570\u5B57=\u6700\u5927\u4FDD\u7559\u70B9\u6570\uFF08\u6E32\u67D3\u5C42\u5951\u7EA6\uFF0C\u968F\u56FE\u8868\u91CD\u5EA6\u573A\u666F\u843D\u5730\uFF09",
257
+ "aiTools.chart.marks": "\u6807\u8BB0\u5C42\uFF08\u9608\u503C\u7EBF/\u53C2\u8003\u533A\u95F4/\u5F3A\u8C03\u70B9\uFF09\uFF0C\u5143\u7D20\u4E3A\u7EAF JSON \u63CF\u8FF0\u5B50\uFF08\u6E32\u67D3\u5C42\u5951\u7EA6\uFF0C\u968F\u56FE\u8868\u91CD\u5EA6\u573A\u666F\u843D\u5730\uFF09",
258
+ "aiTools.chart.points": "\u6563\u70B9/\u6C14\u6CE1\uFF1A[{x,y,size?,label?}]",
259
+ "aiTools.chart.radarAxes": "\u96F7\u8FBE\u8F74\u540D",
260
+ "aiTools.chart.segments": "\u5360\u6BD4\u578B\uFF08donut/stack\uFF09\uFF1A[{label,value}]",
261
+ "aiTools.chart.series": "\u591A\u7CFB\u5217\uFF08line/vbar/radar\uFF09",
262
+ "aiTools.chart.stacked": "vbar \u591A\u7CFB\u5217\u5806\u53E0\uFF08\u9ED8\u8BA4\u5206\u7EC4\uFF09",
263
+ "aiTools.chart.title": "\u56FE\u8868\u6807\u9898\uFF08\u6E32\u67D3\u5728\u5934\u90E8\u884C\u5DE6\u4FA7\uFF09",
264
+ "aiTools.chart.tooltip": "false = \u5173\u95ED\u5185\u7F6E\u63D0\u793A",
265
+ "aiTools.chart.type": "\u56FE\u8868\u7C7B\u578B\uFF0C\u7F3A\u7701\u81EA\u52A8\u63A8\u65AD",
266
+ "aiTools.chart.values": "\u5355\u7CFB\u5217\u6570\u503C\uFF08\u4E0E labels \u914D\u5BF9\uFF09",
267
+ "aiTools.chart.zoom": "\u7F29\u653E\u4EA4\u4E92\uFF1A'x'=\u7C7B\u76EE\u8F74\u533A\u95F4\u7F29\u653E\uFF0C'brush'=\u5237\u9009\u7F29\u653E",
268
+ "aiTools.datatable.columns": "\u5217\u5B9A\u4E49\u6570\u7EC4\uFF1A\u6BCF\u9879 { key, title, sortable?, filterable? }\uFF08key \u5BF9\u5E94 rows \u5143\u7D20\u5B57\u6BB5\u540D\uFF09",
269
+ "aiTools.datatable.description": "\u5728\u7528\u6237\u754C\u9762\u6E32\u67D3\u4E00\u4E2A\u53EF\u641C\u7D22\u3001\u5206\u9875\u3001\u53EF\u5BFC\u51FA CSV \u7684\u6570\u636E\u8868\u683C\u3002\u8F93\u5165\u7EAF JSON\uFF1Acolumns \u4E3A\u5217\u5B9A\u4E49\uFF08key/title \u5FC5\u586B\uFF09\uFF0Crows \u4E3A\u884C\u5BF9\u8C61\u6570\u7EC4\uFF08\u5B57\u6BB5\u540D\u5BF9\u9F50\u5217 key\uFF09\u3002\u8FD4\u56DE { title, rows: \u884C\u6570 } \u6458\u8981\u3002",
270
+ "aiTools.datatable.rows": "\u884C\u6570\u636E\u6570\u7EC4\uFF1A\u6BCF\u9879\u4E3A\u4E00\u4E2A\u5BF9\u8C61\uFF0C\u5B57\u6BB5\u540D\u5BF9\u9F50 columns[].key",
271
+ "aiTools.datatable.title": "\u8868\u683C\u6807\u9898\uFF08\u6E32\u67D3\u5728\u5DE5\u5177\u680F\u5DE6\u4FA7\uFF09",
272
+ "aiTools.execFailed": "\u5DE5\u5177\u6267\u884C\u5931\u8D25\uFF1A{p0}",
273
+ "aiTools.execTimeout": "\u6267\u884C\u8D85\u65F6\uFF08{p0}ms\uFF09",
274
+ "aiTools.manifestHeader": "\u53EF\u7528 UI \u5DE5\u5177\uFF08\u8C03\u7528\u540E\u5728\u7528\u6237\u754C\u9762\u6302\u8F7D\u53EF\u89C6\u5316\u7ED3\u679C\uFF09\uFF1A",
275
+ "aiTools.missingRequired": "\u7F3A\u5C11\u5FC5\u586B\u5B57\u6BB5",
276
+ "aiTools.none": "\uFF08\u65E0\u5DF2\u6CE8\u518C\u7684 UI \u5DE5\u5177\uFF09",
277
+ "aiTools.notInEnum": "\u4E0D\u5728\u5141\u8BB8\u53D6\u503C\u5185\uFF08{p0}\uFF09",
278
+ "aiTools.numMax": "\u6570\u503C {p0} \u5927\u4E8E\u6700\u5927\u503C {p1}",
279
+ "aiTools.numMin": "\u6570\u503C {p0} \u5C0F\u4E8E\u6700\u5C0F\u503C {p1}",
280
+ "aiTools.removeMount": "\u79FB\u9664 {p0} \u6302\u8F7D",
281
+ "aiTools.strMax": "\u957F\u5EA6 {p0} \u8D85\u8FC7\u4E0A\u9650 {p1}",
282
+ "aiTools.strMin": "\u957F\u5EA6 {p0} \u5C0F\u4E8E\u4E0B\u9650 {p1}",
283
+ "aiTools.typeMismatch": "\u671F\u671B {p0}\uFF0C\u5B9E\u5F97 {p1}",
284
+ "aiTools.validationFailed": "\u53C2\u6570\u6821\u9A8C\u5931\u8D25\uFF08{p0} \u9879\uFF09",
285
+ /* ── autocomplete ── */
286
+ "suggestions.loading": "\u6B63\u5728\u67E5\u627E\u5EFA\u8BAE\u2026",
287
+ "suggestions.error": "\u6682\u65F6\u65E0\u6CD5\u52A0\u8F7D\u5EFA\u8BAE\uFF0C\u8BF7\u91CD\u8BD5\u3002",
288
+ "suggestions.options": "\u5EFA\u8BAE",
289
+ "suggestions.empty": "\u6CA1\u6709\u5339\u914D\u7684\u5EFA\u8BAE",
290
+ "autocomplete.empty": "\u65E0\u5339\u914D\u7ED3\u679C",
291
+ /* ── backTop ── */
292
+ "backTop.label": "\u56DE\u5230\u9876\u90E8",
293
+ /* ── carousel ── */
294
+ "carousel.item": "\u7B2C {p0} \u5F20",
295
+ "carousel.region": "\u8F6E\u64AD",
296
+ "carousel.slide": "\u5E7B\u706F\u7247",
297
+ "carousel.status": "\u7B2C {p0} / {p1} \u5F20",
298
+ /* ── charts ── */
299
+ "charts.calendarWeekdays": ["\u4E00", "", "\u4E09", "", "\u4E94", "", "\u65E5"],
300
+ "charts.few": "\u5C11",
301
+ "charts.hideLegend": "\u9690\u85CF\u56FE\u4F8B",
302
+ "charts.loading": "\u52A0\u8F7D\u4E2D",
303
+ "charts.many": "\u591A",
304
+ "charts.monthLabel": "{p0}\u6708",
305
+ "charts.noData": "\u6682\u65E0\u6570\u636E",
306
+ "charts.resetZoom": "\u91CD\u7F6E\u7F29\u653E",
307
+ "charts.sampled": "\u5DF2\u62BD\u6837 {p0}\u2192{p1} \u70B9",
308
+ "charts.type.area": "\u9762\u79EF\u56FE",
309
+ "charts.type.donut": "\u73AF\u5F62\u56FE",
310
+ "charts.type.gauge": "\u4EEA\u8868\u76D8",
311
+ "charts.type.graph": "\u77E5\u8BC6\u56FE\u8C31",
312
+ "charts.type.heatmap": "\u70ED\u529B\u56FE",
313
+ "charts.type.line": "\u6298\u7EBF\u56FE",
314
+ "charts.type.map": "\u5730\u56FE",
315
+ "charts.type.radar": "\u96F7\u8FBE\u56FE",
316
+ "charts.type.scatter": "\u6563\u70B9\u56FE",
317
+ "charts.type.sparkline": "\u8FF7\u4F60\u8D8B\u52BF",
318
+ "charts.seriesName": "\u7CFB\u5217{p0}",
319
+ "charts.showLegend": "\u663E\u793A\u56FE\u4F8B",
320
+ "charts.value": "\u6570\u503C",
321
+ /* ── themeSwitcher ── */
322
+ "themeSwitcher.appearance": "\u5916\u89C2",
323
+ "themeSwitcher.theme": "\u4E3B\u9898",
324
+ "themeSwitcher.primitive": "\u539F\u8BED",
325
+ "themeSwitcher.mode": "\u660E\u6697",
326
+ "themeSwitcher.light": "\u6D45\u8272",
327
+ "themeSwitcher.dark": "\u6DF1\u8272",
328
+ "themeSwitcher.modern": "\u73B0\u4EE3",
329
+ "themeSwitcher.dongyun": "\u4E1C\u97F5",
330
+ "themeSwitcher.jugou": "\u5DE8\u6784",
331
+ "themeSwitcher.piano": "\u94A2\u7434",
332
+ "themeSwitcher.monet": "\u83AB\u5948",
333
+ "themeSwitcher.vangogh": "\u68B5\u9AD8",
334
+ "themeSwitcher.chinese": "\u4E2D\u5F0F",
335
+ "themeSwitcher.soviet": "\u82CF\u5F0F",
336
+ "themeSwitcher.pixel": "\u50CF\u7D20",
337
+ /* ── codeBlock ── */
338
+ "codeBlock.collapse": "\u6536\u8D77",
339
+ "codeBlock.region": "\u4EE3\u7801\u5185\u5BB9",
340
+ "codeBlock.copyFailed": "\u672A\u80FD\u590D\u5236\uFF0C\u8BF7\u91CD\u8BD5\u3002",
341
+ "codeBlock.copyRetry": "\u91CD\u8BD5\u590D\u5236",
342
+ "codeBlock.copy": "\u590D\u5236",
343
+ "codeBlock.foldCollapse": "\u6298\u53E0\u4EE3\u7801",
344
+ "codeBlock.foldExpand": "\u5C55\u5F00\u4EE3\u7801",
345
+ "codeBlock.linesTotal": "\u5171 {p0} \u884C",
346
+ "codeBlock.numHide": "\u9690\u85CF\u884C\u53F7",
347
+ "codeBlock.numShow": "\u663E\u793A\u884C\u53F7",
348
+ "codeBlock.tailAria": "\u5C55\u5F00\u6216\u6536\u8D77\u4EE3\u7801",
349
+ "codeBlock.wrapOff": "\u5173\u95ED\u6362\u884C",
350
+ "codeBlock.wrapOn": "\u81EA\u52A8\u6362\u884C",
351
+ /* ── common ── */
352
+ "common.accept": "\u63A5\u53D7",
353
+ "common.add": "\u65B0\u589E",
354
+ "common.all": "\u5168\u90E8",
355
+ "common.approve": "\u6279\u51C6",
356
+ "common.cancel": "\u53D6\u6D88",
357
+ "common.actionFailed": "\u64CD\u4F5C\u672A\u5B8C\u6210\uFF0C\u8BF7\u91CD\u8BD5\u3002",
358
+ "common.close": "\u5173\u95ED",
359
+ "common.confirm": "\u786E\u8BA4",
360
+ "common.copied": "\u5DF2\u590D\u5236",
361
+ "common.copy": "\u590D\u5236",
362
+ "common.delete": "\u5220\u9664",
363
+ "common.enable": "\u542F\u7528",
364
+ "common.exportCsv": "\u5BFC\u51FA CSV",
365
+ "common.healthy": "\u6B63\u5E38",
366
+ "common.input": "\u8F93\u5165",
367
+ "common.loadingEllipsis": "\u52A0\u8F7D\u4E2D\u2026",
368
+ "common.official": "\u5B98\u65B9",
369
+ "common.output": "\u8F93\u51FA",
370
+ "common.page": "\u7B2C {p0} \u9875",
371
+ "common.reject": "\u62D2\u7EDD",
372
+ "common.remove": "\u79FB\u9664",
373
+ "common.requestAccess": "\u7533\u8BF7\u8BBF\u95EE",
374
+ "common.requestAccessFor": "\u7533\u8BF7\u8BBF\u95EE {p0}",
375
+ "common.restricted": "\u53D7\u9650",
376
+ "common.retry": "\u91CD\u8BD5",
377
+ "common.rows": "{p0} \u884C",
378
+ "common.run": "\u8FD0\u884C",
379
+ "common.steps": "{p0} \u6B65",
380
+ "common.submit": "\u63D0\u4EA4",
381
+ "common.unknown": "\u672A\u77E5",
382
+ /* ── contextMenu ── */
383
+ "contextMenu.back": "\u540E\u9000",
384
+ "contextMenu.copyPageLink": "\u590D\u5236\u9875\u9762\u94FE\u63A5",
385
+ "contextMenu.forward": "\u524D\u8FDB",
386
+ "contextMenu.refresh": "\u5237\u65B0",
387
+ /* ── copy ── */
388
+ "copy.copied": "\u5DF2\u590D\u5236",
389
+ "copy.failed": "\u672A\u80FD\u590D\u5236\uFF0C\u8BF7\u91CD\u8BD5\u3002",
390
+ "copy.denied": "clipboard API \u88AB\u62D2\uFF08{p0}\uFF09\u4E14\u56DE\u9000 execCommand \u5931\u8D25",
391
+ "copy.unavailable": "\u526A\u8D34\u677F\u4E0D\u53EF\u7528\uFF08\u65E0 clipboard API \u4E14 execCommand \u56DE\u9000\u5931\u8D25\uFF09",
392
+ "copy.unknown": "\u672A\u77E5\u9519\u8BEF",
393
+ /* ── datatable ── */
394
+ "datatable.clear": "\u6E05\u7A7A",
395
+ "datatable.collapseGroup": "\u6298\u53E0\u5206\u7EC4 {p0}",
396
+ "datatable.columnSettingsAria": "\u5217\u8BBE\u7F6E",
397
+ "datatable.countUnit": "{p0} \u6761",
398
+ "datatable.editHint": "\u7F16\u8F91\u300C{p0}\u300D\uFF1A\u53CC\u51FB\u6216\u6309 Enter",
399
+ "datatable.editHintWithValue": "{p0}\uFF08\u53CC\u51FB\u6216\u6309 Enter \u7F16\u8F91\u300C{p1}\u300D\uFF09",
400
+ "datatable.empty": "\u6682\u65E0\u6570\u636E",
401
+ "datatable.emptyValue": "\uFF08\u7A7A\uFF09",
402
+ "datatable.expandGroup": "\u5C55\u5F00\u5206\u7EC4 {p0}",
403
+ "datatable.expandRow": "\u5C55\u5F00\u884C",
404
+ "datatable.filterChipAria": "\u7B5B\u9009\u300C{p0}\u300D",
405
+ "datatable.pageSizeAria": "\u6BCF\u9875\u6761\u6570",
406
+ "datatable.paginationAria": "\u5206\u9875",
407
+ "datatable.reset": "\u91CD\u7F6E",
408
+ "datatable.resizeAria": "\u8C03\u6574\u300C{p0}\u300D\u5217\u5BBD",
409
+ "datatable.searchAria": "\u641C\u7D22\u8868\u683C",
410
+ "datatable.searchPlaceholder": "\u641C\u7D22\u2026",
411
+ "datatable.selectAll": "\u5168\u9009",
412
+ "datatable.selectRow": "\u9009\u62E9\u8BE5\u884C",
413
+ "datatable.selectedCount": "\u5DF2\u9009 {p0} \u9879",
414
+ "datatable.totalCount": "\u5171 {p0} \u6761",
415
+ "datatable.totalLabel": "\u5408\u8BA1",
416
+ /* ── datePicker ── */
417
+ "datePicker.noDates": "\u6CA1\u6709\u53EF\u9009\u65E5\u671F",
418
+ "datePicker.clear": "\u6E05\u9664",
419
+ "datePicker.nextMonth": "\u4E0B\u4E00\u6708",
420
+ "datePicker.prevMonth": "\u4E0A\u4E00\u6708",
421
+ "datePicker.selectDate": "\u9009\u62E9\u65E5\u671F",
422
+ "datePicker.today": "\u4ECA\u5929",
423
+ "datePicker.weekdays": ["\u4E00", "\u4E8C", "\u4E09", "\u56DB", "\u4E94", "\u516D", "\u65E5"],
424
+ "datePicker.weekdaysSunFirst": ["\u65E5", "\u4E00", "\u4E8C", "\u4E09", "\u56DB", "\u4E94", "\u516D"],
425
+ "datePicker.yearMonth": "{p0} \u5E74 {p1} \u6708",
426
+ /* ── formValidate ── */
427
+ "formValidate.email": "\u8BF7\u8F93\u5165\u6709\u6548\u7684\u90AE\u7BB1\u5730\u5740",
428
+ "formValidate.invalid": "\u8F93\u5165\u4E0D\u5408\u6CD5",
429
+ "formValidate.matches": "\u4E24\u6B21\u8F93\u5165\u4E0D\u4E00\u81F4",
430
+ "formValidate.max": "\u4E0D\u80FD\u5927\u4E8E {max}",
431
+ "formValidate.maxlength": "\u6700\u591A\u8F93\u5165 {max} \u4E2A\u5B57\u7B26",
432
+ "formValidate.min": "\u4E0D\u80FD\u5C0F\u4E8E {min}",
433
+ "formValidate.minlength": "\u81F3\u5C11\u8F93\u5165 {min} \u4E2A\u5B57\u7B26",
434
+ "formValidate.number": "\u8BF7\u8F93\u5165\u6709\u6548\u7684\u6570\u5B57",
435
+ "formValidate.pattern": "\u8F93\u5165\u683C\u5F0F\u4E0D\u6B63\u786E",
436
+ "formValidate.required": "\u6B64\u9879\u4E3A\u5FC5\u586B\u9879",
437
+ "formValidate.selectPlaceholder": "\u8BF7\u9009\u62E9",
438
+ "formValidate.step": "\u6570\u503C\u5FC5\u987B\u662F {step} \u7684\u500D\u6570",
439
+ "formValidate.summary": "\u8868\u5355\u6709 {p0} \u9879\u5185\u5BB9\u9700\u8981\u4FEE\u6B63\uFF0C\u8BF7\u4FEE\u6539\u540E\u91CD\u65B0\u63D0\u4EA4",
440
+ "formValidate.tool.description": "\u5411\u7528\u6237\u6E32\u67D3\u4E00\u4E2A\u7ED3\u6784\u5316\u8868\u5355\u6536\u96C6\u8F93\u5165",
441
+ "formValidate.tool.fields": "\u5B57\u6BB5\u5217\u8868",
442
+ "formValidate.tool.help": "\u5B57\u6BB5\u4E0B\u65B9\u7684\u5E2E\u52A9\u6587\u6848",
443
+ "formValidate.tool.label": "\u5B57\u6BB5\u6807\u7B7E",
444
+ "formValidate.tool.max": "\u6700\u5927\u503C\uFF08number \u7528\uFF09",
445
+ "formValidate.tool.min": "\u6700\u5C0F\u503C\uFF08number \u7528\uFF09",
446
+ "formValidate.tool.name": "\u5B57\u6BB5\u540D\uFF08\u63D0\u4EA4\u503C\u7684 key\uFF09",
447
+ "formValidate.tool.options": "select \u9009\u9879\uFF08\u5B57\u7B26\u4E32\u6216 {label,value}\uFF09",
448
+ "formValidate.tool.pattern": "\u6B63\u5219\u7EA6\u675F\uFF08HTML pattern \u8BED\u6CD5\uFF0C\u6574\u4E32\u5339\u914D\uFF09",
449
+ "formValidate.tool.required": "\u662F\u5426\u5FC5\u586B",
450
+ "formValidate.tool.submitText": "\u63D0\u4EA4\u6309\u94AE\u6587\u6848\uFF0C\u9ED8\u8BA4\u300C\u63D0\u4EA4\u300D",
451
+ "formValidate.tool.title": "\u8868\u5355\u6807\u9898\uFF08\u53EF\u9009\uFF09",
452
+ "formValidate.tool.type": "\u63A7\u4EF6\u7C7B\u578B\uFF0C\u9ED8\u8BA4 text",
453
+ "formValidate.url": "\u8BF7\u8F93\u5165\u6709\u6548\u7684\u94FE\u63A5\u5730\u5740",
454
+ /* ── input ── */
455
+ "input.clearSearch": "\u6E05\u7A7A\u641C\u7D22",
456
+ "input.hidePassword": "\u9690\u85CF\u5BC6\u7801",
457
+ "input.otpPosition": "\u7B2C {p0} \u4F4D\uFF0C\u5171 {p1} \u4F4D",
458
+ "panel.expand": "\u5C55\u5F00",
459
+ "panel.collapse": "\u6298\u53E0",
460
+ "input.showPassword": "\u663E\u793A\u5BC6\u7801",
461
+ /* ── kbAccess ── */
462
+ "kbAccess.approveTip": "\u6279\u51C6\u8BE5\u8BBF\u95EE\u7533\u8BF7",
463
+ "kbAccess.approvedBadge": "\u5DF2\u6279\u51C6 \xB7 {p0}",
464
+ "kbAccess.approverNotePlaceholder": "\u7ED9\u8BF7\u6C42\u4EBA\u7684\u7559\u8A00\uFF08\u53EF\u9009\uFF09",
465
+ "kbAccess.daysLeft": "{p0} \u5929\u540E",
466
+ "kbAccess.defaultSubject": "\u8BE5\u5185\u5BB9",
467
+ "kbAccess.deniedHint": "\u672A\u901A\u8FC7\u2014\u2014\u53EF\u8C03\u6574\u7406\u7531\u540E\u91CD\u65B0\u7533\u8BF7",
468
+ "kbAccess.denyNoteLabel": "\u62D2\u7EDD\u7559\u8A00\uFF08\u53EF\u9009\uFF09",
469
+ "kbAccess.duration30d": "30 \u5929",
470
+ "kbAccess.duration7d": "7 \u5929",
471
+ "kbAccess.durationForever": "\u6C38\u4E45",
472
+ "kbAccess.durationLabel": "\u8BBF\u95EE\u65F6\u957F",
473
+ "kbAccess.expired": "\u5DF2\u5230\u671F",
474
+ "kbAccess.expiresAt": "{p0}\u5230\u671F",
475
+ "kbAccess.grantAsPrefix": "\u6279\u51C6\u4E3A{p0}",
476
+ "kbAccess.grantRoleLabel": "\u6279\u51C6\u89D2\u8272",
477
+ "kbAccess.hoursLeft": "{p0} \u5C0F\u65F6\u540E",
478
+ "kbAccess.minutesLeft": "{p0} \u5206\u949F\u540E",
479
+ "kbAccess.ownerLabel": "\u5185\u5BB9\u8D1F\u8D23\u4EBA",
480
+ "kbAccess.ownerPrefix": "\u8D1F\u8D23\u4EBA\uFF1A{p0}",
481
+ "kbAccess.reapply": "\u91CD\u65B0\u7533\u8BF7",
482
+ "kbAccess.reasonLabel": "\u7533\u8BF7\u7406\u7531",
483
+ "kbAccess.reasonPlaceholder": "\u8BF4\u660E\u4E1A\u52A1\u539F\u56E0\uFF08\u5BA1\u6279\u4EBA\u53EF\u89C1\uFF09",
484
+ "kbAccess.rejectTip": "\u62D2\u7EDD\u8BE5\u8BBF\u95EE\u7533\u8BF7",
485
+ "kbAccess.requestRenewal": "\u7533\u8BF7\u7EED\u671F",
486
+ "kbAccess.requestToPrefix": "\u8BF7\u6C42\u5C06\u53D1\u9001\u7ED9\uFF1A{p0}",
487
+ "kbAccess.restrictedContent": "\u53D7\u9650\u5185\u5BB9",
488
+ "kbAccess.restrictedHint": "\u6B64\u5185\u5BB9\u4EC5\u5BF9\u6388\u6743\u8005\u5F00\u653E",
489
+ "kbAccess.revokedHint": "\u8BBF\u95EE\u5DF2\u88AB\u6536\u56DE",
490
+ "kbAccess.roleLabel": "\u7533\u8BF7\u89D2\u8272",
491
+ "kbAccess.submitRequest": "\u63D0\u4EA4\u7533\u8BF7",
492
+ "kbAccess.switchIdentity": "\u5207\u6362\u8EAB\u4EFD",
493
+ "kbAccess.switchIdentityTip": "\u5207\u6362\u8EAB\u4EFD\u540E\u91CD\u65B0\u68C0\u67E5\u6743\u9650",
494
+ "kbAccess.unknownRequester": "\u672A\u77E5\u8BF7\u6C42\u4EBA",
495
+ "kbAccess.waitingApproval": "\u7B49\u5F85 {p0} \u5BA1\u6279",
496
+ /* ── kbAcl ── */
497
+ "kbAcl.breakHint": "\u505C\u6B62\u4ECE\u7236\u7EA7\u7EE7\u627F\uFF0C\u6539\u4E3A\u72EC\u7ACB\u7BA1\u7406\u672C\u9879\u6743\u9650",
498
+ "kbAcl.breakInheritance": "\u505C\u6B62\u7EE7\u627F",
499
+ "kbAcl.brokenNotice": "\u5DF2\u505C\u6B62\u7EE7\u627F\u2014\u2014\u672C\u9879\u6743\u9650\u72EC\u7ACB\u4E8E\u7236\u7EA7",
500
+ "kbAcl.detachedChildren": "{p0}\uFF1A{p1} \u4E2A\u5B50\u9879\u5DF2\u8131\u79BB",
501
+ "kbAcl.directAccess": "\u76F4\u63A5\u8BBF\u95EE",
502
+ "kbAcl.exception": "\u4F8B\u5916",
503
+ "kbAcl.expiredOn": "\u5DF2\u8FC7\u671F\uFF08{p0}\uFF09",
504
+ "kbAcl.expiresIn": "{p0} \u5230\u671F",
505
+ "kbAcl.grantAccess": "\u6388\u4E88\u8BBF\u95EE",
506
+ "kbAcl.inheritedFrom": "\u7EE7\u627F\u81EA {p0}",
507
+ "kbAcl.inheritedFromLabel": "\u7EE7\u627F\u81EA",
508
+ "kbAcl.linkAccess": "\u94FE\u63A5\u8BBF\u95EE",
509
+ "kbAcl.noDirect": "\u6682\u65E0\u76F4\u63A5\u6388\u6743",
510
+ "kbAcl.noLinks": "\u65E0\u94FE\u63A5",
511
+ "kbAcl.removeEntry": "\u79FB\u9664 {p0}",
512
+ "kbAcl.restoreHint": "\u6062\u590D\u7EE7\u627F\u5C06\u4E22\u5F03\u672C\u9879\u81EA\u5B9A\u4E49\u7684\u6743\u9650",
513
+ "kbAcl.restoreInheritance": "\u6062\u590D\u7EE7\u627F",
514
+ "kbAcl.rootNotice": "\u6839\u7EA7\u8D44\u6E90\u2014\u2014\u65E0\u7236\u7EA7\u7EE7\u627F",
515
+ "kbAcl.systemBadge": "\u7CFB\u7EDF\u7BA1\u7406",
516
+ "kbAcl.systemNote": "\u7CFB\u7EDF\u81EA\u52A8\uFF0C\u4E0D\u53EF\u624B\u5DE5\u79FB\u9664",
517
+ "kbAcl.unnamedResource": "\u672A\u547D\u540D\u8D44\u6E90",
518
+ "kbAcl.visibleToCount": "\u5BF9 {p0} \u4EBA\u53EF\u89C1",
519
+ /* ── kbAnswer ── */
520
+ "kbAnswer.chartBar": "\u67F1\u72B6",
521
+ "kbAnswer.chartLine": "\u6298\u7EBF",
522
+ "kbAnswer.chartPie": "\u997C\u56FE",
523
+ "kbAnswer.exportNoun": "\u5BFC\u51FA {p0}",
524
+ "kbAnswer.filtered": "\u5DF2\u6309\u4F60\u7684\u6570\u636E\u6743\u9650\u8FC7\u6EE4",
525
+ "kbAnswer.filteredDetail": "\u5DF2\u6309\u4F60\u7684\u6570\u636E\u6743\u9650\u8FC7\u6EE4\uFF1A{p0}",
526
+ "kbAnswer.followups": "\u8FFD\u95EE\u5EFA\u8BAE",
527
+ "kbAnswer.hitAssets": "\u547D\u4E2D\u8D44\u4EA7\uFF1A{p0}",
528
+ "kbAnswer.kindCurated": "\u4EBA\u5DE5\u7B56\u5C55",
529
+ "kbAnswer.kindFunction": "\u51FD\u6570",
530
+ "kbAnswer.kindParameterized": "\u53C2\u6570\u5316\u67E5\u8BE2",
531
+ "kbAnswer.maskedPrefix": "\u5DF2\u8131\u654F\u5217\uFF1A",
532
+ "kbAnswer.rerunTip": "\u53C2\u6570\u53EF\u6539\u91CD\u8DD1",
533
+ "kbAnswer.truncated": "\u5DF2\u622A\u65AD\uFF1A\u663E\u793A {p0}/{p1} \u884C{p2}",
534
+ "kbAnswer.verifiedBadge": "\u8BA4\u8BC1\u7B54\u6848",
535
+ /* ── kbAudit ── */
536
+ "kbAudit.actionDetail": "\u5904\u7F6E\uFF1A{p0} \xB7 {p1}",
537
+ "kbAudit.actionLabel": "\u5904\u7F6E",
538
+ "kbAudit.alertedNote": "\u5DF2\u5B9E\u65F6\u544A\u8B66\u5B89\u5168\u56E2\u961F",
539
+ "kbAudit.channelFilterAria": "\u5BA1\u8BA1\u901A\u9053\u8FC7\u6EE4",
540
+ "kbAudit.channelPermission": "\u6743\u9650\u53D8\u66F4",
541
+ "kbAudit.channelRead": "\u8BFB\u53D6",
542
+ "kbAudit.channelRequest": "\u7533\u8BF7",
543
+ "kbAudit.channelSystem": "\u7CFB\u7EDF",
544
+ "kbAudit.empty": "\u6682\u65E0\u5BA1\u8BA1\u4E8B\u4EF6",
545
+ "kbAudit.exportTip": "\u5BFC\u51FA\u5F53\u524D\u8FC7\u6EE4\u89C6\u56FE\u4E3A CSV",
546
+ "kbAudit.hygieneLabel": "\u6743\u9650\u5F02\u5473",
547
+ "kbAudit.noHygiene": "\u672A\u53D1\u73B0\u6743\u9650\u5F02\u5473",
548
+ /* ── kbCanvas ── */
549
+ "kbCanvas.splitterAria": "\u8C03\u6574\u753B\u5E03\u53CC\u680F\u6BD4\u4F8B",
550
+ "kbCanvas.splitterTip": "\u62D6\u62FD\u8C03\u6574\u6BD4\u4F8B\uFF08\u2190/\u2192 \u5FAE\u8C03\uFF0C\u53CC\u51FB\u590D\u4F4D\uFF09",
551
+ /* ── kbCheckpoint ── */
552
+ "kbCheckpoint.chatAuditNote": "\u8BA8\u8BBA\u5386\u53F2\u6709\u5BA1\u8BA1\u4EF7\u503C",
553
+ "kbCheckpoint.label": "\u68C0\u67E5\u70B9",
554
+ "kbCheckpoint.restore": "\u6062\u590D\u68C0\u67E5\u70B9",
555
+ "kbCheckpoint.scopeBoth": "\u5185\u5BB9\u4E0E\u5BF9\u8BDD",
556
+ "kbCheckpoint.scopeChat": "\u4EC5\u5BF9\u8BDD",
557
+ "kbCheckpoint.scopeContent": "\u4EC5\u5185\u5BB9\uFF08\u4FDD\u7559\u5BF9\u8BDD\uFF09",
558
+ "kbCheckpoint.scopeMissing": "\u8BE5\u68C0\u67E5\u70B9\u672A\u5305\u542B\u6B64\u6062\u590D\u8303\u56F4",
559
+ /* ── kbChunks ── */
560
+ "kbChunks.addKeyword": "+ \u5173\u952E\u8BCD",
561
+ "kbChunks.chunkAddKeywordAria": "chunk {p0} \u65B0\u589E\u5173\u952E\u8BCD",
562
+ "kbChunks.chunkContentAria": "chunk {p0} \u5185\u5BB9",
563
+ "kbChunks.chunkEnableAria": "chunk {p0} \u542F\u7528",
564
+ "kbChunks.deleteChunkAria": "\u5220\u9664 chunk {p0}",
565
+ "kbChunks.disableNote": "\u5173\u95ED\u540E\u4E0D\u5220\u9664\uFF0C\u4EC5\u6392\u9664\u51FA\u68C0\u7D22",
566
+ "kbChunks.edited": "\u5DF2\u7F16\u8F91",
567
+ "kbChunks.empty": "\u6682\u65E0 chunk",
568
+ "kbChunks.modeFull": "\u5168\u6587",
569
+ "kbChunks.modeLabel": "\u641C\u7D22\u6A21\u5F0F",
570
+ "kbChunks.modeVector": "\u8BED\u4E49",
571
+ "kbChunks.removeKeyword": "\u79FB\u9664\u5173\u952E\u8BCD {p0}",
572
+ "kbChunks.searchAria": "\u641C\u7D22 chunk",
573
+ "kbChunks.searchFullPlaceholder": "\u5168\u6587\u641C\u7D22 chunk\u2026",
574
+ "kbChunks.searchVectorPlaceholder": "\u8BED\u4E49\u641C\u7D22 chunk\u2026",
575
+ /* ── kbCitation ── */
576
+ "kbCitation.sourceN": "\u6765\u6E90 {p0}",
577
+ "kbCitation.unavailable": "\u6765\u6E90\u5DF2\u4E0D\u53EF\u7528",
578
+ /* ── kbClarify ── */
579
+ "kbClarify.parsedPrefix": "\u5DF2\u89E3\u6790\uFF1A",
580
+ /* ── kbConflict ── */
581
+ "kbConflict.owner": "\u8D23\u4EFB\u4EBA {p0}",
582
+ /* ── kbConnector ── */
583
+ "kbConnector.changeRate": "\u53D8\u66F4\u7387",
584
+ "kbConnector.crawlRate": "\u6293\u53D6\u7387",
585
+ "kbConnector.credentials": "\u51ED\u8BC1",
586
+ "kbConnector.credentialsExpired": "\u51ED\u8BC1\u8FC7\u671F",
587
+ "kbConnector.editSchedule": "\u7F16\u8F91\u8BA1\u5212",
588
+ "kbConnector.empty": "\u6682\u65E0\u8FDE\u63A5\u5668",
589
+ "kbConnector.failing": "\u5F02\u5E38",
590
+ "kbConnector.lastSync": "\u6700\u8FD1\u540C\u6B65 {p0}",
591
+ "kbConnector.neverSynced": "\u4ECE\u672A\u540C\u6B65",
592
+ "kbConnector.notConfigured": "\u672A\u914D\u7F6E",
593
+ "kbConnector.off": "\u5DF2\u505C\u7528",
594
+ "kbConnector.perDay": "{p0}/\u5929",
595
+ "kbConnector.reauth": "\u91CD\u65B0\u6388\u6743",
596
+ "kbConnector.stale": "\u505C\u6EDE",
597
+ "kbConnector.syncNow": "\u7ACB\u5373\u540C\u6B65",
598
+ "kbConnector.synced": "\u5DF2\u540C\u6B65",
599
+ /* ── kbCore ── */
600
+ "kbCore.accessDenied": "\u672A\u901A\u8FC7",
601
+ "kbCore.accessExpired": "\u5DF2\u8FC7\u671F",
602
+ "kbCore.accessExpiring": "\u5373\u5C06\u5230\u671F",
603
+ "kbCore.accessGranted": "\u5DF2\u5F00\u901A",
604
+ "kbCore.accessNotRequested": "\u672A\u7533\u8BF7",
605
+ "kbCore.accessPending": "\u5F85\u5BA1\u6279",
606
+ "kbCore.accessRequested": "\u5DF2\u63D0\u4EA4",
607
+ "kbCore.accessRevoked": "\u5DF2\u6536\u56DE",
608
+ "kbCore.auditApprove": "\u6279\u51C6",
609
+ "kbCore.auditBreakGlass": "\u5E94\u6025\u8BBF\u95EE",
610
+ "kbCore.auditDelegation": "\u59D4\u6D3E",
611
+ "kbCore.auditDeny": "\u62D2\u7EDD",
612
+ "kbCore.auditGrant": "\u6388\u4E88",
613
+ "kbCore.auditPermissionChange": "\u6743\u9650\u53D8\u66F4",
614
+ "kbCore.auditPreview": "\u9884\u89C8",
615
+ "kbCore.auditRead": "\u8BFB\u53D6",
616
+ "kbCore.auditRequest": "\u7533\u8BF7",
617
+ "kbCore.auditRevoke": "\u6536\u56DE",
618
+ "kbCore.auditSync": "\u6743\u9650\u540C\u6B65",
619
+ "kbCore.daysAgo": "{p0} \u5929\u524D",
620
+ "kbCore.hoursAgo": "{p0} \u5C0F\u65F6\u524D",
621
+ "kbCore.hygieneBroadGroup": "\u8FC7\u5BBD\u7EC4\u6388\u6743",
622
+ "kbCore.hygieneBrokenInheritance": "\u65AD\u7EE7\u627F",
623
+ "kbCore.hygieneOrgWideLink": "\u7EC4\u7EC7\u7EA7\u94FE\u63A5",
624
+ "kbCore.hygieneOrphanedOwner": "\u8D1F\u8D23\u4EBA\u7F3A\u4F4D",
625
+ "kbCore.hygieneOverexposed": "\u8FC7\u5EA6\u66B4\u9732",
626
+ "kbCore.hygieneSensitiveMismatch": "\u654F\u611F\u5EA6\u9519\u914D",
627
+ "kbCore.justNow": "\u521A\u521A",
628
+ "kbCore.levelComment": "\u53EF\u8BC4\u8BBA",
629
+ "kbCore.levelEdit": "\u53EF\u7F16\u8F91",
630
+ "kbCore.levelNone": "\u65E0\u6743\u9650",
631
+ "kbCore.levelOwner": "\u8D1F\u8D23\u4EBA",
632
+ "kbCore.levelView": "\u53EF\u67E5\u770B",
633
+ "kbCore.minutesAgo": "{p0} \u5206\u949F\u524D",
634
+ "kbCore.runCancelled": "\u5DF2\u53D6\u6D88",
635
+ "kbCore.runDone": "\u5DF2\u5B8C\u6210",
636
+ "kbCore.runFailed": "\u5931\u8D25",
637
+ "kbCore.runQueued": "\u6392\u961F\u4E2D",
638
+ "kbCore.runRunning": "\u8FDB\u884C\u4E2D",
639
+ "kbCore.runUnstarted": "\u672A\u5F00\u59CB",
640
+ "kbCore.stageAgent": "\u4EE3\u7406",
641
+ "kbCore.stageChunk": "\u5207\u7247",
642
+ "kbCore.stageEmbed": "\u5411\u91CF\u5316",
643
+ "kbCore.stageGeneration": "\u751F\u6210",
644
+ "kbCore.stageGuard": "\u62A4\u680F",
645
+ "kbCore.stageQuery": "\u67E5\u8BE2",
646
+ "kbCore.stageRerank": "\u91CD\u6392",
647
+ "kbCore.stageRetrieval": "\u68C0\u7D22",
648
+ "kbCore.stageTool": "\u5DE5\u5177",
649
+ "kbCore.typeApi": "\u63A5\u53E3",
650
+ "kbCore.typeCode": "\u4EE3\u7801",
651
+ "kbCore.typeDatabase": "\u6570\u636E\u5E93",
652
+ "kbCore.typeDocument": "\u6587\u6863",
653
+ "kbCore.typeEmail": "\u90AE\u4EF6",
654
+ "kbCore.typeImage": "\u56FE\u7247",
655
+ "kbCore.typeKb": "\u77E5\u8BC6\u5E93",
656
+ "kbCore.typeTable": "\u8868\u683C",
657
+ "kbCore.typeTicket": "\u5DE5\u5355",
658
+ "kbCore.typeWebpage": "\u7F51\u9875",
659
+ "kbCore.unnamedSource": "\u672A\u547D\u540D\u6765\u6E90",
660
+ "kbCore.unnamedSubject": "\u672A\u547D\u540D\u4E3B\u4F53",
661
+ "kbCore.visHidden": "\u4E0D\u53EF\u89C1",
662
+ "kbCore.visMetadataOnly": "\u4EC5\u5143\u6570\u636E",
663
+ "kbCore.visSummaryOnly": "\u4EC5\u6458\u8981",
664
+ "kbCore.visVisible": "\u53EF\u89C1",
665
+ /* ── kbEval ── */
666
+ "kbEval.avgA": "A \u5747\u5206 {p0}",
667
+ "kbEval.avgB": "B \u5747\u5206 {p0}",
668
+ "kbEval.compare": "\u5BF9\u6BD4",
669
+ "kbEval.runSelectAria": "\u9009\u62E9\u5BF9\u6BD4\u8FD0\u884C",
670
+ "kbEval.expected": "\u671F\u671B",
671
+ "kbEval.gradeImprovement": "\u63D0\u5347",
672
+ "kbEval.gradeRegression": "\u56DE\u5F52",
673
+ "kbEval.gradeTie": "\u6301\u5E73",
674
+ "kbEval.gradeTradeoff": "\u6743\u8861",
675
+ "kbEval.noData": "\u6CA1\u6709\u5BF9\u6BD4\u6570\u636E",
676
+ "kbEval.onlyRegression": "\u4EC5\u770B\u56DE\u5F52",
677
+ "kbEval.outputA": "\u8F93\u51FA A",
678
+ "kbEval.outputB": "\u8F93\u51FA B",
679
+ "kbEval.outputN": "\u8F93\u51FA {p0}",
680
+ /* ── kbExplain ── */
681
+ "kbExplain.empty": "\u6682\u65E0\u53E3\u5F84\u4FE1\u606F",
682
+ "kbExplain.groupAgg": "\u805A\u5408",
683
+ "kbExplain.groupColumn": "\u5217",
684
+ "kbExplain.groupFilter": "\u7B5B\u9009",
685
+ "kbExplain.groupTable": "\u8868",
686
+ "kbExplain.trigger": "\u8FD9\u4E2A\u6570\u5B57\u662F\u600E\u4E48\u7B97\u51FA\u6765\u7684",
687
+ "kbExplain.viewDefinition": "\u67E5\u770B\u53E3\u5F84",
688
+ /* ── kbFilter ── */
689
+ "kbFilter.addGroup": "+ \u7EC4",
690
+ "kbFilter.addRule": "+ \u89C4\u5219",
691
+ "kbFilter.and": "\u4E14",
692
+ "kbFilter.combineMode": "\u7EC4\u5408\u65B9\u5F0F {p0}",
693
+ "kbFilter.copyDsl": "\u590D\u5236 DSL",
694
+ "kbFilter.deleteGroup": "\u5220\u9664\u7EC4",
695
+ "kbFilter.deleteRule": "\u5220\u9664\u89C4\u5219",
696
+ "kbFilter.fieldLabel": "\u5B57\u6BB5",
697
+ "kbFilter.fieldPlaceholder": "\u8FC7\u6EE4\u5B57\u6BB5",
698
+ "kbFilter.noValueNeeded": "\uFF08\u65E0\u9700\u503C\uFF09",
699
+ "kbFilter.none": "\uFF08\u65E0\u8FC7\u6EE4\uFF09",
700
+ "kbFilter.opContains": "\u5305\u542B",
701
+ "kbFilter.opEq": "\u7B49\u4E8E",
702
+ "kbFilter.opExists": "\u5B58\u5728",
703
+ "kbFilter.opGt": "\u5927\u4E8E",
704
+ "kbFilter.opGte": "\u5927\u4E8E\u7B49\u4E8E",
705
+ "kbFilter.opIn": "\u5C5E\u4E8E",
706
+ "kbFilter.opLt": "\u5C0F\u4E8E",
707
+ "kbFilter.opLte": "\u5C0F\u4E8E\u7B49\u4E8E",
708
+ "kbFilter.opNe": "\u4E0D\u7B49\u4E8E",
709
+ "kbFilter.operatorLabel": "\u64CD\u4F5C\u7B26",
710
+ "kbFilter.or": "\u6216",
711
+ "kbFilter.toggleAndOr": "\u5207\u6362 AND / OR",
712
+ "kbFilter.valueAria": "\u8FC7\u6EE4\u503C",
713
+ "kbFilter.valueLabel": "\u503C",
714
+ "kbFilter.valuePlaceholder": "\u503C 1, \u503C 2\uFF08\u9017\u53F7\u5206\u9694\uFF09",
715
+ /* ── kbGap ── */
716
+ "kbGap.addSynonym": "\u52A0\u540C\u4E49\u8BCD",
717
+ "kbGap.colCount": "\u6B21\u6570",
718
+ "kbGap.colLastSeen": "\u6700\u8FD1\u51FA\u73B0",
719
+ "kbGap.colQuery": "\u67E5\u8BE2",
720
+ "kbGap.colShare": "\u5360\u6BD4",
721
+ "kbGap.createDoc": "\u5EFA\u6587\u6863",
722
+ "kbGap.empty": "\u6CA1\u6709\u672A\u547D\u4E2D\u67E5\u8BE2\u2014\u2014\u8986\u76D6\u826F\u597D",
723
+ "kbGap.title": "\u672A\u547D\u4E2D\u67E5\u8BE2\u8D8B\u52BF",
724
+ "kbGap.zeroClickHint": "\u7528\u6237\u53EF\u80FD\u5DF2\u4ECE\u5F15\u7528\u7247\u6BB5\u5F97\u5230\u7B54\u6848\uFF1B\u96F6\u70B9\u51FB\u9700\u4EBA\u5DE5\u5224\u8BFB\uFF0C\u4E0D\u76F4\u63A5\u89C6\u4E3A\u5931\u8D25",
725
+ "kbGap.zeroClickRate": "\u96F6\u70B9\u51FB\u7387",
726
+ "kbGap.zeroClickTitle": "\u96F6\u70B9\u51FB \u2260 \u5931\u8D25",
727
+ /* ── kbHittest ── */
728
+ "kbHittest.addAria": "\u65B0\u589E\u6D4B\u8BD5\u95EE\u9898",
729
+ "kbHittest.addPlaceholder": "\u65B0\u589E\u95EE\u9898\uFF0CEnter \u6DFB\u52A0",
730
+ "kbHittest.avgScore": "\u5747\u5206",
731
+ "kbHittest.deleteQuestion": "\u5220\u9664\u95EE\u9898",
732
+ "kbHittest.empty": "\u6682\u65E0\u6D4B\u8BD5\u95EE\u9898\u2014\u2014\u6DFB\u52A0\u7B2C\u4E00\u6761\uFF0C\u5F00\u59CB\u53EC\u56DE\u56DE\u5F52",
733
+ "kbHittest.expectHit": "\u671F\u671B\u547D\u4E2D\u5728\u524D\u6392\u547D\u4E2D\u4E2D",
734
+ "kbHittest.expectMiss": "\u671F\u671B\u672A\u547D\u4E2D",
735
+ "kbHittest.hitRate": "\u547D\u4E2D\u7387",
736
+ "kbHittest.noExpectation": "\u672A\u8BBE\u671F\u671B",
737
+ "kbHittest.notRun": "\u672A\u8FD0\u884C",
738
+ "kbHittest.pass": "\u901A\u8FC7",
739
+ "kbHittest.pin": "\u7F6E\u9876\u56FA\u5B9A",
740
+ "kbHittest.runAll": "\u8FD0\u884C\u5168\u90E8",
741
+ "kbHittest.sessionOnly": "\u53C2\u6570\u4EC5\u672C\u6B21\u4F1A\u8BDD\u751F\u6548",
742
+ "kbHittest.sessionOnlyHint": "\u6D4B\u8BD5\u8FD0\u884C\u7684\u68C0\u7D22\u53C2\u6570\uFF08topK/\u9608\u503C/\u91CD\u6392\uFF09\u4E0D\u843D\u5E93\uFF0C\u4EC5\u672C\u6B21\u4F1A\u8BDD\u751F\u6548",
743
+ "kbHittest.unpin": "\u53D6\u6D88\u7F6E\u9876",
744
+ /* ── kbMetadata ── */
745
+ "kbMetadata.addField": "\u65B0\u589E\u5B57\u6BB5",
746
+ "kbMetadata.builtIn": "\u5185\u7F6E",
747
+ "kbMetadata.colField": "\u5B57\u6BB5",
748
+ "kbMetadata.colType": "\u7C7B\u578B",
749
+ "kbMetadata.colValue": "\u503C",
750
+ "kbMetadata.empty": "\u6682\u65E0\u5143\u6570\u636E\u5B57\u6BB5",
751
+ "kbMetadata.nameLabel": "\u65B0\u5B57\u6BB5\u540D",
752
+ "kbMetadata.namePlaceholder": "\u5B57\u6BB5\u540D\uFF0C\u5982 department",
753
+ "kbMetadata.removeField": "\u79FB\u9664\u5B57\u6BB5 {p0}",
754
+ "kbMetadata.typeLabel": "\u65B0\u5B57\u6BB5\u7C7B\u578B",
755
+ "kbMetadata.valueOf": "{p0} \u7684\u503C",
756
+ /* ── kbPassage ── */
757
+ "kbPassage.blockRange": "\u5757 {p0}\u2013{p1}",
758
+ "kbPassage.close": "\u5173\u95ED\u539F\u6587",
759
+ "kbPassage.expandContext": "\u5C55\u5F00\u4E0A\u4E0B\u6587",
760
+ "kbPassage.locate": "\u539F\u6587\u5B9A\u4F4D",
761
+ "kbPassage.none": "\uFF08\u65E0\u539F\u6587\uFF09",
762
+ "kbPassage.pageRange": "\u7B2C {p0}\u2013{p1} \u9875",
763
+ "kbPassage.restricted": "\u5185\u5BB9\u53D7\u9650",
764
+ "kbPassage.unitByte": "\u5B57\u8282",
765
+ "kbPassage.unitChar": "\u5B57\u7B26",
766
+ /* ── kbPipeline ── */
767
+ "kbPipeline.empty": "\u6682\u65E0\u89E3\u6790\u4EFB\u52A1",
768
+ "kbPipeline.progress": "\u89E3\u6790\u8FDB\u5EA6",
769
+ "kbPipeline.rerun": "\u91CD\u8DD1",
770
+ "kbPipeline.unknownStage": "\u672A\u77E5\u9636\u6BB5",
771
+ /* ── kbQa ── */
772
+ "kbQa.colAnswer": "\u7B54\u6848",
773
+ "kbQa.colQuestion": "\u95EE\u9898",
774
+ "kbQa.csvHint": "CSV \u6A21\u677F\uFF1Aquestion,answer\uFF08\u6BCF\u884C\u4E00\u5BF9\uFF0CUTF-8\uFF09",
775
+ "kbQa.deleteRow": "\u5220\u9664\u7B2C {p0} \u884C",
776
+ "kbQa.empty": "\u6682\u65E0\u8BA4\u8BC1\u95EE\u7B54\u5BF9",
777
+ "kbQa.importCsv": "\u5BFC\u5165 CSV",
778
+ /* ── kbRerank ── */
779
+ "kbRerank.after": "\u91CD\u6392\u540E",
780
+ "kbRerank.before": "\u91CD\u6392\u524D",
781
+ "kbRerank.compareTitle": "\u91CD\u6392\u5BF9\u6BD4",
782
+ "kbRerank.down": "\u4E0B\u964D {p0} \u4F4D",
783
+ "kbRerank.dropped": "\u843D\u9009",
784
+ "kbRerank.empty": "\u4E24\u4FA7\u5747\u4E3A\u7A7A\u2014\u2014\u8FD0\u884C\u68C0\u7D22\u540E\u518D\u5BF9\u6BD4",
785
+ "kbRerank.enableCompare": "\u542F\u7528\u91CD\u6392\u5BF9\u6BD4",
786
+ "kbRerank.newIn": "\u65B0\u8FDB",
787
+ "kbRerank.unmarked": "\u672A\u6807",
788
+ "kbRerank.up": "\u4E0A\u5347 {p0} \u4F4D",
789
+ /* ── kbRetrieval ── */
790
+ "kbRetrieval.breakdown": "\u62C6\u89E3",
791
+ "kbRetrieval.copyParams": "\u590D\u5236\u53C2\u6570 JSON",
792
+ "kbRetrieval.decreaseTopK": "\u51CF\u5C11 topK",
793
+ "kbRetrieval.empty": "\u8F93\u5165\u95EE\u9898\u5E76\u8FD0\u884C\uFF0C\u547D\u4E2D\u7ED3\u679C\u5C06\u51FA\u73B0\u5728\u8FD9\u91CC",
794
+ "kbRetrieval.failOpenNotice": "fail-open\uFF1A\u5F53\u524D\u67E5\u8BE2\u672A\u643A\u5E26\u8EAB\u4EFD\u8FC7\u6EE4\uFF0C\u5C06\u8FD4\u56DE\u5168\u90E8\u5019\u9009\uFF08\u4EC5\u9650\u8C03\u8BD5\uFF09",
795
+ "kbRetrieval.hybridWeight": "\u6DF7\u5408\u6743\u91CD\uFF08\u5DE6\u8BED\u4E49\u53F3\u5173\u952E\u8BCD\uFF09",
796
+ "kbRetrieval.identityLabel": "\u68C0\u7D22\u8EAB\u4EFD",
797
+ "kbRetrieval.identityShort": "\u8EAB\u4EFD",
798
+ "kbRetrieval.increaseTopK": "\u589E\u52A0 topK",
799
+ "kbRetrieval.keywordHint": "\u5173\u952E\u8BCD\uFF1A\u5927\u5E93\u5FEB\u901F\u7CBE\u786E",
800
+ "kbRetrieval.layerLabel": "\u8FC7\u6EE4\u5C42",
801
+ "kbRetrieval.layerNone": "none\uFF1Afail-open\uFF0C\u65E0\u8EAB\u4EFD\u8FC7\u6EE4\u8FD4\u56DE\u5168\u90E8\u2014\u2014\u5371\u9669\uFF0C\u4EC5\u6F14\u793A",
802
+ "kbRetrieval.layerPost": "post-filter\uFF1A\u5206\u6570\u5DF2\u53EF\u89C2\u5BDF\u2014\u2014\u7F3A\u9677\u5C42\uFF0C\u4EC5\u6F14\u793A",
803
+ "kbRetrieval.layerPre": "pre-filter\uFF1AACL \u5728\u68C0\u7D22\u6267\u884C\u4F53\u5185\u751F\u6548\u2014\u2014\u5B89\u5168\u57FA\u7EBF",
804
+ "kbRetrieval.leakNote": "\u5206\u6BCD\u672A\u8FC7\u6EE4\u524D\u8BA1\u6570\u5C5E\u6CC4\u9732\uFF0C\u4E0D\u663E\u793A",
805
+ "kbRetrieval.modeHybrid": "\u6DF7\u5408",
806
+ "kbRetrieval.modeKeyword": "\u5173\u952E\u8BCD",
807
+ "kbRetrieval.modeLabel": "\u68C0\u7D22\u6A21\u5F0F",
808
+ "kbRetrieval.modeVector": "\u5411\u91CF",
809
+ "kbRetrieval.postFilterNotice": "post-filter\uFF1A\u5206\u6570\u5DF2\u5728\u8FC7\u6EE4\u524D\u4EA7\u751F\uFF08\u7F3A\u9677\u5C42\u6F14\u793A\uFF09",
810
+ "kbRetrieval.queryLabel": "\u68C0\u7D22\u95EE\u9898",
811
+ "kbRetrieval.queryPlaceholder": "\u68C0\u7D22\u95EE\u9898\uFF0CEnter \u8FD0\u884C",
812
+ "kbRetrieval.rerankLabel": "\u91CD\u6392",
813
+ "kbRetrieval.rerankThresholdOff": "\u9608\u503C \u5173 \xB7 \u5B58\u6D3B {p0}",
814
+ "kbRetrieval.rerankThresholdOn": "\u9608\u503C {p0} \xB7 \u5B58\u6D3B {p1}",
815
+ "kbRetrieval.running": "\u8FD0\u884C\u4E2D\u2026",
816
+ "kbRetrieval.thresholdLabel": "\u5206\u6570\u9608\u503C",
817
+ "kbRetrieval.thresholdValue": "\u9608\u503C N/A",
818
+ "kbRetrieval.vectorHint": "\u8BED\u4E49\uFF1A\u8DE8\u8BED\u8A00/\u65E0\u7CBE\u786E\u8BCD",
819
+ "kbRetrieval.vectorPercent": "\u8BED\u4E49 {p0}",
820
+ "kbRetrieval.weightValue": "\u5411\u91CF {p0}% / \u5173\u952E\u8BCD {p1}%",
821
+ /* ── kbReview ── */
822
+ "kbReview.assignee": "\u5206\u914D\u4EBA",
823
+ "kbReview.doneNext": "\u5B8C\u6210\u5E76\u4E0B\u4E00\u6761",
824
+ "kbReview.empty": "\u6CA1\u6709\u5F85\u5BA1\u67E5\u6761\u76EE",
825
+ "kbReview.emptyAssignee": "\u8BE5\u5206\u914D\u4EBA\u4E0B\u6CA1\u6709\u6761\u76EE",
826
+ "kbReview.emptyQueue": "\u961F\u5217\u4E3A\u7A7A",
827
+ "kbReview.kbCloseHint": "\u5173\u95ED\u63D0\u793A",
828
+ "kbReview.kbSelectOption": "\u9009\u62E9\u9009\u9879",
829
+ "kbReview.kbSwitchItem": "\u5207\u6362\u6761\u76EE",
830
+ "kbReview.kbToggleHint": "\u663E\u793A/\u9690\u85CF\u672C\u63D0\u793A",
831
+ "kbReview.shortcuts": "? \u5FEB\u6377\u952E",
832
+ "kbReview.typeAnswer": "\u56DE\u7B54",
833
+ "kbReview.typeMessage": "\u6D88\u606F",
834
+ "kbReview.typeTrace": "\u8F68\u8FF9",
835
+ "kbReview.unassigned": "\u672A\u5206\u914D",
836
+ /* ── kbSandbox ── */
837
+ "kbSandbox.noResolver": "\u5BBF\u4E3B\u672A\u63D0\u4F9B ui:// \u89E3\u6790\u5668",
838
+ "kbSandbox.notReady": "kb-sandbox: \u5E94\u7528\u672A\u5C31\u7EEA",
839
+ "kbSandbox.resolveFailed": "ui:// \u89E3\u6790\u5931\u8D25\uFF1A{p0}",
840
+ "kbSandbox.timeout": "kb-sandbox: \u8C03\u7528\u8D85\u65F6\uFF08{p0}ms\uFF09",
841
+ "kbSandbox.title": "MCP App \u6C99\u7BB1",
842
+ /* ── kbSegment ── */
843
+ "kbSegment.avgLength": "\u5747\u957F {p0}",
844
+ "kbSegment.childNote": "\u5B50\u5206\u6BB5\u6309\u957F\u5EA6\u81EA\u52A8\u751F\u6210",
845
+ "kbSegment.cleanBlankLines": "\u5408\u5E76\u8FDE\u7EED\u7A7A\u884C",
846
+ "kbSegment.cleanEmails": "\u53BB\u9664\u90AE\u7BB1",
847
+ "kbSegment.cleanLinks": "\u53BB\u9664\u94FE\u63A5",
848
+ "kbSegment.empty": "\u6837\u672C\u4E3A\u7A7A\uFF0C\u6682\u65E0\u53EF\u9884\u89C8\u5206\u6BB5",
849
+ "kbSegment.maxLengthLabel": "\u6700\u5927\u957F\u5EA6",
850
+ "kbSegment.maxLengthPlaceholder": "\u5206\u6BB5\u6700\u5927\u957F\u5EA6",
851
+ "kbSegment.modeAuto": "\u81EA\u52A8",
852
+ "kbSegment.modeCustom": "\u81EA\u5B9A\u4E49",
853
+ "kbSegment.modeLabel": "\u5206\u6BB5\u6A21\u5F0F",
854
+ "kbSegment.modeNote": "\u5206\u6BB5\u6A21\u5F0F\u521B\u5EFA\u540E\u4E0D\u53EF\u66F4\u6539\uFF0C\u53C2\u6570\u53EF\u968F\u65F6\u8C03\u6574",
855
+ "kbSegment.modeParentChild": "\u7236\u5B50",
856
+ "kbSegment.overlapInvalid": "\u91CD\u53E0\u9700\u5C0F\u4E8E\u6700\u5927\u957F\u5EA6",
857
+ "kbSegment.overlapLabel": "\u91CD\u53E0",
858
+ "kbSegment.overlapPlaceholder": "\u5206\u6BB5\u91CD\u53E0",
859
+ "kbSegment.previewNote": "\u5171 {p0} \u6BB5\uFF0C\u4EC5\u9884\u89C8\u524D {p1} \u6BB5",
860
+ "kbSegment.segmentsCount": "{p0} \u6BB5",
861
+ "kbSegment.separatorLabel": "\u5206\u9694\u7B26",
862
+ "kbSegment.separatorPlaceholder": "\u5206\u6BB5\u5206\u9694\u7B26",
863
+ "kbSegment.toggleTip": "\u70B9\u51FB\u5C55\u5F00/\u6536\u8D77",
864
+ /* ── kbSources ── */
865
+ "kbSources.cited": "\u88AB\u5F15 \xD7{p0}",
866
+ "kbSources.empty": "\u4E0B\u4E00\u6761\u7B54\u6848\u5F15\u7528\u7684\u6BB5\u843D\u5C06\u51FA\u73B0\u5728\u8FD9\u91CC",
867
+ /* ── kbSql ── */
868
+ "kbSql.adminOnly": "\u4EC5\u7BA1\u7406\u5458\u53EF\u89C1",
869
+ "kbSql.applyFix": "\u5E94\u7528\u4FEE\u590D\u5E76\u91CD\u8DD1",
870
+ "kbSql.confirmRerun": "\u786E\u8BA4\u5E76\u91CD\u8DD1",
871
+ "kbSql.editRerun": "\u7F16\u8F91\u91CD\u8DD1",
872
+ "kbSql.fixReady": "\u68C0\u6D4B\u5230\u4E0A\u7248\u62A5\u9519\uFF0C\u4FEE\u590D\u5EFA\u8BAE\u5DF2\u5C31\u7EEA",
873
+ "kbSql.generated": "\u751F\u6210\u7684 SQL",
874
+ /* ── kbTrace ── */
875
+ "kbTrace.empty": "\u6682\u65E0\u8C03\u7528\u94FE\u6570\u636E",
876
+ "kbTrace.hits": "\u547D\u4E2D {p0}",
877
+ /* ── kbVisibility ── */
878
+ "kbVisibility.adminOnlyNote": "\u4EE5\u4E0A\u5BF9\u7167\u4EC5\u9650 admin \u5BA1\u8BA1",
879
+ "kbVisibility.adminWarn": "admin \u5BA1\u8BA1\u89C6\u56FE\u2014\u2014\u547D\u4E2D\u5DEE\u5F02\u5BF9\u7167\u5BF9\u666E\u901A\u7528\u6237\u6784\u6210\u6CC4\u9732\uFF0C\u52FF\u5D4C\u5165\u7EC8\u7AEF\u7528\u6237\u754C\u9762",
880
+ "kbVisibility.failOpenNote": "fail-open\uFF1AKendra \u65E0\u8EAB\u4EFD\u4E0A\u4E0B\u6587\u8FD4\u56DE\u5168\u90E8\u6587\u6863\u2014\u2014\u68C0\u7D22\u5FC5\u987B\u643A\u5E26\u670D\u52A1\u7AEF\u8EAB\u4EFD",
881
+ "kbVisibility.focusColumn": "\u805A\u7126\u8EAB\u4EFD {p0} \u7684\u5217",
882
+ "kbVisibility.layerValue": "\u8FC7\u6EE4\u5C42\uFF1A{p0}",
883
+ "kbVisibility.leakageNote": "\u8BA1\u6570\u5DEE\u5F02\u5373 volume leakage\uFF1A\u5BF9\u666E\u901A\u7528\u6237\u53EA\u53EF\u7ED9\u300C\u5DF2\u6309\u6743\u9650\u8FC7\u6EE4\u300D\u6052\u5B9A\u6587\u6848\uFF0C\u7F13\u89E3\u53EA\u6709 padding \u53D6\u6574",
884
+ "kbVisibility.postFilterNote": "post-filter\uFF1AtopK \u88AB\u65E0\u6743\u7ED3\u679C\u5360\u7528\u4E14\u76F8\u4F3C\u5EA6\u5206\u6570\u53EF\u88AB\u89C2\u5BDF",
885
+ "kbVisibility.queryLabel": "\u67E5\u8BE2\uFF1A{p0}",
886
+ "kbVisibility.safeCount": "\u5B89\u5168\u8BA1\u6570 {p0}",
887
+ "kbVisibility.sourceUnavailable": "\u539F\u6587\u4E0D\u53EF\u7528",
888
+ "kbVisibility.unnamedHit": "\u672A\u547D\u540D\u547D\u4E2D",
889
+ /* ── kbWhoCan ── */
890
+ "kbWhoCan.check": "\u68C0\u67E5",
891
+ "kbWhoCan.checkIdentity": "\u68C0\u67E5\u8EAB\u4EFD",
892
+ "kbWhoCan.daysUntil": "{p0} \u5929\u540E",
893
+ "kbWhoCan.deniedBy": "\u88AB\u7B56\u7565\u62D2\u7EDD\uFF1A{p0}",
894
+ "kbWhoCan.denyVeto": "\u88AB Deny \u4E00\u7968\u5426\u51B3",
895
+ "kbWhoCan.direct": "\u76F4\u63A5",
896
+ "kbWhoCan.expiresSoon": "\u6700\u8FD1\u5230\u671F {p0}",
897
+ "kbWhoCan.hoursUntil": "{p0} \u5C0F\u65F6\u540E",
898
+ "kbWhoCan.inherit": "\u7EE7\u627F",
899
+ "kbWhoCan.link": "\u94FE\u63A5",
900
+ "kbWhoCan.noDeny": "\u65E0 Deny \u751F\u6548",
901
+ "kbWhoCan.noIdentity": "\u672A\u63D0\u4F9B\u53EF\u68C0\u67E5\u7684\u8EAB\u4EFD",
902
+ "kbWhoCan.none": "\u672A\u547D\u4E2D\u4EFB\u4F55\u6388\u6743\u2014\u2014\u9ED8\u8BA4\u62D2\u7EDD",
903
+ "kbWhoCan.recheckTip": "\u91CD\u65B0\u68C0\u67E5\u5F53\u524D\u8EAB\u4EFD\u7684\u6709\u6548\u6743\u9650",
904
+ "kbWhoCan.stackRule": "\u53E0\u52A0\u89C4\u5219\uFF1A\u591A\u6765\u6E90\u5E76\u96C6 \u2192 {p0}\uFF1B{p1}",
905
+ /* ── mentions ── */
906
+ "mentions.create": "\u521B\u5EFA\u201C{p0}\u201D",
907
+ "mentions.customBadge": "\u81EA\u5B9A\u4E49",
908
+ "mentions.loading": "\u52A0\u8F7D\u4E2D\u2026",
909
+ /* ── notification ── */
910
+ "notification.groupBusy": "\u64CD\u4F5C\u7ED3\u675F\u540E\u53EF\u4EE5\u6536\u8D77\u8FD9\u7EC4\u901A\u77E5\u3002",
911
+ "notification.groupUnread": "{count} \u6761\u540C\u7EC4\u901A\u77E5\uFF0C{unread} \u6761\u672A\u8BFB",
912
+ "notification.groupCount": "{count} \u6761\u540C\u7EC4\u901A\u77E5",
913
+ "notification.groupExpanded": "\u6536\u8D77\u8FD9\u7EC4\u901A\u77E5",
914
+ "notification.ariaLabel": "\u901A\u77E5",
915
+ "notification.viewDetails": "\u67E5\u770B\u8BE6\u60C5",
916
+ /* ── pagination ── */
917
+ "pagination.next": "\u4E0B\u4E00\u9875",
918
+ "pagination.pageSize": "{p0} \u6761/\u9875",
919
+ "pagination.prev": "\u4E0A\u4E00\u9875",
920
+ /* ── select ── */
921
+ "select.fieldLabel": "\u9009\u62E9\u9009\u9879",
922
+ "select.noMatch": "\u65E0\u5339\u914D\u9879",
923
+ "select.remove": "\u79FB\u9664 {p0}",
924
+ "select.searchPlaceholder": "\u641C\u7D22\u2026",
925
+ /* ── cascader / tree-select ── */
926
+ "cascader.placeholder": "\u8BF7\u9009\u62E9",
927
+ "cascader.noMatch": "\u65E0\u5339\u914D",
928
+ "cascader.search": "\u641C\u7D22",
929
+ "treeSelect.placeholder": "\u8BF7\u9009\u62E9",
930
+ "treeSelect.noMatch": "\u65E0\u5339\u914D",
931
+ "treeSelect.search": "\u641C\u7D22",
932
+ /* ── tagInput ── */
933
+ "tagInput.ariaLabel": "\u6807\u7B7E\u8F93\u5165\uFF0C\u5171 {p0} \u4E2A",
934
+ "tagInput.remove": "\u79FB\u9664 {p0}",
935
+ "tagInput.field": "\u6DFB\u52A0\u6807\u7B7E",
936
+ "tagInput.added": "\u5DF2\u6DFB\u52A0 {p0} \u4E2A\u6807\u7B7E\u3002",
937
+ "tagInput.removed": "\u5DF2\u79FB\u9664 {p0}\u3002",
938
+ "tagInput.duplicate": "\u5DF2\u6709\u300C{p0}\u300D\uFF0C\u53EF\u4EE5\u7F16\u8F91\u540E\u91CD\u8BD5\u3002",
939
+ "tagInput.limit": "\u6700\u591A {p0} \u4E2A\u6807\u7B7E\uFF0C\u8BF7\u5148\u79FB\u9664\u4E00\u4E2A\u3002",
940
+ /* ── upload ── */
941
+ "upload.remove": "\u79FB\u9664 {p0}",
942
+ "upload.tooBig": "\u6587\u4EF6\u8D85\u8FC7 {p0}",
943
+ "upload.tooMany": "\u6700\u591A {p0} \u4E2A\u6587\u4EF6",
944
+ "upload.typeNotAllowed": "\u6587\u4EF6\u7C7B\u578B\u4E0D\u652F\u6301"
945
+ };
946
+ var current = { ...ICEN_LOCALE_ZH_CN };
947
+ function t(key, vars) {
948
+ const raw = current[key] ?? ICEN_LOCALE_ZH_CN[key];
949
+ if (vars == null || Array.isArray(raw)) return raw;
950
+ return raw.replace(/\{(\w+)\}/g, (m, name) => name in vars ? String(vars[name]) : m);
951
+ }
952
+
953
+ // src/behaviors/svg-parse.ts
954
+ function parseSvg(source) {
955
+ if (typeof document === "undefined" || typeof DOMParser === "undefined") return null;
956
+ const trimmed = source.trimStart();
957
+ if (!trimmed.startsWith("<svg")) return null;
958
+ const src = /^<svg(?![^>]*\bxmlns[=:])/i.test(trimmed) ? trimmed.replace(/^<svg/i, '<svg xmlns="http://www.w3.org/2000/svg"') : trimmed;
959
+ let parsed;
960
+ try {
961
+ parsed = new DOMParser().parseFromString(src, "image/svg+xml");
962
+ } catch {
963
+ return null;
964
+ }
965
+ const root = parsed.documentElement;
966
+ if (!root || root.tagName.toLowerCase() !== "svg" || parsed.querySelector("parsererror")) return null;
967
+ const sanitize = (el) => {
968
+ for (const attr of Array.from(el.attributes)) {
969
+ const name = attr.name.toLowerCase();
970
+ if (name.startsWith("on")) el.removeAttribute(attr.name);
971
+ if ((name === "href" || name === "xlink:href") && attr.value.trim().toLowerCase().startsWith("javascript:")) {
972
+ el.removeAttribute(attr.name);
973
+ }
974
+ }
975
+ for (const child of Array.from(el.children)) {
976
+ const tag = child.tagName.toLowerCase();
977
+ if (tag === "script" || tag === "foreignobject") {
978
+ child.remove();
979
+ continue;
980
+ }
981
+ sanitize(child);
982
+ }
983
+ };
984
+ sanitize(root);
985
+ return document.importNode(root, true);
986
+ }
987
+
1
988
  // src/behaviors/ai-core.ts
2
989
  var AI_STATUSES = [
3
990
  "pending",
@@ -10,64 +997,33 @@ var AI_STATUSES = [
10
997
  ];
11
998
  function aiStatusLabel(s) {
12
999
  const labels = {
13
- pending: "\u7B49\u5F85",
14
- running: "\u6267\u884C\u4E2D",
15
- streaming: "\u6D41\u5F0F\u4E2D",
16
- approval: "\u5F85\u786E\u8BA4",
17
- done: "\u5B8C\u6210",
18
- error: "\u5931\u8D25",
19
- cancelled: "\u5DF2\u53D6\u6D88"
1000
+ pending: t("aiCore.statusPending"),
1001
+ running: t("aiCore.statusRunning"),
1002
+ streaming: t("aiCore.statusStreaming"),
1003
+ approval: t("aiCore.statusApproval"),
1004
+ done: t("aiCore.statusDone"),
1005
+ error: t("aiCore.statusError"),
1006
+ cancelled: t("aiCore.statusCancelled")
20
1007
  };
21
1008
  return labels[s] ?? s;
22
1009
  }
23
- var svg = (body) => `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${body}</svg>`;
24
- var ICON_TERMINAL = svg('<path d="m4 17 6-6-6-6"/><path d="M12 19h8"/>');
25
- var ICON_FILE = svg(
26
- '<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z"/><path d="M14 2v4a2 2 0 0 0 2 2h4"/>'
27
- );
28
- var ICON_FILE_PEN = svg(
29
- '<path d="M12.5 22H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8l5 5v3.5"/><path d="M14 2v4a2 2 0 0 0 2 2h4"/><path d="M19 6.5 16.5 4"/><path d="M21.378 16.626a1 1 0 0 0-3.004-3.004l-4.01 4.012a2 2 0 0 0-.506.854l-.837 2.87a.5.5 0 0 0 .62.62l2.87-.837a2 2 0 0 0 .854-.506z"/>'
30
- );
31
- var ICON_FILE_PLUS = svg(
32
- '<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z"/><path d="M14 2v4a2 2 0 0 0 2 2h4"/><path d="M9 15h6"/><path d="M12 12v6"/>'
33
- );
34
- var ICON_TRASH = svg(
35
- '<path d="M3 6h18"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"/><path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/><path d="M10 11v6"/><path d="M14 11v6"/>'
36
- );
37
- var ICON_SEARCH = svg('<circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/>');
38
- var ICON_FOLDER_SEARCH = svg(
39
- '<path d="M11 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v4"/><circle cx="17" cy="17" r="3"/><path d="m21 21-1.9-1.9"/>'
40
- );
41
- var ICON_SCAN_SEARCH = svg(
42
- '<path d="M3 7V5a2 2 0 0 1 2-2h2"/><path d="M17 3h2a2 2 0 0 1 2 2v2"/><path d="M21 17v2a2 2 0 0 1-2 2h-2"/><path d="M7 21H5a2 2 0 0 1-2-2v-2"/><circle cx="12" cy="12" r="3"/><path d="m16 16-1.9-1.9"/>'
43
- );
44
- var ICON_GLOBE = svg(
45
- '<circle cx="12" cy="12" r="10"/><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"/><path d="M2 12h20"/>'
46
- );
47
- var ICON_DOWNLOAD = svg(
48
- '<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><path d="m7 10 5 5 5-5"/><path d="M12 15V3"/>'
49
- );
50
- var ICON_BLOCKS = svg(
51
- '<rect width="7" height="7" x="4" y="4" rx="1"/><rect width="7" height="7" x="13" y="4" rx="1"/><rect width="7" height="7" x="4" y="13" rx="1"/><rect width="7" height="7" x="13" y="13" rx="1"/>'
52
- );
53
- var ICON_ZAP = svg(
54
- '<path d="M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z"/>'
55
- );
56
- var ICON_LIST = svg(
57
- '<path d="M3 12h.01"/><path d="M3 18h.01"/><path d="M3 6h.01"/><path d="M8 12h13"/><path d="M8 18h13"/><path d="M8 6h13"/>'
58
- );
59
- var ICON_LIST_CHECKS = svg(
60
- '<path d="m3 17 2 2 4-4"/><path d="m3 7 2 2 4-4"/><path d="M13 6h8"/><path d="M13 12h8"/><path d="M13 18h8"/>'
61
- );
62
- var ICON_BOT = svg(
63
- '<path d="M12 8V4H8"/><rect width="16" height="12" x="4" y="8" rx="2"/><path d="M2 14h2"/><path d="M20 14h2"/><path d="M15 13v2"/><path d="M9 13v2"/>'
64
- );
65
- var ICON_CHART = svg(
66
- '<path d="M3 3v18h18"/><path d="M7 15l4-6 3 4 5-8"/>'
67
- );
68
- var ICON_FILE_TEXT = svg(
69
- '<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z"/><path d="M14 2v4a2 2 0 0 0 2 2h4"/><path d="M10 9H8"/><path d="M16 13H8"/><path d="M16 17H8"/>'
70
- );
1010
+ var ICON_TERMINAL = iconHTML("terminal");
1011
+ var ICON_FILE = iconHTML("file");
1012
+ var ICON_FILE_PEN = iconHTML("edit");
1013
+ var ICON_FILE_PLUS = iconHTML("plus");
1014
+ var ICON_TRASH = iconHTML("trash");
1015
+ var ICON_SEARCH = iconHTML("search");
1016
+ var ICON_FOLDER_SEARCH = iconHTML("folder");
1017
+ var ICON_SCAN_SEARCH = iconHTML("search");
1018
+ var ICON_GLOBE = iconHTML("globe");
1019
+ var ICON_DOWNLOAD = iconHTML("download");
1020
+ var ICON_BLOCKS = iconHTML("server");
1021
+ var ICON_ZAP = iconHTML("sparkle");
1022
+ var ICON_LIST = iconHTML("list");
1023
+ var ICON_LIST_CHECKS = iconHTML("list");
1024
+ var ICON_BOT = iconHTML("agent");
1025
+ var ICON_CHART = iconHTML("chart-line");
1026
+ var ICON_FILE_TEXT = iconHTML("document");
71
1027
  function isObj(v) {
72
1028
  return typeof v === "object" && v !== null;
73
1029
  }
@@ -117,32 +1073,32 @@ var sum = (fn) => {
117
1073
  return (input) => fn(input) ?? "";
118
1074
  };
119
1075
  var BUILTIN_KINDS = {
120
- shell: { label: "\u547D\u4EE4", icon: ICON_TERMINAL, tint: "accent", summarize: sum(summarizeShell) },
121
- read: { label: "\u8BFB\u53D6", icon: ICON_FILE, tint: "info", summarize: sum(summarizeRead) },
122
- edit: { label: "\u7F16\u8F91", icon: ICON_FILE_PEN, tint: "warning", summarize: sum(summarizePath) },
123
- write: { label: "\u5199\u5165", icon: ICON_FILE_PLUS, tint: "warning", summarize: sum(summarizePath) },
124
- rm: { label: "\u5220\u9664", icon: ICON_TRASH, tint: "error", summarize: sum(summarizePath) },
125
- grep: { label: "\u641C\u7D22", icon: ICON_SEARCH, tint: "info", summarize: sum(summarizeGrep) },
126
- glob: { label: "\u5339\u914D", icon: ICON_FOLDER_SEARCH, tint: "info", summarize: sum((i) => pickStr(i, ["pattern", "glob", "path"])) },
127
- browser: { label: "\u6D4F\u89C8", icon: ICON_GLOBE, tint: "accent", summarize: sum((i) => pickStr(i, ["url", "uri", "target"])) },
128
- search: { label: "\u68C0\u7D22", icon: ICON_SCAN_SEARCH, tint: "accent", summarize: sum((i) => pickStr(i, ["query", "q", "pattern"])) },
129
- fetch: { label: "\u8BF7\u6C42", icon: ICON_DOWNLOAD, tint: "info", summarize: sum((i) => pickStr(i, ["url", "uri", "endpoint"])) },
1076
+ shell: { label: t("aiCore.kindShell"), icon: ICON_TERMINAL, tint: "accent", summarize: sum(summarizeShell) },
1077
+ read: { label: t("aiCore.kindRead"), icon: ICON_FILE, tint: "info", summarize: sum(summarizeRead) },
1078
+ edit: { label: t("aiCore.kindEdit"), icon: ICON_FILE_PEN, tint: "warning", summarize: sum(summarizePath) },
1079
+ write: { label: t("aiCore.kindWrite"), icon: ICON_FILE_PLUS, tint: "warning", summarize: sum(summarizePath) },
1080
+ rm: { label: t("aiCore.kindDelete"), icon: ICON_TRASH, tint: "error", summarize: sum(summarizePath) },
1081
+ grep: { label: t("aiCore.kindGrep"), icon: ICON_SEARCH, tint: "info", summarize: sum(summarizeGrep) },
1082
+ glob: { label: t("aiCore.kindGlob"), icon: ICON_FOLDER_SEARCH, tint: "info", summarize: sum((i) => pickStr(i, ["pattern", "glob", "path"])) },
1083
+ browser: { label: t("aiCore.kindBrowser"), icon: ICON_GLOBE, tint: "accent", summarize: sum((i) => pickStr(i, ["url", "uri", "target"])) },
1084
+ search: { label: t("aiCore.kindSearch"), icon: ICON_SCAN_SEARCH, tint: "accent", summarize: sum((i) => pickStr(i, ["query", "q", "pattern"])) },
1085
+ fetch: { label: t("aiCore.kindFetch"), icon: ICON_DOWNLOAD, tint: "info", summarize: sum((i) => pickStr(i, ["url", "uri", "endpoint"])) },
130
1086
  mcp: { label: "MCP", icon: ICON_BLOCKS, tint: "muted", summarize: sum((i) => pickStr(i, ["tool", "method", "name"])) },
131
- skill: { label: "\u6280\u80FD", icon: ICON_ZAP, tint: "accent", summarize: sum((i) => pickStr(i, ["skill", "name", "command"])) },
1087
+ skill: { label: t("aiCore.kindSkill"), icon: ICON_ZAP, tint: "accent", summarize: sum((i) => pickStr(i, ["skill", "name", "command"])) },
132
1088
  todo: {
133
- label: "\u5F85\u529E",
1089
+ label: t("aiCore.kindTodo"),
134
1090
  icon: ICON_LIST,
135
1091
  tint: "info",
136
1092
  summarize: sum((input) => {
137
1093
  const items = input && typeof input === "object" && Array.isArray(input.items) ? input.items : Array.isArray(input) ? input : [];
138
1094
  const done = items.filter((it) => it?.status === "done").length;
139
- return items.length > 0 ? `${done}/${items.length} \u5B8C\u6210` : "";
1095
+ return items.length > 0 ? t("aiCore.todoProgress", { p0: done, p1: items.length }) : "";
140
1096
  })
141
1097
  },
142
- plan: { label: "\u8BA1\u5212", icon: ICON_LIST_CHECKS, tint: "info" },
143
- subagent: { label: "\u5B50\u4EE3\u7406", icon: ICON_BOT, tint: "accent", summarize: sum((i) => pickStr(i, ["task", "description", "prompt", "message", "subagent_type"])) },
144
- note: { label: "\u7B14\u8BB0", icon: ICON_FILE_TEXT, tint: "muted" },
145
- chart: { label: "\u56FE\u8868", icon: ICON_CHART, tint: "info", summarize: sum((i) => pickStr(i, ["title", "name"])) }
1098
+ plan: { label: t("aiCore.kindPlan"), icon: ICON_LIST_CHECKS, tint: "info" },
1099
+ subagent: { label: t("aiCore.kindSubagent"), icon: ICON_BOT, tint: "accent", summarize: sum((i) => pickStr(i, ["task", "description", "prompt", "message", "subagent_type"])) },
1100
+ note: { label: t("aiCore.kindNote"), icon: ICON_FILE_TEXT, tint: "muted" },
1101
+ chart: { label: t("aiCore.kindChart"), icon: ICON_CHART, tint: "info", summarize: sum((i) => pickStr(i, ["title", "name"])) }
146
1102
  };
147
1103
  var kindRegistry = new Map(Object.entries(BUILTIN_KINDS));
148
1104
  function normalizeUsage(raw) {
@@ -185,51 +1141,23 @@ function formatDuration(ms) {
185
1141
  return rm > 0 ? `${h2}h${rm}m` : `${h2}h`;
186
1142
  }
187
1143
  function h(tag, className, text) {
1144
+ if (typeof document === "undefined") throw new Error("h() \u4EC5\u6D4F\u89C8\u5668\u73AF\u5883\u53EF\u7528\uFF08SSR \u65F6\u7531\u8C03\u7528\u65B9\u5B88\u536B\uFF0C\u89C1\u6A21\u5757\u5934\u6CE8\u91CA\uFF09");
188
1145
  const node = document.createElement(tag);
189
1146
  if (className) node.className = className;
190
1147
  if (text != null) node.textContent = text;
191
1148
  return node;
192
1149
  }
193
- function svgIcon(svg2) {
194
- if (typeof document === "undefined" || typeof DOMParser === "undefined") return null;
195
- let parsed;
196
- try {
197
- parsed = new DOMParser().parseFromString(svg2, "image/svg+xml");
198
- } catch {
199
- return null;
200
- }
201
- const root = parsed.documentElement;
202
- if (!root || root.tagName.toLowerCase() !== "svg" || parsed.querySelector("parsererror")) {
203
- return null;
204
- }
205
- const sanitize = (el) => {
206
- for (const attr of Array.from(el.attributes)) {
207
- const name = attr.name.toLowerCase();
208
- if (name.startsWith("on")) el.removeAttribute(attr.name);
209
- if ((name === "href" || name === "xlink:href") && attr.value.trim().toLowerCase().startsWith("javascript:")) {
210
- el.removeAttribute(attr.name);
211
- }
212
- }
213
- for (const child of Array.from(el.children)) {
214
- const tag = child.tagName.toLowerCase();
215
- if (tag === "script" || tag === "foreignobject") {
216
- child.remove();
217
- continue;
218
- }
219
- sanitize(child);
220
- }
221
- };
222
- sanitize(root);
223
- return document.importNode(root, true);
1150
+ function svgIcon(svg) {
1151
+ return parseSvg(svg);
224
1152
  }
225
1153
 
226
1154
  // src/behaviors/popover.ts
227
1155
  var PANEL_SIZING_ATTRS = {
228
- width: "data-panel-width",
229
- minWidth: "data-panel-min",
230
- maxWidth: "data-panel-max",
231
- minHeight: "data-panel-min-height",
232
- maxHeight: "data-panel-max-height"
1156
+ width: "data-icen-panel-width",
1157
+ minWidth: "data-icen-panel-min",
1158
+ maxWidth: "data-icen-panel-max",
1159
+ minHeight: "data-icen-panel-min-height",
1160
+ maxHeight: "data-icen-panel-max-height"
233
1161
  };
234
1162
  function readPanelSizing(el) {
235
1163
  const out = {};
@@ -289,10 +1217,10 @@ function computePopoverLayout(anchor, viewport, opts = {}) {
289
1217
  const preferredSide = opts.side ?? "top";
290
1218
  const align = opts.align ?? "start";
291
1219
  if (preferredSide === "left" || preferredSide === "right") {
1220
+ const minWidth2 = Math.max(1, opts.minWidth ?? DEFAULT_MIN_WIDTH);
292
1221
  const availableLeft = Math.max(0, anchor.left - margin - offset);
293
1222
  const availableRight = Math.max(0, viewport.width - anchor.right - margin - offset);
294
- const side2 = (preferredSide === "left" ? availableLeft : availableRight) >= DEFAULT_MIN_WIDTH ? preferredSide : preferredSide === "left" ? "right" : "left";
295
- const minWidth2 = Math.max(1, opts.minWidth ?? DEFAULT_MIN_WIDTH);
1223
+ const side2 = (preferredSide === "left" ? availableLeft : availableRight) >= minWidth2 ? preferredSide : preferredSide === "left" ? "right" : "left";
296
1224
  const maxWidth2 = Math.min(
297
1225
  Math.max(opts.maxWidth ?? DEFAULT_MAX_WIDTH, minWidth2),
298
1226
  side2 === "left" ? availableLeft : availableRight
@@ -321,7 +1249,7 @@ function computePopoverLayout(anchor, viewport, opts = {}) {
321
1249
  const minHeight = Math.min(Math.max(80, opts.minHeight ?? DEFAULT_MIN_HEIGHT), availableHeight);
322
1250
  const requestedMaxHeight = Math.max(minHeight, opts.maxHeight ?? DEFAULT_MAX_HEIGHT);
323
1251
  const fallbackHeight = Math.min(260, requestedMaxHeight);
324
- const contentHeight = Math.max(opts.contentHeightHint ?? 0, fallbackHeight);
1252
+ const contentHeight = opts.contentHeightHint != null && opts.contentHeightHint > 0 ? opts.contentHeightHint : fallbackHeight;
325
1253
  const desiredHeight = clamp(contentHeight, minHeight, Math.min(requestedMaxHeight, availableHeight));
326
1254
  const side = chooseSide(preferredSide, availableTop, availableBottom, desiredHeight);
327
1255
  const sideSpace = side === "top" ? availableTop : availableBottom;
@@ -338,6 +1266,9 @@ function computePopoverLayout(anchor, viewport, opts = {}) {
338
1266
  return { side, left, top, width, maxHeight };
339
1267
  }
340
1268
  var openPanels = /* @__PURE__ */ new Map();
1269
+ var closingPanels = /* @__PURE__ */ new Map();
1270
+ var EXIT_FALLBACK_MS = 240;
1271
+ var menuCloser = null;
341
1272
  function rectFromElement(el) {
342
1273
  const r = el.getBoundingClientRect();
343
1274
  return { left: r.left, top: r.top, right: r.right, bottom: r.bottom, width: r.width, height: r.height };
@@ -355,21 +1286,54 @@ function relayout(state) {
355
1286
  closePopover(state.panel);
356
1287
  return;
357
1288
  }
358
- const layout = computePopoverLayout(
1289
+ let layout = computePopoverLayout(
359
1290
  anchor,
360
1291
  { width: window.innerWidth, height: window.innerHeight },
361
1292
  state.opts
362
1293
  );
363
1294
  const { panel } = state;
1295
+ const scrollPositions = [panel, ...panel.querySelectorAll("*")].filter((node) => node.scrollTop !== 0 || node.scrollLeft !== 0).map((node) => ({ node, top: node.scrollTop, left: node.scrollLeft }));
1296
+ panel.style.width = `${layout.width}px`;
1297
+ if (state.opts.contentHeightHint == null && (layout.side === "top" || layout.side === "bottom")) {
1298
+ panel.style.maxHeight = `${Math.min(state.opts.maxHeight ?? DEFAULT_MAX_HEIGHT, Math.max(80, window.innerHeight - (state.opts.margin ?? 12) * 2))}px`;
1299
+ const measured = panel.offsetHeight;
1300
+ if (measured > 0) layout = computePopoverLayout(anchor, { width: window.innerWidth, height: window.innerHeight }, { ...state.opts, contentHeightHint: measured });
1301
+ }
364
1302
  panel.style.left = `${layout.left}px`;
365
- panel.style.top = `${layout.top}px`;
366
1303
  panel.style.width = `${layout.width}px`;
367
1304
  panel.style.maxHeight = `${layout.maxHeight}px`;
368
- panel.dataset.side = layout.side;
1305
+ let top = layout.top;
1306
+ const actualHeight = panel.offsetHeight;
1307
+ if (actualHeight > 0 && (layout.side === "top" || layout.side === "bottom")) {
1308
+ const desired = layout.side === "top" ? anchor.top - (state.opts.offset ?? 8) - actualHeight : anchor.bottom + (state.opts.offset ?? 8);
1309
+ const margin = state.opts.margin ?? 12;
1310
+ top = clamp(desired, margin, window.innerHeight - margin - actualHeight);
1311
+ }
1312
+ panel.style.top = `${top}px`;
1313
+ for (const pos of scrollPositions) {
1314
+ pos.node.scrollTop = pos.top;
1315
+ pos.node.scrollLeft = pos.left;
1316
+ }
1317
+ panel.dataset.icenSide = layout.side;
369
1318
  panel.style.visibility = state.prevVisibility;
370
1319
  }
371
- function onWindowChange() {
372
- openPanels.forEach(relayout);
1320
+ function observeOpenPanel(state) {
1321
+ if (typeof ResizeObserver === "undefined") return;
1322
+ state.resizeObserver = new ResizeObserver(() => {
1323
+ if (state.layoutFrame != null) return;
1324
+ state.layoutFrame = window.requestAnimationFrame(() => {
1325
+ state.layoutFrame = void 0;
1326
+ if (openPanels.get(state.panel) === state) relayout(state);
1327
+ });
1328
+ });
1329
+ state.resizeObserver.observe(state.panel);
1330
+ if (state.anchor instanceof Element) state.resizeObserver.observe(state.anchor);
1331
+ }
1332
+ function onWindowChange(event) {
1333
+ openPanels.forEach((state) => {
1334
+ if (event?.type === "scroll" && event.target instanceof Node && state.panel.contains(event.target)) return;
1335
+ relayout(state);
1336
+ });
373
1337
  }
374
1338
  function onOutsidePointerDown(e) {
375
1339
  const target = e.target;
@@ -381,18 +1345,40 @@ function onOutsidePointerDown(e) {
381
1345
  });
382
1346
  }
383
1347
  function onKeyDown(e) {
384
- if (e.key !== "Escape") return;
1348
+ if (e.key !== "Escape" || e.defaultPrevented || e.isComposing || e.keyCode === 229 || menuCloser) return;
385
1349
  const states = Array.from(openPanels.values());
386
1350
  const top = states[states.length - 1];
387
1351
  if (top) {
388
1352
  e.preventDefault();
1353
+ e.stopPropagation();
389
1354
  closePopover(top.panel);
390
1355
  }
391
1356
  }
392
1357
  function openPopover(panel, options) {
393
1358
  if (typeof document === "undefined") return;
1359
+ const pending = closingPanels.get(panel);
1360
+ if (pending) {
1361
+ window.clearTimeout(pending.timer);
1362
+ panel.removeEventListener("transitionend", pending.onEnd);
1363
+ closingPanels.delete(panel);
1364
+ delete panel.dataset.icenState;
1365
+ openPanels.set(panel, pending.state);
1366
+ panel.hidden = false;
1367
+ panel.style.visibility = "hidden";
1368
+ relayout(pending.state);
1369
+ observeOpenPanel(pending.state);
1370
+ if (openPanels.size === 1) {
1371
+ window.addEventListener("resize", onWindowChange);
1372
+ window.addEventListener("scroll", onWindowChange, true);
1373
+ document.addEventListener("pointerdown", onOutsidePointerDown, true);
1374
+ window.addEventListener("keydown", onKeyDown, true);
1375
+ }
1376
+ const ifs = options.initialFocus;
1377
+ if (ifs && panel.contains(ifs)) ifs.focus({ preventScroll: true });
1378
+ return;
1379
+ }
394
1380
  if (openPanels.has(panel)) closePopover(panel);
395
- const { anchor, onClose, sizing, ...rest } = options;
1381
+ const { anchor, onClose, sizing, initialFocus, restoreFocus, ...rest } = options;
396
1382
  const layoutOpts = sizingToLayout(resolvePanelSizing(panel, sizing), rest);
397
1383
  const placeholder = document.createComment("popover-anchor");
398
1384
  panel.parentNode?.insertBefore(placeholder, panel);
@@ -405,25 +1391,25 @@ function openPopover(panel, options) {
405
1391
  onClose,
406
1392
  placeholder,
407
1393
  wasHidden,
408
- prevVisibility
1394
+ prevVisibility,
1395
+ returnFocus: restoreFocus === false ? null : anchor instanceof HTMLElement ? anchor : document.activeElement instanceof HTMLElement ? document.activeElement : null
409
1396
  };
410
1397
  openPanels.set(panel, state);
411
1398
  document.body.appendChild(panel);
412
1399
  panel.hidden = false;
413
1400
  panel.style.visibility = "hidden";
414
1401
  relayout(state);
1402
+ observeOpenPanel(state);
1403
+ if (initialFocus && panel.contains(initialFocus)) initialFocus.focus({ preventScroll: true });
415
1404
  if (openPanels.size === 1) {
416
1405
  window.addEventListener("resize", onWindowChange);
417
1406
  window.addEventListener("scroll", onWindowChange, true);
418
1407
  document.addEventListener("pointerdown", onOutsidePointerDown, true);
419
- window.addEventListener("keydown", onKeyDown);
1408
+ window.addEventListener("keydown", onKeyDown, true);
420
1409
  }
421
1410
  }
422
- function closePopover(panel) {
423
- if (typeof document === "undefined") return;
424
- const state = openPanels.get(panel);
425
- if (!state) return;
426
- openPanels.delete(panel);
1411
+ function finalizeClose(panel, state) {
1412
+ delete panel.dataset.icenState;
427
1413
  panel.style.visibility = state.prevVisibility;
428
1414
  if (typeof state.wasHidden === "string") panel.setAttribute("hidden", state.wasHidden);
429
1415
  else panel.hidden = state.wasHidden;
@@ -431,25 +1417,54 @@ function closePopover(panel) {
431
1417
  panel.style.top = "";
432
1418
  panel.style.width = "";
433
1419
  panel.style.maxHeight = "";
434
- delete panel.dataset.side;
1420
+ delete panel.dataset.icenSide;
435
1421
  if (state.placeholder.parentNode) {
436
1422
  state.placeholder.parentNode.insertBefore(panel, state.placeholder);
437
1423
  state.placeholder.remove();
438
1424
  }
1425
+ }
1426
+ function closePopover(panel, opts) {
1427
+ if (typeof document === "undefined") return;
1428
+ const state = openPanels.get(panel);
1429
+ if (!state) return;
1430
+ openPanels.delete(panel);
1431
+ state.resizeObserver?.disconnect();
1432
+ if (state.layoutFrame != null) {
1433
+ window.cancelAnimationFrame(state.layoutFrame);
1434
+ state.layoutFrame = void 0;
1435
+ }
1436
+ const ownsFocus = panel.contains(document.activeElement);
1437
+ if (ownsFocus && state.returnFocus?.isConnected) state.returnFocus.focus({ preventScroll: true });
439
1438
  if (openPanels.size === 0) {
440
1439
  window.removeEventListener("resize", onWindowChange);
441
1440
  window.removeEventListener("scroll", onWindowChange, true);
442
1441
  document.removeEventListener("pointerdown", onOutsidePointerDown, true);
443
- window.removeEventListener("keydown", onKeyDown);
1442
+ window.removeEventListener("keydown", onKeyDown, true);
444
1443
  }
445
1444
  state.onClose?.();
446
- }
447
-
448
- // src/behaviors/events.ts
449
- function emitIcen(source, type, detail) {
450
- return source.dispatchEvent(
451
- new CustomEvent(type, { detail, bubbles: true, composed: true, cancelable: true })
452
- );
1445
+ const calm = opts?.immediate || typeof window !== "undefined" && typeof window.matchMedia === "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
1446
+ if (calm || !panel.isConnected) {
1447
+ finalizeClose(panel, state);
1448
+ return;
1449
+ }
1450
+ panel.dataset.icenState = "closing";
1451
+ const finalize = () => {
1452
+ const pending = closingPanels.get(panel);
1453
+ if (!pending || pending.state !== state) return;
1454
+ window.clearTimeout(pending.timer);
1455
+ panel.removeEventListener("transitionend", pending.onEnd);
1456
+ closingPanels.delete(panel);
1457
+ finalizeClose(panel, state);
1458
+ };
1459
+ const onEnd = (event) => {
1460
+ if (event.target === panel && event.propertyName === "opacity") finalize();
1461
+ };
1462
+ panel.addEventListener("transitionend", onEnd);
1463
+ closingPanels.set(panel, {
1464
+ state,
1465
+ timer: window.setTimeout(finalize, EXIT_FALLBACK_MS),
1466
+ onEnd
1467
+ });
453
1468
  }
454
1469
 
455
1470
  // src/behaviors/ai-panel.ts
@@ -460,14 +1475,14 @@ function stripStatusClasses(node) {
460
1475
  for (const s of AI_STATUSES) node.classList.remove(`is-${s}`);
461
1476
  }
462
1477
  function buildTodoHead(done, total) {
463
- const head = h("div", "ai-todo-head");
464
- head.appendChild(h("span", "ai-todo-progress", `${done}/${total}`));
465
- const bar = h("div", "ai-todo-bar");
1478
+ const head = h("div", "icen-ai-todo-head");
1479
+ head.appendChild(h("span", "icen-ai-todo-progress", `${done}/${total}`));
1480
+ const bar = h("div", "icen-ai-todo-bar");
466
1481
  bar.setAttribute("role", "progressbar");
467
1482
  bar.setAttribute("aria-valuemin", "0");
468
1483
  bar.setAttribute("aria-valuemax", String(total));
469
1484
  bar.setAttribute("aria-valuenow", String(done));
470
- bar.setAttribute("aria-label", "\u4EFB\u52A1\u8FDB\u5EA6");
1485
+ bar.setAttribute("aria-label", t("aiPanel.taskProgress"));
471
1486
  const fill = document.createElement("i");
472
1487
  fill.style.width = total > 0 ? `${Math.round(done / total * 100)}%` : "0%";
473
1488
  bar.appendChild(fill);
@@ -476,22 +1491,22 @@ function buildTodoHead(done, total) {
476
1491
  }
477
1492
  var ICON_TODO_CHECK = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"><path d="m3.5 12.5 5 5L20.5 6" pathLength="1"/></svg>';
478
1493
  function buildTodoItem(item, index) {
479
- const row = h("div", `ai-todo-item is-${item.status}`);
480
- row.dataset.index = String(index);
481
- row.appendChild(h("span", "ai-item-status"));
482
- const check = h("span", "ai-todo-check is-anim");
1494
+ const row = h("div", `icen-ai-todo-item is-${item.status}`);
1495
+ row.dataset.icenIndex = String(index);
1496
+ row.appendChild(h("span", "icen-ai-item-status"));
1497
+ const check = h("span", "icen-ai-todo-check is-anim");
483
1498
  check.setAttribute("aria-hidden", "true");
484
1499
  const checkSvg = svgIcon(ICON_TODO_CHECK);
485
1500
  if (checkSvg) check.appendChild(checkSvg);
486
1501
  row.appendChild(check);
487
- row.appendChild(h("span", "ai-todo-text", item.content));
488
- row.appendChild(h("span", "ai-todo-active", item.activeForm ?? item.content));
1502
+ row.appendChild(h("span", "icen-ai-todo-text", item.content));
1503
+ row.appendChild(h("span", "icen-ai-todo-active", item.activeForm ?? item.content));
489
1504
  return row;
490
1505
  }
491
1506
  function renderAiTodo(el, items) {
492
1507
  if (typeof document === "undefined") return el;
493
1508
  el.textContent = "";
494
- const root = h("div", "ai-todo");
1509
+ const root = h("div", "icen-ai-todo");
495
1510
  const list = Array.isArray(items) ? items : [];
496
1511
  const done = list.filter((i) => i.status === "done").length;
497
1512
  root.appendChild(buildTodoHead(done, list.length));
@@ -512,12 +1527,12 @@ function todoItemStatus(item) {
512
1527
  return "pending";
513
1528
  }
514
1529
  function refreshTodoProgress(todo) {
515
- const items = Array.from(todo.querySelectorAll(".ai-todo-item"));
1530
+ const items = Array.from(todo.querySelectorAll(".icen-ai-todo-item"));
516
1531
  const done = items.filter((i) => i.classList.contains("is-done")).length;
517
1532
  const total = items.length;
518
- const progress = todo.querySelector(".ai-todo-progress");
1533
+ const progress = todo.querySelector(".icen-ai-todo-progress");
519
1534
  if (progress) progress.textContent = `${done}/${total}`;
520
- const bar = todo.querySelector(".ai-todo-bar");
1535
+ const bar = todo.querySelector(".icen-ai-todo-bar");
521
1536
  if (bar) {
522
1537
  bar.setAttribute("aria-valuemax", String(total));
523
1538
  bar.setAttribute("aria-valuenow", String(done));
@@ -527,23 +1542,23 @@ function refreshTodoProgress(todo) {
527
1542
  todo.classList.toggle("is-complete", total > 0 && done === total);
528
1543
  }
529
1544
  function toggleTodoItem(item) {
530
- const todo = item.closest("[data-ai-todo-interactive]");
531
- if (!todo || !todo.hasAttribute("data-ai-todo-interactive")) return;
1545
+ const todo = item.closest("[data-icen-ai-todo-interactive]");
1546
+ if (!todo || !todo.hasAttribute("data-icen-ai-todo-interactive")) return;
532
1547
  const index = Array.from(
533
- todo.querySelectorAll(".ai-todo-item")
1548
+ todo.querySelectorAll(".icen-ai-todo-item")
534
1549
  ).indexOf(item);
535
1550
  const next = TODO_NEXT[todoItemStatus(item)] ?? "pending";
536
1551
  stripStatusClasses(item);
537
1552
  item.classList.add(`is-${next}`);
538
1553
  if (next === "running") {
539
- const active = item.querySelector(".ai-todo-active");
540
- if (active && item.dataset.activeForm) {
541
- active.textContent = item.dataset.activeForm;
1554
+ const active = item.querySelector(".icen-ai-todo-active");
1555
+ if (active && item.dataset.icenActiveForm) {
1556
+ active.textContent = item.dataset.icenActiveForm;
542
1557
  }
543
1558
  }
544
- const text = item.querySelector(".ai-todo-text")?.textContent ?? "";
1559
+ const text = item.querySelector(".icen-ai-todo-text")?.textContent ?? "";
545
1560
  if (!item.hasAttribute("aria-label")) {
546
- item.setAttribute("aria-label", `${text}\uFF0C\u72B6\u6001\uFF1A${aiStatusLabel(next)}`);
1561
+ item.setAttribute("aria-label", t("aiPanel.itemStatus", { p0: text, p1: aiStatusLabel(next) }));
547
1562
  }
548
1563
  refreshTodoProgress(todo);
549
1564
  dispatch(item, "icen:ai-todo-toggle", { index, status: next });
@@ -556,26 +1571,26 @@ function initAiTodo(root) {
556
1571
  marked.__icenAiTodoInit = true;
557
1572
  const target = scope;
558
1573
  scope.querySelectorAll(
559
- "[data-ai-todo-interactive] > .ai-todo-item"
1574
+ "[data-icen-ai-todo-interactive] > .icen-ai-todo-item"
560
1575
  ).forEach((item) => {
561
1576
  if (item.getAttribute("role") === "button") return;
562
1577
  item.setAttribute("role", "button");
563
1578
  item.tabIndex = 0;
564
- const text = item.querySelector(".ai-todo-text")?.textContent ?? "";
565
- item.setAttribute("aria-label", `${text}\uFF0C\u72B6\u6001\uFF1A${aiStatusLabel(todoItemStatus(item))}`);
1579
+ const text = item.querySelector(".icen-ai-todo-text")?.textContent ?? "";
1580
+ item.setAttribute("aria-label", t("aiPanel.itemStatus", { p0: text, p1: aiStatusLabel(todoItemStatus(item)) }));
566
1581
  });
567
1582
  const onClick = (e) => {
568
- const t = e.target instanceof Element ? e.target : null;
569
- const item = t?.closest(".ai-todo-item");
570
- if (!item || !(item.closest("[data-ai-todo-interactive]") instanceof HTMLElement)) return;
1583
+ const t2 = e.target instanceof Element ? e.target : null;
1584
+ const item = t2?.closest(".icen-ai-todo-item");
1585
+ if (!item || !(item.closest("[data-icen-ai-todo-interactive]") instanceof HTMLElement)) return;
571
1586
  toggleTodoItem(item);
572
1587
  };
573
1588
  const onKeydown = (e) => {
574
1589
  const ke = e;
575
1590
  if (ke.key !== "Enter" && ke.key !== " ") return;
576
- const t = ke.target instanceof Element ? ke.target : null;
577
- const item = t?.closest(".ai-todo-item");
578
- if (!item || !(item.closest("[data-ai-todo-interactive]") instanceof HTMLElement)) return;
1591
+ const t2 = ke.target instanceof Element ? ke.target : null;
1592
+ const item = t2?.closest(".icen-ai-todo-item");
1593
+ if (!item || !(item.closest("[data-icen-ai-todo-interactive]") instanceof HTMLElement)) return;
579
1594
  ke.preventDefault();
580
1595
  toggleTodoItem(item);
581
1596
  };
@@ -603,38 +1618,38 @@ function renderAiUsage(el, usage, opts = {}) {
603
1618
  if (typeof document === "undefined") return el;
604
1619
  const u = normalizeUsage(usage);
605
1620
  const segs = [
606
- { key: "input", className: "ai-usage-seg--input", label: "\u8F93\u5165", value: u.input ?? 0 },
607
- { key: "output", className: "ai-usage-seg--output", label: "\u8F93\u51FA", value: u.output ?? 0 },
608
- { key: "cacheRead", className: "ai-usage-seg--cache-read", label: "\u7F13\u5B58\u8BFB", value: u.cacheRead ?? 0 },
609
- { key: "cacheWrite", className: "ai-usage-seg--cache-write", label: "\u7F13\u5B58\u5199", value: u.cacheWrite ?? 0 },
610
- { key: "reasoning", className: "ai-usage-seg--reasoning", label: "\u63A8\u7406", value: u.reasoning ?? 0 }
1621
+ { key: "input", className: "icen-ai-usage-seg--input", label: t("common.input"), value: u.input ?? 0 },
1622
+ { key: "output", className: "icen-ai-usage-seg--output", label: t("common.output"), value: u.output ?? 0 },
1623
+ { key: "cacheRead", className: "icen-ai-usage-seg--cache-read", label: t("aiPanel.cacheRead"), value: u.cacheRead ?? 0 },
1624
+ { key: "cacheWrite", className: "icen-ai-usage-seg--cache-write", label: t("aiPanel.cacheWrite"), value: u.cacheWrite ?? 0 },
1625
+ { key: "reasoning", className: "icen-ai-usage-seg--reasoning", label: t("aiPanel.reasoning"), value: u.reasoning ?? 0 }
611
1626
  ];
612
1627
  const activeSegs = segs.filter((s) => s.value > 0);
613
1628
  const sum2 = activeSegs.reduce((acc, s) => acc + s.value, 0);
614
1629
  const total = u.total ?? sum2;
615
1630
  el.textContent = "";
616
- const root = h("div", "ai-usage");
617
- const bar = h("div", "ai-usage-bar");
618
- const summary = activeSegs.length > 0 ? activeSegs.map((s) => `${s.label} ${formatTokens(s.value)}`).join("\uFF0C") : "\u6682\u65E0\u7528\u91CF";
1631
+ const root = h("div", "icen-ai-usage");
1632
+ const bar = h("div", "icen-ai-usage-bar");
1633
+ const summary = activeSegs.length > 0 ? activeSegs.map((s) => `${s.label} ${formatTokens(s.value)}`).join("\uFF0C") : t("aiPanel.noUsage");
619
1634
  bar.setAttribute("role", "img");
620
- bar.setAttribute("aria-label", `\u7528\u91CF\uFF1A${summary}`);
1635
+ bar.setAttribute("aria-label", t("aiPanel.usageAria", { p0: summary }));
621
1636
  for (const s of activeSegs) {
622
1637
  const seg = document.createElement("i");
623
- seg.className = `ai-usage-seg ${s.className}`;
1638
+ seg.className = `icen-ai-usage-seg ${s.className}`;
624
1639
  seg.style.width = sum2 > 0 ? `${s.value / sum2 * 100}%` : "0%";
625
1640
  bar.appendChild(seg);
626
1641
  }
627
1642
  root.appendChild(bar);
628
1643
  if (activeSegs.length > 0) {
629
- const legend = h("div", "ai-usage-legend");
1644
+ const legend = h("div", "icen-ai-usage-legend");
630
1645
  for (const s of activeSegs) {
631
- const item = h("span", "ai-usage-legend-item");
1646
+ const item = h("span", "icen-ai-usage-legend-item");
632
1647
  const dot = document.createElement("i");
633
- dot.className = `ai-usage-dot ${s.className}`;
1648
+ dot.className = `icen-ai-usage-dot ${s.className}`;
634
1649
  dot.setAttribute("aria-hidden", "true");
635
1650
  item.appendChild(dot);
636
- item.appendChild(h("span", "ai-usage-legend-label", s.label));
637
- item.appendChild(h("span", "ai-usage-legend-value", formatTokens(s.value)));
1651
+ item.appendChild(h("span", "icen-ai-usage-legend-label", s.label));
1652
+ item.appendChild(h("span", "icen-ai-usage-legend-value", formatTokens(s.value)));
638
1653
  legend.appendChild(item);
639
1654
  }
640
1655
  root.appendChild(legend);
@@ -646,7 +1661,7 @@ function renderAiUsage(el, usage, opts = {}) {
646
1661
  if (ttft != null) metricBits.push(`TTFT ${formatDuration(ttft)}`);
647
1662
  if (tps != null && tps > 0) metricBits.push(`${trimNum(tps)} tok/s`);
648
1663
  if (finish) metricBits.push(`finish: ${finish}`);
649
- if (metricBits.length > 0) root.appendChild(h("div", "ai-usage-metrics", metricBits.join(" \xB7 ")));
1664
+ if (metricBits.length > 0) root.appendChild(h("div", "icen-ai-usage-metrics", metricBits.join(" \xB7 ")));
650
1665
  const totalParts = [formatTokens(total)];
651
1666
  if (typeof opts.total === "number" && opts.total > 0) {
652
1667
  const pct = Math.min(100, Math.round(total / opts.total * 100));
@@ -655,7 +1670,7 @@ function renderAiUsage(el, usage, opts = {}) {
655
1670
  if (typeof opts.cost === "number" && Number.isFinite(opts.cost)) {
656
1671
  totalParts.push(` \xB7 $${opts.cost.toFixed(4)}`);
657
1672
  }
658
- root.appendChild(h("div", "ai-usage-total", totalParts.join("")));
1673
+ root.appendChild(h("div", "icen-ai-usage-total", totalParts.join("")));
659
1674
  el.appendChild(root);
660
1675
  return el;
661
1676
  }
@@ -666,31 +1681,33 @@ function renderAiUsageRing(el, usage, opts = {}) {
666
1681
  const hasLimit = typeof opts.total === "number" && opts.total > 0;
667
1682
  const pct = hasLimit ? Math.min(100, Math.max(0, Math.round(used / opts.total * 100))) : 0;
668
1683
  el.textContent = "";
669
- const btn = h("button", "ai-usage-ring");
1684
+ const btn = h("button", "icen-ai-usage-ring");
670
1685
  btn.type = "button";
671
1686
  btn.classList.add(pct >= 85 ? "is-hot" : pct >= 60 ? "is-warn" : "is-ok");
672
1687
  btn.setAttribute("aria-haspopup", "true");
673
1688
  btn.setAttribute(
674
1689
  "aria-label",
675
- hasLimit ? `\u4E0A\u4E0B\u6587\u7A97\u53E3\u5360\u7528 ${pct}%\uFF0C\u70B9\u51FB\u67E5\u770B\u8BE6\u60C5` : `\u5DF2\u7528 ${formatTokens(used)}\uFF0C\u70B9\u51FB\u67E5\u770B\u8BE6\u60C5`
1690
+ hasLimit ? t("aiPanel.ringPercent", { p0: pct }) : t("aiPanel.ringUsed", { p0: formatTokens(used) })
676
1691
  );
677
1692
  const NS = "http://www.w3.org/2000/svg";
678
- const svg2 = document.createElementNS(NS, "svg");
679
- svg2.setAttribute("viewBox", "0 0 36 36");
680
- svg2.setAttribute("aria-hidden", "true");
1693
+ const svg = document.createElementNS(NS, "svg");
1694
+ svg.setAttribute("viewBox", "0 0 36 36");
1695
+ svg.setAttribute("width", "36");
1696
+ svg.setAttribute("height", "36");
1697
+ svg.setAttribute("aria-hidden", "true");
681
1698
  const track = document.createElementNS(NS, "circle");
682
- track.setAttribute("class", "ai-usage-ring-track");
1699
+ track.setAttribute("class", "icen-ai-usage-ring-track");
683
1700
  const fill = document.createElementNS(NS, "circle");
684
- fill.setAttribute("class", "ai-usage-ring-fill");
1701
+ fill.setAttribute("class", "icen-ai-usage-ring-fill");
685
1702
  fill.setAttribute("stroke-dasharray", `${pct} 100`);
686
1703
  for (const c of [track, fill]) {
687
1704
  c.setAttribute("cx", "18");
688
1705
  c.setAttribute("cy", "18");
689
1706
  c.setAttribute("r", "15.9155");
690
- svg2.appendChild(c);
1707
+ svg.appendChild(c);
691
1708
  }
692
- btn.appendChild(svg2);
693
- btn.appendChild(h("span", "ai-usage-ring-pct", hasLimit ? `${pct}%` : formatTokens(used)));
1709
+ btn.appendChild(svg);
1710
+ btn.appendChild(h("span", "icen-ai-usage-ring-pct", hasLimit ? `${pct}%` : formatTokens(used)));
694
1711
  let panel = null;
695
1712
  const closePanel = () => {
696
1713
  if (!panel) return;
@@ -704,9 +1721,9 @@ function renderAiUsageRing(el, usage, opts = {}) {
704
1721
  closePanel();
705
1722
  return;
706
1723
  }
707
- const p = h("div", "popover ai-usage-popover");
1724
+ const p = h("div", "icen-popover icen-ai-usage-popover");
708
1725
  p.hidden = true;
709
- p.appendChild(h("div", "ai-usage-popover-title", opts.title ?? "\u4E0A\u4E0B\u6587\u7A97\u53E3"));
1726
+ p.appendChild(h("div", "icen-ai-usage-popover-title", opts.title ?? t("aiPanel.contextWindow")));
710
1727
  const body = h("div", "ai-usage-popover-body");
711
1728
  renderAiUsage(body, usage, opts);
712
1729
  p.appendChild(body);
@@ -770,18 +1787,18 @@ function fileKindIcon(kind) {
770
1787
  }
771
1788
  function renderFileChip(file) {
772
1789
  const kind = fileKind(file.path);
773
- const chip = h("span", `ai-file-chip ai-file-chip--${kind} is-${file.status ?? "modified"}`);
774
- const icon = h("span", "ai-file-icon");
775
- const svg2 = svgIcon(fileKindIcon(kind));
776
- if (svg2) icon.appendChild(svg2);
1790
+ const chip = h("span", `icen-ai-file-chip icen-ai-file-chip--${kind} is-${file.status ?? "modified"}`);
1791
+ const icon = h("span", "icen-ai-file-icon");
1792
+ const svg = svgIcon(fileKindIcon(kind));
1793
+ if (svg) icon.appendChild(svg);
777
1794
  chip.appendChild(icon);
778
1795
  chip.appendChild(document.createTextNode(file.path));
779
1796
  return chip;
780
1797
  }
781
1798
  function renderSection(title) {
782
- const section = h("section", "ai-context-section");
1799
+ const section = h("section", "icen-ai-context-section");
783
1800
  section.appendChild(h("h3", "", title));
784
- const body = h("div", "ai-context-section-body");
1801
+ const body = h("div", "icen-ai-context-section-body");
785
1802
  section.appendChild(body);
786
1803
  return { section, body };
787
1804
  }
@@ -789,31 +1806,32 @@ function renderAiContext(el, model) {
789
1806
  if (typeof document === "undefined") return el;
790
1807
  el.textContent = "";
791
1808
  const m = model ?? {};
792
- const aside = h("aside", "ai-context");
1809
+ const aside = h("aside", "icen-ai-context");
793
1810
  aside.hidden = true;
794
- const head = h("div", "ai-context-head");
795
- head.appendChild(h("span", "", "\u4E0A\u4E0B\u6587"));
796
- const closeBtn = h("button", "", "\xD7");
1811
+ const head = h("div", "icen-ai-context-head");
1812
+ head.appendChild(h("span", "", t("aiPanel.context")));
1813
+ const closeBtn = h("button", "");
1814
+ closeBtn.append(createIcon("close"));
797
1815
  closeBtn.type = "button";
798
- closeBtn.setAttribute("data-ai-context-close", "");
799
- closeBtn.setAttribute("aria-label", "\u5173\u95ED");
1816
+ closeBtn.setAttribute("data-icen-ai-context-close", "");
1817
+ closeBtn.setAttribute("aria-label", t("common.close"));
800
1818
  head.appendChild(closeBtn);
801
1819
  aside.appendChild(head);
802
1820
  if (m.usage) {
803
- const { section, body } = renderSection("\u7528\u91CF");
1821
+ const { section, body } = renderSection(t("aiPanel.usage"));
804
1822
  renderAiUsage(body, m.usage, { total: m.usageTotal, cost: m.usageCost });
805
1823
  aside.appendChild(section);
806
1824
  }
807
1825
  const auditEntries = auditEntriesOf(m.audit);
808
1826
  if (auditEntries.length > 0) {
809
- const { section, body } = renderSection("\u5BA1\u8BA1");
1827
+ const { section, body } = renderSection(t("aiPanel.audit"));
810
1828
  buildAuditBody(body, auditEntries, { limit: 5, compact: true });
811
1829
  aside.appendChild(section);
812
1830
  }
813
1831
  const files = Array.isArray(m.files) ? m.files : [];
814
1832
  if (files.length > 0) {
815
- const { section, body } = renderSection(`\u6587\u4EF6 (${files.length})`);
816
- const chips = h("div", "ai-files");
1833
+ const { section, body } = renderSection(t("aiPanel.files", { p0: files.length }));
1834
+ const chips = h("div", "icen-ai-files");
817
1835
  for (const f of files) chips.appendChild(renderFileChip(f));
818
1836
  body.appendChild(chips);
819
1837
  aside.appendChild(section);
@@ -823,17 +1841,17 @@ function renderAiContext(el, model) {
823
1841
  const { section, body } = renderSection(`MCP (${servers.length})`);
824
1842
  for (const s of servers) {
825
1843
  const ok = s.status !== "disconnected";
826
- const row = h("div", `ai-item is-${ok ? "done" : "error"}`);
827
- const icon = h("span", "ai-item-icon");
828
- const svg2 = svgIcon(ICON_SERVER);
829
- if (svg2) icon.appendChild(svg2);
1844
+ const row = h("div", `icen-ai-item is-${ok ? "done" : "error"}`);
1845
+ const icon = h("span", "icen-ai-item-icon");
1846
+ const svg = svgIcon(ICON_SERVER);
1847
+ if (svg) icon.appendChild(svg);
830
1848
  row.appendChild(icon);
831
- const main = h("span", "ai-item-main");
832
- main.appendChild(h("span", "ai-item-title", s.name));
1849
+ const main = h("span", "icen-ai-item-main");
1850
+ main.appendChild(h("span", "icen-ai-item-title", s.name));
833
1851
  row.appendChild(main);
834
- const side = h("span", "ai-item-side");
835
- side.appendChild(h("span", "ai-item-status"));
836
- side.appendChild(h("span", "ai-item-meta", typeof s.tools === "number" ? `${s.tools} \u5DE5\u5177` : ""));
1852
+ const side = h("span", "icen-ai-item-side");
1853
+ side.appendChild(h("span", "icen-ai-item-status"));
1854
+ side.appendChild(h("span", "icen-ai-item-meta", typeof s.tools === "number" ? t("aiPanel.toolsCount", { p0: s.tools }) : ""));
837
1855
  row.appendChild(side);
838
1856
  body.appendChild(row);
839
1857
  }
@@ -843,14 +1861,14 @@ function renderAiContext(el, model) {
843
1861
  if (skills.length > 0) {
844
1862
  const { section, body } = renderSection("Skills");
845
1863
  for (const s of skills) {
846
- const row = h("div", "ai-item");
847
- const icon = h("span", "ai-item-icon");
848
- const svg2 = svgIcon(ICON_SPARKLES);
849
- if (svg2) icon.appendChild(svg2);
1864
+ const row = h("div", "icen-ai-item");
1865
+ const icon = h("span", "icen-ai-item-icon");
1866
+ const svg = svgIcon(ICON_SPARKLES);
1867
+ if (svg) icon.appendChild(svg);
850
1868
  row.appendChild(icon);
851
- const main = h("span", "ai-item-main");
852
- main.appendChild(h("span", "ai-item-title", s.name));
853
- if (s.description) main.appendChild(h("span", "ai-item-sub", s.description));
1869
+ const main = h("span", "icen-ai-item-main");
1870
+ main.appendChild(h("span", "icen-ai-item-title", s.name));
1871
+ if (s.description) main.appendChild(h("span", "icen-ai-item-sub", s.description));
854
1872
  row.appendChild(main);
855
1873
  body.appendChild(row);
856
1874
  }
@@ -860,7 +1878,7 @@ function renderAiContext(el, model) {
860
1878
  return el;
861
1879
  }
862
1880
  function isInline(drawer) {
863
- return drawer.classList.contains("ai-context--inline");
1881
+ return drawer.classList.contains("icen-ai-context--inline");
864
1882
  }
865
1883
  function initAiContext(root) {
866
1884
  if (typeof document === "undefined") return () => void 0;
@@ -869,23 +1887,23 @@ function initAiContext(root) {
869
1887
  if (marked.__icenAiContextInit) return () => void 0;
870
1888
  marked.__icenAiContextInit = true;
871
1889
  const target = scope;
872
- scope.querySelectorAll("[data-ai-context-open]").forEach((t) => {
873
- if (!t.hasAttribute("aria-expanded")) t.setAttribute("aria-expanded", "false");
1890
+ scope.querySelectorAll("[data-icen-ai-context-open]").forEach((t2) => {
1891
+ if (!t2.hasAttribute("aria-expanded")) t2.setAttribute("aria-expanded", "false");
874
1892
  });
875
1893
  let lastTrigger = null;
876
- const drawers = () => Array.from(scope.querySelectorAll(".ai-context")).filter((d) => !isInline(d));
1894
+ const drawers = () => Array.from(scope.querySelectorAll(".icen-ai-context")).filter((d) => !isInline(d));
877
1895
  function resolveDrawer(trigger) {
878
- const sel = trigger.getAttribute("data-ai-context-open");
1896
+ const sel = trigger.getAttribute("data-icen-ai-context-open");
879
1897
  if (sel) {
880
1898
  const found = scope.querySelector(sel);
881
- if (found && found.classList.contains("ai-context") && !isInline(found)) return found;
1899
+ if (found && found.classList.contains("icen-ai-context") && !isInline(found)) return found;
882
1900
  }
883
1901
  return drawers()[0] ?? null;
884
1902
  }
885
1903
  function syncTriggers(drawer, open) {
886
- scope.querySelectorAll("[data-ai-context-open]").forEach((t) => {
887
- if (!drawer || resolveDrawer(t) === drawer) {
888
- t.setAttribute("aria-expanded", String(open));
1904
+ scope.querySelectorAll("[data-icen-ai-context-open]").forEach((t2) => {
1905
+ if (!drawer || resolveDrawer(t2) === drawer) {
1906
+ t2.setAttribute("aria-expanded", String(open));
889
1907
  }
890
1908
  });
891
1909
  }
@@ -897,14 +1915,14 @@ function initAiContext(root) {
897
1915
  if (!drawer.hasAttribute("role")) {
898
1916
  drawer.setAttribute("role", "dialog");
899
1917
  drawer.setAttribute("aria-modal", "false");
900
- if (!drawer.hasAttribute("aria-label")) drawer.setAttribute("aria-label", "\u4E0A\u4E0B\u6587");
1918
+ if (!drawer.hasAttribute("aria-label")) drawer.setAttribute("aria-label", t("aiPanel.context"));
901
1919
  }
902
1920
  drawer.hidden = false;
903
1921
  void drawer.offsetWidth;
904
1922
  drawer.classList.add("is-open");
905
1923
  syncTriggers(drawer, true);
906
1924
  dispatch(drawer, "icen:ai-context-open", {});
907
- const closeBtn = drawer.querySelector("[data-ai-context-close]");
1925
+ const closeBtn = drawer.querySelector("[data-icen-ai-context-close]");
908
1926
  (closeBtn ?? drawer).focus?.();
909
1927
  }
910
1928
  function closeDrawer(drawer, restoreFocus) {
@@ -932,7 +1950,7 @@ function initAiContext(root) {
932
1950
  function trapFocus(drawer, ke) {
933
1951
  const focusables = Array.from(
934
1952
  drawer.querySelectorAll(
935
- 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
1953
+ 'button, [href], icen-input, icen-select, icen-textarea, [tabindex]:not([tabindex="-1"])'
936
1954
  )
937
1955
  ).filter((n) => !n.hidden && n.getAttribute("aria-hidden") !== "true");
938
1956
  if (focusables.length === 0) {
@@ -954,15 +1972,15 @@ function initAiContext(root) {
954
1972
  }
955
1973
  }
956
1974
  const onClick = (e) => {
957
- const t = e.target instanceof Element ? e.target : null;
958
- if (!t) return;
959
- const closeBtn = t.closest("[data-ai-context-close]");
1975
+ const t2 = e.target instanceof Element ? e.target : null;
1976
+ if (!t2) return;
1977
+ const closeBtn = t2.closest("[data-icen-ai-context-close]");
960
1978
  if (closeBtn) {
961
- const drawer = closeBtn.closest(".ai-context");
1979
+ const drawer = closeBtn.closest(".icen-ai-context");
962
1980
  if (drawer instanceof HTMLElement && !isInline(drawer)) closeDrawer(drawer, true);
963
1981
  return;
964
1982
  }
965
- const trigger = t.closest("[data-ai-context-open]");
1983
+ const trigger = t2.closest("[data-icen-ai-context-open]");
966
1984
  if (trigger) {
967
1985
  const drawer = resolveDrawer(trigger);
968
1986
  if (!drawer) return;
@@ -973,7 +1991,7 @@ function initAiContext(root) {
973
1991
  }
974
1992
  return;
975
1993
  }
976
- if (!t.closest(".ai-context")) {
1994
+ if (!t2.closest(".icen-ai-context")) {
977
1995
  drawers().forEach((d) => {
978
1996
  if (d.classList.contains("is-open")) closeDrawer(d, true);
979
1997
  });
@@ -993,8 +2011,8 @@ function initAiContext(root) {
993
2011
  return;
994
2012
  }
995
2013
  if (ke.key === "Enter" || ke.key === " ") {
996
- const t = ke.target instanceof Element ? ke.target : null;
997
- const trigger = t?.closest("[data-ai-context-open]");
2014
+ const t2 = ke.target instanceof Element ? ke.target : null;
2015
+ const trigger = t2?.closest("[data-icen-ai-context-open]");
998
2016
  if (!trigger || trigger.tagName === "BUTTON") return;
999
2017
  ke.preventDefault();
1000
2018
  trigger.click();
@@ -1028,8 +2046,8 @@ function buildAuditBody(body, entries, opts = {}) {
1028
2046
  let ttftN = 0;
1029
2047
  const groups = /* @__PURE__ */ new Map();
1030
2048
  for (const e of entries) {
1031
- const t = e.usage?.total ?? 0;
1032
- tokens += t;
2049
+ const t2 = e.usage?.total ?? 0;
2050
+ tokens += t2;
1033
2051
  if (typeof e.cost === "number") cost += e.cost;
1034
2052
  if (e.status === "error") errors++;
1035
2053
  if (typeof e.ttftMs === "number") {
@@ -1038,43 +2056,44 @@ function buildAuditBody(body, entries, opts = {}) {
1038
2056
  }
1039
2057
  const key = `${e.provider}/${e.model}`;
1040
2058
  const g = groups.get(key) ?? { key, tokens: 0, cost: 0, requests: 0 };
1041
- g.tokens += t;
2059
+ g.tokens += t2;
1042
2060
  if (typeof e.cost === "number") g.cost += e.cost;
1043
2061
  g.requests++;
1044
2062
  groups.set(key, g);
1045
2063
  }
1046
2064
  const totals = h("div", "ai-audit-totals");
1047
- const bits = [`${entries.length} \u6B21\u8BF7\u6C42`];
1048
- if (errors > 0) bits.push(`${errors} \u5931\u8D25`);
2065
+ const bits = [t("aiPanel.requestsCount", { p0: entries.length })];
2066
+ if (errors > 0) bits.push(t("aiPanel.errorsCount", { p0: errors }));
1049
2067
  bits.push(`${formatTokens(tokens)} tok`);
1050
2068
  if (cost > 0) bits.push(`$${(Math.round(cost * 1e6) / 1e6).toFixed(4)}`);
1051
2069
  if (ttftN > 0) bits.push(`TTFT ${formatDuration(Math.round(ttftSum / ttftN))}`);
1052
- totals.appendChild(h("span", "ai-audit-totals-text", bits.join(" \xB7 ")));
2070
+ totals.appendChild(h("span", "icen-ai-audit-totals-text", bits.join(" \xB7 ")));
1053
2071
  body.appendChild(totals);
1054
2072
  const sorted = Array.from(groups.values()).sort((a, b) => b.tokens - a.tokens);
1055
2073
  if (sorted.length > 0) {
1056
- const list2 = h("div", "ai-audit-models");
2074
+ const list2 = h("div", "icen-ai-audit-models");
1057
2075
  for (const g of sorted) {
1058
- const row = h("div", "ai-audit-model-row");
1059
- row.appendChild(h("span", "ai-audit-model-name", g.key));
1060
- row.appendChild(h("span", "ai-audit-model-meta", `${g.requests} \u6B21 \xB7 ${formatTokens(g.tokens)} tok${g.cost > 0 ? ` \xB7 $${g.cost.toFixed(4)}` : ""}`));
2076
+ const row = h("div", "icen-ai-audit-model-row");
2077
+ row.appendChild(h("span", "icen-ai-audit-model-name", g.key));
2078
+ row.appendChild(h("span", "icen-ai-audit-model-meta", t("aiPanel.callsTokens", { p0: g.requests, p1: formatTokens(g.tokens), p2: g.cost > 0 ? ` \xB7 $${g.cost.toFixed(4)}` : "" })));
1061
2079
  list2.appendChild(row);
1062
2080
  }
1063
2081
  body.appendChild(list2);
1064
2082
  }
1065
2083
  const recent = entries.slice(-limit).reverse();
1066
- const list = h("div", "ai-audit-list");
2084
+ const list = h("div", "icen-ai-audit-list");
2085
+ list.tabIndex = 0;
1067
2086
  for (const e of recent) {
1068
- const item = h("div", `ai-audit-item is-${e.status === "ok" ? "done" : "error"}`);
1069
- item.appendChild(h("span", "ai-audit-dot"));
1070
- const main = h("span", "ai-audit-item-main");
1071
- main.appendChild(h("span", "ai-audit-item-model", `${e.provider} \xB7 ${e.model}`));
2087
+ const item = h("div", `icen-ai-audit-item is-${e.status === "ok" ? "done" : "error"}`);
2088
+ item.appendChild(h("span", "icen-ai-audit-dot"));
2089
+ const main = h("span", "icen-ai-audit-item-main");
2090
+ main.appendChild(h("span", "icen-ai-audit-item-model", `${e.provider} \xB7 ${e.model}`));
1072
2091
  const metaBits = [timeOf(e.ts), formatDuration(e.durationMs)];
1073
2092
  if (typeof e.ttftMs === "number") metaBits.push(`TTFT ${formatDuration(e.ttftMs)}`);
1074
2093
  if ((e.usage?.total ?? 0) > 0) metaBits.push(`${formatTokens(e.usage?.total ?? 0)} tok`);
1075
- main.appendChild(h("span", "ai-audit-item-meta", metaBits.filter(Boolean).join(" \xB7 ")));
2094
+ main.appendChild(h("span", "icen-ai-audit-item-meta", metaBits.filter(Boolean).join(" \xB7 ")));
1076
2095
  item.appendChild(main);
1077
- if (e.error) item.appendChild(h("span", "ai-audit-item-error", e.error));
2096
+ if (e.error) item.appendChild(h("span", "icen-ai-audit-item-error", e.error));
1078
2097
  list.appendChild(item);
1079
2098
  }
1080
2099
  body.appendChild(list);
@@ -1082,16 +2101,16 @@ function buildAuditBody(body, entries, opts = {}) {
1082
2101
  function renderAiAudit(el, source, opts = {}) {
1083
2102
  if (typeof document === "undefined") return el;
1084
2103
  el.textContent = "";
1085
- const root = h("div", "ai-audit");
2104
+ const root = h("div", "icen-ai-audit");
1086
2105
  const entries = auditEntriesOf(source);
1087
2106
  if (entries.length === 0) {
1088
- root.appendChild(h("div", "ai-audit-empty", "\u6682\u65E0\u5BA1\u8BA1\u8BB0\u5F55"));
2107
+ root.appendChild(h("div", "icen-ai-audit-empty", t("aiPanel.noAudit")));
1089
2108
  el.appendChild(root);
1090
2109
  return el;
1091
2110
  }
1092
2111
  buildAuditBody(root, entries, { limit: opts.limit });
1093
2112
  if (opts.clearButton !== false) {
1094
- const clear = h("button", "btn btn-sm ai-audit-clear", "\u6E05\u9664\u5BA1\u8BA1");
2113
+ const clear = h("button", "icen-btn icen-btn-sm icen-ai-audit-clear", t("aiPanel.clearAudit"));
1095
2114
  clear.type = "button";
1096
2115
  clear.addEventListener("click", () => {
1097
2116
  if (opts.onClear) opts.onClear();