@nocobase/plugin-ai 2.3.0-alpha.1 → 2.3.0-beta.10

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 (324) hide show
  1. package/dist/ai/docs/nocobase/ai-dev/watermark-plugin.md +2 -0
  2. package/dist/ai/docs/nocobase/ai-employees/block/ai-chat-box.md +133 -0
  3. package/dist/ai/docs/nocobase/ai-employees/knowledge-base/knowledge-base/documents.md +1 -1
  4. package/dist/ai/docs/nocobase/ai-employees/knowledge-base/knowledge-base/index.md +11 -7
  5. package/dist/ai/docs/nocobase/ai-employees/knowledge-base/knowledge-base/settings.md +12 -8
  6. package/dist/ai/docs/nocobase/ai-employees/knowledge-base/rag.md +43 -13
  7. package/dist/ai/docs/nocobase/ai-employees/knowledge-base/vector-database.md +3 -3
  8. package/dist/ai/docs/nocobase/ai-employees/workflow/nodes/knowledge/create-document.md +1 -1
  9. package/dist/ai/docs/nocobase/api/app/env.md +2 -0
  10. package/dist/ai/docs/nocobase/api/cli/api/resource/create.md +4 -3
  11. package/dist/ai/docs/nocobase/building-tips/ai-fill-js-block-form.md +1092 -0
  12. package/dist/ai/docs/nocobase/data-sources/calendar/calendar-collection.md +100 -3
  13. package/dist/ai/docs/nocobase/data-sources/collection-comment/index.md +92 -39
  14. package/dist/ai/docs/nocobase/data-sources/collection-sql/index.md +150 -29
  15. package/dist/ai/docs/nocobase/data-sources/collection-tree/index.md +93 -5
  16. package/dist/ai/docs/nocobase/data-sources/collection-view/index.md +226 -4
  17. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/advanced/china-region.md +122 -5
  18. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/advanced/collection-select.md +105 -4
  19. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/advanced/json.md +102 -4
  20. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/advanced/nano-id.md +104 -4
  21. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/advanced/snowflake-id.md +108 -4
  22. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/advanced/sort.md +3 -19
  23. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/advanced/uuid.md +104 -4
  24. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/associations/index.md +44 -8
  25. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/color.md +102 -4
  26. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/email.md +104 -4
  27. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/icon.md +102 -4
  28. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/input.md +112 -8
  29. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/integer.md +103 -4
  30. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/number.md +103 -4
  31. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/password.md +102 -4
  32. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/percent.md +104 -5
  33. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/phone.md +104 -4
  34. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/textarea.md +99 -8
  35. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/basic/url.md +103 -4
  36. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/choices/checkbox-group.md +105 -3
  37. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/choices/checkbox.md +102 -4
  38. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/choices/china-region.md +108 -5
  39. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/choices/multiple-select.md +103 -5
  40. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/choices/radio-group.md +106 -4
  41. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/choices/select.md +103 -5
  42. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/datetime/date.md +102 -4
  43. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/datetime/datetime-without-tz.md +103 -5
  44. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/datetime/datetime.md +103 -5
  45. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/datetime/index.md +53 -47
  46. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/datetime/time.md +102 -4
  47. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/datetime/unix-timestamp.md +103 -5
  48. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/geometric/circle.md +102 -4
  49. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/geometric/line.md +103 -5
  50. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/geometric/point.md +102 -4
  51. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/geometric/polygon.md +102 -4
  52. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/index.md +62 -16
  53. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/media/markdown.md +104 -4
  54. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/media/rich-text.md +105 -5
  55. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/system-info/created-at.md +105 -5
  56. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/system-info/created-by.md +103 -5
  57. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/system-info/space.md +100 -6
  58. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/system-info/table-oid.md +102 -4
  59. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/system-info/updated-at.md +104 -5
  60. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/system-info/updated-by.md +104 -6
  61. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection-fields/validation.md +68 -58
  62. package/dist/ai/docs/nocobase/data-sources/data-modeling/collection.md +32 -13
  63. package/dist/ai/docs/nocobase/data-sources/data-modeling/index.md +41 -33
  64. package/dist/ai/docs/nocobase/data-sources/data-source-external-mariadb/index.md +114 -6
  65. package/dist/ai/docs/nocobase/data-sources/data-source-external-mssql/index.md +117 -6
  66. package/dist/ai/docs/nocobase/data-sources/data-source-external-mysql/index.md +103 -6
  67. package/dist/ai/docs/nocobase/data-sources/data-source-external-nocobase/index.md +75 -73
  68. package/dist/ai/docs/nocobase/data-sources/data-source-external-oracle/index.md +129 -11
  69. package/dist/ai/docs/nocobase/data-sources/data-source-external-postgres/index.md +110 -6
  70. package/dist/ai/docs/nocobase/data-sources/data-source-kingbase/index.md +75 -49
  71. package/dist/ai/docs/nocobase/data-sources/data-source-main/general-collection.md +116 -15
  72. package/dist/ai/docs/nocobase/data-sources/data-source-main/index.md +92 -62
  73. package/dist/ai/docs/nocobase/data-sources/data-source-main/inheritance-collection.md +97 -10
  74. package/dist/ai/docs/nocobase/data-sources/data-source-manager/external-database.md +97 -58
  75. package/dist/ai/docs/nocobase/data-sources/data-source-manager/index.md +32 -24
  76. package/dist/ai/docs/nocobase/data-sources/data-source-rest-api/index.md +115 -153
  77. package/dist/ai/docs/nocobase/data-sources/external/clickhouse.md +124 -0
  78. package/dist/ai/docs/nocobase/data-sources/external/doris.md +130 -0
  79. package/dist/ai/docs/nocobase/data-sources/external/index.md +140 -0
  80. package/dist/ai/docs/nocobase/data-sources/external/kingbase.md +129 -0
  81. package/dist/ai/docs/nocobase/data-sources/external/mariadb.md +126 -0
  82. package/dist/ai/docs/nocobase/data-sources/external/mssql.md +129 -0
  83. package/dist/ai/docs/nocobase/data-sources/external/mysql.md +115 -0
  84. package/dist/ai/docs/nocobase/data-sources/external/nocobase.md +159 -0
  85. package/dist/ai/docs/nocobase/data-sources/external/oceanbase.md +126 -0
  86. package/dist/ai/docs/nocobase/data-sources/external/oracle.md +158 -0
  87. package/dist/ai/docs/nocobase/data-sources/external/postgresql.md +122 -0
  88. package/dist/ai/docs/nocobase/data-sources/external/rest-api.md +245 -0
  89. package/dist/ai/docs/nocobase/data-sources/field-attachment-url/index.md +100 -12
  90. package/dist/ai/docs/nocobase/data-sources/field-encryption/index.md +48 -47
  91. package/dist/ai/docs/nocobase/data-sources/field-formula/index.md +99 -5
  92. package/dist/ai/docs/nocobase/data-sources/field-markdown-vditor/index.md +105 -5
  93. package/dist/ai/docs/nocobase/data-sources/field-sequence/index.md +102 -5
  94. package/dist/ai/docs/nocobase/data-sources/field-signature/index.md +18 -16
  95. package/dist/ai/docs/nocobase/data-sources/field-sort/index.md +76 -73
  96. package/dist/ai/docs/nocobase/data-sources/file-manager/field-attachment.md +101 -7
  97. package/dist/ai/docs/nocobase/data-sources/file-manager/file-collection.md +101 -14
  98. package/dist/ai/docs/nocobase/data-sources/index.md +49 -33
  99. package/dist/ai/docs/nocobase/data-sources/main/index.md +130 -0
  100. package/dist/ai/docs/nocobase/data-sources/main/kingbase.md +147 -0
  101. package/dist/ai/docs/nocobase/data-sources/main/mariadb.md +59 -0
  102. package/dist/ai/docs/nocobase/data-sources/main/mysql.md +59 -0
  103. package/dist/ai/docs/nocobase/data-sources/main/oceanbase.md +62 -0
  104. package/dist/ai/docs/nocobase/data-sources/main/postgresql.md +61 -0
  105. package/dist/ai/docs/nocobase/file-manager/file-preview/index.md +44 -3
  106. package/dist/ai/docs/nocobase/file-manager/stable-url.md +1 -1
  107. package/dist/ai/docs/nocobase/file-manager/storage/aliyun-oss.md +100 -3
  108. package/dist/ai/docs/nocobase/file-manager/storage/index.md +76 -26
  109. package/dist/ai/docs/nocobase/file-manager/storage/local.md +4 -2
  110. package/dist/ai/docs/nocobase/file-manager/storage/s3-pro.md +58 -7
  111. package/dist/ai/docs/nocobase/get-started/installation/docker-nginx.mdx +4 -1
  112. package/dist/ai/docs/nocobase/get-started/installation/docker.mdx +2 -0
  113. package/dist/ai/docs/nocobase/get-started/installation/env.md +13 -1
  114. package/dist/ai/docs/nocobase/nocobase-cli/production/reverse-proxy/caddy.md +28 -5
  115. package/dist/ai/docs/nocobase/nocobase-cli/production/reverse-proxy/nginx.md +25 -0
  116. package/dist/ai/docs/nocobase/ops-management/migration-manager/built-in-tables.md +1 -2
  117. package/dist/ai/docs/nocobase/plugin-development/build.md +10 -4
  118. package/dist/ai/docs/nocobase/plugin-development/client/appendix/faq.md +1 -1
  119. package/dist/ai/docs/nocobase/plugin-development/client/examples/custom-action.md +2 -0
  120. package/dist/ai/docs/nocobase/plugin-development/client/examples/custom-block.md +2 -0
  121. package/dist/ai/docs/nocobase/plugin-development/client/examples/custom-field.md +2 -0
  122. package/dist/ai/docs/nocobase/plugin-development/client/examples/fullstack-plugin.md +2 -0
  123. package/dist/ai/docs/nocobase/plugin-development/client/examples/settings-page.md +2 -0
  124. package/dist/ai/docs/nocobase/plugin-development/common/i18n.md +3 -3
  125. package/dist/ai/docs/nocobase/plugin-development/server/cache.md +1 -1
  126. package/dist/ai/docs/nocobase/plugin-development/server/collections.md +0 -6
  127. package/dist/ai/docs/nocobase/plugin-development/server/command.md +2 -2
  128. package/dist/ai/docs/nocobase/plugin-development/server/context.md +2 -2
  129. package/dist/ai/docs/nocobase/plugin-development/server/i18n.md +4 -4
  130. package/dist/ai/docs/nocobase/plugin-development/write-your-first-plugin.md +91 -43
  131. package/dist/ai/docs/nocobase/runjs/context/ai.md +194 -4
  132. package/dist/ai/docs/nocobase/security/guide.md +17 -2
  133. package/dist/ai/docs/nocobase/users-permissions/sync/index.md +8 -1
  134. package/dist/ai/docs/nocobase/users-permissions/sync/sources/dingtalk.md +138 -0
  135. package/dist/ai/docs/nocobase/users-permissions/sync/sources/ldap.md +87 -0
  136. package/dist/ai/docs/nocobase/workflow/nodes/javascript.md +21 -1
  137. package/dist/ai/tools/executeFrontendTool.d.ts +10 -0
  138. package/dist/ai/tools/executeFrontendTool.js +86 -0
  139. package/dist/ai/tools/getSkill.js +1 -1
  140. package/dist/ai/tools/knowledge-base-retrieve.js +3 -1
  141. package/dist/ai/tools/loadFrontendTool.d.ts +10 -0
  142. package/dist/ai/tools/loadFrontendTool.js +99 -0
  143. package/dist/client/244.aeb24ce76c510b34.js +10 -0
  144. package/dist/client/{525.203778500aca5d05.js → 525.94dd4136c1361477.js} +1 -1
  145. package/dist/client/681.6ffbc9329b9ac242.js +10 -0
  146. package/dist/client/705.1d735e63c25f66a8.js +10 -0
  147. package/dist/client/index.d.ts +1 -3
  148. package/dist/client/index.js +8 -8
  149. package/dist/client-v2/244.ee9ec45eac0eb99f.js +10 -0
  150. package/dist/client-v2/420.a5b929a5e7f330be.js +10 -0
  151. package/dist/client-v2/681.6890caa389564ff7.js +10 -0
  152. package/dist/client-v2/705.00c101bef403fb44.js +10 -0
  153. package/dist/client-v2/ai-employees/AIEmployeeShortcut.d.ts +2 -0
  154. package/dist/client-v2/ai-employees/AddContextButton.d.ts +2 -0
  155. package/dist/client-v2/ai-employees/chatbox/components/AIEmployeeSwitcher.d.ts +1 -0
  156. package/dist/client-v2/ai-employees/chatbox/components/ChatBoxUnreadBadge.d.ts +17 -0
  157. package/dist/client-v2/ai-employees/chatbox/components/Conversations.d.ts +9 -1
  158. package/dist/client-v2/ai-employees/chatbox/components/MessageRenderers.d.ts +1 -1
  159. package/dist/client-v2/ai-employees/chatbox/components/Messages.d.ts +5 -1
  160. package/dist/client-v2/ai-employees/chatbox/components/ModelSwitcher.d.ts +4 -0
  161. package/dist/client-v2/ai-employees/chatbox/components/Sender.d.ts +33 -1
  162. package/dist/client-v2/ai-employees/chatbox/components/index.d.ts +1 -0
  163. package/dist/client-v2/ai-employees/chatbox/hooks/reasoning-stream.d.ts +10 -0
  164. package/dist/client-v2/ai-employees/chatbox/hooks/useChat.d.ts +8 -5
  165. package/dist/client-v2/ai-employees/chatbox/hooks/useChatBoxActions.d.ts +3 -2
  166. package/dist/client-v2/ai-employees/chatbox/hooks/useChatBoxEffect.d.ts +2 -1
  167. package/dist/client-v2/ai-employees/chatbox/hooks/useChatConversationActions.d.ts +3 -2
  168. package/dist/client-v2/ai-employees/chatbox/hooks/useChatMessageActions.d.ts +4 -2
  169. package/dist/client-v2/ai-employees/chatbox/hooks/useToolCallActions.d.ts +3 -1
  170. package/dist/client-v2/ai-employees/chatbox/hooks/useUploadFiles.d.ts +13 -3
  171. package/dist/client-v2/ai-employees/chatbox/hooks/useWorkflowTasks.d.ts +3 -2
  172. package/dist/client-v2/ai-employees/chatbox/index.d.ts +17 -0
  173. package/dist/client-v2/ai-employees/chatbox/roles.d.ts +2 -153
  174. package/dist/client-v2/ai-employees/chatbox/stores/chat-box.d.ts +46 -33
  175. package/dist/client-v2/ai-employees/chatbox/stores/chat-conversations.d.ts +7 -7
  176. package/dist/client-v2/ai-employees/chatbox/stores/chat-messages.d.ts +23 -18
  177. package/dist/client-v2/ai-employees/chatbox/stores/chat-sender.d.ts +43 -0
  178. package/dist/client-v2/ai-employees/chatbox/stores/chat-tool-call.d.ts +6 -5
  179. package/dist/client-v2/ai-employees/chatbox/stores/chat-tools.d.ts +11 -5
  180. package/dist/client-v2/ai-employees/chatbox/stores/mounted-chat-boxes.d.ts +20 -0
  181. package/dist/client-v2/ai-employees/chatbox/stores/runtime.d.ts +43 -0
  182. package/dist/client-v2/ai-employees/chatbox/stores/workflow-tasks.d.ts +22 -10
  183. package/dist/client-v2/ai-employees/chatbox/upload.d.ts +19 -0
  184. package/dist/client-v2/ai-employees/chatbox/utils.d.ts +28 -4
  185. package/dist/client-v2/ai-employees/frontend-tools.d.ts +11 -0
  186. package/dist/client-v2/ai-employees/tools/SuggestionsOptionsCard.d.ts +1 -1
  187. package/dist/client-v2/ai-employees/tools/WorkflowTaskOutputCard.d.ts +1 -1
  188. package/dist/client-v2/ai-employees/types.d.ts +30 -0
  189. package/dist/client-v2/block/ai-chat-box/AIChatBoxBlockModel.d.ts +21 -0
  190. package/dist/client-v2/block/ai-chat-box/AIChatBoxCoreModel.d.ts +13 -0
  191. package/dist/client-v2/{ai-employees/chatbox/components/DebugPanel.d.ts → block/ai-chat-box/components/AIChatBoxCoreView.d.ts} +1 -1
  192. package/dist/client-v2/block/ai-chat-box/components/AIChatBoxView.d.ts +12 -0
  193. package/dist/client-v2/block/ai-chat-box/index.d.ts +14 -0
  194. package/dist/client-v2/block/ai-chat-box/settings.d.ts +12 -0
  195. package/dist/client-v2/block/ai-chat-box/sub-models.d.ts +26 -0
  196. package/dist/client-v2/block/ai-chat-box/types.d.ts +38 -0
  197. package/dist/client-v2/block/ai-chat-box/utils.d.ts +26 -0
  198. package/dist/client-v2/index.d.ts +3 -5
  199. package/dist/client-v2/index.js +3 -3
  200. package/dist/client-v2/llm-providers/forms.d.ts +2 -0
  201. package/dist/client-v2/llm-providers/index.d.ts +1 -0
  202. package/dist/client-v2/llm-services/model-select.d.ts +33 -0
  203. package/dist/client-v2/llm-services/utils.d.ts +1 -0
  204. package/dist/client-v2/manager/ai-manager.d.ts +10 -3
  205. package/dist/client-v2/manager/frontend-tool-registry.d.ts +30 -0
  206. package/dist/client-v2/models/ai-employees/AIEmployeeActionModel.d.ts +4 -1
  207. package/dist/client-v2/models/ai-employees/AIEmployeeShortcutModel.d.ts +8 -0
  208. package/dist/client-v2/pages/EmployeesPage.d.ts +12 -0
  209. package/dist/client-v2/pages/LLMServicesPage.d.ts +9 -4
  210. package/dist/client-v2/repositories/AIConfigRepository.d.ts +2 -0
  211. package/dist/client-v2/runjs/registerAIEmployeeRunJSFacade.d.ts +1 -0
  212. package/dist/client-v2/workflow/types.d.ts +1 -0
  213. package/dist/collections/ai-employees.d.ts +1 -0
  214. package/dist/collections/ai-employees.js +1 -0
  215. package/dist/common/ai-employee-validation.d.ts +17 -0
  216. package/dist/common/ai-employee-validation.js +67 -0
  217. package/dist/common/error-codes.d.ts +14 -0
  218. package/dist/common/error-codes.js +51 -0
  219. package/dist/common/frontend-tools.d.ts +26 -0
  220. package/dist/common/frontend-tools.js +57 -0
  221. package/dist/common/llm-service-models.d.ts +16 -0
  222. package/dist/common/llm-service-models.js +84 -0
  223. package/dist/externalVersion.js +19 -17
  224. package/dist/locale/de-DE.json +2 -1
  225. package/dist/locale/en-US.json +87 -5
  226. package/dist/locale/es-ES.json +2 -1
  227. package/dist/locale/fr-FR.json +2 -1
  228. package/dist/locale/hu-HU.json +2 -1
  229. package/dist/locale/id-ID.json +2 -1
  230. package/dist/locale/it-IT.json +2 -1
  231. package/dist/locale/ja-JP.json +2 -1
  232. package/dist/locale/ko-KR.json +2 -1
  233. package/dist/locale/nl-NL.json +2 -1
  234. package/dist/locale/pt-BR.json +2 -1
  235. package/dist/locale/ru-RU.json +2 -1
  236. package/dist/locale/tr-TR.json +2 -1
  237. package/dist/locale/uk-UA.json +2 -1
  238. package/dist/locale/vi-VN.json +2 -1
  239. package/dist/locale/zh-CN.json +87 -5
  240. package/dist/locale/zh-TW.json +2 -1
  241. package/dist/node_modules/@langchain/mistralai/package.json +1 -1
  242. package/dist/node_modules/@langchain/xai/package.json +1 -1
  243. package/dist/node_modules/fs-extra/package.json +1 -1
  244. package/dist/node_modules/jsonrepair/package.json +1 -1
  245. package/dist/node_modules/just-bash/package.json +1 -1
  246. package/dist/node_modules/nodejs-snowflake/package.json +1 -1
  247. package/dist/node_modules/openai/package.json +1 -1
  248. package/dist/node_modules/zod/package.json +1 -1
  249. package/dist/server/ai-employees/ai-conversations.d.ts +4 -1
  250. package/dist/server/ai-employees/ai-conversations.js +2 -0
  251. package/dist/server/ai-employees/ai-employee.d.ts +32 -2
  252. package/dist/server/ai-employees/ai-employee.js +367 -79
  253. package/dist/server/ai-employees/ai-knowledge-base.d.ts +21 -1
  254. package/dist/server/ai-employees/ai-knowledge-base.js +87 -12
  255. package/dist/server/ai-employees/middleware/conversation.js +28 -22
  256. package/dist/server/ai-employees/middleware/index.d.ts +1 -0
  257. package/dist/server/ai-employees/middleware/index.js +2 -0
  258. package/dist/server/ai-employees/middleware/tool-result-integrity.d.ts +22 -0
  259. package/dist/server/ai-employees/middleware/tool-result-integrity.js +211 -0
  260. package/dist/server/ai-employees/reasoning-stream-state.d.ts +23 -0
  261. package/dist/server/ai-employees/reasoning-stream-state.js +63 -0
  262. package/dist/server/collections/ai-conversations.js +5 -0
  263. package/dist/server/document-loader/constants.js +1 -1
  264. package/dist/server/features/knowledge-base.d.ts +2 -0
  265. package/dist/server/frontend-tools.d.ts +25 -0
  266. package/dist/server/frontend-tools.js +171 -0
  267. package/dist/server/llm-providers/common/reasoning.js +18 -10
  268. package/dist/server/llm-providers/deepseek/index.d.ts +10 -0
  269. package/dist/server/llm-providers/deepseek/index.js +32 -0
  270. package/dist/server/llm-providers/deepseek/provider.d.ts +57 -0
  271. package/dist/server/llm-providers/deepseek/provider.js +320 -0
  272. package/dist/server/llm-providers/deepseek/reasoning.d.ts +83 -0
  273. package/dist/server/llm-providers/deepseek/reasoning.js +285 -0
  274. package/dist/server/llm-providers/mistral.d.ts +1 -1
  275. package/dist/server/llm-providers/provider.d.ts +1 -0
  276. package/dist/server/llm-providers/provider.js +3 -0
  277. package/dist/server/llm-providers/shengsuanyun.d.ts +29 -0
  278. package/dist/server/llm-providers/shengsuanyun.js +114 -0
  279. package/dist/server/manager/ai-feature-manager.js +1 -1
  280. package/dist/server/manager/ai-manager.d.ts +3 -0
  281. package/dist/server/manager/ai-manager.js +7 -2
  282. package/dist/server/manager/work-context-handler.js +10 -3
  283. package/dist/server/migrations/20260501000000-ai-employee-knowledge-base-retrieval-strategy.d.ts +14 -0
  284. package/dist/server/migrations/20260501000000-ai-employee-knowledge-base-retrieval-strategy.js +49 -0
  285. package/dist/server/plugin.d.ts +1 -0
  286. package/dist/server/plugin.js +31 -0
  287. package/dist/server/resource/aiConversations.d.ts +2 -0
  288. package/dist/server/resource/aiConversations.js +33 -3
  289. package/dist/server/resource/aiEmployees.d.ts +2 -0
  290. package/dist/server/resource/aiEmployees.js +96 -0
  291. package/dist/server/resource/aiWorkflowTasks.js +9 -1
  292. package/dist/server/resource/llmServices.d.ts +11 -0
  293. package/dist/server/resource/llmServices.js +85 -0
  294. package/dist/server/types/ai-message.type.d.ts +4 -0
  295. package/dist/server/types/knowledge-base.type.d.ts +8 -3
  296. package/dist/server/workflow/nodes/employee/files.d.ts +1 -1
  297. package/dist/server/workflow/nodes/employee/files.js +48 -1
  298. package/dist/server/workflow/nodes/employee/index.js +7 -2
  299. package/dist/server/workflow/nodes/employee/types.d.ts +1 -0
  300. package/dist/swagger/common.d.ts +143 -0
  301. package/dist/swagger/common.js +144 -0
  302. package/dist/swagger/employees.d.ts +301 -0
  303. package/dist/swagger/employees.js +131 -0
  304. package/dist/swagger/index.d.ts +1617 -0
  305. package/dist/swagger/index.js +62 -0
  306. package/dist/swagger/llm.d.ts +563 -0
  307. package/dist/swagger/llm.js +255 -0
  308. package/dist/swagger/schemas.d.ts +757 -0
  309. package/dist/swagger/schemas.js +392 -0
  310. package/package.json +2 -2
  311. package/dist/ai/docs/nocobase/ai-employees/knowledge-base/vector-store.md +0 -24
  312. package/dist/ai/docs/nocobase/data-sources/development/index.md +0 -6
  313. package/dist/client/372.40eb52905e3f3049.js +0 -10
  314. package/dist/client/681.399948c18d753667.js +0 -10
  315. package/dist/client/705.380279da896021fb.js +0 -10
  316. package/dist/client-v2/372.8cc3fde09c9bec77.js +0 -10
  317. package/dist/client-v2/406.341be51205c674e0.js +0 -10
  318. package/dist/client-v2/681.082f4f1c7b841983.js +0 -10
  319. package/dist/client-v2/705.1d10027ff8cfdf79.js +0 -10
  320. package/dist/client-v2/ai-employees/chatbox/stores/create-selectors.d.ts +0 -46
  321. package/dist/client-v2/ai-employees/chatbox/utils/normalizeTriggerTaskOptions.d.ts +0 -19
  322. package/dist/client-v2/debug-logger.d.ts +0 -52
  323. package/dist/server/llm-providers/deepseek.d.ts +0 -40
  324. package/dist/server/llm-providers/deepseek.js +0 -174
@@ -8,15 +8,35 @@
8
8
  */
9
9
  import { AIEmployee } from '../../collections/ai-employees';
10
10
  import type PluginAIServer from '../plugin';
11
+ export declare const KNOWLEDGE_BASE_RETRIEVAL_STRATEGIES: readonly ["always", "onDemand"];
12
+ export type KnowledgeBaseRetrievalStrategy = (typeof KNOWLEDGE_BASE_RETRIEVAL_STRATEGIES)[number];
13
+ export declare const isKnowledgeBaseRetrievalStrategy: (value: unknown) => value is "always" | "onDemand";
14
+ export declare const normalizeKnowledgeBaseRetrievalStrategy: (value: unknown) => KnowledgeBaseRetrievalStrategy;
15
+ export declare const withDefaultKnowledgeBaseRetrievalStrategy: (knowledgeBase: unknown) => Record<string, unknown>;
16
+ export declare const getCurrentRoleNames: (state: unknown) => string[];
17
+ export declare const KNOWLEDGE_BASE_ON_DEMAND_PROMPT: string;
18
+ export declare const KNOWLEDGE_BASE_PRE_RETRIEVED_PROMPT: string;
19
+ export declare const KNOWLEDGE_BASE_NO_ACCESS_PROMPT: string;
20
+ export declare const getKnowledgeBaseBackgroundPrompt: ({ accessDenied, onDemand, preRetrieved, }: {
21
+ accessDenied: boolean;
22
+ onDemand: boolean;
23
+ preRetrieved: boolean;
24
+ }) => string | undefined;
11
25
  export type KnowledgeBaseRetrieveOptions = {
12
26
  username?: string;
13
27
  employee?: AIEmployee;
14
28
  query: string;
29
+ roleNames?: string[];
30
+ };
31
+ export type KnowledgeBaseAccessOptions = {
32
+ employee: AIEmployee;
33
+ roleNames: string[];
15
34
  };
16
35
  export declare class KnowledgeBaseManager {
17
36
  private readonly plugin;
18
37
  constructor(plugin: PluginAIServer);
19
- retrievePrompt({ username, employee, query }: KnowledgeBaseRetrieveOptions): Promise<string>;
38
+ retrievePrompt({ username, employee, query, roleNames }: KnowledgeBaseRetrieveOptions): Promise<string>;
39
+ hasAccessibleKnowledgeBase({ employee, roleNames }: KnowledgeBaseAccessOptions): Promise<boolean>;
20
40
  isEnabledKnowledgeBase(username: string): Promise<boolean>;
21
41
  isEnabledKnowledgeBase(employee: AIEmployee): Promise<boolean>;
22
42
  private getEmployee;
@@ -36,12 +36,65 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
36
36
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
37
37
  var ai_knowledge_base_exports = {};
38
38
  __export(ai_knowledge_base_exports, {
39
- KnowledgeBaseManager: () => KnowledgeBaseManager
39
+ KNOWLEDGE_BASE_NO_ACCESS_PROMPT: () => KNOWLEDGE_BASE_NO_ACCESS_PROMPT,
40
+ KNOWLEDGE_BASE_ON_DEMAND_PROMPT: () => KNOWLEDGE_BASE_ON_DEMAND_PROMPT,
41
+ KNOWLEDGE_BASE_PRE_RETRIEVED_PROMPT: () => KNOWLEDGE_BASE_PRE_RETRIEVED_PROMPT,
42
+ KNOWLEDGE_BASE_RETRIEVAL_STRATEGIES: () => KNOWLEDGE_BASE_RETRIEVAL_STRATEGIES,
43
+ KnowledgeBaseManager: () => KnowledgeBaseManager,
44
+ getCurrentRoleNames: () => getCurrentRoleNames,
45
+ getKnowledgeBaseBackgroundPrompt: () => getKnowledgeBaseBackgroundPrompt,
46
+ isKnowledgeBaseRetrievalStrategy: () => isKnowledgeBaseRetrievalStrategy,
47
+ normalizeKnowledgeBaseRetrievalStrategy: () => normalizeKnowledgeBaseRetrievalStrategy,
48
+ withDefaultKnowledgeBaseRetrievalStrategy: () => withDefaultKnowledgeBaseRetrievalStrategy
40
49
  });
41
50
  module.exports = __toCommonJS(ai_knowledge_base_exports);
42
51
  var import_prompts = require("@langchain/core/prompts");
43
52
  var import_ai_feature_manager = require("../manager/ai-feature-manager");
44
53
  var import_lodash = __toESM(require("lodash"));
54
+ var import_ai_employee_validation = require("../../common/ai-employee-validation");
55
+ const KNOWLEDGE_BASE_RETRIEVAL_STRATEGIES = ["always", "onDemand"];
56
+ const isRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
57
+ const getRoleNames = (roles) => Array.isArray(roles) ? Array.from(
58
+ new Set(
59
+ roles.map((role) => isRecord(role) ? role.name : role).filter((role) => typeof role === "string" && role.length > 0)
60
+ )
61
+ ) : [];
62
+ const isKnowledgeBaseRetrievalStrategy = (value) => typeof value === "string" && KNOWLEDGE_BASE_RETRIEVAL_STRATEGIES.includes(value);
63
+ const normalizeKnowledgeBaseRetrievalStrategy = (value) => isKnowledgeBaseRetrievalStrategy(value) ? value : "always";
64
+ const withDefaultKnowledgeBaseRetrievalStrategy = (knowledgeBase) => {
65
+ const settings = isRecord(knowledgeBase) ? { ...knowledgeBase } : {};
66
+ if (!isKnowledgeBaseRetrievalStrategy(settings.retrievalStrategy)) {
67
+ settings.retrievalStrategy = "onDemand";
68
+ }
69
+ return settings;
70
+ };
71
+ const getCurrentRoleNames = (state) => {
72
+ const { currentRole, currentRoles, currentUser } = isRecord(state) ? state : {};
73
+ const currentUserRoleNames = getRoleNames(isRecord(currentUser) ? currentUser.roles : void 0);
74
+ if (currentUserRoleNames.length) {
75
+ return currentUserRoleNames;
76
+ }
77
+ if (Array.isArray(currentRoles)) {
78
+ return getRoleNames(currentRoles);
79
+ }
80
+ return typeof currentRole === "string" && currentRole.length > 0 ? [currentRole] : [];
81
+ };
82
+ const KNOWLEDGE_BASE_ON_DEMAND_PROMPT = "Use the knowledge base retrieval tool only when the request needs internal knowledge, uploaded documents, or knowledge-base facts. Do not call it for requests that clearly do not need those sources.";
83
+ const KNOWLEDGE_BASE_PRE_RETRIEVED_PROMPT = "The <knowledgeBase> content was retrieved in advance for the current user request. Use it directly when it is sufficient to answer; do not call the knowledge base retrieval tool again unless additional or different knowledge-base information is genuinely needed.";
84
+ const KNOWLEDGE_BASE_NO_ACCESS_PROMPT = "The current user does not have permission to access any knowledge base in this AI employee's configured scope. First answer the user's question as helpfully as possible using only information available without knowledge-base content; do not replace or interrupt the answer with a permission notice, and do not fabricate unavailable facts. Only after completing the answer, append a brief notice in the user's language stating that this response did not use knowledge-base content because the current user does not have permission to access these knowledge bases. Format this notice as a visually prominent Markdown reminder, using a blockquote with a bold warning or reminder heading so that it is easy to notice. If knowledge-base access is needed, advise the user to contact an administrator. Do not claim to have searched or used knowledge-base content.";
85
+ const getKnowledgeBaseBackgroundPrompt = ({
86
+ accessDenied,
87
+ onDemand,
88
+ preRetrieved
89
+ }) => {
90
+ if (accessDenied) {
91
+ return KNOWLEDGE_BASE_NO_ACCESS_PROMPT;
92
+ }
93
+ if (onDemand) {
94
+ return KNOWLEDGE_BASE_ON_DEMAND_PROMPT;
95
+ }
96
+ return preRetrieved ? KNOWLEDGE_BASE_PRE_RETRIEVED_PROMPT : void 0;
97
+ };
45
98
  const normalizeMatchedQuestions = (value) => {
46
99
  if (!Array.isArray(value)) {
47
100
  return [];
@@ -62,24 +115,37 @@ class KnowledgeBaseManager {
62
115
  constructor(plugin) {
63
116
  this.plugin = plugin;
64
117
  }
65
- async retrievePrompt({ username, employee, query }) {
118
+ async retrievePrompt({ username, employee, query, roleNames }) {
66
119
  employee = employee ?? (username ? await this.getEmployee(username) : null);
67
120
  if (!employee) {
68
121
  return "Specified knowledge base not existed";
69
122
  }
70
- const { knowledgeBaseKeys, topK, score } = employee.knowledgeBase ?? {};
71
- if (!knowledgeBaseKeys || import_lodash.default.isEmpty(knowledgeBaseKeys)) {
72
- return "Specified knowledge base not existed";
73
- }
74
- const promptTemplate = import_prompts.ChatPromptTemplate.fromTemplate(employee.knowledgeBasePrompt ?? "{knowledgeBaseData}");
75
- const docs = await this.plugin.features.knowledgeBase.search({ knowledgeBaseKeys, query, topK, score });
123
+ const { knowledgeBaseKeys = [], topK, score } = employee.knowledgeBase ?? {};
124
+ const knowledgeBasePrompt = employee.knowledgeBasePrompt ?? "{knowledgeBaseData}";
125
+ const docs = await this.plugin.features.knowledgeBase.search({ knowledgeBaseKeys, query, topK, score, roleNames });
76
126
  if (!(docs == null ? void 0 : docs.length)) {
77
127
  return "No document match in knowledge base";
78
128
  }
79
129
  const knowledgeBaseData = docs.map((doc) => buildKnowledgeBaseContent(doc.content, doc.metadata)).join("\n");
80
- return import_lodash.default.isEmpty(knowledgeBaseData) ? "No document match in knowledge base" : await promptTemplate.format({
81
- knowledgeBaseData
82
- });
130
+ if (import_lodash.default.isEmpty(knowledgeBaseData)) {
131
+ return "No document match in knowledge base";
132
+ }
133
+ if (!(0, import_ai_employee_validation.hasKnowledgeBaseDataPlaceholder)(knowledgeBasePrompt)) {
134
+ return `${knowledgeBasePrompt}
135
+
136
+ ${knowledgeBaseData}`;
137
+ }
138
+ return import_prompts.ChatPromptTemplate.fromTemplate(knowledgeBasePrompt).format({ knowledgeBaseData });
139
+ }
140
+ async hasAccessibleKnowledgeBase({ employee, roleNames }) {
141
+ var _a;
142
+ const knowledgeBaseKeys = ((_a = employee.knowledgeBase) == null ? void 0 : _a.knowledgeBaseKeys) ?? [];
143
+ const knowledgeBaseFeature = this.plugin.features.knowledgeBase;
144
+ if (!knowledgeBaseFeature.getAccessibleKnowledgeBaseKeys) {
145
+ return true;
146
+ }
147
+ const accessibleKeys = await knowledgeBaseFeature.getAccessibleKnowledgeBaseKeys({ knowledgeBaseKeys, roleNames });
148
+ return accessibleKeys.length > 0;
83
149
  }
84
150
  async isEnabledKnowledgeBase(usernameOrEmployee) {
85
151
  const featureEnabled = this.plugin.features.isFeaturesEnabled(Object.values(import_ai_feature_manager.EEFeatures));
@@ -96,5 +162,14 @@ class KnowledgeBaseManager {
96
162
  }
97
163
  // Annotate the CommonJS export names for ESM import in node:
98
164
  0 && (module.exports = {
99
- KnowledgeBaseManager
165
+ KNOWLEDGE_BASE_NO_ACCESS_PROMPT,
166
+ KNOWLEDGE_BASE_ON_DEMAND_PROMPT,
167
+ KNOWLEDGE_BASE_PRE_RETRIEVED_PROMPT,
168
+ KNOWLEDGE_BASE_RETRIEVAL_STRATEGIES,
169
+ KnowledgeBaseManager,
170
+ getCurrentRoleNames,
171
+ getKnowledgeBaseBackgroundPrompt,
172
+ isKnowledgeBaseRetrievalStrategy,
173
+ normalizeKnowledgeBaseRetrievalStrategy,
174
+ withDefaultKnowledgeBaseRetrievalStrategy
100
175
  });
@@ -98,8 +98,9 @@ const conversationMiddleware = (aiEmployee, options) => {
98
98
  })
99
99
  }),
100
100
  beforeAgent: async (state) => {
101
- const lastHumanMessageIndex = state.lastMessageIndex.lastHumanMessageIndex;
102
- const userMessages = state.messages.filter((x) => x.type === "human").slice(lastHumanMessageIndex).map((x) => x).map(convertHumanMessage);
101
+ const humanMessages = state.messages.filter((x) => x.type === "human");
102
+ const currentHumanMessageIndex = humanMessages.length;
103
+ const userMessages = (aiEmployee.userMessageCount ? humanMessages.slice(-aiEmployee.userMessageCount) : []).map((x) => x).map(convertHumanMessage);
103
104
  await aiEmployee.aiChatConversation.withTransaction(async (conversation, transaction) => {
104
105
  if (agentThread) {
105
106
  await aiEmployee.updateThread(transaction, agentThread);
@@ -111,6 +112,12 @@ const conversationMiddleware = (aiEmployee, options) => {
111
112
  await conversation.addMessages(userMessages);
112
113
  }
113
114
  });
115
+ return {
116
+ lastMessageIndex: {
117
+ ...state.lastMessageIndex,
118
+ lastHumanMessageIndex: currentHumanMessageIndex
119
+ }
120
+ };
114
121
  },
115
122
  afterAgent: async () => {
116
123
  aiEmployee.removeAbortController();
@@ -172,31 +179,30 @@ const conversationMiddleware = (aiEmployee, options) => {
172
179
  const toolCalls = aiMessage.tool_calls;
173
180
  const values = convertAIMessage(aiMessage);
174
181
  if (values) {
175
- await aiEmployee.aiChatConversation.withTransaction(async (conversation, transaction) => {
176
- const result = await conversation.addMessages(values);
177
- newState.messageId = result.messageId;
178
- if (toolCalls == null ? void 0 : toolCalls.length) {
179
- const toolsMap = await aiEmployee.getToolsMap();
180
- const initializedToolCalls = await aiEmployee.initToolCall(
181
- transaction,
182
- result.messageId,
183
- toolCalls
184
- );
185
- fillToolCall(result, toolsMap, initializedToolCalls, toolCalls);
186
- }
182
+ const result = await aiEmployee.persistAIMessage({
183
+ values,
184
+ langChainMessageId: aiMessage.id,
185
+ toolCalls: toolCalls ?? []
187
186
  });
187
+ newState.messageId = result.message.messageId;
188
188
  if (toolCalls == null ? void 0 : toolCalls.length) {
189
- (_b = runtime.writer) == null ? void 0 : _b.call(runtime, {
190
- action: "initToolCalls",
191
- body: { toolCalls },
189
+ const toolsMap = await aiEmployee.getToolsMap();
190
+ fillToolCall(result.message, toolsMap, result.initializedToolCalls, toolCalls);
191
+ }
192
+ if (result.created) {
193
+ if (toolCalls == null ? void 0 : toolCalls.length) {
194
+ (_b = runtime.writer) == null ? void 0 : _b.call(runtime, {
195
+ action: "initToolCalls",
196
+ body: { toolCalls },
197
+ currentConversation
198
+ });
199
+ }
200
+ (_c = runtime.writer) == null ? void 0 : _c.call(runtime, {
201
+ action: "AfterAIMessageSaved",
202
+ body: { id: aiMessage.id, messageId: newState.messageId },
192
203
  currentConversation
193
204
  });
194
205
  }
195
- (_c = runtime.writer) == null ? void 0 : _c.call(runtime, {
196
- action: "AfterAIMessageSaved",
197
- body: { id: aiMessage.id, messageId: newState.messageId },
198
- currentConversation
199
- });
200
206
  }
201
207
  return newState;
202
208
  } catch (e) {
@@ -9,5 +9,6 @@
9
9
  export * from './conversation';
10
10
  export * from './skill-tools';
11
11
  export * from './tool-call-sanitizer';
12
+ export * from './tool-result-integrity';
12
13
  export * from './tools';
13
14
  export * from './workflow-history';
@@ -26,6 +26,7 @@ module.exports = __toCommonJS(middleware_exports);
26
26
  __reExport(middleware_exports, require("./conversation"), module.exports);
27
27
  __reExport(middleware_exports, require("./skill-tools"), module.exports);
28
28
  __reExport(middleware_exports, require("./tool-call-sanitizer"), module.exports);
29
+ __reExport(middleware_exports, require("./tool-result-integrity"), module.exports);
29
30
  __reExport(middleware_exports, require("./tools"), module.exports);
30
31
  __reExport(middleware_exports, require("./workflow-history"), module.exports);
31
32
  // Annotate the CommonJS export names for ESM import in node:
@@ -33,6 +34,7 @@ __reExport(middleware_exports, require("./workflow-history"), module.exports);
33
34
  ...require("./conversation"),
34
35
  ...require("./skill-tools"),
35
36
  ...require("./tool-call-sanitizer"),
37
+ ...require("./tool-result-integrity"),
36
38
  ...require("./tools"),
37
39
  ...require("./workflow-history")
38
40
  });
@@ -0,0 +1,22 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+ import { BaseMessage } from '@langchain/core/messages';
10
+ import type { AIToolMessage } from '../../types/ai-message.type';
11
+ type ToolResultIntegrityLogger = {
12
+ warn: (message: string, meta?: Record<string, unknown>) => void;
13
+ };
14
+ export type NormalizeToolCallHistoryOptions = {
15
+ sessionId: string;
16
+ logger?: ToolResultIntegrityLogger;
17
+ loadToolResults: (toolCallIds: string[]) => Promise<Map<string, AIToolMessage>>;
18
+ };
19
+ export declare const isToolCallHistoryValid: (messages: readonly BaseMessage[]) => boolean;
20
+ export declare const normalizeToolCallHistory: (messages: readonly BaseMessage[], options: NormalizeToolCallHistoryOptions) => Promise<BaseMessage[]>;
21
+ export declare const toolResultIntegrityMiddleware: (options: NormalizeToolCallHistoryOptions) => import("langchain/dist/agents/middleware/types.cjs").AgentMiddleware<undefined, undefined, unknown, readonly (import("@langchain/core/dist/tools").ClientTool | import("@langchain/core/dist/tools").ServerTool)[]>;
22
+ export {};
@@ -0,0 +1,211 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ var __defProp = Object.defineProperty;
11
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
+ var __getOwnPropNames = Object.getOwnPropertyNames;
13
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __export = (target, all) => {
15
+ for (var name in all)
16
+ __defProp(target, name, { get: all[name], enumerable: true });
17
+ };
18
+ var __copyProps = (to, from, except, desc) => {
19
+ if (from && typeof from === "object" || typeof from === "function") {
20
+ for (let key of __getOwnPropNames(from))
21
+ if (!__hasOwnProp.call(to, key) && key !== except)
22
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
23
+ }
24
+ return to;
25
+ };
26
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
27
+ var tool_result_integrity_exports = {};
28
+ __export(tool_result_integrity_exports, {
29
+ isToolCallHistoryValid: () => isToolCallHistoryValid,
30
+ normalizeToolCallHistory: () => normalizeToolCallHistory,
31
+ toolResultIntegrityMiddleware: () => toolResultIntegrityMiddleware
32
+ });
33
+ module.exports = __toCommonJS(tool_result_integrity_exports);
34
+ var import_messages = require("@langchain/core/messages");
35
+ var import_langchain = require("langchain");
36
+ const SYNTHETIC_TOOL_RESULT_ERROR = "Tool execution was interrupted before a result was recorded.";
37
+ const getValidToolCalls = (message) => (message.tool_calls ?? []).filter((toolCall) => typeof toolCall.id === "string" && toolCall.id.length > 0);
38
+ const isToolCallHistoryValid = (messages) => {
39
+ for (let index = 0; index < messages.length; index++) {
40
+ const message = messages[index];
41
+ if (import_messages.ToolMessage.isInstance(message)) {
42
+ return false;
43
+ }
44
+ if (!import_messages.AIMessage.isInstance(message)) {
45
+ continue;
46
+ }
47
+ const toolCalls = getValidToolCalls(message);
48
+ if (!toolCalls.length) {
49
+ continue;
50
+ }
51
+ const expectedToolCallIds = new Set(toolCalls.map((toolCall) => toolCall.id));
52
+ const seenToolResultIds = /* @__PURE__ */ new Set();
53
+ for (let resultIndex = 0; resultIndex < toolCalls.length; resultIndex++) {
54
+ index++;
55
+ if (index >= messages.length) {
56
+ return false;
57
+ }
58
+ const result = messages[index];
59
+ if (!import_messages.ToolMessage.isInstance(result) || !expectedToolCallIds.has(result.tool_call_id) || seenToolResultIds.has(result.tool_call_id)) {
60
+ return false;
61
+ }
62
+ seenToolResultIds.add(result.tool_call_id);
63
+ }
64
+ }
65
+ return true;
66
+ };
67
+ const serializeToolResultContent = (content) => {
68
+ if (typeof content === "string") {
69
+ return content;
70
+ }
71
+ return JSON.stringify(content ?? null);
72
+ };
73
+ const createSyntheticToolResult = (sessionId, toolCall) => new import_messages.ToolMessage({
74
+ id: `synthetic-tool-result:${sessionId}:${toolCall.id}`,
75
+ tool_call_id: toolCall.id,
76
+ name: toolCall.name,
77
+ status: "error",
78
+ content: JSON.stringify({
79
+ status: "error",
80
+ error: SYNTHETIC_TOOL_RESULT_ERROR
81
+ })
82
+ });
83
+ const createRestoredToolResult = (sessionId, toolCall, persisted) => {
84
+ if (!persisted || persisted.invokeStatus !== "confirmed" && persisted.invokeStatus !== "done") {
85
+ return;
86
+ }
87
+ try {
88
+ return new import_messages.ToolMessage({
89
+ id: `restored-tool-result:${sessionId}:${toolCall.id}`,
90
+ tool_call_id: toolCall.id,
91
+ name: toolCall.name,
92
+ status: persisted.status === "error" ? "error" : "success",
93
+ content: serializeToolResultContent(persisted.content)
94
+ });
95
+ } catch {
96
+ return;
97
+ }
98
+ };
99
+ const countMisplacedResults = (messages) => {
100
+ let misplacedResultCount = 0;
101
+ for (let index = 0; index < messages.length; index++) {
102
+ const message = messages[index];
103
+ if (!import_messages.AIMessage.isInstance(message)) {
104
+ continue;
105
+ }
106
+ const toolCalls = getValidToolCalls(message);
107
+ if (!toolCalls.length) {
108
+ continue;
109
+ }
110
+ const expectedToolCallIds = new Set(toolCalls.map((toolCall) => toolCall.id));
111
+ const contiguousResultIds = /* @__PURE__ */ new Set();
112
+ for (let offset = 1; offset <= toolCalls.length; offset++) {
113
+ const result = messages[index + offset];
114
+ if (!import_messages.ToolMessage.isInstance(result)) {
115
+ break;
116
+ }
117
+ if (expectedToolCallIds.has(result.tool_call_id)) {
118
+ contiguousResultIds.add(result.tool_call_id);
119
+ }
120
+ }
121
+ misplacedResultCount += expectedToolCallIds.size - contiguousResultIds.size;
122
+ }
123
+ return misplacedResultCount;
124
+ };
125
+ const normalizeToolCallHistory = async (messages, options) => {
126
+ var _a;
127
+ const toolResultsByCallId = /* @__PURE__ */ new Map();
128
+ const referencedToolCallIds = /* @__PURE__ */ new Set();
129
+ let toolCallCount = 0;
130
+ let toolResultCount = 0;
131
+ for (const message of messages) {
132
+ if (import_messages.AIMessage.isInstance(message)) {
133
+ for (const toolCall of getValidToolCalls(message)) {
134
+ toolCallCount++;
135
+ referencedToolCallIds.add(toolCall.id);
136
+ }
137
+ } else if (import_messages.ToolMessage.isInstance(message)) {
138
+ toolResultCount++;
139
+ if (message.tool_call_id) {
140
+ const results = toolResultsByCallId.get(message.tool_call_id) ?? [];
141
+ results.push(message);
142
+ toolResultsByCallId.set(message.tool_call_id, results);
143
+ }
144
+ }
145
+ }
146
+ const missingToolCallIds = Array.from(referencedToolCallIds).filter((id) => !toolResultsByCallId.has(id));
147
+ const persistedResults = missingToolCallIds.length ? await options.loadToolResults(missingToolCallIds) : /* @__PURE__ */ new Map();
148
+ const normalized = [];
149
+ const nextToolResultIndexByCallId = /* @__PURE__ */ new Map();
150
+ let restoredResultCount = 0;
151
+ let syntheticResultCount = 0;
152
+ let consumedExistingResultCount = 0;
153
+ for (const message of messages) {
154
+ if (import_messages.ToolMessage.isInstance(message)) {
155
+ continue;
156
+ }
157
+ normalized.push(message);
158
+ if (!import_messages.AIMessage.isInstance(message)) {
159
+ continue;
160
+ }
161
+ for (const toolCall of getValidToolCalls(message)) {
162
+ const existingResults = toolResultsByCallId.get(toolCall.id);
163
+ const existingResultIndex = nextToolResultIndexByCallId.get(toolCall.id) ?? 0;
164
+ const existingResult = existingResults == null ? void 0 : existingResults[existingResultIndex];
165
+ if (existingResult) {
166
+ nextToolResultIndexByCallId.set(toolCall.id, existingResultIndex + 1);
167
+ normalized.push(existingResult);
168
+ consumedExistingResultCount++;
169
+ continue;
170
+ }
171
+ const restoredResult = createRestoredToolResult(options.sessionId, toolCall, persistedResults.get(toolCall.id));
172
+ if (restoredResult) {
173
+ normalized.push(restoredResult);
174
+ restoredResultCount++;
175
+ continue;
176
+ }
177
+ normalized.push(createSyntheticToolResult(options.sessionId, toolCall));
178
+ syntheticResultCount++;
179
+ }
180
+ }
181
+ const stats = {
182
+ messageCount: messages.length,
183
+ toolCallCount,
184
+ missingResultCount: missingToolCallIds.length,
185
+ misplacedResultCount: countMisplacedResults(messages),
186
+ orphanResultCount: toolResultCount - consumedExistingResultCount,
187
+ restoredResultCount,
188
+ syntheticResultCount
189
+ };
190
+ (_a = options.logger) == null ? void 0 : _a.warn("Normalize invalid tool call history before model call", {
191
+ sessionId: options.sessionId,
192
+ ...stats
193
+ });
194
+ return normalized;
195
+ };
196
+ const toolResultIntegrityMiddleware = (options) => (0, import_langchain.createMiddleware)({
197
+ name: "ToolResultIntegrityMiddleware",
198
+ wrapModelCall: async (request, handler) => {
199
+ if (isToolCallHistoryValid(request.messages)) {
200
+ return handler(request);
201
+ }
202
+ request.messages = await normalizeToolCallHistory(request.messages, options);
203
+ return handler(request);
204
+ }
205
+ });
206
+ // Annotate the CommonJS export names for ESM import in node:
207
+ 0 && (module.exports = {
208
+ isToolCallHistoryValid,
209
+ normalizeToolCallHistory,
210
+ toolResultIntegrityMiddleware
211
+ });
@@ -0,0 +1,23 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+ export type StreamConversation = {
10
+ sessionId: string;
11
+ from: string;
12
+ username: string;
13
+ };
14
+ export declare class ReasoningStreamState {
15
+ private readonly active;
16
+ start(conversation: StreamConversation): void;
17
+ stop(conversation: StreamConversation): boolean;
18
+ drain(): StreamConversation[];
19
+ }
20
+ export declare const isReasoningFinishChunk: (chunk: {
21
+ response_metadata?: Record<string, unknown>;
22
+ usage_metadata?: Record<string, unknown>;
23
+ }) => boolean;
@@ -0,0 +1,63 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ var __defProp = Object.defineProperty;
11
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
+ var __getOwnPropNames = Object.getOwnPropertyNames;
13
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __export = (target, all) => {
15
+ for (var name in all)
16
+ __defProp(target, name, { get: all[name], enumerable: true });
17
+ };
18
+ var __copyProps = (to, from, except, desc) => {
19
+ if (from && typeof from === "object" || typeof from === "function") {
20
+ for (let key of __getOwnPropNames(from))
21
+ if (!__hasOwnProp.call(to, key) && key !== except)
22
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
23
+ }
24
+ return to;
25
+ };
26
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
27
+ var reasoning_stream_state_exports = {};
28
+ __export(reasoning_stream_state_exports, {
29
+ ReasoningStreamState: () => ReasoningStreamState,
30
+ isReasoningFinishChunk: () => isReasoningFinishChunk
31
+ });
32
+ module.exports = __toCommonJS(reasoning_stream_state_exports);
33
+ const getConversationKey = (conversation) => `${conversation.from}:${conversation.sessionId}:${conversation.username}`;
34
+ class ReasoningStreamState {
35
+ active = /* @__PURE__ */ new Map();
36
+ start(conversation) {
37
+ this.active.set(getConversationKey(conversation), conversation);
38
+ }
39
+ stop(conversation) {
40
+ return this.active.delete(getConversationKey(conversation));
41
+ }
42
+ drain() {
43
+ const conversations = Array.from(this.active.values());
44
+ this.active.clear();
45
+ return conversations;
46
+ }
47
+ }
48
+ const isReasoningFinishChunk = (chunk) => {
49
+ const metadata = chunk.response_metadata;
50
+ if (!metadata) {
51
+ return false;
52
+ }
53
+ const finishReason = metadata.finish_reason ?? metadata.finishReason;
54
+ if (typeof finishReason === "string" && finishReason.length > 0) {
55
+ return true;
56
+ }
57
+ return metadata.status === "completed" || metadata.status === "incomplete" || metadata.status === "failed";
58
+ };
59
+ // Annotate the CommonJS export names for ESM import in node:
60
+ 0 && (module.exports = {
61
+ ReasoningStreamState,
62
+ isReasoningFinishChunk
63
+ });
@@ -57,6 +57,11 @@ var ai_conversations_default = (0, import_database.defineCollection)({
57
57
  defaultValue: "main-agent",
58
58
  allowNull: false
59
59
  },
60
+ {
61
+ name: "scope",
62
+ type: "string",
63
+ index: true
64
+ },
60
65
  {
61
66
  name: "user",
62
67
  type: "belongsTo",
@@ -33,12 +33,12 @@ module.exports = __toCommonJS(constants_exports);
33
33
  const DOCUMENT_PARSE_META_KEY = "documentParse";
34
34
  const SUPPORTED_DOCUMENT_EXTNAMES = [
35
35
  ".pdf",
36
- ".ppt",
37
36
  ".pptx",
38
37
  ".doc",
39
38
  ".docx",
40
39
  ".xls",
41
40
  ".xlsx",
41
+ ".xlsm",
42
42
  ".txt",
43
43
  ".md",
44
44
  ".json",
@@ -7,8 +7,10 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
  import { DocumentSegmentedWithScore, KnowledgeBase, KnowledgeBaseGroup, SearchOptions } from '../types';
10
+ export type KnowledgeBaseAccessOptions = Pick<SearchOptions, 'knowledgeBaseKeys' | 'roleNames'>;
10
11
  export interface KnowledgeBaseFeature {
11
12
  getKnowledgeBase(knowledgeBaseKeys: string[]): Promise<KnowledgeBase[]>;
12
13
  getKnowledgeBaseGroup(knowledgeBaseKeys: string[]): Promise<KnowledgeBaseGroup[]>;
14
+ getAccessibleKnowledgeBaseKeys(options: KnowledgeBaseAccessOptions): Promise<string[]>;
13
15
  search(options: SearchOptions): Promise<DocumentSegmentedWithScore[]>;
14
16
  }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+ import type { Context } from '@nocobase/actions';
10
+ import { type FrontendToolManifest } from '../common/frontend-tools';
11
+ import type { WorkContext } from './types/ai-message.type';
12
+ export declare const extractFrontendToolManifests: (workContext: WorkContext[]) => FrontendToolManifest[];
13
+ export declare const listCurrentFrontendTools: (ctx: Context, sessionId?: string) => Promise<FrontendToolManifest[]>;
14
+ export declare const findCurrentFrontendTool: (ctx: Context, toolId: string, sessionId?: string) => Promise<FrontendToolManifest | undefined>;
15
+ export declare const shouldAutoExecuteFrontendTool: (tools: FrontendToolManifest[], args: unknown) => boolean;
16
+ export declare const prepareToolsForFrontendConversation: <T extends {
17
+ definition: {
18
+ name: string;
19
+ description: string;
20
+ };
21
+ }>(tools: T[], frontendTools: FrontendToolManifest[]) => T[];
22
+ export declare const readFrontendToolResult: (ctx: Context, toolCallId: string) => {
23
+ provided: true;
24
+ value: unknown;
25
+ } | undefined;