@yoka-ui/ui 1.1.0 → 1.1.4

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 (81) hide show
  1. package/@Docs-yoka/exports.generated.md +53 -4
  2. package/LICENSE +21 -0
  3. package/dist/es/assets/image/skills.zip +0 -0
  4. package/dist/es/business/AiChat/aichat-logo.svg +1 -0
  5. package/dist/es/business/AiChat/index.js +20 -45
  6. package/dist/es/business/AiChat/index.js.map +2 -2
  7. package/dist/es/business/AiChat/index.module.less +24 -0
  8. package/dist/es/business/AiChat/useAiChat.js +41 -24
  9. package/dist/es/business/AiChat/useAiChat.js.map +2 -2
  10. package/dist/es/business/Editor/index.d.ts +2 -2
  11. package/dist/es/business/Editor/index.js.map +2 -2
  12. package/dist/es/business/Empty/index.d.ts +1 -1
  13. package/dist/es/business/Empty/index.js.map +1 -1
  14. package/dist/es/business/ModCommonFilter/index.d.ts +1 -0
  15. package/dist/es/business/ModCommonFilter/index.js.map +2 -2
  16. package/dist/es/business/YkLoginModule/index.d.ts +1 -0
  17. package/dist/es/business/YkLoginModule/index.js.map +2 -2
  18. package/dist/es/business/YkPorjectSelect/index.d.ts +3 -3
  19. package/dist/es/business/YkPorjectSelect/index.js +37 -51
  20. package/dist/es/business/YkPorjectSelect/index.js.map +2 -2
  21. package/dist/es/business/YkSqlEdit/index.d.ts +1 -0
  22. package/dist/es/business/YkSqlEdit/index.js.map +2 -2
  23. package/dist/es/components/Clock/index.d.ts +2 -2
  24. package/dist/es/components/Clock/index.js.map +2 -2
  25. package/dist/es/components/DebounceInput/index.d.ts +2 -2
  26. package/dist/es/components/DebounceInput/index.js.map +2 -2
  27. package/dist/es/components/MultipleSelect/index.d.ts +2 -2
  28. package/dist/es/components/MultipleSelect/index.js.map +2 -2
  29. package/dist/es/components/RefreshButton/index.d.ts +2 -2
  30. package/dist/es/components/RefreshButton/index.js.map +2 -2
  31. package/dist/es/components/SearchWithHistory/index.d.ts +1 -1
  32. package/dist/es/components/SearchWithHistory/index.js.map +1 -1
  33. package/dist/es/components/TextWithInput/index.d.ts +2 -5
  34. package/dist/es/components/TextWithInput/index.js.map +2 -2
  35. package/dist/es/components/TextWithToolTip/index.d.ts +2 -2
  36. package/dist/es/components/TextWithToolTip/index.js.map +2 -2
  37. package/dist/es/components/TreeTransfer/index.d.ts +1 -0
  38. package/dist/es/components/TreeTransfer/index.js.map +2 -2
  39. package/dist/es/index.d.ts +29 -0
  40. package/dist/es/index.js.map +2 -2
  41. package/dist/es/index.less +1 -0
  42. package/dist/lib/assets/image/skills.zip +0 -0
  43. package/dist/lib/business/AiChat/aichat-logo.svg +1 -0
  44. package/dist/lib/business/AiChat/index.js +20 -45
  45. package/dist/lib/business/AiChat/index.js.map +3 -3
  46. package/dist/lib/business/AiChat/index.module.less +24 -0
  47. package/dist/lib/business/AiChat/useAiChat.js +40 -22
  48. package/dist/lib/business/AiChat/useAiChat.js.map +2 -2
  49. package/dist/lib/business/Editor/index.d.ts +2 -2
  50. package/dist/lib/business/Editor/index.js.map +2 -2
  51. package/dist/lib/business/Empty/index.d.ts +1 -1
  52. package/dist/lib/business/Empty/index.js.map +1 -1
  53. package/dist/lib/business/ModCommonFilter/index.d.ts +1 -0
  54. package/dist/lib/business/ModCommonFilter/index.js.map +2 -2
  55. package/dist/lib/business/YkLoginModule/index.d.ts +1 -0
  56. package/dist/lib/business/YkLoginModule/index.js.map +2 -2
  57. package/dist/lib/business/YkPorjectSelect/index.d.ts +3 -3
  58. package/dist/lib/business/YkPorjectSelect/index.js +33 -27
  59. package/dist/lib/business/YkPorjectSelect/index.js.map +2 -2
  60. package/dist/lib/business/YkSqlEdit/index.d.ts +1 -0
  61. package/dist/lib/business/YkSqlEdit/index.js.map +2 -2
  62. package/dist/lib/components/Clock/index.d.ts +2 -2
  63. package/dist/lib/components/Clock/index.js.map +2 -2
  64. package/dist/lib/components/DebounceInput/index.d.ts +2 -2
  65. package/dist/lib/components/DebounceInput/index.js.map +2 -2
  66. package/dist/lib/components/MultipleSelect/index.d.ts +2 -2
  67. package/dist/lib/components/MultipleSelect/index.js.map +2 -2
  68. package/dist/lib/components/RefreshButton/index.d.ts +2 -2
  69. package/dist/lib/components/RefreshButton/index.js.map +2 -2
  70. package/dist/lib/components/SearchWithHistory/index.d.ts +1 -1
  71. package/dist/lib/components/SearchWithHistory/index.js.map +1 -1
  72. package/dist/lib/components/TextWithInput/index.d.ts +2 -5
  73. package/dist/lib/components/TextWithInput/index.js.map +2 -2
  74. package/dist/lib/components/TextWithToolTip/index.d.ts +2 -2
  75. package/dist/lib/components/TextWithToolTip/index.js.map +2 -2
  76. package/dist/lib/components/TreeTransfer/index.d.ts +1 -0
  77. package/dist/lib/components/TreeTransfer/index.js.map +2 -2
  78. package/dist/lib/index.d.ts +29 -0
  79. package/dist/lib/index.js.map +2 -2
  80. package/dist/lib/index.less +1 -0
  81. package/package.json +7 -3
@@ -1,13 +1,13 @@
1
1
  # @yoka-ui/ui 具名导出表
2
2
 
3
3
  > **自动生成**:`pnpm run generate:yoka-llms`(源文件 `src/index.tsx`)
4
- > **包版本**:`1.1.0`
5
- > **生成时间**:`2026-04-27T11:44:30.343Z`
4
+ > **包版本**:`1.1.4`
5
+ > **生成时间**:`2026-06-05T02:58:26.197Z`
6
6
  > 请勿手动编辑本文件;修改导出请改 `src/index.tsx` 后重新运行上述命令。
7
7
 
8
8
  ## 使用约定(给 LLM / 业务开发者)
9
9
 
10
- - **包名**:`@yoka-ui/ui`(npm 公网);可选 Git 安装:`@yoka-ui/ui`: `git+http://gitlab.sh.com/web/yoka-ui.git#v1.1.0` 等,以实际 tag 为准
10
+ - **包名**:`@yoka-ui/ui`(npm 公网);可选 Git 安装:`@yoka-ui/ui`: `git+http://gitlab.sh.com/web/yoka-ui.git#v1.1.4` 等,以实际 tag 为准
11
11
  - **导入**:仅使用下表中的**具名**导出(组件/值与 `export type` 类型),与发布产物 `dist/es/index.d.ts` 一致;勿臆造未列出符号。
12
12
  - **全局样式(常用)**:业务入口引入一行,例如 `import '@yoka-ui/ui/dist/index.less'`(若以 README / 实际产物路径为准)。
13
13
  - **技术栈**:React 18、Ant Design 5;复杂表单/表格优先使用库内封装(`InputTheme`、`TableTheme`、`ModCommonFilter` 等),需要原生 antd API 时查阅 [Ant Design 文档](https://ant.design) 或本仓库 `@Docs/llms.txt`(克隆源码时可用)。
@@ -19,30 +19,63 @@
19
19
  | 导出符号 | 类别 | 源码 `from` 路径 |
20
20
  | --- | --- | --- |
21
21
  | `AiChat` | 组件 | `./business/AiChat` |
22
+ | `AiChatProps` | 类型 | `./business/AiChat` |
22
23
  | `DrawerPageInfo` | 组件 | `./business/DrawerPageInfo` |
24
+ | `TipContentData` | 类型 | `./business/DrawerPageInfo` |
25
+ | `FeedbackParams` | 类型 | `./business/DrawerPageInfo` |
26
+ | `PropsType as DrawerPageInfoProps` | 类型 | `./business/DrawerPageInfo` |
23
27
  | `Editor` | 组件 | `./business/Editor` |
28
+ | `EditorProps` | 类型 | `./business/Editor` |
24
29
  | `Empty` | 组件 | `./business/Empty` |
30
+ | `EmptyProps` | 类型 | `./business/Empty` |
25
31
  | `ModCommonFilter` | 组件 | `./business/ModCommonFilter` |
32
+ | `ModCommonFilterProps` | 类型 | `./business/ModCommonFilter` |
33
+ | `ListItem` | 类型 | `./business/ModCommonFilter` |
34
+ | `CategoryItem` | 类型 | `./business/ModCommonFilter` |
35
+ | `TerminalItem` | 类型 | `./business/ModCommonFilter` |
26
36
  | `YkLoginModule` | 组件 | `./business/YkLoginModule` |
37
+ | `LoginModuleProps` | 类型 | `./business/YkLoginModule` |
38
+ | `LoginType` | 类型 | `./business/YkLoginModule` |
39
+ | `LoginTabItem` | 类型 | `./business/YkLoginModule` |
40
+ | `QrcodeApi` | 类型 | `./business/YkLoginModule` |
41
+ | `SmsLoginFormApi` | 类型 | `./business/YkLoginModule` |
42
+ | `OptionItem` | 类型 | `./business/YkPorjectSelect` |
43
+ | `YkPorjectSelectProps` | 类型 | `./business/YkPorjectSelect` |
27
44
  | `YkPorjectSelect` | 组件 | `./business/YkPorjectSelect` |
28
45
  | `YkSqlEdit` | 组件 | `./business/YkSqlEdit` |
46
+ | `YkSqlEditProps` | 类型 | `./business/YkSqlEdit` |
47
+ | `SqlDialectType` | 类型 | `./business/YkSqlEdit` |
29
48
 
30
49
  ### Export common components
31
50
 
32
51
  | 导出符号 | 类别 | 源码 `from` 路径 |
33
52
  | --- | --- | --- |
34
53
  | `Clock` | 组件 | `./components/Clock` |
54
+ | `ClockProps` | 类型 | `./components/Clock` |
35
55
  | `DebounceInput` | 组件 | `./components/DebounceInput` |
56
+ | `DebounceInputProps` | 类型 | `./components/DebounceInput` |
36
57
  | `MultipleSelect` | 组件 | `./components/MultipleSelect` |
58
+ | `MultipleSelectProps` | 类型 | `./components/MultipleSelect` |
37
59
  | `NumericInput` | 组件 | `./components/NumericInput` |
60
+ | `NumericInputProps` | 类型 | `./components/NumericInput` |
38
61
  | `RefreshButton` | 组件 | `./components/RefreshButton` |
62
+ | `RefreshButtonProps` | 类型 | `./components/RefreshButton` |
39
63
  | `SearchWithHistory` | 组件 | `./components/SearchWithHistory` |
64
+ | `SearchWithHistoryProps` | 类型 | `./components/SearchWithHistory` |
40
65
  | `TextWithInput` | 组件 | `./components/TextWithInput` |
66
+ | `TextWithInputProps` | 类型 | `./components/TextWithInput` |
41
67
  | `TextWithToolTip` | 组件 | `./components/TextWithToolTip` |
68
+ | `TextWithTooltipProps` | 类型 | `./components/TextWithToolTip` |
42
69
  | `TreeTransfer` | 组件 | `./components/TreeTransfer` |
70
+ | `TreeTransferProps` | 类型 | `./components/TreeTransfer` |
43
71
  | `YkDateRangePicker` | 组件 | `./components/YkDateRangePicker` |
44
72
  | `YkRangeDateWithVS` | 组件 | `./components/YkRangeDateWithVS` |
73
+ | `YkRangeDateWithVSProps` | 类型 | `./components/YkRangeDateWithVS` |
74
+ | `YkRangeDateWithVSValue` | 类型 | `./components/YkRangeDateWithVS` |
75
+ | `YkRangeDateWithVSChange` | 类型 | `./components/YkRangeDateWithVS` |
45
76
  | `YkRangeTimeWithRecent` | 组件 | `./components/YkRangeTimeWithRecent` |
77
+ | `YkRangeTimeWithRecentProps` | 类型 | `./components/YkRangeTimeWithRecent` |
78
+ | `YkRangeTimeWithRecentTimeType` | 类型 | `./components/YkRangeTimeWithRecent` |
46
79
 
47
80
  ### Export creative components
48
81
 
@@ -51,7 +84,10 @@
51
84
  | `ArcCheckboxProps` | 类型 | `./creative/ArcCheckbox` |
52
85
  | `ArcCheckbox` | 组件 | `./creative/ArcCheckbox` |
53
86
  | `ButtonRadioWithInfo` | 组件 | `./creative/ButtonRadioWithInfo` |
87
+ | `ButtonRadioWithInfoProps` | 类型 | `./creative/ButtonRadioWithInfo` |
88
+ | `ButtonRadioWithInfoOption` | 类型 | `./creative/ButtonRadioWithInfo` |
54
89
  | `ButtonWithProgress` | 组件 | `./creative/ButtonWithProgress` |
90
+ | `ButtonWithProgressProps` | 类型 | `./creative/ButtonWithProgress` |
55
91
  | `GlassSegmentedRadio` | 组件 | `./creative/GlassSegmentedRadio` |
56
92
 
57
93
  ### Export layout
@@ -59,8 +95,14 @@
59
95
  | 导出符号 | 类别 | 源码 `from` 路径 |
60
96
  | --- | --- | --- |
61
97
  | `FlexGrid` | 组件 | `./layout/FlexGrid` |
98
+ | `FlexGridProps` | 类型 | `./layout/FlexGrid` |
99
+ | `FlexGridColSpan` | 类型 | `./layout/FlexGrid` |
62
100
  | `YkContainer` | 组件 | `./layout/YkContainer` |
101
+ | `YkContainerProps` | 类型 | `./layout/YkContainer` |
63
102
  | `YkDrawer` | 组件 | `./layout/YkDrawer` |
103
+ | `YkDrawerProps` | 类型 | `./layout/YkDrawer` |
104
+ | `YkDrawerSize` | 类型 | `./layout/YkDrawer` |
105
+ | `YkDrawerPlacement` | 类型 | `./layout/YkDrawer` |
64
106
 
65
107
  ### Export theme components
66
108
 
@@ -74,25 +116,32 @@
74
116
  | 导出符号 | 类别 | 源码 `from` 路径 |
75
117
  | --- | --- | --- |
76
118
  | `LabelSelect` | 组件 | `./ui/LabelSelect` |
119
+ | `LabelSelectProps` | 类型 | `./ui/LabelSelect` |
120
+ | `CustomOption` | 类型 | `./ui/LabelSelect` |
77
121
  | `LogicOperator` | 组件 | `./ui/LogicOperator` |
122
+ | `LogicOperatorProps` | 类型 | `./ui/LogicOperator` |
78
123
  | `YkButton` | 组件 | `./ui/YkButton` |
124
+ | `YkButtonProps` | 类型 | `./ui/YkButton` |
79
125
  | `YkCard` | 组件 | `./ui/YkCard` |
80
126
  | `YkCheckbox` | 组件 | `./ui/YkCheckbox` |
81
127
  | `YkDescriptions` | 组件 | `./ui/YkDescriptions` |
82
128
  | `YkPagination` | 组件 | `./ui/YkPagination` |
83
129
  | `YkRadio` | 组件 | `./ui/YkRadio` |
84
130
  | `YkRadioBtnSpecial` | 组件 | `./ui/YkRadioBtnSpecial` |
131
+ | `RadioBtnProps` | 类型 | `./ui/YkRadioBtnSpecial` |
85
132
  | `YkSegmented` | 组件 | `./ui/YkSegmented` |
86
133
  | `YkSelect` | 组件 | `./ui/YkSelect` |
87
134
  | `YkSpin` | 组件 | `./ui/YkSpin` |
88
135
  | `YkStatistic` | 组件 | `./ui/YkStatistic` |
89
136
  | `YkSwitch` | 组件 | `./ui/YkSwitch` |
90
137
  | `YkTabs` | 组件 | `./ui/YkTabs` |
138
+ | `YkTabsProps` | 类型 | `./ui/YkTabs` |
139
+ | `YkTabItem` | 类型 | `./ui/YkTabs` |
91
140
  | `YkTooltip` | 组件 | `./ui/YkTooltip` |
92
141
 
93
142
  ## 纯符号列表(便于检索)
94
143
 
95
144
  ```
96
- AiChat, DrawerPageInfo, Editor, Empty, ModCommonFilter, YkLoginModule, YkPorjectSelect, YkSqlEdit, Clock, DebounceInput, MultipleSelect, NumericInput, RefreshButton, SearchWithHistory, TextWithInput, TextWithToolTip, TreeTransfer, YkDateRangePicker, YkRangeDateWithVS, YkRangeTimeWithRecent, ArcCheckboxProps, ArcCheckbox, ButtonRadioWithInfo, ButtonWithProgress, GlassSegmentedRadio, FlexGrid, YkContainer, YkDrawer, InputTheme, TableTheme, LabelSelect, LogicOperator, YkButton, YkCard, YkCheckbox, YkDescriptions, YkPagination, YkRadio, YkRadioBtnSpecial, YkSegmented, YkSelect, YkSpin, YkStatistic, YkSwitch, YkTabs, YkTooltip
145
+ AiChat, AiChatProps, DrawerPageInfo, TipContentData, FeedbackParams, PropsType as DrawerPageInfoProps, Editor, EditorProps, Empty, EmptyProps, ModCommonFilter, ModCommonFilterProps, ListItem, CategoryItem, TerminalItem, YkLoginModule, LoginModuleProps, LoginType, LoginTabItem, QrcodeApi, SmsLoginFormApi, OptionItem, YkPorjectSelectProps, YkPorjectSelect, YkSqlEdit, YkSqlEditProps, SqlDialectType, Clock, ClockProps, DebounceInput, DebounceInputProps, MultipleSelect, MultipleSelectProps, NumericInput, NumericInputProps, RefreshButton, RefreshButtonProps, SearchWithHistory, SearchWithHistoryProps, TextWithInput, TextWithInputProps, TextWithToolTip, TextWithTooltipProps, TreeTransfer, TreeTransferProps, YkDateRangePicker, YkRangeDateWithVS, YkRangeDateWithVSProps, YkRangeDateWithVSValue, YkRangeDateWithVSChange, YkRangeTimeWithRecent, YkRangeTimeWithRecentProps, YkRangeTimeWithRecentTimeType, ArcCheckboxProps, ArcCheckbox, ButtonRadioWithInfo, ButtonRadioWithInfoProps, ButtonRadioWithInfoOption, ButtonWithProgress, ButtonWithProgressProps, GlassSegmentedRadio, FlexGrid, FlexGridProps, FlexGridColSpan, YkContainer, YkContainerProps, YkDrawer, YkDrawerProps, YkDrawerSize, YkDrawerPlacement, InputTheme, TableTheme, LabelSelect, LabelSelectProps, CustomOption, LogicOperator, LogicOperatorProps, YkButton, YkButtonProps, YkCard, YkCheckbox, YkDescriptions, YkPagination, YkRadio, YkRadioBtnSpecial, RadioBtnProps, YkSegmented, YkSelect, YkSpin, YkStatistic, YkSwitch, YkTabs, YkTabsProps, YkTabItem, YkTooltip
97
146
  ```
98
147
 
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 web
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
Binary file
@@ -0,0 +1 @@
1
+ <svg xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_5864_85390)" fill="none"><path d="M11.2812 5.49104C11.2403 5.13024 10.9353 4.85751 10.5722 4.85714C10.2091 4.85677 9.90345 5.12887 9.86185 5.48959C9.59131 7.83515 8.89003 9.48448 7.75868 10.6158C6.62734 11.7472 4.97801 12.4485 2.63244 12.719C2.27173 12.7606 1.99963 13.0662 2 13.4293C2.00037 13.7924 2.2731 14.0975 2.63389 14.1383C4.94069 14.3996 6.62508 15.1006 7.78328 16.2379C8.93713 17.3709 9.65305 19.0198 9.85994 21.3489C9.89271 21.7178 10.2019 22.0004 10.5722 22C10.9425 21.9996 11.2511 21.7162 11.2831 21.3473C11.4813 19.0565 12.1966 17.3729 13.3562 16.2133C14.5157 15.0537 16.1994 14.3385 18.4902 14.1402C18.8591 14.1083 19.1424 13.7997 19.1429 13.4294C19.1433 13.0591 18.8606 12.7499 18.4918 12.7171C16.1627 12.5102 14.5137 11.7943 13.3807 10.6404C12.2435 9.48222 11.5425 7.79783 11.2812 5.49104Z" fill="#1E96EB"></path><path d="M18.9427 2.24651C18.9268 2.1062 18.8082 2.00014 18.667 2C18.5257 1.99986 18.4069 2.10567 18.3907 2.24595C18.2855 3.15811 18.0128 3.79952 17.5728 4.23949C17.1329 4.67946 16.4914 4.95218 15.5793 5.05739C15.439 5.07356 15.3332 5.19241 15.3333 5.33362C15.3335 5.47482 15.4395 5.59345 15.5798 5.60935C16.4769 5.71096 17.132 5.98357 17.5824 6.42584C18.0311 6.86644 18.3095 7.50771 18.39 8.41347C18.4027 8.55691 18.523 8.66683 18.667 8.66667C18.811 8.6665 18.931 8.55632 18.9434 8.41284C19.0205 7.52199 19.2987 6.86723 19.7496 6.41629C20.2006 5.96534 20.8553 5.68719 21.7462 5.61008C21.8896 5.59766 21.9998 5.47765 22 5.33365C22.0002 5.18964 21.8902 5.06939 21.7468 5.05664C20.841 4.97619 20.1998 4.69777 19.7592 4.24905C19.3169 3.79864 19.0443 3.1436 18.9427 2.24651Z" fill="#1E96EB"></path></g><defs><clipPath id="clip0_5864_85390"><rect width="24" height="24" fill="white"></rect></clipPath></defs></svg>
@@ -56,6 +56,8 @@ import {
56
56
  } from "@ant-design/icons";
57
57
  import { Button, Input, List, message, Popconfirm, Space, Tooltip, Typography, Upload } from "antd";
58
58
  import React, { useCallback, useEffect, useRef, useState } from "react";
59
+ import AiChatLogo from "./aichat-logo.svg";
60
+ import styles from "./index.module.less";
59
61
  import { generateSuggestions, isTaskCreationIntent, recognizeIntent } from "./intentRecognizer";
60
62
  import MarkdownRender from "./MarkdownRender";
61
63
  import { useAiChat } from "./useAiChat";
@@ -116,16 +118,7 @@ var AiChat = ({
116
118
  onSendMessage,
117
119
  onUploadFile
118
120
  });
119
- const {
120
- tasks,
121
- createTask,
122
- updateTaskStatus,
123
- deleteTask,
124
- createTaskFromNaturalLanguage,
125
- updateUrlWithTaskId,
126
- refreshCurrentPage,
127
- executeTaskCreationWorkflow
128
- } = useTaskWorkflow({
121
+ const { updateUrlWithTaskId, executeTaskCreationWorkflow } = useTaskWorkflow({
129
122
  enabled: taskWorkflow == null ? void 0 : taskWorkflow.enabled,
130
123
  createTaskApi: taskWorkflow == null ? void 0 : taskWorkflow.createTaskApi,
131
124
  supportedTaskTypes: taskWorkflow == null ? void 0 : taskWorkflow.supportedTaskTypes,
@@ -133,14 +126,8 @@ var AiChat = ({
133
126
  refreshDelay: navConfig == null ? void 0 : navConfig.refreshDelay,
134
127
  taskIdParamName: taskWorkflow == null ? void 0 : taskWorkflow.taskIdParamName,
135
128
  taskTypeParamName: taskWorkflow == null ? void 0 : taskWorkflow.taskTypeParamName,
136
- onTaskCreated: (taskId, taskData) => {
129
+ onTaskCreated: (taskId) => {
137
130
  if (activeSession) {
138
- const systemMsg = {
139
- id: `${Date.now()}_sys`,
140
- role: "system",
141
- content: `任务创建成功,ID: ${taskId}`,
142
- taskId
143
- };
144
131
  }
145
132
  },
146
133
  onError
@@ -155,7 +142,6 @@ var AiChat = ({
155
142
  const dragOffset = useRef({ x: 0, y: 0 });
156
143
  const messagesEndRef = useRef(null);
157
144
  const triggerRef = useRef(null);
158
- const fileInputRef = useRef(null);
159
145
  useEffect(() => {
160
146
  var _a;
161
147
  (_a = messagesEndRef.current) == null ? void 0 : _a.scrollIntoView({ behavior: "smooth" });
@@ -233,24 +219,26 @@ var AiChat = ({
233
219
  file,
234
220
  type: fileType
235
221
  });
236
- const uploadedFile = {
237
- uid: file.name,
238
- name: result.name || file.name,
239
- status: "done",
240
- url: result.url
241
- };
242
- setFileList([...fileList, uploadedFile]);
222
+ setFileList((prev) => [
223
+ ...prev,
224
+ {
225
+ uid: file.name,
226
+ name: result.name || file.name,
227
+ status: "done",
228
+ url: result.url
229
+ }
230
+ ]);
243
231
  message.success(`${fileType === "image" ? "图片" : "文件"}上传成功`);
244
232
  } else {
245
- setFileList([...fileList, uploadFile]);
233
+ setFileList((prev) => [...prev, uploadFile]);
246
234
  }
247
235
  } catch (err) {
248
236
  console.error("文件上传失败:", err);
249
237
  message.error("文件上传失败");
250
- setFileList(fileList.filter((f) => f.uid !== file.name));
238
+ setFileList((prev) => prev.filter((f) => f.uid !== file.name));
251
239
  }
252
240
  }),
253
- [fileList, activeSession, onUploadFile]
241
+ [activeSession, onUploadFile]
254
242
  );
255
243
  const handleSend = useCallback(() => __async(void 0, null, function* () {
256
244
  if (!inputValue.trim() && fileList.length === 0) {
@@ -456,20 +444,7 @@ var AiChat = ({
456
444
  onClick: () => !isDragging && toggleVisible(true),
457
445
  style: { cursor: isDragging ? "grabbing" : "grab" }
458
446
  },
459
- /* @__PURE__ */ React.createElement(
460
- Button,
461
- {
462
- type: "primary",
463
- shape: "circle",
464
- size: "large",
465
- icon: /* @__PURE__ */ React.createElement(MessageOutlined, null),
466
- style: {
467
- width: buttonSize,
468
- height: buttonSize,
469
- boxShadow: "0 4px 16px rgba(22, 119, 255, 0.4)"
470
- }
471
- }
472
- )
447
+ /* @__PURE__ */ React.createElement("div", { className: styles["ai-chat-btn"] }, /* @__PURE__ */ React.createElement("img", { src: AiChatLogo, width: 28, height: 28 }))
473
448
  ) : /* @__PURE__ */ React.createElement(
474
449
  "div",
475
450
  {
@@ -610,10 +585,10 @@ var AiChat = ({
610
585
  gap: 4
611
586
  }
612
587
  },
613
- suggestions.slice(0, 3).map((suggestion, index) => /* @__PURE__ */ React.createElement(
588
+ suggestions.slice(0, 3).map((suggestion) => /* @__PURE__ */ React.createElement(
614
589
  Button,
615
590
  {
616
- key: index,
591
+ key: suggestion,
617
592
  size: "small",
618
593
  type: "dashed",
619
594
  onClick: () => setInputValue(suggestion),
@@ -644,7 +619,7 @@ var AiChat = ({
644
619
  cursor: "pointer",
645
620
  fontSize: 10
646
621
  },
647
- onClick: () => setFileList(fileList.filter((f) => f.uid !== file.uid))
622
+ onClick: () => setFileList((prev) => prev.filter((f) => f.uid !== file.uid))
648
623
  }
649
624
  )
650
625
  ))),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/business/AiChat/index.tsx"],
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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",
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 AiChatLogo from './aichat-logo.svg';\nimport styles from './index.module.less';\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 { updateUrlWithTaskId, executeTaskCreationWorkflow } = 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) => {\n // 添加系统消息到会话\n if (activeSession) {\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\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 setFileList((prev) => [\n ...prev,\n {\n uid: file.name,\n name: result.name || file.name,\n status: 'done',\n url: result.url,\n } as UploadFile,\n ]);\n message.success(`${fileType === 'image' ? '图片' : '文件'}上传成功`);\n } else {\n // 没有回调时,仅本地记录(使用函数式更新)\n setFileList((prev) => [...prev, uploadFile]);\n }\n } catch (err) {\n console.error('文件上传失败:', err);\n message.error('文件上传失败');\n setFileList((prev) => prev.filter((f) => f.uid !== file.name));\n }\n },\n [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={ <img src={AiChatLogo} width={buttonSize} height={buttonSize} />}\n style={{\n width: buttonSize,\n height: buttonSize,\n boxShadow: '0 4px 16px rgba(22, 119, 255, 0.4)',\n }}\n /> */}\n <div className={styles['ai-chat-btn']}>\n <img src={AiChatLogo} width={28} height={28} />\n </div>\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) => (\n <Button\n key={suggestion}\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((prev) => prev.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
6
  "names": ["generateSuggestions", "isTaskCreationIntent", "recognizeIntent", "useAiChat", "useTaskWorkflow"]
7
7
  }
@@ -0,0 +1,24 @@
1
+ @primary: #1677ff;
2
+ @border: #e8e8e8;
3
+ @text-secondary: #8c8c8c;
4
+ @bg-light: #fafafa;
5
+ @ai-bg: #f0f5ff;
6
+
7
+ // Button
8
+ .ai-chat-btn {
9
+ position: fixed;
10
+ right: 24px;
11
+ bottom: 24px;
12
+ width: 52px;
13
+ height: 52px;
14
+ border-radius: 50%;
15
+ background: @ai-bg;
16
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);
17
+ display: flex;
18
+ align-items: center;
19
+ justify-content: center;
20
+ cursor: pointer;
21
+ z-index: 1000;
22
+ user-select: none;
23
+ }
24
+