node-llama-cpp 3.0.0-beta.9 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -27
- package/bins/_linux-arm64.moved.txt +1 -0
- package/bins/_linux-armv7l.moved.txt +1 -0
- package/bins/_linux-x64-cuda.moved.txt +1 -0
- package/bins/_linux-x64-vulkan.moved.txt +1 -0
- package/bins/_linux-x64.moved.txt +1 -0
- package/bins/_mac-arm64-metal.moved.txt +1 -0
- package/bins/_mac-x64.moved.txt +1 -0
- package/bins/_win-arm64.moved.txt +1 -0
- package/bins/_win-x64-cuda.moved.txt +1 -0
- package/bins/_win-x64-vulkan.moved.txt +1 -0
- package/bins/_win-x64.moved.txt +1 -0
- package/dist/ChatWrapper.d.ts +19 -39
- package/dist/ChatWrapper.js +129 -72
- package/dist/ChatWrapper.js.map +1 -1
- package/dist/apiDocsIndex.d.ts +1 -0
- package/dist/apiDocsIndex.js +7 -0
- package/dist/apiDocsIndex.js.map +1 -0
- package/dist/bindings/AddonTypes.d.ts +88 -20
- package/dist/bindings/Llama.d.ts +43 -3
- package/dist/bindings/Llama.js +193 -23
- package/dist/bindings/Llama.js.map +1 -1
- package/dist/bindings/consts.d.ts +2 -0
- package/dist/bindings/consts.js +13 -0
- package/dist/bindings/consts.js.map +1 -0
- package/dist/bindings/getLlama.d.ts +123 -18
- package/dist/bindings/getLlama.js +264 -75
- package/dist/bindings/getLlama.js.map +1 -1
- package/dist/bindings/types.d.ts +29 -5
- package/dist/bindings/types.js +51 -2
- package/dist/bindings/types.js.map +1 -1
- package/dist/bindings/utils/MemoryOrchestrator.d.ts +21 -0
- package/dist/bindings/utils/MemoryOrchestrator.js +49 -0
- package/dist/bindings/utils/MemoryOrchestrator.js.map +1 -0
- package/dist/bindings/utils/asyncEvery.d.ts +5 -0
- package/dist/bindings/utils/asyncEvery.js +15 -0
- package/dist/bindings/utils/asyncEvery.js.map +1 -0
- package/dist/bindings/utils/asyncSome.d.ts +5 -0
- package/dist/bindings/utils/asyncSome.js +27 -0
- package/dist/bindings/utils/asyncSome.js.map +1 -0
- package/dist/bindings/utils/clearAllLocalBuilds.js.map +1 -1
- package/dist/bindings/utils/cloneLlamaCppRepo.d.ts +1 -1
- package/dist/bindings/utils/cloneLlamaCppRepo.js +39 -28
- package/dist/bindings/utils/cloneLlamaCppRepo.js.map +1 -1
- package/dist/bindings/utils/compileLLamaCpp.d.ts +11 -3
- package/dist/bindings/utils/compileLLamaCpp.js +250 -81
- package/dist/bindings/utils/compileLLamaCpp.js.map +1 -1
- package/dist/bindings/utils/detectAvailableComputeLayers.d.ts +14 -0
- package/dist/bindings/utils/detectAvailableComputeLayers.js +305 -0
- package/dist/bindings/utils/detectAvailableComputeLayers.js.map +1 -0
- package/dist/bindings/utils/detectGlibc.d.ts +4 -0
- package/dist/bindings/utils/detectGlibc.js +46 -0
- package/dist/bindings/utils/detectGlibc.js.map +1 -0
- package/dist/bindings/utils/getBestComputeLayersAvailable.d.ts +9 -0
- package/dist/bindings/utils/getBestComputeLayersAvailable.js +29 -0
- package/dist/bindings/utils/getBestComputeLayersAvailable.js.map +1 -0
- package/dist/bindings/utils/getBuildFolderNameForBuildOptions.js +14 -6
- package/dist/bindings/utils/getBuildFolderNameForBuildOptions.js.map +1 -1
- package/dist/bindings/utils/getExampleUsageCodeOfGetLlama.js.map +1 -1
- package/dist/bindings/utils/getGpuTypesToUseForOption.d.ts +12 -0
- package/dist/bindings/utils/getGpuTypesToUseForOption.js +39 -0
- package/dist/bindings/utils/getGpuTypesToUseForOption.js.map +1 -0
- package/dist/bindings/utils/getLinuxDistroInfo.d.ts +9 -0
- package/dist/bindings/utils/getLinuxDistroInfo.js +46 -0
- package/dist/bindings/utils/getLinuxDistroInfo.js.map +1 -0
- package/dist/bindings/utils/getLlamaWithoutBackend.d.ts +5 -0
- package/dist/bindings/utils/getLlamaWithoutBackend.js +27 -0
- package/dist/bindings/utils/getLlamaWithoutBackend.js.map +1 -0
- package/dist/bindings/utils/getPlatform.js.map +1 -1
- package/dist/bindings/utils/getPlatformInfo.d.ts +5 -0
- package/dist/bindings/utils/getPlatformInfo.js +28 -0
- package/dist/bindings/utils/getPlatformInfo.js.map +1 -0
- package/dist/bindings/utils/hasBuildingFromSourceDependenciesInstalled.d.ts +3 -0
- package/dist/bindings/utils/hasBuildingFromSourceDependenciesInstalled.js +27 -0
- package/dist/bindings/utils/hasBuildingFromSourceDependenciesInstalled.js.map +1 -0
- package/dist/bindings/utils/hasFileInPath.d.ts +2 -0
- package/dist/bindings/utils/hasFileInPath.js +34 -0
- package/dist/bindings/utils/hasFileInPath.js.map +1 -0
- package/dist/bindings/utils/lastBuildInfo.js.map +1 -1
- package/dist/bindings/utils/logBinaryUsageExampleToConsole.d.ts +1 -1
- package/dist/bindings/utils/logBinaryUsageExampleToConsole.js +3 -9
- package/dist/bindings/utils/logBinaryUsageExampleToConsole.js.map +1 -1
- package/dist/bindings/utils/logDistroInstallInstruction.d.ts +14 -0
- package/dist/bindings/utils/logDistroInstallInstruction.js +48 -0
- package/dist/bindings/utils/logDistroInstallInstruction.js.map +1 -0
- package/dist/bindings/utils/resolveCustomCmakeOptions.js +26 -26
- package/dist/bindings/utils/resolveCustomCmakeOptions.js.map +1 -1
- package/dist/bindings/utils/testBindingBinary.d.ts +1 -0
- package/dist/bindings/utils/testBindingBinary.js +100 -0
- package/dist/bindings/utils/testBindingBinary.js.map +1 -0
- package/dist/bindings/utils/testCmakeBinary.d.ts +5 -0
- package/dist/bindings/utils/testCmakeBinary.js +32 -0
- package/dist/bindings/utils/testCmakeBinary.js.map +1 -0
- package/dist/chatWrappers/AlpacaChatWrapper.d.ts +2 -1
- package/dist/chatWrappers/AlpacaChatWrapper.js +10 -2
- package/dist/chatWrappers/AlpacaChatWrapper.js.map +1 -1
- package/dist/chatWrappers/ChatMLChatWrapper.d.ts +2 -14
- package/dist/chatWrappers/ChatMLChatWrapper.js +23 -21
- package/dist/chatWrappers/ChatMLChatWrapper.js.map +1 -1
- package/dist/chatWrappers/FalconChatWrapper.d.ts +4 -10
- package/dist/chatWrappers/FalconChatWrapper.js +39 -21
- package/dist/chatWrappers/FalconChatWrapper.js.map +1 -1
- package/dist/chatWrappers/FunctionaryChatWrapper.d.ts +8 -32
- package/dist/chatWrappers/FunctionaryChatWrapper.js +514 -118
- package/dist/chatWrappers/FunctionaryChatWrapper.js.map +1 -1
- package/dist/chatWrappers/GemmaChatWrapper.d.ts +7 -0
- package/dist/chatWrappers/GemmaChatWrapper.js +96 -0
- package/dist/chatWrappers/GemmaChatWrapper.js.map +1 -0
- package/dist/chatWrappers/GeneralChatWrapper.d.ts +4 -10
- package/dist/chatWrappers/GeneralChatWrapper.js +46 -22
- package/dist/chatWrappers/GeneralChatWrapper.js.map +1 -1
- package/dist/chatWrappers/Llama2ChatWrapper.d.ts +12 -0
- package/dist/chatWrappers/{LlamaChatWrapper.js → Llama2ChatWrapper.js} +37 -20
- package/dist/chatWrappers/Llama2ChatWrapper.js.map +1 -0
- package/dist/chatWrappers/Llama3ChatWrapper.d.ts +16 -0
- package/dist/chatWrappers/Llama3ChatWrapper.js +173 -0
- package/dist/chatWrappers/Llama3ChatWrapper.js.map +1 -0
- package/dist/chatWrappers/Llama3_1ChatWrapper.d.ts +35 -0
- package/dist/chatWrappers/Llama3_1ChatWrapper.js +277 -0
- package/dist/chatWrappers/Llama3_1ChatWrapper.js.map +1 -0
- package/dist/chatWrappers/MistralChatWrapper.d.ts +15 -0
- package/dist/chatWrappers/MistralChatWrapper.js +169 -0
- package/dist/chatWrappers/MistralChatWrapper.js.map +1 -0
- package/dist/chatWrappers/generic/JinjaTemplateChatWrapper.d.ts +100 -0
- package/dist/chatWrappers/generic/JinjaTemplateChatWrapper.js +409 -0
- package/dist/chatWrappers/generic/JinjaTemplateChatWrapper.js.map +1 -0
- package/dist/chatWrappers/generic/TemplateChatWrapper.d.ts +60 -0
- package/dist/chatWrappers/generic/TemplateChatWrapper.js +204 -0
- package/dist/chatWrappers/generic/TemplateChatWrapper.js.map +1 -0
- package/dist/chatWrappers/generic/utils/chatHistoryFunctionCallMessageTemplate.d.ts +23 -0
- package/dist/chatWrappers/generic/utils/chatHistoryFunctionCallMessageTemplate.js +45 -0
- package/dist/chatWrappers/generic/utils/chatHistoryFunctionCallMessageTemplate.js.map +1 -0
- package/dist/chatWrappers/utils/ChatModelFunctionsDocumentationGenerator.d.ts +57 -0
- package/dist/chatWrappers/utils/ChatModelFunctionsDocumentationGenerator.js +119 -0
- package/dist/chatWrappers/utils/ChatModelFunctionsDocumentationGenerator.js.map +1 -0
- package/dist/chatWrappers/utils/chunkChatItems.d.ts +10 -0
- package/dist/chatWrappers/utils/chunkChatItems.js +44 -0
- package/dist/chatWrappers/utils/chunkChatItems.js.map +1 -0
- package/dist/chatWrappers/utils/isJinjaTemplateEquivalentToSpecializedChatWrapper.d.ts +4 -0
- package/dist/chatWrappers/utils/isJinjaTemplateEquivalentToSpecializedChatWrapper.js +221 -0
- package/dist/chatWrappers/utils/isJinjaTemplateEquivalentToSpecializedChatWrapper.js.map +1 -0
- package/dist/chatWrappers/utils/jsonDumps.d.ts +7 -0
- package/dist/chatWrappers/utils/jsonDumps.js +18 -0
- package/dist/chatWrappers/utils/jsonDumps.js.map +1 -0
- package/dist/chatWrappers/utils/resolveChatWrapper.d.ts +95 -0
- package/dist/chatWrappers/utils/resolveChatWrapper.js +335 -0
- package/dist/chatWrappers/utils/resolveChatWrapper.js.map +1 -0
- package/dist/cli/cli.js +19 -11
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/commands/ChatCommand.d.ts +16 -7
- package/dist/cli/commands/ChatCommand.js +321 -190
- package/dist/cli/commands/ChatCommand.js.map +1 -1
- package/dist/cli/commands/CompleteCommand.d.ts +31 -0
- package/dist/cli/commands/CompleteCommand.js +402 -0
- package/dist/cli/commands/CompleteCommand.js.map +1 -0
- package/dist/cli/commands/DebugCommand.d.ts +7 -0
- package/dist/cli/commands/DebugCommand.js +54 -0
- package/dist/cli/commands/DebugCommand.js.map +1 -0
- package/dist/cli/commands/InfillCommand.d.ts +33 -0
- package/dist/cli/commands/InfillCommand.js +438 -0
- package/dist/cli/commands/InfillCommand.js.map +1 -0
- package/dist/cli/commands/InitCommand.d.ts +11 -0
- package/dist/cli/commands/InitCommand.js +195 -0
- package/dist/cli/commands/InitCommand.js.map +1 -0
- package/dist/cli/commands/OnPostInstallCommand.js +6 -2
- package/dist/cli/commands/OnPostInstallCommand.js.map +1 -1
- package/dist/cli/commands/PullCommand.d.ts +13 -0
- package/dist/cli/commands/PullCommand.js +158 -0
- package/dist/cli/commands/PullCommand.js.map +1 -0
- package/dist/cli/commands/inspect/InspectCommand.d.ts +4 -0
- package/dist/cli/commands/inspect/InspectCommand.js +21 -0
- package/dist/cli/commands/inspect/InspectCommand.js.map +1 -0
- package/dist/cli/commands/inspect/commands/InspectEstimateCommand.d.ts +12 -0
- package/dist/cli/commands/inspect/commands/InspectEstimateCommand.js +225 -0
- package/dist/cli/commands/inspect/commands/InspectEstimateCommand.js.map +1 -0
- package/dist/cli/commands/inspect/commands/InspectGgufCommand.d.ts +12 -0
- package/dist/cli/commands/inspect/commands/InspectGgufCommand.js +149 -0
- package/dist/cli/commands/inspect/commands/InspectGgufCommand.js.map +1 -0
- package/dist/cli/commands/inspect/commands/InspectGpuCommand.d.ts +4 -0
- package/dist/cli/commands/inspect/commands/InspectGpuCommand.js +202 -0
- package/dist/cli/commands/inspect/commands/InspectGpuCommand.js.map +1 -0
- package/dist/cli/commands/inspect/commands/InspectMeasureCommand.d.ts +18 -0
- package/dist/cli/commands/inspect/commands/InspectMeasureCommand.js +629 -0
- package/dist/cli/commands/inspect/commands/InspectMeasureCommand.js.map +1 -0
- package/dist/cli/commands/source/SourceCommand.d.ts +4 -0
- package/dist/cli/commands/source/SourceCommand.js +19 -0
- package/dist/cli/commands/source/SourceCommand.js.map +1 -0
- package/dist/cli/commands/source/commands/BuildCommand.d.ts +16 -0
- package/dist/cli/commands/source/commands/BuildCommand.js +148 -0
- package/dist/cli/commands/source/commands/BuildCommand.js.map +1 -0
- package/dist/cli/commands/{ClearCommand.d.ts → source/commands/ClearCommand.d.ts} +1 -1
- package/dist/cli/commands/{ClearCommand.js → source/commands/ClearCommand.js} +11 -10
- package/dist/cli/commands/source/commands/ClearCommand.js.map +1 -0
- package/dist/cli/commands/{DownloadCommand.d.ts → source/commands/DownloadCommand.d.ts} +5 -4
- package/dist/cli/commands/source/commands/DownloadCommand.js +217 -0
- package/dist/cli/commands/source/commands/DownloadCommand.js.map +1 -0
- package/dist/cli/projectTemplates.d.ts +7 -0
- package/dist/cli/projectTemplates.js +10 -0
- package/dist/cli/projectTemplates.js.map +1 -0
- package/dist/cli/recommendedModels.d.ts +2 -0
- package/dist/cli/recommendedModels.js +585 -0
- package/dist/cli/recommendedModels.js.map +1 -0
- package/dist/cli/startCreateCli.d.ts +2 -0
- package/dist/cli/startCreateCli.js +26 -0
- package/dist/cli/startCreateCli.js.map +1 -0
- package/dist/cli/utils/ConsoleInteraction.d.ts +22 -0
- package/dist/cli/utils/ConsoleInteraction.js +122 -0
- package/dist/cli/utils/ConsoleInteraction.js.map +1 -0
- package/dist/cli/utils/ConsoleTable.d.ts +23 -0
- package/dist/cli/utils/ConsoleTable.js +86 -0
- package/dist/cli/utils/ConsoleTable.js.map +1 -0
- package/dist/cli/utils/basicChooseFromListConsoleInteraction.d.ts +13 -0
- package/dist/cli/utils/basicChooseFromListConsoleInteraction.js +111 -0
- package/dist/cli/utils/basicChooseFromListConsoleInteraction.js.map +1 -0
- package/dist/cli/utils/consolePromptQuestion.d.ts +6 -0
- package/dist/cli/utils/consolePromptQuestion.js +82 -0
- package/dist/cli/utils/consolePromptQuestion.js.map +1 -0
- package/dist/cli/utils/getReadablePath.d.ts +1 -0
- package/dist/cli/utils/getReadablePath.js +14 -0
- package/dist/cli/utils/getReadablePath.js.map +1 -0
- package/dist/cli/utils/interactivelyAskForModel.d.ts +8 -0
- package/dist/cli/utils/interactivelyAskForModel.js +450 -0
- package/dist/cli/utils/interactivelyAskForModel.js.map +1 -0
- package/dist/cli/utils/logUsedGpuTypeOption.d.ts +2 -0
- package/dist/cli/utils/logUsedGpuTypeOption.js +9 -0
- package/dist/cli/utils/logUsedGpuTypeOption.js.map +1 -0
- package/dist/cli/utils/printCommonInfoLines.d.ts +9 -0
- package/dist/cli/utils/printCommonInfoLines.js +82 -0
- package/dist/cli/utils/printCommonInfoLines.js.map +1 -0
- package/dist/cli/utils/printInfoLine.d.ts +12 -0
- package/dist/cli/utils/printInfoLine.js +54 -0
- package/dist/cli/utils/printInfoLine.js.map +1 -0
- package/dist/cli/utils/projectTemplates.d.ts +19 -0
- package/dist/cli/utils/projectTemplates.js +47 -0
- package/dist/cli/utils/projectTemplates.js.map +1 -0
- package/dist/cli/utils/renderModelCompatibilityPercentageWithColors.d.ts +6 -0
- package/dist/cli/utils/renderModelCompatibilityPercentageWithColors.js +14 -0
- package/dist/cli/utils/renderModelCompatibilityPercentageWithColors.js.map +1 -0
- package/dist/cli/utils/resolveCommandGgufPath.d.ts +5 -0
- package/dist/cli/utils/resolveCommandGgufPath.js +72 -0
- package/dist/cli/utils/resolveCommandGgufPath.js.map +1 -0
- package/dist/cli/utils/resolveHeaderFlag.d.ts +1 -0
- package/dist/cli/utils/resolveHeaderFlag.js +21 -0
- package/dist/cli/utils/resolveHeaderFlag.js.map +1 -0
- package/dist/cli/utils/resolveModelRecommendationFileOptions.d.ts +19 -0
- package/dist/cli/utils/resolveModelRecommendationFileOptions.js +7 -0
- package/dist/cli/utils/resolveModelRecommendationFileOptions.js.map +1 -0
- package/dist/cli/utils/splitAnsiToLines.d.ts +1 -0
- package/dist/cli/utils/splitAnsiToLines.js +32 -0
- package/dist/cli/utils/splitAnsiToLines.js.map +1 -0
- package/dist/cli/utils/withCliCommandDescriptionDocsUrl.d.ts +2 -0
- package/dist/cli/utils/withCliCommandDescriptionDocsUrl.js +23 -0
- package/dist/cli/utils/withCliCommandDescriptionDocsUrl.js.map +1 -0
- package/dist/commands.d.ts +4 -3
- package/dist/commands.js +6 -3
- package/dist/commands.js.map +1 -1
- package/dist/config.d.ts +35 -4
- package/dist/config.js +58 -17
- package/dist/config.js.map +1 -1
- package/dist/consts.d.ts +4 -0
- package/dist/consts.js +11 -0
- package/dist/consts.js.map +1 -0
- package/dist/evaluator/LlamaChat/LlamaChat.d.ts +151 -41
- package/dist/evaluator/LlamaChat/LlamaChat.js +1289 -437
- package/dist/evaluator/LlamaChat/LlamaChat.js.map +1 -1
- package/dist/evaluator/LlamaChat/utils/FunctionCallNameGrammar.d.ts +11 -0
- package/dist/evaluator/LlamaChat/utils/FunctionCallNameGrammar.js +55 -0
- package/dist/evaluator/LlamaChat/utils/FunctionCallNameGrammar.js.map +1 -0
- package/dist/evaluator/LlamaChat/utils/FunctionCallParamsGrammar.d.ts +16 -0
- package/dist/evaluator/LlamaChat/utils/FunctionCallParamsGrammar.js +45 -0
- package/dist/evaluator/LlamaChat/utils/FunctionCallParamsGrammar.js.map +1 -0
- package/dist/evaluator/LlamaChat/utils/LlamaFunctionCallValidationError.d.ts +8 -0
- package/dist/evaluator/LlamaChat/utils/LlamaFunctionCallValidationError.js +12 -0
- package/dist/evaluator/LlamaChat/utils/LlamaFunctionCallValidationError.js.map +1 -0
- package/dist/evaluator/LlamaChat/utils/contextShiftStrategies/eraseFirstResponseAndKeepFirstSystemChatContextShiftStrategy.js +27 -17
- package/dist/evaluator/LlamaChat/utils/contextShiftStrategies/eraseFirstResponseAndKeepFirstSystemChatContextShiftStrategy.js.map +1 -1
- package/dist/evaluator/LlamaChatSession/LlamaChatSession.d.ts +187 -13
- package/dist/evaluator/LlamaChatSession/LlamaChatSession.js +280 -53
- package/dist/evaluator/LlamaChatSession/LlamaChatSession.js.map +1 -1
- package/dist/evaluator/LlamaChatSession/utils/LlamaChatSessionPromptCompletionEngine.d.ts +40 -0
- package/dist/evaluator/LlamaChatSession/utils/LlamaChatSessionPromptCompletionEngine.js +186 -0
- package/dist/evaluator/LlamaChatSession/utils/LlamaChatSessionPromptCompletionEngine.js.map +1 -0
- package/dist/evaluator/LlamaChatSession/utils/defineChatSessionFunction.d.ts +10 -2
- package/dist/evaluator/LlamaChatSession/utils/defineChatSessionFunction.js +8 -0
- package/dist/evaluator/LlamaChatSession/utils/defineChatSessionFunction.js.map +1 -1
- package/dist/evaluator/LlamaCompletion.d.ts +168 -0
- package/dist/evaluator/LlamaCompletion.js +470 -0
- package/dist/evaluator/LlamaCompletion.js.map +1 -0
- package/dist/evaluator/LlamaContext/LlamaContext.d.ts +62 -21
- package/dist/evaluator/LlamaContext/LlamaContext.js +501 -120
- package/dist/evaluator/LlamaContext/LlamaContext.js.map +1 -1
- package/dist/evaluator/LlamaContext/LlamaSampler.d.ts +1 -0
- package/dist/evaluator/LlamaContext/LlamaSampler.js +31 -0
- package/dist/evaluator/LlamaContext/LlamaSampler.js.map +1 -0
- package/dist/evaluator/LlamaContext/types.d.ts +177 -16
- package/dist/evaluator/LlamaContext/utils/batchItemsPrioritizationStrategies/firstInFirstOutStrategy.js.map +1 -0
- package/dist/evaluator/LlamaContext/utils/batchItemsPrioritizationStrategies/maximumParallelismStrategy.js.map +1 -0
- package/dist/evaluator/LlamaContext/utils/resolveBatchItemsPrioritizationStrategy.d.ts +2 -0
- package/dist/evaluator/LlamaContext/utils/{resolveBatchItemsPrioritizingStrategy.js → resolveBatchItemsPrioritizationStrategy.js} +5 -5
- package/dist/evaluator/LlamaContext/utils/resolveBatchItemsPrioritizationStrategy.js.map +1 -0
- package/dist/evaluator/LlamaEmbedding.d.ts +21 -0
- package/dist/evaluator/LlamaEmbedding.js +53 -0
- package/dist/evaluator/LlamaEmbedding.js.map +1 -0
- package/dist/evaluator/LlamaEmbeddingContext.d.ts +29 -19
- package/dist/evaluator/LlamaEmbeddingContext.js +36 -43
- package/dist/evaluator/LlamaEmbeddingContext.js.map +1 -1
- package/dist/evaluator/LlamaGrammar.d.ts +16 -13
- package/dist/evaluator/LlamaGrammar.js +17 -10
- package/dist/evaluator/LlamaGrammar.js.map +1 -1
- package/dist/evaluator/LlamaGrammarEvaluationState.d.ts +7 -3
- package/dist/evaluator/LlamaGrammarEvaluationState.js +8 -4
- package/dist/evaluator/LlamaGrammarEvaluationState.js.map +1 -1
- package/dist/evaluator/LlamaJsonSchemaGrammar.d.ts +3 -0
- package/dist/evaluator/LlamaJsonSchemaGrammar.js +5 -3
- package/dist/evaluator/LlamaJsonSchemaGrammar.js.map +1 -1
- package/dist/evaluator/LlamaModel/LlamaModel.d.ts +255 -0
- package/dist/evaluator/LlamaModel/LlamaModel.js +780 -0
- package/dist/evaluator/LlamaModel/LlamaModel.js.map +1 -0
- package/dist/evaluator/LlamaModel/utils/TokenAttributes.d.ts +29 -0
- package/dist/evaluator/LlamaModel/utils/TokenAttributes.js +65 -0
- package/dist/evaluator/LlamaModel/utils/TokenAttributes.js.map +1 -0
- package/dist/evaluator/TokenBias.d.ts +34 -0
- package/dist/evaluator/TokenBias.js +65 -0
- package/dist/evaluator/TokenBias.js.map +1 -0
- package/dist/evaluator/TokenMeter.d.ts +45 -0
- package/dist/evaluator/TokenMeter.js +74 -0
- package/dist/evaluator/TokenMeter.js.map +1 -0
- package/dist/gguf/consts.d.ts +4 -0
- package/dist/gguf/consts.js +12 -0
- package/dist/gguf/consts.js.map +1 -0
- package/dist/gguf/errors/InvalidGgufMagicError.d.ts +3 -0
- package/dist/gguf/errors/InvalidGgufMagicError.js +6 -0
- package/dist/gguf/errors/InvalidGgufMagicError.js.map +1 -0
- package/dist/gguf/errors/UnsupportedGgufValueTypeError.d.ts +4 -0
- package/dist/gguf/errors/UnsupportedGgufValueTypeError.js +9 -0
- package/dist/gguf/errors/UnsupportedGgufValueTypeError.js.map +1 -0
- package/dist/gguf/fileReaders/GgufFileReader.d.ts +36 -0
- package/dist/gguf/fileReaders/GgufFileReader.js +109 -0
- package/dist/gguf/fileReaders/GgufFileReader.js.map +1 -0
- package/dist/gguf/fileReaders/GgufFsFileReader.d.ts +16 -0
- package/dist/gguf/fileReaders/GgufFsFileReader.js +62 -0
- package/dist/gguf/fileReaders/GgufFsFileReader.js.map +1 -0
- package/dist/gguf/fileReaders/GgufNetworkFetchFileReader.d.ts +25 -0
- package/dist/gguf/fileReaders/GgufNetworkFetchFileReader.js +92 -0
- package/dist/gguf/fileReaders/GgufNetworkFetchFileReader.js.map +1 -0
- package/dist/gguf/insights/GgufInsights.d.ts +50 -0
- package/dist/gguf/insights/GgufInsights.js +401 -0
- package/dist/gguf/insights/GgufInsights.js.map +1 -0
- package/dist/gguf/insights/GgufInsightsConfigurationResolver.d.ts +146 -0
- package/dist/gguf/insights/GgufInsightsConfigurationResolver.js +226 -0
- package/dist/gguf/insights/GgufInsightsConfigurationResolver.js.map +1 -0
- package/dist/gguf/insights/utils/resolveContextContextSizeOption.d.ts +19 -0
- package/dist/gguf/insights/utils/resolveContextContextSizeOption.js +78 -0
- package/dist/gguf/insights/utils/resolveContextContextSizeOption.js.map +1 -0
- package/dist/gguf/insights/utils/resolveModelGpuLayersOption.d.ts +15 -0
- package/dist/gguf/insights/utils/resolveModelGpuLayersOption.js +183 -0
- package/dist/gguf/insights/utils/resolveModelGpuLayersOption.js.map +1 -0
- package/dist/gguf/insights/utils/scoreLevels.d.ts +5 -0
- package/dist/gguf/insights/utils/scoreLevels.js +16 -0
- package/dist/gguf/insights/utils/scoreLevels.js.map +1 -0
- package/dist/gguf/parser/GgufV2Parser.d.ts +20 -0
- package/dist/gguf/parser/GgufV2Parser.js +156 -0
- package/dist/gguf/parser/GgufV2Parser.js.map +1 -0
- package/dist/gguf/parser/GgufV3Parser.d.ts +3 -0
- package/dist/gguf/parser/GgufV3Parser.js +4 -0
- package/dist/gguf/parser/GgufV3Parser.js.map +1 -0
- package/dist/gguf/parser/parseGguf.d.ts +8 -0
- package/dist/gguf/parser/parseGguf.js +61 -0
- package/dist/gguf/parser/parseGguf.js.map +1 -0
- package/dist/gguf/readGgufFileInfo.d.ts +45 -0
- package/dist/gguf/readGgufFileInfo.js +71 -0
- package/dist/gguf/readGgufFileInfo.js.map +1 -0
- package/dist/gguf/types/GgufFileInfoTypes.d.ts +84 -0
- package/dist/gguf/types/GgufFileInfoTypes.js +18 -0
- package/dist/gguf/types/GgufFileInfoTypes.js.map +1 -0
- package/dist/gguf/types/GgufMetadataTypes.d.ts +372 -0
- package/dist/gguf/types/GgufMetadataTypes.js +114 -0
- package/dist/gguf/types/GgufMetadataTypes.js.map +1 -0
- package/dist/gguf/types/GgufTensorInfoTypes.d.ts +37 -0
- package/dist/gguf/types/GgufTensorInfoTypes.js +33 -0
- package/dist/gguf/types/GgufTensorInfoTypes.js.map +1 -0
- package/dist/gguf/utils/GgufReadOffset.d.ts +6 -0
- package/dist/gguf/utils/GgufReadOffset.js +18 -0
- package/dist/gguf/utils/GgufReadOffset.js.map +1 -0
- package/dist/gguf/utils/convertMetadataKeyValueRecordToNestedObject.d.ts +6 -0
- package/dist/gguf/utils/convertMetadataKeyValueRecordToNestedObject.js +76 -0
- package/dist/gguf/utils/convertMetadataKeyValueRecordToNestedObject.js.map +1 -0
- package/dist/gguf/utils/getGgufFileTypeName.d.ts +4 -0
- package/dist/gguf/utils/getGgufFileTypeName.js +13 -0
- package/dist/gguf/utils/getGgufFileTypeName.js.map +1 -0
- package/dist/gguf/utils/getGgufMetadataArchitectureData.d.ts +3 -0
- package/dist/gguf/utils/getGgufMetadataArchitectureData.js +4 -0
- package/dist/gguf/utils/getGgufMetadataArchitectureData.js.map +1 -0
- package/dist/gguf/utils/normalizeGgufDownloadUrl.d.ts +1 -0
- package/dist/gguf/utils/normalizeGgufDownloadUrl.js +16 -0
- package/dist/gguf/utils/normalizeGgufDownloadUrl.js.map +1 -0
- package/dist/gguf/utils/resolveBinarySplitGgufPartUrls.d.ts +2 -0
- package/dist/gguf/utils/resolveBinarySplitGgufPartUrls.js +39 -0
- package/dist/gguf/utils/resolveBinarySplitGgufPartUrls.js.map +1 -0
- package/dist/gguf/utils/resolveSplitGgufParts.d.ts +7 -0
- package/dist/gguf/utils/resolveSplitGgufParts.js +55 -0
- package/dist/gguf/utils/resolveSplitGgufParts.js.map +1 -0
- package/dist/index.d.ts +39 -14
- package/dist/index.js +29 -8
- package/dist/index.js.map +1 -1
- package/dist/state.d.ts +2 -0
- package/dist/state.js +7 -0
- package/dist/state.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types.d.ts +131 -5
- package/dist/types.js.map +1 -1
- package/dist/utils/DisposeGuard.d.ts +13 -0
- package/dist/utils/DisposeGuard.js +120 -0
- package/dist/utils/DisposeGuard.js.map +1 -0
- package/dist/utils/InsufficientMemoryError.d.ts +3 -0
- package/dist/utils/InsufficientMemoryError.js +6 -0
- package/dist/utils/InsufficientMemoryError.js.map +1 -0
- package/dist/utils/LlamaText.d.ts +73 -26
- package/dist/utils/LlamaText.js +475 -157
- package/dist/utils/LlamaText.js.map +1 -1
- package/dist/utils/LruCache.d.ts +12 -0
- package/dist/utils/LruCache.js +44 -0
- package/dist/utils/LruCache.js.map +1 -0
- package/dist/utils/OverridesObject.d.ts +7 -0
- package/dist/utils/OverridesObject.js +2 -0
- package/dist/utils/OverridesObject.js.map +1 -0
- package/dist/utils/ReplHistory.js +5 -1
- package/dist/utils/ReplHistory.js.map +1 -1
- package/dist/utils/StopGenerationDetector.d.ts +27 -8
- package/dist/utils/StopGenerationDetector.js +108 -22
- package/dist/utils/StopGenerationDetector.js.map +1 -1
- package/dist/utils/ThreadsSplitter.d.ts +32 -0
- package/dist/utils/ThreadsSplitter.js +177 -0
- package/dist/utils/ThreadsSplitter.js.map +1 -0
- package/dist/utils/TokenStreamRegulator.d.ts +10 -4
- package/dist/utils/TokenStreamRegulator.js +102 -10
- package/dist/utils/TokenStreamRegulator.js.map +1 -1
- package/dist/utils/UnsupportedError.d.ts +2 -0
- package/dist/utils/UnsupportedError.js +7 -0
- package/dist/utils/UnsupportedError.js.map +1 -0
- package/dist/utils/appendUserMessageToChatHistory.d.ts +4 -0
- package/dist/utils/appendUserMessageToChatHistory.js +4 -0
- package/dist/utils/appendUserMessageToChatHistory.js.map +1 -1
- package/dist/utils/clearTempFolder.js.map +1 -1
- package/dist/utils/cmake.js +23 -10
- package/dist/utils/cmake.js.map +1 -1
- package/dist/utils/compareTokens.d.ts +1 -1
- package/dist/utils/compareTokens.js.map +1 -1
- package/dist/utils/createModelDownloader.d.ts +199 -0
- package/dist/utils/createModelDownloader.js +405 -0
- package/dist/utils/createModelDownloader.js.map +1 -0
- package/dist/utils/findBestOption.d.ts +4 -0
- package/dist/utils/findBestOption.js +15 -0
- package/dist/utils/findBestOption.js.map +1 -0
- package/dist/utils/findCharacterRemovalCountToFitChatHistoryInContext.d.ts +1 -0
- package/dist/utils/findCharacterRemovalCountToFitChatHistoryInContext.js +23 -12
- package/dist/utils/findCharacterRemovalCountToFitChatHistoryInContext.js.map +1 -1
- package/dist/utils/gbnfJson/GbnfGrammarGenerator.js.map +1 -1
- package/dist/utils/gbnfJson/getGbnfGrammarForGbnfJsonSchema.d.ts +5 -0
- package/dist/utils/gbnfJson/getGbnfGrammarForGbnfJsonSchema.js +11 -0
- package/dist/utils/gbnfJson/getGbnfGrammarForGbnfJsonSchema.js.map +1 -0
- package/dist/utils/gbnfJson/terminals/GbnfArray.d.ts +3 -1
- package/dist/utils/gbnfJson/terminals/GbnfArray.js +10 -5
- package/dist/utils/gbnfJson/terminals/GbnfArray.js.map +1 -1
- package/dist/utils/gbnfJson/terminals/GbnfBoolean.d.ts +1 -1
- package/dist/utils/gbnfJson/terminals/GbnfBoolean.js.map +1 -1
- package/dist/utils/gbnfJson/terminals/GbnfBooleanValue.js.map +1 -1
- package/dist/utils/gbnfJson/terminals/GbnfGrammar.js.map +1 -1
- package/dist/utils/gbnfJson/terminals/GbnfNull.d.ts +1 -1
- package/dist/utils/gbnfJson/terminals/GbnfNull.js.map +1 -1
- package/dist/utils/gbnfJson/terminals/GbnfNumber.d.ts +1 -1
- package/dist/utils/gbnfJson/terminals/GbnfNumber.js.map +1 -1
- package/dist/utils/gbnfJson/terminals/GbnfNumberValue.js.map +1 -1
- package/dist/utils/gbnfJson/terminals/GbnfObjectMap.d.ts +3 -1
- package/dist/utils/gbnfJson/terminals/GbnfObjectMap.js +9 -4
- package/dist/utils/gbnfJson/terminals/GbnfObjectMap.js.map +1 -1
- package/dist/utils/gbnfJson/terminals/GbnfOr.js.map +1 -1
- package/dist/utils/gbnfJson/terminals/GbnfRepetition.d.ts +9 -0
- package/dist/utils/gbnfJson/terminals/GbnfRepetition.js +37 -0
- package/dist/utils/gbnfJson/terminals/GbnfRepetition.js.map +1 -0
- package/dist/utils/gbnfJson/terminals/GbnfString.d.ts +1 -1
- package/dist/utils/gbnfJson/terminals/GbnfString.js +23 -5
- package/dist/utils/gbnfJson/terminals/GbnfString.js.map +1 -1
- package/dist/utils/gbnfJson/terminals/GbnfStringValue.js.map +1 -1
- package/dist/utils/gbnfJson/terminals/GbnfVerbatimText.js.map +1 -1
- package/dist/utils/gbnfJson/terminals/GbnfWhitespace.d.ts +7 -4
- package/dist/utils/gbnfJson/terminals/GbnfWhitespace.js +37 -9
- package/dist/utils/gbnfJson/terminals/GbnfWhitespace.js.map +1 -1
- package/dist/utils/gbnfJson/terminals/gbnfConsts.d.ts +5 -4
- package/dist/utils/gbnfJson/terminals/gbnfConsts.js +14 -3
- package/dist/utils/gbnfJson/terminals/gbnfConsts.js.map +1 -1
- package/dist/utils/gbnfJson/types.d.ts +3 -0
- package/dist/utils/gbnfJson/types.js.map +1 -1
- package/dist/utils/gbnfJson/utils/GbnfJsonScopeState.d.ts +10 -0
- package/dist/utils/gbnfJson/utils/GbnfJsonScopeState.js +15 -0
- package/dist/utils/gbnfJson/utils/GbnfJsonScopeState.js.map +1 -0
- package/dist/utils/gbnfJson/utils/getGbnfJsonTerminalForGbnfJsonSchema.d.ts +2 -1
- package/dist/utils/gbnfJson/utils/getGbnfJsonTerminalForGbnfJsonSchema.js +6 -5
- package/dist/utils/gbnfJson/utils/getGbnfJsonTerminalForGbnfJsonSchema.js.map +1 -1
- package/dist/utils/gbnfJson/utils/validateObjectAgainstGbnfSchema.js +3 -3
- package/dist/utils/gbnfJson/utils/validateObjectAgainstGbnfSchema.js.map +1 -1
- package/dist/utils/getBuildDefaults.d.ts +1 -2
- package/dist/utils/getBuildDefaults.js +2 -3
- package/dist/utils/getBuildDefaults.js.map +1 -1
- package/dist/utils/getConsoleLogPrefix.d.ts +1 -1
- package/dist/utils/getConsoleLogPrefix.js +5 -4
- package/dist/utils/getConsoleLogPrefix.js.map +1 -1
- package/dist/utils/getGrammarsFolder.js +1 -1
- package/dist/utils/getGrammarsFolder.js.map +1 -1
- package/dist/utils/getQueuedTokensBeforeStopTrigger.d.ts +6 -0
- package/dist/utils/getQueuedTokensBeforeStopTrigger.js +22 -0
- package/dist/utils/getQueuedTokensBeforeStopTrigger.js.map +1 -0
- package/dist/utils/getReadableContextSize.d.ts +1 -0
- package/dist/utils/getReadableContextSize.js +7 -0
- package/dist/utils/getReadableContextSize.js.map +1 -0
- package/dist/utils/getTypeScriptTypeStringForGbnfJsonSchema.js +15 -11
- package/dist/utils/getTypeScriptTypeStringForGbnfJsonSchema.js.map +1 -1
- package/dist/utils/gitReleaseBundles.js +68 -1
- package/dist/utils/gitReleaseBundles.js.map +1 -1
- package/dist/utils/isToken.d.ts +2 -0
- package/dist/utils/isToken.js +4 -0
- package/dist/utils/isToken.js.map +1 -0
- package/dist/utils/isUrl.d.ts +1 -0
- package/dist/utils/isUrl.js +15 -0
- package/dist/utils/isUrl.js.map +1 -0
- package/dist/utils/mergeUnionTypes.d.ts +10 -0
- package/dist/utils/mergeUnionTypes.js +2 -0
- package/dist/utils/mergeUnionTypes.js.map +1 -0
- package/dist/utils/modelFileAccesTokens.d.ts +4 -0
- package/dist/utils/modelFileAccesTokens.js +40 -0
- package/dist/utils/modelFileAccesTokens.js.map +1 -0
- package/dist/utils/parseModelFileName.d.ts +1 -0
- package/dist/utils/parseModelFileName.js +6 -1
- package/dist/utils/parseModelFileName.js.map +1 -1
- package/dist/utils/parseTextTemplate.d.ts +66 -0
- package/dist/utils/parseTextTemplate.js +116 -0
- package/dist/utils/parseTextTemplate.js.map +1 -0
- package/dist/utils/prettyPrintObject.d.ts +10 -1
- package/dist/utils/prettyPrintObject.js +61 -15
- package/dist/utils/prettyPrintObject.js.map +1 -1
- package/dist/utils/pushAll.d.ts +6 -0
- package/dist/utils/pushAll.js +11 -0
- package/dist/utils/pushAll.js.map +1 -0
- package/dist/utils/removeNullFields.d.ts +2 -2
- package/dist/utils/removeNullFields.js.map +1 -1
- package/dist/utils/resolveGithubRelease.d.ts +2 -2
- package/dist/utils/resolveGithubRelease.js.map +1 -1
- package/dist/utils/resolveLastTokens.d.ts +2 -0
- package/dist/utils/resolveLastTokens.js +12 -0
- package/dist/utils/resolveLastTokens.js.map +1 -0
- package/dist/utils/runtime.d.ts +4 -0
- package/dist/utils/runtime.js +8 -0
- package/dist/utils/runtime.js.map +1 -0
- package/dist/utils/safeEventCallback.d.ts +6 -0
- package/dist/utils/safeEventCallback.js +29 -0
- package/dist/utils/safeEventCallback.js.map +1 -0
- package/dist/utils/spawnCommand.d.ts +11 -2
- package/dist/utils/spawnCommand.js +55 -7
- package/dist/utils/spawnCommand.js.map +1 -1
- package/dist/utils/tokenizeInput.d.ts +1 -1
- package/dist/utils/tokenizeInput.js +6 -3
- package/dist/utils/tokenizeInput.js.map +1 -1
- package/dist/utils/transformPromisable.d.ts +40 -0
- package/dist/utils/transformPromisable.js +64 -0
- package/dist/utils/transformPromisable.js.map +1 -0
- package/dist/utils/truncateTextAndRoundToWords.d.ts +2 -0
- package/dist/utils/truncateTextAndRoundToWords.js +32 -0
- package/dist/utils/truncateTextAndRoundToWords.js.map +1 -1
- package/dist/utils/utilTypes.d.ts +3 -0
- package/dist/utils/utilTypes.js +2 -0
- package/dist/utils/utilTypes.js.map +1 -0
- package/dist/utils/waitForLockfileRelease.js.map +1 -1
- package/dist/utils/withLockfile.js.map +1 -1
- package/dist/utils/withOra.d.ts +2 -0
- package/dist/utils/withOra.js +16 -6
- package/dist/utils/withOra.js.map +1 -1
- package/dist/utils/withProgressLog.d.ts +22 -0
- package/dist/utils/withProgressLog.js +211 -0
- package/dist/utils/withProgressLog.js.map +1 -0
- package/dist/utils/withStatusLogs.js +1 -1
- package/dist/utils/withStatusLogs.js.map +1 -1
- package/dist/utils/wrapAbortSignal.d.ts +1 -0
- package/dist/utils/wrapAbortSignal.js +9 -0
- package/dist/utils/wrapAbortSignal.js.map +1 -0
- package/llama/CMakeLists.txt +134 -5
- package/llama/addon/AddonContext.cpp +629 -0
- package/llama/addon/AddonContext.h +52 -0
- package/llama/addon/AddonGrammar.cpp +39 -0
- package/llama/addon/AddonGrammar.h +19 -0
- package/llama/addon/AddonGrammarEvaluationState.cpp +25 -0
- package/llama/addon/AddonGrammarEvaluationState.h +17 -0
- package/llama/addon/AddonModel.cpp +672 -0
- package/llama/addon/AddonModel.h +61 -0
- package/llama/addon/AddonModelData.cpp +25 -0
- package/llama/addon/AddonModelData.h +15 -0
- package/llama/addon/AddonModelLora.cpp +105 -0
- package/llama/addon/AddonModelLora.h +28 -0
- package/llama/addon/AddonSampler.cpp +513 -0
- package/llama/addon/AddonSampler.h +65 -0
- package/llama/addon/RingBuffer.h +109 -0
- package/llama/addon/addon.cpp +223 -0
- package/llama/addon/addonGlobals.cpp +22 -0
- package/llama/addon/addonGlobals.h +12 -0
- package/llama/addon/globals/addonLog.cpp +136 -0
- package/llama/addon/globals/addonLog.h +21 -0
- package/llama/addon/globals/addonProgress.cpp +15 -0
- package/llama/addon/globals/addonProgress.h +15 -0
- package/llama/addon/globals/getGpuInfo.cpp +108 -0
- package/llama/addon/globals/getGpuInfo.h +6 -0
- package/llama/binariesGithubRelease.json +1 -1
- package/llama/gitRelease.bundle +0 -0
- package/llama/gpuInfo/cuda-gpu-info.cu +120 -0
- package/llama/gpuInfo/cuda-gpu-info.h +10 -0
- package/llama/gpuInfo/metal-gpu-info.h +8 -0
- package/llama/gpuInfo/metal-gpu-info.mm +30 -0
- package/llama/gpuInfo/vulkan-gpu-info.cpp +83 -0
- package/llama/gpuInfo/vulkan-gpu-info.h +9 -0
- package/llama/grammars/README.md +297 -6
- package/llama/grammars/json.gbnf +4 -4
- package/llama/grammars/json_arr.gbnf +4 -4
- package/llama/llama.cpp.info.json +1 -1
- package/llama/toolchains/win32.host-x64.target-arm64.cmake +41 -0
- package/package.json +109 -59
- package/templates/packed/electron-typescript-react.json +1 -0
- package/templates/packed/node-typescript.json +1 -0
- package/dist/AbortError.d.ts +0 -2
- package/dist/AbortError.js +0 -7
- package/dist/AbortError.js.map +0 -1
- package/dist/chatWrappers/LlamaChatWrapper.d.ts +0 -13
- package/dist/chatWrappers/LlamaChatWrapper.js.map +0 -1
- package/dist/chatWrappers/resolveChatWrapperBasedOnModel.d.ts +0 -13
- package/dist/chatWrappers/resolveChatWrapperBasedOnModel.js +0 -57
- package/dist/chatWrappers/resolveChatWrapperBasedOnModel.js.map +0 -1
- package/dist/cli/commands/BuildCommand.d.ts +0 -11
- package/dist/cli/commands/BuildCommand.js +0 -106
- package/dist/cli/commands/BuildCommand.js.map +0 -1
- package/dist/cli/commands/ClearCommand.js.map +0 -1
- package/dist/cli/commands/DownloadCommand.js +0 -169
- package/dist/cli/commands/DownloadCommand.js.map +0 -1
- package/dist/evaluator/LlamaChat/utils/FunctionCallGrammar.d.ts +0 -22
- package/dist/evaluator/LlamaChat/utils/FunctionCallGrammar.js +0 -121
- package/dist/evaluator/LlamaChat/utils/FunctionCallGrammar.js.map +0 -1
- package/dist/evaluator/LlamaContext/utils/batchItemsPrioritizingStrategies/firstInFirstOutStrategy.js.map +0 -1
- package/dist/evaluator/LlamaContext/utils/batchItemsPrioritizingStrategies/maximumParallelismStrategy.js.map +0 -1
- package/dist/evaluator/LlamaContext/utils/resolveBatchItemsPrioritizingStrategy.d.ts +0 -2
- package/dist/evaluator/LlamaContext/utils/resolveBatchItemsPrioritizingStrategy.js.map +0 -1
- package/dist/evaluator/LlamaModel.d.ts +0 -120
- package/dist/evaluator/LlamaModel.js +0 -320
- package/dist/evaluator/LlamaModel.js.map +0 -1
- package/dist/utils/getGbnfGrammarForGbnfJsonSchema.d.ts +0 -2
- package/dist/utils/getGbnfGrammarForGbnfJsonSchema.js +0 -9
- package/dist/utils/getGbnfGrammarForGbnfJsonSchema.js.map +0 -1
- package/dist/utils/parseModelTypeDescription.d.ts +0 -6
- package/dist/utils/parseModelTypeDescription.js +0 -9
- package/dist/utils/parseModelTypeDescription.js.map +0 -1
- package/dist/utils/resolveChatWrapper.d.ts +0 -4
- package/dist/utils/resolveChatWrapper.js +0 -16
- package/dist/utils/resolveChatWrapper.js.map +0 -1
- package/llama/addon.cpp +0 -950
- package/llamaBins/linux-arm64/.buildMetadata.json +0 -1
- package/llamaBins/linux-arm64/llama-addon.node +0 -0
- package/llamaBins/linux-armv7l/.buildMetadata.json +0 -1
- package/llamaBins/linux-armv7l/llama-addon.node +0 -0
- package/llamaBins/linux-x64/.buildMetadata.json +0 -1
- package/llamaBins/linux-x64/llama-addon.node +0 -0
- package/llamaBins/linux-x64-cuda/.buildMetadata.json +0 -1
- package/llamaBins/linux-x64-cuda/llama-addon.node +0 -0
- package/llamaBins/mac-arm64-metal/.buildMetadata.json +0 -1
- package/llamaBins/mac-arm64-metal/ggml-metal.metal +0 -6119
- package/llamaBins/mac-arm64-metal/llama-addon.node +0 -0
- package/llamaBins/mac-x64/.buildMetadata.json +0 -1
- package/llamaBins/mac-x64/llama-addon.node +0 -0
- package/llamaBins/win-x64/.buildMetadata.json +0 -1
- package/llamaBins/win-x64/llama-addon.exp +0 -0
- package/llamaBins/win-x64/llama-addon.lib +0 -0
- package/llamaBins/win-x64/llama-addon.node +0 -0
- package/llamaBins/win-x64-cuda/.buildMetadata.json +0 -1
- package/llamaBins/win-x64-cuda/llama-addon.exp +0 -0
- package/llamaBins/win-x64-cuda/llama-addon.lib +0 -0
- package/llamaBins/win-x64-cuda/llama-addon.node +0 -0
- /package/dist/evaluator/LlamaContext/utils/{batchItemsPrioritizingStrategies → batchItemsPrioritizationStrategies}/firstInFirstOutStrategy.d.ts +0 -0
- /package/dist/evaluator/LlamaContext/utils/{batchItemsPrioritizingStrategies → batchItemsPrioritizationStrategies}/firstInFirstOutStrategy.js +0 -0
- /package/dist/evaluator/LlamaContext/utils/{batchItemsPrioritizingStrategies → batchItemsPrioritizationStrategies}/maximumParallelismStrategy.d.ts +0 -0
- /package/dist/evaluator/LlamaContext/utils/{batchItemsPrioritizingStrategies → batchItemsPrioritizationStrategies}/maximumParallelismStrategy.js +0 -0
package/package.json
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-llama-cpp",
|
|
3
|
-
"version": "3.0.0
|
|
4
|
-
"description": "Run AI models locally on your machine with node.js bindings for llama.cpp.
|
|
5
|
-
"main": "dist/index.js",
|
|
3
|
+
"version": "3.0.0",
|
|
4
|
+
"description": "Run AI models locally on your machine with node.js bindings for llama.cpp. Enforce a JSON schema on the model output on the generation level",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
8
8
|
"bin": {
|
|
9
|
-
"node-llama-cpp": "
|
|
9
|
+
"node-llama-cpp": "dist/cli/cli.js",
|
|
10
|
+
"nlc": "dist/cli/cli.js"
|
|
10
11
|
},
|
|
11
12
|
"files": [
|
|
12
13
|
"dist/",
|
|
14
|
+
"templates/packed/",
|
|
13
15
|
"llama/",
|
|
14
|
-
"
|
|
16
|
+
"bins/",
|
|
15
17
|
"package.json",
|
|
16
18
|
"README.md",
|
|
17
19
|
"LICENSE"
|
|
@@ -40,31 +42,34 @@
|
|
|
40
42
|
"node": ">=18.0.0"
|
|
41
43
|
},
|
|
42
44
|
"scripts": {
|
|
43
|
-
"prepare": "[ \"$CI\" = true ] || [ -d '.husky/_' ] || husky
|
|
45
|
+
"prepare": "[ \"$CI\" = true ] || [ -d '.husky/_' ] || husky",
|
|
46
|
+
"postinstall": "node ./dist/cli/cli.js postinstall",
|
|
47
|
+
"postversion": "vite-node scripts/postVersion.ts",
|
|
44
48
|
"prebuild": "rimraf ./dist ./tsconfig.tsbuildinfo",
|
|
45
|
-
"build": "tsc --build tsconfig.json --force",
|
|
49
|
+
"build": "tsc --build tsconfig.json --force && npm run build:packTemplates",
|
|
50
|
+
"build:packTemplates": "vite-node scripts/packTemplates.ts",
|
|
46
51
|
"addPostinstallScript": "npm pkg set scripts.postinstall=\"node ./dist/cli/cli.js postinstall\"",
|
|
47
52
|
"prewatch": "rimraf ./dist ./tsconfig.tsbuildinfo",
|
|
48
53
|
"watch": "tsc --build tsconfig.json --watch --force",
|
|
49
54
|
"cmake-js-llama": "cd llama && cmake-js",
|
|
50
|
-
"test": "npm run test:typescript && npm run lint:eslint && npm run test:
|
|
55
|
+
"test": "npm run test:typescript && npm run lint:eslint && npm run test:vitest",
|
|
56
|
+
"test:vitest": "vitest run ./test",
|
|
51
57
|
"test:standalone": "vitest run ./test/standalone",
|
|
52
58
|
"test:standalone:interactive": "vitest watch ./test/standalone",
|
|
53
59
|
"test:modelDependent": "vitest run ./test/modelDependent",
|
|
54
60
|
"test:modelDependent:interactive": "vitest watch ./test/modelDependent",
|
|
55
|
-
"test:typescript": "tsc --
|
|
61
|
+
"test:typescript": "tsc --noEmit --project tsconfig.json",
|
|
56
62
|
"lint": "npm run lint:eslint",
|
|
57
|
-
"lint:eslint": "eslint --ext .js --ext .ts .",
|
|
63
|
+
"lint:eslint": "eslint --ext .js --ext .ts --report-unused-disable-directives .",
|
|
58
64
|
"format": "npm run lint:eslint -- --fix",
|
|
59
|
-
"dev:setup:downloadAllTestModels": "
|
|
60
|
-
"dev:setup": "npm run build && node ./dist/cli/cli.js download --noUsageExample && npm run docs:generateTypedoc && npm run dev:setup:downloadAllTestModels",
|
|
61
|
-
"dev:build": "npm run build && node ./dist/cli/cli.js build --noUsageExample",
|
|
62
|
-
"clean": "rm -rf ./node_modules ./dist ./tsconfig.tsbuildinfo ./test/.models",
|
|
63
|
-
"docs:generateTypedoc": "typedoc && rimraf ./docs/api/index.md ./docs/api/
|
|
65
|
+
"dev:setup:downloadAllTestModels": "vite-node test/utils/scripts/downloadAllTestModels.ts",
|
|
66
|
+
"dev:setup": "npm run build && node ./dist/cli/cli.js source download --noUsageExample && npm run docs:generateTypedoc && npm run dev:setup:downloadAllTestModels",
|
|
67
|
+
"dev:build": "npm run build && node ./dist/cli/cli.js source build --noUsageExample",
|
|
68
|
+
"clean": "rm -rf ./node_modules ./dist ./tsconfig.tsbuildinfo ./test/.models ./docs/api ./docs/api-overrides ./templates/packed",
|
|
69
|
+
"docs:generateTypedoc": "typedoc && rimraf ./docs/api/index.md ./docs/api/globals.md ./docs/api/functions/LlamaText.md",
|
|
64
70
|
"docs:dev": "npm run docs:generateTypedoc && vitepress dev",
|
|
65
71
|
"docs:build": "npm run docs:generateTypedoc && vitepress build",
|
|
66
|
-
"docs:preview": "npm run docs:generateTypedoc && vitepress preview"
|
|
67
|
-
"postinstall": "node ./dist/cli/cli.js postinstall"
|
|
72
|
+
"docs:preview": "npm run docs:generateTypedoc && vitepress preview"
|
|
68
73
|
},
|
|
69
74
|
"repository": {
|
|
70
75
|
"type": "git",
|
|
@@ -83,23 +88,33 @@
|
|
|
83
88
|
"gguf",
|
|
84
89
|
"metal",
|
|
85
90
|
"cuda",
|
|
91
|
+
"vulkan",
|
|
86
92
|
"grammar",
|
|
93
|
+
"embedding",
|
|
87
94
|
"json-grammar",
|
|
88
95
|
"json-schema-grammar",
|
|
89
96
|
"functions",
|
|
90
97
|
"function-calling",
|
|
91
98
|
"embedding",
|
|
92
99
|
"temperature",
|
|
100
|
+
"minP",
|
|
93
101
|
"topK",
|
|
94
102
|
"topP",
|
|
103
|
+
"seed",
|
|
95
104
|
"json-schema",
|
|
96
105
|
"raspberry-pi",
|
|
97
106
|
"self-hosted",
|
|
98
107
|
"local",
|
|
99
|
-
"catai"
|
|
108
|
+
"catai",
|
|
109
|
+
"mistral",
|
|
110
|
+
"typescript",
|
|
111
|
+
"lora",
|
|
112
|
+
"batching",
|
|
113
|
+
"gpu"
|
|
100
114
|
],
|
|
101
115
|
"author": "Gilad S.",
|
|
102
116
|
"license": "MIT",
|
|
117
|
+
"preferUnplugged": true,
|
|
103
118
|
"bugs": {
|
|
104
119
|
"url": "https://github.com/withcatai/node-llama-cpp/issues"
|
|
105
120
|
},
|
|
@@ -107,59 +122,81 @@
|
|
|
107
122
|
"type": "github",
|
|
108
123
|
"url": "https://github.com/sponsors/giladgd"
|
|
109
124
|
},
|
|
110
|
-
"homepage": "https://
|
|
125
|
+
"homepage": "https://node-llama-cpp.withcat.ai",
|
|
111
126
|
"devDependencies": {
|
|
112
|
-
"@commitlint/cli": "^
|
|
113
|
-
"@commitlint/config-conventional": "^
|
|
127
|
+
"@commitlint/cli": "^19.5.0",
|
|
128
|
+
"@commitlint/config-conventional": "^19.5.0",
|
|
129
|
+
"@fontsource/inter": "^5.1.0",
|
|
130
|
+
"@nolebase/vitepress-plugin-git-changelog": "^2.5.0",
|
|
131
|
+
"@nolebase/vitepress-plugin-og-image": "^2.5.0",
|
|
132
|
+
"@resvg/resvg-js": "^2.6.2",
|
|
114
133
|
"@semantic-release/exec": "^6.0.3",
|
|
115
|
-
"@
|
|
134
|
+
"@semantic-release/npm": "12.0.1",
|
|
135
|
+
"@shikijs/vitepress-twoslash": "^1.18.0",
|
|
136
|
+
"@types/async-retry": "^1.4.8",
|
|
137
|
+
"@types/bytes": "^3.1.4",
|
|
116
138
|
"@types/cross-spawn": "^6.0.2",
|
|
117
|
-
"@types/fs-extra": "^11.0.
|
|
118
|
-
"@types/node": "^
|
|
139
|
+
"@types/fs-extra": "^11.0.4",
|
|
140
|
+
"@types/node": "^22.5.5",
|
|
119
141
|
"@types/proper-lockfile": "^4.1.4",
|
|
120
|
-
"@types/
|
|
121
|
-
"@types/
|
|
122
|
-
"@types/
|
|
123
|
-
"@
|
|
124
|
-
"@typescript-eslint/
|
|
125
|
-
"@
|
|
142
|
+
"@types/semver": "^7.5.8",
|
|
143
|
+
"@types/validate-npm-package-name": "^4.0.2",
|
|
144
|
+
"@types/which": "^3.0.4",
|
|
145
|
+
"@types/yargs": "^17.0.33",
|
|
146
|
+
"@typescript-eslint/eslint-plugin": "^7.15.0",
|
|
147
|
+
"@typescript-eslint/parser": "^7.15.0",
|
|
148
|
+
"@vitest/coverage-v8": "^2.1.1",
|
|
149
|
+
"@vitest/ui": "^2.1.1",
|
|
126
150
|
"eslint": "^8.46.0",
|
|
127
|
-
"eslint-plugin-import": "^2.
|
|
128
|
-
"eslint-plugin-jsdoc": "^
|
|
129
|
-
"eslint-plugin-n": "^
|
|
130
|
-
"
|
|
131
|
-
"
|
|
132
|
-
"
|
|
133
|
-
"
|
|
134
|
-
"
|
|
135
|
-
"
|
|
136
|
-
"
|
|
137
|
-
"typedoc
|
|
138
|
-
"typedoc-plugin-
|
|
139
|
-
"typedoc-
|
|
140
|
-
"
|
|
141
|
-
"
|
|
142
|
-
"
|
|
143
|
-
"
|
|
151
|
+
"eslint-plugin-import": "^2.30.0",
|
|
152
|
+
"eslint-plugin-jsdoc": "^50.2.3",
|
|
153
|
+
"eslint-plugin-n": "^17.10.2",
|
|
154
|
+
"feed": "^4.2.2",
|
|
155
|
+
"husky": "^9.1.6",
|
|
156
|
+
"rehype": "^13.0.1",
|
|
157
|
+
"rimraf": "^6.0.1",
|
|
158
|
+
"semantic-release": "24.1.1",
|
|
159
|
+
"sharp": "^0.33.5",
|
|
160
|
+
"tslib": "^2.7.0",
|
|
161
|
+
"typedoc": "^0.26.7",
|
|
162
|
+
"typedoc-plugin-markdown": "^4.2.7",
|
|
163
|
+
"typedoc-plugin-mdn-links": "^3.3.0",
|
|
164
|
+
"typedoc-vitepress-theme": "^1.0.1",
|
|
165
|
+
"typescript": "^5.6.2",
|
|
166
|
+
"vite-node": "^2.1.1",
|
|
167
|
+
"vitepress": "1.3.4",
|
|
168
|
+
"vitest": "^2.1.1",
|
|
169
|
+
"zx": "^8.1.8"
|
|
144
170
|
},
|
|
145
171
|
"dependencies": {
|
|
172
|
+
"@huggingface/jinja": "^0.3.1",
|
|
173
|
+
"async-retry": "^1.3.3",
|
|
174
|
+
"bytes": "^3.1.2",
|
|
146
175
|
"chalk": "^5.3.0",
|
|
147
176
|
"chmodrp": "^1.0.2",
|
|
148
|
-
"
|
|
149
|
-
"cmake-js": "^7.2.1",
|
|
177
|
+
"cmake-js": "^7.3.0",
|
|
150
178
|
"cross-env": "^7.0.3",
|
|
151
179
|
"cross-spawn": "^7.0.3",
|
|
152
|
-
"env-var": "^7.
|
|
153
|
-
"
|
|
154
|
-
"
|
|
155
|
-
"
|
|
156
|
-
"
|
|
157
|
-
"
|
|
158
|
-
"
|
|
180
|
+
"env-var": "^7.5.0",
|
|
181
|
+
"filenamify": "^6.0.0",
|
|
182
|
+
"fs-extra": "^11.2.0",
|
|
183
|
+
"ignore": "^5.3.2",
|
|
184
|
+
"ipull": "^3.7.2",
|
|
185
|
+
"is-unicode-supported": "^2.1.0",
|
|
186
|
+
"lifecycle-utils": "^1.7.0",
|
|
187
|
+
"log-symbols": "^7.0.0",
|
|
188
|
+
"nanoid": "^5.0.7",
|
|
189
|
+
"node-addon-api": "^8.1.0",
|
|
190
|
+
"octokit": "^4.0.2",
|
|
191
|
+
"ora": "^8.1.0",
|
|
192
|
+
"pretty-ms": "^9.1.0",
|
|
159
193
|
"proper-lockfile": "^4.1.2",
|
|
160
|
-
"
|
|
194
|
+
"semver": "^7.6.3",
|
|
195
|
+
"simple-git": "^3.27.0",
|
|
196
|
+
"slice-ansi": "^7.1.0",
|
|
197
|
+
"stdout-update": "^4.0.1",
|
|
161
198
|
"strip-ansi": "^7.1.0",
|
|
162
|
-
"
|
|
199
|
+
"validate-npm-package-name": "^5.0.1",
|
|
163
200
|
"which": "^4.0.0",
|
|
164
201
|
"yargs": "^17.7.2"
|
|
165
202
|
},
|
|
@@ -170,5 +207,18 @@
|
|
|
170
207
|
"typescript": {
|
|
171
208
|
"optional": true
|
|
172
209
|
}
|
|
210
|
+
},
|
|
211
|
+
"optionalDependencies": {
|
|
212
|
+
"@node-llama-cpp/linux-arm64": "3.0.0",
|
|
213
|
+
"@node-llama-cpp/linux-armv7l": "3.0.0",
|
|
214
|
+
"@node-llama-cpp/linux-x64": "3.0.0",
|
|
215
|
+
"@node-llama-cpp/linux-x64-cuda": "3.0.0",
|
|
216
|
+
"@node-llama-cpp/linux-x64-vulkan": "3.0.0",
|
|
217
|
+
"@node-llama-cpp/mac-arm64-metal": "3.0.0",
|
|
218
|
+
"@node-llama-cpp/mac-x64": "3.0.0",
|
|
219
|
+
"@node-llama-cpp/win-arm64": "3.0.0",
|
|
220
|
+
"@node-llama-cpp/win-x64": "3.0.0",
|
|
221
|
+
"@node-llama-cpp/win-x64-cuda": "3.0.0",
|
|
222
|
+
"@node-llama-cpp/win-x64-vulkan": "3.0.0"
|
|
173
223
|
}
|
|
174
|
-
}
|
|
224
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"files":[{"path":[".editorconfig"],"content":"root = true\n\n[*]\nindent_style = space\nindent_size = 4\n\n[{*.ts,*.tsx,*.js,*.jsx,*.css,*.scss}]\ninsert_final_newline = true\n\n[{package.json,package-lock.json,manifest.json,electron-builder.json5}]\nindent_size = 2\n\n[*.yml]\nindent_size = 2\n"},{"path":[".eslintrc.json"],"content":"{\n \"root\": true,\n \"env\": {\n \"node\": true,\n \"browser\": false,\n \"es6\": true\n },\n \"ignorePatterns\": [\"/dist\", \"/dist-electron\", \"/release\", \"/models\"],\n \"extends\": [\n \"eslint:recommended\",\n \"plugin:jsdoc/recommended\",\n \"plugin:react-hooks/recommended\"\n ],\n \"globals\": {\n \"Atomics\": \"readonly\",\n \"SharedArrayBuffer\": \"readonly\"\n },\n \"parserOptions\": {\n \"ecmaFeatures\": {\n \"jsx\": true\n },\n \"ecmaVersion\": 2023,\n \"sourceType\": \"module\"\n },\n \"overrides\": [{\n \"files\": [\"**.ts\", \"**.tsx\"],\n \"extends\": [\n \"eslint:recommended\",\n \"plugin:@typescript-eslint/recommended\",\n \"plugin:jsdoc/recommended-typescript\"\n ],\n \"parser\": \"@typescript-eslint/parser\",\n \"plugins\": [\n \"@typescript-eslint\",\n \"import\",\n \"jsdoc\",\n \"react-refresh\"\n ],\n \"rules\": {\n \"@typescript-eslint/explicit-module-boundary-types\": [\"off\"],\n \"@typescript-eslint/ban-ts-comment\": [\"off\"],\n \"@typescript-eslint/no-explicit-any\": [\"off\"],\n \"semi\": [\"off\"],\n \"@typescript-eslint/semi\": [\"warn\", \"always\"],\n \"@typescript-eslint/no-inferrable-types\": [\"off\"],\n \"@typescript-eslint/member-ordering\": [\"warn\", {\n \"default\": [\"field\", \"constructor\", \"method\", \"signature\"],\n \"typeLiterals\": []\n }],\n \"@typescript-eslint/parameter-properties\": [\"warn\", {\n \"allow\": []\n }],\n \"@typescript-eslint/explicit-member-accessibility\": [\"warn\"],\n \"@typescript-eslint/member-delimiter-style\": [\"warn\", {\n \"multiline\": {\n \"delimiter\": \"comma\",\n \"requireLast\": false\n },\n \"singleline\": {\n \"delimiter\": \"comma\",\n \"requireLast\": false\n },\n \"multilineDetection\": \"brackets\"\n }],\n \"jsdoc/require-param\": [\"off\"],\n \"jsdoc/check-param-names\": [\"warn\", {\n \"checkDestructured\": false\n }],\n \"jsdoc/require-returns\": [\"off\"],\n \"jsdoc/require-jsdoc\": [\"off\"],\n \"jsdoc/require-yields\": [\"off\"],\n \"jsdoc/require-param-description\": [\"off\"]\n }\n }],\n \"plugins\": [\n \"@typescript-eslint\",\n \"import\",\n \"jsdoc\",\n \"react-refresh\"\n ],\n \"settings\": {\n \"import/parsers\": {\n \"@typescript-eslint/parser\": [\".ts\"]\n },\n \"jsdoc\": {\n \"exemptDestructuredRootsFromChecks\": true,\n \"tagNamePreference\": {\n \"hidden\": \"hidden\"\n }\n }\n },\n \"rules\": {\n \"indent\": [\"warn\", 4, {\n \"SwitchCase\": 1,\n \"FunctionDeclaration\": {\n \"parameters\": \"first\"\n }\n }],\n \"eqeqeq\": [\"off\"],\n \"no-undef\": \"off\",\n \"quotes\": [\"warn\", \"double\", { \"avoidEscape\": true }],\n \"no-unused-vars\": [\"warn\", {\n \"args\": \"none\",\n \"ignoreRestSiblings\": true,\n \"varsIgnorePattern\": \"^set\"\n }],\n \"no-prototype-builtins\": [\"off\"],\n \"object-curly-spacing\": [\"warn\", \"never\"],\n \"semi\": [\"warn\", \"always\"],\n \"no-undefined\": [\"off\"],\n \"array-bracket-newline\": [\"error\", \"consistent\"],\n \"brace-style\": [\"error\", \"1tbs\", {\n \"allowSingleLine\": false\n }],\n \"comma-spacing\": [\"error\", {\n \"before\": false,\n \"after\": true\n }],\n \"comma-style\": [\"error\", \"last\"],\n \"comma-dangle\": [\"error\", \"never\"],\n \"no-var\": [\"error\"],\n \"import/order\": [\"error\", {\n \"groups\": [\"builtin\", \"external\",\"internal\", \"parent\", \"sibling\", \"index\", \"type\", \"object\", \"unknown\"],\n \"warnOnUnassignedImports\": true\n }],\n \"newline-per-chained-call\": [\"error\", {\n \"ignoreChainWithDepth\": 2\n }],\n \"no-confusing-arrow\": [\"error\"],\n \"no-const-assign\": [\"error\"],\n \"no-duplicate-imports\": [\"error\", {\n \"includeExports\": true\n }],\n \"camelcase\": [\"warn\"],\n \"jsx-quotes\": [\"warn\"],\n \"yoda\": [\"error\", \"never\", {\n \"exceptRange\": true\n }],\n \"no-eval\": [\"error\"],\n \"array-callback-return\": [\"error\"],\n \"no-empty\": [\"error\", {\n \"allowEmptyCatch\": true\n }],\n \"keyword-spacing\": [\"warn\"],\n \"space-infix-ops\": [\"warn\"],\n \"spaced-comment\": [\"warn\", \"always\", {\n \"markers\": [\"/\"]\n }],\n \"eol-last\": [\"warn\", \"always\"],\n \"max-len\": [\"warn\", {\n \"code\": 140,\n \"tabWidth\": 4,\n \"ignoreStrings\": true\n }],\n \"react-refresh/only-export-components\": [\"warn\", {\n \"allowConstantExport\": true\n }],\n \"react-hooks/exhaustive-deps\": [\"off\"]\n }\n}\n"},{"path":[".gitignore"],"content":"/.idea\n/.vscode\nnode_modules\n.DS_Store\n\n/dist\n/dist-electron\n/release\n/models\n"},{"path":["README.md"],"content":"# Electron + TypeScript + React + Vite + `node-llama-cpp`\nThis template provides a minimal setup to get an Electron app working with TypeScript and `node-llama-cpp`, React with TypeScript for the renderer, and some ESLint rules.\n\n## Get started\nInstall node modules and download the model files used by `node-llama-cpp`:\n```bash\nnpm install\n```\n\nStart the project:\n```bash\nnpm start\n```\n"},{"path":["electron","electron-env.d.ts"],"content":"/// <reference types=\"vite-plugin-electron/electron-env\" />\n\ndeclare namespace NodeJS {\n interface ProcessEnv {\n /**\n * The built directory structure\n *\n * ```tree\n * ├─┬─┬ dist\n * │ │ └── index.html\n * │ │\n * │ ├─┬ dist-electron\n * │ │ ├── index.js\n * │ │ └── preload.mjs\n * │\n * ```\n */\n APP_ROOT: string,\n /** /dist/ or /public/ */\n VITE_PUBLIC: string\n }\n}\n\n// Used in Renderer process, expose in `preload.ts`\ninterface Window {\n ipcRenderer: import(\"electron\").IpcRenderer\n}\n"},{"path":["electron","index.ts"],"content":"import {fileURLToPath} from \"node:url\";\nimport path from \"node:path\";\nimport {app, shell, BrowserWindow} from \"electron\";\nimport {registerLlmRpc} from \"./rpc/llmRpc.ts\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// The built directory structure\n//\n// ├─┬─┬ dist\n// │ │ └── index.html\n// │ │\n// │ ├─┬ dist-electron\n// │ │ ├── index.js\n// │ │ └── preload.mjs\n// │\nprocess.env.APP_ROOT = path.join(__dirname, \"..\");\n\nexport const VITE_DEV_SERVER_URL = process.env[\"VITE_DEV_SERVER_URL\"];\nexport const MAIN_DIST = path.join(process.env.APP_ROOT, \"dist-electron\");\nexport const RENDERER_DIST = path.join(process.env.APP_ROOT, \"dist\");\n\nprocess.env.VITE_PUBLIC = VITE_DEV_SERVER_URL\n ? path.join(process.env.APP_ROOT, \"public\")\n : RENDERER_DIST;\n\nlet win: BrowserWindow | null;\n\nfunction createWindow() {\n win = new BrowserWindow({\n icon: path.join(process.env.VITE_PUBLIC, \"electron-vite.svg\"),\n webPreferences: {\n preload: path.join(__dirname, \"preload.mjs\")\n },\n width: 1000,\n height: 700\n });\n registerLlmRpc(win);\n\n // open external links in the default browser\n win.webContents.setWindowOpenHandler(({url}) => {\n if (url.startsWith(\"file://\"))\n return {action: \"allow\"};\n\n void shell.openExternal(url);\n return {action: \"deny\"};\n });\n\n // Test active push message to Renderer-process.\n win.webContents.on(\"did-finish-load\", () => {\n win?.webContents.send(\"main-process-message\", (new Date).toLocaleString());\n });\n\n if (VITE_DEV_SERVER_URL)\n void win.loadURL(VITE_DEV_SERVER_URL);\n else\n void win.loadFile(path.join(RENDERER_DIST, \"index.html\"));\n}\n\n// Quit when all windows are closed, except on macOS. There, it's common\n// for applications and their menu bar to stay active until the user quits\n// explicitly with Cmd + Q.\napp.on(\"window-all-closed\", () => {\n if (process.platform !== \"darwin\") {\n app.quit();\n win = null;\n }\n});\n\napp.on(\"activate\", () => {\n // On OS X it's common to re-create a window in the app when the\n // dock icon is clicked and there are no other windows open.\n if (BrowserWindow.getAllWindows().length === 0) {\n createWindow();\n }\n});\n\napp.whenReady().then(createWindow);\n"},{"path":["electron","preload.ts"],"content":"import {ipcRenderer, contextBridge} from \"electron\";\n\n// --------- Expose some API to the Renderer process ---------\ncontextBridge.exposeInMainWorld(\"ipcRenderer\", {\n on(...args: Parameters<typeof ipcRenderer.on>) {\n const [channel, listener] = args;\n return ipcRenderer.on(channel, (event, ...args) => listener(event, ...args));\n },\n off(...args: Parameters<typeof ipcRenderer.off>) {\n const [channel, ...omit] = args;\n return ipcRenderer.off(channel, ...omit);\n },\n send(...args: Parameters<typeof ipcRenderer.send>) {\n const [channel, ...omit] = args;\n return ipcRenderer.send(channel, ...omit);\n },\n invoke(...args: Parameters<typeof ipcRenderer.invoke>) {\n const [channel, ...omit] = args;\n return ipcRenderer.invoke(channel, ...omit);\n }\n\n // You can expose other APIs you need here\n // ...\n});\n"},{"path":["electron","rpc","llmRpc.ts"],"content":"import path from \"node:path\";\nimport fs from \"node:fs/promises\";\nimport {BrowserWindow, dialog} from \"electron\";\nimport {createElectronSideBirpc} from \"../utils/createElectronSideBirpc.ts\";\nimport {llmFunctions, llmState} from \"../state/llmState.ts\";\nimport type {RenderedFunctions} from \"../../src/rpc/llmRpc.ts\";\n\nconst modelDirectoryPath = path.join(process.cwd(), \"models\");\n\nexport class ElectronLlmRpc {\n public readonly rendererLlmRpc: ReturnType<typeof createElectronSideBirpc<RenderedFunctions, typeof this.functions>>;\n\n public readonly functions = {\n async selectModelFileAndLoad() {\n const res = await dialog.showOpenDialog({\n message: \"Select a model file\",\n title: \"Select a model file\",\n filters: [\n {name: \"Model file\", extensions: [\"gguf\"]}\n ],\n buttonLabel: \"Open\",\n defaultPath: await pathExists(modelDirectoryPath)\n ? modelDirectoryPath\n : undefined,\n properties: [\"openFile\"]\n });\n\n if (!res.canceled && res.filePaths.length > 0) {\n llmState.state = {\n ...llmState.state,\n selectedModelFilePath: path.resolve(res.filePaths[0]!),\n chatSession: {\n loaded: false,\n generatingResult: false,\n simplifiedChat: [],\n draftPrompt: {\n prompt: llmState.state.chatSession.draftPrompt.prompt,\n completion: \"\"\n }\n }\n };\n\n if (!llmState.state.llama.loaded)\n await llmFunctions.loadLlama();\n\n await llmFunctions.loadModel(llmState.state.selectedModelFilePath!);\n await llmFunctions.createContext();\n await llmFunctions.createContextSequence();\n await llmFunctions.chatSession.createChatSession();\n }\n },\n getState() {\n return llmState.state;\n },\n setDraftPrompt: llmFunctions.chatSession.setDraftPrompt,\n prompt: llmFunctions.chatSession.prompt,\n stopActivePrompt: llmFunctions.chatSession.stopActivePrompt,\n resetChatHistory: llmFunctions.chatSession.resetChatHistory\n } as const;\n\n public constructor(window: BrowserWindow) {\n this.rendererLlmRpc = createElectronSideBirpc<RenderedFunctions, typeof this.functions>(\"llmRpc\", \"llmRpc\", window, this.functions);\n\n this.sendCurrentLlmState = this.sendCurrentLlmState.bind(this);\n\n llmState.createChangeListener(this.sendCurrentLlmState);\n this.sendCurrentLlmState();\n }\n\n public sendCurrentLlmState() {\n this.rendererLlmRpc.updateState(llmState.state);\n }\n}\n\nexport type ElectronFunctions = typeof ElectronLlmRpc.prototype.functions;\n\nexport function registerLlmRpc(window: BrowserWindow) {\n new ElectronLlmRpc(window);\n}\n\nasync function pathExists(path: string) {\n try {\n await fs.access(path);\n return true;\n } catch {\n return false;\n }\n}\n"},{"path":["electron","state","llmState.ts"],"content":"import path from \"node:path\";\nimport {\n getLlama, Llama, LlamaChatSession, LlamaChatSessionPromptCompletionEngine, LlamaContext, LlamaContextSequence, LlamaModel\n} from \"node-llama-cpp\";\nimport {withLock, State} from \"lifecycle-utils\";\nimport packageJson from \"../../package.json\";\n\nexport const llmState = new State<LlmState>({\n appVersion: packageJson.version,\n llama: {\n loaded: false\n },\n model: {\n loaded: false\n },\n context: {\n loaded: false\n },\n contextSequence: {\n loaded: false\n },\n chatSession: {\n loaded: false,\n generatingResult: false,\n simplifiedChat: [],\n draftPrompt: {\n prompt: \"\",\n completion: \"\"\n }\n }\n});\n\nexport type LlmState = {\n appVersion?: string,\n llama: {\n loaded: boolean,\n error?: string\n },\n selectedModelFilePath?: string,\n model: {\n loaded: boolean,\n loadProgress?: number,\n name?: string,\n error?: string\n },\n context: {\n loaded: boolean,\n error?: string\n },\n contextSequence: {\n loaded: boolean,\n error?: string\n },\n chatSession: {\n loaded: boolean,\n generatingResult: boolean,\n simplifiedChat: SimplifiedChatItem[],\n draftPrompt: {\n prompt: string,\n completion: string\n }\n }\n};\n\ntype SimplifiedChatItem = {\n type: \"user\" | \"model\",\n message: string\n};\n\nlet llama: Llama | null = null;\nlet model: LlamaModel | null = null;\nlet context: LlamaContext | null = null;\nlet contextSequence: LlamaContextSequence | null = null;\n\nlet chatSession: LlamaChatSession | null = null;\nlet chatSessionCompletionEngine: LlamaChatSessionPromptCompletionEngine | null = null;\nlet promptAbortController: AbortController | null = null;\nlet inProgressResponse: string = \"\";\n\nexport const llmFunctions = {\n async loadLlama() {\n await withLock(llmFunctions, \"llama\", async () => {\n if (llama != null) {\n try {\n await llama.dispose();\n llama = null;\n } catch (err) {\n console.error(\"Failed to dispose llama\", err);\n }\n }\n\n try {\n llmState.state = {\n ...llmState.state,\n llama: {loaded: false}\n };\n\n llama = await getLlama();\n llmState.state = {\n ...llmState.state,\n llama: {loaded: true}\n };\n\n llama.onDispose.createListener(() => {\n llmState.state = {\n ...llmState.state,\n llama: {loaded: false}\n };\n });\n } catch (err) {\n console.error(\"Failed to load llama\", err);\n llmState.state = {\n ...llmState.state,\n llama: {\n loaded: false,\n error: String(err)\n }\n };\n }\n });\n },\n async loadModel(modelPath: string) {\n await withLock(llmFunctions, \"model\", async () => {\n if (llama == null)\n throw new Error(\"Llama not loaded\");\n\n if (model != null) {\n try {\n await model.dispose();\n model = null;\n } catch (err) {\n console.error(\"Failed to dispose model\", err);\n }\n }\n\n try {\n llmState.state = {\n ...llmState.state,\n model: {\n loaded: false,\n loadProgress: 0\n }\n };\n\n model = await llama.loadModel({\n modelPath,\n onLoadProgress(loadProgress: number) {\n llmState.state = {\n ...llmState.state,\n model: {\n ...llmState.state.model,\n loadProgress\n }\n };\n }\n });\n llmState.state = {\n ...llmState.state,\n model: {\n loaded: true,\n loadProgress: 1,\n name: path.basename(modelPath)\n }\n };\n\n model.onDispose.createListener(() => {\n llmState.state = {\n ...llmState.state,\n model: {loaded: false}\n };\n });\n } catch (err) {\n console.error(\"Failed to load model\", err);\n llmState.state = {\n ...llmState.state,\n model: {\n loaded: false,\n error: String(err)\n }\n };\n }\n });\n },\n async createContext() {\n await withLock(llmFunctions, \"context\", async () => {\n if (model == null)\n throw new Error(\"Model not loaded\");\n\n if (context != null) {\n try {\n await context.dispose();\n context = null;\n } catch (err) {\n console.error(\"Failed to dispose context\", err);\n }\n }\n\n try {\n llmState.state = {\n ...llmState.state,\n context: {loaded: false}\n };\n\n context = await model.createContext();\n llmState.state = {\n ...llmState.state,\n context: {loaded: true}\n };\n\n context.onDispose.createListener(() => {\n llmState.state = {\n ...llmState.state,\n context: {loaded: false}\n };\n });\n } catch (err) {\n console.error(\"Failed to create context\", err);\n llmState.state = {\n ...llmState.state,\n context: {\n loaded: false,\n error: String(err)\n }\n };\n }\n });\n },\n async createContextSequence() {\n await withLock(llmFunctions, \"contextSequence\", async () => {\n if (context == null)\n throw new Error(\"Context not loaded\");\n\n try {\n llmState.state = {\n ...llmState.state,\n contextSequence: {loaded: false}\n };\n\n contextSequence = context.getSequence();\n llmState.state = {\n ...llmState.state,\n contextSequence: {loaded: true}\n };\n\n contextSequence.onDispose.createListener(() => {\n llmState.state = {\n ...llmState.state,\n contextSequence: {loaded: false}\n };\n });\n } catch (err) {\n console.error(\"Failed to get context sequence\", err);\n llmState.state = {\n ...llmState.state,\n contextSequence: {\n loaded: false,\n error: String(err)\n }\n };\n }\n });\n },\n chatSession: {\n async createChatSession() {\n await withLock(llmFunctions, \"chatSession\", async () => {\n if (contextSequence == null)\n throw new Error(\"Context sequence not loaded\");\n\n if (chatSession != null) {\n try {\n chatSession.dispose();\n chatSession = null;\n chatSessionCompletionEngine = null;\n } catch (err) {\n console.error(\"Failed to dispose chat session\", err);\n }\n }\n\n try {\n llmState.state = {\n ...llmState.state,\n chatSession: {\n loaded: false,\n generatingResult: false,\n simplifiedChat: [],\n draftPrompt: llmState.state.chatSession.draftPrompt\n }\n };\n\n llmFunctions.chatSession.resetChatHistory(false);\n\n try {\n await chatSession?.preloadPrompt(\"\", {\n signal: promptAbortController?.signal\n });\n } catch (err) {\n // do nothing\n }\n chatSessionCompletionEngine?.complete(llmState.state.chatSession.draftPrompt.prompt);\n\n llmState.state = {\n ...llmState.state,\n chatSession: {\n ...llmState.state.chatSession,\n loaded: true\n }\n };\n } catch (err) {\n console.error(\"Failed to create chat session\", err);\n llmState.state = {\n ...llmState.state,\n chatSession: {\n loaded: false,\n generatingResult: false,\n simplifiedChat: [],\n draftPrompt: llmState.state.chatSession.draftPrompt\n }\n };\n }\n });\n },\n async prompt(message: string) {\n await withLock(llmFunctions, \"chatSession\", async () => {\n if (chatSession == null)\n throw new Error(\"Chat session not loaded\");\n\n llmState.state = {\n ...llmState.state,\n chatSession: {\n ...llmState.state.chatSession,\n generatingResult: true,\n draftPrompt: {\n prompt: \"\",\n completion: \"\"\n }\n }\n };\n promptAbortController = new AbortController();\n\n llmState.state = {\n ...llmState.state,\n chatSession: {\n ...llmState.state.chatSession,\n simplifiedChat: getSimplifiedChatHistory(true, message)\n }\n };\n await chatSession.prompt(message, {\n signal: promptAbortController.signal,\n stopOnAbortSignal: true,\n onTextChunk(chunk) {\n inProgressResponse += chunk;\n\n llmState.state = {\n ...llmState.state,\n chatSession: {\n ...llmState.state.chatSession,\n simplifiedChat: getSimplifiedChatHistory(true, message)\n }\n };\n }\n });\n llmState.state = {\n ...llmState.state,\n chatSession: {\n ...llmState.state.chatSession,\n generatingResult: false,\n simplifiedChat: getSimplifiedChatHistory(false),\n draftPrompt: {\n ...llmState.state.chatSession.draftPrompt,\n completion: chatSessionCompletionEngine?.complete(llmState.state.chatSession.draftPrompt.prompt) ?? \"\"\n }\n }\n };\n inProgressResponse = \"\";\n });\n },\n stopActivePrompt() {\n promptAbortController?.abort();\n },\n resetChatHistory(markAsLoaded: boolean = true) {\n if (contextSequence == null)\n return;\n\n chatSession?.dispose();\n chatSession = new LlamaChatSession({\n contextSequence,\n autoDisposeSequence: false\n });\n chatSessionCompletionEngine = chatSession.createPromptCompletionEngine({\n onGeneration(prompt, completion) {\n if (llmState.state.chatSession.draftPrompt.prompt === prompt) {\n llmState.state = {\n ...llmState.state,\n chatSession: {\n ...llmState.state.chatSession,\n draftPrompt: {\n prompt,\n completion\n }\n }\n };\n }\n }\n });\n\n llmState.state = {\n ...llmState.state,\n chatSession: {\n loaded: markAsLoaded\n ? true\n : llmState.state.chatSession.loaded,\n generatingResult: false,\n simplifiedChat: [],\n draftPrompt: {\n prompt: llmState.state.chatSession.draftPrompt.prompt,\n completion: chatSessionCompletionEngine.complete(llmState.state.chatSession.draftPrompt.prompt) ?? \"\"\n }\n }\n };\n\n chatSession.onDispose.createListener(() => {\n llmState.state = {\n ...llmState.state,\n chatSession: {\n loaded: false,\n generatingResult: false,\n simplifiedChat: [],\n draftPrompt: llmState.state.chatSession.draftPrompt\n }\n };\n });\n },\n setDraftPrompt(prompt: string) {\n if (chatSessionCompletionEngine == null)\n return;\n\n llmState.state = {\n ...llmState.state,\n chatSession: {\n ...llmState.state.chatSession,\n draftPrompt: {\n prompt: prompt,\n completion: chatSessionCompletionEngine.complete(prompt) ?? \"\"\n }\n }\n };\n }\n }\n} as const;\n\nfunction getSimplifiedChatHistory(generatingResult: boolean, currentPrompt?: string) {\n if (chatSession == null)\n return [];\n\n const chatHistory: SimplifiedChatItem[] = chatSession.getChatHistory()\n .flatMap((item): SimplifiedChatItem[] => {\n if (item.type === \"system\")\n return [];\n else if (item.type === \"user\")\n return [{type: \"user\", message: item.text}];\n else if (item.type === \"model\")\n return [{\n type: \"model\",\n message: item.response\n .filter((value) => typeof value === \"string\")\n .join(\"\")\n }];\n\n void (item satisfies never); // ensure all item types are handled\n return [];\n });\n\n if (generatingResult && currentPrompt != null) {\n chatHistory.push({\n type: \"user\",\n message: currentPrompt\n });\n\n if (inProgressResponse.length > 0)\n chatHistory.push({\n type: \"model\",\n message: inProgressResponse\n });\n }\n\n return chatHistory;\n}\n"},{"path":["electron","utils","createElectronSideBirpc.ts"],"content":"import {BrowserWindow, ipcMain} from \"electron\";\nimport {createBirpc} from \"birpc\";\n\nexport function createElectronSideBirpc<\n const RendererFunction = Record<string, never>,\n const ElectronFunctions extends object = Record<string, never>\n>(\n toRendererEventName: string,\n fromRendererEventName: string,\n window: BrowserWindow,\n electronFunctions: ElectronFunctions\n) {\n return createBirpc<RendererFunction, ElectronFunctions>(electronFunctions, {\n post: (data) => window.webContents.send(toRendererEventName, data),\n on: (onData) => ipcMain.on(fromRendererEventName, (event, data) => {\n if (BrowserWindow.fromWebContents(event.sender) === window)\n onData(data);\n }),\n serialize: (value) => JSON.stringify(value),\n deserialize: (value) => JSON.parse(value)\n });\n}\n"},{"path":["electron-builder.ts"],"content":"import path from \"node:path\";\nimport {$} from \"zx\";\nimport type {Configuration} from \"electron-builder\";\n\nconst appId = \"node-llama-cpp.electron.example\";\nconst productName = \"node-llama-cpp Electron example\";\nconst executableName = \"node-llama-cpp-electron-example\";\nconst appxIdentityName = \"node.llama.cpp.electron.example\";\n\n/**\n * @see - https://www.electron.build/configuration/configuration\n */\nexport default {\n appId: appId,\n asar: true,\n productName: productName,\n executableName: executableName,\n directories: {\n output: \"release\"\n },\n\n // remove this once you set up your own code signing for macOS\n async afterPack(context) {\n if (context.electronPlatformName === \"darwin\") {\n // check whether the app was already signed\n const appPath = path.join(context.appOutDir, `${context.packager.appInfo.productFilename}.app`);\n\n // this is needed for the app to not appear as \"damaged\" on Apple Silicon Macs\n // https://github.com/electron-userland/electron-builder/issues/5850#issuecomment-1821648559\n await $`codesign --force --deep --sign - ${appPath}`;\n }\n },\n files: [\n \"dist\",\n \"dist-electron\",\n \"!node_modules/node-llama-cpp/bins/**/*\",\n \"node_modules/node-llama-cpp/bins/${os}-${arch}*/**/*\",\n \"!node_modules/@node-llama-cpp/*/bins/**/*\",\n \"node_modules/@node-llama-cpp/${os}-${arch}*/bins/**/*\",\n \"!node_modules/node-llama-cpp/llama/localBuilds/**/*\",\n \"node_modules/node-llama-cpp/llama/localBuilds/${os}-${arch}*/**/*\"\n ],\n asarUnpack: [\n \"node_modules/node-llama-cpp/bins\",\n \"node_modules/node-llama-cpp/llama/localBuilds\",\n \"node_modules/@node-llama-cpp/*\"\n ],\n mac: {\n target: [{\n target: \"dmg\",\n arch: [\n \"arm64\",\n \"x64\"\n ]\n }, {\n target: \"zip\",\n arch: [\n \"arm64\",\n \"x64\"\n ]\n }],\n\n artifactName: \"${name}.macOS.${version}.${arch}.${ext}\"\n },\n win: {\n target: [{\n target: \"nsis\",\n arch: [\n \"x64\",\n \"arm64\"\n ]\n }],\n\n artifactName: \"${name}.Windows.${version}.${arch}.${ext}\"\n },\n appx: {\n identityName: appxIdentityName,\n artifactName: \"${name}.Windows.${version}.${arch}.${ext}\"\n },\n nsis: {\n oneClick: true,\n perMachine: false,\n allowToChangeInstallationDirectory: false,\n deleteAppDataOnUninstall: true\n },\n linux: {\n target: [{\n target: \"AppImage\",\n arch: [\n \"x64\",\n \"arm64\"\n ]\n }, {\n target: \"snap\",\n arch: [\n \"x64\"\n ]\n }, {\n target: \"deb\",\n arch: [\n \"x64\",\n \"arm64\"\n ]\n }, {\n target: \"tar.gz\",\n arch: [\n \"x64\",\n \"arm64\"\n ]\n }],\n category: \"Utility\",\n\n artifactName: \"${name}.Linux.${version}.${arch}.${ext}\"\n }\n} as Configuration;\n"},{"path":["package.json"],"content":"{\n \"name\": \"node-llama-cpp-project\",\n \"private\": true,\n \"version\": \"0.0.0\",\n \"main\": \"./dist-electron/index.js\",\n \"type\": \"module\",\n \"homepage\": \"https://github.com/withcatai/node-llama-cpp\",\n \"author\": {\n \"name\": \"Author name\",\n \"email\": \"email@example.com\"\n },\n \"scripts\": {\n \"postinstall\": \"npm run models:pull\",\n \"models:pull\": \"node-llama-cpp pull --dir ./models \\\"{{modelUrl|escape|escape}}\\\"\",\n \"start\": \"vite dev\",\n \"start:build\": \"electron ./dist-electron\",\n \"prebuild\": \"rimraf ./dist ./dist-electron ./release\",\n \"build\": \"tsc && vite build && electron-builder --config ./electron-builder.ts\",\n \"lint\": \"npm run lint:eslint\",\n \"lint:eslint\": \"eslint --ext .js --ext .ts --report-unused-disable-directives .\",\n \"format\": \"npm run lint:eslint -- --fix\",\n \"clean\": \"rm -rf ./node_modules ./dist ./dist-electron ./release ./models\"\n },\n \"dependencies\": {\n \"birpc\": \"^0.2.17\",\n \"classnames\": \"^2.5.1\",\n \"highlight.js\": \"^11.10.0\",\n \"lifecycle-utils\": \"^1.7.0\",\n \"markdown-it\": \"^14.1.0\",\n \"node-llama-cpp\": \"^{{currentNodeLlamaCppModuleVersion|escape}}\",\n \"react\": \"^18.3.1\",\n \"react-dom\": \"^18.3.1\",\n \"semver\": \"^7.6.3\"\n },\n \"devDependencies\": {\n \"@types/markdown-it\": \"^14.1.2\",\n \"@types/react\": \"^18.3.5\",\n \"@types/react-dom\": \"^18.3.0\",\n \"@types/semver\": \"^7.5.8\",\n \"@typescript-eslint/eslint-plugin\": \"^7.12.0\",\n \"@typescript-eslint/parser\": \"^7.12.0\",\n \"@vitejs/plugin-react\": \"^4.3.1\",\n \"electron\": \"^32.1.0\",\n \"electron-builder\": \"^24.13.3\",\n \"eslint\": \"^8.57.0\",\n \"eslint-plugin-import\": \"^2.29.1\",\n \"eslint-plugin-jsdoc\": \"^48.2.9\",\n \"eslint-plugin-react-hooks\": \"^4.6.0\",\n \"eslint-plugin-react-refresh\": \"^0.4.7\",\n \"rimraf\": \"^6.0.1\",\n \"typescript\": \"^5.6.2\",\n \"vite\": \"^5.4.5\",\n \"vite-plugin-electron\": \"^0.28.7\",\n \"vite-plugin-electron-renderer\": \"^0.14.5\",\n \"zx\": \"^8.1.7\"\n },\n \"overrides\": {\n \"electron-builder\": {\n \"read-config-file\": {\n \"config-file-ts\": \">=0.2.8-rc1\"\n }\n }\n }\n}"},{"path":["public","vite.svg"],"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" aria-hidden=\"true\" role=\"img\"\n class=\"iconify iconify--logos\" width=\"31.88\" height=\"32\" preserveAspectRatio=\"xMidYMid meet\" viewBox=\"0 0 256 257\">\n <defs>\n <linearGradient id=\"IconifyId1813088fe1fbc01fb466\" x1=\"-.828%\" x2=\"57.636%\" y1=\"7.652%\" y2=\"78.411%\">\n <stop offset=\"0%\" stop-color=\"#41D1FF\"></stop>\n <stop offset=\"100%\" stop-color=\"#BD34FE\"></stop>\n </linearGradient>\n <linearGradient id=\"IconifyId1813088fe1fbc01fb467\" x1=\"43.376%\" x2=\"50.316%\" y1=\"2.242%\" y2=\"89.03%\">\n <stop offset=\"0%\" stop-color=\"#FFEA83\"></stop>\n <stop offset=\"8.333%\" stop-color=\"#FFDD35\"></stop>\n <stop offset=\"100%\" stop-color=\"#FFA800\"></stop>\n </linearGradient>\n </defs>\n <path fill=\"url(#IconifyId1813088fe1fbc01fb466)\"\n d=\"M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z\"></path>\n <path fill=\"url(#IconifyId1813088fe1fbc01fb467)\"\n d=\"M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z\"></path>\n</svg>\n"},{"path":["src","App","App.css"],"content":"#root {\n margin: 0 auto;\n padding: 16px;\n text-align: center;\n width: 100%;\n min-height: 100%;\n align-items: center;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n}\n\n.app {\n display: flex;\n flex-direction: column;\n width: 100%;\n min-height: 100%;\n max-width: 1280px;\n\n > .message {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: space-evenly;\n align-items: center;\n gap: 48px;\n overflow: auto;\n padding: 24px 0px;\n\n > .error {\n border: solid 1px var(--error-border-color);\n padding: 8px 12px;\n border-radius: 12px;\n box-shadow: 0px 8px 32px -16px var(--error-border-color);\n }\n\n > .loadModel {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 64px;\n text-align: start;\n\n > .hint {\n margin-top: 64px;\n opacity: 0.6;\n }\n\n > .actions {\n display: flex;\n flex-direction: column;\n align-items: center;\n background-color: var(--actions-block-background-color);\n border: solid 1px var(--actions-block-border-color);\n box-shadow: var(--actions-block-box-shadow);\n padding: 16px 24px;\n border-radius: 12px;\n gap: 16px;\n\n > .starLink {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n color: var(--star-link-color);\n\n &:hover {\n color: var(--star-hover-color);\n }\n\n > .starIcon {\n flex-shrink: 0;\n fill: currentColor;\n }\n }\n\n > .links {\n display: flex;\n flex-direction: row;\n\n > a {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n\n > .downloadIcon {\n flex-shrink: 0;\n fill: currentColor;\n }\n }\n\n > .separator {\n width: 1px;\n background-color: var(--link-color);\n opacity: 0.2;\n margin: 0px 16px;\n height: 0.8lh;\n align-self: center;\n }\n }\n\n > .browseLink {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 8px;\n\n > .searchIcon {\n flex-shrink: 0;\n fill: currentColor;\n }\n }\n }\n }\n\n > .loading {\n opacity: 0.6;\n font-weight: bold;\n\n mask: linear-gradient(\n to right,\n rgb(0 0 0 / 48%) 34%,\n black,\n rgb(0 0 0 / 48%) 66%\n ) content-box 0 0 / 300% 100% no-repeat;\n animation: loading-animation 2s infinite ease-in-out;\n }\n\n > .typeMessage {\n opacity: 0.6;\n }\n }\n}\n\n@keyframes loading-animation {\n 0% {\n mask-position: 100% 100%;\n }\n\n 100% {\n mask-position: 0 100%;\n }\n}\n"},{"path":["src","App","App.tsx"],"content":"import {useCallback, useLayoutEffect, useRef} from \"react\";\nimport {llmState} from \"../state/llmState.ts\";\nimport {electronLlmRpc} from \"../rpc/llmRpc.ts\";\nimport {useExternalState} from \"../hooks/useExternalState.ts\";\nimport {SearchIconSVG} from \"../icons/SearchIconSVG.tsx\";\nimport {StarIconSVG} from \"../icons/StarIconSVG.tsx\";\nimport {DownloadIconSVG} from \"../icons/DownloadIconSVG.tsx\";\nimport {Header} from \"./components/Header/Header.tsx\";\nimport {ChatHistory} from \"./components/ChatHistory/ChatHistory.tsx\";\nimport {InputRow} from \"./components/InputRow/InputRow.tsx\";\n\nimport \"./App.css\";\n\n\nexport function App() {\n const state = useExternalState(llmState);\n const {generatingResult} = state.chatSession;\n const isScrollAnchoredRef = useRef(false);\n\n const isScrolledToTheBottom = useCallback(() => {\n return document.documentElement.scrollHeight - document.documentElement.scrollTop === document.documentElement.clientHeight;\n }, []);\n\n const scrollToBottom = useCallback(() => {\n document.documentElement.scrollTop = document.documentElement.scrollHeight;\n isScrollAnchoredRef.current = isScrolledToTheBottom();\n }, []);\n\n useLayoutEffect(() => {\n // anchor scroll to bottom\n\n function onScroll() {\n isScrollAnchoredRef.current = isScrolledToTheBottom();\n }\n\n const observer = new ResizeObserver(() => {\n if (isScrollAnchoredRef.current && !isScrolledToTheBottom())\n scrollToBottom();\n });\n\n window.addEventListener(\"scroll\", onScroll, {passive: false});\n observer.observe(document.body, {\n box: \"border-box\"\n });\n scrollToBottom();\n\n return () => {\n observer.disconnect();\n window.removeEventListener(\"scroll\", onScroll);\n };\n }, []);\n\n const openSelectModelFileDialog = useCallback(async () => {\n await electronLlmRpc.selectModelFileAndLoad();\n }, []);\n\n const stopActivePrompt = useCallback(() => {\n void electronLlmRpc.stopActivePrompt();\n }, []);\n\n const resetChatHistory = useCallback(() => {\n void electronLlmRpc.stopActivePrompt();\n void electronLlmRpc.resetChatHistory();\n }, []);\n\n const sendPrompt = useCallback((prompt: string) => {\n if (generatingResult)\n return;\n\n scrollToBottom();\n void electronLlmRpc.prompt(prompt);\n }, [generatingResult, scrollToBottom]);\n\n const onPromptInput = useCallback((currentText: string) => {\n void electronLlmRpc.setDraftPrompt(currentText);\n }, []);\n\n const error = state.llama.error ?? state.model.error ?? state.context.error ?? state.contextSequence.error;\n const loading = state.selectedModelFilePath != null && error == null && (\n !state.model.loaded || !state.llama.loaded || !state.context.loaded || !state.contextSequence.loaded || !state.chatSession.loaded\n );\n const showMessage = state.selectedModelFilePath == null || error != null || state.chatSession.simplifiedChat.length === 0;\n\n return <div className=\"app\">\n <Header\n appVersion={state.appVersion}\n canShowCurrentVersion={state.selectedModelFilePath == null}\n modelName={state.model.name}\n loadPercentage={state.model.loadProgress}\n onLoadClick={openSelectModelFileDialog}\n onResetChatClick={\n !showMessage\n ? resetChatHistory\n : undefined\n }\n />\n {\n showMessage &&\n <div className=\"message\">\n {\n error != null &&\n <div className=\"error\">\n {String(error)}\n </div>\n }\n {\n loading &&\n <div className=\"loading\">\n Loading...\n </div>\n }\n {\n (state.selectedModelFilePath == null || state.llama.error != null) &&\n <div className=\"loadModel\">\n <div className=\"hint\">Click the button above to load a model</div>\n <div className=\"actions\">\n <a className=\"starLink\" target=\"_blank\" href=\"https://github.com/withcatai/node-llama-cpp\">\n <StarIconSVG className=\"starIcon\"/>\n <div className=\"text\">\n Star <code>node-llama-cpp</code> on GitHub\n </div>\n </a>\n <div className=\"links\">\n <a\n target=\"_blank\"\n href=\"https://huggingface.co/mradermacher/Meta-Llama-3.1-8B-Instruct-GGUF/resolve/main/Meta-Llama-3.1-8B-Instruct.Q4_K_M.gguf\"\n >\n <DownloadIconSVG className=\"downloadIcon\"/>\n <div className=\"text\">Get Llama 3.1 8B model</div>\n </a>\n <div className=\"separator\"/>\n <a\n target=\"_blank\"\n href=\"https://huggingface.co/bartowski/gemma-2-2b-it-GGUF/resolve/main/gemma-2-2b-it-Q4_K_M.gguf\"\n >\n <DownloadIconSVG className=\"downloadIcon\"/>\n <div className=\"text\">Get Gemma 2 2B model</div>\n </a>\n </div>\n <a className=\"browseLink\" target=\"_blank\" href=\"https://huggingface.co/mradermacher\">\n <SearchIconSVG className=\"searchIcon\"/>\n <div className=\"text\">Find more models</div>\n </a>\n </div>\n </div>\n }\n {\n (\n !loading &&\n state.selectedModelFilePath != null &&\n error == null &&\n state.chatSession.simplifiedChat.length === 0\n ) &&\n <div className=\"typeMessage\">\n Type a message to start the conversation\n </div>\n }\n </div>\n }\n {\n !showMessage &&\n <ChatHistory\n simplifiedChat={state.chatSession.simplifiedChat}\n generatingResult={generatingResult}\n />\n }\n <InputRow\n disabled={!state.model.loaded || !state.contextSequence.loaded}\n stopGeneration={\n generatingResult\n ? stopActivePrompt\n : undefined\n }\n onPromptInput={onPromptInput}\n sendPrompt={sendPrompt}\n generatingResult={generatingResult}\n autocompleteInputDraft={state.chatSession.draftPrompt.prompt}\n autocompleteCompletion={state.chatSession.draftPrompt.completion}\n />\n </div>;\n}\n"},{"path":["src","App","components","ChatHistory","ChatHistory.css"],"content":".appChatHistory {\n flex: 1;\n display: flex;\n flex-direction: column;\n text-align: start;\n overflow: auto;\n padding: 24px 0px;\n\n > .message {\n &.user {\n align-self: flex-end;\n background-color: var(--user-message-background-color);\n padding: 8px 12px;\n border-radius: 12px;\n margin-bottom: 12px;\n margin-inline-start: 48px;\n margin-inline-end: 12px;\n color: var(--user-message-text-color);\n word-break: break-word;\n max-width: calc(100% - 48px - 12px);\n box-sizing: border-box;\n\n &:not(:first-child) {\n margin-top: 36px;\n }\n }\n\n &.model {\n align-self: flex-start;\n margin-inline-end: 48px;\n padding-inline-start: 24px;\n word-break: break-word;\n max-width: calc(100% - 48px);\n box-sizing: border-box;\n\n &:hover + .buttons {\n opacity: 1;\n }\n\n &.active {\n &:empty:after,\n &:not(:empty)>:last-child:not(ol, ul, table):after,\n &:not(:empty)>:last-child:where(ol, ul)>:last-child:after,\n &:not(:empty)>:last-child:where(table)>:last-child>:last-child>:last-child:after {\n content: \"\";\n position: static;\n display: inline-block;\n background-color: currentColor;\n width: 8px;\n height: 8px;\n translate: 0px -2px;\n border-radius: 9999px;\n margin-inline-start: 8px;\n vertical-align: middle;\n\n animation: activeModelMessageIndicator 2s infinite ease-in-out;\n }\n }\n }\n\n > :first-child {\n margin-top: 0px;\n }\n\n > :last-child {\n margin-bottom: 0px;\n }\n\n h2 {\n margin: 16px 0px;\n padding-top: 24px;\n }\n\n h3 {\n margin: 32px 0px 0px 0px;\n }\n\n table {\n display: block;\n border-style: hidden;\n border-radius: 12px;\n outline: solid 1px var(--message-table-outline-color);\n outline-offset: -1px;\n max-width: max-content;\n border-collapse: collapse;\n overflow-x: auto;\n background-color: var(--background-color);\n\n thead {\n text-align: justify;\n }\n\n tr {\n background-color: var(--message-table-background-color);\n border-top: 1px solid var(--message-table-outline-color);\n\n &:nth-child(2n) td {\n background-color: var(--message-table-even-background-color);\n }\n\n th {\n background-color: var(--message-table-even-background-color);\n border: 1px solid var(--message-table-outline-color);\n padding: 8px 16px;\n }\n\n td {\n border: 1px solid var(--message-table-outline-color);\n padding: 8px 16px;\n }\n }\n }\n }\n\n > .buttons {\n display: flex;\n flex-direction: row;\n padding: 8px 18px;\n opacity: 0;\n\n transition: opacity 0.1s ease-in-out;\n\n &:hover,\n &:focus-visible {\n opacity: 1;\n }\n }\n}\n\n@keyframes activeModelMessageIndicator {\n 0% {\n transform: scale(1);\n opacity: 0.64;\n }\n 50% {\n transform: scale(1.4);\n opacity: 0.32;\n }\n 100% {\n transform: scale(1);\n opacity: 0.64;\n }\n}\n"},{"path":["src","App","components","ChatHistory","ChatHistory.tsx"],"content":"import classNames from \"classnames\";\nimport {LlmState} from \"../../../../electron/state/llmState.ts\";\nimport {MarkdownContent} from \"../MarkdownContent/MarkdownContent.js\";\nimport {MessageCopyButton} from \"./components/MessageCopyButton/MessageCopyButton.js\";\n\nimport \"./ChatHistory.css\";\n\n\nexport function ChatHistory({simplifiedChat, generatingResult}: ChatHistoryProps) {\n return <div className=\"appChatHistory\">\n {\n simplifiedChat.map((item, index) => {\n if (item.type === \"model\") {\n const isActive = index === simplifiedChat.length - 1 && generatingResult;\n return <>\n <MarkdownContent key={index} className={classNames(\"message\", \"model\", isActive && \"active\")}>\n {item.message}\n </MarkdownContent>\n {\n !isActive && <div className=\"buttons\">\n <MessageCopyButton text={item.message} />\n </div>\n }\n </>;\n\n } else if (item.type === \"user\")\n return <MarkdownContent key={index} className=\"message user\">\n {item.message}\n </MarkdownContent>;\n\n return null;\n })\n }\n {\n (\n simplifiedChat.length > 0 &&\n simplifiedChat[simplifiedChat.length - 1]!.type !== \"model\" &&\n generatingResult\n ) &&\n <div className=\"message model active\"/>\n }\n </div>;\n}\n\ntype ChatHistoryProps = {\n simplifiedChat: LlmState[\"chatSession\"][\"simplifiedChat\"],\n generatingResult: boolean\n};\n"},{"path":["src","App","components","ChatHistory","components","MessageCopyButton","MessageCopyButton.css"],"content":".appChatHistory > .buttons {\n > .copyButton {\n display: grid;\n grid-template-areas: \"icon\";\n padding: 6px;\n border: none;\n\n transition: background-color 0.1s ease-in-out;\n\n &:not(:hover, :focus-visible) {\n background-color: transparent;\n }\n\n &.copied {\n > .icon.copy {\n opacity: 0;\n transition-delay: 0s;\n }\n\n > .icon.check {\n opacity: 1;\n transition-delay: 0.1s;\n }\n }\n\n > .icon {\n grid-area: icon;\n width: 18px;\n height: 18px;\n\n transition: opacity 0.3s ease-in-out;\n\n &.copy {\n opacity: 1;\n transition-delay: 0.1s;\n }\n &.check {\n opacity: 0;\n }\n }\n }\n}\n"},{"path":["src","App","components","ChatHistory","components","MessageCopyButton","MessageCopyButton.tsx"],"content":"import classNames from \"classnames\";\nimport {useCallback, useState} from \"react\";\nimport {CopyIconSVG} from \"../../../../../icons/CopyIconSVG.js\";\nimport {CheckIconSVG} from \"../../../../../icons/CheckIconSVG.js\";\n\nimport \"./MessageCopyButton.css\";\n\nconst showCopiedTime = 1000 * 2;\n\nexport function MessageCopyButton({text}: MessageCopyButtonProps) {\n const [copies, setCopies] = useState(0);\n\n const onClick = useCallback(() => {\n navigator.clipboard.writeText(text)\n .then(() => {\n setCopies(copies + 1);\n\n setTimeout(() => {\n setCopies(copies - 1);\n }, showCopiedTime);\n })\n .catch((error) => {\n console.error(\"Failed to copy text to clipboard\", error);\n });\n }, [text]);\n\n return <button\n onClick={onClick}\n className={classNames(\"copyButton\", copies > 0 && \"copied\")}\n >\n <CopyIconSVG className=\"icon copy\" />\n <CheckIconSVG className=\"icon check\" />\n </button>;\n}\n\ntype MessageCopyButtonProps = {\n text: string\n};\n"},{"path":["src","App","components","Header","Header.css"],"content":".appHeader {\n display: flex;\n flex-direction: row;\n z-index: 10;\n position: sticky;\n top: 16px;\n pointer-events: none;\n\n > .panel {\n pointer-events: all;\n display: flex;\n flex-direction: row;\n align-self: start;\n background-color: var(--panel-background-color);\n border-radius: 12px;\n backdrop-filter: blur(8px);\n box-shadow: var(--panel-box-shadow);\n overflow: clip;\n isolation: isolate;\n color: var(--panel-text-color);\n z-index: 10;\n\n > button {\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 8px 12px;\n margin: 8px;\n background-color: var(--panel-button-background-color);\n color: var(--panel-text-color);\n fill: var(--panel-text-color);\n\n + button {\n margin-inline-start: 0px;\n }\n\n &:hover,\n &:focus,\n &:focus-visible {\n border-color: var(--panel-button-hover-border-color);\n }\n\n > .icon {\n width: 20px;\n height: 20px;\n }\n }\n }\n\n > .model {\n position: relative;\n\n > .progress {\n position: absolute;\n inset-inline-start: 0;\n top: 0;\n bottom: 0;\n background-color: var(--panel-progress-color);\n width: calc(var(--progress) * 100%);\n pointer-events: none;\n z-index: -1;\n\n --progress: 0;\n\n &.hide {\n opacity: 0;\n\n transition: opacity 0.3s var(--transition-easing);\n }\n }\n\n > .modelName,\n > .noModel {\n flex: 1;\n text-align: start;\n align-self: center;\n flex-basis: 400px;\n padding: 12px 24px;\n word-break: break-word;\n\n margin-inline-end: 48px;\n }\n }\n\n > .spacer {\n flex-grow: 1;\n }\n}\n"},{"path":["src","App","components","Header","Header.tsx"],"content":"import {CSSProperties} from \"react\";\nimport classNames from \"classnames\";\nimport {LoadFileIconSVG} from \"../../../icons/LoadFileIconSVG.tsx\";\nimport {DeleteIconSVG} from \"../../../icons/DeleteIconSVG.tsx\";\nimport {UpdateBadge} from \"./components/UpdateBadge.js\";\n\nimport \"./Header.css\";\n\n\nexport function Header({appVersion, canShowCurrentVersion, modelName, onLoadClick, loadPercentage, onResetChatClick}: HeaderProps) {\n return <div className=\"appHeader\">\n <div className=\"panel model\">\n <div\n className={classNames(\"progress\", loadPercentage === 1 && \"hide\")}\n style={{\n \"--progress\": loadPercentage != null ? (loadPercentage * 100) : undefined\n } as CSSProperties}\n />\n\n {\n modelName != null &&\n <div className=\"modelName\">{modelName}</div>\n }\n {\n modelName == null &&\n <div className=\"noModel\">No model loaded</div>\n }\n\n <button\n className=\"resetChatButton\"\n disabled={onResetChatClick == null}\n onClick={onResetChatClick}\n >\n <DeleteIconSVG className=\"icon\"/>\n </button>\n <button className=\"loadModelButton\" onClick={onLoadClick} disabled={onLoadClick == null}>\n <LoadFileIconSVG className=\"icon\"/>\n </button>\n </div>\n <div className=\"spacer\"/>\n <UpdateBadge\n appVersion={appVersion}\n canShowCurrentVersion={canShowCurrentVersion}\n />\n </div>;\n}\n\ntype HeaderProps = {\n appVersion?: string,\n canShowCurrentVersion?: boolean,\n modelName?: string,\n onLoadClick?(): void,\n loadPercentage?: number,\n onResetChatClick?(): void\n};\n"},{"path":["src","App","components","Header","components","UpdateBadge.css"],"content":".appHeader > .updateBadge {\n pointer-events: all;\n display: flex;\n flex-direction: row;\n align-items: center;\n flex-shrink: 0;\n margin-inline-start: 16px;\n\n > .currentVersion {\n opacity: 0.4;\n margin: 14px;\n\n > code {\n background-color: transparent;\n }\n }\n\n > .newVersion {\n background-color: var(--update-badge-background-color);\n border: solid 1px var(--update-badge-border-color);\n box-shadow: var(--update-badge-box-shadow);\n border-radius: 12px;\n backdrop-filter: blur(8px);\n padding: 8px 12px;\n margin: 0px 8px;\n\n > .version {\n margin: 0px 4px;\n font-family: monospace;\n }\n }\n}\n"},{"path":["src","App","components","Header","components","UpdateBadge.tsx"],"content":"import {useCallback, useEffect, useMemo, useRef, useState} from \"react\";\nimport {withLock} from \"lifecycle-utils\";\nimport semver from \"semver\";\n\nimport \"./UpdateBadge.css\";\n\nconst latestReleaseUrl = \"https://github.com/withcatai/node-llama-cpp/releases/latest\";\nconst checkInterval = 1000 * 60 * 60 * 24;\n\n\nexport function UpdateBadge({appVersion, canShowCurrentVersion}: UpdateBadgeProps) {\n const [latestVersion, setLatestVersion] = useState<string | null>(null);\n const [releaseLink, setReleaseLink] = useState<string | null>(null);\n const shouldUpdateCurrentVersion = useRef(true);\n const nextUpdateTimeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const instanceLock = useRef({});\n\n const appVersionIsBeta = useMemo(() => {\n if (appVersion == null)\n return null;\n\n const componenets = semver.prerelease(appVersion);\n return componenets?.includes(\"beta\") ?? false;\n }, [appVersion]);\n\n const updateLatestVersionInfo = useCallback(async () => {\n clearTimeout(nextUpdateTimeoutRef.current);\n await withLock(instanceLock.current, \"updateVersion\", async () => {\n clearTimeout(nextUpdateTimeoutRef.current);\n\n const latestVersion = await getLatestAvailableVersion(appVersionIsBeta ?? false);\n if (shouldUpdateCurrentVersion.current && latestVersion.version != null) {\n setLatestVersion(latestVersion.version);\n setReleaseLink(latestVersion.url);\n }\n\n nextUpdateTimeoutRef.current = setTimeout(updateLatestVersionInfo, checkInterval);\n });\n }, [appVersionIsBeta]);\n\n useEffect(() => {\n if (appVersionIsBeta == null)\n return;\n\n shouldUpdateCurrentVersion.current = true;\n void updateLatestVersionInfo();\n\n return () => {\n shouldUpdateCurrentVersion.current = false;\n clearTimeout(nextUpdateTimeoutRef.current);\n };\n }, [appVersionIsBeta]);\n\n const releasedVersionIsNewerThanCurrent = useMemo(() => {\n if (appVersion == null || latestVersion == null)\n return false;\n\n try {\n return semver.gt(latestVersion, appVersion);\n } catch (err) {\n return true;\n }\n }, [appVersion, latestVersion]);\n\n if (latestVersion == null)\n return null;\n\n return <div className=\"updateBadge\">\n {\n (!releasedVersionIsNewerThanCurrent && appVersion && canShowCurrentVersion) &&\n <div className=\"currentVersion\"><code>v{appVersion}</code></div>\n }\n {\n (releasedVersionIsNewerThanCurrent && releaseLink != null) &&\n <a\n target=\"_blank\"\n href={releaseLink}\n className=\"newVersion\"\n >\n Version <code className=\"version\">{latestVersion}</code> is available\n </a>\n }\n </div>;\n}\n\ntype UpdateBadgeProps = {\n appVersion?: string,\n canShowCurrentVersion?: boolean\n};\n\nasync function getLatestAvailableVersion(includePrerelease: boolean = false): Promise<{\n version?: string,\n url: string\n}> {\n try {\n if (includePrerelease) {\n const latestReleases = await getLatestPrereleaseAndRelease();\n if (latestReleases.latestPrerelease != null && latestReleases.latestRelease != null) {\n if (semver.gt(latestReleases.latestPrerelease.version, latestReleases.latestRelease.version))\n return {\n version: latestReleases.latestPrerelease.version,\n url: latestReleases.latestPrerelease.url\n };\n\n return {\n version: latestReleases.latestRelease.version,\n url: latestReleaseUrl\n };\n } else if (latestReleases.latestPrerelease != null) {\n return {\n version: latestReleases.latestPrerelease.version,\n url: latestReleases.latestPrerelease.url\n };\n } else if (latestReleases.latestRelease != null) {\n return {\n version: latestReleases.latestRelease.version,\n url: latestReleaseUrl\n };\n }\n }\n\n const releaseRes = await fetch(\"https://api.github.com/repos/withcatai/node-llama-cpp/releases/latest\");\n const release: {\n tag_name: string\n } = await releaseRes.json();\n\n return {\n version: normalizeTagName(release?.tag_name),\n url: latestReleaseUrl\n };\n } catch (err) {\n console.error(err);\n return {\n version: undefined,\n url: latestReleaseUrl\n };\n }\n}\n\nasync function getLatestPrereleaseAndRelease(): Promise<{\n latestRelease?: {\n version: string,\n url: string\n },\n latestPrerelease?: {\n version: string,\n url: string\n }\n}> {\n try {\n const releasesRes = await fetch(\"https://api.github.com/repos/withcatai/node-llama-cpp/releases?per_page=100\");\n const releases: Array<{\n tag_name: string,\n html_url: string,\n prerelease: boolean,\n draft: boolean\n }> = await releasesRes.json();\n\n const latestRelease = releases.find((release) => !release.prerelease && !release.draft);\n const latestPrerelease = releases.find((release) => release.prerelease && !release.draft);\n\n return {\n latestRelease: latestRelease == null ? undefined : {\n version: normalizeTagName(latestRelease.tag_name)!,\n url: latestRelease.html_url\n },\n latestPrerelease: latestPrerelease == null ? undefined : {\n version: normalizeTagName(latestPrerelease.tag_name)!,\n url: latestPrerelease.html_url\n }\n };\n } catch (err) {\n console.error(err);\n return {};\n }\n}\n\nfunction normalizeTagName(tagName?: string) {\n if (tagName == null)\n return undefined;\n\n if (tagName.toLowerCase().startsWith(\"v\"))\n return tagName.slice(\"v\".length);\n\n return tagName;\n}\n"},{"path":["src","App","components","InputRow","InputRow.css"],"content":".appInputRow {\n display: flex;\n flex-direction: row;\n position: sticky;\n bottom: 16px;\n background-color: var(--panel-background-color);\n border-radius: 12px;\n backdrop-filter: blur(8px);\n box-shadow: var(--panel-box-shadow);\n overflow: clip;\n color: var(--panel-text-color);\n flex-shrink: 0;\n z-index: 10;\n align-items: flex-end;\n\n &.disabled {\n opacity: 0.48;\n }\n\n > .inputContainer {\n flex: 1;\n display: flex;\n flex-direction: row;\n overflow: hidden;\n position: relative;\n isolation: isolate;\n max-height: 400px;\n min-height: var(--min-height);\n --min-height: 55px;\n\n > .input {\n flex: 1;\n border: none;\n resize: none;\n box-sizing: border-box;\n max-height: 160px;\n min-height: var(--min-height);\n height: 55px;\n outline: none;\n padding: calc((var(--min-height) - 1lh) / 2) 24px;\n background-color: transparent;\n font: inherit;\n align-content: center;\n align-self: stretch;\n color: var(--panel-text-color);\n z-index: 2;\n unicode-bidi: plaintext;\n overflow: auto;\n\n &::placeholder {\n color: var(--panel-text-color);\n opacity: 0.4;\n }\n }\n\n > .autocomplete {\n position: absolute;\n inset: 0px;\n z-index: 1;\n display: flex;\n overflow: hidden;\n pointer-events: none;\n user-select: none;\n\n > .content {\n flex: 1;\n flex-shrink: 0;\n font: inherit;\n padding: calc((var(--min-height) - 1lh) / 2) 24px;\n text-align: initial;\n unicode-bidi: plaintext;\n overflow: hidden;\n opacity: 0.36;\n mask: linear-gradient(to top, rgb(0 0 0 / 16%), black 24px);\n\n &.hide {\n opacity: 0;\n }\n\n > .currentText {\n opacity: 0;\n display: inline;\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n > .completion {\n display: inline;\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n > .pressTab {\n display: inline-block;\n margin: -1px 8px;\n opacity: 0.8;\n border: solid 1px color-mix(in srgb, currentColor, transparent 64%);\n border-bottom-width: 2px;\n border-radius: 8px;\n padding: 0.1em 0.4em;\n font-size: 0.8em;\n vertical-align: top;\n }\n }\n }\n }\n\n > .stopGenerationButton,\n > .sendButton {\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 8px 12px;\n margin: 8px;\n background-color: var(--panel-button-background-color);\n color: var(--panel-text-color);\n fill: var(--panel-text-color);\n\n + button {\n margin-inline-start: 0px;\n }\n\n &:hover,\n &:focus,\n &:focus-visible {\n border-color: var(--panel-button-hover-border-color);\n }\n\n > .icon {\n width: 20px;\n height: 20px;\n }\n }\n\n > .stopGenerationButton {\n transition: border-color 0.3s var(--transition-easing), opacity 0.3s var(--transition-easing);\n\n &[disabled] {\n opacity: 0;\n }\n }\n}\n"},{"path":["src","App","components","InputRow","InputRow.tsx"],"content":"import {useCallback, useMemo, useRef, useState} from \"react\";\nimport classNames from \"classnames\";\nimport {AddMessageIconSVG} from \"../../../icons/AddMessageIconSVG.tsx\";\nimport {AbortIconSVG} from \"../../../icons/AbortIconSVG.tsx\";\n\nimport \"./InputRow.css\";\n\n\nexport function InputRow({\n disabled = false, stopGeneration, sendPrompt, onPromptInput, autocompleteInputDraft, autocompleteCompletion, generatingResult\n}: InputRowProps) {\n const [inputText, setInputText] = useState<string>(\"\");\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const autocompleteRef = useRef<HTMLDivElement>(null);\n const autocompleteCurrentTextRef = useRef<HTMLDivElement>(null);\n\n const autocompleteText = useMemo(() => {\n const fullText = (autocompleteInputDraft ?? \"\") + (autocompleteCompletion ?? \"\");\n if (fullText.startsWith(inputText))\n return fullText.slice(inputText.length);\n\n return \"\";\n }, [inputText, autocompleteInputDraft, autocompleteCompletion]);\n\n const setInputValue = useCallback((value: string) => {\n if (inputRef.current != null)\n inputRef.current.value = value;\n\n if (autocompleteCurrentTextRef.current != null)\n autocompleteCurrentTextRef.current.innerText = value;\n\n setInputText(value);\n }, []);\n\n const resizeInput = useCallback(() => {\n if (inputRef.current == null)\n return;\n\n inputRef.current.style.height = \"\";\n inputRef.current.style.height = inputRef.current.scrollHeight + \"px\";\n\n if (autocompleteRef.current != null) {\n autocompleteRef.current.scrollTop = inputRef.current.scrollTop;\n }\n }, []);\n\n const submitPrompt = useCallback(() => {\n if (generatingResult || inputRef.current == null)\n return;\n\n const message = inputRef.current.value;\n if (message.length === 0)\n return;\n\n setInputValue(\"\");\n resizeInput();\n onPromptInput?.(\"\");\n sendPrompt(message);\n }, [setInputValue, generatingResult, resizeInput, sendPrompt, onPromptInput]);\n\n const onInput = useCallback(() => {\n setInputText(inputRef.current?.value ?? \"\");\n resizeInput();\n\n if (autocompleteCurrentTextRef.current != null && inputRef.current != null)\n autocompleteCurrentTextRef.current.innerText = inputRef.current?.value;\n\n if (inputRef.current != null && onPromptInput != null)\n onPromptInput(inputRef.current?.value);\n }, [resizeInput, onPromptInput]);\n\n const onInputKeyDown = useCallback((event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n submitPrompt();\n } else if (event.key === \"Tab\" && !event.shiftKey && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n if (inputRef.current != null && autocompleteText !== \"\") {\n setInputValue(inputRef.current.value + autocompleteText);\n inputRef.current.scrollTop = inputRef.current.scrollHeight;\n onPromptInput?.(inputRef.current.value);\n }\n\n resizeInput();\n }\n }, [submitPrompt, setInputValue, onPromptInput, resizeInput, autocompleteText]);\n\n return <div className={classNames(\"appInputRow\", disabled && \"disabled\")}>\n <div className=\"inputContainer\">\n <textarea\n ref={inputRef}\n onInput={onInput}\n onKeyDownCapture={onInputKeyDown}\n className=\"input\"\n autoComplete=\"off\"\n spellCheck\n disabled={disabled}\n onScroll={resizeInput}\n placeholder={\n autocompleteText === \"\"\n ? \"Type a message...\"\n : \"\"\n }\n />\n <div className=\"autocomplete\" ref={autocompleteRef}>\n <div className={classNames(\"content\", autocompleteText === \"\" && \"hide\")}>\n <div className=\"currentText\" ref={autocompleteCurrentTextRef}/>\n <div className=\"completion\">{autocompleteText}</div>\n <div className=\"pressTab\">Tab</div>\n </div>\n </div>\n </div>\n <button\n className=\"stopGenerationButton\"\n disabled={disabled || stopGeneration == null || !generatingResult}\n onClick={stopGeneration}\n >\n <AbortIconSVG className=\"icon\" />\n </button>\n <button\n className=\"sendButton\"\n disabled={disabled || inputText === \"\" || generatingResult}\n onClick={submitPrompt}\n >\n <AddMessageIconSVG className=\"icon\" />\n </button>\n </div>;\n}\n\ntype InputRowProps = {\n disabled?: boolean,\n stopGeneration?(): void,\n sendPrompt(prompt: string): void,\n onPromptInput?(currentText: string): void,\n autocompleteInputDraft?: string,\n autocompleteCompletion?: string,\n generatingResult: boolean\n};\n"},{"path":["src","App","components","MarkdownContent","MarkdownContent.css"],"content":"/* Only style code blocks */\npre > code {\n display: block;\n background-color: var(--code-block-background-color);\n padding: 0.8em 1.2em;\n border-radius: 0.4em;\n font-size: 1.2em;\n overflow-x: auto;\n user-select: all;\n\n @media (prefers-color-scheme: light) {\n /*!\n Theme: GitHub\n Description: Light theme as seen on github.com\n Author: github.com\n Maintainer: @Hirse\n Updated: 2021-05-15\n\n Outdated base version: https://github.com/primer/github-syntax-light\n Current colors taken from GitHub's CSS\n */\n .hljs {\n color: #24292e;\n background: #ffffff\n }\n .hljs-doctag,\n .hljs-keyword,\n .hljs-meta .hljs-keyword,\n .hljs-template-tag,\n .hljs-template-variable,\n .hljs-type,\n .hljs-variable.language_ {\n /* prettylights-syntax-keyword */\n color: #d73a49\n }\n .hljs-title,\n .hljs-title.class_,\n .hljs-title.class_.inherited__,\n .hljs-title.function_ {\n /* prettylights-syntax-entity */\n color: #6f42c1\n }\n .hljs-attr,\n .hljs-attribute,\n .hljs-literal,\n .hljs-meta,\n .hljs-number,\n .hljs-operator,\n .hljs-variable,\n .hljs-selector-attr,\n .hljs-selector-class,\n .hljs-selector-id {\n /* prettylights-syntax-constant */\n color: #005cc5\n }\n .hljs-regexp,\n .hljs-string,\n .hljs-meta .hljs-string {\n /* prettylights-syntax-string */\n color: #032f62\n }\n .hljs-built_in,\n .hljs-symbol {\n /* prettylights-syntax-variable */\n color: #e36209\n }\n .hljs-comment,\n .hljs-code,\n .hljs-formula {\n /* prettylights-syntax-comment */\n color: #6a737d\n }\n .hljs-name,\n .hljs-quote,\n .hljs-selector-tag,\n .hljs-selector-pseudo {\n /* prettylights-syntax-entity-tag */\n color: #22863a\n }\n .hljs-subst {\n /* prettylights-syntax-storage-modifier-import */\n color: #24292e\n }\n .hljs-section {\n /* prettylights-syntax-markup-heading */\n color: #005cc5;\n font-weight: bold\n }\n .hljs-bullet {\n /* prettylights-syntax-markup-list */\n color: #735c0f\n }\n .hljs-emphasis {\n /* prettylights-syntax-markup-italic */\n color: #24292e;\n font-style: italic\n }\n .hljs-strong {\n /* prettylights-syntax-markup-bold */\n color: #24292e;\n font-weight: bold\n }\n .hljs-addition {\n /* prettylights-syntax-markup-inserted */\n color: #22863a;\n background-color: #f0fff4\n }\n .hljs-deletion {\n /* prettylights-syntax-markup-deleted */\n color: #b31d28;\n background-color: #ffeef0\n }\n .hljs-char.escape_,\n .hljs-link,\n .hljs-params,\n .hljs-property,\n .hljs-punctuation,\n .hljs-tag {\n /* purposely ignored */\n }\n }\n\n @media (prefers-color-scheme: dark) {\n /*!\n Theme: GitHub Dark\n Description: Dark theme as seen on github.com\n Author: github.com\n Maintainer: @Hirse\n Updated: 2021-05-15\n\n Outdated base version: https://github.com/primer/github-syntax-dark\n Current colors taken from GitHub's CSS\n */\n .hljs {\n color: #c9d1d9;\n background: #0d1117\n }\n .hljs-doctag,\n .hljs-keyword,\n .hljs-meta .hljs-keyword,\n .hljs-template-tag,\n .hljs-template-variable,\n .hljs-type,\n .hljs-variable.language_ {\n /* prettylights-syntax-keyword */\n color: #ff7b72\n }\n .hljs-title,\n .hljs-title.class_,\n .hljs-title.class_.inherited__,\n .hljs-title.function_ {\n /* prettylights-syntax-entity */\n color: #d2a8ff\n }\n .hljs-attr,\n .hljs-attribute,\n .hljs-literal,\n .hljs-meta,\n .hljs-number,\n .hljs-operator,\n .hljs-variable,\n .hljs-selector-attr,\n .hljs-selector-class,\n .hljs-selector-id {\n /* prettylights-syntax-constant */\n color: #79c0ff\n }\n .hljs-regexp,\n .hljs-string,\n .hljs-meta .hljs-string {\n /* prettylights-syntax-string */\n color: #a5d6ff\n }\n .hljs-built_in,\n .hljs-symbol {\n /* prettylights-syntax-variable */\n color: #ffa657\n }\n .hljs-comment,\n .hljs-code,\n .hljs-formula {\n /* prettylights-syntax-comment */\n color: #8b949e\n }\n .hljs-name,\n .hljs-quote,\n .hljs-selector-tag,\n .hljs-selector-pseudo {\n /* prettylights-syntax-entity-tag */\n color: #7ee787\n }\n .hljs-subst {\n /* prettylights-syntax-storage-modifier-import */\n color: #c9d1d9\n }\n .hljs-section {\n /* prettylights-syntax-markup-heading */\n color: #1f6feb;\n font-weight: bold\n }\n .hljs-bullet {\n /* prettylights-syntax-markup-list */\n color: #f2cc60\n }\n .hljs-emphasis {\n /* prettylights-syntax-markup-italic */\n color: #c9d1d9;\n font-style: italic\n }\n .hljs-strong {\n /* prettylights-syntax-markup-bold */\n color: #c9d1d9;\n font-weight: bold\n }\n .hljs-addition {\n /* prettylights-syntax-markup-inserted */\n color: #aff5b4;\n background-color: #033a16\n }\n .hljs-deletion {\n /* prettylights-syntax-markup-deleted */\n color: #ffdcd7;\n background-color: #67060c\n }\n .hljs-char.escape_,\n .hljs-link,\n .hljs-params,\n .hljs-property,\n .hljs-punctuation,\n .hljs-tag {\n /* purposely ignored */\n }\n }\n}\n"},{"path":["src","App","components","MarkdownContent","MarkdownContent.tsx"],"content":"import {useLayoutEffect, useRef} from \"react\";\nimport markdownit from \"markdown-it\";\nimport hljs from \"highlight.js\";\n\nimport \"./MarkdownContent.css\";\n\nconst md = markdownit({\n highlight(str, lang): string {\n if (hljs.getLanguage(lang) != null) {\n try {\n return hljs.highlight(str, {language: lang}).value;\n } catch (err) {\n // do nothing\n }\n }\n\n return hljs.highlightAuto(str).value;\n }\n});\n\nexport function MarkdownContent({children, className}: MarkdownContentProps) {\n const divRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n if (divRef.current == null)\n return;\n\n divRef.current.innerHTML = md.render(children ?? \"\");\n }, [children]);\n\n return <div\n className={className}\n ref={divRef}\n />;\n}\n\ntype MarkdownContentProps = {\n className?: string,\n children: string\n};\n"},{"path":["src","hooks","useExternalState.ts"],"content":"import {useEffect, useState} from \"react\";\nimport {State} from \"lifecycle-utils\";\n\nexport function useExternalState<const StateType, const R>(state: State<StateType>, selector: ((state: StateType) => R)): R;\nexport function useExternalState<const StateType>(state: State<StateType>): StateType;\nexport function useExternalState<const StateType>(state: State<StateType>, selector?: ((state: StateType) => any) | null): StateType {\n const [currentState, setCurrentState] = useState(() => (\n selector == null\n ? state.state\n : selector(state.state)\n ));\n\n useEffect(() => {\n return state.createChangeListener((newState) => {\n setCurrentState(\n selector == null\n ? newState\n : selector(newState)\n );\n }, true).dispose;\n }, [state]);\n\n return currentState;\n}\n"},{"path":["src","icons","AbortIconSVG.tsx"],"content":"import {SVGProps} from \"react\";\n\nexport function AbortIconSVG(props: SVGProps<SVGSVGElement>) {\n return <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" {...props}>\n <path d=\"M360-320h240q17 0 28.5-11.5T640-360v-240q0-17-11.5-28.5T600-640H360q-17 0-28.5 11.5T320-600v240q0 17 11.5 28.5T360-320ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z\"/>\n </svg>;\n}\n"},{"path":["src","icons","AddMessageIconSVG.tsx"],"content":"import {SVGProps} from \"react\";\n\nexport function AddMessageIconSVG(props: SVGProps<SVGSVGElement>) {\n return <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" {...props}>\n <path d=\"M440-647 244-451q-12 12-28 11.5T188-452q-11-12-11.5-28t11.5-28l264-264q6-6 13-8.5t15-2.5q8 0 15 2.5t13 8.5l264 264q11 11 11 27.5T772-452q-12 12-28.5 12T715-452L520-647v447q0 17-11.5 28.5T480-160q-17 0-28.5-11.5T440-200v-447Z\"/>\n </svg>;\n}\n"},{"path":["src","icons","CheckIconSVG.tsx"],"content":"import {SVGProps} from \"react\";\n\nexport function CheckIconSVG(props: SVGProps<SVGSVGElement>) {\n return <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" {...props}>\n <path d=\"M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z\"/>\n </svg>;\n}\n"},{"path":["src","icons","CopyIconSVG.tsx"],"content":"import {SVGProps} from \"react\";\n\nexport function CopyIconSVG(props: SVGProps<SVGSVGElement>) {\n return <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" {...props}>\n <path d=\"M360-240q-33 0-56.5-23.5T280-320v-480q0-33 23.5-56.5T360-880h360q33 0 56.5 23.5T800-800v480q0 33-23.5 56.5T720-240H360Zm0-80h360v-480H360v480ZM200-80q-33 0-56.5-23.5T120-160v-560h80v560h440v80H200Zm160-240v-480 480Z\"/>\n </svg>;\n}\n"},{"path":["src","icons","DeleteIconSVG.tsx"],"content":"import {SVGProps} from \"react\";\n\nexport function DeleteIconSVG(props: SVGProps<SVGSVGElement>) {\n return <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" {...props}>\n <path d=\"M280-120q-33 0-56.5-23.5T200-200v-520q-17 0-28.5-11.5T160-760q0-17 11.5-28.5T200-800h160q0-17 11.5-28.5T400-840h160q17 0 28.5 11.5T600-800h160q17 0 28.5 11.5T800-760q0 17-11.5 28.5T760-720v520q0 33-23.5 56.5T680-120H280Zm400-600H280v520h400v-520Zm-400 0v520-520Zm200 316 76 76q11 11 28 11t28-11q11-11 11-28t-11-28l-76-76 76-76q11-11 11-28t-11-28q-11-11-28-11t-28 11l-76 76-76-76q-11-11-28-11t-28 11q-11 11-11 28t11 28l76 76-76 76q-11 11-11 28t11 28q11 11 28 11t28-11l76-76Z\"/>\n </svg>;\n}\n"},{"path":["src","icons","DownloadIconSVG.tsx"],"content":"import {SVGProps} from \"react\";\n\nexport function DownloadIconSVG(props: SVGProps<SVGSVGElement>) {\n return <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" {...props}>\n <path d=\"M480-320 280-520l56-58 104 104v-326h80v326l104-104 56 58-200 200ZM240-160q-33 0-56.5-23.5T160-240v-120h80v120h480v-120h80v120q0 33-23.5 56.5T720-160H240Z\"/>\n </svg>;\n}\n"},{"path":["src","icons","LoadFileIconSVG.tsx"],"content":"import {SVGProps} from \"react\";\n\nexport function LoadFileIconSVG(props: SVGProps<SVGSVGElement>) {\n return <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" {...props}>\n <path d=\"M440-367v127q0 17 11.5 28.5T480-200q17 0 28.5-11.5T520-240v-127l36 36q6 6 13.5 9t15 2.5q7.5-.5 14.5-3.5t13-9q11-12 11.5-28T612-388L508-492q-6-6-13-8.5t-15-2.5q-8 0-15 2.5t-13 8.5L348-388q-12 12-11.5 28t12.5 28q12 11 28 11.5t28-11.5l35-35ZM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h287q16 0 30.5 6t25.5 17l194 194q11 11 17 25.5t6 30.5v447q0 33-23.5 56.5T720-80H240Zm280-560v-160H240v640h480v-440H560q-17 0-28.5-11.5T520-640ZM240-800v200-200 640-640Z\"/>\n </svg>;\n}\n"},{"path":["src","icons","SearchIconSVG.tsx"],"content":"import {SVGProps} from \"react\";\n\nexport function SearchIconSVG(props: SVGProps<SVGSVGElement>) {\n return <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" {...props}>\n <path d=\"M380-320q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l224 224q11 11 11 28t-11 28q-11 11-28 11t-28-11L532-372q-30 24-69 38t-83 14Zm0-80q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Z\"/>\n </svg>;\n}\n"},{"path":["src","icons","StarIconSVG.tsx"],"content":"import {SVGProps} from \"react\";\n\nexport function StarIconSVG(props: SVGProps<SVGSVGElement>) {\n return <svg height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" {...props}>\n <path d=\"m354-287 126-76 126 77-33-144 111-96-146-13-58-136-58 135-146 13 111 97-33 143Zm126 18L314-169q-11 7-23 6t-21-8q-9-7-14-17.5t-2-23.5l44-189-147-127q-10-9-12.5-20.5T140-571q4-11 12-18t22-9l194-17 75-178q5-12 15.5-18t21.5-6q11 0 21.5 6t15.5 18l75 178 194 17q14 2 22 9t12 18q4 11 1.5 22.5T809-528L662-401l44 189q3 13-2 23.5T690-171q-9 7-21 8t-23-6L480-269Zm0-201Z\"/>\n </svg>;\n}\n"},{"path":["src","index.css"],"content":":root {\n font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;\n line-height: 1.5;\n font-weight: 400;\n\n color-scheme: light dark;\n background-color: var(--background-color);\n color: var(--text-color);\n\n font-synthesis: none;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n\n --transition-easing: cubic-bezier(0.4, 0.0, 0.2, 1);\n}\n\n:root {\n --background-color: light-dark(#eeeeee, #242424);\n --text-color: light-dark(#242424, #eeeeee);\n\n --button-background-color: light-dark(rgba(255 255 255 / 64%), rgba(255 255 255 / 8%));\n --button-hover-border-color: light-dark(#646cff, #646cff);\n\n --link-color: light-dark(#646cff, #646cff);\n --link-hover-color: light-dark(#747bff, #535bf2);\n --star-link-color: light-dark(#e09c1c, #eac54f);\n --star-hover-color: light-dark(#daaa52, #c7a027);\n\n --panel-background-color: light-dark(rgba(0 0 0 / 52%), rgba(0 0 0 / 48%));\n --panel-text-color: light-dark(#ffffff, #eeeeee);\n --panel-button-background-color: light-dark(rgba(0 0 0 / 24%), rgba(255 255 255 / 8%));\n --panel-button-hover-border-color: light-dark(var(--panel-text-color), var(--button-hover-border-color));\n --panel-progress-color: light-dark(rgba(255 255 255 / 8%), rgba(255 255 255 / 4%));\n --panel-box-shadow: 0px 4px 8px 0px rgba(0 0 0 / 8%), 0px 6px 24px 0px rgba(0 0 0 / 16%);\n\n --error-border-color: light-dark(rgba(239 83 80 / 100%), rgba(239 83 80 / 100%));\n\n --user-message-background-color: light-dark(rgba(0 0 0 / 16%), rgba(0 0 0 / 48%));\n --user-message-text-color: light-dark(#242424, var(--text-color));\n\n --actions-block-background-color: light-dark(rgba(0 0 0 / 4%), rgba(0 0 0 / 16%));\n --actions-block-border-color: light-dark(rgba(0 0 0 / 4%), rgba(0 0 0 / 16%));\n --actions-block-box-shadow: 0px 4px 8px 0px rgba(0 0 0 / 2%), 0px 6px 24px 0px rgba(0 0 0 / 8%);\n\n --code-block-background-color: light-dark(rgba(0 0 0 / 4%), rgba(0 0 0 / 16%));\n\n --update-badge-background-color: light-dark(rgba(0 0 0 / 4%), rgba(0 0 0 / 16%));\n --update-badge-border-color: light-dark(rgba(0 0 0 / 4%), rgba(0 0 0 / 16%));\n --update-badge-box-shadow: 0px 4px 8px 0px rgba(0 0 0 / 2%), 0px 6px 24px 0px rgba(0 0 0 / 8%);\n\n --message-table-outline-color: light-dark(rgba(0 0 0 / 8%), rgba(255 255 255 / 6%));\n --message-table-background-color: light-dark(rgba(0 0 0 / 0%), rgba(0 0 0 / 12%));\n --message-table-even-background-color: light-dark(rgba(0 0 0 / 4%), rgba(255 255 255 / 6%));\n}\n\nbody {\n margin: 0;\n display: flex;\n min-width: 320px;\n min-height: 100vh;\n}\n\na {\n font-weight: 500;\n color: var(--link-color);\n text-decoration: inherit;\n\n &:hover {\n color: var(--link-hover-color);\n }\n}\n\ncode {\n background-color: color-mix(in srgb, currentColor, transparent 84%);\n padding: 0.1em 0.3em;\n border-radius: 0.4em;\n font-size: 1.2em;\n}\n\nbutton {\n border-radius: 8px;\n border: 1px solid transparent;\n padding: 0.6em 1.2em;\n font-size: 1em;\n font-weight: 500;\n font-family: inherit;\n background-color: var(--button-background-color);\n cursor: pointer;\n transition: border-color 0.3s var(--transition-easing), opacity 0.3s var(--transition-easing);\n color: var(--text-color);\n fill: var(--text-color);\n\n &[disabled] {\n opacity: 0.52;\n pointer-events: none;\n }\n\n &:hover,\n &:focus,\n &:focus-visible {\n border-color: var(--button-hover-border-color);\n }\n}\n\n"},{"path":["src","index.html"],"content":"<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\"/>\n <link rel=\"icon\" type=\"image/svg+xml\" href=\"/vite.svg\"/>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/>\n <title>Electron + TypeScript + React + Vite + node-llama-cpp</title>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"./index.tsx\"></script>\n </body>\n</html>\n"},{"path":["src","index.tsx"],"content":"import React from \"react\";\nimport ReactDOM from \"react-dom/client\";\nimport {App} from \"./App/App.tsx\";\nimport \"./index.css\";\n\nReactDOM.createRoot(document.getElementById(\"root\")!).render(\n <React.StrictMode>\n <App />\n </React.StrictMode>\n);\n\n// Use contextBridge\nwindow.ipcRenderer.on(\"main-process-message\", (_event, message) => {\n console.log(message);\n});\n"},{"path":["src","rpc","llmRpc.ts"],"content":"import {ElectronFunctions} from \"../../electron/rpc/llmRpc.ts\";\nimport {createRendererSideBirpc} from \"../utils/createRendererSideBirpc.ts\";\nimport {llmState} from \"../state/llmState.ts\";\nimport {LlmState} from \"../../electron/state/llmState.ts\";\n\n\nconst renderedFunctions = {\n updateState(state: LlmState) {\n llmState.state = state;\n }\n} as const;\nexport type RenderedFunctions = typeof renderedFunctions;\n\nexport const electronLlmRpc = createRendererSideBirpc<ElectronFunctions, RenderedFunctions>(\"llmRpc\", \"llmRpc\", renderedFunctions);\n\nelectronLlmRpc.getState()\n .then((state) => {\n llmState.state = state;\n })\n .catch((error) => {\n console.error(\"Failed to get the initial state from the main process\", error);\n });\n"},{"path":["src","state","llmState.ts"],"content":"import {State} from \"lifecycle-utils\";\n\nimport {LlmState} from \"../../electron/state/llmState.ts\";\n\nexport const llmState = new State<LlmState>({\n appVersion: undefined,\n llama: {\n loaded: false\n },\n model: {\n loaded: false\n },\n context: {\n loaded: false\n },\n contextSequence: {\n loaded: false\n },\n chatSession: {\n loaded: false,\n generatingResult: false,\n simplifiedChat: [],\n draftPrompt: {\n prompt: \"\",\n completion: \"\"\n }\n }\n});\n"},{"path":["src","utils","createRendererSideBirpc.ts"],"content":"import {createBirpc} from \"birpc\";\n\nexport function createRendererSideBirpc<\n const RendererFunction = Record<string, never>,\n const ElectronFunctions extends object = Record<string, never>\n>(\n toRendererEventName: string,\n fromRendererEventName: string,\n electronFunctions: ElectronFunctions\n) {\n return createBirpc<RendererFunction, ElectronFunctions>(electronFunctions, {\n post: (data) => window.ipcRenderer.send(fromRendererEventName, data),\n on: (onData) => window.ipcRenderer.on(toRendererEventName, (event, data) => {\n onData(data);\n }),\n serialize: (value) => JSON.stringify(value),\n deserialize: (value) => JSON.parse(value)\n });\n}\n\n"},{"path":["src","vite-env.d.ts"],"content":"/// <reference types=\"vite/client\" />\n"},{"path":["tsconfig.json"],"content":"{\n \"compilerOptions\": {\n \"target\": \"es2022\",\n \"lib\": [\"es2022\", \"DOM\", \"DOM.Iterable\"],\n \"module\": \"es2022\",\n \"skipLibCheck\": true,\n\n \"esModuleInterop\": true,\n \"removeComments\": false,\n \"allowSyntheticDefaultImports\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"noUncheckedIndexedAccess\": true,\n \"moduleDetection\": \"force\",\n\n \"moduleResolution\": \"bundler\",\n \"allowImportingTsExtensions\": true,\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"noEmit\": true,\n \"jsx\": \"react-jsx\",\n\n \"strict\": true,\n \"strictNullChecks\": true,\n \"noImplicitAny\": true,\n \"noImplicitReturns\": true,\n \"noImplicitThis\": true,\n \"noImplicitOverride\": true\n },\n \"include\": [\n \"./src\",\n \"./electron\"\n ],\n \"references\": [{ \"path\": \"./tsconfig.node.json\" }]\n}\n"},{"path":["tsconfig.node.json"],"content":"{\n \"compilerOptions\": {\n \"target\": \"es2022\",\n \"lib\": [\"es2022\"],\n \"module\": \"es2022\",\n \"skipLibCheck\": true,\n\n \"esModuleInterop\": true,\n \"removeComments\": false,\n \"allowSyntheticDefaultImports\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"noUncheckedIndexedAccess\": true,\n \"moduleDetection\": \"force\",\n\n \"moduleResolution\": \"bundler\",\n \"resolveJsonModule\": false,\n \"isolatedModules\": true,\n \"composite\": true,\n\n \"strict\": true,\n \"strictNullChecks\": true,\n \"noImplicitAny\": true,\n \"noImplicitReturns\": true,\n \"noImplicitThis\": true,\n \"noImplicitOverride\": true\n },\n \"include\": [\n \"vite.config.ts\"\n ]\n}\n"},{"path":["vite.config.ts"],"content":"import path from \"node:path\";\nimport {fileURLToPath} from \"node:url\";\nimport {defineConfig} from \"vite\";\nimport electron from \"vite-plugin-electron/simple\";\nimport react from \"@vitejs/plugin-react\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// These modules won't be bundled as part of the Vite build of the Electron (main) side,\n// but they'll be included in the final Electron app build inside the asar file.\n// Performance and efficiency wise, this is absolutely fine and has no real drawbacks\nconst electronExternalModules = [\"node-llama-cpp\", \"lifecycle-utils\"];\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n esbuild: {\n target: \"es2022\"\n },\n optimizeDeps: {\n exclude: electronExternalModules,\n esbuildOptions: {\n target: \"es2022\"\n }\n },\n build: {\n outDir: path.join(__dirname, \"dist\"),\n target: \"es2022\"\n },\n root: path.join(__dirname, \"src\"),\n publicDir: path.join(__dirname, \"public\"),\n plugins: [\n react(),\n electron({\n main: {\n // Shortcut of `build.lib.entry`.\n entry: path.join(__dirname, \"electron/index.ts\"),\n vite: {\n build: {\n target: \"es2022\",\n outDir: path.join(__dirname, \"dist-electron\"),\n rollupOptions: {\n external: electronExternalModules\n }\n }\n }\n },\n preload: {\n // Shortcut of `build.rollupOptions.input`.\n // Preload scripts may contain Web assets, so use the `build.rollupOptions.input` instead `build.lib.entry`.\n input: path.join(__dirname, \"electron/preload.ts\"),\n vite: {\n build: {\n target: \"es2022\",\n outDir: path.join(__dirname, \"dist-electron\")\n }\n }\n },\n // Polyfill the Electron and Node.js API for Renderer process.\n // If you want use Node.js in Renderer process, the `nodeIntegration` needs to be enabled in the Main process.\n // See 👉 https://github.com/electron-vite/vite-plugin-electron-renderer\n renderer: process.env.NODE_ENV === \"test\"\n // https://github.com/electron-vite/vite-plugin-electron-renderer/issues/78#issuecomment-2053600808\n ? undefined\n : {}\n })\n ]\n});\n"}]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"files":[{"path":[".editorconfig"],"content":"root = true\n\n[*]\nindent_style = space\nindent_size = 4\n\n[{*.ts,*.tsx,*.js,*.jsx,*.css,*.scss}]\ninsert_final_newline = true\n\n[{package.json,package-lock.json,manifest.json}]\nindent_size = 2\n\n[*.yml]\nindent_size = 2\n"},{"path":[".eslintrc.json"],"content":"{\n \"root\": true,\n \"env\": {\n \"node\": true,\n \"browser\": false,\n \"es6\": true\n },\n \"ignorePatterns\": [\"/dist\", \"/models\"],\n \"extends\": [\n \"eslint:recommended\",\n \"plugin:jsdoc/recommended\"\n ],\n \"globals\": {\n \"Atomics\": \"readonly\",\n \"SharedArrayBuffer\": \"readonly\"\n },\n \"parserOptions\": {\n \"ecmaVersion\": 2023,\n \"sourceType\": \"module\"\n },\n \"overrides\": [{\n \"files\": [\"**.ts\"],\n \"extends\": [\n \"eslint:recommended\",\n \"plugin:@typescript-eslint/recommended\",\n \"plugin:jsdoc/recommended-typescript\"\n ],\n \"parser\": \"@typescript-eslint/parser\",\n \"plugins\": [\n \"@typescript-eslint\",\n \"import\",\n \"jsdoc\",\n \"n\"\n ],\n \"rules\": {\n \"@typescript-eslint/explicit-module-boundary-types\": [\"off\"],\n \"@typescript-eslint/ban-ts-comment\": [\"off\"],\n \"@typescript-eslint/no-explicit-any\": [\"off\"],\n \"semi\": [\"off\"],\n \"@typescript-eslint/semi\": [\"warn\", \"always\"],\n \"@typescript-eslint/no-inferrable-types\": [\"off\"],\n \"@typescript-eslint/member-ordering\": [\"warn\", {\n \"default\": [\"field\", \"constructor\", \"method\", \"signature\"],\n \"typeLiterals\": []\n }],\n \"@typescript-eslint/parameter-properties\": [\"warn\", {\n \"allow\": []\n }],\n \"@typescript-eslint/explicit-member-accessibility\": [\"warn\"],\n \"@typescript-eslint/member-delimiter-style\": [\"warn\", {\n \"multiline\": {\n \"delimiter\": \"comma\",\n \"requireLast\": false\n },\n \"singleline\": {\n \"delimiter\": \"comma\",\n \"requireLast\": false\n },\n \"multilineDetection\": \"brackets\"\n }],\n \"jsdoc/require-param\": [\"off\"],\n \"jsdoc/check-param-names\": [\"warn\", {\n \"checkDestructured\": false\n }],\n \"jsdoc/require-returns\": [\"off\"],\n \"jsdoc/require-jsdoc\": [\"off\"],\n \"jsdoc/require-yields\": [\"off\"],\n \"jsdoc/require-param-description\": [\"off\"]\n }\n }],\n \"plugins\": [\n \"@typescript-eslint\",\n \"import\",\n \"jsdoc\",\n \"n\"\n ],\n \"settings\": {\n \"import/parsers\": {\n \"@typescript-eslint/parser\": [\".ts\"]\n },\n \"jsdoc\": {\n \"exemptDestructuredRootsFromChecks\": true,\n \"tagNamePreference\": {\n \"hidden\": \"hidden\"\n }\n }\n },\n \"rules\": {\n \"indent\": [\"warn\", 4, {\n \"SwitchCase\": 1,\n \"FunctionDeclaration\": {\n \"parameters\": \"first\"\n }\n }],\n \"eqeqeq\": [\"off\"],\n \"no-undef\": \"off\",\n \"quotes\": [\"warn\", \"double\", { \"avoidEscape\": true }],\n \"no-unused-vars\": [\"warn\", {\n \"args\": \"none\",\n \"ignoreRestSiblings\": true,\n \"varsIgnorePattern\": \"^set\"\n }],\n \"no-prototype-builtins\": [\"off\"],\n \"object-curly-spacing\": [\"warn\", \"never\"],\n \"semi\": [\"warn\", \"always\"],\n \"no-undefined\": [\"off\"],\n \"array-bracket-newline\": [\"error\", \"consistent\"],\n \"brace-style\": [\"error\", \"1tbs\", {\n \"allowSingleLine\": false\n }],\n \"comma-spacing\": [\"error\", {\n \"before\": false,\n \"after\": true\n }],\n \"comma-style\": [\"error\", \"last\"],\n \"comma-dangle\": [\"error\", \"never\"],\n \"no-var\": [\"error\"],\n \"import/order\": [\"error\", {\n \"groups\": [\"builtin\", \"external\",\"internal\", \"parent\", \"sibling\", \"index\", \"type\", \"object\", \"unknown\"],\n \"warnOnUnassignedImports\": true\n }],\n \"n/file-extension-in-import\": [\"error\", \"always\"],\n \"newline-per-chained-call\": [\"error\", {\n \"ignoreChainWithDepth\": 2\n }],\n \"no-confusing-arrow\": [\"error\"],\n \"no-const-assign\": [\"error\"],\n \"no-duplicate-imports\": [\"error\", {\n \"includeExports\": true\n }],\n \"camelcase\": [\"warn\"],\n \"jsx-quotes\": [\"warn\"],\n \"yoda\": [\"error\", \"never\", {\n \"exceptRange\": true\n }],\n \"no-eval\": [\"error\"],\n \"array-callback-return\": [\"error\"],\n \"no-empty\": [\"error\", {\n \"allowEmptyCatch\": true\n }],\n \"keyword-spacing\": [\"warn\"],\n \"space-infix-ops\": [\"warn\"],\n \"spaced-comment\": [\"warn\", \"always\", {\n \"markers\": [\"/\"]\n }],\n \"eol-last\": [\"warn\", \"always\"],\n \"max-len\": [\"warn\", {\n \"code\": 140,\n \"tabWidth\": 4,\n \"ignoreStrings\": true\n }]\n }\n}\n"},{"path":[".gitignore"],"content":"/.idea\n/.vscode\nnode_modules\n.DS_Store\n\n/dist\n/models\n"},{"path":["README.md"],"content":"# Node + TypeScript + `node-llama-cpp`\nThis template provides a minimal setup to get Node working with TypeScript and `node-llama-cpp`, and some ESLint rules.\n\n## Get started\nInstall node modules and download the model files used by `node-llama-cpp`:\n```bash\nnpm install\n```\n\nStart the project:\n```bash\nnpm start\n```\n"},{"path":["package.json"],"content":"{\n \"name\": \"node-llama-cpp-project\",\n \"private\": true,\n \"version\": \"0.0.0\",\n \"main\": \"./dist/index.js\",\n \"type\": \"module\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist/\",\n \"package.json\",\n \"README.md\"\n ],\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.js\",\n \"node\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"scripts\": {\n \"postinstall\": \"npm run models:pull\",\n \"models:pull\": \"node-llama-cpp pull --dir ./models \\\"{{modelUrl|escape|escape}}\\\"\",\n \"start\": \"vite-node ./src/index.ts\",\n \"start:build\": \"node ./dist/index.ts\",\n \"prebuild\": \"rimraf ./dist ./tsconfig.tsbuildinfo\",\n \"build\": \"tsc --build tsconfig.json --force\",\n \"lint\": \"npm run lint:eslint\",\n \"lint:eslint\": \"eslint --ext .js --ext .ts --report-unused-disable-directives .\",\n \"format\": \"npm run lint:eslint -- --fix\",\n \"clean\": \"rm -rf ./node_modules ./dist ./tsconfig.tsbuildinfo ./models\"\n },\n \"dependencies\": {\n \"chalk\": \"^5.3.0\",\n \"node-llama-cpp\": \"^{{currentNodeLlamaCppModuleVersion|escape}}\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.5.5\",\n \"@typescript-eslint/eslint-plugin\": \"^7.12.0\",\n \"@typescript-eslint/parser\": \"^7.12.0\",\n \"eslint\": \"^8.46.0\",\n \"eslint-plugin-import\": \"^2.29.1\",\n \"eslint-plugin-jsdoc\": \"^46.9.0\",\n \"eslint-plugin-n\": \"^17.8.1\",\n \"rimraf\": \"^6.0.1\",\n \"tslib\": \"^2.7.0\",\n \"typescript\": \"^5.6.2\",\n \"vite-node\": \"^2.1.1\"\n }\n}"},{"path":["src","index.ts"],"content":"import {fileURLToPath} from \"url\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport {getLlama, LlamaChatSession} from \"node-llama-cpp\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst modelsFolderDirectory = path.join(__dirname, \"..\", \"models\");\n\n\nconst llama = await getLlama();\n\nconsole.log(chalk.yellow(\"Loading model...\"));\nconst model = await llama.loadModel({\n modelPath: path.join(modelsFolderDirectory, \"{{modelFilename|escape}}\")\n});\n\nconsole.log(chalk.yellow(\"Creating context...\"));\nconst context = await model.createContext();\n\nconst session = new LlamaChatSession({\n contextSequence: context.getSequence()\n});\nconsole.log();\n\n\nconst q1 = \"Hi there, how are you?\";\nconsole.log(chalk.yellow(\"User: \") + q1);\n\nprocess.stdout.write(chalk.yellow(\"AI: \"));\nconst a1 = await session.prompt(q1, {\n onTextChunk(chunk) {\n // stream the response to the console as it's being generated\n process.stdout.write(chunk);\n }\n});\nprocess.stdout.write(\"\\n\");\nconsole.log(chalk.yellow(\"Consolidated AI answer: \") + a1);\nconsole.log();\n\n\nconst q2 = \"Summarize what you said\";\nconsole.log(chalk.yellow(\"User: \") + q2);\n\nconst a2 = await session.prompt(q2);\nconsole.log(chalk.yellow(\"AI: \") + a2);\nconsole.log();\n\n\nconst q3 = \"What are the verbs in this sentence: 'The cat sat on the mat'\";\nconsole.log(chalk.yellow(\"User: \") + q3);\n\n// force the model to respond in accordance to the specified JSON schema format, so we can parse it and use it programmatically\nconst responseGrammar = await llama.createGrammarForJsonSchema({\n type: \"object\",\n properties: {\n verbs: {\n type: \"array\",\n items: {\n type: \"string\"\n }\n }\n }\n});\nconst a3 = await session.prompt(q2, {grammar: responseGrammar});\nconst parsedResponse = responseGrammar.parse(a3);\nconsole.log(chalk.yellow(\"AI:\"), parsedResponse.verbs);\nconsole.log();\n\nif (parsedResponse.verbs.length > 0) {\n const q4 = `Define the verb \"${parsedResponse.verbs[0]}\"`;\n console.log(chalk.yellow(\"User: \") + q4);\n\n const a4 = await session.prompt(q4);\n console.log(chalk.yellow(\"AI: \") + a4);\n console.log();\n} else {\n const q4 = \"Are you sure there are no verbs in the sentence?\";\n console.log(chalk.yellow(\"User: \") + q4);\n\n const a4 = await session.prompt(q4);\n console.log(chalk.yellow(\"AI: \") + a4);\n console.log();\n}\n"},{"path":["tsconfig.json"],"content":"{\n \"compilerOptions\": {\n \"lib\": [\"es2022\"],\n \"module\": \"es2022\",\n \"target\": \"es2022\",\n \"esModuleInterop\": true,\n \"noImplicitAny\": true,\n \"noImplicitReturns\": true,\n \"noImplicitThis\": true,\n \"noImplicitOverride\": true,\n \"removeComments\": false,\n \"allowSyntheticDefaultImports\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"noUncheckedIndexedAccess\": true,\n \"moduleDetection\": \"force\",\n \"skipLibCheck\": true,\n \"moduleResolution\": \"node\",\n \"resolveJsonModule\": false,\n \"strictNullChecks\": true,\n \"isolatedModules\": true,\n \"noEmit\": false,\n \"outDir\": \"./dist\",\n \"strict\": true,\n \"sourceMap\": true,\n \"composite\": false,\n \"declaration\": true\n },\n \"files\": [\n \"./src/index.ts\"\n ],\n \"include\": [\n \"./src\"\n ]\n}\n"}]}
|
package/dist/AbortError.d.ts
DELETED
package/dist/AbortError.js
DELETED
package/dist/AbortError.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AbortError.js","sourceRoot":"","sources":["../src/AbortError.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAW,SAAQ,KAAK;IACjC,gBAAgB;IAChB;QACI,KAAK,CAAC,YAAY,CAAC,CAAC;IACxB,CAAC;CACJ"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { ChatWrapper } from "../ChatWrapper.js";
|
|
2
|
-
import { ChatHistoryItem, ChatModelFunctions } from "../types.js";
|
|
3
|
-
import { LlamaText } from "../utils/LlamaText.js";
|
|
4
|
-
export declare class LlamaChatWrapper extends ChatWrapper {
|
|
5
|
-
readonly wrapperName: string;
|
|
6
|
-
generateContextText(history: readonly ChatHistoryItem[], { availableFunctions, documentFunctionParams }?: {
|
|
7
|
-
availableFunctions?: ChatModelFunctions;
|
|
8
|
-
documentFunctionParams?: boolean;
|
|
9
|
-
}): {
|
|
10
|
-
contextText: LlamaText;
|
|
11
|
-
stopGenerationTriggers: LlamaText[];
|
|
12
|
-
};
|
|
13
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LlamaChatWrapper.js","sourceRoot":"","sources":["../../src/chatWrappers/LlamaChatWrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EAAC,mBAAmB,EAAE,SAAS,EAAE,YAAY,EAAC,MAAM,uBAAuB,CAAC;AAEnF,mEAAmE;AACnE,MAAM,OAAO,gBAAiB,SAAQ,WAAW;IAC7B,WAAW,GAAW,WAAW,CAAC;IAElC,mBAAmB,CAAC,OAAmC,EAAE,EAAC,kBAAkB,EAAE,sBAAsB,KAGhH,EAAE;QAIF,MAAM,oBAAoB,GAAG,IAAI,CAAC,2CAA2C,CAAC,OAAO,EAAE,kBAAkB,EAAE;YACvG,cAAc,EAAE,sBAAsB;SACzC,CAAC,CAAC;QAEH,MAAM,WAAW,GAIZ,EAAE,CAAC;QAER,IAAI,WAAW,GAAa,EAAE,CAAC;QAC/B,IAAI,SAAS,GAAa,EAAE,CAAC;QAC7B,IAAI,UAAU,GAAa,EAAE,CAAC;QAC9B,IAAI,qBAAqB,GAAuC,IAAI,CAAC;QAErE,SAAS,KAAK;YACV,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;gBACvE,WAAW,CAAC,IAAI,CAAC;oBACb,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;oBAChC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;oBAC5B,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;iBACjC,CAAC,CAAC;YAEP,WAAW,GAAG,EAAE,CAAC;YACjB,SAAS,GAAG,EAAE,CAAC;YACf,UAAU,GAAG,EAAE,CAAC;QACpB,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,oBAAoB,EAAE;YACrC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE;gBACxB,IAAI,qBAAqB,KAAK,QAAQ;oBAClC,KAAK,EAAE,CAAC;gBAEZ,qBAAqB,GAAG,QAAQ,CAAC;gBACjC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAC/B;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE;gBAC7B,IAAI,qBAAqB,KAAK,QAAQ,IAAI,qBAAqB,KAAK,MAAM;oBACtE,KAAK,EAAE,CAAC;gBAEZ,qBAAqB,GAAG,MAAM,CAAC;gBAC/B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAC7B;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE;gBAC9B,qBAAqB,GAAG,OAAO,CAAC;gBAChC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;aAClE;SACJ;QAED,KAAK,EAAE,CAAC;QAER,MAAM,WAAW,GAAG,SAAS,CACzB,WAAW,CAAC,GAAG,CAAC,CAAC,EAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAC,EAAE,KAAK,EAAE,EAAE;YAC7C,MAAM,UAAU,GAAG,KAAK,KAAK,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;YAEpD,OAAO,SAAS,CAAC;gBACb,IAAI,mBAAmB,CAAC,KAAK,CAAC;gBAC9B,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;oBACtC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;oBACf,CAAC,CAAC,SAAS,CAAC;wBACR,IAAI,YAAY,CAAC,SAAS,CAAC;wBAC3B,MAAM,CAAC,MAAM,KAAK,CAAC;4BACf,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;4BACf,CAAC,CAAC,SAAS,CAAC;gCACR,IAAI,YAAY,CAAC,WAAW,CAAC;gCAC7B,MAAM;gCACN,IAAI,YAAY,CAAC,gBAAgB,CAAC;6BACrC,CAAC;wBACN,IAAI;wBACJ,IAAI,YAAY,CAAC,cAAc,CAAC;qBACnC,CAAC;gBACN,KAAK;gBACL,UAAU;oBACN,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;oBACf,CAAC,CAAC,IAAI,mBAAmB,CAAC,KAAK,CAAC;aACvC,CAAC,CAAC;QACP,CAAC,CAAC,CACL,CAAC;QAEF,OAAO;YACH,WAAW;YACX,sBAAsB,EAAE;gBACpB,SAAS,CAAC,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBACzC,SAAS,CAAC,MAAM,CAAC;aACpB;SACJ,CAAC;IACN,CAAC;CACJ"}
|