From 65c5df3d22a15fd6b15ebb771cfda43e417b8dc7 Mon Sep 17 00:00:00 2001 From: duanfuxiang Date: Fri, 4 Jul 2025 09:28:12 +0800 Subject: [PATCH] add local embed --- package.json | 3 + pnpm-lock.yaml | 947 +++++++++++++++++- src/components/chat-view/ChatHistoryView.tsx | 103 +- src/components/chat-view/ChatView.tsx | 2 +- src/components/chat-view/SearchView.tsx | 2 +- .../chat-view/WorkspaceEditModal.tsx | 5 +- src/core/prompts/sections/rules.ts | 2 +- .../prompts/sections/tool-use-guidelines.ts | 3 - src/core/prompts/tools/tool-groups.ts | 2 +- src/core/transformations/trans-engine.ts | 13 +- src/database/json/chat/ChatManager.ts | 96 +- src/database/json/chat/types.ts | 2 + .../json/workspace/WorkspaceManager.ts | 290 +++--- src/embedworker/EmbeddingManager.ts | 274 +++++ src/embedworker/README.md | 171 ++++ src/embedworker/embed.worker.ts | 353 +++++++ src/embedworker/index.ts | 15 + src/hooks/use-chat-history.ts | 14 +- src/main.ts | 49 +- src/types/chat.ts | 1 + src/utils/parse-infio-block.ts | 2 +- tsconfig.json | 2 +- 22 files changed, 2156 insertions(+), 195 deletions(-) create mode 100644 src/embedworker/EmbeddingManager.ts create mode 100644 src/embedworker/README.md create mode 100644 src/embedworker/embed.worker.ts create mode 100644 src/embedworker/index.ts diff --git a/package.json b/package.json index 96f2766..45ed880 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "@electric-sql/pglite": "0.2.14", "@google/genai": "^1.2.0", "@google/generative-ai": "^0.21.0", + "@huggingface/transformers": "^3.6.1", "@langchain/core": "^0.3.26", "@lexical/clipboard": "^0.17.1", "@lexical/react": "^0.17.1", @@ -74,6 +75,7 @@ "@radix-ui/react-tooltip": "^1.1.3", "@tanstack/react-query": "^5.56.2", "@types/mermaid": "^9.2.0", + "@xenova/transformers": "^2.17.2", "axios": "^1.8.3", "chokidar": "^4.0.3", "clsx": "^2.1.1", @@ -119,6 +121,7 @@ "remark-gfm": "^4.0.0", "shell-env": "^4.0.1", "simple-git": "^3.27.0", + "smart-embed-model": "^1.0.7", "string-similarity": "^4.0.4", "styled-components": "^6.1.19", "uuid": "^10.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e04fe18..1580a32 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,6 +29,9 @@ importers: '@google/generative-ai': specifier: ^0.21.0 version: 0.21.0 + '@huggingface/transformers': + specifier: ^3.6.1 + version: 3.6.1 '@langchain/core': specifier: ^0.3.26 version: 0.3.40(openai@4.85.1(ws@8.18.0)(zod@3.24.2)) @@ -68,6 +71,9 @@ importers: '@types/mermaid': specifier: ^9.2.0 version: 9.2.0 + '@xenova/transformers': + specifier: ^2.17.2 + version: 2.17.2 axios: specifier: ^1.8.3 version: 1.8.3 @@ -203,6 +209,9 @@ importers: simple-git: specifier: ^3.27.0 version: 3.27.0 + smart-embed-model: + specifier: ^1.0.7 + version: 1.0.7 string-similarity: specifier: ^4.0.4 version: 4.0.4 @@ -617,6 +626,9 @@ packages: '@electric-sql/pglite@0.2.14': resolution: {integrity: sha512-ZMYZL/yFu5sCewYecdX4OjyOPcrI2OmQ6598e/tyke4Rpgeekd4+pINf9jjzJNJk1Kq5dtuB6buqZsBQf0sx8A==} + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + '@emotion/is-prop-valid@1.2.2': resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} @@ -1229,6 +1241,17 @@ packages: resolution: {integrity: sha512-7XhUbtnlkSEZK15kN3t+tzIMxsbKm/dSkKBFalj+20NvPKe1kBY7mR2P7vuijEn+f06z5+A8bVGKO0v39cr6Wg==} engines: {node: '>=18.0.0'} + '@huggingface/jinja@0.2.2': + resolution: {integrity: sha512-/KPde26khDUIPkTGU82jdtTW9UAuvUTumCAbFs/7giR0SxsvZC4hru51PBvpijH6BVkHcROcvZM/lpy5h1jRRA==} + engines: {node: '>=18'} + + '@huggingface/jinja@0.4.1': + resolution: {integrity: sha512-3WXbMFaPkk03LRCM0z0sylmn8ddDm4ubjU7X+Hg4M2GOuMklwoGAFXp9V2keq7vltoB/c7McE5aHUVVddAewsw==} + engines: {node: '>=18'} + + '@huggingface/transformers@3.6.1': + resolution: {integrity: sha512-cQVwrt/FawqGG/cDDT4+7Zdmw0HFignBirHsAUYI26HAj24oT2FxVyz2PgX6+qajutVLDekwhdChXxnZZB8XNg==} + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -1248,6 +1271,126 @@ packages: '@iconify/utils@2.3.0': resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} + '@img/sharp-darwin-arm64@0.34.2': + resolution: {integrity: sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.2': + resolution: {integrity: sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.1.0': + resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.1.0': + resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.1.0': + resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.1.0': + resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.1.0': + resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.1.0': + resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.1.0': + resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': + resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.1.0': + resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.2': + resolution: {integrity: sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.2': + resolution: {integrity: sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.34.2': + resolution: {integrity: sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.2': + resolution: {integrity: sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.2': + resolution: {integrity: sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.2': + resolution: {integrity: sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.2': + resolution: {integrity: sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.2': + resolution: {integrity: sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.2': + resolution: {integrity: sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.2': + resolution: {integrity: sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -1521,6 +1664,36 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@radix-ui/number@1.1.0': resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} @@ -2727,6 +2900,9 @@ packages: '@types/lodash@4.17.15': resolution: {integrity: sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw==} + '@types/long@4.0.2': + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -2857,6 +3033,9 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@xenova/transformers@2.17.2': + resolution: {integrity: sha512-lZmHqzrVIkSvZdKZEx7IYY51TK0WDrC8eR0c5IMnBsO8di8are1zzw8BlLhyO2TklZKLN5UffNGs1IJwT6oOqQ==} + CSSselect@0.4.1: resolution: {integrity: sha512-r4HWARRbQ6enGbdPCrl3bNybORIcU0AcBLTyaxcWNTRd6EH2/w9RInHkUbUhwehrBFN1KQz+yFulhyIH31ZXAw==} deprecated: the module is now available as 'css-select' @@ -3014,6 +3193,9 @@ packages: axios@1.8.3: resolution: {integrity: sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A==} + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3048,16 +3230,53 @@ packages: balanced-match@2.0.0: resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + bare-events@2.5.4: + resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} + + bare-fs@4.1.5: + resolution: {integrity: sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-os@3.6.1: + resolution: {integrity: sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==} + engines: {bare: '>=1.14.0'} + + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + + bare-stream@2.6.5: + resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} bignumber.js@9.3.0: resolution: {integrity: sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + body-parser@2.2.0: resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} engines: {node: '>=18'} + boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -3086,6 +3305,9 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -3182,10 +3404,17 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -3215,10 +3444,17 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} @@ -3550,6 +3786,10 @@ packages: resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} engines: {node: '>=8'} + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dedent@1.5.3: resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} peerDependencies: @@ -3558,6 +3798,10 @@ packages: babel-plugin-macros: optional: true + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -3610,6 +3854,9 @@ packages: detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -3788,6 +4035,9 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + entities@1.0.0: resolution: {integrity: sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==} @@ -3840,6 +4090,9 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + esbuild-plugin-inline-worker@0.1.1: resolution: {integrity: sha512-VmFqsQKxUlbM51C1y5bRiMeyc1x2yTdMXhKB6S//++g9aCBg8TfGsbKxl5ZDkCGquqLY+RmEk93TBNd0i35dPA==} @@ -4039,6 +4292,10 @@ packages: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + expect@29.7.0: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4065,6 +4322,9 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -4128,6 +4388,12 @@ packages: flat-cache@6.1.6: resolution: {integrity: sha512-F+CKgSwp0pzLx67u+Zy1aCueVWFAHWbXepvXlZ+bWVTaASbm5SyCnSJ80Fp1ePEmS57wU+Bf6cx6525qtMZ4lQ==} + flatbuffers@1.12.0: + resolution: {integrity: sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==} + + flatbuffers@25.2.10: + resolution: {integrity: sha512-7JlN9ZvLDG1McO3kbX0k4v+SUAg48L1rIwEvN6ZQl/eCtgJz9UylTMzE9wrmYrcorgxm3CX/3T/w5VAub99UUw==} + flatted@3.3.2: resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} @@ -4167,6 +4433,9 @@ packages: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -4244,6 +4513,9 @@ packages: get-tsconfig@4.10.0: resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -4256,6 +4528,10 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported + global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + global-modules@2.0.0: resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} engines: {node: '>=6'} @@ -4317,6 +4593,9 @@ packages: resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} engines: {node: '>=14.0.0'} + guid-typescript@1.0.9: + resolution: {integrity: sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==} + hachure-fill@0.5.2: resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} @@ -4519,6 +4798,9 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -4885,6 +5167,9 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -5078,6 +5363,12 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -5125,6 +5416,10 @@ packages: engines: {node: '>= 18'} hasBin: true + matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -5314,6 +5609,10 @@ packages: resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} engines: {node: '>=8'} + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + minimatch@10.0.1: resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} engines: {node: 20 || >=22} @@ -5340,15 +5639,31 @@ packages: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} + minizlib@3.0.2: + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + engines: {node: '>= 18'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} @@ -5370,6 +5685,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -5383,6 +5701,13 @@ packages: neverthrow@6.2.2: resolution: {integrity: sha512-POR1FACqdK9jH0S2kRPzaZEvzT11wsOxLW520PQV/+vKi9dQe+hXq19EiOvYx7lSRaF5VB9lYGsPInynrnN05w==} + node-abi@3.75.0: + resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==} + engines: {node: '>=10'} + + node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -5560,6 +5885,32 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + onnx-proto@4.0.4: + resolution: {integrity: sha512-aldMOB3HRoo6q/phyB6QRQxSt895HNNw82BNyZ2CMh4bjeKv7g/c+VpAFtJuEMVfYLMbRx61hbuqnKceLeDcDA==} + + onnxruntime-common@1.14.0: + resolution: {integrity: sha512-3LJpegM2iMNRX2wUmtYfeX/ytfOzNwAWKSq1HbRrKc9+uqG/FsEA0bbKZl1btQeZaXhC26l44NWpNUeXPII7Ew==} + + onnxruntime-common@1.21.0: + resolution: {integrity: sha512-Q632iLLrtCAVOTO65dh2+mNbQir/QNTVBG3h/QdZBpns7mZ0RYbLRBgGABPbpU9351AgYy7SJf1WaeVwMrBFPQ==} + + onnxruntime-common@1.22.0-dev.20250409-89f8206ba4: + resolution: {integrity: sha512-vDJMkfCfb0b1A836rgHj+ORuZf4B4+cc2bASQtpeoJLueuFc5DuYwjIZUBrSvx/fO5IrLjLz+oTrB3pcGlhovQ==} + + onnxruntime-node@1.14.0: + resolution: {integrity: sha512-5ba7TWomIV/9b6NH/1x/8QEeowsb+jBEvFzU6z0T4mNsFwdPqXeFUM7uxC6QeSRkEbWu3qEB0VMjrvzN/0S9+w==} + os: [win32, darwin, linux] + + onnxruntime-node@1.21.0: + resolution: {integrity: sha512-NeaCX6WW2L8cRCSqy3bInlo5ojjQqu2fD3D+9W5qb5irwxhEyWKXeH2vZ8W9r6VxaMPUan+4/7NDwZMtouZxEw==} + os: [win32, darwin, linux] + + onnxruntime-web@1.14.0: + resolution: {integrity: sha512-Kcqf43UMfW8mCydVGcX9OMXI2VN17c0p6XvR7IPSZzBf/6lteBzXHvcEVWDPmCKuGombl997HgLqj91F11DzXw==} + + onnxruntime-web@1.22.0-dev.20250409-89f8206ba4: + resolution: {integrity: sha512-0uS76OPgH0hWCPrFKlL8kYVV7ckM7t/36HfbgoFw6Nd0CZVVbQC4PkrR8mBX8LtNUFZO25IQBqV2Hx2ho3FlbQ==} + openai@4.85.1: resolution: {integrity: sha512-jkX2fntHljUvSH3MkWh4jShl10oNkb+SsCj4auKlbu2oF4KWAnmHLNR5EpnUHK1ZNW05Rp0fjbJzYwQzMsH8ZA==} hasBin: true @@ -5710,6 +6061,9 @@ packages: pkg-types@2.1.0: resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} + platform@1.3.6: + resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} + plausible-tracker@0.3.9: resolution: {integrity: sha512-hMhneYm3GCPyQon88SZrVJx+LlqhM1kZFQbuAgXPoh/Az2YvO1B6bitT9qlhpiTdJlsT5lsr3gPmzoVjb5CDXA==} engines: {node: '>=10'} @@ -5751,6 +6105,11 @@ packages: preact@10.26.9: resolution: {integrity: sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==} + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + hasBin: true + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -5792,6 +6151,14 @@ packages: property-information@7.0.0: resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + protobufjs@6.11.4: + resolution: {integrity: sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==} + hasBin: true + + protobufjs@7.5.3: + resolution: {integrity: sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==} + engines: {node: '>=12.0.0'} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -5802,6 +6169,9 @@ packages: psl@1.15.0: resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -5843,6 +6213,10 @@ packages: resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} engines: {node: '>= 0.8'} + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + react-contenteditable@3.3.7: resolution: {integrity: sha512-GA9NbC0DkDdpN3iGvib/OMHWTJzDX2cfkgy5Tt98JJAbA3kLnyrNbBIpsSpPpq7T8d3scD39DHP+j8mAM7BIfQ==} peerDependencies: @@ -6009,6 +6383,10 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} @@ -6050,6 +6428,9 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -6068,6 +6449,10 @@ packages: resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} engines: {node: '>= 18'} + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + serve-static@2.2.0: resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} engines: {node: '>= 18'} @@ -6093,6 +6478,14 @@ packages: shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + sharp@0.32.6: + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} + + sharp@0.34.2: + resolution: {integrity: sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -6134,9 +6527,15 @@ packages: simple-get@3.1.1: resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + simple-git@3.27.0: resolution: {integrity: sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==} + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + simple-wcswidth@1.0.1: resolution: {integrity: sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg==} @@ -6151,6 +6550,9 @@ packages: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} + smart-embed-model@1.0.7: + resolution: {integrity: sha512-4L3+uOyeGwPEsrj846G72wg6nE9syLH/vmpuGHQZnha5todylOYJlecPsGyifQbYFCX3gObUXXtywDHfoET1Gw==} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -6174,6 +6576,9 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -6182,6 +6587,9 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + streamx@2.22.1: + resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==} + string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -6242,6 +6650,10 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -6300,14 +6712,34 @@ packages: resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} + tar-fs@2.1.3: + resolution: {integrity: sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==} + + tar-fs@3.1.0: + resolution: {integrity: sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -6397,6 +6829,9 @@ packages: peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -6405,6 +6840,10 @@ packages: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -6693,6 +7132,10 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yaml@2.7.0: resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} engines: {node: '>= 14'} @@ -7130,6 +7573,11 @@ snapshots: '@electric-sql/pglite@0.2.14': {} + '@emnapi/runtime@1.4.3': + dependencies: + tslib: 2.4.0 + optional: true + '@emotion/is-prop-valid@1.2.2': dependencies: '@emotion/memoize': 0.8.1 @@ -7479,6 +7927,17 @@ snapshots: '@google/generative-ai@0.21.0': {} + '@huggingface/jinja@0.2.2': {} + + '@huggingface/jinja@0.4.1': {} + + '@huggingface/transformers@3.6.1': + dependencies: + '@huggingface/jinja': 0.4.1 + onnxruntime-node: 1.21.0 + onnxruntime-web: 1.22.0-dev.20250409-89f8206ba4 + sharp: 0.34.2 + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -7506,6 +7965,91 @@ snapshots: transitivePeerDependencies: - supports-color + '@img/sharp-darwin-arm64@0.34.2': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.1.0 + optional: true + + '@img/sharp-darwin-x64@0.34.2': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.1.0 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.1.0': + optional: true + + '@img/sharp-libvips-darwin-x64@1.1.0': + optional: true + + '@img/sharp-libvips-linux-arm64@1.1.0': + optional: true + + '@img/sharp-libvips-linux-arm@1.1.0': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.1.0': + optional: true + + '@img/sharp-libvips-linux-s390x@1.1.0': + optional: true + + '@img/sharp-libvips-linux-x64@1.1.0': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.1.0': + optional: true + + '@img/sharp-linux-arm64@0.34.2': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.1.0 + optional: true + + '@img/sharp-linux-arm@0.34.2': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.1.0 + optional: true + + '@img/sharp-linux-s390x@0.34.2': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.1.0 + optional: true + + '@img/sharp-linux-x64@0.34.2': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.1.0 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.2': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.2': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + optional: true + + '@img/sharp-wasm32@0.34.2': + dependencies: + '@emnapi/runtime': 1.4.3 + optional: true + + '@img/sharp-win32-arm64@0.34.2': + optional: true + + '@img/sharp-win32-ia32@0.34.2': + optional: true + + '@img/sharp-win32-x64@0.34.2': + optional: true + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 @@ -8030,6 +8574,29 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.0 + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + '@radix-ui/number@1.1.0': {} '@radix-ui/number@1.1.1': {} @@ -9340,6 +9907,8 @@ snapshots: '@types/lodash@4.17.15': {} + '@types/long@4.0.2': {} + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -9495,6 +10064,16 @@ snapshots: '@ungap/structured-clone@1.3.0': {} + '@xenova/transformers@2.17.2': + dependencies: + '@huggingface/jinja': 0.2.2 + onnxruntime-web: 1.14.0 + sharp: 0.32.6 + optionalDependencies: + onnxruntime-node: 1.14.0 + transitivePeerDependencies: + - bare-buffer + CSSselect@0.4.1: dependencies: CSSwhat: 0.4.7 @@ -9683,6 +10262,8 @@ snapshots: transitivePeerDependencies: - debug + b4a@1.6.7: {} + babel-jest@29.7.0(@babel/core@7.26.9): dependencies: '@babel/core': 7.26.9 @@ -9744,10 +10325,41 @@ snapshots: balanced-match@2.0.0: {} + bare-events@2.5.4: + optional: true + + bare-fs@4.1.5: + dependencies: + bare-events: 2.5.4 + bare-path: 3.0.0 + bare-stream: 2.6.5(bare-events@2.5.4) + optional: true + + bare-os@3.6.1: + optional: true + + bare-path@3.0.0: + dependencies: + bare-os: 3.6.1 + optional: true + + bare-stream@2.6.5(bare-events@2.5.4): + dependencies: + streamx: 2.22.1 + optionalDependencies: + bare-events: 2.5.4 + optional: true + base64-js@1.5.1: {} bignumber.js@9.3.0: {} + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + body-parser@2.2.0: dependencies: bytes: 3.1.2 @@ -9762,6 +10374,8 @@ snapshots: transitivePeerDependencies: - supports-color + boolean@3.2.0: {} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -9794,6 +10408,11 @@ snapshots: buffer-from@1.1.2: {} + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + buffer@6.0.3: dependencies: base64-js: 1.5.1 @@ -9894,9 +10513,13 @@ snapshots: dependencies: readdirp: 4.1.2 + chownr@1.1.4: {} + chownr@2.0.0: optional: true + chownr@3.0.0: {} + ci-info@3.9.0: {} cjs-module-lexer@1.4.3: {} @@ -9919,9 +10542,19 @@ snapshots: color-name@1.1.4: {} + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + color-support@1.1.3: optional: true + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + colord@2.9.3: {} combined-stream@1.0.8: @@ -10269,8 +10902,14 @@ snapshots: mimic-response: 2.1.0 optional: true + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + dedent@1.5.3: {} + deep-extend@0.6.0: {} + deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -10304,13 +10943,14 @@ snapshots: dequal@2.0.3: {} - detect-libc@2.0.4: - optional: true + detect-libc@2.0.4: {} detect-newline@3.1.0: {} detect-node-es@1.1.0: {} + detect-node@2.1.0: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -10412,6 +11052,10 @@ snapshots: encodeurl@2.0.0: {} + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + entities@1.0.0: optional: true @@ -10527,6 +11171,8 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + es6-error@4.1.1: {} + esbuild-plugin-inline-worker@0.1.1: dependencies: esbuild: 0.25.5 @@ -10863,6 +11509,8 @@ snapshots: exit@0.1.2: {} + expand-template@2.0.3: {} + expect@29.7.0: dependencies: '@jest/expect-utils': 29.7.0 @@ -10915,6 +11563,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-fifo@1.3.2: {} + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -10998,6 +11648,10 @@ snapshots: flatted: 3.3.2 hookified: 1.7.1 + flatbuffers@1.12.0: {} + + flatbuffers@25.2.10: {} + flatted@3.3.2: {} follow-redirects@1.15.9: {} @@ -11026,6 +11680,8 @@ snapshots: fresh@2.0.0: {} + fs-constants@1.0.0: {} + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 @@ -11124,6 +11780,8 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + github-from-package@0.0.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -11141,6 +11799,15 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 + global-agent@3.0.0: + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.7.2 + serialize-error: 7.0.1 + global-modules@2.0.0: dependencies: global-prefix: 3.0.0 @@ -11219,6 +11886,8 @@ snapshots: - encoding - supports-color + guid-typescript@1.0.9: {} + hachure-fill@0.5.2: {} handlebars@4.7.8: @@ -11474,6 +12143,8 @@ snapshots: is-arrayish@0.2.1: {} + is-arrayish@0.3.2: {} + is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -12056,6 +12727,8 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json-stringify-safe@5.0.1: {} + json5@1.0.2: dependencies: minimist: 1.2.8 @@ -12210,6 +12883,10 @@ snapshots: lodash@4.17.21: {} + long@4.0.0: {} + + long@5.3.2: {} + longest-streak@3.1.0: {} loose-envify@1.4.0: @@ -12251,6 +12928,10 @@ snapshots: marked@15.0.12: {} + matcher@3.0.0: + dependencies: + escape-string-regexp: 4.0.0 + math-intrinsics@1.1.0: {} mathml-tag-names@2.1.3: {} @@ -12658,6 +13339,8 @@ snapshots: mimic-response@2.1.0: optional: true + mimic-response@3.1.0: {} + minimatch@10.0.1: dependencies: brace-expansion: 2.0.1 @@ -12684,15 +13367,25 @@ snapshots: minipass@5.0.0: optional: true + minipass@7.1.2: {} + minizlib@2.1.2: dependencies: minipass: 3.3.6 yallist: 4.0.0 optional: true + minizlib@3.0.2: + dependencies: + minipass: 7.1.2 + + mkdirp-classic@0.5.3: {} + mkdirp@1.0.4: optional: true + mkdirp@3.0.1: {} + mlly@1.7.4: dependencies: acorn: 8.14.0 @@ -12711,6 +13404,8 @@ snapshots: nanoid@3.3.8: {} + napi-build-utils@2.0.0: {} + natural-compare@1.4.0: {} negotiator@1.0.0: {} @@ -12719,6 +13414,12 @@ snapshots: neverthrow@6.2.2: {} + node-abi@3.75.0: + dependencies: + semver: 7.7.2 + + node-addon-api@6.1.0: {} + node-domexception@1.0.0: {} node-fetch@2.7.0: @@ -12850,6 +13551,45 @@ snapshots: dependencies: mimic-fn: 2.1.0 + onnx-proto@4.0.4: + dependencies: + protobufjs: 6.11.4 + + onnxruntime-common@1.14.0: {} + + onnxruntime-common@1.21.0: {} + + onnxruntime-common@1.22.0-dev.20250409-89f8206ba4: {} + + onnxruntime-node@1.14.0: + dependencies: + onnxruntime-common: 1.14.0 + optional: true + + onnxruntime-node@1.21.0: + dependencies: + global-agent: 3.0.0 + onnxruntime-common: 1.21.0 + tar: 7.4.3 + + onnxruntime-web@1.14.0: + dependencies: + flatbuffers: 1.12.0 + guid-typescript: 1.0.9 + long: 4.0.0 + onnx-proto: 4.0.4 + onnxruntime-common: 1.14.0 + platform: 1.3.6 + + onnxruntime-web@1.22.0-dev.20250409-89f8206ba4: + dependencies: + flatbuffers: 25.2.10 + guid-typescript: 1.0.9 + long: 5.3.2 + onnxruntime-common: 1.22.0-dev.20250409-89f8206ba4 + platform: 1.3.6 + protobufjs: 7.5.3 + openai@4.85.1(ws@8.18.0)(zod@3.24.2): dependencies: '@types/node': 18.19.76 @@ -13007,6 +13747,8 @@ snapshots: exsolve: 1.0.6 pathe: 2.0.3 + platform@1.3.6: {} + plausible-tracker@0.3.9: {} points-on-curve@0.2.0: {} @@ -13045,6 +13787,21 @@ snapshots: preact@10.26.9: {} + prebuild-install@7.1.3: + dependencies: + detect-libc: 2.0.4 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.75.0 + pump: 3.0.3 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.3 + tunnel-agent: 0.6.0 + prelude-ls@1.2.1: {} prettier@3.5.1: {} @@ -13080,6 +13837,37 @@ snapshots: property-information@7.0.0: {} + protobufjs@6.11.4: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/long': 4.0.2 + '@types/node': 16.18.126 + long: 4.0.0 + + protobufjs@7.5.3: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 16.18.126 + long: 5.3.2 + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -13091,6 +13879,11 @@ snapshots: dependencies: punycode: 2.3.1 + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + punycode@2.3.1: {} pure-rand@6.1.0: {} @@ -13176,6 +13969,13 @@ snapshots: iconv-lite: 0.6.3 unpipe: 1.0.0 + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + react-contenteditable@3.3.7(react@18.3.1): dependencies: fast-deep-equal: 3.1.3 @@ -13268,7 +14068,6 @@ snapshots: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - optional: true readdirp@4.1.2: {} @@ -13382,6 +14181,15 @@ snapshots: dependencies: glob: 7.2.3 + roarr@2.15.4: + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.4 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + robust-predicates@3.0.2: {} roughjs@4.6.6: @@ -13438,12 +14246,13 @@ snapshots: dependencies: loose-envify: 1.4.0 + semver-compare@1.0.0: {} + semver@6.3.1: {} semver@7.7.1: {} - semver@7.7.2: - optional: true + semver@7.7.2: {} send@1.2.0: dependencies: @@ -13461,6 +14270,10 @@ snapshots: transitivePeerDependencies: - supports-color + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + serve-static@2.2.0: dependencies: encodeurl: 2.0.0 @@ -13499,6 +14312,47 @@ snapshots: shallowequal@1.1.0: {} + sharp@0.32.6: + dependencies: + color: 4.2.3 + detect-libc: 2.0.4 + node-addon-api: 6.1.0 + prebuild-install: 7.1.3 + semver: 7.7.2 + simple-get: 4.0.1 + tar-fs: 3.1.0 + tunnel-agent: 0.6.0 + transitivePeerDependencies: + - bare-buffer + + sharp@0.34.2: + dependencies: + color: 4.2.3 + detect-libc: 2.0.4 + semver: 7.7.2 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.2 + '@img/sharp-darwin-x64': 0.34.2 + '@img/sharp-libvips-darwin-arm64': 1.1.0 + '@img/sharp-libvips-darwin-x64': 1.1.0 + '@img/sharp-libvips-linux-arm': 1.1.0 + '@img/sharp-libvips-linux-arm64': 1.1.0 + '@img/sharp-libvips-linux-ppc64': 1.1.0 + '@img/sharp-libvips-linux-s390x': 1.1.0 + '@img/sharp-libvips-linux-x64': 1.1.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + '@img/sharp-linux-arm': 0.34.2 + '@img/sharp-linux-arm64': 0.34.2 + '@img/sharp-linux-s390x': 0.34.2 + '@img/sharp-linux-x64': 0.34.2 + '@img/sharp-linuxmusl-arm64': 0.34.2 + '@img/sharp-linuxmusl-x64': 0.34.2 + '@img/sharp-wasm32': 0.34.2 + '@img/sharp-win32-arm64': 0.34.2 + '@img/sharp-win32-ia32': 0.34.2 + '@img/sharp-win32-x64': 0.34.2 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -13543,8 +14397,7 @@ snapshots: signal-exit@4.1.0: {} - simple-concat@1.0.1: - optional: true + simple-concat@1.0.1: {} simple-get@3.1.1: dependencies: @@ -13553,6 +14406,12 @@ snapshots: simple-concat: 1.0.1 optional: true + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + simple-git@3.27.0: dependencies: '@kwsites/file-exists': 1.1.1 @@ -13561,6 +14420,10 @@ snapshots: transitivePeerDependencies: - supports-color + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + simple-wcswidth@1.0.1: {} sisteransi@1.0.5: {} @@ -13573,6 +14436,12 @@ snapshots: astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 + smart-embed-model@1.0.7: + dependencies: + '@xenova/transformers': 2.17.2 + transitivePeerDependencies: + - bare-buffer + source-map-js@1.2.1: {} source-map-support@0.5.13: @@ -13593,12 +14462,21 @@ snapshots: sprintf-js@1.0.3: {} + sprintf-js@1.1.3: {} + stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 statuses@2.0.1: {} + streamx@2.22.1: + dependencies: + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + optionalDependencies: + bare-events: 2.5.4 + string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -13662,7 +14540,6 @@ snapshots: string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - optional: true stringify-entities@4.0.4: dependencies: @@ -13683,6 +14560,8 @@ snapshots: strip-final-newline@2.0.0: {} + strip-json-comments@2.0.1: {} + strip-json-comments@3.1.1: {} style-mod@4.1.2: {} @@ -13782,6 +14661,37 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + tar-fs@2.1.3: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.3 + tar-stream: 2.2.0 + + tar-fs@3.1.0: + dependencies: + pump: 3.0.3 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 4.1.5 + bare-path: 3.0.0 + transitivePeerDependencies: + - bare-buffer + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar-stream@3.1.7: + dependencies: + b4a: 1.6.7 + fast-fifo: 1.3.2 + streamx: 2.22.1 + tar@6.2.1: dependencies: chownr: 2.0.0 @@ -13792,12 +14702,25 @@ snapshots: yallist: 4.0.0 optional: true + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.2 + mkdirp: 3.0.1 + yallist: 5.0.0 + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 + text-decoder@1.2.3: + dependencies: + b4a: 1.6.7 + text-table@0.2.0: {} tinyexec@1.0.1: {} @@ -13873,12 +14796,18 @@ snapshots: tslib: 1.14.1 typescript: 4.9.5 + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 type-detect@4.0.8: {} + type-fest@0.13.1: {} + type-fest@0.20.2: {} type-fest@0.21.3: {} @@ -14185,6 +15114,8 @@ snapshots: yallist@4.0.0: optional: true + yallist@5.0.0: {} + yaml@2.7.0: {} yargs-parser@21.1.1: {} diff --git a/src/components/chat-view/ChatHistoryView.tsx b/src/components/chat-view/ChatHistoryView.tsx index 27e6ae6..6715350 100644 --- a/src/components/chat-view/ChatHistoryView.tsx +++ b/src/components/chat-view/ChatHistoryView.tsx @@ -1,7 +1,8 @@ -import { CheckSquare, Clock, CopyPlus, MessageSquare, Pencil, Search, Sparkles, Square, Trash2 } from 'lucide-react' +import { CheckSquare, Clock, CopyPlus, Globe, MessageSquare, Pencil, Search, Sparkles, Square, Trash2 } from 'lucide-react' import { Notice } from 'obsidian' import React, { useMemo, useRef, useState } from 'react' +import { useSettings } from '../../contexts/SettingsContext' import { useChatHistory } from '../../hooks/use-chat-history' import { t } from '../../lang/helpers' import { ChatConversationMeta } from '../../types/chat' @@ -29,6 +30,15 @@ const ChatHistoryView = ({ // search term const [searchTerm, setSearchTerm] = useState('') + const { settings } = useSettings() + + const currentWorkspace = React.useMemo(() => { + return settings.workspace || 'vault' + }, [settings.workspace]) + + // workspace filter state + const [filterByWorkspace, setFilterByWorkspace] = useState(false) + // editing conversation id const [editingConversationId, setEditingConversationId] = useState(null) @@ -62,16 +72,33 @@ const ChatHistoryView = ({ setSearchTerm(e.target.value) } + // toggle workspace filter + const toggleWorkspaceFilter = () => { + setFilterByWorkspace(!filterByWorkspace) + } + // filter conversations list const filteredConversations = useMemo(() => { - if (!searchTerm.trim()) { - return chatList + console.log('filteredConversations', chatList) + let filtered = chatList + + // Apply search filter + if (searchTerm.trim()) { + filtered = filtered.filter( + conversation => + conversation.title.toLowerCase().includes(searchTerm.toLowerCase()) + ) } - return chatList.filter( - conversation => - conversation.title.toLowerCase().includes(searchTerm.toLowerCase()) - ) - }, [chatList, searchTerm]) + + // Apply workspace filter + if (filterByWorkspace) { + filtered = filtered.filter( + conversation => conversation.workspace === currentWorkspace + ) + } + + return filtered + }, [chatList, searchTerm, filterByWorkspace, currentWorkspace]) // toggle selection mode const toggleSelectionMode = () => { @@ -285,6 +312,18 @@ const ChatHistoryView = ({ /> + {/* workspace filter */} +
+ +
+ {/* conversations list */}
{filteredConversations.length === 0 ? ( @@ -353,6 +392,11 @@ const ChatHistoryView = ({ {formatDate(conversation.updatedAt)}
{conversation.title}
+ {conversation.workspace && ( +
+ 工作区: {conversation.workspace} +
+ )} {!selectionMode && (
@@ -426,6 +470,7 @@ const ChatHistoryView = ({ flex-shrink: 0; } + .infio-chat-history-filter-btn, .infio-chat-history-cleanup-btn, .infio-chat-history-selection-btn { display: flex !important; @@ -444,12 +489,14 @@ const ChatHistoryView = ({ box-sizing: border-box; } + .infio-chat-history-filter-btn:hover, .infio-chat-history-cleanup-btn:hover, .infio-chat-history-selection-btn:hover { background-color: var(--background-modifier-hover, #f5f5f5); border-color: var(--background-modifier-border-hover, #d0d0d0); } + .infio-chat-history-filter-btn.active, .infio-chat-history-selection-btn.active { background-color: var(--interactive-accent, #007acc); color: var(--text-on-accent, #ffffff); @@ -539,7 +586,6 @@ const ChatHistoryView = ({ border: 1px solid var(--background-modifier-border); border-radius: var(--radius-s); padding: 6px 12px; - margin-bottom: var(--size-4-3); transition: all 0.2s ease; height: 36px; max-width: 100%; @@ -675,6 +721,13 @@ const ChatHistoryView = ({ font-size: 12px; } + .infio-chat-history-workspace { + color: var(--text-muted); + font-size: 11px; + margin-top: 2px; + opacity: 0.8; + } + .infio-chat-history-actions { display: flex; gap: 4px; @@ -768,6 +821,38 @@ const ChatHistoryView = ({ .infio-chat-history-cancel-btn:hover { background-color: var(--background-modifier-hover); } + + .infio-chat-history-workspace-filter { + display: flex; + justify-content: flex-start; + align-items: center; + margin-bottom: 12px; + } + + .infio-chat-history-workspace-filter-btn { + display: flex; + align-items: center; + gap: 6px; + background-color: transparent; + border: 1px solid var(--background-modifier-border); + color: var(--text-muted); + padding: 6px 12px; + border-radius: var(--radius-s); + cursor: pointer; + font-size: var(--font-ui-small); + transition: all 0.2s ease; + } + + .infio-chat-history-workspace-filter-btn:hover { + background-color: var(--background-modifier-hover); + color: var(--text-normal); + } + + .infio-chat-history-workspace-filter-btn.active { + background-color: var(--interactive-accent); + color: var(--text-on-accent); + border-color: var(--interactive-accent); + } `}
diff --git a/src/components/chat-view/ChatView.tsx b/src/components/chat-view/ChatView.tsx index 3481fe7..5da7a15 100644 --- a/src/components/chat-view/ChatView.tsx +++ b/src/components/chat-view/ChatView.tsx @@ -879,7 +879,7 @@ const Chat = forwardRef((props, ref) => { // Execute the transformation using the TransEngine const transformationResult = await transEngine.runTransformation({ filePath: toolArgs.path, - transformationType: transformationType, + transformationType: transformationType as TransformationType, model: { provider: settings.applyModelProvider, modelId: settings.applyModelId, diff --git a/src/components/chat-view/SearchView.tsx b/src/components/chat-view/SearchView.tsx index d42fe8e..4a5e442 100644 --- a/src/components/chat-view/SearchView.tsx +++ b/src/components/chat-view/SearchView.tsx @@ -148,7 +148,7 @@ const SearchView = () => { minSimilarity: 0.3, }) - setInsightResults(results) + setInsightResults(results as any) setSearchResults([]) } } catch (error) { diff --git a/src/components/chat-view/WorkspaceEditModal.tsx b/src/components/chat-view/WorkspaceEditModal.tsx index f0e804f..803a806 100644 --- a/src/components/chat-view/WorkspaceEditModal.tsx +++ b/src/components/chat-view/WorkspaceEditModal.tsx @@ -59,8 +59,9 @@ const WorkspaceEditModal = ({ setAvailableFolders(folders.sort()) // 直接使用 Obsidian 的内置接口获取所有标签 - try { - const tagsObject = app.metadataCache.getTags() // 获取所有标签 {'#tag1': 2, '#tag2': 4} + try { + // @ts-ignore + const tagsObject = app.metadataCache.getTags() as Record // 获取所有标签 {'#tag1': 2, '#tag2': 4} const tags = Object.keys(tagsObject).sort() setAvailableTags(tags) } catch (error) { diff --git a/src/core/prompts/sections/rules.ts b/src/core/prompts/sections/rules.ts index b3bd177..988b027 100644 --- a/src/core/prompts/sections/rules.ts +++ b/src/core/prompts/sections/rules.ts @@ -112,5 +112,5 @@ export function getRulesSection( if (mode === 'learn') { return getLearnModeRulesSection(cwd, searchTool); } - return getObsidianRulesSection(mode, cwd, searchTool, supportsComputerUse, diffStrategy, experiments); + return getObsidianRulesSection(mode, cwd, searchTool); } diff --git a/src/core/prompts/sections/tool-use-guidelines.ts b/src/core/prompts/sections/tool-use-guidelines.ts index b8172d0..2670d54 100644 --- a/src/core/prompts/sections/tool-use-guidelines.ts +++ b/src/core/prompts/sections/tool-use-guidelines.ts @@ -21,8 +21,5 @@ By waiting for and carefully considering the user's response after each tool use } export function getToolUseGuidelinesSection(mode?: string): string { - if (mode === 'learn') { - return getLearnModeToolUseGuidelines(); - } return getDefaultToolUseGuidelines(); } diff --git a/src/core/prompts/tools/tool-groups.ts b/src/core/prompts/tools/tool-groups.ts index ea442eb..cd354dc 100644 --- a/src/core/prompts/tools/tool-groups.ts +++ b/src/core/prompts/tools/tool-groups.ts @@ -61,7 +61,7 @@ export type ToolName = keyof typeof TOOL_DISPLAY_NAMES // Tool helper functions export function getToolName(toolConfig: string | readonly [ToolName, ...unknown[]]): ToolName { - return typeof toolConfig === "string" ? toolConfig : toolConfig[0] + return typeof toolConfig === "string" ? toolConfig as ToolName : toolConfig[0] } export function getToolOptions(toolConfig: string | readonly [ToolName, ...unknown[]]): unknown { diff --git a/src/core/transformations/trans-engine.ts b/src/core/transformations/trans-engine.ts index d57b96b..289c92e 100644 --- a/src/core/transformations/trans-engine.ts +++ b/src/core/transformations/trans-engine.ts @@ -981,8 +981,9 @@ export class TransEngine { } break; } - - case TransformationType.CONCISE_DENSE_SUMMARY: + case TransformationType.DENSE_SUMMARY: + // 新的摘要类型不需要特殊的后处理,保持原样 + break; case TransformationType.HIERARCHICAL_SUMMARY: // 新的摘要类型不需要特殊的后处理,保持原样 break; @@ -1237,7 +1238,7 @@ export class TransEngine { const cacheResult = await this.checkDatabaseCache( fileMetadata.sourcePath, fileMetadata.sourceMtime, - TransformationType.CONCISE_DENSE_SUMMARY + TransformationType.DENSE_SUMMARY ) if (cacheResult.foundCache && cacheResult.result.success && cacheResult.result.result) { @@ -1273,7 +1274,7 @@ export class TransEngine { // 保存到数据库 await this.saveResultToDatabase( summary, - TransformationType.CONCISE_DENSE_SUMMARY, + TransformationType.DENSE_SUMMARY, fileMetadata.sourcePath, fileMetadata.sourceMtime, 'document' @@ -1295,7 +1296,7 @@ export class TransEngine { const messages: RequestMessage[] = [ { role: 'system', - content: CONCISE_DENSE_SUMMARY_PROMPT + content: DENSE_SUMMARY_PROMPT }, { role: 'user', @@ -1308,7 +1309,7 @@ export class TransEngine { throw new Error(`生成摘要失败: ${result.error.message}`) } - return this.postProcessResult(result.value, TransformationType.CONCISE_DENSE_SUMMARY) + return this.postProcessResult(result.value, TransformationType.DENSE_SUMMARY) } /** diff --git a/src/database/json/chat/ChatManager.ts b/src/database/json/chat/ChatManager.ts index 743c808..63298b4 100644 --- a/src/database/json/chat/ChatManager.ts +++ b/src/database/json/chat/ChatManager.ts @@ -5,6 +5,7 @@ import { ChatConversationMeta } from '../../../types/chat' import { AbstractJsonRepository } from '../base' import { CHAT_DIR, ROOT_DIR } from '../constants' import { EmptyChatTitleException } from '../exception' +import { WorkspaceManager } from '../workspace/WorkspaceManager' import { CHAT_SCHEMA_VERSION, @@ -16,27 +17,34 @@ export class ChatManager extends AbstractJsonRepository< ChatConversation, ChatConversationMeta > { - constructor(app: App) { + private workspaceManager?: WorkspaceManager + + constructor(app: App, workspaceManager?: WorkspaceManager) { super(app, `${ROOT_DIR}/${CHAT_DIR}`) + this.workspaceManager = workspaceManager } protected generateFileName(chat: ChatConversation): string { - // Format: v{schemaVersion}_{title}_{updatedAt}_{id}.json + // 新格式: v{schemaVersion}_{title}_{updatedAt}_{id}_{workspaceId}.json + // 如果没有工作区,使用 'vault' 作为默认值 const encodedTitle = encodeURIComponent(chat.title) - return `v${chat.schemaVersion}_${encodedTitle}_${chat.updatedAt}_${chat.id}.json` + const workspaceId = chat.workspace || 'vault' + return `v${chat.schemaVersion}_${encodedTitle}_${chat.updatedAt}_${chat.id}_${workspaceId}.json` } protected parseFileName(fileName: string): ChatConversationMeta | null { - // Parse: v{schemaVersion}_{title}_{updatedAt}_{id}.json + // 使用一个正则表达式,工作区部分为可选: v{schemaVersion}_{title}_{updatedAt}_{id}_{workspaceId}?.json const regex = new RegExp( - `^v${CHAT_SCHEMA_VERSION}_(.+)_(\\d+)_([0-9a-f-]+)\\.json$`, + `^v${CHAT_SCHEMA_VERSION}_(.+)_(\\d+)_([0-9a-f-]+)(?:_([^_]+))?\\.json$`, ) const match = fileName.match(regex) + if (!match) return null const title = decodeURIComponent(match[1]) const updatedAt = parseInt(match[2], 10) const id = match[3] + const workspaceId = match[4] // 可能为undefined(老格式) return { id, @@ -44,6 +52,8 @@ export class ChatManager extends AbstractJsonRepository< title, updatedAt, createdAt: 0, + // 如果没有工作区信息(老格式),则认为是vault(全局消息) + workspace: workspaceId === 'vault' ? undefined : workspaceId, } } @@ -66,6 +76,20 @@ export class ChatManager extends AbstractJsonRepository< } await this.create(newChat) + + // 如果有工作区信息,添加到工作区的聊天历史中 + if (newChat.workspace && this.workspaceManager) { + try { + await this.workspaceManager.addChatToWorkspace( + newChat.workspace, + newChat.id, + newChat.title + ) + } catch (error) { + console.error('Failed to add chat to workspace:', error) + } + } + return newChat } @@ -102,6 +126,23 @@ export class ChatManager extends AbstractJsonRepository< } await this.update(chat, updatedChat) + + // 如果标题或工作区发生变化,更新工作区的聊天历史 + if (this.workspaceManager && (updates.title !== undefined || updates.workspace !== undefined)) { + const workspaceId = updatedChat.workspace || chat.workspace + if (workspaceId) { + try { + await this.workspaceManager.addChatToWorkspace( + workspaceId, + updatedChat.id, + updatedChat.title + ) + } catch (error) { + console.error('Failed to update chat in workspace:', error) + } + } + } + return updatedChat } @@ -111,9 +152,22 @@ export class ChatManager extends AbstractJsonRepository< if (targetsToDelete.length === 0) return false + // 获取聊天的工作区信息(从第一个匹配的元数据中获取) + const chatToDelete = await this.findById(id) + const workspaceId = chatToDelete?.workspace + // Delete all files associated with this ID await Promise.all(targetsToDelete.map(meta => this.delete(meta.fileName))) + // 从工作区的聊天历史中移除 + if (workspaceId && this.workspaceManager) { + try { + await this.workspaceManager.removeChatFromWorkspace(workspaceId, id) + } catch (error) { + console.error('Failed to remove chat from workspace:', error) + } + } + return true } @@ -126,7 +180,10 @@ export class ChatManager extends AbstractJsonRepository< if (!chatsById.has(meta.id)) { chatsById.set(meta.id, []) } - chatsById.get(meta.id)!.push(meta) + const chatGroup = chatsById.get(meta.id) + if (chatGroup) { + chatGroup.push(meta) + } } const filesToDelete: string[] = [] @@ -151,11 +208,12 @@ export class ChatManager extends AbstractJsonRepository< return filesToDelete.length } - public async listChats(): Promise { + public async listChats(workspaceFilter?: string): Promise { + console.log('listChats', workspaceFilter) const metadata = await this.listMetadata() // Use a Map to store the latest version of each chat by ID. - const latestChats = new Map() + const latestChats = new Map() for (const meta of metadata) { const existing = latestChats.get(meta.id) @@ -165,7 +223,27 @@ export class ChatManager extends AbstractJsonRepository< } const uniqueMetadata = Array.from(latestChats.values()) - const sorted = uniqueMetadata.sort((a, b) => b.updatedAt - a.updatedAt) + + // 将metadata转换为ChatConversationMeta格式 + const chatMetadata: ChatConversationMeta[] = uniqueMetadata.map((meta) => ({ + id: meta.id, + schemaVersion: meta.schemaVersion, + title: meta.title, + updatedAt: meta.updatedAt, + createdAt: meta.createdAt, + workspace: meta.workspace + })) + + // 如果指定了工作区过滤器,则过滤对话 + let filteredMetadata = chatMetadata + if (workspaceFilter !== undefined && workspaceFilter !== 'vault') { + // 获取指定工作区的对话 + filteredMetadata = chatMetadata.filter(meta => + meta.workspace === workspaceFilter + ) + } + + const sorted = filteredMetadata.sort((a, b) => b.updatedAt - a.updatedAt) return sorted } } diff --git a/src/database/json/chat/types.ts b/src/database/json/chat/types.ts index b945e1f..60e74e8 100644 --- a/src/database/json/chat/types.ts +++ b/src/database/json/chat/types.ts @@ -9,6 +9,7 @@ export type ChatConversation = { createdAt: number updatedAt: number schemaVersion: number + workspace?: string // 工作区ID,可选字段用于向后兼容 } export type ChatConversationMetadata = { @@ -16,4 +17,5 @@ export type ChatConversationMetadata = { title: string updatedAt: number schemaVersion: number + workspace?: string // 工作区ID,可选字段用于向后兼容 } diff --git a/src/database/json/workspace/WorkspaceManager.ts b/src/database/json/workspace/WorkspaceManager.ts index 9d33b7a..2870bbb 100644 --- a/src/database/json/workspace/WorkspaceManager.ts +++ b/src/database/json/workspace/WorkspaceManager.ts @@ -5,181 +5,181 @@ import { AbstractJsonRepository } from '../base' import { ROOT_DIR, WORKSPACE_DIR } from '../constants' import { - WORKSPACE_SCHEMA_VERSION, - Workspace, - WorkspaceMetadata + WORKSPACE_SCHEMA_VERSION, + Workspace, + WorkspaceMetadata } from './types' export class WorkspaceManager extends AbstractJsonRepository< - Workspace, - WorkspaceMetadata + Workspace, + WorkspaceMetadata > { - constructor(app: App) { - super(app, `${ROOT_DIR}/${WORKSPACE_DIR}`) - } + constructor(app: App) { + super(app, `${ROOT_DIR}/${WORKSPACE_DIR}`) + } - protected generateFileName(workspace: Workspace): string { - // Format: v{schemaVersion}_{name}_{updatedAt}_{id}.json - const encodedName = encodeURIComponent(workspace.name) - return `v${workspace.schemaVersion}_${encodedName}_${workspace.updatedAt}_${workspace.id}.json` - } + protected generateFileName(workspace: Workspace): string { + // Format: v{schemaVersion}_{name}_{updatedAt}_{id}.json + const encodedName = encodeURIComponent(workspace.name) + return `v${workspace.schemaVersion}_${encodedName}_${workspace.updatedAt}_${workspace.id}.json` + } - protected parseFileName(fileName: string): WorkspaceMetadata | null { - // Parse: v{schemaVersion}_{name}_{updatedAt}_{id}.json - const regex = new RegExp( - `^v${WORKSPACE_SCHEMA_VERSION}_(.+)_(\\d+)_([0-9a-f-]+)\\.json$`, - ) - const match = fileName.match(regex) - if (!match) return null + protected parseFileName(fileName: string): WorkspaceMetadata | null { + // Parse: v{schemaVersion}_{name}_{updatedAt}_{id}.json + const regex = new RegExp( + `^v${WORKSPACE_SCHEMA_VERSION}_(.+)_(\\d+)_([0-9a-f-]+)\\.json$`, + ) + const match = fileName.match(regex) + if (!match) return null - const name = decodeURIComponent(match[1]) - const updatedAt = parseInt(match[2], 10) - const id = match[3] + const name = decodeURIComponent(match[1]) + const updatedAt = parseInt(match[2], 10) + const id = match[3] - return { - id, - name, - updatedAt, - createdAt: 0, - schemaVersion: WORKSPACE_SCHEMA_VERSION, - } - } + return { + id, + name, + updatedAt, + createdAt: 0, + schemaVersion: WORKSPACE_SCHEMA_VERSION, + } + } - public async createWorkspace( - initialData: Partial, - ): Promise { - const now = Date.now() - const newWorkspace: Workspace = { - id: uuidv4(), - name: 'New Workspace', - content: [], - chatHistory: [], - metadata: {}, - createdAt: now, - updatedAt: now, - schemaVersion: WORKSPACE_SCHEMA_VERSION, - ...initialData, - } + public async createWorkspace( + initialData: Partial, + ): Promise { + const now = Date.now() + const newWorkspace: Workspace = { + id: uuidv4(), + name: 'New Workspace', + content: [], + chatHistory: [], + metadata: {}, + createdAt: now, + updatedAt: now, + schemaVersion: WORKSPACE_SCHEMA_VERSION, + ...initialData, + } - await this.create(newWorkspace) - return newWorkspace - } + await this.create(newWorkspace) + return newWorkspace + } - public async findById(id: string): Promise { - const allMetadata = await this.listMetadata() - const targetMetadata = allMetadata.find((meta) => meta.id === id) + public async findById(id: string): Promise { + const allMetadata = await this.listMetadata() + const targetMetadata = allMetadata.find((meta) => meta.id === id) - if (!targetMetadata) return null + if (!targetMetadata) return null - return this.read(targetMetadata.fileName) - } + return this.read(targetMetadata.fileName) + } - public async findByName(name: string): Promise { - const allMetadata = await this.listMetadata() - const targetMetadata = allMetadata.find((meta) => meta.name === name) + public async findByName(name: string): Promise { + const allMetadata = await this.listMetadata() + const targetMetadata = allMetadata.find((meta) => meta.name === name) - if (!targetMetadata) return null + if (!targetMetadata) return null - return this.read(targetMetadata.fileName) - } + return this.read(targetMetadata.fileName) + } - public async updateWorkspace( - id: string, - updates: Partial< - Omit - >, - ): Promise { - const workspace = await this.findById(id) - if (!workspace) return null + public async updateWorkspace( + id: string, + updates: Partial< + Omit + >, + ): Promise { + const workspace = await this.findById(id) + if (!workspace) return null - const updatedWorkspace: Workspace = { - ...workspace, - ...updates, - updatedAt: Date.now(), - } + const updatedWorkspace: Workspace = { + ...workspace, + ...updates, + updatedAt: Date.now(), + } - await this.update(workspace, updatedWorkspace) - return updatedWorkspace - } + await this.update(workspace, updatedWorkspace) + return updatedWorkspace + } - public async deleteWorkspace(id: string): Promise { - const allMetadata = await this.listMetadata() - const targetMetadata = allMetadata.find((meta) => meta.id === id) - if (!targetMetadata) return false + public async deleteWorkspace(id: string): Promise { + const allMetadata = await this.listMetadata() + const targetMetadata = allMetadata.find((meta) => meta.id === id) + if (!targetMetadata) return false - await this.delete(targetMetadata.fileName) - return true - } + await this.delete(targetMetadata.fileName) + return true + } - public async listWorkspaces(): Promise { - const metadata = await this.listMetadata() - const sorted = metadata.sort((a, b) => b.updatedAt - a.updatedAt) - return sorted - } + public async listWorkspaces(): Promise { + const metadata = await this.listMetadata() + const sorted = metadata.sort((a, b) => b.updatedAt - a.updatedAt) + return sorted + } - public async addChatToWorkspace( - workspaceId: string, - chatId: string, - chatTitle: string - ): Promise { - const workspace = await this.findById(workspaceId) - if (!workspace) return null + public async addChatToWorkspace( + workspaceName: string, + chatId: string, + chatTitle: string + ): Promise { + const workspace = await this.findByName(workspaceName) + if (!workspace) return null - const existingChatIndex = workspace.chatHistory.findIndex( - chat => chat.id === chatId - ) + const existingChatIndex = workspace.chatHistory.findIndex( + chat => chat.id === chatId + ) - if (existingChatIndex >= 0) { - // 更新已存在的聊天标题 - workspace.chatHistory[existingChatIndex].title = chatTitle - } else { - // 添加新聊天 - workspace.chatHistory.push({ id: chatId, title: chatTitle }) - } + if (existingChatIndex >= 0) { + // 更新已存在的聊天标题 + workspace.chatHistory[existingChatIndex].title = chatTitle + } else { + // 添加新聊天 + workspace.chatHistory.push({ id: chatId, title: chatTitle }) + } - return this.updateWorkspace(workspaceId, { - chatHistory: workspace.chatHistory - }) - } + return this.updateWorkspace(workspace.id, { + chatHistory: workspace.chatHistory + }) + } - public async removeChatFromWorkspace( - workspaceId: string, - chatId: string - ): Promise { - const workspace = await this.findById(workspaceId) - if (!workspace) return null + public async removeChatFromWorkspace( + workspaceId: string, + chatId: string + ): Promise { + const workspace = await this.findById(workspaceId) + if (!workspace) return null - workspace.chatHistory = workspace.chatHistory.filter( - chat => chat.id !== chatId - ) + workspace.chatHistory = workspace.chatHistory.filter( + chat => chat.id !== chatId + ) - return this.updateWorkspace(workspaceId, { - chatHistory: workspace.chatHistory - }) - } + return this.updateWorkspace(workspaceId, { + chatHistory: workspace.chatHistory + }) + } - public async ensureDefaultVaultWorkspace(): Promise { - // 检查是否已存在默认的 vault 工作区 - const existingVault = await this.findByName('vault') - if (existingVault) { - return existingVault - } + public async ensureDefaultVaultWorkspace(): Promise { + // 检查是否已存在默认的 vault 工作区 + const existingVault = await this.findByName('vault') + if (existingVault) { + return existingVault + } - // 创建默认的 vault 工作区 - const defaultWorkspace = await this.createWorkspace({ - name: 'vault', - content: [ - { - type: 'folder', - content: '/' // 整个 vault 根目录 - } - ], - metadata: { - isDefault: true, - description: 'all vault as workspace' - } - }) + // 创建默认的 vault 工作区 + const defaultWorkspace = await this.createWorkspace({ + name: 'vault', + content: [ + { + type: 'folder', + content: '/' // 整个 vault 根目录 + } + ], + metadata: { + isDefault: true, + description: 'all vault as workspace' + } + }) - return defaultWorkspace - } + return defaultWorkspace + } } diff --git a/src/embedworker/EmbeddingManager.ts b/src/embedworker/EmbeddingManager.ts new file mode 100644 index 0000000..76b74b8 --- /dev/null +++ b/src/embedworker/EmbeddingManager.ts @@ -0,0 +1,274 @@ +// 导入完整的嵌入 Worker +// @ts-nocheck +import EmbedWorker from './embed.worker'; + +// 类型定义 +export interface EmbedResult { + vec: number[]; + tokens: number; + embed_input?: string; +} + +export interface ModelLoadResult { + model_loaded: boolean; +} + +export interface ModelUnloadResult { + model_unloaded: boolean; +} + +export interface TokenCountResult { + tokens: number; +} + +export class EmbeddingManager { + private worker: Worker; + private requests = new Map void; reject: (reason?: any) => void }>(); + private nextRequestId = 0; + private isModelLoaded = false; + private currentModelId: string | null = null; + + constructor() { + // 创建 Worker,使用与 pgworker 相同的模式 + this.worker = new EmbedWorker(); + + // 统一监听来自 Worker 的所有消息 + this.worker.onmessage = (event) => { + const { id, result, error } = event.data; + + // 根据返回的 id 找到对应的 Promise 回调 + const request = this.requests.get(id); + + if (request) { + if (error) { + request.reject(new Error(error)); + } else { + request.resolve(result); + } + // 完成后从 Map 中删除 + this.requests.delete(id); + } + }; + + this.worker.onerror = (error) => { + console.error("EmbeddingWorker error:", error); + // 拒绝所有待处理的请求 + this.requests.forEach(request => { + request.reject(error); + }); + this.requests.clear(); + }; + } + + + + /** + * 向 Worker 发送一个请求,并返回一个 Promise,该 Promise 将在收到响应时解析。 + * @param method 要调用的方法 (e.g., 'load', 'embed_batch') + * @param params 方法所需的参数 + */ + private postRequest(method: string, params: any): Promise { + return new Promise((resolve, reject) => { + const id = this.nextRequestId++; + this.requests.set(id, { resolve, reject }); + this.worker.postMessage({ method, params, id }); + }); + } + + /** + * 加载指定的嵌入模型到 Worker 中。 + * @param modelId 模型ID, 例如 'TaylorAI/bge-micro-v2' + * @param useGpu 是否使用GPU加速,默认为false + */ + public async loadModel(modelId: string, useGpu: boolean = false): Promise { + console.log(`Loading embedding model: ${modelId}, GPU: ${useGpu}`); + + try { + // 如果已经加载了相同的模型,直接返回 + if (this.isModelLoaded && this.currentModelId === modelId) { + console.log(`Model ${modelId} already loaded`); + return { model_loaded: true }; + } + + // 如果加载了不同的模型,先卸载 + if (this.isModelLoaded && this.currentModelId !== modelId) { + console.log(`Unloading previous model: ${this.currentModelId}`); + await this.unloadModel(); + } + + const result = await this.postRequest('load', { + model_key: modelId, + use_gpu: useGpu + }); + + this.isModelLoaded = result.model_loaded; + this.currentModelId = result.model_loaded ? modelId : null; + + if (result.model_loaded) { + console.log(`Model ${modelId} loaded successfully`); + } + + return result; + } catch (error) { + console.error(`Failed to load model ${modelId}:`, error); + this.isModelLoaded = false; + this.currentModelId = null; + throw error; + } + } + + /** + * 为一批文本生成嵌入向量。 + * @param texts 要处理的文本数组 + * @returns 返回一个包含向量和 token 信息的对象数组 + */ + public async embedBatch(texts: string[]): Promise { + if (!this.isModelLoaded) { + throw new Error('Model not loaded. Please call loadModel() first.'); + } + + if (!texts || texts.length === 0) { + return []; + } + + console.log(`Generating embeddings for ${texts.length} texts`); + + try { + const inputs = texts.map(text => ({ embed_input: text })); + const results = await this.postRequest('embed_batch', { inputs }); + + console.log(`Generated ${results.length} embeddings`); + return results; + } catch (error) { + console.error('Failed to generate embeddings:', error); + throw error; + } + } + + /** + * 为单个文本生成嵌入向量。 + * @param text 要处理的文本 + * @returns 返回包含向量和 token 信息的对象 + */ + public async embed(text: string): Promise { + if (!text || text.trim().length === 0) { + throw new Error('Text cannot be empty'); + } + + const results = await this.embedBatch([text]); + if (results.length === 0) { + throw new Error('Failed to generate embedding'); + } + + return results[0]; + } + + /** + * 计算文本的 token 数量。 + * @param text 要计算的文本 + */ + public async countTokens(text: string): Promise { + if (!this.isModelLoaded) { + throw new Error('Model not loaded. Please call loadModel() first.'); + } + + if (!text) { + return { tokens: 0 }; + } + + try { + return await this.postRequest('count_tokens', text); + } catch (error) { + console.error('Failed to count tokens:', error); + throw error; + } + } + + /** + * 卸载模型,释放内存。 + */ + public async unloadModel(): Promise { + if (!this.isModelLoaded) { + console.log('No model to unload'); + return { model_unloaded: true }; + } + + try { + console.log(`Unloading model: ${this.currentModelId}`); + const result = await this.postRequest('unload', {}); + + this.isModelLoaded = false; + this.currentModelId = null; + + console.log('Model unloaded successfully'); + return result; + } catch (error) { + console.error('Failed to unload model:', error); + // 即使卸载失败,也重置状态 + this.isModelLoaded = false; + this.currentModelId = null; + throw error; + } + } + + /** + * 检查模型是否已加载。 + */ + public get modelLoaded(): boolean { + return this.isModelLoaded; + } + + /** + * 获取当前加载的模型ID。 + */ + public get currentModel(): string | null { + return this.currentModelId; + } + + /** + * 获取支持的模型列表。 + */ + public getSupportedModels(): string[] { + return [ + 'Xenova/all-MiniLM-L6-v2', + 'Xenova/bge-small-en-v1.5', + 'Xenova/bge-base-en-v1.5', + 'Xenova/jina-embeddings-v2-base-zh', + 'Xenova/jina-embeddings-v2-small-en', + 'Xenova/multilingual-e5-small', + 'Xenova/multilingual-e5-base', + 'Xenova/gte-small', + 'Xenova/e5-small-v2', + 'Xenova/e5-base-v2' + ]; + } + + /** + * 获取模型信息。 + */ + public getModelInfo(modelId: string): { dims: number; maxTokens: number; description: string } | null { + const modelInfoMap: Record = { + 'Xenova/all-MiniLM-L6-v2': { dims: 384, maxTokens: 512, description: 'All-MiniLM-L6-v2 (推荐,轻量级)' }, + 'Xenova/bge-small-en-v1.5': { dims: 384, maxTokens: 512, description: 'BGE-small-en-v1.5' }, + 'Xenova/bge-base-en-v1.5': { dims: 768, maxTokens: 512, description: 'BGE-base-en-v1.5 (更高质量)' }, + 'Xenova/jina-embeddings-v2-base-zh': { dims: 768, maxTokens: 8192, description: 'Jina-v2-base-zh (中英双语)' }, + 'Xenova/jina-embeddings-v2-small-en': { dims: 512, maxTokens: 8192, description: 'Jina-v2-small-en' }, + 'Xenova/multilingual-e5-small': { dims: 384, maxTokens: 512, description: 'E5-small (多语言)' }, + 'Xenova/multilingual-e5-base': { dims: 768, maxTokens: 512, description: 'E5-base (多语言,更高质量)' }, + 'Xenova/gte-small': { dims: 384, maxTokens: 512, description: 'GTE-small' }, + 'Xenova/e5-small-v2': { dims: 384, maxTokens: 512, description: 'E5-small-v2' }, + 'Xenova/e5-base-v2': { dims: 768, maxTokens: 512, description: 'E5-base-v2 (更高质量)' } + }; + + return modelInfoMap[modelId] || null; + } + + /** + * 终止 Worker,释放资源。 + */ + public terminate() { + this.worker.terminate(); + this.requests.clear(); + this.isModelLoaded = false; + } +} diff --git a/src/embedworker/README.md b/src/embedworker/README.md new file mode 100644 index 0000000..6fc6a51 --- /dev/null +++ b/src/embedworker/README.md @@ -0,0 +1,171 @@ +# 本地嵌入功能 + +这个模块提供了在 Web Worker 中运行的本地嵌入功能,使用 Transformers.js 库来生成文本的向量表示。 + +## 功能特性 + +- 🚀 **高性能**: 在 Web Worker 中运行,不阻塞主线程 +- 🔒 **隐私保护**: 完全本地运行,数据不离开设备 +- 🎯 **多模型支持**: 支持多种预训练的嵌入模型 +- 💾 **内存管理**: 自动管理模型加载和卸载 +- 🔧 **类型安全**: 完整的 TypeScript 类型支持 + +## 快速开始 + +### 基本使用 + +```typescript +import { embeddingManager } from './embedworker'; + +// 加载模型 +await embeddingManager.loadModel('Xenova/all-MiniLM-L6-v2'); + +// 生成单个文本的嵌入向量 +const result = await embeddingManager.embed('Hello, world!'); +console.log(result.vec); // [0.1234, -0.5678, ...] +console.log(result.tokens); // 3 + +// 批量生成嵌入向量 +const texts = ['Hello', 'World', 'AI is amazing']; +const results = await embeddingManager.embedBatch(texts); + +// 计算 token 数量 +const tokenCount = await embeddingManager.countTokens('How many tokens?'); +console.log(tokenCount.tokens); // 4 +``` + +### 高级使用 + +```typescript +import { EmbeddingManager } from './embedworker'; + +// 创建自定义实例 +const customEmbedding = new EmbeddingManager(); + +// 使用 GPU 加速(如果支持) +await customEmbedding.loadModel('Xenova/all-MiniLM-L6-v2', true); + +// 检查模型状态 +console.log(customEmbedding.modelLoaded); // true +console.log(customEmbedding.currentModel); // 'TaylorAI/bge-micro-v2' + +// 获取支持的模型列表 +const models = customEmbedding.getSupportedModels(); +console.log(models); + +// 获取模型信息 +const modelInfo = customEmbedding.getModelInfo('Xenova/all-MiniLM-L6-v2'); +console.log(modelInfo); // { dims: 384, maxTokens: 512, description: '...' } + +// 切换模型 +await customEmbedding.loadModel('Snowflake/snowflake-arctic-embed-xs'); + +// 清理资源 +await customEmbedding.unloadModel(); +customEmbedding.terminate(); +``` + +## 支持的模型 + +| 模型 | 维度 | 最大Token | 描述 | +|------|------|-----------|------| +| Xenova/all-MiniLM-L6-v2 | 384 | 512 | All-MiniLM-L6-v2 (推荐,轻量级) | +| Xenova/bge-small-en-v1.5 | 384 | 512 | BGE-small-en-v1.5 | +| Xenova/bge-base-en-v1.5 | 768 | 512 | BGE-base-en-v1.5 (更高质量) | +| Xenova/jina-embeddings-v2-base-zh | 768 | 8192 | Jina-v2-base-zh (中英双语) | +| Xenova/jina-embeddings-v2-small-en | 512 | 8192 | Jina-v2-small-en | +| Xenova/multilingual-e5-small | 384 | 512 | E5-small (多语言) | +| Xenova/multilingual-e5-base | 768 | 512 | E5-base (多语言,更高质量) | +| Xenova/gte-small | 384 | 512 | GTE-small | +| Xenova/e5-small-v2 | 384 | 512 | E5-small-v2 | +| Xenova/e5-base-v2 | 768 | 512 | E5-base-v2 (更高质量) | + +## API 参考 + +### EmbeddingManager + +#### 方法 + +- `loadModel(modelId: string, useGpu?: boolean): Promise` + - 加载指定的嵌入模型 + - `modelId`: 模型标识符 + - `useGpu`: 是否使用 GPU 加速(默认 false) + +- `embed(text: string): Promise` + - 为单个文本生成嵌入向量 + - 返回包含向量和 token 数量的结果 + +- `embedBatch(texts: string[]): Promise` + - 为多个文本批量生成嵌入向量 + - 更高效的批处理方式 + +- `countTokens(text: string): Promise` + - 计算文本的 token 数量 + +- `unloadModel(): Promise` + - 卸载当前模型,释放内存 + +- `terminate(): void` + - 终止 Worker,释放所有资源 + +#### 属性 + +- `modelLoaded: boolean` - 模型是否已加载 +- `currentModel: string | null` - 当前加载的模型ID + +#### 工具方法 + +- `getSupportedModels(): string[]` - 获取支持的模型列表 +- `getModelInfo(modelId: string)` - 获取模型详细信息 + +### 类型定义 + +```typescript +interface EmbedResult { + vec: number[]; // 嵌入向量 + tokens: number; // token 数量 + embed_input?: string; // 原始输入文本 +} + +interface ModelLoadResult { + model_loaded: boolean; // 是否加载成功 +} + +interface ModelUnloadResult { + model_unloaded: boolean; // 是否卸载成功 +} + +interface TokenCountResult { + tokens: number; // token 数量 +} +``` + +## 错误处理 + +```typescript +try { + await embeddingManager.loadModel('invalid-model'); +} catch (error) { + console.error('加载模型失败:', error.message); +} + +try { + const result = await embeddingManager.embed(''); +} catch (error) { + console.error('文本不能为空:', error.message); +} +``` + +## 性能考虑 + +1. **模型加载**: 首次加载模型需要下载和初始化,可能需要几秒到几分钟 +2. **批处理**: 使用 `embedBatch` 比多次调用 `embed` 更高效 +3. **内存使用**: 大模型需要更多内存,注意设备限制 +4. **GPU 加速**: 在支持 WebGPU 的浏览器中可以启用 GPU 加速 + +## 注意事项 + +- 首次使用某个模型时需要从 Hugging Face 下载,请确保网络连接正常 +- 模型文件会被浏览器缓存,后续使用会更快 +- 在移动设备上使用大模型可能会遇到内存限制 +- Worker 在后台运行,不会阻塞 UI 线程 diff --git a/src/embedworker/embed.worker.ts b/src/embedworker/embed.worker.ts new file mode 100644 index 0000000..c7ecd0a --- /dev/null +++ b/src/embedworker/embed.worker.ts @@ -0,0 +1,353 @@ +// 完整的嵌入 Worker,使用 Transformers.js +console.log('Embedding worker loaded'); + +// 类型定义 +interface EmbedInput { + embed_input: string; +} + +interface EmbedResult { + vec: number[]; + tokens: number; + embed_input?: string; +} + +interface WorkerMessage { + method: string; + params: any; + id: number; + worker_id?: string; +} + +interface WorkerResponse { + id: number; + result?: any; + error?: string; + worker_id?: string; +} + +// 全局变量 +let model: any = null; +let pipeline: any = null; +let tokenizer: any = null; +let processing_message = false; +let transformersLoaded = false; + +// 动态导入 Transformers.js +async function loadTransformers() { + if (transformersLoaded) return; + + try { + console.log('Loading Transformers.js...'); + + // 尝试使用旧版本的 Transformers.js,它在 Worker 中更稳定 + const { pipeline: pipelineFactory, env, AutoTokenizer } = await import('@xenova/transformers'); + + // 配置环境以适应浏览器 Worker + env.allowLocalModels = false; + env.allowRemoteModels = true; + + // 配置 WASM 后端 + env.backends.onnx.wasm.numThreads = 2; // 在 Worker 中使用单线程 + env.backends.onnx.wasm.simd = true; + + // 禁用 Node.js 特定功能 + env.useFS = false; + env.useBrowserCache = true; + + // 存储导入的函数 + (globalThis as any).pipelineFactory = pipelineFactory; + (globalThis as any).AutoTokenizer = AutoTokenizer; + (globalThis as any).env = env; + + transformersLoaded = true; + console.log('Transformers.js loaded successfully'); + } catch (error) { + console.error('Failed to load Transformers.js:', error); + throw new Error(`Failed to load Transformers.js: ${error}`); + } +} + +// 加载模型 +async function loadModel(modelKey: string, useGpu: boolean = false) { + try { + console.log(`Loading model: ${modelKey}, GPU: ${useGpu}`); + + // 确保 Transformers.js 已加载 + await loadTransformers(); + + const pipelineFactory = (globalThis as any).pipelineFactory; + const AutoTokenizer = (globalThis as any).AutoTokenizer; + const env = (globalThis as any).env; + + // 配置管道选项 + const pipelineOpts: any = { + quantized: true, + progress_callback: (progress: any) => { + console.log('Model loading progress:', progress); + } + }; + + if (useGpu && typeof navigator !== 'undefined' && 'gpu' in navigator) { + console.log('[Transformers] Attempting to use GPU'); + try { + pipelineOpts.device = 'webgpu'; + pipelineOpts.dtype = 'fp32'; + } catch (error) { + console.warn('[Transformers] GPU not available, falling back to CPU'); + } + } else { + console.log('[Transformers] Using CPU'); + } + + // 创建嵌入管道 + pipeline = await pipelineFactory('feature-extraction', modelKey, pipelineOpts); + + // 创建分词器 + tokenizer = await AutoTokenizer.from_pretrained(modelKey); + + model = { + loaded: true, + model_key: modelKey, + use_gpu: useGpu + }; + + console.log(`Model ${modelKey} loaded successfully`); + return { model_loaded: true }; + + } catch (error) { + console.error('Error loading model:', error); + throw new Error(`Failed to load model: ${error}`); + } +} + +// 卸载模型 +async function unloadModel() { + try { + console.log('Unloading model...'); + + if (pipeline) { + if (pipeline.destroy) { + pipeline.destroy(); + } + pipeline = null; + } + + if (tokenizer) { + tokenizer = null; + } + + model = null; + + console.log('Model unloaded successfully'); + return { model_unloaded: true }; + + } catch (error) { + console.error('Error unloading model:', error); + throw new Error(`Failed to unload model: ${error}`); + } +} + +// 计算 token 数量 +async function countTokens(input: string) { + try { + if (!tokenizer) { + throw new Error('Tokenizer not loaded'); + } + + const { input_ids } = await tokenizer(input); + return { tokens: input_ids.data.length }; + + } catch (error) { + console.error('Error counting tokens:', error); + throw new Error(`Failed to count tokens: ${error}`); + } +} + +// 生成嵌入向量 +async function embedBatch(inputs: EmbedInput[]): Promise { + try { + if (!pipeline || !tokenizer) { + throw new Error('Model not loaded'); + } + + console.log(`Processing ${inputs.length} inputs`); + + // 过滤空输入 + const filteredInputs = inputs.filter(item => item.embed_input && item.embed_input.length > 0); + + if (filteredInputs.length === 0) { + return []; + } + + // 批处理大小(可以根据需要调整) + const batchSize = 1; + + if (filteredInputs.length > batchSize) { + console.log(`Processing ${filteredInputs.length} inputs in batches of ${batchSize}`); + const results: EmbedResult[] = []; + + for (let i = 0; i < filteredInputs.length; i += batchSize) { + const batch = filteredInputs.slice(i, i + batchSize); + const batchResults = await processBatch(batch); + results.push(...batchResults); + } + + return results; + } + + return await processBatch(filteredInputs); + + } catch (error) { + console.error('Error in embed batch:', error); + throw new Error(`Failed to generate embeddings: ${error}`); + } +} + +// 处理单个批次 +async function processBatch(batchInputs: EmbedInput[]): Promise { + try { + // 计算每个输入的 token 数量 + const tokens = await Promise.all( + batchInputs.map(item => countTokens(item.embed_input)) + ); + + // 准备嵌入输入(处理超长文本) + const maxTokens = 512; // 大多数模型的最大 token 限制 + const embedInputs = await Promise.all( + batchInputs.map(async (item, i) => { + if (tokens[i].tokens < maxTokens) { + return item.embed_input; + } + + // 截断超长文本 + let tokenCt = tokens[i].tokens; + let truncatedInput = item.embed_input; + + while (tokenCt > maxTokens) { + const pct = maxTokens / tokenCt; + const maxChars = Math.floor(truncatedInput.length * pct * 0.9); + truncatedInput = truncatedInput.substring(0, maxChars) + '...'; + tokenCt = (await countTokens(truncatedInput)).tokens; + } + + tokens[i].tokens = tokenCt; + return truncatedInput; + }) + ); + + // 生成嵌入向量 + const resp = await pipeline(embedInputs, { pooling: 'mean', normalize: true }); + + // 处理结果 + return batchInputs.map((item, i) => ({ + vec: Array.from(resp[i].data).map((val: number) => Math.round(val * 1e8) / 1e8), + tokens: tokens[i].tokens, + embed_input: item.embed_input + })); + + } catch (error) { + console.error('Error processing batch:', error); + + // 如果批处理失败,尝试逐个处理 + return Promise.all( + batchInputs.map(async (item) => { + try { + const result = await pipeline(item.embed_input, { pooling: 'mean', normalize: true }); + const tokenCount = await countTokens(item.embed_input); + + return { + vec: Array.from(result[0].data).map((val: number) => Math.round(val * 1e8) / 1e8), + tokens: tokenCount.tokens, + embed_input: item.embed_input + }; + } catch (singleError) { + console.error('Error processing single item:', singleError); + return { + vec: [], + tokens: 0, + embed_input: item.embed_input, + error: (singleError as Error).message + } as any; + } + }) + ); + } +} + +// 处理消息 +async function processMessage(data: WorkerMessage): Promise { + const { method, params, id, worker_id } = data; + + try { + let result: any; + + switch (method) { + case 'load': + console.log('Load method called with params:', params); + result = await loadModel(params.model_key, params.use_gpu || false); + break; + + case 'unload': + console.log('Unload method called'); + result = await unloadModel(); + break; + + case 'embed_batch': + console.log('Embed batch method called'); + if (!model) { + throw new Error('Model not loaded'); + } + + // 等待之前的处理完成 + if (processing_message) { + while (processing_message) { + await new Promise(resolve => setTimeout(resolve, 100)); + } + } + + processing_message = true; + result = await embedBatch(params.inputs); + processing_message = false; + break; + + case 'count_tokens': + console.log('Count tokens method called'); + if (!model) { + throw new Error('Model not loaded'); + } + + // 等待之前的处理完成 + if (processing_message) { + while (processing_message) { + await new Promise(resolve => setTimeout(resolve, 100)); + } + } + + processing_message = true; + result = await countTokens(params); + processing_message = false; + break; + + default: + throw new Error(`Unknown method: ${method}`); + } + + return { id, result, worker_id }; + + } catch (error) { + console.error('Error processing message:', error); + processing_message = false; + return { id, error: (error as Error).message, worker_id }; + } +} + +// 监听消息 +self.addEventListener('message', async (event) => { + console.log('Worker received message:', event.data); + const response = await processMessage(event.data); + console.log('Worker sending response:', response); + self.postMessage(response); +}); + +console.log('Embedding worker ready'); diff --git a/src/embedworker/index.ts b/src/embedworker/index.ts new file mode 100644 index 0000000..645a422 --- /dev/null +++ b/src/embedworker/index.ts @@ -0,0 +1,15 @@ +import { EmbeddingManager } from "./EmbeddingManager"; + +// 创建一个单例的 Manager,以便在整个应用中共享同一个 Worker +export const embeddingManager = new EmbeddingManager(); + +// 导出 EmbeddingManager 类以便其他地方使用 +export { EmbeddingManager }; + +// 导出类型定义 +export type { + EmbedResult, + ModelLoadResult, + ModelUnloadResult, + TokenCountResult +} from './EmbeddingManager'; diff --git a/src/hooks/use-chat-history.ts b/src/hooks/use-chat-history.ts index cf28bb3..8d4eb8d 100644 --- a/src/hooks/use-chat-history.ts +++ b/src/hooks/use-chat-history.ts @@ -4,8 +4,10 @@ import { useCallback, useEffect, useMemo, useState } from 'react' import { editorStateToPlainText } from '../components/chat-view/chat-input/utils/editor-state-to-plain-text' import { useApp } from '../contexts/AppContext' +import { useSettings } from '../contexts/SettingsContext' import { ChatManager } from '../database/json/chat/ChatManager' import { deserializeChatMessage, serializeChatMessage } from '../database/json/utils' +import { WorkspaceManager } from '../database/json/workspace/WorkspaceManager' import { ChatConversationMeta, ChatMessage, ChatUserMessage } from '../types/chat' type UseChatHistory = { @@ -22,7 +24,9 @@ type UseChatHistory = { export function useChatHistory(): UseChatHistory { const app = useApp() - const chatManager = useMemo(() => new ChatManager(app), [app]) + const { settings } = useSettings() + const workspaceManager = useMemo(() => new WorkspaceManager(app), [app]) + const chatManager = useMemo(() => new ChatManager(app, workspaceManager), [app, workspaceManager]) const [chatList, setChatList] = useState([]) @@ -31,6 +35,9 @@ export function useChatHistory(): UseChatHistory { setChatList(conversations) }, [chatManager]) + // 获取当前工作区 + const currentWorkspace = settings.workspace || 'vault' + useEffect(() => { void fetchChatList() }, [fetchChatList]) @@ -52,7 +59,7 @@ export function useChatHistory(): UseChatHistory { } else { const firstUserMessage = messages.find((v) => v.role === 'user') as ChatUserMessage - const newChat = await chatManager.createChat({ + await chatManager.createChat({ id, title: firstUserMessage?.content ? editorStateToPlainText(firstUserMessage.content).substring( @@ -61,6 +68,7 @@ export function useChatHistory(): UseChatHistory { ) : 'New chat', messages: serializedMessages, + workspace: currentWorkspace, }) } @@ -71,7 +79,7 @@ export function useChatHistory(): UseChatHistory { maxWait: 1000, }, ), - [chatManager, fetchChatList], + [chatManager, fetchChatList, settings, workspaceManager], ) const deleteConversation = useCallback( diff --git a/src/main.ts b/src/main.ts index ac3e980..9ef5c7a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,7 +1,7 @@ // @ts-nocheck import { EditorView } from '@codemirror/view' // import { PGlite } from '@electric-sql/pglite' -import { App, Editor, MarkdownView, Modal, Notice, Plugin, TFile } from 'obsidian' +import { Editor, MarkdownView, Modal, Notice, Plugin, TFile } from 'obsidian' import { ApplyView } from './ApplyView' import { ChatView } from './ChatView' @@ -388,7 +388,7 @@ export default class InfioPlugin extends Plugin { name: '测试 Dataview(简单查询)', callback: async () => { console.log('开始测试 Dataview...'); - + if (!this.dataviewManager) { new Notice('DataviewManager 未初始化'); return; @@ -401,11 +401,11 @@ export default class InfioPlugin extends Plugin { } console.log('Dataview API 可用,执行简单查询...'); - + try { // 执行一个最简单的查询 const result = await this.dataviewManager.executeQuery('LIST FROM ""'); - + if (result.success) { new Notice('Dataview 查询成功!结果已在控制台输出'); console.log('查询结果:', result.data); @@ -419,6 +419,47 @@ export default class InfioPlugin extends Plugin { } }, }); + + // 添加本地嵌入测试命令 + this.addCommand({ + id: 'test-local-embed', + name: '测试本地嵌入模型', + callback: async () => { + try { + // 动态导入嵌入管理器 + const { embeddingManager } = await import('./embedworker/index'); + + // 加载模型 + await embeddingManager.loadModel("Xenova/all-MiniLM-L6-v2", true); + + // 测试嵌入 "hello world" + const testText = "hello world"; + + const result = await embeddingManager.embed(testText); + + // 显示结果 + const resultMessage = ` + 嵌入测试完成! + 文本: "${testText}" + Token 数量: ${result.tokens} + 向量维度: ${result.vec.length} + 向量前4个值: [${result.vec.slice(0, 4).map(v => v.toFixed(4)).join(', ')}...] + `.trim(); + + console.log('本地嵌入测试结果:', result); + + // 创建模态框显示结果 + const modal = new Modal(this.app); + modal.titleEl.setText('本地嵌入测试结果'); + modal.contentEl.createEl('pre', { text: resultMessage }); + modal.open(); + + } catch (error) { + console.error('嵌入测试失败:', error); + new Notice(`嵌入测试失败: ${error.message}`, 5000); + } + }, + }); } onunload() { diff --git a/src/types/chat.ts b/src/types/chat.ts index c78f7f2..a709ef0 100644 --- a/src/types/chat.ts +++ b/src/types/chat.ts @@ -81,4 +81,5 @@ export type ChatConversationMeta = { title: string createdAt: number updatedAt: number + workspace?: string } diff --git a/src/utils/parse-infio-block.ts b/src/utils/parse-infio-block.ts index b7b20de..541d485 100644 --- a/src/utils/parse-infio-block.ts +++ b/src/utils/parse-infio-block.ts @@ -1,4 +1,4 @@ -// @ts-expect-error - parse5 and JSON5 types are not perfectly aligned with the dynamic parsing logic +// @ts-nocheck import JSON5 from 'json5' import { parseFragment } from 'parse5' diff --git a/tsconfig.json b/tsconfig.json index 5678fe4..68244f2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -71,5 +71,5 @@ // } }, // Specify which files to include in compilation - "include": ["src/**/*.ts", "src/**/*.tsx", "__mocks__"] + "include": ["src/**/*.ts", "src/**/*.tsx", "__mocks__", "src/embedworker/*.worker.ts", "src/embedworker/*.worker.js"] }