@gientech/modual 1.3.3 → 1.3.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 (307) hide show
  1. package/README.md +129 -129
  2. package/{dist/assets → assets}/database.svg +11 -11
  3. package/{src/modules/database/assets → assets}/database_add.svg +53 -53
  4. package/{dist/assets → assets}/database_connect.svg +66 -66
  5. package/{dist/assets → assets}/database_upload.svg +29 -29
  6. package/{dist/assets → assets}/defaultWeLogo.svg +14 -14
  7. package/{dist/assets/index-mPgEc8KC.js → assets/index-CDNF071H.js} +38 -38
  8. package/{dist/assets/index-XvC_4jDB.js → assets/index-Ce4td48i.js} +20 -20
  9. package/{dist/assets → assets}/mysql.svg +14 -14
  10. package/{dist/chat.js → chat.js} +2 -2
  11. package/database.js +20 -0
  12. package/{dist/databaseId.js → databaseId.js} +1 -1
  13. package/{dist/databaseTable.js → databaseTable.js} +1 -1
  14. package/{dist/modelManage.js → modelManage.js} +1 -1
  15. package/package.json +39 -83
  16. package/{dist/sensitive.js → sensitive.js} +1 -1
  17. package/{dist/streamFilesReader.js → streamFilesReader.js} +10 -10
  18. package/{dist/worker → worker}/pdf.worker.min.js +21 -21
  19. package/.editorconfig +0 -38
  20. package/.prettierignore +0 -16
  21. package/.prettierrc +0 -17
  22. package/USAGE.md +0 -191
  23. package/bash.exe.stackdump +0 -40
  24. package/components.json +0 -21
  25. package/dist/README.md +0 -129
  26. package/dist/assets/database_add.svg +0 -53
  27. package/dist/database.js +0 -20
  28. package/dist/package.json +0 -56
  29. package/doc_assets/2.png +0 -0
  30. package/doc_assets/demo.md +0 -27
  31. package/doc_assets/demos/dist-app/assets/index.Dh-ZAS9Z.css +0 -2
  32. package/doc_assets/demos/dist-app/assets/index.Dv8KVW18.js +0 -23699
  33. package/doc_assets/demos/dist-app/assets/index.Dv8KVW18.js.map +0 -1
  34. package/doc_assets/demos/dist-app/index.html +0 -14
  35. package/doc_assets/demos/dist-app/vite.svg +0 -1
  36. package/doc_assets/images/1.png +0 -0
  37. package/doc_assets/images/3.png +0 -0
  38. package/doc_assets/images/component-screenshot.png +0 -1
  39. package/doc_assets/install.md +0 -5
  40. package/eslint.config.js +0 -92
  41. package/index.html +0 -13
  42. package/postcss.config.cjs +0 -19
  43. package/public/vite.svg +0 -1
  44. package/public/worker/pdf.worker.min.js +0 -22
  45. package/scripts/README.md +0 -133
  46. package/scripts/build-demo.js +0 -88
  47. package/scripts/demo-selector.js +0 -216
  48. package/scripts/dev-demo.js +0 -76
  49. package/scripts/preview-demo.js +0 -130
  50. package/scripts/run-demo.bat +0 -34
  51. package/src/assets/img/downArrow.png +0 -0
  52. package/src/assets/img/excel.png +0 -0
  53. package/src/assets/img/img.png +0 -0
  54. package/src/assets/img/pdf.png +0 -0
  55. package/src/assets/img/ppt.png +0 -0
  56. package/src/assets/img/txt.png +0 -0
  57. package/src/assets/img/word.png +0 -0
  58. package/src/assets/login/homeBg.png +0 -0
  59. package/src/assets/login/left.jpg +0 -0
  60. package/src/assets/login/logoImg.png +0 -0
  61. package/src/examples/LoginPage/index.tsx +0 -18
  62. package/src/examples/aaa/index.tsx +0 -3758
  63. package/src/examples/chat/components/DrawerGraphPreview.tsx +0 -78
  64. package/src/examples/chat/index.tsx +0 -190
  65. package/src/examples/gientechStreamFilesReader/index.tsx +0 -1016
  66. package/src/examples/ragDatabaseDataPage/index.tsx +0 -36
  67. package/src/examples/ragDatabaseIdPage/index.tsx +0 -44
  68. package/src/examples/ragDatabasePage/index.tsx +0 -36
  69. package/src/examples/ragModelManagePage/index.tsx +0 -37
  70. package/src/examples/ragSearchPage/index.tsx +0 -0
  71. package/src/examples/ragSensitiveWordsPage/index.tsx +0 -32
  72. package/src/examples/streamFiles/index.tsx +0 -384
  73. package/src/lib_enter.ts +0 -38
  74. package/src/main.tsx +0 -5
  75. package/src/main.tsx.backup +0 -5
  76. package/src/modules/chat/Conversations/Item.tsx +0 -167
  77. package/src/modules/chat/Conversations/List.tsx +0 -143
  78. package/src/modules/chat/Conversations/groupByTime.ts +0 -39
  79. package/src/modules/chat/Conversations/index.tsx +0 -212
  80. package/src/modules/chat/constants.tsx +0 -33
  81. package/src/modules/chat/data.txt +0 -82
  82. package/src/modules/chat/index.tsx +0 -1908
  83. package/src/modules/chat/types.ts +0 -17
  84. package/src/modules/database/CreateModal.tsx +0 -398
  85. package/src/modules/database/assets/Doris.png +0 -0
  86. package/src/modules/database/assets/PostgreSQL.png +0 -0
  87. package/src/modules/database/assets/SQLServer.png +0 -0
  88. package/src/modules/database/assets/database.svg +0 -11
  89. package/src/modules/database/assets/database_connect.svg +0 -66
  90. package/src/modules/database/assets/database_upload.svg +0 -29
  91. package/src/modules/database/assets/empty.png +0 -0
  92. package/src/modules/database/assets/mysql.svg +0 -14
  93. package/src/modules/database/index.tsx +0 -466
  94. package/src/modules/database/server.ts +0 -196
  95. package/src/modules/databaseId/CustomCom.tsx +0 -156
  96. package/src/modules/databaseId/EditConfig.tsx +0 -268
  97. package/src/modules/databaseId/UploadDrawer.tsx +0 -520
  98. package/src/modules/databaseId/assets/aiOptimize.svg +0 -10
  99. package/src/modules/databaseId/assets/empty.png +0 -0
  100. package/src/modules/databaseId/assets/template.svg +0 -6
  101. package/src/modules/databaseId/assets/upload.svg +0 -9
  102. package/src/modules/databaseId/assets/useTemp.svg +0 -6
  103. package/src/modules/databaseId/index.tsx +0 -734
  104. package/src/modules/databaseId/server.ts +0 -286
  105. package/src/modules/databaseId/style.css +0 -5
  106. package/src/modules/databaseTable/EditRowDrawer.tsx +0 -119
  107. package/src/modules/databaseTable/index.tsx +0 -357
  108. package/src/modules/databaseTable/server.ts +0 -180
  109. package/src/modules/headlessChat/constants.tsx +0 -32
  110. package/src/modules/headlessChat/index.tsx +0 -1065
  111. package/src/modules/headlessChat/types.ts +0 -23
  112. package/src/modules/login/components/Login/LoginBox/index.tsx +0 -102
  113. package/src/modules/login/components/Login/RegisterBox/index.tsx +0 -180
  114. package/src/modules/login/components/Login/index.tsx +0 -100
  115. package/src/modules/login/index.tsx +0 -106
  116. package/src/modules/login/style.css +0 -3
  117. package/src/modules/login/useServices.ts +0 -53
  118. package/src/modules/login/utils.ts +0 -42
  119. package/src/modules/modelManage/ConfigDrawer.tsx +0 -249
  120. package/src/modules/modelManage/assets/empty.png +0 -0
  121. package/src/modules/modelManage/const.ts +0 -50
  122. package/src/modules/modelManage/index.tsx +0 -439
  123. package/src/modules/modelManage/server.ts +0 -185
  124. package/src/modules/nodegraph/index.tsx +0 -1
  125. package/src/modules/search/assets/Icon-history.svg +0 -8
  126. package/src/modules/search/assets/answerAwartar.png +0 -0
  127. package/src/modules/search/assets/doc.png +0 -0
  128. package/src/modules/search/assets/genera.gif +0 -0
  129. package/src/modules/search/assets/icon-robot.svg +0 -9
  130. package/src/modules/search/assets/icon-search-bar.svg +0 -14
  131. package/src/modules/search/assets/icon-sub-title.svg +0 -3
  132. package/src/modules/search/assets/icon-title.svg +0 -9
  133. package/src/modules/search/assets/icon-zoomOut.svg +0 -9
  134. package/src/modules/search/assets/iconAi.svg +0 -9
  135. package/src/modules/search/assets/pdf.png +0 -0
  136. package/src/modules/search/assets/ppt.png +0 -0
  137. package/src/modules/search/assets/search.svg +0 -3
  138. package/src/modules/search/assets/selected.svg +0 -4
  139. package/src/modules/search/assets/txt.png +0 -0
  140. package/src/modules/search/assets/xls.png +0 -0
  141. package/src/modules/search/components/AssisSelect.tsx +0 -137
  142. package/src/modules/search/components/Editor/ChatViewEditor.tsx +0 -261
  143. package/src/modules/search/components/Editor/aichat.css +0 -1
  144. package/src/modules/search/components/Editor/constant.ts +0 -13
  145. package/src/modules/search/components/Editor/index.tsx +0 -113
  146. package/src/modules/search/components/Editor/plugins/autofomatRules.ts +0 -332
  147. package/src/modules/search/components/Editor/plugins/convertImgPlugins.tsx +0 -20
  148. package/src/modules/search/components/Editor/plugins/createIndexes.tsx +0 -38
  149. package/src/modules/search/components/Editor/plugins/displayer.ts +0 -298
  150. package/src/modules/search/components/Editor/plugins/imageClick.tsx +0 -32
  151. package/src/modules/search/components/Editor/plugins/myplugin.tsx +0 -98
  152. package/src/modules/search/components/Editor/ui/avatar.tsx +0 -19
  153. package/src/modules/search/components/Editor/ui/blockquote-element.tsx +0 -21
  154. package/src/modules/search/components/Editor/ui/button.tsx +0 -58
  155. package/src/modules/search/components/Editor/ui/calendar.tsx +0 -68
  156. package/src/modules/search/components/Editor/ui/caption.tsx +0 -46
  157. package/src/modules/search/components/Editor/ui/checkbox.tsx +0 -27
  158. package/src/modules/search/components/Editor/ui/code-block-combobox.tsx +0 -188
  159. package/src/modules/search/components/Editor/ui/code-block-element.css +0 -434
  160. package/src/modules/search/components/Editor/ui/code-block-element.tsx +0 -39
  161. package/src/modules/search/components/Editor/ui/code-leaf.tsx +0 -24
  162. package/src/modules/search/components/Editor/ui/code-line-element.tsx +0 -10
  163. package/src/modules/search/components/Editor/ui/code-syntax-leaf.tsx +0 -21
  164. package/src/modules/search/components/Editor/ui/column-element.tsx +0 -30
  165. package/src/modules/search/components/Editor/ui/column-group-element.tsx +0 -94
  166. package/src/modules/search/components/Editor/ui/command.tsx +0 -75
  167. package/src/modules/search/components/Editor/ui/comment-avatar.tsx +0 -22
  168. package/src/modules/search/components/Editor/ui/comment-create-form.tsx +0 -37
  169. package/src/modules/search/components/Editor/ui/comment-item.tsx +0 -74
  170. package/src/modules/search/components/Editor/ui/comment-leaf.tsx +0 -49
  171. package/src/modules/search/components/Editor/ui/comment-more-dropdown.tsx +0 -42
  172. package/src/modules/search/components/Editor/ui/comment-reply-items.tsx +0 -22
  173. package/src/modules/search/components/Editor/ui/comment-resolve-button.tsx +0 -32
  174. package/src/modules/search/components/Editor/ui/comment-value.tsx +0 -34
  175. package/src/modules/search/components/Editor/ui/comments-popover.tsx +0 -63
  176. package/src/modules/search/components/Editor/ui/date-element.tsx +0 -83
  177. package/src/modules/search/components/Editor/ui/dialog.tsx +0 -63
  178. package/src/modules/search/components/Editor/ui/draggable.tsx +0 -177
  179. package/src/modules/search/components/Editor/ui/dropdown-menu.tsx +0 -180
  180. package/src/modules/search/components/Editor/ui/emoji-input-element.tsx +0 -85
  181. package/src/modules/search/components/Editor/ui/excalidraw-element.tsx +0 -28
  182. package/src/modules/search/components/Editor/ui/fixed-toolbar-buttons.tsx +0 -76
  183. package/src/modules/search/components/Editor/ui/fixed-toolbar.tsx +0 -8
  184. package/src/modules/search/components/Editor/ui/floating-toolbar-buttons.tsx +0 -51
  185. package/src/modules/search/components/Editor/ui/floating-toolbar.tsx +0 -77
  186. package/src/modules/search/components/Editor/ui/heading-element.tsx +0 -48
  187. package/src/modules/search/components/Editor/ui/highlight-leaf.tsx +0 -17
  188. package/src/modules/search/components/Editor/ui/hr-element.tsx +0 -30
  189. package/src/modules/search/components/Editor/ui/icons.tsx +0 -267
  190. package/src/modules/search/components/Editor/ui/image-element.tsx +0 -74
  191. package/src/modules/search/components/Editor/ui/inline-combobox.tsx +0 -368
  192. package/src/modules/search/components/Editor/ui/input.tsx +0 -25
  193. package/src/modules/search/components/Editor/ui/insert-dropdown-menu.tsx +0 -218
  194. package/src/modules/search/components/Editor/ui/kbd-leaf.tsx +0 -20
  195. package/src/modules/search/components/Editor/ui/link-element.tsx +0 -29
  196. package/src/modules/search/components/Editor/ui/link-floating-toolbar.tsx +0 -161
  197. package/src/modules/search/components/Editor/ui/list-element.tsx +0 -30
  198. package/src/modules/search/components/Editor/ui/mark-toolbar-button.tsx +0 -24
  199. package/src/modules/search/components/Editor/ui/media-embed-element.tsx +0 -133
  200. package/src/modules/search/components/Editor/ui/media-popover.tsx +0 -97
  201. package/src/modules/search/components/Editor/ui/mention-element.tsx +0 -43
  202. package/src/modules/search/components/Editor/ui/mention-input-element.tsx +0 -141
  203. package/src/modules/search/components/Editor/ui/mode-dropdown-menu.tsx +0 -93
  204. package/src/modules/search/components/Editor/ui/more-dropdown-menu.tsx +0 -67
  205. package/src/modules/search/components/Editor/ui/paragraph-element.tsx +0 -4
  206. package/src/modules/search/components/Editor/ui/placeholder.tsx +0 -52
  207. package/src/modules/search/components/Editor/ui/popover.tsx +0 -32
  208. package/src/modules/search/components/Editor/ui/resizable.tsx +0 -66
  209. package/src/modules/search/components/Editor/ui/separator.tsx +0 -25
  210. package/src/modules/search/components/Editor/ui/style.less +0 -12
  211. package/src/modules/search/components/Editor/ui/table-cell-element.tsx +0 -143
  212. package/src/modules/search/components/Editor/ui/table-element.tsx +0 -243
  213. package/src/modules/search/components/Editor/ui/table-row-element.tsx +0 -22
  214. package/src/modules/search/components/Editor/ui/tableValue.tsx +0 -135
  215. package/src/modules/search/components/Editor/ui/todo-list-element.tsx +0 -43
  216. package/src/modules/search/components/Editor/ui/toggle-element.tsx +0 -31
  217. package/src/modules/search/components/Editor/ui/toolbar.tsx +0 -157
  218. package/src/modules/search/components/Editor/ui/tooltip.tsx +0 -65
  219. package/src/modules/search/components/Editor/ui/turn-into-dropdown-menu.tsx +0 -160
  220. package/src/modules/search/components/Editor/ui/with-draggables.tsx +0 -175
  221. package/src/modules/search/components/FileList.tsx +0 -287
  222. package/src/modules/search/components/ImageGroupView/index.tsx +0 -85
  223. package/src/modules/search/components/ResultContent.tsx +0 -232
  224. package/src/modules/search/components/SearchInput.tsx +0 -232
  225. package/src/modules/search/components/SearchLanding.tsx +0 -74
  226. package/src/modules/search/components/SearchView.tsx +0 -563
  227. package/src/modules/search/components/SimpleEditor.tsx +0 -158
  228. package/src/modules/search/components/SimpleFileList.tsx +0 -215
  229. package/src/modules/search/index.tsx +0 -10
  230. package/src/modules/search/reademe.md +0 -1
  231. package/src/modules/search/servers/apis.tsx +0 -19
  232. package/src/modules/search/servers/index.ts +0 -184
  233. package/src/modules/search/style.less +0 -503
  234. package/src/modules/search/type.ts +0 -22
  235. package/src/modules/search/utils.ts +0 -34
  236. package/src/modules/sensitive/index.tsx +0 -313
  237. package/src/modules/sensitive/server.ts +0 -122
  238. package/src/modules/streamFilesReader/GientechStreamReader.tsx +0 -1555
  239. package/src/modules/streamFilesReader/components/Header/Toolbar.tsx +0 -0
  240. package/src/modules/streamFilesReader/components/Header/index.tsx +0 -297
  241. package/src/modules/streamFilesReader/index.tsx +0 -3
  242. package/src/style.css +0 -6
  243. package/src/type.d.ts +0 -0
  244. package/src/utils/commonFn.tsx +0 -111
  245. package/src/utils/gientechCommon/components/AppError.tsx +0 -32
  246. package/src/utils/gientechCommon/components/AppLoading.tsx +0 -75
  247. package/src/utils/gientechCommon/components/DeleteModal.tsx +0 -75
  248. package/src/utils/gientechCommon/components/DisplayError.tsx +0 -33
  249. package/src/utils/gientechCommon/components/DisplayLoading.tsx +0 -38
  250. package/src/utils/gientechCommon/components/FeedBackModal.tsx +0 -310
  251. package/src/utils/gientechCommon/components/FileCardCommon.tsx +0 -82
  252. package/src/utils/gientechCommon/components/FileManager/index.tsx +0 -390
  253. package/src/utils/gientechCommon/components/FileManager/style.css +0 -5
  254. package/src/utils/gientechCommon/components/Messages/GientechNewChatWelcome.tsx +0 -296
  255. package/src/utils/gientechCommon/components/Messages/ReferenceCard.tsx +0 -339
  256. package/src/utils/gientechCommon/components/Messages/RetriveItem.tsx +0 -245
  257. package/src/utils/gientechCommon/components/Messages/WebRetriveItem.tsx +0 -209
  258. package/src/utils/gientechCommon/components/Messages/defaultBot.png +0 -0
  259. package/src/utils/gientechCommon/components/Messages/defaultStyleSet.tsx +0 -148
  260. package/src/utils/gientechCommon/components/Messages/defaultWeLogo.svg +0 -14
  261. package/src/utils/gientechCommon/components/RenameModal.tsx +0 -86
  262. package/src/utils/gientechCommon/components/style.less +0 -11
  263. package/src/utils/gientechCommon/configs/commonConfig.ts +0 -2
  264. package/src/utils/gientechCommon/configs/senderConfig.ts +0 -0
  265. package/src/utils/gientechCommon/configs/stylesConfig.ts +0 -142
  266. package/src/utils/gientechCommon/hooks/AichatUseController.tsx +0 -345
  267. package/src/utils/gientechCommon/slate/converters/deserializers.ts +0 -763
  268. package/src/utils/gientechCommon/slate/converters/mockData.ts +0 -232
  269. package/src/utils/gientechCommon/slate/converters/slateConverters.ts +0 -258
  270. package/src/utils/gientechCommon/slate/richElements/index.tsx +0 -499
  271. package/src/utils/gientechCommon/utils/request.ts +0 -37
  272. package/src/utils/gientechCommon/utils/serverFn.ts +0 -172
  273. package/src/utils/index.tsx +0 -126
  274. package/src/utils/testconfigs/demologin/index.tsx +0 -32
  275. package/src/utils/testconfigs/index.ts +0 -53
  276. package/src/vite-env.d.ts +0 -11
  277. package/stats.html +0 -4949
  278. package/tailwind.config.js +0 -170
  279. package/tsconfig.app.json +0 -30
  280. package/tsconfig.app.tsbuildinfo +0 -11
  281. package/tsconfig.json +0 -13
  282. package/tsconfig.node.json +0 -22
  283. package/tsconfig.node.tsbuildinfo +0 -1
  284. package/vite.config.ts +0 -177
  285. package/workflows/release.yml +0 -60
  286. /package/{dist/assets → assets}/Doris.png +0 -0
  287. /package/{dist/assets → assets}/PostgreSQL.png +0 -0
  288. /package/{dist/assets → assets}/SQLServer.png +0 -0
  289. /package/{dist/assets → assets}/_commonjsHelpers-gnU0ypJ3.js +0 -0
  290. /package/{dist/assets → assets}/circle-alert-g2Y6zAjt.js +0 -0
  291. /package/{dist/assets → assets}/empty.png +0 -0
  292. /package/{dist/assets → assets}/index-CEK88UzR.js +0 -0
  293. /package/{dist/assets → assets}/index-CpW6Dhpp.js +0 -0
  294. /package/{dist/assets → assets}/plus-omCUN0e3.js +0 -0
  295. /package/{dist/assets → assets}/style.css +0 -0
  296. /package/{dist/assets → assets}/style2.css +0 -0
  297. /package/{dist/assets → assets}/style3.css +0 -0
  298. /package/{dist/assets → assets}/styled-components.browser.esm-DPkS13KC.js +0 -0
  299. /package/{dist/assets → assets}/x-vPcWt3fC.js +0 -0
  300. /package/{dist/chat.d.ts → chat.d.ts} +0 -0
  301. /package/{dist/database.d.ts → database.d.ts} +0 -0
  302. /package/{dist/databaseId.d.ts → databaseId.d.ts} +0 -0
  303. /package/{dist/databaseTable.d.ts → databaseTable.d.ts} +0 -0
  304. /package/{dist/modelManage.d.ts → modelManage.d.ts} +0 -0
  305. /package/{dist/sensitive.d.ts → sensitive.d.ts} +0 -0
  306. /package/{dist/streamFilesReader.d.ts → streamFilesReader.d.ts} +0 -0
  307. /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
- }