From f533902c755b5bc9e95c7df6122cc70cbe078ecf Mon Sep 17 00:00:00 2001 From: Aaron Pham Date: Sun, 5 Oct 2025 19:50:52 -0400 Subject: [PATCH] feat: semantic search (1/n) Signed-off-by: Aaron Pham --- docs/embeddings/hnsw.bin | Bin 0 -> 8480 bytes docs/embeddings/manifest.json | 1 + docs/embeddings/vectors-000.bin | Bin 0 -> 261120 bytes index.d.ts | 1 + package-lock.json | 810 +++++++++++------- package.json | 2 + quartz.config.ts | 16 +- quartz/cfg.ts | 28 + quartz/components/Search.tsx | 63 +- quartz/components/renderPage.tsx | 7 + quartz/components/scripts/search.inline.ts | 802 +++++++++++++---- quartz/components/scripts/semantic.inline.ts | 182 ++++ quartz/components/scripts/util.ts | 65 ++ quartz/components/styles/search.scss | 97 ++- quartz/embed_build.py | 542 ++++++++++++ quartz/plugins/emitters/404.tsx | 2 +- quartz/plugins/emitters/componentResources.ts | 47 +- quartz/plugins/emitters/contentPage.tsx | 2 +- quartz/plugins/emitters/folderPage.tsx | 2 +- quartz/plugins/emitters/index.ts | 3 +- quartz/plugins/emitters/semantic.ts | 235 +++++ quartz/plugins/emitters/tagPage.tsx | 2 +- quartz/workers/semantic.worker.ts | 548 ++++++++++++ 23 files changed, 2955 insertions(+), 502 deletions(-) create mode 100644 docs/embeddings/hnsw.bin create mode 100644 docs/embeddings/manifest.json create mode 100644 docs/embeddings/vectors-000.bin create mode 100644 quartz/components/scripts/semantic.inline.ts create mode 100644 quartz/embed_build.py create mode 100644 quartz/plugins/emitters/semantic.ts create mode 100644 quartz/workers/semantic.worker.ts diff --git a/docs/embeddings/hnsw.bin b/docs/embeddings/hnsw.bin new file mode 100644 index 0000000000000000000000000000000000000000..3cdd4c1185497b61870c1671d7121621d5198021 GIT binary patch literal 8480 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 Y4w47ygEl9Sn-)W!4QdAtB!-180MUmoHUIzs literal 0 HcmV?d00001 diff --git a/docs/embeddings/manifest.json b/docs/embeddings/manifest.json new file mode 100644 index 000000000..f690b4f51 --- /dev/null +++ b/docs/embeddings/manifest.json @@ -0,0 +1 @@ +{"version": 2, "dims": 768, "dtype": "fp32", "normalized": true, "rows": 85, "shardSizeRows": 1024, "vectors": {"dtype": "fp32", "rows": 85, "dims": 768, "shards": [{"path": "/embeddings/vectors-000.bin", "rows": 85, "rowOffset": 0, "byteLength": 261120, "sha256": "4bab644c8566e05be7a7bfd7511c3e781cb055bd4122305a98537973c2dcda24", "byteStride": 3072}]}, "ids": ["advanced/architecture#chunk0", "advanced/architecture#chunk1", "advanced/creating-components#chunk0", "advanced/creating-components#chunk1", "advanced/creating-components#chunk2", "advanced/making-plugins#chunk0", "advanced/making-plugins#chunk1", "advanced/making-plugins#chunk2", "advanced/making-plugins#chunk3", "advanced/paths#chunk0", "authoring-content#chunk0", "build", "configuration#chunk0", "configuration#chunk1", "features/Citations#chunk0", "features/Docker-Support", "features/Latex#chunk0", "features/Mermaid-diagrams#chunk0", "features/Obsidian-compatibility", "features/OxHugo-compatibility", "features/RSS-Feed", "features/Roam-Research-compatibility", "features/SPA-Routing", "features/backlinks", "features/breadcrumbs#chunk0", "features/callouts#chunk0", "features/comments#chunk0", "features/darkmode", "features/explorer#chunk0", "features/explorer#chunk1", "features/folder-and-tag-listings#chunk0", "features/full-text-search#chunk0", "features/graph-view#chunk0", "features/i18n", "features/popover-previews", "features/private-pages#chunk0", "features/reader-mode", "features/recent-notes#chunk0", "features/social-images", "features/syntax-highlighting#chunk0", "features/table-of-contents", "features/wikilinks#chunk0", "hosting#chunk0", "hosting#chunk1", "hosting#chunk2", "index#chunk0", "layout-components#chunk0", "layout#chunk0", "migrating-from-Quartz-3#chunk0", "philosophy#chunk0", "plugins/AliasRedirects", "plugins/Assets", "plugins/CNAME", "plugins/Citations", "plugins/ComponentResources", "plugins/ContentIndex#chunk0", "plugins/ContentPage", "plugins/CrawlLinks#chunk0", "plugins/CreatedModifiedDate", "plugins/CustomOgImages#chunk0", "plugins/CustomOgImages#chunk1", "plugins/CustomOgImages#chunk2", "plugins/CustomOgImages#chunk3", "plugins/CustomOgImages#chunk4", "plugins/Description", "plugins/ExplicitPublish", "plugins/Favicon", "plugins/FolderPage", "plugins/Frontmatter#chunk0", "plugins/GitHubFlavoredMarkdown", "plugins/HardLineBreaks", "plugins/Latex", "plugins/NotFoundPage", "plugins/ObsidianFlavoredMarkdown#chunk0", "plugins/OxHugoFlavoredMarkdown#chunk0", "plugins/RemoveDrafts", "plugins/RoamFlavoredMarkdown#chunk0", "plugins/Static", "plugins/SyntaxHighlighting", "plugins/TableOfContents", "plugins/TagPage", "setting-up-your-GitHub-repository#chunk0", "showcase", "tags/component", "upgrading"], "titles": ["Architecture", "Architecture", "Creating your own Quartz components", "Creating your own Quartz components", "Creating your own Quartz components", "Making your own plugins", "Making your own plugins", "Making your own plugins", "Making your own plugins", "Paths in Quartz", "Authoring Content", "Building your Quartz", "Configuration", "Configuration", "Citations", "Docker Support", "LaTeX", "Mermaid Diagrams", "Obsidian Compatibility", "OxHugo Compatibility", "RSS Feed", "Roam Research Compatibility", "SPA Routing", "Backlinks", "Breadcrumbs", "Callouts", "Comments", "Darkmode", "Explorer", "Explorer", "Folder and Tag Listings", "Full-text Search", "Graph View", "Internationalization", "Popover Previews", "Private Pages", "Reader Mode", "Recent Notes", "Social Media Preview Cards", "Syntax Highlighting", "Table of Contents", "Wikilinks", "Hosting", "Hosting", "Hosting", "Welcome to Quartz 4", "Higher-Order Layout Components", "Layout", "Migrating from Quartz 3", "Philosophy of Quartz", "AliasRedirects", "Assets", "CNAME", "Citations", "ComponentResources", "ContentIndex", "ContentPage", "CrawlLinks", "CreatedModifiedDate", "Custom OG Images", "Custom OG Images", "Custom OG Images", "Custom OG Images", "Custom OG Images", "Description", "ExplicitPublish", "Favicon", "FolderPage", "Frontmatter", "GitHubFlavoredMarkdown", "HardLineBreaks", "Latex", "NotFoundPage", "ObsidianFlavoredMarkdown", "OxHugoFlavoredMarkdown", "RemoveDrafts", "RoamFlavoredMarkdown", "Static", "SyntaxHighlighting", "TableOfContents", "TagPage", "Setting up your GitHub repository", "Quartz Showcase", "Components", "Upgrading Quartz"], "chunkMetadata": {"advanced/architecture#chunk0": {"parentSlug": "advanced/architecture", "chunkId": 0}, "advanced/architecture#chunk1": {"parentSlug": "advanced/architecture", "chunkId": 1}, "advanced/creating-components#chunk0": {"parentSlug": "advanced/creating-components", "chunkId": 0}, "advanced/creating-components#chunk1": {"parentSlug": "advanced/creating-components", "chunkId": 1}, "advanced/creating-components#chunk2": {"parentSlug": "advanced/creating-components", "chunkId": 2}, "advanced/making-plugins#chunk0": {"parentSlug": "advanced/making-plugins", "chunkId": 0}, "advanced/making-plugins#chunk1": {"parentSlug": "advanced/making-plugins", "chunkId": 1}, "advanced/making-plugins#chunk2": {"parentSlug": "advanced/making-plugins", "chunkId": 2}, "advanced/making-plugins#chunk3": {"parentSlug": "advanced/making-plugins", "chunkId": 3}, "advanced/paths#chunk0": {"parentSlug": "advanced/paths", "chunkId": 0}, "authoring-content#chunk0": {"parentSlug": "authoring-content", "chunkId": 0}, "configuration#chunk0": {"parentSlug": "configuration", "chunkId": 0}, "configuration#chunk1": {"parentSlug": "configuration", "chunkId": 1}, "features/Citations#chunk0": {"parentSlug": "features/Citations", "chunkId": 0}, "features/Latex#chunk0": {"parentSlug": "features/Latex", "chunkId": 0}, "features/Mermaid-diagrams#chunk0": {"parentSlug": "features/Mermaid-diagrams", "chunkId": 0}, "features/breadcrumbs#chunk0": {"parentSlug": "features/breadcrumbs", "chunkId": 0}, "features/callouts#chunk0": {"parentSlug": "features/callouts", "chunkId": 0}, "features/comments#chunk0": {"parentSlug": "features/comments", "chunkId": 0}, "features/explorer#chunk0": {"parentSlug": "features/explorer", "chunkId": 0}, "features/explorer#chunk1": {"parentSlug": "features/explorer", "chunkId": 1}, "features/folder-and-tag-listings#chunk0": {"parentSlug": "features/folder-and-tag-listings", "chunkId": 0}, "features/full-text-search#chunk0": {"parentSlug": "features/full-text-search", "chunkId": 0}, "features/graph-view#chunk0": {"parentSlug": "features/graph-view", "chunkId": 0}, "features/private-pages#chunk0": {"parentSlug": "features/private-pages", "chunkId": 0}, "features/recent-notes#chunk0": {"parentSlug": "features/recent-notes", "chunkId": 0}, "features/syntax-highlighting#chunk0": {"parentSlug": "features/syntax-highlighting", "chunkId": 0}, "features/wikilinks#chunk0": {"parentSlug": "features/wikilinks", "chunkId": 0}, "hosting#chunk0": {"parentSlug": "hosting", "chunkId": 0}, "hosting#chunk1": {"parentSlug": "hosting", "chunkId": 1}, "hosting#chunk2": {"parentSlug": "hosting", "chunkId": 2}, "index#chunk0": {"parentSlug": "index", "chunkId": 0}, "layout-components#chunk0": {"parentSlug": "layout-components", "chunkId": 0}, "layout#chunk0": {"parentSlug": "layout", "chunkId": 0}, "migrating-from-Quartz-3#chunk0": {"parentSlug": "migrating-from-Quartz-3", "chunkId": 0}, "philosophy#chunk0": {"parentSlug": "philosophy", "chunkId": 0}, "plugins/ContentIndex#chunk0": {"parentSlug": "plugins/ContentIndex", "chunkId": 0}, "plugins/CrawlLinks#chunk0": {"parentSlug": "plugins/CrawlLinks", "chunkId": 0}, "plugins/CustomOgImages#chunk0": {"parentSlug": "plugins/CustomOgImages", "chunkId": 0}, "plugins/CustomOgImages#chunk1": {"parentSlug": "plugins/CustomOgImages", "chunkId": 1}, "plugins/CustomOgImages#chunk2": {"parentSlug": "plugins/CustomOgImages", "chunkId": 2}, "plugins/CustomOgImages#chunk3": {"parentSlug": "plugins/CustomOgImages", "chunkId": 3}, "plugins/CustomOgImages#chunk4": {"parentSlug": "plugins/CustomOgImages", "chunkId": 4}, "plugins/Frontmatter#chunk0": {"parentSlug": "plugins/Frontmatter", "chunkId": 0}, "plugins/ObsidianFlavoredMarkdown#chunk0": {"parentSlug": "plugins/ObsidianFlavoredMarkdown", "chunkId": 0}, "plugins/OxHugoFlavoredMarkdown#chunk0": {"parentSlug": "plugins/OxHugoFlavoredMarkdown", "chunkId": 0}, "plugins/RoamFlavoredMarkdown#chunk0": {"parentSlug": "plugins/RoamFlavoredMarkdown", "chunkId": 0}, "setting-up-your-GitHub-repository#chunk0": {"parentSlug": "setting-up-your-GitHub-repository", "chunkId": 0}}, "hnsw": {"M": 16, "efConstruction": 200, "entryPoint": 0, "maxLevel": 3, "graph": {"path": "/embeddings/hnsw.bin", "sha256": "0d69820c8c495b981e710c04c7557425ed105101ce8674272a7c8f8867f71a18", "levels": [{"level": 0, "indptr": {"offset": 0, "elements": 86, "byteLength": 344}, "indices": {"offset": 344, "elements": 1360, "byteLength": 5440}}, {"level": 1, "indptr": {"offset": 5784, "elements": 86, "byteLength": 344}, "indices": {"offset": 6128, "elements": 384, "byteLength": 1536}}, {"level": 2, "indptr": {"offset": 7664, "elements": 86, "byteLength": 344}, "indices": {"offset": 8008, "elements": 30, "byteLength": 120}}, {"level": 3, "indptr": {"offset": 8128, "elements": 86, "byteLength": 344}, "indices": {"offset": 8472, "elements": 2, "byteLength": 8}}]}}} \ No newline at end of file diff --git a/docs/embeddings/vectors-000.bin b/docs/embeddings/vectors-000.bin new file mode 100644 index 0000000000000000000000000000000000000000..f258f316723c1ffc0d32bd9032d4a67fd7e17564 GIT binary patch literal 261120 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
X@3)tJd*zGXS@k>h*%~iZvsL@q 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 KwfAt4rZoTsCIJWl literal 0 HcmV?d00001 diff --git a/index.d.ts b/index.d.ts index 9011ee38f..df9db0786 100644 --- a/index.d.ts +++ b/index.d.ts @@ -13,3 +13,4 @@ interface CustomEventMap { type ContentIndex = Record declare const fetchData: Promise +declare const semanticCfg: import("./quartz/cfg").GlobalConfiguration["semanticSearch"] diff --git a/package-lock.json b/package-lock.json index 25df1907d..b19a2b72e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "@clack/prompts": "^0.11.0", "@floating-ui/dom": "^1.7.4", + "@huggingface/transformers": "^3.7.5", "@myriaddreamin/rehype-typst": "^0.6.0", "@napi-rs/simple-git": "0.1.22", "@tweenjs/tween.js": "^25.0.0", @@ -35,6 +36,7 @@ "mdast-util-to-string": "^4.0.0", "micromorph": "^0.4.5", "minimatch": "^10.0.3", + "onnxruntime-web": "^1.23.0", "pixi.js": "^8.13.2", "preact": "^10.27.2", "preact-render-to-string": "^6.6.1", @@ -647,6 +649,47 @@ "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", "license": "MIT" }, + "node_modules/@huggingface/jinja": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.5.1.tgz", + "integrity": "sha512-yUZLld4lrM9iFxHCwFQ7D1HW2MWMwSbeB7WzWqFYDWK+rEb+WldkLdAJxUPOmgICMHZLzZGVcVjFh3w/YGubng==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@huggingface/transformers": { + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/@huggingface/transformers/-/transformers-3.7.5.tgz", + "integrity": "sha512-5jvrIwHyRXfOKVaGKYvUZM6ZjJKQXWeKzIOdKBE5pdzPSNzTwBNx5NdWcGElf4Ddv7Dl2mWsvJh+G5RnCUxMmA==", + "license": "Apache-2.0", + "dependencies": { + "@huggingface/jinja": "^0.5.1", + "onnxruntime-node": "1.21.0", + "onnxruntime-web": "1.22.0-dev.20250409-89f8206ba4", + "sharp": "^0.34.1" + } + }, + "node_modules/@huggingface/transformers/node_modules/onnxruntime-common": { + "version": "1.22.0-dev.20250409-89f8206ba4", + "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.22.0-dev.20250409-89f8206ba4.tgz", + "integrity": "sha512-vDJMkfCfb0b1A836rgHj+ORuZf4B4+cc2bASQtpeoJLueuFc5DuYwjIZUBrSvx/fO5IrLjLz+oTrB3pcGlhovQ==", + "license": "MIT" + }, + "node_modules/@huggingface/transformers/node_modules/onnxruntime-web": { + "version": "1.22.0-dev.20250409-89f8206ba4", + "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.22.0-dev.20250409-89f8206ba4.tgz", + "integrity": "sha512-0uS76OPgH0hWCPrFKlL8kYVV7ckM7t/36HfbgoFw6Nd0CZVVbQC4PkrR8mBX8LtNUFZO25IQBqV2Hx2ho3FlbQ==", + "license": "MIT", + "dependencies": { + "flatbuffers": "^25.1.24", + "guid-typescript": "^1.0.9", + "long": "^5.2.3", + "onnxruntime-common": "1.22.0-dev.20250409-89f8206ba4", + "platform": "^1.3.6", + "protobufjs": "^7.2.4" + } + }, "node_modules/@img/colour": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", @@ -1095,6 +1138,18 @@ "node": "20 || >=22" } }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@myriaddreamin/rehype-typst": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@myriaddreamin/rehype-typst/-/rehype-typst-0.6.0.tgz", @@ -1616,6 +1671,70 @@ "integrity": "sha512-nezytU2pw587fQstUu1AsJZDVEynjskwOL+kibwcdxsMBFqPsFFNA7xl0ii/gXuDi6M0xj3mfRJj8pBSc2jCfA==", "license": "MIT" }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, "node_modules/@shikijs/core": { "version": "1.26.2", "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.26.2.tgz", @@ -2053,7 +2172,6 @@ "version": "24.6.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.6.0.tgz", "integrity": "sha512-F1CBxgqwOMc4GKJ7eY22hWhBVQuMYTtqI8L0FcszYcpYX0fzfDGpez22Xau8Mgm7O9fI+zA/TYIdq3tGWfweBA==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~7.13.0" @@ -2223,6 +2341,13 @@ } ] }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT" + }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -2345,6 +2470,15 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/citeproc": { "version": "2.4.63", "resolved": "https://registry.npmjs.org/citeproc/-/citeproc-2.4.63.tgz", @@ -2861,6 +2995,40 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delaunator": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", @@ -2886,6 +3054,12 @@ "node": ">=8" } }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, "node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", @@ -2926,6 +3100,30 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "license": "MIT" + }, "node_modules/esbuild": { "version": "0.25.10", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", @@ -3164,6 +3362,12 @@ "node": ">=8" } }, + "node_modules/flatbuffers": { + "version": "25.9.23", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz", + "integrity": "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==", + "license": "Apache-2.0" + }, "node_modules/flexsearch": { "version": "0.8.205", "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.8.205.tgz", @@ -3284,6 +3488,39 @@ "node": ">= 6" } }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "license": "BSD-3-Clause", + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "15.0.0", "resolved": "https://registry.npmjs.org/globby/-/globby-15.0.0.tgz", @@ -3304,6 +3541,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gray-matter": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", @@ -3338,6 +3587,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/guid-typescript": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", + "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==", + "license": "ISC" + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3347,6 +3602,18 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hasown": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", @@ -3932,6 +4199,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC" + }, "node_modules/katex": { "version": "0.16.21", "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.21.tgz", @@ -4232,6 +4505,12 @@ "node": ">= 0.4" } }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -4250,6 +4529,30 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/matcher/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mathjax-full": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.2.2.tgz", @@ -5250,6 +5553,27 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/mj-context-menu": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.6.1.tgz", @@ -5316,6 +5640,15 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/oniguruma-to-es": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-1.0.0.tgz", @@ -5326,6 +5659,49 @@ "regex-recursion": "^5.1.1" } }, + "node_modules/onnxruntime-common": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.21.0.tgz", + "integrity": "sha512-Q632iLLrtCAVOTO65dh2+mNbQir/QNTVBG3h/QdZBpns7mZ0RYbLRBgGABPbpU9351AgYy7SJf1WaeVwMrBFPQ==", + "license": "MIT" + }, + "node_modules/onnxruntime-node": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.21.0.tgz", + "integrity": "sha512-NeaCX6WW2L8cRCSqy3bInlo5ojjQqu2fD3D+9W5qb5irwxhEyWKXeH2vZ8W9r6VxaMPUan+4/7NDwZMtouZxEw==", + "hasInstallScript": true, + "license": "MIT", + "os": [ + "win32", + "darwin", + "linux" + ], + "dependencies": { + "global-agent": "^3.0.0", + "onnxruntime-common": "1.21.0", + "tar": "^7.0.1" + } + }, + "node_modules/onnxruntime-web": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.23.0.tgz", + "integrity": "sha512-w0bvC2RwDxphOUFF8jFGZ/dYw+duaX20jM6V4BIZJPCfK4QuCpB/pVREV+hjYbT3x4hyfa2ZbTaWx4e1Vot0fQ==", + "license": "MIT", + "dependencies": { + "flatbuffers": "^25.1.24", + "guid-typescript": "^1.0.9", + "long": "^5.2.3", + "onnxruntime-common": "1.23.0", + "platform": "^1.3.6", + "protobufjs": "^7.2.4" + } + }, + "node_modules/onnxruntime-web/node_modules/onnxruntime-common": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.23.0.tgz", + "integrity": "sha512-Auz8S9D7vpF8ok7fzTobvD1XdQDftRf/S7pHmjeCr3Xdymi4z1C7zx4vnT6nnUjbpelZdGwda0BmWHCCTMKUTg==", + "license": "MIT" + }, "node_modules/pako": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", @@ -5473,6 +5849,12 @@ "url": "https://opencollective.com/pixijs" } }, + "node_modules/platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", + "license": "MIT" + }, "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", @@ -5543,6 +5925,30 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/protobufjs": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", + "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "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": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -6002,6 +6408,29 @@ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "license": "BSD-3-Clause", + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/roarr/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause" + }, "node_modules/robust-predicates": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", @@ -6113,326 +6542,6 @@ "sass-embedded-win32-x64": "1.79.4" } }, - "node_modules/sass-embedded-android-arm": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.4.tgz", - "integrity": "sha512-YOVpDGDcwWUQvktpJhYo4zOkknDpdX6ALpaeHDTX6GBUvnZfx+Widh76v+QFUhiJQ/I/hndXg1jv/PKilOHRrw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-arm64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.4.tgz", - "integrity": "sha512-0JAZ8TtXYv9yI3Yasaq03xvo7DLJOmD+Exb30oJKxXcWTAV9TB0ZWKoIRsFxbCyPxyn7ouxkaCEXQtaTRKrmfw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-ia32": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.4.tgz", - "integrity": "sha512-IjO3RoyvNN84ZyfAR5s/a8TIdNPfClb7CLGrswB3BN/NElYIJUJMVHD6+Y8W9QwBIZ8DrK1IdLFSTV8nn82xMA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-riscv64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.4.tgz", - "integrity": "sha512-uOT8nXmKxSwuIdcqvElVWBFcm/+YcIvmwfoKbpuuSOSxUe9eqFzxo+fk7ILhynzf6FBlvRUH5DcjGj+sXtCc3w==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-x64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.4.tgz", - "integrity": "sha512-W2FQoj3Z2J2DirNs3xSBVvrhMuqLnsqvOPulxOkhL/074+faKOZZnPx2tZ5zsHbY97SonciiU0SV0mm98xI42w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-arm64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.4.tgz", - "integrity": "sha512-pcYtbN1VUAAcfgyHeX8ySndDWGjIvcq6rldduktPbGGuAlEWFDfnwjTbv0hS945ggdzZ6TFnaFlLEDr0SjKzBA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-x64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.4.tgz", - "integrity": "sha512-ir8CFTfc4JLx/qCP8LK1/3pWv35nRyAQkUK7lBIKM6hWzztt64gcno9rZIk4SpHr7Z/Bp1IYWWRS4ZT+4HmsbA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.4.tgz", - "integrity": "sha512-H/XEE3rY7c+tY0qDaELjPjC6VheAhBo1tPJQ6UHoBEf8xrbT/RT3dWiIS8grp9Vk54RCn05BEB/+POaljvvKGA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.4.tgz", - "integrity": "sha512-XIVn2mCuA422SR2kmKjF6jhjMs1Vrt1DbZ/ktSp+eR0sU4ugu2htg45GajiUFSKKRj7Sc+cBdThq1zPPsDLf1w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-ia32": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.4.tgz", - "integrity": "sha512-3nqZxV4nuUTb1ahLexVl4hsnx1KKwiGdHEf1xHWTZai6fYFMcwyNPrHySCQzFHqb5xiqSpPzzrKjuDhF6+guuQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.4.tgz", - "integrity": "sha512-HnbU1DEiQdUayioNzxh2WlbTEgQRBPTgIIvof8J63QLmVItUqE7EkWYkSUy4RhO+8NsuN9wzGmGTzFBvTImU7g==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.4.tgz", - "integrity": "sha512-C6qX06waPEfDgOHR8jXoYxl0EtIXOyBDyyonrLO3StRjWjGx7XMQj2hA/KXSsV+Hr71fBOsaViosqWXPzTbEiQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-ia32": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.4.tgz", - "integrity": "sha512-y5b0fdOPWyhj4c+mc88GvQiC5onRH1V0iNaWNjsiZ+L4hHje6T98nDLrCJn0fz5GQnXjyLCLZduMWbfV0QjHGg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.4.tgz", - "integrity": "sha512-G2M5ADMV9SqnkwpM0S+UzDz7xR2njCOhofku/sDMZABzAjQQWTsAykKoGmzlT98fTw2HbNhb6u74umf2WLhCfw==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.4.tgz", - "integrity": "sha512-kQm8dCU3DXf7DtUGWYPiPs03KJYKvFeiZJHhSx993DCM8D2b0wCXWky0S0Z46gf1sEur0SN4Lvnt1WczTqxIBw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-riscv64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.4.tgz", - "integrity": "sha512-GaTI/mXYWYSzG5wxtM4H2cozLpATyh+4l+rO9FFKOL8e1sUOLAzTeRdU2nSBYCuRqsxRuTZIwCXhSz9Q3NRuNA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-x64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.4.tgz", - "integrity": "sha512-f9laGkqHgC01h99Qt4LsOV+OLMffjvUcTu14hYWqMS9QVX5a4ihMwpf1NoAtTUytb7cVF3rYY/NVGuXt6G3ppQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-win32-arm64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.4.tgz", - "integrity": "sha512-cidBvtaA2cJ6dNlwQEa8qak+ezypurzKs0h0QAHLH324+j/6Jum7LCnQhZRPYJBFjHl+WYd7KwzPnJ2X5USWnQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-win32-ia32": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.4.tgz", - "integrity": "sha512-hexdmNTIZGTKNTzlMcdvEXzYuxOJcY89zqgsf45aQ2YMy4y2M8dTOxRI/Vz7p4iRxVp1Jow6LCtaLHrNI2Ordg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-win32-x64": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.4.tgz", - "integrity": "sha512-73yrpiWIbti6DkxhWURklkgSLYKfU9itDmvHxB+oYSb4vQveIApqTwSyTOuIUb/6Da/EsgEpdJ4Lbj4sLaMZWA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/satori": { "version": "0.18.3", "resolved": "https://registry.npmjs.org/satori/-/satori-0.18.3.tgz", @@ -6488,6 +6597,27 @@ "node": ">=10" } }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "license": "MIT" + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/serve-handler": { "version": "6.1.6", "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", @@ -6771,6 +6901,22 @@ "node": ">=14" } }, + "node_modules/tar": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", + "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/tiny-inflate": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", @@ -6858,6 +7004,18 @@ "fsevents": "~2.3.3" } }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typescript": { "version": "5.9.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", @@ -6876,7 +7034,6 @@ "version": "7.13.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.13.0.tgz", "integrity": "sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==", - "dev": true, "license": "MIT" }, "node_modules/unicode-trie": { @@ -7211,6 +7368,15 @@ "node": ">=10" } }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/yargs": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", diff --git a/package.json b/package.json index fdbc8c434..1cf3a0f40 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "dependencies": { "@clack/prompts": "^0.11.0", "@floating-ui/dom": "^1.7.4", + "@huggingface/transformers": "^3.7.5", "@myriaddreamin/rehype-typst": "^0.6.0", "@napi-rs/simple-git": "0.1.22", "@tweenjs/tween.js": "^25.0.0", @@ -61,6 +62,7 @@ "mdast-util-to-string": "^4.0.0", "micromorph": "^0.4.5", "minimatch": "^10.0.3", + "onnxruntime-web": "^1.23.0", "pixi.js": "^8.13.2", "preact": "^10.27.2", "preact-render-to-string": "^6.6.1", diff --git a/quartz.config.ts b/quartz.config.ts index b3db3d60d..6d3fcb4e9 100644 --- a/quartz.config.ts +++ b/quartz.config.ts @@ -1,6 +1,18 @@ -import { QuartzConfig } from "./quartz/cfg" +import { GlobalConfiguration, QuartzConfig } from "./quartz/cfg" import * as Plugin from "./quartz/plugins" +const semanticSearch: GlobalConfiguration["semanticSearch"] = { + enable: true, + model: "onnx-community/embeddinggemma-300m-ONNX", + aot: true, + dims: 768, + dtype: "fp32", + shardSizeRows: 1024, + hnsw: { M: 16, efConstruction: 200 }, + chunking: { chunkSize: 256, chunkOverlap: 64 }, + vllm: { enable: true, concurrency: 16, batchSize: 128 }, +} + /** * Quartz 4 Configuration * @@ -52,6 +64,7 @@ const config: QuartzConfig = { }, }, }, + semanticSearch, }, plugins: { transformers: [ @@ -84,6 +97,7 @@ const config: QuartzConfig = { enableSiteMap: true, enableRSS: true, }), + Plugin.SemanticIndex(semanticSearch), Plugin.Assets(), Plugin.Static(), Plugin.Favicon(), diff --git a/quartz/cfg.ts b/quartz/cfg.ts index 57dff5c75..734f0a3d8 100644 --- a/quartz/cfg.ts +++ b/quartz/cfg.ts @@ -78,6 +78,34 @@ export interface GlobalConfiguration { * Region Codes: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 */ locale: ValidLocale + /** Semantic search configuration */ + semanticSearch?: { + enable: boolean + model: string + aot: boolean + dtype: "fp32" | "fp16" + dims: number + shardSizeRows: number + manifestUrl?: string + manifestBaseUrl?: string + disableCache?: boolean + hnsw: { + M: number + efConstruction: number + efSearch?: number + } + chunking: { + chunkSize: number + chunkOverlap: number + noChunking?: boolean + } + vllm?: { + enable: boolean + vllmUrl?: string + concurrency: number + batchSize: number + } + } } export interface QuartzConfig { diff --git a/quartz/components/Search.tsx b/quartz/components/Search.tsx index 6e932d2ef..6dbd38a0f 100644 --- a/quartz/components/Search.tsx +++ b/quartz/components/Search.tsx @@ -7,10 +7,12 @@ import { i18n } from "../i18n" export interface SearchOptions { enablePreview: boolean + includeButton: boolean } const defaultOptions: SearchOptions = { enablePreview: true, + includeButton: true, } export default ((userOpts?: Partial) => { @@ -29,19 +31,54 @@ export default ((userOpts?: Partial) => {

{i18n(cfg.locale).components.search.title}

-
-
- -
-
-
+ +
+
+ +
+ + +
+
+ + +
) } diff --git a/quartz/components/renderPage.tsx b/quartz/components/renderPage.tsx index 3ebfe4879..4e19d1238 100644 --- a/quartz/components/renderPage.tsx +++ b/quartz/components/renderPage.tsx @@ -25,6 +25,7 @@ const headerRegex = new RegExp(/h[1-6]/) export function pageResources( baseDir: FullSlug | RelativeURL, staticResources: StaticResources, + cfg?: GlobalConfiguration, ): StaticResources { const contentIndexPath = joinSegments(baseDir, "static/contentIndex.json") const contentIndexScript = `const fetchData = fetch("${contentIndexPath}").then(data => data.json())` @@ -48,6 +49,12 @@ export function pageResources( spaPreserve: true, script: contentIndexScript, }, + { + loadTime: "beforeDOMReady", + contentType: "inline", + spaPreserve: true, + script: `const semanticCfg = ${JSON.stringify(cfg?.semanticSearch ?? {})};`, + }, ...staticResources.js, ], additionalHead: staticResources.additionalHead, diff --git a/quartz/components/scripts/search.inline.ts b/quartz/components/scripts/search.inline.ts index 6a84a50e0..eedbe871f 100644 --- a/quartz/components/scripts/search.inline.ts +++ b/quartz/components/scripts/search.inline.ts @@ -1,6 +1,14 @@ import FlexSearch, { DefaultDocumentSearchResults } from "flexsearch" -import { ContentDetails } from "../../plugins/emitters/contentIndex" -import { registerEscapeHandler, removeAllChildren } from "./util" +import type { ContentDetails } from "../../plugins/emitters/contentIndex" +import { SemanticClient, type SemanticResult } from "./semantic.inline" +import { + registerEscapeHandler, + removeAllChildren, + highlight, + tokenizeTerm, + encode, + fetchCanonical, +} from "./util" import { FullSlug, normalizeRelativeURLs, resolveRelative } from "../../util/path" interface Item { @@ -14,17 +22,110 @@ interface Item { // Can be expanded with things like "term" in the future type SearchType = "basic" | "tags" -let searchType: SearchType = "basic" -let currentSearchTerm: string = "" -const encoder = (str: string) => { - return str - .toLowerCase() - .split(/\s+/) - .filter((token) => token.length > 0) +type SearchMode = "lexical" | "semantic" +const SEARCH_MODE_STORAGE_KEY = "quartz:search:mode" + +const loadStoredSearchMode = (): SearchMode | null => { + if (typeof window === "undefined") { + return null + } + + try { + const stored = window.localStorage.getItem(SEARCH_MODE_STORAGE_KEY) + return stored === "lexical" || stored === "semantic" ? stored : null + } catch (err) { + console.warn("[Search] failed to read stored search mode:", err) + return null + } } -let index = new FlexSearch.Document({ - encode: encoder, +const persistSearchMode = (mode: SearchMode) => { + if (typeof window === "undefined") { + return + } + + try { + window.localStorage.setItem(SEARCH_MODE_STORAGE_KEY, mode) + } catch (err) { + console.warn("[Search] failed to persist search mode:", err) + } +} + +let searchMode: SearchMode = "lexical" +let currentSearchTerm: string = "" +let rawSearchTerm: string = "" +let semantic: SemanticClient | null = null +let semanticReady = false +let semanticInitFailed = false +type SimilarityResult = { item: Item; similarity: number } +let chunkMetadata: Record = {} +let manifestIds: string[] = [] + +/** + * Get parent document slug for a chunk ID + */ +function getParentSlug(slug: string): string { + const meta = chunkMetadata[slug] + return meta ? meta.parentSlug : slug +} + +/** + * Aggregate semantic search results from chunks to documents using RRF + * @param results Raw semantic results (chunk-level) + * @param slugToDocIndex Map from document slug to index in idDataMap + * @returns Object with rrfScores (for ranking) and maxScores (for display) + */ +function aggregateChunkResults( + results: SemanticResult[], + slugToDocIndex: Map, +): { rrfScores: Map; maxScores: Map } { + // Group chunks by parent document + const docChunks = new Map>() + + results.forEach(({ id, score }) => { + // id is an index into manifestIds (the chunk IDs from embeddings) + const chunkSlug = manifestIds[id] + if (!chunkSlug) return + + // Get parent document slug + const parentSlug = getParentSlug(chunkSlug) + + if (!docChunks.has(parentSlug)) { + docChunks.set(parentSlug, []) + } + + docChunks.get(parentSlug)!.push({ score }) + }) + + // Apply RRF for ranking and track max similarity for display + const rrfScores = new Map() + const maxScores = new Map() + const RRF_K = 60 + + for (const [parentSlug, chunks] of docChunks) { + const docIdx = slugToDocIndex.get(parentSlug as FullSlug) + if (typeof docIdx !== "number") continue + + // Sort chunks by score descending to assign per-document ranks + chunks.sort((a, b) => b.score - a.score) + + // RRF formula: sum(1 / (k + rank)) across all chunks, using per-document ranks + const rrfScore = chunks.reduce((sum, _, rank) => sum + 1.0 / (RRF_K + rank), 0) + + // Max similarity score for display (original 0-1 range) + const maxScore = chunks[0].score + + rrfScores.set(docIdx, rrfScore) + maxScores.set(docIdx, maxScore) + } + + return { rrfScores, maxScores } +} + +// Initialize the FlexSearch Document instance with the appropriate configuration +const index = new FlexSearch.Document({ + tokenize: "forward", + encode, document: { id: "id", tag: "tags", @@ -41,73 +142,18 @@ let index = new FlexSearch.Document({ field: "tags", tokenize: "forward", }, + { + field: "aliases", + tokenize: "forward", + }, ], }, }) const p = new DOMParser() const fetchContentCache: Map = new Map() -const contextWindowWords = 30 -const numSearchResults = 8 -const numTagResults = 5 - -const tokenizeTerm = (term: string) => { - const tokens = term.split(/\s+/).filter((t) => t.trim() !== "") - const tokenLen = tokens.length - if (tokenLen > 1) { - for (let i = 1; i < tokenLen; i++) { - tokens.push(tokens.slice(0, i + 1).join(" ")) - } - } - - return tokens.sort((a, b) => b.length - a.length) // always highlight longest terms first -} - -function highlight(searchTerm: string, text: string, trim?: boolean) { - const tokenizedTerms = tokenizeTerm(searchTerm) - let tokenizedText = text.split(/\s+/).filter((t) => t !== "") - - let startIndex = 0 - let endIndex = tokenizedText.length - 1 - if (trim) { - const includesCheck = (tok: string) => - tokenizedTerms.some((term) => tok.toLowerCase().startsWith(term.toLowerCase())) - const occurrencesIndices = tokenizedText.map(includesCheck) - - let bestSum = 0 - let bestIndex = 0 - for (let i = 0; i < Math.max(tokenizedText.length - contextWindowWords, 0); i++) { - const window = occurrencesIndices.slice(i, i + contextWindowWords) - const windowSum = window.reduce((total, cur) => total + (cur ? 1 : 0), 0) - if (windowSum >= bestSum) { - bestSum = windowSum - bestIndex = i - } - } - - startIndex = Math.max(bestIndex - contextWindowWords, 0) - endIndex = Math.min(startIndex + 2 * contextWindowWords, tokenizedText.length - 1) - tokenizedText = tokenizedText.slice(startIndex, endIndex) - } - - const slice = tokenizedText - .map((tok) => { - // see if this tok is prefixed by any search terms - for (const searchTok of tokenizedTerms) { - if (tok.toLowerCase().includes(searchTok.toLowerCase())) { - const regex = new RegExp(searchTok.toLowerCase(), "gi") - return tok.replace(regex, `$&`) - } - } - return tok - }) - .join(" ") - - return `${startIndex === 0 ? "" : "..."}${slice}${ - endIndex === tokenizedText.length - 1 ? "" : "..." - }` -} - +const numSearchResults = 10 +const numTagResults = 10 function highlightHTML(searchTerm: string, el: HTMLElement) { const p = new DOMParser() const tokenizedTerms = tokenizeTerm(searchTerm) @@ -149,7 +195,11 @@ function highlightHTML(searchTerm: string, el: HTMLElement) { return html.body } -async function setupSearch(searchElement: Element, currentSlug: FullSlug, data: ContentIndex) { +async function setupSearch( + searchElement: HTMLDivElement, + currentSlug: FullSlug, + data: ContentIndex, +) { const container = searchElement.querySelector(".search-container") as HTMLElement if (!container) return @@ -164,12 +214,183 @@ async function setupSearch(searchElement: Element, currentSlug: FullSlug, data: const searchLayout = searchElement.querySelector(".search-layout") as HTMLElement if (!searchLayout) return + const searchSpace = searchElement?.querySelector(".search-space") as HTMLFormElement + if (!searchSpace) return + + // Create semantic search progress bar + const progressBar = document.createElement("div") + progressBar.className = "semantic-search-progress" + progressBar.style.cssText = ` + position: absolute; + bottom: 0; + left: 0; + height: 2px; + width: 0; + background: var(--secondary); + transition: width 0.3s ease, opacity 0.3s ease; + opacity: 0; + z-index: 9999; + ` + searchBar.parentElement?.appendChild(progressBar) + + const startSemanticProgress = () => { + progressBar.style.opacity = "1" + progressBar.style.width = "0" + setTimeout(() => { + progressBar.style.width = "100%" + }, 10) + } + + const completeSemanticProgress = () => { + progressBar.style.opacity = "0" + setTimeout(() => { + progressBar.style.width = "0" + }, 300) + } + + const resetProgressBar = () => { + progressBar.style.opacity = "0" + progressBar.style.width = "0" + } + const idDataMap = Object.keys(data) as FullSlug[] + const slugToIndex = new Map() + idDataMap.forEach((slug, idx) => slugToIndex.set(slug, idx)) + const modeToggle = searchSpace.querySelector(".search-mode-toggle") as HTMLDivElement | null + const modeButtons = modeToggle + ? Array.from(modeToggle.querySelectorAll(".mode-option")) + : [] + const appendLayout = (el: HTMLElement) => { searchLayout.appendChild(el) } const enablePreview = searchLayout.dataset.preview === "true" + if (!semantic && !semanticInitFailed) { + const client = new SemanticClient(semanticCfg) + try { + await client.ensureReady() + semantic = client + semanticReady = true + + // Load chunk metadata and IDs from manifest + try { + const manifestUrl = "/embeddings/manifest.json" + const res = await fetch(manifestUrl) + if (res.ok) { + const manifest = await res.json() + chunkMetadata = manifest.chunkMetadata || {} + manifestIds = manifest.ids || [] + console.debug( + `[Search] Loaded manifest: ${manifestIds.length} chunks, ${Object.keys(chunkMetadata).length} chunked documents`, + ) + } + } catch (err) { + console.warn("[Search] failed to load chunk metadata:", err) + chunkMetadata = {} + manifestIds = [] + } + } catch (err) { + console.warn("[SemanticClient] initialization failed:", err) + client.dispose() + semantic = null + semanticReady = false + semanticInitFailed = true + } + } else if (semantic && !semanticReady) { + try { + await semantic.ensureReady() + semanticReady = true + } catch (err) { + console.warn("[SemanticClient] became unavailable:", err) + semantic.dispose() + semantic = null + semanticReady = false + semanticInitFailed = true + } + } + const storedMode = loadStoredSearchMode() + if (storedMode === "semantic") { + if (semanticReady) { + searchMode = storedMode + } + } else if (storedMode === "lexical") { + searchMode = storedMode + } + if (!semanticReady && searchMode === "semantic") { + searchMode = "lexical" + } + let searchSeq = 0 + let runSearchTimer: number | null = null + let lastInputAt = 0 + searchLayout.dataset.mode = searchMode + + const updateModeUI = (mode: SearchMode) => { + modeButtons.forEach((button) => { + const btnMode = (button.dataset.mode as SearchMode) ?? "lexical" + const isActive = btnMode === mode + button.classList.toggle("active", isActive) + button.setAttribute("aria-pressed", String(isActive)) + }) + if (modeToggle) { + modeToggle.dataset.mode = mode + } + searchLayout.dataset.mode = mode + } + + const computeDebounceDelay = (term: string): number => { + const trimmed = term.trim() + const lastTerm = currentSearchTerm + const isExtension = + lastTerm.length > 0 && trimmed.length > lastTerm.length && trimmed.startsWith(lastTerm) + const isRetraction = lastTerm.length > trimmed.length + const isReplacement = + lastTerm.length > 0 && !trimmed.startsWith(lastTerm) && !lastTerm.startsWith(trimmed) + const baseFullQueryDelay = 200 + const semanticPenalty = searchMode === "semantic" ? 60 : 0 + + if (isExtension && trimmed.length > 2) { + return baseFullQueryDelay + semanticPenalty + } + + if (isReplacement && trimmed.length > 3) { + return Math.max(90, baseFullQueryDelay - 80) + } + + if (isRetraction) { + return 90 + } + + return baseFullQueryDelay + (searchMode === "semantic" ? 40 : 0) + } + + const triggerSearchWithMode = (mode: SearchMode) => { + if (mode === "semantic" && !semanticReady) { + return + } + if (searchMode === mode) return + searchMode = mode + updateModeUI(mode) + persistSearchMode(searchMode) + if (rawSearchTerm.trim() !== "") { + searchLayout.classList.add("display-results") + const token = ++searchSeq + void runSearch(rawSearchTerm, token) + } + } + + updateModeUI(searchMode) + + modeButtons.forEach((button) => { + const btnMode = (button.dataset.mode as SearchMode) ?? "lexical" + if (btnMode === "semantic") { + button.disabled = !semanticReady + button.setAttribute("aria-disabled", String(!semanticReady)) + } + const handler = () => triggerSearchWithMode(btnMode) + button.addEventListener("click", handler) + window.addCleanup(() => button.removeEventListener("click", handler)) + }) let preview: HTMLDivElement | undefined = undefined let previewInner: HTMLDivElement | undefined = undefined const results = document.createElement("div") @@ -193,18 +414,25 @@ async function setupSearch(searchElement: Element, currentSlug: FullSlug, data: searchLayout.classList.remove("display-results") searchType = "basic" // reset search type after closing searchButton.focus() + resetProgressBar() } - function showSearch(searchTypeNew: SearchType) { - searchType = searchTypeNew - if (sidebar) sidebar.style.zIndex = "1" + function showSearch(type: SearchType) { container.classList.add("active") + if (type === "tags") { + searchBar.value = "#" + rawSearchTerm = "#" + } searchBar.focus() } let currentHover: HTMLInputElement | null = null + async function shortcutHandler(e: HTMLElementEventMap["keydown"]) { - if (e.key === "k" && (e.ctrlKey || e.metaKey) && !e.shiftKey) { + const paletteOpen = document.querySelector("search#palette-container") as HTMLDivElement + if (paletteOpen && paletteOpen.classList.contains("active")) return + + if ((e.key === "/" || e.key === "k") && (e.ctrlKey || e.metaKey) && !e.shiftKey) { e.preventDefault() const searchBarOpen = container.classList.contains("active") searchBarOpen ? hideSearch() : showSearch("basic") @@ -214,9 +442,6 @@ async function setupSearch(searchElement: Element, currentSlug: FullSlug, data: e.preventDefault() const searchBarOpen = container.classList.contains("active") searchBarOpen ? hideSearch() : showSearch("tags") - - // add "#" prefix for tag search - searchBar.value = "#" return } @@ -226,20 +451,29 @@ async function setupSearch(searchElement: Element, currentSlug: FullSlug, data: // If search is active, then we will render the first result and display accordingly if (!container.classList.contains("active")) return - if (e.key === "Enter" && !e.isComposing) { + if (e.key === "Enter") { // If result has focus, navigate to that one, otherwise pick first result + let anchor: HTMLAnchorElement | undefined if (results.contains(document.activeElement)) { - const active = document.activeElement as HTMLInputElement - if (active.classList.contains("no-match")) return - await displayPreview(active) - active.click() + anchor = document.activeElement as HTMLAnchorElement + if (anchor.classList.contains("no-match")) return + await displayPreview(anchor) + e.preventDefault() + anchor.click() } else { - const anchor = document.getElementsByClassName("result-card")[0] as HTMLInputElement | null + anchor = document.getElementsByClassName("result-card")[0] as HTMLAnchorElement if (!anchor || anchor.classList.contains("no-match")) return await displayPreview(anchor) + e.preventDefault() anchor.click() } - } else if (e.key === "ArrowUp" || (e.shiftKey && e.key === "Tab")) { + if (anchor !== undefined) + window.spaNavigate(new URL(new URL(anchor.href).pathname, window.location.toString())) + } else if ( + e.key === "ArrowUp" || + (e.shiftKey && e.key === "Tab") || + (e.ctrlKey && e.key === "p") + ) { e.preventDefault() if (results.contains(document.activeElement)) { // If an element in results-container already has focus, focus previous one @@ -252,7 +486,7 @@ async function setupSearch(searchElement: Element, currentSlug: FullSlug, data: if (prevResult) currentHover = prevResult await displayPreview(prevResult) } - } else if (e.key === "ArrowDown" || e.key === "Tab") { + } else if (e.key === "ArrowDown" || e.key === "Tab" || (e.ctrlKey && e.key === "n")) { e.preventDefault() // The results should already been focused, so we need to find the next one. // The activeElement is the search bar, so we need to find the first result and focus it. @@ -269,25 +503,40 @@ async function setupSearch(searchElement: Element, currentSlug: FullSlug, data: } } - const formatForDisplay = (term: string, id: number) => { + const formatForDisplay = (term: string, id: number, renderType: SearchType) => { const slug = idDataMap[id] + const aliases: string[] = data[slug].aliases ?? [] + const target = aliases.find((alias) => alias.toLowerCase().includes(term.toLowerCase())) ?? "" + + // Check if query contains title words (for boosting exact matches) + const queryTokens = tokenizeTerm(term) + const titleTokens = tokenizeTerm(data[slug].title ?? "") + const titleMatch = titleTokens.some((t) => queryTokens.includes(t)) + return { id, slug, - title: searchType === "tags" ? data[slug].title : highlight(term, data[slug].title ?? ""), + title: + renderType === "tags" || target + ? data[slug].title + : highlight(term, data[slug].title ?? ""), + target, content: highlight(term, data[slug].content ?? "", true), - tags: highlightTags(term.substring(1), data[slug].tags), + tags: highlightTags(term, data[slug].tags, renderType), + aliases: aliases, + titleMatch, // Add title match flag for boosting } } - function highlightTags(term: string, tags: string[]) { - if (!tags || searchType !== "tags") { + function highlightTags(term: string, tags: string[], renderType: SearchType) { + if (!tags || renderType !== "tags") { return [] } + const tagTerm = term.toLowerCase() return tags .map((tag) => { - if (tag.toLowerCase().includes(term.toLowerCase())) { + if (tag.toLowerCase().includes(tagTerm)) { return `
  • #${tag}

  • ` } else { return `
  • #${tag}

  • ` @@ -300,24 +549,40 @@ async function setupSearch(searchElement: Element, currentSlug: FullSlug, data: return new URL(resolveRelative(currentSlug, slug), location.toString()) } - const resultToHTML = ({ slug, title, content, tags }: Item) => { + const resultToHTML = ({ item, percent }: { item: Item; percent: number | null }) => { + const { slug, title, content, tags, target } = item const htmlTags = tags.length > 0 ? `
      ${tags.join("")}
    ` : `` const itemTile = document.createElement("a") + const titleContent = target ? highlight(currentSearchTerm, target) : title + const subscript = target ? `${slug}` : `` + let percentLabel = "—" + let percentAttr = "" + if (percent !== null && Number.isFinite(percent)) { + const bounded = Math.max(0, Math.min(100, percent)) + percentLabel = `${bounded.toFixed(1)}%` + percentAttr = bounded.toFixed(3) + } itemTile.classList.add("result-card") itemTile.id = slug itemTile.href = resolveUrl(slug).toString() - itemTile.innerHTML = ` -

    ${title}

    - ${htmlTags} -

    ${content}

    - ` - itemTile.addEventListener("click", (event) => { - if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return - hideSearch() - }) + itemTile.innerHTML = `
    +

    ${titleContent}

    + ${subscript}${htmlTags} + ${searchMode === "semantic" ? ` ${percentLabel}` : ""} + ${enablePreview && window.innerWidth > 600 ? "" : `

    ${content}

    `} +
    ` + if (percentAttr) itemTile.dataset.scorePercent = percentAttr + else delete itemTile.dataset.scorePercent - const handler = (event: MouseEvent) => { - if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return + const handler = (evt: MouseEvent) => { + if (evt.altKey || evt.ctrlKey || evt.metaKey || evt.shiftKey) return + const anchor = evt.currentTarget as HTMLAnchorElement | null + if (!anchor) return + evt.preventDefault() + const href = anchor.getAttribute("href") + if (!href) return + const url = new URL(href, window.location.toString()) + window.spaNavigate(url) hideSearch() } @@ -335,15 +600,22 @@ async function setupSearch(searchElement: Element, currentSlug: FullSlug, data: return itemTile } - async function displayResults(finalResults: Item[]) { + async function displayResults(finalResults: SimilarityResult[]) { removeAllChildren(results) if (finalResults.length === 0) { results.innerHTML = `

    No results.

    Try another search term?

    ` + currentHover = null } else { - results.append(...finalResults.map(resultToHTML)) + const decorated = finalResults.map(({ item, similarity }) => { + if (!Number.isFinite(similarity)) return { item, percent: null } + const bounded = Math.max(-1, Math.min(1, similarity)) + const percent = ((bounded + 1) / 2) * 100 + return { item, percent } + }) + results.append(...decorated.map(resultToHTML)) } if (finalResults.length === 0 && preview) { @@ -363,8 +635,8 @@ async function setupSearch(searchElement: Element, currentSlug: FullSlug, data: return fetchContentCache.get(slug) as Element[] } - const targetUrl = resolveUrl(slug).toString() - const contents = await fetch(targetUrl) + const targetUrl = resolveUrl(slug) + const contents = await fetchCanonical(targetUrl) .then((res) => res.text()) .then((contents) => { if (contents === undefined) { @@ -394,73 +666,297 @@ async function setupSearch(searchElement: Element, currentSlug: FullSlug, data: const highlights = [...preview.getElementsByClassName("highlight")].sort( (a, b) => b.innerHTML.length - a.innerHTML.length, ) - highlights[0]?.scrollIntoView({ block: "start" }) + if (highlights.length > 0) { + const highlight = highlights[0] + const container = preview + if (container && highlight) { + // Get the relative positions + const containerRect = container.getBoundingClientRect() + const highlightRect = highlight.getBoundingClientRect() + // Calculate the scroll position relative to the container + const relativeTop = highlightRect.top - containerRect.top + container.scrollTop - 20 // 20px buffer + // Smoothly scroll the container + container.scrollTo({ + top: relativeTop, + behavior: "smooth", + }) + } + } } - async function onType(e: HTMLElementEventMap["input"]) { + async function runSearch(rawTerm: string, token: number) { if (!searchLayout || !index) return - currentSearchTerm = (e.target as HTMLInputElement).value - searchLayout.classList.toggle("display-results", currentSearchTerm !== "") - searchType = currentSearchTerm.startsWith("#") ? "tags" : "basic" + const trimmed = rawTerm.trim() + if (trimmed === "") { + removeAllChildren(results) + if (preview) { + removeAllChildren(preview) + } + currentHover = null + searchLayout.classList.remove("display-results") + resetProgressBar() + return + } - let searchResults: DefaultDocumentSearchResults - if (searchType === "tags") { - currentSearchTerm = currentSearchTerm.substring(1).trim() - const separatorIndex = currentSearchTerm.indexOf(" ") - if (separatorIndex != -1) { - // search by title and content index and then filter by tag (implemented in flexsearch) - const tag = currentSearchTerm.substring(0, separatorIndex) - const query = currentSearchTerm.substring(separatorIndex + 1).trim() - searchResults = await index.searchAsync({ - query: query, - // return at least 10000 documents, so it is enough to filter them by tag (implemented in flexsearch) + const modeForRanking: SearchMode = searchMode + const initialType: SearchType = trimmed.startsWith("#") ? "tags" : "basic" + let workingType: SearchType = initialType + let highlightTerm = trimmed + let tagTerm = "" + let searchResults: DefaultDocumentSearchResults = [] + + if (initialType === "tags") { + tagTerm = trimmed.substring(1).trim() + const separatorIndex = tagTerm.indexOf(" ") + if (separatorIndex !== -1) { + const tag = tagTerm.substring(0, separatorIndex).trim() + const query = tagTerm.substring(separatorIndex + 1).trim() + const results = await index.searchAsync({ + query, limit: Math.max(numSearchResults, 10000), - index: ["title", "content"], + index: ["title", "content", "aliases"], tag: { tags: tag }, }) - for (let searchResult of searchResults) { - searchResult.result = searchResult.result.slice(0, numSearchResults) - } - // set search type to basic and remove tag from term for proper highlightning and scroll - searchType = "basic" - currentSearchTerm = query + if (token !== searchSeq) return + searchResults = Object.values(results) + workingType = "basic" + highlightTerm = query } else { - // default search by tags index - searchResults = await index.searchAsync({ - query: currentSearchTerm, + const results = await index.searchAsync({ + query: tagTerm, limit: numSearchResults, index: ["tags"], }) + if (token !== searchSeq) return + searchResults = Object.values(results) + highlightTerm = tagTerm } - } else if (searchType === "basic") { - searchResults = await index.searchAsync({ - query: currentSearchTerm, + } else { + const results = await index.searchAsync({ + query: highlightTerm, limit: numSearchResults, - index: ["title", "content"], + index: ["title", "content", "aliases"], }) + if (token !== searchSeq) return + searchResults = Object.values(results) + } + + const coerceIds = (hit?: DefaultDocumentSearchResults[number]): number[] => { + if (!hit) return [] + return hit.result + .map((value: Id) => { + if (typeof value === "number") { + return value + } + const parsed = Number.parseInt(String(value), 10) + return Number.isNaN(parsed) ? null : parsed + }) + .filter((value): value is number => value !== null) } const getByField = (field: string): number[] => { - const results = searchResults.filter((x) => x.field === field) - return results.length === 0 ? [] : ([...results[0].result] as number[]) + const hit = searchResults.find((x) => x.field === field) + return coerceIds(hit) } - // order titles ahead of content const allIds: Set = new Set([ + ...getByField("aliases"), ...getByField("title"), ...getByField("content"), ...getByField("tags"), ]) - const finalResults = [...allIds].map((id) => formatForDisplay(currentSearchTerm, id)) - await displayResults(finalResults) + + currentSearchTerm = highlightTerm + + const candidateItems = new Map() + const ensureItem = (id: number): Item | null => { + const slug = idDataMap[id] + if (!slug) return null + const cached = candidateItems.get(slug) + if (cached) return cached + const item = formatForDisplay(highlightTerm, id, workingType) + if (item) { + candidateItems.set(slug, item) + return item + } + return null + } + + const baseIndices: number[] = [] + for (const id of allIds) { + const item = ensureItem(id) + if (!item) continue + const idx = slugToIndex.get(item.slug) + if (typeof idx === "number") { + baseIndices.push(idx) + } + } + + let semanticIds: number[] = [] + const semanticSimilarity = new Map() + + const integrateIds = (ids: number[]) => { + ids.forEach((docId) => { + ensureItem(docId) + }) + } + + const orchestrator = semanticReady && semantic ? semantic : null + + const resolveSimilarity = (item: Item): number => { + const semanticHit = semanticSimilarity.get(item.id) + return semanticHit ?? Number.NaN + } + + const render = async () => { + if (token !== searchSeq) return + const useSemantic = semanticReady && semanticIds.length > 0 + const weights = + modeForRanking === "semantic" && useSemantic + ? { base: 0.3, semantic: 1.0 } + : { base: 1.0, semantic: useSemantic ? 0.3 : 0 } + const rrf = new Map() + const push = (ids: number[], weight: number, applyTitleBoost: boolean = false) => { + if (!ids.length || weight <= 0) return + ids.forEach((docId, rank) => { + const slug = idDataMap[docId] + if (!slug) return + const item = ensureItem(docId) + if (!item) return + + // Apply title boost for FlexSearch results (1.5x boost for exact title matches) + let effectiveWeight = weight + if (applyTitleBoost && item.titleMatch) { + effectiveWeight *= 1.5 + } + + const prev = rrf.get(slug) ?? 0 + rrf.set(slug, prev + effectiveWeight / (1 + rank)) + }) + } + + push(baseIndices, weights.base, true) // FlexSearch with title boost + push(semanticIds, weights.semantic, false) // Semantic without boost + + const rankedEntries = Array.from(candidateItems.values()) + .map((item) => ({ item, score: rrf.get(item.slug) ?? 0 })) + .sort((a, b) => b.score - a.score) + .slice(0, numSearchResults) + + const displayEntries: SimilarityResult[] = [] + for (const entry of rankedEntries) { + const similarity = resolveSimilarity(entry.item) + displayEntries.push({ item: entry.item, similarity }) + } + + await displayResults(displayEntries) + } + + await render() + + if (workingType === "tags" || !orchestrator || !semanticReady || highlightTerm.length < 2) { + return + } + + const showProgress = modeForRanking === "semantic" + if (showProgress) { + startSemanticProgress() + } + + try { + const { semantic: semRes } = await orchestrator.search( + highlightTerm, + numSearchResults * 3, // Request more chunks to ensure good document coverage + ) + if (token !== searchSeq) { + if (showProgress) completeSemanticProgress() + return + } + + // Aggregate chunk results to document level using RRF + const { rrfScores: semRrfScores, maxScores: semMaxScores } = aggregateChunkResults( + semRes, + slugToIndex, + ) + + // Use RRF scores for ranking + semanticIds = Array.from(semRrfScores.entries()) + .sort((a, b) => b[1] - a[1]) + .slice(0, numSearchResults) + .map(([docIdx]) => docIdx) + + // Use max chunk similarity for display (0-1 range) + semanticSimilarity.clear() + semMaxScores.forEach((score, docIdx) => { + semanticSimilarity.set(docIdx, score) + }) + + integrateIds(semanticIds) + if (showProgress) completeSemanticProgress() + } catch (err) { + console.warn("[SemanticClient] search failed:", err) + if (showProgress) completeSemanticProgress() + orchestrator.dispose() + semantic = null + semanticReady = false + semanticInitFailed = true + if (searchMode === "semantic") { + searchMode = "lexical" + updateModeUI(searchMode) + } + modeButtons.forEach((button) => { + if ((button.dataset.mode as SearchMode) === "semantic") { + button.disabled = true + button.setAttribute("aria-disabled", "true") + } + }) + } + + await render() + } + + function onType(e: HTMLElementEventMap["input"]) { + if (!searchLayout || !index) return + rawSearchTerm = (e.target as HTMLInputElement).value + const hasQuery = rawSearchTerm.trim() !== "" + searchLayout.classList.toggle("display-results", hasQuery) + const term = rawSearchTerm + const token = ++searchSeq + if (runSearchTimer !== null) { + window.clearTimeout(runSearchTimer) + runSearchTimer = null + } + if (!hasQuery) { + void runSearch("", token) + return + } + const now = performance.now() + lastInputAt = now + const delay = computeDebounceDelay(term) + const scheduledAt = lastInputAt + runSearchTimer = window.setTimeout(() => { + if (scheduledAt !== lastInputAt) { + return + } + runSearchTimer = null + void runSearch(term, token) + }, delay) } document.addEventListener("keydown", shortcutHandler) window.addCleanup(() => document.removeEventListener("keydown", shortcutHandler)) - searchButton.addEventListener("click", () => showSearch("basic")) - window.addCleanup(() => searchButton.removeEventListener("click", () => showSearch("basic"))) + const openHandler = () => showSearch("basic") + searchButton.addEventListener("click", openHandler) + window.addCleanup(() => searchButton.removeEventListener("click", openHandler)) searchBar.addEventListener("input", onType) window.addCleanup(() => searchBar.removeEventListener("input", onType)) + window.addCleanup(() => { + if (runSearchTimer !== null) { + window.clearTimeout(runSearchTimer) + runSearchTimer = null + } + resetProgressBar() + }) registerEscapeHandler(container, hideSearch) await fillDocument(data) @@ -468,24 +964,26 @@ async function setupSearch(searchElement: Element, currentSlug: FullSlug, data: /** * Fills flexsearch document with data - * @param index index to fill * @param data data to fill index with */ let indexPopulated = false async function fillDocument(data: ContentIndex) { if (indexPopulated) return let id = 0 - const promises: Array> = [] + const promises = [] for (const [slug, fileData] of Object.entries(data)) { promises.push( - index.addAsync(id++, { + //@ts-ignore + index.addAsync({ id, slug: slug as FullSlug, title: fileData.title, content: fileData.content, tags: fileData.tags, + aliases: fileData.aliases, }), ) + id++ } await Promise.all(promises) @@ -495,7 +993,9 @@ async function fillDocument(data: ContentIndex) { document.addEventListener("nav", async (e: CustomEventMap["nav"]) => { const currentSlug = e.detail.url const data = await fetchData - const searchElement = document.getElementsByClassName("search") + const searchElement = document.getElementsByClassName( + "search", + ) as HTMLCollectionOf for (const element of searchElement) { await setupSearch(element, currentSlug, data) } diff --git a/quartz/components/scripts/semantic.inline.ts b/quartz/components/scripts/semantic.inline.ts new file mode 100644 index 000000000..167091c02 --- /dev/null +++ b/quartz/components/scripts/semantic.inline.ts @@ -0,0 +1,182 @@ +export type SemanticResult = { id: number; score: number } + +type ProgressMessage = { + type: "progress" + loadedRows: number + totalRows: number +} + +type ReadyMessage = { type: "ready" } + +type ResultMessage = { + type: "search-result" + seq: number + semantic: SemanticResult[] +} + +type ErrorMessage = { type: "error"; seq?: number; message: string } + +type SearchPayload = { + semantic: SemanticResult[] +} + +type PendingResolver = { + resolve: (payload: SearchPayload) => void + reject: (err: Error) => void +} + +export class SemanticClient { + private ready: Promise + private resolveReady!: () => void + private worker: Worker | null = null + private pending = new Map() + private seq = 0 + private disposed = false + private readySettled = false + private configured = false + private lastError: Error | null = null + + constructor(private cfg?: any) { + this.ready = new Promise((resolve) => { + this.resolveReady = () => { + if (this.readySettled) return + this.readySettled = true + resolve() + } + }) + + if (this.cfg?.enable === false) { + this.lastError = new Error("semantic search disabled by configuration") + this.resolveReady() + return + } + + this.boot() + } + + private boot() { + try { + this.worker = new Worker("/semantic.worker.js", { type: "module" }) + } catch (err) { + this.handleFatal(err) + return + } + this.setupWorker() + this.startInit() + } + + private setupWorker() { + if (!this.worker) return + this.worker.onmessage = ( + event: MessageEvent, + ) => { + const msg = event.data + if (msg.type === "progress") { + // Progress updates during initialization - can be logged if needed + return + } + if (msg.type === "ready") { + this.configured = true + this.lastError = null + this.resolveReady() + return + } + if (msg.type === "search-result") { + const pending = this.pending.get(msg.seq) + if (pending) { + this.pending.delete(msg.seq) + pending.resolve({ semantic: msg.semantic ?? [] }) + } + return + } + if (msg.type === "error") { + if (typeof msg.seq === "number") { + const pending = this.pending.get(msg.seq) + if (pending) { + this.pending.delete(msg.seq) + pending.reject(new Error(msg.message)) + } + } else { + this.handleFatal(msg.message) + } + } + } + } + + private startInit() { + if (!this.worker) return + const manifestUrl = + typeof this.cfg?.manifestUrl === "string" && this.cfg.manifestUrl.length > 0 + ? this.cfg.manifestUrl + : "/embeddings/manifest.json" + const disableCache = Boolean(this.cfg?.disableCache) + const baseUrl = + typeof this.cfg?.manifestBaseUrl === "string" ? this.cfg.manifestBaseUrl : undefined + this.worker.postMessage({ + type: "init", + cfg: this.cfg, + manifestUrl, + baseUrl, + disableCache, + }) + } + + private rejectAll(err: Error, fatal = false) { + for (const [id, pending] of this.pending.entries()) { + pending.reject(err) + this.pending.delete(id) + } + if (fatal) { + this.lastError = err + this.configured = false + if (!this.readySettled) { + this.resolveReady() + } + } + } + + private handleFatal(err: unknown) { + const error = err instanceof Error ? err : new Error(String(err)) + console.error("[SemanticClient] initialization failure:", error) + this.rejectAll(error, true) + if (this.worker) { + this.worker.postMessage({ type: "reset" }) + this.worker.terminate() + this.worker = null + } + } + + async ensureReady() { + await this.ready + if (!this.configured) { + throw this.lastError ?? new Error("semantic search unavailable") + } + } + + async search(text: string, k: number): Promise { + if (this.disposed) { + throw new Error("semantic client has been disposed") + } + await this.ensureReady() + if (!this.worker || !this.configured) { + throw this.lastError ?? new Error("worker unavailable") + } + return new Promise((resolve, reject) => { + const seq = ++this.seq + this.pending.set(seq, { resolve, reject }) + this.worker?.postMessage({ type: "search", text, k, seq }) + }) + } + + dispose() { + if (this.disposed) return + this.disposed = true + this.rejectAll(new Error("semantic client disposed")) + if (this.worker) { + this.worker.postMessage({ type: "reset" }) + this.worker.terminate() + } + this.worker = null + this.configured = false + } +} diff --git a/quartz/components/scripts/util.ts b/quartz/components/scripts/util.ts index f71790104..de0681f78 100644 --- a/quartz/components/scripts/util.ts +++ b/quartz/components/scripts/util.ts @@ -44,3 +44,68 @@ export async function fetchCanonical(url: URL): Promise { const [_, redirect] = text.match(canonicalRegex) ?? [] return redirect ? fetch(`${new URL(redirect, url)}`) : res } + +const contextWindowWords = 30 +export const tokenizeTerm = (term: string) => { + const tokens = term.split(/\s+/).filter((t) => t.trim() !== "") + const tokenLen = tokens.length + if (tokenLen > 1) { + for (let i = 1; i < tokenLen; i++) { + tokens.push(tokens.slice(0, i + 1).join(" ")) + } + } + + return tokens.sort((a, b) => b.length - a.length) // always highlight longest terms first +} + +export function highlight(searchTerm: string, text: string, trim?: boolean) { + const tokenizedTerms = tokenizeTerm(searchTerm) + let tokenizedText = text.split(/\s+/).filter((t) => t !== "") + + let startIndex = 0 + let endIndex = tokenizedText.length - 1 + if (trim) { + const includesCheck = (tok: string) => + tokenizedTerms.some((term) => tok.toLowerCase().startsWith(term.toLowerCase())) + const occurrencesIndices = tokenizedText.map(includesCheck) + + let bestSum = 0 + let bestIndex = 0 + for (let i = 0; i < Math.max(tokenizedText.length - contextWindowWords, 0); i++) { + const window = occurrencesIndices.slice(i, i + contextWindowWords) + const windowSum = window.reduce((total, cur) => total + (cur ? 1 : 0), 0) + if (windowSum >= bestSum) { + bestSum = windowSum + bestIndex = i + } + } + + startIndex = Math.max(bestIndex - contextWindowWords, 0) + endIndex = Math.min(startIndex + 2 * contextWindowWords, tokenizedText.length - 1) + tokenizedText = tokenizedText.slice(startIndex, endIndex) + } + + const slice = tokenizedText + .map((tok) => { + // see if this tok is prefixed by any search terms + for (const searchTok of tokenizedTerms) { + if (tok.toLowerCase().includes(searchTok.toLowerCase())) { + const regex = new RegExp(searchTok.toLowerCase(), "gi") + return tok.replace(regex, `$&`) + } + } + return tok + }) + .join(" ") + + return `${startIndex === 0 ? "" : "..."}${slice}${ + endIndex === tokenizedText.length - 1 ? "" : "..." + }` +} + +// To be used with search and everything else with flexsearch +export const encode = (str: string) => + str + .toLowerCase() + .split(/\s+/) + .filter((token) => token.length > 0) diff --git a/quartz/components/styles/search.scss b/quartz/components/styles/search.scss index bb58948ae..685f0fc31 100644 --- a/quartz/components/styles/search.scss +++ b/quartz/components/styles/search.scss @@ -77,16 +77,97 @@ margin-bottom: 2em; } - & > input { + & > .input-container { + align-items: center; + gap: 0.5rem; + display: flex; + flex-wrap: wrap; + position: relative; box-sizing: border-box; - padding: 0.5em 1em; - font-family: var(--bodyFont); - color: var(--dark); - font-size: 1.1em; - border: 1px solid var(--lightgray); - &:focus { - outline: none; + .search-bar { + flex: 1 1 auto; + min-width: 0; + box-sizing: border-box; + padding: 0.5em 1em; + font-family: var(--bodyFont); + color: var(--dark); + font-size: 1.1em; + border: none; + background: transparent; + + &:focus { + outline: none; + } + } + + .semantic-search-progress { + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 2px; + background-color: var(--secondary); + width: 0; + opacity: 0; + transition: + width 0.3s ease, + opacity 0.2s ease; + pointer-events: none; + } + + .search-mode-toggle { + display: inline-flex; + align-items: center; + border-radius: 9999px; + height: 1.4rem; + background-color: color-mix(in srgb, var(--darkgray) 12%, transparent); + margin-right: 1rem; + + .mode-option { + border: none; + background: transparent; + font: inherit; + color: var(--gray); + border-radius: 9999px; + cursor: pointer; + transition: + background-color 0.2s ease, + color 0.2s ease; + display: inline-flex; + align-items: center; + justify-content: center; + width: 1.5rem; + height: 1.5rem; + position: relative; + + &:focus-visible { + outline: 2px solid var(--tertiary); + outline-offset: 2px; + } + + &.active { + background-color: var(--secondary); + color: var(--light); + } + + svg { + width: 18px; + height: 18px; + } + + .sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; + } + } } } diff --git a/quartz/embed_build.py b/quartz/embed_build.py new file mode 100644 index 000000000..63ade1be5 --- /dev/null +++ b/quartz/embed_build.py @@ -0,0 +1,542 @@ +# /// script +# requires-python = ">=3.11" +# dependencies = [ +# "langchain-text-splitters", +# "numpy", +# "openai", +# "sentence-transformers", +# "tiktoken", +# ] +# /// + +from __future__ import annotations + +import os, json, argparse, hashlib, math, random, logging + +from pathlib import Path +from functools import lru_cache +from collections.abc import Iterable +from concurrent.futures import ThreadPoolExecutor, as_completed + +import tiktoken, numpy as np + +from openai import OpenAI +from langchain_text_splitters import RecursiveCharacterTextSplitter + + +logger = logging.getLogger(__name__) +DEFAULT_VLLM_URL = os.environ.get("VLLM_URL") or os.environ.get("VLLM_EMBED_URL") or "http://127.0.0.1:8000/v1" + + +def resolve_vllm_base_url(url: str) -> str: + if not url: + raise ValueError("vLLM URL must be non-empty") + + trimmed = url.rstrip("/") + if trimmed.endswith("/v1/embeddings"): + trimmed = trimmed[: -len("/embeddings")] + elif trimmed.endswith("/embeddings"): + trimmed = trimmed[: trimmed.rfind("/")] + + if not trimmed.endswith("/v1"): + trimmed = f"{trimmed}/v1" + + return trimmed + + +def load_jsonl(fp: str) -> Iterable[dict]: + with open(fp, "r", encoding="utf-8") as f: + for line in f: + line = line.strip() + if not line: + continue + yield json.loads(line) + + +def l2_normalize_rows(x: np.ndarray) -> np.ndarray: + # x: [N, D] + norms = np.linalg.norm(x, ord=2, axis=1, keepdims=True) + norms[norms == 0] = 1.0 + return x / norms + + +@lru_cache(maxsize=1) +def get_tiktoken_encoder(): + # Get the o200k_base tokenizer (GPT-4o) with caching + # change this if you want something else. + return tiktoken.get_encoding("o200k_base") + + +def count_tokens(text: str) -> int: + # Count tokens using o200k_base encoding + encoder = get_tiktoken_encoder() + return len(encoder.encode(text)) + + +def get_text_splitter(chunk_size: int, overlap: int): + encoder = get_tiktoken_encoder() + return RecursiveCharacterTextSplitter( + chunk_size=chunk_size * 4, # character approximation + chunk_overlap=overlap * 4, + separators=["\n\n", "\n", ". ", " ", ""], + length_function=lambda t: len(encoder.encode(t)), + is_separator_regex=False, + ) + + +def chunk_document( + doc: dict, max_tokens: int = 512, overlap_tokens: int = 128, min_chunk_size: int = 100 +) -> list[dict]: + """ + Chunk a document if it exceeds max_tokens + + Args: + doc: {'slug': str, 'title': str, 'text': str} + max_tokens: Maximum tokens per chunk + overlap_tokens: Overlap between chunks + min_chunk_size: Minimum chunk size (avoid tiny chunks) + + Returns: + List of chunk dicts with metadata + """ + text = doc["text"] + token_count = count_tokens(text) + + # No chunking needed + if token_count <= max_tokens: + return [ + { + "slug": doc["slug"], + "title": doc.get("title", doc["slug"]), + "text": text, + "chunk_id": 0, + "parent_slug": doc["slug"], + "is_chunked": False, + } + ] + + # Apply chunking + splitter = get_text_splitter(max_tokens, overlap_tokens) + raw_chunks = splitter.split_text(text) + + # Filter out tiny chunks + valid_chunks = [c for c in raw_chunks if count_tokens(c) >= min_chunk_size] + + return [ + { + "slug": f"{doc['slug']}#chunk{i}", + "title": doc.get("title", doc["slug"]), + "text": chunk, + "chunk_id": i, + "parent_slug": doc["slug"], + "is_chunked": True, + } + for i, chunk in enumerate(valid_chunks) + ] + + +def write_shards(vectors: np.ndarray, shard_size: int, dtype: str, out_dir: Path) -> list[dict]: + out_dir.mkdir(parents=True, exist_ok=True) + rows, dims = vectors.shape + shards_meta: list[dict] = [] + np_dtype = np.float16 if dtype == "fp16" else np.float32 + bytes_per_value = np.dtype(np_dtype).itemsize + row_offset = 0 + for si, start in enumerate(range(0, rows, shard_size)): + end = min(start + shard_size, rows) + shard = vectors[start:end] # [n, dims] + bin_path = out_dir / f"vectors-{si:03d}.bin" + payload = shard.astype(np_dtype, copy=False).tobytes(order="C") + digest = hashlib.sha256(payload).hexdigest() + with open(bin_path, "wb") as f: + f.write(payload) + shard_rows = int(shard.shape[0]) + shards_meta.append( + { + "path": f"/embeddings/{bin_path.name}", + "rows": shard_rows, + "rowOffset": row_offset, + "byteLength": len(payload), + "sha256": digest, + "byteStride": dims * bytes_per_value, + }, + ) + row_offset += shard_rows + return shards_meta + + +def write_hnsw_graph(levels: list[list[list[int]]], rows: int, out_path: Path) -> tuple[list[dict], str]: + out_path.parent.mkdir(parents=True, exist_ok=True) + offset = 0 + meta: list[dict] = [] + digest = hashlib.sha256() + with open(out_path, "wb") as f: + for lvl in levels: + indptr = np.zeros(rows + 1, dtype=np.uint32) + edge_accum: list[int] = [] + for idx in range(rows): + neighbors = lvl[idx] if idx < len(lvl) else [] + indptr[idx + 1] = indptr[idx] + len(neighbors) + edge_accum.extend(neighbors) + indptr_bytes = indptr.tobytes(order="C") + indptr_offset = offset + f.write(indptr_bytes) + digest.update(indptr_bytes) + offset += len(indptr_bytes) + + if edge_accum: + indices = np.asarray(edge_accum, dtype=np.uint32) + indices_bytes = indices.tobytes(order="C") + else: + indices = np.zeros(0, dtype=np.uint32) + indices_bytes = indices.tobytes(order="C") + indices_offset = offset + f.write(indices_bytes) + digest.update(indices_bytes) + offset += len(indices_bytes) + + meta.append( + { + "level": len(meta), + "indptr": { + "offset": indptr_offset, + "elements": int(indptr.shape[0]), + "byteLength": len(indptr_bytes), + }, + "indices": { + "offset": indices_offset, + "elements": int(indices.shape[0]), + "byteLength": len(indices_bytes), + }, + }, + ) + return meta, digest.hexdigest() + + + +def embed_vllm( + texts: list[str], + model_id: str, + vllm_url: str, + batch_size: int = 64, + concurrency: int = 8, +) -> np.ndarray: + base_url = resolve_vllm_base_url(vllm_url) + api_key = os.environ.get("VLLM_API_KEY") or os.environ.get("OPENAI_API_KEY") or "not-set" + client = OpenAI(base_url=base_url, api_key=api_key, timeout=300) + + def list_available_models() -> list[str]: + models: list[str] = [] + page = client.models.list() + models.extend(model.id for model in page.data) + while getattr(page, "has_more", False) and page.data: + cursor = page.data[-1].id + page = client.models.list(after=cursor) + models.extend(model.id for model in page.data) + return models + + try: + available_models = list_available_models() + except Exception as exc: + raise RuntimeError(f"failed to query {base_url}/models: {exc}") from exc + + if model_id not in available_models: + suggestions = ", ".join(sorted(available_models)) if available_models else "" + logger.warning( + "model '%s' not served by vLLM at %s. Available models: %s. Use the first model, results may differ during semantic search (you can omit this message if your weights is a ONNX checkpoint of the same model.)", model_id, base_url, suggestions, + ) + model_id = available_models[0] + + # Apply model-specific prefixes for documents (asymmetric search) + model_lower = model_id.lower() + if "e5" in model_lower: + # E5 models: use "passage:" prefix for documents + prefixed = [f"passage: {t}" for t in texts] + elif "qwen" in model_lower and "embedding" in model_lower: + # Qwen3-Embedding: documents use plain text (no prefix) + prefixed = texts + elif "embeddinggemma" in model_lower: + # embeddinggemma: use "title: none | text:" prefix for documents + prefixed = [f"title: none | text: {t}" for t in texts] + else: + # Default: no prefix for unknown models + prefixed = texts + + print( + "Embedding" + f" {len(prefixed)} texts with vLLM" + f" (model={model_id}, batch_size={batch_size}, concurrency={concurrency})", + ) + + # Create batches + batches = [] + for i in range(0, len(prefixed), batch_size): + batch = prefixed[i : i + batch_size] + batches.append((i, batch)) + + # Function to send a single batch request + def send_batch(batch_info: tuple[int, list[str]]) -> tuple[int, list[np.ndarray]]: + idx, batch = batch_info + response = client.embeddings.create(model=model_id, input=batch) + embeddings = [np.asarray(item.embedding, dtype=np.float32) for item in response.data] + return (idx, embeddings) + + # Send batches concurrently (or sequentially if only 1 batch) + results: dict[int, list[np.ndarray]] = {} + if len(batches) == 1: + # Single batch - no need for threading + idx, embeddings = send_batch(batches[0]) + results[idx] = embeddings + else: + # Multiple batches - use concurrent requests + with ThreadPoolExecutor(max_workers=concurrency) as executor: + futures = {executor.submit(send_batch, batch_info): batch_info[0] for batch_info in batches} + completed = 0 + for future in as_completed(futures): + idx, embeddings = future.result() + results[idx] = embeddings + completed += 1 + if completed % max(1, len(batches) // 10) == 0 or completed == len(batches): + print(f" Completed {completed}/{len(batches)} batches ({completed * 100 // len(batches)}%)") + + # Reconstruct in order + out: list[np.ndarray] = [] + for i in sorted(results.keys()): + out.extend(results[i]) + + return np.stack(out, axis=0) + + +def embed_hf(texts: list[str], model_id: str, device: str) -> np.ndarray: + # Prefer sentence-transformers for E5 and similar embed models + from sentence_transformers import SentenceTransformer + + model = SentenceTransformer(model_id, device=device) + + # Apply model-specific prefixes for documents (asymmetric search) + model_lower = model_id.lower() + if "e5" in model_lower: + # E5 models: use "passage:" prefix for documents + prefixed = [f"passage: {t}" for t in texts] + elif "qwen" in model_lower and "embedding" in model_lower: + # Qwen3-Embedding: documents use plain text (no prefix) + prefixed = texts + elif "embeddinggemma" in model_lower: + # embeddinggemma: use "title: none | text:" prefix for documents + prefixed = [f"title: none | text: {t}" for t in texts] + else: + # Default: no prefix for unknown models + prefixed = texts + + vecs = model.encode( + prefixed, + batch_size=64, + normalize_embeddings=True, + convert_to_numpy=True, + show_progress_bar=True, + ) + return vecs.astype(np.float32, copy=False) + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--jsonl", default="public/embeddings-text.jsonl") + ap.add_argument("--model", default=os.environ.get("SEM_MODEL", "intfloat/multilingual-e5-large")) + ap.add_argument("--dims", type=int, default=int(os.environ.get("SEM_DIMS", "1024"))) + ap.add_argument("--dtype", choices=["fp16", "fp32"], default=os.environ.get("SEM_DTYPE", "fp32")) + ap.add_argument("--shard-size", type=int, default=int(os.environ.get("SEM_SHARD", "1024"))) + ap.add_argument("--out", default="public/embeddings") + ap.add_argument("--use-vllm", action="store_true", default=bool(os.environ.get("USE_VLLM", ""))) + ap.add_argument( + "--vllm-url", + default=DEFAULT_VLLM_URL, + help="Base URL for the vLLM OpenAI-compatible server (accepts either /v1 or /v1/embeddings)", + ) + ap.add_argument("--chunk-size", type=int, default=512, help="Max tokens per chunk") + ap.add_argument("--chunk-overlap", type=int, default=128, help="Overlap tokens between chunks") + ap.add_argument("--no-chunking", action="store_true", help="Disable chunking (embed full docs)") + ap.add_argument( + "--concurrency", + type=int, + default=int(os.environ.get("VLLM_CONCURRENCY", "8")), + help="Number of concurrent requests to vLLM (default: 8)", + ) + ap.add_argument( + "--batch-size", + type=int, + default=int(os.environ.get("VLLM_BATCH_SIZE", "64")), + help="Batch size for vLLM requests (default: 64)", + ) + args = ap.parse_args() + + recs = list(load_jsonl(args.jsonl)) + if not recs: + print("No input found in public/embeddings-text.jsonl; run the site build first to emit JSONL.") + return + + # Apply chunking + if args.no_chunking: + chunks = recs + chunk_metadata = {} + print(f"Chunking disabled. Processing {len(chunks)} full documents") + else: + chunks = [] + chunk_metadata = {} + for rec in recs: + doc_chunks = chunk_document(rec, max_tokens=args.chunk_size, overlap_tokens=args.chunk_overlap) + chunks.extend(doc_chunks) + # Build chunk metadata map + for chunk in doc_chunks: + if chunk["is_chunked"]: + chunk_metadata[chunk["slug"]] = { + "parentSlug": chunk["parent_slug"], + "chunkId": chunk["chunk_id"], + } + chunked_count = sum(1 for c in chunks if c.get("is_chunked", False)) + print(f"Chunked {len(recs)} documents into {len(chunks)} chunks ({chunked_count} chunked, {len(chunks) - chunked_count} unchanged)") + print(f" Chunk size: {args.chunk_size} tokens, overlap: {args.chunk_overlap} tokens") + + ids = [c["slug"] for c in chunks] + titles = [c.get("title", c["slug"]) for c in chunks] + texts = [c["text"] for c in chunks] + + if args.use_vllm: + vecs = embed_vllm( + texts, + args.model, + args.vllm_url, + batch_size=args.batch_size, + concurrency=args.concurrency, + ) + else: + device = "cuda" if os.environ.get("CUDA_VISIBLE_DEVICES") else "cpu" + vecs = embed_hf(texts, args.model, device) + + # Coerce dims and re-normalize + if vecs.shape[1] != args.dims: + if vecs.shape[1] > args.dims: + vecs = vecs[:, : args.dims] + else: + vecs = np.pad(vecs, ((0, 0), (0, args.dims - vecs.shape[1]))) + vecs = l2_normalize_rows(vecs.astype(np.float32, copy=False)) + + out_dir = Path(args.out) + shards = write_shards(vecs, args.shard_size, args.dtype, out_dir) + + # Build a lightweight HNSW graph and store it in a compact binary layout + def hnsw_build(data: np.ndarray, M: int = 16, efC: int = 200, seed: int = 0) -> dict: + rng = random.Random(seed) + N, D = data.shape + levels: list[list[list[int]]] = [] # levels[L][i] = neighbors of node i at level L + + # random level assignment using 1/e distribution + node_levels = [] + for _ in range(N): + lvl = 0 + while rng.random() < 1 / math.e: + lvl += 1 + node_levels.append(lvl) + max_level = max(node_levels) if N > 0 else 0 + for _ in range(max_level + 1): + levels.append([[] for _ in range(N)]) + + def sim(i: int, j: int) -> float: + return float((data[i] * data[j]).sum()) + + entry = 0 if N > 0 else -1 + + def search_layer(q: int, ep: int, ef: int, L: int) -> list[int]: + if ep < 0: + return [] + visited = set() + cand: list[tuple[float, int]] = [] + top: list[tuple[float, int]] = [] + def push(node: int): + if node in visited: + return + visited.add(node) + cand.append((sim(q, node), node)) + push(ep) + while cand: + cand.sort(reverse=True) + s, v = cand.pop(0) + if len(top) >= ef and s <= top[-1][0]: + break + top.append((s, v)) + for u in levels[L][v]: + push(u) + top.sort(reverse=True) + return [n for _, n in top] + + for i in range(N): + if i == 0: + continue + lvl = node_levels[i] + ep = entry + for L in range(max_level, lvl, -1): + c = search_layer(i, ep, 1, L) + if c: + ep = c[0] + for L in range(min(max_level, lvl), -1, -1): + W = search_layer(i, ep, efC, L) + # Select top M by similarity + neigh = sorted(((sim(i, j), j) for j in W if j != i), reverse=True)[:M] + for _, e in neigh: + if e not in levels[L][i]: + levels[L][i].append(e) + if i not in levels[L][e]: + levels[L][e].append(i) + + # trim neighbors to M + for L in range(len(levels)): + for i in range(N): + if len(levels[L][i]) > M: + # keep top M by sim + nb = levels[L][i] + nb = sorted(nb, key=lambda j: sim(i, j), reverse=True)[:M] + levels[L][i] = nb + + return { + "M": M, + "efConstruction": efC, + "entryPoint": entry, + "maxLevel": max_level, + "levels": levels, + } + + hnsw = hnsw_build(vecs, M=16, efC=200) + hnsw_meta, hnsw_sha = write_hnsw_graph(hnsw["levels"], int(vecs.shape[0]), out_dir / "hnsw.bin") + + manifest = { + "version": 2, + "dims": args.dims, + "dtype": args.dtype, + "normalized": True, + "rows": int(vecs.shape[0]), + "shardSizeRows": args.shard_size, + "vectors": { + "dtype": args.dtype, + "rows": int(vecs.shape[0]), + "dims": args.dims, + "shards": shards, + }, + "ids": ids, + "titles": titles, + "chunkMetadata": chunk_metadata, + "hnsw": { + "M": hnsw["M"], + "efConstruction": hnsw["efConstruction"], + "entryPoint": hnsw["entryPoint"], + "maxLevel": hnsw["maxLevel"], + "graph": { + "path": "/embeddings/hnsw.bin", + "sha256": hnsw_sha, + "levels": hnsw_meta, + }, + }, + } + (out_dir / "manifest.json").write_text(json.dumps(manifest, ensure_ascii=False), encoding="utf-8") + print(f"Wrote {len(shards)} vector shard(s), HNSW graph, and manifest to {out_dir}") + +if __name__ == "__main__": + main() diff --git a/quartz/plugins/emitters/404.tsx b/quartz/plugins/emitters/404.tsx index 04a006dd1..8eba6ba2f 100644 --- a/quartz/plugins/emitters/404.tsx +++ b/quartz/plugins/emitters/404.tsx @@ -40,7 +40,7 @@ export const NotFoundPage: QuartzEmitterPlugin = () => { description: notFound, frontmatter: { title: notFound, tags: [] }, }) - const externalResources = pageResources(path, resources) + const externalResources = pageResources(path, resources, ctx.cfg.configuration) const componentData: QuartzComponentProps = { ctx, fileData: vfile.data, diff --git a/quartz/plugins/emitters/componentResources.ts b/quartz/plugins/emitters/componentResources.ts index f97fddec2..4340af50f 100644 --- a/quartz/plugins/emitters/componentResources.ts +++ b/quartz/plugins/emitters/componentResources.ts @@ -1,5 +1,8 @@ import { FullSlug, joinSegments } from "../../util/path" import { QuartzEmitterPlugin } from "../types" +import path from "path" +import fs from "node:fs/promises" +import { globby } from "globby" // @ts-ignore import spaRouterScript from "../../components/scripts/spa.inline" @@ -16,7 +19,7 @@ import { processGoogleFonts, } from "../../util/theme" import { Features, transform } from "lightningcss" -import { transform as transpile } from "esbuild" +import { transform as transpile, build as bundle } from "esbuild" import { write } from "./helpers" type ComponentResources = { @@ -357,7 +360,47 @@ export const ComponentResources: QuartzEmitterPlugin = () => { ext: ".js", content: postscript, }) + + // Bundle all worker files + const workerFiles = await globby(["quartz/**/*.worker.ts"]) + for (const src of workerFiles) { + const result = await bundle({ + entryPoints: [src], + bundle: true, + minify: true, + platform: "browser", + format: "esm", + write: false, + }) + const code = result.outputFiles[0].text + const name = path.basename(src).replace(/\.ts$/, "") + yield write({ ctx, slug: name as FullSlug, ext: ".js", content: code }) + } + }, + async *partialEmit(ctx, _content, _resources, changeEvents) { + // Handle worker file changes in incremental builds + for (const changeEvent of changeEvents) { + if (!/\.worker\.ts$/.test(changeEvent.path)) continue + if (changeEvent.type === "delete") { + const name = path.basename(changeEvent.path).replace(/\.ts$/, "") + const dest = joinSegments(ctx.argv.output, `${name}.js`) + try { + await fs.unlink(dest) + } catch {} + continue + } + const result = await bundle({ + entryPoints: [changeEvent.path], + bundle: true, + minify: true, + platform: "browser", + format: "esm", + write: false, + }) + const code = result.outputFiles[0].text + const name = path.basename(changeEvent.path).replace(/\.ts$/, "") + yield write({ ctx, slug: name as FullSlug, ext: ".js", content: code }) + } }, - async *partialEmit() {}, } } diff --git a/quartz/plugins/emitters/contentPage.tsx b/quartz/plugins/emitters/contentPage.tsx index c3410ecc3..b07635383 100644 --- a/quartz/plugins/emitters/contentPage.tsx +++ b/quartz/plugins/emitters/contentPage.tsx @@ -25,7 +25,7 @@ async function processContent( ) { const slug = fileData.slug! const cfg = ctx.cfg.configuration - const externalResources = pageResources(pathToRoot(slug), resources) + const externalResources = pageResources(pathToRoot(slug), resources, ctx.cfg.configuration) const componentData: QuartzComponentProps = { ctx, fileData, diff --git a/quartz/plugins/emitters/folderPage.tsx b/quartz/plugins/emitters/folderPage.tsx index f9b181dff..3cd288c05 100644 --- a/quartz/plugins/emitters/folderPage.tsx +++ b/quartz/plugins/emitters/folderPage.tsx @@ -38,7 +38,7 @@ async function* processFolderInfo( const slug = joinSegments(folder, "index") as FullSlug const [tree, file] = folderContent const cfg = ctx.cfg.configuration - const externalResources = pageResources(pathToRoot(slug), resources) + const externalResources = pageResources(pathToRoot(slug), resources, ctx.cfg.configuration) const componentData: QuartzComponentProps = { ctx, fileData: file.data, diff --git a/quartz/plugins/emitters/index.ts b/quartz/plugins/emitters/index.ts index d2de2ed1e..1471544ce 100644 --- a/quartz/plugins/emitters/index.ts +++ b/quartz/plugins/emitters/index.ts @@ -1,7 +1,7 @@ export { ContentPage } from "./contentPage" export { TagPage } from "./tagPage" export { FolderPage } from "./folderPage" -export { ContentIndex as ContentIndex } from "./contentIndex" +export { ContentIndex } from "./contentIndex" export { AliasRedirects } from "./aliases" export { Assets } from "./assets" export { Static } from "./static" @@ -10,3 +10,4 @@ export { ComponentResources } from "./componentResources" export { NotFoundPage } from "./404" export { CNAME } from "./cname" export { CustomOgImages } from "./ogImage" +export { SemanticIndex } from "./semantic" diff --git a/quartz/plugins/emitters/semantic.ts b/quartz/plugins/emitters/semantic.ts new file mode 100644 index 000000000..47442ea9a --- /dev/null +++ b/quartz/plugins/emitters/semantic.ts @@ -0,0 +1,235 @@ +import { write } from "./helpers" +import { QuartzEmitterPlugin } from "../types" +import { FilePath, FullSlug, joinSegments, QUARTZ } from "../../util/path" +import { ReadTimeResults } from "reading-time" +import { GlobalConfiguration } from "../../cfg" +import { spawn } from "child_process" + +const DEFAULT_MODEL_ID = "onnx-community/Qwen3-Embedding-0.6B-ONNX" + +const defaults: GlobalConfiguration["semanticSearch"] = { + enable: true, + model: DEFAULT_MODEL_ID, + aot: false, + dims: 1024, + dtype: "fp32", + shardSizeRows: 1024, + hnsw: { M: 16, efConstruction: 200 }, + chunking: { + chunkSize: 512, + chunkOverlap: 128, + noChunking: false, + }, + vllm: { + enable: false, + vllmUrl: + process.env.VLLM_URL || process.env.VLLM_EMBED_URL || "http://127.0.0.1:8000/v1/embeddings", + concurrency: parseInt(process.env.VLLM_CONCURRENCY || "8", 10), + batchSize: parseInt(process.env.VLLM_BATCH_SIZE || "64", 10), + }, +} + +type ContentDetails = { + slug: string + title: string + filePath: FilePath + content: string + readingTime?: Partial +} + +/** + * Check if uv is installed + */ +function checkUvInstalled(): Promise { + return new Promise((resolve) => { + const proc = spawn("uv", ["--version"], { shell: true }) + proc.on("error", () => resolve(false)) + proc.on("close", (code) => resolve(code === 0)) + }) +} + +/** + * Run the Python embedding build script using uv + * Script uses PEP 723 inline metadata for dependency management + */ +function runEmbedBuild( + jsonlPath: string, + outDir: string, + opts: { + model: string + dtype: string + dims: number + shardSizeRows: number + chunking: { chunkSize: number; chunkOverlap: number; noChunking: boolean } + vllm: { enable: boolean; vllmUrl?: string; concurrency: number; batchSize: number } + }, +): Promise { + return new Promise((resolve, reject) => { + const scriptPath = joinSegments(QUARTZ, "embed_build.py") + const args = [ + "run", + scriptPath, + "--jsonl", + jsonlPath, + "--model", + opts.model, + "--out", + outDir, + "--dtype", + opts.dtype, + "--dims", + String(opts.dims), + "--shard-size", + String(opts.shardSizeRows), + "--chunk-size", + String(opts.chunking.chunkSize), + "--chunk-overlap", + String(opts.chunking.chunkOverlap), + ] + + if (opts.chunking.noChunking) { + args.push("--no-chunking") + } + + if (opts.vllm.enable) { + args.push("--use-vllm") + if (opts.vllm.vllmUrl) { + args.push("--vllm-url", opts.vllm.vllmUrl) + } + args.push("--concurrency", String(opts.vllm.concurrency)) + args.push("--batch-size", String(opts.vllm.batchSize)) + } + + console.log("\nRunning embedding generation:") + console.log(` uv ${args.join(" ")}`) + + const env = { ...process.env } + if (opts.vllm.enable && !env.USE_VLLM) { + env.USE_VLLM = "1" + } + + const proc = spawn("uv", args, { + stdio: "inherit", + shell: true, + env, + }) + + proc.on("error", (err) => { + reject(new Error(`Failed to spawn uv: ${err.message}`)) + }) + + proc.on("close", (code) => { + if (code === 0) { + console.log("Embedding generation completed successfully") + resolve() + } else { + reject(new Error(`embed_build.py exited with code ${code}`)) + } + }) + }) +} + +export const SemanticIndex: QuartzEmitterPlugin> = ( + opts, +) => { + const merged = { ...defaults, ...opts } + const o = { + enable: merged.enable!, + model: merged.model!, + aot: merged.aot!, + dims: merged.dims!, + dtype: merged.dtype!, + shardSizeRows: merged.shardSizeRows!, + hnsw: { + M: merged.hnsw?.M ?? defaults.hnsw!.M!, + efConstruction: merged.hnsw?.efConstruction ?? defaults.hnsw!.efConstruction!, + efSearch: merged.hnsw?.efSearch, + }, + chunking: { + chunkSize: merged.chunking?.chunkSize ?? defaults.chunking!.chunkSize!, + chunkOverlap: merged.chunking?.chunkOverlap ?? defaults.chunking!.chunkOverlap!, + noChunking: merged.chunking?.noChunking ?? defaults.chunking!.noChunking!, + }, + vllm: { + enable: merged.vllm?.enable ?? defaults.vllm!.enable!, + vllmUrl: merged.vllm?.vllmUrl ?? defaults.vllm!.vllmUrl, + concurrency: merged.vllm?.concurrency ?? defaults.vllm!.concurrency!, + batchSize: merged.vllm?.batchSize ?? defaults.vllm!.batchSize!, + }, + } + + if (!o.model) { + throw new Error("Semantic search requires a model identifier") + } + + return { + name: "SemanticIndex", + getQuartzComponents() { + return [] + }, + async *partialEmit() {}, + async *emit(ctx, content, _resources) { + if (!o.enable) return + + const docs: ContentDetails[] = [] + for (const [_, file] of content) { + const slug = file.data.slug! + const title = file.data.frontmatter?.title ?? slug + const text = file.data.text + if (text) { + docs.push({ + slug, + title, + filePath: file.data.filePath!, + content: text, + readingTime: file.data.readingTime, + }) + } + } + + // Emit JSONL with the exact text used for embeddings + const jsonl = docs + .map((d) => ({ slug: d.slug, title: d.title, text: d.content })) + .map((o) => JSON.stringify(o)) + .join("\n") + + const jsonlSlug = "embeddings-text" as FullSlug + yield write({ + ctx, + slug: jsonlSlug, + ext: ".jsonl", + content: jsonl, + }) + + // If aot is false, run the embedding generation script + if (!o.aot) { + console.log("\nGenerating embeddings (aot=false)...") + + // Check for uv + const hasUv = await checkUvInstalled() + if (!hasUv) { + throw new Error( + "uv is required for embedding generation. Install it from https://docs.astral.sh/uv/", + ) + } + + const jsonlPath = joinSegments(ctx.argv.output, "embeddings-text.jsonl") + const outDir = joinSegments(ctx.argv.output, "embeddings") + + try { + await runEmbedBuild(jsonlPath, outDir, o) + } catch (err) { + const message = err instanceof Error ? err.message : String(err) + throw new Error(`Embedding generation failed: ${message}`) + } + } else { + console.log( + "\nSkipping embedding generation (aot=true). Expecting pre-generated embeddings in public/embeddings/", + ) + } + }, + externalResources(_ctx) { + return {} + }, + } +} diff --git a/quartz/plugins/emitters/tagPage.tsx b/quartz/plugins/emitters/tagPage.tsx index 5f238932d..d0ab59295 100644 --- a/quartz/plugins/emitters/tagPage.tsx +++ b/quartz/plugins/emitters/tagPage.tsx @@ -73,7 +73,7 @@ async function processTagPage( const slug = joinSegments("tags", tag) as FullSlug const [tree, file] = tagContent const cfg = ctx.cfg.configuration - const externalResources = pageResources(pathToRoot(slug), resources) + const externalResources = pageResources(pathToRoot(slug), resources, ctx.cfg.configuration) const componentData: QuartzComponentProps = { ctx, fileData: file.data, diff --git a/quartz/workers/semantic.worker.ts b/quartz/workers/semantic.worker.ts new file mode 100644 index 000000000..2d8e46477 --- /dev/null +++ b/quartz/workers/semantic.worker.ts @@ -0,0 +1,548 @@ +// Unified semantic search worker: handles data loading and query execution +import { env, pipeline } from "@huggingface/transformers" +import "onnxruntime-web/webgpu" +import "onnxruntime-web/wasm" + +export {} + +type VectorShardMeta = { + path: string + rows: number + rowOffset: number + byteLength: number + sha256?: string + byteStride: number +} + +type LevelSection = { + level: number + indptr: { offset: number; elements: number; byteLength: number } + indices: { offset: number; elements: number; byteLength: number } +} + +type ChunkMetadata = { + parentSlug: string + chunkId: number +} + +type Manifest = { + version: number + dims: number + dtype: string + normalized: boolean + rows: number + shardSizeRows: number + vectors: { + dtype: string + rows: number + dims: number + shards: VectorShardMeta[] + } + ids: string[] + titles?: string[] + chunkMetadata?: Record + hnsw: { + M: number + efConstruction: number + entryPoint: number + maxLevel: number + graph: { + path: string + sha256?: string + levels: LevelSection[] + } + } +} + +type InitMessage = { + type: "init" + cfg: any + manifestUrl: string + baseUrl?: string + disableCache?: boolean +} + +type SearchMessage = { type: "search"; text: string; k: number; seq: number } +type ResetMessage = { type: "reset" } + +type WorkerMessage = InitMessage | SearchMessage | ResetMessage + +type ReadyMessage = { type: "ready" } + +type ProgressMessage = { + type: "progress" + loadedRows: number + totalRows: number +} + +type SearchHit = { id: number; score: number } + +type SearchResultMessage = { + type: "search-result" + seq: number + semantic: SearchHit[] +} + +type ErrorMessage = { type: "error"; seq?: number; message: string } + +type WorkerState = "idle" | "loading" | "ready" | "error" + +// IndexedDB configuration +const DB_NAME = "semantic-search-cache" +const STORE_NAME = "assets" +const DB_VERSION = 1 +const hasIndexedDB = typeof indexedDB !== "undefined" +const supportsSharedArrayBuffer = typeof SharedArrayBuffer !== "undefined" + +// State +let state: WorkerState = "idle" +let manifest: Manifest | null = null +let cfg: any = null +let vectorsView: Float32Array | null = null +let dims = 0 +let rows = 0 +let classifier: any = null +let envConfigured = false +let entryPoint = -1 +let maxLevel = 0 +let efDefault = 128 +let levelGraph: { indptr: Uint32Array; indices: Uint32Array }[] = [] +let abortController: AbortController | null = null +let dbPromise: Promise | null = null + +// IndexedDB helpers +function openDatabase(): Promise { + if (!hasIndexedDB) { + return Promise.reject(new Error("indexedDB unavailable")) + } + if (!dbPromise) { + dbPromise = new Promise((resolve, reject) => { + const req = indexedDB.open(DB_NAME, DB_VERSION) + req.onupgradeneeded = () => { + const db = req.result + if (!db.objectStoreNames.contains(STORE_NAME)) { + db.createObjectStore(STORE_NAME) + } + } + req.onsuccess = () => resolve(req.result) + req.onerror = () => reject(req.error ?? new Error("failed to open cache store")) + }) + } + return dbPromise +} + +async function readAsset(hash: string): Promise { + if (!hasIndexedDB) { + return null + } + const db = await openDatabase() + return new Promise((resolve, reject) => { + const tx = db.transaction(STORE_NAME, "readonly") + const store = tx.objectStore(STORE_NAME) + const req = store.get(hash) + req.onsuccess = () => { + const value = req.result + if (value instanceof ArrayBuffer) { + resolve(value) + } else if (value && value.buffer instanceof ArrayBuffer) { + resolve(value.buffer as ArrayBuffer) + } else { + resolve(null) + } + } + req.onerror = () => reject(req.error ?? new Error("failed to read cached asset")) + }) +} + +async function writeAsset(hash: string, buffer: ArrayBuffer): Promise { + if (!hasIndexedDB) { + return + } + const db = await openDatabase() + await new Promise((resolve, reject) => { + const tx = db.transaction(STORE_NAME, "readwrite") + const store = tx.objectStore(STORE_NAME) + const req = store.put(buffer, hash) + req.onsuccess = () => resolve() + req.onerror = () => reject(req.error ?? new Error("failed to cache asset")) + }) +} + +function toAbsolute(path: string, baseUrl?: string): string { + if (path.startsWith("http://") || path.startsWith("https://")) { + return path + } + const base = baseUrl ?? self.location.origin + return new URL(path, base).toString() +} + +async function fetchBinary( + path: string, + disableCache: boolean, + sha?: string, +): Promise { + if (!disableCache && sha && hasIndexedDB) { + try { + const cached = await readAsset(sha) + if (cached) { + return cached + } + } catch { + // fall through to network fetch on cache errors + } + } + const res = await fetch(path, { signal: abortController?.signal ?? undefined }) + if (!res.ok) { + throw new Error(`failed to fetch ${path}: ${res.status} ${res.statusText}`) + } + const payload = await res.arrayBuffer() + if (!disableCache && sha && hasIndexedDB) { + try { + await writeAsset(sha, payload) + } catch { + // ignore cache write failures + } + } + return payload +} + +async function populateVectors( + manifest: Manifest, + baseUrl: string | undefined, + disableCache: boolean | undefined, +): Promise<{ buffer: Float32Array; rowsLoaded: number }> { + if (manifest.vectors.dtype !== "fp32") { + throw new Error(`unsupported embedding dtype '${manifest.vectors.dtype}', regenerate with fp32`) + } + const rows = manifest.rows + const dims = manifest.dims + const totalBytes = rows * dims * Float32Array.BYTES_PER_ELEMENT + const buffer = supportsSharedArrayBuffer + ? new Float32Array(new SharedArrayBuffer(totalBytes)) + : new Float32Array(totalBytes) + let loadedRows = 0 + for (const shard of manifest.vectors.shards) { + const absolute = toAbsolute(shard.path, baseUrl) + const payload = await fetchBinary(absolute, Boolean(disableCache), shard.sha256) + const view = new Float32Array(payload) + if (view.length !== shard.rows * dims) { + throw new Error( + `shard ${shard.path} has mismatched length (expected ${shard.rows * dims}, got ${view.length})`, + ) + } + buffer.set(view, shard.rowOffset * dims) + loadedRows = Math.min(rows, shard.rowOffset + shard.rows) + const progress: ProgressMessage = { + type: "progress", + loadedRows, + totalRows: rows, + } + self.postMessage(progress) + } + return { buffer, rowsLoaded: loadedRows } +} + +async function populateGraph( + manifest: Manifest, + baseUrl: string | undefined, + disableCache: boolean | undefined, +): Promise { + const graphMeta = manifest.hnsw.graph + const absolute = toAbsolute(graphMeta.path, baseUrl) + return await fetchBinary(absolute, Boolean(disableCache), graphMeta.sha256) +} + +function configureRuntimeEnv() { + if (envConfigured) return + env.allowLocalModels = false + env.allowRemoteModels = true + const wasmBackend = env.backends?.onnx?.wasm + if (!wasmBackend) { + throw new Error("transformers.js ONNX runtime backend unavailable") + } + const cdnBase = `https://cdn.jsdelivr.net/npm/@huggingface/transformers@${env.version}/dist/` + wasmBackend.wasmPaths = cdnBase + envConfigured = true +} + +async function ensureEncoder() { + if (classifier) return + if (!cfg?.model) { + throw new Error("semantic worker missing model identifier") + } + configureRuntimeEnv() + const dtype = typeof cfg?.dtype === "string" && cfg.dtype.length > 0 ? cfg.dtype : "fp32" + const pipelineOpts: Record = { + device: "wasm", + dtype, + local_files_only: false, + } + classifier = await pipeline("feature-extraction", cfg.model, pipelineOpts) + cfg.dtype = dtype +} + +function vectorSlice(id: number): Float32Array { + if (!vectorsView) { + throw new Error("vector buffer not configured") + } + const start = id * dims + const end = start + dims + return vectorsView.subarray(start, end) +} + +function dot(a: Float32Array, b: Float32Array): number { + let s = 0 + for (let i = 0; i < dims; i++) { + s += a[i] * b[i] + } + return s +} + +function neighborsFor(level: number, node: number): Uint32Array { + const meta = levelGraph[level] + if (!meta) return new Uint32Array() + const { indptr, indices } = meta + if (node < 0 || node + 1 >= indptr.length) return new Uint32Array() + const start = indptr[node] + const end = indptr[node + 1] + return indices.subarray(start, end) +} + +function insertSortedDescending(arr: SearchHit[], item: SearchHit) { + let idx = arr.length + while (idx > 0 && arr[idx - 1].score < item.score) { + idx -= 1 + } + arr.splice(idx, 0, item) +} + +function bruteForceSearch(query: Float32Array, k: number): SearchHit[] { + if (!vectorsView) return [] + const hits: SearchHit[] = [] + for (let id = 0; id < rows; id++) { + const score = dot(query, vectorSlice(id)) + if (hits.length < k) { + insertSortedDescending(hits, { id, score }) + } else if (score > hits[hits.length - 1].score) { + insertSortedDescending(hits, { id, score }) + hits.length = k + } + } + return hits +} + +function hnswSearch(query: Float32Array, k: number): SearchHit[] { + if (!manifest || !vectorsView || entryPoint < 0 || levelGraph.length === 0) { + return bruteForceSearch(query, k) + } + const ef = Math.max(efDefault, k * 10) + let ep = entryPoint + let epScore = dot(query, vectorSlice(ep)) + for (let level = maxLevel; level > 0; level--) { + let changed = true + while (changed) { + changed = false + const neigh = neighborsFor(level, ep) + for (let i = 0; i < neigh.length; i++) { + const candidate = neigh[i] + if (candidate >= rows) continue + const score = dot(query, vectorSlice(candidate)) + if (score > epScore) { + epScore = score + ep = candidate + changed = true + } + } + } + } + + const visited = new Set() + const candidateQueue: SearchHit[] = [] + const best: SearchHit[] = [] + insertSortedDescending(candidateQueue, { id: ep, score: epScore }) + insertSortedDescending(best, { id: ep, score: epScore }) + visited.add(ep) + + while (candidateQueue.length > 0) { + const current = candidateQueue.shift()! + const worstBest = best.length >= ef ? best[best.length - 1].score : -Infinity + if (current.score < worstBest && best.length >= ef) { + break + } + const neigh = neighborsFor(0, current.id) + for (let i = 0; i < neigh.length; i++) { + const candidate = neigh[i] + if (candidate >= rows || visited.has(candidate)) continue + visited.add(candidate) + const score = dot(query, vectorSlice(candidate)) + const hit = { id: candidate, score } + insertSortedDescending(candidateQueue, hit) + if (best.length < ef || score > best[best.length - 1].score) { + insertSortedDescending(best, hit) + if (best.length > ef) { + best.pop() + } + } + } + } + + best.sort((a, b) => b.score - a.score) + return best.slice(0, k) +} + +async function embed(text: string, isQuery: boolean = false): Promise { + await ensureEncoder() + // Apply model-specific prefixes for asymmetric search + let prefixedText = text + if (cfg?.model) { + const modelName = cfg.model.toLowerCase() + switch (true) { + case modelName.includes("e5"): { + // E5 models require query: or passage: prefix + prefixedText = isQuery ? `query: ${text}` : `passage: ${text}` + break + } + case modelName.includes("qwen") && modelName.includes("embedding"): { + // Qwen3-Embedding requires task instruction for queries only + if (isQuery) { + const task = "Given a web search query, retrieve relevant passages that answer the query" + prefixedText = `Instruct: ${task}\nQuery: ${text}` + } + // Documents use plain text (no prefix) + break + } + case modelName.includes("embeddinggemma"): { + // embeddinggemma requires specific prefixes + prefixedText = isQuery + ? `task: search result | query: ${text}` + : `title: none | text: ${text}` + break + } + default: + break + } + } + const out = await classifier(prefixedText, { pooling: "mean", normalize: true }) + const data = Array.from(out?.data ?? out) as number[] + const vec = new Float32Array(dims) + for (let i = 0; i < dims; i++) vec[i] = data[i] ?? 0 + return vec +} + +async function handleInit(msg: InitMessage) { + if (state === "loading" || state === "ready") { + throw new Error("worker already initialized or loading") + } + + state = "loading" + abortController?.abort() + abortController = new AbortController() + + try { + cfg = msg.cfg + + const manifestUrl = toAbsolute(msg.manifestUrl, msg.baseUrl) + const response = await fetch(manifestUrl, { signal: abortController.signal }) + if (!response.ok) { + throw new Error( + `failed to fetch manifest ${manifestUrl}: ${response.status} ${response.statusText}`, + ) + } + manifest = (await response.json()) as Manifest + + if (manifest.vectors.dtype !== "fp32") { + throw new Error( + `unsupported embedding dtype '${manifest.vectors.dtype}', regenerate with fp32`, + ) + } + + dims = manifest.dims + rows = manifest.rows + + const { buffer: vectorBuffer } = await populateVectors(manifest, msg.baseUrl, msg.disableCache) + vectorsView = vectorBuffer + + const graphBuffer = await populateGraph(manifest, msg.baseUrl, msg.disableCache) + + entryPoint = manifest.hnsw.entryPoint + maxLevel = manifest.hnsw.maxLevel + efDefault = Math.max(64, manifest.hnsw.M * 4) + levelGraph = manifest.hnsw.graph.levels.map((level) => { + const indptr = new Uint32Array(graphBuffer, level.indptr.offset, level.indptr.elements) + const indices = new Uint32Array(graphBuffer, level.indices.offset, level.indices.elements) + return { indptr, indices } + }) + + state = "ready" + const ready: ReadyMessage = { type: "ready" } + self.postMessage(ready) + } catch (err) { + state = "error" + throw err + } +} + +async function handleSearch(msg: SearchMessage) { + if (state !== "ready") { + throw new Error("worker not ready for search") + } + if (!manifest || !vectorsView) { + throw new Error("semantic worker not configured") + } + + const queryVec = await embed(msg.text, true) + const semanticHits = hnswSearch(queryVec, Math.max(1, msg.k)) + const message: SearchResultMessage = { + type: "search-result", + seq: msg.seq, + semantic: semanticHits, + } + self.postMessage(message) +} + +function handleReset() { + abortController?.abort() + abortController = null + state = "idle" + manifest = null + cfg = null + vectorsView = null + dims = 0 + rows = 0 + classifier = null + envConfigured = false + levelGraph = [] + entryPoint = -1 + maxLevel = 0 +} + +self.onmessage = (event: MessageEvent) => { + const data = event.data + + if (data.type === "reset") { + handleReset() + return + } + + if (data.type === "init") { + void handleInit(data).catch((err: unknown) => { + const message: ErrorMessage = { + type: "error", + message: err instanceof Error ? err.message : String(err), + } + self.postMessage(message) + }) + return + } + + if (data.type === "search") { + void handleSearch(data).catch((err: unknown) => { + const message: ErrorMessage = { + type: "error", + seq: data.seq, + message: err instanceof Error ? err.message : String(err), + } + self.postMessage(message) + }) + } +}