plugin-knowledge-base 1.0.4 → 1.1.1
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.
- package/README.md +35 -24
- package/dist/client/index.js +1 -1
- package/dist/externalVersion.js +7 -7
- package/dist/locale/en-US.json +3 -1
- package/dist/locale/vi-VN.json +3 -1
- package/dist/server/collections/ai-knowledge-bases.js +6 -0
- package/dist/server/features/knowledge-base-impl.js +3 -0
- package/dist/server/pipeline/vectorization.js +31 -0
- package/dist/server/plugin.js +90 -0
- package/dist/server/resources/ai-knowledge-base-documents.js +95 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,24 +1,35 @@
|
|
|
1
|
-
# plugin-knowledge-base
|
|
2
|
-
|
|
3
|
-
AI Knowledge Base plugin for NocoBase. Provides RAG (Retrieval Augmented Generation) capabilities for AI Employees.
|
|
4
|
-
|
|
5
|
-
## Features
|
|
6
|
-
|
|
7
|
-
- **Knowledge Base Management** — Create and manage knowledge bases with document upload
|
|
8
|
-
- **
|
|
9
|
-
- **
|
|
10
|
-
-
|
|
11
|
-
- **
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
1
|
+
# plugin-knowledge-base
|
|
2
|
+
|
|
3
|
+
AI Knowledge Base plugin for NocoBase. Provides RAG (Retrieval Augmented Generation) capabilities for AI Employees.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Knowledge Base Management** — Create and manage knowledge bases with document upload
|
|
8
|
+
- **Access Control (ACL)** — 4 access levels: Private, Basic, Shared (role-based), Public
|
|
9
|
+
- **Shared mode**: `allowedRoles` (read/search) and `uploadRoles` (upload documents) per KB
|
|
10
|
+
- Permission enforcement on all operations: list, create, destroy, reprocess, RAG search
|
|
11
|
+
- **Vector Store** — Bind Embedding models with Vector Databases
|
|
12
|
+
- **Vector Database** — PGVector connection management with connection testing
|
|
13
|
+
- **Document Processing** — Automatic document parsing, chunking, and vectorization
|
|
14
|
+
- File upload (.pdf, .txt, .md, .doc, .docx, .ppt, .csv, .json)
|
|
15
|
+
- Paste text documents directly
|
|
16
|
+
- Auto-delete source file option after successful embedding
|
|
17
|
+
- **RAG Retrieval** — Semantic search for AI Employee conversations via Work Context
|
|
18
|
+
- **KB Management Popup in Chat** — Users can browse, upload, and select KBs directly from AI chat
|
|
19
|
+
- Left sidebar with KB list and access level badges
|
|
20
|
+
- Document table with status, chunk count, and actions
|
|
21
|
+
- File upload and drag-and-drop support
|
|
22
|
+
- "Select for Chat" toggle for RAG context
|
|
23
|
+
|
|
24
|
+
## Requirements
|
|
25
|
+
|
|
26
|
+
- NocoBase 2.x
|
|
27
|
+
- Plugin AI (`@nocobase/plugin-ai`) enabled
|
|
28
|
+
- PostgreSQL with `pgvector` extension (for PGVector provider)
|
|
29
|
+
|
|
30
|
+
## Installation
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
yarn pm add plugin-knowledge-base
|
|
34
|
+
yarn pm enable plugin-knowledge-base
|
|
35
|
+
```
|
package/dist/client/index.js
CHANGED
|
@@ -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 s={};return!function(){u.r(s),u.d(s,{PluginKnowledgeBaseClient:function(){return j},default:function(){return M}});var e=u(156),t=u.n(e),n=u(772),r=u(584),a=u(721),l=u(482);function o(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,a,l,o){try{var u=e[l](o),s=u.value}catch(e){n(e);return}u.done?t(s):Promise.resolve(s).then(r,a)}function i(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){c(l,r,a,o,u,"next",e)}function u(e){c(l,r,a,o,u,"throw",e)}o(void 0)})}}function d(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 o(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 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 m(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 s=[l,u];if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(a=2&s[0]?r.return:s[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,s[1])).done)return a;switch(r=0,a&&(s=[2&s[0],a.value]),s[0]){case 0:case 1:a=s;break;case 4:return o.label++,{value:s[1],done:!1};case 5:o.label++,r=s[1],s=[0];continue;case 7:s=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===s[0]||2===s[0])){o=0;continue}if(3===s[0]&&(!a||s[1]>a[0]&&s[1]<a[3])){o.label=s[1];break}if(6===s[0]&&o.label<a[1]){o.label=a[1],a=s;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(s);break}a[2]&&o.ops.pop(),o.trys.pop();continue}s=t.call(e,o)}catch(e){s=[6,e],r=0}finally{n=a=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}}}var f={pending:"default",processing:"processing",success:"success",failed:"error"},p=[{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"}],y=function(){var r,o,u,s,c,y,b,v,h,g,E=(0,n.useAPIClient)(),w=d((0,e.useState)([]),2),S=w[0],k=w[1],I=d((0,e.useState)(!1),2),O=I[0],x=I[1],C=d((0,e.useState)(!1),2),P=C[0],F=C[1],A=d((0,e.useState)(!1),2),B=A[0],q=A[1],D=d((0,e.useState)(null),2),T=D[0],j=D[1],M=d((0,e.useState)(null),2),V=M[0],L=M[1],R=d((0,e.useState)([]),2),U=R[0],K=R[1],N=d((0,e.useState)([]),2),_=N[0],z=N[1],H=d((0,e.useState)([]),2),G=H[0],$=H[1],Y=d((0,e.useState)("PUBLIC"),2),Q=Y[0],X=Y[1],J=d((0,e.useState)(!1),2),W=J[0],Z=J[1],ee=d(a.Form.useForm(),1)[0],et=d(a.Form.useForm(),1)[0],en=(r=i(function(){var e,t,n;return m(this,function(r){switch(r.label){case 0:x(!0),r.label=1;case 1:return r.trys.push([1,3,4,5]),[4,E.request({url:"aiKnowledgeBase:list"})];case 2:return k(null!=(n=null==(t=r.sent())||null==(e=t.data)?void 0:e.data)?n:[]),[3,5];case 3:return r.sent(),a.message.error("Failed to load knowledge bases"),[3,5];case 4:return x(!1),[7];case 5:return[2]}})}),function(){return r.apply(this,arguments)}),er=(o=i(function(){var e,t,n;return m(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,E.request({url:"aiVectorStore:list"})];case 1:return z(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 o.apply(this,arguments)}),ea=(u=i(function(){var e,t,n;return m(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,E.request({url:"roles: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 u.apply(this,arguments)}),el=(s=i(function(e){var t,n,r;return m(this,function(l){switch(l.label){case 0:return l.trys.push([0,2,,3]),[4,E.request({url:"aiKnowledgeBaseDoc:list",params:{filter:{knowledgeBaseId:e}}})];case 1:return K(null!=(r=null==(n=l.sent())||null==(t=n.data)?void 0:t.data)?r:[]),[3,3];case 2:return l.sent(),a.message.error("Failed to load documents"),[3,3];case 3:return[2]}})}),function(e){return s.apply(this,arguments)});t().useEffect(function(){en(),er(),ea()},[]);var eo=function(e){var t;j(e),ee.setFieldsValue(e),X(null!=(t=e.accessLevel)?t:"PUBLIC"),F(!0)},eu=(c=i(function(){var e;return m(this,function(t){switch(t.label){case 0:return t.trys.push([0,6,,7]),[4,ee.validateFields()];case 1:if(e=t.sent(),!T)return[3,3];return[4,E.request({url:"aiKnowledgeBase:update",method:"post",params:{filterByTk:T.id},data:{values:e}})];case 2:return t.sent(),a.message.success("Updated successfully"),[3,5];case 3:return[4,E.request({url:"aiKnowledgeBase:create",method:"post",data:{values:e}})];case 4:t.sent(),a.message.success("Created successfully"),t.label=5;case 5:return F(!1),en(),[3,7];case 6:return t.sent(),a.message.error("Operation failed"),[3,7];case 7:return[2]}})}),function(){return c.apply(this,arguments)}),es=(y=i(function(e){return m(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(),a.message.success("Deleted successfully"),en(),[3,3];case 2:return t.sent(),a.message.error("Delete failed"),[3,3];case 3:return[2]}})}),function(e){return y.apply(this,arguments)}),ec=function(e){L(e),q(!0),el(e.id)},ei=(b=i(function(e){return m(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(),a.message.success("Reprocessing started"),V&&el(V.id),[3,3];case 2:return t.sent(),a.message.error("Reprocess failed"),[3,3];case 3:return[2]}})}),function(e){return b.apply(this,arguments)}),ed=(v=i(function(e){return m(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(),a.message.success("Document deleted"),V&&el(V.id),[3,3];case 2:return t.sent(),a.message.error("Delete failed"),[3,3];case 3:return[2]}})}),function(e){return v.apply(this,arguments)}),em=(h=i(function(){var e;return m(this,function(t){switch(t.label){case 0:return t.trys.push([0,3,,4]),[4,et.validateFields()];case 1:if(e=t.sent(),!V)return[2];return[4,E.request({url:"aiKnowledgeBaseDoc:create",method:"post",data:{values:{knowledgeBaseId:V.id,filename:e.filename,textContent:e.textContent,status:"pending"}}})];case 2:return t.sent(),a.message.success("Text document added"),Z(!1),et.resetFields(),el(V.id),[3,4];case 3:return t.sent(),a.message.error("Failed to add text document"),[3,4];case 4:return[2]}})}),function(){return h.apply(this,arguments)}),ef=function(e){var n,r=null!=(n=({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])?n:{color:"default",label:e},l=r.color,o=r.label;return t().createElement(a.Tag,{color:l},o)},ep=[{title:"Name",dataIndex:"name",key:"name"},{title:"Type",dataIndex:"type",key:"type"},{title:"Access Level",dataIndex:"accessLevel",key:"accessLevel",render:function(e){return ef(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,n){return t().createElement(a.Space,null,t().createElement(a.Button,{size:"small",icon:t().createElement(l.UploadOutlined,null),onClick:function(){return ec(n)}},"Documents"),t().createElement(a.Button,{size:"small",icon:t().createElement(l.EditOutlined,null),onClick:function(){return eo(n)}},"Edit"),t().createElement(a.Popconfirm,{title:"Are you sure?",onConfirm:function(){return es(n.id)}},t().createElement(a.Button,{size:"small",danger:!0,icon:t().createElement(l.DeleteOutlined,null)},"Delete")))}}],ey=[{title:"File",dataIndex:"filename",key:"filename"},{title:"Status",dataIndex:"status",key:"status",render:function(e){return t().createElement(a.Tag,{color:f[e]||"default"},e)}},{title:"Chunks",dataIndex:"chunkCount",key:"chunkCount"},{title:"Error",dataIndex:"error",key:"error",ellipsis:!0},{title:"Actions",key:"actions",render:function(e,n){return t().createElement(a.Space,null,t().createElement(a.Button,{size:"small",icon:t().createElement(l.ReloadOutlined,null),onClick:function(){return ei(n.id)}},"Reprocess"),t().createElement(a.Popconfirm,{title:"Are you sure?",onConfirm:function(){return ed(n.id)}},t().createElement(a.Button,{size:"small",danger:!0,icon:t().createElement(l.DeleteOutlined,null)},"Delete")))}}],eb=G.map(function(e){var t;return{label:null!=(t=e.title)?t:e.name,value:e.name}});return t().createElement("div",{style:{padding:24}},t().createElement("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:16}},t().createElement("h2",null,"Knowledge Base"),t().createElement(a.Button,{type:"primary",icon:t().createElement(l.PlusOutlined,null),onClick:function(){j(null),ee.resetFields(),ee.setFieldsValue({type:"LOCAL",enabled:!0,accessLevel:"PUBLIC"}),X("PUBLIC"),F(!0)}},"Add new")),t().createElement(a.Table,{dataSource:S,columns:ep,rowKey:"id",loading:O}),t().createElement(a.Modal,{title:T?"Edit Knowledge Base":"Add Knowledge Base",open:P,onOk:eu,onCancel:function(){return F(!1)},destroyOnClose:!0,width:600},t().createElement(a.Form,{form:ee,layout:"vertical"},t().createElement(a.Form.Item,{name:"name",label:"Name",rules:[{required:!0,message:"Name is required"}]},t().createElement(a.Input,null)),t().createElement(a.Form.Item,{name:"type",label:"Type"},t().createElement(a.Select,{options:[{label:"Local",value:"LOCAL"},{label:"Readonly",value:"READONLY"},{label:"External",value:"EXTERNAL"}]})),t().createElement(a.Form.Item,{name:"accessLevel",label:"Access Level",rules:[{required:!0}]},t().createElement(a.Select,{options:p,onChange:function(e){return X(e)}})),"SHARED"===Q&&t().createElement(t().Fragment,null,t().createElement(a.Form.Item,{name:"allowedRoles",label:"Allowed Roles (can view & query)",rules:[{required:!0,message:"Select at least one role"}]},t().createElement(a.Select,{mode:"multiple",options:eb,placeholder:"Select roles that can access this KB"})),t().createElement(a.Form.Item,{name:"uploadRoles",label:"Upload Roles (can add documents)"},t().createElement(a.Select,{mode:"multiple",options:eb,placeholder:"Select roles that can upload documents"}))),t().createElement(a.Form.Item,{name:"vectorStoreId",label:"Vector Store",rules:[{required:!0,message:"Vector store is required"}]},t().createElement(a.Select,{options:_.map(function(e){return{label:e.name,value:e.id}}),placeholder:"Select vector store"})),t().createElement(a.Form.Item,{name:"description",label:"Description"},t().createElement(a.Input.TextArea,{autoSize:{minRows:3}})),t().createElement(a.Form.Item,{name:"enabled",label:"Enabled",valuePropName:"checked"},t().createElement(a.Switch,null)))),t().createElement(a.Modal,{title:"Documents - ".concat(null!=(g=null==V?void 0:V.name)?g:""),open:B,onCancel:function(){return q(!1)},footer:null,width:1e3,destroyOnClose:!0},t().createElement("div",{style:{marginBottom:16,display:"flex",gap:8}},t().createElement(a.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==V?void 0:V.fileStorage)?"?storageRule=".concat(encodeURIComponent(V.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&&V&&E.request({url:"aiKnowledgeBaseDoc:create",method:"post",data:{values:{knowledgeBaseId:V.id,fileId:n.id,filename:n.filename||e.file.name,status:"pending"}}}).then(function(){a.message.success('File "'.concat(e.file.name,'" uploaded')),el(V.id)}).catch(function(){return a.message.error("Failed to create document record")})}else"error"===e.file.status&&a.message.error("Upload failed: ".concat(e.file.name))}},t().createElement(a.Button,{type:"primary",icon:t().createElement(l.UploadOutlined,null)},"Upload File")),t().createElement(a.Button,{icon:t().createElement(l.PlusOutlined,null),onClick:function(){return Z(!0)}},"Paste Text")),t().createElement(a.Table,{dataSource:U,columns:ey,rowKey:"id",size:"small"})),t().createElement(a.Modal,{title:"Add Text Document",open:W,onOk:em,onCancel:function(){return Z(!1)},destroyOnClose:!0,width:600},t().createElement(a.Form,{form:et,layout:"vertical"},t().createElement(a.Form.Item,{name:"filename",label:"Document Name",rules:[{required:!0}]},t().createElement(a.Input,{placeholder:"e.g. Company FAQ"})),t().createElement(a.Form.Item,{name:"textContent",label:"Content",rules:[{required:!0}]},t().createElement(a.Input.TextArea,{autoSize:{minRows:8,maxRows:20},placeholder:"Paste your text content here..."})))))};function b(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 v(e,t,n,r,a,l,o){try{var u=e[l](o),s=u.value}catch(e){n(e);return}u.done?t(s):Promise.resolve(s).then(r,a)}function h(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){v(l,r,a,o,u,"next",e)}function u(e){v(l,r,a,o,u,"throw",e)}o(void 0)})}}function g(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 b(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 b(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 E(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 s=[l,u];if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(a=2&s[0]?r.return:s[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,s[1])).done)return a;switch(r=0,a&&(s=[2&s[0],a.value]),s[0]){case 0:case 1:a=s;break;case 4:return o.label++,{value:s[1],done:!1};case 5:o.label++,r=s[1],s=[0];continue;case 7:s=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===s[0]||2===s[0])){o=0;continue}if(3===s[0]&&(!a||s[1]>a[0]&&s[1]<a[3])){o.label=s[1];break}if(6===s[0]&&o.label<a[1]){o.label=a[1],a=s;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(s);break}a[2]&&o.ops.pop(),o.trys.pop();continue}s=t.call(e,o)}catch(e){s=[6,e],r=0}finally{n=a=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}}}var w=function(){var r,o,u,s,c,i,d=(0,n.useAPIClient)(),m=g((0,e.useState)([]),2),f=m[0],p=m[1],y=g((0,e.useState)(!1),2),b=y[0],v=y[1],w=g((0,e.useState)(!1),2),S=w[0],k=w[1],I=g((0,e.useState)(null),2),O=I[0],x=I[1],C=g((0,e.useState)([]),2),P=C[0],F=C[1],A=g((0,e.useState)([]),2),B=A[0],q=A[1],D=g((0,e.useState)([]),2),T=D[0],j=D[1],M=g((0,e.useState)(!1),2),V=M[0],L=M[1],R=g(a.Form.useForm(),1)[0],U=(r=h(function(){var e,t,n;return E(this,function(r){switch(r.label){case 0:v(!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(),a.message.error("Failed to load vector stores"),[3,5];case 4:return v(!1),[7];case 5:return[2]}})}),function(){return r.apply(this,arguments)}),K=(o=h(function(){var e,t,n;return E(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,d.request({url:"aiVectorDatabase:list"})];case 1:return F(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 o.apply(this,arguments)}),N=(u=h(function(){var e,t,n;return E(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,d.request({url:"ai:listLLMServices"})];case 1:return q(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 u.apply(this,arguments)}),_=(s=h(function(e){var t,n,r;return E(this,function(a){switch(a.label){case 0:L(!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 L(!1),[7];case 5:return[2]}})}),function(e){return s.apply(this,arguments)});t().useEffect(function(){U(),K(),N()},[]);var z=function(e){x(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]),R.setFieldsValue(t),k(!0),e.llmService&&_(e.llmService)},H=(c=h(function(){var e;return E(this,function(t){switch(t.label){case 0:return t.trys.push([0,6,,7]),[4,R.validateFields()];case 1:if(Array.isArray((e=t.sent()).embeddingModel)&&(e.embeddingModel=e.embeddingModel[0]||""),!O)return[3,3];return[4,d.request({url:"aiVectorStore:update",method:"post",params:{filterByTk:O.id},data:{values:e}})];case 2:return t.sent(),a.message.success("Updated successfully"),[3,5];case 3:return[4,d.request({url:"aiVectorStore:create",method:"post",data:{values:e}})];case 4:t.sent(),a.message.success("Created successfully"),t.label=5;case 5:return k(!1),U(),[3,7];case 6:return t.sent(),a.message.error("Operation failed"),[3,7];case 7:return[2]}})}),function(){return c.apply(this,arguments)}),G=(i=h(function(e){return E(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(),a.message.success("Deleted successfully"),U(),[3,3];case 2:return t.sent(),a.message.error("Delete failed"),[3,3];case 3:return[2]}})}),function(e){return i.apply(this,arguments)}),$=t().useMemo(function(){var e={};return B.forEach(function(t){e[t.name]=t.title||t.name}),e},[B]),Y=[{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 $[e]||e}},{title:"Embedding Model",dataIndex:"embeddingModel",key:"embeddingModel"},{title:"Actions",key:"actions",render:function(e,n){return t().createElement(a.Space,null,t().createElement(a.Button,{size:"small",icon:t().createElement(l.EditOutlined,null),onClick:function(){return z(n)}},"Edit"),t().createElement(a.Popconfirm,{title:"Are you sure?",onConfirm:function(){return G(n.id)}},t().createElement(a.Button,{size:"small",danger:!0,icon:t().createElement(l.DeleteOutlined,null)},"Delete")))}}];return t().createElement("div",{style:{padding:24}},t().createElement("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:16}},t().createElement("h2",null,"Vector Storage"),t().createElement(a.Button,{type:"primary",icon:t().createElement(l.PlusOutlined,null),onClick:function(){x(null),j([]),R.resetFields(),k(!0)}},"Add new")),t().createElement(a.Table,{dataSource:f,columns:Y,rowKey:"id",loading:b}),t().createElement(a.Modal,{title:O?"Edit Vector Store":"Add Vector Store",open:S,onOk:H,onCancel:function(){return k(!1)},destroyOnClose:!0},t().createElement(a.Form,{form:R,layout:"vertical"},t().createElement(a.Form.Item,{name:"name",label:"Name",rules:[{required:!0}]},t().createElement(a.Input,null)),t().createElement(a.Form.Item,{name:"vectorDatabaseId",label:"Vector Database",rules:[{required:!0}]},t().createElement(a.Select,{options:P.map(function(e){return{label:e.name,value:e.id}}),placeholder:"Select vector database"})),t().createElement(a.Form.Item,{name:"llmService",label:"LLM Service",rules:[{required:!0}]},t().createElement(a.Select,{options:B.map(function(e){return{label:e.title||e.name,value:e.name}}),placeholder:"Select LLM service",onChange:function(e){R.setFieldValue("embeddingModel",void 0),_(e)}})),t().createElement(a.Form.Item,{name:"embeddingModel",label:"Embedding Model",rules:[{required:!0}]},t().createElement(a.Select,{showSearch:!0,allowClear:!0,mode:"tags",maxCount:1,loading:V,placeholder:V?"Loading models...":"Type or select embedding model ID",options:T.map(function(e){return{label:String(e.id||e.name||e),value:String(e.id||e.name||e)}}),notFoundContent:V?"Loading...":"Type a model name and press Enter"})))))};function S(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 k(e,t,n,r,a,l,o){try{var u=e[l](o),s=u.value}catch(e){n(e);return}u.done?t(s):Promise.resolve(s).then(r,a)}function I(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var l=e.apply(t,n);function o(e){k(l,r,a,o,u,"next",e)}function u(e){k(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 x(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 S(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 S(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 C(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 s=[l,u];if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(a=2&s[0]?r.return:s[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,s[1])).done)return a;switch(r=0,a&&(s=[2&s[0],a.value]),s[0]){case 0:case 1:a=s;break;case 4:return o.label++,{value:s[1],done:!1};case 5:o.label++,r=s[1],s=[0];continue;case 7:s=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===s[0]||2===s[0])){o=0;continue}if(3===s[0]&&(!a||s[1]>a[0]&&s[1]<a[3])){o.label=s[1];break}if(6===s[0]&&o.label<a[1]){o.label=a[1],a=s;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(s);break}a[2]&&o.ops.pop(),o.trys.pop();continue}s=t.call(e,o)}catch(e){s=[6,e],r=0}finally{n=a=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}}}var P=function(){var r,o,u,s,c,i=(0,n.useAPIClient)(),d=x((0,e.useState)([]),2),m=d[0],f=d[1],p=x((0,e.useState)(!1),2),y=p[0],b=p[1],v=x((0,e.useState)(!1),2),h=v[0],g=v[1],E=x((0,e.useState)(null),2),w=E[0],S=E[1],k=x((0,e.useState)(null),2),P=k[0],F=k[1],A=x((0,e.useState)(!1),2),B=A[0],q=A[1],D=x(a.Form.useForm(),1)[0],T=(r=I(function(){var e,t,n;return C(this,function(r){switch(r.label){case 0:b(!0),r.label=1;case 1:return r.trys.push([1,3,4,5]),[4,i.request({url:"aiVectorDatabase:list"})];case 2:return f(null!=(n=null==(t=r.sent())||null==(e=t.data)?void 0:e.data)?n:[]),[3,5];case 3:return r.sent(),a.message.error("Failed to load vector databases"),[3,5];case 4:return b(!1),[7];case 5:return[2]}})}),function(){return r.apply(this,arguments)});t().useEffect(function(){T()},[]);var j=function(e){S(e),F(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)},M=(o=I(function(){var e,t,n;return C(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,i.request({url:"aiVectorDatabase:update",method:"post",params:{filterByTk:w.id},data:{values:n}})];case 2:return r.sent(),a.message.success("Updated successfully"),[3,5];case 3:return[4,i.request({url:"aiVectorDatabase:create",method:"post",data:{values:n}})];case 4:r.sent(),a.message.success("Created successfully"),r.label=5;case 5:return g(!1),T(),[3,7];case 6:return r.sent(),a.message.error("Operation failed"),[3,7];case 7:return[2]}})}),function(){return o.apply(this,arguments)}),V=(u=I(function(){var e,t,n,r,a,l,o;return C(this,function(u){switch(u.label){case 0:q(!0),F(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,i.request({url:"aiVectorDatabase:test",method:"post",data:{values:{provider:n,connectParams:r}}})];case 3:return F(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 F({success:!1,error:null!=(o=u.sent().message)?o:"Test failed"}),[3,6];case 5:return q(!1),[7];case 6:return[2]}})}),function(){return u.apply(this,arguments)}),L=(s=I(function(e){return C(this,function(t){switch(t.label){case 0:return t.trys.push([0,2,,3]),[4,i.request({url:"aiVectorDatabase:destroy",method:"post",params:{filterByTk:e}})];case 1:return t.sent(),a.message.success("Deleted successfully"),T(),[3,3];case 2:return t.sent(),a.message.error("Delete failed"),[3,3];case 3:return[2]}})}),function(e){return s.apply(this,arguments)}),R=[{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,n){return t().createElement(a.Space,null,t().createElement(a.Button,{size:"small",icon:t().createElement(l.EditOutlined,null),onClick:function(){return j(n)}},"Edit"),t().createElement(a.Popconfirm,{title:"Are you sure?",onConfirm:function(){return L(n.id)}},t().createElement(a.Button,{size:"small",danger:!0,icon:t().createElement(l.DeleteOutlined,null)},"Delete")))}}];return t().createElement("div",{style:{padding:24}},t().createElement("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:16}},t().createElement("h2",null,"Vector Database"),t().createElement(a.Button,{type:"primary",icon:t().createElement(l.PlusOutlined,null),onClick:function(){S(null),F(null),D.resetFields(),D.setFieldsValue({provider:"pgvector"}),g(!0)}},"Add new")),t().createElement(a.Table,{dataSource:m,columns:R,rowKey:"id",loading:y}),t().createElement(a.Modal,{title:w?"Edit Vector Database":"Add Vector Database",open:h,onOk:M,onCancel:function(){return g(!1)},destroyOnClose:!0,width:600},t().createElement(a.Form,{form:D,layout:"vertical"},t().createElement(a.Form.Item,{name:"name",label:"Name",rules:[{required:!0}]},t().createElement(a.Input,null)),t().createElement(a.Form.Item,{name:"provider",label:"Provider"},t().createElement(a.Select,{options:[{label:"PGVector",value:"pgvector"}]})),t().createElement(a.Form.Item,{name:"host",label:"Host",rules:[{required:!0}]},t().createElement(a.Input,{placeholder:"localhost"})),t().createElement(a.Form.Item,{name:"port",label:"Port",rules:[{required:!0}]},t().createElement(a.InputNumber,{style:{width:"100%"},placeholder:"5432"})),t().createElement(a.Form.Item,{name:"username",label:"Username",rules:[{required:!0}]},t().createElement(a.Input,null)),t().createElement(a.Form.Item,{name:"password",label:"Password",rules:[{required:!0}]},t().createElement(a.Input.Password,null)),t().createElement(a.Form.Item,{name:"database",label:"Database",rules:[{required:!0}]},t().createElement(a.Input,null)),t().createElement(a.Form.Item,{name:"tableName",label:"Table Name",rules:[{required:!0}]},t().createElement(a.Input,{placeholder:"e.g. knowledge_base_vectors"})),t().createElement("div",{style:{display:"flex",gap:8,alignItems:"center"}},t().createElement(a.Button,{icon:t().createElement(l.ApiOutlined,null),loading:B,onClick:V},"Test Connection"),P&&t().createElement(a.Tag,{color:P.success?"success":"error"},P.success?"Connection successful":null!=(c=P.error)?c:"Connection failed")))))};function F(e,t,n,r,a,l,o){try{var u=e[l](o),s=u.value}catch(e){n(e);return}u.done?t(s):Promise.resolve(s).then(r,a)}function A(e,t,n){return(A=T()?Reflect.construct:function(e,t,n){var r=[null];r.push.apply(r,t);var a=new(Function.bind.apply(e,r));return n&&q(a,n.prototype),a}).apply(null,arguments)}function B(e){return(B=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function q(e,t){return(q=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function D(e){var t="function"==typeof Map?new Map:void 0;return(D=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 A(e,arguments,B(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),q(n,e)})(e)}function T(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(T=function(){return!!e})()}var 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,T()?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&&q(n,e),t=[{key:"load",value:function(){var e,t=this;return(e=function(){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 s=[l,u];if(n)throw TypeError("Generator is already executing.");for(;o;)try{if(n=1,r&&(a=2&s[0]?r.return:s[0]?r.throw||((a=r.return)&&a.call(r),0):r.next)&&!(a=a.call(r,s[1])).done)return a;switch(r=0,a&&(s=[2&s[0],a.value]),s[0]){case 0:case 1:a=s;break;case 4:return o.label++,{value:s[1],done:!1};case 5:o.label++,r=s[1],s=[0];continue;case 7:s=o.ops.pop(),o.trys.pop();continue;default:if(!(a=(a=o.trys).length>0&&a[a.length-1])&&(6===s[0]||2===s[0])){o=0;continue}if(3===s[0]&&(!a||s[1]>a[0]&&s[1]<a[3])){o.label=s[1];break}if(6===s[0]&&o.label<a[1]){o.label=a[1],a=s;break}if(a&&o.label<a[2]){o.label=a[2],o.ops.push(s);break}a[2]&&o.ops.pop(),o.trys.pop();continue}s=t.call(e,o)}catch(e){s=[6,e],r=0}finally{n=a=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}}}(this,function(e){return t.app.pluginSettingsManager.get("ai"),t.app.pluginSettingsManager.add("ai.knowledge-base",{title:(0,r.tval)("Knowledge base"),icon:"BookOutlined",Component:y,aclSnippet:"pm.plugin-knowledge-base.knowledge-base",sort:300}),t.app.pluginSettingsManager.add("ai.vector-store",{title:(0,r.tval)("Vector store"),icon:"DatabaseOutlined",Component:w,aclSnippet:"pm.plugin-knowledge-base.knowledge-base",sort:310}),t.app.pluginSettingsManager.add("ai.vector-database",{title:(0,r.tval)("Vector database"),icon:"HddOutlined",Component:P,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){F(l,r,a,o,u,"next",e)}function u(e){F(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}(D(n.Plugin)),M=j}(),s}()});
|
|
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}()});
|
package/dist/externalVersion.js
CHANGED
|
@@ -9,15 +9,15 @@
|
|
|
9
9
|
|
|
10
10
|
module.exports = {
|
|
11
11
|
"react": "18.2.0",
|
|
12
|
-
"@nocobase/client": "2.0.
|
|
13
|
-
"@nocobase/utils": "2.0.
|
|
14
|
-
"@nocobase/server": "2.0.
|
|
15
|
-
"@nocobase/plugin-ai": "2.0.
|
|
16
|
-
"antd": "5.24.2",
|
|
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",
|
|
17
16
|
"@ant-design/icons": "5.6.1",
|
|
18
|
-
"
|
|
17
|
+
"antd": "5.24.2",
|
|
18
|
+
"@nocobase/database": "2.0.20",
|
|
19
19
|
"@langchain/core": "1.1.24",
|
|
20
20
|
"axios": "1.7.7",
|
|
21
|
-
"@nocobase/actions": "2.0.
|
|
21
|
+
"@nocobase/actions": "2.0.20",
|
|
22
22
|
"pg": "8.20.0"
|
|
23
23
|
};
|
package/dist/locale/en-US.json
CHANGED
|
@@ -40,5 +40,7 @@
|
|
|
40
40
|
"Are you sure you want to delete this?": "Are you sure you want to delete this?",
|
|
41
41
|
"Knowledge base created successfully": "Knowledge base created successfully",
|
|
42
42
|
"Vector store created successfully": "Vector store created successfully",
|
|
43
|
-
"Vector database created successfully": "Vector database created successfully"
|
|
43
|
+
"Vector database created successfully": "Vector database created successfully",
|
|
44
|
+
"Select Knowledge Base": "Select Knowledge Base",
|
|
45
|
+
"No knowledge bases available": "No knowledge bases available"
|
|
44
46
|
}
|
package/dist/locale/vi-VN.json
CHANGED
|
@@ -40,5 +40,7 @@
|
|
|
40
40
|
"Are you sure you want to delete this?": "Bạn có chắc chắn muốn xóa không?",
|
|
41
41
|
"Knowledge base created successfully": "Tạo cơ sở tri thức thành công",
|
|
42
42
|
"Vector store created successfully": "Tạo kho vector thành công",
|
|
43
|
-
"Vector database created successfully": "Tạo cơ sở dữ liệu vector thành công"
|
|
43
|
+
"Vector database created successfully": "Tạo cơ sở dữ liệu vector thành công",
|
|
44
|
+
"Select Knowledge Base": "Chọn cơ sở tri thức",
|
|
45
|
+
"No knowledge bases available": "Không có cơ sở tri thức nào"
|
|
44
46
|
}
|
|
@@ -95,6 +95,12 @@ var ai_knowledge_bases_default = (0, import_database.defineCollection)({
|
|
|
95
95
|
type: "json",
|
|
96
96
|
name: "options"
|
|
97
97
|
},
|
|
98
|
+
{
|
|
99
|
+
// If true, source files are deleted after successful vectorization
|
|
100
|
+
type: "boolean",
|
|
101
|
+
name: "deleteSourceFile",
|
|
102
|
+
defaultValue: false
|
|
103
|
+
},
|
|
98
104
|
{
|
|
99
105
|
type: "hasMany",
|
|
100
106
|
name: "documents",
|
|
@@ -76,6 +76,9 @@ class KnowledgeBaseFeatureImpl {
|
|
|
76
76
|
vectorStoreConfigId,
|
|
77
77
|
vectorStoreProps: [
|
|
78
78
|
...((_b = kbData.options) == null ? void 0 : _b.vectorStoreProps) ?? [],
|
|
79
|
+
// CRITICAL: vectorStoreConfigId must be in props — plugin-ai passes only
|
|
80
|
+
// kb.vectorStoreProps to createVectorStoreService, not the top-level field
|
|
81
|
+
{ key: "vectorStoreConfigId", value: vectorStoreConfigId },
|
|
79
82
|
// Pass accessLevel for downstream vector filtering (Fix #2)
|
|
80
83
|
{ key: "accessLevel", value: kbData.accessLevel ?? "PUBLIC" },
|
|
81
84
|
// Pass ownerId for BASIC KB per-user vector filtering
|
|
@@ -141,6 +141,37 @@ class VectorizationPipeline {
|
|
|
141
141
|
chunkCount: chunks.length
|
|
142
142
|
}
|
|
143
143
|
});
|
|
144
|
+
if (knowledgeBase.deleteSourceFile && file) {
|
|
145
|
+
try {
|
|
146
|
+
const fs = require("fs");
|
|
147
|
+
const path = require("path");
|
|
148
|
+
let filePath = file.path || file.url;
|
|
149
|
+
if (filePath) {
|
|
150
|
+
if (filePath.startsWith("/storage/") || filePath.startsWith("storage/")) {
|
|
151
|
+
const storageBase = path.resolve(process.cwd(), "storage");
|
|
152
|
+
filePath = path.resolve(storageBase, filePath.replace(/^\/?(?:storage\/)?/, ""));
|
|
153
|
+
}
|
|
154
|
+
if (fs.existsSync(filePath)) {
|
|
155
|
+
fs.unlinkSync(filePath);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const fileRepo = this.plugin.db.getRepository("aiFiles");
|
|
159
|
+
if (file.id) {
|
|
160
|
+
await fileRepo.destroy({ filterByTk: file.id });
|
|
161
|
+
}
|
|
162
|
+
await this.plugin.db.sequelize.query(
|
|
163
|
+
`UPDATE "aiKnowledgeBaseDocuments" SET "fileId" = NULL WHERE id = $1`,
|
|
164
|
+
{ bind: [documentId] }
|
|
165
|
+
);
|
|
166
|
+
this.plugin.app.logger.info(
|
|
167
|
+
`[Vectorization] Source file deleted for doc ${documentId}: ${file.filename}`
|
|
168
|
+
);
|
|
169
|
+
} catch (delErr) {
|
|
170
|
+
this.plugin.app.logger.warn(
|
|
171
|
+
`[Vectorization] Failed to delete source file for doc ${documentId}: ${delErr.message}`
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
144
175
|
return { success: true, chunkCount: chunks.length };
|
|
145
176
|
} catch (error) {
|
|
146
177
|
await docRepo.update({
|
package/dist/server/plugin.js
CHANGED
|
@@ -109,6 +109,7 @@ class PluginKnowledgeBaseServer extends import_server.Plugin {
|
|
|
109
109
|
},
|
|
110
110
|
{ before: "createMiddleware" }
|
|
111
111
|
);
|
|
112
|
+
this.registerKnowledgeBaseWorkContext(vectorStoreProvider, knowledgeBase);
|
|
112
113
|
}
|
|
113
114
|
defineResources() {
|
|
114
115
|
this.app.resourceManager.define(import_ai_knowledge_base.default);
|
|
@@ -117,6 +118,95 @@ class PluginKnowledgeBaseServer extends import_server.Plugin {
|
|
|
117
118
|
this.app.resourceManager.define(import_ai_vector_databases.default);
|
|
118
119
|
this.app.resourceManager.registerActionHandler("aiKnowledgeBase:addDocument", import_add_document.addDocumentAction);
|
|
119
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* Register a work context resolve strategy so that when users select
|
|
123
|
+
* Knowledge Bases via the AddContext button in AI chat, the background
|
|
124
|
+
* strategy performs a RAG search and injects results into the system prompt.
|
|
125
|
+
*/
|
|
126
|
+
registerKnowledgeBaseWorkContext(vectorStoreProvider, knowledgeBaseFeature) {
|
|
127
|
+
const plugin = this;
|
|
128
|
+
this.aiPlugin.workContextHandler.registerStrategy("knowledge-base", {
|
|
129
|
+
resolve: async (_ctx, contextItem) => {
|
|
130
|
+
return `[Knowledge Base: ${contextItem.title || contextItem.uid}]`;
|
|
131
|
+
},
|
|
132
|
+
background: async (ctx, aiMessages, workContextItems) => {
|
|
133
|
+
var _a, _b, _c, _d;
|
|
134
|
+
const kbIds = [...new Set(workContextItems.map((item) => item.uid).filter(Boolean))];
|
|
135
|
+
if (!kbIds.length) return "";
|
|
136
|
+
const userId = (_b = (_a = ctx.auth) == null ? void 0 : _a.user) == null ? void 0 : _b.id;
|
|
137
|
+
const roles = ((_c = ctx.state) == null ? void 0 : _c.currentRoles) ?? [];
|
|
138
|
+
const isAdmin = roles.includes("root") || roles.includes("admin");
|
|
139
|
+
let filteredIds = kbIds;
|
|
140
|
+
if (!isAdmin) {
|
|
141
|
+
const kbRepo = plugin.db.getRepository("aiKnowledgeBases");
|
|
142
|
+
const accessibleKBs = await kbRepo.find({
|
|
143
|
+
filter: {
|
|
144
|
+
id: { $in: kbIds },
|
|
145
|
+
enabled: true,
|
|
146
|
+
$or: [
|
|
147
|
+
{ accessLevel: "PUBLIC" },
|
|
148
|
+
...userId ? [{ accessLevel: "BASIC", ownerId: userId }] : [],
|
|
149
|
+
...roles.length ? [{ accessLevel: "SHARED", "allowedRoles.$anyOf": roles }] : []
|
|
150
|
+
]
|
|
151
|
+
},
|
|
152
|
+
fields: ["id"]
|
|
153
|
+
});
|
|
154
|
+
filteredIds = accessibleKBs.map((kb) => kb.id || kb.get("id"));
|
|
155
|
+
if (!filteredIds.length) return "";
|
|
156
|
+
}
|
|
157
|
+
const lastUserMsg = [...aiMessages].reverse().find((m) => m.role === "user");
|
|
158
|
+
const queryString = typeof ((_d = lastUserMsg == null ? void 0 : lastUserMsg.content) == null ? void 0 : _d.content) === "string" ? lastUserMsg.content.content : "";
|
|
159
|
+
if (!queryString) return "";
|
|
160
|
+
let knowledgeBaseGroup;
|
|
161
|
+
try {
|
|
162
|
+
knowledgeBaseGroup = await knowledgeBaseFeature.getKnowledgeBaseGroup(filteredIds);
|
|
163
|
+
} catch (err) {
|
|
164
|
+
plugin.app.logger.error("[KB WorkContext] Failed to get KB group:", err);
|
|
165
|
+
return "";
|
|
166
|
+
}
|
|
167
|
+
if (!(knowledgeBaseGroup == null ? void 0 : knowledgeBaseGroup.length)) return "";
|
|
168
|
+
const allDocs = [];
|
|
169
|
+
const topK = 3;
|
|
170
|
+
const score = "0.6";
|
|
171
|
+
for (const entry of knowledgeBaseGroup) {
|
|
172
|
+
const { vectorStoreConfig, knowledgeBaseType, knowledgeBaseList } = entry;
|
|
173
|
+
if (!(knowledgeBaseList == null ? void 0 : knowledgeBaseList.length)) continue;
|
|
174
|
+
try {
|
|
175
|
+
if (knowledgeBaseType === "LOCAL") {
|
|
176
|
+
const firstKB = knowledgeBaseList[0];
|
|
177
|
+
const vectorStoreService = await vectorStoreProvider.createVectorStoreService(
|
|
178
|
+
vectorStoreConfig.vectorStoreProvider,
|
|
179
|
+
firstKB.vectorStoreProps
|
|
180
|
+
);
|
|
181
|
+
const knowledgeBaseOuterIds = knowledgeBaseList.map((x) => x.knowledgeBaseOuterId);
|
|
182
|
+
const result = await vectorStoreService.search(queryString, {
|
|
183
|
+
topK,
|
|
184
|
+
score,
|
|
185
|
+
filter: { knowledgeBaseOuterId: { in: knowledgeBaseOuterIds } }
|
|
186
|
+
});
|
|
187
|
+
allDocs.push(...result);
|
|
188
|
+
} else {
|
|
189
|
+
for (const kb of knowledgeBaseList) {
|
|
190
|
+
const vectorStoreService = await vectorStoreProvider.createVectorStoreService(
|
|
191
|
+
vectorStoreConfig.vectorStoreProvider,
|
|
192
|
+
kb.vectorStoreProps
|
|
193
|
+
);
|
|
194
|
+
const result = await vectorStoreService.search(queryString, { topK, score });
|
|
195
|
+
allDocs.push(...result);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
} catch (err) {
|
|
199
|
+
plugin.app.logger.error(`[KB WorkContext] Vector search failed for type=${knowledgeBaseType}:`, err);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (!allDocs.length) return "";
|
|
203
|
+
const kbData = allDocs.map((doc) => doc.content).join("\n");
|
|
204
|
+
return `<knowledgeBase>From knowledge base:
|
|
205
|
+
${kbData}
|
|
206
|
+
answer user's question using this information.</knowledgeBase>`;
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
}
|
|
120
210
|
setPermissions() {
|
|
121
211
|
this.app.acl.registerSnippet({
|
|
122
212
|
name: `pm.${this.name}.knowledge-base`,
|
|
@@ -29,14 +29,59 @@ __export(ai_knowledge_base_documents_exports, {
|
|
|
29
29
|
default: () => ai_knowledge_base_documents_default
|
|
30
30
|
});
|
|
31
31
|
module.exports = __toCommonJS(ai_knowledge_base_documents_exports);
|
|
32
|
+
async function checkKBAccess(ctx, knowledgeBaseId) {
|
|
33
|
+
var _a, _b, _c, _d;
|
|
34
|
+
const userId = (_b = (_a = ctx.auth) == null ? void 0 : _a.user) == null ? void 0 : _b.id;
|
|
35
|
+
const roles = ((_c = ctx.state) == null ? void 0 : _c.currentRoles) ?? [];
|
|
36
|
+
const isAdmin = roles.includes("root") || roles.includes("admin");
|
|
37
|
+
if (isAdmin) {
|
|
38
|
+
return { hasAccess: true, isAdmin };
|
|
39
|
+
}
|
|
40
|
+
const kbRepo = ctx.db.getRepository("aiKnowledgeBases");
|
|
41
|
+
const kb = await kbRepo.findOne({ filter: { id: knowledgeBaseId } });
|
|
42
|
+
if (!kb) {
|
|
43
|
+
return { hasAccess: false, isAdmin };
|
|
44
|
+
}
|
|
45
|
+
const kbData = kb.toJSON();
|
|
46
|
+
const hasAccess = kbData.accessLevel === "PUBLIC" || kbData.accessLevel === "BASIC" && kbData.ownerId === userId || kbData.accessLevel === "SHARED" && ((_d = kbData.allowedRoles) == null ? void 0 : _d.some((r) => roles.includes(r)));
|
|
47
|
+
return { hasAccess: !!hasAccess, isAdmin, kbData };
|
|
48
|
+
}
|
|
32
49
|
var ai_knowledge_base_documents_default = {
|
|
33
50
|
// IMPORTANT: resource name must differ from collection name 'aiKnowledgeBaseDocuments'
|
|
34
51
|
// otherwise NocoBase's auto-registered collection CRUD overrides our custom handlers.
|
|
35
52
|
name: "aiKnowledgeBaseDoc",
|
|
36
53
|
actions: {
|
|
37
54
|
async list(ctx, next) {
|
|
38
|
-
|
|
55
|
+
var _a, _b, _c;
|
|
56
|
+
const { filter = {}, sort, page, pageSize } = ctx.action.params;
|
|
39
57
|
const repo = ctx.db.getRepository("aiKnowledgeBaseDocuments");
|
|
58
|
+
const userId = (_b = (_a = ctx.auth) == null ? void 0 : _a.user) == null ? void 0 : _b.id;
|
|
59
|
+
const roles = ((_c = ctx.state) == null ? void 0 : _c.currentRoles) ?? [];
|
|
60
|
+
const isAdmin = roles.includes("root") || roles.includes("admin");
|
|
61
|
+
if (filter.knowledgeBaseId && !isAdmin) {
|
|
62
|
+
const { hasAccess } = await checkKBAccess(ctx, filter.knowledgeBaseId);
|
|
63
|
+
if (!hasAccess) {
|
|
64
|
+
ctx.body = [];
|
|
65
|
+
await next();
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (!filter.knowledgeBaseId && !isAdmin) {
|
|
70
|
+
const kbRepo = ctx.db.getRepository("aiKnowledgeBases");
|
|
71
|
+
const accessibleKBs = await kbRepo.find({
|
|
72
|
+
filter: {
|
|
73
|
+
enabled: true,
|
|
74
|
+
$or: [
|
|
75
|
+
{ accessLevel: "PUBLIC" },
|
|
76
|
+
...userId ? [{ accessLevel: "BASIC", ownerId: userId }] : [],
|
|
77
|
+
...roles.length ? [{ accessLevel: "SHARED", "allowedRoles.$anyOf": roles }] : []
|
|
78
|
+
]
|
|
79
|
+
},
|
|
80
|
+
fields: ["id"]
|
|
81
|
+
});
|
|
82
|
+
const accessibleIds = accessibleKBs.map((kb) => kb.id || kb.get("id"));
|
|
83
|
+
filter.knowledgeBaseId = { $in: accessibleIds };
|
|
84
|
+
}
|
|
40
85
|
ctx.body = await repo.find({
|
|
41
86
|
filter,
|
|
42
87
|
sort: sort ?? ["-createdAt"],
|
|
@@ -108,15 +153,64 @@ var ai_knowledge_base_documents_default = {
|
|
|
108
153
|
await next();
|
|
109
154
|
},
|
|
110
155
|
async destroy(ctx, next) {
|
|
156
|
+
var _a, _b, _c, _d;
|
|
111
157
|
const { filterByTk } = ctx.action.params;
|
|
112
158
|
const repo = ctx.db.getRepository("aiKnowledgeBaseDocuments");
|
|
159
|
+
const userId = (_b = (_a = ctx.auth) == null ? void 0 : _a.user) == null ? void 0 : _b.id;
|
|
160
|
+
const roles = ((_c = ctx.state) == null ? void 0 : _c.currentRoles) ?? [];
|
|
161
|
+
const isAdmin = roles.includes("root") || roles.includes("admin");
|
|
162
|
+
const doc = await repo.findOne({ filterByTk });
|
|
163
|
+
if (!doc) {
|
|
164
|
+
ctx.throw(404, "Document not found");
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const docData = doc.toJSON();
|
|
168
|
+
if (docData.knowledgeBaseId && !isAdmin) {
|
|
169
|
+
const { hasAccess, kbData } = await checkKBAccess(ctx, docData.knowledgeBaseId);
|
|
170
|
+
if (!hasAccess) {
|
|
171
|
+
ctx.throw(403, "You do not have permission to delete this document");
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if ((kbData == null ? void 0 : kbData.accessLevel) === "SHARED") {
|
|
175
|
+
const canUpload = (_d = kbData.uploadRoles) == null ? void 0 : _d.some((r) => roles.includes(r));
|
|
176
|
+
const isUploader = docData.uploadedById === userId;
|
|
177
|
+
if (!canUpload && !isUploader) {
|
|
178
|
+
ctx.throw(403, "You do not have permission to delete this document");
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
113
183
|
await repo.destroy({ filterByTk });
|
|
114
184
|
ctx.body = { success: true };
|
|
115
185
|
await next();
|
|
116
186
|
},
|
|
117
187
|
async reprocess(ctx, next) {
|
|
188
|
+
var _a, _b, _c, _d;
|
|
118
189
|
const { filterByTk } = ctx.action.params;
|
|
119
190
|
const repo = ctx.db.getRepository("aiKnowledgeBaseDocuments");
|
|
191
|
+
const userId = (_b = (_a = ctx.auth) == null ? void 0 : _a.user) == null ? void 0 : _b.id;
|
|
192
|
+
const roles = ((_c = ctx.state) == null ? void 0 : _c.currentRoles) ?? [];
|
|
193
|
+
const isAdmin = roles.includes("root") || roles.includes("admin");
|
|
194
|
+
if (!isAdmin) {
|
|
195
|
+
const doc = await repo.findOne({ filterByTk });
|
|
196
|
+
if (doc) {
|
|
197
|
+
const docData = doc.toJSON();
|
|
198
|
+
if (docData.knowledgeBaseId) {
|
|
199
|
+
const { hasAccess, kbData } = await checkKBAccess(ctx, docData.knowledgeBaseId);
|
|
200
|
+
if (!hasAccess) {
|
|
201
|
+
ctx.throw(403, "You do not have permission to reprocess this document");
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
if ((kbData == null ? void 0 : kbData.accessLevel) === "SHARED") {
|
|
205
|
+
const canUpload = (_d = kbData.uploadRoles) == null ? void 0 : _d.some((r) => roles.includes(r));
|
|
206
|
+
if (!canUpload) {
|
|
207
|
+
ctx.throw(403, "You do not have permission to reprocess this document");
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
120
214
|
await repo.update({
|
|
121
215
|
filterByTk,
|
|
122
216
|
values: { status: "pending", error: null, chunkCount: 0 }
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"description": "Provides Knowledge Base management, Vector Store, Vector Database (PGVector), and RAG retrieval capabilities for AI Employees.",
|
|
7
7
|
"description.vi-VN": "Cung cấp quản lý Cơ sở tri thức, Vector Store, Vector Database (PGVector), và khả năng truy xuất RAG cho nhân viên AI.",
|
|
8
8
|
"description.zh-CN": "为 AI 员工提供知识库管理、向量存储、向量数据库 (PGVector) 和 RAG 检索功能。",
|
|
9
|
-
"version": "1.
|
|
9
|
+
"version": "1.1.1",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"main": "./dist/server/index.js",
|
|
12
12
|
"files": [
|