diff --git a/docs/CNAME b/docs/CNAME new file mode 100644 index 0000000..e50745a --- /dev/null +++ b/docs/CNAME @@ -0,0 +1 @@ +airesearch.js.org \ No newline at end of file diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js index 867014f..196a71a 100644 --- a/docs/assets/navigation.js +++ b/docs/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAACpXWUY+aQBDA8e/Cs2mTS9MH3zhPq6leLaw1TdOHdZmDjbBDl8HTNP3uDdazcC6z3JvJ/vmNCKz8+B0QHCkYBwrNASxNix0kiTZpJXD+GG+DUVBKyoJx8FQbRRpN9b4nfZdRkQejYK9NEow/fvgz4vDNKlwPxJvUj8/FahmXoLTMJ5m0FYO/TofhAu9lpVXz0WO3Sj+9knaf4LMROP+X9snd0A+vH2YCPd/22vg5AUcSeL0uDPqqHEoL3IPhLls786PfsaZ6BwKbwxi10zEsNOdzide5PIF1obcVRx5LbN/qC5PA0am6QhYmK5XzrC9L/oMnmoABmuUBCBoCQ3134W31JvJumHnnR2fyoBUaxrsUfiqeTj+LL+vFhMGujZ8TWGolwBafLNZltXwIGfc2ZgakYMBKgqU0aS1TWGECeQRlfnJN6K/ZERTm+f/71g13G567duf5PV43YkBdNM/VN1CE9vxMzSwWMdme/Y3JmSGFJJV93YRxGLnQ1jKDVMrKEjaR8zG6LnIASKuyWETTcOU0WutepvUT9FutyAtuYdcPbWHnB/Rel5BoyTAvCYeVuaYYmq1DgfN27RY+qvlPiaGQhrTqfStxlxxNUGzRJgIjROcu3y04qk5TqOgRjtT0EyzKHM6Gk+2tmRHPoNMsghwO0iiYoFFQXh6icL1wjeGPGDyq2QhnFn7VYJRzT2Ny35BYFzqXVtPp/tRcLqnI/ULQX9+M+PkXmXeFWo4LAAA=" \ No newline at end of file +window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAACpWWUW/aMBCA/0qVZ7Rq1TRNvFEKLVphjLhDU9UH41yDhePLHKcFTfvvk1NGE7DP7DX3+XN8Pp/9+DuxsLVJPxltreHCJr1ErKXKDOik/3iICtQvYOz8Zszwjk3vk15ScrtO+slzrYWVqKvLY+bD2hYq6SUbqbOk//nTn96x7ifWtl4BQ+Y+h5UdjtDCYQ0npn0oPngoLRACFz5DgtqCtqFMnVL/pbw6z3kVl475ixSoCd+eIFSVMLyEh4V3pYfgieCppbgFDYY3efcVX74P33Od1zyHKWagFlCqnW/KME3+g8vYxYOVSloJFX0MHJuWICRXwzU3FVG6x2j8ULgRDK95JUXkpB2RcfWUm02Gr5rh3RsaMndBUlzuHMJwqGS5Qm4yv/YEIzdjoi2YZy5CFQHFCrJ9V5grvgPjLeETipx0yq1YByYsXOz7wyAdLHwztcJEsl5B5usFKHjhWgADU4wN/KpBC28hE3hsklQWUnEj7e5658qOC+tPUZgmUzWD2nB1MYPQfWHRNLncTygUryqoLpvPXfPHqy8ddQrcBLehaoIpW4wGU2+7acWpltVgS1iFHUtYxQVyI0vIJCc0/xAyne8bQPedkSvoTOq8Yng3S5fECT5G482hPeJhOpifKXdoXO4uboaHcYT7iCTvsBLb/zLRGWz9V5kHJMQ52IFS77z/lukytO7ANZdRwNeFCKEs3Hp+gLBomrWMDRapNYHEEni0xFujwkXegs7ufkPUAsr9Xw3mk3gDPB5BniiGpRSRW/yt0hhuQFM3eBuLv6jS0egr+zafDIk31YGJ65p1uNZ/a7Auq/ubAeE9han9LZW0KbjXogDv+rtETOXSlELBtZUi+Cjyk5TaQrFEkzFcIHof9l2CUtV5DpWdwdY6fohFqaBxeLVB2lN3T38BdUwos0cNAAA=" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js index be14f23..624182b 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/classes/torch.html b/docs/classes/torch.html new file mode 100644 index 0000000..39de96d --- /dev/null +++ b/docs/classes/torch.html @@ -0,0 +1,91 @@ +torch | ai-research-agent

JS-PyTorch is a neural net matrix multiplication library +with GPU.js acceleration (translates matmul into WebGPU shader code) +and using PyTorch API syntax. +torch +Tensor Creation and Manipulation:

+

tensor(data, requires_grad = false, device = 'cpu') Creates a new Tensor filled with the given data

+

zeros(*shape, requires_grad = false, device = 'cpu') Creates a new Tensor filled with zeros

+

ones(*shape, requires_grad = false, device = 'cpu') Creates a new Tensor filled with ones

+

tril(*shape, requires_grad = false, device = 'cpu') Creates a new 2D lower triangular Tensor

+

randn(*shape, requires_grad = false, device = 'cpu', xavier = false) Creates a new Tensor filled with random values from a normal distribution

+

rand(*shape, requires_grad = false, device = 'cpu') Creates a new Tensor filled with random values from a uniform distribution

+

randint(low, high, *shape, requires_grad = false, device = 'cpu') Creates a new Tensor filled with random integers +Tensor Methods:

+

tensor.backward() Performs backpropagation from this tensor backwards

+

tensor.zero_grad() Clears the gradients stored in this tensor

+

tensor.zero_grad_graph() Clears the gradients stored in this tensor and all tensors that led to it

+

tensor.tolist() Returns the tensor's data as a JavaScript Array

+

add(a, b) Performs element-wise addition of two tensors

+

sub(a, b) Performs element-wise subtraction of two tensors

+

neg(a) Returns the element-wise opposite of the given Tensor

+

mul(a, b) Performs element-wise multiplication of two tensors

+

div(a, b) Performs element-wise division of two tensors

+

matmul(a, b) Performs matrix multiplication between two tensors

+

sum(a, dim, keepdims = false) Gets the sum of the Tensor over a specified dimension

+

mean(a, dim, keepdims = false) Gets the mean of the Tensor over a specified dimension

+

variance(a, dim, keepdims = false) Gets the variance of the Tensor over a specified dimension

+

transpose(a, dim1, dim2) Transposes the tensor along two consecutive dimensions

+

at(a, index1, index2) Returns elements from the tensor based on given indices

+

masked_fill(a, condition, value) Fills elements in the tensor based on a condition

+

pow(a, n) Returns tensor raised to element-wise power

+

sqrt(a) Returns element-wise square root of the tensor

+

exp(a) Returns element-wise exponentiation of the tensor

+

log(a) Returns element-wise natural log of the tensor

+

Neural Network Layers: +nn.Linear(in_size, out_size, device, bias, xavier) Applies a linear transformation to the input tensor +nn.MultiHeadSelfAttention(in_size, out_size, n_heads, n_timesteps, dropout_prob, device) Applies a self-attention layer on the input tensor +nn.FullyConnected(in_size, out_size, dropout_prob, device, bias) Applies a fully-connected layer on the input tensor +nn.Block(in_size, out_size, n_heads, n_timesteps, dropout_prob, device) Applies a transformer Block layer on the input tensor +nn.Embedding(in_size, embed_size) Creates an embedding table for vocabulary +nn.PositionalEmbedding(input_size, embed_size) Creates a positional embedding table +nn.ReLU() Applies Rectified Linear Unit activation function +nn.Softmax() Applies Softmax activation function +nn.Dropout(drop_prob) Applies dropout to input tensor +nn.LayerNorm(n_embed) Applies Layer Normalization to input tensor +nn.CrossEntropyLoss() Computes Cross Entropy Loss between target and input tensor

+

Optimization: +optim.Adam(params, lr, reg, betas, eps) Adam optimizer for updating model parameters

+

Utility Functions:

+

save(model, file) Saves the model reruning data blob (for you to save)

+

load(model, loadedData) Loads the model from saved data

+

PyTorch Contributors, +Leao, E. et al (2022), +See also: Brain.js

+

Properties

_reshape: ((a: any, shape: any) => any)
add: ((a: any, b: any) => any)
at: ((a: any, idx1: any, idx2: any) => any)
broadcast: ((a: any, b: any) => Tensor)
div: ((a: any, b: any) => any)
exp: ((a: any) => any)
getShape: ((data: any, shape?: any[]) => any[])

Type declaration

    • (data, shape?): any[]
    • import { GPU } from "@eduardoleao052/gpu"

      +

      Parameters

      • data: any
      • shape: any[] = []

      Returns any[]

load: ((model: any, loadedData: any) => any)
log: ((a: any) => any)
masked_fill: ((a: any, mask: any, condition: any, value: any) => any)
matmul: ((a: any, b: any) => any)
mean: ((a: any, dim?: number, keepdims?: boolean) => any)
mul: ((a: any, b: any) => any)
neg: ((a: any) => any)
nn: {
    Block: typeof Block;
    CrossEntropyLoss: typeof CrossEntropyLoss;
    Dropout: typeof Dropout;
    Embedding: typeof Embedding;
    FullyConnected: typeof FullyConnected;
    LayerNorm: typeof LayerNorm;
    Linear: typeof Linear;
    Module: typeof Module;
    MultiHeadSelfAttention: typeof MultiHeadSelfAttention;
    PositionalEmbedding: typeof PositionalEmbedding;
    ReLU: typeof ReLU;
    Softmax: typeof Softmax;
}

Add submodules:

+
ones: ((shape: any, requires_grad?: boolean, device?: string) => Tensor)
optim: {
    Adam: typeof Adam;
}
Parameter: typeof Parameter
pow: ((a: any, n: any) => any)
rand: ((shape: any, requires_grad?: boolean, device?: string) => Tensor)
randint: ((low?: number, high?: number, shape?: number[], requires_grad?: boolean) => Tensor)
randn: ((shape: any, requires_grad?: boolean, device?: string, xavier?: boolean) => Tensor)
reshape: ((a: any, shape: any) => any)
save: ((model: any, file: any) => string)
sqrt: ((a: any) => any)
tensor: ((data: any, requires_grad?: boolean, device?: string) => Tensor)
Tensor: typeof Tensor

Add methods from tensor.js (these methods are accessed with "torch."):

+
transpose: ((a: any, dim1: any, dim2: any) => any)
tril: ((shape: any, requires_grad?: boolean, device?: string) => Tensor)
variance: ((a: any, dim?: number, keepdims?: boolean) => any)
zeros: ((shape: any, requires_grad?: boolean, device?: string) => Tensor)
diff --git a/docs/functions/convertEmbeddingsToHNSW.html b/docs/functions/convertEmbeddingsToHNSW.html index f77b3fd..c11e753 100644 --- a/docs/functions/convertEmbeddingsToHNSW.html +++ b/docs/functions/convertEmbeddingsToHNSW.html @@ -1,16 +1,17 @@ convertEmbeddingsToHNSW | ai-research-agent

Function convertEmbeddingsToHNSW

  • Generates vectors for a set of documents and creates an HNSW index using hnswlib in C++ compiled to WASM JS for efficient similarity search.

    ANN Benchmarks

    -

    Pinecone - HNSW

    -

    Wikipedia - HNSW

    +

    https://github.com/brtholomy/hnsw +Pinecone - HNSW

    Parameters

    • documentVectors: string[]

      An array of document texts to be vectorized.

    • Optionaloptions: {
          maxElements: number;
          numDimensions: number;
      } = {}

      Optional parameters for vector generation and indexing.

      • maxElements: number

        The maximum number of data points.

      • numDimensions: number

        The length of data point vector that will be indexed.

    Returns Promise<HierarchicalNSW>

    The created HNSW index.

diff --git a/docs/functions/convertEmbeddingsToUMAP.html b/docs/functions/convertEmbeddingsToUMAP.html index 7b8250d..207b96b 100644 --- a/docs/functions/convertEmbeddingsToUMAP.html +++ b/docs/functions/convertEmbeddingsToUMAP.html @@ -40,7 +40,7 @@

Returns Promise<PlotDataPoint[]>

An array of plot data points.

McInnes et al. (2018)
Coenen et al. (2019)

-
diff --git a/docs/functions/convertHTMLSpecialChars.html b/docs/functions/convertHTMLSpecialChars.html index 095a8c0..d97e349 100644 --- a/docs/functions/convertHTMLSpecialChars.html +++ b/docs/functions/convertHTMLSpecialChars.html @@ -7,7 +7,7 @@
var normalHTML = convertHTMLSpecialChars('&lt;p&gt;This &amp; that &copy; 2023 '+
'&quot;Quotes&quot;&#39;Apostrophes&#39; &euro;100 &#x263A;&lt;/p&gt;', true)
console.log(normalHTML) // Returns: "<p>This & that © 2023 "Quotes" 'Apostrophes' €100 ☺</p>"
-
diff --git a/docs/functions/convertHTMLToBasicHTML.html b/docs/functions/convertHTMLToBasicHTML.html index 1d037a6..c3f7183 100644 --- a/docs/functions/convertHTMLToBasicHTML.html +++ b/docs/functions/convertHTMLToBasicHTML.html @@ -19,8 +19,8 @@
  • url: string

    base URL for converting relative URLs to absolute

  • videos: boolean

    default=true - Whether to include videos or not

  • Returns string

    basic text formatting html

    -

    Gulakov, A. (2024)

    -
    diff --git a/docs/functions/convertMarkdownToHtml.html b/docs/functions/convertMarkdownToHtml.html index ee35d1d..5a6c578 100644 --- a/docs/functions/convertMarkdownToHtml.html +++ b/docs/functions/convertMarkdownToHtml.html @@ -6,13 +6,15 @@
  • Unordered lists
  • Ordered lists
  • Paragraphs
  • +
  • Images
  • +
  • Links
  • Parameters

    Returns string

    The resulting HTML string.

    const markdown = "# Header\n\nThis is **bold** and *italic* text.\n\n* List item 1\n* List item 2";
    const html = convertMarkdownToHtml(markdown);
    console.log(html);
    // Output:
    // <h1>Header</h1>
    // <p>This is <strong>bold</strong> and <em>italic</em> text.</p>
    // <ul><li>List item 1</li><li>List item 2</li></ul>
    -
    diff --git a/docs/functions/convertPDFToHTML.html b/docs/functions/convertPDFToHTML.html index 281584b..23385b0 100644 --- a/docs/functions/convertPDFToHTML.html +++ b/docs/functions/convertPDFToHTML.html @@ -12,10 +12,10 @@
  • removePageHeaders: boolean

    default=true - Removes repeated headers found on each page

  • timeout: boolean

    default=10 - http request timeout

  • Returns any

    HTML formatted text or {error} if error in parsing

    -

    Gulakov, A. (2024), +

    Gulakov, A. (2024), Mozilla (2012-), Adobe (1993)

    -
    diff --git a/docs/functions/convertTextToEmbedding.html b/docs/functions/convertTextToEmbedding.html index 6c81a58..4f4605f 100644 --- a/docs/functions/convertTextToEmbedding.html +++ b/docs/functions/convertTextToEmbedding.html @@ -12,7 +12,10 @@

    Parameters

    Returns Promise<{
        embedding: number[];
        embeddingsDict: {};
    }>

    diff --git a/docs/functions/convertTextToTokens.html b/docs/functions/convertTextToTokens.html index 31d6a1a..58c20f4 100644 --- a/docs/functions/convertTextToTokens.html +++ b/docs/functions/convertTextToTokens.html @@ -13,8 +13,8 @@
  • phrasesModel: any

    remote model

  • typosModel: any

    remote model

  • Returns Token[]

    ex. [[50, 0, "Albert Einstein"],...]

    -

    Gulakov, A. (2024)

    -
    diff --git a/docs/functions/convertYoutubeToText.html b/docs/functions/convertYoutubeToText.html index e22b5a2..98fb079 100644 --- a/docs/functions/convertYoutubeToText.html +++ b/docs/functions/convertYoutubeToText.html @@ -6,10 +6,9 @@

    Returns any

    {content, timestamps} where content is the full text of -the transcript, and timestamps is an array of [characterIndex, timeSeconds] -*

    -

    Gulakov, A. (2024)

    -
    diff --git a/docs/functions/copyHtmlToClipboard.html b/docs/functions/copyHtmlToClipboard.html new file mode 100644 index 0000000..97c1194 --- /dev/null +++ b/docs/functions/copyHtmlToClipboard.html @@ -0,0 +1,19 @@ +copyHtmlToClipboard | ai-research-agent

    Function copyHtmlToClipboard

    • Copy HTML to clipboard. When pasting into rich text field, pastes rich +text. When pasting into plain text field, pastes: plain text, html, or markdown.

      +

      Parameters

      • html: string

        The HTML content to be copied.

        +
      • options: {
            pastePlainWithHTML: boolean;
            pastePlainWithMarkdown: boolean;
        } = {}

        The options object.

        +
        • pastePlainWithHTML: boolean

          If true, the plain text will be the same as the HTML. +If false, the plain text will be the same as the HTML, +without the HTML tags.

          +
        • pastePlainWithMarkdown: boolean

          If true, the plain text will be markdown. +If false, the plain text will be the same as the HTML, +without the HTML tags.

          +

      Returns Promise<void>

        +
      • A promise that resolves when +the HTML is copied to the clipboard.
      • +
      +
    diff --git a/docs/functions/embedYoutubePlayer.html b/docs/functions/embedYoutubePlayer.html index 8ab9fb8..b147db5 100644 --- a/docs/functions/embedYoutubePlayer.html +++ b/docs/functions/embedYoutubePlayer.html @@ -5,7 +5,7 @@
    // <div id="player"></div>
    const YT = embedYoutubePlayer();
    new YT.Player('player', {
    height: '360',
    width: '640',
    videoId: 'dQw4w9WgXcQ',
    events: {
    'onReady': onPlayerReady,
    'onStateChange': null,
    'onTimeChange': onTimeChange,
    }
    });
    function onPlayerReady(event) {
    event.target.playVideo();
    }
    function onTimeChange(time) {
    console.log(time)
    }
    -
    diff --git a/docs/functions/exportEmbeddingsIndex.html b/docs/functions/exportEmbeddingsIndex.html index eb1e4fb..3295f3f 100644 --- a/docs/functions/exportEmbeddingsIndex.html +++ b/docs/functions/exportEmbeddingsIndex.html @@ -1,8 +1,9 @@ -exportEmbeddingsIndex | ai-research-agent

    Function exportEmbeddingsIndex

    • Converts an HNSW index to a base64 encoded string.

      +exportEmbeddingsIndex | ai-research-agent

      Function exportEmbeddingsIndex

      • Converts an HNSW index to a base64 encoded string. +https://github.com/NJU-RINC/hnsw-visulize/blob/master/path.gif?raw=true

        Parameters

        • index: any

          The HNSW index object.

        Returns Promise<string>

        A promise that resolves to a base64 encoded string representation of the index.

        If there's an error during the index serialization process.

        -
      diff --git a/docs/functions/extract.html b/docs/functions/extract.html index f992157..7edf08e 100644 --- a/docs/functions/extract.html +++ b/docs/functions/extract.html @@ -18,8 +18,8 @@

    Returns Article

    -

    Gulakov, A. (2024)

    -
    diff --git a/docs/functions/extractCite.html b/docs/functions/extractCite.html index 416f455..4782671 100644 --- a/docs/functions/extractCite.html +++ b/docs/functions/extractCite.html @@ -6,10 +6,9 @@ since organizations are not reversed.

    Article-extraction-benchmark

    Parameters

    Returns any

    {author, date, title, source} -*

    -

    Gulakov, A. (2024)

    -
    diff --git a/docs/functions/extractContentHTML.html b/docs/functions/extractContentHTML.html index 4d392bc..6322b7b 100644 --- a/docs/functions/extractContentHTML.html +++ b/docs/functions/extractContentHTML.html @@ -71,7 +71,7 @@

    Based on Mozilla Readability (2015), Arc90 (2010)

    -
    diff --git a/docs/functions/extractContentHTML2.html b/docs/functions/extractContentHTML2.html index bc3415a..9336e68 100644 --- a/docs/functions/extractContentHTML2.html +++ b/docs/functions/extractContentHTML2.html @@ -35,7 +35,7 @@
    var url =  "https://en.wikipedia.org/wiki/David_Hilbert"
    var html = await (await fetch(url)).text();
    var content = extractContentHTML(html);
    console.log(content); // HTML content of main article body
    -
    diff --git a/docs/functions/extractFavicon.html b/docs/functions/extractFavicon.html index c78302c..a6725c5 100644 --- a/docs/functions/extractFavicon.html +++ b/docs/functions/extractFavicon.html @@ -1,12 +1,11 @@ extractFavicon | ai-research-agent

    Function extractFavicon

    • Gets favicon for any URL by parsing the HTML and looking for <link rel="icon"> tags and validates domain.com/favicon.ico by checking if for valid response.

      -

      Parameters

      • url: string
      • Optionaloptions: any = {}

      Returns Promise<string>

      Favicon URL or null if not found -*

      -

      Parameters

      • url: string
      • Optionaloptions: any = {}

      Returns Promise<string>

      Favicon URL or null if not found

      +

      Gulakov, A. (2024)

      const favicons = await extractFavicon('https://github.com/')
       
      -
    diff --git a/docs/functions/extractSEEKTOPIC.html b/docs/functions/extractSEEKTOPIC.html index 39c95f6..8591a5d 100644 --- a/docs/functions/extractSEEKTOPIC.html +++ b/docs/functions/extractSEEKTOPIC.html @@ -54,8 +54,8 @@
    extractSEEKTOPIC(testDoc, { phrasesModel, heavyWeightQuery: "self attention", limitTopSentences: 10})
     
    -

    Gulakov, A. (2024)

    -
    diff --git a/docs/functions/extractTopicTermGroupsLDA.html b/docs/functions/extractTopicTermGroupsLDA.html index 91d53c2..f59a1e7 100644 --- a/docs/functions/extractTopicTermGroupsLDA.html +++ b/docs/functions/extractTopicTermGroupsLDA.html @@ -21,8 +21,8 @@

    Returns any[]

    -

    Blei, D; Ng, A. (2003)

    -
    diff --git a/docs/functions/generateLanguageModelReply.html b/docs/functions/generateLanguageModelReply.html index 8add350..847a3fc 100644 --- a/docs/functions/generateLanguageModelReply.html +++ b/docs/functions/generateLanguageModelReply.html @@ -21,7 +21,7 @@
  • apiKey: string

    The API key for authentication with Groq or OpenAI.

  • model: string

    The specific AI model to be used (e.g., GPT-4, Mixtral 8x7B).

  • Returns Promise<{
        content: string;
        error: string;
    }>

    The generated AI response as HTML.

    -
    diff --git a/docs/functions/getAllEmbeddings.html b/docs/functions/getAllEmbeddings.html index be20432..db62447 100644 --- a/docs/functions/getAllEmbeddings.html +++ b/docs/functions/getAllEmbeddings.html @@ -1,8 +1,9 @@ getAllEmbeddings | ai-research-agent

    Function getAllEmbeddings

    • Retrieves all embeddings from the HNSW index.

      Parameters

      • index: HierarchicalNSW

        The HNSW index containing the embeddings.

      • Optionalprecision: number = 3

        The number of decimal places to round to.

        -

      Returns number[][]

      An array of embedding vectors.

      -
    diff --git a/docs/functions/getEmbeddingModel.html b/docs/functions/getEmbeddingModel.html index 235442c..41d6bf2 100644 --- a/docs/functions/getEmbeddingModel.html +++ b/docs/functions/getEmbeddingModel.html @@ -2,8 +2,9 @@

    Parameters

    Returns Promise<AutoTokenizer>

    The pipeline.

    -
    diff --git a/docs/functions/importVectorIndexFromString.html b/docs/functions/importVectorIndexFromString.html index db3546b..a12640a 100644 --- a/docs/functions/importVectorIndexFromString.html +++ b/docs/functions/importVectorIndexFromString.html @@ -3,8 +3,7 @@
  • dim: number = 384

    The dimensionality of the vectors in the index.

  • space: string = "cosine"

    The space type of the index (e.g., 'l2', 'ip', 'cosine').

  • Returns Promise<any>

    A promise that resolves to the imported HNSW index object.

    -

    If there's an error during the index deserialization process.

    -
    diff --git a/docs/functions/matchQUASAR.html b/docs/functions/matchQUASAR.html index 4b8f2c9..86cf68f 100644 --- a/docs/functions/matchQUASAR.html +++ b/docs/functions/matchQUASAR.html @@ -6,8 +6,8 @@
    var isFound = matchQUASAR(`Ask not what your country can do for you, 
    ask what you can do for your country. is nothing to fear but fear itself.`,
    ` "Ask not" "but fear itself" nothing`) // returns true
    -

    Gulakov, A. (2024)

    -
    diff --git a/docs/functions/scrapeURL.html b/docs/functions/scrapeURL.html index 6f25f67..dbb79d6 100644 --- a/docs/functions/scrapeURL.html +++ b/docs/functions/scrapeURL.html @@ -27,8 +27,8 @@
    await scrapeURL("https://hckrnews.com", {timeout: 5, userAgentIndex: 1})
     
    -

    Gulakov, A. (2024)

    -
    diff --git a/docs/functions/searchSTREAM.html b/docs/functions/searchSTREAM.html index 2ec7adf..54af9ff 100644 --- a/docs/functions/searchSTREAM.html +++ b/docs/functions/searchSTREAM.html @@ -1,4 +1,4 @@ -searchSTREAM | ai-research-agent

    Function searchSTREAM

      1. +searchSTREAM | ai-research-agent

        Function searchSTREAM

          1. Searches the Web for the query via metasearch of major engines or custom data.
          2. Extracts text of top results using Tractor the Text Extractor.
          3. Implements SEEKTOPIC to extract Keyphrase Topics and Top Sentences that centralize those topics.
          4. @@ -18,8 +18,8 @@
            const advancedResults = await searchSTREAM('Latest developments in quantum computing', {
            categoryIndex: 2,
            recencyIndex: 1,
            maxRetries: 5,
            maxTopResultsToExtract: 10
            });
            -

            Gulakov, A. (2024)

            -
        diff --git a/docs/functions/searchVectorIndex.html b/docs/functions/searchVectorIndex.html index 9c451df..84a7241 100644 --- a/docs/functions/searchVectorIndex.html +++ b/docs/functions/searchVectorIndex.html @@ -1,4 +1,14 @@ -searchVectorIndex | ai-research-agent

        Function searchVectorIndex

        • Parameters

          • index: any
          • query: any
          • options: {} = {}

            Returns Promise<any>

          Function searchVectorIndex

          • Searches the vector index for the nearest neighbors of a given query.

            +

            Parameters

            • index: HierarchicalNSW

              The HNSW index to search.

              +
            • query: string

              The query string to search for.

              +
            • Optionaloptions: {
                  numNeighbors: number;
              } = {}

              Optional parameters for the search.

              +
              • numNeighbors: number

                The number of nearest neighbors to return.

                +

            Returns Promise<{
                distance: number;
                id: number;
            }[]>

            A promise that resolves to an array of nearest neighbors, each with an id and distance.

            +

            If there's an error during the search process.

            +
            const index = await convertEmbeddingsToHNSW(documentVectors);
            const results = await searchVectorIndex(index, 'example query');
            console.log(results); // [{id: 3, distance: 0.1}, {id: 7, distance: 0.2}, ...] +
            + +
          diff --git a/docs/functions/searchWeb.html b/docs/functions/searchWeb.html index f8884bf..77d8177 100644 --- a/docs/functions/searchWeb.html +++ b/docs/functions/searchWeb.html @@ -1,7 +1,8 @@ -searchWeb | ai-research-agent

          Function searchWeb

          • Search Web via SearXNG metasearch of all major search engines. +searchWeb | ai-research-agent

            Function searchWeb

            • Search Web via SearXNG metasearch of all major search engines. Options are 10 search categories, recency, and how many times to retry other domains if first time fails. -SearXNG is a free internet metasearch engine which aggregates results from more than 70 search services.

              +SearXNG is a free internet metasearch engine which aggregates results from +more than 70 search services.

              Parameters

              • query: string

                The search query string.

              • Optionaloptions: {
                    category: number;
                    customSearxngDomain: string | boolean;
                    maxRetries: number;
                    page: number;
                    recency: number;
                } = {}
                • category: number

                  default=0 - ["general", "news", "videos", "images", "science", "map", "music", "it", "files", "social+media"]

                  @@ -9,14 +10,14 @@
                • maxRetries: number

                  default=3 - Maximum number of retry attempts if the initial search fails.

                • page: number

                  default=1 - The page number to retrieve.

                • recency: number

                  default=0 - ["", "day", "week", "month", "year"]

                  -

              Returns Promise<{
                  cached: string;
                  engines: string[];
                  snippet: string;
                  title: string;
                  url: string;
              }[]>

              An array of search result objects.

              +

      Returns Promise<{
          engines: string[];
          snippet: string;
          title: string;
          url: string;
      }[]>

      An array of search result objects.

      Throws an error if the search fails after all retry attempts.

      const advancedResults = await searchWeb('Node.js', {
      category: 2,
      recency: 1,
      maxRetries: 5
      });
      -

      Gulakov, A. (2024)

      -

      Heiser, M., Tauber, A., Flament, A., et al. (2014-)

      -
      diff --git a/docs/functions/searchWikipedia.html b/docs/functions/searchWikipedia.html index 4bd18e1..71fd371 100644 --- a/docs/functions/searchWikipedia.html +++ b/docs/functions/searchWikipedia.html @@ -14,7 +14,8 @@
      await searchWikipedia("JavaScript", { plainText: true })
       
      -
      diff --git a/docs/functions/splitSentences.html b/docs/functions/splitSentences.html index c3f820f..a4da6d9 100644 --- a/docs/functions/splitSentences.html +++ b/docs/functions/splitSentences.html @@ -9,8 +9,8 @@
    • splitOnHtmlTags: boolean

      default=true - Split on HTML tags like P, DIV, UL, OL.

    • Returns string[]

      An array of sentences. *

      -

      Gulakov, A. (2024)

      -
      diff --git a/docs/functions/splitTextSemanticChars.html b/docs/functions/splitTextSemanticChars.html index 11a2a99..ad3138f 100644 --- a/docs/functions/splitTextSemanticChars.html +++ b/docs/functions/splitTextSemanticChars.html @@ -28,7 +28,7 @@
      const text = "# Heading\n\nThis is a paragraph.\n\n- List item 1\n- List item 2\n\n";
      const chunks = splitTextSemanticChars(text);
      console.log(chunks);
      // Output: ['# Heading', 'This is a paragraph.', '- List item 1', '- List item 2']
      -
      diff --git a/docs/functions/stemWordToRoot.html b/docs/functions/stemWordToRoot.html index 55bde82..56e7663 100644 --- a/docs/functions/stemWordToRoot.html +++ b/docs/functions/stemWordToRoot.html @@ -9,7 +9,7 @@
      var rootWord = stemWordToRoot("running"); // returns "run"
       
      -
      diff --git a/docs/functions/suggestNextWordCompletions.html b/docs/functions/suggestNextWordCompletions.html index 7944a57..748bcf2 100644 --- a/docs/functions/suggestNextWordCompletions.html +++ b/docs/functions/suggestNextWordCompletions.html @@ -11,8 +11,8 @@
      // Using options
      const customModel = await import("./custom-phrases-model.json");
      const suggestions = await suggestNextWordCompletions("artificial int", {
      phrasesModel: customModel,
      limitMaxResults: 5,
      numberOfLastWordsToCheck: 3
      });
      // Possible output: [{ phrase: "artificial intelligence" }, { phrase: "artificial interpretation" }]
      -

      Gulakov, A. (2024)

      -
      diff --git a/docs/functions/weighRelevanceConceptVectorAPI.html b/docs/functions/weighRelevanceConceptVectorAPI.html index 8a2bbc8..ec9dd29 100644 --- a/docs/functions/weighRelevanceConceptVectorAPI.html +++ b/docs/functions/weighRelevanceConceptVectorAPI.html @@ -11,8 +11,9 @@

      Returns Promise<any>

      array of 0-1 similarity scores for each sentence

      -
      diff --git a/docs/functions/weighRelevanceTermFrequency.html b/docs/functions/weighRelevanceTermFrequency.html index 0659038..c4a178c 100644 --- a/docs/functions/weighRelevanceTermFrequency.html +++ b/docs/functions/weighRelevanceTermFrequency.html @@ -14,7 +14,7 @@ As saturationWeight increases: The impact of term frequency increases (i.e., multiple occurrences of a term in a document become more significant).

    • totalWikiPages: number

      Total number of Wikipedia pages used to calculate IDF

    • Returns number

      score for term specificity

      -
      diff --git a/docs/functions/weighSimilarityByCharacter.html b/docs/functions/weighSimilarityByCharacter.html index d009515..3006184 100644 --- a/docs/functions/weighSimilarityByCharacter.html +++ b/docs/functions/weighSimilarityByCharacter.html @@ -8,7 +8,7 @@
    • s2: string

      Second string

    • Returns number

      Jaro-Winkler similarity score

      Jaro, M., Winkler, W. (1990)

      -
      diff --git a/docs/index.html b/docs/index.html index 4a636ce..5a7eba8 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,7 +1,7 @@ -ai-research-agent

      ai-research-agent

      +ai-research-agent

      ai-research-agent

      -

      Javascript Docs (airesearch.wiki)

      +

      Javascript Docs (airesearch.js.org)

      Live Demo (qwksearch.com)

      @@ -36,8 +36,7 @@

      Live Demo (qwksearch.com) -

      -

      +
      Being is Becoming
      Whatever Research Can Be,
      That is What It Must Become.
      @@ -47,7 +46,7 @@

      Live Demo (qwksearch.com)

      -

      searchSTREAM Docs

      +

      searchSTREAM Docs

      1. Search Web for query via metasearch of major engines or your custom data
      2. Extract text of top results with Tractor the Text Extractor.
      3. @@ -58,7 +57,7 @@

        Live Demo (qwksearch.com)

        -

        extract Docs

        +

        extract Docs

        • Extract URL or HTML to main content, improved version combining Mozilla Readability and Postlight Mercury
        • using 100+ custom adapters for major websites.
        • @@ -70,7 +69,7 @@

          Live Demo (qwksearch.com)

          -

          extractSEEKTOPIC Docs

          +

          extractSEEKTOPIC Docs

          SEEKTOPIC Sample Output

          SEEKTOPIC can be used to find unique, domain-specific keyphrases using noun Ngrams. The user can click on keyphrases or LLM can suggest questions based on them. The user can see highlighted just the most important sentences that centralize and tie in the core topics. It is possible to vectorize and compare the dot product similarity of query to keyphrases which are then mapped to parts of the document like section labels. This is more in line with how humans think of article organization into section headings and lead sentences which tie in concepts from others.

          SEEKTOPIC extracts unique, domain-specific key phrases from a document using noun @@ -113,7 +112,7 @@

          Live Demo (qwksearch.com)

          -

          compileTopicModel Docs

          +

          compileTopicModel Docs

          Search and outline a research base using Wikipedia's 100k popular pages as the core topic phrases graph for LLM Research Agents. Most of the documents online (and by extension thinking in the collective conciousness) can revolve around core topic phrases linked as a graph. If all the available docs are nodes, the links in the graph can be extracted Wiki page entities and mappings of dictionary phrases to their wiki page. These can serve as topic labels, keywords, and suggestions for LLM followup questions. Documents can be linked in a graph with: 1. wiki page entity recognition 2. frequent keyphrases 3. html links 4. research paper references 5. keyphrases to query in global web search 6. site-specific recommendations. These can lay the foundation for LLM Research Agents to fully grok, summarize, and outline a research base.

          • 240K total words & phrases, first 117K first-word or single words to check every token against. 100K Wikipedia Page Titles and links - Wikipedia most popular pages titles. Also includes domain specificity score and what letters should be capital.
          • @@ -123,7 +122,7 @@

            Live Demo (qwksearch.com)

            -

            weighRelevanceTermFrequency Docs

            +

            weighRelevanceTermFrequency Docs

            Calculate term specificity for a single doc with BM25 formula by using Wikipedia term frequencies as the baseline Inverse Frequency across Documents. WikiBM25 solves the need to pass in all docs to compute against all documents in a database. The problem with BM25 and TF-IDF is that a large set of documents is needed to find the words that are repeated often across all. These overused words are often the same list of words, so using Wikipedia's term frequencies ensures a common sense baseline against a neutral corpus.

            Use this list to Replace or Combine with All Documents IDF - Many websites may have less than a hundred pages to search through and that is not enough to find which terms are domain-specific. They can score a single doc at a time to find the weight each word in query gets. Wikipedia IDf can be a baseline IDF to average with the All Docs IDF for uniqueness across the average public and the specific domain.

            Example: Given a query "Superbowl wins by year" we do not want to simply return docs filled with common words like year, but rather recognize Superbowl is more domains-specific. This requires precomputing IDF values across all docs, and for websites that may not have that many docs to start with may consider averaging their precomputed score with wikiIDF values to ensure most unique words get a score.

            @@ -148,7 +147,7 @@

            Live Demo (qwksearch.com)

            -

            suggestNextWordCompletions Docs

            +

            suggestNextWordCompletions Docs

            Search-on-keystroke and load this JSON index for word and phrase completion, sorted by how common the terms are with IDF, for search autocomplete dropdown. Tokening by word can often have a meaning widely different than if it is part of a phrase, so it is better to extract phrases by first-word next-words pairings. Search results will be more accurate if we infer likely phrases and search for those words occuring together and not just split into words and find frequency. Examples are "white house" or "state of the art" which should be searched as a phrase but would return different context if split into words. As Led Zeppelin famously put it: ♫ "'Cause you know sometimes words have two meanings."

            PRs Welcome

            -
      diff --git a/docs/modules.html b/docs/modules.html index 9c000df..ce1ffe3 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -1,39 +1,41 @@ -ai-research-agent

      ai-research-agent

      Index

      Functions

      convertEmbeddingsToHNSW -convertEmbeddingsToUMAP -convertHTMLSpecialChars -convertHTMLToBasicHTML -convertMarkdownToHtml -convertPDFToHTML -convertTextToEmbedding -convertTextToTokens +ai-research-agent
      diff --git a/docs/sitemap.xml b/docs/sitemap.xml new file mode 100644 index 0000000..512b8eb --- /dev/null +++ b/docs/sitemap.xml @@ -0,0 +1,159 @@ + + + + https://airesearch.js.org/modules.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/index.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/classes/torch.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/convertEmbeddingsToHNSW.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/convertEmbeddingsToUMAP.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/convertHTMLSpecialChars.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/convertHTMLToBasicHTML.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/convertMarkdownToHtml.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/convertPDFToHTML.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/convertTextToEmbedding.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/convertTextToTokens.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/convertYoutubeToText.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/copyHtmlToClipboard.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/embedYoutubePlayer.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/exportEmbeddingsIndex.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/extract.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/extractCite.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/extractContentHTML.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/extractContentHTML2.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/extractFavicon.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/extractSEEKTOPIC.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/extractTopicTermGroupsLDA.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/generateLanguageModelReply.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/getAllEmbeddings.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/getEmbeddingModel.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/importVectorIndexFromString.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/matchQUASAR.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/scrapeURL.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/searchSTREAM.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/searchVectorIndex.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/searchWeb.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/searchWikipedia.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/splitSentences.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/splitTextSemanticChars.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/stemWordToRoot.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/suggestNextWordCompletions.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/weighRelevanceConceptVectorAPI.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/weighRelevanceTermFrequency.html + 2024-09-18T03:38:58.534Z + + + https://airesearch.js.org/functions/weighSimilarityByCharacter.html + 2024-09-18T03:38:58.534Z + + diff --git a/index.js b/index.js index 5869185..0e2c506 100644 --- a/index.js +++ b/index.js @@ -10,10 +10,12 @@ import { extractSEEKTOPIC } from "./src/topics/seektopic-keyphrases.js"; import { weighRelevanceConceptVectorAPI } from "./src/similarity/similarity-remote-api.js"; -import { convertHTMLSpecialChars, +import { + convertHTMLSpecialChars, convertMarkdownToHtml, - convertURLToAbsoluteURL - } from "./src/extractor/html-to-content/html-utils.js"; + copyHtmlToClipboard, + convertURLToAbsoluteURL, +} from "./src/extractor/html-to-content/html-utils.js"; import { convertYoutubeToText } from "./src/extractor/url-to-content/youtube-to-text.js"; @@ -29,7 +31,7 @@ import { convertTextToTokens } from "./src/tokenize/tokenize-topics.js"; import { splitSentences } from "./src/tokenize/sentences.js"; -import { splitTextSemanticChars } from "./src/tokenize/text-to-chunks.js" +import { splitTextSemanticChars } from "./src/tokenize/text-to-chunks.js"; import { searchWikipedia } from "./src/search/search-wikipedia.js"; @@ -49,8 +51,7 @@ import { importVectorIndexFromString, } from "./src/similarity/similarity-vector.js"; -// import { torch } from "./src/train/neural-net.js"; - +import { torch } from "./src/train/neural-net.js"; // const convertEmbeddingsToHNSW=0, // searchVectorIndex=0, @@ -60,18 +61,16 @@ import { // exportEmbeddingsIndex=0, // importVectorIndexFromString=0; - -import {extractContentHTML} from "./src/extractor/html-to-content/extract-content/extractor1-content.js" -import {extractContentHTML2} from "./src/extractor/html-to-content/extract-content/extractor2-content.js" -import {convertHTMLToBasicHTML} from "./src/extractor/html-to-content/html-to-basic-html.js" -import {extractCite} from "./src/extractor/html-to-cite/extract-cite.js" +import { extractContentHTML } from "./src/extractor/html-to-content/extract-content/extractor1-content.js"; +import { extractContentHTML2 } from "./src/extractor/html-to-content/extract-content/extractor2-content.js"; +import { convertHTMLToBasicHTML } from "./src/extractor/html-to-content/html-to-basic-html.js"; +import { extractCite } from "./src/extractor/html-to-cite/extract-cite.js"; // import {compileTopicModel} from "./src/dataset-import/compile-topic-model.js" -import {stemWordToRoot} from "./src/tokenize/word-to-root-stem.js" -import {extractFavicon} from "./src/extractor/html-to-cite/url-to-favicon.js" -import {embedYoutubePlayer} from "./src/extractor/url-to-content/youtube-embed.js" - -import {generateLanguageModelReply} from "./src/generate/generate-reply-api.js" +import { stemWordToRoot } from "./src/tokenize/word-to-root-stem.js"; +import { extractFavicon } from "./src/extractor/html-to-cite/url-to-favicon.js"; +import { embedYoutubePlayer } from "./src/extractor/url-to-content/youtube-embed.js"; +import { generateLanguageModelReply } from "./src/generate/generate-reply-api.js"; // Export all functions as named exports export { @@ -84,6 +83,7 @@ export { extractFavicon, embedYoutubePlayer, stemWordToRoot, + copyHtmlToClipboard, // compileTopicModel, extractCite, extractContentHTML, @@ -106,10 +106,10 @@ export { searchVectorIndex, splitSentences, splitTextSemanticChars, - // torch, + torch, suggestNextWordCompletions, weighSimilarityByCharacter, weighRelevanceConceptVectorAPI, weighRelevanceTermFrequency, - extractTopicTermGroupsLDA + extractTopicTermGroupsLDA, }; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..352f29f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5223 @@ +{ + "name": "ai-research-agent", + "version": "0.9.7", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ai-research-agent", + "version": "0.9.7", + "license": "AGPL-3.0", + "dependencies": { + "@eduardoleao052/gpu": "^2.19.0", + "@huggingface/transformers": "^3.0.0-alpha.14", + "@langchain/anthropic": "^0.2.17", + "@langchain/core": "^0.2.31", + "@langchain/groq": "^0.0.17", + "@langchain/openai": "^0.2.10", + "chrono-node": "^2.7.6", + "fake-indexeddb": "^6.0.0", + "gpu.js": "^2.16.0", + "hnswlib-wasm": "^0.8.2", + "linkedom": "^0.18.4", + "pdfjs-serverless": "^0.5.1", + "umap-js": "^1.4.0", + "usearch": "^2.15.1" + }, + "devDependencies": { + "@jsprismarine/typedoc-material-theme": "^1.0.4", + "@mxssfd/typedoc-theme": "^1.1.6", + "@vitest/ui": "^2.0.5", + "adm-zip": "^0.5.16", + "axios": "^1.7.7", + "fast-xml-parser": "^4.5.0", + "jszip": "^3.10.1", + "typedoc": "^0.26.6", + "typedoc-material-theme": "^1.1.0", + "typedoc-plugin-ga": "^1.0.4", + "vitest": "^2.0.5" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@anthropic-ai/sdk": { + "version": "0.25.2", + "license": "MIT", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + } + }, + "node_modules/@anthropic-ai/sdk/node_modules/@types/node": { + "version": "18.19.50", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@eduardoleao052/gpu": { + "version": "2.19.0", + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "gl": "^8.0.2", + "gl-wiretap": "^0.6.2", + "webgpu": "^0.1.16" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/@huggingface/jinja": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@huggingface/transformers": { + "version": "3.0.0-alpha.15", + "license": "Apache-2.0", + "dependencies": { + "@huggingface/jinja": "^0.3.0", + "onnxruntime-node": "1.19.2", + "onnxruntime-web": "1.20.0-dev.20240908-de7a02beef", + "sharp": "^0.33.5" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width/node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.1.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsprismarine/typedoc-material-theme": { + "version": "1.0.4", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paypal.me/dmnsgn" + }, + { + "type": "individual", + "url": "https://commerce.coinbase.com/checkout/56cbdf28-e323-48d8-9c98-7019e72c97f3" + } + ], + "license": "MIT", + "dependencies": { + "@material/material-color-utilities": "^0.2.7" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.6.0" + }, + "peerDependencies": { + "typedoc": "^0.26.3" + } + }, + "node_modules/@langchain/anthropic": { + "version": "0.2.18", + "license": "MIT", + "dependencies": { + "@anthropic-ai/sdk": "^0.25.2", + "@langchain/core": ">=0.2.21 <0.3.0", + "fast-xml-parser": "^4.4.1", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/core": { + "version": "0.2.32", + "license": "MIT", + "dependencies": { + "ansi-styles": "^5.0.0", + "camelcase": "6", + "decamelize": "1.2.0", + "js-tiktoken": "^1.0.12", + "langsmith": "^0.1.43", + "mustache": "^4.2.0", + "p-queue": "^6.6.2", + "p-retry": "4", + "uuid": "^10.0.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/groq": { + "version": "0.0.17", + "license": "MIT", + "dependencies": { + "@langchain/core": ">=0.2.21 <0.3.0", + "@langchain/openai": "~0.2.6", + "groq-sdk": "^0.5.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.5" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/openai": { + "version": "0.2.10", + "license": "MIT", + "dependencies": { + "@langchain/core": ">=0.2.26 <0.3.0", + "js-tiktoken": "^1.0.12", + "openai": "^4.57.3", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@material/material-color-utilities": { + "version": "0.2.7", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@mxssfd/typedoc-theme": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "typedoc": "^0.26.2" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/agent": { + "version": "2.2.2", + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/https-proxy-agent": { + "version": "7.0.5", + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.4.3", + "license": "ISC" + }, + "node_modules/@npmcli/agent/node_modules/socks-proxy-agent": { + "version": "8.0.4", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.1", + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.25", + "dev": true, + "license": "MIT" + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "license": "BSD-3-Clause" + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.21.2", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "1.17.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "1.17.0", + "@shikijs/engine-oniguruma": "1.17.0", + "@shikijs/types": "1.17.0", + "@shikijs/vscode-textmate": "^9.2.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.2" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "1.17.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.17.0", + "oniguruma-to-js": "0.3.3", + "regex": "4.3.2" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.17.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.17.0", + "@shikijs/vscode-textmate": "^9.2.2" + } + }, + "node_modules/@shikijs/types": { + "version": "1.17.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^9.2.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/node": { + "version": "18.19.50", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/node-fetch/node_modules/@types/node": { + "version": "20.12.14", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "license": "MIT" + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitest/expect": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.0.5", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.0.5", + "magic-string": "^0.30.10", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/ui": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.0.5", + "fast-glob": "^3.3.2", + "fflate": "^0.8.2", + "flatted": "^3.3.1", + "pathe": "^1.1.2", + "sirv": "^2.0.4", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "2.0.5" + } + }, + "node_modules/@vitest/utils": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.0.5", + "estree-walker": "^3.0.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/abbrev": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adm-zip": { + "version": "0.5.16", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.7.7", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bindings": { + "version": "1.5.0", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bit-twiddle": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/bl": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache": { + "version": "18.0.4", + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/fs-minipass": { + "version": "3.0.3", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.4.3", + "license": "ISC" + }, + "node_modules/cacache/node_modules/minipass-collect": { + "version": "2.0.1", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/cacache/node_modules/tar": { + "version": "6.2.1", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/tar/node_modules/chownr": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cacache/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache/node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache/node_modules/tar/node_modules/minizlib": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cacache/node_modules/tar/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache/node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/call-bind": { + "version": "1.0.7", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chai": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/check-error": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/chrono-node": { + "version": "2.7.6", + "license": "MIT", + "dependencies": { + "dayjs": "^1.10.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "license": "ISC" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.13", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "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/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/encoding": { + "version": "0.1.13", + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "license": "MIT" + }, + "node_modules/execa": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "license": "Apache-2.0" + }, + "node_modules/fake-indexeddb": { + "version": "6.0.0", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-xml-parser": { + "version": "4.5.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fflate": { + "version": "0.8.2", + "dev": true, + "license": "MIT" + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flatbuffers": { + "version": "1.12.0", + "license": "SEE LICENSE IN LICENSE.txt" + }, + "node_modules/flatted": { + "version": "3.3.1", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "license": "MIT" + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, + "node_modules/formdata-node/node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "license": "MIT" + }, + "node_modules/gl": { + "version": "8.0.2", + "hasInstallScript": true, + "license": "BSD-2-Clause", + "dependencies": { + "bindings": "^1.5.0", + "bit-twiddle": "^1.0.2", + "glsl-tokenizer": "^2.1.5", + "nan": "^2.18.0", + "node-abi": "^3.56.0", + "node-gyp": "^10.0.1", + "prebuild-install": "^7.1.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/gl-wiretap": { + "version": "0.6.2", + "license": "MIT" + }, + "node_modules/glob": { + "version": "10.4.5", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glsl-tokenizer": { + "version": "2.1.5", + "license": "MIT", + "dependencies": { + "through2": "^0.6.3" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gpu-mock.js": { + "version": "1.3.1", + "license": "MIT", + "peerDependencies": { + "gpu.js": "^2.10.3" + } + }, + "node_modules/gpu.js": { + "version": "2.16.0", + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "gl": "^5.0.3", + "gl-wiretap": "^0.6.2", + "gpu-mock.js": "^1.3.0", + "webgpu": "^0.1.16" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/gpu.js/node_modules/gl": { + "version": "5.0.3", + "hasInstallScript": true, + "license": "BSD-2-Clause", + "dependencies": { + "bindings": "^1.5.0", + "bit-twiddle": "^1.0.2", + "glsl-tokenizer": "^2.1.5", + "nan": "^2.16.0", + "node-abi": "^3.22.0", + "node-gyp": "^9.0.0", + "prebuild-install": "^7.1.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp": { + "version": "9.4.1", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/make-fetch-happen": { + "version": "10.2.1", + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/make-fetch-happen/node_modules/cacache": { + "version": "16.1.3", + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/make-fetch-happen/node_modules/cacache/node_modules/@npmcli/fs": { + "version": "2.1.2", + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/make-fetch-happen/node_modules/cacache/node_modules/chownr": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/make-fetch-happen/node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/make-fetch-happen/node_modules/cacache/node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/make-fetch-happen/node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/make-fetch-happen/node_modules/cacache/node_modules/unique-filename": { + "version": "2.0.1", + "license": "ISC", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/make-fetch-happen/node_modules/cacache/node_modules/unique-filename/node_modules/unique-slug": { + "version": "3.0.0", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/make-fetch-happen/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/make-fetch-happen/node_modules/minipass-fetch": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/make-fetch-happen/node_modules/minipass-fetch/node_modules/minizlib": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/make-fetch-happen/node_modules/minipass-fetch/node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/make-fetch-happen/node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/make-fetch-happen/node_modules/ssri": { + "version": "9.0.1", + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/nopt": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/nopt/node_modules/abbrev": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/tar": { + "version": "6.2.1", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/tar/node_modules/chownr": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/tar/node_modules/minizlib": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/tar/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gpu.js/node_modules/gl/node_modules/node-gyp/node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/groq-sdk": { + "version": "0.5.0", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7", + "web-streams-polyfill": "^3.2.1" + } + }, + "node_modules/groq-sdk/node_modules/@types/node": { + "version": "18.19.50", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/guid-typescript": { + "version": "1.0.9", + "license": "ISC" + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "license": "ISC" + }, + "node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hnswlib-wasm": { + "version": "0.8.2", + "license": "Apache-2.0" + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/htmlparser2": { + "version": "9.1.0", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/immediate": { + "version": "3.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "license": "ISC" + }, + "node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "9.0.5", + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-any-array": { + "version": "0.1.1", + "license": "MIT" + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-tiktoken": { + "version": "1.0.14", + "license": "MIT", + "dependencies": { + "base64-js": "^1.5.1" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/jszip": { + "version": "3.10.1", + "dev": true, + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/langsmith": { + "version": "0.1.55", + "license": "MIT", + "dependencies": { + "@types/uuid": "^10.0.0", + "commander": "^10.0.1", + "p-queue": "^6.6.2", + "p-retry": "4", + "semver": "^7.6.3", + "uuid": "^10.0.0" + }, + "peerDependencies": { + "@langchain/core": "*", + "langchain": "*", + "openai": "*" + }, + "peerDependenciesMeta": { + "@langchain/core": { + "optional": true + }, + "langchain": { + "optional": true + }, + "openai": { + "optional": true + } + } + }, + "node_modules/lie": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/linkedom": { + "version": "0.18.4", + "license": "ISC", + "dependencies": { + "css-select": "^5.1.0", + "cssom": "^0.5.0", + "html-escaper": "^3.0.3", + "htmlparser2": "^9.1.0", + "uhyphen": "^0.2.0" + } + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/long": { + "version": "5.2.3", + "license": "Apache-2.0" + }, + "node_modules/loupe": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-fetch-happen": { + "version": "13.0.1", + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect/node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/minipass-fetch": { + "version": "3.0.5", + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-fetch/node_modules/minizlib": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch/node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "minipass": "^7.0.4", + "rimraf": "^5.0.5" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/minizlib/node_modules/rimraf": { + "version": "5.0.10", + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minizlib/node_modules/rimraf/node_modules/glob": { + "version": "10.4.5", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "license": "MIT" + }, + "node_modules/ml-array-max": { + "version": "1.2.4", + "license": "MIT", + "dependencies": { + "is-any-array": "^2.0.0" + } + }, + "node_modules/ml-array-max/node_modules/is-any-array": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/ml-array-min": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "is-any-array": "^2.0.0" + } + }, + "node_modules/ml-array-min/node_modules/is-any-array": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/ml-array-rescale": { + "version": "1.3.7", + "license": "MIT", + "dependencies": { + "is-any-array": "^2.0.0", + "ml-array-max": "^1.2.4", + "ml-array-min": "^1.2.3" + } + }, + "node_modules/ml-array-rescale/node_modules/is-any-array": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/ml-levenberg-marquardt": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "is-any-array": "^0.1.0", + "ml-matrix": "^6.4.1" + } + }, + "node_modules/ml-matrix": { + "version": "6.11.1", + "license": "MIT", + "dependencies": { + "is-any-array": "^2.0.1", + "ml-array-rescale": "^1.3.7" + } + }, + "node_modules/ml-matrix/node_modules/is-any-array": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/mrmime": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/mustache": { + "version": "4.2.0", + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/nan": { + "version": "2.20.0", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.7", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-abi": { + "version": "3.67.0", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "8.1.0", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp": { + "version": "10.2.0", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5", + "tar": "^6.2.1", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.2", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/tar": { + "version": "6.2.1", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/tar/node_modules/chownr": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/node-gyp/node_modules/tar/node_modules/minizlib": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/node-gyp/node_modules/tar/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-gyp/node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/node-gyp/node_modules/which": { + "version": "4.0.0", + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/node-gyp/node_modules/which/node_modules/isexe": { + "version": "3.1.1", + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/nopt": { + "version": "7.2.1", + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oniguruma-to-js": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/onnxruntime-common": { + "version": "1.19.2", + "license": "MIT" + }, + "node_modules/onnxruntime-node": { + "version": "1.19.2", + "hasInstallScript": true, + "license": "MIT", + "os": [ + "win32", + "darwin", + "linux" + ], + "dependencies": { + "onnxruntime-common": "1.19.2", + "tar": "^7.0.1" + } + }, + "node_modules/onnxruntime-web": { + "version": "1.20.0-dev.20240908-de7a02beef", + "license": "MIT", + "dependencies": { + "flatbuffers": "^1.12.0", + "guid-typescript": "^1.0.9", + "long": "^5.2.3", + "onnxruntime-common": "1.20.0-dev.20240827-5d54dc1462", + "platform": "^1.3.6", + "protobufjs": "^7.2.4" + } + }, + "node_modules/onnxruntime-web/node_modules/onnxruntime-common": { + "version": "1.20.0-dev.20240827-5d54dc1462", + "license": "MIT" + }, + "node_modules/openai": { + "version": "4.59.0", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "@types/qs": "^6.9.15", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7", + "qs": "^6.10.3" + }, + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/openai/node_modules/@types/node": { + "version": "18.19.50", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "license": "BlueOak-1.0.0" + }, + "node_modules/pako": { + "version": "1.0.11", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "license": "ISC" + }, + "node_modules/pathe": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/pdfjs-serverless": { + "version": "0.5.1", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/platform": { + "version": "1.3.6", + "license": "MIT" + }, + "node_modules/postcss": { + "version": "8.4.45", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.2", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proc-log": { + "version": "4.2.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/promise-retry/node_modules/retry": { + "version": "0.12.0", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/property-information": { + "version": "6.5.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/protobufjs": { + "version": "7.4.0", + "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/protobufjs/node_modules/@types/node": { + "version": "20.12.14", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/rc": { + "version": "1.2.8", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/regex": { + "version": "4.3.2", + "dev": true, + "license": "MIT" + }, + "node_modules/retry": { + "version": "0.13.1", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rollup": { + "version": "4.21.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.21.2", + "@rollup/rollup-android-arm64": "4.21.2", + "@rollup/rollup-darwin-arm64": "4.21.2", + "@rollup/rollup-darwin-x64": "4.21.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.2", + "@rollup/rollup-linux-arm-musleabihf": "4.21.2", + "@rollup/rollup-linux-arm64-gnu": "4.21.2", + "@rollup/rollup-linux-arm64-musl": "4.21.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2", + "@rollup/rollup-linux-riscv64-gnu": "4.21.2", + "@rollup/rollup-linux-s390x-gnu": "4.21.2", + "@rollup/rollup-linux-x64-gnu": "4.21.2", + "@rollup/rollup-linux-x64-musl": "4.21.2", + "@rollup/rollup-win32-arm64-msvc": "4.21.2", + "@rollup/rollup-win32-ia32-msvc": "4.21.2", + "@rollup/rollup-win32-x64-msvc": "4.21.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT", + "optional": true + }, + "node_modules/semver": { + "version": "7.6.3", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/sharp": { + "version": "0.33.5", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "1.17.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "1.17.0", + "@shikijs/types": "1.17.0", + "@shikijs/vscode-textmate": "^9.2.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/sirv": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "license": "BSD-3-Clause" + }, + "node_modules/ssri": { + "version": "10.0.6", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.7.0", + "dev": true, + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/tar": { + "version": "7.4.3", + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "license": "ISC" + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/through2": { + "version": "0.6.5", + "license": "MIT", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "1.0.34", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/through2/node_modules/readable-stream/node_modules/isarray": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/through2/node_modules/readable-stream/node_modules/string_decoder": { + "version": "0.10.31", + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/typedoc": { + "version": "0.26.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "shiki": "^1.16.2", + "yaml": "^2.5.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x" + } + }, + "node_modules/typedoc-material-theme": { + "version": "1.1.0", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paypal.me/dmnsgn" + }, + { + "type": "individual", + "url": "https://commerce.coinbase.com/checkout/56cbdf28-e323-48d8-9c98-7019e72c97f3" + } + ], + "license": "MIT", + "dependencies": { + "@material/material-color-utilities": "^0.2.7" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.6.0" + }, + "peerDependencies": { + "typedoc": "^0.25.13 || ^0.26.3" + } + }, + "node_modules/typedoc-plugin-ga": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typedoc": "^0.26.5" + } + }, + "node_modules/typescript": { + "version": "5.6.2", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/uhyphen": { + "version": "0.2.0", + "license": "ISC" + }, + "node_modules/umap-js": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "ml-levenberg-marquardt": "^2.0.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "license": "MIT" + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/usearch": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/usearch/-/usearch-2.15.1.tgz", + "integrity": "sha512-Pxa6H/hVnuehby1vm7ULxjCX6m4by2z20NUzHlktbck8F3gAhxK/1qbqnvb4qQFG/mC8Tq9XwFtfgv0pOpWTeg==", + "hasInstallScript": true, + "license": "Apache 2.0", + "dependencies": { + "bindings": "^1.5.0", + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.0" + }, + "engines": { + "node": "~10 >=10.20 || >=12.17" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "10.0.0", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.5", + "pathe": "^1.1.2", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@vitest/expect": "2.0.5", + "@vitest/pretty-format": "^2.0.5", + "@vitest/runner": "2.0.5", + "@vitest/snapshot": "2.0.5", + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "debug": "^4.3.5", + "execa": "^8.0.1", + "magic-string": "^0.30.10", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "tinybench": "^2.8.0", + "tinypool": "^1.0.0", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.0.5", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.0.5", + "@vitest/ui": "2.0.5", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webgpu": { + "version": "0.1.16", + "license": "MIT", + "engines": { + "node": ">= 13.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi/node_modules/string-width/node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.1.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/xtend": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "5.0.0", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/yaml": { + "version": "2.5.1", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.23.3", + "license": "ISC", + "peerDependencies": { + "zod": "^3.23.3" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json index 449ed56..61d358c 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,6 @@ "devDependencies": { "@jsprismarine/typedoc-material-theme": "^1.0.4", "@mxssfd/typedoc-theme": "^1.1.6", - "@types/bun": "^1.1.8", "@vitest/ui": "^2.0.5", "adm-zip": "^0.5.16", "axios": "^1.7.7", @@ -30,6 +29,7 @@ "vitest": "^2.0.5" }, "dependencies": { + "@eduardoleao052/gpu": "^2.19.0", "@huggingface/transformers": "^3.0.0-alpha.14", "@langchain/anthropic": "^0.2.17", "@langchain/core": "^0.2.31", @@ -41,6 +41,7 @@ "hnswlib-wasm": "^0.8.2", "linkedom": "^0.18.4", "pdfjs-serverless": "^0.5.1", - "umap-js": "^1.4.0" + "umap-js": "^1.4.0", + "usearch": "^2.15.1" } } diff --git a/readme.md b/readme.md index 4728ad0..118ccea 100644 --- a/readme.md +++ b/readme.md @@ -1,7 +1,7 @@

      -

      Javascript Docs (airesearch.wiki)

      +

      Javascript Docs (airesearch.js.org)

      Live Demo (qwksearch.com)

      @@ -36,10 +36,7 @@ NPM badge for ai-research-agent - -

      - -

      +
      Being is Becoming
      Whatever Research Can Be,
      That is What It Must Become.
      @@ -48,16 +45,13 @@

      - - - #### 🤖🔎 STREAM: Search with Top Result Extraction & Answer Model

      -[searchSTREAM Docs](https://airesearch.wiki/functions/src_search_web_search_stream.searchSTREAM.html) +[searchSTREAM Docs](https://airesearch.js.org/functions/searchSTREAM.html) 1. Search Web for query via metasearch of major engines or your custom data 2. Extract text of top results with Tractor the Text Extractor. @@ -71,7 +65,7 @@

      -[extract Docs](https://airesearch.wiki/functions/src_extractor_url_to_content_url_to_content.extract.html) +[extract Docs](https://airesearch.js.org/functions/extract.html) * Extract URL or HTML to main content, improved version combining Mozilla Readability and Postlight Mercury * using 100+ custom adapters for major websites. @@ -88,7 +82,7 @@

      -[extractSEEKTOPIC Docs](https://airesearch.wiki/functions/src_search_web_search_stream.searchSTREAM.html) +[extractSEEKTOPIC Docs](https://airesearch.js.org/functions/searchSTREAM.html) [SEEKTOPIC Sample Output](https://github.com/vtempest/ai-research-agent/blob/master/test/data/) @@ -138,7 +132,7 @@ SEEKTOPIC extracts unique, domain-specific key phrases from a document using nou

      -[compileTopicModel Docs](https://airesearch.wiki/functions/src_dataset_import_compile_topic_model.compileTopicModel.html) +[compileTopicModel Docs](https://airesearch.js.org/functions/compileTopicModel.html) Search and outline a research base using Wikipedia's 100k popular pages as the core topic phrases graph for LLM Research Agents. Most of the documents online (and by extension thinking in the collective conciousness) can revolve around core topic phrases linked as a graph. If all the available docs are nodes, the links in the graph can be extracted Wiki page entities and mappings of dictionary phrases to their wiki page. These can serve as topic labels, keywords, and suggestions for LLM followup questions. Documents can be linked in a graph with: 1. wiki page entity recognition 2. frequent keyphrases 3. html links 4. research paper references 5. keyphrases to query in global web search 6. site-specific recommendations. These can lay the foundation for LLM Research Agents to fully grok, summarize, and outline a research base. @@ -153,7 +147,7 @@ SEEKTOPIC extracts unique, domain-specific key phrases from a document using nou

      -[weighRelevanceTermFrequency Docs](https://airesearch.wiki/functions/src_match_weigh_relevance_frequency.weighRelevanceTermFrequency.html) +[weighRelevanceTermFrequency Docs](https://airesearch.js.org/functions/weighRelevanceTermFrequency.html) Calculate term specificity for a single doc with BM25 formula by using Wikipedia term frequencies as the baseline Inverse Frequency across Documents. WikiBM25 solves the need to pass in all docs to compute against all documents in a database. The problem with BM25 and TF-IDF is that a large set of documents is needed to find the words that are repeated often across all. These overused words are often the same list of words, so using Wikipedia's term frequencies ensures a common sense baseline against a neutral corpus. @@ -186,7 +180,7 @@ All words in English Wikipedia are sorted by number of pages they are in for 325

      -[suggestNextWordCompletions Docs](https://airesearch.wiki/functions/src_autocomplete_autocomplete.suggestNextWordCompletions.html) +[suggestNextWordCompletions Docs](https://airesearch.js.org/functions/suggestNextWordCompletions.html) Search-on-keystroke and load this JSON index for word and phrase completion, sorted by how common the terms are with IDF, for search autocomplete dropdown. Tokening by word can often have a meaning widely different than if it is part of a phrase, so it is better to extract phrases by first-word next-words pairings. Search results will be more accurate if we infer likely phrases and search for those words occuring together and not just split into words and find frequency. Examples are "white house" or "state of the art" which should be searched as a phrase but would return different context if split into words. As Led Zeppelin famously put it: ♫ "'Cause you know sometimes words have two meanings." @@ -205,7 +199,8 @@ Search-on-keystroke and load this JSON index for word and phrase completion, sor * [BM42: New Baseline for Hybrid Search](https://qdrant.tech/articles/bm42/) * [Google Search Algorithm](https://searchengineland.com/google-search-document-leak-ranking-442617) * [Understanding UMAP](https://pair-code.github.io/understanding-umap/) -* [Transformers Explained Visually (Part 3)](https://towardsdatascience.com/transformers-explained-visually-part-3-multi-head-attention-deep-dive-1c1ff1024853) +* [Transformers Explained Visually (Part 3)](https://towardsdatascience.com/transformers-explained-visually-part-3-multi-head-attention-deep-dive-1c1ff1024853) +* [Can LLMs Generate Novel Research Ideas?](https://arxiv.org/html/2409.04109v1) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) diff --git a/src/extractor/html-to-cite/extract-cite.js b/src/extractor/html-to-cite/extract-cite.js index 9984517..fdbb068 100644 --- a/src/extractor/html-to-cite/extract-cite.js +++ b/src/extractor/html-to-cite/extract-cite.js @@ -20,7 +20,8 @@ import { extractNamedEntity } from "./human-names-recognize.js"; * * @param {document} document dom object or html string with article content * @returns {object} {author, date, title, source} - * @author [Gulakov, A. (2024)](https://airesearch.wiki) + * @category Extract + * @author [Gulakov, A. (2024)](https://airesearch.js.org) */ export function extractCite(document) { //if passing in html string, convert to dom object diff --git a/src/extractor/html-to-cite/url-to-favicon.js b/src/extractor/html-to-cite/url-to-favicon.js index 5afb0e9..8608092 100644 --- a/src/extractor/html-to-cite/url-to-favicon.js +++ b/src/extractor/html-to-cite/url-to-favicon.js @@ -4,9 +4,11 @@ * @param {string} url * @param {Object} [options] * @returns {Promise} Favicon URL or null if not found - * @author [Gulakov, A. (2024)](https://airesearch.wiki) + * @category Extract + * @author [Gulakov, A. (2024)](https://airesearch.js.org) * @example const favicons = await extractFavicon('https://github.com/') */ + export async function extractFavicon(url, options = {}) { const { timeout = 5000, maxRedirects = 3 } = options; diff --git a/src/extractor/html-to-content/extract-content/extractor1-content.js b/src/extractor/html-to-content/extract-content/extractor1-content.js index 6c6bc06..7801fdb 100644 --- a/src/extractor/html-to-content/extract-content/extractor1-content.js +++ b/src/extractor/html-to-content/extract-content/extractor1-content.js @@ -54,7 +54,8 @@ import { parseHTML } from 'linkedom'; * @param {number} options.retryLength default=250 - Length to retry content extraction if initial attempt fails * @returns {Element} Extracted HTML element of main content such as article body * @author Based on [Mozilla Readability (2015), Arc90 (2010)](https://github.com/mozilla/readability) - */ + * @category Extract +*/ export function extractContentHTML(html, options = {}) { const { minContentLength = 140, diff --git a/src/extractor/html-to-content/extract-content/extractor2-content.js b/src/extractor/html-to-content/extract-content/extractor2-content.js index e96634e..687ad8f 100644 --- a/src/extractor/html-to-content/extract-content/extractor2-content.js +++ b/src/extractor/html-to-content/extract-content/extractor2-content.js @@ -56,6 +56,7 @@ import { * var html = await (await fetch(url)).text(); * var content = extractContentHTML(html); * console.log(content); // HTML content of main article body + * @category Extract */ export function extractContentHTML2(html, opts) { opts = { diff --git a/src/extractor/html-to-content/html-to-basic-html.js b/src/extractor/html-to-content/html-to-basic-html.js index 0ad9497..4184520 100644 --- a/src/extractor/html-to-content/html-to-basic-html.js +++ b/src/extractor/html-to-content/html-to-basic-html.js @@ -21,8 +21,9 @@ import { convertHTMLSpecialChars, convertURLToAbsoluteURL} from "./html-utils.js * @param {string} options.allowedAttributes default="text,tag,href, src,type,width, height,id,data" * List of allowed HTML attributes * @returns {string} basic text formatting html - * @author [Gulakov, A. (2024)](https://airesearch.wiki) - */ + * @author [Gulakov, A. (2024)](https://airesearch.js.org) + * @category HTML Utilities +*/ export function convertHTMLToBasicHTML(html, options = {}) { var { diff --git a/src/extractor/html-to-content/html-to-content.js b/src/extractor/html-to-content/html-to-content.js index e2eaa2d..56fd8cc 100644 --- a/src/extractor/html-to-content/html-to-content.js +++ b/src/extractor/html-to-content/html-to-content.js @@ -20,7 +20,7 @@ import { extractContentHTML2 } from "./extract-content/extractor2-content.js"; * then use the alternate if the first returns less than 200 characters * @returns {ExtractedContent} An object containing extracted information * @throws {Error} If there's an error parsing the HTML - + * @author [Gulakov, A. (2024)](https://airesearch.js.org) */ export function extractContentAndCite(documentOrHTML, options = {}) { const { diff --git a/src/extractor/html-to-content/html-utils.js b/src/extractor/html-to-content/html-utils.js index 7cd2928..5266957 100644 --- a/src/extractor/html-to-content/html-utils.js +++ b/src/extractor/html-to-content/html-utils.js @@ -6,7 +6,7 @@ * @param {boolean} unescape default=true - If true, converts & codes to characters. * If false, converts characters to codes. * @return {string} The processed string. - + * @category HTML Utilities * @example * var normalHTML = convertHTMLSpecialChars('<p>This & that © 2023 '+ * '"Quotes"'Apostrophes' €100 ☺</p>', true) @@ -80,6 +80,13 @@ export function convertHTMLSpecialChars(str, unescape = true) { * @param {string} base base url of the domain * @param {string} relative partial urls like ../images/image.jpg #hash * @returns {string} absolute URL + * @example + * var absoluteURL = convertURLToAbsoluteURL('https://example.com', 'images/image.jpg') + * console.log(absoluteURL) // Returns: "https://example.com/images/image.jpg" + * var absoluteURL = convertURLToAbsoluteURL('https://example.com', '//images/image.jpg') + * console.log(absoluteURL) // Returns: "https:images/image.jpg" + * @category HTML Utilities +* @author [Gulakov, A. (2024)](https://airesearch.js.org) */ export function convertURLToAbsoluteURL(base, relative) { @@ -143,8 +150,11 @@ export function convertURLToAbsoluteURL(base, relative) { * - Unordered lists * - Ordered lists * - Paragraphs + * - Images + * - Links * @param {string} markdown - The Markdown-formatted text to be converted. * @returns {string} The resulting HTML string. + * @category HTML Utilities * @example * const markdown = "# Header\n\nThis is **bold** and *italic* text.\n\n* List item 1\n* List item 2"; * const html = convertMarkdownToHtml(markdown); @@ -183,7 +193,63 @@ export function convertMarkdownToHtml(markdown) { return `

      ${para.trim()}

      `; } return para; - }).join('\n'); + }).join('\n') + + //convert images + .replace(/\!\[(.*?)\]\((.*?)\)/g, '$1') + + //convert links + .replace(/\[(.*?)\]\((.*?)\)/g, '$1') + return html; +} + + + +/** + * Copy HTML to clipboard. When pasting into rich text field, pastes rich + * text. When pasting into plain text field, pastes: plain text, html, or markdown. + * + * @param {string} html - The HTML content to be copied. + * @param {object} options - The options object. + * @param {boolean} options.pastePlainWithHTML - + * If true, the plain text will be the same as the HTML. + * If false, the plain text will be the same as the HTML, + * without the HTML tags. + * @param {boolean} options.pastePlainWithMarkdown - + * If true, the plain text will be markdown. + * If false, the plain text will be the same as the HTML, + * without the HTML tags. + * @returns {Promise} - A promise that resolves when + * the HTML is copied to the clipboard. + * @category HTML Utilities + * @author [Gulakov, A. (2024)](https://airesearch.js.org) + * + */ +export async function copyHtmlToClipboard(html, options = {}) { + var { + pastePlainWithHTML = true, + pastePlainWithMarkdown = false + } = options; + + if (typeof window == "undefined" || !navigator?.clipboard) return; + + const htmlBlob = new Blob([html], { type: "text/html" }); + + var plainText = pastePlainWithHTML ? + html.replace(/<[^>]*>?/g, "") : + pastePlainWithMarkdown ? + convertMarkdownToHtml(html) : + html; + + const textBlob = new Blob([plainText], { type: "text/plain" }) + + const clipboardItem = new window.ClipboardItem({ + "text/html": htmlBlob, + "text/plain": textBlob, + }); + + return await navigator.clipboard.write([clipboardItem]); + } \ No newline at end of file diff --git a/src/extractor/url-to-content/pdf-to-content.js b/src/extractor/url-to-content/pdf-to-content.js index 9431812..c7fad00 100644 --- a/src/extractor/url-to-content/pdf-to-content.js +++ b/src/extractor/url-to-content/pdf-to-content.js @@ -14,7 +14,8 @@ import * as chrono from "chrono-node"; * @param {boolean} options.moveFootnotes default=false - Moves footnotes to end of document * @param {boolean} options.timeout default=10 - http request timeout * @returns {string|Object} HTML formatted text or {error} if error in parsing - * @author [Gulakov, A. (2024)](https://airesearch.wiki), + * @category Extract + * @author [Gulakov, A. (2024)](https://airesearch.js.org), * [Mozilla (2012-)](https://github.com/mozilla/pdf.js/releases), * [Adobe (1993)](https://en.wikipedia.org/wiki/History_of_PDF) */ @@ -272,10 +273,11 @@ const calculateStandardDeviation = function (array) { * Useful for hidden pdf url that does not end with pdf * @param {string} url - The URL to check. * @returns {Promise} True if the URL points to a PDF, false otherwise. -* @author [Gulakov, A. (2024)](https://airesearch.wiki) - +* @author [Gulakov, A. (2024)](https://airesearch.js.org) +* @category Extract */ export async function isUrlPDF(url) { + let response; try { // Fetch the URL with a stream response diff --git a/src/extractor/url-to-content/scrape-url.js b/src/extractor/url-to-content/scrape-url.js index 3e7ce89..2915f30 100644 --- a/src/extractor/url-to-content/scrape-url.js +++ b/src/extractor/url-to-content/scrape-url.js @@ -27,8 +27,9 @@ * @param {number} options.useCORSProxy default=false - use 60%-working corsproxy.io (in frontend JS) * @param {string} options.urlProxy default=false - use proxy url * @returns {Promise} - HTML, JSON, arraybuffer, or error object -* @example await scrapeURL("https://hckrnews.com", {timeout: 5, userAgentIndex: 1}) - * @author [Gulakov, A. (2024)](https://airesearch.wiki) + * @category Extract + * @example await scrapeURL("https://hckrnews.com", {timeout: 5, userAgentIndex: 1}) + * @author [Gulakov, A. (2024)](https://airesearch.js.org) */ export async function scrapeURL(url, options = {}) { // try { diff --git a/src/extractor/url-to-content/url-to-content.js b/src/extractor/url-to-content/url-to-content.js index 7482d88..8d55c51 100644 --- a/src/extractor/url-to-content/url-to-content.js +++ b/src/extractor/url-to-content/url-to-content.js @@ -35,7 +35,8 @@ import { scrapeURL } from "./scrape-url.js"; * @param {boolean} options.absoluteURLs default=true - convert URLs to absolute * @param {number} options.timeout default=5 - http request timeout * @returns {Article} - object containing url, html, author, date, title, source - * @author [Gulakov, A. (2024)](https://airesearch.wiki) + * @category Extract + * @author [Gulakov, A. (2024)](https://airesearch.js.org) */ export async function extract(urlOrDoc, options = {}) { var { diff --git a/src/extractor/url-to-content/youtube-embed.js b/src/extractor/url-to-content/youtube-embed.js index 21154c0..cc37781 100644 --- a/src/extractor/url-to-content/youtube-embed.js +++ b/src/extractor/url-to-content/youtube-embed.js @@ -44,7 +44,7 @@ * href="https://developers.google.com/youtube/iframe_api_reference">YouTube IFrame Player API * in a div element with the specified ID. * @returns {YouTubePlayer} An object containing the YouTube API functionality. - + * @category Interface * @example * //
      const YT = embedYoutubePlayer(); diff --git a/src/extractor/url-to-content/youtube-to-text.js b/src/extractor/url-to-content/youtube-to-text.js index cbeb816..93a526b 100644 --- a/src/extractor/url-to-content/youtube-to-text.js +++ b/src/extractor/url-to-content/youtube-to-text.js @@ -9,7 +9,8 @@ import { scrapeURL } from "./scrape-url.js" * @param {boolean} options.timeout default=5 - http request timeout * @return {Object} {content, timestamps} where content is the full text of * the transcript, and timestamps is an array of [characterIndex, timeSeconds] - * @author [Gulakov, A. (2024)](https://airesearch.wiki) + * @category Extract + * @author [Gulakov, A. (2024)](https://airesearch.js.org) */ export async function convertYoutubeToText(videoUrl, options = {}) { const { addTimestamps = true, timeout = 5 } = options; diff --git a/src/generate/generate-reply-api.js b/src/generate/generate-reply-api.js index 7442c2b..995ad59 100644 --- a/src/generate/generate-reply-api.js +++ b/src/generate/generate-reply-api.js @@ -31,6 +31,7 @@ import { convertMarkdownToHtml } from "../../index.js" * @param {string} apiKey - The API key for authentication with Groq or OpenAI. * @param {string} model - The specific AI model to be used (e.g., GPT-4, Mixtral 8x7B). * @returns {Promise<{content: string, error: string}>} The generated AI response as HTML. + * @category Generate */ export async function generateLanguageModelReply(query, apiKey, model) { var aiResponse = { content: "", error: "" }; diff --git a/src/match/compare-letters.js b/src/match/compare-letters.js index 763cb59..6f07180 100644 --- a/src/match/compare-letters.js +++ b/src/match/compare-letters.js @@ -11,8 +11,10 @@ * @param {string} s1 First string * @param {string} s2 Second string * @returns {number} Jaro-Winkler similarity score + * @category Match */ export function weighSimilarityByCharacter(s1, s2) { + if (s1 === s2) return 1; if (s1.length > s2.length) [s1, s2] = [s2, s1]; diff --git a/src/match/match-quasar.js b/src/match/match-quasar.js index 6ee0a9b..d7fb362 100644 --- a/src/match/match-quasar.js +++ b/src/match/match-quasar.js @@ -13,7 +13,8 @@ * @example var isFound = matchQUASAR(`Ask not what your country can do for you, * ask what you can do for your country. is nothing to fear but fear itself.`, * ` "Ask not" "but fear itself" nothing`) // returns true - * @author [Gulakov, A. (2024)](https://airesearch.wiki) + * @author [Gulakov, A. (2024)](https://airesearch.js.org) + * @category Match */ export function matchQUASAR(document, query) { // Uses negative lookaheads diff --git a/src/match/weigh-relevance-frequency.js b/src/match/weigh-relevance-frequency.js index 2d4df19..66b9ba2 100644 --- a/src/match/weigh-relevance-frequency.js +++ b/src/match/weigh-relevance-frequency.js @@ -22,9 +22,13 @@ import {convertTextToTokens} from "../../index.js"; * @param {number} options.avgDocWordCount Estimated average word count of all documents * @param {number} options.totalWikiPages Total number of Wikipedia pages used to calculate IDF * @returns {number} score for term specificity + * @category Match */ + + export function weighRelevanceTermFrequency( document, + query, options = {} ) { diff --git a/src/search/ip-to-lang.js b/src/search/ip-to-lang.js index 9a0b8b3..66c0e32 100644 --- a/src/search/ip-to-lang.js +++ b/src/search/ip-to-lang.js @@ -14,7 +14,7 @@ * @returns {string} returns.language - The full name of the language. * @returns {string} returns.greeting - A greeting in the detected language. * @returns {string} returns.login - The word "login" translated to the detected language. - * @author [Gulakov, A. (2024)](https://airesearch.wiki) + * @author [Gulakov, A. (2024)](https://airesearch.js.org) */ export async function getLanguageFromIPRemoteAPI(ip) { diff --git a/src/search/search-stream.js b/src/search/search-stream.js index e43b394..30de94f 100644 --- a/src/search/search-stream.js +++ b/src/search/search-stream.js @@ -2,7 +2,7 @@ import {searchWeb} from "../../index.js"; import {extract} from "../../index.js"; /** - * ### 🤖🔎 STREAM: Search with Top Result Extraction & Answer Model
      + * ### 🤖🔎 STREAM: Search with Top Result Extraction & Answer Model * 1. Searches the Web for the query via metasearch of major engines or custom data.
      * 2. Extracts text of top results using Tractor the Text Extractor.
      * 3. Implements SEEKTOPIC to extract Keyphrase Topics and Top Sentences that centralize those topics.
      @@ -27,8 +27,8 @@ import {extract} from "../../index.js"; * maxRetries: 5, * maxTopResultsToExtract: 10 * }); - - * @author [Gulakov, A. (2024)](https://airesearch.wiki) + * @category Search + * @author [Gulakov, A. (2024)](https://airesearch.js.org) */ export async function searchSTREAM(query, options = {}) { const { diff --git a/src/search/search-web.js b/src/search/search-web.js index 268deb1..f8b7c80 100644 --- a/src/search/search-web.js +++ b/src/search/search-web.js @@ -4,7 +4,8 @@ import { scrapeURL } from "../../index.js"; * Search Web via SearXNG metasearch of all major search engines. * Options are 10 search categories, recency, and how many * times to retry other domains if first time fails. - * SearXNG is a free internet metasearch engine which aggregates results from more than 70 search services. + * SearXNG is a free internet metasearch engine which aggregates results from + * more than [70 search services](https://docs.searxng.org/user/configured_engines.html). * @param {string} query - The search query string. * @param {Object} [options] * @param {number} options.category default=0 - ["general", "news", "videos", "images", @@ -13,15 +14,15 @@ import { scrapeURL } from "../../index.js"; * @param {string|boolean} options.customSearxngDomain default=null - Use your custom domain SearXNG * @param {number} options.maxRetries default=3 - Maximum number of retry attempts if the initial search fails. * @param {number} options.page default=1 - The page number to retrieve. - * @returns {Promise>} An array of search result objects. + * @returns {Promise>} An array of search result objects. * @throws {Error} Throws an error if the search fails after all retry attempts. * @example const advancedResults = await searchWeb('Node.js', { * category: 2, * recency: 1, * maxRetries: 5 * }); - * @author [Gulakov, A. (2024)](https://airesearch.wiki) - * + * @category Search + * @author [Gulakov, A. (2024)](https://airesearch.js.org) * [Heiser, M., Tauber, A., Flament, A., et al. (2014-)](https://github.com/searxng/searxng/graphs/contributors) */ export async function searchWeb(query, options = {}) { diff --git a/src/search/search-wikipedia.js b/src/search/search-wikipedia.js index f8966d5..98805c9 100644 --- a/src/search/search-wikipedia.js +++ b/src/search/search-wikipedia.js @@ -18,7 +18,9 @@ import {splitSentences} from "../../index.js"; * @example await searchWikipedia("JavaScript", { plainText: true }) * @returns {object} {results: [ {title, summary, image}, ...]} * @returns {object} Returns {error} if no results found. {error: "No results"} - */ + * @category Search + * @author [Gulakov, A. (2024)](https://airesearch.js.org) +*/ export async function searchWikipedia(query, options = {}) { // Set default options var { diff --git a/src/similarity/embeddings-to-graph.js b/src/similarity/embeddings-to-graph.js index 39db281..e890e87 100644 --- a/src/similarity/embeddings-to-graph.js +++ b/src/similarity/embeddings-to-graph.js @@ -46,7 +46,8 @@ import { UMAP } from "umap-js/lib/umap-js.js"; * @returns {Promise} An array of plot data points. * @author [McInnes et al. (2018)](https://arxiv.org/abs/1802.03426)
      * [Coenen et al. (2019)](https://pair-code.github.io/understanding-umap/) - */ + * @category Similarity +*/ export async function convertEmbeddingsToUMAP(embeddingsDict, options = {}) { const { numberDimensions = 2, diff --git a/src/similarity/similarity-remote-api.js b/src/similarity/similarity-remote-api.js index c4aaf50..83f5388 100644 --- a/src/similarity/similarity-remote-api.js +++ b/src/similarity/similarity-remote-api.js @@ -12,7 +12,8 @@ * @param {string} options.model default="sentence-transformers/all-MiniLM-L6-v2" * @param {string} options.HF_API_KEY Required https://huggingface.co/settings/tokens * @returns array of 0-1 similarity scores for each sentence - */ + * @category Similarity + */ export async function weighRelevanceConceptVectorAPI( source_sentence, sentences, diff --git a/src/similarity/similarity-vector.js b/src/similarity/similarity-vector.js index 9d8a4f3..11d5bbf 100644 --- a/src/similarity/similarity-vector.js +++ b/src/similarity/similarity-vector.js @@ -1,4 +1,4 @@ -// import { pipeline } from //"../../node_modules/@huggingface/transformers/dist/transformers.mjs"; +// import { pipeline } from "../../node_modules/@huggingface/transformers/dist/transformers.mjs"; @@ -66,7 +66,8 @@ import { loadHnswlib } from 'hnswlib-wasm/dist/hnswlib.js'; * - The pipeline to use for embedding. * @param {number} options.precision default=3 - The number of decimal places to round to. * @returns {Promise<{embeddingsDict: Object., embedding: number[]}>} - */ + * @category Similarity + */ export async function convertTextToEmbedding(text, options = {}) { var { precision = 3, pipeline } = options; @@ -87,7 +88,8 @@ export async function convertTextToEmbedding(text, options = {}) { * @param {string} options.modelName default="Xenova/all-MiniLM-L6-v2" - * The name of the model to use * @returns {Promise} The pipeline. - */ + * @category Similarity + */ export async function getEmbeddingModel(options = {}) { // const {pipeline} = await import("../../../transformers.js/dist/transformers") const {pipeline} = await import("@huggingface/transformers") @@ -111,9 +113,9 @@ export async function getEmbeddingModel(options = {}) { * * [ANN Benchmarks](https://ann-benchmarks.com) * + * https://github.com/brtholomy/hnsw * [Pinecone - HNSW](https://www.pinecone.io/learn/series/faiss/hnsw/) * - * [Wikipedia - HNSW](https://en.wikipedia.org/wiki/Hierarchical_navigable_small_world) * @param {string[]} documentVectors - An array of document texts to be vectorized. * @param {Object} [options={}] - Optional parameters for vector generation and indexing. * @param {number} [options.numDimensions=384] - The length of data point vector that will be indexed. @@ -121,6 +123,7 @@ export async function getEmbeddingModel(options = {}) { * @returns {Promise} The created HNSW index. * @author [Malkov, Y. et al (2016)](https://arxiv.org/abs/1603.09320), * [Tatsuma, Y. et al (2022)](https://github.com/yoshoku/hnswlib-node) + * @category Similarity */ export async function convertEmbeddingsToHNSW(documentVectors, options = {}) { const { @@ -140,6 +143,21 @@ export async function convertEmbeddingsToHNSW(documentVectors, options = {}) { return { index, labels }; } + /** + * Searches the vector index for the nearest neighbors of a given query. + * + * @param {HierarchicalNSW} index - The HNSW index to search. + * @param {string} query - The query string to search for. + * @param {Object} [options={}] - Optional parameters for the search. + * @param {number} [options.numNeighbors=5] - The number of nearest neighbors to return. + * @returns {Promise>} A promise that resolves to an array of nearest neighbors, each with an id and distance. + * @throws {Error} If there's an error during the search process. + * @example + * const index = await convertEmbeddingsToHNSW(documentVectors); + * const results = await searchVectorIndex(index, 'example query'); + * console.log(results); // [{id: 3, distance: 0.1}, {id: 7, distance: 0.2}, ...] + * @category Similarity + */ export async function searchVectorIndex(index, query, options = {}) { const { numNeighbors = 5 } = options; // Convert query to embedding vector @@ -147,13 +165,14 @@ export async function convertEmbeddingsToHNSW(documentVectors, options = {}) { // Searching k-nearest neighbor data points const result = index.searchKnn(queryVector, numNeighbors, null); return result; -} + } /** * Retrieves all embeddings from the HNSW index. * @param {HierarchicalNSW} index - The HNSW index containing the embeddings. * @param {number} [precision=3] - The number of decimal places to round to. * @returns {number[][]} An array of embedding vectors. + * @category Similarity */ export function getAllEmbeddings(index, precision = 3) { const numElements = index.getCurrentCount(); @@ -194,6 +213,7 @@ export function calculateCosineSimilarity(vectorA, vectorB) { * @param {string} query * @param {Object} [options] * @returns {Promise>} + * @category Similarity */ export async function weighRelevanceConceptVector( documents, @@ -223,10 +243,11 @@ export async function weighRelevanceConceptVector( /** * Converts an HNSW index to a base64 encoded string. - * + * https://github.com/NJU-RINC/hnsw-visulize/blob/master/path.gif?raw=true * @param {object} index - The HNSW index object. * @returns {Promise} A promise that resolves to a base64 encoded string representation of the index. * @throws {Error} If there's an error during the index serialization process. + * @category Similarity */ export async function exportEmbeddingsIndex(index) { @@ -296,8 +317,8 @@ export async function exportEmbeddingsIndex(index) { * @param {number} dim - The dimensionality of the vectors in the index. * @param {string} space - The space type of the index (e.g., 'l2', 'ip', 'cosine'). * @returns {Promise} A promise that resolves to the imported HNSW index object. - * @throws {Error} If there's an error during the index deserialization process. - */ + * @category Similarity +*/ export async function importVectorIndexFromString(indexString, dim = 384, space = "cosine") { const lib = await loadHnswlib(); diff --git a/src/similarity/usearch.js b/src/similarity/usearch.js new file mode 100644 index 0000000..855b065 --- /dev/null +++ b/src/similarity/usearch.js @@ -0,0 +1,99 @@ +import usearch from 'usearch'; +import { getEmbeddingModel, + convertTextToEmbedding, + convertEmbeddingsToHNSW, + } from './similarity-vector.js'; + +async function convertEmbeddingsToUSearch(documentVectors, options = {}) { + const { + numDimensions = 384, + maxElements = 100, + metric = 'cos', + connectivity = 16, + } = options; + + // Create and initialize the index + const index = new usearch.Index({ + metric: metric, + dimensions: numDimensions, + connectivity: connectivity, + maxElements: maxElements, + }); + + // Add vectors to the index + const labels = []; + for (let i = 0; i < documentVectors.length; i++) { + const label = BigInt(i); + index.add(label, new Float32Array(documentVectors[i])); + labels.push(label); + } + + return { index, labels }; +} + +async function searchVectorIndex(index, query, options = {}) { + const { numNeighbors = 5, pipeline } = options; + + // Convert query to embedding vector + var queryVector = await convertTextToEmbedding(query, { pipeline }); + + queryVector = new Float32Array(queryVector) + + // console.log(queryVector); + + // Perform k-nearest neighbor search + + // try { + + const results = index.search(queryVector, 10); + + + + // Format results to match the expected output + return results.map((result, i) => ({ + id: Number(result.key), + + distance: results.distances[i], + })); +} + +async function exportEmbeddingsIndex(index, dimensions, maxElements) { + // Placeholder function for exporting index + return Buffer.from(index.data()).toString('base64'); +} + +async function main() { + const pipeline = await getEmbeddingModel(); + + console.log(1); + + const documents = [ + "The quick brown fox jumps over the lazy dog", + "Lorem ipsum dolor sit amet", + "foxes are red", + "foxes are not blue", + "foxes like to hunt their prey", + ]; + const query = "What does the fox eat?"; + + let documentVectors = []; + + for (let doc of documents) { + documentVectors.push(await convertTextToEmbedding(doc, { pipeline })); + } + + const { index, labels } = await convertEmbeddingsToUSearch(documentVectors, { + numDimensions: 384, + maxElements: 100, + }); + + console.log(`Index created with ${index.size()} elements`); + + const result = await searchVectorIndex(index, query, { pipeline, numNeighbors: 5 }); + console.log(result); + + const base64 = await exportEmbeddingsIndex(index, 384, 100000); + // console.log(base64); +} + +main().catch(console.error); \ No newline at end of file diff --git a/src/tokenize/sentences.js b/src/tokenize/sentences.js index c88e299..0b62529 100644 --- a/src/tokenize/sentences.js +++ b/src/tokenize/sentences.js @@ -8,8 +8,9 @@ * @param {number} options.minSize default=20 - Minimum size for a sentence. * @param {number} options.maxSize default=600 - Maximum size for a sentence. * @returns {Array} An array of sentences. - * @author [Gulakov, A. (2024)](https://airesearch.wiki) -*/ + * @author [Gulakov, A. (2024)](https://airesearch.js.org) + * @category Topics + */ export function splitSentences(inputText, options = {}) { const { splitOnHtmlTags = true, minSize = 20, maxSize = 500 } = options; diff --git a/src/tokenize/suggest-complete-word.js b/src/tokenize/suggest-complete-word.js index 56899fe..0f125b8 100644 --- a/src/tokenize/suggest-complete-word.js +++ b/src/tokenize/suggest-complete-word.js @@ -25,8 +25,9 @@ * }); * // Possible output: [{ phrase: "artificial intelligence" }, { phrase: "artificial interpretation" }] * - * @author [Gulakov, A. (2024)](https://airesearch.wiki) - */ + * @author [Gulakov, A. (2024)](https://airesearch.js.org) + * @category Topics +*/ export async function suggestNextWordCompletions(query, options = {}) { var { phrasesModel, //pass in remote model diff --git a/src/tokenize/text-to-chunks.js b/src/tokenize/text-to-chunks.js index 9d51b46..4ac2fc2 100644 --- a/src/tokenize/text-to-chunks.js +++ b/src/tokenize/text-to-chunks.js @@ -28,7 +28,7 @@ * @param {string} text - The input text to be split into semantic chunks. * @param {Object} [options={}] - Optional configuration options (currently unused). * @returns {Array.} An array of text chunks, each representing a semantic unit of the document. - * + * @category Topics * @example * const text = "# Heading\n\nThis is a paragraph.\n\n- List item 1\n- List item 2\n\n"; * const chunks = splitTextSemanticChars(text); diff --git a/src/tokenize/tokenize-topics.js b/src/tokenize/tokenize-topics.js index 28864ae..9ed3b90 100644 --- a/src/tokenize/tokenize-topics.js +++ b/src/tokenize/tokenize-topics.js @@ -25,7 +25,8 @@ import {isWordCommonIgnored} from "./stopwords.js"; * @param {number} options.ignoreStopWords - ignore 300+ overused words * @param {number} options.checkRootWords - check for word's root stem * @returns {Array} ex. [[50, 0, "Albert Einstein"],...] - * @author [Gulakov, A. (2024)](https://airesearch.wiki) + * @author [Gulakov, A. (2024)](https://airesearch.js.org) + * @category Topics */ export function convertTextToTokens(phrase, options = {}) { let { diff --git a/src/tokenize/word-to-root-stem.js b/src/tokenize/word-to-root-stem.js index 859b43f..e0157c8 100644 --- a/src/tokenize/word-to-root-stem.js +++ b/src/tokenize/word-to-root-stem.js @@ -7,7 +7,8 @@ * @param {string} word - The word to be stemmed * @returns {string} - The stemmed word * @example var rootWord = stemWordToRoot("running"); // returns "run" - */ + * @category Topics +*/ export function stemWordToRoot(word) { // Return short words (less than 3 characters) without stemming if (word.length < 3) return word; diff --git a/src/topics/seektopic-keyphrases.js b/src/topics/seektopic-keyphrases.js index d78391f..f5ce033 100644 --- a/src/topics/seektopic-keyphrases.js +++ b/src/topics/seektopic-keyphrases.js @@ -59,7 +59,8 @@ import { extractNounEdgeGrams } from "./ngrams.js"; * @param {string} options.heavyWeightQuery - query to give heavy weight to * @returns {Array} - [{text, keyphrases, weight}] array of sentences * @example extractSEEKTOPIC(testDoc, { phrasesModel, heavyWeightQuery: "self attention", limitTopSentences: 10}) - * @author [Gulakov, A. (2024)](https://airesearch.wiki) + * @author [Gulakov, A. (2024)](https://airesearch.js.org) + * @category Topics */ export function extractSEEKTOPIC(docText, options = {}) { var { diff --git a/src/topics/topic-distribution.js b/src/topics/topic-distribution.js index 7bc3989..8992a7c 100644 --- a/src/topics/topic-distribution.js +++ b/src/topics/topic-distribution.js @@ -25,9 +25,11 @@ import {stemWordToRoot} from "../tokenize/word-to-root-stem.js"; * @param {number} options.valueBurnIn default=100 - Number of burn-in iterations. * @param {number} options.valueSampleLag default=10 - Lag between samples. * @returns {Array} - Array of topics, each containing term-probability pairs. - * @author [Blei, D; Ng, A. (2003)](https://en.wikipedia.org/wiki/Latent_Dirichlet_allocation) + * @category Topics + * @author [Blei et al. (2003)](https://en.wikipedia.org/wiki/Latent_Dirichlet_allocation) */ export function extractTopicTermGroupsLDA(sentences, options = {}) { + const { topicCount = 8, numberOfTermsPerTopic = 4, diff --git a/src/train/neural-net.js b/src/train/neural-net.js index e343e50..51ec0a3 100644 --- a/src/train/neural-net.js +++ b/src/train/neural-net.js @@ -1,64 +1,5 @@ -import { GPU } from "@eduardoleao052/gpu" - -/** - * JS-PyTorch is a neural net matrix mult library with GPU.js using PyTorch API syntax. - * @class torch - * @see {@link https://eduardoleao052.github.io/js-pytorch/site/index.html|JS-PyTorch} - * Tensor Creation and Manipulation: - * @function tensor(data, requires_grad = false, device = 'cpu') Creates a new Tensor filled with the given data - * @function zeros(*shape, requires_grad = false, device = 'cpu') Creates a new Tensor filled with zeros - * @function ones(*shape, requires_grad = false, device = 'cpu') Creates a new Tensor filled with ones - * @function tril(*shape, requires_grad = false, device = 'cpu') Creates a new 2D lower triangular Tensor - * @function randn(*shape, requires_grad = false, device = 'cpu', xavier = false) Creates a new Tensor filled with random values from a normal distribution - * @function rand(*shape, requires_grad = false, device = 'cpu') Creates a new Tensor filled with random values from a uniform distribution - * @function randint(low, high, *shape, requires_grad = false, device = 'cpu') Creates a new Tensor filled with random integers - * Tensor Methods: - * @method tensor.backward() Performs backpropagation from this tensor backwards - * @method tensor.zero_grad() Clears the gradients stored in this tensor - * @method tensor.zero_grad_graph() Clears the gradients stored in this tensor and all tensors that led to it - * @method tensor.tolist() Returns the tensor's data as a JavaScript Array - * @property tensor.data Returns the tensor's data as a JavaScript Array - * @property tensor.length Returns the tensor's length (size of first dimension) - * @property tensor.ndims Returns the number of dimensions in the Tensor - * @property tensor.grad Returns the gradients currently stored in the Tensor - * Tensor Operations: - * @function add(a, b) Performs element-wise addition of two tensors - * @function sub(a, b) Performs element-wise subtraction of two tensors - * @function neg(a) Returns the element-wise opposite of the given Tensor - * @function mul(a, b) Performs element-wise multiplication of two tensors - * @function div(a, b) Performs element-wise division of two tensors - * @function matmul(a, b) Performs matrix multiplication between two tensors - * @function sum(a, dim, keepdims = false) Gets the sum of the Tensor over a specified dimension - * @function mean(a, dim, keepdims = false) Gets the mean of the Tensor over a specified dimension - * @function variance(a, dim, keepdims = false) Gets the variance of the Tensor over a specified dimension - * @function transpose(a, dim1, dim2) Transposes the tensor along two consecutive dimensions - * @function at(a, index1, index2) Returns elements from the tensor based on given indices - * @function masked_fill(a, condition, value) Fills elements in the tensor based on a condition - * @function pow(a, n) Returns tensor raised to element-wise power - * @function sqrt(a) Returns element-wise square root of the tensor - * @function exp(a) Returns element-wise exponentiation of the tensor - * @function log(a) Returns element-wise natural log of the tensor - * - * Neural Network Layers: - * @class nn.Linear(in_size, out_size, device, bias, xavier) Applies a linear transformation to the input tensor - * @class nn.MultiHeadSelfAttention(in_size, out_size, n_heads, n_timesteps, dropout_prob, device) Applies a self-attention layer on the input tensor - * @class nn.FullyConnected(in_size, out_size, dropout_prob, device, bias) Applies a fully-connected layer on the input tensor - * @class nn.Block(in_size, out_size, n_heads, n_timesteps, dropout_prob, device) Applies a transformer Block layer on the input tensor - * @class nn.Embedding(in_size, embed_size) Creates an embedding table for vocabulary - * @class nn.PositionalEmbedding(input_size, embed_size) Creates a positional embedding table - * @class nn.ReLU() Applies Rectified Linear Unit activation function - * @class nn.Softmax() Applies Softmax activation function - * @class nn.Dropout(drop_prob) Applies dropout to input tensor - * @class nn.LayerNorm(n_embed) Applies Layer Normalization to input tensor - * @class nn.CrossEntropyLoss() Computes Cross Entropy Loss between target and input tensor - * - * Optimization: - * @class optim.Adam(params, lr, reg, betas, eps) Adam optimizer for updating model parameters - * - * Utility Functions: - * @function save(model, file) Saves the model reruning data blob (for you to save) - * @function load(model, loadedData) Loads the model from saved data - */ +import { GPU } from "gpu.js" +// import { GPU } from "@eduardoleao052/gpu" function getShape(data, shape = []) { if (data instanceof Array && data.length === 0) { @@ -1701,6 +1642,13 @@ class MultiHeadSelfAttention extends Module { H; /** * Full transformer Layer implementation. + * + * + * [The Annotated Transformer](https://nlp.seas.harvard.edu/annotated-transformer/) + * + * [Transformers Explained Visually (Part + * 3)](https://towardsdatascience.com/transformers-explained-visually-part-3-multi-head-attention-deep-dive-1c1ff1024853) + * * * @param {number} in_size - size of the last dimention of the input array. * @param {number} out_size - size of the last dimention of the output array. @@ -1726,6 +1674,8 @@ class MultiHeadSelfAttention extends Module { } /** * Performs Multi Head Self-Attention on "x" tensor. + * + * [Transformers Explained Visually (Part 3)](https://towardsdatascience.com/transformers-explained-visually-part-3-multi-head-attention-deep-dive-1c1ff1024853) * @param {Tensor} x - input Tensor. * @returns {Tensor} new Tensor. */ @@ -1798,7 +1748,7 @@ class Block extends Module { * @param {number} in_size - size of the last dimention of the input array. * @param {number} out_size - size of the last dimention of the output array. * @param {number} n_heads - number of parallel heads to be computed (must equally divide in_size). - * @param {number} n_timesteps - length of text sequence to be processed bt Transformer. + * @param {number} n_timesteps - length of text sequence to be processed by Transformer. * @param {number} dropout_prob - probability of zeroing each activation in dropout Layer. * @param {string} device - Device to perform Tensor operations. Either "gpu" or "cpu". */ @@ -2096,6 +2046,71 @@ const nn = { CrossEntropyLoss }; const optim = { Adam }; + +/** + * JS-PyTorch is a neural net matrix multiplication library + * with GPU.js acceleration (translates matmul into WebGPU shader code) + * and using PyTorch API syntax. + * @class torch + * Tensor Creation and Manipulation: + * @function tensor(data, requires_grad = false, device = 'cpu') Creates a new Tensor filled with the given data + * @function zeros(*shape, requires_grad = false, device = 'cpu') Creates a new Tensor filled with zeros + * @function ones(*shape, requires_grad = false, device = 'cpu') Creates a new Tensor filled with ones + * @function tril(*shape, requires_grad = false, device = 'cpu') Creates a new 2D lower triangular Tensor + * @function randn(*shape, requires_grad = false, device = 'cpu', xavier = false) Creates a new Tensor filled with random values from a normal distribution + * @function rand(*shape, requires_grad = false, device = 'cpu') Creates a new Tensor filled with random values from a uniform distribution + * @function randint(low, high, *shape, requires_grad = false, device = 'cpu') Creates a new Tensor filled with random integers + * Tensor Methods: + * @method tensor.backward() Performs backpropagation from this tensor backwards + * @method tensor.zero_grad() Clears the gradients stored in this tensor + * @method tensor.zero_grad_graph() Clears the gradients stored in this tensor and all tensors that led to it + * @method tensor.tolist() Returns the tensor's data as a JavaScript Array + * @property tensor.data Returns the tensor's data as a JavaScript Array + * @property tensor.length Returns the tensor's length (size of first dimension) + * @property tensor.ndims Returns the number of dimensions in the Tensor + * @property tensor.grad Returns the gradients currently stored in the Tensor + * Tensor Operations: + * @function add(a, b) Performs element-wise addition of two tensors + * @function sub(a, b) Performs element-wise subtraction of two tensors + * @function neg(a) Returns the element-wise opposite of the given Tensor + * @function mul(a, b) Performs element-wise multiplication of two tensors + * @function div(a, b) Performs element-wise division of two tensors + * @function matmul(a, b) Performs matrix multiplication between two tensors + * @function sum(a, dim, keepdims = false) Gets the sum of the Tensor over a specified dimension + * @function mean(a, dim, keepdims = false) Gets the mean of the Tensor over a specified dimension + * @function variance(a, dim, keepdims = false) Gets the variance of the Tensor over a specified dimension + * @function transpose(a, dim1, dim2) Transposes the tensor along two consecutive dimensions + * @function at(a, index1, index2) Returns elements from the tensor based on given indices + * @function masked_fill(a, condition, value) Fills elements in the tensor based on a condition + * @function pow(a, n) Returns tensor raised to element-wise power + * @function sqrt(a) Returns element-wise square root of the tensor + * @function exp(a) Returns element-wise exponentiation of the tensor + * @function log(a) Returns element-wise natural log of the tensor + * + * Neural Network Layers: + * @class nn.Linear(in_size, out_size, device, bias, xavier) Applies a linear transformation to the input tensor + * @class nn.MultiHeadSelfAttention(in_size, out_size, n_heads, n_timesteps, dropout_prob, device) Applies a self-attention layer on the input tensor + * @class nn.FullyConnected(in_size, out_size, dropout_prob, device, bias) Applies a fully-connected layer on the input tensor + * @class nn.Block(in_size, out_size, n_heads, n_timesteps, dropout_prob, device) Applies a transformer Block layer on the input tensor + * @class nn.Embedding(in_size, embed_size) Creates an embedding table for vocabulary + * @class nn.PositionalEmbedding(input_size, embed_size) Creates a positional embedding table + * @class nn.ReLU() Applies Rectified Linear Unit activation function + * @class nn.Softmax() Applies Softmax activation function + * @class nn.Dropout(drop_prob) Applies dropout to input tensor + * @class nn.LayerNorm(n_embed) Applies Layer Normalization to input tensor + * @class nn.CrossEntropyLoss() Computes Cross Entropy Loss between target and input tensor + * + * Optimization: + * @class optim.Adam(params, lr, reg, betas, eps) Adam optimizer for updating model parameters + * + * Utility Functions: + * @function save(model, file) Saves the model reruning data blob (for you to save) + * @function load(model, loadedData) Loads the model from saved data + * @author [PyTorch Contributors](https://github.com/pytorch/pytorch/graphs/contributors), + * [Leao, E. et al (2022)](https://eduardoleao052.github.io/js-pytorch/site/index.html), + * See also: [Brain.js](https://github.com/BrainJS/brain.js) + * @category Neural Net + */ const torch = { // Add methods from tensor.js (these methods are accessed with "torch."): Tensor, diff --git a/src/match/softmax.js b/src/train/softmax.js similarity index 100% rename from src/match/softmax.js rename to src/train/softmax.js diff --git a/typedoc.json b/typedoc.json index 7b1cbff..0b10edf 100644 --- a/typedoc.json +++ b/typedoc.json @@ -4,14 +4,22 @@ "gaID": "G-E5TZ32BZDF", "entryPointStrategy": "expand", "navigation": { - "includeCategories": false, + "includeCategories": true, "includeGroups": false, - "includeFolders": true + "includeFolders": false }, "commentStyle":"all", - "sourceLinkExternal": true, "hideGenerator": true, + "cname": "airesearch.js.org", + "hostedBaseUrl": "https://airesearch.js.org", "searchInDocuments": true, + "searchInComments": true, + "sourceLinkTemplate": "https://github.com/vtempest/ai-research-agent/tree/master/{path}#L{line}", + "sidebarLinks": { + "Source Code": "https://github.com/vtempest/ai-research-agent", + "Live Demo": "https://qwksearch.com", + "Discord Chat": "https://discord.gg/SJdBqBz3tV" + }, "navigationLinks": { "Source Code": "https://github.com/vtempest/ai-research-agent", "Live Demo": "https://qwksearch.com", diff --git a/web-app/src/components/Home/ReadView.svelte b/web-app/src/components/Home/ReadView.svelte index 76aea55..8306843 100644 --- a/web-app/src/components/Home/ReadView.svelte +++ b/web-app/src/components/Home/ReadView.svelte @@ -1,22 +1,31 @@ + export let selectedArticle = null; + -
      +
      {#if selectedArticle && selectedArticle.html}

      {selectedArticle.title || ""}

      -

      {selectedArticle.author_cite || ""}

      -

      {selectedArticle.source || ""}

      +

      + {selectedArticle.author_cite || ""} +

      +

      {selectedArticle.source || ""}

      {selectedArticle.date || ""}

      -

      {selectedArticle.word_count || ""} words

      - + {selectedArticle.word_count || ""} words +

      +

      + {selectedArticle.url || ""}

      @@ -24,93 +33,45 @@ {@html selectedArticle.html}
      {:else} -
      +

      - Qwk Logo - Whatever the future of research can be, -
      that is what it must become. + Whatever the future of research can be, +
      that is what it must become.

      -

      +

      -

      - - Chrome Web Store - -

      - -
      +

      + + + + +

      +
      - {/if} + {/if}
      \ No newline at end of file + diff --git a/web-app/src/components/Home/icons-download.css b/web-app/src/components/Home/icons-download.css new file mode 100644 index 0000000..d592937 --- /dev/null +++ b/web-app/src/components/Home/icons-download.css @@ -0,0 +1,29 @@ + +.download-btn{ + width: 200px; + height: 58px; + background-size: cover; + background-repeat: no-repeat; + display: inline-block; + text-indent: -9999px; + border: none; + border-radius: 8px; + cursor: pointer; + padding: 0px; + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.1); + transition: transform 0.3s ease, box-shadow 0.3s ease; +} + +.download-btn:hover { + transform: translateY(-5px); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); +} + + +.download-chrome { +background-image: url('data:image/png;base64,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') +} + +.download-windows { +background-image: url('data:image/png;base64,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'); +} \ No newline at end of file diff --git a/web-app/src/routes/api/train/+server.js b/web-app/src/routes/api/train/+server.js new file mode 100644 index 0000000..f4129ea --- /dev/null +++ b/web-app/src/routes/api/train/+server.js @@ -0,0 +1,103 @@ +import { + convertEmbeddingsToHNSW, + searchVectorIndex, getAllEmbeddings, + getEmbeddingModel, + exportEmbeddingsIndex, + convertTextToEmbedding, + torch + + } from "$airesearchagent"; + import { json } from '@sveltejs/kit'; + + + const nn = torch.nn; + const optim = torch.optim; + const device = "gpu"; + + // Define training hyperparameters: + const vocab_size = 52; + const hidden_size = 32; + const n_timesteps = 16; + const n_heads = 4; + const dropout_p = 0; + const batch_size = 8; + const numberEpochs = 10; + + + class Transformer extends nn.Module { + /** + * Create Transformer decoder Module: + * [Pytorch Transformers](https://www.youtube.com/watch?v=U0s0f995w14&t=260s) + */ + constructor(vocab_size, hidden_size, n_timesteps, n_heads, dropout_p, device) { + super(); + // Instantiate Transformer's Layers: + this.embed = new nn.Embedding(vocab_size, hidden_size); + this.pos_embed = new nn.PositionalEmbedding(n_timesteps, hidden_size); + this.b1 = new nn.Block(hidden_size, hidden_size, n_heads, n_timesteps, dropout_p, device); + this.b2 = new nn.Block(hidden_size, hidden_size, n_heads, n_timesteps, dropout_p, device); + this.ln = new nn.LayerNorm(hidden_size); + this.linear = new nn.Linear(hidden_size, vocab_size, device); + } + + forward(x) { + let z; + z = torch.add(this.embed.forward(x), this.pos_embed.forward(x)); + z = this.b1.forward(z); + z = this.b2.forward(z); + z = this.ln.forward(z); + z = this.linear.forward(z); + return z; + } + } + + +export async function GET({ url }) { + + + // Instantiate your custom nn.Module: + const model = new Transformer( + vocab_size, + hidden_size, + n_timesteps, + n_heads, + dropout_p, + device + ); + + // Define loss function and optimizer: + const loss_func = new nn.CrossEntropyLoss(); + const optimizer = new optim.Adam(model.parameters(), 5e-3, 0); + + // Instantiate sample input and output: + let x = torch.randint(0, vocab_size, [batch_size, n_timesteps, 1]); + let y = torch.randint(0, vocab_size, [batch_size, n_timesteps]); + let loss; + + // Training Loop: + for (let i = 0; i < numberEpochs; i++) { + // Forward pass through the Transformer: + let z = model.forward(x); + + // Get loss: + loss = loss_func.forward(z, y); + + // Backpropagate the loss using torch.tensor's backward() method: + loss.backward(); + + // Update the weights: + optimizer.step(); + + // Reset the gradients to zero after each training step: + optimizer.zero_grad(); + + // Print loss at every iteration: + console.log(`Iter ${i} - Loss ${loss.data[0].toFixed(4)}`); + } + + return json({ + model: model + }); + +} + diff --git a/web-app/src/routes/api/vectorize/+server.js b/web-app/src/routes/api/vectorize/+server.js index 7235705..36b9a00 100644 --- a/web-app/src/routes/api/vectorize/+server.js +++ b/web-app/src/routes/api/vectorize/+server.js @@ -4,8 +4,13 @@ import { getEmbeddingModel, exportEmbeddingsIndex, convertTextToEmbedding, + torch } from "$airesearchagent"; + import { json } from '@sveltejs/kit'; + + + export async function GET({ url }) { @@ -40,6 +45,11 @@ export async function GET({ url }) { // const result2 = await searchVectorIndex(index2, query, {pipeline}); // console.log(result2); - + + return json({ + message: "Model trained successfully", + result: result + }) -} \ No newline at end of file +} +