plugin-knowledge-base 1.1.2 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,10 @@
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
+ "use strict";(self.webpackChunkplugin_knowledge_base=self.webpackChunkplugin_knowledge_base||[]).push([["911"],{689:function(e,t,r){r.r(t),r.d(t,{KnowledgeBases:function(){return S}});var n=r(156),l=r.n(n),a=r(772),o=r(721),s=r(482);function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}function i(e,t,r,n,l,a,o){try{var s=e[a](o),c=s.value}catch(e){r(e);return}s.done?t(c):Promise.resolve(c).then(n,l)}function u(e){return function(){var t=this,r=arguments;return new Promise(function(n,l){var a=e.apply(t,r);function o(e){i(a,n,l,o,s,"next",e)}function s(e){i(a,n,l,o,s,"throw",e)}o(void 0)})}}function m(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}function d(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r.push.apply(r,n)}return r})(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}),e}function p(e,t){if(null==e)return{};var r,n,l=function(e,t){if(null==e)return{};var r,n,l={},a=Object.keys(e);for(n=0;n<a.length;n++)r=a[n],t.indexOf(r)>=0||(l[r]=e[r]);return l}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)r=a[n],!(t.indexOf(r)>=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(l[r]=e[r])}return l}function f(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r,n,l=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=l){var a=[],o=!0,s=!1;try{for(l=l.call(e);!(o=(r=l.next()).done)&&(a.push(r.value),!t||a.length!==t);o=!0);}catch(e){s=!0,n=e}finally{try{o||null==l.return||l.return()}finally{if(s)throw n}}return a}}(e,t)||function(e,t){if(e){if("string"==typeof e)return c(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);if("Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r)return Array.from(r);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return c(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function y(e,t){var r,n,l,a,o={label:0,sent:function(){if(1&l[0])throw l[1];return l[1]},trys:[],ops:[]};return a={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(a){return function(s){var c=[a,s];if(r)throw TypeError("Generator is already executing.");for(;o;)try{if(r=1,n&&(l=2&c[0]?n.return:c[0]?n.throw||((l=n.return)&&l.call(n),0):n.next)&&!(l=l.call(n,c[1])).done)return l;switch(n=0,l&&(c=[2&c[0],l.value]),c[0]){case 0:case 1:l=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,n=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!(l=(l=o.trys).length>0&&l[l.length-1])&&(6===c[0]||2===c[0])){o=0;continue}if(3===c[0]&&(!l||c[1]>l[0]&&c[1]<l[3])){o.label=c[1];break}if(6===c[0]&&o.label<l[1]){o.label=l[1],l=c;break}if(l&&o.label<l[2]){o.label=l[2],o.ops.push(c);break}l[2]&&o.ops.pop(),o.trys.pop();continue}c=t.call(e,o)}catch(e){c=[6,e],n=0}finally{r=l=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}}}var g=o.Typography.Text,E=o.Typography.Title,h=o.Upload.Dragger,b={pending:{color:"default",label:"Pending"},processing:{color:"processing",label:"Processing"},success:{color:"success",label:"Success"},failed:{color:"error",label:"Failed"}},v={PUBLIC:l().createElement(s.GlobalOutlined,{style:{color:"#52c41a"}}),SHARED:l().createElement(s.TeamOutlined,{style:{color:"#fa8c16"}}),BASIC:l().createElement(s.LockOutlined,{style:{color:"#1890ff"}})},w={PUBLIC:"green",SHARED:"orange",BASIC:"blue"},x=[{label:"\uD83D\uDD12 Basic (Personal)",value:"BASIC"},{label:"\uD83D\uDC65 Shared (Role-based)",value:"SHARED"},{label:"\uD83C\uDF10 Public (System-wide)",value:"PUBLIC"}],S=function(){var e,t,r,c,i,S,C,A,I,O,k=(0,a.useAPIClient)(),B=f((0,n.useState)(!1),2),T=B[0],F=B[1],L=f((0,n.useState)([]),2),R=L[0],P=L[1],D=f((0,n.useState)(null),2),K=D[0],j=D[1],U=f((0,n.useState)(""),2),N=U[0],q=U[1],z=f((0,n.useState)(!1),2),G=z[0],_=z[1],X=f((0,n.useState)([]),2),V=X[0],H=X[1],M=f((0,n.useState)([]),2),Y=M[0],W=M[1],Q=f((0,n.useState)([]),2),$=Q[0],J=Q[1],Z=f((0,n.useState)(!1),2),ee=Z[0],et=Z[1],er=f(o.Form.useForm(),1)[0],en=f((0,n.useState)(!1),2),el=en[0],ea=en[1],eo=f(o.Form.useForm(),1)[0],es=f((0,n.useState)("PUBLIC"),2),ec=es[0],ei=es[1],eu=f((0,n.useState)("LOCAL"),2),em=eu[0],ed=eu[1],ep=f(o.Form.useForm(),1)[0],ef=f((0,n.useState)("PUBLIC"),2),ey=ef[0],eg=ef[1],eE=f((0,n.useState)("LOCAL"),2),eh=eE[0],eb=eE[1],ev=(e=u(function(){var e,t,r,n,l;return y(this,function(a){switch(a.label){case 0:F(!0),a.label=1;case 1:return a.trys.push([1,3,4,5]),[4,k.request({url:"aiKnowledgeBase:list",params:{sort:["-createdAt"],appends:["documents"]}})];case 2:return P(n=null!=(r=null==(t=a.sent())||null==(e=t.data)?void 0:e.data)?r:[]),!K&&n.length>0?j(n[0]):K&&(l=n.find(function(e){return e.id===K.id}))&&j(l),[3,5];case 3:return a.sent(),o.message.error("Failed to load knowledge bases"),[3,5];case 4:return F(!1),[7];case 5:return[2]}})}),function(){return e.apply(this,arguments)}),ew=(t=u(function(){var e,t,r,n,l,a;return y(this,function(o){switch(o.label){case 0:return o.trys.push([0,3,,4]),[4,k.request({url:"aiVectorStore:list"})];case 1:return W(null!=(n=null==(r=o.sent())||null==(e=r.data)?void 0:e.data)?n:[]),[4,k.request({url:"roles:list"})];case 2:return J((null!=(a=null==(l=o.sent())||null==(t=l.data)?void 0:t.data)?a:[]).map(function(e){return{label:e.title||e.name,value:e.name}})),[3,4];case 3:return o.sent(),[3,4];case 4:return[2]}})}),function(){return t.apply(this,arguments)}),ex=(0,n.useCallback)((r=u(function(e){var t,r,n;return y(this,function(l){switch(l.label){case 0:_(!0),l.label=1;case 1:return l.trys.push([1,3,4,5]),[4,k.request({url:"aiKnowledgeBaseDoc:list",params:{filter:{knowledgeBaseId:e},sort:["-createdAt"]}})];case 2:return H(null!=(n=null==(r=l.sent())||null==(t=r.data)?void 0:t.data)?n:[]),[3,5];case 3:return l.sent(),o.message.error("Failed to load documents"),[3,5];case 4:return _(!1),[7];case 5:return[2]}})}),function(e){return r.apply(this,arguments)}),[k]);(0,n.useEffect)(function(){ev(),ew()},[]),(0,n.useEffect)(function(){if(K){ex(K.id);var e=m({},K);K.options&&Object.assign(e,K.options),ep.setFieldsValue(e),eg(K.accessLevel),eb(K.type||"LOCAL")}},[null==K?void 0:K.id,ex]);var eS=(c=u(function(){var e,t,r,n,l,a,s,c,i;return y(this,function(u){switch(u.label){case 0:return u.trys.push([0,3,,4]),[4,eo.validateFields()];case 1:return t=(e=u.sent()).ragApiUrl,r=e.ragApiKey,n=e.ragNamespace,l=e.ragTopK,a=e.ragScoreThreshold,c=d(m({},s=p(e,["ragApiUrl","ragApiKey","ragNamespace","ragTopK","ragScoreThreshold"])),{options:{}}),"EXTERNAL_RAG"===s.type&&(c.options={ragApiUrl:t,ragApiKey:r,ragNamespace:n,ragTopK:l,ragScoreThreshold:a}),[4,k.request({url:"aiKnowledgeBase:create",method:"post",data:{values:c}})];case 2:return i=u.sent(),o.message.success("Created successfully"),ea(!1),ev(),j(i.data.data),[3,4];case 3:return u.sent(),o.message.error("Create failed"),[3,4];case 4:return[2]}})}),function(){return c.apply(this,arguments)}),eC=(i=u(function(){var e,t,r,n,l,a,s,c;return y(this,function(i){switch(i.label){case 0:return i.trys.push([0,3,,4]),[4,ep.validateFields()];case 1:if(e=i.sent(),!K)return[2];return t=e.ragApiUrl,r=e.ragApiKey,n=e.ragNamespace,l=e.ragTopK,a=e.ragScoreThreshold,c=d(m({},s=p(e,["ragApiUrl","ragApiKey","ragNamespace","ragTopK","ragScoreThreshold"])),{options:{}}),"EXTERNAL_RAG"===s.type&&(c.options={ragApiUrl:t,ragApiKey:r,ragNamespace:n,ragTopK:l,ragScoreThreshold:a}),[4,k.request({url:"aiKnowledgeBase:update",method:"post",params:{filterByTk:K.id},data:{values:c}})];case 2:return i.sent(),o.message.success("Settings updated successfully"),ev(),[3,4];case 3:return i.sent(),o.message.error("Update failed"),[3,4];case 4:return[2]}})}),function(){return i.apply(this,arguments)}),eA=(S=u(function(e){return y(this,function(t){switch(t.label){case 0:return t.trys.push([0,2,,3]),[4,k.request({url:"aiKnowledgeBase:destroy",method:"post",params:{filterByTk:e}})];case 1:return t.sent(),o.message.success("Deleted successfully"),(null==K?void 0:K.id)===e&&j(null),ev(),[3,3];case 2:return t.sent(),o.message.error("Delete failed"),[3,3];case 3:return[2]}})}),function(e){return S.apply(this,arguments)}),eI=function(e,t,r){if(K){var n=new FormData;n.append("file",e);var l=K.fileStorage?"?storageRule=".concat(encodeURIComponent(K.fileStorage)):"";k.axios.post("aiFiles:create".concat(l),n,{headers:{"Content-Type":"multipart/form-data"}}).then(function(r){return null==t?void 0:t(r.data,e)}).catch(function(e){return null==r?void 0:r(e)})}},eO=(C=u(function(){var e;return y(this,function(t){switch(t.label){case 0:return t.trys.push([0,3,,4]),[4,er.validateFields()];case 1:if(e=t.sent(),!K)return[2];return[4,k.request({url:"aiKnowledgeBaseDoc:create",method:"post",data:{values:{knowledgeBaseId:K.id,filename:e.filename,textContent:e.textContent,status:"pending"}}})];case 2:return t.sent(),o.message.success("Text document added"),et(!1),er.resetFields(),ex(K.id),[3,4];case 3:return t.sent(),o.message.error("Failed to add text document"),[3,4];case 4:return[2]}})}),function(){return C.apply(this,arguments)}),ek=(A=u(function(e){return y(this,function(t){switch(t.label){case 0:return t.trys.push([0,2,,3]),[4,k.request({url:"aiKnowledgeBaseDoc:destroy",method:"post",params:{filterByTk:e}})];case 1:return t.sent(),o.message.success("Document deleted"),K&&ex(K.id),[3,3];case 2:return t.sent(),o.message.error("Delete failed"),[3,3];case 3:return[2]}})}),function(e){return A.apply(this,arguments)}),eB=(I=u(function(e){return y(this,function(t){switch(t.label){case 0:return t.trys.push([0,2,,3]),[4,k.request({url:"aiKnowledgeBaseDoc:reprocess",method:"post",params:{filterByTk:e}})];case 1:return t.sent(),o.message.success("Reprocessing started"),K&&ex(K.id),[3,3];case 2:return t.sent(),o.message.error("Reprocess failed"),[3,3];case 3:return[2]}})}),function(e){return I.apply(this,arguments)}),eT=function(e,t,r,n,a){return l().createElement(l().Fragment,null,l().createElement(o.Form.Item,{name:"name",label:"Name",rules:[{required:!0}]},l().createElement(o.Input,null)),l().createElement(o.Row,{gutter:16},l().createElement(o.Col,{span:12},l().createElement(o.Form.Item,{name:"type",label:"Type",rules:[{required:!0}]},l().createElement(o.Select,{options:[{label:"Local (Vector DB)",value:"LOCAL"},{label:"Readonly",value:"READONLY"},{label:"External (Linked)",value:"EXTERNAL"},{label:"External RAG API",value:"EXTERNAL_RAG"}],onChange:a}))),l().createElement(o.Col,{span:12},l().createElement(o.Form.Item,{name:"accessLevel",label:"Access Level",rules:[{required:!0}]},l().createElement(o.Select,{options:x,onChange:n})))),"SHARED"===r&&l().createElement(o.Row,{gutter:16},l().createElement(o.Col,{span:12},l().createElement(o.Form.Item,{name:"allowedRoles",label:"Allowed Roles (view)",rules:[{required:!0}]},l().createElement(o.Select,{mode:"multiple",options:$}))),l().createElement(o.Col,{span:12},l().createElement(o.Form.Item,{name:"uploadRoles",label:"Upload Roles (add docs)"},l().createElement(o.Select,{mode:"multiple",options:$})))),"EXTERNAL_RAG"!==t?l().createElement(o.Form.Item,{name:"vectorStoreId",label:"Vector Store",rules:[{required:!0}]},l().createElement(o.Select,{options:Y.map(function(e){return{label:e.name,value:e.id}})})):l().createElement("div",{style:{background:"#f5f5f5",padding:16,borderRadius:8,marginBottom:24}},l().createElement(g,{strong:!0,style:{display:"block",marginBottom:16}},"External RAG Configuration"),l().createElement(o.Form.Item,{name:"ragApiUrl",label:"API URL",rules:[{required:!0,type:"url"}]},l().createElement(o.Input,{placeholder:"https://api.example.com/rag/search"})),l().createElement(o.Row,{gutter:16},l().createElement(o.Col,{span:12},l().createElement(o.Form.Item,{name:"ragApiKey",label:"API Key"},l().createElement(o.Input.Password,{placeholder:"Bearer token (optional)"}))),l().createElement(o.Col,{span:12},l().createElement(o.Form.Item,{name:"ragNamespace",label:"Namespace"},l().createElement(o.Input,{placeholder:"Optional namespace"})))),l().createElement(o.Row,{gutter:16},l().createElement(o.Col,{span:12},l().createElement(o.Form.Item,{name:"ragTopK",label:"Top K"},l().createElement(o.Input,{type:"number",placeholder:"Default: 5"}))),l().createElement(o.Col,{span:12},l().createElement(o.Form.Item,{name:"ragScoreThreshold",label:"Score Threshold"},l().createElement(o.Input,{type:"number",placeholder:"Default: 0.0",step:"0.1",max:1,min:0}))))),l().createElement(o.Form.Item,{name:"description",label:"Description"},l().createElement(o.Input.TextArea,{autoSize:{minRows:3}})),l().createElement(o.Row,{gutter:16},l().createElement(o.Col,{span:8},l().createElement(o.Form.Item,{name:"enabled",label:"Enabled",valuePropName:"checked"},l().createElement(o.Switch,null))),l().createElement(o.Col,{span:8},l().createElement(o.Form.Item,{name:"deleteSourceFile",label:"Delete source file",valuePropName:"checked"},l().createElement(o.Switch,null))),l().createElement(o.Col,{span:8},l().createElement(o.Form.Item,{name:"useDocpixie",label:"Use DocPixie OCR",valuePropName:"checked"},l().createElement(o.Switch,null)))))};return l().createElement("div",{style:{display:"flex",height:"calc(100vh - 56px)",overflow:"hidden"}},(O=R.filter(function(e){return e.name.toLowerCase().includes(N.toLowerCase())}),l().createElement("div",{style:{width:280,borderRight:"1px solid #f0f0f0",display:"flex",flexDirection:"column",background:"#fafafa",height:"100%"}},l().createElement("div",{style:{padding:"16px",display:"flex",flexDirection:"column",gap:12,borderBottom:"1px solid #f0f0f0"}},l().createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"}},l().createElement(g,{strong:!0,style:{fontSize:16}},"Knowledge Bases"),l().createElement(o.Button,{type:"primary",size:"small",icon:l().createElement(s.PlusOutlined,null),onClick:function(){eo.resetFields(),eo.setFieldsValue({accessLevel:"PUBLIC",enabled:!0,type:"LOCAL"}),ei("PUBLIC"),ed("LOCAL"),ea(!0)}},"Add")),l().createElement(o.Input.Search,{placeholder:"Filter knowledge bases...",allowClear:!0,onChange:function(e){return q(e.target.value)}})),l().createElement("div",{style:{flex:1,overflowY:"auto"}},T&&0===O.length?l().createElement("div",{style:{padding:24,textAlign:"center"}},l().createElement(o.Spin,null)):0===O.length?l().createElement(o.Empty,{description:"No knowledge bases found",style:{marginTop:24}}):O.map(function(e){var t,r,n=(null==K?void 0:K.id)===e.id,a=(null==(t=e.documents)?void 0:t.length)||0,s=(null==(r=e.documents)?void 0:r.filter(function(e){return"failed"===e.status}).length)||0;return l().createElement("div",{key:e.id,onClick:function(){return j(e)},style:{padding:"12px 16px",cursor:"pointer",background:n?"#e6f4ff":"transparent",borderLeft:n?"3px solid #1890ff":"3px solid transparent",borderBottom:"1px solid #f8f8f8",transition:"all 0.2s"}},l().createElement("div",{style:{display:"flex",alignItems:"center",gap:8}},v[e.accessLevel||"PUBLIC"],l().createElement(g,{strong:n,style:{flex:1,fontSize:14},ellipsis:!0},e.name)),l().createElement("div",{style:{marginTop:6,display:"flex",justifyContent:"space-between",alignItems:"center"}},l().createElement(o.Tag,{color:w[e.accessLevel||"PUBLIC"],style:{border:0}},e.accessLevel||"PUBLIC"),l().createElement(g,{type:"secondary",style:{fontSize:12}},a," docs ",s>0&&l().createElement("span",{style:{color:"#ff4d4f"}},"• ",s," err"))))})))),l().createElement("div",{style:{flex:1,display:"flex",flexDirection:"column",background:"#fff",overflow:"hidden"}},K?l().createElement(l().Fragment,null,l().createElement("div",{style:{padding:"24px 32px 16px",borderBottom:"1px solid #f0f0f0"}},l().createElement("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",marginBottom:8}},l().createElement("div",null,l().createElement(E,{level:4,style:{margin:0,marginBottom:4}},K.name),l().createElement(o.Space,null,l().createElement(o.Tag,null,K.type||"LOCAL"),K.vectorStore&&l().createElement(o.Tag,{icon:l().createElement(s.SettingOutlined,null)},K.vectorStore.name))),l().createElement(o.Popconfirm,{title:"Delete this knowledge base?",onConfirm:function(){return eA(K.id)}},l().createElement(o.Button,{danger:!0,ghost:!0,icon:l().createElement(s.DeleteOutlined,null)},"Delete"))),l().createElement(g,{type:"secondary",style:{display:"block",maxWidth:800}},K.description||"No description provided.")),l().createElement(o.Tabs,{defaultActiveKey:"documents",style:{flex:1,display:"flex",flexDirection:"column"},className:"kb-detail-tabs",items:[{key:"documents",label:"Documents",children:l().createElement("div",{style:{padding:"24px 32px",overflowY:"auto",height:"100%"}},(null==K?void 0:K.type)==="EXTERNAL_RAG"?l().createElement("div",{style:{padding:48,textAlign:"center"}},l().createElement(o.Empty,{description:"External RAG Knowledge Base. Documents are managed by the external service."})):l().createElement("div",{style:{display:"flex",flexDirection:"column",height:"100%"}},l().createElement("div",{style:{display:"flex",gap:16,marginBottom:24}},l().createElement(h,{name:"file",multiple:!0,showUploadList:!1,accept:".txt,.md,.pdf,.doc,.docx,.ppt,.pptx,.csv,.json",customRequest:function(e){return eI(e.file,e.onSuccess,e.onError)},onChange:function(e){if("done"===e.file.status){var t,r=null==(t=e.file.response)?void 0:t.data;r&&K&&k.request({url:"aiKnowledgeBaseDoc:create",method:"post",data:{values:{knowledgeBaseId:K.id,fileId:r.id,filename:r.filename||e.file.name,status:"pending"}}}).then(function(){o.message.success('"'.concat(e.file.name,'" uploaded')),ex(K.id)})}else"error"===e.file.status&&o.message.error("Upload failed: ".concat(e.file.name))},style:{flex:1,padding:"24px 0",background:"#fafafa"}},l().createElement("p",{className:"ant-upload-drag-icon",style:{marginBottom:8}},l().createElement(s.InboxOutlined,null)),l().createElement("p",{className:"ant-upload-text",style:{margin:0,marginBottom:8}},"Drag files here or click to upload"),l().createElement(o.Space,null,l().createElement(o.Button,{type:"primary",size:"small",icon:l().createElement(s.UploadOutlined,null)},"Upload File"))),l().createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",width:240,border:"1px dashed #d9d9d9",borderRadius:8,background:"#fafafa",padding:16,textAlign:"center"}},l().createElement(s.FileTextOutlined,{style:{fontSize:32,color:"#1890ff",marginBottom:12}}),l().createElement(g,{style:{marginBottom:12}},"Paste plain text content"),l().createElement("div",null,l().createElement(o.Button,{onClick:function(){return et(!0)},icon:l().createElement(s.PlusOutlined,null)},"Paste Text")))),G?l().createElement("div",{style:{padding:48,textAlign:"center"}},l().createElement(o.Spin,null)):0===V.length?l().createElement(o.Empty,{description:"No documents yet"}):l().createElement(o.Row,{gutter:[16,16]},V.map(function(e){var t=b[e.status]||{color:"default",label:e.status},r="processing"===e.status,n=K.deleteSourceFile&&!e.fileId&&!e.textContent;return l().createElement(o.Col,{span:8,key:e.id},l().createElement(o.Card,{size:"small",hoverable:!0,actions:[l().createElement(o.Tooltip,{title:r?"Processing...":n?"Source file deleted":"Reprocess",key:"reprocess"},l().createElement(o.Button,{type:"text",icon:l().createElement(s.ReloadOutlined,null),onClick:function(){return eB(e.id)},disabled:r||n})),l().createElement(o.Popconfirm,{title:"Delete document?",onConfirm:function(){return ek(e.id)},key:"delete"},l().createElement(o.Tooltip,{title:"Delete"},l().createElement(o.Button,{type:"text",danger:!0,icon:l().createElement(s.DeleteOutlined,null)})))]},l().createElement(o.Card.Meta,{avatar:l().createElement(s.FileTextOutlined,{style:{fontSize:24,color:"#8c8c8c"}}),title:l().createElement(o.Tooltip,{title:e.filename},l().createElement(g,{ellipsis:!0,style:{maxWidth:"100%"}},e.filename)),description:l().createElement(o.Space,{direction:"vertical",size:2,style:{width:"100%"}},l().createElement(o.Space,{style:{display:"flex",justifyContent:"space-between",width:"100%"}},l().createElement(o.Tag,{color:t.color,style:{margin:0}},t.label),l().createElement(g,{type:"secondary",style:{fontSize:12}},e.chunkCount||0," chunks")),e.error&&"failed"===e.status&&l().createElement(g,{type:"danger",style:{fontSize:12,display:"block",marginTop:4},ellipsis:!0},e.error))})))}))))},{key:"settings",label:"Settings",children:l().createElement("div",{style:{padding:"24px 32px",overflowY:"auto",height:"100%",maxWidth:800}},l().createElement(o.Form,{form:ep,layout:"vertical",onFinish:eC},eT(ep,eh,ey,eg,eb),l().createElement(o.Form.Item,null,l().createElement(o.Button,{type:"primary",htmlType:"submit"},"Save Changes"))))}]})):l().createElement("div",{style:{flex:1,display:"flex",alignItems:"center",justifyContent:"center"}},l().createElement(o.Empty,{description:"Select a knowledge base from the sidebar or create a new one"}))),l().createElement(o.Modal,{title:"Create Knowledge Base",open:el,onOk:eS,onCancel:function(){return ea(!1)},width:700,destroyOnClose:!0},l().createElement(o.Form,{form:eo,layout:"vertical"},eT(eo,em,ec,ei,ed))),l().createElement(o.Modal,{title:"Add Text Document",open:ee,onOk:eO,onCancel:function(){return et(!1)},width:600,destroyOnClose:!0},l().createElement(o.Form,{form:er,layout:"vertical"},l().createElement(o.Form.Item,{name:"filename",label:"Document Name",rules:[{required:!0}]},l().createElement(o.Input,{placeholder:"e.g. FAQ"})),l().createElement(o.Form.Item,{name:"textContent",label:"Content",rules:[{required:!0}]},l().createElement(o.Input.TextArea,{autoSize:{minRows:6,maxRows:16}})))))};t.default=S}}]);
@@ -0,0 +1,10 @@
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
+ "use strict";(self.webpackChunkplugin_knowledge_base=self.webpackChunkplugin_knowledge_base||[]).push([["642"],{517:function(e,t,r){r.r(t),r.d(t,{Infrastructure:function(){return E}});var n=r(156),a=r.n(n),l=r(772),s=r(721),c=r(482);function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}function u(e,t,r,n,a,l,s){try{var c=e[l](s),o=c.value}catch(e){r(e);return}c.done?t(o):Promise.resolve(o).then(n,a)}function i(e){return function(){var t=this,r=arguments;return new Promise(function(n,a){var l=e.apply(t,r);function s(e){u(l,n,a,s,c,"next",e)}function c(e){u(l,n,a,s,c,"throw",e)}s(void 0)})}}function d(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){var n;n=r[t],t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n})}return e}function m(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},l=Object.keys(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)r=l[n],!(t.indexOf(r)>=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}function p(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r,n,a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var l=[],s=!0,c=!1;try{for(a=a.call(e);!(s=(r=a.next()).done)&&(l.push(r.value),!t||l.length!==t);s=!0);}catch(e){c=!0,n=e}finally{try{s||null==a.return||a.return()}finally{if(c)throw n}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return o(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);if("Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r)return Array.from(r);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return o(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function f(e,t){var r,n,a,l,s={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]};return l={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(l[Symbol.iterator]=function(){return this}),l;function c(l){return function(c){var o=[l,c];if(r)throw TypeError("Generator is already executing.");for(;s;)try{if(r=1,n&&(a=2&o[0]?n.return:o[0]?n.throw||((a=n.return)&&a.call(n),0):n.next)&&!(a=a.call(n,o[1])).done)return a;switch(n=0,a&&(o=[2&o[0],a.value]),o[0]){case 0:case 1:a=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,n=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(a=(a=s.trys).length>0&&a[a.length-1])&&(6===o[0]||2===o[0])){s=0;continue}if(3===o[0]&&(!a||o[1]>a[0]&&o[1]<a[3])){s.label=o[1];break}if(6===o[0]&&s.label<a[1]){s.label=a[1],a=o;break}if(a&&s.label<a[2]){s.label=a[2],s.ops.push(o);break}a[2]&&s.ops.pop(),s.trys.pop();continue}o=t.call(e,s)}catch(e){o=[6,e],n=0}finally{r=a=0}if(5&o[0])throw o[1];return{value:o[0]?o[1]:void 0,done:!0}}}}var y=s.Typography.Text,b=s.Typography.Title,E=function(){var e,t,r,o,u,E,g,v,h,w,S=(0,l.useAPIClient)(),C=p((0,n.useState)([]),2),O=C[0],k=C[1],I=p((0,n.useState)(!1),2),x=I[0],D=I[1],F=p((0,n.useState)(!1),2),P=F[0],V=F[1],q=p((0,n.useState)(null),2),M=q[0],A=q[1],B=p((0,n.useState)(null),2),T=B[0],j=B[1],L=p((0,n.useState)(!1),2),N=L[0],H=L[1],R=p(s.Form.useForm(),1)[0],U=p((0,n.useState)([]),2),z=U[0],_=U[1],G=p((0,n.useState)(!1),2),K=G[0],Q=G[1],W=p((0,n.useState)(!1),2),$=W[0],J=W[1],X=p((0,n.useState)(null),2),Y=X[0],Z=X[1],ee=p((0,n.useState)([]),2),et=ee[0],er=ee[1],en=p((0,n.useState)([]),2),ea=en[0],el=en[1],es=p((0,n.useState)(!1),2),ec=es[0],eo=es[1],eu=p(s.Form.useForm(),1)[0],ei=p((0,n.useState)("databases"),2),ed=ei[0],em=ei[1],ep=(e=i(function(){var e,t,r;return f(this,function(n){switch(n.label){case 0:D(!0),n.label=1;case 1:return n.trys.push([1,3,4,5]),[4,S.request({url:"aiVectorDatabase:list"})];case 2:return k(null!=(r=null==(t=n.sent())||null==(e=t.data)?void 0:e.data)?r:[]),[3,5];case 3:return n.sent(),s.message.error("Failed to load vector databases"),[3,5];case 4:return D(!1),[7];case 5:return[2]}})}),function(){return e.apply(this,arguments)}),ef=(t=i(function(){var e,t,r;return f(this,function(n){switch(n.label){case 0:Q(!0),n.label=1;case 1:return n.trys.push([1,3,4,5]),[4,S.request({url:"aiVectorStore:list"})];case 2:return _(null!=(r=null==(t=n.sent())||null==(e=t.data)?void 0:e.data)?r:[]),[3,5];case 3:return n.sent(),s.message.error("Failed to load vector stores"),[3,5];case 4:return Q(!1),[7];case 5:return[2]}})}),function(){return t.apply(this,arguments)}),ey=(r=i(function(){var e,t,r;return f(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,S.request({url:"ai:listLLMServices"})];case 1:return er(null!=(r=null==(t=n.sent())||null==(e=t.data)?void 0:e.data)?r:[]),[3,3];case 2:return n.sent(),[3,3];case 3:return[2]}})}),function(){return r.apply(this,arguments)}),eb=(o=i(function(e){var t,r,n;return f(this,function(a){switch(a.label){case 0:eo(!0),el([]),a.label=1;case 1:return a.trys.push([1,3,4,5]),[4,S.request({url:"ai:listModels",params:{llmService:e}})];case 2:return el(null!=(n=null==(r=a.sent())||null==(t=r.data)?void 0:t.data)?n:[]),[3,5];case 3:return a.sent(),el([]),[3,5];case 4:return eo(!1),[7];case 5:return[2]}})}),function(e){return o.apply(this,arguments)});(0,n.useEffect)(function(){ep(),ef(),ey()},[]);var eE=function(e){A(e),j(null),R.setFieldsValue(d({name:e.name,provider:e.provider},e.connectParams)),V(!0)},eg=(u=i(function(){var e,t,r,n,a,l,s;return f(this,function(c){switch(c.label){case 0:H(!0),j(null),c.label=1;case 1:return c.trys.push([1,4,5,6]),[4,R.validateFields()];case 2:return(t=c.sent()).name,r=t.provider,n=m(t,["name","provider"]),[4,S.request({url:"aiVectorDatabase:test",method:"post",data:{values:{provider:r,connectParams:n}}})];case 3:return j(null!=(l=null==(a=c.sent())||null==(e=a.data)?void 0:e.data)?l:{success:!1,error:"Unknown error"}),[3,6];case 4:return j({success:!1,error:null!=(s=c.sent().message)?s:"Test failed"}),[3,6];case 5:return H(!1),[7];case 6:return[2]}})}),function(){return u.apply(this,arguments)}),ev=(E=i(function(){var e,t,r;return f(this,function(n){switch(n.label){case 0:return n.trys.push([0,6,,7]),[4,R.validateFields()];case 1:if(t=(e=n.sent()).name,r={name:t,provider:e.provider,connectParams:m(e,["name","provider"])},!M)return[3,3];return[4,S.request({url:"aiVectorDatabase:update",method:"post",params:{filterByTk:M.id},data:{values:r}})];case 2:return n.sent(),s.message.success("Updated successfully"),[3,5];case 3:return[4,S.request({url:"aiVectorDatabase:create",method:"post",data:{values:r}})];case 4:n.sent(),s.message.success("Created successfully"),n.label=5;case 5:return V(!1),ep(),[3,7];case 6:return n.sent(),s.message.error("Operation failed"),[3,7];case 7:return[2]}})}),function(){return E.apply(this,arguments)}),eh=(g=i(function(e){return f(this,function(t){switch(t.label){case 0:return t.trys.push([0,2,,3]),[4,S.request({url:"aiVectorDatabase:destroy",method:"post",params:{filterByTk:e}})];case 1:return t.sent(),s.message.success("Deleted successfully"),ep(),[3,3];case 2:return t.sent(),s.message.error("Delete failed"),[3,3];case 3:return[2]}})}),function(e){return g.apply(this,arguments)}),ew=function(e){Z(e);var t=d({},e);t.embeddingModel&&!Array.isArray(t.embeddingModel)&&(t.embeddingModel=[t.embeddingModel]),eu.setFieldsValue(t),J(!0),e.llmService&&eb(e.llmService)},eS=(v=i(function(){var e;return f(this,function(t){switch(t.label){case 0:return t.trys.push([0,6,,7]),[4,eu.validateFields()];case 1:if(Array.isArray((e=t.sent()).embeddingModel)&&(e.embeddingModel=e.embeddingModel[0]||""),!Y)return[3,3];return[4,S.request({url:"aiVectorStore:update",method:"post",params:{filterByTk:Y.id},data:{values:e}})];case 2:return t.sent(),s.message.success("Updated successfully"),[3,5];case 3:return[4,S.request({url:"aiVectorStore:create",method:"post",data:{values:e}})];case 4:t.sent(),s.message.success("Created successfully"),t.label=5;case 5:return J(!1),ef(),[3,7];case 6:return t.sent(),s.message.error("Operation failed"),[3,7];case 7:return[2]}})}),function(){return v.apply(this,arguments)}),eC=(h=i(function(e){return f(this,function(t){switch(t.label){case 0:return t.trys.push([0,2,,3]),[4,S.request({url:"aiVectorStore:destroy",method:"post",params:{filterByTk:e}})];case 1:return t.sent(),s.message.success("Deleted successfully"),ef(),[3,3];case 2:return t.sent(),s.message.error("Delete failed"),[3,3];case 3:return[2]}})}),function(e){return h.apply(this,arguments)}),eO=a().useMemo(function(){var e={};return et.forEach(function(t){e[t.name]=t.title||t.name}),e},[et]);return a().createElement("div",{style:{padding:32,maxWidth:1200,margin:"0 auto"}},a().createElement("div",{style:{marginBottom:24}},a().createElement(b,{level:3},"Knowledge Base Infrastructure"),a().createElement(y,{type:"secondary"},"Manage the underlying infrastructure that powers your AI knowledge bases.")),a().createElement(s.Card,{bodyStyle:{padding:0}},a().createElement(s.Tabs,{activeKey:ed,onChange:em,className:"infrastructure-tabs",size:"large",tabBarStyle:{padding:"0 24px",margin:0,backgroundColor:"#fafafa",borderBottom:"1px solid #f0f0f0"},items:[{key:"databases",label:a().createElement("span",null,a().createElement(c.HddOutlined,null),"Vector Databases"),children:a().createElement("div",{style:{padding:24,minHeight:400}},a().createElement(a().Fragment,null,a().createElement("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:24,alignItems:"center"}},a().createElement("div",null,a().createElement(b,{level:5,style:{margin:0}},"Vector Databases"),a().createElement(y,{type:"secondary"},"Physical databases storing the vector embeddings (e.g. PostgreSQL with pgvector).")),a().createElement(s.Button,{type:"primary",icon:a().createElement(c.PlusOutlined,null),onClick:function(){A(null),j(null),R.resetFields(),R.setFieldsValue({provider:"pgvector",port:5432,host:"localhost"}),V(!0)}},"Add Database")),x?a().createElement("div",{style:{padding:48,textAlign:"center"}},a().createElement(s.Spin,{size:"large"})):0===O.length?a().createElement(s.Empty,{description:"No vector databases configured",style:{padding:48}}):a().createElement(s.Row,{gutter:[16,16]},O.map(function(e){var t,r,n,l;return a().createElement(s.Col,{span:8,key:e.id},a().createElement(s.Card,{hoverable:!0,size:"small",title:a().createElement(s.Space,null,a().createElement(c.HddOutlined,{style:{color:"#1890ff"}}),a().createElement(y,{strong:!0},e.name)),extra:a().createElement(s.Tag,{color:"blue"},e.provider),actions:[a().createElement(s.Button,{type:"text",key:"edit",icon:a().createElement(c.EditOutlined,null),onClick:function(){return eE(e)}},"Edit"),a().createElement(s.Popconfirm,{key:"delete",title:"Delete this database?",onConfirm:function(){return eh(e.id)}},a().createElement(s.Button,{type:"text",danger:!0,icon:a().createElement(c.DeleteOutlined,null)},"Delete"))]},a().createElement("div",{style:{display:"flex",flexDirection:"column",gap:8}},a().createElement("div",{style:{display:"flex",justifyContent:"space-between"}},a().createElement(y,{type:"secondary"},"Host"),a().createElement(y,null,null==(t=e.connectParams)?void 0:t.host,":",null==(r=e.connectParams)?void 0:r.port)),a().createElement("div",{style:{display:"flex",justifyContent:"space-between"}},a().createElement(y,{type:"secondary"},"Database"),a().createElement(y,null,null==(n=e.connectParams)?void 0:n.database)),a().createElement("div",{style:{display:"flex",justifyContent:"space-between"}},a().createElement(y,{type:"secondary"},"Table"),a().createElement(y,null,null==(l=e.connectParams)?void 0:l.tableName)))))}))))},{key:"stores",label:a().createElement("span",null,a().createElement(c.DatabaseOutlined,null),"Vector Stores"),children:a().createElement("div",{style:{padding:24,minHeight:400}},a().createElement(a().Fragment,null,a().createElement("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:24,alignItems:"center"}},a().createElement("div",null,a().createElement(b,{level:5,style:{margin:0}},"Vector Stores"),a().createElement(y,{type:"secondary"},"Logical connections combining a vector database with an embedding model.")),a().createElement(s.Button,{type:"primary",icon:a().createElement(c.PlusOutlined,null),onClick:function(){Z(null),el([]),eu.resetFields(),J(!0)}},"Add Vector Store")),K?a().createElement("div",{style:{padding:48,textAlign:"center"}},a().createElement(s.Spin,{size:"large"})):0===z.length?a().createElement(s.Empty,{description:"No vector stores configured",style:{padding:48}}):a().createElement(s.Row,{gutter:[16,16]},z.map(function(e){var t;return a().createElement(s.Col,{span:8,key:e.id},a().createElement(s.Card,{hoverable:!0,size:"small",title:a().createElement(s.Space,null,a().createElement(c.DatabaseOutlined,{style:{color:"#52c41a"}}),a().createElement(y,{strong:!0},e.name)),actions:[a().createElement(s.Button,{type:"text",key:"edit",icon:a().createElement(c.EditOutlined,null),onClick:function(){return ew(e)}},"Edit"),a().createElement(s.Popconfirm,{key:"delete",title:"Delete this vector store?",onConfirm:function(){return eC(e.id)}},a().createElement(s.Button,{type:"text",danger:!0,icon:a().createElement(c.DeleteOutlined,null)},"Delete"))]},a().createElement("div",{style:{display:"flex",flexDirection:"column",gap:8}},a().createElement("div",{style:{display:"flex",alignItems:"center",gap:8}},a().createElement(c.HddOutlined,{style:{color:"#8c8c8c"}}),a().createElement(y,{type:"secondary",style:{width:60}},"DB:"),a().createElement(y,{ellipsis:!0},(null==(t=e.vectorDatabase)?void 0:t.name)||"Unknown")),a().createElement("div",{style:{display:"flex",alignItems:"center",gap:8}},a().createElement(c.ApiOutlined,{style:{color:"#8c8c8c"}}),a().createElement(y,{type:"secondary",style:{width:60}},"LLM:"),a().createElement(y,{ellipsis:!0},eO[e.llmService]||e.llmService)),a().createElement("div",{style:{display:"flex",alignItems:"center",gap:8}},a().createElement(c.SettingOutlined,{style:{color:"#8c8c8c"}}),a().createElement(y,{type:"secondary",style:{width:60}},"Model:"),a().createElement(y,{ellipsis:!0},e.embeddingModel)))))}))))}]})),a().createElement(s.Modal,{title:M?"Edit Vector Database":"Add Vector Database",open:P,onOk:ev,onCancel:function(){return V(!1)},destroyOnClose:!0,width:600},a().createElement(s.Form,{form:R,layout:"vertical"},a().createElement(s.Form.Item,{name:"name",label:"Name",rules:[{required:!0}]},a().createElement(s.Input,null)),a().createElement(s.Form.Item,{name:"provider",label:"Provider"},a().createElement(s.Select,{options:[{label:"PGVector",value:"pgvector"}]})),a().createElement(s.Row,{gutter:16},a().createElement(s.Col,{span:16},a().createElement(s.Form.Item,{name:"host",label:"Host",rules:[{required:!0}]},a().createElement(s.Input,{placeholder:"localhost"}))),a().createElement(s.Col,{span:8},a().createElement(s.Form.Item,{name:"port",label:"Port",rules:[{required:!0}]},a().createElement(s.InputNumber,{style:{width:"100%"},placeholder:"5432"})))),a().createElement(s.Row,{gutter:16},a().createElement(s.Col,{span:12},a().createElement(s.Form.Item,{name:"username",label:"Username",rules:[{required:!0}]},a().createElement(s.Input,null))),a().createElement(s.Col,{span:12},a().createElement(s.Form.Item,{name:"password",label:"Password"},a().createElement(s.Input.Password,null)))),a().createElement(s.Row,{gutter:16},a().createElement(s.Col,{span:12},a().createElement(s.Form.Item,{name:"database",label:"Database",rules:[{required:!0}]},a().createElement(s.Input,null))),a().createElement(s.Col,{span:12},a().createElement(s.Form.Item,{name:"tableName",label:"Table Name",rules:[{required:!0}]},a().createElement(s.Input,{placeholder:"e.g. kb_vectors"})))),a().createElement("div",{style:{display:"flex",gap:12,alignItems:"center",background:"#f5f5f5",padding:12,borderRadius:8}},a().createElement(s.Button,{icon:a().createElement(c.ApiOutlined,null),loading:N,onClick:eg},"Test Connection"),T&&a().createElement(s.Tag,{color:T.success?"success":"error",icon:T.success?a().createElement(c.CheckCircleOutlined,null):a().createElement(c.CloseCircleOutlined,null)},T.success?"Connection successful":null!=(w=T.error)?w:"Connection failed")))),a().createElement(s.Modal,{title:Y?"Edit Vector Store":"Add Vector Store",open:$,onOk:eS,onCancel:function(){return J(!1)},destroyOnClose:!0,width:600},a().createElement(s.Form,{form:eu,layout:"vertical"},a().createElement(s.Form.Item,{name:"name",label:"Name",rules:[{required:!0}]},a().createElement(s.Input,null)),a().createElement(s.Form.Item,{name:"vectorDatabaseId",label:"Vector Database",rules:[{required:!0}]},a().createElement(s.Select,{options:O.map(function(e){return{label:e.name,value:e.id}})})),a().createElement(s.Form.Item,{name:"llmService",label:"LLM Service",rules:[{required:!0}]},a().createElement(s.Select,{options:et.map(function(e){return{label:e.title||e.name,value:e.name}}),onChange:function(e){eu.setFieldValue("embeddingModel",void 0),eb(e)}})),a().createElement(s.Form.Item,{name:"embeddingModel",label:"Embedding Model",rules:[{required:!0}]},a().createElement(s.Select,{showSearch:!0,allowClear:!0,mode:"tags",maxCount:1,loading:ec,placeholder:ec?"Loading models...":"Type or select embedding model",options:ea.map(function(e){return{label:String(e.id||e.name||e),value:String(e.id||e.name||e)}})})))))};t.default=E}}]);
@@ -7,4 +7,4 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
 
10
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("react"),require("@nocobase/client"),require("@nocobase/utils/client"),require("@ant-design/icons"),require("antd")):"function"==typeof define&&define.amd?define("plugin-knowledge-base",["react","@nocobase/client","@nocobase/utils/client","@ant-design/icons","antd"],t):"object"==typeof exports?exports["plugin-knowledge-base"]=t(require("react"),require("@nocobase/client"),require("@nocobase/utils/client"),require("@ant-design/icons"),require("antd")):e["plugin-knowledge-base"]=t(e.react,e["@nocobase/client"],e["@nocobase/utils/client"],e["@ant-design/icons"],e.antd)}(self,function(e,t,n,r,a){return function(){"use strict";var l={482:function(e){e.exports=r},772:function(e){e.exports=t},584:function(e){e.exports=n},721:function(e){e.exports=a},156:function(t){t.exports=e}},o={};function u(e){var t=o[e];if(void 0!==t)return t.exports;var n=o[e]={exports:{}};return l[e](n,n.exports,u),n.exports}u.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(t,{a:t}),t},u.d=function(e,t){for(var n in t)u.o(t,n)&&!u.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},u.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},u.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i={};return!function(){u.r(i),u.d(i,{PluginKnowledgeBaseClient:function(){return X},default:function(){return J}});var e,t,n=u(156),r=u.n(n),a=u(772),l=u(584),o=u(721),s=u(482);function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function d(e,t,n,r,a,l,o){try{var u=e[l](o),i=u.value}catch(e){n(e);return}u.done?t(i):Promise.resolve(i).then(r,a)}function f(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){d(l,r,a,o,u,"next",e)}function u(e){d(l,r,a,o,u,"throw",e)}o(void 0)})}}function m(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var l=[],o=!0,u=!1;try{for(a=a.call(e);!(o=(n=a.next()).done)&&(l.push(n.value),!t||l.length!==t);o=!0);}catch(e){u=!0,r=e}finally{try{o||null==a.return||a.return()}finally{if(u)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return c(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return c(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function p(e,t){var n,r,a,l,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]};return l={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(l[Symbol.iterator]=function(){return this}),l;function u(l){return function(u){var i=[l,u];if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(a=2&i[0]?r.return:i[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,i[1])).done)return a;switch(r=0,a&&(i=[2&i[0],a.value]),i[0]){case 0:case 1:a=i;break;case 4:return o.label++,{value:i[1],done:!1};case 5:o.label++,r=i[1],i=[0];continue;case 7:i=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===i[0]||2===i[0])){o=0;continue}if(3===i[0]&&(!a||i[1]>a[0]&&i[1]<a[3])){o.label=i[1];break}if(6===i[0]&&o.label<a[1]){o.label=a[1],a=i;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(i);break}a[2]&&o.ops.pop(),o.trys.pop();continue}i=t.call(e,o)}catch(e){i=[6,e],r=0}finally{n=a=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}}}var y={pending:"default",processing:"processing",success:"success",failed:"error"},b=[{label:"\uD83D\uDD10 Private (Per-user isolation)",value:"PRIVATE"},{label:"\uD83D\uDD12 Basic (Personal)",value:"BASIC"},{label:"\uD83D\uDC65 Shared (Role-based)",value:"SHARED"},{label:"\uD83C\uDF10 Public (System-wide)",value:"PUBLIC"}],h=function(){var e,t,l,u,i,c,d,h,v,g,E=(0,a.useAPIClient)(),w=m((0,n.useState)([]),2),S=w[0],x=w[1],k=m((0,n.useState)(!1),2),I=k[0],C=k[1],O=m((0,n.useState)(!1),2),B=O[0],P=O[1],F=m((0,n.useState)(!1),2),A=F[0],T=F[1],D=m((0,n.useState)(null),2),q=D[0],j=D[1],L=m((0,n.useState)(null),2),R=L[0],M=L[1],U=m((0,n.useState)([]),2),V=U[0],z=U[1],K=m((0,n.useState)([]),2),N=K[0],_=K[1],G=m((0,n.useState)([]),2),H=G[0],Y=G[1],$=m((0,n.useState)("PUBLIC"),2),Q=$[0],W=$[1],X=m((0,n.useState)(!1),2),J=X[0],Z=X[1],ee=m(o.Form.useForm(),1)[0],et=m(o.Form.useForm(),1)[0],en=(e=f(function(){var e,t,n;return p(this,function(r){switch(r.label){case 0:C(!0),r.label=1;case 1:return r.trys.push([1,3,4,5]),[4,E.request({url:"aiKnowledgeBase:list"})];case 2:return x(null!=(n=null==(t=r.sent())||null==(e=t.data)?void 0:e.data)?n:[]),[3,5];case 3:return r.sent(),o.message.error("Failed to load knowledge bases"),[3,5];case 4:return C(!1),[7];case 5:return[2]}})}),function(){return e.apply(this,arguments)}),er=(t=f(function(){var e,t,n;return p(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,E.request({url:"aiVectorStore:list"})];case 1:return _(null!=(n=null==(t=r.sent())||null==(e=t.data)?void 0:e.data)?n:[]),[3,3];case 2:return r.sent(),[3,3];case 3:return[2]}})}),function(){return t.apply(this,arguments)}),ea=(l=f(function(){var e,t,n;return p(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,E.request({url:"roles:list"})];case 1:return Y(null!=(n=null==(t=r.sent())||null==(e=t.data)?void 0:e.data)?n:[]),[3,3];case 2:return r.sent(),[3,3];case 3:return[2]}})}),function(){return l.apply(this,arguments)}),el=(u=f(function(e){var t,n,r;return p(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,,3]),[4,E.request({url:"aiKnowledgeBaseDoc:list",params:{filter:{knowledgeBaseId:e}}})];case 1:return z(null!=(r=null==(n=a.sent())||null==(t=n.data)?void 0:t.data)?r:[]),[3,3];case 2:return a.sent(),o.message.error("Failed to load documents"),[3,3];case 3:return[2]}})}),function(e){return u.apply(this,arguments)});r().useEffect(function(){en(),er(),ea()},[]);var eo=function(e){var t;j(e),ee.setFieldsValue(e),W(null!=(t=e.accessLevel)?t:"PUBLIC"),P(!0)},eu=(i=f(function(){var e;return p(this,function(t){switch(t.label){case 0:return t.trys.push([0,6,,7]),[4,ee.validateFields()];case 1:if(e=t.sent(),!q)return[3,3];return[4,E.request({url:"aiKnowledgeBase:update",method:"post",params:{filterByTk:q.id},data:{values:e}})];case 2:return t.sent(),o.message.success("Updated successfully"),[3,5];case 3:return[4,E.request({url:"aiKnowledgeBase:create",method:"post",data:{values:e}})];case 4:t.sent(),o.message.success("Created successfully"),t.label=5;case 5:return P(!1),en(),[3,7];case 6:return t.sent(),o.message.error("Operation failed"),[3,7];case 7:return[2]}})}),function(){return i.apply(this,arguments)}),ei=(c=f(function(e){return p(this,function(t){switch(t.label){case 0:return t.trys.push([0,2,,3]),[4,E.request({url:"aiKnowledgeBase:destroy",method:"post",params:{filterByTk:e}})];case 1:return t.sent(),o.message.success("Deleted successfully"),en(),[3,3];case 2:return t.sent(),o.message.error("Delete failed"),[3,3];case 3:return[2]}})}),function(e){return c.apply(this,arguments)}),es=function(e){M(e),T(!0),el(e.id)},ec=(d=f(function(e){return p(this,function(t){switch(t.label){case 0:return t.trys.push([0,2,,3]),[4,E.request({url:"aiKnowledgeBaseDoc:reprocess",method:"post",params:{filterByTk:e}})];case 1:return t.sent(),o.message.success("Reprocessing started"),R&&el(R.id),[3,3];case 2:return t.sent(),o.message.error("Reprocess failed"),[3,3];case 3:return[2]}})}),function(e){return d.apply(this,arguments)}),ed=(h=f(function(e){return p(this,function(t){switch(t.label){case 0:return t.trys.push([0,2,,3]),[4,E.request({url:"aiKnowledgeBaseDoc:destroy",method:"post",params:{filterByTk:e}})];case 1:return t.sent(),o.message.success("Document deleted"),R&&el(R.id),[3,3];case 2:return t.sent(),o.message.error("Delete failed"),[3,3];case 3:return[2]}})}),function(e){return h.apply(this,arguments)}),ef=(v=f(function(){var e;return p(this,function(t){switch(t.label){case 0:return t.trys.push([0,3,,4]),[4,et.validateFields()];case 1:if(e=t.sent(),!R)return[2];return[4,E.request({url:"aiKnowledgeBaseDoc:create",method:"post",data:{values:{knowledgeBaseId:R.id,filename:e.filename,textContent:e.textContent,status:"pending"}}})];case 2:return t.sent(),o.message.success("Text document added"),Z(!1),et.resetFields(),el(R.id),[3,4];case 3:return t.sent(),o.message.error("Failed to add text document"),[3,4];case 4:return[2]}})}),function(){return v.apply(this,arguments)}),em=function(e){var t,n=null!=(t=({PRIVATE:{color:"purple",label:"\uD83D\uDD10 Private"},BASIC:{color:"blue",label:"\uD83D\uDD12 Basic"},SHARED:{color:"orange",label:"\uD83D\uDC65 Shared"},PUBLIC:{color:"green",label:"\uD83C\uDF10 Public"}})[e])?t:{color:"default",label:e},a=n.color,l=n.label;return r().createElement(o.Tag,{color:a},l)},ep=[{title:"Name",dataIndex:"name",key:"name"},{title:"Type",dataIndex:"type",key:"type"},{title:"Access Level",dataIndex:"accessLevel",key:"accessLevel",render:function(e){return em(e)}},{title:"Vector Store",dataIndex:["vectorStore","name"],key:"vectorStore"},{title:"Enabled",dataIndex:"enabled",key:"enabled",render:function(e){return e?"Yes":"No"}},{title:"Actions",key:"actions",render:function(e,t){return r().createElement(o.Space,null,r().createElement(o.Button,{size:"small",icon:r().createElement(s.UploadOutlined,null),onClick:function(){return es(t)}},"Documents"),r().createElement(o.Button,{size:"small",icon:r().createElement(s.EditOutlined,null),onClick:function(){return eo(t)}},"Edit"),r().createElement(o.Popconfirm,{title:"Are you sure?",onConfirm:function(){return ei(t.id)}},r().createElement(o.Button,{size:"small",danger:!0,icon:r().createElement(s.DeleteOutlined,null)},"Delete")))}}],ey=[{title:"File",dataIndex:"filename",key:"filename"},{title:"Status",dataIndex:"status",key:"status",render:function(e){return r().createElement(o.Tag,{color:y[e]||"default"},e)}},{title:"Chunks",dataIndex:"chunkCount",key:"chunkCount"},{title:"Error",dataIndex:"error",key:"error",ellipsis:!0},{title:"Actions",key:"actions",render:function(e,t){var n="processing"===t.status,a=(null==R?void 0:R.deleteSourceFile)&&!t.fileId&&!t.textContent;return r().createElement(o.Space,null,r().createElement(o.Tooltip,{title:n?"Embedding in progress":a?"Source file deleted":""},r().createElement(o.Button,{size:"small",icon:r().createElement(s.ReloadOutlined,null),onClick:function(){return ec(t.id)},disabled:n||a},"Reprocess")),r().createElement(o.Popconfirm,{title:"Are you sure?",onConfirm:function(){return ed(t.id)}},r().createElement(o.Button,{size:"small",danger:!0,icon:r().createElement(s.DeleteOutlined,null)},"Delete")))}}],eb=H.map(function(e){var t;return{label:null!=(t=e.title)?t:e.name,value:e.name}});return r().createElement("div",{style:{padding:24}},r().createElement("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:16}},r().createElement("h2",null,"Knowledge Base"),r().createElement(o.Button,{type:"primary",icon:r().createElement(s.PlusOutlined,null),onClick:function(){j(null),ee.resetFields(),ee.setFieldsValue({type:"LOCAL",enabled:!0,accessLevel:"PUBLIC"}),W("PUBLIC"),P(!0)}},"Add new")),r().createElement(o.Table,{dataSource:S,columns:ep,rowKey:"id",loading:I}),r().createElement(o.Modal,{title:q?"Edit Knowledge Base":"Add Knowledge Base",open:B,onOk:eu,onCancel:function(){return P(!1)},destroyOnClose:!0,width:600},r().createElement(o.Form,{form:ee,layout:"vertical"},r().createElement(o.Form.Item,{name:"name",label:"Name",rules:[{required:!0,message:"Name is required"}]},r().createElement(o.Input,null)),r().createElement(o.Form.Item,{name:"type",label:"Type"},r().createElement(o.Select,{options:[{label:"Local",value:"LOCAL"},{label:"Readonly",value:"READONLY"},{label:"External",value:"EXTERNAL"}]})),r().createElement(o.Form.Item,{name:"accessLevel",label:"Access Level",rules:[{required:!0}]},r().createElement(o.Select,{options:b,onChange:function(e){return W(e)}})),"SHARED"===Q&&r().createElement(r().Fragment,null,r().createElement(o.Form.Item,{name:"allowedRoles",label:"Allowed Roles (can view & query)",rules:[{required:!0,message:"Select at least one role"}]},r().createElement(o.Select,{mode:"multiple",options:eb,placeholder:"Select roles that can access this KB"})),r().createElement(o.Form.Item,{name:"uploadRoles",label:"Upload Roles (can add documents)"},r().createElement(o.Select,{mode:"multiple",options:eb,placeholder:"Select roles that can upload documents"}))),r().createElement(o.Form.Item,{name:"vectorStoreId",label:"Vector Store",rules:[{required:!0,message:"Vector store is required"}]},r().createElement(o.Select,{options:N.map(function(e){return{label:e.name,value:e.id}}),placeholder:"Select vector store"})),r().createElement(o.Form.Item,{name:"description",label:"Description"},r().createElement(o.Input.TextArea,{autoSize:{minRows:3}})),r().createElement(o.Form.Item,{name:"enabled",label:"Enabled",valuePropName:"checked"},r().createElement(o.Switch,null)),r().createElement(o.Form.Item,{name:"deleteSourceFile",label:"Delete source file after embedding",valuePropName:"checked",tooltip:"When enabled, the original uploaded file will be automatically deleted after successful vectorization. Embedded data in the vector database is preserved. This saves storage space but prevents re-processing from the original file."},r().createElement(o.Switch,null)))),r().createElement(o.Modal,{title:"Documents - ".concat(null!=(g=null==R?void 0:R.name)?g:""),open:A,onCancel:function(){return T(!1)},footer:null,width:1e3,destroyOnClose:!0},r().createElement("div",{style:{marginBottom:16,display:"flex",gap:8}},r().createElement(o.Upload,{name:"file",showUploadList:!1,accept:".txt,.md,.pdf,.doc,.docx,.ppt,.pptx,.csv,.json",customRequest:function(e){var t=e.file,n=e.onSuccess,r=e.onError,a=new FormData;a.append("file",t);var l=(null==R?void 0:R.fileStorage)?"?storageRule=".concat(encodeURIComponent(R.fileStorage)):"";E.axios.post("aiFiles:create".concat(l),a,{headers:{"Content-Type":"multipart/form-data"}}).then(function(e){null==n||n(e.data,t)}).catch(function(e){null==r||r(e)})},onChange:function(e){if("done"===e.file.status){var t,n=null==(t=e.file.response)?void 0:t.data;n&&R&&E.request({url:"aiKnowledgeBaseDoc:create",method:"post",data:{values:{knowledgeBaseId:R.id,fileId:n.id,filename:n.filename||e.file.name,status:"pending"}}}).then(function(){o.message.success('File "'.concat(e.file.name,'" uploaded')),el(R.id)}).catch(function(){return o.message.error("Failed to create document record")})}else"error"===e.file.status&&o.message.error("Upload failed: ".concat(e.file.name))}},r().createElement(o.Button,{type:"primary",icon:r().createElement(s.UploadOutlined,null)},"Upload File")),r().createElement(o.Button,{icon:r().createElement(s.PlusOutlined,null),onClick:function(){return Z(!0)}},"Paste Text")),r().createElement(o.Table,{dataSource:V,columns:ey,rowKey:"id",size:"small"})),r().createElement(o.Modal,{title:"Add Text Document",open:J,onOk:ef,onCancel:function(){return Z(!1)},destroyOnClose:!0,width:600},r().createElement(o.Form,{form:et,layout:"vertical"},r().createElement(o.Form.Item,{name:"filename",label:"Document Name",rules:[{required:!0}]},r().createElement(o.Input,{placeholder:"e.g. Company FAQ"})),r().createElement(o.Form.Item,{name:"textContent",label:"Content",rules:[{required:!0}]},r().createElement(o.Input.TextArea,{autoSize:{minRows:8,maxRows:20},placeholder:"Paste your text content here..."})))))};function v(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function g(e,t,n,r,a,l,o){try{var u=e[l](o),i=u.value}catch(e){n(e);return}u.done?t(i):Promise.resolve(i).then(r,a)}function E(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){g(l,r,a,o,u,"next",e)}function u(e){g(l,r,a,o,u,"throw",e)}o(void 0)})}}function w(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var l=[],o=!0,u=!1;try{for(a=a.call(e);!(o=(n=a.next()).done)&&(l.push(n.value),!t||l.length!==t);o=!0);}catch(e){u=!0,r=e}finally{try{o||null==a.return||a.return()}finally{if(u)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return v(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return v(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function S(e,t){var n,r,a,l,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]};return l={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(l[Symbol.iterator]=function(){return this}),l;function u(l){return function(u){var i=[l,u];if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(a=2&i[0]?r.return:i[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,i[1])).done)return a;switch(r=0,a&&(i=[2&i[0],a.value]),i[0]){case 0:case 1:a=i;break;case 4:return o.label++,{value:i[1],done:!1};case 5:o.label++,r=i[1],i=[0];continue;case 7:i=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===i[0]||2===i[0])){o=0;continue}if(3===i[0]&&(!a||i[1]>a[0]&&i[1]<a[3])){o.label=i[1];break}if(6===i[0]&&o.label<a[1]){o.label=a[1],a=i;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(i);break}a[2]&&o.ops.pop(),o.trys.pop();continue}i=t.call(e,o)}catch(e){i=[6,e],r=0}finally{n=a=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}}}var x=function(){var e,t,l,u,i,c,d=(0,a.useAPIClient)(),f=w((0,n.useState)([]),2),m=f[0],p=f[1],y=w((0,n.useState)(!1),2),b=y[0],h=y[1],v=w((0,n.useState)(!1),2),g=v[0],x=v[1],k=w((0,n.useState)(null),2),I=k[0],C=k[1],O=w((0,n.useState)([]),2),B=O[0],P=O[1],F=w((0,n.useState)([]),2),A=F[0],T=F[1],D=w((0,n.useState)([]),2),q=D[0],j=D[1],L=w((0,n.useState)(!1),2),R=L[0],M=L[1],U=w(o.Form.useForm(),1)[0],V=(e=E(function(){var e,t,n;return S(this,function(r){switch(r.label){case 0:h(!0),r.label=1;case 1:return r.trys.push([1,3,4,5]),[4,d.request({url:"aiVectorStore:list"})];case 2:return p(null!=(n=null==(t=r.sent())||null==(e=t.data)?void 0:e.data)?n:[]),[3,5];case 3:return r.sent(),o.message.error("Failed to load vector stores"),[3,5];case 4:return h(!1),[7];case 5:return[2]}})}),function(){return e.apply(this,arguments)}),z=(t=E(function(){var e,t,n;return S(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,d.request({url:"aiVectorDatabase:list"})];case 1:return P(null!=(n=null==(t=r.sent())||null==(e=t.data)?void 0:e.data)?n:[]),[3,3];case 2:return r.sent(),[3,3];case 3:return[2]}})}),function(){return t.apply(this,arguments)}),K=(l=E(function(){var e,t,n;return S(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,d.request({url:"ai:listLLMServices"})];case 1:return T(null!=(n=null==(t=r.sent())||null==(e=t.data)?void 0:e.data)?n:[]),[3,3];case 2:return r.sent(),[3,3];case 3:return[2]}})}),function(){return l.apply(this,arguments)}),N=(u=E(function(e){var t,n,r;return S(this,function(a){switch(a.label){case 0:M(!0),j([]),a.label=1;case 1:return a.trys.push([1,3,4,5]),[4,d.request({url:"ai:listModels",params:{llmService:e}})];case 2:return j(null!=(r=null==(n=a.sent())||null==(t=n.data)?void 0:t.data)?r:[]),[3,5];case 3:return a.sent(),j([]),[3,5];case 4:return M(!1),[7];case 5:return[2]}})}),function(e){return u.apply(this,arguments)});r().useEffect(function(){V(),z(),K()},[]);var _=function(e){C(e);var t=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}({},e);t.embeddingModel&&!Array.isArray(t.embeddingModel)&&(t.embeddingModel=[t.embeddingModel]),U.setFieldsValue(t),x(!0),e.llmService&&N(e.llmService)},G=(i=E(function(){var e;return S(this,function(t){switch(t.label){case 0:return t.trys.push([0,6,,7]),[4,U.validateFields()];case 1:if(Array.isArray((e=t.sent()).embeddingModel)&&(e.embeddingModel=e.embeddingModel[0]||""),!I)return[3,3];return[4,d.request({url:"aiVectorStore:update",method:"post",params:{filterByTk:I.id},data:{values:e}})];case 2:return t.sent(),o.message.success("Updated successfully"),[3,5];case 3:return[4,d.request({url:"aiVectorStore:create",method:"post",data:{values:e}})];case 4:t.sent(),o.message.success("Created successfully"),t.label=5;case 5:return x(!1),V(),[3,7];case 6:return t.sent(),o.message.error("Operation failed"),[3,7];case 7:return[2]}})}),function(){return i.apply(this,arguments)}),H=(c=E(function(e){return S(this,function(t){switch(t.label){case 0:return t.trys.push([0,2,,3]),[4,d.request({url:"aiVectorStore:destroy",method:"post",params:{filterByTk:e}})];case 1:return t.sent(),o.message.success("Deleted successfully"),V(),[3,3];case 2:return t.sent(),o.message.error("Delete failed"),[3,3];case 3:return[2]}})}),function(e){return c.apply(this,arguments)}),Y=r().useMemo(function(){var e={};return A.forEach(function(t){e[t.name]=t.title||t.name}),e},[A]),$=[{title:"Name",dataIndex:"name",key:"name"},{title:"Vector Database",dataIndex:["vectorDatabase","name"],key:"vectorDatabase"},{title:"LLM Service",dataIndex:"llmService",key:"llmService",render:function(e){return Y[e]||e}},{title:"Embedding Model",dataIndex:"embeddingModel",key:"embeddingModel"},{title:"Actions",key:"actions",render:function(e,t){return r().createElement(o.Space,null,r().createElement(o.Button,{size:"small",icon:r().createElement(s.EditOutlined,null),onClick:function(){return _(t)}},"Edit"),r().createElement(o.Popconfirm,{title:"Are you sure?",onConfirm:function(){return H(t.id)}},r().createElement(o.Button,{size:"small",danger:!0,icon:r().createElement(s.DeleteOutlined,null)},"Delete")))}}];return r().createElement("div",{style:{padding:24}},r().createElement("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:16}},r().createElement("h2",null,"Vector Storage"),r().createElement(o.Button,{type:"primary",icon:r().createElement(s.PlusOutlined,null),onClick:function(){C(null),j([]),U.resetFields(),x(!0)}},"Add new")),r().createElement(o.Table,{dataSource:m,columns:$,rowKey:"id",loading:b}),r().createElement(o.Modal,{title:I?"Edit Vector Store":"Add Vector Store",open:g,onOk:G,onCancel:function(){return x(!1)},destroyOnClose:!0},r().createElement(o.Form,{form:U,layout:"vertical"},r().createElement(o.Form.Item,{name:"name",label:"Name",rules:[{required:!0}]},r().createElement(o.Input,null)),r().createElement(o.Form.Item,{name:"vectorDatabaseId",label:"Vector Database",rules:[{required:!0}]},r().createElement(o.Select,{options:B.map(function(e){return{label:e.name,value:e.id}}),placeholder:"Select vector database"})),r().createElement(o.Form.Item,{name:"llmService",label:"LLM Service",rules:[{required:!0}]},r().createElement(o.Select,{options:A.map(function(e){return{label:e.title||e.name,value:e.name}}),placeholder:"Select LLM service",onChange:function(e){U.setFieldValue("embeddingModel",void 0),N(e)}})),r().createElement(o.Form.Item,{name:"embeddingModel",label:"Embedding Model",rules:[{required:!0}]},r().createElement(o.Select,{showSearch:!0,allowClear:!0,mode:"tags",maxCount:1,loading:R,placeholder:R?"Loading models...":"Type or select embedding model ID",options:q.map(function(e){return{label:String(e.id||e.name||e),value:String(e.id||e.name||e)}}),notFoundContent:R?"Loading...":"Type a model name and press Enter"})))))};function k(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function I(e,t,n,r,a,l,o){try{var u=e[l](o),i=u.value}catch(e){n(e);return}u.done?t(i):Promise.resolve(i).then(r,a)}function C(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){I(l,r,a,o,u,"next",e)}function u(e){I(l,r,a,o,u,"throw",e)}o(void 0)})}}function O(e,t){if(null==e)return{};var n,r,a=function(e,t){if(null==e)return{};var n,r,a={},l=Object.keys(e);for(r=0;r<l.length;r++)n=l[r],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)n=l[r],!(t.indexOf(n)>=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}function B(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var l=[],o=!0,u=!1;try{for(a=a.call(e);!(o=(n=a.next()).done)&&(l.push(n.value),!t||l.length!==t);o=!0);}catch(e){u=!0,r=e}finally{try{o||null==a.return||a.return()}finally{if(u)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return k(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return k(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function P(e,t){var n,r,a,l,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]};return l={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(l[Symbol.iterator]=function(){return this}),l;function u(l){return function(u){var i=[l,u];if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(a=2&i[0]?r.return:i[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,i[1])).done)return a;switch(r=0,a&&(i=[2&i[0],a.value]),i[0]){case 0:case 1:a=i;break;case 4:return o.label++,{value:i[1],done:!1};case 5:o.label++,r=i[1],i=[0];continue;case 7:i=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===i[0]||2===i[0])){o=0;continue}if(3===i[0]&&(!a||i[1]>a[0]&&i[1]<a[3])){o.label=i[1];break}if(6===i[0]&&o.label<a[1]){o.label=a[1],a=i;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(i);break}a[2]&&o.ops.pop(),o.trys.pop();continue}i=t.call(e,o)}catch(e){i=[6,e],r=0}finally{n=a=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}}}var F=function(){var e,t,l,u,i,c=(0,a.useAPIClient)(),d=B((0,n.useState)([]),2),f=d[0],m=d[1],p=B((0,n.useState)(!1),2),y=p[0],b=p[1],h=B((0,n.useState)(!1),2),v=h[0],g=h[1],E=B((0,n.useState)(null),2),w=E[0],S=E[1],x=B((0,n.useState)(null),2),k=x[0],I=x[1],F=B((0,n.useState)(!1),2),A=F[0],T=F[1],D=B(o.Form.useForm(),1)[0],q=(e=C(function(){var e,t,n;return P(this,function(r){switch(r.label){case 0:b(!0),r.label=1;case 1:return r.trys.push([1,3,4,5]),[4,c.request({url:"aiVectorDatabase:list"})];case 2:return m(null!=(n=null==(t=r.sent())||null==(e=t.data)?void 0:e.data)?n:[]),[3,5];case 3:return r.sent(),o.message.error("Failed to load vector databases"),[3,5];case 4:return b(!1),[7];case 5:return[2]}})}),function(){return e.apply(this,arguments)});r().useEffect(function(){q()},[]);var j=function(e){S(e),I(null),D.setFieldsValue(function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}({name:e.name,provider:e.provider},e.connectParams)),g(!0)},L=(t=C(function(){var e,t,n;return P(this,function(r){switch(r.label){case 0:return r.trys.push([0,6,,7]),[4,D.validateFields()];case 1:if(t=(e=r.sent()).name,n={name:t,provider:e.provider,connectParams:O(e,["name","provider"])},!w)return[3,3];return[4,c.request({url:"aiVectorDatabase:update",method:"post",params:{filterByTk:w.id},data:{values:n}})];case 2:return r.sent(),o.message.success("Updated successfully"),[3,5];case 3:return[4,c.request({url:"aiVectorDatabase:create",method:"post",data:{values:n}})];case 4:r.sent(),o.message.success("Created successfully"),r.label=5;case 5:return g(!1),q(),[3,7];case 6:return r.sent(),o.message.error("Operation failed"),[3,7];case 7:return[2]}})}),function(){return t.apply(this,arguments)}),R=(l=C(function(){var e,t,n,r,a,l,o;return P(this,function(u){switch(u.label){case 0:T(!0),I(null),u.label=1;case 1:return u.trys.push([1,4,5,6]),[4,D.validateFields()];case 2:return(t=u.sent()).name,n=t.provider,r=O(t,["name","provider"]),[4,c.request({url:"aiVectorDatabase:test",method:"post",data:{values:{provider:n,connectParams:r}}})];case 3:return I(null!=(l=null==(a=u.sent())||null==(e=a.data)?void 0:e.data)?l:{success:!1,error:"Unknown error"}),[3,6];case 4:return I({success:!1,error:null!=(o=u.sent().message)?o:"Test failed"}),[3,6];case 5:return T(!1),[7];case 6:return[2]}})}),function(){return l.apply(this,arguments)}),M=(u=C(function(e){return P(this,function(t){switch(t.label){case 0:return t.trys.push([0,2,,3]),[4,c.request({url:"aiVectorDatabase:destroy",method:"post",params:{filterByTk:e}})];case 1:return t.sent(),o.message.success("Deleted successfully"),q(),[3,3];case 2:return t.sent(),o.message.error("Delete failed"),[3,3];case 3:return[2]}})}),function(e){return u.apply(this,arguments)}),U=[{title:"Name",dataIndex:"name",key:"name"},{title:"Provider",dataIndex:"provider",key:"provider"},{title:"Host",key:"host",render:function(e,t){var n,r;return null!=(r=null==(n=t.connectParams)?void 0:n.host)?r:"-"}},{title:"Database",key:"database",render:function(e,t){var n,r;return null!=(r=null==(n=t.connectParams)?void 0:n.database)?r:"-"}},{title:"Actions",key:"actions",render:function(e,t){return r().createElement(o.Space,null,r().createElement(o.Button,{size:"small",icon:r().createElement(s.EditOutlined,null),onClick:function(){return j(t)}},"Edit"),r().createElement(o.Popconfirm,{title:"Are you sure?",onConfirm:function(){return M(t.id)}},r().createElement(o.Button,{size:"small",danger:!0,icon:r().createElement(s.DeleteOutlined,null)},"Delete")))}}];return r().createElement("div",{style:{padding:24}},r().createElement("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:16}},r().createElement("h2",null,"Vector Database"),r().createElement(o.Button,{type:"primary",icon:r().createElement(s.PlusOutlined,null),onClick:function(){S(null),I(null),D.resetFields(),D.setFieldsValue({provider:"pgvector"}),g(!0)}},"Add new")),r().createElement(o.Table,{dataSource:f,columns:U,rowKey:"id",loading:y}),r().createElement(o.Modal,{title:w?"Edit Vector Database":"Add Vector Database",open:v,onOk:L,onCancel:function(){return g(!1)},destroyOnClose:!0,width:600},r().createElement(o.Form,{form:D,layout:"vertical"},r().createElement(o.Form.Item,{name:"name",label:"Name",rules:[{required:!0}]},r().createElement(o.Input,null)),r().createElement(o.Form.Item,{name:"provider",label:"Provider"},r().createElement(o.Select,{options:[{label:"PGVector",value:"pgvector"}]})),r().createElement(o.Form.Item,{name:"host",label:"Host",rules:[{required:!0}]},r().createElement(o.Input,{placeholder:"localhost"})),r().createElement(o.Form.Item,{name:"port",label:"Port",rules:[{required:!0}]},r().createElement(o.InputNumber,{style:{width:"100%"},placeholder:"5432"})),r().createElement(o.Form.Item,{name:"username",label:"Username",rules:[{required:!0}]},r().createElement(o.Input,null)),r().createElement(o.Form.Item,{name:"password",label:"Password",rules:[{required:!0}]},r().createElement(o.Input.Password,null)),r().createElement(o.Form.Item,{name:"database",label:"Database",rules:[{required:!0}]},r().createElement(o.Input,null)),r().createElement(o.Form.Item,{name:"tableName",label:"Table Name",rules:[{required:!0}]},r().createElement(o.Input,{placeholder:"e.g. knowledge_base_vectors"})),r().createElement("div",{style:{display:"flex",gap:8,alignItems:"center"}},r().createElement(o.Button,{icon:r().createElement(s.ApiOutlined,null),loading:A,onClick:R},"Test Connection"),k&&r().createElement(o.Tag,{color:k.success?"success":"error"},k.success?"Connection successful":null!=(i=k.error)?i:"Connection failed")))))};function A(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function T(e,t,n,r,a,l,o){try{var u=e[l](o),i=u.value}catch(e){n(e);return}u.done?t(i):Promise.resolve(i).then(r,a)}function D(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){T(l,r,a,o,u,"next",e)}function u(e){T(l,r,a,o,u,"throw",e)}o(void 0)})}}function q(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var l=[],o=!0,u=!1;try{for(a=a.call(e);!(o=(n=a.next()).done)&&(l.push(n.value),!t||l.length!==t);o=!0);}catch(e){u=!0,r=e}finally{try{o||null==a.return||a.return()}finally{if(u)throw r}}return l}}(e,t)||function(e,t){if(e){if("string"==typeof e)return A(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return A(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function j(e,t){var n,r,a,l,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]};return l={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(l[Symbol.iterator]=function(){return this}),l;function u(l){return function(u){var i=[l,u];if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(a=2&i[0]?r.return:i[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,i[1])).done)return a;switch(r=0,a&&(i=[2&i[0],a.value]),i[0]){case 0:case 1:a=i;break;case 4:return o.label++,{value:i[1],done:!1};case 5:o.label++,r=i[1],i=[0];continue;case 7:i=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===i[0]||2===i[0])){o=0;continue}if(3===i[0]&&(!a||i[1]>a[0]&&i[1]<a[3])){o.label=i[1];break}if(6===i[0]&&o.label<a[1]){o.label=a[1],a=i;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(i);break}a[2]&&o.ops.pop(),o.trys.pop();continue}i=t.call(e,o)}catch(e){i=[6,e],r=0}finally{n=a=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}}}var L=o.Typography.Text,R=o.Typography.Title,M=o.Upload.Dragger,U={pending:{color:"default",label:"Pending"},processing:{color:"processing",label:"Processing"},success:{color:"success",label:"Success"},failed:{color:"error",label:"Failed"}},V={PUBLIC:r().createElement(s.GlobalOutlined,{style:{color:"#52c41a"}}),SHARED:r().createElement(s.TeamOutlined,{style:{color:"#fa8c16"}}),BASIC:r().createElement(s.LockOutlined,{style:{color:"#1890ff"}}),PRIVATE:r().createElement(s.LockOutlined,{style:{color:"#722ed1"}})},z={PUBLIC:"green",SHARED:"orange",BASIC:"blue",PRIVATE:"purple"},K=function(e){var t,l,u,i,c=e.contextItems,d=e.onAdd,f=e.onRemove;e.onClose;var m=(0,a.useAPIClient)(),p=q((0,n.useState)(!0),2),y=p[0],b=p[1],h=q((0,n.useState)([]),2),v=h[0],g=h[1],E=q((0,n.useState)(null),2),w=E[0],S=E[1],x=q((0,n.useState)([]),2),k=x[0],I=x[1],C=q((0,n.useState)(!1),2),O=C[0],B=C[1],P=q((0,n.useState)(!1),2),F=P[0],A=P[1],T=q(o.Form.useForm(),1)[0],K=q((0,n.useState)([]),2),N=K[0],_=K[1],G=q((0,n.useState)(!1),2),H=G[0],Y=G[1],$=new Set((void 0===c?[]:c).filter(function(e){return"knowledge-base"===e.type}).map(function(e){return e.uid}));(0,n.useEffect)(function(){var e;(e=D(function(){var e,t,n,r,a;return j(this,function(l){switch(l.label){case 0:return l.trys.push([0,2,,3]),[4,m.request({url:"auth:check"})];case 1:return _(a=(null==(r=null==(n=l.sent())||null==(e=n.data)?void 0:e.data)||null==(t=r.roles)?void 0:t.map(function(e){return e.name||e}))||[]),Y(a.includes("root")||a.includes("admin")),[3,3];case 2:return l.sent(),[3,3];case 3:return[2]}})}),function(){return e.apply(this,arguments)})()},[m]),(0,n.useEffect)(function(){var e;(e=D(function(){var e,t,n;return j(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,3,4]),b(!0),[4,m.resource("aiKnowledgeBase").list({params:{filter:{enabled:!0},sort:["-createdAt"]}})];case 1:return g(n=(null==(t=r.sent())||null==(e=t.data)?void 0:e.data)||[]),n.length>0&&!w&&S(n[0]),[3,4];case 2:return console.error("Failed to fetch knowledge bases:",r.sent()),[3,4];case 3:return b(!1),[7];case 4:return[2]}})}),function(){return e.apply(this,arguments)})()},[m]);var Q=(0,n.useCallback)((t=D(function(e){var t,n,r;return j(this,function(a){switch(a.label){case 0:B(!0),a.label=1;case 1:return a.trys.push([1,3,4,5]),[4,m.request({url:"aiKnowledgeBaseDoc:list",params:{filter:{knowledgeBaseId:e}}})];case 2:return I(null!=(r=null==(n=a.sent())||null==(t=n.data)?void 0:t.data)?r:[]),[3,5];case 3:return a.sent(),o.message.error("Failed to load documents"),[3,5];case 4:return B(!1),[7];case 5:return[2]}})}),function(e){return t.apply(this,arguments)}),[m]);(0,n.useEffect)(function(){w&&Q(w.id)},[null==w?void 0:w.id,Q]);var W=function(e){if(H||"BASIC"===e.accessLevel)return!0;if("PUBLIC"===e.accessLevel)return!1;if("SHARED"===e.accessLevel){var t;return(null==(t=e.uploadRoles)?void 0:t.some(function(e){return N.includes(e)}))||!1}return!1},X=function(e){$.has(e.id)?f(e.id):d({uid:e.id,title:e.name,content:{knowledgeBaseId:e.id,name:e.name}})},J=function(e,t,n){if(w){var r=new FormData;r.append("file",e);var a=w.fileStorage?"?storageRule=".concat(encodeURIComponent(w.fileStorage)):"";m.axios.post("aiFiles:create".concat(a),r,{headers:{"Content-Type":"multipart/form-data"}}).then(function(n){return null==t?void 0:t(n.data,e)}).catch(function(e){return null==n?void 0:n(e)})}},Z=function(e){if("done"===e.file.status){var t,n=null==(t=e.file.response)?void 0:t.data;n&&w&&m.request({url:"aiKnowledgeBaseDoc:create",method:"post",data:{values:{knowledgeBaseId:w.id,fileId:n.id,filename:n.filename||e.file.name,status:"pending"}}}).then(function(){o.message.success('"'.concat(e.file.name,'" uploaded')),Q(w.id)}).catch(function(){return o.message.error("Failed to create document record")})}else"error"===e.file.status&&o.message.error("Upload failed: ".concat(e.file.name))},ee=(l=D(function(){var e;return j(this,function(t){switch(t.label){case 0:return t.trys.push([0,3,,4]),[4,T.validateFields()];case 1:if(e=t.sent(),!w)return[2];return[4,m.request({url:"aiKnowledgeBaseDoc:create",method:"post",data:{values:{knowledgeBaseId:w.id,filename:e.filename,textContent:e.textContent,status:"pending"}}})];case 2:return t.sent(),o.message.success("Text document added"),A(!1),T.resetFields(),Q(w.id),[3,4];case 3:return t.sent(),o.message.error("Failed to add text document"),[3,4];case 4:return[2]}})}),function(){return l.apply(this,arguments)}),et=(u=D(function(e){return j(this,function(t){switch(t.label){case 0:return t.trys.push([0,2,,3]),[4,m.request({url:"aiKnowledgeBaseDoc:destroy",method:"post",params:{filterByTk:e}})];case 1:return t.sent(),o.message.success("Document deleted"),w&&Q(w.id),[3,3];case 2:return t.sent(),o.message.error("Delete failed"),[3,3];case 3:return[2]}})}),function(e){return u.apply(this,arguments)}),en=(i=D(function(e){return j(this,function(t){switch(t.label){case 0:return t.trys.push([0,2,,3]),[4,m.request({url:"aiKnowledgeBaseDoc:reprocess",method:"post",params:{filterByTk:e}})];case 1:return t.sent(),o.message.success("Reprocessing started"),w&&Q(w.id),[3,3];case 2:return t.sent(),o.message.error("Reprocess failed"),[3,3];case 3:return[2]}})}),function(e){return i.apply(this,arguments)}),er=[{title:"Document",dataIndex:"filename",key:"filename",ellipsis:!0,render:function(e){return r().createElement(o.Space,null,r().createElement(s.FileTextOutlined,{style:{color:"#8c8c8c"}}),r().createElement(L,null,e))}},{title:"Status",dataIndex:"status",key:"status",width:110,render:function(e){var t=U[e]||{color:"default",label:e};return r().createElement(o.Tag,{color:t.color},t.label)}},{title:"Chunks",dataIndex:"chunkCount",key:"chunkCount",width:70,render:function(e){return e||"-"}},{title:"Actions",key:"actions",width:140,render:function(e,t){if(!w||!W(w))return null;var n="processing"===t.status,a=w.deleteSourceFile&&!t.fileId&&!t.textContent;return r().createElement(o.Space,{size:"small"},r().createElement(o.Tooltip,{title:n?"Embedding in progress...":a?"Source file has been deleted":"Reprocess"},r().createElement(o.Button,{size:"small",type:"text",icon:r().createElement(s.ReloadOutlined,null),onClick:function(){return en(t.id)},disabled:n||a})),r().createElement(o.Popconfirm,{title:"Delete this document?",onConfirm:function(){return et(t.id)},okText:"Yes",cancelText:"No"},r().createElement(o.Tooltip,{title:"Delete"},r().createElement(o.Button,{size:"small",type:"text",danger:!0,icon:r().createElement(s.DeleteOutlined,null)}))))}}];if(y)return r().createElement("div",{style:{padding:48,textAlign:"center"}},r().createElement(o.Spin,{size:"large"}));if(!v.length)return r().createElement("div",{style:{padding:48}},r().createElement(o.Empty,{image:o.Empty.PRESENTED_IMAGE_SIMPLE,description:"No knowledge bases available"}));var ea=w&&W(w);return r().createElement("div",{style:{display:"flex",height:520}},r().createElement("div",{style:{width:240,borderRight:"1px solid #f0f0f0",overflowY:"auto",background:"#fafafa"}},r().createElement("div",{style:{padding:"14px 16px 8px",display:"flex",justifyContent:"space-between",alignItems:"center"}},r().createElement(L,{strong:!0,style:{fontSize:14}},"Knowledge Bases")),v.map(function(e){var t=(null==w?void 0:w.id)===e.id,n=$.has(e.id);return r().createElement("div",{key:e.id,onClick:function(){return S(e)},style:{padding:"10px 16px",cursor:"pointer",background:t?"#e6f4ff":"transparent",borderLeft:t?"3px solid #1890ff":"3px solid transparent",transition:"all 0.2s"}},r().createElement("div",{style:{display:"flex",alignItems:"center",gap:8}},V[e.accessLevel||"PUBLIC"],r().createElement(L,{strong:t,style:{flex:1,fontSize:13},ellipsis:!0},e.name),n&&r().createElement(s.CheckCircleOutlined,{style:{color:"#52c41a",fontSize:14}})),r().createElement("div",{style:{marginTop:4,display:"flex",gap:4}},r().createElement(o.Tag,{color:z[e.accessLevel||"PUBLIC"],style:{fontSize:10,lineHeight:"16px",padding:"0 4px"}},e.accessLevel||"PUBLIC")))})),r().createElement("div",{style:{flex:1,display:"flex",flexDirection:"column",overflow:"hidden"}},w?r().createElement(r().Fragment,null,r().createElement("div",{style:{padding:"12px 20px",borderBottom:"1px solid #f0f0f0",display:"flex",justifyContent:"space-between",alignItems:"center",flexShrink:0}},r().createElement("div",null,r().createElement(R,{level:5,style:{margin:0}},w.name),w.description&&r().createElement(L,{type:"secondary",style:{fontSize:12}},w.description)),r().createElement(o.Space,null,r().createElement(o.Button,{type:$.has(w.id)?"primary":"default",icon:$.has(w.id)?r().createElement(s.CheckCircleOutlined,null):r().createElement(s.BookOutlined,null),onClick:function(){return X(w)}},$.has(w.id)?"Selected":"Select for Chat"))),r().createElement("div",{style:{flex:1,overflow:"auto",padding:"12px 20px"}},ea&&r().createElement("div",{style:{marginBottom:12,display:"flex",gap:8}},r().createElement(o.Upload,{name:"file",showUploadList:!1,accept:".txt,.md,.pdf,.doc,.docx,.ppt,.pptx,.csv,.json",customRequest:function(e){return J(e.file,e.onSuccess,e.onError)},onChange:Z},r().createElement(o.Button,{type:"primary",icon:r().createElement(s.UploadOutlined,null),size:"small"},"Upload File")),r().createElement(o.Button,{icon:r().createElement(s.PlusOutlined,null),size:"small",onClick:function(){return A(!0)}},"Paste Text")),r().createElement(o.Table,{dataSource:k,columns:er,rowKey:"id",size:"small",loading:O,pagination:{pageSize:8,size:"small",showSizeChanger:!1},locale:{emptyText:r().createElement(o.Empty,{image:o.Empty.PRESENTED_IMAGE_SIMPLE,description:"No documents yet"})}}),ea&&r().createElement(M,{name:"file",multiple:!0,showUploadList:!1,accept:".txt,.md,.pdf,.doc,.docx,.ppt,.pptx,.csv,.json",customRequest:function(e){return J(e.file,e.onSuccess,e.onError)},onChange:Z,style:{marginTop:8}},r().createElement("p",{className:"ant-upload-drag-icon"},r().createElement(s.InboxOutlined,null)),r().createElement("p",{className:"ant-upload-text",style:{fontSize:13,margin:0}},"Drag files here or click to upload")))):r().createElement("div",{style:{flex:1,display:"flex",alignItems:"center",justifyContent:"center"}},r().createElement(o.Empty,{description:"Select a knowledge base"}))),r().createElement(o.Modal,{title:"Add Text Document",open:F,onOk:ee,onCancel:function(){return A(!1)},destroyOnClose:!0,width:500},r().createElement(o.Form,{form:T,layout:"vertical"},r().createElement(o.Form.Item,{name:"filename",label:"Document Name",rules:[{required:!0}]},r().createElement(o.Input,{placeholder:"e.g. Company FAQ"})),r().createElement(o.Form.Item,{name:"textContent",label:"Content",rules:[{required:!0}]},r().createElement(o.Input.TextArea,{autoSize:{minRows:6,maxRows:16},placeholder:"Paste your text content here..."})))))};function N(e,t,n,r,a,l,o){try{var u=e[l](o),i=u.value}catch(e){n(e);return}u.done?t(i):Promise.resolve(i).then(r,a)}var _={name:"knowledge-base",menu:{icon:r().createElement(s.BookOutlined,null),label:"Knowledge Base",onClick:function(e){var t=e.ctx,n=e.contextItems,a=e.onAdd,l=e.onRemove;t.viewer.dialog({width:800,content:r().createElement(K,{contextItems:n,onAdd:a,onRemove:l,onClose:function(){return t.viewer.close()}})})}},tag:{Component:function(e){var t=e.item;return r().createElement(o.Space,null,r().createElement(s.BookOutlined,null),r().createElement("span",null,(null==t?void 0:t.title)||"Knowledge Base"))}},getContent:(e=function(e,t){var n;return function(e,t){var n,r,a,l,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]};return l={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(l[Symbol.iterator]=function(){return this}),l;function u(l){return function(u){var i=[l,u];if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(a=2&i[0]?r.return:i[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,i[1])).done)return a;switch(r=0,a&&(i=[2&i[0],a.value]),i[0]){case 0:case 1:a=i;break;case 4:return o.label++,{value:i[1],done:!1};case 5:o.label++,r=i[1],i=[0];continue;case 7:i=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===i[0]||2===i[0])){o=0;continue}if(3===i[0]&&(!a||i[1]>a[0]&&i[1]<a[3])){o.label=i[1];break}if(6===i[0]&&o.label<a[1]){o.label=a[1],a=i;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(i);break}a[2]&&o.ops.pop(),o.trys.pop();continue}i=t.call(e,o)}catch(e){i=[6,e],r=0}finally{n=a=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}}}(this,function(e){return n=t.uid,[2,t.content||{knowledgeBaseId:n}]})},t=function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){N(l,r,a,o,u,"next",e)}function u(e){N(l,r,a,o,u,"throw",e)}o(void 0)})},function(e,n){return t.apply(this,arguments)})};function G(e,t,n,r,a,l,o){try{var u=e[l](o),i=u.value}catch(e){n(e);return}u.done?t(i):Promise.resolve(i).then(r,a)}function H(e,t,n){return(H=W()?Reflect.construct:function(e,t,n){var r=[null];r.push.apply(r,t);var a=new(Function.bind.apply(e,r));return n&&$(a,n.prototype),a}).apply(null,arguments)}function Y(e){return(Y=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function $(e,t){return($=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function Q(e){var t="function"==typeof Map?new Map:void 0;return(Q=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return H(e,arguments,Y(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),$(n,e)})(e)}function W(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(W=function(){return!!e})()}var X=function(e){var t;if("function"!=typeof e&&null!==e)throw TypeError("Super expression must either be null or a function");function n(){var e,t;if(!(this instanceof n))throw TypeError("Cannot call a class as a function");return e=n,t=arguments,e=Y(e),function(e,t){var n;if(t&&("object"==((n=t)&&"undefined"!=typeof Symbol&&n.constructor===Symbol?"symbol":typeof n)||"function"==typeof t))return t;if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this,W()?Reflect.construct(e,t||[],Y(this).constructor):e.apply(this,t))}return n.prototype=Object.create(e&&e.prototype,{constructor:{value:n,writable:!0,configurable:!0}}),e&&$(n,e),t=[{key:"load",value:function(){var e,t=this;return(e=function(){var e;return function(e,t){var n,r,a,l,o={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]};return l={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(l[Symbol.iterator]=function(){return this}),l;function u(l){return function(u){var i=[l,u];if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(a=2&i[0]?r.return:i[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,i[1])).done)return a;switch(r=0,a&&(i=[2&i[0],a.value]),i[0]){case 0:case 1:a=i;break;case 4:return o.label++,{value:i[1],done:!1};case 5:o.label++,r=i[1],i=[0];continue;case 7:i=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===i[0]||2===i[0])){o=0;continue}if(3===i[0]&&(!a||i[1]>a[0]&&i[1]<a[3])){o.label=i[1];break}if(6===i[0]&&o.label<a[1]){o.label=a[1],a=i;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(i);break}a[2]&&o.ops.pop(),o.trys.pop();continue}i=t.call(e,o)}catch(e){i=[6,e],r=0}finally{n=a=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}}}(this,function(n){try{(null==(e=t.app.pm.get("ai"))?void 0:e.aiManager)&&e.aiManager.registerWorkContext("knowledge-base",_)}catch(e){}return t.app.pluginSettingsManager.get("ai"),t.app.pluginSettingsManager.add("ai.knowledge-base",{title:(0,l.tval)("Knowledge base"),icon:"BookOutlined",Component:h,aclSnippet:"pm.plugin-knowledge-base.knowledge-base",sort:300}),t.app.pluginSettingsManager.add("ai.vector-store",{title:(0,l.tval)("Vector store"),icon:"DatabaseOutlined",Component:x,aclSnippet:"pm.plugin-knowledge-base.knowledge-base",sort:310}),t.app.pluginSettingsManager.add("ai.vector-database",{title:(0,l.tval)("Vector database"),icon:"HddOutlined",Component:F,aclSnippet:"pm.plugin-knowledge-base.knowledge-base",sort:320}),[2]})},function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){G(l,r,a,o,u,"next",e)}function u(e){G(l,r,a,o,u,"throw",e)}o(void 0)})})()}}],function(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(n.prototype,t),n}(Q(a.Plugin)),J=X}(),i}()});
10
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@nocobase/client"),require("react"),require("@nocobase/utils/client"),require("@ant-design/icons"),require("antd")):"function"==typeof define&&define.amd?define("plugin-knowledge-base",["@nocobase/client","react","@nocobase/utils/client","@ant-design/icons","antd"],t):"object"==typeof exports?exports["plugin-knowledge-base"]=t(require("@nocobase/client"),require("react"),require("@nocobase/utils/client"),require("@ant-design/icons"),require("antd")):e["plugin-knowledge-base"]=t(e["@nocobase/client"],e.react,e["@nocobase/utils/client"],e["@ant-design/icons"],e.antd)}(self,function(e,t,n,r,o){return function(){var a,l,i,u,c,s,d={581:function(e){e.exports=function(e,t){return"undefined"!=typeof __deoptimization_sideEffect__&&__deoptimization_sideEffect__(e,t),t}},482:function(e){"use strict";e.exports=r},772:function(t){"use strict";t.exports=e},584:function(e){"use strict";e.exports=n},721:function(e){"use strict";e.exports=o},156:function(e){"use strict";e.exports=t}},f={};function p(e){var t=f[e];if(void 0!==t)return t.exports;var n=f[e]={exports:{}};return d[e](n,n.exports,p),n.exports}p.m=d,p.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return p.d(t,{a:t}),t},p.d=function(e,t){for(var n in t)p.o(t,n)&&!p.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},p.f={},p.e=function(e){return Promise.all(Object.keys(p.f).reduce(function(t,n){return p.f[n](e,t),t},[]))},p.u=function(e){return""+({642:"3864360fe4f42855",911:"13f004eeaba90fe8"})[e]+".js"},p.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),p.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a={},l="plugin-knowledge-base:",p.l=function(e,t,n,r){if(a[e])return void a[e].push(t);if(void 0!==n)for(var o,i,u=document.getElementsByTagName("script"),c=0;c<u.length;c++){var s=u[c];if(s.getAttribute("src")==e||s.getAttribute("data-webpack")==l+n){o=s;break}}o||(i=!0,(o=document.createElement("script")).charset="utf-8",o.timeout=120,p.nc&&o.setAttribute("nonce",p.nc),o.setAttribute("data-webpack",l+n),o.src=e),a[e]=[t];var d=function(t,n){o.onerror=o.onload=null,clearTimeout(f);var r=a[e];if(delete a[e],o.parentNode&&o.parentNode.removeChild(o),r&&r.forEach(function(e){return e(n)}),t)return t(n)},f=setTimeout(d.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=d.bind(null,o.onerror),o.onload=d.bind(null,o.onload),i&&document.head.appendChild(o)},p.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(i=window.__webpack_public_path__||"/").endsWith("/")||(i+="/"),p.p=i+"static/plugins/plugin-knowledge-base/dist/client/",u={909:0},p.f.j=function(e,t){var n=p.o(u,e)?u[e]:void 0;if(0!==n)if(n)t.push(n[2]);else{var r=new Promise(function(t,r){n=u[e]=[t,r]});t.push(n[2]=r);var o=p.p+p.u(e),a=Error();p.l(o,function(t){if(p.o(u,e)&&(0!==(n=u[e])&&(u[e]=void 0),n)){var r=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;a.message="Loading chunk "+e+" failed.\n("+r+": "+o+")",a.name="ChunkLoadError",a.type=r,a.request=o,n[1](a)}},"chunk-"+e,e)}},c=function(e,t){var n,r,o=t[0],a=t[1],l=t[2],i=0;if(o.some(function(e){return 0!==u[e]})){for(n in a)p.o(a,n)&&(p.m[n]=a[n]);l&&l(p)}for(e&&e(t);i<o.length;i++)r=o[i],p.o(u,r)&&u[r]&&u[r][0](),u[r]=0},(s=self.webpackChunkplugin_knowledge_base=self.webpackChunkplugin_knowledge_base||[]).forEach(c.bind(null,0)),s.push=c.bind(null,s.push.bind(s));var m={};return!function(){"use strict";p.r(m),p.d(m,{PluginKnowledgeBaseClient:function(){return j},default:function(){return R}});var e,t,n=p(156),r=p.n(n),o=p(772),a=p(584),l=p(482),i=p(721);function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function c(e,t,n,r,o,a,l){try{var i=e[a](l),u=i.value}catch(e){n(e);return}i.done?t(u):Promise.resolve(u).then(r,o)}function s(e){return function(){var t=this,n=arguments;return new Promise(function(r,o){var a=e.apply(t,n);function l(e){c(a,r,o,l,i,"next",e)}function i(e){c(a,r,o,l,i,"throw",e)}l(void 0)})}}function d(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var a=[],l=!0,i=!1;try{for(o=o.call(e);!(l=(n=o.next()).done)&&(a.push(n.value),!t||a.length!==t);l=!0);}catch(e){i=!0,r=e}finally{try{l||null==o.return||o.return()}finally{if(i)throw r}}return a}}(e,t)||function(e,t){if(e){if("string"==typeof e)return u(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return u(e,t)}}(e,t)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function f(e,t){var n,r,o,a,l={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function i(a){return function(i){var u=[a,i];if(n)throw TypeError("Generator is already executing.");for(;l;)try{if(n=1,r&&(o=2&u[0]?r.return:u[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,u[1])).done)return o;switch(r=0,o&&(u=[2&u[0],o.value]),u[0]){case 0:case 1:o=u;break;case 4:return l.label++,{value:u[1],done:!1};case 5:l.label++,r=u[1],u=[0];continue;case 7:u=l.ops.pop(),l.trys.pop();continue;default:if(!(o=(o=l.trys).length>0&&o[o.length-1])&&(6===u[0]||2===u[0])){l=0;continue}if(3===u[0]&&(!o||u[1]>o[0]&&u[1]<o[3])){l.label=u[1];break}if(6===u[0]&&l.label<o[1]){l.label=o[1],o=u;break}if(o&&l.label<o[2]){l.label=o[2],l.ops.push(u);break}o[2]&&l.ops.pop(),l.trys.pop();continue}u=t.call(e,l)}catch(e){u=[6,e],r=0}finally{n=o=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}var y=i.Typography.Text,g=i.Typography.Title,h=i.Upload.Dragger,b={pending:{color:"default",label:"Pending"},processing:{color:"processing",label:"Processing"},success:{color:"success",label:"Success"},failed:{color:"error",label:"Failed"}},v={PUBLIC:r().createElement(l.GlobalOutlined,{style:{color:"#52c41a"}}),SHARED:r().createElement(l.TeamOutlined,{style:{color:"#fa8c16"}}),BASIC:r().createElement(l.LockOutlined,{style:{color:"#1890ff"}}),PRIVATE:r().createElement(l.LockOutlined,{style:{color:"#722ed1"}})},w={PUBLIC:"green",SHARED:"orange",BASIC:"blue",PRIVATE:"purple"},E=function(e){var t,a,u,c,p=e.contextItems,m=e.onAdd,E=e.onRemove;e.onClose;var x=(0,o.useAPIClient)(),k=d((0,n.useState)(!0),2),S=k[0],C=k[1],I=d((0,n.useState)([]),2),B=I[0],O=I[1],T=d((0,n.useState)(null),2),_=T[0],P=T[1],A=d((0,n.useState)([]),2),j=A[0],R=A[1],D=d((0,n.useState)(!1),2),z=D[0],F=D[1],L=d((0,n.useState)(""),2),q=L[0],M=L[1],K=d((0,n.useState)(!1),2),U=K[0],N=K[1],G=d(i.Form.useForm(),1)[0],H=d((0,n.useState)([]),2),V=H[0],W=H[1],Y=d((0,n.useState)(!1),2),Q=Y[0],$=Y[1],J=new Set((void 0===p?[]:p).filter(function(e){return"knowledge-base"===e.type}).map(function(e){return e.uid}));(0,n.useEffect)(function(){var e;(e=s(function(){var e,t,n,r,o;return f(this,function(a){switch(a.label){case 0:return a.trys.push([0,2,,3]),[4,x.request({url:"auth:check"})];case 1:return W(o=(null==(r=null==(n=a.sent())||null==(e=n.data)?void 0:e.data)||null==(t=r.roles)?void 0:t.map(function(e){return e.name||e}))||[]),$(o.includes("root")||o.includes("admin")),[3,3];case 2:return a.sent(),[3,3];case 3:return[2]}})}),function(){return e.apply(this,arguments)})()},[x]),(0,n.useEffect)(function(){var e;(e=s(function(){var e,t,n;return f(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,3,4]),C(!0),[4,x.resource("aiKnowledgeBase").list({params:{filter:{enabled:!0},sort:["-createdAt"]}})];case 1:return O(n=(null==(t=r.sent())||null==(e=t.data)?void 0:e.data)||[]),n.length>0&&!_&&P(n[0]),[3,4];case 2:return console.error("Failed to fetch knowledge bases:",r.sent()),[3,4];case 3:return C(!1),[7];case 4:return[2]}})}),function(){return e.apply(this,arguments)})()},[x]);var X=(0,n.useCallback)((t=s(function(e){var t,n,r;return f(this,function(o){switch(o.label){case 0:F(!0),o.label=1;case 1:return o.trys.push([1,3,4,5]),[4,x.request({url:"aiKnowledgeBaseDoc:list",params:{filter:{knowledgeBaseId:e}}})];case 2:return R(null!=(r=null==(n=o.sent())||null==(t=n.data)?void 0:t.data)?r:[]),[3,5];case 3:return o.sent(),i.message.error("Failed to load documents"),[3,5];case 4:return F(!1),[7];case 5:return[2]}})}),function(e){return t.apply(this,arguments)}),[x]);(0,n.useEffect)(function(){_&&X(_.id)},[null==_?void 0:_.id,X]);var Z=function(e){if(Q||"BASIC"===e.accessLevel)return!0;if("PUBLIC"===e.accessLevel)return!1;if("SHARED"===e.accessLevel){var t;return(null==(t=e.uploadRoles)?void 0:t.some(function(e){return V.includes(e)}))||!1}return!1},ee=function(e){J.has(e.id)?E(e.id):m({uid:e.id,title:e.name,content:{knowledgeBaseId:e.id,name:e.name}})},et=function(e,t,n){if(_){var r=new FormData;r.append("file",e);var o=_.fileStorage?"?storageRule=".concat(encodeURIComponent(_.fileStorage)):"";x.axios.post("aiFiles:create".concat(o),r,{headers:{"Content-Type":"multipart/form-data"}}).then(function(n){return null==t?void 0:t(n.data,e)}).catch(function(e){return null==n?void 0:n(e)})}},en=(a=s(function(){var e;return f(this,function(t){switch(t.label){case 0:return t.trys.push([0,3,,4]),[4,G.validateFields()];case 1:if(e=t.sent(),!_)return[2];return[4,x.request({url:"aiKnowledgeBaseDoc:create",method:"post",data:{values:{knowledgeBaseId:_.id,filename:e.filename,textContent:e.textContent,status:"pending"}}})];case 2:return t.sent(),i.message.success("Text document added"),N(!1),G.resetFields(),X(_.id),[3,4];case 3:return t.sent(),i.message.error("Failed to add text document"),[3,4];case 4:return[2]}})}),function(){return a.apply(this,arguments)}),er=(u=s(function(e){return f(this,function(t){switch(t.label){case 0:return t.trys.push([0,2,,3]),[4,x.request({url:"aiKnowledgeBaseDoc:destroy",method:"post",params:{filterByTk:e}})];case 1:return t.sent(),i.message.success("Document deleted"),_&&X(_.id),[3,3];case 2:return t.sent(),i.message.error("Delete failed"),[3,3];case 3:return[2]}})}),function(e){return u.apply(this,arguments)}),eo=(c=s(function(e){return f(this,function(t){switch(t.label){case 0:return t.trys.push([0,2,,3]),[4,x.request({url:"aiKnowledgeBaseDoc:reprocess",method:"post",params:{filterByTk:e}})];case 1:return t.sent(),i.message.success("Reprocessing started"),_&&X(_.id),[3,3];case 2:return t.sent(),i.message.error("Reprocess failed"),[3,3];case 3:return[2]}})}),function(e){return c.apply(this,arguments)}),ea=[{title:"Document",dataIndex:"filename",key:"filename",ellipsis:!0,render:function(e){return r().createElement(i.Space,null,r().createElement(l.FileTextOutlined,{style:{color:"#8c8c8c"}}),r().createElement(y,null,e))}},{title:"Status",dataIndex:"status",key:"status",width:110,render:function(e){var t=b[e]||{color:"default",label:e};return r().createElement(i.Tag,{color:t.color},t.label)}},{title:"Chunks",dataIndex:"chunkCount",key:"chunkCount",width:70,render:function(e){return e||"-"}},{title:"Actions",key:"actions",width:140,render:function(e,t){if(!_||!Z(_))return null;var n="processing"===t.status,o=_.deleteSourceFile&&!t.fileId&&!t.textContent;return r().createElement(i.Space,{size:"small"},r().createElement(i.Tooltip,{title:n?"Embedding in progress...":o?"Source file has been deleted":"Reprocess"},r().createElement(i.Button,{size:"small",type:"text",icon:r().createElement(l.ReloadOutlined,null),onClick:function(){return eo(t.id)},disabled:n||o})),r().createElement(i.Popconfirm,{title:"Delete this document?",onConfirm:function(){return er(t.id)},okText:"Yes",cancelText:"No"},r().createElement(i.Tooltip,{title:"Delete"},r().createElement(i.Button,{size:"small",type:"text",danger:!0,icon:r().createElement(l.DeleteOutlined,null)}))))}}];if(S)return r().createElement("div",{style:{padding:48,textAlign:"center"}},r().createElement(i.Spin,{size:"large"}));if(!B.length)return r().createElement("div",{style:{padding:48}},r().createElement(i.Empty,{image:i.Empty.PRESENTED_IMAGE_SIMPLE,description:"No knowledge bases available"}));var el=_&&Z(_);return r().createElement("div",{style:{display:"flex",height:"65vh",minHeight:480}},r().createElement("div",{style:{width:260,borderRight:"1px solid #f0f0f0",overflowY:"auto",background:"#fafafa"}},r().createElement("div",{style:{padding:"14px 16px 8px",display:"flex",flexDirection:"column",gap:12}},r().createElement(y,{strong:!0,style:{fontSize:14}},"Knowledge Bases"),r().createElement(i.Input.Search,{placeholder:"Search...",size:"small",allowClear:!0,onChange:function(e){return M(e.target.value)}})),B.filter(function(e){return e.name.toLowerCase().includes(q.toLowerCase())}).map(function(e){var t=(null==_?void 0:_.id)===e.id,n=J.has(e.id);return r().createElement("div",{key:e.id,onClick:function(){return P(e)},style:{padding:"10px 16px",cursor:"pointer",background:t?"#e6f4ff":"transparent",borderLeft:t?"3px solid #1890ff":"3px solid transparent",transition:"all 0.2s"}},r().createElement("div",{style:{display:"flex",alignItems:"center",gap:8}},v[e.accessLevel||"PUBLIC"],r().createElement(y,{strong:t,style:{flex:1,fontSize:13},ellipsis:!0},e.name),n&&r().createElement(l.CheckCircleOutlined,{style:{color:"#52c41a",fontSize:14}})),r().createElement("div",{style:{marginTop:4,display:"flex",gap:4}},r().createElement(i.Tag,{color:w[e.accessLevel||"PUBLIC"],style:{fontSize:10,lineHeight:"16px",padding:"0 4px"}},e.accessLevel||"PUBLIC")))})),r().createElement("div",{style:{flex:1,display:"flex",flexDirection:"column",overflow:"hidden"}},_?r().createElement(r().Fragment,null,r().createElement("div",{style:{padding:"12px 20px",borderBottom:"1px solid #f0f0f0",display:"flex",justifyContent:"space-between",alignItems:"center",flexShrink:0}},r().createElement("div",null,r().createElement(g,{level:5,style:{margin:0}},_.name),_.description&&r().createElement(y,{type:"secondary",style:{fontSize:12}},_.description)),r().createElement(i.Space,null,r().createElement(i.Button,{type:J.has(_.id)?"primary":"default",icon:J.has(_.id)?r().createElement(l.CheckCircleOutlined,null):r().createElement(l.BookOutlined,null),onClick:function(){return ee(_)}},J.has(_.id)?"Selected":"Select for Chat"))),r().createElement("div",{style:{flex:1,overflow:"auto",padding:"12px 20px"}},el&&r().createElement("div",{style:{marginBottom:16}},r().createElement(h,{name:"file",multiple:!0,showUploadList:!1,accept:".txt,.md,.pdf,.doc,.docx,.ppt,.pptx,.csv,.json",customRequest:function(e){return et(e.file,e.onSuccess,e.onError)},onChange:function(e){if("done"===e.file.status){var t,n=null==(t=e.file.response)?void 0:t.data;n&&_&&x.request({url:"aiKnowledgeBaseDoc:create",method:"post",data:{values:{knowledgeBaseId:_.id,fileId:n.id,filename:n.filename||e.file.name,status:"pending"}}}).then(function(){i.message.success('"'.concat(e.file.name,'" uploaded')),X(_.id)}).catch(function(){return i.message.error("Failed to create document record")})}else"error"===e.file.status&&i.message.error("Upload failed: ".concat(e.file.name))},style:{padding:"16px 0",background:"#fafafa"}},r().createElement("p",{className:"ant-upload-drag-icon",style:{marginBottom:8}},r().createElement(l.InboxOutlined,null)),r().createElement("p",{className:"ant-upload-text",style:{fontSize:13,margin:0,marginBottom:8}},"Drag files here or"),r().createElement(i.Space,null,r().createElement(i.Button,{type:"primary",size:"small",icon:r().createElement(l.UploadOutlined,null)},"Upload File"),r().createElement(i.Button,{size:"small",icon:r().createElement(l.PlusOutlined,null),onClick:function(e){e.stopPropagation(),N(!0)}},"Paste Text")))),r().createElement(i.Table,{dataSource:j,columns:ea,rowKey:"id",size:"small",loading:z,pagination:{pageSize:8,size:"small",showSizeChanger:!1},locale:{emptyText:r().createElement(i.Empty,{image:i.Empty.PRESENTED_IMAGE_SIMPLE,description:"No documents yet"})}}))):r().createElement("div",{style:{flex:1,display:"flex",alignItems:"center",justifyContent:"center"}},r().createElement(i.Empty,{description:"Select a knowledge base"}))),r().createElement(i.Modal,{title:"Add Text Document",open:U,onOk:en,onCancel:function(){return N(!1)},destroyOnClose:!0,width:500},r().createElement(i.Form,{form:G,layout:"vertical"},r().createElement(i.Form.Item,{name:"filename",label:"Document Name",rules:[{required:!0}]},r().createElement(i.Input,{placeholder:"e.g. Company FAQ"})),r().createElement(i.Form.Item,{name:"textContent",label:"Content",rules:[{required:!0}]},r().createElement(i.Input.TextArea,{autoSize:{minRows:6,maxRows:16},placeholder:"Paste your text content here..."})))))};function x(e,t,n,r,o,a,l){try{var i=e[a](l),u=i.value}catch(e){n(e);return}i.done?t(u):Promise.resolve(u).then(r,o)}var k={name:"knowledge-base",menu:{icon:r().createElement(l.BookOutlined,null),label:"Knowledge Base",onClick:function(e){var t=e.ctx,n=e.contextItems,o=e.onAdd,a=e.onRemove;t.viewer.dialog({width:900,content:r().createElement(E,{contextItems:n,onAdd:o,onRemove:a,onClose:function(){return t.viewer.close()}})})}},tag:{Component:function(e){var t=e.item;return r().createElement(i.Space,null,r().createElement(l.BookOutlined,null),r().createElement("span",null,(null==t?void 0:t.title)||"Knowledge Base"))}},getContent:(e=function(e,t){var n;return function(e,t){var n,r,o,a,l={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function i(a){return function(i){var u=[a,i];if(n)throw TypeError("Generator is already executing.");for(;l;)try{if(n=1,r&&(o=2&u[0]?r.return:u[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,u[1])).done)return o;switch(r=0,o&&(u=[2&u[0],o.value]),u[0]){case 0:case 1:o=u;break;case 4:return l.label++,{value:u[1],done:!1};case 5:l.label++,r=u[1],u=[0];continue;case 7:u=l.ops.pop(),l.trys.pop();continue;default:if(!(o=(o=l.trys).length>0&&o[o.length-1])&&(6===u[0]||2===u[0])){l=0;continue}if(3===u[0]&&(!o||u[1]>o[0]&&u[1]<o[3])){l.label=u[1];break}if(6===u[0]&&l.label<o[1]){l.label=o[1],o=u;break}if(o&&l.label<o[2]){l.label=o[2],l.ops.push(u);break}o[2]&&l.ops.pop(),l.trys.pop();continue}u=t.call(e,l)}catch(e){u=[6,e],r=0}finally{n=o=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}(this,function(e){return n=t.uid,[2,t.content||{knowledgeBaseId:n}]})},t=function(){var t=this,n=arguments;return new Promise(function(r,o){var a=e.apply(t,n);function l(e){x(a,r,o,l,i,"next",e)}function i(e){x(a,r,o,l,i,"throw",e)}l(void 0)})},function(e,n){return t.apply(this,arguments)})},S=p(581);function C(e,t,n,r,o,a,l){try{var i=e[a](l),u=i.value}catch(e){n(e);return}i.done?t(u):Promise.resolve(u).then(r,o)}function I(e,t,n){return(I=_()?Reflect.construct:function(e,t,n){var r=[null];r.push.apply(r,t);var o=new(Function.bind.apply(e,r));return n&&O(o,n.prototype),o}).apply(null,arguments)}function B(e){return(B=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function O(e,t){return(O=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function T(e){var t="function"==typeof Map?new Map:void 0;return(T=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return I(e,arguments,B(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),O(n,e)})(e)}function _(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(_=function(){return!!e})()}var P=(0,o.lazy)(function(){return S("imported_17tercj_component",p.e("911").then(p.bind(p,689)))},"KnowledgeBases").KnowledgeBases,A=(0,o.lazy)(function(){return S("imported_1659ooj_component",p.e("642").then(p.bind(p,517)))},"Infrastructure").Infrastructure,j=function(e){var t;if("function"!=typeof e&&null!==e)throw TypeError("Super expression must either be null or a function");function n(){var e,t;if(!(this instanceof n))throw TypeError("Cannot call a class as a function");return e=n,t=arguments,e=B(e),function(e,t){var n;if(t&&("object"==((n=t)&&"undefined"!=typeof Symbol&&n.constructor===Symbol?"symbol":typeof n)||"function"==typeof t))return t;if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this,_()?Reflect.construct(e,t||[],B(this).constructor):e.apply(this,t))}return n.prototype=Object.create(e&&e.prototype,{constructor:{value:n,writable:!0,configurable:!0}}),e&&O(n,e),t=[{key:"load",value:function(){var e,t=this;return(e=function(){var e;return function(e,t){var n,r,o,a,l={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:i(0),throw:i(1),return:i(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function i(a){return function(i){var u=[a,i];if(n)throw TypeError("Generator is already executing.");for(;l;)try{if(n=1,r&&(o=2&u[0]?r.return:u[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,u[1])).done)return o;switch(r=0,o&&(u=[2&u[0],o.value]),u[0]){case 0:case 1:o=u;break;case 4:return l.label++,{value:u[1],done:!1};case 5:l.label++,r=u[1],u=[0];continue;case 7:u=l.ops.pop(),l.trys.pop();continue;default:if(!(o=(o=l.trys).length>0&&o[o.length-1])&&(6===u[0]||2===u[0])){l=0;continue}if(3===u[0]&&(!o||u[1]>o[0]&&u[1]<o[3])){l.label=u[1];break}if(6===u[0]&&l.label<o[1]){l.label=o[1],o=u;break}if(o&&l.label<o[2]){l.label=o[2],l.ops.push(u);break}o[2]&&l.ops.pop(),l.trys.pop();continue}u=t.call(e,l)}catch(e){u=[6,e],r=0}finally{n=o=0}if(5&u[0])throw u[1];return{value:u[0]?u[1]:void 0,done:!0}}}}(this,function(n){try{(null==(e=t.app.pm.get("ai"))?void 0:e.aiManager)&&e.aiManager.registerWorkContext("knowledge-base",k)}catch(e){}return t.app.pluginSettingsManager.add("ai.knowledge-base",{title:(0,a.tval)("Knowledge base"),icon:"BookOutlined",Component:P,aclSnippet:"pm.plugin-knowledge-base.knowledge-base",sort:300}),t.app.pluginSettingsManager.add("ai.infrastructure",{title:(0,a.tval)("Infrastructure"),icon:"HddOutlined",Component:A,aclSnippet:"pm.plugin-knowledge-base.knowledge-base",sort:310}),[2]})},function(){var t=this,n=arguments;return new Promise(function(r,o){var a=e.apply(t,n);function l(e){C(a,r,o,l,i,"next",e)}function i(e){C(a,r,o,l,i,"throw",e)}l(void 0)})})()}}],function(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(n.prototype,t),n}(T(o.Plugin)),R=j}(),m}()});
@@ -8,16 +8,16 @@
8
8
  */
9
9
 
10
10
  module.exports = {
11
- "react": "18.2.0",
12
- "@nocobase/client": "2.0.20",
13
- "@nocobase/utils": "2.0.20",
14
- "@nocobase/server": "2.0.20",
15
- "@nocobase/plugin-ai": "2.0.20",
16
- "@ant-design/icons": "5.6.1",
11
+ "react": "18.3.1",
12
+ "@nocobase/client": "2.0.32",
13
+ "@nocobase/utils": "2.0.32",
14
+ "@nocobase/server": "2.0.32",
15
+ "@nocobase/plugin-ai": "2.0.32",
17
16
  "antd": "5.24.2",
18
- "@nocobase/database": "2.0.20",
19
- "@langchain/core": "1.1.24",
20
- "axios": "1.7.7",
21
- "@nocobase/actions": "2.0.20",
17
+ "@ant-design/icons": "5.6.1",
18
+ "@nocobase/database": "2.0.32",
19
+ "@langchain/core": "1.1.36",
20
+ "axios": "1.14.0",
21
+ "@nocobase/actions": "2.0.32",
22
22
  "pg": "8.20.0"
23
23
  };
@@ -7,9 +7,11 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
 
10
+ var __create = Object.create;
10
11
  var __defProp = Object.defineProperty;
11
12
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
13
  var __getOwnPropNames = Object.getOwnPropertyNames;
14
+ var __getProtoOf = Object.getPrototypeOf;
13
15
  var __hasOwnProp = Object.prototype.hasOwnProperty;
14
16
  var __export = (target, all) => {
15
17
  for (var name in all)
@@ -23,22 +25,34 @@ var __copyProps = (to, from, except, desc) => {
23
25
  }
24
26
  return to;
25
27
  };
28
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
29
+ // If the importer is in node compatibility mode or this is not an ESM
30
+ // file that has been converted to a CommonJS file using a Babel-
31
+ // compatible transform (i.e. "__esModule" has not been set), then set
32
+ // "default" to the CommonJS "module.exports" for node compatibility.
33
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
34
+ mod
35
+ ));
26
36
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
27
37
  var add_document_exports = {};
28
38
  __export(add_document_exports, {
29
39
  addDocumentAction: () => addDocumentAction
30
40
  });
31
41
  module.exports = __toCommonJS(add_document_exports);
42
+ var import_plugin = __toESM(require("../plugin"));
32
43
  async function addDocumentAction(ctx, next) {
33
- const { knowledgeBaseId, fileUrl, textContent, userId, filename } = ctx.action.params.values ?? {};
44
+ var _a, _b;
45
+ const { knowledgeBaseId, fileUrl, textContent, filename } = ctx.action.params.values ?? {};
34
46
  if (!knowledgeBaseId) {
35
47
  ctx.throw(400, "knowledgeBaseId is required");
36
48
  }
37
49
  if (!fileUrl && !textContent) {
38
50
  ctx.throw(400, "fileUrl or textContent is required");
39
51
  }
52
+ const userId = (_b = (_a = ctx.auth) == null ? void 0 : _a.user) == null ? void 0 : _b.id;
40
53
  if (!userId) {
41
- ctx.throw(400, "userId is required");
54
+ ctx.throw(401, "Authentication required");
55
+ return;
42
56
  }
43
57
  const knowledgeBase = await ctx.db.getRepository("aiKnowledgeBases").findOne({
44
58
  filter: { id: knowledgeBaseId },
@@ -47,6 +61,10 @@ async function addDocumentAction(ctx, next) {
47
61
  if (!knowledgeBase) {
48
62
  ctx.throw(404, `Knowledge base "${knowledgeBaseId}" not found`);
49
63
  }
64
+ const kbData = knowledgeBase.toJSON ? knowledgeBase.toJSON() : knowledgeBase;
65
+ if (kbData.type === "EXTERNAL_RAG") {
66
+ ctx.throw(400, "Cannot add documents to an external RAG knowledge base. Documents are managed by the external service.");
67
+ }
50
68
  const docRepo = ctx.db.getRepository("aiKnowledgeBaseDocuments");
51
69
  const docValues = {
52
70
  knowledgeBaseId,
@@ -63,7 +81,7 @@ async function addDocumentAction(ctx, next) {
63
81
  }
64
82
  const doc = await docRepo.create({ values: docValues });
65
83
  try {
66
- const plugin = ctx.app.pm.get("plugin-knowledge-base") || ctx.app.pm.get("@nocobase/plugin-knowledge-base");
84
+ const plugin = ctx.app.pm.get(import_plugin.default);
67
85
  if (plugin == null ? void 0 : plugin.vectorizationPipeline) {
68
86
  plugin.vectorizationPipeline.processDocument(doc.id).catch((err) => {
69
87
  ctx.app.logger.error(`[addDocument] Vectorization failed for doc ${doc.id}:`, err);
@@ -48,7 +48,7 @@ var ai_knowledge_bases_default = (0, import_database.defineCollection)({
48
48
  name: "description"
49
49
  },
50
50
  {
51
- // LOCAL | READONLY | EXTERNAL
51
+ // LOCAL | READONLY | EXTERNAL | EXTERNAL_RAG
52
52
  type: "string",
53
53
  name: "type",
54
54
  defaultValue: "LOCAL"
@@ -91,7 +91,14 @@ var ai_knowledge_bases_default = (0, import_database.defineCollection)({
91
91
  name: "uploadRoles"
92
92
  },
93
93
  {
94
- // Extra configuration per knowledge base type
94
+ // Extra configuration per knowledge base type.
95
+ // For EXTERNAL_RAG:
96
+ // ragProvider: string — strategy name (default: 'external-http')
97
+ // ragApiUrl: string — (required for external-http) POST endpoint URL
98
+ // ragApiKey: string — (optional) Bearer token for Authorization header
99
+ // ragNamespace: string — (optional) namespace forwarded in request body
100
+ // ragTopK: number — (optional) overrides default topK
101
+ // ragScoreThreshold: number — (optional) overrides default score threshold
95
102
  type: "json",
96
103
  name: "options"
97
104
  },
@@ -101,6 +108,14 @@ var ai_knowledge_bases_default = (0, import_database.defineCollection)({
101
108
  name: "deleteSourceFile",
102
109
  defaultValue: false
103
110
  },
111
+ {
112
+ // If true, documents are also indexed into DocPixie (when plugin-docpixie is active).
113
+ // DocPixie text is used for embedding (better OCR), and docpixie_document_id is stored
114
+ // in chunk metadata to enable Stage 2 deep retrieval during AI chat.
115
+ type: "boolean",
116
+ name: "useDocpixie",
117
+ defaultValue: false
118
+ },
104
119
  {
105
120
  type: "hasMany",
106
121
  name: "documents",
@@ -29,6 +29,8 @@ __export(vector_store_provider_impl_exports, {
29
29
  VectorStoreProviderImpl: () => VectorStoreProviderImpl
30
30
  });
31
31
  module.exports = __toCommonJS(vector_store_provider_impl_exports);
32
+ var import_simple_embeddings = require("../pipeline/simple-embeddings");
33
+ var import_request_context = require("../request-context");
32
34
  class VectorStoreProviderImpl {
33
35
  constructor(plugin, aiPlugin) {
34
36
  this.plugin = plugin;
@@ -82,13 +84,12 @@ class VectorStoreProviderImpl {
82
84
  const knowledgeBases = await this.plugin.db.getRepository("aiKnowledgeBases").find({
83
85
  filter: { vectorStoreId: vectorStoreConfigId }
84
86
  });
85
- const { getCurrentUserId, getCurrentUserRoles } = require("../request-context");
86
- const hasPrivateKB = knowledgeBases.some(
87
- (kb) => kb.accessLevel === "PRIVATE"
87
+ const hasBasicKB = knowledgeBases.some(
88
+ (kb) => kb.accessLevel === "BASIC"
88
89
  );
89
- if (hasPrivateKB) {
90
- accessLevel = "PRIVATE";
91
- const currentUserId = getCurrentUserId();
90
+ if (hasBasicKB) {
91
+ accessLevel = "BASIC";
92
+ const currentUserId = (0, import_request_context.getCurrentUserId)();
92
93
  if (currentUserId) {
93
94
  ownerId = String(currentUserId);
94
95
  }
@@ -96,8 +97,8 @@ class VectorStoreProviderImpl {
96
97
  const sharedKBs = knowledgeBases.filter(
97
98
  (kb) => kb.accessLevel === "SHARED"
98
99
  );
99
- if (sharedKBs.length > 0 && !hasPrivateKB) {
100
- const currentRoles = getCurrentUserRoles();
100
+ if (sharedKBs.length > 0 && !hasBasicKB) {
101
+ const currentRoles = (0, import_request_context.getCurrentUserRoles)();
101
102
  const allAllowedRoles = /* @__PURE__ */ new Set();
102
103
  for (const kb of sharedKBs) {
103
104
  for (const role of kb.allowedRoles ?? []) {
@@ -123,9 +124,8 @@ class VectorStoreProviderImpl {
123
124
  throw new Error(`LLM service "${llmServiceName}" not found`);
124
125
  }
125
126
  const llmService = llmServiceRecord.toJSON();
126
- const { SimpleHTTPEmbeddings } = require("../pipeline/simple-embeddings");
127
127
  const serviceOpts = this.plugin.app.environment.renderJsonTemplate(llmService.options || {});
128
- return new SimpleHTTPEmbeddings({
128
+ return new import_simple_embeddings.SimpleHTTPEmbeddings({
129
129
  baseURL: serviceOpts.baseURL || serviceOpts.baseUrl || "",
130
130
  apiKey: serviceOpts.apiKey || "",
131
131
  model: embeddingModel
@@ -147,7 +147,7 @@ class DefaultVectorStoreService {
147
147
  return [];
148
148
  }
149
149
  let mergedFilter = filter;
150
- if ((level === "PRIVATE" || level === "BASIC") && this.accessContext.ownerId) {
150
+ if (level === "BASIC" && this.accessContext.ownerId) {
151
151
  mergedFilter = {
152
152
  ...filter,
153
153
  userId: this.accessContext.ownerId
@@ -36,14 +36,22 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
36
36
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
37
37
  var server_exports = {};
38
38
  __export(server_exports, {
39
+ EXTERNAL_HTTP_RAG_PROVIDER: () => import_external_rag.EXTERNAL_HTTP_RAG_PROVIDER,
40
+ EXTERNAL_RAG_KB_TYPE: () => import_external_rag.EXTERNAL_RAG_KB_TYPE,
41
+ PluginKnowledgeBaseServer: () => import_plugin2.PluginKnowledgeBaseServer,
39
42
  default: () => import_plugin.default,
40
43
  namespace: () => namespace
41
44
  });
42
45
  module.exports = __toCommonJS(server_exports);
43
46
  var import_package = require("../../package.json");
44
47
  var import_plugin = __toESM(require("./plugin"));
48
+ var import_plugin2 = require("./plugin");
49
+ var import_external_rag = require("./providers/external-rag");
45
50
  const namespace = import_package.name;
46
51
  // Annotate the CommonJS export names for ESM import in node:
47
52
  0 && (module.exports = {
53
+ EXTERNAL_HTTP_RAG_PROVIDER,
54
+ EXTERNAL_RAG_KB_TYPE,
55
+ PluginKnowledgeBaseServer,
48
56
  namespace
49
57
  });
@@ -44,16 +44,48 @@ class SimpleHTTPEmbeddings {
44
44
  baseURL;
45
45
  apiKey;
46
46
  modelName;
47
+ /** Max texts per API request. Keep conservative for providers with lower limits. */
48
+ static BATCH_SIZE = 20;
47
49
  constructor(opts) {
48
50
  this.baseURL = opts.baseURL.replace(/\/$/, "");
49
51
  this.apiKey = opts.apiKey;
50
52
  this.modelName = opts.model;
51
53
  }
54
+ /**
55
+ * Embed multiple texts using batched HTTP requests.
56
+ * Processes texts in chunks of BATCH_SIZE to avoid overwhelming the API,
57
+ * and falls back to single-text requests if batch fails (e.g. provider doesn't support arrays).
58
+ */
52
59
  async embedDocuments(texts) {
53
- const results = [];
54
- for (const text of texts) {
55
- const result = await this.embedQuery(text);
56
- results.push(result);
60
+ var _a;
61
+ if (texts.length === 0) return [];
62
+ const results = new Array(texts.length);
63
+ const batchSize = SimpleHTTPEmbeddings.BATCH_SIZE;
64
+ for (let i = 0; i < texts.length; i += batchSize) {
65
+ const batch = texts.slice(i, i + batchSize);
66
+ try {
67
+ const res = await import_axios.default.post(
68
+ `${this.baseURL}/embeddings`,
69
+ { model: this.modelName, input: batch },
70
+ {
71
+ headers: {
72
+ Authorization: `Bearer ${this.apiKey}`,
73
+ "Content-Type": "application/json"
74
+ }
75
+ }
76
+ );
77
+ const data = ((_a = res.data) == null ? void 0 : _a.data) ?? [];
78
+ if (data.length !== batch.length) {
79
+ throw new Error(`Batch response length mismatch: expected ${batch.length}, got ${data.length}`);
80
+ }
81
+ for (const item of data) {
82
+ results[i + item.index] = item.embedding;
83
+ }
84
+ } catch (batchErr) {
85
+ for (let j = 0; j < batch.length; j++) {
86
+ results[i + j] = await this.embedQuery(batch[j]);
87
+ }
88
+ }
57
89
  }
58
90
  return results;
59
91
  }