diff --git a/app/project.json b/app/project.json index 04232be70..34c812d28 100644 --- a/app/project.json +++ b/app/project.json @@ -94,19 +94,9 @@ "styles": [ "node_modules/cropperjs/dist/cropper.min.css", "node_modules/pdfjs-dist/web/pdf_viewer.css", - "node_modules/katex/dist/katex.min.css", - "node_modules/prismjs/themes/prism-okaidia.css", "projects/aca-content/src/lib/ui/application.scss", "app/src/styles.scss" ], - "scripts": [ - "node_modules/mermaid/dist/mermaid.min.js", - "node_modules/katex/dist/katex.min.js", - "node_modules/katex/dist/contrib/auto-render.min.js", - "node_modules/prismjs/prism.js", - "node_modules/prismjs/components/prism-csharp.min.js", - "node_modules/prismjs/components/prism-css.min.js" - ], "vendorChunk": true, "extractLicenses": false, "buildOptimizer": false, diff --git a/app/src/app.config.json b/app/src/app.config.json index 6513517de..620866c91 100644 --- a/app/src/app.config.json +++ b/app/src/app.config.json @@ -3,6 +3,7 @@ "ecmHost": "{protocol}//{hostname}{:port}", "aosHost": "{protocol}//{hostname}{:port}/alfresco/aos", "baseShareUrl": "{protocol}//{hostname}{:port}/#/preview/s", + "knowledgeDiscoveryUrl": "", "providers": "ECM", "authType": "BASIC", "loginRoute": "login", @@ -14,8 +15,7 @@ "contentService": true, "folderRules": true, "tagsEnabled": true, - "categoriesEnabled": true, - "knowledgeRetrievalEnabled": false + "categoriesEnabled": true }, "oauth2": { "host": "{protocol}//{hostname}{:port}/auth/realms/alfresco", diff --git a/docker/docker-entrypoint.d/30-sed-on-appconfig.sh b/docker/docker-entrypoint.d/30-sed-on-appconfig.sh index c1e5bc79c..7cec8aaf2 100755 --- a/docker/docker-entrypoint.d/30-sed-on-appconfig.sh +++ b/docker/docker-entrypoint.d/30-sed-on-appconfig.sh @@ -148,8 +148,3 @@ if [ -n "${APP_CONFIG_PLUGIN_CATEGORIES}" ]; then echo "SET APP_CONFIG_PLUGIN_CATEGORIES" sed -e "s/\"categoriesEnabled\": [^,]*/\"categoriesEnabled\": ${APP_CONFIG_PLUGIN_CATEGORIES}/g" -i "$APP_CONFIG_FILE" fi - -if [ -n "${APP_CONFIG_PLUGIN_KNOWLEDGE_RETRIEVAL}" ]; then - echo "SET APP_CONFIG_PLUGIN_KNOWLEDGE_RETRIEVAL" - sed -e "s/\"knowledgeRetrievalEnabled\": [^,]*/\"knowledgeRetrievalEnabled\": ${APP_CONFIG_PLUGIN_KNOWLEDGE_RETRIEVAL}/g" -i "$APP_CONFIG_FILE" -fi diff --git a/docs/extending/rules-list.md b/docs/extending/rules-list.md index 587a31cb1..54dc41d15 100644 --- a/docs/extending/rules-list.md +++ b/docs/extending/rules-list.md @@ -59,6 +59,7 @@ Application related evaluators which can be used to check various different aspe | 5.1.1 | isMultiSelection | Checks if the user has selected multiple files | | 6.1.0 | canPrintFile | Checks if current file can be printed or not (media files such as audio/video cannot be printed). | | 7.4.0 | app.selection.isCheckedOut | Checks if selected node contains `cm:checkedOut` aspect. | +| 8.0.0 | app.isKnowledgeDiscoveryUrlPresent | Checks if the Knowledge Discovery URL is specified in the app config. | #### Navigation Rules/Evaluators diff --git a/docs/features/README.md b/docs/features/README.md index fbe14dcb9..c601ab920 100644 --- a/docs/features/README.md +++ b/docs/features/README.md @@ -27,3 +27,12 @@ This application simplifies the complexity of Content Management and provides co - [Search forms](/features/search-forms) - [Application Hook](/extending/application-hook) - [Context Menu actions](context-menu-actions) + +## Notes + +### Knowledge Discovery removal (v8.0.0) + +The Knowledge Discovery components, services, and APIs have been removed as of ACA version 8.0.0 and ADF version 9.0.0. +The integrated Knowledge Discovery features have been replaced with a section in the side navigation panel containing a link to the standalone Knowledge Discovery UI in ACA and ADW. + +If you were using those features, please consider cleaning Local Storage in your browser as *aiReferences* entry may remain. diff --git a/package-lock.json b/package-lock.json index 520587e19..44ca51b3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,12 +34,8 @@ "@ngrx/store-devtools": "~20.1.0", "@ngx-translate/core": "^17.0.0", "date-fns": "^4.1.0", - "katex": "^0.16.21", "material-icons": "^1.13.12", - "mermaid": "^11.15.0", - "ngx-markdown": "20.0.0", "pdfjs-dist": "5.1.91", - "prismjs": "^1.30.0", "rxjs": "7.8.2", "tslib": "2.8.1", "zone.js": "0.15.0" @@ -2133,19 +2129,6 @@ "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@antfu/install-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", - "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", - "license": "MIT", - "dependencies": { - "package-manager-detector": "^1.3.0", - "tinyexec": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/@babel/code-frame": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", @@ -3993,12 +3976,6 @@ "node": ">=6.9.0" } }, - "node_modules/@braintree/sanitize-url": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz", - "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==", - "license": "MIT" - }, "node_modules/@bufbuild/protobuf": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.12.1.tgz", @@ -4067,12 +4044,6 @@ "@keyv/serialize": "^1.1.1" } }, - "node_modules/@chevrotain/types": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.2.tgz", - "integrity": "sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==", - "license": "Apache-2.0" - }, "node_modules/@colordx/core": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@colordx/core/-/core-5.5.0.tgz", @@ -5595,23 +5566,6 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "license": "MIT" - }, - "node_modules/@iconify/utils": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.3.tgz", - "integrity": "sha512-LPKOXPn/zV+zis1oOfGWogaXVpqUybF3ZS6SCZIsz8vg0ivVp9+fVqyYB7xq0aiST/VhUQYGO1qo6uoYSiEJqw==", - "license": "MIT", - "dependencies": { - "@antfu/install-pkg": "^1.1.0", - "@iconify/types": "^2.0.0", - "import-meta-resolve": "^4.2.0" - } - }, "node_modules/@inquirer/ansi": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", @@ -6394,15 +6348,6 @@ "@angular/material": "^20.0.0" } }, - "node_modules/@mermaid-js/parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.2.0.tgz", - "integrity": "sha512-oYPyv8A4As1yH5Bx+04iQEQxXuIQDe0GKCNSRgao6z8AM9jixXIfP0vsppRLvGf+nKIOb9/LdpWA4YuJiVvESA==", - "license": "MIT", - "dependencies": { - "@chevrotain/types": "~11.1.2" - } - }, "node_modules/@module-federation/bridge-react-webpack-plugin": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-2.6.0.tgz", @@ -12734,259 +12679,6 @@ "@types/node": "*" } }, - "node_modules/@types/d3": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", - "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", - "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", - "license": "MIT" - }, - "node_modules/@types/d3-axis": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", - "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-brush": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", - "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-chord": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", - "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "license": "MIT" - }, - "node_modules/@types/d3-contour": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", - "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", - "license": "MIT" - }, - "node_modules/@types/d3-dispatch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", - "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", - "license": "MIT" - }, - "node_modules/@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-dsv": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", - "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "license": "MIT" - }, - "node_modules/@types/d3-fetch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", - "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", - "license": "MIT", - "dependencies": { - "@types/d3-dsv": "*" - } - }, - "node_modules/@types/d3-force": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", - "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", - "license": "MIT" - }, - "node_modules/@types/d3-format": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", - "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", - "license": "MIT" - }, - "node_modules/@types/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-hierarchy": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", - "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", - "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", - "license": "MIT" - }, - "node_modules/@types/d3-polygon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", - "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", - "license": "MIT" - }, - "node_modules/@types/d3-quadtree": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", - "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", - "license": "MIT" - }, - "node_modules/@types/d3-random": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.4.tgz", - "integrity": "sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==", - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", - "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", - "license": "MIT" - }, - "node_modules/@types/d3-selection": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", - "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", - "license": "MIT" - }, - "node_modules/@types/d3-shape": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", - "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", - "license": "MIT", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", - "license": "MIT" - }, - "node_modules/@types/d3-time-format": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "license": "MIT" - }, - "node_modules/@types/d3-transition": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", - "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", - "license": "MIT", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, "node_modules/@types/eslint": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", @@ -13066,12 +12758,6 @@ "@types/send": "*" } }, - "node_modules/@types/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "license": "MIT" - }, "node_modules/@types/http-errors": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", @@ -13280,13 +12966,6 @@ "@types/node": "*" } }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT", - "optional": true - }, "node_modules/@types/ws": { "version": "8.18.1", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", @@ -14071,16 +13750,6 @@ "dev": true, "license": "ISC" }, - "node_modules/@upsetjs/venn.js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz", - "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==", - "license": "MIT", - "optionalDependencies": { - "d3-selection": "^3.0.0", - "d3-transition": "^3.0.1" - } - }, "node_modules/@vitejs/plugin-basic-ssl": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.0.tgz", @@ -15708,18 +15377,6 @@ "node": ">= 12" } }, - "node_modules/clipboard": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", - "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", - "license": "MIT", - "optional": true, - "dependencies": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -16243,15 +15900,6 @@ "node": ">= 0.4.0" } }, - "node_modules/cose-base": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", - "license": "MIT", - "dependencies": { - "layout-base": "^1.0.0" - } - }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", @@ -17224,514 +16872,6 @@ "dev": true, "license": "MIT" }, - "node_modules/cytoscape": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.34.0.tgz", - "integrity": "sha512-62rNSrioXw93uliKFBwjukeQyeWwH2PqDrTac31r2P6464u3AUvTk0xS4LVvT251g7IgkFunrI48ZEZGjywSOg==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/cytoscape-cose-bilkent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", - "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", - "license": "MIT", - "dependencies": { - "cose-base": "^1.0.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", - "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", - "license": "MIT", - "dependencies": { - "cose-base": "^2.2.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/cose-base": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", - "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", - "license": "MIT", - "dependencies": { - "layout-base": "^2.0.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/layout-base": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", - "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", - "license": "MIT" - }, - "node_modules/d3": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", - "license": "ISC", - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "license": "ISC", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "license": "ISC", - "dependencies": { - "d3-array": "^3.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "license": "ISC", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "license": "ISC", - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "license": "ISC", - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", - "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-sankey": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", - "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1 - 2", - "d3-shape": "^1.2.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-array": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", - "license": "BSD-3-Clause", - "dependencies": { - "internmap": "^1.0.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", - "license": "BSD-3-Clause" - }, - "node_modules/d3-sankey/node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/d3-sankey/node_modules/internmap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", - "license": "ISC" - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "license": "ISC", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "license": "ISC", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "license": "ISC", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dagre-d3-es": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz", - "integrity": "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==", - "license": "MIT", - "dependencies": { - "d3": "^7.9.0", - "lodash-es": "^4.17.21" - } - }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -17806,12 +16946,6 @@ "node": ">=4.0" } }, - "node_modules/dayjs": { - "version": "1.11.21", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz", - "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==", - "license": "MIT" - }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -17952,15 +17086,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delaunator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", - "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", - "license": "ISC", - "dependencies": { - "robust-predicates": "^3.0.2" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -17971,13 +17096,6 @@ "node": ">=0.4.0" } }, - "node_modules/delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", - "license": "MIT", - "optional": true - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -18157,15 +17275,6 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/dompurify": { - "version": "3.4.11", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.11.tgz", - "integrity": "sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==", - "license": "(MPL-2.0 OR Apache-2.0)", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } - }, "node_modules/domutils": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", @@ -18262,13 +17371,6 @@ "dev": true, "license": "MIT" }, - "node_modules/emoji-toolkit": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/emoji-toolkit/-/emoji-toolkit-9.0.1.tgz", - "integrity": "sha512-sMMNqKNLVHXJfIKoPbrRJwtYuysVNC9GlKetr72zE3SSVbHqoeDLWVrxP0uM0AE0qvdl3hbUk+tJhhwXZrDHaw==", - "license": "MIT", - "optional": true - }, "node_modules/emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", @@ -18652,16 +17754,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-toolkit": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.49.0.tgz", - "integrity": "sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==", - "license": "MIT", - "workspaces": [ - "docs", - "benchmarks" - ] - }, "node_modules/esbuild": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", @@ -20856,16 +19948,6 @@ "dev": true, "license": "MIT" }, - "node_modules/good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", - "license": "MIT", - "optional": true, - "dependencies": { - "delegate": "^3.1.2" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -20893,12 +19975,6 @@ "dev": true, "license": "MIT" }, - "node_modules/hachure-fill": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", - "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", - "license": "MIT" - }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -21330,6 +20406,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -21434,6 +20511,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "dev": true, "license": "MIT", "funding": { "type": "github", @@ -21514,15 +20592,6 @@ "node": ">= 0.4" } }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/ipaddr.js": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz", @@ -23092,31 +22161,6 @@ "node": ">=10" } }, - "node_modules/katex": { - "version": "0.16.47", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz", - "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==", - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" - ], - "license": "MIT", - "dependencies": { - "commander": "^8.3.0" - }, - "bin": { - "katex": "cli.js" - } - }, - "node_modules/katex/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -23127,11 +22171,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/khroma": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", - "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -23170,12 +22209,6 @@ "shell-quote": "^1.8.4" } }, - "node_modules/layout-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", - "license": "MIT" - }, "node_modules/less": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/less/-/less-4.4.0.tgz", @@ -23665,12 +22698,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash-es": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", - "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", - "license": "MIT" - }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -23987,19 +23014,6 @@ "dev": true, "license": "ISC" }, - "node_modules/marked": { - "version": "15.0.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", - "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", - "license": "MIT", - "peer": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 18" - } - }, "node_modules/material-icons": { "version": "1.13.14", "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-1.13.14.tgz", @@ -24097,60 +23111,6 @@ "node": ">= 8" } }, - "node_modules/mermaid": { - "version": "11.16.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.16.0.tgz", - "integrity": "sha512-Zvm3kbstgdpvIJPPItlL7fppIZ3kibvc1oZIGxdvk9t6UFz6flv+Jw7FtRGKwfcI8OckmH04LqG6LlS6X4B1pA==", - "license": "MIT", - "dependencies": { - "@braintree/sanitize-url": "^7.1.2", - "@iconify/utils": "^3.0.2", - "@mermaid-js/parser": "^1.2.0", - "@types/d3": "^7.4.3", - "@upsetjs/venn.js": "^2.0.0", - "cytoscape": "^3.33.3", - "cytoscape-cose-bilkent": "^4.1.0", - "cytoscape-fcose": "^2.2.0", - "d3": "^7.9.0", - "d3-sankey": "^0.12.3", - "dagre-d3-es": "7.0.14", - "dayjs": "^1.11.20", - "dompurify": "^3.3.3", - "es-toolkit": "^1.45.1", - "katex": "^0.16.45", - "khroma": "^2.1.0", - "marked": "^16.3.0", - "roughjs": "^4.6.6", - "stylis": "^4.3.6", - "ts-dedent": "^2.2.0", - "uuid": "^11.1.0 || ^12 || ^13 || ^14.0.0" - } - }, - "node_modules/mermaid/node_modules/marked": { - "version": "16.4.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", - "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/mermaid/node_modules/uuid": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.1.tgz", - "integrity": "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist-node/bin/uuid" - } - }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -24539,30 +23499,6 @@ "node": ">=20" } }, - "node_modules/ngx-markdown": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-20.0.0.tgz", - "integrity": "sha512-AtB0EhYlfZbNBFzzhOkqxw5tIX+Z1rLqkRP207ee8c3QHQTn/uRmVVTMwE7LenF2ZOW11Brq/O8h6VfLy9FG+w==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "optionalDependencies": { - "clipboard": "^2.0.11", - "emoji-toolkit": ">= 8.0.0 < 10.0.0", - "katex": "^0.16.0", - "mermaid": ">= 10.6.0 < 12.0.0", - "prismjs": "^1.30.0" - }, - "peerDependencies": { - "@angular/common": "^20.0.0", - "@angular/core": "^20.0.0", - "@angular/platform-browser": "^20.0.0", - "marked": "^15.0.0", - "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.15.0" - } - }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -25780,12 +24716,6 @@ "node": ">=6" } }, - "node_modules/package-manager-detector": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.7.0.tgz", - "integrity": "sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ==", - "license": "MIT" - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -25934,12 +24864,6 @@ "node": ">= 0.8" } }, - "node_modules/path-data-parser": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", - "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", - "license": "MIT" - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -26167,22 +25091,6 @@ "node": ">=4" } }, - "node_modules/points-on-curve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", - "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", - "license": "MIT" - }, - "node_modules/points-on-path": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", - "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", - "license": "MIT", - "dependencies": { - "path-data-parser": "0.1.0", - "points-on-curve": "0.2.0" - } - }, "node_modules/portfinder": { "version": "1.0.38", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz", @@ -26570,15 +25478,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -27333,12 +26232,6 @@ "node": "*" } }, - "node_modules/robust-predicates": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", - "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", - "license": "Unlicense" - }, "node_modules/rollup": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", @@ -27434,18 +26327,6 @@ "dev": true, "license": "MIT" }, - "node_modules/roughjs": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", - "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", - "license": "MIT", - "dependencies": { - "hachure-fill": "^0.5.2", - "path-data-parser": "^0.1.0", - "points-on-curve": "^0.2.0", - "points-on-path": "^0.2.1" - } - }, "node_modules/run-applescript": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", @@ -27483,12 +26364,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "license": "BSD-3-Clause" - }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -27650,6 +26525,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, "license": "MIT" }, "node_modules/sass": { @@ -28241,13 +27117,6 @@ "dev": true, "license": "MIT" }, - "node_modules/select": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==", - "license": "MIT", - "optional": true - }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -29551,12 +28420,6 @@ "which": "bin/which" } }, - "node_modules/stylis": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz", - "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", - "license": "MIT" - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -29948,17 +28811,11 @@ "dev": true, "license": "MIT" }, - "node_modules/tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", - "license": "MIT", - "optional": true - }, "node_modules/tinyexec": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -30198,15 +29055,6 @@ "node": ">=8.10.0" } }, - "node_modules/ts-dedent": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.3.0.tgz", - "integrity": "sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==", - "license": "MIT", - "engines": { - "node": ">=6.10" - } - }, "node_modules/ts-loader": { "version": "9.6.2", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.6.2.tgz", diff --git a/package.json b/package.json index 8b7880551..424e84486 100644 --- a/package.json +++ b/package.json @@ -67,12 +67,8 @@ "@ngrx/store-devtools": "~20.1.0", "@ngx-translate/core": "^17.0.0", "date-fns": "^4.1.0", - "katex": "^0.16.21", "material-icons": "^1.13.12", - "mermaid": "^11.15.0", - "ngx-markdown": "20.0.0", "pdfjs-dist": "5.1.91", - "prismjs": "^1.30.0", "rxjs": "7.8.2", "tslib": "2.8.1", "zone.js": "0.15.0" diff --git a/projects/aca-content/assets/app.extensions.json b/projects/aca-content/assets/app.extensions.json index 539df36b1..4e9e2f8c0 100644 --- a/projects/aca-content/assets/app.extensions.json +++ b/projects/aca-content/assets/app.extensions.json @@ -62,16 +62,6 @@ } } ], - "icons": [ - { - "id": "adf:three_magic_stars_ai", - "value": "./assets/images/three-magic-stars-ai.svg" - }, - { - "id": "adf:colored-stars-ai", - "value": "./assets/images/colored-stars-ai.svg" - } - ], "create": [ { "id": "app.create.folder", @@ -229,6 +219,18 @@ "component": "app.search.navbar" } ] + }, + { + "id": "app.navbar.tertiary", + "items": [ + { + "id": "app.knowledgeDiscovery.sidenav", + "component": "app.knowledgeDiscovery.sidenav", + "rules": { + "visible": "app.isKnowledgeDiscoveryUrlPresent" + } + } + ] } ], "toolbar": [ @@ -833,22 +835,6 @@ } } ] - }, - { - "id": "app.toolbar.ai.search", - "order": 0, - "title": "KNOWLEDGE_RETRIEVAL.SEARCH.AGENTS_BUTTON.TITLE", - "component": "app.toolbar.ai.agents-button", - "type": "custom", - "rules": { - "visible": "app.selection.displayedKnowledgeRetrievalButton" - }, - "actions": { - "click": "app.action.toggle-ai-search-input.execute" - }, - "data": { - "trigger": "TOGGLE_AI_SEARCH_INPUT" - } } ], "contextMenu": [ diff --git a/projects/aca-content/assets/i18n/en.json b/projects/aca-content/assets/i18n/en.json index f0bb99139..b7355f520 100644 --- a/projects/aca-content/assets/i18n/en.json +++ b/projects/aca-content/assets/i18n/en.json @@ -739,40 +739,9 @@ } }, "KNOWLEDGE_RETRIEVAL": { - "SEARCH": { - "RESULTS_PAGE": { - "QUERY_INPUT_PLACEHOLDER": "Would you like to ask anything else?", - "REFERENCED_DOCUMENTS_HEADER": "Referenced documents", - "REGENERATION_BUTTON_LABEL": "Regenerate", - "COPY_BUTTON_LABEL": "Copy", - "COPY_MESSAGE": "Copied response to clipboard", - "RELOAD_REFERENCES_BUTTON_LABEL": "Reload" - }, - "AGENTS_BUTTON": { - "LABEL": "Ask Discovery", - "TITLE": "Knowledge Retrieval" - }, - "SEARCH_INPUT": { - "ASK_BUTTON_LABEL": "Ask", - "DEFAULT_PLACEHOLDER": "Please ask your question with as much detail as possible...", - "HIDE_INPUT": "Hide input", - "HIDE_ANSWER": "Hide answer" - }, - "ERRORS": { - "AGENTS_FETCHING": "Error while fetching agents.", - "HX_INSIGHT_URL_FETCHING": "Error while fetching HX Insight URL.", - "LOADING_ERROR": "Hmm... something seems to have gone wrong.", - "PAGE_NOT_AVAILABLE_ERROR": "Page is not available for these conditions.", - "REFERENCES_LOADING_ERROR": "Something went wrong while loading the references." - }, - "DISCARD_CHANGES": { - "WARNING": "Warning!", - "ASK_AI": "Ask AI", - "DO_NOT_SHOW_MESSAGE": "Don't show this message again", - "DISCARD_CONVERSATION": "Discard Conversation", - "CONVERSATION_DISCARDED": "This conversation will be discarded", - "LOSE_RESPONSE": "By asking another question you will lose your previous response" - } + "SIDENAV": { + "TITLE": "AI Agents", + "DISCOVERY": "Discovery" } } } diff --git a/projects/aca-content/assets/images/colored-stars-ai.svg b/projects/aca-content/assets/images/colored-stars-ai.svg deleted file mode 100644 index bf397f933..000000000 --- a/projects/aca-content/assets/images/colored-stars-ai.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/projects/aca-content/assets/images/three-magic-stars-ai.svg b/projects/aca-content/assets/images/three-magic-stars-ai.svg deleted file mode 100644 index 992394ec0..000000000 --- a/projects/aca-content/assets/images/three-magic-stars-ai.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/projects/aca-content/karma.conf.js b/projects/aca-content/karma.conf.js index 164a774f0..ea8c3bf48 100644 --- a/projects/aca-content/karma.conf.js +++ b/projects/aca-content/karma.conf.js @@ -10,12 +10,6 @@ module.exports = function (config) { coverageReporter: { ...baseConfig.coverageReporter, dir: join(__dirname, '../../coverage/aca-content'), - }, - files: [ - '../../node_modules/katex/dist/katex.min.js', - '../../node_modules/katex/dist/contrib/auto-render.min.js', - '../../node_modules/katex/dist/katex.min.css', - '../../node_modules/mermaid/dist/mermaid.min.js' - ] + } }); }; diff --git a/projects/aca-content/ng-package.json b/projects/aca-content/ng-package.json index 9902af551..ddb6ac172 100644 --- a/projects/aca-content/ng-package.json +++ b/projects/aca-content/ng-package.json @@ -5,7 +5,6 @@ "styleIncludePaths": ["projects/aca-content/src/lib/ui"], "entryFile": "src/public-api.ts" }, - "allowedNonPeerDependencies": ["ngx-markdown"], "assets": [ { "glob": "**/*", diff --git a/projects/aca-content/package.json b/projects/aca-content/package.json index c4b61a980..39f5a12a1 100644 --- a/projects/aca-content/package.json +++ b/projects/aca-content/package.json @@ -16,8 +16,7 @@ "zone.js": "^0.14.0 || ^0.15.0" }, "dependencies": { - "tslib": ">=2.3.0", - "ngx-markdown": ">=20.0.0" + "tslib": ">=2.3.0" }, "publishConfig": { "access": "public" diff --git a/projects/aca-content/src/lib/aca-content.module.ts b/projects/aca-content/src/lib/aca-content.module.ts index 44cbc20ac..c4b79b005 100644 --- a/projects/aca-content/src/lib/aca-content.module.ts +++ b/projects/aca-content/src/lib/aca-content.module.ts @@ -67,7 +67,7 @@ import { UserMenuComponent } from './components/sidenav/user-menu/user-menu.comp import { MAT_DIALOG_DEFAULT_OPTIONS } from '@angular/material/dialog'; import { SearchResultsRowComponent } from './components/search/search-results-row/search-results-row.component'; import { BulkActionsDropdownComponent } from './components/bulk-actions-dropdown/bulk-actions-dropdown.component'; -import { AgentsButtonComponent } from './components/knowledge-retrieval/search-ai/agents-button/agents-button.component'; +import { KnowledgeDiscoverySidenavComponent } from './components/knowledge-discovery/knowledge-discovery-sidenav.component'; import { SaveSearchSidenavComponent } from './components/search/search-save/sidenav/save-search-sidenav.component'; import { IsFeatureSupportedInCurrentAcsPipe } from './pipes/is-feature-supported.pipe'; @@ -104,7 +104,6 @@ import { IsFeatureSupportedInCurrentAcsPipe } from './pipes/is-feature-supported 'app.toolbar.toggleFavorite': ToggleFavoriteComponent, 'app.toolbar.toggleFavoriteLibrary': ToggleFavoriteLibraryComponent, 'app.toolbar.toggleJoinLibrary': ToggleJoinLibraryButtonComponent, - 'app.toolbar.ai.agents-button': AgentsButtonComponent, 'app.menu.toggleJoinLibrary': ToggleJoinLibraryMenuComponent, 'app.bulk-actions-dropdown': BulkActionsDropdownComponent, 'app.shared-link.toggleSharedLink': ToggleSharedComponent, @@ -123,7 +122,8 @@ import { IsFeatureSupportedInCurrentAcsPipe } from './pipes/is-feature-supported 'app.notification-center': NotificationHistoryComponent, 'app.user.menu': UserMenuComponent, 'app.search.columns.name': SearchResultsRowComponent, - 'app.search.navbar': SaveSearchSidenavComponent + 'app.search.navbar': SaveSearchSidenavComponent, + 'app.knowledgeDiscovery.sidenav': KnowledgeDiscoverySidenavComponent }, evaluators: { canToggleJoinLibrary: rules.canToggleJoinLibrary, @@ -152,7 +152,6 @@ import { IsFeatureSupportedInCurrentAcsPipe } from './pipes/is-feature-supported 'app.selection.hasLibraryRole': rules.hasLibraryRole, 'app.selection.folder': rules.hasFolderSelected, 'app.selection.folder.canUpdate': rules.canUpdateSelectedFolder, - 'app.selection.displayedKnowledgeRetrievalButton': rules.canDisplayKnowledgeRetrievalButton, 'app.selection.isCheckedOut': rules.isCheckedOut, 'app.selection.isNodeLink': rules.isNodeLink, @@ -170,7 +169,8 @@ import { IsFeatureSupportedInCurrentAcsPipe } from './pipes/is-feature-supported 'app.isContentServiceEnabled': rules.isContentServiceEnabled, 'app.areTagsEnabled': rules.areTagsEnabled, 'app.areCategoriesEnabled': rules.areCategoriesEnabled, - 'app.isSSOEnabled': rules.isSSOEnabled + 'app.isSSOEnabled': rules.isSSOEnabled, + 'app.isKnowledgeDiscoveryUrlPresent': rules.isKnowledgeDiscoveryUrlPresent } }), IsFeatureSupportedInCurrentAcsPipe diff --git a/projects/aca-content/src/lib/aca-content.routes.ts b/projects/aca-content/src/lib/aca-content.routes.ts index 97deadfa2..f1abef263 100644 --- a/projects/aca-content/src/lib/aca-content.routes.ts +++ b/projects/aca-content/src/lib/aca-content.routes.ts @@ -27,8 +27,8 @@ import { LibrariesComponent } from './components/libraries/libraries.component'; import { FavoriteLibrariesComponent } from './components/favorite-libraries/favorite-libraries.component'; import { SearchResultsComponent } from './components/search/search-results/search-results.component'; import { SearchLibrariesResultsComponent } from './components/search/search-libraries-results/search-libraries-results.component'; -import { AppSharedRuleGuard, ExtensionRoute, ExtensionsDataLoaderGuard, GenericErrorComponent, PluginEnabledGuard } from '@alfresco/aca-shared'; -import { AuthGuard, UnsavedChangesGuard } from '@alfresco/adf-core'; +import { AppSharedRuleGuard, ExtensionRoute, ExtensionsDataLoaderGuard, GenericErrorComponent } from '@alfresco/aca-shared'; +import { AuthGuard } from '@alfresco/adf-core'; import { FavoritesComponent } from './components/favorites/favorites.component'; import { RecentFilesComponent } from './components/recent-files/recent-files.component'; import { SharedFilesComponent } from './components/shared-files/shared-files.component'; @@ -40,7 +40,6 @@ import { Data, Route, Routes } from '@angular/router'; import { SharedLinkViewComponent } from './components/shared-link-view/shared-link-view.component'; import { TrashcanComponent } from './components/trashcan/trashcan.component'; import { ShellLayoutComponent } from '@alfresco/adf-core/shell'; -import { SearchAiResultsComponent } from './components/knowledge-retrieval/search-ai/search-ai-results/search-ai-results.component'; import { SavedSearchesSmartListComponent } from './components/search/search-save/list/smart-list/saved-searches-smart-list.component'; import { LibraryListComponent } from './components/library-list/library-list.component'; import { RepositoryViewComponent } from './components/repository-view/repository-view.component'; @@ -410,21 +409,6 @@ export const CONTENT_LAYOUT_ROUTES: Route[] = [ } ] }, - { - path: 'knowledge-retrieval', - canDeactivate: [UnsavedChangesGuard], - canActivate: [PluginEnabledGuard], - data: { - plugin: 'plugins.knowledgeRetrievalEnabled' - }, - children: [ - { - path: '', - component: SearchAiResultsComponent - }, - ...createViewRoutes('knowledge-retrieval') - ] - }, { path: 'saved-searches', children: [ diff --git a/projects/aca-content/src/lib/components/favorites/favorites.component.html b/projects/aca-content/src/lib/components/favorites/favorites.component.html index 769665be2..417969985 100644 --- a/projects/aca-content/src/lib/components/favorites/favorites.component.html +++ b/projects/aca-content/src/lib/components/favorites/favorites.component.html @@ -1,16 +1,11 @@
- - -
-

+
+

{{ (selectedRowItemsCount < 1 ? 'APP.BROWSE.FAVORITES.TITLE' : 'APP.HEADER.SELECTED') | translate: { count: selectedRowItemsCount } }}

- -
- + +

diff --git a/projects/aca-content/src/lib/components/favorites/favorites.component.ts b/projects/aca-content/src/lib/components/favorites/favorites.component.ts index 94547b033..452b5fd93 100644 --- a/projects/aca-content/src/lib/components/favorites/favorites.component.ts +++ b/projects/aca-content/src/lib/components/favorites/favorites.component.ts @@ -46,7 +46,6 @@ import { import { DocumentListDirective } from '../../directives/document-list.directive'; import { TranslatePipe } from '@ngx-translate/core'; import { DocumentListComponent } from '@alfresco/adf-content-services'; -import { SearchAiInputContainerComponent } from '../knowledge-retrieval/search-ai/search-ai-input-container/search-ai-input-container.component'; @Component({ imports: [ @@ -59,7 +58,6 @@ import { SearchAiInputContainerComponent } from '../knowledge-retrieval/search-a PageLayoutComponent, TranslatePipe, ToolbarComponent, - SearchAiInputContainerComponent, EmptyContentComponent, DynamicColumnComponent, DocumentListComponent, diff --git a/projects/aca-content/src/lib/components/files/files.component.html b/projects/aca-content/src/lib/components/files/files.component.html index 2516c362b..495f78dc4 100644 --- a/projects/aca-content/src/lib/components/files/files.component.html +++ b/projects/aca-content/src/lib/components/files/files.component.html @@ -1,18 +1,13 @@
- - -
- - -
-
+
+ + +
diff --git a/projects/aca-content/src/lib/components/files/files.component.ts b/projects/aca-content/src/lib/components/files/files.component.ts index 371982e79..e2b10bc12 100644 --- a/projects/aca-content/src/lib/components/files/files.component.ts +++ b/projects/aca-content/src/lib/components/files/files.component.ts @@ -59,7 +59,6 @@ import { CommonModule } from '@angular/common'; import { TranslatePipe } from '@ngx-translate/core'; import { DocumentListDirective } from '../../directives/document-list.directive'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { SearchAiInputContainerComponent } from '../knowledge-retrieval/search-ai/search-ai-input-container/search-ai-input-container.component'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { HttpErrorResponse } from '@angular/common/http'; import { extractFiltersFromEncodedQuery } from '../../utils/aca-search-utils'; @@ -77,7 +76,6 @@ import { extractFiltersFromEncodedQuery } from '../../utils/aca-search-utils'; PaginationDirective, PageLayoutComponent, ToolbarComponent, - SearchAiInputContainerComponent, DynamicColumnComponent, BreadcrumbComponent, UploadDragAreaComponent, diff --git a/projects/aca-content/src/lib/components/knowledge-discovery/knowledge-discovery-sidenav.component.html b/projects/aca-content/src/lib/components/knowledge-discovery/knowledge-discovery-sidenav.component.html new file mode 100644 index 000000000..bed30dcae --- /dev/null +++ b/projects/aca-content/src/lib/components/knowledge-discovery/knowledge-discovery-sidenav.component.html @@ -0,0 +1 @@ + diff --git a/projects/aca-content/src/lib/components/knowledge-discovery/knowledge-discovery-sidenav.component.spec.ts b/projects/aca-content/src/lib/components/knowledge-discovery/knowledge-discovery-sidenav.component.spec.ts new file mode 100644 index 000000000..e9ab65c6e --- /dev/null +++ b/projects/aca-content/src/lib/components/knowledge-discovery/knowledge-discovery-sidenav.component.spec.ts @@ -0,0 +1,66 @@ +/*! + * Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved. + * + * Alfresco Example Content Application + * + * This file is part of the Alfresco Example Content Application. + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * + * The Alfresco Example Content Application is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * The Alfresco Example Content Application is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * from Hyland Software. If not, see . + */ + +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { KnowledgeDiscoverySidenavComponent } from './knowledge-discovery-sidenav.component'; +import { AppTestingModule } from '../../testing/app-testing.module'; +import { AppSettingsService } from '@alfresco/aca-shared'; + +describe('KnowledgeDiscoverySidenavComponent', () => { + let fixture: ComponentFixture; + let component: KnowledgeDiscoverySidenavComponent; + let appSettings: AppSettingsService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [AppTestingModule, KnowledgeDiscoverySidenavComponent] + }); + + appSettings = TestBed.inject(AppSettingsService); + fixture = TestBed.createComponent(KnowledgeDiscoverySidenavComponent); + component = fixture.componentInstance; + }); + + it('should set item with children using URL from config', () => { + spyOnProperty(appSettings, 'knowledgeDiscoveryUrl', 'get').and.returnValue('https://discovery.example.com'); + + fixture.detectChanges(); + + expect(component.item).toEqual({ + id: 'app.knowledgeDiscovery.sidenav', + icon: '', + title: 'KNOWLEDGE_RETRIEVAL.SIDENAV.TITLE', + route: '/', + children: [ + { + id: 'app.knowledgeDiscovery.sidenav.discovery', + icon: '', + title: 'KNOWLEDGE_RETRIEVAL.SIDENAV.DISCOVERY', + route: 'https://discovery.example.com', + url: 'https://discovery.example.com' + } + ] + }); + }); +}); diff --git a/projects/aca-content/src/lib/services/search-ai-navigation.service.ts b/projects/aca-content/src/lib/components/knowledge-discovery/knowledge-discovery-sidenav.component.ts similarity index 51% rename from projects/aca-content/src/lib/services/search-ai-navigation.service.ts rename to projects/aca-content/src/lib/components/knowledge-discovery/knowledge-discovery-sidenav.component.ts index a4b2850b8..c7e17a38d 100644 --- a/projects/aca-content/src/lib/services/search-ai-navigation.service.ts +++ b/projects/aca-content/src/lib/components/knowledge-discovery/knowledge-discovery-sidenav.component.ts @@ -22,33 +22,38 @@ * from Hyland Software. If not, see . */ -import { Injectable, inject } from '@angular/core'; -import { Params, Router } from '@angular/router'; -import { SearchAiService } from '@alfresco/adf-content-services'; +import { Component, inject, OnInit, ViewEncapsulation } from '@angular/core'; +import { NavBarLinkRef } from '@alfresco/adf-extensions'; +import { ExpandMenuComponent } from '../sidenav/components/expand-menu.component'; +import { AppSettingsService } from '@alfresco/aca-shared'; -@Injectable({ providedIn: 'root' }) -export class SearchAiNavigationService { - private readonly router = inject(Router); - private readonly searchAiService = inject(SearchAiService); +@Component({ + selector: 'aca-knowledge-discovery-sidenav', + imports: [ExpandMenuComponent], + templateUrl: './knowledge-discovery-sidenav.component.html', + encapsulation: ViewEncapsulation.None +}) +export class KnowledgeDiscoverySidenavComponent implements OnInit { + private readonly appSettings = inject(AppSettingsService); - private readonly knowledgeRetrievalRoute = '/knowledge-retrieval'; + item: NavBarLinkRef; - private previousRoute = ''; - - navigateToPreviousRouteOrCloseInput(): void { - if (this.router.url.includes(this.knowledgeRetrievalRoute)) { - void this.router.navigateByUrl(this.previousRoute || '/personal-files'); - } else { - this.searchAiService.updateSearchAiInputState({ - active: false - }); - } - } - - navigateToSearchAi(queryParams: Params): void { - if (!this.router.url.includes(this.knowledgeRetrievalRoute)) { - this.previousRoute = this.router.url; - } - void this.router.navigate([this.knowledgeRetrievalRoute], { queryParams }); + ngOnInit(): void { + const url = this.appSettings.knowledgeDiscoveryUrl; + this.item = { + id: 'app.knowledgeDiscovery.sidenav', + icon: '', + title: 'KNOWLEDGE_RETRIEVAL.SIDENAV.TITLE', + route: '/', + children: [ + { + id: 'app.knowledgeDiscovery.sidenav.discovery', + icon: '', + title: 'KNOWLEDGE_RETRIEVAL.SIDENAV.DISCOVERY', + route: url, + url + } + ] + }; } } diff --git a/projects/aca-content/src/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.html b/projects/aca-content/src/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.html deleted file mode 100644 index 182bcaff9..000000000 --- a/projects/aca-content/src/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - -
- - - {{ agent.name }} - -
-
-
-
-
diff --git a/projects/aca-content/src/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.scss b/projects/aca-content/src/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.scss deleted file mode 100644 index f3aa6cc7a..000000000 --- a/projects/aca-content/src/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.scss +++ /dev/null @@ -1,74 +0,0 @@ -aca-agents-button.aca-agents-button { - height: 32px; - display: block; - - button { - &.aca-agents-menu-button { - display: flex; - align-items: end; - - &.aca-agents-button-menu-trigger { - height: auto; - cursor: pointer; - border: none; - background: transparent; - width: max-content; - padding: 0 4px 0 0; - } - - .aca-agents-button-icon { - display: flex; - align-self: baseline; - - svg { - height: 32px; - width: 32px; - position: absolute; - margin-left: -21px; - } - } - } - } -} - -.aca-agents-button-menu { - padding-top: 2px; - padding-bottom: 1px; - - .aca-agents-button-menu-list { - margin-left: -6px; - padding-top: 0; - padding-bottom: 0; - - &-agent { - height: 40px; - - &:not(:last-child) { - margin-bottom: 2px; - } - - &-content { - display: flex; - align-items: center; - - &-name { - width: 120px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - } - - adf-avatar { - margin-right: 12px; - margin-bottom: 2px; - padding-left: 1px; - padding-top: 1px; - - .adf-avatar__image { - cursor: pointer; - } - } - } - } -} diff --git a/projects/aca-content/src/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.spec.ts b/projects/aca-content/src/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.spec.ts deleted file mode 100644 index be90318ae..000000000 --- a/projects/aca-content/src/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.spec.ts +++ /dev/null @@ -1,470 +0,0 @@ -/*! - * Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved. - * - * Alfresco Example Content Application - * - * This file is part of the Alfresco Example Content Application. - * If the software was purchased under a paid Alfresco license, the terms of - * the paid license agreement will prevail. Otherwise, the software is - * provided under the following open source license terms: - * - * The Alfresco Example Content Application is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The Alfresco Example Content Application is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * from Hyland Software. If not, see . - */ - -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { AgentsButtonComponent } from './agents-button.component'; -import { AgentService, SearchAiService } from '@alfresco/adf-content-services'; -import { Subject } from 'rxjs'; -import { By } from '@angular/platform-browser'; -import { MockStore, provideMockStore } from '@ngrx/store/testing'; -import { getAppSelection, SearchAiActionTypes } from '@alfresco/aca-shared/store'; -import { AvatarComponent, NoopTranslateModule, NotificationService } from '@alfresco/adf-core'; -import { SelectionState } from '@alfresco/adf-extensions'; -import { MatMenu, MatMenuPanel, MatMenuTrigger } from '@angular/material/menu'; -import { HarnessLoader } from '@angular/cdk/testing'; -import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; -import { MatSelectionListHarness } from '@angular/material/list/testing'; -import { MatMenuHarness } from '@angular/material/menu/testing'; -import { MatSelectionList } from '@angular/material/list'; -import { MatSnackBarRef } from '@angular/material/snack-bar'; -import { ChangeDetectorRef } from '@angular/core'; -import { Agent, KnowledgeRetrievalConfigEntry } from '@alfresco/js-api'; -import { MatIconTestingModule } from '@angular/material/icon/testing'; - -describe('AgentsButtonComponent', () => { - let component: AgentsButtonComponent; - let fixture: ComponentFixture; - let agents$: Subject; - let agentsMock: Agent[]; - let checkSearchAvailabilitySpy: jasmine.Spy<(selectedNodesState: SelectionState, maxSelectedNodes?: number) => string>; - let selectionState: SelectionState; - let store: MockStore; - let config$: Subject; - - const knowledgeRetrievalUrl = 'some url'; - - const getMenu = (): MatMenu => fixture.debugElement.query(By.directive(MatMenu)).componentInstance; - - const getAgentsButton = (): HTMLButtonElement => fixture.debugElement.query(By.css('.aca-agents-menu-button'))?.nativeElement; - - const runButtonActions = (eventName: string): void => { - let event: Event; - let notificationService: NotificationService; - let message: string; - - beforeEach(() => { - config$.next({ - entry: { - knowledgeRetrievalUrl - } - }); - config$.complete(); - event = - eventName === 'mouseup' - ? new MouseEvent(eventName) - : new KeyboardEvent(eventName, { - key: 'Enter' - }); - agents$.next(agentsMock); - agents$.complete(); - spyOn(window, 'open'); - notificationService = TestBed.inject(NotificationService); - spyOn(notificationService, 'showError'); - message = 'Some message'; - }); - - const getMenuTrigger = (): MatMenuPanel => fixture.debugElement.query(By.directive(MatMenuTrigger)).injector.get(MatMenuTrigger).menu; - - const testButtonActions = (): void => { - it('should not display notification if checkSearchAvailability from SearchAiService returns empty message', () => { - message = ''; - checkSearchAvailabilitySpy.and.returnValue(message); - - getAgentsButton().dispatchEvent(event); - expect(notificationService.showError).not.toHaveBeenCalled(); - }); - - it('should disable menu triggering if checkSearchAvailability from SearchAiService returns message', () => { - checkSearchAvailabilitySpy.and.returnValue('Some message'); - - getAgentsButton().dispatchEvent(event); - fixture.detectChanges(); - expect(getMenuTrigger()).toBeNull(); - }); - }; - - describe('with selected nodes', () => { - beforeEach(() => { - selectionState.isEmpty = false; - }); - - it('should display notification if checkSearchAvailability from SearchAiService returns message', () => { - checkSearchAvailabilitySpy.and.returnValue(message); - - getAgentsButton().dispatchEvent(event); - expect(notificationService.showError).toHaveBeenCalledWith(message); - }); - - testButtonActions(); - - it('should enable menu triggering if checkSearchAvailability from SearchAiService returns empty message', () => { - checkSearchAvailabilitySpy.and.returnValue(''); - - getAgentsButton().dispatchEvent(event); - fixture.detectChanges(); - const menuTrigger = getMenuTrigger(); - expect(menuTrigger).toBeTruthy(); - expect(menuTrigger).toBe(getMenu()); - }); - - it('should call checkSearchAvailability from SearchAiService with correct parameter', () => { - getAgentsButton().dispatchEvent(event); - - expect(checkSearchAvailabilitySpy).toHaveBeenCalledWith(selectionState); - }); - - it('should not open new tab for url loaded from config', () => { - getAgentsButton().dispatchEvent(event); - - expect(window.open).not.toHaveBeenCalled(); - }); - }); - - describe('without selected nodes', () => { - it('should not display notification if checkSearchAvailability from SearchAiService returns message', () => { - checkSearchAvailabilitySpy.and.returnValue(message); - - getAgentsButton().dispatchEvent(event); - expect(notificationService.showError).not.toHaveBeenCalled(); - }); - - testButtonActions(); - - it('should disable menu triggering if checkSearchAvailability from SearchAiService returns empty message', () => { - checkSearchAvailabilitySpy.and.returnValue(''); - - getAgentsButton().dispatchEvent(event); - fixture.detectChanges(); - expect(getMenuTrigger()).toBeNull(); - }); - - it('should not call checkSearchAvailability from SearchAiService', () => { - getAgentsButton().dispatchEvent(event); - - expect(checkSearchAvailabilitySpy).not.toHaveBeenCalled(); - }); - - it('should open new tab for url loaded from config', () => { - getAgentsButton().dispatchEvent(event); - - expect(window.open).toHaveBeenCalledWith(knowledgeRetrievalUrl); - }); - }); - }; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [NoopTranslateModule, MatIconTestingModule, AgentsButtonComponent], - providers: [provideMockStore({})] - }); - - fixture = TestBed.createComponent(AgentsButtonComponent); - component = fixture.componentInstance; - store = TestBed.inject(MockStore); - agents$ = new Subject(); - spyOn(TestBed.inject(AgentService), 'getAgents').and.returnValue(agents$); - agentsMock = [ - { - id: '1', - name: 'HR Agent', - description: 'Test 1', - avatarUrl: undefined - }, - { - id: '2', - name: 'Policy Agent', - description: 'Test 2', - avatarUrl: undefined - } - ]; - const searchAiService = TestBed.inject(SearchAiService); - checkSearchAvailabilitySpy = spyOn(searchAiService, 'checkSearchAvailability'); - config$ = new Subject(); - spyOn(searchAiService, 'getConfig').and.returnValue(config$); - selectionState = { - nodes: [], - isEmpty: true, - count: 0, - libraries: [] - }; - store.overrideSelector(getAppSelection, selectionState); - fixture.detectChanges(); - }); - - afterEach(() => { - store.resetSelectors(); - }); - - describe('Button', () => { - let notificationServiceSpy: jasmine.Spy<(message: string) => MatSnackBarRef>; - - beforeEach(() => { - const notificationService = TestBed.inject(NotificationService); - notificationServiceSpy = spyOn(notificationService, 'showError').and.callThrough(); - }); - - describe('loaded config', () => { - beforeEach(() => { - config$.next({ - entry: { - knowledgeRetrievalUrl - } - }); - config$.complete(); - }); - - it('should be rendered if any agentsMock are loaded', () => { - agents$.next(agentsMock); - agents$.complete(); - fixture.detectChanges(); - - expect(getAgentsButton()).toBeTruthy(); - }); - - it('should get agentsMock on component init', () => { - agents$.next(agentsMock); - agents$.complete(); - component.ngOnInit(); - - expect(component.initialsByAgentId).toEqual({ 1: 'HA', 2: 'PA' }); - expect(component.agents).toEqual(agentsMock); - expect(notificationServiceSpy).not.toHaveBeenCalled(); - }); - - it('should run detectChanges when getting the agentsMock', () => { - const changeDetectorRef2 = fixture.debugElement.injector.get(ChangeDetectorRef); - const detectChangesSpy = spyOn(changeDetectorRef2.constructor.prototype, 'detectChanges'); - - component.ngOnInit(); - agents$.next(agentsMock); - - expect(detectChangesSpy).toHaveBeenCalled(); - }); - - it('should show notification error on getAgents error', () => { - agents$.error('error'); - component.ngOnInit(); - - expect(component.agents).toEqual([]); - expect(component.initialsByAgentId).toEqual({}); - expect(notificationServiceSpy).toHaveBeenCalledWith('KNOWLEDGE_RETRIEVAL.SEARCH.ERRORS.AGENTS_FETCHING'); - }); - - it('should not be rendered if none agent is loaded', () => { - agentsMock = []; - agents$.next(agentsMock); - agents$.complete(); - - fixture.detectChanges(); - expect(getAgentsButton()).toBeFalsy(); - }); - - it('should have correct label', () => { - agents$.next(agentsMock); - agents$.complete(); - fixture.detectChanges(); - - expect(getAgentsButton().textContent.trim()).toBe('KNOWLEDGE_RETRIEVAL.SEARCH.AGENTS_BUTTON.LABEL'); - }); - - it('should contain stars icon', () => { - agents$.next(agentsMock); - agents$.complete(); - fixture.detectChanges(); - - expect(fixture.debugElement.query(By.css('.aca-agents-menu-button adf-icon')).componentInstance.value).toBe('adf:colored-stars-ai'); - }); - }); - - describe('loaded config with error', () => { - beforeEach(() => { - config$.error('error'); - config$.complete(); - }); - - it('should not be rendered', () => { - agents$.next(agentsMock); - agents$.complete(); - fixture.detectChanges(); - - expect(getAgentsButton()).toBeFalsy(); - }); - - it('should show notification error', () => { - agents$.next(agentsMock); - agents$.complete(); - component.ngOnInit(); - - expect(component.hxInsightUrl).toBeUndefined(); - expect(notificationServiceSpy).toHaveBeenCalledWith('KNOWLEDGE_RETRIEVAL.SEARCH.ERRORS.HX_INSIGHT_URL_FETCHING'); - }); - }); - }); - - const buttonKeyboardActions = (eventName: string): void => { - describe(`Button action - ${eventName} event`, () => { - runButtonActions(eventName); - }); - }; - - ['mouseup', 'keydown'].forEach((eventName) => { - buttonKeyboardActions(eventName); - }); - - describe('Agents menu', () => { - let loader: HarnessLoader; - - const prepareData = (agents: Agent[]): void => { - config$.next({ - entry: { - knowledgeRetrievalUrl - } - }); - config$.complete(); - loader = TestbedHarnessEnvironment.loader(fixture); - agents$.next(agents); - selectionState.isEmpty = false; - checkSearchAvailabilitySpy.and.returnValue(''); - const button = getAgentsButton(); - button.dispatchEvent(new MouseEvent('mouseup')); - fixture.detectChanges(); - button.click(); - fixture.detectChanges(); - }; - - const getAvatar = (agentId: string): AvatarComponent => - fixture.debugElement.query(By.css(`[data-automation-id=aca-agents-button-agent-${agentId}]`)).query(By.directive(AvatarComponent)) - .componentInstance; - - describe('Agents position', () => { - it('should have assigned before to xPosition', () => { - prepareData(agentsMock); - agents$.complete(); - expect(getMenu().xPosition).toBe('before'); - }); - }); - - describe('Agents multi words name', () => { - beforeEach(() => { - prepareData(agentsMock); - agents$.complete(); - }); - - const getAgentsListHarness = async (): Promise => - (await loader.getHarness(MatMenuHarness)).getHarness(MatSelectionListHarness); - - const selectAgent = async (): Promise => - (await getAgentsListHarness()).selectItems({ - fullText: 'PA Policy Agent' - }); - - const getAgentsList = (): MatSelectionList => fixture.debugElement.query(By.directive(MatSelectionList)).componentInstance; - - it('should deselect selected agent after selecting other', async () => { - component.data = { - trigger: SearchAiActionTypes.ToggleAiSearchInput - }; - const selectionList = getAgentsList(); - spyOn(selectionList, 'deselectAll'); - await selectAgent(); - - expect(selectionList.deselectAll).toHaveBeenCalled(); - }); - - it('should dispatch on store selected agent', async () => { - component.data = { - trigger: SearchAiActionTypes.ToggleAiSearchInput - }; - spyOn(store, 'dispatch'); - await selectAgent(); - - expect(store.dispatch).toHaveBeenCalledWith( - jasmine.objectContaining({ - type: SearchAiActionTypes.ToggleAiSearchInput, - agentId: '2' - }) - ); - }); - - it('should disallow selecting multiple agentsMock', () => { - expect(getAgentsList().multiple).toBeFalse(); - }); - - it('should have hidden single selection indicator', () => { - expect(getAgentsList().hideSingleSelectionIndicator).toBeTrue(); - }); - - it('should display option for each agent', async () => { - const agents = await (await getAgentsListHarness()).getItems(); - expect(agents.length).toBe(2); - expect(await agents[0].getFullText()).toBe('HA HR Agent'); - expect(await agents[1].getFullText()).toBe('PA Policy Agent'); - }); - - it('should display avatar for each agent', () => { - expect(getAvatar('1')).toBeTruthy(); - expect(getAvatar('2')).toBeTruthy(); - }); - - it('should assign correct initials to each avatar for each agent with double section name', () => { - expect(getAvatar('1').initials).toBe('HA'); - expect(getAvatar('2').initials).toBe('PA'); - }); - - it('should assign correct src to each avatar', () => { - agentsMock[0].avatarUrl = 'some-url-1'; - agentsMock[1].avatarUrl = 'some-url-2'; - - fixture.detectChanges(); - expect(getAvatar('1').src).toBe('some-url-1'); - expect(getAvatar('2').src).toBe('some-url-2'); - }); - }); - - describe('Agents single word name', () => { - it('should assign correct initials to each avatar for each agent with single section name', () => { - agentsMock = [ - { - id: '1', - name: 'HR Agent', - description: 'Test 1', - avatarUrl: undefined - }, - { - id: '2', - name: 'Policy Agent', - description: 'Test 2', - avatarUrl: undefined - } - ]; - agentsMock[0].name = 'Adam'; - agentsMock[1].name = 'Bob'; - prepareData(agentsMock); - - expect(getAvatar('1').initials).toBe('A'); - expect(getAvatar('2').initials).toBe('B'); - }); - }); - }); -}); diff --git a/projects/aca-content/src/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.ts b/projects/aca-content/src/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.ts deleted file mode 100644 index bfffd1027..000000000 --- a/projects/aca-content/src/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.ts +++ /dev/null @@ -1,136 +0,0 @@ -/*! - * Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved. - * - * Alfresco Example Content Application - * - * This file is part of the Alfresco Example Content Application. - * If the software was purchased under a paid Alfresco license, the terms of - * the paid license agreement will prevail. Otherwise, the software is - * provided under the following open source license terms: - * - * The Alfresco Example Content Application is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The Alfresco Example Content Application is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * from Hyland Software. If not, see . - */ - -import { ChangeDetectorRef, Component, DestroyRef, inject, Input, OnInit, ViewEncapsulation } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { SelectionState } from '@alfresco/adf-extensions'; -import { Store } from '@ngrx/store'; -import { AppStore, getAppSelection } from '@alfresco/aca-shared/store'; -import { AvatarComponent, IconComponent, NotificationService } from '@alfresco/adf-core'; -import { forkJoin, throwError } from 'rxjs'; -import { catchError, take } from 'rxjs/operators'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatListModule, MatSelectionListChange } from '@angular/material/list'; -import { TranslatePipe, TranslateService } from '@ngx-translate/core'; -import { Agent } from '@alfresco/js-api'; -import { AgentService, SearchAiService } from '@alfresco/adf-content-services'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; - -@Component({ - imports: [CommonModule, MatMenuModule, MatListModule, TranslatePipe, AvatarComponent, IconComponent, MatTooltipModule], - selector: 'aca-agents-button', - templateUrl: './agents-button.component.html', - styleUrls: ['./agents-button.component.scss'], - encapsulation: ViewEncapsulation.None, - host: { class: 'aca-agents-button' } -}) -export class AgentsButtonComponent implements OnInit { - private readonly store = inject>(Store); - private readonly notificationService = inject(NotificationService); - private readonly searchAiService = inject(SearchAiService); - private readonly agentService = inject(AgentService); - private readonly translateService = inject(TranslateService); - private readonly cd = inject(ChangeDetectorRef); - - @Input() - data: { trigger: string }; - - private selectedNodesState: SelectionState; - private _agents: Agent[] = []; - private _disabled = true; - private _initialsByAgentId: { [key: string]: string } = {}; - private _hxInsightUrl: string; - - get agents(): Agent[] { - return this._agents; - } - - get disabled(): boolean { - return this._disabled; - } - - get initialsByAgentId(): { [key: string]: string } { - return this._initialsByAgentId; - } - - get hxInsightUrl(): string { - return this._hxInsightUrl; - } - - private readonly destroyRef = inject(DestroyRef); - - ngOnInit(): void { - this.store - .select(getAppSelection) - .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe((selection) => { - this.selectedNodesState = selection; - }); - forkJoin({ - agents: this.agentService.getAgents().pipe( - take(1), - catchError(() => throwError('KNOWLEDGE_RETRIEVAL.SEARCH.ERRORS.AGENTS_FETCHING')) - ), - config: this.searchAiService.getConfig().pipe(catchError(() => throwError('KNOWLEDGE_RETRIEVAL.SEARCH.ERRORS.HX_INSIGHT_URL_FETCHING'))) - }).subscribe( - (result) => { - this._hxInsightUrl = result.config.entry.knowledgeRetrievalUrl; - this._agents = result.agents; - - this.cd.detectChanges(); - - if (this.agents.length) { - this._initialsByAgentId = this.agents.reduce((initials, agent) => { - const words = agent.name.split(' ').filter((word) => !word.match(/[^a-zA-Z]+/g)); - initials[agent.id] = `${words[0][0]}${words[1]?.[0] || ''}`; - return initials; - }, {}); - } - }, - (error: string) => this.notificationService.showError(this.translateService.instant(error)) - ); - } - - onClick(): void { - if (!this.selectedNodesState.isEmpty) { - const message = this.searchAiService.checkSearchAvailability(this.selectedNodesState); - if (message) { - this.notificationService.showError(message); - } - this._disabled = !!message; - return; - } - this._disabled = true; - open(this.hxInsightUrl); - } - - onAgentSelection(change: MatSelectionListChange): void { - this.store.dispatch({ - type: this.data.trigger, - agentId: change.options[0].value.id - }); - change.source.deselectAll(); - } -} diff --git a/projects/aca-content/src/lib/components/knowledge-retrieval/search-ai/search-ai-input-container/search-ai-input-container.component.html b/projects/aca-content/src/lib/components/knowledge-retrieval/search-ai/search-ai-input-container/search-ai-input-container.component.html deleted file mode 100644 index cc101cd54..000000000 --- a/projects/aca-content/src/lib/components/knowledge-retrieval/search-ai/search-ai-input-container/search-ai-input-container.component.html +++ /dev/null @@ -1,17 +0,0 @@ - -