@yoka-ui/ui 1.0.10-test → 1.1.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 (385) hide show
  1. package/@Docs-yoka/exports.generated.md +68 -62
  2. package/README.md +40 -189
  3. package/dist/es/assets/image/skills.zip +0 -0
  4. package/dist/es/business/AiChat/index.d.ts +3 -3
  5. package/dist/es/business/AiChat/index.js +331 -119
  6. package/dist/es/business/AiChat/index.js.map +3 -3
  7. package/dist/es/business/AiChat/intentRecognizer.js.map +1 -1
  8. package/dist/es/business/AiChat/navigationManager.js +6 -6
  9. package/dist/es/business/AiChat/navigationManager.js.map +2 -2
  10. package/dist/es/business/AiChat/sse.d.ts +15 -0
  11. package/dist/es/business/AiChat/sse.js +118 -7
  12. package/dist/es/business/AiChat/sse.js.map +2 -2
  13. package/dist/es/business/AiChat/type.d.ts +22 -23
  14. package/dist/es/business/AiChat/useAiChat.js +105 -75
  15. package/dist/es/business/AiChat/useAiChat.js.map +3 -3
  16. package/dist/es/business/AiChat/useTaskWorkflow.d.ts +1 -2
  17. package/dist/es/business/AiChat/useTaskWorkflow.js +2 -36
  18. package/dist/es/business/AiChat/useTaskWorkflow.js.map +2 -2
  19. package/dist/es/business/DrawerPageInfo/index.js.map +1 -1
  20. package/dist/es/business/Editor/index.d.ts +1 -1
  21. package/dist/es/business/Editor/index.js.map +2 -2
  22. package/dist/es/business/Empty/index.js +1 -1
  23. package/dist/es/business/Empty/index.js.map +1 -1
  24. package/dist/es/business/ModCommonFilter/components/PopoverContent/Category.js +2 -2
  25. package/dist/es/business/ModCommonFilter/components/PopoverContent/Category.js.map +2 -2
  26. package/dist/es/business/ModCommonFilter/components/PopoverContent/Content.js +3 -3
  27. package/dist/es/business/ModCommonFilter/components/PopoverContent/Content.js.map +2 -2
  28. package/dist/es/business/ModCommonFilter/components/PopoverContent/Selected.js +2 -2
  29. package/dist/es/business/ModCommonFilter/components/PopoverContent/Selected.js.map +2 -2
  30. package/dist/es/business/ModCommonFilter/index.d.ts +1 -1
  31. package/dist/es/business/ModCommonFilter/index.js.map +2 -2
  32. package/dist/es/business/YkCharts/Area.d.ts +18 -0
  33. package/dist/es/business/YkCharts/Area.js +336 -0
  34. package/dist/es/business/YkCharts/Area.js.map +7 -0
  35. package/dist/es/business/YkCharts/Bar.d.ts +21 -0
  36. package/dist/es/business/YkCharts/Bar.js +316 -0
  37. package/dist/es/business/YkCharts/Bar.js.map +7 -0
  38. package/dist/es/business/YkCharts/BarProperty.d.ts +21 -0
  39. package/dist/es/business/YkCharts/BarProperty.js +357 -0
  40. package/dist/es/business/YkCharts/BarProperty.js.map +7 -0
  41. package/dist/es/business/YkCharts/BarTotal.d.ts +21 -0
  42. package/dist/es/business/YkCharts/BarTotal.js +292 -0
  43. package/dist/es/business/YkCharts/BarTotal.js.map +7 -0
  44. package/dist/es/business/YkCharts/Line.d.ts +21 -0
  45. package/dist/es/business/YkCharts/Line.js +342 -0
  46. package/dist/es/business/YkCharts/Line.js.map +7 -0
  47. package/dist/es/business/YkCharts/Pie.d.ts +19 -0
  48. package/dist/es/business/YkCharts/Pie.js +107 -0
  49. package/dist/es/business/YkCharts/Pie.js.map +7 -0
  50. package/dist/es/business/YkCharts/PieProperty.d.ts +18 -0
  51. package/dist/es/business/YkCharts/PieProperty.js +180 -0
  52. package/dist/es/business/YkCharts/PieProperty.js.map +7 -0
  53. package/dist/es/business/YkCharts/Pies.d.ts +26 -0
  54. package/dist/es/business/YkCharts/Pies.js +352 -0
  55. package/dist/es/business/YkCharts/Pies.js.map +7 -0
  56. package/dist/es/business/YkCharts/constants.d.ts +1 -0
  57. package/dist/es/business/YkCharts/constants.js +47 -0
  58. package/dist/es/business/YkCharts/constants.js.map +7 -0
  59. package/dist/es/business/YkCharts/hooks.d.ts +4 -0
  60. package/dist/es/business/YkCharts/hooks.js +37 -0
  61. package/dist/es/business/YkCharts/hooks.js.map +7 -0
  62. package/dist/es/business/YkCharts/index.d.ts +9 -0
  63. package/dist/es/business/YkCharts/index.js +20 -0
  64. package/dist/es/business/YkCharts/index.js.map +7 -0
  65. package/dist/es/business/YkCharts/index.module.less +164 -0
  66. package/dist/es/business/YkCharts/tooltip.less +92 -0
  67. package/dist/es/business/YkCharts/transformData.js +16 -0
  68. package/dist/es/business/YkCharts/transformData.js.map +7 -0
  69. package/dist/es/business/YkCharts/typing.d.ts +74 -0
  70. package/dist/es/business/YkCharts/typing.js +1 -0
  71. package/dist/es/business/YkCharts/typing.js.map +7 -0
  72. package/dist/es/business/YkCharts/utils.d.ts +4 -0
  73. package/dist/es/business/YkCharts/utils.js +109 -0
  74. package/dist/es/business/YkCharts/utils.js.map +7 -0
  75. package/dist/es/business/YkCharts/variables.less +13 -0
  76. package/dist/es/business/YkLoginModule/SmsLoginForm.d.ts +25 -0
  77. package/dist/es/business/YkLoginModule/SmsLoginForm.js +178 -0
  78. package/dist/es/business/YkLoginModule/SmsLoginForm.js.map +7 -0
  79. package/dist/es/business/YkLoginModule/index.d.ts +48 -0
  80. package/dist/es/business/YkLoginModule/index.js +198 -0
  81. package/dist/es/business/YkLoginModule/index.js.map +7 -0
  82. package/dist/es/business/YkLoginModule/styles.module.less +169 -0
  83. package/dist/es/business/YkPorjectSelect/index.d.ts +1 -1
  84. package/dist/es/business/YkPorjectSelect/index.js +2 -2
  85. package/dist/es/business/YkPorjectSelect/index.js.map +2 -2
  86. package/dist/es/business/YkSqlEdit/code-mirror-custom.module.less +154 -0
  87. package/dist/es/business/YkSqlEdit/index.d.ts +20 -0
  88. package/dist/es/business/YkSqlEdit/index.js +180 -0
  89. package/dist/es/business/YkSqlEdit/index.js.map +7 -0
  90. package/dist/es/business/YkSqlEdit/sql-language.d.ts +11 -0
  91. package/dist/es/business/YkSqlEdit/sql-language.js +1460 -0
  92. package/dist/es/business/YkSqlEdit/sql-language.js.map +7 -0
  93. package/dist/es/components/DebounceInput/index.js.map +2 -2
  94. package/dist/es/components/MultipleSelect/index.d.ts +14 -0
  95. package/dist/es/components/MultipleSelect/index.js +1 -1
  96. package/dist/es/components/MultipleSelect/index.js.map +2 -2
  97. package/dist/es/components/RefreshButton/index.js.map +2 -2
  98. package/dist/es/components/SearchWithHistory/index.js +1 -1
  99. package/dist/es/components/SearchWithHistory/index.js.map +2 -2
  100. package/dist/es/components/TextWithToolTip/index.d.ts +1 -1
  101. package/dist/es/components/TextWithToolTip/index.js.map +2 -2
  102. package/dist/es/components/TreeTransfer/components/TreeTransferPanel/index.d.ts +1 -24
  103. package/dist/es/components/TreeTransfer/components/TreeTransferPanel/index.js +2 -2
  104. package/dist/es/components/TreeTransfer/components/TreeTransferPanel/index.js.map +2 -2
  105. package/dist/es/components/TreeTransfer/index.d.ts +1 -24
  106. package/dist/es/components/TreeTransfer/index.js +8 -8
  107. package/dist/es/components/TreeTransfer/index.js.map +2 -2
  108. package/dist/es/components/TreeTransfer/utils/index.d.ts +1 -1
  109. package/dist/es/components/TreeTransfer/utils/index.js.map +2 -2
  110. package/dist/es/components/YKMarkdown/index.d.ts +11 -0
  111. package/dist/es/components/YKMarkdown/index.js +236 -0
  112. package/dist/es/components/YKMarkdown/index.js.map +7 -0
  113. package/dist/es/components/YKMarkdown/index.module.less +83 -0
  114. package/dist/es/components/YkDateRangePicker/YkDateRangePicker.mdx +194 -0
  115. package/dist/es/components/YkDateRangePicker/index.d.ts +9 -1
  116. package/dist/es/components/YkDateRangePicker/index.js +127 -61
  117. package/dist/es/components/YkDateRangePicker/index.js.map +2 -2
  118. package/dist/es/components/YkDateRangePicker/index.module.less +33 -9
  119. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.d.ts +1 -1
  120. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.js +3 -2
  121. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.js.map +2 -2
  122. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSRange.d.ts +1 -1
  123. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js +23 -3
  124. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js.map +2 -2
  125. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.d.ts +1 -1
  126. package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.js.map +2 -2
  127. package/dist/es/components/YkRangeDateWithVS/index.d.ts +2 -2
  128. package/dist/es/components/YkRangeDateWithVS/index.js.map +2 -2
  129. package/dist/es/components/YkRangeDateWithVS/index.module.less +22 -4
  130. package/dist/es/components/YkRangeTimeWithRecent/index.d.ts +1 -1
  131. package/dist/es/components/YkRangeTimeWithRecent/index.js.map +2 -2
  132. package/dist/es/creative/ArcCheckbox/index.d.ts +12 -0
  133. package/dist/es/creative/ArcCheckbox/index.js +49 -0
  134. package/dist/es/creative/ArcCheckbox/index.js.map +7 -0
  135. package/dist/es/creative/ArcCheckbox/index.module.less +102 -0
  136. package/dist/es/creative/ButtonRadioWithInfo/index.js.map +1 -1
  137. package/dist/es/creative/ButtonWithProgress/index.d.ts +1 -1
  138. package/dist/es/creative/ButtonWithProgress/index.js.map +2 -2
  139. package/dist/es/creative/GlassSegmentedRadio/index.d.ts +24 -0
  140. package/dist/es/creative/GlassSegmentedRadio/index.js +75 -0
  141. package/dist/es/creative/GlassSegmentedRadio/index.js.map +7 -0
  142. package/dist/es/creative/GlassSegmentedRadio/index.module.less +241 -0
  143. package/dist/es/creative/SkillsWriter/index.d.ts +3 -0
  144. package/dist/es/creative/SkillsWriter/index.js +191 -0
  145. package/dist/es/creative/SkillsWriter/index.js.map +7 -0
  146. package/dist/es/creative/SkillsWriter/index.module.less +21 -0
  147. package/dist/es/index.d.ts +32 -24
  148. package/dist/es/index.js +90 -80
  149. package/dist/es/index.js.map +2 -2
  150. package/dist/es/index.less +44 -0
  151. package/dist/es/layout/FlexGrid/index.d.ts +1 -1
  152. package/dist/es/layout/FlexGrid/index.js.map +2 -2
  153. package/dist/es/layout/YkContainer/index.js.map +1 -1
  154. package/dist/es/layout/YkDrawer/index.d.ts +1 -1
  155. package/dist/es/layout/YkDrawer/index.js.map +2 -2
  156. package/dist/es/ui/LabelSelect/demo.js +1 -1
  157. package/dist/es/ui/LabelSelect/demo.js.map +2 -2
  158. package/dist/es/ui/LabelSelect/index.d.ts +1 -1
  159. package/dist/es/ui/LabelSelect/index.js +1 -1
  160. package/dist/es/ui/LabelSelect/index.js.map +2 -2
  161. package/dist/es/ui/LogicOperator/index.d.ts +1 -1
  162. package/dist/es/ui/LogicOperator/index.js.map +2 -2
  163. package/dist/es/ui/YkButton/index.d.ts +1 -1
  164. package/dist/es/ui/YkButton/index.js.map +2 -2
  165. package/dist/es/ui/YkCard/index.d.ts +1 -1
  166. package/dist/es/ui/YkCard/index.js +1 -1
  167. package/dist/es/ui/YkCard/index.js.map +2 -2
  168. package/dist/es/ui/YkCheckbox/index.d.ts +1 -1
  169. package/dist/es/ui/YkCheckbox/index.js.map +2 -2
  170. package/dist/es/ui/YkDescriptions/index.d.ts +1 -1
  171. package/dist/es/ui/YkDescriptions/index.js.map +2 -2
  172. package/dist/es/ui/YkPagination/index.d.ts +1 -1
  173. package/dist/es/ui/YkPagination/index.js.map +2 -2
  174. package/dist/es/ui/YkRadio/index.d.ts +1 -1
  175. package/dist/es/ui/YkRadio/index.js.map +2 -2
  176. package/dist/es/ui/YkSegmented/index.d.ts +1 -1
  177. package/dist/es/ui/YkSegmented/index.js.map +2 -2
  178. package/dist/es/ui/YkSelect/index.d.ts +1 -1
  179. package/dist/es/ui/YkSelect/index.js.map +2 -2
  180. package/dist/es/ui/YkSpin/index.d.ts +1 -1
  181. package/dist/es/ui/YkSpin/index.js.map +2 -2
  182. package/dist/es/ui/YkStatistic/index.d.ts +1 -1
  183. package/dist/es/ui/YkStatistic/index.js.map +2 -2
  184. package/dist/es/ui/YkSwitch/index.d.ts +1 -1
  185. package/dist/es/ui/YkSwitch/index.js.map +2 -2
  186. package/dist/es/ui/YkTabs/index.d.ts +1 -1
  187. package/dist/es/ui/YkTabs/index.js.map +2 -2
  188. package/dist/es/ui/YkTooltip/index.d.ts +1 -1
  189. package/dist/es/ui/YkTooltip/index.js.map +2 -2
  190. package/dist/es/utils/styleUtils.js.map +2 -2
  191. package/dist/es/utils/ykStorybookDoc.d.ts +15 -0
  192. package/dist/es/utils/ykStorybookDoc.js +24 -2
  193. package/dist/es/utils/ykStorybookDoc.js.map +2 -2
  194. package/dist/lib/assets/image/skills.zip +0 -0
  195. package/dist/lib/business/AiChat/index.d.ts +3 -3
  196. package/dist/lib/business/AiChat/index.js +320 -111
  197. package/dist/lib/business/AiChat/index.js.map +3 -3
  198. package/dist/lib/business/AiChat/intentRecognizer.js.map +1 -1
  199. package/dist/lib/business/AiChat/navigationManager.js +6 -6
  200. package/dist/lib/business/AiChat/navigationManager.js.map +2 -2
  201. package/dist/lib/business/AiChat/sse.d.ts +15 -0
  202. package/dist/lib/business/AiChat/sse.js +117 -7
  203. package/dist/lib/business/AiChat/sse.js.map +2 -2
  204. package/dist/lib/business/AiChat/type.d.ts +22 -23
  205. package/dist/lib/business/AiChat/type.js.map +1 -1
  206. package/dist/lib/business/AiChat/useAiChat.js +104 -74
  207. package/dist/lib/business/AiChat/useAiChat.js.map +3 -3
  208. package/dist/lib/business/AiChat/useTaskWorkflow.d.ts +1 -2
  209. package/dist/lib/business/AiChat/useTaskWorkflow.js +0 -34
  210. package/dist/lib/business/AiChat/useTaskWorkflow.js.map +2 -2
  211. package/dist/lib/business/DrawerPageInfo/index.js.map +1 -1
  212. package/dist/lib/business/Editor/index.d.ts +1 -1
  213. package/dist/lib/business/Editor/index.js.map +2 -2
  214. package/dist/lib/business/Empty/index.js +1 -1
  215. package/dist/lib/business/Empty/index.js.map +1 -1
  216. package/dist/lib/business/ModCommonFilter/components/PopoverContent/Category.js +3 -3
  217. package/dist/lib/business/ModCommonFilter/components/PopoverContent/Category.js.map +2 -2
  218. package/dist/lib/business/ModCommonFilter/components/PopoverContent/Content.js +4 -4
  219. package/dist/lib/business/ModCommonFilter/components/PopoverContent/Content.js.map +2 -2
  220. package/dist/lib/business/ModCommonFilter/components/PopoverContent/Selected.js +3 -3
  221. package/dist/lib/business/ModCommonFilter/components/PopoverContent/Selected.js.map +2 -2
  222. package/dist/lib/business/ModCommonFilter/index.d.ts +1 -1
  223. package/dist/lib/business/ModCommonFilter/index.js.map +2 -2
  224. package/dist/lib/business/YkCharts/Area.d.ts +18 -0
  225. package/dist/lib/business/YkCharts/Area.js +346 -0
  226. package/dist/lib/business/YkCharts/Area.js.map +7 -0
  227. package/dist/lib/business/YkCharts/Bar.d.ts +21 -0
  228. package/dist/lib/business/YkCharts/Bar.js +323 -0
  229. package/dist/lib/business/YkCharts/Bar.js.map +7 -0
  230. package/dist/lib/business/YkCharts/BarProperty.d.ts +21 -0
  231. package/dist/lib/business/YkCharts/BarProperty.js +370 -0
  232. package/dist/lib/business/YkCharts/BarProperty.js.map +7 -0
  233. package/dist/lib/business/YkCharts/BarTotal.d.ts +21 -0
  234. package/dist/lib/business/YkCharts/BarTotal.js +298 -0
  235. package/dist/lib/business/YkCharts/BarTotal.js.map +7 -0
  236. package/dist/lib/business/YkCharts/Line.d.ts +21 -0
  237. package/dist/lib/business/YkCharts/Line.js +349 -0
  238. package/dist/lib/business/YkCharts/Line.js.map +7 -0
  239. package/dist/lib/business/YkCharts/Pie.d.ts +19 -0
  240. package/dist/lib/business/YkCharts/Pie.js +117 -0
  241. package/dist/lib/business/YkCharts/Pie.js.map +7 -0
  242. package/dist/lib/business/YkCharts/PieProperty.d.ts +18 -0
  243. package/dist/lib/business/YkCharts/PieProperty.js +193 -0
  244. package/dist/lib/business/YkCharts/PieProperty.js.map +7 -0
  245. package/dist/lib/business/YkCharts/Pies.d.ts +26 -0
  246. package/dist/lib/business/YkCharts/Pies.js +341 -0
  247. package/dist/lib/business/YkCharts/Pies.js.map +7 -0
  248. package/dist/lib/business/YkCharts/constants.d.ts +1 -0
  249. package/dist/lib/business/YkCharts/constants.js +71 -0
  250. package/dist/lib/business/YkCharts/constants.js.map +7 -0
  251. package/dist/lib/business/YkCharts/hooks.d.ts +4 -0
  252. package/dist/lib/business/YkCharts/hooks.js +62 -0
  253. package/dist/lib/business/YkCharts/hooks.js.map +7 -0
  254. package/dist/lib/business/YkCharts/index.d.ts +9 -0
  255. package/dist/lib/business/YkCharts/index.js +61 -0
  256. package/dist/lib/business/YkCharts/index.js.map +7 -0
  257. package/dist/lib/business/YkCharts/index.module.less +164 -0
  258. package/dist/lib/business/YkCharts/tooltip.less +92 -0
  259. package/dist/lib/business/YkCharts/transformData.js +40 -0
  260. package/dist/lib/business/YkCharts/transformData.js.map +7 -0
  261. package/dist/lib/business/YkCharts/typing.d.ts +74 -0
  262. package/dist/lib/business/YkCharts/typing.js +18 -0
  263. package/dist/lib/business/YkCharts/typing.js.map +7 -0
  264. package/dist/lib/business/YkCharts/utils.d.ts +4 -0
  265. package/dist/lib/business/YkCharts/utils.js +143 -0
  266. package/dist/lib/business/YkCharts/utils.js.map +7 -0
  267. package/dist/lib/business/YkCharts/variables.less +13 -0
  268. package/dist/lib/business/YkLoginModule/SmsLoginForm.d.ts +25 -0
  269. package/dist/lib/business/YkLoginModule/SmsLoginForm.js +171 -0
  270. package/dist/lib/business/YkLoginModule/SmsLoginForm.js.map +7 -0
  271. package/dist/lib/business/YkLoginModule/index.d.ts +48 -0
  272. package/dist/lib/business/YkLoginModule/index.js +206 -0
  273. package/dist/lib/business/YkLoginModule/index.js.map +7 -0
  274. package/dist/lib/business/YkLoginModule/styles.module.less +169 -0
  275. package/dist/lib/business/YkPorjectSelect/index.d.ts +1 -1
  276. package/dist/lib/business/YkPorjectSelect/index.js +3 -3
  277. package/dist/lib/business/YkPorjectSelect/index.js.map +2 -2
  278. package/dist/lib/business/YkSqlEdit/code-mirror-custom.module.less +154 -0
  279. package/dist/lib/business/YkSqlEdit/index.d.ts +20 -0
  280. package/dist/lib/business/YkSqlEdit/index.js +202 -0
  281. package/dist/lib/business/YkSqlEdit/index.js.map +7 -0
  282. package/dist/lib/business/YkSqlEdit/sql-language.d.ts +11 -0
  283. package/dist/lib/business/YkSqlEdit/sql-language.js +1493 -0
  284. package/dist/lib/business/YkSqlEdit/sql-language.js.map +7 -0
  285. package/dist/lib/components/DebounceInput/index.js.map +2 -2
  286. package/dist/lib/components/MultipleSelect/index.d.ts +14 -0
  287. package/dist/lib/components/MultipleSelect/index.js +1 -1
  288. package/dist/lib/components/MultipleSelect/index.js.map +2 -2
  289. package/dist/lib/components/RefreshButton/index.js.map +2 -2
  290. package/dist/lib/components/SearchWithHistory/index.js +1 -1
  291. package/dist/lib/components/SearchWithHistory/index.js.map +2 -2
  292. package/dist/lib/components/TextWithToolTip/index.d.ts +1 -1
  293. package/dist/lib/components/TextWithToolTip/index.js.map +2 -2
  294. package/dist/lib/components/TreeTransfer/components/TreeTransferPanel/index.d.ts +1 -24
  295. package/dist/lib/components/TreeTransfer/components/TreeTransferPanel/index.js +2 -2
  296. package/dist/lib/components/TreeTransfer/components/TreeTransferPanel/index.js.map +2 -2
  297. package/dist/lib/components/TreeTransfer/index.d.ts +1 -24
  298. package/dist/lib/components/TreeTransfer/index.js +3 -3
  299. package/dist/lib/components/TreeTransfer/index.js.map +2 -2
  300. package/dist/lib/components/TreeTransfer/utils/index.d.ts +1 -1
  301. package/dist/lib/components/TreeTransfer/utils/index.js.map +2 -2
  302. package/dist/lib/components/YKMarkdown/index.d.ts +11 -0
  303. package/dist/lib/components/YKMarkdown/index.js +188 -0
  304. package/dist/lib/components/YKMarkdown/index.js.map +7 -0
  305. package/dist/lib/components/YKMarkdown/index.module.less +83 -0
  306. package/dist/lib/components/YkDateRangePicker/YkDateRangePicker.mdx +194 -0
  307. package/dist/lib/components/YkDateRangePicker/index.d.ts +9 -1
  308. package/dist/lib/components/YkDateRangePicker/index.js +127 -61
  309. package/dist/lib/components/YkDateRangePicker/index.js.map +2 -2
  310. package/dist/lib/components/YkDateRangePicker/index.module.less +33 -9
  311. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.d.ts +1 -1
  312. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.js +3 -2
  313. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.js.map +2 -2
  314. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSRange.d.ts +1 -1
  315. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js +22 -2
  316. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js.map +2 -2
  317. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.d.ts +1 -1
  318. package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.js.map +2 -2
  319. package/dist/lib/components/YkRangeDateWithVS/index.d.ts +2 -2
  320. package/dist/lib/components/YkRangeDateWithVS/index.js.map +2 -2
  321. package/dist/lib/components/YkRangeDateWithVS/index.module.less +22 -4
  322. package/dist/lib/components/YkRangeTimeWithRecent/index.d.ts +1 -1
  323. package/dist/lib/components/YkRangeTimeWithRecent/index.js.map +2 -2
  324. package/dist/lib/creative/ArcCheckbox/index.d.ts +12 -0
  325. package/dist/lib/creative/ArcCheckbox/index.js +50 -0
  326. package/dist/lib/creative/ArcCheckbox/index.js.map +7 -0
  327. package/dist/lib/creative/ArcCheckbox/index.module.less +102 -0
  328. package/dist/lib/creative/ButtonRadioWithInfo/index.js.map +1 -1
  329. package/dist/lib/creative/ButtonWithProgress/index.d.ts +1 -1
  330. package/dist/lib/creative/ButtonWithProgress/index.js.map +2 -2
  331. package/dist/lib/creative/GlassSegmentedRadio/index.d.ts +24 -0
  332. package/dist/lib/creative/GlassSegmentedRadio/index.js +78 -0
  333. package/dist/lib/creative/GlassSegmentedRadio/index.js.map +7 -0
  334. package/dist/lib/creative/GlassSegmentedRadio/index.module.less +241 -0
  335. package/dist/lib/creative/SkillsWriter/index.d.ts +3 -0
  336. package/dist/lib/creative/SkillsWriter/index.js +200 -0
  337. package/dist/lib/creative/SkillsWriter/index.js.map +7 -0
  338. package/dist/lib/creative/SkillsWriter/index.module.less +21 -0
  339. package/dist/lib/index.d.ts +32 -24
  340. package/dist/lib/index.js +39 -24
  341. package/dist/lib/index.js.map +2 -2
  342. package/dist/lib/index.less +44 -0
  343. package/dist/lib/layout/FlexGrid/index.d.ts +1 -1
  344. package/dist/lib/layout/FlexGrid/index.js.map +2 -2
  345. package/dist/lib/layout/YkContainer/index.js.map +1 -1
  346. package/dist/lib/layout/YkDrawer/index.d.ts +1 -1
  347. package/dist/lib/layout/YkDrawer/index.js.map +2 -2
  348. package/dist/lib/ui/LabelSelect/demo.js +1 -1
  349. package/dist/lib/ui/LabelSelect/demo.js.map +2 -2
  350. package/dist/lib/ui/LabelSelect/index.d.ts +1 -1
  351. package/dist/lib/ui/LabelSelect/index.js +1 -1
  352. package/dist/lib/ui/LabelSelect/index.js.map +2 -2
  353. package/dist/lib/ui/LogicOperator/index.d.ts +1 -1
  354. package/dist/lib/ui/LogicOperator/index.js.map +2 -2
  355. package/dist/lib/ui/YkButton/index.d.ts +1 -1
  356. package/dist/lib/ui/YkButton/index.js.map +2 -2
  357. package/dist/lib/ui/YkCard/index.d.ts +1 -1
  358. package/dist/lib/ui/YkCard/index.js.map +2 -2
  359. package/dist/lib/ui/YkCheckbox/index.d.ts +1 -1
  360. package/dist/lib/ui/YkCheckbox/index.js.map +2 -2
  361. package/dist/lib/ui/YkDescriptions/index.d.ts +1 -1
  362. package/dist/lib/ui/YkDescriptions/index.js.map +2 -2
  363. package/dist/lib/ui/YkPagination/index.d.ts +1 -1
  364. package/dist/lib/ui/YkPagination/index.js.map +2 -2
  365. package/dist/lib/ui/YkRadio/index.d.ts +1 -1
  366. package/dist/lib/ui/YkRadio/index.js.map +2 -2
  367. package/dist/lib/ui/YkSegmented/index.d.ts +1 -1
  368. package/dist/lib/ui/YkSegmented/index.js.map +2 -2
  369. package/dist/lib/ui/YkSelect/index.d.ts +1 -1
  370. package/dist/lib/ui/YkSelect/index.js.map +2 -2
  371. package/dist/lib/ui/YkSpin/index.d.ts +1 -1
  372. package/dist/lib/ui/YkSpin/index.js.map +2 -2
  373. package/dist/lib/ui/YkStatistic/index.d.ts +1 -1
  374. package/dist/lib/ui/YkStatistic/index.js.map +2 -2
  375. package/dist/lib/ui/YkSwitch/index.d.ts +1 -1
  376. package/dist/lib/ui/YkSwitch/index.js.map +2 -2
  377. package/dist/lib/ui/YkTabs/index.d.ts +1 -1
  378. package/dist/lib/ui/YkTabs/index.js.map +2 -2
  379. package/dist/lib/ui/YkTooltip/index.d.ts +1 -1
  380. package/dist/lib/ui/YkTooltip/index.js.map +2 -2
  381. package/dist/lib/utils/styleUtils.js.map +2 -2
  382. package/dist/lib/utils/ykStorybookDoc.d.ts +15 -0
  383. package/dist/lib/utils/ykStorybookDoc.js +23 -1
  384. package/dist/lib/utils/ykStorybookDoc.js.map +2 -2
  385. package/package.json +152 -144
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/business/AiChat/index.tsx"],
4
- "sourcesContent": ["import {\n ClearOutlined,\n CopyOutlined,\n DeleteOutlined,\n ExportOutlined,\n MenuOutlined,\n MessageOutlined,\n MinusSquareOutlined,\n PlusOutlined,\n ReloadOutlined,\n SendOutlined,\n StopOutlined,\n SwitcherOutlined,\n} from '@ant-design/icons';\nimport { Button, Input, List, message, Popconfirm, Space, Tooltip, Typography } from 'antd';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport type { CSSProperties, FC, ReactNode } from 'react';\nimport MarkdownRender from './MarkdownRender';\nimport type { AiChatConfig, ChatSession, EnhancedAiChatConfig, Message } from './type';\nimport { useAiChat } from './useAiChat';\nimport { useTaskWorkflow } from './useTaskWorkflow';\nimport { recognizeIntent, generateSuggestions, isTaskCreationIntent } from './intentRecognizer';\n\nconst { TextArea } = Input;\nconst { Title } = Typography;\n\n// 合并Props类型\nexport interface AiChatProps extends AiChatConfig, Partial<EnhancedAiChatConfig> {\n className?: string;\n style?: CSSProperties;\n renderTrigger?: ReactNode;\n renderHeader?: ReactNode;\n renderFooter?: ReactNode;\n}\n\nconst AiChat: FC<AiChatProps> = ({\n apiPath = '/api/ai/chat-stream',\n storageKey = 'ai_chat_sessions',\n position = { bottom: 24, right: 24 },\n buttonSize = 56,\n zIndex = 1080,\n showSessionPanel = true,\n showExport = true,\n onBeforeSend,\n onError,\n onSuccess,\n className,\n style,\n renderTrigger,\n renderHeader,\n renderFooter,\n // 增强配置\n taskWorkflow,\n intentRecognition: intentConfig,\n navigation: navConfig,\n}) => {\n const {\n sessions,\n activeSession,\n loading,\n visible,\n createNewSession,\n switchSession,\n deleteSession,\n sendQuestion,\n regenerateAnswer,\n deleteSingleMsg,\n clearCurrentSession,\n exportCurrentSession,\n cancelRequest,\n toggleVisible,\n } = useAiChat({ apiPath, storageKey, onBeforeSend, onError, onSuccess });\n\n // 任务工作流\n const {\n tasks,\n createTask,\n updateTaskStatus,\n deleteTask,\n exportTasks,\n createTaskFromNaturalLanguage,\n updateUrlWithTaskId,\n refreshCurrentPage,\n executeTaskCreationWorkflow,\n } = useTaskWorkflow({\n enabled: taskWorkflow?.enabled,\n createTaskApi: taskWorkflow?.createTaskApi,\n supportedTaskTypes: taskWorkflow?.supportedTaskTypes,\n autoNavigate: taskWorkflow?.autoNavigate,\n refreshDelay: navConfig?.refreshDelay,\n taskIdParamName: taskWorkflow?.taskIdParamName,\n taskTypeParamName: taskWorkflow?.taskTypeParamName,\n onTaskCreated: (taskId, taskData) => {\n // 添加系统消息到会话\n if (activeSession) {\n const systemMsg: Message = {\n id: `${Date.now()}_sys`,\n role: 'system',\n content: `任务创建成功,ID: ${taskId}`,\n taskId,\n };\n // 这里可以添加到消息列表的逻辑\n }\n },\n onError,\n });\n\n const [inputValue, setInputValue] = useState('');\n const [showSessions, setShowSessions] = useState(false);\n const [suggestions, setSuggestions] = useState<string[]>([]);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [activeSession?.messages]);\n\n // 实时分析输入内容生成建议\n const handleInputChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const value = e.target.value;\n setInputValue(value);\n\n if (value.length > 3) {\n const intent = recognizeIntent(value);\n const newSuggestions = generateSuggestions(value, intent);\n setSuggestions(newSuggestions);\n } else {\n setSuggestions([]);\n }\n }, []);\n\n // 判断是否为任务创建意图并执行工作流\n const handleSend = useCallback(async () => {\n if (!inputValue.trim()) {\n message.warning('请输入问题');\n return;\n }\n\n const content = inputValue.trim();\n setInputValue('');\n setSuggestions([]);\n\n // 检查是否为任务创建意图\n const intentEnabled = intentConfig?.enabled !== false;\n if (intentEnabled && isTaskCreationIntent(content)) {\n // 执行任务创建工作流\n await executeTaskCreationWorkflow(content);\n return;\n }\n\n // 普通问答\n sendQuestion(content);\n }, [inputValue, intentConfig?.enabled, executeTaskCreationWorkflow, sendQuestion]);\n\n const copyMsg = (c: string) => {\n navigator.clipboard.writeText(c);\n message.success('复制成功');\n };\n\n const renderMsg = (item: Message) => (\n <List.Item\n key={item.id}\n style={{\n justifyContent: item.role === 'user' ? 'flex-end' : 'flex-start',\n marginBottom: 12,\n padding: '4px 0',\n }}\n >\n <div\n style={{\n maxWidth: '85%',\n padding: '10px 14px',\n borderRadius: 12,\n backgroundColor: item.role === 'user' ? '#1677ff' : item.role === 'system' ? '#f6ffed' : '#fafafa',\n color: item.role === 'user' ? '#fff' : '#333',\n border: item.role === 'ai' ? '1px solid #f0f0f0' : item.role === 'system' ? '1px solid #b7eb8f' : 'none',\n boxShadow:\n item.role === 'user'\n ? '0 2px 8px rgba(22, 119, 255, 0.3)'\n : item.role === 'system'\n ? '0 1px 4px rgba(82, 196, 26, 0.1)'\n : '0 1px 4px rgba(0,0,0,0.05)',\n }}\n >\n {item.role === 'user' ? (\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: 8 }}>\n <span>{item.content}</span>\n <CopyOutlined\n onClick={() => copyMsg(item.content)}\n style={{\n fontSize: 12,\n color: 'rgba(255,255,255,0.7)',\n cursor: 'pointer',\n flexShrink: 0,\n }}\n />\n </div>\n ) : item.role === 'system' ? (\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, fontSize: 13 }}>\n <span style={{ color: '#52c41a' }}>✓</span>\n <span>{item.content}</span>\n {item.taskId && (\n <Button\n type='link'\n size='small'\n style={{ padding: 0, fontSize: 12 }}\n onClick={() => updateUrlWithTaskId(item.taskId!)}\n >\n 查看任务\n </Button>\n )}\n </div>\n ) : (\n <>\n <div style={{ minHeight: 20 }}>\n <MarkdownRender content={item.content} msgId={item.id} isAi={true} onDelete={deleteSingleMsg} />\n </div>\n {item.loading && <span style={{ color: '#1677ff', fontSize: 12 }}> 思考中...</span>}\n {!item.loading && (\n <Space size={8} style={{ fontSize: 12, marginTop: 6, display: 'flex' }}>\n <Tooltip title='复制'>\n <CopyOutlined onClick={() => copyMsg(item.content)} style={{ cursor: 'pointer', color: '#999' }} />\n </Tooltip>\n <Tooltip title='重新生成'>\n <ReloadOutlined onClick={() => regenerateAnswer(item)} style={{ cursor: 'pointer', color: '#999' }} />\n </Tooltip>\n </Space>\n )}\n </>\n )}\n </div>\n </List.Item>\n );\n\n const renderSession = (s: ChatSession) => (\n <List.Item\n key={s.id}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest('.ant-popover, .ant-popconfirm')) {\n return;\n }\n switchSession(s.id);\n setShowSessions(false);\n }}\n style={{\n padding: '10px 12px',\n borderRadius: 8,\n cursor: 'pointer',\n backgroundColor: activeSession?.id === s.id ? '#e6f7ff' : '#fff',\n transition: 'all 0.2s',\n }}\n >\n <div\n style={{\n flex: 1,\n overflow: 'hidden',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <div style={{ flex: 1, overflow: 'hidden' }}>\n <div\n style={{\n fontSize: 14,\n fontWeight: 500,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {s.title}\n </div>\n <div style={{ fontSize: 12, color: '#999', marginTop: 2 }}>\n {new Date(s.createTime).toLocaleString().slice(0, 16)}\n </div>\n </div>\n <Popconfirm\n title='确定删除?'\n onConfirm={(e: any) => {\n deleteSession(s.id, e as React.MouseEvent);\n }}\n >\n <DeleteOutlined\n style={{ color: '#ff4d4f', cursor: 'pointer', marginLeft: 8 }}\n onClick={(e) => e.stopPropagation()}\n />\n </Popconfirm>\n </div>\n </List.Item>\n );\n\n return (\n <div\n className={className}\n style={{\n position: 'fixed',\n bottom: position.bottom,\n right: position.right,\n zIndex,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n ...style,\n }}\n >\n {!visible ? (\n renderTrigger ? (\n <div onClick={() => toggleVisible(true)} style={{ cursor: 'pointer' }}>\n {renderTrigger}\n </div>\n ) : (\n <Button\n type='primary'\n shape='circle'\n size='large'\n icon={<MessageOutlined />}\n onClick={() => toggleVisible(true)}\n style={{\n width: buttonSize,\n height: buttonSize,\n boxShadow: '0 4px 16px rgba(22, 119, 255, 0.4)',\n }}\n />\n )\n ) : (\n <div\n style={{\n width: showSessions ? 960 : 720,\n height: 680,\n background: '#fff',\n borderRadius: 12,\n boxShadow: '0 4px 20px rgba(0,0,0,0.15)',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'row',\n marginBottom: 12,\n transition: 'width 0.2s ease',\n position: 'relative',\n }}\n >\n {/* 关闭按钮 - 弹窗内部右上角 */}\n <Button\n type='text'\n icon={<SwitcherOutlined />}\n onClick={() => toggleVisible(false)}\n style={{\n position: 'absolute',\n top: -5,\n right: -5,\n zIndex: zIndex + 1,\n fontSize: 14,\n color: '#999',\n }}\n />\n\n <div\n style={{\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n minWidth: 0,\n }}\n >\n {renderHeader || (\n <div\n style={{\n padding: '12px 16px',\n background: '#fafafa',\n borderBottom: '1px solid #f0f0f0',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n flexShrink: 0,\n }}\n >\n <Space>\n <Button type='text' icon={<PlusOutlined />} onClick={createNewSession} style={{ fontWeight: 500 }}>\n 新会话\n </Button>\n <Button type='text' icon={<ClearOutlined />} onClick={clearCurrentSession}>\n 清空\n </Button>\n </Space>\n <Space>\n {showExport && (\n <>\n <Button type='text' icon={<ExportOutlined />} onClick={exportCurrentSession}>\n 导出\n </Button>\n {taskWorkflow?.enabled && (\n <Button type='text' icon={<ExportOutlined />} onClick={() => exportTasks('json')}>\n 导出任务\n </Button>\n )}\n </>\n )}\n {showSessionPanel && (\n <Button\n type={showSessions ? 'primary' : 'text'}\n icon={<MenuOutlined />}\n onClick={() => setShowSessions(!showSessions)}\n >\n {showSessions ? '收起会话' : '会话'}\n </Button>\n )}\n </Space>\n </div>\n )}\n\n <div\n style={{\n flex: 1,\n padding: 16,\n overflowY: 'auto',\n }}\n >\n {!activeSession || activeSession.messages.length === 0 ? (\n <div\n style={{\n textAlign: 'center',\n padding: '60px 0',\n color: '#999',\n }}\n >\n <MessageOutlined style={{ fontSize: 48, color: '#d9d9d9' }} />\n <div style={{ marginTop: 16 }}>开始你的 AI 对话</div>\n <div style={{ marginTop: 8, fontSize: 13, color: '#bfbfbf' }}>我可以帮你解答问题、创建任务</div>\n <Button type='primary' onClick={createNewSession} style={{ marginTop: 20 }}>\n 新建会话\n </Button>\n </div>\n ) : (\n <List dataSource={activeSession.messages} renderItem={renderMsg} />\n )}\n <div ref={messagesEndRef} />\n </div>\n\n {renderFooter || (\n <div\n style={{\n padding: 12,\n borderTop: '1px solid #f0f0f0',\n background: '#fafafa',\n flexShrink: 0,\n }}\n >\n {/* 智能建议 */}\n {suggestions.length > 0 && (\n <div\n style={{\n marginBottom: 8,\n display: 'flex',\n flexWrap: 'wrap',\n gap: 4,\n }}\n >\n {suggestions.slice(0, 3).map((suggestion, index) => (\n <Button\n key={index}\n size='small'\n type='dashed'\n onClick={() => setInputValue(suggestion)}\n style={{ fontSize: 12 }}\n >\n {suggestion}\n </Button>\n ))}\n </div>\n )}\n <TextArea\n value={inputValue}\n onChange={handleInputChange}\n placeholder='输入问题或任务描述,如:帮我创建一个paimon调用任务'\n autoSize={{ minRows: 2, maxRows: 4 }}\n onPressEnter={(e) => {\n if (!e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n }}\n style={{ marginBottom: 8, borderRadius: 8 }}\n disabled={loading}\n />\n <div style={{ display: 'flex', justifyContent: 'flex-end' }}>\n <Space>\n {loading && (\n <Button danger icon={<StopOutlined />} onClick={cancelRequest} size='small'>\n 取消\n </Button>\n )}\n <Button\n type='primary'\n icon={<SendOutlined />}\n onClick={handleSend}\n loading={loading}\n disabled={!inputValue.trim()}\n size='small'\n >\n 发送\n </Button>\n </Space>\n </div>\n </div>\n )}\n\n {showSessionPanel && showSessions && (\n <div\n style={{\n width: 240,\n borderLeft: '1px solid #f0f0f0',\n padding: 16,\n background: '#fafafa',\n overflowY: 'auto',\n flexShrink: 0,\n }}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 16,\n }}\n >\n <Title level={5} style={{ margin: 0 }}>\n 我的会话\n </Title>\n <Button\n type='link'\n size='small'\n onClick={() => {\n setShowSessions(false);\n }}\n style={{ padding: 0 }}\n >\n 收起\n </Button>\n </div>\n <List\n dataSource={sessions}\n renderItem={renderSession}\n locale={{ emptyText: '暂无会话' }}\n style={{ marginBottom: 16 }}\n />\n <Button type='primary' block icon={<PlusOutlined />} onClick={createNewSession}>\n 新建会话\n </Button>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default AiChat;\nexport { useAiChat } from './useAiChat';\nexport { useTaskWorkflow } from './useTaskWorkflow';\nexport { recognizeIntent, generateSuggestions, isTaskCreationIntent, parseTaskDescription } from './intentRecognizer';\nexport { NavigationManager, delay } from './navigationManager';\nexport type {\n AiChatConfig,\n ChatSession,\n Message,\n UseAiChatOptions,\n UseAiChatReturn,\n Intent,\n IntentType,\n Task,\n TaskCategory,\n TaskPriority,\n TaskStatus,\n TaskCreationResult,\n NavigationOptions,\n EnhancedAiChatConfig,\n} from './type';\n"],
5
- "mappings": "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",
6
- "names": ["useAiChat", "useTaskWorkflow", "recognizeIntent", "generateSuggestions", "isTaskCreationIntent"]
4
+ "sourcesContent": ["import {\n CloseOutlined,\n CompressOutlined,\n CopyOutlined,\n DeleteOutlined,\n ExpandOutlined,\n FileImageOutlined,\n MenuOutlined,\n MessageOutlined,\n PaperClipOutlined,\n PlusOutlined,\n ReloadOutlined,\n SendOutlined,\n StopOutlined,\n} from '@ant-design/icons';\nimport type { UploadFile } from 'antd';\nimport { Button, Input, List, message, Popconfirm, Space, Tooltip, Typography, Upload } from 'antd';\nimport type { CSSProperties, FC, ReactNode } from 'react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { generateSuggestions, isTaskCreationIntent, recognizeIntent } from './intentRecognizer';\nimport MarkdownRender from './MarkdownRender';\nimport type { AiChatConfig, ChatSession, EnhancedAiChatConfig, Message } from './type';\nimport { useAiChat } from './useAiChat';\nimport { useTaskWorkflow } from './useTaskWorkflow';\n\nconst { TextArea } = Input;\nconst { Title } = Typography;\n\n// 合并Props类型\nexport interface AiChatProps extends AiChatConfig, Partial<EnhancedAiChatConfig> {\n className?: string;\n style?: CSSProperties;\n renderTrigger?: ReactNode;\n renderHeader?: ReactNode;\n renderFooter?: ReactNode;\n}\n\nconst AiChat: FC<AiChatProps> = ({\n apiPath = '/api/ai/chat-stream',\n storageKey = 'ai_chat_sessions',\n position: initialPosition = { bottom: 24, right: 24 },\n buttonSize = 56,\n zIndex = 1080,\n showSessionPanel = true,\n onBeforeSend,\n onError,\n onSuccess,\n onFetchSessions,\n onFetchSessionDetail,\n onCreateSession,\n onSendMessage,\n onUploadFile,\n className,\n style,\n renderTrigger,\n renderHeader,\n renderFooter,\n // 增强配置\n taskWorkflow,\n intentRecognition: intentConfig,\n navigation: navConfig,\n}) => {\n const {\n sessions,\n activeSession,\n loading,\n visible,\n createNewSession,\n switchSession,\n deleteSession,\n sendQuestion,\n regenerateAnswer,\n deleteSingleMsg,\n cancelRequest,\n toggleVisible,\n } = useAiChat({\n apiPath,\n storageKey,\n onBeforeSend,\n onError,\n onSuccess,\n onFetchSessions,\n onFetchSessionDetail,\n onCreateSession,\n onSendMessage,\n onUploadFile,\n });\n\n // 任务工作流\n const {\n tasks,\n createTask,\n updateTaskStatus,\n deleteTask,\n createTaskFromNaturalLanguage,\n updateUrlWithTaskId,\n refreshCurrentPage,\n executeTaskCreationWorkflow,\n } = useTaskWorkflow({\n enabled: taskWorkflow?.enabled,\n createTaskApi: taskWorkflow?.createTaskApi,\n supportedTaskTypes: taskWorkflow?.supportedTaskTypes,\n autoNavigate: taskWorkflow?.autoNavigate,\n refreshDelay: navConfig?.refreshDelay,\n taskIdParamName: taskWorkflow?.taskIdParamName,\n taskTypeParamName: taskWorkflow?.taskTypeParamName,\n onTaskCreated: (taskId, taskData) => {\n // 添加系统消息到会话\n if (activeSession) {\n const systemMsg: Message = {\n id: `${Date.now()}_sys`,\n role: 'system',\n content: `任务创建成功,ID: ${taskId}`,\n taskId,\n };\n // 这里可以添加到消息列表的逻辑\n }\n },\n onError,\n });\n\n const [inputValue, setInputValue] = useState('');\n const [showSessions, setShowSessions] = useState(false);\n const [suggestions, setSuggestions] = useState<string[]>([]);\n const [fileList, setFileList] = useState<UploadFile<any>[]>([]);\n const [isMaximized, setIsMaximized] = useState(false);\n const [dialogPosition, setDialogPosition] = useState({ x: 0, y: 0 });\n const [isDragging, setIsDragging] = useState(false);\n const dragOffset = useRef({ x: 0, y: 0 });\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [activeSession?.messages]);\n\n // 拖拽处理 - 拖拽整个组件位置\n const handleTriggerMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (visible) return; // 对话框展开时不处理\n const target = e.target as HTMLElement;\n if (target.closest('.ant-upload, .ant-btn')) return; // 排除按钮和上传元素\n\n e.preventDefault();\n const triggerEl = triggerRef.current;\n if (!triggerEl) return;\n\n const rect = triggerEl.getBoundingClientRect();\n dragOffset.current = {\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n };\n setIsDragging(true);\n },\n [visible],\n );\n\n const handleTriggerMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!isDragging || visible) return;\n setDialogPosition({\n x: e.clientX - dragOffset.current.x,\n y: e.clientY - dragOffset.current.y,\n });\n },\n [isDragging, visible],\n );\n\n const handleTriggerMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n useEffect(() => {\n if (isDragging && !visible) {\n document.addEventListener('mousemove', handleTriggerMouseMove);\n document.addEventListener('mouseup', handleTriggerMouseUp);\n return () => {\n document.removeEventListener('mousemove', handleTriggerMouseMove);\n document.removeEventListener('mouseup', handleTriggerMouseUp);\n };\n }\n return undefined;\n }, [isDragging, visible, handleTriggerMouseMove, handleTriggerMouseUp]);\n\n // 实时分析输入内容生成建议\n const handleInputChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const value = e.target.value;\n setInputValue(value);\n\n if (value.length > 3) {\n const intent = recognizeIntent(value);\n const newSuggestions = generateSuggestions(value, intent);\n setSuggestions(newSuggestions);\n } else {\n setSuggestions([]);\n }\n }, []);\n\n // 文件上传处理\n const handleFileChange = useCallback(\n async (info: { fileList: UploadFile<any>[]; file?: UploadFile<any> }) => {\n const uploadFile = info.file;\n if (!uploadFile || !uploadFile.originFileObj) {\n setFileList(info.fileList);\n return;\n }\n\n const file = uploadFile.originFileObj as File;\n const isImage = file.type.startsWith('image/');\n const fileType: 'image' | 'document' = isImage ? 'image' : 'document';\n\n try {\n // 调用 onUploadFile 回调\n if (onUploadFile && activeSession) {\n const result = await onUploadFile({\n sessionId: activeSession.id,\n file: file as any,\n type: fileType,\n });\n\n // 将上传结果添加到文件列表\n const uploadedFile: UploadFile = {\n uid: file.name,\n name: result.name || file.name,\n status: 'done',\n url: result.url,\n };\n setFileList([...fileList, uploadedFile]);\n message.success(`${fileType === 'image' ? '图片' : '文件'}上传成功`);\n } else {\n // 没有回调时,仅本地记录\n setFileList([...fileList, uploadFile]);\n }\n } catch (err) {\n console.error('文件上传失败:', err);\n message.error('文件上传失败');\n setFileList(fileList.filter((f) => f.uid !== file.name));\n }\n },\n [fileList, activeSession, onUploadFile],\n );\n\n // 判断是否为任务创建意图并执行工作流\n const handleSend = useCallback(async () => {\n if (!inputValue.trim() && fileList.length === 0) {\n message.warning('请输入问题或上传文件');\n return;\n }\n\n let content = inputValue.trim();\n\n // 如果有文件,附加文件信息\n if (fileList.length > 0) {\n const fileInfo = fileList.map((f) => f.name).join(', ');\n content += `\\n[附件: ${fileInfo}]`;\n }\n\n setInputValue('');\n setSuggestions([]);\n setFileList([]);\n\n // 检查是否为任务创建意图\n const intentEnabled = intentConfig?.enabled !== false;\n if (intentEnabled && isTaskCreationIntent(content)) {\n // 执行任务创建工作流\n await executeTaskCreationWorkflow(content);\n return;\n }\n\n // 普通问答\n sendQuestion(content);\n }, [inputValue, fileList, intentConfig?.enabled, executeTaskCreationWorkflow, sendQuestion]);\n\n const copyMsg = (c: string) => {\n navigator.clipboard.writeText(c);\n message.success('复制成功');\n };\n\n const toggleMaximize = useCallback(() => {\n setIsMaximized((prev) => !prev);\n }, []);\n\n const renderMsg = (item: Message) => (\n <List.Item\n key={item.id}\n style={{\n justifyContent: item.role === 'user' ? 'flex-end' : 'flex-start',\n marginBottom: 12,\n padding: '4px 0',\n }}\n >\n <div\n style={{\n maxWidth: '85%',\n padding: '10px 14px',\n borderRadius: 12,\n backgroundColor: item.role === 'user' ? '#1677ff' : item.role === 'system' ? '#f6ffed' : '#fafafa',\n color: item.role === 'user' ? '#fff' : '#333',\n border: item.role === 'ai' ? '1px solid #f0f0f0' : item.role === 'system' ? '1px solid #b7eb8f' : 'none',\n boxShadow:\n item.role === 'user'\n ? '0 2px 8px rgba(22, 119, 255, 0.3)'\n : item.role === 'system'\n ? '0 1px 4px rgba(82, 196, 26, 0.1)'\n : '0 1px 4px rgba(0,0,0,0.05)',\n }}\n >\n {item.role === 'user' ? (\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: 8 }}>\n <span>{item.content}</span>\n <CopyOutlined\n onClick={() => copyMsg(item.content)}\n style={{\n fontSize: 12,\n color: 'rgba(255,255,255,0.7)',\n cursor: 'pointer',\n flexShrink: 0,\n }}\n />\n </div>\n ) : item.role === 'system' ? (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n fontSize: 13,\n }}\n >\n <span style={{ color: '#52c41a' }}>✓</span>\n <span>{item.content}</span>\n {item.taskId && (\n <Button\n type='link'\n size='small'\n style={{ padding: 0, fontSize: 12 }}\n onClick={() => updateUrlWithTaskId(item.taskId!)}\n >\n 查看任务\n </Button>\n )}\n </div>\n ) : (\n <>\n <div style={{ minHeight: 20 }}>\n <MarkdownRender content={item.content} msgId={item.id} isAi={true} onDelete={deleteSingleMsg} />\n </div>\n {item.loading && <span style={{ color: '#1677ff', fontSize: 12 }}> 思考中...</span>}\n {!item.loading && (\n <Space size={8} style={{ fontSize: 12, marginTop: 6, display: 'flex' }}>\n <Tooltip title='复制'>\n <CopyOutlined onClick={() => copyMsg(item.content)} style={{ cursor: 'pointer', color: '#999' }} />\n </Tooltip>\n <Tooltip title='重新生成'>\n <ReloadOutlined onClick={() => regenerateAnswer(item)} style={{ cursor: 'pointer', color: '#999' }} />\n </Tooltip>\n </Space>\n )}\n </>\n )}\n </div>\n </List.Item>\n );\n\n const renderSession = (s: ChatSession) => (\n <List.Item\n key={s.id}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest('.ant-popover, .ant-popconfirm')) {\n return;\n }\n switchSession(s.id);\n }}\n style={{\n padding: '10px 12px',\n borderRadius: 8,\n cursor: 'pointer',\n backgroundColor: activeSession?.id === s.id ? '#e6f7ff' : '#fff',\n transition: 'all 0.2s',\n marginBottom: 8,\n }}\n >\n <div\n style={{\n flex: 1,\n overflow: 'hidden',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <div style={{ flex: 1, overflow: 'hidden' }}>\n <div\n style={{\n fontSize: 14,\n fontWeight: 500,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {s.title}\n </div>\n <div style={{ fontSize: 12, color: '#999', marginTop: 2 }}>\n {new Date(s.createTime).toLocaleString().slice(0, 16)}\n </div>\n </div>\n <Popconfirm\n title='确定删除?'\n onConfirm={(e: any) => {\n deleteSession(s.id, e as React.MouseEvent);\n }}\n >\n <DeleteOutlined\n style={{ color: '#ff4d4f', cursor: 'pointer', marginLeft: 8 }}\n onClick={(e) => e.stopPropagation()}\n />\n </Popconfirm>\n </div>\n </List.Item>\n );\n\n // 计算对话框位置和大小\n const getDialogStyle = (): CSSProperties => {\n if (isMaximized) {\n return {\n position: 'fixed',\n top: 0,\n left: 0,\n width: '100vw',\n height: '100vh',\n borderRadius: 0,\n };\n }\n\n const baseStyle: CSSProperties = {\n position: 'relative',\n width: showSessions ? 960 : 720,\n height: 680,\n borderRadius: 12,\n };\n\n if (dialogPosition.x !== 0 || dialogPosition.y !== 0) {\n return {\n ...baseStyle,\n transform: `translate(${dialogPosition.x}px, ${dialogPosition.y}px)`,\n };\n }\n\n return baseStyle;\n };\n\n return (\n <div\n className={className}\n style={{\n position: 'fixed',\n bottom: initialPosition.bottom,\n right: initialPosition.right,\n zIndex,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n transform:\n dialogPosition.x !== 0 || dialogPosition.y !== 0\n ? `translate(${dialogPosition.x}px, ${dialogPosition.y}px)`\n : undefined,\n ...style,\n }}\n >\n {!visible ? (\n renderTrigger ? (\n <div\n ref={triggerRef}\n onMouseDown={handleTriggerMouseDown}\n onClick={() => !isDragging && toggleVisible(true)}\n style={{ cursor: isDragging ? 'grabbing' : 'grab' }}\n >\n {renderTrigger}\n </div>\n ) : (\n <div\n ref={triggerRef}\n onMouseDown={handleTriggerMouseDown}\n onClick={() => !isDragging && toggleVisible(true)}\n style={{ cursor: isDragging ? 'grabbing' : 'grab' }}\n >\n <Button\n type='primary'\n shape='circle'\n size='large'\n icon={<MessageOutlined />}\n style={{\n width: buttonSize,\n height: buttonSize,\n boxShadow: '0 4px 16px rgba(22, 119, 255, 0.4)',\n }}\n />\n </div>\n )\n ) : (\n <div\n style={{\n ...getDialogStyle(),\n background: '#fff',\n boxShadow: '0 4px 20px rgba(0,0,0,0.15)',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'row',\n marginBottom: isMaximized ? 0 : 12,\n transition: 'all 0.3s ease',\n }}\n >\n {/* 历史会话面板 - 左侧 */}\n {showSessionPanel && showSessions && (\n <div\n style={{\n width: 280,\n borderRight: '1px solid #f0f0f0',\n background: '#fafafa',\n display: 'flex',\n flexDirection: 'column',\n flexShrink: 0,\n }}\n >\n <div\n style={{\n padding: '12px 16px',\n borderBottom: '1px solid #f0f0f0',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <Title level={5} style={{ margin: 0, fontSize: 16 }}>\n 历史会话\n </Title>\n <Button type='text' size='small' icon={<CloseOutlined />} onClick={() => setShowSessions(false)} />\n </div>\n <div style={{ flex: 1, padding: 16, overflowY: 'auto' }}>\n <Button\n type='primary'\n block\n icon={<PlusOutlined />}\n onClick={createNewSession}\n style={{ marginBottom: 12 }}\n >\n 新建会话\n </Button>\n <List dataSource={sessions} renderItem={renderSession} locale={{ emptyText: '暂无会话' }} />\n </div>\n </div>\n )}\n\n {/* 主对话区域 */}\n <div\n style={{\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n minWidth: 0,\n }}\n >\n {renderHeader || (\n <div\n className='ai-chat-header'\n style={{\n padding: '12px 16px',\n background: '#fafafa',\n borderBottom: '1px solid #f0f0f0',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n flexShrink: 0,\n }}\n >\n <Space>\n {showSessionPanel && (\n <Button\n type={showSessions ? 'primary' : 'text'}\n icon={<MenuOutlined />}\n size='small'\n onClick={() => setShowSessions(!showSessions)}\n >\n {showSessions ? '收起' : '会话'}\n </Button>\n )}\n <Button type='text' icon={<PlusOutlined />} onClick={createNewSession} size='small'>\n 新会话\n </Button>\n </Space>\n <Space>\n <Tooltip title={isMaximized ? '还原' : '最大化'}>\n <Button\n type='text'\n icon={isMaximized ? <CompressOutlined /> : <ExpandOutlined />}\n onClick={toggleMaximize}\n size='small'\n />\n </Tooltip>\n <Tooltip title='关闭'>\n <Button type='text' icon={<CloseOutlined />} onClick={() => toggleVisible(false)} size='small' />\n </Tooltip>\n </Space>\n </div>\n )}\n\n <div\n style={{\n flex: 1,\n padding: 16,\n overflowY: 'auto',\n }}\n >\n {!activeSession || activeSession.messages.length === 0 ? (\n <div\n style={{\n textAlign: 'center',\n padding: '60px 0',\n color: '#999',\n }}\n >\n <MessageOutlined style={{ fontSize: 48, color: '#d9d9d9' }} />\n <div style={{ marginTop: 16, fontSize: 16 }}>开始你的 AI 对话</div>\n <div style={{ marginTop: 8, fontSize: 13, color: '#bfbfbf' }}>我可以帮你解答问题、创建任务</div>\n <Button type='primary' onClick={createNewSession} style={{ marginTop: 20 }}>\n 新建会话\n </Button>\n </div>\n ) : (\n <List dataSource={activeSession.messages} renderItem={renderMsg} />\n )}\n <div ref={messagesEndRef} />\n </div>\n\n {renderFooter || (\n <div\n style={{\n padding: 12,\n borderTop: '1px solid #f0f0f0',\n background: '#fafafa',\n flexShrink: 0,\n }}\n >\n {/* 智能建议 */}\n {suggestions.length > 0 && (\n <div\n style={{\n marginBottom: 8,\n display: 'flex',\n flexWrap: 'wrap',\n gap: 4,\n }}\n >\n {suggestions.slice(0, 3).map((suggestion, index) => (\n <Button\n key={index}\n size='small'\n type='dashed'\n onClick={() => setInputValue(suggestion)}\n style={{ fontSize: 12 }}\n >\n {suggestion}\n </Button>\n ))}\n </div>\n )}\n\n {/* 文件预览 */}\n {fileList.length > 0 && (\n <div style={{ marginBottom: 8 }}>\n {fileList.map((file) => (\n <div\n key={file.uid}\n style={{\n display: 'inline-block',\n padding: '4px 8px',\n background: '#e6f7ff',\n borderRadius: 4,\n marginRight: 8,\n fontSize: 12,\n }}\n >\n {file.name}\n <CloseOutlined\n style={{\n marginLeft: 8,\n cursor: 'pointer',\n fontSize: 10,\n }}\n onClick={() => setFileList(fileList.filter((f) => f.uid !== file.uid))}\n />\n </div>\n ))}\n </div>\n )}\n\n <div style={{ position: 'relative' }}>\n <TextArea\n value={inputValue}\n onChange={handleInputChange}\n placeholder='输入问题或任务描述,如:帮我创建一个paimon调用任务'\n autoSize={{ minRows: 2, maxRows: 4 }}\n onPressEnter={(e) => {\n if (!e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n }}\n style={{\n marginBottom: 8,\n borderRadius: 8,\n paddingRight: 80,\n }}\n disabled={loading}\n />\n {/* 上传文件和图片按钮 */}\n <div\n style={{\n position: 'absolute',\n right: 12,\n bottom: 16,\n display: 'flex',\n gap: 8,\n }}\n >\n <Upload\n fileList={fileList}\n onChange={handleFileChange}\n beforeUpload={() => false}\n showUploadList={false}\n accept='image/*'\n >\n <Tooltip title='上传图片'>\n <Button type='text' size='small' icon={<FileImageOutlined />} />\n </Tooltip>\n </Upload>\n <Upload\n fileList={fileList}\n onChange={handleFileChange}\n beforeUpload={() => false}\n showUploadList={false}\n >\n <Tooltip title='上传文件'>\n <Button type='text' size='small' icon={<PaperClipOutlined />} />\n </Tooltip>\n </Upload>\n </div>\n </div>\n <div style={{ display: 'flex', justifyContent: 'flex-end' }}>\n <Space>\n {loading && (\n <Button danger icon={<StopOutlined />} onClick={cancelRequest} size='small'>\n 终止\n </Button>\n )}\n <Button\n type='primary'\n icon={<SendOutlined />}\n onClick={handleSend}\n loading={loading}\n disabled={!inputValue.trim() && fileList.length === 0}\n size='small'\n >\n 发送\n </Button>\n </Space>\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default AiChat;\nexport { generateSuggestions, isTaskCreationIntent, parseTaskDescription, recognizeIntent } from './intentRecognizer';\nexport { delay, NavigationManager } from './navigationManager';\nexport type {\n AiChatConfig,\n ChatSession,\n EnhancedAiChatConfig,\n Intent,\n IntentType,\n Message,\n NavigationOptions,\n Task,\n TaskCategory,\n TaskCreationResult,\n TaskPriority,\n TaskStatus,\n UseAiChatOptions,\n UseAiChatReturn,\n} from './type';\nexport { useAiChat } from './useAiChat';\nexport { useTaskWorkflow } from './useTaskWorkflow';\n"],
5
+ "mappings": "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",
6
+ "names": ["generateSuggestions", "isTaskCreationIntent", "recognizeIntent", "useAiChat", "useTaskWorkflow"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/business/AiChat/intentRecognizer.ts"],
4
- "sourcesContent": ["import type { Intent, IntentType, IntentPattern, TaskCategory } from './type';\n\n// 默认意图模式\nconst DEFAULT_PATTERNS: IntentPattern[] = [\n {\n type: 'create_task',\n patterns: [/创建|新建|启动|开始|生成|建立|发起/i, /帮我|请|帮忙|协助/i, /任务|作业|job|task/i],\n },\n {\n type: 'query_task',\n patterns: [/查询|查看|获取|显示|看看|找/i, /任务|作业|状态|进度|结果/i],\n },\n {\n type: 'update_task',\n patterns: [/更新|修改|编辑|更改|调整|优化/i, /任务|配置|参数|设置/i],\n },\n {\n type: 'delete_task',\n patterns: [/删除|取消|移除|清除|销毁/i, /任务|作业|job|task/i],\n },\n {\n type: 'call_api',\n patterns: [/调用|请求|发送|访问/i, /接口|API|服务|请求/i],\n },\n];\n\n// 任务类型关键词映射\nconst TASK_TYPE_KEYWORDS: Record<string, { patterns: RegExp[]; type: TaskCategory }> = {\n paimon: {\n patterns: [/paimon|帕蒙/i],\n type: 'paimon',\n },\n data_sync: {\n patterns: [/数据同步|同步|数据迁移|迁移/i],\n type: 'data_sync',\n },\n report: {\n patterns: [/报表|报告|report|数据报表|统计/i],\n type: 'report',\n },\n etl: {\n patterns: [/ETL|数据处理|数据清洗|数据转换/i],\n type: 'etl',\n },\n bug: {\n patterns: [/bug|缺陷|问题|错误|修复|fix/i],\n type: 'bug',\n },\n feature: {\n patterns: [/功能|新特性|feature|需求|新特性/i],\n type: 'feature',\n },\n analysis: {\n patterns: [/分析|解析|analyze|数据分析|统计分析/i],\n type: 'analysis',\n },\n};\n\n/**\n * 识别用户意图\n * @param text 用户输入文本\n * @param customPatterns 自定义意图模式\n * @returns 识别结果\n */\nexport function recognizeIntent(text: string, customPatterns?: IntentPattern[]): Intent {\n const patterns = customPatterns || DEFAULT_PATTERNS;\n\n let bestMatch: IntentType = 'general_question';\n let bestScore = 0;\n let matchedPattern = '';\n\n // 计算每个意图的匹配分数\n for (const pattern of patterns) {\n let score = 0;\n for (const regex of pattern.patterns) {\n if (regex.test(text)) {\n score += 1;\n matchedPattern = regex.source;\n }\n }\n\n // 如果有多个模式匹配,增加权重\n if (score === pattern.patterns.length && score > 0) {\n score += 0.5;\n }\n\n if (score > bestScore) {\n bestScore = score;\n bestMatch = pattern.type;\n }\n }\n\n // 提取任务类型参数\n const parameters: Record<string, any> = extractTaskParameters(text);\n\n // 计算置信度\n const confidence = Math.min(bestScore / 3, 1);\n\n return {\n type: bestMatch,\n confidence,\n parameters,\n rawText: text,\n matchedPattern: bestMatch !== 'general_question' ? matchedPattern : undefined,\n };\n}\n\n/**\n * 提取任务参数\n * @param text 用户输入文本\n * @returns 提取的参数\n */\nfunction extractTaskParameters(text: string): Record<string, any> {\n const params: Record<string, any> = {\n taskType: detectTaskType(text),\n originalText: text,\n };\n\n // 提取任务名称\n const nameMatch = text.match(/名为[\"']?([^\"']+)[\"']?/i);\n if (nameMatch) {\n params.taskName = nameMatch[1];\n }\n\n // 提取优先级\n if (/高优先级|紧急|urgent|critical/i.test(text)) {\n params.priority = 'high';\n } else if (/低优先级|optional|low/i.test(text)) {\n params.priority = 'low';\n } else {\n params.priority = 'medium';\n }\n\n // 提取描述信息\n const descMatch = text.match(/描述|说明|备注[::]?\\s*(.+)$/i);\n if (descMatch) {\n params.description = descMatch[1].trim();\n }\n\n // 提取时间信息\n const timeMatch = text.match(/(明天|下周|后天|今天|立即|马上|尽快)/i);\n if (timeMatch) {\n params.scheduledTime = timeMatch[1];\n }\n\n return params;\n}\n\n/**\n * 检测任务类型\n * @param text 用户输入文本\n * @returns 任务类型\n */\nfunction detectTaskType(text: string): TaskCategory {\n for (const [key, config] of Object.entries(TASK_TYPE_KEYWORDS)) {\n for (const pattern of config.patterns) {\n if (pattern.test(text)) {\n return config.type;\n }\n }\n }\n return 'other';\n}\n\n/**\n * 生成建议问题\n * @param text 用户输入文本\n * @param intent 识别的意图\n * @returns 建议问题列表\n */\nexport function generateSuggestions(text: string, intent: Intent): string[] {\n const suggestions: string[] = [];\n\n switch (intent.type) {\n case 'create_task':\n suggestions.push(\n '帮我创建一个数据同步任务',\n '创建一个新的报表生成任务',\n '启动Paimon表同步作业',\n '帮我创建一个ETL数据处理任务',\n );\n break;\n case 'query_task':\n suggestions.push('查询我的任务列表', '查看任务执行状态', '获取任务执行结果', '查看任务进度');\n break;\n case 'update_task':\n suggestions.push('更新任务配置', '修改任务参数', '调整任务执行时间', '优化任务设置');\n break;\n case 'delete_task':\n suggestions.push('取消当前任务', '删除失败任务', '清除已完成的任务');\n break;\n default:\n suggestions.push('帮我解答一个问题', '分析这段代码', '解释这个概念', '如何优化查询性能');\n }\n\n return suggestions;\n}\n\n/**\n * 判断是否为任务创建意图\n * @param text 用户输入文本\n * @param threshold 置信度阈值\n * @returns 是否为任务创建意图\n */\nexport function isTaskCreationIntent(text: string, threshold = 0.5): boolean {\n const intent = recognizeIntent(text);\n return intent.type === 'create_task' && intent.confidence >= threshold;\n}\n\n/**\n * 创建任务描述(自然语言转结构化数据)\n * @param text 用户输入文本\n * @returns 结构化的任务描述\n */\nexport function parseTaskDescription(text: string): {\n taskType: TaskCategory;\n taskName: string;\n description: string;\n priority: 'high' | 'medium' | 'low';\n} {\n const intent = recognizeIntent(text);\n const params = intent.parameters;\n\n return {\n taskType: params.taskType || detectTaskType(text),\n taskName: params.taskName || `${params.taskType || '新'}任务 - ${new Date().toLocaleTimeString().slice(0, 5)}`,\n description: params.description || text,\n priority: params.priority || 'medium',\n };\n}\n"],
4
+ "sourcesContent": ["import type { Intent, IntentPattern, IntentType, TaskCategory } from './type';\n\n// 默认意图模式\nconst DEFAULT_PATTERNS: IntentPattern[] = [\n {\n type: 'create_task',\n patterns: [/创建|新建|启动|开始|生成|建立|发起/i, /帮我|请|帮忙|协助/i, /任务|作业|job|task/i],\n },\n {\n type: 'query_task',\n patterns: [/查询|查看|获取|显示|看看|找/i, /任务|作业|状态|进度|结果/i],\n },\n {\n type: 'update_task',\n patterns: [/更新|修改|编辑|更改|调整|优化/i, /任务|配置|参数|设置/i],\n },\n {\n type: 'delete_task',\n patterns: [/删除|取消|移除|清除|销毁/i, /任务|作业|job|task/i],\n },\n {\n type: 'call_api',\n patterns: [/调用|请求|发送|访问/i, /接口|API|服务|请求/i],\n },\n];\n\n// 任务类型关键词映射\nconst TASK_TYPE_KEYWORDS: Record<string, { patterns: RegExp[]; type: TaskCategory }> = {\n paimon: {\n patterns: [/paimon|帕蒙/i],\n type: 'paimon',\n },\n data_sync: {\n patterns: [/数据同步|同步|数据迁移|迁移/i],\n type: 'data_sync',\n },\n report: {\n patterns: [/报表|报告|report|数据报表|统计/i],\n type: 'report',\n },\n etl: {\n patterns: [/ETL|数据处理|数据清洗|数据转换/i],\n type: 'etl',\n },\n bug: {\n patterns: [/bug|缺陷|问题|错误|修复|fix/i],\n type: 'bug',\n },\n feature: {\n patterns: [/功能|新特性|feature|需求|新特性/i],\n type: 'feature',\n },\n analysis: {\n patterns: [/分析|解析|analyze|数据分析|统计分析/i],\n type: 'analysis',\n },\n};\n\n/**\n * 识别用户意图\n * @param text 用户输入文本\n * @param customPatterns 自定义意图模式\n * @returns 识别结果\n */\nexport function recognizeIntent(text: string, customPatterns?: IntentPattern[]): Intent {\n const patterns = customPatterns || DEFAULT_PATTERNS;\n\n let bestMatch: IntentType = 'general_question';\n let bestScore = 0;\n let matchedPattern = '';\n\n // 计算每个意图的匹配分数\n for (const pattern of patterns) {\n let score = 0;\n for (const regex of pattern.patterns) {\n if (regex.test(text)) {\n score += 1;\n matchedPattern = regex.source;\n }\n }\n\n // 如果有多个模式匹配,增加权重\n if (score === pattern.patterns.length && score > 0) {\n score += 0.5;\n }\n\n if (score > bestScore) {\n bestScore = score;\n bestMatch = pattern.type;\n }\n }\n\n // 提取任务类型参数\n const parameters: Record<string, any> = extractTaskParameters(text);\n\n // 计算置信度\n const confidence = Math.min(bestScore / 3, 1);\n\n return {\n type: bestMatch,\n confidence,\n parameters,\n rawText: text,\n matchedPattern: bestMatch !== 'general_question' ? matchedPattern : undefined,\n };\n}\n\n/**\n * 提取任务参数\n * @param text 用户输入文本\n * @returns 提取的参数\n */\nfunction extractTaskParameters(text: string): Record<string, any> {\n const params: Record<string, any> = {\n taskType: detectTaskType(text),\n originalText: text,\n };\n\n // 提取任务名称\n const nameMatch = text.match(/名为[\"']?([^\"']+)[\"']?/i);\n if (nameMatch) {\n params.taskName = nameMatch[1];\n }\n\n // 提取优先级\n if (/高优先级|紧急|urgent|critical/i.test(text)) {\n params.priority = 'high';\n } else if (/低优先级|optional|low/i.test(text)) {\n params.priority = 'low';\n } else {\n params.priority = 'medium';\n }\n\n // 提取描述信息\n const descMatch = text.match(/描述|说明|备注[::]?\\s*(.+)$/i);\n if (descMatch) {\n params.description = descMatch[1].trim();\n }\n\n // 提取时间信息\n const timeMatch = text.match(/(明天|下周|后天|今天|立即|马上|尽快)/i);\n if (timeMatch) {\n params.scheduledTime = timeMatch[1];\n }\n\n return params;\n}\n\n/**\n * 检测任务类型\n * @param text 用户输入文本\n * @returns 任务类型\n */\nfunction detectTaskType(text: string): TaskCategory {\n for (const [key, config] of Object.entries(TASK_TYPE_KEYWORDS)) {\n for (const pattern of config.patterns) {\n if (pattern.test(text)) {\n return config.type;\n }\n }\n }\n return 'other';\n}\n\n/**\n * 生成建议问题\n * @param text 用户输入文本\n * @param intent 识别的意图\n * @returns 建议问题列表\n */\nexport function generateSuggestions(text: string, intent: Intent): string[] {\n const suggestions: string[] = [];\n\n switch (intent.type) {\n case 'create_task':\n suggestions.push(\n '帮我创建一个数据同步任务',\n '创建一个新的报表生成任务',\n '启动Paimon表同步作业',\n '帮我创建一个ETL数据处理任务',\n );\n break;\n case 'query_task':\n suggestions.push('查询我的任务列表', '查看任务执行状态', '获取任务执行结果', '查看任务进度');\n break;\n case 'update_task':\n suggestions.push('更新任务配置', '修改任务参数', '调整任务执行时间', '优化任务设置');\n break;\n case 'delete_task':\n suggestions.push('取消当前任务', '删除失败任务', '清除已完成的任务');\n break;\n default:\n suggestions.push('帮我解答一个问题', '分析这段代码', '解释这个概念', '如何优化查询性能');\n }\n\n return suggestions;\n}\n\n/**\n * 判断是否为任务创建意图\n * @param text 用户输入文本\n * @param threshold 置信度阈值\n * @returns 是否为任务创建意图\n */\nexport function isTaskCreationIntent(text: string, threshold = 0.5): boolean {\n const intent = recognizeIntent(text);\n return intent.type === 'create_task' && intent.confidence >= threshold;\n}\n\n/**\n * 创建任务描述(自然语言转结构化数据)\n * @param text 用户输入文本\n * @returns 结构化的任务描述\n */\nexport function parseTaskDescription(text: string): {\n taskType: TaskCategory;\n taskName: string;\n description: string;\n priority: 'high' | 'medium' | 'low';\n} {\n const intent = recognizeIntent(text);\n const params = intent.parameters;\n\n return {\n taskType: params.taskType || detectTaskType(text),\n taskName: params.taskName || `${params.taskType || '新'}任务 - ${new Date().toLocaleTimeString().slice(0, 5)}`,\n description: params.description || text,\n priority: params.priority || 'medium',\n };\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -100,7 +100,7 @@ var NavigationManager = class {
100
100
  * @param options 导航选项
101
101
  */
102
102
  static navigateToTask(taskId, options) {
103
- const url = this.buildTaskUrl(taskId, {
103
+ const url = NavigationManager.buildTaskUrl(taskId, {
104
104
  baseUrl: options == null ? void 0 : options.baseUrl,
105
105
  taskType: options == null ? void 0 : options.taskType,
106
106
  additionalParams: options == null ? void 0 : options.queryParams
@@ -117,7 +117,7 @@ var NavigationManager = class {
117
117
  */
118
118
  static refreshCurrentPage(taskId) {
119
119
  if (taskId) {
120
- this.updateQueryParams({ taskId }, { replace: false });
120
+ NavigationManager.updateQueryParams({ taskId }, { replace: false });
121
121
  }
122
122
  window.location.reload();
123
123
  }
@@ -126,7 +126,7 @@ var NavigationManager = class {
126
126
  * @param params 查询参数
127
127
  */
128
128
  static refreshWithParams(params) {
129
- this.updateQueryParams(params, { replace: false });
129
+ NavigationManager.updateQueryParams(params, { replace: false });
130
130
  window.location.reload();
131
131
  }
132
132
  /**
@@ -135,14 +135,14 @@ var NavigationManager = class {
135
135
  * @returns 任务ID
136
136
  */
137
137
  static extractTaskId(paramName = "taskId") {
138
- return this.getQueryParam(paramName);
138
+ return NavigationManager.getQueryParam(paramName);
139
139
  }
140
140
  /**
141
141
  * 从URL中提取所有任务相关信息
142
142
  * @returns 任务相关信息对象
143
143
  */
144
144
  static extractTaskInfo() {
145
- const params = this.getCurrentParams();
145
+ const params = NavigationManager.getCurrentParams();
146
146
  return {
147
147
  taskId: params.taskId,
148
148
  taskType: params.type,
@@ -158,7 +158,7 @@ var NavigationManager = class {
158
158
  paramsToClean.forEach((key) => {
159
159
  params[key] = "";
160
160
  });
161
- this.updateQueryParams(params, { merge: false });
161
+ NavigationManager.updateQueryParams(params, { merge: false });
162
162
  }
163
163
  /**
164
164
  * 监听URL变化(用于SPA路由变化检测)
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/business/AiChat/navigationManager.ts"],
4
- "sourcesContent": ["import type { NavigationOptions } from './type';\n\n/**\n * 导航管理器 - 用于处理URL更新和页面导航\n */\nexport class NavigationManager {\n /**\n * 更新URL查询参数\n * @param params 要更新的参数\n * @param options 导航选项\n */\n static updateQueryParams(params: Record<string, string>, options?: NavigationOptions): void {\n const { replace = false, merge = true } = options || {};\n\n const currentParams = new URLSearchParams(window.location.search);\n\n // 根据需要合并或替换参数\n if (merge) {\n Object.entries(params).forEach(([key, value]) => {\n if (value) {\n currentParams.set(key, value);\n } else {\n currentParams.delete(key);\n }\n });\n } else {\n // 替换所有参数\n Object.entries(params).forEach(([key, value]) => {\n if (value) {\n currentParams.set(key, value);\n }\n });\n }\n\n const newUrl = `${window.location.pathname}?${currentParams.toString()}${options?.fragment ? `#${options.fragment}` : ''}`;\n\n if (replace) {\n window.history.replaceState({ ...window.history.state, params }, '', newUrl);\n } else {\n window.history.pushState({ ...window.history.state, params }, '', newUrl);\n }\n }\n\n /**\n * 获取当前URL查询参数\n * @returns 查询参数对象\n */\n static getCurrentParams(): Record<string, string> {\n const params = new URLSearchParams(window.location.search);\n const result: Record<string, string> = {};\n\n params.forEach((value, key) => {\n result[key] = value;\n });\n\n return result;\n }\n\n /**\n * 获取单个查询参数值\n * @param key 参数名\n * @returns 参数值\n */\n static getQueryParam(key: string): string | undefined {\n const params = new URLSearchParams(window.location.search);\n return params.get(key) || undefined;\n }\n\n /**\n * 构建任务详情URL\n * @param taskId 任务ID\n * @param baseUrl 基础URL(可选,默认当前页面)\n * @param options 其他选项\n * @returns 完整的URL字符串\n */\n static buildTaskUrl(\n taskId: string,\n options?: {\n baseUrl?: string;\n taskType?: string;\n additionalParams?: Record<string, string>;\n },\n ): string {\n const baseUrl = options?.baseUrl || window.location.pathname;\n const taskTypeParamName = 'type';\n const taskIdParamName = 'taskId';\n\n const params = new URLSearchParams();\n params.set(taskIdParamName, taskId);\n\n if (options?.taskType) {\n params.set(taskTypeParamName, options.taskType);\n }\n\n if (options?.additionalParams) {\n Object.entries(options.additionalParams).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return `${baseUrl}?${params.toString()}`;\n }\n\n /**\n * 导航到任务页面\n * @param taskId 任务ID\n * @param options 导航选项\n */\n static navigateToTask(\n taskId: string,\n options?: NavigationOptions & {\n baseUrl?: string;\n taskType?: string;\n },\n ): void {\n const url = this.buildTaskUrl(taskId, {\n baseUrl: options?.baseUrl,\n taskType: options?.taskType,\n additionalParams: options?.queryParams,\n });\n\n if (options?.replace) {\n window.history.replaceState({ taskId, taskType: options?.taskType }, '', url);\n } else {\n window.history.pushState({ taskId, taskType: options?.taskType }, '', url);\n }\n }\n\n /**\n * 刷新当前页面\n * @param taskId 可选的任务ID\n */\n static refreshCurrentPage(taskId?: string): void {\n if (taskId) {\n // 如果有任务ID,更新URL后再刷新\n this.updateQueryParams({ taskId }, { replace: false });\n }\n\n window.location.reload();\n }\n\n /**\n * 携带参数刷新页面\n * @param params 查询参数\n */\n static refreshWithParams(params: Record<string, string>): void {\n this.updateQueryParams(params, { replace: false });\n window.location.reload();\n }\n\n /**\n * 从URL中提取任务ID\n * @param paramName 参数名(默认taskId)\n * @returns 任务ID\n */\n static extractTaskId(paramName = 'taskId'): string | undefined {\n return this.getQueryParam(paramName);\n }\n\n /**\n * 从URL中提取所有任务相关信息\n * @returns 任务相关信息对象\n */\n static extractTaskInfo(): {\n taskId?: string;\n taskType?: string;\n queryParams: Record<string, string>;\n } {\n const params = this.getCurrentParams();\n return {\n taskId: params.taskId,\n taskType: params.type,\n queryParams: params,\n };\n }\n\n /**\n * 清理URL中的任务参数\n * @param paramsToClean 要清理的参数名列表\n */\n static clearTaskParams(paramsToClean: string[] = ['taskId', 'type']): void {\n const params: Record<string, string> = {};\n paramsToClean.forEach((key) => {\n params[key] = '';\n });\n this.updateQueryParams(params, { merge: false });\n }\n\n /**\n * 监听URL变化(用于SPA路由变化检测)\n * @param callback 回调函数\n * @returns 取消监听的函数\n */\n static onUrlChange(callback: () => void): () => void {\n let lastUrl = window.location.href;\n\n const checkUrl = () => {\n if (window.location.href !== lastUrl) {\n lastUrl = window.location.href;\n callback();\n }\n };\n\n // 监听popstate事件\n window.addEventListener('popstate', checkUrl);\n\n // 重写history方法\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n\n window.history.pushState = function (...args) {\n originalPushState.apply(this, args);\n checkUrl();\n };\n\n window.history.replaceState = function (...args) {\n originalReplaceState.apply(this, args);\n checkUrl();\n };\n\n // 返回取消监听的函数\n return () => {\n window.removeEventListener('popstate', checkUrl);\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n };\n }\n}\n\n/**\n * 延迟函数\n * @param ms 延迟毫秒数\n * @returns Promise\n */\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * 创建带超时的Promise\n * @param promise 原始Promise\n * @param timeout 超时时间(毫秒)\n * @param timeoutMessage 超时错误消息\n * @returns Promise\n */\nexport function withTimeout<T>(\n promise: Promise<T>,\n timeout: number,\n timeoutMessage = 'Operation timed out',\n): Promise<T> {\n return Promise.race([\n promise,\n new Promise<T>((_, reject) => setTimeout(() => reject(new Error(timeoutMessage)), timeout)),\n ]);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { NavigationOptions } from './type';\n\n/**\n * 导航管理器 - 用于处理URL更新和页面导航\n */\nexport class NavigationManager {\n /**\n * 更新URL查询参数\n * @param params 要更新的参数\n * @param options 导航选项\n */\n static updateQueryParams(params: Record<string, string>, options?: NavigationOptions): void {\n const { replace = false, merge = true } = options || {};\n\n const currentParams = new URLSearchParams(window.location.search);\n\n // 根据需要合并或替换参数\n if (merge) {\n Object.entries(params).forEach(([key, value]) => {\n if (value) {\n currentParams.set(key, value);\n } else {\n currentParams.delete(key);\n }\n });\n } else {\n // 替换所有参数\n Object.entries(params).forEach(([key, value]) => {\n if (value) {\n currentParams.set(key, value);\n }\n });\n }\n\n const newUrl = `${window.location.pathname}?${currentParams.toString()}${options?.fragment ? `#${options.fragment}` : ''}`;\n\n if (replace) {\n window.history.replaceState({ ...window.history.state, params }, '', newUrl);\n } else {\n window.history.pushState({ ...window.history.state, params }, '', newUrl);\n }\n }\n\n /**\n * 获取当前URL查询参数\n * @returns 查询参数对象\n */\n static getCurrentParams(): Record<string, string> {\n const params = new URLSearchParams(window.location.search);\n const result: Record<string, string> = {};\n\n params.forEach((value, key) => {\n result[key] = value;\n });\n\n return result;\n }\n\n /**\n * 获取单个查询参数值\n * @param key 参数名\n * @returns 参数值\n */\n static getQueryParam(key: string): string | undefined {\n const params = new URLSearchParams(window.location.search);\n return params.get(key) || undefined;\n }\n\n /**\n * 构建任务详情URL\n * @param taskId 任务ID\n * @param baseUrl 基础URL(可选,默认当前页面)\n * @param options 其他选项\n * @returns 完整的URL字符串\n */\n static buildTaskUrl(\n taskId: string,\n options?: {\n baseUrl?: string;\n taskType?: string;\n additionalParams?: Record<string, string>;\n },\n ): string {\n const baseUrl = options?.baseUrl || window.location.pathname;\n const taskTypeParamName = 'type';\n const taskIdParamName = 'taskId';\n\n const params = new URLSearchParams();\n params.set(taskIdParamName, taskId);\n\n if (options?.taskType) {\n params.set(taskTypeParamName, options.taskType);\n }\n\n if (options?.additionalParams) {\n Object.entries(options.additionalParams).forEach(([key, value]) => {\n params.set(key, value);\n });\n }\n\n return `${baseUrl}?${params.toString()}`;\n }\n\n /**\n * 导航到任务页面\n * @param taskId 任务ID\n * @param options 导航选项\n */\n static navigateToTask(\n taskId: string,\n options?: NavigationOptions & {\n baseUrl?: string;\n taskType?: string;\n },\n ): void {\n const url = NavigationManager.buildTaskUrl(taskId, {\n baseUrl: options?.baseUrl,\n taskType: options?.taskType,\n additionalParams: options?.queryParams,\n });\n\n if (options?.replace) {\n window.history.replaceState({ taskId, taskType: options?.taskType }, '', url);\n } else {\n window.history.pushState({ taskId, taskType: options?.taskType }, '', url);\n }\n }\n\n /**\n * 刷新当前页面\n * @param taskId 可选的任务ID\n */\n static refreshCurrentPage(taskId?: string): void {\n if (taskId) {\n // 如果有任务ID,更新URL后再刷新\n NavigationManager.updateQueryParams({ taskId }, { replace: false });\n }\n\n window.location.reload();\n }\n\n /**\n * 携带参数刷新页面\n * @param params 查询参数\n */\n static refreshWithParams(params: Record<string, string>): void {\n NavigationManager.updateQueryParams(params, { replace: false });\n window.location.reload();\n }\n\n /**\n * 从URL中提取任务ID\n * @param paramName 参数名(默认taskId)\n * @returns 任务ID\n */\n static extractTaskId(paramName = 'taskId'): string | undefined {\n return NavigationManager.getQueryParam(paramName);\n }\n\n /**\n * 从URL中提取所有任务相关信息\n * @returns 任务相关信息对象\n */\n static extractTaskInfo(): {\n taskId?: string;\n taskType?: string;\n queryParams: Record<string, string>;\n } {\n const params = NavigationManager.getCurrentParams();\n return {\n taskId: params.taskId,\n taskType: params.type,\n queryParams: params,\n };\n }\n\n /**\n * 清理URL中的任务参数\n * @param paramsToClean 要清理的参数名列表\n */\n static clearTaskParams(paramsToClean: string[] = ['taskId', 'type']): void {\n const params: Record<string, string> = {};\n paramsToClean.forEach((key) => {\n params[key] = '';\n });\n NavigationManager.updateQueryParams(params, { merge: false });\n }\n\n /**\n * 监听URL变化(用于SPA路由变化检测)\n * @param callback 回调函数\n * @returns 取消监听的函数\n */\n static onUrlChange(callback: () => void): () => void {\n let lastUrl = window.location.href;\n\n const checkUrl = () => {\n if (window.location.href !== lastUrl) {\n lastUrl = window.location.href;\n callback();\n }\n };\n\n // 监听popstate事件\n window.addEventListener('popstate', checkUrl);\n\n // 重写history方法\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n\n window.history.pushState = function (...args) {\n originalPushState.apply(this, args);\n checkUrl();\n };\n\n window.history.replaceState = function (...args) {\n originalReplaceState.apply(this, args);\n checkUrl();\n };\n\n // 返回取消监听的函数\n return () => {\n window.removeEventListener('popstate', checkUrl);\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n };\n }\n}\n\n/**\n * 延迟函数\n * @param ms 延迟毫秒数\n * @returns Promise\n */\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * 创建带超时的Promise\n * @param promise 原始Promise\n * @param timeout 超时时间(毫秒)\n * @param timeoutMessage 超时错误消息\n * @returns Promise\n */\nexport function withTimeout<T>(\n promise: Promise<T>,\n timeout: number,\n timeoutMessage = 'Operation timed out',\n): Promise<T> {\n return Promise.race([\n promise,\n new Promise<T>((_, reject) => setTimeout(() => reject(new Error(timeoutMessage)), timeout)),\n ]);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1 +1,16 @@
1
+ /**
2
+ * SSE 流式响应处理
3
+ * 支持大文件传输和流式数据处理
4
+ */
5
+ export interface SSEOptions {
6
+ onMessage: (data: string) => void;
7
+ onEnd?: () => void;
8
+ onError?: (err: Error) => void;
9
+ onProgress?: (loaded: number, total?: number) => void;
10
+ }
1
11
  export declare function createSSE(url: string, body: any, onMessage: (data: string) => void, onEnd?: () => void, onError?: (err: any) => void): Promise<() => void>;
12
+ /**
13
+ * 创建增强型SSE连接
14
+ * 支持进度追踪、断点续传等高级功能
15
+ */
16
+ export declare function createEnhancedSSE(url: string, body: any, options: SSEOptions): Promise<() => void>;
@@ -31,30 +31,141 @@ function createSSE(url, body, onMessage, onEnd, onError) {
31
31
  body: JSON.stringify(body),
32
32
  signal
33
33
  });
34
- if (!res.ok)
35
- throw new Error("请求失败");
34
+ if (!res.ok) {
35
+ const errorText = yield res.text().catch(() => "");
36
+ throw new Error(`HTTP ${res.status}: ${errorText || res.statusText}`);
37
+ }
36
38
  if (!res.body)
37
- throw new Error("不支持流式");
39
+ throw new Error("Response body is null, streaming not supported");
38
40
  const reader = res.body.getReader();
39
41
  const decoder = new TextDecoder("utf-8");
42
+ let buffer = "";
43
+ const contentLength = res.headers.get("Content-Length");
44
+ const total = contentLength ? parseInt(contentLength, 10) : void 0;
45
+ let loaded = 0;
40
46
  while (true) {
41
47
  const { done, value } = yield reader.read();
42
48
  if (done) {
49
+ if (buffer.trim()) {
50
+ onMessage(buffer);
51
+ }
43
52
  onEnd == null ? void 0 : onEnd();
44
53
  break;
45
54
  }
46
- const text = decoder.decode(value, { stream: true });
47
- onMessage(text);
55
+ loaded += value.byteLength;
56
+ const chunk = decoder.decode(value, { stream: true });
57
+ buffer += chunk;
58
+ const lines = buffer.split("\n");
59
+ buffer = lines.pop() || "";
60
+ for (const line of lines) {
61
+ const trimmed = line.trim();
62
+ if (!trimmed)
63
+ continue;
64
+ if (trimmed.startsWith("data:")) {
65
+ const data = trimmed.slice(5).trim();
66
+ if (data === "[DONE]") {
67
+ onEnd == null ? void 0 : onEnd();
68
+ return () => controller.abort();
69
+ }
70
+ try {
71
+ const parsed = JSON.parse(data);
72
+ if (parsed.content) {
73
+ onMessage(parsed.content);
74
+ } else {
75
+ onMessage(data);
76
+ }
77
+ } catch (e) {
78
+ onMessage(data);
79
+ }
80
+ } else {
81
+ onMessage(trimmed);
82
+ }
83
+ }
84
+ }
85
+ return () => controller.abort();
86
+ } catch (err) {
87
+ if (err.name !== "AbortError") {
88
+ const error = err instanceof Error ? err : new Error(String(err));
89
+ onError == null ? void 0 : onError(error);
90
+ }
91
+ return () => controller.abort();
92
+ }
93
+ });
94
+ }
95
+ function createEnhancedSSE(url, body, options) {
96
+ return __async(this, null, function* () {
97
+ var _a, _b, _c, _d;
98
+ const controller = new AbortController();
99
+ const signal = controller.signal;
100
+ try {
101
+ const res = yield fetch(url, {
102
+ method: "POST",
103
+ headers: {
104
+ "Content-Type": "application/json",
105
+ Accept: "text/event-stream"
106
+ },
107
+ body: JSON.stringify(body),
108
+ signal
109
+ });
110
+ if (!res.ok) {
111
+ const errorText = yield res.text().catch(() => "");
112
+ throw new Error(`HTTP ${res.status}: ${errorText || res.statusText}`);
113
+ }
114
+ if (!res.body) {
115
+ throw new Error("Response body is null");
116
+ }
117
+ const reader = res.body.getReader();
118
+ const decoder = new TextDecoder("utf-8");
119
+ const contentLength = res.headers.get("Content-Length");
120
+ const total = contentLength ? parseInt(contentLength, 10) : void 0;
121
+ let loaded = 0;
122
+ let buffer = "";
123
+ while (true) {
124
+ const { done, value } = yield reader.read();
125
+ if (done) {
126
+ if (buffer.trim()) {
127
+ options.onMessage(buffer);
128
+ }
129
+ (_a = options.onEnd) == null ? void 0 : _a.call(options);
130
+ break;
131
+ }
132
+ loaded += value.byteLength;
133
+ (_b = options.onProgress) == null ? void 0 : _b.call(options, loaded, total);
134
+ const chunk = decoder.decode(value, { stream: true });
135
+ buffer += chunk;
136
+ const lines = buffer.split("\n");
137
+ buffer = lines.pop() || "";
138
+ for (const line of lines) {
139
+ const trimmed = line.trim();
140
+ if (!trimmed || trimmed.startsWith(":"))
141
+ continue;
142
+ if (trimmed.startsWith("data:")) {
143
+ const data = trimmed.slice(5).trim();
144
+ if (data === "[DONE]") {
145
+ (_c = options.onEnd) == null ? void 0 : _c.call(options);
146
+ return () => controller.abort();
147
+ }
148
+ try {
149
+ const parsed = JSON.parse(data);
150
+ options.onMessage(parsed.content || data);
151
+ } catch (e) {
152
+ options.onMessage(data);
153
+ }
154
+ }
155
+ }
48
156
  }
49
157
  return () => controller.abort();
50
158
  } catch (err) {
51
- if (err.name !== "AbortError")
52
- onError == null ? void 0 : onError(err);
159
+ if (err.name !== "AbortError") {
160
+ const error = err instanceof Error ? err : new Error(String(err));
161
+ (_d = options.onError) == null ? void 0 : _d.call(options, error);
162
+ }
53
163
  return () => controller.abort();
54
164
  }
55
165
  });
56
166
  }
57
167
  export {
168
+ createEnhancedSSE,
58
169
  createSSE
59
170
  };
60
171
  //# sourceMappingURL=sse.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/business/AiChat/sse.ts"],
4
- "sourcesContent": ["export async function createSSE(\n url: string,\n body: any,\n onMessage: (data: string) => void,\n onEnd?: () => void,\n onError?: (err: any) => void,\n) {\n const controller = new AbortController();\n const signal = controller.signal;\n\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!res.ok) throw new Error('请求失败');\n if (!res.body) throw new Error('不支持流式');\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder('utf-8');\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n onEnd?.();\n break;\n }\n const text = decoder.decode(value, { stream: true });\n onMessage(text);\n }\n\n return () => controller.abort();\n } catch (err: any) {\n if (err.name !== 'AbortError') onError?.(err);\n return () => controller.abort();\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;AAAA,SAAsB,UACpB,KACA,MACA,WACA,OACA,SACA;AAAA;AACA,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,SAAS,WAAW;AAE1B,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,KAAK;AAAA,QAC3B,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,IAAI;AAAA,QACzB;AAAA,MACF,CAAC;AAED,UAAI,CAAC,IAAI;AAAI,cAAM,IAAI,MAAM,MAAM;AACnC,UAAI,CAAC,IAAI;AAAM,cAAM,IAAI,MAAM,OAAO;AAEtC,YAAM,SAAS,IAAI,KAAK,UAAU;AAClC,YAAM,UAAU,IAAI,YAAY,OAAO;AAEvC,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAI,MAAM;AACR;AACA;AAAA,QACF;AACA,cAAM,OAAO,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AACnD,kBAAU,IAAI;AAAA,MAChB;AAEA,aAAO,MAAM,WAAW,MAAM;AAAA,IAChC,SAAS,KAAP;AACA,UAAI,IAAI,SAAS;AAAc,2CAAU;AACzC,aAAO,MAAM,WAAW,MAAM;AAAA,IAChC;AAAA,EACF;AAAA;",
4
+ "sourcesContent": ["/**\n * SSE 流式响应处理\n * 支持大文件传输和流式数据处理\n */\n\nexport interface SSEOptions {\n onMessage: (data: string) => void;\n onEnd?: () => void;\n onError?: (err: Error) => void;\n onProgress?: (loaded: number, total?: number) => void;\n}\n\nexport async function createSSE(\n url: string,\n body: any,\n onMessage: (data: string) => void,\n onEnd?: () => void,\n onError?: (err: any) => void,\n) {\n const controller = new AbortController();\n const signal = controller.signal;\n\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!res.ok) {\n const errorText = await res.text().catch(() => '');\n throw new Error(`HTTP ${res.status}: ${errorText || res.statusText}`);\n }\n\n if (!res.body) throw new Error('Response body is null, streaming not supported');\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n\n // 获取内容长度(如果可用)\n const contentLength = res.headers.get('Content-Length');\n const total = contentLength ? parseInt(contentLength, 10) : undefined;\n let loaded = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n // 处理剩余缓冲区数据\n if (buffer.trim()) {\n onMessage(buffer);\n }\n onEnd?.();\n break;\n }\n\n loaded += value.byteLength;\n\n // 解码数据块\n const chunk = decoder.decode(value, { stream: true });\n buffer += chunk;\n\n // 按行处理数据(SSE协议)\n const lines = buffer.split('\\n');\n buffer = lines.pop() || ''; // 保留最后不完整的行\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n // 处理SSE格式: data: {...}\n if (trimmed.startsWith('data:')) {\n const data = trimmed.slice(5).trim();\n if (data === '[DONE]') {\n onEnd?.();\n return () => controller.abort();\n }\n try {\n // 尝试解析JSON\n const parsed = JSON.parse(data);\n if (parsed.content) {\n onMessage(parsed.content);\n } else {\n onMessage(data);\n }\n } catch {\n // 非JSON数据,直接传递\n onMessage(data);\n }\n } else {\n // 非SSE格式,直接传递\n onMessage(trimmed);\n }\n }\n }\n\n return () => controller.abort();\n } catch (err: any) {\n if (err.name !== 'AbortError') {\n const error = err instanceof Error ? err : new Error(String(err));\n onError?.(error);\n }\n return () => controller.abort();\n }\n}\n\n/**\n * 创建增强型SSE连接\n * 支持进度追踪、断点续传等高级功能\n */\nexport async function createEnhancedSSE(url: string, body: any, options: SSEOptions): Promise<() => void> {\n const controller = new AbortController();\n const signal = controller.signal;\n\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n },\n body: JSON.stringify(body),\n signal,\n });\n\n if (!res.ok) {\n const errorText = await res.text().catch(() => '');\n throw new Error(`HTTP ${res.status}: ${errorText || res.statusText}`);\n }\n\n if (!res.body) {\n throw new Error('Response body is null');\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder('utf-8');\n const contentLength = res.headers.get('Content-Length');\n const total = contentLength ? parseInt(contentLength, 10) : undefined;\n\n let loaded = 0;\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n if (buffer.trim()) {\n options.onMessage(buffer);\n }\n options.onEnd?.();\n break;\n }\n\n loaded += value.byteLength;\n options.onProgress?.(loaded, total);\n\n const chunk = decoder.decode(value, { stream: true });\n buffer += chunk;\n\n // SSE 协议处理\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) continue;\n\n if (trimmed.startsWith('data:')) {\n const data = trimmed.slice(5).trim();\n if (data === '[DONE]') {\n options.onEnd?.();\n return () => controller.abort();\n }\n\n try {\n const parsed = JSON.parse(data);\n options.onMessage(parsed.content || data);\n } catch {\n options.onMessage(data);\n }\n }\n }\n }\n\n return () => controller.abort();\n } catch (err: any) {\n if (err.name !== 'AbortError') {\n const error = err instanceof Error ? err : new Error(String(err));\n options.onError?.(error);\n }\n return () => controller.abort();\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }