diff --git a/coco.yml b/coco.yml index c6383a9f2..58742aa09 100644 --- a/coco.yml +++ b/coco.yml @@ -1,5 +1,5 @@ env: - ES_ENDPOINT: https://localhost:9200 + ES_ENDPOINT: http://192.168.3.119:9200 ES_USERNAME: admin ES_PASSWORD: $[[keystore.ES_PASSWORD]] WEB_BINDING: 0.0.0.0:9000 @@ -311,7 +311,7 @@ web: ##background jobs pipeline: - name: enrich_documents - auto_start: false + auto_start: true keep_running: true processor: - consumer: @@ -323,21 +323,29 @@ pipeline: group: enriched_documents fetch_max_messages: 10 processor: - - document_summarization: - model: $[[env.ENRICHMENT_MODEL]] - input_queue: "indexing_documents" - min_input_document_length: 500 + - read_file_content: {} + - extract_file_text: + tika_endpoint: "http://127.0.0.1:9998" + timeout_in_seconds: 180 + output_queue: + name: "enriched_documents" + - document_embedding: + model_provider: qianwen + model: text-embedding-v4 + embedding_dimension: 1024 + chunk_size: 7000 output_queue: name: "enriched_documents" - label: - tag: "enriched" + # - document_summarization: + # model_provider: deepseek + # model: deepseek-chat - name: merge_documents auto_start: true keep_running: true processor: - indexing_merge: - input_queue: "indexing_documents" + input_queue: "enriched_documents" idle_timeout_in_seconds: 1 elasticsearch: "prod" index_name: "coco_document-v2" @@ -362,6 +370,7 @@ pipeline: queues: type: indexing_merge tag: "merged" + - name: connector_dispatcher auto_start: true keep_running: true diff --git a/core/document.go b/core/document.go index cc3ece64c..5f1b4a742 100644 --- a/core/document.go +++ b/core/document.go @@ -5,8 +5,10 @@ package core import ( + "fmt" "strings" "time" + "unsafe" ) type RichLabel struct { @@ -41,8 +43,10 @@ type Document struct { Title string `json:"title,omitempty" elastic_mapping:"title:{type:text,copy_to:combined_fulltext,fields:{keyword: {type: keyword}, pinyin: {type: text, analyzer: pinyin_analyzer}}}"` // Document title Summary string `json:"summary,omitempty" elastic_mapping:"summary:{type:text,copy_to:combined_fulltext}"` // Brief summary or description of the document - Lang string `json:"lang,omitempty" elastic_mapping:"lang:{type:keyword,copy_to:combined_fulltext}"` // Language code (e.g., "en", "fr") - Content string `json:"content,omitempty" elastic_mapping:"content:{type:text,copy_to:combined_fulltext}"` // Document content for full-text indexing + Lang string `json:"lang,omitempty" elastic_mapping:"lang:{type:keyword,copy_to:combined_fulltext}"` // Language code (e.g., "en", "fr") + Content string `json:"content,omitempty" elastic_mapping:"content:{type:text,copy_to:combined_fulltext}"` // Document content for full-text indexing + Text []PageText `json:"text,omitempty" elastic_mapping:"text:{type:nested}"` // Document content in text for full-text indexing + Embedding []Embedding `json:"embedding,omitempty" elastic_mapping:"embedding:{type:nested}"` Icon string `json:"icon,omitempty" elastic_mapping:"icon:{enabled:false}"` // Icon Key, need work with datasource's assets to get the icon url, if it is a full url, then use it directly Thumbnail string `json:"thumbnail,omitempty" elastic_mapping:"thumbnail:{enabled:false}"` // Thumbnail image URL, for preview purposes @@ -113,3 +117,149 @@ type UserInfo struct { UserName string `json:"username,omitempty" elastic_mapping:"username:{type:keyword,copy_to:combined_fulltext}"` // Login of the user UserID string `json:"userid,omitempty" elastic_mapping:"userid:{type:keyword,copy_to:combined_fulltext}"` // Unique identifier for the user } + +type PageText struct { + PageNumber int `json:"page_number" elastic_mapping:"page_number:{type:integer}"` + Content string `json:"content" elastic_mapping:"content:{type:text,analyzer:combined_text_analyzer}"` +} + +type Embedding struct { + ModelProvider string `json:"model_provider" elastic_mapping:"model_provider:{type:keyword}"` + Model string `json:"model" elastic_mapping:"model:{type:keyword}"` + EmbeddingDimension int32 `json:"embedding_dimension" elastic_mapping:"embedding_dimension:{type:integer}"` + + /* + A document will be split into chunks. An `EmbeddingXxx` field will be used + to store these chunks' embeddings. + + Only 1 field will be used, depending on the chosen embedding dimension, see + the `EmbeddingDimension` field above. + + Having so many `EmbeddingXxx` fields is embarrasing, but we have no choice + since vector dimension is part of the type information and elastic mapping + has to be static. + */ + Embeddings128 []ChunkEmbedding128 `json:"embeddings128" elastic_mapping:"embeddings128:{type:nested}"` + Embeddings256 []ChunkEmbedding256 `json:"embeddings256" elastic_mapping:"embeddings256:{type:nested}"` + Embeddings384 []ChunkEmbedding384 `json:"embeddings384" elastic_mapping:"embeddings384:{type:nested}"` + Embeddings512 []ChunkEmbedding512 `json:"embeddings512" elastic_mapping:"embeddings512:{type:nested}"` + Embeddings768 []ChunkEmbedding768 `json:"embeddings768" elastic_mapping:"embeddings768:{type:nested}"` + Embeddings1024 []ChunkEmbedding1024 `json:"embeddings1024" elastic_mapping:"embeddings1024:{type:nested}"` + Embeddings1536 []ChunkEmbedding1536 `json:"embeddings1536" elastic_mapping:"embeddings1536:{type:nested}"` + Embeddings2048 []ChunkEmbedding2048 `json:"embeddings2048" elastic_mapping:"embeddings2048:{type:nested}"` + Embeddings2560 []ChunkEmbedding2560 `json:"embeddings2560" elastic_mapping:"embeddings2560:{type:nested}"` + Embeddings4096 []ChunkEmbedding4096 `json:"embeddings4096" elastic_mapping:"embeddings4096:{type:nested}"` +} + +// Set the `EmbeddingsXxx` field using the value provided by `chunkEmbeddings`. +// +// # Panic +// +// Field `EmbeddingDimension` should be set before calling this function, or it +// panics. +func (e *Embedding) SetEmbeddings(chunkEmbeddings []ChunkEmbedding) { + if e.EmbeddingDimension == 0 { + panic("Embedding.EmbeddingDimension is not set (value: 0), don't know which field to set") + } + + // ChunkEmbedding and other ChunkEmbeddingXxx types have the same memory + // representation so the cast is safe here. + switch e.EmbeddingDimension { + case 128: + e.Embeddings128 = *(*[]ChunkEmbedding128)(unsafe.Pointer(&chunkEmbeddings)) + case 256: + e.Embeddings256 = *(*[]ChunkEmbedding256)(unsafe.Pointer(&chunkEmbeddings)) + case 384: + e.Embeddings384 = *(*[]ChunkEmbedding384)(unsafe.Pointer(&chunkEmbeddings)) + case 512: + e.Embeddings512 = *(*[]ChunkEmbedding512)(unsafe.Pointer(&chunkEmbeddings)) + case 768: + e.Embeddings768 = *(*[]ChunkEmbedding768)(unsafe.Pointer(&chunkEmbeddings)) + case 1024: + e.Embeddings1024 = *(*[]ChunkEmbedding1024)(unsafe.Pointer(&chunkEmbeddings)) + case 1536: + e.Embeddings1536 = *(*[]ChunkEmbedding1536)(unsafe.Pointer(&chunkEmbeddings)) + case 2048: + e.Embeddings2048 = *(*[]ChunkEmbedding2048)(unsafe.Pointer(&chunkEmbeddings)) + case 2560: + e.Embeddings2560 = *(*[]ChunkEmbedding2560)(unsafe.Pointer(&chunkEmbeddings)) + case 4096: + e.Embeddings4096 = *(*[]ChunkEmbedding4096)(unsafe.Pointer(&chunkEmbeddings)) + default: + panic(fmt.Sprintf("unsupported embedding dimension: %d\n", e.EmbeddingDimension)) + } +} + +// Range of this chunk. +// +// A chunk contains roughly the same amount of tokens, say 8192 tokens. And +// thus, a chunk can span many pages if these pages are small, or it is only +// part of a page if it is big. +// +// In the later case, `Start` and `End` will be in format "-" +// that "" specifies the part of that page. +type ChunkRange struct { + // Start page of this chunk. + Start int `json:"start" elastic_mapping:"start:{type:integer}"` + // End page of this chuhk. This is **inclusive**. + End int `json:"end" elastic_mapping:"end:{type:integer}"` +} + +// A `ChunkEmbedding` definition without any tag information. +// +// It should have the same memory representation as other `ChunkEmbeddingXxx` +// variants. +type ChunkEmbedding struct { + Range ChunkRange + Embedding []float32 +} + +type ChunkEmbedding128 struct { + Range ChunkRange `json:"page_range" elastic_mapping:"page_range:{type:object}"` + Embedding []float32 `json:"embedding" elastic_mapping:"embedding:{type:knn_dense_float_vector,knn:{dims:128}}"` +} + +type ChunkEmbedding256 struct { + Range ChunkRange `json:"page_range" elastic_mapping:"page_range:{type:object}"` + Embedding []float32 `json:"embedding" elastic_mapping:"embedding:{type:knn_dense_float_vector,knn:{dims:256}}"` +} + +type ChunkEmbedding384 struct { + Range ChunkRange `json:"page_range" elastic_mapping:"page_range:{type:object}"` + Embedding []float32 `json:"embedding" elastic_mapping:"embedding:{type:knn_dense_float_vector,knn:{dims:384}}"` +} + +type ChunkEmbedding512 struct { + Range ChunkRange `json:"page_range" elastic_mapping:"page_range:{type:object}"` + Embedding []float32 `json:"embedding" elastic_mapping:"embedding:{type:knn_dense_float_vector,knn:{dims:512}}"` +} + +type ChunkEmbedding768 struct { + Range ChunkRange `json:"page_range" elastic_mapping:"page_range:{type:object}"` + Embedding []float32 `json:"embedding" elastic_mapping:"embedding:{type:knn_dense_float_vector,knn:{dims:768}}"` +} + +type ChunkEmbedding1024 struct { + Range ChunkRange `json:"page_range" elastic_mapping:"page_range:{type:object}"` + Embedding []float32 `json:"embedding" elastic_mapping:"embedding:{type:knn_dense_float_vector,knn:{dims:1024}}"` +} + +type ChunkEmbedding1536 struct { + Range ChunkRange `json:"page_range" elastic_mapping:"page_range:{type:object}"` + Embedding []float32 `json:"embedding" elastic_mapping:"embedding:{type:knn_dense_float_vector,knn:{dims:1536}}"` +} + +type ChunkEmbedding2048 struct { + Range ChunkRange `json:"page_range" elastic_mapping:"page_range:{type:object}"` + Embedding []float32 `json:"embedding" elastic_mapping:"embedding:{type:knn_dense_float_vector,knn:{dims:2048}}"` +} + +type ChunkEmbedding2560 struct { + Range ChunkRange `json:"page_range" elastic_mapping:"page_range:{type:object}"` + Embedding []float32 `json:"embedding" elastic_mapping:"embedding:{type:knn_dense_float_vector,knn:{dims:2560}}"` +} + +type ChunkEmbedding4096 struct { + Range ChunkRange `json:"page_range" elastic_mapping:"page_range:{type:object}"` + Embedding []float32 `json:"embedding" elastic_mapping:"embedding:{type:knn_dense_float_vector,knn:{dims:4096}}"` +} diff --git a/modules/assistant/langchain/llm.go b/modules/assistant/langchain/llm.go index 7de806a70..5a9725205 100644 --- a/modules/assistant/langchain/llm.go +++ b/modules/assistant/langchain/llm.go @@ -5,6 +5,9 @@ package langchain import ( + "net/http" + "net/http/httputil" + log "github.com/cihub/seelog" "github.com/tmc/langchaingo/llms" "github.com/tmc/langchaingo/llms/ollama" @@ -12,8 +15,6 @@ import ( "infini.sh/coco/core" "infini.sh/coco/modules/common" "infini.sh/framework/core/global" - "net/http" - "net/http/httputil" ) type LoggingRoundTripper struct { @@ -61,12 +62,14 @@ func GetLLM(endpoint, apiType, model, token string, keepalive string) llms.Model openai.WithToken(token), openai.WithBaseURL(endpoint), openai.WithModel(model), + openai.WithEmbeddingModel(model), ) } else { llm, err = openai.New( openai.WithToken(token), openai.WithBaseURL(endpoint), openai.WithModel(model), + openai.WithEmbeddingModel(model), ) } diff --git a/plugins/connectors/local_fs/plugin.go b/plugins/connectors/local_fs/plugin.go index 50eb730f8..2d24750a8 100644 --- a/plugins/connectors/local_fs/plugin.go +++ b/plugins/connectors/local_fs/plugin.go @@ -154,9 +154,10 @@ func (p *Plugin) saveDocument(ctx *pipeline.Context, currentPath, basePath strin Source: core.DataSourceReference{ID: datasource.ID, Type: "connector", Name: datasource.Name}, Type: connectors.TypeFile, Category: filepath.Dir(currentPath), - Content: "", // skip content - URL: currentPath, - Size: int(fileInfo.Size()), + // skip content here, which will be popluated by the `read_file_content` processor + Content: "", + URL: currentPath, + Size: int(fileInfo.Size()), } doc.System = datasource.System if doc.System == nil { diff --git a/plugins/processors/embedding/processor.go b/plugins/processors/embedding/processor.go new file mode 100644 index 000000000..4c5ee353d --- /dev/null +++ b/plugins/processors/embedding/processor.go @@ -0,0 +1,296 @@ +/* Copyright © INFINI LTD. All rights reserved. + * Web: https://infinilabs.com + * Email: hello#infini.ltd */ + +package embedding + +import ( + "context" + "fmt" + + log "github.com/cihub/seelog" + "github.com/tmc/langchaingo/embeddings" + "infini.sh/coco/core" + "infini.sh/coco/modules/assistant/langchain" + "infini.sh/coco/modules/common" + "infini.sh/coco/plugins/connectors" + "infini.sh/framework/core/config" + "infini.sh/framework/core/errors" + "infini.sh/framework/core/global" + "infini.sh/framework/core/param" + "infini.sh/framework/core/pipeline" + "infini.sh/framework/core/queue" + "infini.sh/framework/core/util" +) + +const ProcessorName = "document_embedding" + +type Config struct { + MessageField param.ParaKey `config:"message_field"` + OutputQueue *queue.QueueConfig `config:"output_queue"` + ModelProviderID string `config:"model_provider"` + ModelName string `config:"model"` + EmbeddingDimension int32 `config:"embedding_dimension"` + ChunkSize int `config:"chunk_size"` +} + +type DocumentEmbeddingProcessor struct { + config *Config + outputQueue *queue.QueueConfig +} + +func init() { + pipeline.RegisterProcessorPlugin(ProcessorName, New) +} + +func New(c *config.Config) (pipeline.Processor, error) { + cfg := Config{MessageField: core.PipelineContextDocuments} + + if err := c.Unpack(&cfg); err != nil { + log.Error(err) + return nil, fmt.Errorf("failed to unpack the configuration of %s processor: %s", ProcessorName, err) + } + + if cfg.MessageField == "" { + cfg.MessageField = "messages" + } + + if cfg.ModelProviderID == "" { + panic(errors.New("model_provider can't be empty")) + } + if cfg.ModelName == "" { + panic(errors.New("model can't be empty")) + } + if cfg.EmbeddingDimension == 0 { + panic(errors.New("embedding_dimension is not specified or set to 0, which is not allowed")) + } + if cfg.ChunkSize == 0 { + panic(errors.New("chunk_size is not specified or set to 0, which is not allowed")) + } + + processor := DocumentEmbeddingProcessor{config: &cfg} + + if cfg.OutputQueue != nil { + processor.outputQueue = queue.SmartGetOrInitConfig(cfg.OutputQueue) + } + + return &processor, nil +} + +func (processor *DocumentEmbeddingProcessor) Name() string { + return ProcessorName +} + +func (processor *DocumentEmbeddingProcessor) Process(ctx *pipeline.Context) error { + fmt.Printf("DBG: DocumentEmbeddingProcessor.Process()\n") + obj := ctx.Get(processor.config.MessageField) + + if obj == nil { + log.Warnf("processor [] receives an empty pipeline context", processor.Name()) + return nil + } + + messages := obj.([]queue.Message) + fmt.Printf("DBG: DocumentEmbeddingProcessor: %d docs to process\n", len(messages)) + if global.Env().IsDebug { + log.Tracef("processor [%s] get %v messages from context", processor.Name(), len(messages)) + } + + if len(messages) == 0 { + return nil + } + + for _, msg := range messages { + docBytes := msg.Data + doc := core.Document{} + err := util.FromJSONBytes(docBytes, &doc) + fmt.Printf("DBG: DocumentEmbeddingProcessor.Process(%s)\n", doc.Title) + if err != nil { + log.Errorf("processor [%s] failed to deserialize document: %s", processor.Name(), err) + continue + } + + // Only local file have this now. + if doc.Type == connectors.TypeFile { + embeddings, err := generateEmbedding(doc.Text, processor.config) + if err != nil { + log.Errorf("processor [%s] failed to generate embeddings for document [%s/%s] due to error [%s]", processor.Name(), doc.ID, doc.Title, err) + } + + doc.Embedding = []core.Embedding{embeddings} + // Update msg + updatedDocBytes := util.MustToJSONBytes(doc) + msg.Data = updatedDocBytes + } + + if processor.outputQueue != nil { + if err := queue.Push(processor.outputQueue, msg.Data); err != nil { + log.Error("failed to push document to [%s]'s output queue: %v\n", processor.Name(), err) + } + } + } + + return nil +} + +// Generate embeddings for "pages". +func generateEmbedding(pages []core.PageText, processorConfig *Config) (core.Embedding, error) { + chunks := make([]core.ChunkEmbedding, 0, 10) + embedder, err := getEmbedderClient(processorConfig) + if err != nil { + return core.Embedding{}, err + } + + /* + Split pages texts to text chunks + */ + textChunks, chunkRanges := splitPagesToChunks(pages, processorConfig.ChunkSize) + + /* + Generate embeddings for text chunks, in batch + */ + ctx := context.Background() + nChunks := len(textChunks) + batchSize := 10 + for batchStart := 0; batchStart < nChunks; batchStart += batchSize { + // batchEnd is exclusive + batchEnd := batchStart + batchSize + if batchEnd > nChunks { + batchEnd = nChunks + } + + batch := textChunks[batchStart:batchEnd] + embeddings, err := embedder.CreateEmbedding(ctx, batch) + if err != nil { + return core.Embedding{}, errors.New(fmt.Sprintf("failed to generated embeddings due to error: %s", err)) + } + + for relative_idx, embedding := range embeddings { + idx := batchStart + relative_idx + chunkRange := chunkRanges[idx] + + chunk := core.ChunkEmbedding{ + Range: chunkRange, + Embedding: embedding, + } + chunks = append(chunks, chunk) + } + } + + /* + Set the corresponding EmbeddingXxx field and return + */ + embedding := core.Embedding{ + ModelProvider: processorConfig.ModelProviderID, + Model: processorConfig.ModelName, + EmbeddingDimension: processorConfig.EmbeddingDimension, + } + embedding.SetEmbeddings(chunks) + return embedding, nil +} + +// Splits page texts into chunks using character count as a token proxy +// and tracks the page range for each chunk. +func splitPagesToChunks(pages []core.PageText, chunkSize int) ([]string, []core.ChunkRange) { + // Early return + if chunkSize <= 0 { + return nil, nil + } + if len(pages) == 0 { + return make([]string, 0), make([]core.ChunkRange, 0) + } + + var chunks []string + var ranges []core.ChunkRange + + buf := make([]rune, 0, chunkSize) + // Value 0 means `startPage`` and `lastPage` are not initialized + startPage := 0 + lastPage := 0 + + for _, page := range pages { + pageNumber := page.PageNumber + pageChars := []rune(page.Content) + + for len(pageChars) > 0 { + nCharsWeWant := chunkSize - len(buf) + nCharsWeCanTake := min(nCharsWeWant, len(pageChars)) + chars := pageChars[:nCharsWeCanTake] + buf = append(buf, chars...) + + // Update page range after modifying `buf` + if startPage == 0 { + startPage = pageNumber + } + if len(buf) == chunkSize && lastPage == 0 { + lastPage = pageNumber + + // `buf` is ready + textChunk := string(buf) + chunkRange := core.ChunkRange{ + Start: startPage, + End: lastPage, + } + chunks = append(chunks, textChunk) + ranges = append(ranges, chunkRange) + + // clear buf and states + buf = buf[:0] + startPage = 0 + lastPage = 0 + } + + // Remove the consumed bytes from `pageChars` + pageChars = pageChars[nCharsWeCanTake:] + } + } + + // We may have a chunk whose size is smaller than `chunkSize` + if len(buf) != 0 { + // startPage should be updated + if startPage == 0 { + panic("unreachable: buf got updated but startPage is still 0") + } + // Set lastPage + if lastPage == 0 { + lastPage = len(pages) + } + + // `buf` is ready + textChunk := string(buf) + chunkRange := core.ChunkRange{ + Start: startPage, + End: lastPage, + } + chunks = append(chunks, textChunk) + ranges = append(ranges, chunkRange) + } + + if len(chunks) != len(ranges) { + panic("chunks and ranges should have the same length") + } + + return chunks, ranges +} + +// According to the specified configuration, init the "EmbedderClient" and +// return it. +func getEmbedderClient(cfg *Config) (embeddings.EmbedderClient, error) { + provider, err := common.GetModelProvider(cfg.ModelProviderID) + if err != nil { + log.Error("failed to get model provider: ", err) + return nil, err + } + + model := langchain.GetLLM(provider.BaseURL, provider.APIType, cfg.ModelName, provider.APIKey, "") + // Check if the LLM client supports embeddings + embedder, ok := model.(embeddings.EmbedderClient) + + if !ok { + errorMsg := fmt.Sprintf("Model [%s/%s] does not support embeddings", cfg.ModelProviderID, cfg.ModelName) + log.Error(errorMsg) + return nil, errors.New(errorMsg) + } + + return embedder, nil +} diff --git a/plugins/processors/extract_file_text/processor.go b/plugins/processors/extract_file_text/processor.go new file mode 100644 index 000000000..e02f4be82 --- /dev/null +++ b/plugins/processors/extract_file_text/processor.go @@ -0,0 +1,170 @@ +package extract_file_text + +import ( + "context" + "fmt" + "io" + "net/http" + "os" + "strings" + "time" + + "github.com/PuerkitoBio/goquery" + log "github.com/cihub/seelog" + "infini.sh/coco/core" + "infini.sh/coco/plugins/connectors" + "infini.sh/framework/core/config" + "infini.sh/framework/core/param" + "infini.sh/framework/core/pipeline" + "infini.sh/framework/core/queue" + "infini.sh/framework/core/util" +) + +func init() { + pipeline.RegisterProcessorPlugin("extract_file_text", New) +} + +type ExtractFileTextProcessor struct { + config *Config + outputQueue *queue.QueueConfig +} + +type Config struct { + MessageField param.ParaKey `config:"message_field"` + OutputQueue *queue.QueueConfig `config:"output_queue"` + TikaEndpoint string `config:"tika_endpoint"` + TimeoutInSeconds int `config:"timeout_in_seconds"` +} + +func New(c *config.Config) (pipeline.Processor, error) { + cfg := Config{ + MessageField: "messages", + TikaEndpoint: "http://127.0.0.1:9998/tika", + TimeoutInSeconds: 120, + } + if err := c.Unpack(&cfg); err != nil { + return nil, err + } + + p := &ExtractFileTextProcessor{config: &cfg} + + if cfg.OutputQueue != nil { + p.outputQueue = queue.SmartGetOrInitConfig(cfg.OutputQueue) + } + + return p, nil +} + +func (p *ExtractFileTextProcessor) Name() string { + return "extract_file_text" +} + +func (p *ExtractFileTextProcessor) Process(ctx *pipeline.Context) error { + fmt.Printf("DBG: ExtractFileTextProcessor.Process() at %v\n", time.Now()) + obj := ctx.Get(p.config.MessageField) + if obj == nil { + log.Warnf("processor [] receives an empty pipeline context", p.Name()) + return nil + } + + messages, ok := obj.([]queue.Message) + if !ok { + return nil + } + + for i := range messages { + msg := &messages[i] + doc := core.Document{} + + docBytes := msg.Data + err := util.FromJSONBytes(docBytes, &doc) + if err != nil { + log.Error("error on handle document:", err) + continue + } + + if doc.Type == connectors.TypeFile { + // Use Tika Server to extract text + // We use Accept: text/html to get page boundaries (
) + + ctx, cancel := context.WithTimeout(context.Background(), time.Duration(p.config.TimeoutInSeconds)*time.Second) + defer cancel() + + file, err := os.Open(doc.URL) + if err != nil { + log.Errorf("failed to open file %s: %v", doc.URL, err) + continue + } + defer file.Close() + + url := fmt.Sprintf("%s/tika", p.config.TikaEndpoint) + req, err := http.NewRequestWithContext(ctx, "PUT", url, file) + if err != nil { + log.Errorf("failed to create request for %s: %v", doc.URL, err) + continue + } + req.Header.Set("Accept", "text/html") + + client := &http.Client{} + fmt.Printf("DBG: request to tika server sent\n") + resp, err := client.Do(req) + if err != nil { + log.Errorf("failed to request tika for %s: %v", doc.URL, err) + continue + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(resp.Body) + log.Errorf("tika returned status %d for %s: %s", resp.StatusCode, doc.URL, string(body)) + continue + } + + // Parse HTML response + docHTML, err := goquery.NewDocumentFromReader(resp.Body) + if err != nil { + log.Errorf("failed to parse tika response for %s: %v", doc.URL, err) + continue + } + + var pages []core.PageText + + // Find all div with class "page" + docHTML.Find("div.page").Each(func(i int, s *goquery.Selection) { + pageContent := strings.TrimSpace(s.Text()) + if pageContent != "" { + pages = append(pages, core.PageText{ + PageNumber: i + 1, + Content: pageContent, + }) + } + }) + + // If no pages found (maybe not a PDF or Tika returned plain text + // wrapped in body), try getting body text + if len(pages) == 0 { + bodyText := strings.TrimSpace(docHTML.Find("body").Text()) + if bodyText != "" { + pages = append(pages, core.PageText{ + PageNumber: 1, + Content: bodyText, + }) + } + } + + fmt.Printf("DBG: n %d pages\n", len(pages)) + doc.Text = pages + + // Update msg.Data with the new document content + updatedDocBytes := util.MustToJSONBytes(doc) + msg.Data = updatedDocBytes + } + + if p.outputQueue != nil { + if err := queue.Push(p.outputQueue, msg.Data); err != nil { + log.Errorf("failed to push document to [%s]'s output queue: %v", p.Name(), err) + } + } + } + return nil +} diff --git a/plugins/processors/read_file_content/processor.go b/plugins/processors/read_file_content/processor.go new file mode 100644 index 000000000..7c4ebf369 --- /dev/null +++ b/plugins/processors/read_file_content/processor.go @@ -0,0 +1,92 @@ +package read_file_content + +import ( + "fmt" + "os" + + log "github.com/cihub/seelog" + "infini.sh/coco/core" + "infini.sh/coco/plugins/connectors" + "infini.sh/framework/core/config" + "infini.sh/framework/core/param" + "infini.sh/framework/core/pipeline" + "infini.sh/framework/core/queue" + "infini.sh/framework/core/util" +) + +func init() { + pipeline.RegisterProcessorPlugin("read_file_content", New) +} + +type ReadFileContentProcessor struct { + config *Config + outputQueue *queue.QueueConfig +} + +type Config struct { + MessageField param.ParaKey `config:"message_field"` + OutputQueue *queue.QueueConfig `config:"output_queue"` +} + +func New(c *config.Config) (pipeline.Processor, error) { + cfg := Config{ + MessageField: "messages", + } + if err := c.Unpack(&cfg); err != nil { + return nil, err + } + + p := &ReadFileContentProcessor{config: &cfg} + + if cfg.OutputQueue != nil { + p.outputQueue = queue.SmartGetOrInitConfig(cfg.OutputQueue) + } + + return p, nil +} + +func (p *ReadFileContentProcessor) Name() string { + return "read_file_content" +} + +func (p *ReadFileContentProcessor) Process(ctx *pipeline.Context) error { + fmt.Printf("DBG: ReadFileContentProcessor.Process()\n") + obj := ctx.Get(p.config.MessageField) + if obj == nil { + return nil + } + + messages, ok := obj.([]queue.Message) + if !ok { + return nil + } + + for _, msg := range messages { + doc := core.Document{} + + docBytes := msg.Data + err := util.FromJSONBytes(docBytes, &doc) + if err != nil { + log.Error("error on handle document:", err) + continue + } + + if doc.Type == connectors.TypeFile { + content, err := os.ReadFile(doc.URL) + if err != nil { + log.Errorf("failed to read file content from %s: %v", doc.URL, err) + continue + } + doc.Content = string(content) + updatedDocBytes := util.MustToJSONBytes(doc) + msg.Data = updatedDocBytes + } + + if p.outputQueue != nil { + if err := queue.Push(p.outputQueue, msg.Data); err != nil { + log.Error("failed to push document to [%s]'s output queue: %v\n", p.Name(), err) + } + } + } + return nil +} diff --git a/plugins/processors/summary/processor.go b/plugins/processors/summary/processor.go index 650b4073b..363e251e9 100644 --- a/plugins/processors/summary/processor.go +++ b/plugins/processors/summary/processor.go @@ -7,10 +7,15 @@ package summary import ( "context" "fmt" + "regexp" + "strings" + "time" + log "github.com/cihub/seelog" "github.com/tmc/langchaingo/llms" - "github.com/tmc/langchaingo/llms/ollama" "infini.sh/coco/core" + "infini.sh/coco/modules/assistant/langchain" + "infini.sh/coco/modules/common" "infini.sh/framework/core/config" "infini.sh/framework/core/errors" "infini.sh/framework/core/global" @@ -18,22 +23,19 @@ import ( "infini.sh/framework/core/pipeline" "infini.sh/framework/core/queue" "infini.sh/framework/core/util" - "regexp" - "strings" - "time" ) +const ProcessorName = "document_summarization" + type Config struct { - MessageField param.ParaKey `config:"message_field"` - OutputQueue struct { - Name string `config:"name"` - Labels map[string]interface{} `config:"label" json:"label,omitempty"` - } `config:"output_queue"` + MessageField param.ParaKey `config:"message_field"` + OutputQueue *queue.QueueConfig `config:"output_queue"` MaxRunningTimeoutInSeconds time.Duration - MinInputDocumentLength int `config:"min_input_document_length"` - MaxInputDocumentLength int `config:"max_input_document_length"` - MaxOutputDocumentLength int `config:"max_output_document_length"` - SummaryModel string `config:"model"` + MinInputDocumentLength uint32 `config:"min_input_document_length"` + MaxInputDocumentLength uint32 `config:"max_input_document_length"` + MaxOutputDocumentLength uint32 `config:"max_output_document_length"` + ModelProviderID string `config:"model_provider"` + ModelName string `config:"model"` OutputSummaryField string `config:"output_summary_field"` PreviousSummaryField string `config:"previous_summary_field"` @@ -43,16 +45,17 @@ type Config struct { type DocumentSummarizationProcessor struct { config *Config - outCfg *queue.QueueConfig - producer queue.ProducerAPI + outputQueue *queue.QueueConfig removeThinkPattern *regexp.Regexp } func init() { - pipeline.RegisterProcessorPlugin("document_summarization", New) + pipeline.RegisterProcessorPlugin(ProcessorName, New) } func New(c *config.Config) (pipeline.Processor, error) { + fmt.Printf("DBG: DocumentSummarization.New()\n") + cfg := Config{MessageField: core.PipelineContextDocuments, MinInputDocumentLength: 100, MaxInputDocumentLength: 100000, MaxOutputDocumentLength: 10000, IncludeSkippedDocumentToOutputQueue: true} if err := c.Unpack(&cfg); err != nil { @@ -61,143 +64,158 @@ func New(c *config.Config) (pipeline.Processor, error) { } if cfg.MessageField == "" { - panic("message field is empty") + cfg.MessageField = "messages" } - if cfg.OutputQueue.Name == "" { - panic(errors.New("name of output_queue can't be nil")) + if cfg.ModelProviderID == "" { + panic("model_provider can't be empty") } - if cfg.SummaryModel == "" { - panic(errors.New("summary model can't be empty")) + if cfg.ModelName == "" { + panic("model can't be empty") } - runner := DocumentSummarizationProcessor{config: &cfg} - - queueConfig := queue.AdvancedGetOrInitConfig("", cfg.OutputQueue.Name, cfg.OutputQueue.Labels) - queueConfig.ReplaceLabels(cfg.OutputQueue.Labels) + processor := DocumentSummarizationProcessor{config: &cfg} - producer, err := queue.AcquireProducer(queueConfig) - if err != nil { - panic(err) + if cfg.OutputQueue != nil { + processor.outputQueue = queue.SmartGetOrInitConfig(cfg.OutputQueue) } - - runner.outCfg = queue.AdvancedGetOrInitConfig("", cfg.OutputQueue.Name, cfg.OutputQueue.Labels) - runner.producer = producer // Regular expression to remove content - runner.removeThinkPattern = regexp.MustCompile(`(?s).*?`) + processor.removeThinkPattern = regexp.MustCompile(`(?s).*?`) - return &runner, nil + return &processor, nil } func (processor *DocumentSummarizationProcessor) Name() string { - return "document_enrichment" + return ProcessorName } func (processor *DocumentSummarizationProcessor) Process(ctx *pipeline.Context) error { + fmt.Printf("DBG: DocumentSummarization.Process()\n") - //get message from queue + // get message from queue obj := ctx.Get(processor.config.MessageField) - if obj != nil { - messages := obj.([]queue.Message) - if global.Env().IsDebug { - log.Tracef("get %v messages from context", len(messages)) - } - - if len(messages) == 0 { - return nil - } - llm, err := ollama.New(ollama.WithModel(processor.config.SummaryModel)) - if err != nil { - panic(err) - } - ctx := context.Background() - - for i, message := range messages { + if obj == nil { + log.Warnf("processor [] receives an empty pipeline context", processor.Name()) + return nil + } - pop := message.Data - var outputBytes []byte + messages := obj.([]queue.Message) + if global.Env().IsDebug { + log.Tracef("get %v messages from context", len(messages)) + } - if len(pop) > processor.config.MinInputDocumentLength { + if len(messages) == 0 { + return nil + } - doc := core.Document{} - err := util.FromJSONBytes(pop, &doc) - if err != nil { - log.Error("error on handle document:", i, err) - continue - } + provider, err := common.GetModelProvider(processor.config.ModelProviderID) + if err != nil { + log.Error("failed to get model provider:", err) + return err + } - log.Info("start summarize doc: ", doc.ID, ",", doc.Title) - start := time.Now() + llm := langchain.GetLLM(provider.BaseURL, provider.APIType, processor.config.ModelName, provider.APIKey, "") + llmCtx := context.Background() - prompt := fmt.Sprintf(`You are an expert summarizer tasked with summarizing documents. Your job is to read the provided information below and generate a clean, concise, -and accurate summary of the document, considering all fields provided. Make sure your summary reflects the most important points from the document as rich as possible without exceeding %v tokens. + for i := range messages { + message := &messages[i] + pop := message.Data + docLen := uint32(len(pop)) -Please use all of the available fields in the document to generate the summary, the document is in JSON format: -%s + if docLen > processor.config.MinInputDocumentLength { + doc := core.Document{} + err := util.FromJSONBytes(pop, &doc) + if err != nil { + log.Error("error on handle document:", i, err) + continue + } -If any of these fields are missing or incomplete, focus on the available ones and fill in the gaps logically, based on your understanding of the document. -Make sure the final summary is clear, concise, and easy to understand. + log.Info("start summarize doc: ", doc.ID, ",", doc.Title) + start := time.Now() -No need return how you think. + // Create a copy of the document for the prompt, excluding + // the content field as it could be binary bytes, which is + // not helpful for generating document summary. In cases where + // it is a text, field `Document.Text` already provides that, + // so it is not needed either. + docForPrompt := doc + docForPrompt.Content = "" -Summary:`, processor.config.MaxOutputDocumentLength, util.SubStringWithSuffix(string(pop), processor.config.MaxInputDocumentLength, "...")) + promptStr := humanPrompt(processor.config.MaxOutputDocumentLength, docForPrompt) - content := []llms.MessageContent{ - llms.TextParts(llms.ChatMessageTypeSystem, "You are an expert summarizer, and your task is to generate a concise summary of the document."), - llms.TextParts(llms.ChatMessageTypeHuman, prompt), - } + content := []llms.MessageContent{ + llms.TextParts(llms.ChatMessageTypeSystem, "You are an expert summarizer, and your task is to generate a concise summary of the document."), + llms.TextParts(llms.ChatMessageTypeHuman, promptStr), + } - summary := strings.Builder{} - completion, err := llm.GenerateContent(ctx, content, llms.WithStreamingFunc(func(ctx context.Context, chunk []byte) error { - if global.ShuttingDown() { - ctx.Done() - return errors.New("shutting down") - } - summary.Write(chunk) - return nil - })) - if err != nil { - panic(err) - } - _ = completion - - text := summary.String() - text = processor.removeThinkPattern.ReplaceAllString(text, "") - - if len(text) > 0 { - previousSummary := doc.Summary - if previousSummary != "" && processor.config.KeepPreviousSummaryContent && processor.config.PreviousSummaryField != "" { - doc.Payload[processor.config.PreviousSummaryField] = previousSummary - } else { - doc.Summary = text - } + summary := strings.Builder{} + completion, err := llm.GenerateContent(llmCtx, content, llms.WithStreamingFunc(func(ctx context.Context, chunk []byte) error { + if global.ShuttingDown() { + llmCtx.Done() + return errors.New("shutting down") } - - outputBytes = util.MustToJSONBytes(doc) - - log.Infof("finished summarize doc, %v, %v, elapsed: %v, summary: %v", doc.ID, doc.Title, util.Since(start), text) - } else { - - if !processor.config.IncludeSkippedDocumentToOutputQueue { - continue + summary.Write(chunk) + return nil + })) + if err != nil { + panic(err) + } + _ = completion + + text := summary.String() + fmt.Printf("DBG: summary len %d \n", len(text)) + text = processor.removeThinkPattern.ReplaceAllString(text, "") + + if len(text) > 0 { + previousSummary := doc.Summary + if previousSummary != "" && processor.config.KeepPreviousSummaryContent && processor.config.PreviousSummaryField != "" { + doc.Payload[processor.config.PreviousSummaryField] = previousSummary + } else { + doc.Summary = text } - - outputBytes = pop } - - if outputBytes == nil { - panic("invalid output") + message.Data = util.MustToJSONBytes(doc) + log.Infof("[%s] finished summarize doc, %v, %v, elapsed: %v, summary: %v", processor.Name(), doc.ID, doc.Title, util.Since(start), text) + } else { + if !processor.config.IncludeSkippedDocumentToOutputQueue { + continue } + } - //push to output queue - r := queue.ProduceRequest{Topic: processor.outCfg.ID, Data: outputBytes} - res := []queue.ProduceRequest{r} - _, err = processor.producer.Produce(&res) - if err != nil { - panic(errors.Errorf("failed to push message to output queue: %v, %s, offset:%v, size:%v, err:%v", processor.outCfg.Name, processor.outCfg.ID, message.Offset.String(), len(outputBytes), err)) + // push to output queue + if processor.outputQueue != nil { + if err := queue.Push(processor.outputQueue, message.Data); err != nil { + log.Errorf("failed to push document to [%s]'s output queue: %v", processor.Name(), err) } } } return nil } + +// Helper function to construct the human/user prompt. +func humanPrompt(max_token uint32, document core.Document) string { + docBytes := util.MustToJSONBytes(document) + return fmt.Sprintf( + "You are an expert summarizer tasked with summarizing documents. Your "+ + "job is to read the provided information below and generate a clean "+ + "concise, and accurate summary of the document, considering all fields "+ + "provided. Make sure your summary reflects the most important points "+ + "from the document as rich as possible without exceeding %v tokens."+ + "\n"+ + "The provided document is in JSON format: %s"+ + "\n"+ + "Please use all of the available fields in the document to generate "+ + "the summary. If any of these fields are missing or incomplete, focus "+ + "on the available ones and fill in the gaps logically, based on "+ + "your understanding of the document."+ + "\n"+ + "Make sure the final summary is clear, concise, and easy to understand."+ + "\n"+ + "No need return how you think.", + + // Arguments + max_token, + string(docBytes), + ) +} diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index c622b8af0..42cb3d956 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -410,6 +410,86 @@ importers: specifier: 4.2.2 version: 4.2.2 + widgets/fullscreen: + dependencies: + fullscreen: + specifier: 'link:' + version: 'link:' + query-string: + specifier: 9.2.2 + version: 9.2.2 + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + devDependencies: + '@types/react': + specifier: ^18.3.1 + version: 18.3.12 + '@types/react-dom': + specifier: ^18.3.1 + version: 18.3.1 + esbuild: + specifier: 0.21.5 + version: 0.21.5 + esbuild-plugin-svgr: + specifier: ^3.1.0 + version: 3.1.1(esbuild@0.21.5)(typescript@5.6.3) + http-server: + specifier: ^14.1.1 + version: 14.1.1 + prettier: + specifier: 3.3.2 + version: 3.3.2 + tsup: + specifier: ^8.4.0 + version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.5.1) + typescript: + specifier: ^5.5.2 + version: 5.6.3 + + widgets/searchbox: + dependencies: + '@infinilabs/search-chat': + specifier: ^1.2.52 + version: 1.2.52(@types/react@18.3.12)(immer@10.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(use-sync-external-store@1.6.0(react@18.3.1))(wavesurfer.js@7.12.1) + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + searchbox: + specifier: 'link:' + version: 'link:' + devDependencies: + '@types/react': + specifier: ^18.3.1 + version: 18.3.12 + '@types/react-dom': + specifier: ^18.3.1 + version: 18.3.1 + esbuild: + specifier: 0.21.5 + version: 0.21.5 + esbuild-plugin-svgr: + specifier: ^3.1.0 + version: 3.1.1(esbuild@0.21.5)(typescript@5.6.3) + http-server: + specifier: ^14.1.1 + version: 14.1.1 + prettier: + specifier: 3.3.2 + version: 3.3.2 + tsup: + specifier: ^8.4.0 + version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.5.1) + typescript: + specifier: ^5.5.2 + version: 5.6.3 + packages: '@ampproject/remapping@2.3.0': @@ -708,6 +788,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.27.1': + resolution: {integrity: sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} @@ -720,6 +806,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.27.1': + resolution: {integrity: sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} @@ -732,6 +824,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.27.1': + resolution: {integrity: sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} @@ -744,6 +842,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.27.1': + resolution: {integrity: sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} @@ -756,6 +860,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.27.1': + resolution: {integrity: sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} @@ -768,6 +878,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.27.1': + resolution: {integrity: sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} @@ -780,6 +896,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.27.1': + resolution: {integrity: sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} @@ -792,6 +914,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.27.1': + resolution: {integrity: sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} @@ -804,6 +932,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.27.1': + resolution: {integrity: sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} @@ -816,6 +950,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.27.1': + resolution: {integrity: sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} @@ -828,6 +968,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.27.1': + resolution: {integrity: sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} @@ -840,6 +986,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.27.1': + resolution: {integrity: sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} @@ -852,6 +1004,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.27.1': + resolution: {integrity: sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} @@ -864,6 +1022,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.27.1': + resolution: {integrity: sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} @@ -876,6 +1040,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.27.1': + resolution: {integrity: sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} @@ -888,6 +1058,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.27.1': + resolution: {integrity: sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} @@ -900,6 +1076,18 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.27.1': + resolution: {integrity: sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.1': + resolution: {integrity: sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} @@ -912,12 +1100,24 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.27.1': + resolution: {integrity: sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.23.1': resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.27.1': + resolution: {integrity: sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} @@ -930,6 +1130,18 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.27.1': + resolution: {integrity: sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.1': + resolution: {integrity: sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} @@ -942,6 +1154,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.27.1': + resolution: {integrity: sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} @@ -954,6 +1172,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.27.1': + resolution: {integrity: sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} @@ -966,6 +1190,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.27.1': + resolution: {integrity: sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} @@ -978,6 +1208,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.27.1': + resolution: {integrity: sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.9.0': resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1037,6 +1273,34 @@ packages: resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + + '@floating-ui/react-dom@2.1.6': + resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.26.28': + resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@headlessui/react@2.2.9': + resolution: {integrity: sha512-Mb+Un58gwBn0/yWZfyrCh0TJyurtT+dETj7YHleylHk5od3dv2XqETPGWMyQ5/7sYN7oWdyM1u9MvC0OC8UmzQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -1074,6 +1338,12 @@ packages: react: '>=17' react-dom: '>=17' + '@infinilabs/search-chat@1.2.52': + resolution: {integrity: sha512-C1NmPX5aVLgqNSfEebD7mSFxq3E4GMQA9uQzu3IvDu+XEKvFP+iK2BxKR1FXllQu4GVTgqCk6m0yFiSfqq9KjA==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + '@isaacs/balanced-match@4.0.1': resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} engines: {node: 20 || >=22} @@ -1223,6 +1493,24 @@ packages: '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-slot@1.2.4': + resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@rc-component/async-validator@5.0.4': resolution: {integrity: sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==} engines: {node: '>=14.x'} @@ -1278,6 +1566,43 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' + '@react-aria/focus@3.21.2': + resolution: {integrity: sha512-JWaCR7wJVggj+ldmM/cb/DXFg47CXR55lznJhZBh4XVqJjMKwaOOqpT5vNN7kpC1wUpXicGNuDnJDN1S/+6dhQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/interactions@3.25.6': + resolution: {integrity: sha512-5UgwZmohpixwNMVkMvn9K1ceJe6TzlRlAfuYoQDUuOkk62/JVJNDLAPKIf5YMRc7d2B0rmfgaZLMtbREb0Zvkw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/ssr@3.9.10': + resolution: {integrity: sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==} + engines: {node: '>= 12'} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-aria/utils@3.31.0': + resolution: {integrity: sha512-ABOzCsZrWzf78ysswmguJbx3McQUja7yeGj6/vZo4JVsZNlxAN+E9rs381ExBRI0KzVo6iBTeX5De8eMZPJXig==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-stately/flags@3.1.2': + resolution: {integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==} + + '@react-stately/utils@3.10.8': + resolution: {integrity: sha512-SN3/h7SzRsusVQjQ4v10LaVsDc81jyyR0DD5HnsQitm/I5WDpaSr2nRHtyloPFU48jlql1XX/S04T2DLQM7Y3g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + + '@react-types/shared@3.32.1': + resolution: {integrity: sha512-famxyD5emrGGpFuUlgOP6fVW2h/ZaF405G5KDi3zPHzyjAWys/8W6NAVJtNbkCkhedmvL0xOhvt8feGXyXaw5w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@reduxjs/toolkit@2.3.0': resolution: {integrity: sha512-WC7Yd6cNGfHx8zf+iu+Q1UPTfEcXhQ+ATi7CV1hlrSAaQBdlPzg7Ww/wJHNQem7qG9rxmWoFCDCPubSvFObGzA==} peerDependencies: @@ -1293,6 +1618,10 @@ packages: resolution: {integrity: sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg==} engines: {node: '>=14.0.0'} + '@remix-run/router@1.23.1': + resolution: {integrity: sha512-vDbaOzF7yT2Qs4vO6XV1MHcJv+3dgR1sT+l3B8xxOVhUC336prMvqrvsLL/9Dnw2xr6Qhz4J0dmS0llNAbnUmQ==} + engines: {node: '>=14.0.0'} + '@rollup/pluginutils@5.3.0': resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} @@ -1551,9 +1880,21 @@ packages: peerDependencies: '@svgr/core': '*' + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + '@tanem/svg-injector@10.1.68': resolution: {integrity: sha512-UkJajeR44u73ujtr5GVSbIlELDWD/mzjqWe54YMK61ljKxFcJoPd9RBSaO7xj02ISCWUqJW99GjrS+sVF0UnrA==} + '@tanstack/react-virtual@3.13.12': + resolution: {integrity: sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/virtual-core@3.13.12': + resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==} + '@trysound/sax@0.2.0': resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} @@ -1689,6 +2030,9 @@ packages: peerDependencies: '@types/react': '*' + '@types/js-cookie@3.0.6': + resolution: {integrity: sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -2006,6 +2350,12 @@ packages: '@vue/shared@3.5.24': resolution: {integrity: sha512-9cwHL2EsJBdi8NY22pngYYWzkTDhld6fAD6jlaeloNGciNSJL6bLpbxVgXl96X00Jtc6YWQv96YA/0sxex/k1A==} + '@wavesurfer/react@1.0.12': + resolution: {integrity: sha512-BNHpz2ryKNVvJdxB47pCPUsNCsjb2pZRysg82M5djIiw0vsiSJwdlt5jaAfDo3vd5IWrcoK9OiPQKO9ZEVNpDQ==} + peerDependencies: + react: ^18.2.0 || ^19.0.0 + wavesurfer.js: '>=7.7.14' + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -2025,6 +2375,12 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 + ahooks@3.9.6: + resolution: {integrity: sha512-Mr7f05swd5SmKlR9SZo5U6M0LsL4ErweLzpdgXjA1JPmnZ78Vr6wzx0jUtvoxrcqGKYnX0Yjc02iEASVxHFPjQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -2069,6 +2425,9 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -2135,6 +2494,9 @@ packages: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -2152,6 +2514,9 @@ packages: peerDependencies: axios: 0.x || 1.x + axios@1.13.2: + resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} + axios@1.7.7: resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} @@ -2169,6 +2534,10 @@ packages: resolution: {integrity: sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==} hasBin: true + basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} @@ -2343,6 +2712,9 @@ packages: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} engines: {node: '>=0.10.0'} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} @@ -2409,6 +2781,10 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -2471,6 +2847,10 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} + corser@2.0.1: + resolution: {integrity: sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==} + engines: {node: '>= 0.4.0'} + cose-base@1.0.3: resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} @@ -2951,6 +3331,11 @@ packages: es-toolkit@1.42.0: resolution: {integrity: sha512-SLHIyY7VfDJBM8clz4+T2oquwTQxEzu263AyhVK4jREOAwJ+8eebaa4wM3nlvnAqhDrMm2EsA6hWHaQsMPQ1nA==} + esbuild-plugin-svgr@3.1.1: + resolution: {integrity: sha512-P0GVOTvmCMFUktRuIyjrUkx5C1VDZZH7VOFvtboQpWUG93eAvYyXPFf90kUMW9HMaTsRGpRrRoUmJ29PlQ0kLw==} + peerDependencies: + esbuild: ^0.25.2 + esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -2961,6 +3346,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.27.1: + resolution: {integrity: sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -3120,6 +3510,9 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -3193,6 +3586,10 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} + filesize@10.1.6: + resolution: {integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==} + engines: {node: '>= 10.4.0'} + fill-range@4.0.0: resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} engines: {node: '>=0.10.0'} @@ -3217,6 +3614,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -3503,6 +3903,10 @@ packages: hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + html-encoding-sniffer@3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} + html-parse-stringify@3.0.1: resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} @@ -3515,6 +3919,15 @@ packages: htmlparser2@3.10.1: resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + http-server@14.1.1: + resolution: {integrity: sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==} + engines: {node: '>=12'} + hasBin: true + human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -3527,9 +3940,15 @@ packages: resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} engines: {node: '>=18.18.0'} + i18next-browser-languagedetector@8.2.0: + resolution: {integrity: sha512-P+3zEKLnOF0qmiesW383vsLdtQVyKtCNA9cjSoKCppTKPQVfKd2W8hbVo5ZhNJKDqeM7BOcvNoKJOjpHh4Js9g==} + i18next@23.16.4: resolution: {integrity: sha512-9NIYBVy9cs4wIqzurf7nLXPyf3R78xYbxExVqHLK9od3038rjpyOEzW+XB130kZ1N4PZ9inTtJ471CRJ4Ituyg==} + i18next@23.16.8: + resolution: {integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==} + iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -3858,6 +4277,10 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + js-base64@2.6.4: resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} @@ -4113,6 +4536,9 @@ packages: mdast-util-from-markdown@2.0.2: resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + mdast-util-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} + mdast-util-gfm-autolink-literal@2.0.1: resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} @@ -4362,6 +4788,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -4372,6 +4801,11 @@ packages: engines: {node: ^18 || >=20} hasBin: true + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} + engines: {node: ^18 || >=20} + hasBin: true + nanomatch@1.2.13: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} @@ -4492,6 +4926,10 @@ packages: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} + opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -4621,6 +5059,10 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} @@ -4637,6 +5079,10 @@ packages: points-on-path@0.2.1: resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + portfinder@1.0.38: + resolution: {integrity: sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==} + engines: {node: '>= 10.12'} + posix-character-classes@0.1.1: resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} engines: {node: '>=0.10.0'} @@ -4645,6 +5091,24 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + postcss-modules-extract-imports@3.1.0: resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} engines: {node: ^10 || ^12 || >= 14} @@ -4725,6 +5189,11 @@ packages: peerDependencies: prettier: '>=2.0.0' + prettier@3.3.2: + resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} + engines: {node: '>=14'} + hasBin: true + prettier@3.3.3: resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} engines: {node: '>=14'} @@ -4768,6 +5237,10 @@ packages: resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==} engines: {node: '>=0.10.0'} + query-string@9.2.2: + resolution: {integrity: sha512-pDSIZJ9sFuOp6VnD+5IkakSVf+rICAuuU88Hcsr6AKL0QtxSIfVuKiVP2oahFI7tk3CRSexwV+Ya6MOoTxzg9g==} + engines: {node: '>=18'} + query-string@9.3.1: resolution: {integrity: sha512-5fBfMOcDi5SA9qj5jZhWAcTtDfKF5WFdd2uD9nVNlbxVv1baq65aALy6qofpNEGELHvisjjasxQp7BlM9gvMzw==} engines: {node: '>=18'} @@ -5062,6 +5535,22 @@ packages: react-native: optional: true + react-i18next@15.7.4: + resolution: {integrity: sha512-nyU8iKNrI5uDJch0z9+Y5XEr34b0wkyYj3Rp+tfbahxtlswxSCjcUL9H0nqXo9IR3/t5Y5PKIA3fx3MfUyR9Xw==} + peerDependencies: + i18next: '>= 23.4.0' + react: '>= 16.8.0' + react-dom: '*' + react-native: '*' + typescript: ^5 + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + typescript: + optional: true + react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -5080,6 +5569,12 @@ packages: '@types/react': '>=18' react: '>=18' + react-markdown@9.1.0: + resolution: {integrity: sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + react-redux@7.2.9: resolution: {integrity: sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==} peerDependencies: @@ -5115,18 +5610,38 @@ packages: react: '>=16.8' react-dom: '>=16.8' + react-router-dom@6.30.2: + resolution: {integrity: sha512-l2OwHn3UUnEVUqc6/1VMmR1cvZryZ3j3NzapC2eUXO1dB0sYp5mvwdjiXhpUbRb21eFow3qSxpP8Yv6oAU824Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + react-router@6.27.0: resolution: {integrity: sha512-YA+HGZXz4jaAkVoYBE98VQl+nVzI+cVI2Oj/06F5ZM+0u3TgedN9Y9kmMRo2mnkSK2nCpNQn0DVob4HCsY/WLw==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' + react-router@6.30.2: + resolution: {integrity: sha512-H2Bm38Zu1bm8KUE5NVWRMzuIyAV8p/JrOaBJAwVmp37AXG72+CZJlEBw6pdn9i5TBgLMhNDgijS4ZlblpHyWTA==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-svg@16.3.0: resolution: {integrity: sha512-MvoQbITgkmpPJYwDTNdiUyoncJFfoa0D86WzoZuMQ9c/ORJURPR6rPMnXDsLOWDCAyXuV9nKZhQhGyP0HZ0MVQ==} peerDependencies: react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-window@1.8.11: + resolution: {integrity: sha512-+SRbUVT2scadgFSWx+R1P754xHPEqvcfSfVX10QYg6POOz+WNgkN48pS+BtZNIMGiL1HYrSEiCkwsMS15QogEQ==} + engines: {node: '>8.0.0'} + peerDependencies: + react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -5230,6 +5745,9 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + reselect@5.1.1: resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} @@ -5240,6 +5758,10 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -5301,6 +5823,9 @@ packages: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -5343,6 +5868,9 @@ packages: scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + secure-compare@3.0.1: + resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==} + select@1.1.2: resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==} @@ -5469,6 +5997,10 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -5595,6 +6127,11 @@ packages: stylis@4.3.6: resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + supports-color@2.0.0: resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} engines: {node: '>=0.8.0'} @@ -5631,6 +6168,17 @@ packages: resolution: {integrity: sha512-JJoOEKTfL1urb1mDoEblhD9NhEbWmq9jHEMEnxoC4ujUaZ4itA8vKgwkFAyNClgxplLi9tsUKX+EduK0p/l7sg==} engines: {node: ^14.18.0 || >=16.0.0} + tabbable@6.3.0: + resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} + + tailwind-merge@3.4.0: + resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} + + tailwindcss-animate@1.0.7: + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + tapable@2.3.0: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} @@ -5642,6 +6190,13 @@ packages: text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + throttle-debounce@5.0.2: resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} engines: {node: '>=12.22'} @@ -5696,6 +6251,10 @@ packages: resolution: {integrity: sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==} engines: {node: '>= 0.4'} + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -5718,12 +6277,34 @@ packages: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + tslib@2.3.0: resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsup@8.5.1: + resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + tsx@4.19.2: resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} engines: {node: '>=18.0.0'} @@ -5809,6 +6390,10 @@ packages: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} engines: {node: '>=0.10.0'} + union@0.5.0: + resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} + engines: {node: '>= 0.8.0'} + unist-util-find-after@5.0.0: resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} @@ -5894,6 +6479,9 @@ packages: resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} deprecated: Please see https://github.com/lydell/urix#deprecated + url-join@4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + use-debounce@10.0.4: resolution: {integrity: sha512-6Cf7Yr7Wk7Kdv77nnJMf6de4HuDE4dTxKij+RqE9rufDsI6zsbjyAxcH5y2ueJCQAnfgKbzXbZHYlkFwmBlWkw==} engines: {node: '>= 16.0.0'} @@ -6024,6 +6612,9 @@ packages: warning@4.0.3: resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + wavesurfer.js@7.12.1: + resolution: {integrity: sha512-NswPjVHxk0Q1F/VMRemCPUzSojjuHHisQrBqQiRXg7MVbe3f5vQ6r0rTTXA/a/neC/4hnOEC4YpXca4LpH0SUg==} + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -6034,6 +6625,10 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -6113,6 +6708,24 @@ packages: zrender@5.6.0: resolution: {integrity: sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==} + zustand@5.0.9: + resolution: {integrity: sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -6565,141 +7178,219 @@ snapshots: '@esbuild/aix-ppc64@0.23.1': optional: true + '@esbuild/aix-ppc64@0.27.1': + optional: true + '@esbuild/android-arm64@0.21.5': optional: true '@esbuild/android-arm64@0.23.1': optional: true + '@esbuild/android-arm64@0.27.1': + optional: true + '@esbuild/android-arm@0.21.5': optional: true '@esbuild/android-arm@0.23.1': optional: true + '@esbuild/android-arm@0.27.1': + optional: true + '@esbuild/android-x64@0.21.5': optional: true '@esbuild/android-x64@0.23.1': optional: true + '@esbuild/android-x64@0.27.1': + optional: true + '@esbuild/darwin-arm64@0.21.5': optional: true '@esbuild/darwin-arm64@0.23.1': optional: true + '@esbuild/darwin-arm64@0.27.1': + optional: true + '@esbuild/darwin-x64@0.21.5': optional: true '@esbuild/darwin-x64@0.23.1': optional: true + '@esbuild/darwin-x64@0.27.1': + optional: true + '@esbuild/freebsd-arm64@0.21.5': optional: true '@esbuild/freebsd-arm64@0.23.1': optional: true + '@esbuild/freebsd-arm64@0.27.1': + optional: true + '@esbuild/freebsd-x64@0.21.5': optional: true '@esbuild/freebsd-x64@0.23.1': optional: true + '@esbuild/freebsd-x64@0.27.1': + optional: true + '@esbuild/linux-arm64@0.21.5': optional: true '@esbuild/linux-arm64@0.23.1': optional: true + '@esbuild/linux-arm64@0.27.1': + optional: true + '@esbuild/linux-arm@0.21.5': optional: true '@esbuild/linux-arm@0.23.1': optional: true + '@esbuild/linux-arm@0.27.1': + optional: true + '@esbuild/linux-ia32@0.21.5': optional: true '@esbuild/linux-ia32@0.23.1': optional: true + '@esbuild/linux-ia32@0.27.1': + optional: true + '@esbuild/linux-loong64@0.21.5': optional: true '@esbuild/linux-loong64@0.23.1': optional: true + '@esbuild/linux-loong64@0.27.1': + optional: true + '@esbuild/linux-mips64el@0.21.5': optional: true '@esbuild/linux-mips64el@0.23.1': optional: true + '@esbuild/linux-mips64el@0.27.1': + optional: true + '@esbuild/linux-ppc64@0.21.5': optional: true '@esbuild/linux-ppc64@0.23.1': optional: true + '@esbuild/linux-ppc64@0.27.1': + optional: true + '@esbuild/linux-riscv64@0.21.5': optional: true '@esbuild/linux-riscv64@0.23.1': optional: true + '@esbuild/linux-riscv64@0.27.1': + optional: true + '@esbuild/linux-s390x@0.21.5': optional: true '@esbuild/linux-s390x@0.23.1': optional: true + '@esbuild/linux-s390x@0.27.1': + optional: true + '@esbuild/linux-x64@0.21.5': optional: true '@esbuild/linux-x64@0.23.1': optional: true + '@esbuild/linux-x64@0.27.1': + optional: true + + '@esbuild/netbsd-arm64@0.27.1': + optional: true + '@esbuild/netbsd-x64@0.21.5': optional: true '@esbuild/netbsd-x64@0.23.1': optional: true + '@esbuild/netbsd-x64@0.27.1': + optional: true + '@esbuild/openbsd-arm64@0.23.1': optional: true + '@esbuild/openbsd-arm64@0.27.1': + optional: true + '@esbuild/openbsd-x64@0.21.5': optional: true '@esbuild/openbsd-x64@0.23.1': optional: true + '@esbuild/openbsd-x64@0.27.1': + optional: true + + '@esbuild/openharmony-arm64@0.27.1': + optional: true + '@esbuild/sunos-x64@0.21.5': optional: true '@esbuild/sunos-x64@0.23.1': optional: true + '@esbuild/sunos-x64@0.27.1': + optional: true + '@esbuild/win32-arm64@0.21.5': optional: true '@esbuild/win32-arm64@0.23.1': optional: true + '@esbuild/win32-arm64@0.27.1': + optional: true + '@esbuild/win32-ia32@0.21.5': optional: true '@esbuild/win32-ia32@0.23.1': optional: true + '@esbuild/win32-ia32@0.27.1': + optional: true + '@esbuild/win32-x64@0.21.5': optional: true '@esbuild/win32-x64@0.23.1': optional: true + '@esbuild/win32-x64@0.27.1': + optional: true + '@eslint-community/eslint-utils@4.9.0(eslint@9.14.0(jiti@2.6.1))': dependencies: eslint: 9.14.0(jiti@2.6.1) @@ -6763,12 +7454,47 @@ snapshots: '@eslint/js@9.14.0': {} - '@eslint/object-schema@2.1.7': {} + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.2.8': + dependencies: + '@eslint/core': 0.13.0 + levn: 0.4.1 + + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.4': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/react-dom@2.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.7.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/react@0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/utils': 0.2.10 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tabbable: 6.3.0 + + '@floating-ui/utils@0.2.10': {} - '@eslint/plugin-kit@0.2.8': + '@headlessui/react@2.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@eslint/core': 0.13.0 - levn: 0.4.1 + '@floating-ui/react': 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/focus': 3.21.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/interactions': 3.25.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-virtual': 3.13.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + use-sync-external-store: 1.6.0(react@18.3.1) '@humanfs/core@0.19.1': {} @@ -6813,6 +7539,52 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + '@infinilabs/search-chat@1.2.52(@types/react@18.3.12)(immer@10.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)(use-sync-external-store@1.6.0(react@18.3.1))(wavesurfer.js@7.12.1)': + dependencies: + '@headlessui/react': 2.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.2.4(@types/react@18.3.12)(react@18.3.1) + '@wavesurfer/react': 1.0.12(react@18.3.1)(wavesurfer.js@7.12.1) + ahooks: 3.9.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + axios: 1.13.2 + class-variance-authority: 0.7.1 + clsx: 2.1.1 + dayjs: 1.11.13 + filesize: 10.1.6 + i18next: 23.16.8 + i18next-browser-languagedetector: 8.2.0 + lodash-es: 4.17.21 + lucide-react: 0.461.0(react@18.3.1) + mdast-util-gfm-autolink-literal: 2.0.0 + mermaid: 11.6.0 + nanoid: 5.1.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-hotkeys-hook: 4.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-i18next: 15.7.4(i18next@23.16.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + react-markdown: 9.1.0(@types/react@18.3.12)(react@18.3.1) + react-router-dom: 6.30.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-window: 1.8.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + rehype-highlight: 7.0.2 + rehype-katex: 7.0.1 + remark-breaks: 4.0.0 + remark-gfm: 4.0.1 + remark-math: 6.0.0 + tailwind-merge: 3.4.0 + tailwindcss-animate: 1.0.7 + type-fest: 4.41.0 + use-debounce: 10.0.4(react@18.3.1) + zustand: 5.0.9(@types/react@18.3.12)(immer@10.2.0)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)) + transitivePeerDependencies: + - '@types/react' + - debug + - immer + - react-native + - supports-color + - tailwindcss + - typescript + - use-sync-external-store + - wavesurfer.js + '@isaacs/balanced-match@4.0.1': {} '@isaacs/brace-expansion@5.0.0': @@ -6949,6 +7721,19 @@ snapshots: '@polka/url@1.0.0-next.29': {} + '@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.12)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-slot@1.2.4(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + '@rc-component/async-validator@5.0.4': dependencies: '@babel/runtime': 7.28.4 @@ -7017,6 +7802,55 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + '@react-aria/focus@3.21.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/interactions': 3.25.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.31.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-types/shared': 3.32.1(react@18.3.1) + '@swc/helpers': 0.5.17 + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/interactions@3.25.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/ssr': 3.9.10(react@18.3.1) + '@react-aria/utils': 3.31.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-stately/flags': 3.1.2 + '@react-types/shared': 3.32.1(react@18.3.1) + '@swc/helpers': 0.5.17 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-aria/ssr@3.9.10(react@18.3.1)': + dependencies: + '@swc/helpers': 0.5.17 + react: 18.3.1 + + '@react-aria/utils@3.31.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-aria/ssr': 3.9.10(react@18.3.1) + '@react-stately/flags': 3.1.2 + '@react-stately/utils': 3.10.8(react@18.3.1) + '@react-types/shared': 3.32.1(react@18.3.1) + '@swc/helpers': 0.5.17 + clsx: 2.1.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@react-stately/flags@3.1.2': + dependencies: + '@swc/helpers': 0.5.17 + + '@react-stately/utils@3.10.8(react@18.3.1)': + dependencies: + '@swc/helpers': 0.5.17 + react: 18.3.1 + + '@react-types/shared@3.32.1(react@18.3.1)': + dependencies: + react: 18.3.1 + '@reduxjs/toolkit@2.3.0(react-redux@9.1.2(@types/react@18.3.12)(react@18.3.1)(redux@5.0.1))(react@18.3.1)': dependencies: immer: 10.2.0 @@ -7029,6 +7863,8 @@ snapshots: '@remix-run/router@1.20.0': {} + '@remix-run/router@1.23.1': {} + '@rollup/pluginutils@5.3.0(rollup@4.52.5)': dependencies: '@types/estree': 1.0.8 @@ -7238,12 +8074,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@swc/helpers@0.5.17': + dependencies: + tslib: 2.8.1 + '@tanem/svg-injector@10.1.68': dependencies: '@babel/runtime': 7.28.4 content-type: 1.0.5 tslib: 2.8.1 + '@tanstack/react-virtual@3.13.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tanstack/virtual-core': 3.13.12 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@tanstack/virtual-core@3.13.12': {} + '@trysound/sax@0.2.0': {} '@types/babel__core@7.20.5': @@ -7411,6 +8259,8 @@ snapshots: '@types/react': 18.3.12 hoist-non-react-statics: 3.3.2 + '@types/js-cookie@3.0.6': {} + '@types/json-schema@7.0.15': {} '@types/katex@0.16.7': {} @@ -7870,6 +8720,11 @@ snapshots: '@vue/shared@3.5.24': {} + '@wavesurfer/react@1.0.12(react@18.3.1)(wavesurfer.js@7.12.1)': + dependencies: + react: 18.3.1 + wavesurfer.js: 7.12.1 + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -7893,6 +8748,21 @@ snapshots: screenfull: 5.2.0 tslib: 2.8.1 + ahooks@3.9.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.28.4 + '@types/js-cookie': 3.0.6 + dayjs: 1.11.13 + intersection-observer: 0.12.2 + js-cookie: 3.0.5 + lodash: 4.17.21 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-fast-compare: 3.2.2 + resize-observer-polyfill: 1.5.1 + screenfull: 5.2.0 + tslib: 2.8.1 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -7982,6 +8852,8 @@ snapshots: - luxon - moment + any-promise@1.3.0: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -8064,6 +8936,8 @@ snapshots: async-function@1.0.0: {} + async@3.2.6: {} + asynckit@0.4.0: {} atob@2.1.2: {} @@ -8077,6 +8951,14 @@ snapshots: axios: 1.7.7 is-retry-allowed: 2.2.0 + axios@1.13.2: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.4 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + axios@1.7.7: dependencies: follow-redirects: 1.15.11 @@ -8101,6 +8983,10 @@ snapshots: baseline-browser-mapping@2.8.25: {} + basic-auth@2.0.1: + dependencies: + safe-buffer: 5.1.2 + big.js@5.2.2: {} binary-extensions@2.3.0: {} @@ -8183,6 +9069,11 @@ snapshots: esbuild: 0.23.1 load-tsconfig: 0.2.5 + bundle-require@5.1.0(esbuild@0.27.1): + dependencies: + esbuild: 0.27.1 + load-tsconfig: 0.2.5 + c12@1.11.2: dependencies: chokidar: 3.6.0 @@ -8326,6 +9217,10 @@ snapshots: isobject: 3.0.1 static-extend: 0.1.2 + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + classnames@2.5.1: {} clean-regexp@1.0.0: @@ -8386,6 +9281,8 @@ snapshots: commander@12.1.0: {} + commander@4.1.1: {} + commander@7.2.0: {} commander@8.3.0: {} @@ -8431,6 +9328,8 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 + corser@2.0.1: {} + cose-base@1.0.3: dependencies: layout-base: 1.0.2 @@ -8989,6 +9888,15 @@ snapshots: es-toolkit@1.42.0: {} + esbuild-plugin-svgr@3.1.1(esbuild@0.21.5)(typescript@5.6.3): + dependencies: + '@svgr/core': 8.1.0(typescript@5.6.3) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.6.3)) + esbuild: 0.21.5 + transitivePeerDependencies: + - supports-color + - typescript + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -9042,6 +9950,35 @@ snapshots: '@esbuild/win32-ia32': 0.23.1 '@esbuild/win32-x64': 0.23.1 + esbuild@0.27.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.1 + '@esbuild/android-arm': 0.27.1 + '@esbuild/android-arm64': 0.27.1 + '@esbuild/android-x64': 0.27.1 + '@esbuild/darwin-arm64': 0.27.1 + '@esbuild/darwin-x64': 0.27.1 + '@esbuild/freebsd-arm64': 0.27.1 + '@esbuild/freebsd-x64': 0.27.1 + '@esbuild/linux-arm': 0.27.1 + '@esbuild/linux-arm64': 0.27.1 + '@esbuild/linux-ia32': 0.27.1 + '@esbuild/linux-loong64': 0.27.1 + '@esbuild/linux-mips64el': 0.27.1 + '@esbuild/linux-ppc64': 0.27.1 + '@esbuild/linux-riscv64': 0.27.1 + '@esbuild/linux-s390x': 0.27.1 + '@esbuild/linux-x64': 0.27.1 + '@esbuild/netbsd-arm64': 0.27.1 + '@esbuild/netbsd-x64': 0.27.1 + '@esbuild/openbsd-arm64': 0.27.1 + '@esbuild/openbsd-x64': 0.27.1 + '@esbuild/openharmony-arm64': 0.27.1 + '@esbuild/sunos-x64': 0.27.1 + '@esbuild/win32-arm64': 0.27.1 + '@esbuild/win32-ia32': 0.27.1 + '@esbuild/win32-x64': 0.27.1 + escalade@3.2.0: {} escape-string-regexp@1.0.5: {} @@ -9261,6 +10198,8 @@ snapshots: etag@1.8.1: {} + eventemitter3@4.0.7: {} + eventemitter3@5.0.1: {} execa@8.0.1: @@ -9375,6 +10314,8 @@ snapshots: dependencies: flat-cache: 4.0.1 + filesize@10.1.6: {} + fill-range@4.0.0: dependencies: extend-shallow: 2.0.1 @@ -9400,6 +10341,12 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.21 + mlly: 1.8.0 + rollup: 4.52.5 + flat-cache@4.0.1: dependencies: flatted: 3.3.3 @@ -9752,6 +10699,10 @@ snapshots: hosted-git-info@2.8.9: {} + html-encoding-sniffer@3.0.0: + dependencies: + whatwg-encoding: 2.0.0 + html-parse-stringify@3.0.1: dependencies: void-elements: 3.1.0 @@ -9769,16 +10720,51 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + http-proxy@1.18.1: + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.11 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + + http-server@14.1.1: + dependencies: + basic-auth: 2.0.1 + chalk: 4.1.2 + corser: 2.0.1 + he: 1.2.0 + html-encoding-sniffer: 3.0.0 + http-proxy: 1.18.1 + mime: 1.6.0 + minimist: 1.2.8 + opener: 1.5.2 + portfinder: 1.0.38 + secure-compare: 3.0.1 + union: 0.5.0 + url-join: 4.0.1 + transitivePeerDependencies: + - debug + - supports-color + human-signals@5.0.0: {} human-signals@7.0.0: {} human-signals@8.0.1: {} + i18next-browser-languagedetector@8.2.0: + dependencies: + '@babel/runtime': 7.28.4 + i18next@23.16.4: dependencies: '@babel/runtime': 7.28.4 + i18next@23.16.8: + dependencies: + '@babel/runtime': 7.28.4 + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 @@ -10074,6 +11060,8 @@ snapshots: jiti@2.6.1: {} + joycon@3.1.1: {} + js-base64@2.6.4: {} js-cookie@3.0.5: {} @@ -10354,6 +11342,14 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-gfm-autolink-literal@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + mdast-util-gfm-autolink-literal@2.0.1: dependencies: '@types/mdast': 4.0.4 @@ -10774,8 +11770,7 @@ snapshots: dependencies: mime-db: 1.52.0 - mime@1.6.0: - optional: true + mime@1.6.0: {} mimic-fn@4.0.0: {} @@ -10832,10 +11827,18 @@ snapshots: ms@2.1.3: {} + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + nanoid@3.3.11: {} nanoid@5.0.8: {} + nanoid@5.1.6: {} + nanomatch@1.2.13: dependencies: arr-diff: 4.0.0 @@ -10988,6 +11991,8 @@ snapshots: is-inside-container: 1.0.0 wsl-utils: 0.1.0 + opener@1.5.2: {} + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -11103,6 +12108,8 @@ snapshots: pify@4.0.1: optional: true + pirates@4.0.7: {} + pkg-types@1.3.1: dependencies: confbox: 0.1.8 @@ -11124,10 +12131,26 @@ snapshots: path-data-parser: 0.1.0 points-on-curve: 0.2.0 + portfinder@1.0.38: + dependencies: + async: 3.2.6 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + posix-character-classes@0.1.1: {} possible-typed-array-names@1.1.0: {} + postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.19.2)(yaml@2.5.1): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + jiti: 2.6.1 + postcss: 8.5.6 + tsx: 4.19.2 + yaml: 2.5.1 + postcss-modules-extract-imports@3.1.0(postcss@8.5.6): dependencies: postcss: 8.5.6 @@ -11215,6 +12238,8 @@ snapshots: dependencies: prettier: 3.3.3 + prettier@3.3.2: {} + prettier@3.3.3: {} pretty-ms@9.3.0: @@ -11254,6 +12279,12 @@ snapshots: object-assign: 4.1.1 strict-uri-encode: 1.1.0 + query-string@9.2.2: + dependencies: + decode-uri-component: 0.4.1 + filter-obj: 5.1.0 + split-on-first: 3.0.0 + query-string@9.3.1: dependencies: decode-uri-component: 0.4.1 @@ -11651,6 +12682,16 @@ snapshots: optionalDependencies: react-dom: 18.3.1(react@18.3.1) + react-i18next@15.7.4(i18next@23.16.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3): + dependencies: + '@babel/runtime': 7.28.4 + html-parse-stringify: 3.0.1 + i18next: 23.16.8 + react: 18.3.1 + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) + typescript: 5.6.3 + react-is@16.13.1: {} react-is@17.0.2: {} @@ -11677,6 +12718,24 @@ snapshots: transitivePeerDependencies: - supports-color + react-markdown@9.1.0(@types/react@18.3.12)(react@18.3.1): + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/react': 18.3.12 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.2.0 + react: 18.3.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + react-redux@7.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.28.4 @@ -11707,11 +12766,23 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-router: 6.27.0(react@18.3.1) + react-router-dom@6.30.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@remix-run/router': 1.23.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.30.2(react@18.3.1) + react-router@6.27.0(react@18.3.1): dependencies: '@remix-run/router': 1.20.0 react: 18.3.1 + react-router@6.30.2(react@18.3.1): + dependencies: + '@remix-run/router': 1.23.1 + react: 18.3.1 + react-svg@16.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.28.4 @@ -11721,6 +12792,13 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + react-window@1.8.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.28.4 + memoize-one: 5.2.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -11883,12 +12961,16 @@ snapshots: require-directory@2.1.1: {} + requires-port@1.0.0: {} + reselect@5.1.1: {} resize-observer-polyfill@1.5.1: {} resolve-from@4.0.0: {} + resolve-from@5.0.0: {} + resolve-pkg-maps@1.0.0: {} resolve-url@0.2.1: {} @@ -11974,6 +13056,8 @@ snapshots: has-symbols: 1.1.0 isarray: 2.0.5 + safe-buffer@5.1.2: {} + safe-buffer@5.2.1: {} safe-push-apply@1.0.0: @@ -12018,6 +13102,8 @@ snapshots: scule@1.3.0: {} + secure-compare@3.0.1: {} + select@1.1.2: {} semver@5.7.2: {} @@ -12167,6 +13253,8 @@ snapshots: source-map@0.6.1: {} + source-map@0.7.6: {} + space-separated-tokens@2.0.2: {} spdx-correct@3.2.0: @@ -12316,6 +13404,16 @@ snapshots: stylis@4.3.6: {} + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.15 + ts-interface-checker: 0.1.13 + supports-color@2.0.0: {} supports-color@3.2.3: @@ -12369,6 +13467,12 @@ snapshots: '@pkgr/core': 0.1.2 tslib: 2.8.1 + tabbable@6.3.0: {} + + tailwind-merge@3.4.0: {} + + tailwindcss-animate@1.0.7: {} + tapable@2.3.0: {} tar@6.2.1: @@ -12382,6 +13486,14 @@ snapshots: text-table@0.2.0: {} + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + throttle-debounce@5.0.2: {} tiny-emitter@2.1.0: {} @@ -12434,6 +13546,8 @@ snapshots: typedarray.prototype.slice: 1.0.5 which-typed-array: 1.1.19 + tree-kill@1.2.2: {} + trim-lines@3.0.1: {} trough@2.2.0: {} @@ -12448,10 +13562,40 @@ snapshots: ts-dedent@2.2.0: {} + ts-interface-checker@0.1.13: {} + tslib@2.3.0: {} tslib@2.8.1: {} + tsup@8.5.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.5.1): + dependencies: + bundle-require: 5.1.0(esbuild@0.27.1) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.3 + esbuild: 0.27.1 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.19.2)(yaml@2.5.1) + resolve-from: 5.0.0 + rollup: 4.52.5 + source-map: 0.7.6 + sucrase: 3.35.1 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.6 + typescript: 5.6.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + tsx@4.19.2: dependencies: esbuild: 0.23.1 @@ -12594,6 +13738,10 @@ snapshots: is-extendable: 0.1.1 set-value: 2.0.1 + union@0.5.0: + dependencies: + qs: 6.13.0 + unist-util-find-after@5.0.0: dependencies: '@types/unist': 3.0.3 @@ -12686,6 +13834,8 @@ snapshots: urix@0.1.0: {} + url-join@4.0.1: {} + use-debounce@10.0.4(react@18.3.1): dependencies: react: 18.3.1 @@ -12808,12 +13958,18 @@ snapshots: dependencies: loose-envify: 1.4.0 + wavesurfer.js@7.12.1: {} + web-namespaces@2.0.1: {} webpack-sources@3.3.3: {} webpack-virtual-modules@0.6.2: {} + whatwg-encoding@2.0.0: + dependencies: + iconv-lite: 0.6.3 + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -12915,4 +14071,11 @@ snapshots: dependencies: tslib: 2.3.0 + zustand@5.0.9(@types/react@18.3.12)(immer@10.2.0)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)): + optionalDependencies: + '@types/react': 18.3.12 + immer: 10.2.0 + react: 18.3.1 + use-sync-external-store: 1.6.0(react@18.3.1) + zwitch@2.0.4: {}