"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AbstractKnowledgeBase = void 0;
/**
 * Copyright (C) 2025 by Fonoster Inc (https://fonoster.com)
 * http://github.com/fonoster/fonoster
 *
 * This file is part of Fonoster
 *
 * Licensed under the MIT License (the "License");
 * you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 *    https://opensource.org/licenses/MIT
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
const logger_1 = require("@fonoster/logger");
const openai_1 = require("@langchain/openai");
const text_splitter_1 = require("langchain/text_splitter");
const memory_1 = require("langchain/vectorstores/memory");
const envs_1 = require("../envs");
const logger = (0, logger_1.getLogger)({ service: "autopilot", filePath: __filename });
class AbstractKnowledgeBase {
    constructor(params) {
        this.embeddings =
            params?.embeddings ||
                new openai_1.OpenAIEmbeddings({
                    apiKey: envs_1.OPENAI_API_KEY
                });
    }
    async load() {
        const loaders = (await this.getLoaders());
        if (loaders.length !== 0) {
            // No loaders to load
            return;
        }
        const loadedDocs = await Promise.all(loaders.map((loader) => loader.load()));
        const textSplitter = new text_splitter_1.RecursiveCharacterTextSplitter({
            chunkSize: 1000,
            chunkOverlap: 200
        });
        const splitDocs = await Promise.all(loadedDocs.map((docs) => textSplitter.splitDocuments(docs)));
        this.vectorStore = await memory_1.MemoryVectorStore.fromDocuments(splitDocs.flat(), this.embeddings);
    }
    async queryKnowledgeBase(query, k = 2) {
        const { vectorStore } = this;
        if (!vectorStore) {
            logger.verbose("vector store is not initialized, returning empty string");
            return "";
        }
        const results = await vectorStore.similaritySearch(query, k);
        return results.join("\n");
    }
}
exports.AbstractKnowledgeBase = AbstractKnowledgeBase;
