@gientech/modual 1.3.0 → 1.3.2

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 (308) hide show
  1. package/README.md +129 -129
  2. package/{dist/assets/mysql.svg → assets/MySQL.svg} +14 -14
  3. package/{dist/assets → assets}/database.svg +11 -11
  4. package/{src/modules/database/assets → assets}/database_add.svg +53 -53
  5. package/{dist/assets → assets}/database_connect.svg +66 -66
  6. package/{dist/assets → assets}/database_upload.svg +29 -29
  7. package/{dist/assets → assets}/defaultWeLogo.svg +14 -14
  8. package/{dist/assets/index-DIm7RgkM.js → assets/index-D-dGaGjW.js} +93 -279
  9. package/assets/index-ldqIbm0x.js +1289 -0
  10. package/assets/style.css +1 -0
  11. package/assets/style3.css +1 -0
  12. package/{dist/chat.js → chat.js} +78 -78
  13. package/database.js +20 -0
  14. package/{dist/databaseId.js → databaseId.js} +1 -1
  15. package/{dist/databaseTable.js → databaseTable.js} +1 -1
  16. package/{dist/modelManage.js → modelManage.js} +1 -1
  17. package/package.json +39 -83
  18. package/{dist/sensitive.js → sensitive.js} +1 -1
  19. package/{dist/streamFilesReader.js → streamFilesReader.js} +11 -11
  20. package/{dist/worker → worker}/pdf.worker.min.js +21 -21
  21. package/.editorconfig +0 -38
  22. package/.prettierignore +0 -16
  23. package/.prettierrc +0 -17
  24. package/USAGE.md +0 -191
  25. package/bash.exe.stackdump +0 -40
  26. package/components.json +0 -21
  27. package/dist/README.md +0 -129
  28. package/dist/assets/database_add.svg +0 -53
  29. package/dist/assets/index-Bpnc4tRH.js +0 -1284
  30. package/dist/assets/style.css +0 -1
  31. package/dist/assets/style3.css +0 -1
  32. package/dist/database.js +0 -20
  33. package/dist/package.json +0 -56
  34. package/doc_assets/2.png +0 -0
  35. package/doc_assets/demo.md +0 -27
  36. package/doc_assets/demos/dist-app/assets/index.Dh-ZAS9Z.css +0 -2
  37. package/doc_assets/demos/dist-app/assets/index.Dv8KVW18.js +0 -23699
  38. package/doc_assets/demos/dist-app/assets/index.Dv8KVW18.js.map +0 -1
  39. package/doc_assets/demos/dist-app/index.html +0 -14
  40. package/doc_assets/demos/dist-app/vite.svg +0 -1
  41. package/doc_assets/images/1.png +0 -0
  42. package/doc_assets/images/3.png +0 -0
  43. package/doc_assets/images/component-screenshot.png +0 -1
  44. package/doc_assets/install.md +0 -5
  45. package/eslint.config.js +0 -92
  46. package/index.html +0 -13
  47. package/postcss.config.cjs +0 -19
  48. package/public/vite.svg +0 -1
  49. package/public/worker/pdf.worker.min.js +0 -22
  50. package/scripts/README.md +0 -133
  51. package/scripts/build-demo.js +0 -88
  52. package/scripts/demo-selector.js +0 -216
  53. package/scripts/dev-demo.js +0 -76
  54. package/scripts/preview-demo.js +0 -130
  55. package/scripts/run-demo.bat +0 -34
  56. package/src/assets/img/downArrow.png +0 -0
  57. package/src/assets/img/excel.png +0 -0
  58. package/src/assets/img/img.png +0 -0
  59. package/src/assets/img/pdf.png +0 -0
  60. package/src/assets/img/ppt.png +0 -0
  61. package/src/assets/img/txt.png +0 -0
  62. package/src/assets/img/word.png +0 -0
  63. package/src/assets/login/homeBg.png +0 -0
  64. package/src/assets/login/left.jpg +0 -0
  65. package/src/assets/login/logoImg.png +0 -0
  66. package/src/examples/LoginPage/index.tsx +0 -18
  67. package/src/examples/chat/components/DrawerGraphPreview.tsx +0 -77
  68. package/src/examples/chat/index.tsx +0 -179
  69. package/src/examples/gientechStreamFilesReader/index.tsx +0 -1016
  70. package/src/examples/ragDatabaseDataPage/index.tsx +0 -36
  71. package/src/examples/ragDatabaseIdPage/index.tsx +0 -44
  72. package/src/examples/ragDatabasePage/index.tsx +0 -36
  73. package/src/examples/ragModelManagePage/index.tsx +0 -37
  74. package/src/examples/ragSearchPage/index.tsx +0 -0
  75. package/src/examples/ragSensitiveWordsPage/index.tsx +0 -32
  76. package/src/examples/streamFiles/index.tsx +0 -384
  77. package/src/lib_enter.ts +0 -38
  78. package/src/main.tsx +0 -5
  79. package/src/main.tsx.backup +0 -5
  80. package/src/modules/chat/Conversations/Item.tsx +0 -167
  81. package/src/modules/chat/Conversations/List.tsx +0 -143
  82. package/src/modules/chat/Conversations/groupByTime.ts +0 -39
  83. package/src/modules/chat/Conversations/index.tsx +0 -212
  84. package/src/modules/chat/constants.tsx +0 -33
  85. package/src/modules/chat/index.tsx +0 -1836
  86. package/src/modules/chat/types.ts +0 -17
  87. package/src/modules/database/CreateModal.tsx +0 -398
  88. package/src/modules/database/assets/Doris.png +0 -0
  89. package/src/modules/database/assets/PostgreSQL.png +0 -0
  90. package/src/modules/database/assets/SQLServer.png +0 -0
  91. package/src/modules/database/assets/database.svg +0 -11
  92. package/src/modules/database/assets/database_connect.svg +0 -66
  93. package/src/modules/database/assets/database_upload.svg +0 -29
  94. package/src/modules/database/assets/empty.png +0 -0
  95. package/src/modules/database/assets/mysql.svg +0 -14
  96. package/src/modules/database/index.tsx +0 -466
  97. package/src/modules/database/server.ts +0 -196
  98. package/src/modules/databaseId/CustomCom.tsx +0 -156
  99. package/src/modules/databaseId/EditConfig.tsx +0 -268
  100. package/src/modules/databaseId/UploadDrawer.tsx +0 -520
  101. package/src/modules/databaseId/assets/aiOptimize.svg +0 -10
  102. package/src/modules/databaseId/assets/empty.png +0 -0
  103. package/src/modules/databaseId/assets/template.svg +0 -6
  104. package/src/modules/databaseId/assets/upload.svg +0 -9
  105. package/src/modules/databaseId/assets/useTemp.svg +0 -6
  106. package/src/modules/databaseId/index.tsx +0 -734
  107. package/src/modules/databaseId/server.ts +0 -286
  108. package/src/modules/databaseId/style.css +0 -5
  109. package/src/modules/databaseTable/EditRowDrawer.tsx +0 -119
  110. package/src/modules/databaseTable/index.tsx +0 -357
  111. package/src/modules/databaseTable/server.ts +0 -180
  112. package/src/modules/headlessChat/constants.tsx +0 -32
  113. package/src/modules/headlessChat/index.tsx +0 -1065
  114. package/src/modules/headlessChat/types.ts +0 -23
  115. package/src/modules/login/components/Login/LoginBox/index.tsx +0 -102
  116. package/src/modules/login/components/Login/RegisterBox/index.tsx +0 -180
  117. package/src/modules/login/components/Login/index.tsx +0 -100
  118. package/src/modules/login/index.tsx +0 -106
  119. package/src/modules/login/style.css +0 -3
  120. package/src/modules/login/useServices.ts +0 -53
  121. package/src/modules/login/utils.ts +0 -42
  122. package/src/modules/modelManage/ConfigDrawer.tsx +0 -249
  123. package/src/modules/modelManage/assets/empty.png +0 -0
  124. package/src/modules/modelManage/const.ts +0 -50
  125. package/src/modules/modelManage/index.tsx +0 -439
  126. package/src/modules/modelManage/server.ts +0 -185
  127. package/src/modules/nodegraph/index.tsx +0 -1
  128. package/src/modules/search/assets/Icon-history.svg +0 -8
  129. package/src/modules/search/assets/answerAwartar.png +0 -0
  130. package/src/modules/search/assets/doc.png +0 -0
  131. package/src/modules/search/assets/genera.gif +0 -0
  132. package/src/modules/search/assets/icon-robot.svg +0 -9
  133. package/src/modules/search/assets/icon-search-bar.svg +0 -14
  134. package/src/modules/search/assets/icon-sub-title.svg +0 -3
  135. package/src/modules/search/assets/icon-title.svg +0 -9
  136. package/src/modules/search/assets/icon-zoomOut.svg +0 -9
  137. package/src/modules/search/assets/iconAi.svg +0 -9
  138. package/src/modules/search/assets/pdf.png +0 -0
  139. package/src/modules/search/assets/ppt.png +0 -0
  140. package/src/modules/search/assets/search.svg +0 -3
  141. package/src/modules/search/assets/selected.svg +0 -4
  142. package/src/modules/search/assets/txt.png +0 -0
  143. package/src/modules/search/assets/xls.png +0 -0
  144. package/src/modules/search/components/AssisSelect.tsx +0 -137
  145. package/src/modules/search/components/Editor/ChatViewEditor.tsx +0 -261
  146. package/src/modules/search/components/Editor/aichat.css +0 -1
  147. package/src/modules/search/components/Editor/constant.ts +0 -13
  148. package/src/modules/search/components/Editor/index.tsx +0 -113
  149. package/src/modules/search/components/Editor/plugins/autofomatRules.ts +0 -332
  150. package/src/modules/search/components/Editor/plugins/convertImgPlugins.tsx +0 -20
  151. package/src/modules/search/components/Editor/plugins/createIndexes.tsx +0 -38
  152. package/src/modules/search/components/Editor/plugins/displayer.ts +0 -298
  153. package/src/modules/search/components/Editor/plugins/imageClick.tsx +0 -32
  154. package/src/modules/search/components/Editor/plugins/myplugin.tsx +0 -98
  155. package/src/modules/search/components/Editor/ui/avatar.tsx +0 -19
  156. package/src/modules/search/components/Editor/ui/blockquote-element.tsx +0 -21
  157. package/src/modules/search/components/Editor/ui/button.tsx +0 -58
  158. package/src/modules/search/components/Editor/ui/calendar.tsx +0 -68
  159. package/src/modules/search/components/Editor/ui/caption.tsx +0 -46
  160. package/src/modules/search/components/Editor/ui/checkbox.tsx +0 -27
  161. package/src/modules/search/components/Editor/ui/code-block-combobox.tsx +0 -188
  162. package/src/modules/search/components/Editor/ui/code-block-element.css +0 -434
  163. package/src/modules/search/components/Editor/ui/code-block-element.tsx +0 -39
  164. package/src/modules/search/components/Editor/ui/code-leaf.tsx +0 -24
  165. package/src/modules/search/components/Editor/ui/code-line-element.tsx +0 -10
  166. package/src/modules/search/components/Editor/ui/code-syntax-leaf.tsx +0 -21
  167. package/src/modules/search/components/Editor/ui/column-element.tsx +0 -30
  168. package/src/modules/search/components/Editor/ui/column-group-element.tsx +0 -94
  169. package/src/modules/search/components/Editor/ui/command.tsx +0 -75
  170. package/src/modules/search/components/Editor/ui/comment-avatar.tsx +0 -22
  171. package/src/modules/search/components/Editor/ui/comment-create-form.tsx +0 -37
  172. package/src/modules/search/components/Editor/ui/comment-item.tsx +0 -74
  173. package/src/modules/search/components/Editor/ui/comment-leaf.tsx +0 -49
  174. package/src/modules/search/components/Editor/ui/comment-more-dropdown.tsx +0 -42
  175. package/src/modules/search/components/Editor/ui/comment-reply-items.tsx +0 -22
  176. package/src/modules/search/components/Editor/ui/comment-resolve-button.tsx +0 -32
  177. package/src/modules/search/components/Editor/ui/comment-value.tsx +0 -34
  178. package/src/modules/search/components/Editor/ui/comments-popover.tsx +0 -63
  179. package/src/modules/search/components/Editor/ui/date-element.tsx +0 -83
  180. package/src/modules/search/components/Editor/ui/dialog.tsx +0 -63
  181. package/src/modules/search/components/Editor/ui/draggable.tsx +0 -177
  182. package/src/modules/search/components/Editor/ui/dropdown-menu.tsx +0 -180
  183. package/src/modules/search/components/Editor/ui/emoji-input-element.tsx +0 -85
  184. package/src/modules/search/components/Editor/ui/excalidraw-element.tsx +0 -28
  185. package/src/modules/search/components/Editor/ui/fixed-toolbar-buttons.tsx +0 -76
  186. package/src/modules/search/components/Editor/ui/fixed-toolbar.tsx +0 -8
  187. package/src/modules/search/components/Editor/ui/floating-toolbar-buttons.tsx +0 -51
  188. package/src/modules/search/components/Editor/ui/floating-toolbar.tsx +0 -77
  189. package/src/modules/search/components/Editor/ui/heading-element.tsx +0 -48
  190. package/src/modules/search/components/Editor/ui/highlight-leaf.tsx +0 -17
  191. package/src/modules/search/components/Editor/ui/hr-element.tsx +0 -30
  192. package/src/modules/search/components/Editor/ui/icons.tsx +0 -267
  193. package/src/modules/search/components/Editor/ui/image-element.tsx +0 -74
  194. package/src/modules/search/components/Editor/ui/inline-combobox.tsx +0 -368
  195. package/src/modules/search/components/Editor/ui/input.tsx +0 -25
  196. package/src/modules/search/components/Editor/ui/insert-dropdown-menu.tsx +0 -218
  197. package/src/modules/search/components/Editor/ui/kbd-leaf.tsx +0 -20
  198. package/src/modules/search/components/Editor/ui/link-element.tsx +0 -29
  199. package/src/modules/search/components/Editor/ui/link-floating-toolbar.tsx +0 -161
  200. package/src/modules/search/components/Editor/ui/list-element.tsx +0 -30
  201. package/src/modules/search/components/Editor/ui/mark-toolbar-button.tsx +0 -24
  202. package/src/modules/search/components/Editor/ui/media-embed-element.tsx +0 -133
  203. package/src/modules/search/components/Editor/ui/media-popover.tsx +0 -97
  204. package/src/modules/search/components/Editor/ui/mention-element.tsx +0 -43
  205. package/src/modules/search/components/Editor/ui/mention-input-element.tsx +0 -141
  206. package/src/modules/search/components/Editor/ui/mode-dropdown-menu.tsx +0 -93
  207. package/src/modules/search/components/Editor/ui/more-dropdown-menu.tsx +0 -67
  208. package/src/modules/search/components/Editor/ui/paragraph-element.tsx +0 -4
  209. package/src/modules/search/components/Editor/ui/placeholder.tsx +0 -52
  210. package/src/modules/search/components/Editor/ui/popover.tsx +0 -32
  211. package/src/modules/search/components/Editor/ui/resizable.tsx +0 -66
  212. package/src/modules/search/components/Editor/ui/separator.tsx +0 -25
  213. package/src/modules/search/components/Editor/ui/style.less +0 -12
  214. package/src/modules/search/components/Editor/ui/table-cell-element.tsx +0 -143
  215. package/src/modules/search/components/Editor/ui/table-element.tsx +0 -243
  216. package/src/modules/search/components/Editor/ui/table-row-element.tsx +0 -22
  217. package/src/modules/search/components/Editor/ui/tableValue.tsx +0 -135
  218. package/src/modules/search/components/Editor/ui/todo-list-element.tsx +0 -43
  219. package/src/modules/search/components/Editor/ui/toggle-element.tsx +0 -31
  220. package/src/modules/search/components/Editor/ui/toolbar.tsx +0 -157
  221. package/src/modules/search/components/Editor/ui/tooltip.tsx +0 -65
  222. package/src/modules/search/components/Editor/ui/turn-into-dropdown-menu.tsx +0 -160
  223. package/src/modules/search/components/Editor/ui/with-draggables.tsx +0 -175
  224. package/src/modules/search/components/FileList.tsx +0 -287
  225. package/src/modules/search/components/ImageGroupView/index.tsx +0 -85
  226. package/src/modules/search/components/ResultContent.tsx +0 -232
  227. package/src/modules/search/components/SearchInput.tsx +0 -232
  228. package/src/modules/search/components/SearchLanding.tsx +0 -74
  229. package/src/modules/search/components/SearchView.tsx +0 -563
  230. package/src/modules/search/components/SimpleEditor.tsx +0 -158
  231. package/src/modules/search/components/SimpleFileList.tsx +0 -215
  232. package/src/modules/search/index.tsx +0 -10
  233. package/src/modules/search/reademe.md +0 -1
  234. package/src/modules/search/servers/apis.tsx +0 -19
  235. package/src/modules/search/servers/index.ts +0 -184
  236. package/src/modules/search/style.less +0 -503
  237. package/src/modules/search/type.ts +0 -22
  238. package/src/modules/search/utils.ts +0 -34
  239. package/src/modules/sensitive/index.tsx +0 -313
  240. package/src/modules/sensitive/server.ts +0 -122
  241. package/src/modules/streamFilesReader/GientechStreamReader.tsx +0 -1555
  242. package/src/modules/streamFilesReader/components/Header/Toolbar.tsx +0 -0
  243. package/src/modules/streamFilesReader/components/Header/index.tsx +0 -297
  244. package/src/modules/streamFilesReader/index.tsx +0 -3
  245. package/src/style.css +0 -6
  246. package/src/type.d.ts +0 -0
  247. package/src/utils/commonFn.tsx +0 -111
  248. package/src/utils/gientechCommon/components/AppError.tsx +0 -32
  249. package/src/utils/gientechCommon/components/AppLoading.tsx +0 -75
  250. package/src/utils/gientechCommon/components/DeleteModal.tsx +0 -75
  251. package/src/utils/gientechCommon/components/DisplayError.tsx +0 -33
  252. package/src/utils/gientechCommon/components/DisplayLoading.tsx +0 -38
  253. package/src/utils/gientechCommon/components/FeedBackModal.tsx +0 -310
  254. package/src/utils/gientechCommon/components/FileCardCommon.tsx +0 -82
  255. package/src/utils/gientechCommon/components/FileManager/index.tsx +0 -390
  256. package/src/utils/gientechCommon/components/FileManager/style.css +0 -5
  257. package/src/utils/gientechCommon/components/Messages/GientechNewChatWelcome.tsx +0 -296
  258. package/src/utils/gientechCommon/components/Messages/ReferenceCard.tsx +0 -339
  259. package/src/utils/gientechCommon/components/Messages/RetriveItem.tsx +0 -245
  260. package/src/utils/gientechCommon/components/Messages/WebRetriveItem.tsx +0 -209
  261. package/src/utils/gientechCommon/components/Messages/defaultBot.png +0 -0
  262. package/src/utils/gientechCommon/components/Messages/defaultStyleSet.tsx +0 -148
  263. package/src/utils/gientechCommon/components/Messages/defaultWeLogo.svg +0 -14
  264. package/src/utils/gientechCommon/components/RenameModal.tsx +0 -86
  265. package/src/utils/gientechCommon/components/style.less +0 -11
  266. package/src/utils/gientechCommon/configs/commonConfig.ts +0 -2
  267. package/src/utils/gientechCommon/configs/senderConfig.ts +0 -0
  268. package/src/utils/gientechCommon/configs/stylesConfig.ts +0 -142
  269. package/src/utils/gientechCommon/hooks/AichatUseController.tsx +0 -339
  270. package/src/utils/gientechCommon/slate/converters/deserializers.ts +0 -763
  271. package/src/utils/gientechCommon/slate/converters/mockData.ts +0 -232
  272. package/src/utils/gientechCommon/slate/converters/slateConverters.ts +0 -258
  273. package/src/utils/gientechCommon/slate/richElements/index.tsx +0 -499
  274. package/src/utils/gientechCommon/utils/request.ts +0 -37
  275. package/src/utils/gientechCommon/utils/serverFn.ts +0 -172
  276. package/src/utils/index.tsx +0 -126
  277. package/src/utils/testconfigs/demologin/index.tsx +0 -32
  278. package/src/utils/testconfigs/index.ts +0 -53
  279. package/src/vite-env.d.ts +0 -11
  280. package/stats.html +0 -4949
  281. package/tailwind.config.js +0 -170
  282. package/tsconfig.app.json +0 -30
  283. package/tsconfig.app.tsbuildinfo +0 -11
  284. package/tsconfig.json +0 -13
  285. package/tsconfig.node.json +0 -22
  286. package/tsconfig.node.tsbuildinfo +0 -1
  287. package/vite.config.ts +0 -177
  288. package/workflows/release.yml +0 -60
  289. /package/{dist/assets → assets}/Doris.png +0 -0
  290. /package/{dist/assets → assets}/PostgreSQL.png +0 -0
  291. /package/{dist/assets → assets}/SQLServer.png +0 -0
  292. /package/{dist/assets → assets}/_commonjsHelpers-gnU0ypJ3.js +0 -0
  293. /package/{dist/assets → assets}/circle-alert-g2Y6zAjt.js +0 -0
  294. /package/{dist/assets → assets}/empty.png +0 -0
  295. /package/{dist/assets → assets}/index-CEK88UzR.js +0 -0
  296. /package/{dist/assets → assets}/index-CpW6Dhpp.js +0 -0
  297. /package/{dist/assets → assets}/plus-omCUN0e3.js +0 -0
  298. /package/{dist/assets → assets}/style2.css +0 -0
  299. /package/{dist/assets → assets}/styled-components.browser.esm-DPkS13KC.js +0 -0
  300. /package/{dist/assets → assets}/x-vPcWt3fC.js +0 -0
  301. /package/{dist/chat.d.ts → chat.d.ts} +0 -0
  302. /package/{dist/database.d.ts → database.d.ts} +0 -0
  303. /package/{dist/databaseId.d.ts → databaseId.d.ts} +0 -0
  304. /package/{dist/databaseTable.d.ts → databaseTable.d.ts} +0 -0
  305. /package/{dist/modelManage.d.ts → modelManage.d.ts} +0 -0
  306. /package/{dist/sensitive.d.ts → sensitive.d.ts} +0 -0
  307. /package/{dist/streamFilesReader.d.ts → streamFilesReader.d.ts} +0 -0
  308. /package/{dist/vite.svg → vite.svg} +0 -0
@@ -1,763 +0,0 @@
1
- import { marked } from 'marked';
2
- import type {
3
- CustomElement,
4
- CustomText,
5
- ParagraphElement,
6
- HeadingOneElement,
7
- HeadingTwoElement,
8
- ListElement,
9
- ListItemElement,
10
- BaseElement,
11
- CodeBlockElement,
12
- HeadingThreeElement,
13
- BlockQuoteElement,
14
- TableElement,
15
- TableRowElement,
16
- TableCellElement,
17
- } from './slateConverters';
18
-
19
- // 新增think类型
20
- export interface ThinkElement extends BaseElement {
21
- type: 'think';
22
- }
23
-
24
- function ensureChildren(elements: CustomElement[]): CustomElement[] {
25
- return elements.map(el => {
26
- if (!el.children || el.children.length === 0) {
27
- return { ...el, children: [{ text: '' }] };
28
- }
29
- return {
30
- ...el,
31
- children: el.children.map(child => {
32
- if (typeof child === 'object' && 'type' in child) {
33
- return ensureChildren([child as CustomElement])[0];
34
- }
35
- return child;
36
- }),
37
- };
38
- });
39
- }
40
- function getContentAfterThinkTag(text: string) {
41
- if (text.indexOf('<think>') > -1) {
42
- if (text.indexOf('</think>') > -1) {
43
- const closedThinkRegex = /<think>([\s\S]*?)<\/think>([\s\S]*)/s;
44
- const match = text.match(closedThinkRegex);
45
- if (match) {
46
- return {
47
- thinkContent: match[1],
48
- content: match[2],
49
- finish: true,
50
- };
51
- } else {
52
- return {
53
- thinkContent: '',
54
- content: text,
55
- finish: true,
56
- };
57
- }
58
- } else {
59
- const closedThinkRegex2 = /<think>(.*?)(?=<|\s*$)/s;
60
- const match2 = text.match(closedThinkRegex2);
61
- return { thinkContent: match2?.[1] || '', content: '' };
62
- }
63
- } else {
64
- return {
65
- thinkContent: '',
66
- content: text,
67
- };
68
- }
69
- }
70
- export function deserializeMarkdown(markdown: string, respTime?: number): CustomElement[] {
71
- // 先全局处理 retrive-tag
72
- markdown = markdown.replace(
73
- /\[retrive-tag([^\]]*)\]\[([\s\S]*?)\]\[\/retrive-tag\]/g,
74
- (match, attrs, inner) => `<retrive-tag${attrs ? ' ' + attrs.trim() : ''}>${inner}</retrive-tag>`
75
- );
76
-
77
- // 1. 用正则分割出 <think>...</think> 和普通 markdown 块
78
- // const blocks: { type: 'think' | 'markdown', content: string }[] = [];
79
- // let lastIndex = 0;
80
- // const thinkRegex = /<think>([\s\S]*?)<\/think>/g;
81
- // let match;
82
- // while ((match = thinkRegex.exec(markdown)) !== null) {
83
- // if (match.index > lastIndex) {
84
- // blocks.push({ type: 'markdown', content: markdown.slice(lastIndex, match.index) });
85
- // }
86
- // blocks.push({ type: 'think', content: match[1] });
87
- // lastIndex = thinkRegex.lastIndex;
88
- // }
89
- // if (lastIndex < markdown.length) {
90
- // blocks.push({ type: 'markdown', content: markdown.slice(lastIndex) });
91
- // }
92
- const blocks: { type: 'think' | 'markdown'; content: string; respTime?: number }[] = [];
93
- const { thinkContent, content, finish } = getContentAfterThinkTag(markdown || '');
94
-
95
- blocks.push({ type: 'think', content: thinkContent, respTime });
96
- blocks.push({ type: 'markdown', content });
97
- // 2. 分别处理每个块
98
- let results: CustomElement[] = [];
99
- let thinkId = 0;
100
- // 新增:收集retrive-tag id顺序
101
- const retriveTagOrder: string[] = [];
102
- const retriveTagSet = new Set<string>();
103
- // 包装原有的递归,收集id
104
- function collectRetriveTagIds(nodes: any[]) {
105
- for (const node of nodes) {
106
- if (node && typeof node === 'object') {
107
- if (Array.isArray(node)) {
108
- collectRetriveTagIds(node);
109
- } else {
110
- if (node.retrive && node.id && !retriveTagSet.has(node.id)) {
111
- retriveTagOrder.push(node.id);
112
- retriveTagSet.add(node.id);
113
- }
114
- if (node.children) collectRetriveTagIds(node.children);
115
- }
116
- }
117
- }
118
- }
119
- for (const block of blocks) {
120
- if (block.type === 'think') {
121
- // think 块分行,遇到 retrive-tag 用 DOM 解析
122
- const lines = block.content
123
- .split(/\n+/)
124
- .map(line => line.trim())
125
- .filter(Boolean);
126
- const children = lines.flatMap(line => {
127
- if (/<retrive-tag/i.test(line)) {
128
- const div = document.createElement('div');
129
- div.innerHTML = line;
130
- return deserializeHtmlNode(div, respTime);
131
- } else {
132
- // 保证类型一致,包装为 ParagraphElement
133
- return [{ type: 'paragraph', children: [{ text: line }] } as ParagraphElement];
134
- }
135
- });
136
- // console.log('think AST:', {
137
- // type: 'think',
138
- // children,
139
- // });
140
- results.push({
141
- type: 'think',
142
- id: `think-${thinkId++}`,
143
- thinkContent,
144
- finish,
145
- children,
146
- } as any);
147
- } else {
148
- // 其它 markdown 块用 marked 解析
149
- marked.setOptions({ gfm: true, breaks: true, pedantic: false });
150
- let html = marked(block.content);
151
- if (typeof html !== 'string') {
152
- html = '';
153
- }
154
- const div = document.createElement('div');
155
- div.innerHTML = html;
156
- const part = deserializeHtmlNode(div, respTime);
157
- if (part && part.length > 0) {
158
- results = results.concat(part);
159
- }
160
- }
161
- }
162
- // 收集所有retrive-tag id顺序
163
- collectRetriveTagIds(results);
164
- // 生成编号映射
165
- const retriveTagIndexMap: Record<string, number> = {};
166
- retriveTagOrder.forEach((id, idx) => {
167
- retriveTagIndexMap[id] = idx + 1;
168
- });
169
- // 新增:递归给每个retrive-tag节点赋值indexId
170
- function assignRetriveTagIndexId(nodes: any[]) {
171
- for (const node of nodes) {
172
- if (node && typeof node === 'object') {
173
- if (Array.isArray(node)) {
174
- assignRetriveTagIndexId(node);
175
- } else {
176
- if (node.retrive && node.id && retriveTagIndexMap[node.id]) {
177
- node.indexId = retriveTagIndexMap[node.id];
178
- }
179
- if (node.children) assignRetriveTagIndexId(node.children);
180
- }
181
- }
182
- }
183
- }
184
- assignRetriveTagIndexId(results);
185
- // 挂载到AST根节点
186
- (results as any)._retriveTagIndexMap = retriveTagIndexMap;
187
- // 保证返回值始终为非空数组,且所有节点children非空
188
- if (!results || results.length === 0) {
189
- return [{ type: 'paragraph', children: [{ text: '' }] } as ParagraphElement];
190
- }
191
- //console.log('deserializeMarkdown 返回 AST:', results);
192
- return ensureChildren(results);
193
- }
194
-
195
- function deserializeHtmlNode(node: Node, respTime?: number): CustomElement[] {
196
- const elements: CustomElement[] = [];
197
-
198
- const deNodes = (elements: CustomElement[], nodeList: NodeListOf<ChildNode>) => {
199
- nodeList.forEach((child: any) => {
200
- if (child.nodeType === Node.ELEMENT_NODE) {
201
- const el = child as HTMLElement;
202
- let result;
203
- switch (el.tagName && el.tagName.toLowerCase()) {
204
- case 'p': {
205
- // 如果 <p> 只包含一个 <think>,则直接提升为 think 节点
206
- const onlyChild = el.childNodes.length === 1 ? el.childNodes[0] : null;
207
- if (
208
- onlyChild &&
209
- onlyChild.nodeType === Node.ELEMENT_NODE &&
210
- (onlyChild as HTMLElement).tagName.toLowerCase() === 'think'
211
- ) {
212
- // 直接递归 think,不包 paragraph
213
- result = deserializeChildren(el)[0];
214
- } else {
215
- result = {
216
- type: 'paragraph',
217
- children: deserializeChildren(el),
218
- } as ParagraphElement;
219
- }
220
- break;
221
- }
222
- case 'h1':
223
- result = {
224
- type: 'heading-one',
225
- children: deserializeChildren(el),
226
- } as HeadingOneElement;
227
- break;
228
- case 'h2':
229
- result = {
230
- type: 'heading-two',
231
- children: deserializeChildren(el),
232
- } as HeadingTwoElement;
233
- break;
234
- case 'h3':
235
- result = {
236
- type: 'heading-three',
237
- children: deserializeChildren(el),
238
- } as HeadingThreeElement;
239
- break;
240
- case 'ul':
241
- case 'ol': {
242
- // 递归 deNodes,让 li 的 case 统一处理
243
- let listChildren: CustomElement[] = [];
244
- deNodes(listChildren, el.childNodes);
245
- result = {
246
- type: el.tagName.toLowerCase() === 'ul' ? 'bulleted-list' : 'numbered-list',
247
- children: listChildren,
248
- } as ListElement;
249
- break;
250
- }
251
- case 'li':
252
- case 'LI': {
253
- // 判断 li 里是否有 block 元素
254
- const hasBlock = Array.from(el.childNodes).some(child => {
255
- if (child.nodeType !== Node.ELEMENT_NODE) return false;
256
- const tag = (child as HTMLElement).tagName?.toUpperCase?.();
257
- return tag === 'UL' || tag === 'OL' || tag === 'P';
258
- });
259
- let children: (CustomText | CustomElement)[];
260
- if (hasBlock) {
261
- // 直接递归所有子节点
262
- children = el.childNodes
263
- ? Array.from(el.childNodes).flatMap(child => processNode(child, {}))
264
- : [];
265
- } else {
266
- // 包一层 paragraph
267
- children = [
268
- {
269
- type: 'paragraph',
270
- children: (el.childNodes
271
- ? Array.from(el.childNodes).flatMap(child => processNode(child, {}))
272
- : [{ text: '' }]) as (CustomText | CustomElement)[],
273
- },
274
- ];
275
- }
276
- result = {
277
- type: 'list-item',
278
- children: children as (CustomText | CustomElement)[],
279
- };
280
- break;
281
- }
282
- case 'pre': {
283
- const codeEl = el.querySelector('code');
284
- if (codeEl) {
285
- result = {
286
- type: 'code-block',
287
- children: [{ text: codeEl.textContent || '' }],
288
- } as any;
289
- } else {
290
- result = {
291
- type: 'code-block',
292
- children: [{ text: el.textContent || '' }],
293
- } as any;
294
- }
295
- break;
296
- }
297
- case 'code': {
298
- if (!el.closest('pre')) {
299
- result = {
300
- type: 'paragraph',
301
- children: [{ text: el.textContent || '', code: true }],
302
- } as ParagraphElement;
303
- }
304
- break;
305
- }
306
- case 'blockquote':
307
- result = {
308
- type: 'block-quote',
309
- children: deserializeChildren(el),
310
- } as BlockQuoteElement;
311
- break;
312
- case 'table':
313
- result = deserializeTable(el);
314
- break;
315
- case 'think':
316
- // 这里不再递归,直接跳过,由上层处理
317
- return;
318
- case 'retrive-tag': {
319
- const id = el.getAttribute('id') || undefined;
320
- const text = el.textContent || '';
321
- result = [{ text, retrive: true, id }];
322
- break;
323
- }
324
- case 'span':
325
- case 'div': {
326
- // flatten 所有子节点
327
- let result: (CustomText | BaseElement)[] = [];
328
- for (const child of Array.from(el.childNodes)) {
329
- result = result.concat(processNode(child, {}));
330
- }
331
- return result;
332
- }
333
- default:
334
- result = {
335
- type: 'paragraph',
336
- children: deserializeChildren(el),
337
- } as ParagraphElement;
338
- break;
339
- }
340
- if (Array.isArray(result)) {
341
- result.forEach(item => {
342
- if ('text' in item && !('type' in item)) {
343
- if (elements.length === 0) {
344
- elements.push({ type: 'paragraph', children: [item] } as ParagraphElement);
345
- } else {
346
- const last = elements[elements.length - 1];
347
- if (Array.isArray(last.children)) {
348
- last.children.push(item);
349
- }
350
- }
351
- } else {
352
- elements.push(item);
353
- }
354
- });
355
- } else if (result) {
356
- elements.push(result);
357
- }
358
- } else if (child.nodeType === Node.TEXT_NODE && child.textContent?.trim()) {
359
- elements.push({
360
- type: 'paragraph',
361
- children: [{ text: child.textContent }],
362
- } as ParagraphElement);
363
- }
364
- });
365
- return elements;
366
- };
367
- deNodes(elements, node.childNodes);
368
- // console.log('elements:', elements)
369
- return elements;
370
- }
371
-
372
- // 将 processNode 提升到 deserializeChildren 外部作用域
373
- function processNode(node: Node, styles: Partial<CustomText> = {}): (CustomText | CustomElement)[] {
374
- if (node.nodeType === Node.TEXT_NODE) {
375
- const text = node.textContent?.trim();
376
- if (text) {
377
- if (styles.code) {
378
- // 如果是行内代码,解析其中的 Markdown 样式
379
- return parseInlineCodeMarkdown(text);
380
- } else {
381
- return [{ text, ...styles }];
382
- }
383
- }
384
- return [];
385
- }
386
-
387
- if (node.nodeType === Node.ELEMENT_NODE) {
388
- const el = node as HTMLElement;
389
- const currentStyles = { ...styles };
390
-
391
- const tag = el.tagName?.toUpperCase?.() || '';
392
-
393
- if (tag === 'UL' || tag === 'OL') {
394
- return [
395
- {
396
- type: tag === 'UL' ? 'bulleted-list' : 'numbered-list',
397
- children: (el.childNodes
398
- ? Array.from(el.childNodes).flatMap(child => processNode(child, {}))
399
- : []) as (CustomText | CustomElement)[],
400
- },
401
- ];
402
- }
403
- if (tag === 'LI') {
404
- // 判断 li 里是否有 block 元素
405
- const hasBlock = Array.from(el.childNodes).some(child => {
406
- if (child.nodeType !== Node.ELEMENT_NODE) return false;
407
- const tag = (child as HTMLElement).tagName?.toUpperCase?.();
408
- return tag === 'UL' || tag === 'OL' || tag === 'P';
409
- });
410
- let children: (CustomText | CustomElement)[];
411
- if (hasBlock) {
412
- // 直接递归所有子节点
413
- children = el.childNodes
414
- ? Array.from(el.childNodes).flatMap(child => processNode(child, {}))
415
- : [];
416
- } else {
417
- // 包一层 paragraph
418
- children = [
419
- {
420
- type: 'paragraph',
421
- children: (el.childNodes
422
- ? Array.from(el.childNodes).flatMap(child => processNode(child, {}))
423
- : [{ text: '' }]) as (CustomText | CustomElement)[],
424
- },
425
- ];
426
- }
427
- return [
428
- {
429
- type: 'list-item',
430
- children: children as (CustomText | CustomElement)[],
431
- },
432
- ];
433
- }
434
- if (tag === 'TABLE') {
435
- return [
436
- {
437
- type: 'table',
438
- children: (el.childNodes
439
- ? Array.from(el.childNodes).flatMap(child => processNode(child, {}))
440
- : []) as (CustomText | CustomElement)[],
441
- },
442
- ];
443
- }
444
- if (tag === 'THEAD' || tag === 'TBODY') {
445
- return (
446
- el.childNodes ? Array.from(el.childNodes).flatMap(child => processNode(child, {})) : []
447
- ) as (CustomText | CustomElement)[];
448
- }
449
- if (tag === 'TR') {
450
- return [
451
- {
452
- type: 'table-row',
453
- children: (el.childNodes
454
- ? Array.from(el.childNodes).flatMap(child => processNode(child, {}))
455
- : []) as (CustomText | CustomElement)[],
456
- },
457
- ];
458
- }
459
- if (tag === 'TD') {
460
- return [
461
- {
462
- type: 'table-cell',
463
- children: (el.childNodes
464
- ? Array.from(el.childNodes).flatMap(child => processNode(child, {}))
465
- : [{ text: '' }]) as (CustomText | CustomElement)[],
466
- },
467
- ];
468
- }
469
- if (tag === 'TH') {
470
- return [
471
- {
472
- type: 'table-cell',
473
- header: true,
474
- children: (el.childNodes
475
- ? Array.from(el.childNodes).flatMap(child => processNode(child, {}))
476
- : [{ text: '' }]) as (CustomText | CustomElement)[],
477
- },
478
- ];
479
- }
480
- if (tag === 'THINK') {
481
- return [
482
- {
483
- type: 'think',
484
- children: (el.childNodes
485
- ? Array.from(el.childNodes).flatMap(child => processNode(child, {}))
486
- : []) as (CustomText | CustomElement)[],
487
- } as any,
488
- ];
489
- }
490
- if (tag === 'RETRIVE-TAG') {
491
- // 收集所有 attribute
492
- const attrs: Record<string, any> = {};
493
- for (const attr of Array.from(el.attributes)) {
494
- // 兼容 image_urls 自动转数组
495
- if (attr.name === 'image_urls') {
496
- attrs.imageUrls = attr.value ? attr.value.split(';').map((s: string) => s.trim()).filter(Boolean) : [];
497
- attrs.image_urls = attr.value; // 保留原始
498
- } else {
499
- attrs[attr.name] = attr.value;
500
- }
501
- }
502
- const children = el.childNodes
503
- ? Array.from(el.childNodes).flatMap(child => {
504
- const nodes = processNode(child, {});
505
- return nodes.map(n =>
506
- typeof n === 'object' && 'text' in n ? { ...n, retrive: true, ...attrs } : n
507
- );
508
- })
509
- : [{ text: '', retrive: true, ...attrs }];
510
- return children as (CustomText | CustomElement)[];
511
- }
512
- // 兜底:未知标签递归其所有子节点
513
- if (el.childNodes && el.childNodes.length > 0) {
514
- return Array.from(el.childNodes).flatMap(child => processNode(child, {})) as (
515
- | CustomText
516
- | CustomElement
517
- )[];
518
- }
519
-
520
- switch (tag) {
521
- case 'EM':
522
- case 'I':
523
- currentStyles.italic = true;
524
- break;
525
- case 'STRONG':
526
- case 'B':
527
- currentStyles.bold = true;
528
- break;
529
- case 'CODE':
530
- if (!el.closest('pre')) {
531
- currentStyles.code = true;
532
- }
533
- break;
534
- case 'DEL':
535
- case 'S':
536
- currentStyles.strikethrough = true;
537
- break;
538
- case 'U':
539
- currentStyles.underline = true;
540
- break;
541
- case 'A':
542
- currentStyles.link = el.getAttribute('href') || undefined;
543
- break;
544
- case 'SPAN':
545
- case 'DIV': {
546
- // flatten 所有子节点
547
- let result: (CustomText | CustomElement)[] = [];
548
- for (const child of Array.from(el.childNodes)) {
549
- result = result.concat(processNode(child, {}));
550
- }
551
- return result;
552
- }
553
- default:
554
- break;
555
- }
556
- }
557
- return [];
558
- }
559
-
560
- // 解析行内代码中的 Markdown 样式
561
- function parseInlineCodeMarkdown(text: string): CustomText[] {
562
- const result: CustomText[] = [];
563
- let currentText = '';
564
- let isBold = false;
565
- let isItalic = false;
566
- let i = 0;
567
-
568
- while (i < text.length) {
569
- if (text.startsWith('**', i)) {
570
- // 处理加粗
571
- if (currentText) {
572
- result.push({
573
- text: currentText,
574
- code: true,
575
- bold: isBold,
576
- italic: isItalic,
577
- });
578
- currentText = '';
579
- }
580
- isBold = !isBold;
581
- i += 2;
582
- } else if (text.startsWith('*', i)) {
583
- // 处理斜体
584
- if (currentText) {
585
- result.push({
586
- text: currentText,
587
- code: true,
588
- bold: isBold,
589
- italic: isItalic,
590
- });
591
- currentText = '';
592
- }
593
- isItalic = !isItalic;
594
- i += 1;
595
- } else {
596
- currentText += text[i];
597
- i += 1;
598
- }
599
- }
600
-
601
- if (currentText) {
602
- result.push({
603
- text: currentText,
604
- code: true,
605
- bold: isBold,
606
- italic: isItalic,
607
- });
608
- }
609
-
610
- return result;
611
- }
612
-
613
- // 保持 processNode 和 deserializeChildren 的实现
614
- function deserializeChildren(node: Node): (CustomText | BaseElement)[] {
615
- const texts: (CustomText | BaseElement)[] = [];
616
-
617
- for (const child of Array.from(node.childNodes)) {
618
- texts.push(...processNode(child));
619
- }
620
-
621
- return texts;
622
- }
623
-
624
- function deserializeTable(tableEl: HTMLElement): TableElement {
625
- const rows: TableRowElement[] = [];
626
-
627
- // 处理表头
628
- const thead = tableEl.querySelector('thead');
629
- const tbody = tableEl.querySelector('tbody');
630
-
631
- // 如果没有 thead 和 tbody,说明是简单表格,需要自动添加结构
632
- if (!thead && !tbody) {
633
- const allRows = Array.from(tableEl.querySelectorAll('tr'));
634
- if (allRows.length > 0) {
635
- // 第一行作为表头
636
- rows.push({
637
- type: 'table-row',
638
- children: Array.from(allRows[0].children).map(
639
- cell =>
640
- ({
641
- type: 'table-cell',
642
- header: true,
643
- children: deserializeChildren(cell),
644
- }) as TableCellElement
645
- ),
646
- } as TableRowElement);
647
-
648
- // 剩余行作为表格主体
649
- allRows.slice(1).forEach(tr => {
650
- rows.push({
651
- type: 'table-row',
652
- children: Array.from(tr.children).map(
653
- cell =>
654
- ({
655
- type: 'table-cell',
656
- header: false,
657
- children: deserializeChildren(cell),
658
- }) as TableCellElement
659
- ),
660
- } as TableRowElement);
661
- });
662
- }
663
- } else {
664
- // 处理表头
665
- if (thead) {
666
- const headerRow = thead.querySelector('tr');
667
- if (headerRow) {
668
- rows.push({
669
- type: 'table-row',
670
- children: Array.from(headerRow.querySelectorAll('th')).map(
671
- cell =>
672
- ({
673
- type: 'table-cell',
674
- header: true,
675
- children: deserializeChildren(cell),
676
- }) as TableCellElement
677
- ),
678
- } as TableRowElement);
679
- }
680
- }
681
-
682
- // 处理表格主体
683
- if (tbody) {
684
- Array.from(tbody.querySelectorAll('tr')).forEach(tr => {
685
- rows.push({
686
- type: 'table-row',
687
- children: Array.from(tr.querySelectorAll('td')).map(
688
- cell =>
689
- ({
690
- type: 'table-cell',
691
- header: false,
692
- children: deserializeChildren(cell),
693
- }) as TableCellElement
694
- ),
695
- } as TableRowElement);
696
- });
697
- }
698
- }
699
-
700
- return {
701
- type: 'table',
702
- children: rows,
703
- } as TableElement;
704
- }
705
-
706
- function mergeHeadingAndList(html: string): string {
707
- const div = document.createElement('div');
708
- div.innerHTML = html;
709
- let nodes = Array.from(div.childNodes);
710
- let i = 0;
711
- while (i < nodes.length - 1) {
712
- const cur = nodes[i];
713
- const next = nodes[i + 1];
714
- // 支持 h2/h3/h4 + ul/ol/p/blockquote/pre
715
- if (
716
- cur.nodeType === 1 &&
717
- ['H2', 'H3', 'H4'].includes((cur as HTMLElement).tagName) &&
718
- next.nodeType === 1 &&
719
- ['UL', 'OL', 'P', 'BLOCKQUOTE', 'PRE'].includes((next as HTMLElement).tagName)
720
- ) {
721
- // 创建 li
722
- const li = document.createElement('li');
723
- li.appendChild(cur.cloneNode(true));
724
- li.appendChild(next.cloneNode(true));
725
- // 检查后续是否还有连续的 ul/ol/p/blockquote/pre
726
- let j = i + 2;
727
- while (
728
- j < nodes.length &&
729
- nodes[j].nodeType === 1 &&
730
- ['UL', 'OL', 'P', 'BLOCKQUOTE', 'PRE'].includes((nodes[j] as HTMLElement).tagName)
731
- ) {
732
- li.appendChild(nodes[j].cloneNode(true));
733
- j++;
734
- }
735
- // 查找前面的 ol,没有就新建
736
- let ol = null;
737
- for (let k = i - 1; k >= 0; k--) {
738
- if (nodes[k].nodeType === 1 && (nodes[k] as HTMLElement).tagName === 'OL') {
739
- ol = nodes[k];
740
- break;
741
- }
742
- }
743
- if (!ol) {
744
- ol = document.createElement('ol');
745
- div.insertBefore(ol, cur);
746
- nodes = Array.from(div.childNodes);
747
- i = nodes.indexOf(ol);
748
- }
749
- ol.appendChild(li);
750
- // 移除原 h2/h3/h4 和后续所有连续的 ul/ol/p/blockquote/pre
751
- div.removeChild(cur);
752
- div.removeChild(next);
753
- for (let k = i + 1; k < j - 1; k++) {
754
- div.removeChild(nodes[k + 1]);
755
- }
756
- // 重新获取 nodes
757
- nodes = Array.from(div.childNodes);
758
- i = -1; // 重新遍历
759
- }
760
- i++;
761
- }
762
- return div.innerHTML;
763
- }