瀏覽代碼

优化;对话

htc 1 周之前
父節點
當前提交
9fb1d2fd6d
共有 5 個文件被更改,包括 279 次插入40 次删除
  1. 137 2
      package-lock.json
  2. 2 0
      package.json
  3. 77 12
      src/views/modules/agent/dialog.vue
  4. 1 24
      src/views/modules/agent/questionnaire.vue
  5. 62 2
      yarn.lock

+ 137 - 2
package-lock.json

@@ -17,6 +17,7 @@
         "echarts-gl": "^2.0.9",
         "element-theme": "^2.0.1",
         "element-ui": "^2.11.1",
+        "fetch": "^1.1.0",
         "file-loader": "^6.2.0",
         "file-saver": "^2.0.5",
         "js-cookie": "^3.0.5",
@@ -36,6 +37,7 @@
         "screenfull": "^4.2.1",
         "svg-sprite-loader": "^4.1.6",
         "vue": "^2.6.10",
+        "vue-clipboard3": "^2.0.0",
         "vue-cron": "^1.0.9",
         "vue-i18n": "^8.12.0",
         "vue-loader": "^17.0.0",
@@ -4722,6 +4724,17 @@
         "file-uri-to-path": "1.0.0"
       }
     },
+    "node_modules/biskviit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/biskviit/-/biskviit-1.0.1.tgz",
+      "integrity": "sha512-VGCXdHbdbpEkFgtjkeoBN8vRlbj1ZRX2/mxhE8asCCRalUx2nBzOomLJv8Aw/nRt5+ccDb+tPKidg4XxcfGW4w==",
+      "dependencies": {
+        "psl": "^1.1.7"
+      },
+      "engines": {
+        "node": ">=1.0.0"
+      }
+    },
     "node_modules/bl": {
       "version": "4.1.0",
       "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz",
@@ -5570,6 +5583,16 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/clipboard": {
+      "version": "2.0.11",
+      "resolved": "https://registry.npmmirror.com/clipboard/-/clipboard-2.0.11.tgz",
+      "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==",
+      "dependencies": {
+        "good-listener": "^1.2.2",
+        "select": "^1.1.2",
+        "tiny-emitter": "^2.0.0"
+      }
+    },
     "node_modules/clipboardy": {
       "version": "2.3.0",
       "resolved": "https://registry.npmmirror.com/clipboardy/-/clipboardy-2.3.0.tgz",
@@ -6634,6 +6657,11 @@
         "node": ">=0.4.0"
       }
     },
+    "node_modules/delegate": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz",
+      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
+    },
     "node_modules/delegates": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/delegates/-/delegates-1.0.0.tgz",
@@ -7747,6 +7775,14 @@
         "node": ">= 0.8"
       }
     },
+    "node_modules/encoding": {
+      "version": "0.1.12",
+      "resolved": "https://registry.npmmirror.com/encoding/-/encoding-0.1.12.tgz",
+      "integrity": "sha512-bl1LAgiQc4ZWr++pNYUdRe/alecaHFeHxIJ/pNciqGdKXghaTCOwKkbKp6ye7pKZGu/GcaSXFk8PBVhgs+dJdA==",
+      "dependencies": {
+        "iconv-lite": "~0.4.13"
+      }
+    },
     "node_modules/end-of-stream": {
       "version": "0.1.5",
       "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-0.1.5.tgz",
@@ -8434,6 +8470,15 @@
         "node": ">=0.8.0"
       }
     },
+    "node_modules/fetch": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/fetch/-/fetch-1.1.0.tgz",
+      "integrity": "sha512-5O8TwrGzoNblBG/jtK4NFuZwNCkZX6s5GfRNOaGtm+QGJEuNakSC/i2RW0R93KX6E0jVjNXm6O3CRN4Ql3K+yA==",
+      "dependencies": {
+        "biskviit": "1.0.1",
+        "encoding": "0.1.12"
+      }
+    },
     "node_modules/figgy-pudding": {
       "version": "3.5.2",
       "resolved": "https://registry.npmmirror.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
@@ -9482,6 +9527,14 @@
         "node": "*"
       }
     },
+    "node_modules/good-listener": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/good-listener/-/good-listener-1.2.2.tgz",
+      "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==",
+      "dependencies": {
+        "delegate": "^3.1.2"
+      }
+    },
     "node_modules/gopd": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz",
@@ -11246,7 +11299,6 @@
       "version": "0.4.24",
       "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
       "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-      "dev": true,
       "dependencies": {
         "safer-buffer": ">= 2.1.2 < 3"
       },
@@ -17134,6 +17186,11 @@
         "node": ">=0.8.0"
       }
     },
+    "node_modules/select": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/select/-/select-1.1.2.tgz",
+      "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA=="
+    },
     "node_modules/select-hose": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz",
@@ -19598,6 +19655,11 @@
         "node": ">=0.6.0"
       }
     },
+    "node_modules/tiny-emitter": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+      "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
+    },
     "node_modules/to-arraybuffer": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
@@ -20424,6 +20486,14 @@
         "csstype": "^3.1.0"
       }
     },
+    "node_modules/vue-clipboard3": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/vue-clipboard3/-/vue-clipboard3-2.0.0.tgz",
+      "integrity": "sha512-Q9S7dzWGax7LN5iiSPcu/K1GGm2gcBBlYwmMsUc5/16N6w90cbKow3FnPmPs95sungns4yvd9/+JhbAznECS2A==",
+      "dependencies": {
+        "clipboard": "^2.0.6"
+      }
+    },
     "node_modules/vue-cron": {
       "version": "1.0.9",
       "resolved": "https://registry.npmmirror.com/vue-cron/-/vue-cron-1.0.9.tgz",
@@ -25341,6 +25411,14 @@
         "file-uri-to-path": "1.0.0"
       }
     },
+    "biskviit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/biskviit/-/biskviit-1.0.1.tgz",
+      "integrity": "sha512-VGCXdHbdbpEkFgtjkeoBN8vRlbj1ZRX2/mxhE8asCCRalUx2nBzOomLJv8Aw/nRt5+ccDb+tPKidg4XxcfGW4w==",
+      "requires": {
+        "psl": "^1.1.7"
+      }
+    },
     "bl": {
       "version": "4.1.0",
       "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz",
@@ -26007,6 +26085,16 @@
       "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
       "dev": true
     },
+    "clipboard": {
+      "version": "2.0.11",
+      "resolved": "https://registry.npmmirror.com/clipboard/-/clipboard-2.0.11.tgz",
+      "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==",
+      "requires": {
+        "good-listener": "^1.2.2",
+        "select": "^1.1.2",
+        "tiny-emitter": "^2.0.0"
+      }
+    },
     "clipboardy": {
       "version": "2.3.0",
       "resolved": "https://registry.npmmirror.com/clipboardy/-/clipboardy-2.3.0.tgz",
@@ -26822,6 +26910,11 @@
       "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
       "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
     },
+    "delegate": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz",
+      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
+    },
     "delegates": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/delegates/-/delegates-1.0.0.tgz",
@@ -27731,6 +27824,14 @@
       "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
       "dev": true
     },
+    "encoding": {
+      "version": "0.1.12",
+      "resolved": "https://registry.npmmirror.com/encoding/-/encoding-0.1.12.tgz",
+      "integrity": "sha512-bl1LAgiQc4ZWr++pNYUdRe/alecaHFeHxIJ/pNciqGdKXghaTCOwKkbKp6ye7pKZGu/GcaSXFk8PBVhgs+dJdA==",
+      "requires": {
+        "iconv-lite": "~0.4.13"
+      }
+    },
     "end-of-stream": {
       "version": "0.1.5",
       "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-0.1.5.tgz",
@@ -28279,6 +28380,15 @@
         "websocket-driver": ">=0.5.1"
       }
     },
+    "fetch": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/fetch/-/fetch-1.1.0.tgz",
+      "integrity": "sha512-5O8TwrGzoNblBG/jtK4NFuZwNCkZX6s5GfRNOaGtm+QGJEuNakSC/i2RW0R93KX6E0jVjNXm6O3CRN4Ql3K+yA==",
+      "requires": {
+        "biskviit": "1.0.1",
+        "encoding": "0.1.12"
+      }
+    },
     "figgy-pudding": {
       "version": "3.5.2",
       "resolved": "https://registry.npmmirror.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
@@ -29087,6 +29197,14 @@
         }
       }
     },
+    "good-listener": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/good-listener/-/good-listener-1.2.2.tgz",
+      "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==",
+      "requires": {
+        "delegate": "^3.1.2"
+      }
+    },
     "gopd": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz",
@@ -30445,7 +30563,6 @@
       "version": "0.4.24",
       "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
       "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-      "dev": true,
       "requires": {
         "safer-buffer": ">= 2.1.2 < 3"
       }
@@ -34899,6 +35016,11 @@
         }
       }
     },
+    "select": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/select/-/select-1.1.2.tgz",
+      "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA=="
+    },
     "select-hose": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz",
@@ -36891,6 +37013,11 @@
         "setimmediate": "^1.0.4"
       }
     },
+    "tiny-emitter": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+      "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
+    },
     "to-arraybuffer": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
@@ -37549,6 +37676,14 @@
         }
       }
     },
+    "vue-clipboard3": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/vue-clipboard3/-/vue-clipboard3-2.0.0.tgz",
+      "integrity": "sha512-Q9S7dzWGax7LN5iiSPcu/K1GGm2gcBBlYwmMsUc5/16N6w90cbKow3FnPmPs95sungns4yvd9/+JhbAznECS2A==",
+      "requires": {
+        "clipboard": "^2.0.6"
+      }
+    },
     "vue-cron": {
       "version": "1.0.9",
       "resolved": "https://registry.npmmirror.com/vue-cron/-/vue-cron-1.0.9.tgz",

+ 2 - 0
package.json

@@ -24,6 +24,7 @@
     "echarts-gl": "^2.0.9",
     "element-theme": "^2.0.1",
     "element-ui": "^2.11.1",
+    "fetch": "^1.1.0",
     "file-loader": "^6.2.0",
     "file-saver": "^2.0.5",
     "js-cookie": "^3.0.5",
@@ -43,6 +44,7 @@
     "screenfull": "^4.2.1",
     "svg-sprite-loader": "^4.1.6",
     "vue": "^2.6.10",
+    "vue-clipboard3": "^2.0.0",
     "vue-cron": "^1.0.9",
     "vue-i18n": "^8.12.0",
     "vue-loader": "^17.0.0",

+ 77 - 12
src/views/modules/agent/dialog.vue

@@ -48,10 +48,10 @@
                             </div>
                         </div>
                         <div class="icons adfac" v-if="item.answer">
-                            <img :src="isSx?require('@/assets/images/agent/dialog_sx2.png'):require('@/assets/images/agent/dialog_sx1.png')" @click="handleSx" class="f">
-                            <img :src="isFz?require('@/assets/images/agent/dialog_fz2.png'):require('@/assets/images/agent/dialog_fz1.png')" @click="handleFz">
-                            <img :src="isDz?require('@/assets/images/agent/dialog_dz2.png'):require('@/assets/images/agent/dialog_dz1.png')" @click="handleDz">
-                            <img :src="isPl?require('@/assets/images/agent/dialog_pl2.png'):require('@/assets/images/agent/dialog_pl1.png')" @click="handlePl">
+                            <img alt="重试" :src="isSx?require('@/assets/images/agent/dialog_sx2.png'):require('@/assets/images/agent/dialog_sx1.png')" @click="handleSx(index)" class="f">
+                            <img alt="复制" :src="isFz?require('@/assets/images/agent/dialog_fz2.png'):require('@/assets/images/agent/dialog_fz1.png')" @click="handleFz(index)">
+                            <img alt="点赞" :src="isDz?require('@/assets/images/agent/dialog_dz2.png'):require('@/assets/images/agent/dialog_dz1.png')" @click="handleDz">
+                            <img alt="评论" :src="isPl?require('@/assets/images/agent/dialog_pl2.png'):require('@/assets/images/agent/dialog_pl1.png')" @click="handlePl">
                         </div>
                     </div>
                     <div class="li_pre ai adfac" v-else-if="item.type===3">
@@ -111,8 +111,11 @@
 </template>
 
 <script setup name="">
+    import Cookies from "js-cookie";
     import DOMPurify from 'dompurify';
     import { ref, getCurrentInstance } from 'vue'
+    import useClipboard from 'vue-clipboard3';
+    const { toClipboard } = useClipboard();
     const { proxy } = getCurrentInstance();
     
     const idx = ref('')
@@ -127,6 +130,8 @@
     const isPl = ref(false)
     const dialogList = ref([])
 
+    const currentTaskId = ref('');
+
     const handleChange = (val) => {
         idx.value = val;
         dialogList.value = []
@@ -150,27 +155,86 @@
             type: 1
         }
         dialogList.value = [...dialogList.value,obj1]
-        question.value = '';
         let obj2 = {
             answer: '',
             type: 2
         }
         dialogList.value = [...dialogList.value,obj2]
-        setTimeout(() => {
-            dialogList.value[dialogList.value.length-1].answer = `你好哇,很高兴认识你,我是<b>AI团队教练助手~</b>有什么问题可以问我哦~`;
-        },3000)
+        startStream(question.value.trim());
+        question.value = '';
     }
 
+    const startStream = async (query) => {
+        try {
+            const response = await fetch(`${window.SITE_CONFIG['apiURL']}/core/chat/messages`, {
+                method: 'POST',
+                headers: {
+                    'token':Cookies.get('token') || '',
+                    'Content-Type': 'application/json',
+                    'Accept': 'text/event-stream',
+                },
+                body: JSON.stringify({
+                    query
+                })
+            });
+
+            if (!response.ok || !response.body) {
+                throw new Error(`请求失败: ${response.status}`);
+            }
+
+            const reader = response.body.getReader();
+            const decoder = new TextDecoder('utf-8');
+            let buffer = ''; // 累积缓冲器
+
+            while (true) {
+                const { value, done } = await reader.read();
+                if (done) break;
+
+                buffer += decoder.decode(value, { stream: true });
+                const events = buffer.split('\n\n');
+                buffer = events.pop() || ''; 
+                events.forEach(event => {
+                    if (event.startsWith('data:')) {
+                        try {
+                            const jsonStr = event.slice(5).trim();
+                            const jsonData = JSON.parse(jsonStr);
+                            currentTaskId.value = jsonData?.task_id || '';
+                            dialogList.value = [...dialogList.value].map((item, idx) => {
+                                if (idx === dialogList.value.length - 1) {
+                                    return { ...item, answer: item.answer + (jsonData?.answer || '') };
+                                }
+                                return item;
+                            });
+                        } catch (e) {
+                            console.error('SSE解析失败', e, '原始数据:', event);
+                        }
+                    }
+                });
+            }
+        } catch (err) {
+            console.log(err,'err');
+        }
+    };
+
     const sanitizeHtml = (html) => {
       if (!html) return '';
       return DOMPurify.sanitize(html);
     }
 
-    const handleSx = () => {
-        isSx.value = !isSx.value;
+    const handleSx = (index) => {
+        // isSx.value = !isSx.value;
+        dialogList.value[index].answer = '';
+        let query = dialogList.value[index-1].question;
+        startStream(query)
     }
-    const handleFz = () => {
-        isFz.value = !isFz.value;
+    const handleFz = async (index) => {
+        // isFz.value = !isFz.value;
+        try {
+            await toClipboard(dialogList.value[index].answer);
+            proxy.$message.success('复制成功');
+        } catch (e) {
+            proxy.$message.error('复制失败');
+        }
     }
     const handleDz = () => {
         isDz.value = !isDz.value;
@@ -266,6 +330,7 @@
             height: calc(100vh - 228px);
             padding: 24px 0;
             position: relative;
+            overflow-y: auto;
             .list{
                 .l_item{
                     margin-top: 36px;

+ 1 - 24
src/views/modules/agent/questionnaire.vue

@@ -65,30 +65,7 @@
         questionnaireId: '',
         status: '',
     })
-    const dataList = ref([
-        {
-            programName:'TechCorp 领导团队评估',
-            teamName:'产品研发 · 创新科技',
-            questionnaireName:'对领导团队进行全面PERILL评估,以确定强项和发展机会。',
-            fbTime:'4月20日 14:09 ',
-            jzTime:'4月20日 14:09 ',
-            teamPersons:12,
-            teamWcPerson:3,
-            sendPerson:'刘俊',
-            status:0
-        },
-        {
-            programName:'TechCorp 领导团队评估',
-            teamName:'产品研发 · 创新科技',
-            questionnaireName:'对领导团队进行全面PERILL评估,以确定强项和发展机会。',
-            fbTime:'4月20日 14:09 ',
-            jzTime:'4月20日 14:09 ',
-            teamPersons:12,
-            teamWcPerson:12,
-            sendPerson:'刘俊',
-            status:1
-        },
-    ])
+    const dataList = ref([])
 
     const handleSchedule = (item) => {
         proxy.$router.push({

+ 62 - 2
yarn.lock

@@ -2577,6 +2577,13 @@
   "resolved" "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz"
   "version" "2.3.0"
 
+"biskviit@1.0.1":
+  "integrity" "sha512-VGCXdHbdbpEkFgtjkeoBN8vRlbj1ZRX2/mxhE8asCCRalUx2nBzOomLJv8Aw/nRt5+ccDb+tPKidg4XxcfGW4w=="
+  "resolved" "https://registry.npmmirror.com/biskviit/-/biskviit-1.0.1.tgz"
+  "version" "1.0.1"
+  dependencies:
+    "psl" "^1.1.7"
+
 "bl@^4.1.0":
   "integrity" "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="
   "resolved" "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz"
@@ -3216,6 +3223,15 @@
   "resolved" "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.2.tgz"
   "version" "2.9.2"
 
+"clipboard@^2.0.6":
+  "integrity" "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw=="
+  "resolved" "https://registry.npmmirror.com/clipboard/-/clipboard-2.0.11.tgz"
+  "version" "2.0.11"
+  dependencies:
+    "good-listener" "^1.2.2"
+    "select" "^1.1.2"
+    "tiny-emitter" "^2.0.0"
+
 "clipboardy@^2.3.0":
   "integrity" "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ=="
   "resolved" "https://registry.npmmirror.com/clipboardy/-/clipboardy-2.3.0.tgz"
@@ -3981,6 +3997,11 @@
   "resolved" "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz"
   "version" "1.0.0"
 
+"delegate@^3.1.2":
+  "integrity" "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
+  "resolved" "https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz"
+  "version" "3.2.0"
+
 "delegates@^1.0.0":
   "integrity" "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="
   "resolved" "https://registry.npmmirror.com/delegates/-/delegates-1.0.0.tgz"
@@ -4291,6 +4312,13 @@
   "resolved" "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz"
   "version" "1.0.2"
 
+"encoding@^0.1.0", "encoding@0.1.12":
+  "integrity" "sha512-bl1LAgiQc4ZWr++pNYUdRe/alecaHFeHxIJ/pNciqGdKXghaTCOwKkbKp6ye7pKZGu/GcaSXFk8PBVhgs+dJdA=="
+  "resolved" "https://registry.npmmirror.com/encoding/-/encoding-0.1.12.tgz"
+  "version" "0.1.12"
+  dependencies:
+    "iconv-lite" "~0.4.13"
+
 "end-of-stream@^1.0.0":
   "integrity" "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="
   "resolved" "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz"
@@ -4770,6 +4798,14 @@
   dependencies:
     "websocket-driver" ">=0.5.1"
 
+"fetch@^1.1.0":
+  "integrity" "sha512-5O8TwrGzoNblBG/jtK4NFuZwNCkZX6s5GfRNOaGtm+QGJEuNakSC/i2RW0R93KX6E0jVjNXm6O3CRN4Ql3K+yA=="
+  "resolved" "https://registry.npmmirror.com/fetch/-/fetch-1.1.0.tgz"
+  "version" "1.1.0"
+  dependencies:
+    "biskviit" "1.0.1"
+    "encoding" "0.1.12"
+
 "figgy-pudding@^3.5.1":
   "integrity" "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw=="
   "resolved" "https://registry.npmmirror.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz"
@@ -5330,6 +5366,13 @@
   dependencies:
     "sparkles" "^1.0.0"
 
+"good-listener@^1.2.2":
+  "integrity" "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw=="
+  "resolved" "https://registry.npmmirror.com/good-listener/-/good-listener-1.2.2.tgz"
+  "version" "1.2.2"
+  dependencies:
+    "delegate" "^3.1.2"
+
 "gopd@^1.0.1", "gopd@^1.2.0":
   "integrity" "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="
   "resolved" "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz"
@@ -5867,7 +5910,7 @@
   "resolved" "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz"
   "version" "2.1.0"
 
-"iconv-lite@0.4.24":
+"iconv-lite@~0.4.13", "iconv-lite@0.4.24":
   "integrity" "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="
   "resolved" "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz"
   "version" "0.4.24"
@@ -8853,7 +8896,7 @@
   "resolved" "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz"
   "version" "1.0.2"
 
-"psl@^1.1.28":
+"psl@^1.1.28", "psl@^1.1.7":
   "integrity" "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
   "resolved" "https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz"
   "version" "1.9.0"
@@ -9778,6 +9821,11 @@
   "resolved" "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz"
   "version" "2.0.0"
 
+"select@^1.1.2":
+  "integrity" "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA=="
+  "resolved" "https://registry.npmmirror.com/select/-/select-1.1.2.tgz"
+  "version" "1.1.2"
+
 "selfsigned@^2.1.1":
   "integrity" "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q=="
   "resolved" "https://registry.npmmirror.com/selfsigned/-/selfsigned-2.4.1.tgz"
@@ -10808,6 +10856,11 @@
   dependencies:
     "setimmediate" "^1.0.4"
 
+"tiny-emitter@^2.0.0":
+  "integrity" "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
+  "resolved" "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz"
+  "version" "2.1.0"
+
 "to-arraybuffer@^1.0.0":
   "integrity" "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA=="
   "resolved" "https://registry.npmmirror.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz"
@@ -11305,6 +11358,13 @@
   "resolved" "https://registry.npmmirror.com/vm-browserify/-/vm-browserify-1.1.2.tgz"
   "version" "1.1.2"
 
+"vue-clipboard3@^2.0.0":
+  "integrity" "sha512-Q9S7dzWGax7LN5iiSPcu/K1GGm2gcBBlYwmMsUc5/16N6w90cbKow3FnPmPs95sungns4yvd9/+JhbAznECS2A=="
+  "resolved" "https://registry.npmmirror.com/vue-clipboard3/-/vue-clipboard3-2.0.0.tgz"
+  "version" "2.0.0"
+  dependencies:
+    "clipboard" "^2.0.6"
+
 "vue-cron@^1.0.9":
   "integrity" "sha512-r8JnAjqpDsDj3a545156m7bca1xkrnIktks+N94KQA80OuKAiqhoz3Cq1JCyO+0ONXAOnLwvkjHiVCfL38XNbA=="
   "resolved" "https://registry.npmmirror.com/vue-cron/-/vue-cron-1.0.9.tgz"