keyring-agent-core 0.1.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 +169 -0
- package/dist/agent/AgentCore.d.ts +220 -0
- package/dist/agent/AgentCore.d.ts.map +1 -0
- package/dist/agent/AgentCore.js +950 -0
- package/dist/agent/AgentCore.js.map +1 -0
- package/dist/agent/QueryRewriter.d.ts +67 -0
- package/dist/agent/QueryRewriter.d.ts.map +1 -0
- package/dist/agent/QueryRewriter.js +262 -0
- package/dist/agent/QueryRewriter.js.map +1 -0
- package/dist/agent/Router.d.ts +33 -0
- package/dist/agent/Router.d.ts.map +1 -0
- package/dist/agent/Router.js +191 -0
- package/dist/agent/Router.js.map +1 -0
- package/dist/agent/Subagent.d.ts +63 -0
- package/dist/agent/Subagent.d.ts.map +1 -0
- package/dist/agent/Subagent.js +240 -0
- package/dist/agent/Subagent.js.map +1 -0
- package/dist/agent/Synthesizer.d.ts +11 -0
- package/dist/agent/Synthesizer.d.ts.map +1 -0
- package/dist/agent/Synthesizer.js +86 -0
- package/dist/agent/Synthesizer.js.map +1 -0
- package/dist/agent/index.d.ts +10 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +24 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/subagents/AiAgent.d.ts +6 -0
- package/dist/agent/subagents/AiAgent.d.ts.map +1 -0
- package/dist/agent/subagents/AiAgent.js +48 -0
- package/dist/agent/subagents/AiAgent.js.map +1 -0
- package/dist/agent/subagents/NftAgent.d.ts +6 -0
- package/dist/agent/subagents/NftAgent.d.ts.map +1 -0
- package/dist/agent/subagents/NftAgent.js +69 -0
- package/dist/agent/subagents/NftAgent.js.map +1 -0
- package/dist/agent/subagents/PoolAgent.d.ts +6 -0
- package/dist/agent/subagents/PoolAgent.d.ts.map +1 -0
- package/dist/agent/subagents/PoolAgent.js +184 -0
- package/dist/agent/subagents/PoolAgent.js.map +1 -0
- package/dist/agent/subagents/TokenAgent.d.ts +6 -0
- package/dist/agent/subagents/TokenAgent.d.ts.map +1 -0
- package/dist/agent/subagents/TokenAgent.js +75 -0
- package/dist/agent/subagents/TokenAgent.js.map +1 -0
- package/dist/agent/subagents/WalletAgent.d.ts +6 -0
- package/dist/agent/subagents/WalletAgent.d.ts.map +1 -0
- package/dist/agent/subagents/WalletAgent.js +92 -0
- package/dist/agent/subagents/WalletAgent.js.map +1 -0
- package/dist/agent/subagents/index.d.ts +14 -0
- package/dist/agent/subagents/index.d.ts.map +1 -0
- package/dist/agent/subagents/index.js +38 -0
- package/dist/agent/subagents/index.js.map +1 -0
- package/dist/constants/abi.d.ts +520 -0
- package/dist/constants/abi.d.ts.map +1 -0
- package/dist/constants/abi.js +667 -0
- package/dist/constants/abi.js.map +1 -0
- package/dist/functions/pool.d.ts +25 -0
- package/dist/functions/pool.d.ts.map +1 -0
- package/dist/functions/pool.js +151 -0
- package/dist/functions/pool.js.map +1 -0
- package/dist/functions/web3.d.ts +32 -0
- package/dist/functions/web3.d.ts.map +1 -0
- package/dist/functions/web3.js +277 -0
- package/dist/functions/web3.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +65 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/GeminiProvider.d.ts +16 -0
- package/dist/llm/GeminiProvider.d.ts.map +1 -0
- package/dist/llm/GeminiProvider.js +248 -0
- package/dist/llm/GeminiProvider.js.map +1 -0
- package/dist/llm/index.d.ts +2 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +6 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/memory/ChatHistory.d.ts +83 -0
- package/dist/memory/ChatHistory.d.ts.map +1 -0
- package/dist/memory/ChatHistory.js +143 -0
- package/dist/memory/ChatHistory.js.map +1 -0
- package/dist/memory/KnowledgeBase.d.ts +38 -0
- package/dist/memory/KnowledgeBase.d.ts.map +1 -0
- package/dist/memory/KnowledgeBase.js +139 -0
- package/dist/memory/KnowledgeBase.js.map +1 -0
- package/dist/memory/Summarizer.d.ts +12 -0
- package/dist/memory/Summarizer.d.ts.map +1 -0
- package/dist/memory/Summarizer.js +39 -0
- package/dist/memory/Summarizer.js.map +1 -0
- package/dist/memory/UpstashKnowledgeBase.d.ts +124 -0
- package/dist/memory/UpstashKnowledgeBase.d.ts.map +1 -0
- package/dist/memory/UpstashKnowledgeBase.js +152 -0
- package/dist/memory/UpstashKnowledgeBase.js.map +1 -0
- package/dist/memory/historyUtils.d.ts +58 -0
- package/dist/memory/historyUtils.d.ts.map +1 -0
- package/dist/memory/historyUtils.js +190 -0
- package/dist/memory/historyUtils.js.map +1 -0
- package/dist/memory/index.d.ts +7 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +12 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/ingestKnowledgeBase.d.ts +17 -0
- package/dist/memory/ingestKnowledgeBase.d.ts.map +1 -0
- package/dist/memory/ingestKnowledgeBase.js +35 -0
- package/dist/memory/ingestKnowledgeBase.js.map +1 -0
- package/dist/services/MoralisService.d.ts +1350 -0
- package/dist/services/MoralisService.d.ts.map +1 -0
- package/dist/services/MoralisService.js +1364 -0
- package/dist/services/MoralisService.js.map +1 -0
- package/dist/services/PantographService.d.ts +38 -0
- package/dist/services/PantographService.d.ts.map +1 -0
- package/dist/services/PantographService.js +199 -0
- package/dist/services/PantographService.js.map +1 -0
- package/dist/services/PoolService.d.ts +241 -0
- package/dist/services/PoolService.d.ts.map +1 -0
- package/dist/services/PoolService.js +507 -0
- package/dist/services/PoolService.js.map +1 -0
- package/dist/services/UniswapService.d.ts +289 -0
- package/dist/services/UniswapService.d.ts.map +1 -0
- package/dist/services/UniswapService.js +585 -0
- package/dist/services/UniswapService.js.map +1 -0
- package/dist/services/swap/BaseSwapService.d.ts +17 -0
- package/dist/services/swap/BaseSwapService.d.ts.map +1 -0
- package/dist/services/swap/BaseSwapService.js +19 -0
- package/dist/services/swap/BaseSwapService.js.map +1 -0
- package/dist/services/swap/DebridgeAdapter.d.ts +20 -0
- package/dist/services/swap/DebridgeAdapter.d.ts.map +1 -0
- package/dist/services/swap/DebridgeAdapter.js +175 -0
- package/dist/services/swap/DebridgeAdapter.js.map +1 -0
- package/dist/services/swap/RelayAdapter.d.ts +19 -0
- package/dist/services/swap/RelayAdapter.d.ts.map +1 -0
- package/dist/services/swap/RelayAdapter.js +189 -0
- package/dist/services/swap/RelayAdapter.js.map +1 -0
- package/dist/services/swap/SwapServiceFactory.d.ts +24 -0
- package/dist/services/swap/SwapServiceFactory.d.ts.map +1 -0
- package/dist/services/swap/SwapServiceFactory.js +74 -0
- package/dist/services/swap/SwapServiceFactory.js.map +1 -0
- package/dist/services/swap/addresses.d.ts +3 -0
- package/dist/services/swap/addresses.d.ts.map +1 -0
- package/dist/services/swap/addresses.js +68 -0
- package/dist/services/swap/addresses.js.map +1 -0
- package/dist/services/swap/affiliate.d.ts +17 -0
- package/dist/services/swap/affiliate.d.ts.map +1 -0
- package/dist/services/swap/affiliate.js +126 -0
- package/dist/services/swap/affiliate.js.map +1 -0
- package/dist/services/swap/config.d.ts +9 -0
- package/dist/services/swap/config.d.ts.map +1 -0
- package/dist/services/swap/config.js +19 -0
- package/dist/services/swap/config.js.map +1 -0
- package/dist/services/swap/index.d.ts +10 -0
- package/dist/services/swap/index.d.ts.map +1 -0
- package/dist/services/swap/index.js +22 -0
- package/dist/services/swap/index.js.map +1 -0
- package/dist/services/swap/types.d.ts +89 -0
- package/dist/services/swap/types.d.ts.map +1 -0
- package/dist/services/swap/types.js +6 -0
- package/dist/services/swap/types.js.map +1 -0
- package/dist/tools/BaseTool.d.ts +15 -0
- package/dist/tools/BaseTool.d.ts.map +1 -0
- package/dist/tools/BaseTool.js +35 -0
- package/dist/tools/BaseTool.js.map +1 -0
- package/dist/tools/ToolRegistry.d.ts +27 -0
- package/dist/tools/ToolRegistry.d.ts.map +1 -0
- package/dist/tools/ToolRegistry.js +80 -0
- package/dist/tools/ToolRegistry.js.map +1 -0
- package/dist/tools/builtin/ai/MoralisCortexTool.d.ts +33 -0
- package/dist/tools/builtin/ai/MoralisCortexTool.d.ts.map +1 -0
- package/dist/tools/builtin/ai/MoralisCortexTool.js +76 -0
- package/dist/tools/builtin/ai/MoralisCortexTool.js.map +1 -0
- package/dist/tools/builtin/ai/SolanaCortexTool.d.ts +22 -0
- package/dist/tools/builtin/ai/SolanaCortexTool.d.ts.map +1 -0
- package/dist/tools/builtin/ai/SolanaCortexTool.js +80 -0
- package/dist/tools/builtin/ai/SolanaCortexTool.js.map +1 -0
- package/dist/tools/builtin/ai/index.d.ts +5 -0
- package/dist/tools/builtin/ai/index.d.ts.map +1 -0
- package/dist/tools/builtin/ai/index.js +8 -0
- package/dist/tools/builtin/ai/index.js.map +1 -0
- package/dist/tools/builtin/index.d.ts +6 -0
- package/dist/tools/builtin/index.d.ts.map +1 -0
- package/dist/tools/builtin/index.js +22 -0
- package/dist/tools/builtin/index.js.map +1 -0
- package/dist/tools/builtin/nft/NFTContractInfoTool.d.ts +21 -0
- package/dist/tools/builtin/nft/NFTContractInfoTool.d.ts.map +1 -0
- package/dist/tools/builtin/nft/NFTContractInfoTool.js +54 -0
- package/dist/tools/builtin/nft/NFTContractInfoTool.js.map +1 -0
- package/dist/tools/builtin/nft/NFTMetadataTool.d.ts +121 -0
- package/dist/tools/builtin/nft/NFTMetadataTool.d.ts.map +1 -0
- package/dist/tools/builtin/nft/NFTMetadataTool.js +159 -0
- package/dist/tools/builtin/nft/NFTMetadataTool.js.map +1 -0
- package/dist/tools/builtin/nft/WalletNFTsTool.d.ts +82 -0
- package/dist/tools/builtin/nft/WalletNFTsTool.d.ts.map +1 -0
- package/dist/tools/builtin/nft/WalletNFTsTool.js +172 -0
- package/dist/tools/builtin/nft/WalletNFTsTool.js.map +1 -0
- package/dist/tools/builtin/nft/index.d.ts +7 -0
- package/dist/tools/builtin/nft/index.d.ts.map +1 -0
- package/dist/tools/builtin/nft/index.js +10 -0
- package/dist/tools/builtin/nft/index.js.map +1 -0
- package/dist/tools/builtin/pool/EstimatePoolYieldTool.d.ts +124 -0
- package/dist/tools/builtin/pool/EstimatePoolYieldTool.d.ts.map +1 -0
- package/dist/tools/builtin/pool/EstimatePoolYieldTool.js +235 -0
- package/dist/tools/builtin/pool/EstimatePoolYieldTool.js.map +1 -0
- package/dist/tools/builtin/pool/OpenAddLiquidityFormTool.d.ts +127 -0
- package/dist/tools/builtin/pool/OpenAddLiquidityFormTool.d.ts.map +1 -0
- package/dist/tools/builtin/pool/OpenAddLiquidityFormTool.js +517 -0
- package/dist/tools/builtin/pool/OpenAddLiquidityFormTool.js.map +1 -0
- package/dist/tools/builtin/pool/PoolByAddressTool.d.ts +127 -0
- package/dist/tools/builtin/pool/PoolByAddressTool.d.ts.map +1 -0
- package/dist/tools/builtin/pool/PoolByAddressTool.js +237 -0
- package/dist/tools/builtin/pool/PoolByAddressTool.js.map +1 -0
- package/dist/tools/builtin/pool/PoolDetailTool.d.ts +127 -0
- package/dist/tools/builtin/pool/PoolDetailTool.d.ts.map +1 -0
- package/dist/tools/builtin/pool/PoolDetailTool.js +272 -0
- package/dist/tools/builtin/pool/PoolDetailTool.js.map +1 -0
- package/dist/tools/builtin/pool/PoolSearchTool.d.ts +50 -0
- package/dist/tools/builtin/pool/PoolSearchTool.d.ts.map +1 -0
- package/dist/tools/builtin/pool/PoolSearchTool.js +159 -0
- package/dist/tools/builtin/pool/PoolSearchTool.js.map +1 -0
- package/dist/tools/builtin/pool/PreviewAddLiquidityTool.d.ts +123 -0
- package/dist/tools/builtin/pool/PreviewAddLiquidityTool.d.ts.map +1 -0
- package/dist/tools/builtin/pool/PreviewAddLiquidityTool.js +380 -0
- package/dist/tools/builtin/pool/PreviewAddLiquidityTool.js.map +1 -0
- package/dist/tools/builtin/pool/TopPoolsTool.d.ts +68 -0
- package/dist/tools/builtin/pool/TopPoolsTool.d.ts.map +1 -0
- package/dist/tools/builtin/pool/TopPoolsTool.js +158 -0
- package/dist/tools/builtin/pool/TopPoolsTool.js.map +1 -0
- package/dist/tools/builtin/pool/index.d.ts +15 -0
- package/dist/tools/builtin/pool/index.d.ts.map +1 -0
- package/dist/tools/builtin/pool/index.js +18 -0
- package/dist/tools/builtin/pool/index.js.map +1 -0
- package/dist/tools/builtin/token/TokenAnalyticsTool.d.ts +71 -0
- package/dist/tools/builtin/token/TokenAnalyticsTool.d.ts.map +1 -0
- package/dist/tools/builtin/token/TokenAnalyticsTool.js +146 -0
- package/dist/tools/builtin/token/TokenAnalyticsTool.js.map +1 -0
- package/dist/tools/builtin/token/TokenHoldersTool.d.ts +81 -0
- package/dist/tools/builtin/token/TokenHoldersTool.d.ts.map +1 -0
- package/dist/tools/builtin/token/TokenHoldersTool.js +138 -0
- package/dist/tools/builtin/token/TokenHoldersTool.js.map +1 -0
- package/dist/tools/builtin/token/TokenInfoTool.d.ts +36 -0
- package/dist/tools/builtin/token/TokenInfoTool.d.ts.map +1 -0
- package/dist/tools/builtin/token/TokenInfoTool.js +163 -0
- package/dist/tools/builtin/token/TokenInfoTool.js.map +1 -0
- package/dist/tools/builtin/token/TokenScoreTool.d.ts +63 -0
- package/dist/tools/builtin/token/TokenScoreTool.d.ts.map +1 -0
- package/dist/tools/builtin/token/TokenScoreTool.js +147 -0
- package/dist/tools/builtin/token/TokenScoreTool.js.map +1 -0
- package/dist/tools/builtin/token/TopGainersTool.d.ts +46 -0
- package/dist/tools/builtin/token/TopGainersTool.d.ts.map +1 -0
- package/dist/tools/builtin/token/TopGainersTool.js +110 -0
- package/dist/tools/builtin/token/TopGainersTool.js.map +1 -0
- package/dist/tools/builtin/token/TopLosersTool.d.ts +66 -0
- package/dist/tools/builtin/token/TopLosersTool.d.ts.map +1 -0
- package/dist/tools/builtin/token/TopLosersTool.js +128 -0
- package/dist/tools/builtin/token/TopLosersTool.js.map +1 -0
- package/dist/tools/builtin/token/TrendingTokensTool.d.ts +39 -0
- package/dist/tools/builtin/token/TrendingTokensTool.d.ts.map +1 -0
- package/dist/tools/builtin/token/TrendingTokensTool.js +75 -0
- package/dist/tools/builtin/token/TrendingTokensTool.js.map +1 -0
- package/dist/tools/builtin/token/index.d.ts +15 -0
- package/dist/tools/builtin/token/index.d.ts.map +1 -0
- package/dist/tools/builtin/token/index.js +18 -0
- package/dist/tools/builtin/token/index.js.map +1 -0
- package/dist/tools/builtin/wallet/TransactionByHashTool.d.ts +70 -0
- package/dist/tools/builtin/wallet/TransactionByHashTool.d.ts.map +1 -0
- package/dist/tools/builtin/wallet/TransactionByHashTool.js +110 -0
- package/dist/tools/builtin/wallet/TransactionByHashTool.js.map +1 -0
- package/dist/tools/builtin/wallet/WalletApprovalsTool.d.ts +107 -0
- package/dist/tools/builtin/wallet/WalletApprovalsTool.d.ts.map +1 -0
- package/dist/tools/builtin/wallet/WalletApprovalsTool.js +163 -0
- package/dist/tools/builtin/wallet/WalletApprovalsTool.js.map +1 -0
- package/dist/tools/builtin/wallet/WalletDefiPositionsTool.d.ts +61 -0
- package/dist/tools/builtin/wallet/WalletDefiPositionsTool.d.ts.map +1 -0
- package/dist/tools/builtin/wallet/WalletDefiPositionsTool.js +99 -0
- package/dist/tools/builtin/wallet/WalletDefiPositionsTool.js.map +1 -0
- package/dist/tools/builtin/wallet/WalletDefiProtocolPositionsTool.d.ts +68 -0
- package/dist/tools/builtin/wallet/WalletDefiProtocolPositionsTool.d.ts.map +1 -0
- package/dist/tools/builtin/wallet/WalletDefiProtocolPositionsTool.js +114 -0
- package/dist/tools/builtin/wallet/WalletDefiProtocolPositionsTool.js.map +1 -0
- package/dist/tools/builtin/wallet/WalletDefiSummaryTool.d.ts +50 -0
- package/dist/tools/builtin/wallet/WalletDefiSummaryTool.d.ts.map +1 -0
- package/dist/tools/builtin/wallet/WalletDefiSummaryTool.js +79 -0
- package/dist/tools/builtin/wallet/WalletDefiSummaryTool.js.map +1 -0
- package/dist/tools/builtin/wallet/WalletHistoryTool.d.ts +31 -0
- package/dist/tools/builtin/wallet/WalletHistoryTool.d.ts.map +1 -0
- package/dist/tools/builtin/wallet/WalletHistoryTool.js +153 -0
- package/dist/tools/builtin/wallet/WalletHistoryTool.js.map +1 -0
- package/dist/tools/builtin/wallet/WalletNetWorthTool.d.ts +44 -0
- package/dist/tools/builtin/wallet/WalletNetWorthTool.d.ts.map +1 -0
- package/dist/tools/builtin/wallet/WalletNetWorthTool.js +122 -0
- package/dist/tools/builtin/wallet/WalletNetWorthTool.js.map +1 -0
- package/dist/tools/builtin/wallet/WalletNftTransfersTool.d.ts +86 -0
- package/dist/tools/builtin/wallet/WalletNftTransfersTool.d.ts.map +1 -0
- package/dist/tools/builtin/wallet/WalletNftTransfersTool.js +264 -0
- package/dist/tools/builtin/wallet/WalletNftTransfersTool.js.map +1 -0
- package/dist/tools/builtin/wallet/WalletPnlSummaryTool.d.ts +43 -0
- package/dist/tools/builtin/wallet/WalletPnlSummaryTool.d.ts.map +1 -0
- package/dist/tools/builtin/wallet/WalletPnlSummaryTool.js +88 -0
- package/dist/tools/builtin/wallet/WalletPnlSummaryTool.js.map +1 -0
- package/dist/tools/builtin/wallet/WalletPnlTool.d.ts +43 -0
- package/dist/tools/builtin/wallet/WalletPnlTool.d.ts.map +1 -0
- package/dist/tools/builtin/wallet/WalletPnlTool.js +174 -0
- package/dist/tools/builtin/wallet/WalletPnlTool.js.map +1 -0
- package/dist/tools/builtin/wallet/WalletTokenBalancesTool.d.ts +35 -0
- package/dist/tools/builtin/wallet/WalletTokenBalancesTool.d.ts.map +1 -0
- package/dist/tools/builtin/wallet/WalletTokenBalancesTool.js +67 -0
- package/dist/tools/builtin/wallet/WalletTokenBalancesTool.js.map +1 -0
- package/dist/tools/builtin/wallet/WalletTokenTransfersTool.d.ts +109 -0
- package/dist/tools/builtin/wallet/WalletTokenTransfersTool.d.ts.map +1 -0
- package/dist/tools/builtin/wallet/WalletTokenTransfersTool.js +353 -0
- package/dist/tools/builtin/wallet/WalletTokenTransfersTool.js.map +1 -0
- package/dist/tools/builtin/wallet/index.d.ts +25 -0
- package/dist/tools/builtin/wallet/index.d.ts.map +1 -0
- package/dist/tools/builtin/wallet/index.js +28 -0
- package/dist/tools/builtin/wallet/index.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +23 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types/index.d.ts +566 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeminiProvider.d.ts","sourceRoot":"","sources":["../../src/llm/GeminiProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,WAAW,EAEX,cAAc,EACf,MAAM,UAAU,CAAC;AAqClB;;;GAGG;AACH,qBAAa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,iBAAiB;IAO/B,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,EAAE,cAAc,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAsG1G,OAAO,CAAC,UAAU;IAwHlB,OAAO,CAAC,sBAAsB;CAgC/B"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GeminiProvider = void 0;
|
|
4
|
+
const PARAM_TYPE_MAP = {
|
|
5
|
+
string: 'STRING',
|
|
6
|
+
number: 'NUMBER',
|
|
7
|
+
boolean: 'BOOLEAN',
|
|
8
|
+
object: 'OBJECT',
|
|
9
|
+
array: 'ARRAY',
|
|
10
|
+
};
|
|
11
|
+
const DEFAULT_BASE_URL = 'https://nft-demo.keyring.app/api/gemini-stable';
|
|
12
|
+
/**
|
|
13
|
+
* LLM provider that calls the Gemini-compatible proxy via fetch.
|
|
14
|
+
* No API key required — the proxy handles authentication.
|
|
15
|
+
*/
|
|
16
|
+
class GeminiProvider {
|
|
17
|
+
model;
|
|
18
|
+
maxTokens;
|
|
19
|
+
temperature;
|
|
20
|
+
baseUrl;
|
|
21
|
+
constructor(config) {
|
|
22
|
+
this.model = config.model ?? 'gemini-2.5-flash-lite';
|
|
23
|
+
this.maxTokens = config.maxTokens ?? 4096;
|
|
24
|
+
this.temperature = config.temperature ?? 1;
|
|
25
|
+
this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
|
|
26
|
+
}
|
|
27
|
+
async chat(messages, tools, options) {
|
|
28
|
+
const { systemInstruction, contents } = this.toContents(messages);
|
|
29
|
+
const { maxRetries = 5, retryDelayMs = 1000 } = options ?? {};
|
|
30
|
+
// Gemini rejects empty `contents`. If the caller only sent system
|
|
31
|
+
// message(s), synthesize a minimal user turn so the request is valid.
|
|
32
|
+
const safeContents = contents.length > 0 ? contents : [{ role: 'user', parts: [{ text: '(continue)' }] }];
|
|
33
|
+
// Debug: log the exact turn sequence so ordering violations are visible.
|
|
34
|
+
if (options?.['_debug']) {
|
|
35
|
+
console.log('[GeminiProvider] turn sequence:');
|
|
36
|
+
for (const c of safeContents) {
|
|
37
|
+
const partSummary = c.parts
|
|
38
|
+
.map((p) => p.functionCall
|
|
39
|
+
? `fc:${p.functionCall.name}`
|
|
40
|
+
: p.functionResponse
|
|
41
|
+
? `fr:${p.functionResponse.name}`
|
|
42
|
+
: `text:${(p.text ?? '').slice(0, 40)}`)
|
|
43
|
+
.join(', ');
|
|
44
|
+
console.log(` ${c.role}: [${partSummary}]`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const body = {
|
|
48
|
+
contents: safeContents,
|
|
49
|
+
generationConfig: {
|
|
50
|
+
maxOutputTokens: this.maxTokens,
|
|
51
|
+
temperature: this.temperature,
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
if (systemInstruction) {
|
|
55
|
+
body.systemInstruction = systemInstruction;
|
|
56
|
+
}
|
|
57
|
+
if (tools?.length) {
|
|
58
|
+
body.tools = [{ functionDeclarations: this.toFunctionDeclarations(tools) }];
|
|
59
|
+
}
|
|
60
|
+
else if (options?.googleSearch) {
|
|
61
|
+
body.tools = [{ googleSearch: {} }];
|
|
62
|
+
}
|
|
63
|
+
const url = `${this.baseUrl}/v1beta/models/${this.model}:generateContent`;
|
|
64
|
+
let lastError = 'Unknown error';
|
|
65
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
66
|
+
try {
|
|
67
|
+
const res = await fetch(url, {
|
|
68
|
+
method: 'POST',
|
|
69
|
+
headers: { 'Content-Type': 'application/json' },
|
|
70
|
+
body: JSON.stringify(body),
|
|
71
|
+
});
|
|
72
|
+
if (!res.ok) {
|
|
73
|
+
const errText = await res.text().catch(() => res.statusText);
|
|
74
|
+
throw new Error(`Gemini proxy error ${res.status}: ${errText}`);
|
|
75
|
+
}
|
|
76
|
+
const data = (await res.json());
|
|
77
|
+
const candidate = data.candidates?.[0];
|
|
78
|
+
if (!candidate) {
|
|
79
|
+
return { text: '', toolCalls: [] };
|
|
80
|
+
}
|
|
81
|
+
let text = '';
|
|
82
|
+
const toolCalls = [];
|
|
83
|
+
for (const part of candidate.content.parts) {
|
|
84
|
+
if (part.text) {
|
|
85
|
+
text += part.text;
|
|
86
|
+
}
|
|
87
|
+
if (part.functionCall) {
|
|
88
|
+
toolCalls.push({
|
|
89
|
+
toolName: part.functionCall.name,
|
|
90
|
+
args: part.functionCall.args ?? {},
|
|
91
|
+
callId: part.functionCall.id ?? `call_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const usage = data.usageMetadata
|
|
96
|
+
? {
|
|
97
|
+
promptTokens: data.usageMetadata.promptTokenCount ?? 0,
|
|
98
|
+
completionTokens: data.usageMetadata.candidatesTokenCount ?? 0,
|
|
99
|
+
totalTokens: data.usageMetadata.totalTokenCount ?? 0,
|
|
100
|
+
}
|
|
101
|
+
: undefined;
|
|
102
|
+
return { text, toolCalls, usage };
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
lastError = error instanceof Error ? error.message : String(error);
|
|
106
|
+
if (attempt < maxRetries)
|
|
107
|
+
await new Promise((r) => setTimeout(r, retryDelayMs));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
throw new Error(lastError);
|
|
111
|
+
}
|
|
112
|
+
// ---- helpers ----
|
|
113
|
+
toContents(messages) {
|
|
114
|
+
const systemParts = [];
|
|
115
|
+
const raw = [];
|
|
116
|
+
for (const msg of messages) {
|
|
117
|
+
if (msg.role === 'system') {
|
|
118
|
+
systemParts.push(msg.content);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
if (msg.role === 'tool') {
|
|
122
|
+
raw.push({
|
|
123
|
+
role: 'function',
|
|
124
|
+
parts: [
|
|
125
|
+
{
|
|
126
|
+
functionResponse: {
|
|
127
|
+
name: msg.toolName ?? 'unknown',
|
|
128
|
+
response: { result: msg.content },
|
|
129
|
+
...(msg.toolCallId ? { id: msg.toolCallId } : {}),
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
],
|
|
133
|
+
});
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (msg.role === 'assistant' && msg.toolCalls?.length) {
|
|
137
|
+
// functionCall parts MUST be in their own model turn — never merged
|
|
138
|
+
// with text parts, because Gemini requires functionCall to be the
|
|
139
|
+
// only content in that turn.
|
|
140
|
+
raw.push({
|
|
141
|
+
role: 'model',
|
|
142
|
+
parts: msg.toolCalls.map((tc) => ({
|
|
143
|
+
functionCall: {
|
|
144
|
+
name: tc.toolName,
|
|
145
|
+
args: tc.args,
|
|
146
|
+
...(tc.callId ? { id: tc.callId } : {}),
|
|
147
|
+
},
|
|
148
|
+
})),
|
|
149
|
+
});
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
raw.push({
|
|
153
|
+
role: msg.role === 'assistant' ? 'model' : 'user',
|
|
154
|
+
parts: [{ text: msg.content }],
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
// Merge consecutive messages with the same role (Gemini rejects them),
|
|
158
|
+
// BUT never merge a functionCall model turn with a plain text model turn —
|
|
159
|
+
// Gemini requires functionCall to be the sole content in its turn.
|
|
160
|
+
const merged = [];
|
|
161
|
+
for (const item of raw) {
|
|
162
|
+
const last = merged[merged.length - 1];
|
|
163
|
+
const itemHasFunctionCall = item.parts.some((p) => p.functionCall);
|
|
164
|
+
const lastHasFunctionCall = last?.parts.some((p) => p.functionCall);
|
|
165
|
+
if (last && last.role === item.role && !itemHasFunctionCall && !lastHasFunctionCall) {
|
|
166
|
+
last.parts.push(...item.parts);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
merged.push({ ...item, parts: [...item.parts] });
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Enforce Gemini turn-order rules by dropping invalid messages:
|
|
173
|
+
// 1. A 'function' turn must be immediately preceded by a 'model' turn
|
|
174
|
+
// that contains functionCall parts.
|
|
175
|
+
// 2. A 'model' turn with functionCall must not be the last turn
|
|
176
|
+
// (the LLM needs to respond after, not hang).
|
|
177
|
+
// We fix violations by dropping the offending message rather than
|
|
178
|
+
// crashing — the LLM will work with less context instead of erroring.
|
|
179
|
+
const contents = [];
|
|
180
|
+
for (let i = 0; i < merged.length; i++) {
|
|
181
|
+
const item = merged[i];
|
|
182
|
+
const prev = contents[contents.length - 1];
|
|
183
|
+
if (item.role === 'function') {
|
|
184
|
+
const prevHasFunctionCall = prev?.parts.some((p) => p.functionCall);
|
|
185
|
+
if (!prevHasFunctionCall) {
|
|
186
|
+
// Orphan function response — drop it to avoid 400
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (item.role === 'model') {
|
|
191
|
+
const hasFunctionCall = item.parts.some((p) => p.functionCall);
|
|
192
|
+
if (hasFunctionCall) {
|
|
193
|
+
// Look ahead: if no function response follows, drop this turn
|
|
194
|
+
// because an unanswered functionCall at the end of history is invalid.
|
|
195
|
+
const nextIsFunctionResponse = merged[i + 1]?.role === 'function';
|
|
196
|
+
if (!nextIsFunctionResponse) {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
contents.push(item);
|
|
202
|
+
}
|
|
203
|
+
// Gemini requires the last turn to be 'user' or 'function'.
|
|
204
|
+
// If the last content is a 'model' text turn, it's safe to keep (the API
|
|
205
|
+
// will respond to it). But a trailing 'model(functionCall)' was already
|
|
206
|
+
// dropped above. No further action needed.
|
|
207
|
+
// Gemini requires contents[0] to be 'user'. If the history slice starts
|
|
208
|
+
// with model/function turns (e.g. when a history window starts mid tool
|
|
209
|
+
// exchange), drop leading turns until we reach the first 'user' turn.
|
|
210
|
+
while (contents.length > 0 && contents[0].role !== 'user') {
|
|
211
|
+
contents.shift();
|
|
212
|
+
}
|
|
213
|
+
const systemInstruction = systemParts.length ? { role: 'user', parts: [{ text: systemParts.join('\n') }] } : null;
|
|
214
|
+
return { systemInstruction, contents };
|
|
215
|
+
}
|
|
216
|
+
toFunctionDeclarations(tools) {
|
|
217
|
+
return tools.map((tool) => {
|
|
218
|
+
const properties = {};
|
|
219
|
+
const required = [];
|
|
220
|
+
for (const param of tool.parameters) {
|
|
221
|
+
const prop = {
|
|
222
|
+
type: PARAM_TYPE_MAP[param.type] ?? 'STRING',
|
|
223
|
+
description: param.description,
|
|
224
|
+
};
|
|
225
|
+
if (param.type === 'array') {
|
|
226
|
+
prop.items = {
|
|
227
|
+
type: PARAM_TYPE_MAP[param.items?.type ?? 'string'] ?? 'STRING',
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
properties[param.name] = prop;
|
|
231
|
+
if (param.required) {
|
|
232
|
+
required.push(param.name);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
name: tool.name,
|
|
237
|
+
description: tool.description,
|
|
238
|
+
parameters: {
|
|
239
|
+
type: 'OBJECT',
|
|
240
|
+
properties,
|
|
241
|
+
required,
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
exports.GeminiProvider = GeminiProvider;
|
|
248
|
+
//# sourceMappingURL=GeminiProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeminiProvider.js","sourceRoot":"","sources":["../../src/llm/GeminiProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GeminiProvider = void 0;
|
|
4
|
+
var GeminiProvider_1 = require("./GeminiProvider");
|
|
5
|
+
Object.defineProperty(exports, "GeminiProvider", { enumerable: true, get: function () { return GeminiProvider_1.GeminiProvider; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":";;;AAAA,mDAAkD;AAAzC,gHAAA,cAAc,OAAA"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { ChatMessage } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Manages conversation history for a single session.
|
|
4
|
+
*
|
|
5
|
+
* Two parallel stores:
|
|
6
|
+
* - `messages` — working window for the LLM (gets compacted when too long)
|
|
7
|
+
* - `fullMessages` — append-only log of every message (never truncated, for UI export)
|
|
8
|
+
*
|
|
9
|
+
* Summary is kept separately so it never conflicts with component system prompts.
|
|
10
|
+
*/
|
|
11
|
+
export declare class ChatHistory {
|
|
12
|
+
private messages;
|
|
13
|
+
private fullMessages;
|
|
14
|
+
private summary;
|
|
15
|
+
private maxMessages;
|
|
16
|
+
constructor(maxMessages?: number);
|
|
17
|
+
/** Add a message to the history. */
|
|
18
|
+
add(message: ChatMessage): void;
|
|
19
|
+
/** Add multiple messages. */
|
|
20
|
+
addMany(messages: ChatMessage[]): void;
|
|
21
|
+
/**
|
|
22
|
+
* Add a message to the UI log only — does NOT enter the working window.
|
|
23
|
+
* Use for KB-answered turns: the user still sees them in the chat UI, but
|
|
24
|
+
* they never pollute the LLM context that subagents and the router analyze.
|
|
25
|
+
*/
|
|
26
|
+
addUIOnly(message: ChatMessage): void;
|
|
27
|
+
/**
|
|
28
|
+
* Remove the last message from the working window without touching fullMessages.
|
|
29
|
+
* Used to roll back an addUserMessage() when the turn is handled by KB and
|
|
30
|
+
* should not enter the LLM working context.
|
|
31
|
+
*/
|
|
32
|
+
rollbackLastWorkingMessage(): void;
|
|
33
|
+
/** Get the working message window (may be compacted). */
|
|
34
|
+
getAll(): ChatMessage[];
|
|
35
|
+
/** Get the complete untruncated message history (for UI export). */
|
|
36
|
+
getAllFull(): ChatMessage[];
|
|
37
|
+
/** Get the last N messages. */
|
|
38
|
+
getRecent(n: number): ChatMessage[];
|
|
39
|
+
/**
|
|
40
|
+
* Get conversation messages for LLM consumption.
|
|
41
|
+
* Prepends summary (if any) as a system message, then the working window.
|
|
42
|
+
*/
|
|
43
|
+
getConversation(): ChatMessage[];
|
|
44
|
+
/** Total message count (working window). */
|
|
45
|
+
get length(): number;
|
|
46
|
+
/**
|
|
47
|
+
* Whether the history should be summarized.
|
|
48
|
+
*
|
|
49
|
+
* Counts logical turns (user messages) rather than raw message count.
|
|
50
|
+
* Tool call/response pairs and _intermediate bridge messages inflate the
|
|
51
|
+
* raw count significantly per turn, so checking messages.length would
|
|
52
|
+
* trigger compaction far too early.
|
|
53
|
+
*/
|
|
54
|
+
needsSummary(): boolean;
|
|
55
|
+
/** Current summary text (if any). */
|
|
56
|
+
getSummary(): string | null;
|
|
57
|
+
/**
|
|
58
|
+
* Compact the working window: keep only the last N messages and store the
|
|
59
|
+
* summary. fullMessages is never touched.
|
|
60
|
+
*/
|
|
61
|
+
compact(summary: string, keepLast?: number): void;
|
|
62
|
+
/**
|
|
63
|
+
* Compact using an explicit tail slice — the caller has already decided
|
|
64
|
+
* which messages to keep (e.g. to avoid splitting a tool-call group).
|
|
65
|
+
* fullMessages is never touched.
|
|
66
|
+
*/
|
|
67
|
+
compactWith(summary: string, keepTail: ChatMessage[]): void;
|
|
68
|
+
/** Clear all history and summary (both working window and full log). */
|
|
69
|
+
clear(): void;
|
|
70
|
+
/** Serialise to JSON-safe object (for persistence). */
|
|
71
|
+
serialise(): {
|
|
72
|
+
messages: ChatMessage[];
|
|
73
|
+
summary: string | null;
|
|
74
|
+
fullMessages: ChatMessage[];
|
|
75
|
+
};
|
|
76
|
+
/** Restore from a serialised object. */
|
|
77
|
+
restore(data: {
|
|
78
|
+
messages: ChatMessage[];
|
|
79
|
+
summary?: string | null;
|
|
80
|
+
fullMessages?: ChatMessage[];
|
|
81
|
+
} | ChatMessage[]): void;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=ChatHistory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatHistory.d.ts","sourceRoot":"","sources":["../../src/memory/ChatHistory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C;;;;;;;;GAQG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,SAAK;IAI5B,oCAAoC;IACpC,GAAG,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAK/B,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI;IAKtC;;;;OAIG;IACH,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAIrC;;;;OAIG;IACH,0BAA0B,IAAI,IAAI;IAIlC,yDAAyD;IACzD,MAAM,IAAI,WAAW,EAAE;IAIvB,oEAAoE;IACpE,UAAU,IAAI,WAAW,EAAE;IAI3B,+BAA+B;IAC/B,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE;IAInC;;;OAGG;IACH,eAAe,IAAI,WAAW,EAAE;IAahC,4CAA4C;IAC5C,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;;;;;;OAOG;IACH,YAAY,IAAI,OAAO;IAKvB,qCAAqC;IACrC,UAAU,IAAI,MAAM,GAAG,IAAI;IAI3B;;;OAGG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,SAAK,GAAG,IAAI;IAK7C;;;;OAIG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI;IAK3D,wEAAwE;IACxE,KAAK,IAAI,IAAI;IAMb,uDAAuD;IACvD,SAAS,IAAI;QAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,YAAY,EAAE,WAAW,EAAE,CAAA;KAAE;IAQ7F,wCAAwC;IACxC,OAAO,CACL,IAAI,EAAE;QAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,YAAY,CAAC,EAAE,WAAW,EAAE,CAAA;KAAE,GAAG,WAAW,EAAE,GACvG,IAAI;CAaR"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ChatHistory = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Manages conversation history for a single session.
|
|
6
|
+
*
|
|
7
|
+
* Two parallel stores:
|
|
8
|
+
* - `messages` — working window for the LLM (gets compacted when too long)
|
|
9
|
+
* - `fullMessages` — append-only log of every message (never truncated, for UI export)
|
|
10
|
+
*
|
|
11
|
+
* Summary is kept separately so it never conflicts with component system prompts.
|
|
12
|
+
*/
|
|
13
|
+
class ChatHistory {
|
|
14
|
+
messages = [];
|
|
15
|
+
fullMessages = [];
|
|
16
|
+
summary = null;
|
|
17
|
+
maxMessages;
|
|
18
|
+
constructor(maxMessages = 50) {
|
|
19
|
+
this.maxMessages = maxMessages;
|
|
20
|
+
}
|
|
21
|
+
/** Add a message to the history. */
|
|
22
|
+
add(message) {
|
|
23
|
+
this.messages.push(message);
|
|
24
|
+
this.fullMessages.push(message);
|
|
25
|
+
}
|
|
26
|
+
/** Add multiple messages. */
|
|
27
|
+
addMany(messages) {
|
|
28
|
+
this.messages.push(...messages);
|
|
29
|
+
this.fullMessages.push(...messages);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Add a message to the UI log only — does NOT enter the working window.
|
|
33
|
+
* Use for KB-answered turns: the user still sees them in the chat UI, but
|
|
34
|
+
* they never pollute the LLM context that subagents and the router analyze.
|
|
35
|
+
*/
|
|
36
|
+
addUIOnly(message) {
|
|
37
|
+
this.fullMessages.push(message);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Remove the last message from the working window without touching fullMessages.
|
|
41
|
+
* Used to roll back an addUserMessage() when the turn is handled by KB and
|
|
42
|
+
* should not enter the LLM working context.
|
|
43
|
+
*/
|
|
44
|
+
rollbackLastWorkingMessage() {
|
|
45
|
+
this.messages.pop();
|
|
46
|
+
}
|
|
47
|
+
/** Get the working message window (may be compacted). */
|
|
48
|
+
getAll() {
|
|
49
|
+
return [...this.messages];
|
|
50
|
+
}
|
|
51
|
+
/** Get the complete untruncated message history (for UI export). */
|
|
52
|
+
getAllFull() {
|
|
53
|
+
return [...this.fullMessages];
|
|
54
|
+
}
|
|
55
|
+
/** Get the last N messages. */
|
|
56
|
+
getRecent(n) {
|
|
57
|
+
return this.messages.slice(-n);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get conversation messages for LLM consumption.
|
|
61
|
+
* Prepends summary (if any) as a system message, then the working window.
|
|
62
|
+
*/
|
|
63
|
+
getConversation() {
|
|
64
|
+
const out = [];
|
|
65
|
+
if (this.summary) {
|
|
66
|
+
out.push({
|
|
67
|
+
role: 'system',
|
|
68
|
+
content: `[Previous conversation summary]: ${this.summary}`,
|
|
69
|
+
timestamp: 0,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
out.push(...this.messages);
|
|
73
|
+
return out;
|
|
74
|
+
}
|
|
75
|
+
/** Total message count (working window). */
|
|
76
|
+
get length() {
|
|
77
|
+
return this.messages.length;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Whether the history should be summarized.
|
|
81
|
+
*
|
|
82
|
+
* Counts logical turns (user messages) rather than raw message count.
|
|
83
|
+
* Tool call/response pairs and _intermediate bridge messages inflate the
|
|
84
|
+
* raw count significantly per turn, so checking messages.length would
|
|
85
|
+
* trigger compaction far too early.
|
|
86
|
+
*/
|
|
87
|
+
needsSummary() {
|
|
88
|
+
const userTurns = this.messages.filter((m) => m.role === 'user').length;
|
|
89
|
+
return userTurns > this.maxMessages;
|
|
90
|
+
}
|
|
91
|
+
/** Current summary text (if any). */
|
|
92
|
+
getSummary() {
|
|
93
|
+
return this.summary;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Compact the working window: keep only the last N messages and store the
|
|
97
|
+
* summary. fullMessages is never touched.
|
|
98
|
+
*/
|
|
99
|
+
compact(summary, keepLast = 10) {
|
|
100
|
+
this.summary = summary;
|
|
101
|
+
this.messages = this.messages.slice(-keepLast);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Compact using an explicit tail slice — the caller has already decided
|
|
105
|
+
* which messages to keep (e.g. to avoid splitting a tool-call group).
|
|
106
|
+
* fullMessages is never touched.
|
|
107
|
+
*/
|
|
108
|
+
compactWith(summary, keepTail) {
|
|
109
|
+
this.summary = summary;
|
|
110
|
+
this.messages = [...keepTail];
|
|
111
|
+
}
|
|
112
|
+
/** Clear all history and summary (both working window and full log). */
|
|
113
|
+
clear() {
|
|
114
|
+
this.messages = [];
|
|
115
|
+
this.fullMessages = [];
|
|
116
|
+
this.summary = null;
|
|
117
|
+
}
|
|
118
|
+
/** Serialise to JSON-safe object (for persistence). */
|
|
119
|
+
serialise() {
|
|
120
|
+
return {
|
|
121
|
+
messages: [...this.messages],
|
|
122
|
+
summary: this.summary,
|
|
123
|
+
fullMessages: [...this.fullMessages],
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/** Restore from a serialised object. */
|
|
127
|
+
restore(data) {
|
|
128
|
+
if (Array.isArray(data)) {
|
|
129
|
+
// Backward compatible: plain array
|
|
130
|
+
this.messages = [...data];
|
|
131
|
+
this.fullMessages = [...data];
|
|
132
|
+
this.summary = null;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
this.messages = [...data.messages];
|
|
136
|
+
this.summary = data.summary ?? null;
|
|
137
|
+
// Backward compatible: if fullMessages not present, seed from messages
|
|
138
|
+
this.fullMessages = data.fullMessages ? [...data.fullMessages] : [...data.messages];
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.ChatHistory = ChatHistory;
|
|
143
|
+
//# sourceMappingURL=ChatHistory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatHistory.js","sourceRoot":"","sources":["../../src/memory/ChatHistory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { KBSearchResult, KnowledgeBaseEntry, KnowledgeBaseProvider, LLMProvider } from '../types';
|
|
2
|
+
export type { KBSearchResult };
|
|
3
|
+
/**
|
|
4
|
+
* Knowledge base with LLM-powered semantic matching.
|
|
5
|
+
* Supports cross-language queries and synonym understanding.
|
|
6
|
+
*
|
|
7
|
+
* Suitable for small KBs (≲ 50 entries) — every search sends the full FAQ
|
|
8
|
+
* list to the LLM. For larger KBs use `UpstashKnowledgeBase` (vector search).
|
|
9
|
+
*/
|
|
10
|
+
export declare class KnowledgeBase implements KnowledgeBaseProvider {
|
|
11
|
+
private entries;
|
|
12
|
+
private llm;
|
|
13
|
+
constructor(entries?: KnowledgeBaseEntry[]);
|
|
14
|
+
/** Attach an LLM provider for semantic matching. */
|
|
15
|
+
setLLM(llm: LLMProvider): void;
|
|
16
|
+
/** Replace all entries. */
|
|
17
|
+
setEntries(entries: KnowledgeBaseEntry[]): void;
|
|
18
|
+
/** Add entries without replacing existing ones. */
|
|
19
|
+
addEntries(entries: KnowledgeBaseEntry[]): void;
|
|
20
|
+
/** Snapshot of current entries (defensive copy). */
|
|
21
|
+
getEntries(): KnowledgeBaseEntry[];
|
|
22
|
+
/** Get total entry count. */
|
|
23
|
+
get size(): number;
|
|
24
|
+
/**
|
|
25
|
+
* Search for entries relevant to the user query using LLM semantic matching.
|
|
26
|
+
* Falls back to basic token matching if LLM is not available.
|
|
27
|
+
*/
|
|
28
|
+
search(query: string, maxResults?: number): Promise<KBSearchResult[]>;
|
|
29
|
+
/** LLM-based semantic search — handles any language + synonyms. */
|
|
30
|
+
private llmSearch;
|
|
31
|
+
/** Basic token-overlap search (fallback). */
|
|
32
|
+
private tokenSearch;
|
|
33
|
+
/** Tokenize text into a set of normalized words. */
|
|
34
|
+
private tokenize;
|
|
35
|
+
/** Jaccard similarity: |A ∩ B| / |A ∪ B| */
|
|
36
|
+
private jaccardSimilarity;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=KnowledgeBase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KnowledgeBase.d.ts","sourceRoot":"","sources":["../../src/memory/KnowledgeBase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,WAAW,EAAe,MAAM,UAAU,CAAC;AAGpH,YAAY,EAAE,cAAc,EAAE,CAAC;AAmB/B;;;;;;GAMG;AACH,qBAAa,aAAc,YAAW,qBAAqB;IACzD,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,GAAG,CAA4B;gBAE3B,OAAO,CAAC,EAAE,kBAAkB,EAAE;IAI1C,oDAAoD;IACpD,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAI9B,2BAA2B;IAC3B,UAAU,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,IAAI;IAI/C,mDAAmD;IACnD,UAAU,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,IAAI;IAI/C,oDAAoD;IACpD,UAAU,IAAI,kBAAkB,EAAE;IAIlC,6BAA6B;IAC7B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;OAGG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,SAAI,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAWtE,mEAAmE;YACrD,SAAS;IAqCvB,6CAA6C;IAC7C,OAAO,CAAC,WAAW;IAmBnB,oDAAoD;IACpD,OAAO,CAAC,QAAQ;IAShB,4CAA4C;IAC5C,OAAO,CAAC,iBAAiB;CAW1B"}
|