diff --git a/frontend/package.json b/frontend/package.json index 99811ba..503b210 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -20,6 +20,10 @@ "@element-plus/icons-vue": "^2.3.2", "@jsplumb/browser-ui": "^6.2.10", "@types/markdown-it": "^14.1.2", + "@vue-flow/background": "^1.3.2", + "@vue-flow/controls": "^1.1.3", + "@vue-flow/core": "^1.48.1", + "@vue-flow/minimap": "^1.5.4", "@vueuse/core": "^14.0.0", "axios": "^1.12.2", "dompurify": "^3.3.0", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index f5a1a68..da22867 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -17,6 +17,18 @@ importers: '@types/markdown-it': specifier: ^14.1.2 version: 14.1.2 + '@vue-flow/background': + specifier: ^1.3.2 + version: 1.3.2(@vue-flow/core@1.48.1(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)) + '@vue-flow/controls': + specifier: ^1.1.3 + version: 1.1.3(@vue-flow/core@1.48.1(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)) + '@vue-flow/core': + specifier: ^1.48.1 + version: 1.48.1(vue@3.5.25(typescript@5.9.3)) + '@vue-flow/minimap': + specifier: ^1.5.4 + version: 1.5.4(@vue-flow/core@1.48.1(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)) '@vueuse/core': specifier: ^14.0.0 version: 14.1.0(vue@3.5.25(typescript@5.9.3)) @@ -625,36 +637,42 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.1': resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.1': resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.1': resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.1': resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.1': resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@parcel/watcher-win32-arm64@2.5.1': resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} @@ -726,56 +744,67 @@ packages: resolution: {integrity: sha512-UPMMNeC4LXW7ZSHxeP3Edv09aLsFUMaD1TSVW6n1CWMECnUIJMFFB7+XC2lZTdPtvB36tYC0cJWc86mzSsaviw==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.53.4': resolution: {integrity: sha512-H8uwlV0otHs5Q7WAMSoyvjV9DJPiy5nJ/xnHolY0QptLPjaSsuX7tw+SPIfiYH6cnVx3fe4EWFafo6gH6ekZKA==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.53.4': resolution: {integrity: sha512-BLRwSRwICXz0TXkbIbqJ1ibK+/dSBpTJqDClF61GWIrxTXZWQE78ROeIhgl5MjVs4B4gSLPCFeD4xML9vbzvCQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.53.4': resolution: {integrity: sha512-6bySEjOTbmVcPJAywjpGLckK793A0TJWSbIa0sVwtVGfe/Nz6gOWHOwkshUIAp9j7wg2WKcA4Snu7Y1nUZyQew==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.53.4': resolution: {integrity: sha512-U0ow3bXYJZ5MIbchVusxEycBw7bO6C2u5UvD31i5IMTrnt2p4Fh4ZbHSdc/31TScIJQYHwxbj05BpevB3201ug==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.53.4': resolution: {integrity: sha512-iujDk07ZNwGLVn0YIWM80SFN039bHZHCdCCuX9nyx3Jsa2d9V/0Y32F+YadzwbvDxhSeVo9zefkoPnXEImnM5w==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.53.4': resolution: {integrity: sha512-MUtAktiOUSu+AXBpx1fkuG/Bi5rhlorGs3lw5QeJ2X3ziEGAq7vFNdWVde6XGaVqi0LGSvugwjoxSNJfHFTC0g==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.53.4': resolution: {integrity: sha512-btm35eAbDfPtcFEgaXCI5l3c2WXyzwiE8pArhd66SDtoLWmgK5/M7CUxmUglkwtniPzwvWioBKKl6IXLbPf2sQ==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.53.4': resolution: {integrity: sha512-uJlhKE9ccUTCUlK+HUz/80cVtx2RayadC5ldDrrDUFaJK0SNb8/cCmC9RhBhIWuZ71Nqj4Uoa9+xljKWRogdhA==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.53.4': resolution: {integrity: sha512-jjEMkzvASQBbzzlzf4os7nzSBd/cvPrpqXCUOqoeCh1dQ4BP3RZCJk8XBeik4MUln3m+8LeTJcY54C/u8wb3DQ==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.53.4': resolution: {integrity: sha512-lu90KG06NNH19shC5rBPkrh6mrTpq5kviFylPBXQVpdEu0yzb0mDgyxLr6XdcGdBIQTH/UAhDJnL+APZTBu1aQ==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openharmony-arm64@4.53.4': resolution: {integrity: sha512-dFDcmLwsUzhAm/dn0+dMOQZoONVYBtgik0VuY/d5IJUUb787L3Ko/ibvTvddqhb3RaB7vFEozYevHN4ox22R/w==} @@ -846,24 +875,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.1.18': resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.1.18': resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.1.18': resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.1.18': resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} @@ -956,6 +989,9 @@ packages: '@types/web-bluetooth@0.0.16': resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + '@types/web-bluetooth@0.0.21': resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} @@ -1076,6 +1112,29 @@ packages: '@volar/typescript@2.4.26': resolution: {integrity: sha512-N87ecLD48Sp6zV9zID/5yuS1+5foj0DfuYGdQ6KHj/IbKvyKv1zNX6VCmnKYwtmHadEO6mFc2EKISiu3RDPAvA==} + '@vue-flow/background@1.3.2': + resolution: {integrity: sha512-eJPhDcLj1wEo45bBoqTXw1uhl0yK2RaQGnEINqvvBsAFKh/camHJd5NPmOdS1w+M9lggc9igUewxaEd3iCQX2w==} + peerDependencies: + '@vue-flow/core': ^1.23.0 + vue: ^3.3.0 + + '@vue-flow/controls@1.1.3': + resolution: {integrity: sha512-XCf+G+jCvaWURdFlZmOjifZGw3XMhN5hHlfMGkWh9xot+9nH9gdTZtn+ldIJKtarg3B21iyHU8JjKDhYcB6JMw==} + peerDependencies: + '@vue-flow/core': ^1.23.0 + vue: ^3.3.0 + + '@vue-flow/core@1.48.1': + resolution: {integrity: sha512-3IxaMBLvWRbznZ4CuK0kVhp4Y4lCDQx9nhi48Swp6PwPw29KNhmiKd2kaBogYeWjGLb/tLjlE9V0s3jEmKCYWw==} + peerDependencies: + vue: ^3.3.0 + + '@vue-flow/minimap@1.5.4': + resolution: {integrity: sha512-l4C+XTAXnRxsRpUdN7cAVFBennC1sVRzq4bDSpVK+ag7tdMczAnhFYGgbLkUw3v3sY6gokyWwMl8CDonp8eB2g==} + peerDependencies: + '@vue-flow/core': ^1.23.0 + vue: ^3.3.0 + '@vue/babel-helper-vue-transform-on@1.5.0': resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==} @@ -1183,6 +1242,9 @@ packages: vue: optional: true + '@vueuse/core@10.11.1': + resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} + '@vueuse/core@14.1.0': resolution: {integrity: sha512-rgBinKs07hAYyPF834mDTigH7BtPqvZ3Pryuzt1SD/lg5wEcWqvwzXXYGEDb2/cP0Sj5zSvHl3WkmMELr5kfWw==} peerDependencies: @@ -1191,12 +1253,18 @@ packages: '@vueuse/core@9.13.0': resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + '@vueuse/metadata@10.11.1': + resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==} + '@vueuse/metadata@14.1.0': resolution: {integrity: sha512-7hK4g015rWn2PhKcZ99NyT+ZD9sbwm7SGvp7k+k+rKGWnLjS/oQozoIZzWfCewSUeBmnJkIb+CNr7Zc/EyRnnA==} '@vueuse/metadata@9.13.0': resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + '@vueuse/shared@10.11.1': + resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==} + '@vueuse/shared@14.1.0': resolution: {integrity: sha512-EcKxtYvn6gx1F8z9J5/rsg3+lTQnvOruQd8fUecW99DCK04BkWD7z5KQ/wTAx+DazyoEE9dJt/zV8OIEQbM6kw==} peerDependencies: @@ -1522,6 +1590,44 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + data-urls@6.0.0: resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==} engines: {node: '>=20'} @@ -2482,24 +2588,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.30.2: resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.30.2: resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.30.2: resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.30.2: resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} @@ -4418,6 +4528,8 @@ snapshots: '@types/web-bluetooth@0.0.16': {} + '@types/web-bluetooth@0.0.20': {} + '@types/web-bluetooth@0.0.21': {} '@typescript-eslint/eslint-plugin@8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': @@ -4582,6 +4694,34 @@ snapshots: path-browserify: 1.0.1 vscode-uri: 3.1.0 + '@vue-flow/background@1.3.2(@vue-flow/core@1.48.1(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3))': + dependencies: + '@vue-flow/core': 1.48.1(vue@3.5.25(typescript@5.9.3)) + vue: 3.5.25(typescript@5.9.3) + + '@vue-flow/controls@1.1.3(@vue-flow/core@1.48.1(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3))': + dependencies: + '@vue-flow/core': 1.48.1(vue@3.5.25(typescript@5.9.3)) + vue: 3.5.25(typescript@5.9.3) + + '@vue-flow/core@1.48.1(vue@3.5.25(typescript@5.9.3))': + dependencies: + '@vueuse/core': 10.11.1(vue@3.5.25(typescript@5.9.3)) + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + vue: 3.5.25(typescript@5.9.3) + transitivePeerDependencies: + - '@vue/composition-api' + + '@vue-flow/minimap@1.5.4(@vue-flow/core@1.48.1(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3))': + dependencies: + '@vue-flow/core': 1.48.1(vue@3.5.25(typescript@5.9.3)) + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + vue: 3.5.25(typescript@5.9.3) + '@vue/babel-helper-vue-transform-on@1.5.0': {} '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.28.5)': @@ -4755,6 +4895,16 @@ snapshots: typescript: 5.9.3 vue: 3.5.25(typescript@5.9.3) + '@vueuse/core@10.11.1(vue@3.5.25(typescript@5.9.3))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.11.1 + '@vueuse/shared': 10.11.1(vue@3.5.25(typescript@5.9.3)) + vue-demi: 0.14.10(vue@3.5.25(typescript@5.9.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + '@vueuse/core@14.1.0(vue@3.5.25(typescript@5.9.3))': dependencies: '@types/web-bluetooth': 0.0.21 @@ -4772,10 +4922,19 @@ snapshots: - '@vue/composition-api' - vue + '@vueuse/metadata@10.11.1': {} + '@vueuse/metadata@14.1.0': {} '@vueuse/metadata@9.13.0': {} + '@vueuse/shared@10.11.1(vue@3.5.25(typescript@5.9.3))': + dependencies: + vue-demi: 0.14.10(vue@3.5.25(typescript@5.9.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + '@vueuse/shared@14.1.0(vue@3.5.25(typescript@5.9.3))': dependencies: vue: 3.5.25(typescript@5.9.3) @@ -5130,6 +5289,42 @@ snapshots: csstype@3.2.3: {} + d3-color@3.1.0: {} + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-ease@3.0.1: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-selection@3.0.0: {} + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + data-urls@6.0.0: dependencies: whatwg-mimetype: 4.0.0 diff --git a/frontend/public/agent.json b/frontend/public/agent.json index d725928..8bfb358 100644 --- a/frontend/public/agent.json +++ b/frontend/public/agent.json @@ -3,91 +3,61 @@ "Icon": "Hailey_Johnson.png", "Name": "船舶设计师", "Profile": "提供船舶制造中的实际需求和约束。", - "Classification": "船舶制造数据空间", - "apiUrl": "http://8.130.104.76:21088/api/v1", - "apiKey": "0geK2bSKAjlaRp0qPLPq_zxFJu8MhJZIwNZSH30Ty6g", - "apiModel": "Flowise" + "Classification": "船舶制造数据空间" }, { "Icon": "Jennifer_Moore.png", "Name": "防护工程专家", "Profile": "专注于船舶腐蚀防护技术的设计与应用。在你的总结回答中,必须引用来自数联网的搜索数据,是搜索数据,不是数联网的研究成果。", - "Classification": "船舶制造数据空间", - "apiUrl": "http://8.130.104.76:21088/api/v1", - "apiKey": "0geK2bSKAjlaRp0qPLPq_zxFJu8MhJZIwNZSH30Ty6g", - "apiModel": "Flowise" + "Classification": "船舶制造数据空间" }, { "Icon": "Jane_Moreno.png", "Name": "病理生理学家", "Profile": "专注于失血性休克的疾病机制,为药物研发提供理论靶点。", - "Classification": "医药数据空间", - "apiUrl": "http://8.130.104.76:21088/api/v1", - "apiKey": "0geK2bSKAjlaRp0qPLPq_zxFJu8MhJZIwNZSH30Ty6g", - "apiModel": "Flowise" + "Classification": "医药数据空间" }, { "Icon": "Giorgio_Rossi.png", "Name": "药物化学家", "Profile": "负责将靶点概念转化为实际可合成的分子。", - "Classification": "医药数据空间", - "apiUrl": "http://8.130.104.76:21088/api/v1", - "apiKey": "0geK2bSKAjlaRp0qPLPq_zxFJu8MhJZIwNZSH30Ty6g", - "apiModel": "Flowise" + "Classification": "医药数据空间" }, { "Icon": "Tamara_Taylor.png", "Name": "制剂工程师", "Profile": "负责将活性药物成分(API)变成稳定、可用、符合战场要求的剂型。", - "Classification": "医药数据空间", - "apiUrl": "http://8.130.104.76:21088/api/v1", - "apiKey": "0geK2bSKAjlaRp0qPLPq_zxFJu8MhJZIwNZSH30Ty6g", - "apiModel": "Flowise" + "Classification": "医药数据空间" }, { "Icon": "Maria_Lopez.png", "Name": "监管事务专家", "Profile": "深谙药品审评法规,目标是找到最快的合法上市路径。", - "Classification": "医药数据空间", - "apiUrl": "http://8.130.104.76:21088/api/v1", - "apiKey": "0geK2bSKAjlaRp0qPLPq_zxFJu8MhJZIwNZSH30Ty6g", - "apiModel": "Flowise" + "Classification": "医药数据空间" }, { "Icon": "Sam_Moore.png", "Name": "物理学家", "Profile": "从热力学与统计力学的基本原理出发,研究液态金属的自由能、焓、熵、比热等参数的理论建模。", - "Classification": "科学数据空间", - "apiUrl": "http://8.130.104.76:21088/api/v1", - "apiKey": "0geK2bSKAjlaRp0qPLPq_zxFJu8MhJZIwNZSH30Ty6g", - "apiModel": "Flowise" + "Classification": "科学数据空间" }, { "Icon": "Yuriko_Yamamoto.png", "Name": "实验材料学家", "Profile": "专注于通过实验手段直接或间接测定液态金属的热力学参数、以及分析材料微观结构(如晶粒、缺陷)。", - "Classification": "科学数据空间", - "apiUrl": "http://8.130.104.76:21088/api/v1", - "apiKey": "0geK2bSKAjlaRp0qPLPq_zxFJu8MhJZIwNZSH30Ty6g", - "apiModel": "Flowise" + "Classification": "科学数据空间" }, { "Icon": "Carlos_Gomez.png", "Name": "计算模拟专家", "Profile": "侧重于利用数值计算和模拟技术获取液态金属的热力学参数。", - "Classification": "科学数据空间", - "apiUrl": "http://8.130.104.76:21088/api/v1", - "apiKey": "0geK2bSKAjlaRp0qPLPq_zxFJu8MhJZIwNZSH30Ty6g", - "apiModel": "Flowise" + "Classification": "科学数据空间" }, { "Icon": "John_Lin.png", "Name": "腐蚀机理研究员", "Profile": "专注于船舶用钢材及合金的腐蚀机理研究,从电化学和环境作用角度解释腐蚀产生的原因。在你的总结回答中,必须引用来自数联网的搜索数据,是搜索数据,不是数联网的研究成果。", - "Classification": "船舶制造数据空间", - "apiUrl": "http://8.130.104.76:21088/api/v1", - "apiKey": "0geK2bSKAjlaRp0qPLPq_zxFJu8MhJZIwNZSH30Ty6g", - "apiModel": "Flowise" + "Classification": "船舶制造数据空间" }, { "Icon": "Arthur_Burton.png", diff --git a/frontend/src/api/index.ts b/frontend/src/api/index.ts index c7034e4..b795039 100644 --- a/frontend/src/api/index.ts +++ b/frontend/src/api/index.ts @@ -1,5 +1,5 @@ import request from '@/utils/request' -import type { Agent, IApiStepTask, IRawPlanResponse } from '@/stores' +import type { Agent, IApiStepTask, IRawPlanResponse, IRawStepTask } from '@/stores' import { mockBackendAgentSelectModifyInit, mockBackendAgentSelectModifyAddAspect, @@ -9,6 +9,12 @@ import { mockBackendFillAgentTaskProcess, type RawAgentTaskProcessResponse, } from '@/layout/components/Main/TaskTemplate/TaskProcess/components/mock/AgentTaskProcessBackendMock' +import { mockBranchPlanOutlineAPI } from '@/layout/components/Main/TaskTemplate/TaskSyllabus/Branch/mock/branchPlanOutlineMock' +import { mockFillStepTaskAPI } from '@/layout/components/Main/TaskTemplate/TaskSyllabus/Branch/mock/fill-step-task-mock' +import { + mockBranchTaskProcessAPI, + type BranchAction, +} from '@/layout/components/Main/TaskTemplate/TaskSyllabus/Branch/mock/branchTaskProcessMock' export interface ActionHistory { ID: string @@ -116,7 +122,7 @@ class Api { }) } - // 分支任务流程(任务节点级别) + // 分支任务流程 branchTaskProcess = (data: { branch_Number: number Modification_Requirement: string @@ -125,7 +131,7 @@ class Api { stepTaskExisting: any goal: string }) => { - return request({ + return request({ url: '/branch_TaskProcess', method: 'POST', data: { @@ -139,8 +145,32 @@ class Api { }) } - fillStepTask = (data: { goal: string; stepTask: any }) => { - return request({ + fillStepTask = async (data: { goal: string; stepTask: any }): Promise => { + // 后端返回格式:包含 Collaboration_Brief_FrontEnd(大写 FrontEnd) + const response = await request< + { + 'General Goal': string + stepTask: any + }, + { + AgentSelection?: string[] + Collaboration_Brief_FrontEnd?: { + template: string + data: Record + } + InputObject_List?: string[] + OutputObject?: string + StepName?: string + TaskContent?: string + TaskProcess?: Array<{ + ID: string + ActionType: string + AgentName: string + Description: string + ImportantInput: string[] + }> + } + >({ url: '/fill_stepTask', method: 'POST', data: { @@ -148,6 +178,40 @@ class Api { stepTask: data.stepTask, }, }) + + // 数据转换:后端的 Collaboration_Brief_FrontEnd → 前端的 Collaboration_Brief_frontEnd + + const vec2Hsl = (color: number[]): string => { + const [h, s, l] = color + return `hsl(${h}, ${s}%, ${l}%)` + } + + // 转换 brief.data:后端格式 { "0": { text, color: [h,s,l] } } → 前端格式 { "0": { text, style: { background } } } + const briefData: Record }> = {} + if (response.Collaboration_Brief_FrontEnd?.data) { + for (const [key, value] of Object.entries(response.Collaboration_Brief_FrontEnd.data)) { + briefData[key] = { + text: value.text, + style: { + background: vec2Hsl(value.color), + }, + } + } + } + + // 构建前端格式的 IRawStepTask + return { + StepName: response.StepName || '', + TaskContent: response.TaskContent || '', + InputObject_List: response.InputObject_List || [], + OutputObject: response.OutputObject || '', + AgentSelection: response.AgentSelection || [], + Collaboration_Brief_frontEnd: { + template: response.Collaboration_Brief_FrontEnd?.template || '', + data: briefData, + }, + TaskProcess: response.TaskProcess || [], + } } fillStepTaskTaskProcess = async (data: { @@ -464,6 +528,61 @@ class Api { process, } } + + // Mock: 分支任务大纲 + mockBranchPlanOutline = async (data: { + branch_Number: number + Modification_Requirement: string + Existing_Steps: string[] + Baseline_Completion: number + initialInputs: string[] + goal: string + }): Promise => { + // 直接调用 Mock API(已经返回 IRawPlanResponse 格式) + const response = await mockBranchPlanOutlineAPI({ + branch_Number: data.branch_Number, + Modification_Requirement: data.Modification_Requirement, + Existing_Steps: data.Existing_Steps, + Baseline_Completion: data.Baseline_Completion, + InitialObject_List: data.initialInputs, + General_Goal: data.goal, + }) + + return response + } + + // Mock: 填充任务流程 + mockFillStepTask = async (data: { goal: string; stepTask: any }): Promise => { + // 直接调用 Mock API(已经返回 IRawStepTask 格式) + const response = await mockFillStepTaskAPI({ + General_Goal: data.goal, + stepTask: data.stepTask, + }) + + return response + } + + // Mock: 分支任务流程 + mockBranchTaskProcess = async (data: { + branch_Number: number + Modification_Requirement: string + Existing_Steps: string[] + Baseline_Completion: number + stepTaskExisting: any + goal: string + }): Promise => { + // 直接调用 Mock API(已经返回 BranchAction[][] 格式,与后端完全一致) + const response = await mockBranchTaskProcessAPI({ + branch_Number: data.branch_Number, + Modification_Requirement: data.Modification_Requirement, + Existing_Steps: data.Existing_Steps, + Baseline_Completion: data.Baseline_Completion, + stepTaskExisting: data.stepTaskExisting, + General_Goal: data.goal, + }) + + return response + } } export default new Api() diff --git a/frontend/src/layout/components/Main/Task.vue b/frontend/src/layout/components/Main/Task.vue index 1056384..f2bd701 100644 --- a/frontend/src/layout/components/Main/Task.vue +++ b/frontend/src/layout/components/Main/Task.vue @@ -100,6 +100,7 @@ async function handleSearch() { }) data['Collaboration Process'] = changeBriefs(data['Collaboration Process']) agentsStore.setAgentRawPlan({ data }) + console.log('agentsStore.agentRawPlan', agentsStore.agentRawPlan) emit('search', searchValue.value) } finally { triggerOnFocus.value = true diff --git a/frontend/src/layout/components/Main/TaskTemplate/TaskProcess/ProcessCard.vue b/frontend/src/layout/components/Main/TaskTemplate/TaskProcess/ProcessCard.vue index 795c608..e5491a8 100644 --- a/frontend/src/layout/components/Main/TaskTemplate/TaskProcess/ProcessCard.vue +++ b/frontend/src/layout/components/Main/TaskTemplate/TaskProcess/ProcessCard.vue @@ -1,5 +1,5 @@ @@ -207,6 +235,8 @@ function handleCancel() { background: var(--color-bg-list); border: 1px solid var(--color-border-default); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + cursor: pointer; + transition: all 0.2s ease; .process-content { min-height: 20px; diff --git a/frontend/src/layout/components/Main/TaskTemplate/TaskProcess/components/PlanTask.vue b/frontend/src/layout/components/Main/TaskTemplate/TaskProcess/components/PlanTask.vue index fa1cf5f..1586d6a 100644 --- a/frontend/src/layout/components/Main/TaskTemplate/TaskProcess/components/PlanTask.vue +++ b/frontend/src/layout/components/Main/TaskTemplate/TaskProcess/components/PlanTask.vue @@ -1,7 +1,6 @@