@rockdog/directus-extension-vector-store
Version:
A Directus extension to integrate vector storage capabilities
2 lines (1 loc) • 9.15 kB
JavaScript
import{useApi as e,defineModule as n}from"@directus/extensions-sdk";import{defineComponent as t,ref as a,onMounted as o,resolveComponent as l,openBlock as r,createBlock as s,withCtx as i,createElementVNode as u,createCommentVNode as d,normalizeClass as c,createElementBlock as b,toDisplayString as f,withDirectives as v,vModelText as p,Fragment as m,renderList as g}from"vue";const y={class:"agent-panel"},h={class:"input-toggle-buttons"},k={key:0,class:"file-data"},x={key:0},w={key:1,class:"url-data"},S={class:"buttons"},U=["disabled"],C=["disabled"],E={key:2,class:"status-message"},L={key:3,class:"processed-files"},P={class:"memories"},_={class:"file-info"},T=["onClick"];var A=t({__name:"VStore",setup(n){const t=a(""),A=a(null),R=a(null),F=a(!1),I=a(""),D=a([]),M=a(""),O=e();function $(e){const n=e.target;n.files&&n.files.length?A.value=n.files[0]:A.value=null}function j(){R.value?.click()}function z(){"file"!==M.value&&(M.value="file",t.value="",A.value=null,R.value&&(R.value.value=""))}function H(){"url"!==M.value&&(M.value="url",t.value="",A.value=null,R.value&&(R.value.value=""))}function N(e){if(e.status<200||e.status>=300)throw new Error(`HTTP ${e.status}: ${e.statusText}`);return e}async function V(){if("file"===M.value){if(!A.value)return void(I.value="Please select a file.")}else{if("url"!==M.value)return void(I.value="Please select an input type: FILE or URL.");if(!t.value)return void(I.value="Please enter a URL.")}F.value=!0,I.value="Processing input...";try{if("file"===M.value&&A.value){const e=new FormData;e.append("file",A.value),e.append("chunkSize","1000"),e.append("chunkOverlap","200");const n=N(await O.post("/rds-vs-endpoint/embed-vector",e)).data;I.value=n.message||"File processed successfully."}else if("url"===M.value){const e=N(await O.post("/rds-vs-endpoint/embed-vector",{filePath:t.value,chunkSize:1e3,chunkOverlap:200})).data;I.value=e.message||"URL processed successfully."}A.value=null,t.value="",await B()}catch(e){I.value=`Error processing input: ${e.message}`}finally{F.value=!1}}async function B(){try{const e=N(await O.get("/rds-vs-endpoint/get-vectors")).data;D.value=e.files||[]}catch(e){const n=e.response?.data?.error||e.response?.statusText||e.message||"Unknown error";I.value=`Error fetching processed files: ${n}`}}return o((async()=>{await B()})),(e,n)=>{const a=l("private-view");return r(),s(a,{title:"Agent Memory Management"},{default:i((()=>[u("div",y,[n[2]||(n[2]=u("p",null,"Upload a file or enter a URL to add to Agent memory.",-1)),d(" Toggle Buttons "),u("div",h,[u("button",{onClick:z,class:c({active:"file"===M.value})},"FILE",2),u("button",{onClick:H,class:c({active:"url"===M.value})},"URL",2)]),d(" File Input Section "),"file"===M.value?(r(),b("div",k,[d(" Hidden file input "),u("input",{type:"file",ref_key:"fileInput",ref:R,onChange:$,class:"file-input",hidden:""},null,544),d(" Button to trigger file selection "),u("button",{onClick:j,class:"select-data-button"},"Select Data"),d(" Display file name if a file is selected "),A.value?(r(),b("p",x,"Selected File: "+f(A.value.name),1)):d("v-if",!0)])):d("v-if",!0),d(" URL Input Section "),"url"===M.value?(r(),b("div",w,[v(u("input",{"onUpdate:modelValue":n[0]||(n[0]=e=>t.value=e),type:"text",placeholder:"Enter URL",class:"url-input"},null,512),[[p,t.value]])])):d("v-if",!0),u("div",S,[u("button",{onClick:V,disabled:F.value,class:"process-button"}," Upload & Process ",8,U),u("button",{onClick:B,disabled:F.value,class:"refresh-button"}," Refresh List ",8,C)]),I.value?(r(),b("p",E,f(I.value),1)):d("v-if",!0),D.value.length?(r(),b("div",L,[n[1]||(n[1]=u("h2",null,"Memories",-1)),u("ul",P,[(r(!0),b(m,null,g(D.value,((e,n)=>(r(),b("li",{key:n,class:"memory"},[u("div",_,[u("strong",null,f(e.fileName),1),u("em",null,"(Processed at: "+f(e.processedAt)+")",1)]),u("button",{onClick:n=>async function(e){try{F.value=!0,I.value="Deleting file...";const n=N(await O.delete("/rds-vs-endpoint/del-vector",{data:{filePath:e}})).data;I.value=n.message||"File deleted successfully.",await B()}catch(e){I.value=`Error deleting file: ${e.message}`}finally{F.value=!1}}(e.filePath),class:"delete-button"}," Delete Memory ",8,T)])))),128))])])):d("v-if",!0)])])),_:1})}}}),R=[],F=[];!function(e,n){if(e&&"undefined"!=typeof document){var t,a=!0===n.prepend?"prepend":"append",o=!0===n.singleTag,l="string"==typeof n.container?document.querySelector(n.container):document.getElementsByTagName("head")[0];if(o){var r=R.indexOf(l);-1===r&&(r=R.push(l)-1,F[r]={}),t=F[r]&&F[r][a]?F[r][a]:F[r][a]=s()}else t=s();65279===e.charCodeAt(0)&&(e=e.substring(1)),t.styleSheet?t.styleSheet.cssText+=e:t.appendChild(document.createTextNode(e))}function s(){var e=document.createElement("style");if(e.setAttribute("type","text/css"),n.attributes)for(var t=Object.keys(n.attributes),o=0;o<t.length;o++)e.setAttribute(t[o],n.attributes[t[o]]);var r="prepend"===a?"afterbegin":"beforeend";return l.insertAdjacentElement(r,e),e}}('.agent-panel[data-v-97b6b937] {\n padding: 1.5rem;\n background: rgba(255, 255, 255, 0.1);\n border-radius: 8px;\n font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;\n max-width: 600px;\n margin: 2rem auto;\n}\n.agent-panel p[data-v-97b6b937] {\n text-align: center;\n margin-bottom: 1rem;\n}\n\n.input-toggle-buttons[data-v-97b6b937] {\n display: flex;\n justify-content: center;\n margin-bottom: 1rem;\n}\n.input-toggle-buttons button[data-v-97b6b937] {\n flex: 1;\n padding: 0.75rem;\n margin: 0 0.25rem;\n border: 1px solid #ccc;\n border-radius: 4px;\n background-color: #f0f0f0;\n color: #666;\n cursor: pointer;\n transition: background-color 0.3s, color 0.3s;\n}\n.input-toggle-buttons button[data-v-97b6b937]:hover {\n background-color: #e0e0e0;\n}\n.input-toggle-buttons button.active[data-v-97b6b937] {\n background-color: #007bff;\n color: #fff;\n border-color: #007bff;\n}\n\n.file-data[data-v-97b6b937],\n.url-data[data-v-97b6b937] {\n text-align: center;\n margin-bottom: 1rem;\n}\n.file-data .select-data-button[data-v-97b6b937],\n.url-data .select-data-button[data-v-97b6b937] {\n padding: 0.75rem 1.5rem;\n border: 1px solid #007bff;\n border-radius: 4px;\n background-color: #007bff;\n color: #fff;\n cursor: pointer;\n transition: background-color 0.3s;\n}\n.file-data .select-data-button[data-v-97b6b937]:hover,\n.url-data .select-data-button[data-v-97b6b937]:hover {\n background-color: #0056b3;\n}\n.file-data .url-input[data-v-97b6b937],\n.url-data .url-input[data-v-97b6b937] {\n width: calc(100% - 2rem);\n padding: 0.75rem;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.file-data p[data-v-97b6b937],\n.url-data p[data-v-97b6b937] {\n margin-top: 0.5rem;\n font-size: 0.9rem;\n color: #555;\n}\n\n.buttons[data-v-97b6b937] {\n text-align: center;\n margin-top: 1.5rem;\n}\n.buttons button[data-v-97b6b937] {\n padding: 0.75rem 1.5rem;\n margin: 0 0.5rem;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n transition: background-color 0.3s;\n}\n.buttons .process-button[data-v-97b6b937] {\n background-color: rgba(40, 167, 69, 0.3);\n color: #fff;\n}\n.buttons .process-button[data-v-97b6b937]:hover {\n background-color: rgba(33, 136, 56, 0.3);\n}\n.buttons .refresh-button[data-v-97b6b937] {\n background-color: rgba(108, 117, 125, 0.3);\n color: #fff;\n}\n.buttons .refresh-button[data-v-97b6b937]:hover {\n background-color: rgba(90, 98, 104, 0.3);\n}\n\n.status-message[data-v-97b6b937] {\n text-align: center;\n margin-top: 1rem;\n font-weight: 500;\n}\n\n.processed-files[data-v-97b6b937] {\n margin-top: 2rem;\n}\n.processed-files h2[data-v-97b6b937] {\n text-align: center;\n margin-bottom: 1rem;\n color: #007bff;\n}\n.processed-files ul.memories[data-v-97b6b937] {\n list-style: none;\n padding: 0;\n}\n.processed-files ul.memories li.memory[data-v-97b6b937] {\n background: #f8f9fa;\n margin-bottom: 0.75rem;\n padding: 0.75rem;\n border-radius: 4px;\n display: flex;\n justify-content: space-between;\n align-items: flex-end;\n}\n.processed-files ul.memories li.memory .file-info[data-v-97b6b937] {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n color: #666;\n}\n.processed-files ul.memories li.memory .file-info strong[data-v-97b6b937] {\n font-weight: bold;\n}\n.processed-files ul.memories li.memory .file-info em[data-v-97b6b937] {\n font-size: 0.85rem;\n margin-top: 0.25rem;\n}\n.processed-files ul.memories li.memory .delete-button[data-v-97b6b937] {\n flex: 0 0 max-content;\n background-color: #dc3545;\n color: #fff;\n border: none;\n border-radius: 4px;\n padding: 0.5rem 1rem;\n cursor: pointer;\n transition: background-color 0.3s;\n}\n.processed-files ul.memories li.memory .delete-button[data-v-97b6b937]:hover {\n background-color: #c82333;\n}',{});const I=[],D=[],M=[],O=[n({id:"vs-module",name:"Vector Store Module",icon:"psychology",routes:[{path:"",component:((e,n)=>{const t=e.__vccOpts||e;for(const[e,a]of n)t[e]=a;return t})(A,[["__scopeId","data-v-97b6b937"],["__file","VStore.vue"]])}]})],$=[],j=[],z=[];export{D as displays,I as interfaces,M as layouts,O as modules,z as operations,$ as panels,j as themes};