@xache/langchain 0.1.0 → 0.2.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/dist/index.d.mts +26 -4
- package/dist/index.d.ts +26 -4
- package/dist/index.js +30 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +30 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/extraction.ts +62 -16
package/dist/index.d.mts
CHANGED
|
@@ -4,6 +4,7 @@ import { BaseMessage } from '@langchain/core/messages';
|
|
|
4
4
|
import { BaseRetriever, BaseRetrieverInput } from '@langchain/core/retrievers';
|
|
5
5
|
import { Document } from '@langchain/core/documents';
|
|
6
6
|
import { CallbackManagerForRetrieverRun } from '@langchain/core/callbacks/manager';
|
|
7
|
+
import { LLMProvider, LLMApiFormat } from '@xache/sdk';
|
|
7
8
|
import { DynamicStructuredTool } from '@langchain/core/tools';
|
|
8
9
|
|
|
9
10
|
/**
|
|
@@ -211,6 +212,7 @@ declare class XacheRetriever extends BaseRetriever {
|
|
|
211
212
|
* Xache Memory Extraction for LangChain.js
|
|
212
213
|
* Auto-extract memories from conversations
|
|
213
214
|
*/
|
|
215
|
+
|
|
214
216
|
interface ExtractedMemory {
|
|
215
217
|
/** Memory content */
|
|
216
218
|
content: string;
|
|
@@ -238,12 +240,28 @@ interface XacheExtractorConfig {
|
|
|
238
240
|
walletAddress: string;
|
|
239
241
|
/** Private key for signing */
|
|
240
242
|
privateKey: string;
|
|
241
|
-
/**
|
|
242
|
-
|
|
243
|
+
/**
|
|
244
|
+
* Extraction mode:
|
|
245
|
+
* - 'xache-managed': Xache provides the LLM ($0.011)
|
|
246
|
+
* - 'api-key': Use major provider with known endpoint ($0.002)
|
|
247
|
+
* - 'endpoint': Use custom/self-hosted endpoint ($0.002)
|
|
248
|
+
*/
|
|
249
|
+
mode?: 'xache-managed' | 'api-key' | 'endpoint';
|
|
243
250
|
/** Your LLM API key (required if mode is 'api-key') */
|
|
244
251
|
llmApiKey?: string;
|
|
245
|
-
/**
|
|
246
|
-
|
|
252
|
+
/**
|
|
253
|
+
* LLM provider for api-key mode
|
|
254
|
+
* Supports: anthropic, openai, google, mistral, groq, together, fireworks, cohere, xai, deepseek
|
|
255
|
+
*/
|
|
256
|
+
llmProvider?: LLMProvider;
|
|
257
|
+
/** Custom endpoint URL (required if mode is 'endpoint') */
|
|
258
|
+
endpointUrl?: string;
|
|
259
|
+
/** Auth token for custom endpoint */
|
|
260
|
+
endpointAuthToken?: string;
|
|
261
|
+
/** API format for custom endpoint (default: 'openai') */
|
|
262
|
+
endpointFormat?: LLMApiFormat;
|
|
263
|
+
/** Model name (optional, uses provider/endpoint default) */
|
|
264
|
+
model?: string;
|
|
247
265
|
/** API URL (defaults to https://api.xache.xyz) */
|
|
248
266
|
apiUrl?: string;
|
|
249
267
|
/** Chain: 'base' or 'solana' */
|
|
@@ -281,6 +299,10 @@ declare class XacheExtractor {
|
|
|
281
299
|
private mode;
|
|
282
300
|
private llmApiKey?;
|
|
283
301
|
private llmProvider;
|
|
302
|
+
private endpointUrl?;
|
|
303
|
+
private endpointAuthToken?;
|
|
304
|
+
private endpointFormat;
|
|
305
|
+
private model?;
|
|
284
306
|
constructor(config: XacheExtractorConfig);
|
|
285
307
|
/**
|
|
286
308
|
* Extract memories from a conversation trace
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { BaseMessage } from '@langchain/core/messages';
|
|
|
4
4
|
import { BaseRetriever, BaseRetrieverInput } from '@langchain/core/retrievers';
|
|
5
5
|
import { Document } from '@langchain/core/documents';
|
|
6
6
|
import { CallbackManagerForRetrieverRun } from '@langchain/core/callbacks/manager';
|
|
7
|
+
import { LLMProvider, LLMApiFormat } from '@xache/sdk';
|
|
7
8
|
import { DynamicStructuredTool } from '@langchain/core/tools';
|
|
8
9
|
|
|
9
10
|
/**
|
|
@@ -211,6 +212,7 @@ declare class XacheRetriever extends BaseRetriever {
|
|
|
211
212
|
* Xache Memory Extraction for LangChain.js
|
|
212
213
|
* Auto-extract memories from conversations
|
|
213
214
|
*/
|
|
215
|
+
|
|
214
216
|
interface ExtractedMemory {
|
|
215
217
|
/** Memory content */
|
|
216
218
|
content: string;
|
|
@@ -238,12 +240,28 @@ interface XacheExtractorConfig {
|
|
|
238
240
|
walletAddress: string;
|
|
239
241
|
/** Private key for signing */
|
|
240
242
|
privateKey: string;
|
|
241
|
-
/**
|
|
242
|
-
|
|
243
|
+
/**
|
|
244
|
+
* Extraction mode:
|
|
245
|
+
* - 'xache-managed': Xache provides the LLM ($0.011)
|
|
246
|
+
* - 'api-key': Use major provider with known endpoint ($0.002)
|
|
247
|
+
* - 'endpoint': Use custom/self-hosted endpoint ($0.002)
|
|
248
|
+
*/
|
|
249
|
+
mode?: 'xache-managed' | 'api-key' | 'endpoint';
|
|
243
250
|
/** Your LLM API key (required if mode is 'api-key') */
|
|
244
251
|
llmApiKey?: string;
|
|
245
|
-
/**
|
|
246
|
-
|
|
252
|
+
/**
|
|
253
|
+
* LLM provider for api-key mode
|
|
254
|
+
* Supports: anthropic, openai, google, mistral, groq, together, fireworks, cohere, xai, deepseek
|
|
255
|
+
*/
|
|
256
|
+
llmProvider?: LLMProvider;
|
|
257
|
+
/** Custom endpoint URL (required if mode is 'endpoint') */
|
|
258
|
+
endpointUrl?: string;
|
|
259
|
+
/** Auth token for custom endpoint */
|
|
260
|
+
endpointAuthToken?: string;
|
|
261
|
+
/** API format for custom endpoint (default: 'openai') */
|
|
262
|
+
endpointFormat?: LLMApiFormat;
|
|
263
|
+
/** Model name (optional, uses provider/endpoint default) */
|
|
264
|
+
model?: string;
|
|
247
265
|
/** API URL (defaults to https://api.xache.xyz) */
|
|
248
266
|
apiUrl?: string;
|
|
249
267
|
/** Chain: 'base' or 'solana' */
|
|
@@ -281,6 +299,10 @@ declare class XacheExtractor {
|
|
|
281
299
|
private mode;
|
|
282
300
|
private llmApiKey?;
|
|
283
301
|
private llmProvider;
|
|
302
|
+
private endpointUrl?;
|
|
303
|
+
private endpointAuthToken?;
|
|
304
|
+
private endpointFormat;
|
|
305
|
+
private model?;
|
|
284
306
|
constructor(config: XacheExtractorConfig);
|
|
285
307
|
/**
|
|
286
308
|
* Extract memories from a conversation trace
|
package/dist/index.js
CHANGED
|
@@ -286,6 +286,9 @@ var XacheExtractor = class {
|
|
|
286
286
|
if (mode === "api-key" && !config.llmApiKey) {
|
|
287
287
|
throw new Error('llmApiKey is required when mode is "api-key"');
|
|
288
288
|
}
|
|
289
|
+
if (mode === "endpoint" && !config.endpointUrl) {
|
|
290
|
+
throw new Error('endpointUrl is required when mode is "endpoint"');
|
|
291
|
+
}
|
|
289
292
|
const chainPrefix = config.chain === "solana" ? "sol" : "evm";
|
|
290
293
|
const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}`;
|
|
291
294
|
this.client = new import_sdk3.XacheClient({
|
|
@@ -298,16 +301,38 @@ var XacheExtractor = class {
|
|
|
298
301
|
this.mode = mode;
|
|
299
302
|
this.llmApiKey = config.llmApiKey;
|
|
300
303
|
this.llmProvider = config.llmProvider || "anthropic";
|
|
304
|
+
this.endpointUrl = config.endpointUrl;
|
|
305
|
+
this.endpointAuthToken = config.endpointAuthToken;
|
|
306
|
+
this.endpointFormat = config.endpointFormat || "openai";
|
|
307
|
+
this.model = config.model;
|
|
301
308
|
}
|
|
302
309
|
/**
|
|
303
310
|
* Extract memories from a conversation trace
|
|
304
311
|
*/
|
|
305
312
|
async extract(trace, options) {
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
313
|
+
let llmConfig;
|
|
314
|
+
if (this.mode === "xache-managed") {
|
|
315
|
+
llmConfig = {
|
|
316
|
+
type: "xache-managed",
|
|
317
|
+
provider: "anthropic",
|
|
318
|
+
model: this.model
|
|
319
|
+
};
|
|
320
|
+
} else if (this.mode === "endpoint") {
|
|
321
|
+
llmConfig = {
|
|
322
|
+
type: "endpoint",
|
|
323
|
+
url: this.endpointUrl,
|
|
324
|
+
authToken: this.endpointAuthToken,
|
|
325
|
+
format: this.endpointFormat,
|
|
326
|
+
model: this.model
|
|
327
|
+
};
|
|
328
|
+
} else {
|
|
329
|
+
llmConfig = {
|
|
330
|
+
type: "api-key",
|
|
331
|
+
provider: this.llmProvider,
|
|
332
|
+
apiKey: this.llmApiKey || "",
|
|
333
|
+
model: this.model
|
|
334
|
+
};
|
|
335
|
+
}
|
|
311
336
|
const result = await this.client.extraction.extract({
|
|
312
337
|
trace,
|
|
313
338
|
llmConfig,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/memory.ts","../src/chat_history.ts","../src/retriever.ts","../src/extraction.ts","../src/collective.ts","../src/reputation.ts"],"sourcesContent":["/**\n * @xache/langchain\n * LangChain.js integration for Xache Protocol\n *\n * Drop-in memory, retrieval, and collective intelligence with verifiable receipts.\n *\n * @example\n * ```typescript\n * // One-line memory replacement\n * import { XacheMemory } from '@xache/langchain';\n *\n * const memory = new XacheMemory({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * // Use with any LangChain chain\n * const chain = new ConversationChain({ llm, memory });\n * ```\n *\n * @packageDocumentation\n */\n\n// Memory\nexport { XacheMemory, XacheConversationBufferMemory } from './memory';\nexport type { XacheMemoryConfig } from './memory';\n\n// Chat History\nexport { XacheChatMessageHistory } from './chat_history';\nexport type { XacheChatMessageHistoryConfig } from './chat_history';\n\n// Retrieval\nexport { XacheRetriever } from './retriever';\nexport type { XacheRetrieverConfig } from './retriever';\n\n// Extraction\nexport { XacheExtractor } from './extraction';\nexport type {\n XacheExtractorConfig,\n ExtractedMemory,\n ExtractionResult,\n} from './extraction';\n\n// Collective Intelligence\nexport {\n createCollectiveContributeTool,\n createCollectiveQueryTool,\n XacheCollectiveContributeTool,\n XacheCollectiveQueryTool,\n} from './collective';\nexport type { CollectiveToolConfig } from './collective';\n\n// Reputation\nexport {\n createReputationTool,\n XacheReputationTool,\n XacheReputationChecker,\n} from './reputation';\nexport type { ReputationToolConfig, ReputationResult } from './reputation';\n","/**\n * Xache Memory for LangChain.js\n * Drop-in replacement for ConversationBufferMemory with verifiable receipts\n */\n\nimport { BaseMemory, InputValues, OutputValues, MemoryVariables } from '@langchain/core/memory';\nimport { XacheChatMessageHistory, XacheChatMessageHistoryConfig } from './chat_history';\n\nexport interface XacheMemoryConfig extends XacheChatMessageHistoryConfig {\n /** Memory key for input (default: 'input') */\n inputKey?: string;\n /** Memory key for output (default: 'output') */\n outputKey?: string;\n /** Key for returning memory (default: 'history') */\n memoryKey?: string;\n /** Return messages as list vs string */\n returnMessages?: boolean;\n}\n\n/**\n * Drop-in replacement for LangChain memory with Xache storage.\n *\n * Provides persistent, verifiable memory that survives across sessions.\n *\n * @example\n * ```typescript\n * import { XacheMemory } from '@xache/langchain';\n * import { ChatOpenAI } from '@langchain/openai';\n * import { ConversationChain } from 'langchain/chains';\n *\n * const memory = new XacheMemory({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * const chain = new ConversationChain({\n * llm: new ChatOpenAI(),\n * memory,\n * });\n *\n * await chain.call({ input: 'Hello!' });\n * ```\n */\nexport class XacheMemory extends BaseMemory {\n lc_namespace = ['xache', 'memory'];\n\n private chatHistory: XacheChatMessageHistory;\n private inputKey: string;\n private outputKey: string;\n private memoryKey: string;\n private returnMessages: boolean;\n\n constructor(config: XacheMemoryConfig) {\n super();\n this.chatHistory = new XacheChatMessageHistory(config);\n this.inputKey = config.inputKey || 'input';\n this.outputKey = config.outputKey || 'output';\n this.memoryKey = config.memoryKey || 'history';\n this.returnMessages = config.returnMessages ?? false;\n }\n\n get memoryKeys(): string[] {\n return [this.memoryKey];\n }\n\n /**\n * Load memory variables\n */\n async loadMemoryVariables(_values: InputValues): Promise<MemoryVariables> {\n const messages = await this.chatHistory.getMessages();\n\n if (this.returnMessages) {\n return { [this.memoryKey]: messages };\n }\n\n // Convert to string format\n const history = messages\n .map((m) => {\n const role = m._getType() === 'human' ? 'Human' : 'AI';\n const content =\n typeof m.content === 'string' ? m.content : JSON.stringify(m.content);\n return `${role}: ${content}`;\n })\n .join('\\n');\n\n return { [this.memoryKey]: history };\n }\n\n /**\n * Save context from this conversation to buffer\n */\n async saveContext(\n inputValues: InputValues,\n outputValues: OutputValues\n ): Promise<void> {\n const input = inputValues[this.inputKey];\n const output = outputValues[this.outputKey];\n\n if (input) {\n await this.chatHistory.addUserMessage(String(input));\n }\n\n if (output) {\n await this.chatHistory.addAIMessage(String(output));\n }\n }\n\n /**\n * Clear memory contents\n */\n async clear(): Promise<void> {\n await this.chatHistory.clear();\n }\n}\n\n/**\n * Extended memory with conversation buffer capabilities\n */\nexport class XacheConversationBufferMemory extends XacheMemory {\n lc_namespace = ['xache', 'memory', 'buffer'];\n}\n","/**\n * Xache Chat Message History for LangChain.js\n * Persistent message storage with cryptographic receipts\n */\n\nimport { BaseListChatMessageHistory } from '@langchain/core/chat_history';\nimport {\n BaseMessage,\n HumanMessage,\n AIMessage,\n SystemMessage,\n} from '@langchain/core/messages';\nimport { XacheClient, DID } from '@xache/sdk';\nimport { randomUUID } from 'crypto';\n\nexport interface XacheChatMessageHistoryConfig {\n /** Wallet address for authentication */\n walletAddress: string;\n /** Private key for signing */\n privateKey: string;\n /** Session ID to group messages */\n sessionId?: string;\n /** API URL (defaults to https://api.xache.xyz) */\n apiUrl?: string;\n /** Chain: 'base' or 'solana' */\n chain?: 'base' | 'solana';\n /** Maximum messages to load (default: 1000, set to -1 for unlimited) */\n maxMessages?: number;\n /** Page size for loading messages (default: 100) */\n pageSize?: number;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Chat message history backed by Xache Protocol.\n *\n * Messages are stored with cryptographic receipts and can persist\n * across sessions.\n *\n * @example\n * ```typescript\n * import { XacheChatMessageHistory } from '@xache/langchain';\n *\n * const history = new XacheChatMessageHistory({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * sessionId: 'unique-session-id',\n * });\n *\n * await history.addUserMessage('Hello!');\n * await history.addAIMessage('Hi there!');\n *\n * const messages = await history.getMessages();\n * ```\n */\nexport class XacheChatMessageHistory extends BaseListChatMessageHistory {\n lc_namespace = ['xache', 'chat_history'];\n\n private client: XacheClient;\n private sessionId: string;\n private messages: BaseMessage[] = [];\n private initialized = false;\n private maxMessages: number;\n private pageSize: number;\n\n constructor(config: XacheChatMessageHistoryConfig) {\n super();\n\n const chainPrefix = config.chain === 'solana' ? 'sol' : 'evm';\n const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}` as DID;\n\n this.client = new XacheClient({\n apiUrl: config.apiUrl || 'https://api.xache.xyz',\n did,\n privateKey: config.privateKey,\n timeout: config.timeout,\n debug: config.debug,\n });\n\n // Use UUID for collision-resistant session IDs\n this.sessionId = config.sessionId || `langchain-${randomUUID()}`;\n this.maxMessages = config.maxMessages ?? 1000;\n this.pageSize = config.pageSize ?? 100;\n }\n\n /**\n * Get all messages in the history\n */\n async getMessages(): Promise<BaseMessage[]> {\n if (!this.initialized) {\n await this.loadMessages();\n }\n return this.messages;\n }\n\n /**\n * Add a message to the history\n */\n async addMessage(message: BaseMessage): Promise<void> {\n this.messages.push(message);\n\n const role = this.getMessageRole(message);\n const content =\n typeof message.content === 'string'\n ? message.content\n : JSON.stringify(message.content);\n\n await this.client.memory.store({\n data: {\n role,\n content,\n sessionId: this.sessionId,\n timestamp: Date.now(),\n },\n storageTier: 'hot',\n context: `chat:${this.sessionId}`,\n tags: ['chat', 'message', role],\n metadata: {\n sessionId: this.sessionId,\n role,\n },\n });\n }\n\n /**\n * Add a user message\n */\n async addUserMessage(message: string): Promise<void> {\n await this.addMessage(new HumanMessage(message));\n }\n\n /**\n * Add an AI message\n */\n async addAIMessage(message: string): Promise<void> {\n await this.addMessage(new AIMessage(message));\n }\n\n /**\n * Clear all messages from history\n */\n async clear(): Promise<void> {\n this.messages = [];\n // Note: Xache doesn't support deletion - messages remain for audit trail\n // We only clear the local cache\n }\n\n /**\n * Load messages from Xache storage with pagination support\n */\n private async loadMessages(): Promise<void> {\n try {\n const allMemories: Array<{ storage_key: string; created_at?: string }> = [];\n let offset = 0;\n const effectiveMax = this.maxMessages === -1 ? Infinity : this.maxMessages;\n\n // Paginate through all messages\n while (allMemories.length < effectiveMax) {\n const result = await this.client.memory.list({\n context: `chat:${this.sessionId}`,\n limit: Math.min(this.pageSize, effectiveMax - allMemories.length),\n offset,\n });\n\n const memories = Array.isArray(result?.memories) ? result.memories : [];\n if (memories.length === 0) break;\n\n allMemories.push(...memories);\n offset += memories.length;\n\n // If we got less than pageSize, we've reached the end\n if (memories.length < this.pageSize) break;\n }\n\n // Sort by timestamp\n const sortedMemories = [...allMemories].sort((a, b) => {\n const tsA = new Date(a.created_at || 0).getTime();\n const tsB = new Date(b.created_at || 0).getTime();\n return tsA - tsB;\n });\n\n // For each memory, we need to retrieve the full content\n this.messages = [];\n for (const m of sortedMemories) {\n try {\n const full = await this.client.memory.retrieve({\n storageKey: m.storage_key,\n });\n const data = full.data as { role?: string; content?: string };\n if (data && data.content) {\n switch (data.role) {\n case 'human':\n case 'user':\n this.messages.push(new HumanMessage(data.content));\n break;\n case 'ai':\n case 'assistant':\n this.messages.push(new AIMessage(data.content));\n break;\n case 'system':\n this.messages.push(new SystemMessage(data.content));\n break;\n default:\n this.messages.push(new HumanMessage(data.content));\n }\n }\n } catch (error) {\n // Skip malformed messages but log in debug\n console.debug?.(`[XacheChatMessageHistory] Failed to parse message: ${(error as Error).message}`);\n }\n }\n\n this.initialized = true;\n } catch (error) {\n // If retrieval fails (e.g., no memories yet), start fresh\n // This is expected for new sessions\n console.debug?.(`[XacheChatMessageHistory] No existing messages found: ${(error as Error).message}`);\n this.messages = [];\n this.initialized = true;\n }\n }\n\n private getMessageRole(message: BaseMessage): string {\n if (message instanceof HumanMessage) return 'human';\n if (message instanceof AIMessage) return 'ai';\n if (message instanceof SystemMessage) return 'system';\n return 'unknown';\n }\n}\n","/**\n * Xache Retriever for LangChain.js\n * Memory retrieval for RAG pipelines with verifiable receipts\n */\n\nimport { BaseRetriever, BaseRetrieverInput } from '@langchain/core/retrievers';\nimport { Document } from '@langchain/core/documents';\nimport { CallbackManagerForRetrieverRun } from '@langchain/core/callbacks/manager';\nimport { XacheClient, DID } from '@xache/sdk';\n\nexport interface XacheRetrieverConfig extends BaseRetrieverInput {\n /** Wallet address for authentication */\n walletAddress: string;\n /** Private key for signing */\n privateKey: string;\n /** Number of documents to retrieve */\n k?: number;\n /** Filter by context */\n context?: string;\n /** API URL (defaults to https://api.xache.xyz) */\n apiUrl?: string;\n /** Chain: 'base' or 'solana' */\n chain?: 'base' | 'solana';\n}\n\n/**\n * Retriever that fetches documents from Xache memory storage.\n *\n * Use this for RAG pipelines with persistent, verifiable document storage.\n *\n * @example\n * ```typescript\n * import { XacheRetriever } from '@xache/langchain';\n * import { ChatOpenAI } from '@langchain/openai';\n * import { RetrievalQAChain } from 'langchain/chains';\n *\n * const retriever = new XacheRetriever({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * k: 5,\n * });\n *\n * const qa = RetrievalQAChain.fromLLM(new ChatOpenAI(), retriever);\n * const result = await qa.call({ query: 'What do you know about X?' });\n * ```\n */\nexport class XacheRetriever extends BaseRetriever {\n lc_namespace = ['xache', 'retriever'];\n\n static lc_name() {\n return 'XacheRetriever';\n }\n\n private client: XacheClient;\n private k: number;\n private filterContext?: string;\n\n constructor(config: XacheRetrieverConfig) {\n super(config);\n\n const chainPrefix = config.chain === 'solana' ? 'sol' : 'evm';\n const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}` as DID;\n\n this.client = new XacheClient({\n apiUrl: config.apiUrl || 'https://api.xache.xyz',\n did,\n privateKey: config.privateKey,\n });\n\n this.k = config.k ?? 5;\n this.filterContext = config.context;\n }\n\n async _getRelevantDocuments(\n _query: string,\n _runManager?: CallbackManagerForRetrieverRun\n ): Promise<Document[]> {\n // Use list method to get memories filtered by context\n const result = await this.client.memory.list({\n context: this.filterContext,\n limit: this.k,\n });\n\n const memories = result.memories || [];\n\n return memories.map(\n (m) =>\n new Document({\n pageContent: m.context || '',\n metadata: {\n storageKey: m.storage_key,\n context: m.context,\n tier: m.storage_tier,\n createdAt: m.created_at,\n size: m.size_bytes,\n },\n })\n );\n }\n}\n","/**\n * Xache Memory Extraction for LangChain.js\n * Auto-extract memories from conversations\n */\n\nimport { XacheClient, DID } from '@xache/sdk';\nimport type { ExtractMemoriesResponse } from '@xache/sdk';\n\nexport interface ExtractedMemory {\n /** Memory content */\n content: string;\n /** Suggested context/category */\n context: string;\n /** Suggested tags */\n tags: string[];\n /** Confidence score */\n confidence: number;\n /** Memory ID if stored */\n memoryId?: string;\n}\n\nexport interface ExtractionResult {\n /** Extracted memories */\n memories: ExtractedMemory[];\n /** Number of memories extracted */\n count: number;\n /** Total cost in USD */\n cost: number;\n /** Receipt ID for the operation */\n receiptId?: string;\n}\n\nexport interface XacheExtractorConfig {\n /** Wallet address for authentication */\n walletAddress: string;\n /** Private key for signing */\n privateKey: string;\n /** Extraction mode: 'xache-managed' uses Xache's LLM, 'api-key' uses your own */\n mode?: 'xache-managed' | 'api-key';\n /** Your LLM API key (required if mode is 'api-key') */\n llmApiKey?: string;\n /** LLM provider for api-key mode */\n llmProvider?: 'anthropic' | 'openai';\n /** API URL (defaults to https://api.xache.xyz) */\n apiUrl?: string;\n /** Chain: 'base' or 'solana' */\n chain?: 'base' | 'solana';\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Extract memories from conversation traces.\n *\n * Can auto-store extracted memories to Xache for later retrieval.\n *\n * @example\n * ```typescript\n * import { XacheExtractor } from '@xache/langchain';\n *\n * const extractor = new XacheExtractor({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * mode: 'xache-managed',\n * });\n *\n * const result = await extractor.extract(\n * 'User: What is the capital of France?\\nAI: Paris is the capital.',\n * { autoStore: true }\n * );\n *\n * console.log(`Extracted ${result.count} memories`);\n * ```\n */\nexport class XacheExtractor {\n private client: XacheClient;\n private mode: 'xache-managed' | 'api-key';\n private llmApiKey?: string;\n private llmProvider: 'anthropic' | 'openai';\n\n constructor(config: XacheExtractorConfig) {\n // Validate api-key mode requires llmApiKey\n const mode = config.mode || 'xache-managed';\n if (mode === 'api-key' && !config.llmApiKey) {\n throw new Error('llmApiKey is required when mode is \"api-key\"');\n }\n\n const chainPrefix = config.chain === 'solana' ? 'sol' : 'evm';\n const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}` as DID;\n\n this.client = new XacheClient({\n apiUrl: config.apiUrl || 'https://api.xache.xyz',\n did,\n privateKey: config.privateKey,\n timeout: config.timeout,\n debug: config.debug,\n });\n\n this.mode = mode;\n this.llmApiKey = config.llmApiKey;\n this.llmProvider = config.llmProvider || 'anthropic';\n }\n\n /**\n * Extract memories from a conversation trace\n */\n async extract(\n trace: string,\n options?: {\n /** Automatically store extracted memories */\n autoStore?: boolean;\n /** Custom instructions for extraction */\n instructions?: string;\n /** Minimum confidence threshold (0-1) */\n minConfidence?: number;\n }\n ): Promise<ExtractionResult> {\n const llmConfig =\n this.mode === 'xache-managed'\n ? { type: 'xache-managed' as const, provider: 'anthropic' as const }\n : {\n type: 'api-key' as const,\n provider: this.llmProvider || ('anthropic' as const),\n apiKey: this.llmApiKey || '',\n };\n\n const result: ExtractMemoriesResponse = await this.client.extraction.extract({\n trace,\n llmConfig,\n options: {\n autoStore: options?.autoStore,\n contextHint: options?.instructions,\n },\n });\n\n const minConfidence = options?.minConfidence ?? 0;\n const memories: ExtractedMemory[] = (result.extractions || [])\n .filter((m) => (m.confidence || 1) >= minConfidence)\n .map((m, index) => ({\n content: m.reasoning || JSON.stringify(m.data) || '',\n context: m.type || 'extracted',\n tags: Object.keys(m.data || {}),\n confidence: m.confidence || 1,\n memoryId: result.stored?.[index],\n }));\n\n return {\n memories,\n count: memories.length,\n cost: 0, // Cost is handled by x402\n receiptId: result.metadata?.paymentReceiptId,\n };\n }\n\n /**\n * Extract from LangChain messages\n */\n async extractFromMessages(\n messages: Array<{ role: string; content: string }>,\n options?: {\n autoStore?: boolean;\n instructions?: string;\n minConfidence?: number;\n }\n ): Promise<ExtractionResult> {\n const trace = messages.map((m) => `${m.role}: ${m.content}`).join('\\n');\n\n return this.extract(trace, options);\n }\n}\n","/**\n * Xache Collective Intelligence for LangChain.js\n * Share and learn from collective knowledge pools\n */\n\nimport { DynamicStructuredTool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { XacheClient, DID } from '@xache/sdk';\n\n/**\n * Generate a hash for the pattern (simple implementation)\n */\nasync function generatePatternHash(pattern: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(pattern);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\nexport interface CollectiveToolConfig {\n /** Wallet address for authentication */\n walletAddress: string;\n /** Private key for signing */\n privateKey: string;\n /** API URL (defaults to https://api.xache.xyz) */\n apiUrl?: string;\n /** Chain: 'base' or 'solana' */\n chain?: 'base' | 'solana';\n}\n\n/**\n * Create an Xache client for collective tools\n */\nfunction createClient(config: CollectiveToolConfig): XacheClient {\n const chainPrefix = config.chain === 'solana' ? 'sol' : 'evm';\n const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}` as DID;\n\n return new XacheClient({\n apiUrl: config.apiUrl || 'https://api.xache.xyz',\n did,\n privateKey: config.privateKey,\n });\n}\n\n/**\n * Create a tool for contributing to collective intelligence.\n *\n * @example\n * ```typescript\n * import { createCollectiveContributeTool } from '@xache/langchain';\n *\n * const contributeTool = createCollectiveContributeTool({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * const tools = [contributeTool, ...];\n * ```\n */\nexport function createCollectiveContributeTool(\n config: CollectiveToolConfig\n): DynamicStructuredTool {\n const client = createClient(config);\n\n return new DynamicStructuredTool({\n name: 'xache_collective_contribute',\n description:\n 'Contribute an insight or learning to the collective intelligence pool. ' +\n 'Use this when you discover something valuable that could help other agents. ' +\n \"You'll earn reputation for quality contributions.\",\n schema: z.object({\n insight: z.string().describe('The insight or learning to contribute'),\n domain: z.string().describe('Domain/topic of the insight'),\n evidence: z.string().optional().describe('Supporting evidence'),\n tags: z.array(z.string()).optional().describe('Tags for categorization'),\n }),\n func: async ({ insight, domain, evidence, tags }) => {\n // Generate required fields for the SDK\n const pattern = insight;\n const patternHash = await generatePatternHash(pattern);\n const tagsArray = tags || ['general'];\n\n const result = await client.collective.contribute({\n domain,\n pattern,\n patternHash,\n tags: tagsArray,\n metrics: {\n successRate: 0.8, // Default metrics for new contributions\n sampleSize: 1,\n confidence: 0.7,\n },\n encryptedContentRef: evidence || '', // Store evidence as encrypted ref\n });\n\n const heuristicId = result.heuristicId || 'unknown';\n const receiptId = result.receiptId || 'unknown';\n\n return `Contributed insight to '${domain}'. Heuristic ID: ${heuristicId}, Receipt: ${receiptId}`;\n },\n });\n}\n\n/**\n * Create a tool for querying collective intelligence.\n *\n * @example\n * ```typescript\n * import { createCollectiveQueryTool } from '@xache/langchain';\n *\n * const queryTool = createCollectiveQueryTool({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * const tools = [queryTool, ...];\n * ```\n */\nexport function createCollectiveQueryTool(\n config: CollectiveToolConfig\n): DynamicStructuredTool {\n const client = createClient(config);\n\n return new DynamicStructuredTool({\n name: 'xache_collective_query',\n description:\n 'Query the collective intelligence pool to learn from other agents. ' +\n 'Use this when you need insights or knowledge from the community. ' +\n 'Returns relevant contributions from other agents.',\n schema: z.object({\n query: z.string().describe('What to search for in the collective'),\n domain: z.string().optional().describe('Filter by domain'),\n limit: z.number().optional().default(5).describe('Number of results'),\n }),\n func: async ({ query, domain, limit }) => {\n const result = await client.collective.query({\n queryText: query,\n domain,\n limit: limit || 5,\n });\n\n const results = result.matches || [];\n\n if (results.length === 0) {\n return 'No relevant insights found in the collective.';\n }\n\n let output = `Found ${results.length} insights:\\n`;\n\n results.forEach((item, i: number) => {\n const pattern = (item.pattern || '').slice(0, 200);\n output += `\\n${i + 1}. ${pattern}`;\n if (item.domain) {\n output += ` [Domain: ${item.domain}]`;\n }\n if (item.relevanceScore) {\n output += ` (Relevance: ${item.relevanceScore.toFixed(2)})`;\n }\n });\n\n return output;\n },\n });\n}\n\n/**\n * Class-based collective contribute tool (alternative API)\n */\nexport class XacheCollectiveContributeTool {\n private tool: DynamicStructuredTool;\n\n constructor(config: CollectiveToolConfig) {\n this.tool = createCollectiveContributeTool(config);\n }\n\n asTool(): DynamicStructuredTool {\n return this.tool;\n }\n}\n\n/**\n * Class-based collective query tool (alternative API)\n */\nexport class XacheCollectiveQueryTool {\n private tool: DynamicStructuredTool;\n\n constructor(config: CollectiveToolConfig) {\n this.tool = createCollectiveQueryTool(config);\n }\n\n asTool(): DynamicStructuredTool {\n return this.tool;\n }\n}\n","/**\n * Xache Reputation for LangChain.js\n * Portable, verifiable agent reputation with ERC-8004 support\n */\n\nimport { DynamicStructuredTool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { XacheClient, DID } from '@xache/sdk';\n\nexport interface ReputationToolConfig {\n /** Wallet address for authentication */\n walletAddress: string;\n /** Private key for signing */\n privateKey: string;\n /** API URL (defaults to https://api.xache.xyz) */\n apiUrl?: string;\n /** Chain: 'base' or 'solana' */\n chain?: 'base' | 'solana';\n}\n\nexport interface ReputationResult {\n /** Reputation score (0-1) */\n score: number;\n /** Reputation level */\n level: string;\n /** Total contributions made */\n totalContributions: number;\n /** Total payments made */\n totalPayments: number;\n /** Whether ERC-8004 is enabled */\n erc8004Enabled: boolean;\n /** ERC-8004 agent ID if enabled */\n erc8004AgentId?: string;\n}\n\n/**\n * Get reputation level from score\n */\nfunction getLevel(score: number): string {\n if (score >= 0.9) return 'Elite';\n if (score >= 0.7) return 'Trusted';\n if (score >= 0.5) return 'Established';\n if (score >= 0.3) return 'Developing';\n return 'New';\n}\n\n/**\n * Create an Xache client for reputation tools\n */\nfunction createClient(config: ReputationToolConfig): XacheClient {\n const chainPrefix = config.chain === 'solana' ? 'sol' : 'evm';\n const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}` as DID;\n\n return new XacheClient({\n apiUrl: config.apiUrl || 'https://api.xache.xyz',\n did,\n privateKey: config.privateKey,\n });\n}\n\n/**\n * Create a tool for checking your own reputation.\n *\n * @example\n * ```typescript\n * import { createReputationTool } from '@xache/langchain';\n *\n * const repTool = createReputationTool({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * const tools = [repTool, ...];\n * ```\n */\nexport function createReputationTool(\n config: ReputationToolConfig\n): DynamicStructuredTool {\n const client = createClient(config);\n\n return new DynamicStructuredTool({\n name: 'xache_check_reputation',\n description:\n 'Check your current reputation score and status. ' +\n 'Returns your score (0-1), level, and ERC-8004 on-chain status. ' +\n 'Higher reputation means lower costs and more trust from other agents.',\n schema: z.object({}),\n func: async () => {\n const result = await client.reputation.getReputation();\n\n // Overall score is 0-100, normalize to 0-1\n const score = (result.overall || 0) / 100;\n const level = getLevel(score);\n\n let output = `Reputation Score: ${score.toFixed(2)}/1.00 (${level})\\n`;\n output += `Memory Quality: ${result.memoryQuality || 0}/100\\n`;\n output += `Contribution Success: ${result.contribSuccess || 0}/100\\n`;\n output += `Economic Value: ${result.economicValue || 0}/100\\n`;\n\n // Check ERC-8004 status separately\n try {\n const erc8004Status = await client.reputation.getERC8004Status();\n if (erc8004Status.enabled) {\n output += `ERC-8004 Status: Enabled\\n`;\n output += 'Your reputation is verifiable on-chain!';\n } else {\n output += 'ERC-8004 Status: Not enabled\\n';\n output += 'Enable ERC-8004 to make your reputation portable and verifiable.';\n }\n } catch {\n output += 'ERC-8004 Status: Unknown';\n }\n\n return output;\n },\n });\n}\n\n/**\n * Class-based reputation tool (alternative API)\n */\nexport class XacheReputationTool {\n private tool: DynamicStructuredTool;\n\n constructor(config: ReputationToolConfig) {\n this.tool = createReputationTool(config);\n }\n\n asTool(): DynamicStructuredTool {\n return this.tool;\n }\n}\n\n/**\n * Utility class for checking reputation of any agent.\n *\n * @example\n * ```typescript\n * import { XacheReputationChecker } from '@xache/langchain';\n *\n * const checker = new XacheReputationChecker({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * const rep = await checker.check('did:agent:evm:0xOtherAgent...');\n * if (rep.score >= 0.5) {\n * console.log('Agent is trustworthy');\n * }\n * ```\n */\nexport class XacheReputationChecker {\n private client: XacheClient;\n\n constructor(config: ReputationToolConfig) {\n this.client = createClient(config);\n }\n\n /**\n * Check an agent's reputation\n */\n async check(agentDid: string): Promise<ReputationResult> {\n const result = await this.client.reputation.getReputation(agentDid as DID);\n\n // Overall score is 0-100, normalize to 0-1\n const score = (result.overall || 0) / 100;\n\n // Try to get ERC-8004 status\n let erc8004Enabled = false;\n let erc8004AgentId: string | undefined;\n try {\n const erc8004Status = await this.client.reputation.getERC8004Status();\n erc8004Enabled = erc8004Status.enabled;\n } catch {\n // ERC-8004 status not available\n }\n\n return {\n score,\n level: getLevel(score),\n totalContributions: 0, // Not available in current API\n totalPayments: 0, // Not available in current API\n erc8004Enabled,\n erc8004AgentId,\n };\n }\n\n /**\n * Check if an agent meets minimum reputation threshold\n */\n async meetsThreshold(agentDid: string, minScore: number): Promise<boolean> {\n const result = await this.check(agentDid);\n return result.score >= minScore;\n }\n}\n"],"mappings":"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","names":["import_sdk","import_sdk","import_sdk","import_tools","import_zod","import_sdk","createClient"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/memory.ts","../src/chat_history.ts","../src/retriever.ts","../src/extraction.ts","../src/collective.ts","../src/reputation.ts"],"sourcesContent":["/**\n * @xache/langchain\n * LangChain.js integration for Xache Protocol\n *\n * Drop-in memory, retrieval, and collective intelligence with verifiable receipts.\n *\n * @example\n * ```typescript\n * // One-line memory replacement\n * import { XacheMemory } from '@xache/langchain';\n *\n * const memory = new XacheMemory({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * // Use with any LangChain chain\n * const chain = new ConversationChain({ llm, memory });\n * ```\n *\n * @packageDocumentation\n */\n\n// Memory\nexport { XacheMemory, XacheConversationBufferMemory } from './memory';\nexport type { XacheMemoryConfig } from './memory';\n\n// Chat History\nexport { XacheChatMessageHistory } from './chat_history';\nexport type { XacheChatMessageHistoryConfig } from './chat_history';\n\n// Retrieval\nexport { XacheRetriever } from './retriever';\nexport type { XacheRetrieverConfig } from './retriever';\n\n// Extraction\nexport { XacheExtractor } from './extraction';\nexport type {\n XacheExtractorConfig,\n ExtractedMemory,\n ExtractionResult,\n} from './extraction';\n\n// Collective Intelligence\nexport {\n createCollectiveContributeTool,\n createCollectiveQueryTool,\n XacheCollectiveContributeTool,\n XacheCollectiveQueryTool,\n} from './collective';\nexport type { CollectiveToolConfig } from './collective';\n\n// Reputation\nexport {\n createReputationTool,\n XacheReputationTool,\n XacheReputationChecker,\n} from './reputation';\nexport type { ReputationToolConfig, ReputationResult } from './reputation';\n","/**\n * Xache Memory for LangChain.js\n * Drop-in replacement for ConversationBufferMemory with verifiable receipts\n */\n\nimport { BaseMemory, InputValues, OutputValues, MemoryVariables } from '@langchain/core/memory';\nimport { XacheChatMessageHistory, XacheChatMessageHistoryConfig } from './chat_history';\n\nexport interface XacheMemoryConfig extends XacheChatMessageHistoryConfig {\n /** Memory key for input (default: 'input') */\n inputKey?: string;\n /** Memory key for output (default: 'output') */\n outputKey?: string;\n /** Key for returning memory (default: 'history') */\n memoryKey?: string;\n /** Return messages as list vs string */\n returnMessages?: boolean;\n}\n\n/**\n * Drop-in replacement for LangChain memory with Xache storage.\n *\n * Provides persistent, verifiable memory that survives across sessions.\n *\n * @example\n * ```typescript\n * import { XacheMemory } from '@xache/langchain';\n * import { ChatOpenAI } from '@langchain/openai';\n * import { ConversationChain } from 'langchain/chains';\n *\n * const memory = new XacheMemory({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * const chain = new ConversationChain({\n * llm: new ChatOpenAI(),\n * memory,\n * });\n *\n * await chain.call({ input: 'Hello!' });\n * ```\n */\nexport class XacheMemory extends BaseMemory {\n lc_namespace = ['xache', 'memory'];\n\n private chatHistory: XacheChatMessageHistory;\n private inputKey: string;\n private outputKey: string;\n private memoryKey: string;\n private returnMessages: boolean;\n\n constructor(config: XacheMemoryConfig) {\n super();\n this.chatHistory = new XacheChatMessageHistory(config);\n this.inputKey = config.inputKey || 'input';\n this.outputKey = config.outputKey || 'output';\n this.memoryKey = config.memoryKey || 'history';\n this.returnMessages = config.returnMessages ?? false;\n }\n\n get memoryKeys(): string[] {\n return [this.memoryKey];\n }\n\n /**\n * Load memory variables\n */\n async loadMemoryVariables(_values: InputValues): Promise<MemoryVariables> {\n const messages = await this.chatHistory.getMessages();\n\n if (this.returnMessages) {\n return { [this.memoryKey]: messages };\n }\n\n // Convert to string format\n const history = messages\n .map((m) => {\n const role = m._getType() === 'human' ? 'Human' : 'AI';\n const content =\n typeof m.content === 'string' ? m.content : JSON.stringify(m.content);\n return `${role}: ${content}`;\n })\n .join('\\n');\n\n return { [this.memoryKey]: history };\n }\n\n /**\n * Save context from this conversation to buffer\n */\n async saveContext(\n inputValues: InputValues,\n outputValues: OutputValues\n ): Promise<void> {\n const input = inputValues[this.inputKey];\n const output = outputValues[this.outputKey];\n\n if (input) {\n await this.chatHistory.addUserMessage(String(input));\n }\n\n if (output) {\n await this.chatHistory.addAIMessage(String(output));\n }\n }\n\n /**\n * Clear memory contents\n */\n async clear(): Promise<void> {\n await this.chatHistory.clear();\n }\n}\n\n/**\n * Extended memory with conversation buffer capabilities\n */\nexport class XacheConversationBufferMemory extends XacheMemory {\n lc_namespace = ['xache', 'memory', 'buffer'];\n}\n","/**\n * Xache Chat Message History for LangChain.js\n * Persistent message storage with cryptographic receipts\n */\n\nimport { BaseListChatMessageHistory } from '@langchain/core/chat_history';\nimport {\n BaseMessage,\n HumanMessage,\n AIMessage,\n SystemMessage,\n} from '@langchain/core/messages';\nimport { XacheClient, DID } from '@xache/sdk';\nimport { randomUUID } from 'crypto';\n\nexport interface XacheChatMessageHistoryConfig {\n /** Wallet address for authentication */\n walletAddress: string;\n /** Private key for signing */\n privateKey: string;\n /** Session ID to group messages */\n sessionId?: string;\n /** API URL (defaults to https://api.xache.xyz) */\n apiUrl?: string;\n /** Chain: 'base' or 'solana' */\n chain?: 'base' | 'solana';\n /** Maximum messages to load (default: 1000, set to -1 for unlimited) */\n maxMessages?: number;\n /** Page size for loading messages (default: 100) */\n pageSize?: number;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Chat message history backed by Xache Protocol.\n *\n * Messages are stored with cryptographic receipts and can persist\n * across sessions.\n *\n * @example\n * ```typescript\n * import { XacheChatMessageHistory } from '@xache/langchain';\n *\n * const history = new XacheChatMessageHistory({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * sessionId: 'unique-session-id',\n * });\n *\n * await history.addUserMessage('Hello!');\n * await history.addAIMessage('Hi there!');\n *\n * const messages = await history.getMessages();\n * ```\n */\nexport class XacheChatMessageHistory extends BaseListChatMessageHistory {\n lc_namespace = ['xache', 'chat_history'];\n\n private client: XacheClient;\n private sessionId: string;\n private messages: BaseMessage[] = [];\n private initialized = false;\n private maxMessages: number;\n private pageSize: number;\n\n constructor(config: XacheChatMessageHistoryConfig) {\n super();\n\n const chainPrefix = config.chain === 'solana' ? 'sol' : 'evm';\n const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}` as DID;\n\n this.client = new XacheClient({\n apiUrl: config.apiUrl || 'https://api.xache.xyz',\n did,\n privateKey: config.privateKey,\n timeout: config.timeout,\n debug: config.debug,\n });\n\n // Use UUID for collision-resistant session IDs\n this.sessionId = config.sessionId || `langchain-${randomUUID()}`;\n this.maxMessages = config.maxMessages ?? 1000;\n this.pageSize = config.pageSize ?? 100;\n }\n\n /**\n * Get all messages in the history\n */\n async getMessages(): Promise<BaseMessage[]> {\n if (!this.initialized) {\n await this.loadMessages();\n }\n return this.messages;\n }\n\n /**\n * Add a message to the history\n */\n async addMessage(message: BaseMessage): Promise<void> {\n this.messages.push(message);\n\n const role = this.getMessageRole(message);\n const content =\n typeof message.content === 'string'\n ? message.content\n : JSON.stringify(message.content);\n\n await this.client.memory.store({\n data: {\n role,\n content,\n sessionId: this.sessionId,\n timestamp: Date.now(),\n },\n storageTier: 'hot',\n context: `chat:${this.sessionId}`,\n tags: ['chat', 'message', role],\n metadata: {\n sessionId: this.sessionId,\n role,\n },\n });\n }\n\n /**\n * Add a user message\n */\n async addUserMessage(message: string): Promise<void> {\n await this.addMessage(new HumanMessage(message));\n }\n\n /**\n * Add an AI message\n */\n async addAIMessage(message: string): Promise<void> {\n await this.addMessage(new AIMessage(message));\n }\n\n /**\n * Clear all messages from history\n */\n async clear(): Promise<void> {\n this.messages = [];\n // Note: Xache doesn't support deletion - messages remain for audit trail\n // We only clear the local cache\n }\n\n /**\n * Load messages from Xache storage with pagination support\n */\n private async loadMessages(): Promise<void> {\n try {\n const allMemories: Array<{ storage_key: string; created_at?: string }> = [];\n let offset = 0;\n const effectiveMax = this.maxMessages === -1 ? Infinity : this.maxMessages;\n\n // Paginate through all messages\n while (allMemories.length < effectiveMax) {\n const result = await this.client.memory.list({\n context: `chat:${this.sessionId}`,\n limit: Math.min(this.pageSize, effectiveMax - allMemories.length),\n offset,\n });\n\n const memories = Array.isArray(result?.memories) ? result.memories : [];\n if (memories.length === 0) break;\n\n allMemories.push(...memories);\n offset += memories.length;\n\n // If we got less than pageSize, we've reached the end\n if (memories.length < this.pageSize) break;\n }\n\n // Sort by timestamp\n const sortedMemories = [...allMemories].sort((a, b) => {\n const tsA = new Date(a.created_at || 0).getTime();\n const tsB = new Date(b.created_at || 0).getTime();\n return tsA - tsB;\n });\n\n // For each memory, we need to retrieve the full content\n this.messages = [];\n for (const m of sortedMemories) {\n try {\n const full = await this.client.memory.retrieve({\n storageKey: m.storage_key,\n });\n const data = full.data as { role?: string; content?: string };\n if (data && data.content) {\n switch (data.role) {\n case 'human':\n case 'user':\n this.messages.push(new HumanMessage(data.content));\n break;\n case 'ai':\n case 'assistant':\n this.messages.push(new AIMessage(data.content));\n break;\n case 'system':\n this.messages.push(new SystemMessage(data.content));\n break;\n default:\n this.messages.push(new HumanMessage(data.content));\n }\n }\n } catch (error) {\n // Skip malformed messages but log in debug\n console.debug?.(`[XacheChatMessageHistory] Failed to parse message: ${(error as Error).message}`);\n }\n }\n\n this.initialized = true;\n } catch (error) {\n // If retrieval fails (e.g., no memories yet), start fresh\n // This is expected for new sessions\n console.debug?.(`[XacheChatMessageHistory] No existing messages found: ${(error as Error).message}`);\n this.messages = [];\n this.initialized = true;\n }\n }\n\n private getMessageRole(message: BaseMessage): string {\n if (message instanceof HumanMessage) return 'human';\n if (message instanceof AIMessage) return 'ai';\n if (message instanceof SystemMessage) return 'system';\n return 'unknown';\n }\n}\n","/**\n * Xache Retriever for LangChain.js\n * Memory retrieval for RAG pipelines with verifiable receipts\n */\n\nimport { BaseRetriever, BaseRetrieverInput } from '@langchain/core/retrievers';\nimport { Document } from '@langchain/core/documents';\nimport { CallbackManagerForRetrieverRun } from '@langchain/core/callbacks/manager';\nimport { XacheClient, DID } from '@xache/sdk';\n\nexport interface XacheRetrieverConfig extends BaseRetrieverInput {\n /** Wallet address for authentication */\n walletAddress: string;\n /** Private key for signing */\n privateKey: string;\n /** Number of documents to retrieve */\n k?: number;\n /** Filter by context */\n context?: string;\n /** API URL (defaults to https://api.xache.xyz) */\n apiUrl?: string;\n /** Chain: 'base' or 'solana' */\n chain?: 'base' | 'solana';\n}\n\n/**\n * Retriever that fetches documents from Xache memory storage.\n *\n * Use this for RAG pipelines with persistent, verifiable document storage.\n *\n * @example\n * ```typescript\n * import { XacheRetriever } from '@xache/langchain';\n * import { ChatOpenAI } from '@langchain/openai';\n * import { RetrievalQAChain } from 'langchain/chains';\n *\n * const retriever = new XacheRetriever({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * k: 5,\n * });\n *\n * const qa = RetrievalQAChain.fromLLM(new ChatOpenAI(), retriever);\n * const result = await qa.call({ query: 'What do you know about X?' });\n * ```\n */\nexport class XacheRetriever extends BaseRetriever {\n lc_namespace = ['xache', 'retriever'];\n\n static lc_name() {\n return 'XacheRetriever';\n }\n\n private client: XacheClient;\n private k: number;\n private filterContext?: string;\n\n constructor(config: XacheRetrieverConfig) {\n super(config);\n\n const chainPrefix = config.chain === 'solana' ? 'sol' : 'evm';\n const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}` as DID;\n\n this.client = new XacheClient({\n apiUrl: config.apiUrl || 'https://api.xache.xyz',\n did,\n privateKey: config.privateKey,\n });\n\n this.k = config.k ?? 5;\n this.filterContext = config.context;\n }\n\n async _getRelevantDocuments(\n _query: string,\n _runManager?: CallbackManagerForRetrieverRun\n ): Promise<Document[]> {\n // Use list method to get memories filtered by context\n const result = await this.client.memory.list({\n context: this.filterContext,\n limit: this.k,\n });\n\n const memories = result.memories || [];\n\n return memories.map(\n (m) =>\n new Document({\n pageContent: m.context || '',\n metadata: {\n storageKey: m.storage_key,\n context: m.context,\n tier: m.storage_tier,\n createdAt: m.created_at,\n size: m.size_bytes,\n },\n })\n );\n }\n}\n","/**\n * Xache Memory Extraction for LangChain.js\n * Auto-extract memories from conversations\n */\n\nimport { XacheClient, DID } from '@xache/sdk';\nimport type { ExtractMemoriesResponse, LLMProvider, LLMApiFormat } from '@xache/sdk';\n\nexport interface ExtractedMemory {\n /** Memory content */\n content: string;\n /** Suggested context/category */\n context: string;\n /** Suggested tags */\n tags: string[];\n /** Confidence score */\n confidence: number;\n /** Memory ID if stored */\n memoryId?: string;\n}\n\nexport interface ExtractionResult {\n /** Extracted memories */\n memories: ExtractedMemory[];\n /** Number of memories extracted */\n count: number;\n /** Total cost in USD */\n cost: number;\n /** Receipt ID for the operation */\n receiptId?: string;\n}\n\nexport interface XacheExtractorConfig {\n /** Wallet address for authentication */\n walletAddress: string;\n /** Private key for signing */\n privateKey: string;\n /**\n * Extraction mode:\n * - 'xache-managed': Xache provides the LLM ($0.011)\n * - 'api-key': Use major provider with known endpoint ($0.002)\n * - 'endpoint': Use custom/self-hosted endpoint ($0.002)\n */\n mode?: 'xache-managed' | 'api-key' | 'endpoint';\n /** Your LLM API key (required if mode is 'api-key') */\n llmApiKey?: string;\n /**\n * LLM provider for api-key mode\n * Supports: anthropic, openai, google, mistral, groq, together, fireworks, cohere, xai, deepseek\n */\n llmProvider?: LLMProvider;\n /** Custom endpoint URL (required if mode is 'endpoint') */\n endpointUrl?: string;\n /** Auth token for custom endpoint */\n endpointAuthToken?: string;\n /** API format for custom endpoint (default: 'openai') */\n endpointFormat?: LLMApiFormat;\n /** Model name (optional, uses provider/endpoint default) */\n model?: string;\n /** API URL (defaults to https://api.xache.xyz) */\n apiUrl?: string;\n /** Chain: 'base' or 'solana' */\n chain?: 'base' | 'solana';\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Extract memories from conversation traces.\n *\n * Can auto-store extracted memories to Xache for later retrieval.\n *\n * @example\n * ```typescript\n * import { XacheExtractor } from '@xache/langchain';\n *\n * const extractor = new XacheExtractor({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * mode: 'xache-managed',\n * });\n *\n * const result = await extractor.extract(\n * 'User: What is the capital of France?\\nAI: Paris is the capital.',\n * { autoStore: true }\n * );\n *\n * console.log(`Extracted ${result.count} memories`);\n * ```\n */\nexport class XacheExtractor {\n private client: XacheClient;\n private mode: 'xache-managed' | 'api-key' | 'endpoint';\n private llmApiKey?: string;\n private llmProvider: LLMProvider;\n private endpointUrl?: string;\n private endpointAuthToken?: string;\n private endpointFormat: LLMApiFormat;\n private model?: string;\n\n constructor(config: XacheExtractorConfig) {\n const mode = config.mode || 'xache-managed';\n\n // Validate api-key mode requires llmApiKey\n if (mode === 'api-key' && !config.llmApiKey) {\n throw new Error('llmApiKey is required when mode is \"api-key\"');\n }\n\n // Validate endpoint mode requires endpointUrl\n if (mode === 'endpoint' && !config.endpointUrl) {\n throw new Error('endpointUrl is required when mode is \"endpoint\"');\n }\n\n const chainPrefix = config.chain === 'solana' ? 'sol' : 'evm';\n const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}` as DID;\n\n this.client = new XacheClient({\n apiUrl: config.apiUrl || 'https://api.xache.xyz',\n did,\n privateKey: config.privateKey,\n timeout: config.timeout,\n debug: config.debug,\n });\n\n this.mode = mode;\n this.llmApiKey = config.llmApiKey;\n this.llmProvider = config.llmProvider || 'anthropic';\n this.endpointUrl = config.endpointUrl;\n this.endpointAuthToken = config.endpointAuthToken;\n this.endpointFormat = config.endpointFormat || 'openai';\n this.model = config.model;\n }\n\n /**\n * Extract memories from a conversation trace\n */\n async extract(\n trace: string,\n options?: {\n /** Automatically store extracted memories */\n autoStore?: boolean;\n /** Custom instructions for extraction */\n instructions?: string;\n /** Minimum confidence threshold (0-1) */\n minConfidence?: number;\n }\n ): Promise<ExtractionResult> {\n // Build llmConfig based on mode\n let llmConfig;\n if (this.mode === 'xache-managed') {\n llmConfig = {\n type: 'xache-managed' as const,\n provider: 'anthropic' as const,\n model: this.model,\n };\n } else if (this.mode === 'endpoint') {\n llmConfig = {\n type: 'endpoint' as const,\n url: this.endpointUrl!,\n authToken: this.endpointAuthToken,\n format: this.endpointFormat,\n model: this.model,\n };\n } else {\n llmConfig = {\n type: 'api-key' as const,\n provider: this.llmProvider,\n apiKey: this.llmApiKey || '',\n model: this.model,\n };\n }\n\n const result: ExtractMemoriesResponse = await this.client.extraction.extract({\n trace,\n llmConfig,\n options: {\n autoStore: options?.autoStore,\n contextHint: options?.instructions,\n },\n });\n\n const minConfidence = options?.minConfidence ?? 0;\n const memories: ExtractedMemory[] = (result.extractions || [])\n .filter((m) => (m.confidence || 1) >= minConfidence)\n .map((m, index) => ({\n content: m.reasoning || JSON.stringify(m.data) || '',\n context: m.type || 'extracted',\n tags: Object.keys(m.data || {}),\n confidence: m.confidence || 1,\n memoryId: result.stored?.[index],\n }));\n\n return {\n memories,\n count: memories.length,\n cost: 0, // Cost is handled by x402\n receiptId: result.metadata?.paymentReceiptId,\n };\n }\n\n /**\n * Extract from LangChain messages\n */\n async extractFromMessages(\n messages: Array<{ role: string; content: string }>,\n options?: {\n autoStore?: boolean;\n instructions?: string;\n minConfidence?: number;\n }\n ): Promise<ExtractionResult> {\n const trace = messages.map((m) => `${m.role}: ${m.content}`).join('\\n');\n\n return this.extract(trace, options);\n }\n}\n","/**\n * Xache Collective Intelligence for LangChain.js\n * Share and learn from collective knowledge pools\n */\n\nimport { DynamicStructuredTool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { XacheClient, DID } from '@xache/sdk';\n\n/**\n * Generate a hash for the pattern (simple implementation)\n */\nasync function generatePatternHash(pattern: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(pattern);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\nexport interface CollectiveToolConfig {\n /** Wallet address for authentication */\n walletAddress: string;\n /** Private key for signing */\n privateKey: string;\n /** API URL (defaults to https://api.xache.xyz) */\n apiUrl?: string;\n /** Chain: 'base' or 'solana' */\n chain?: 'base' | 'solana';\n}\n\n/**\n * Create an Xache client for collective tools\n */\nfunction createClient(config: CollectiveToolConfig): XacheClient {\n const chainPrefix = config.chain === 'solana' ? 'sol' : 'evm';\n const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}` as DID;\n\n return new XacheClient({\n apiUrl: config.apiUrl || 'https://api.xache.xyz',\n did,\n privateKey: config.privateKey,\n });\n}\n\n/**\n * Create a tool for contributing to collective intelligence.\n *\n * @example\n * ```typescript\n * import { createCollectiveContributeTool } from '@xache/langchain';\n *\n * const contributeTool = createCollectiveContributeTool({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * const tools = [contributeTool, ...];\n * ```\n */\nexport function createCollectiveContributeTool(\n config: CollectiveToolConfig\n): DynamicStructuredTool {\n const client = createClient(config);\n\n return new DynamicStructuredTool({\n name: 'xache_collective_contribute',\n description:\n 'Contribute an insight or learning to the collective intelligence pool. ' +\n 'Use this when you discover something valuable that could help other agents. ' +\n \"You'll earn reputation for quality contributions.\",\n schema: z.object({\n insight: z.string().describe('The insight or learning to contribute'),\n domain: z.string().describe('Domain/topic of the insight'),\n evidence: z.string().optional().describe('Supporting evidence'),\n tags: z.array(z.string()).optional().describe('Tags for categorization'),\n }),\n func: async ({ insight, domain, evidence, tags }) => {\n // Generate required fields for the SDK\n const pattern = insight;\n const patternHash = await generatePatternHash(pattern);\n const tagsArray = tags || ['general'];\n\n const result = await client.collective.contribute({\n domain,\n pattern,\n patternHash,\n tags: tagsArray,\n metrics: {\n successRate: 0.8, // Default metrics for new contributions\n sampleSize: 1,\n confidence: 0.7,\n },\n encryptedContentRef: evidence || '', // Store evidence as encrypted ref\n });\n\n const heuristicId = result.heuristicId || 'unknown';\n const receiptId = result.receiptId || 'unknown';\n\n return `Contributed insight to '${domain}'. Heuristic ID: ${heuristicId}, Receipt: ${receiptId}`;\n },\n });\n}\n\n/**\n * Create a tool for querying collective intelligence.\n *\n * @example\n * ```typescript\n * import { createCollectiveQueryTool } from '@xache/langchain';\n *\n * const queryTool = createCollectiveQueryTool({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * const tools = [queryTool, ...];\n * ```\n */\nexport function createCollectiveQueryTool(\n config: CollectiveToolConfig\n): DynamicStructuredTool {\n const client = createClient(config);\n\n return new DynamicStructuredTool({\n name: 'xache_collective_query',\n description:\n 'Query the collective intelligence pool to learn from other agents. ' +\n 'Use this when you need insights or knowledge from the community. ' +\n 'Returns relevant contributions from other agents.',\n schema: z.object({\n query: z.string().describe('What to search for in the collective'),\n domain: z.string().optional().describe('Filter by domain'),\n limit: z.number().optional().default(5).describe('Number of results'),\n }),\n func: async ({ query, domain, limit }) => {\n const result = await client.collective.query({\n queryText: query,\n domain,\n limit: limit || 5,\n });\n\n const results = result.matches || [];\n\n if (results.length === 0) {\n return 'No relevant insights found in the collective.';\n }\n\n let output = `Found ${results.length} insights:\\n`;\n\n results.forEach((item, i: number) => {\n const pattern = (item.pattern || '').slice(0, 200);\n output += `\\n${i + 1}. ${pattern}`;\n if (item.domain) {\n output += ` [Domain: ${item.domain}]`;\n }\n if (item.relevanceScore) {\n output += ` (Relevance: ${item.relevanceScore.toFixed(2)})`;\n }\n });\n\n return output;\n },\n });\n}\n\n/**\n * Class-based collective contribute tool (alternative API)\n */\nexport class XacheCollectiveContributeTool {\n private tool: DynamicStructuredTool;\n\n constructor(config: CollectiveToolConfig) {\n this.tool = createCollectiveContributeTool(config);\n }\n\n asTool(): DynamicStructuredTool {\n return this.tool;\n }\n}\n\n/**\n * Class-based collective query tool (alternative API)\n */\nexport class XacheCollectiveQueryTool {\n private tool: DynamicStructuredTool;\n\n constructor(config: CollectiveToolConfig) {\n this.tool = createCollectiveQueryTool(config);\n }\n\n asTool(): DynamicStructuredTool {\n return this.tool;\n }\n}\n","/**\n * Xache Reputation for LangChain.js\n * Portable, verifiable agent reputation with ERC-8004 support\n */\n\nimport { DynamicStructuredTool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { XacheClient, DID } from '@xache/sdk';\n\nexport interface ReputationToolConfig {\n /** Wallet address for authentication */\n walletAddress: string;\n /** Private key for signing */\n privateKey: string;\n /** API URL (defaults to https://api.xache.xyz) */\n apiUrl?: string;\n /** Chain: 'base' or 'solana' */\n chain?: 'base' | 'solana';\n}\n\nexport interface ReputationResult {\n /** Reputation score (0-1) */\n score: number;\n /** Reputation level */\n level: string;\n /** Total contributions made */\n totalContributions: number;\n /** Total payments made */\n totalPayments: number;\n /** Whether ERC-8004 is enabled */\n erc8004Enabled: boolean;\n /** ERC-8004 agent ID if enabled */\n erc8004AgentId?: string;\n}\n\n/**\n * Get reputation level from score\n */\nfunction getLevel(score: number): string {\n if (score >= 0.9) return 'Elite';\n if (score >= 0.7) return 'Trusted';\n if (score >= 0.5) return 'Established';\n if (score >= 0.3) return 'Developing';\n return 'New';\n}\n\n/**\n * Create an Xache client for reputation tools\n */\nfunction createClient(config: ReputationToolConfig): XacheClient {\n const chainPrefix = config.chain === 'solana' ? 'sol' : 'evm';\n const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}` as DID;\n\n return new XacheClient({\n apiUrl: config.apiUrl || 'https://api.xache.xyz',\n did,\n privateKey: config.privateKey,\n });\n}\n\n/**\n * Create a tool for checking your own reputation.\n *\n * @example\n * ```typescript\n * import { createReputationTool } from '@xache/langchain';\n *\n * const repTool = createReputationTool({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * const tools = [repTool, ...];\n * ```\n */\nexport function createReputationTool(\n config: ReputationToolConfig\n): DynamicStructuredTool {\n const client = createClient(config);\n\n return new DynamicStructuredTool({\n name: 'xache_check_reputation',\n description:\n 'Check your current reputation score and status. ' +\n 'Returns your score (0-1), level, and ERC-8004 on-chain status. ' +\n 'Higher reputation means lower costs and more trust from other agents.',\n schema: z.object({}),\n func: async () => {\n const result = await client.reputation.getReputation();\n\n // Overall score is 0-100, normalize to 0-1\n const score = (result.overall || 0) / 100;\n const level = getLevel(score);\n\n let output = `Reputation Score: ${score.toFixed(2)}/1.00 (${level})\\n`;\n output += `Memory Quality: ${result.memoryQuality || 0}/100\\n`;\n output += `Contribution Success: ${result.contribSuccess || 0}/100\\n`;\n output += `Economic Value: ${result.economicValue || 0}/100\\n`;\n\n // Check ERC-8004 status separately\n try {\n const erc8004Status = await client.reputation.getERC8004Status();\n if (erc8004Status.enabled) {\n output += `ERC-8004 Status: Enabled\\n`;\n output += 'Your reputation is verifiable on-chain!';\n } else {\n output += 'ERC-8004 Status: Not enabled\\n';\n output += 'Enable ERC-8004 to make your reputation portable and verifiable.';\n }\n } catch {\n output += 'ERC-8004 Status: Unknown';\n }\n\n return output;\n },\n });\n}\n\n/**\n * Class-based reputation tool (alternative API)\n */\nexport class XacheReputationTool {\n private tool: DynamicStructuredTool;\n\n constructor(config: ReputationToolConfig) {\n this.tool = createReputationTool(config);\n }\n\n asTool(): DynamicStructuredTool {\n return this.tool;\n }\n}\n\n/**\n * Utility class for checking reputation of any agent.\n *\n * @example\n * ```typescript\n * import { XacheReputationChecker } from '@xache/langchain';\n *\n * const checker = new XacheReputationChecker({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * const rep = await checker.check('did:agent:evm:0xOtherAgent...');\n * if (rep.score >= 0.5) {\n * console.log('Agent is trustworthy');\n * }\n * ```\n */\nexport class XacheReputationChecker {\n private client: XacheClient;\n\n constructor(config: ReputationToolConfig) {\n this.client = createClient(config);\n }\n\n /**\n * Check an agent's reputation\n */\n async check(agentDid: string): Promise<ReputationResult> {\n const result = await this.client.reputation.getReputation(agentDid as DID);\n\n // Overall score is 0-100, normalize to 0-1\n const score = (result.overall || 0) / 100;\n\n // Try to get ERC-8004 status\n let erc8004Enabled = false;\n let erc8004AgentId: string | undefined;\n try {\n const erc8004Status = await this.client.reputation.getERC8004Status();\n erc8004Enabled = erc8004Status.enabled;\n } catch {\n // ERC-8004 status not available\n }\n\n return {\n score,\n level: getLevel(score),\n totalContributions: 0, // Not available in current API\n totalPayments: 0, // Not available in current API\n erc8004Enabled,\n erc8004AgentId,\n };\n }\n\n /**\n * Check if an agent meets minimum reputation threshold\n */\n async meetsThreshold(agentDid: string, minScore: number): Promise<boolean> {\n const result = await this.check(agentDid);\n return result.score >= minScore;\n }\n}\n"],"mappings":"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","names":["import_sdk","import_sdk","import_sdk","import_tools","import_zod","import_sdk","createClient"]}
|
package/dist/index.mjs
CHANGED
|
@@ -253,6 +253,9 @@ var XacheExtractor = class {
|
|
|
253
253
|
if (mode === "api-key" && !config.llmApiKey) {
|
|
254
254
|
throw new Error('llmApiKey is required when mode is "api-key"');
|
|
255
255
|
}
|
|
256
|
+
if (mode === "endpoint" && !config.endpointUrl) {
|
|
257
|
+
throw new Error('endpointUrl is required when mode is "endpoint"');
|
|
258
|
+
}
|
|
256
259
|
const chainPrefix = config.chain === "solana" ? "sol" : "evm";
|
|
257
260
|
const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}`;
|
|
258
261
|
this.client = new XacheClient3({
|
|
@@ -265,16 +268,38 @@ var XacheExtractor = class {
|
|
|
265
268
|
this.mode = mode;
|
|
266
269
|
this.llmApiKey = config.llmApiKey;
|
|
267
270
|
this.llmProvider = config.llmProvider || "anthropic";
|
|
271
|
+
this.endpointUrl = config.endpointUrl;
|
|
272
|
+
this.endpointAuthToken = config.endpointAuthToken;
|
|
273
|
+
this.endpointFormat = config.endpointFormat || "openai";
|
|
274
|
+
this.model = config.model;
|
|
268
275
|
}
|
|
269
276
|
/**
|
|
270
277
|
* Extract memories from a conversation trace
|
|
271
278
|
*/
|
|
272
279
|
async extract(trace, options) {
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
280
|
+
let llmConfig;
|
|
281
|
+
if (this.mode === "xache-managed") {
|
|
282
|
+
llmConfig = {
|
|
283
|
+
type: "xache-managed",
|
|
284
|
+
provider: "anthropic",
|
|
285
|
+
model: this.model
|
|
286
|
+
};
|
|
287
|
+
} else if (this.mode === "endpoint") {
|
|
288
|
+
llmConfig = {
|
|
289
|
+
type: "endpoint",
|
|
290
|
+
url: this.endpointUrl,
|
|
291
|
+
authToken: this.endpointAuthToken,
|
|
292
|
+
format: this.endpointFormat,
|
|
293
|
+
model: this.model
|
|
294
|
+
};
|
|
295
|
+
} else {
|
|
296
|
+
llmConfig = {
|
|
297
|
+
type: "api-key",
|
|
298
|
+
provider: this.llmProvider,
|
|
299
|
+
apiKey: this.llmApiKey || "",
|
|
300
|
+
model: this.model
|
|
301
|
+
};
|
|
302
|
+
}
|
|
278
303
|
const result = await this.client.extraction.extract({
|
|
279
304
|
trace,
|
|
280
305
|
llmConfig,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/memory.ts","../src/chat_history.ts","../src/retriever.ts","../src/extraction.ts","../src/collective.ts","../src/reputation.ts"],"sourcesContent":["/**\n * Xache Memory for LangChain.js\n * Drop-in replacement for ConversationBufferMemory with verifiable receipts\n */\n\nimport { BaseMemory, InputValues, OutputValues, MemoryVariables } from '@langchain/core/memory';\nimport { XacheChatMessageHistory, XacheChatMessageHistoryConfig } from './chat_history';\n\nexport interface XacheMemoryConfig extends XacheChatMessageHistoryConfig {\n /** Memory key for input (default: 'input') */\n inputKey?: string;\n /** Memory key for output (default: 'output') */\n outputKey?: string;\n /** Key for returning memory (default: 'history') */\n memoryKey?: string;\n /** Return messages as list vs string */\n returnMessages?: boolean;\n}\n\n/**\n * Drop-in replacement for LangChain memory with Xache storage.\n *\n * Provides persistent, verifiable memory that survives across sessions.\n *\n * @example\n * ```typescript\n * import { XacheMemory } from '@xache/langchain';\n * import { ChatOpenAI } from '@langchain/openai';\n * import { ConversationChain } from 'langchain/chains';\n *\n * const memory = new XacheMemory({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * const chain = new ConversationChain({\n * llm: new ChatOpenAI(),\n * memory,\n * });\n *\n * await chain.call({ input: 'Hello!' });\n * ```\n */\nexport class XacheMemory extends BaseMemory {\n lc_namespace = ['xache', 'memory'];\n\n private chatHistory: XacheChatMessageHistory;\n private inputKey: string;\n private outputKey: string;\n private memoryKey: string;\n private returnMessages: boolean;\n\n constructor(config: XacheMemoryConfig) {\n super();\n this.chatHistory = new XacheChatMessageHistory(config);\n this.inputKey = config.inputKey || 'input';\n this.outputKey = config.outputKey || 'output';\n this.memoryKey = config.memoryKey || 'history';\n this.returnMessages = config.returnMessages ?? false;\n }\n\n get memoryKeys(): string[] {\n return [this.memoryKey];\n }\n\n /**\n * Load memory variables\n */\n async loadMemoryVariables(_values: InputValues): Promise<MemoryVariables> {\n const messages = await this.chatHistory.getMessages();\n\n if (this.returnMessages) {\n return { [this.memoryKey]: messages };\n }\n\n // Convert to string format\n const history = messages\n .map((m) => {\n const role = m._getType() === 'human' ? 'Human' : 'AI';\n const content =\n typeof m.content === 'string' ? m.content : JSON.stringify(m.content);\n return `${role}: ${content}`;\n })\n .join('\\n');\n\n return { [this.memoryKey]: history };\n }\n\n /**\n * Save context from this conversation to buffer\n */\n async saveContext(\n inputValues: InputValues,\n outputValues: OutputValues\n ): Promise<void> {\n const input = inputValues[this.inputKey];\n const output = outputValues[this.outputKey];\n\n if (input) {\n await this.chatHistory.addUserMessage(String(input));\n }\n\n if (output) {\n await this.chatHistory.addAIMessage(String(output));\n }\n }\n\n /**\n * Clear memory contents\n */\n async clear(): Promise<void> {\n await this.chatHistory.clear();\n }\n}\n\n/**\n * Extended memory with conversation buffer capabilities\n */\nexport class XacheConversationBufferMemory extends XacheMemory {\n lc_namespace = ['xache', 'memory', 'buffer'];\n}\n","/**\n * Xache Chat Message History for LangChain.js\n * Persistent message storage with cryptographic receipts\n */\n\nimport { BaseListChatMessageHistory } from '@langchain/core/chat_history';\nimport {\n BaseMessage,\n HumanMessage,\n AIMessage,\n SystemMessage,\n} from '@langchain/core/messages';\nimport { XacheClient, DID } from '@xache/sdk';\nimport { randomUUID } from 'crypto';\n\nexport interface XacheChatMessageHistoryConfig {\n /** Wallet address for authentication */\n walletAddress: string;\n /** Private key for signing */\n privateKey: string;\n /** Session ID to group messages */\n sessionId?: string;\n /** API URL (defaults to https://api.xache.xyz) */\n apiUrl?: string;\n /** Chain: 'base' or 'solana' */\n chain?: 'base' | 'solana';\n /** Maximum messages to load (default: 1000, set to -1 for unlimited) */\n maxMessages?: number;\n /** Page size for loading messages (default: 100) */\n pageSize?: number;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Chat message history backed by Xache Protocol.\n *\n * Messages are stored with cryptographic receipts and can persist\n * across sessions.\n *\n * @example\n * ```typescript\n * import { XacheChatMessageHistory } from '@xache/langchain';\n *\n * const history = new XacheChatMessageHistory({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * sessionId: 'unique-session-id',\n * });\n *\n * await history.addUserMessage('Hello!');\n * await history.addAIMessage('Hi there!');\n *\n * const messages = await history.getMessages();\n * ```\n */\nexport class XacheChatMessageHistory extends BaseListChatMessageHistory {\n lc_namespace = ['xache', 'chat_history'];\n\n private client: XacheClient;\n private sessionId: string;\n private messages: BaseMessage[] = [];\n private initialized = false;\n private maxMessages: number;\n private pageSize: number;\n\n constructor(config: XacheChatMessageHistoryConfig) {\n super();\n\n const chainPrefix = config.chain === 'solana' ? 'sol' : 'evm';\n const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}` as DID;\n\n this.client = new XacheClient({\n apiUrl: config.apiUrl || 'https://api.xache.xyz',\n did,\n privateKey: config.privateKey,\n timeout: config.timeout,\n debug: config.debug,\n });\n\n // Use UUID for collision-resistant session IDs\n this.sessionId = config.sessionId || `langchain-${randomUUID()}`;\n this.maxMessages = config.maxMessages ?? 1000;\n this.pageSize = config.pageSize ?? 100;\n }\n\n /**\n * Get all messages in the history\n */\n async getMessages(): Promise<BaseMessage[]> {\n if (!this.initialized) {\n await this.loadMessages();\n }\n return this.messages;\n }\n\n /**\n * Add a message to the history\n */\n async addMessage(message: BaseMessage): Promise<void> {\n this.messages.push(message);\n\n const role = this.getMessageRole(message);\n const content =\n typeof message.content === 'string'\n ? message.content\n : JSON.stringify(message.content);\n\n await this.client.memory.store({\n data: {\n role,\n content,\n sessionId: this.sessionId,\n timestamp: Date.now(),\n },\n storageTier: 'hot',\n context: `chat:${this.sessionId}`,\n tags: ['chat', 'message', role],\n metadata: {\n sessionId: this.sessionId,\n role,\n },\n });\n }\n\n /**\n * Add a user message\n */\n async addUserMessage(message: string): Promise<void> {\n await this.addMessage(new HumanMessage(message));\n }\n\n /**\n * Add an AI message\n */\n async addAIMessage(message: string): Promise<void> {\n await this.addMessage(new AIMessage(message));\n }\n\n /**\n * Clear all messages from history\n */\n async clear(): Promise<void> {\n this.messages = [];\n // Note: Xache doesn't support deletion - messages remain for audit trail\n // We only clear the local cache\n }\n\n /**\n * Load messages from Xache storage with pagination support\n */\n private async loadMessages(): Promise<void> {\n try {\n const allMemories: Array<{ storage_key: string; created_at?: string }> = [];\n let offset = 0;\n const effectiveMax = this.maxMessages === -1 ? Infinity : this.maxMessages;\n\n // Paginate through all messages\n while (allMemories.length < effectiveMax) {\n const result = await this.client.memory.list({\n context: `chat:${this.sessionId}`,\n limit: Math.min(this.pageSize, effectiveMax - allMemories.length),\n offset,\n });\n\n const memories = Array.isArray(result?.memories) ? result.memories : [];\n if (memories.length === 0) break;\n\n allMemories.push(...memories);\n offset += memories.length;\n\n // If we got less than pageSize, we've reached the end\n if (memories.length < this.pageSize) break;\n }\n\n // Sort by timestamp\n const sortedMemories = [...allMemories].sort((a, b) => {\n const tsA = new Date(a.created_at || 0).getTime();\n const tsB = new Date(b.created_at || 0).getTime();\n return tsA - tsB;\n });\n\n // For each memory, we need to retrieve the full content\n this.messages = [];\n for (const m of sortedMemories) {\n try {\n const full = await this.client.memory.retrieve({\n storageKey: m.storage_key,\n });\n const data = full.data as { role?: string; content?: string };\n if (data && data.content) {\n switch (data.role) {\n case 'human':\n case 'user':\n this.messages.push(new HumanMessage(data.content));\n break;\n case 'ai':\n case 'assistant':\n this.messages.push(new AIMessage(data.content));\n break;\n case 'system':\n this.messages.push(new SystemMessage(data.content));\n break;\n default:\n this.messages.push(new HumanMessage(data.content));\n }\n }\n } catch (error) {\n // Skip malformed messages but log in debug\n console.debug?.(`[XacheChatMessageHistory] Failed to parse message: ${(error as Error).message}`);\n }\n }\n\n this.initialized = true;\n } catch (error) {\n // If retrieval fails (e.g., no memories yet), start fresh\n // This is expected for new sessions\n console.debug?.(`[XacheChatMessageHistory] No existing messages found: ${(error as Error).message}`);\n this.messages = [];\n this.initialized = true;\n }\n }\n\n private getMessageRole(message: BaseMessage): string {\n if (message instanceof HumanMessage) return 'human';\n if (message instanceof AIMessage) return 'ai';\n if (message instanceof SystemMessage) return 'system';\n return 'unknown';\n }\n}\n","/**\n * Xache Retriever for LangChain.js\n * Memory retrieval for RAG pipelines with verifiable receipts\n */\n\nimport { BaseRetriever, BaseRetrieverInput } from '@langchain/core/retrievers';\nimport { Document } from '@langchain/core/documents';\nimport { CallbackManagerForRetrieverRun } from '@langchain/core/callbacks/manager';\nimport { XacheClient, DID } from '@xache/sdk';\n\nexport interface XacheRetrieverConfig extends BaseRetrieverInput {\n /** Wallet address for authentication */\n walletAddress: string;\n /** Private key for signing */\n privateKey: string;\n /** Number of documents to retrieve */\n k?: number;\n /** Filter by context */\n context?: string;\n /** API URL (defaults to https://api.xache.xyz) */\n apiUrl?: string;\n /** Chain: 'base' or 'solana' */\n chain?: 'base' | 'solana';\n}\n\n/**\n * Retriever that fetches documents from Xache memory storage.\n *\n * Use this for RAG pipelines with persistent, verifiable document storage.\n *\n * @example\n * ```typescript\n * import { XacheRetriever } from '@xache/langchain';\n * import { ChatOpenAI } from '@langchain/openai';\n * import { RetrievalQAChain } from 'langchain/chains';\n *\n * const retriever = new XacheRetriever({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * k: 5,\n * });\n *\n * const qa = RetrievalQAChain.fromLLM(new ChatOpenAI(), retriever);\n * const result = await qa.call({ query: 'What do you know about X?' });\n * ```\n */\nexport class XacheRetriever extends BaseRetriever {\n lc_namespace = ['xache', 'retriever'];\n\n static lc_name() {\n return 'XacheRetriever';\n }\n\n private client: XacheClient;\n private k: number;\n private filterContext?: string;\n\n constructor(config: XacheRetrieverConfig) {\n super(config);\n\n const chainPrefix = config.chain === 'solana' ? 'sol' : 'evm';\n const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}` as DID;\n\n this.client = new XacheClient({\n apiUrl: config.apiUrl || 'https://api.xache.xyz',\n did,\n privateKey: config.privateKey,\n });\n\n this.k = config.k ?? 5;\n this.filterContext = config.context;\n }\n\n async _getRelevantDocuments(\n _query: string,\n _runManager?: CallbackManagerForRetrieverRun\n ): Promise<Document[]> {\n // Use list method to get memories filtered by context\n const result = await this.client.memory.list({\n context: this.filterContext,\n limit: this.k,\n });\n\n const memories = result.memories || [];\n\n return memories.map(\n (m) =>\n new Document({\n pageContent: m.context || '',\n metadata: {\n storageKey: m.storage_key,\n context: m.context,\n tier: m.storage_tier,\n createdAt: m.created_at,\n size: m.size_bytes,\n },\n })\n );\n }\n}\n","/**\n * Xache Memory Extraction for LangChain.js\n * Auto-extract memories from conversations\n */\n\nimport { XacheClient, DID } from '@xache/sdk';\nimport type { ExtractMemoriesResponse } from '@xache/sdk';\n\nexport interface ExtractedMemory {\n /** Memory content */\n content: string;\n /** Suggested context/category */\n context: string;\n /** Suggested tags */\n tags: string[];\n /** Confidence score */\n confidence: number;\n /** Memory ID if stored */\n memoryId?: string;\n}\n\nexport interface ExtractionResult {\n /** Extracted memories */\n memories: ExtractedMemory[];\n /** Number of memories extracted */\n count: number;\n /** Total cost in USD */\n cost: number;\n /** Receipt ID for the operation */\n receiptId?: string;\n}\n\nexport interface XacheExtractorConfig {\n /** Wallet address for authentication */\n walletAddress: string;\n /** Private key for signing */\n privateKey: string;\n /** Extraction mode: 'xache-managed' uses Xache's LLM, 'api-key' uses your own */\n mode?: 'xache-managed' | 'api-key';\n /** Your LLM API key (required if mode is 'api-key') */\n llmApiKey?: string;\n /** LLM provider for api-key mode */\n llmProvider?: 'anthropic' | 'openai';\n /** API URL (defaults to https://api.xache.xyz) */\n apiUrl?: string;\n /** Chain: 'base' or 'solana' */\n chain?: 'base' | 'solana';\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Extract memories from conversation traces.\n *\n * Can auto-store extracted memories to Xache for later retrieval.\n *\n * @example\n * ```typescript\n * import { XacheExtractor } from '@xache/langchain';\n *\n * const extractor = new XacheExtractor({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * mode: 'xache-managed',\n * });\n *\n * const result = await extractor.extract(\n * 'User: What is the capital of France?\\nAI: Paris is the capital.',\n * { autoStore: true }\n * );\n *\n * console.log(`Extracted ${result.count} memories`);\n * ```\n */\nexport class XacheExtractor {\n private client: XacheClient;\n private mode: 'xache-managed' | 'api-key';\n private llmApiKey?: string;\n private llmProvider: 'anthropic' | 'openai';\n\n constructor(config: XacheExtractorConfig) {\n // Validate api-key mode requires llmApiKey\n const mode = config.mode || 'xache-managed';\n if (mode === 'api-key' && !config.llmApiKey) {\n throw new Error('llmApiKey is required when mode is \"api-key\"');\n }\n\n const chainPrefix = config.chain === 'solana' ? 'sol' : 'evm';\n const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}` as DID;\n\n this.client = new XacheClient({\n apiUrl: config.apiUrl || 'https://api.xache.xyz',\n did,\n privateKey: config.privateKey,\n timeout: config.timeout,\n debug: config.debug,\n });\n\n this.mode = mode;\n this.llmApiKey = config.llmApiKey;\n this.llmProvider = config.llmProvider || 'anthropic';\n }\n\n /**\n * Extract memories from a conversation trace\n */\n async extract(\n trace: string,\n options?: {\n /** Automatically store extracted memories */\n autoStore?: boolean;\n /** Custom instructions for extraction */\n instructions?: string;\n /** Minimum confidence threshold (0-1) */\n minConfidence?: number;\n }\n ): Promise<ExtractionResult> {\n const llmConfig =\n this.mode === 'xache-managed'\n ? { type: 'xache-managed' as const, provider: 'anthropic' as const }\n : {\n type: 'api-key' as const,\n provider: this.llmProvider || ('anthropic' as const),\n apiKey: this.llmApiKey || '',\n };\n\n const result: ExtractMemoriesResponse = await this.client.extraction.extract({\n trace,\n llmConfig,\n options: {\n autoStore: options?.autoStore,\n contextHint: options?.instructions,\n },\n });\n\n const minConfidence = options?.minConfidence ?? 0;\n const memories: ExtractedMemory[] = (result.extractions || [])\n .filter((m) => (m.confidence || 1) >= minConfidence)\n .map((m, index) => ({\n content: m.reasoning || JSON.stringify(m.data) || '',\n context: m.type || 'extracted',\n tags: Object.keys(m.data || {}),\n confidence: m.confidence || 1,\n memoryId: result.stored?.[index],\n }));\n\n return {\n memories,\n count: memories.length,\n cost: 0, // Cost is handled by x402\n receiptId: result.metadata?.paymentReceiptId,\n };\n }\n\n /**\n * Extract from LangChain messages\n */\n async extractFromMessages(\n messages: Array<{ role: string; content: string }>,\n options?: {\n autoStore?: boolean;\n instructions?: string;\n minConfidence?: number;\n }\n ): Promise<ExtractionResult> {\n const trace = messages.map((m) => `${m.role}: ${m.content}`).join('\\n');\n\n return this.extract(trace, options);\n }\n}\n","/**\n * Xache Collective Intelligence for LangChain.js\n * Share and learn from collective knowledge pools\n */\n\nimport { DynamicStructuredTool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { XacheClient, DID } from '@xache/sdk';\n\n/**\n * Generate a hash for the pattern (simple implementation)\n */\nasync function generatePatternHash(pattern: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(pattern);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\nexport interface CollectiveToolConfig {\n /** Wallet address for authentication */\n walletAddress: string;\n /** Private key for signing */\n privateKey: string;\n /** API URL (defaults to https://api.xache.xyz) */\n apiUrl?: string;\n /** Chain: 'base' or 'solana' */\n chain?: 'base' | 'solana';\n}\n\n/**\n * Create an Xache client for collective tools\n */\nfunction createClient(config: CollectiveToolConfig): XacheClient {\n const chainPrefix = config.chain === 'solana' ? 'sol' : 'evm';\n const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}` as DID;\n\n return new XacheClient({\n apiUrl: config.apiUrl || 'https://api.xache.xyz',\n did,\n privateKey: config.privateKey,\n });\n}\n\n/**\n * Create a tool for contributing to collective intelligence.\n *\n * @example\n * ```typescript\n * import { createCollectiveContributeTool } from '@xache/langchain';\n *\n * const contributeTool = createCollectiveContributeTool({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * const tools = [contributeTool, ...];\n * ```\n */\nexport function createCollectiveContributeTool(\n config: CollectiveToolConfig\n): DynamicStructuredTool {\n const client = createClient(config);\n\n return new DynamicStructuredTool({\n name: 'xache_collective_contribute',\n description:\n 'Contribute an insight or learning to the collective intelligence pool. ' +\n 'Use this when you discover something valuable that could help other agents. ' +\n \"You'll earn reputation for quality contributions.\",\n schema: z.object({\n insight: z.string().describe('The insight or learning to contribute'),\n domain: z.string().describe('Domain/topic of the insight'),\n evidence: z.string().optional().describe('Supporting evidence'),\n tags: z.array(z.string()).optional().describe('Tags for categorization'),\n }),\n func: async ({ insight, domain, evidence, tags }) => {\n // Generate required fields for the SDK\n const pattern = insight;\n const patternHash = await generatePatternHash(pattern);\n const tagsArray = tags || ['general'];\n\n const result = await client.collective.contribute({\n domain,\n pattern,\n patternHash,\n tags: tagsArray,\n metrics: {\n successRate: 0.8, // Default metrics for new contributions\n sampleSize: 1,\n confidence: 0.7,\n },\n encryptedContentRef: evidence || '', // Store evidence as encrypted ref\n });\n\n const heuristicId = result.heuristicId || 'unknown';\n const receiptId = result.receiptId || 'unknown';\n\n return `Contributed insight to '${domain}'. Heuristic ID: ${heuristicId}, Receipt: ${receiptId}`;\n },\n });\n}\n\n/**\n * Create a tool for querying collective intelligence.\n *\n * @example\n * ```typescript\n * import { createCollectiveQueryTool } from '@xache/langchain';\n *\n * const queryTool = createCollectiveQueryTool({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * const tools = [queryTool, ...];\n * ```\n */\nexport function createCollectiveQueryTool(\n config: CollectiveToolConfig\n): DynamicStructuredTool {\n const client = createClient(config);\n\n return new DynamicStructuredTool({\n name: 'xache_collective_query',\n description:\n 'Query the collective intelligence pool to learn from other agents. ' +\n 'Use this when you need insights or knowledge from the community. ' +\n 'Returns relevant contributions from other agents.',\n schema: z.object({\n query: z.string().describe('What to search for in the collective'),\n domain: z.string().optional().describe('Filter by domain'),\n limit: z.number().optional().default(5).describe('Number of results'),\n }),\n func: async ({ query, domain, limit }) => {\n const result = await client.collective.query({\n queryText: query,\n domain,\n limit: limit || 5,\n });\n\n const results = result.matches || [];\n\n if (results.length === 0) {\n return 'No relevant insights found in the collective.';\n }\n\n let output = `Found ${results.length} insights:\\n`;\n\n results.forEach((item, i: number) => {\n const pattern = (item.pattern || '').slice(0, 200);\n output += `\\n${i + 1}. ${pattern}`;\n if (item.domain) {\n output += ` [Domain: ${item.domain}]`;\n }\n if (item.relevanceScore) {\n output += ` (Relevance: ${item.relevanceScore.toFixed(2)})`;\n }\n });\n\n return output;\n },\n });\n}\n\n/**\n * Class-based collective contribute tool (alternative API)\n */\nexport class XacheCollectiveContributeTool {\n private tool: DynamicStructuredTool;\n\n constructor(config: CollectiveToolConfig) {\n this.tool = createCollectiveContributeTool(config);\n }\n\n asTool(): DynamicStructuredTool {\n return this.tool;\n }\n}\n\n/**\n * Class-based collective query tool (alternative API)\n */\nexport class XacheCollectiveQueryTool {\n private tool: DynamicStructuredTool;\n\n constructor(config: CollectiveToolConfig) {\n this.tool = createCollectiveQueryTool(config);\n }\n\n asTool(): DynamicStructuredTool {\n return this.tool;\n }\n}\n","/**\n * Xache Reputation for LangChain.js\n * Portable, verifiable agent reputation with ERC-8004 support\n */\n\nimport { DynamicStructuredTool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { XacheClient, DID } from '@xache/sdk';\n\nexport interface ReputationToolConfig {\n /** Wallet address for authentication */\n walletAddress: string;\n /** Private key for signing */\n privateKey: string;\n /** API URL (defaults to https://api.xache.xyz) */\n apiUrl?: string;\n /** Chain: 'base' or 'solana' */\n chain?: 'base' | 'solana';\n}\n\nexport interface ReputationResult {\n /** Reputation score (0-1) */\n score: number;\n /** Reputation level */\n level: string;\n /** Total contributions made */\n totalContributions: number;\n /** Total payments made */\n totalPayments: number;\n /** Whether ERC-8004 is enabled */\n erc8004Enabled: boolean;\n /** ERC-8004 agent ID if enabled */\n erc8004AgentId?: string;\n}\n\n/**\n * Get reputation level from score\n */\nfunction getLevel(score: number): string {\n if (score >= 0.9) return 'Elite';\n if (score >= 0.7) return 'Trusted';\n if (score >= 0.5) return 'Established';\n if (score >= 0.3) return 'Developing';\n return 'New';\n}\n\n/**\n * Create an Xache client for reputation tools\n */\nfunction createClient(config: ReputationToolConfig): XacheClient {\n const chainPrefix = config.chain === 'solana' ? 'sol' : 'evm';\n const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}` as DID;\n\n return new XacheClient({\n apiUrl: config.apiUrl || 'https://api.xache.xyz',\n did,\n privateKey: config.privateKey,\n });\n}\n\n/**\n * Create a tool for checking your own reputation.\n *\n * @example\n * ```typescript\n * import { createReputationTool } from '@xache/langchain';\n *\n * const repTool = createReputationTool({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * const tools = [repTool, ...];\n * ```\n */\nexport function createReputationTool(\n config: ReputationToolConfig\n): DynamicStructuredTool {\n const client = createClient(config);\n\n return new DynamicStructuredTool({\n name: 'xache_check_reputation',\n description:\n 'Check your current reputation score and status. ' +\n 'Returns your score (0-1), level, and ERC-8004 on-chain status. ' +\n 'Higher reputation means lower costs and more trust from other agents.',\n schema: z.object({}),\n func: async () => {\n const result = await client.reputation.getReputation();\n\n // Overall score is 0-100, normalize to 0-1\n const score = (result.overall || 0) / 100;\n const level = getLevel(score);\n\n let output = `Reputation Score: ${score.toFixed(2)}/1.00 (${level})\\n`;\n output += `Memory Quality: ${result.memoryQuality || 0}/100\\n`;\n output += `Contribution Success: ${result.contribSuccess || 0}/100\\n`;\n output += `Economic Value: ${result.economicValue || 0}/100\\n`;\n\n // Check ERC-8004 status separately\n try {\n const erc8004Status = await client.reputation.getERC8004Status();\n if (erc8004Status.enabled) {\n output += `ERC-8004 Status: Enabled\\n`;\n output += 'Your reputation is verifiable on-chain!';\n } else {\n output += 'ERC-8004 Status: Not enabled\\n';\n output += 'Enable ERC-8004 to make your reputation portable and verifiable.';\n }\n } catch {\n output += 'ERC-8004 Status: Unknown';\n }\n\n return output;\n },\n });\n}\n\n/**\n * Class-based reputation tool (alternative API)\n */\nexport class XacheReputationTool {\n private tool: DynamicStructuredTool;\n\n constructor(config: ReputationToolConfig) {\n this.tool = createReputationTool(config);\n }\n\n asTool(): DynamicStructuredTool {\n return this.tool;\n }\n}\n\n/**\n * Utility class for checking reputation of any agent.\n *\n * @example\n * ```typescript\n * import { XacheReputationChecker } from '@xache/langchain';\n *\n * const checker = new XacheReputationChecker({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * const rep = await checker.check('did:agent:evm:0xOtherAgent...');\n * if (rep.score >= 0.5) {\n * console.log('Agent is trustworthy');\n * }\n * ```\n */\nexport class XacheReputationChecker {\n private client: XacheClient;\n\n constructor(config: ReputationToolConfig) {\n this.client = createClient(config);\n }\n\n /**\n * Check an agent's reputation\n */\n async check(agentDid: string): Promise<ReputationResult> {\n const result = await this.client.reputation.getReputation(agentDid as DID);\n\n // Overall score is 0-100, normalize to 0-1\n const score = (result.overall || 0) / 100;\n\n // Try to get ERC-8004 status\n let erc8004Enabled = false;\n let erc8004AgentId: string | undefined;\n try {\n const erc8004Status = await this.client.reputation.getERC8004Status();\n erc8004Enabled = erc8004Status.enabled;\n } catch {\n // ERC-8004 status not available\n }\n\n return {\n score,\n level: getLevel(score),\n totalContributions: 0, // Not available in current API\n totalPayments: 0, // Not available in current API\n erc8004Enabled,\n erc8004AgentId,\n };\n }\n\n /**\n * Check if an agent meets minimum reputation threshold\n */\n async meetsThreshold(agentDid: string, minScore: number): Promise<boolean> {\n const result = await this.check(agentDid);\n return result.score >= minScore;\n }\n}\n"],"mappings":"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","names":["XacheClient","XacheClient","XacheClient","DynamicStructuredTool","z","XacheClient","createClient"]}
|
|
1
|
+
{"version":3,"sources":["../src/memory.ts","../src/chat_history.ts","../src/retriever.ts","../src/extraction.ts","../src/collective.ts","../src/reputation.ts"],"sourcesContent":["/**\n * Xache Memory for LangChain.js\n * Drop-in replacement for ConversationBufferMemory with verifiable receipts\n */\n\nimport { BaseMemory, InputValues, OutputValues, MemoryVariables } from '@langchain/core/memory';\nimport { XacheChatMessageHistory, XacheChatMessageHistoryConfig } from './chat_history';\n\nexport interface XacheMemoryConfig extends XacheChatMessageHistoryConfig {\n /** Memory key for input (default: 'input') */\n inputKey?: string;\n /** Memory key for output (default: 'output') */\n outputKey?: string;\n /** Key for returning memory (default: 'history') */\n memoryKey?: string;\n /** Return messages as list vs string */\n returnMessages?: boolean;\n}\n\n/**\n * Drop-in replacement for LangChain memory with Xache storage.\n *\n * Provides persistent, verifiable memory that survives across sessions.\n *\n * @example\n * ```typescript\n * import { XacheMemory } from '@xache/langchain';\n * import { ChatOpenAI } from '@langchain/openai';\n * import { ConversationChain } from 'langchain/chains';\n *\n * const memory = new XacheMemory({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * const chain = new ConversationChain({\n * llm: new ChatOpenAI(),\n * memory,\n * });\n *\n * await chain.call({ input: 'Hello!' });\n * ```\n */\nexport class XacheMemory extends BaseMemory {\n lc_namespace = ['xache', 'memory'];\n\n private chatHistory: XacheChatMessageHistory;\n private inputKey: string;\n private outputKey: string;\n private memoryKey: string;\n private returnMessages: boolean;\n\n constructor(config: XacheMemoryConfig) {\n super();\n this.chatHistory = new XacheChatMessageHistory(config);\n this.inputKey = config.inputKey || 'input';\n this.outputKey = config.outputKey || 'output';\n this.memoryKey = config.memoryKey || 'history';\n this.returnMessages = config.returnMessages ?? false;\n }\n\n get memoryKeys(): string[] {\n return [this.memoryKey];\n }\n\n /**\n * Load memory variables\n */\n async loadMemoryVariables(_values: InputValues): Promise<MemoryVariables> {\n const messages = await this.chatHistory.getMessages();\n\n if (this.returnMessages) {\n return { [this.memoryKey]: messages };\n }\n\n // Convert to string format\n const history = messages\n .map((m) => {\n const role = m._getType() === 'human' ? 'Human' : 'AI';\n const content =\n typeof m.content === 'string' ? m.content : JSON.stringify(m.content);\n return `${role}: ${content}`;\n })\n .join('\\n');\n\n return { [this.memoryKey]: history };\n }\n\n /**\n * Save context from this conversation to buffer\n */\n async saveContext(\n inputValues: InputValues,\n outputValues: OutputValues\n ): Promise<void> {\n const input = inputValues[this.inputKey];\n const output = outputValues[this.outputKey];\n\n if (input) {\n await this.chatHistory.addUserMessage(String(input));\n }\n\n if (output) {\n await this.chatHistory.addAIMessage(String(output));\n }\n }\n\n /**\n * Clear memory contents\n */\n async clear(): Promise<void> {\n await this.chatHistory.clear();\n }\n}\n\n/**\n * Extended memory with conversation buffer capabilities\n */\nexport class XacheConversationBufferMemory extends XacheMemory {\n lc_namespace = ['xache', 'memory', 'buffer'];\n}\n","/**\n * Xache Chat Message History for LangChain.js\n * Persistent message storage with cryptographic receipts\n */\n\nimport { BaseListChatMessageHistory } from '@langchain/core/chat_history';\nimport {\n BaseMessage,\n HumanMessage,\n AIMessage,\n SystemMessage,\n} from '@langchain/core/messages';\nimport { XacheClient, DID } from '@xache/sdk';\nimport { randomUUID } from 'crypto';\n\nexport interface XacheChatMessageHistoryConfig {\n /** Wallet address for authentication */\n walletAddress: string;\n /** Private key for signing */\n privateKey: string;\n /** Session ID to group messages */\n sessionId?: string;\n /** API URL (defaults to https://api.xache.xyz) */\n apiUrl?: string;\n /** Chain: 'base' or 'solana' */\n chain?: 'base' | 'solana';\n /** Maximum messages to load (default: 1000, set to -1 for unlimited) */\n maxMessages?: number;\n /** Page size for loading messages (default: 100) */\n pageSize?: number;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Chat message history backed by Xache Protocol.\n *\n * Messages are stored with cryptographic receipts and can persist\n * across sessions.\n *\n * @example\n * ```typescript\n * import { XacheChatMessageHistory } from '@xache/langchain';\n *\n * const history = new XacheChatMessageHistory({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * sessionId: 'unique-session-id',\n * });\n *\n * await history.addUserMessage('Hello!');\n * await history.addAIMessage('Hi there!');\n *\n * const messages = await history.getMessages();\n * ```\n */\nexport class XacheChatMessageHistory extends BaseListChatMessageHistory {\n lc_namespace = ['xache', 'chat_history'];\n\n private client: XacheClient;\n private sessionId: string;\n private messages: BaseMessage[] = [];\n private initialized = false;\n private maxMessages: number;\n private pageSize: number;\n\n constructor(config: XacheChatMessageHistoryConfig) {\n super();\n\n const chainPrefix = config.chain === 'solana' ? 'sol' : 'evm';\n const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}` as DID;\n\n this.client = new XacheClient({\n apiUrl: config.apiUrl || 'https://api.xache.xyz',\n did,\n privateKey: config.privateKey,\n timeout: config.timeout,\n debug: config.debug,\n });\n\n // Use UUID for collision-resistant session IDs\n this.sessionId = config.sessionId || `langchain-${randomUUID()}`;\n this.maxMessages = config.maxMessages ?? 1000;\n this.pageSize = config.pageSize ?? 100;\n }\n\n /**\n * Get all messages in the history\n */\n async getMessages(): Promise<BaseMessage[]> {\n if (!this.initialized) {\n await this.loadMessages();\n }\n return this.messages;\n }\n\n /**\n * Add a message to the history\n */\n async addMessage(message: BaseMessage): Promise<void> {\n this.messages.push(message);\n\n const role = this.getMessageRole(message);\n const content =\n typeof message.content === 'string'\n ? message.content\n : JSON.stringify(message.content);\n\n await this.client.memory.store({\n data: {\n role,\n content,\n sessionId: this.sessionId,\n timestamp: Date.now(),\n },\n storageTier: 'hot',\n context: `chat:${this.sessionId}`,\n tags: ['chat', 'message', role],\n metadata: {\n sessionId: this.sessionId,\n role,\n },\n });\n }\n\n /**\n * Add a user message\n */\n async addUserMessage(message: string): Promise<void> {\n await this.addMessage(new HumanMessage(message));\n }\n\n /**\n * Add an AI message\n */\n async addAIMessage(message: string): Promise<void> {\n await this.addMessage(new AIMessage(message));\n }\n\n /**\n * Clear all messages from history\n */\n async clear(): Promise<void> {\n this.messages = [];\n // Note: Xache doesn't support deletion - messages remain for audit trail\n // We only clear the local cache\n }\n\n /**\n * Load messages from Xache storage with pagination support\n */\n private async loadMessages(): Promise<void> {\n try {\n const allMemories: Array<{ storage_key: string; created_at?: string }> = [];\n let offset = 0;\n const effectiveMax = this.maxMessages === -1 ? Infinity : this.maxMessages;\n\n // Paginate through all messages\n while (allMemories.length < effectiveMax) {\n const result = await this.client.memory.list({\n context: `chat:${this.sessionId}`,\n limit: Math.min(this.pageSize, effectiveMax - allMemories.length),\n offset,\n });\n\n const memories = Array.isArray(result?.memories) ? result.memories : [];\n if (memories.length === 0) break;\n\n allMemories.push(...memories);\n offset += memories.length;\n\n // If we got less than pageSize, we've reached the end\n if (memories.length < this.pageSize) break;\n }\n\n // Sort by timestamp\n const sortedMemories = [...allMemories].sort((a, b) => {\n const tsA = new Date(a.created_at || 0).getTime();\n const tsB = new Date(b.created_at || 0).getTime();\n return tsA - tsB;\n });\n\n // For each memory, we need to retrieve the full content\n this.messages = [];\n for (const m of sortedMemories) {\n try {\n const full = await this.client.memory.retrieve({\n storageKey: m.storage_key,\n });\n const data = full.data as { role?: string; content?: string };\n if (data && data.content) {\n switch (data.role) {\n case 'human':\n case 'user':\n this.messages.push(new HumanMessage(data.content));\n break;\n case 'ai':\n case 'assistant':\n this.messages.push(new AIMessage(data.content));\n break;\n case 'system':\n this.messages.push(new SystemMessage(data.content));\n break;\n default:\n this.messages.push(new HumanMessage(data.content));\n }\n }\n } catch (error) {\n // Skip malformed messages but log in debug\n console.debug?.(`[XacheChatMessageHistory] Failed to parse message: ${(error as Error).message}`);\n }\n }\n\n this.initialized = true;\n } catch (error) {\n // If retrieval fails (e.g., no memories yet), start fresh\n // This is expected for new sessions\n console.debug?.(`[XacheChatMessageHistory] No existing messages found: ${(error as Error).message}`);\n this.messages = [];\n this.initialized = true;\n }\n }\n\n private getMessageRole(message: BaseMessage): string {\n if (message instanceof HumanMessage) return 'human';\n if (message instanceof AIMessage) return 'ai';\n if (message instanceof SystemMessage) return 'system';\n return 'unknown';\n }\n}\n","/**\n * Xache Retriever for LangChain.js\n * Memory retrieval for RAG pipelines with verifiable receipts\n */\n\nimport { BaseRetriever, BaseRetrieverInput } from '@langchain/core/retrievers';\nimport { Document } from '@langchain/core/documents';\nimport { CallbackManagerForRetrieverRun } from '@langchain/core/callbacks/manager';\nimport { XacheClient, DID } from '@xache/sdk';\n\nexport interface XacheRetrieverConfig extends BaseRetrieverInput {\n /** Wallet address for authentication */\n walletAddress: string;\n /** Private key for signing */\n privateKey: string;\n /** Number of documents to retrieve */\n k?: number;\n /** Filter by context */\n context?: string;\n /** API URL (defaults to https://api.xache.xyz) */\n apiUrl?: string;\n /** Chain: 'base' or 'solana' */\n chain?: 'base' | 'solana';\n}\n\n/**\n * Retriever that fetches documents from Xache memory storage.\n *\n * Use this for RAG pipelines with persistent, verifiable document storage.\n *\n * @example\n * ```typescript\n * import { XacheRetriever } from '@xache/langchain';\n * import { ChatOpenAI } from '@langchain/openai';\n * import { RetrievalQAChain } from 'langchain/chains';\n *\n * const retriever = new XacheRetriever({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * k: 5,\n * });\n *\n * const qa = RetrievalQAChain.fromLLM(new ChatOpenAI(), retriever);\n * const result = await qa.call({ query: 'What do you know about X?' });\n * ```\n */\nexport class XacheRetriever extends BaseRetriever {\n lc_namespace = ['xache', 'retriever'];\n\n static lc_name() {\n return 'XacheRetriever';\n }\n\n private client: XacheClient;\n private k: number;\n private filterContext?: string;\n\n constructor(config: XacheRetrieverConfig) {\n super(config);\n\n const chainPrefix = config.chain === 'solana' ? 'sol' : 'evm';\n const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}` as DID;\n\n this.client = new XacheClient({\n apiUrl: config.apiUrl || 'https://api.xache.xyz',\n did,\n privateKey: config.privateKey,\n });\n\n this.k = config.k ?? 5;\n this.filterContext = config.context;\n }\n\n async _getRelevantDocuments(\n _query: string,\n _runManager?: CallbackManagerForRetrieverRun\n ): Promise<Document[]> {\n // Use list method to get memories filtered by context\n const result = await this.client.memory.list({\n context: this.filterContext,\n limit: this.k,\n });\n\n const memories = result.memories || [];\n\n return memories.map(\n (m) =>\n new Document({\n pageContent: m.context || '',\n metadata: {\n storageKey: m.storage_key,\n context: m.context,\n tier: m.storage_tier,\n createdAt: m.created_at,\n size: m.size_bytes,\n },\n })\n );\n }\n}\n","/**\n * Xache Memory Extraction for LangChain.js\n * Auto-extract memories from conversations\n */\n\nimport { XacheClient, DID } from '@xache/sdk';\nimport type { ExtractMemoriesResponse, LLMProvider, LLMApiFormat } from '@xache/sdk';\n\nexport interface ExtractedMemory {\n /** Memory content */\n content: string;\n /** Suggested context/category */\n context: string;\n /** Suggested tags */\n tags: string[];\n /** Confidence score */\n confidence: number;\n /** Memory ID if stored */\n memoryId?: string;\n}\n\nexport interface ExtractionResult {\n /** Extracted memories */\n memories: ExtractedMemory[];\n /** Number of memories extracted */\n count: number;\n /** Total cost in USD */\n cost: number;\n /** Receipt ID for the operation */\n receiptId?: string;\n}\n\nexport interface XacheExtractorConfig {\n /** Wallet address for authentication */\n walletAddress: string;\n /** Private key for signing */\n privateKey: string;\n /**\n * Extraction mode:\n * - 'xache-managed': Xache provides the LLM ($0.011)\n * - 'api-key': Use major provider with known endpoint ($0.002)\n * - 'endpoint': Use custom/self-hosted endpoint ($0.002)\n */\n mode?: 'xache-managed' | 'api-key' | 'endpoint';\n /** Your LLM API key (required if mode is 'api-key') */\n llmApiKey?: string;\n /**\n * LLM provider for api-key mode\n * Supports: anthropic, openai, google, mistral, groq, together, fireworks, cohere, xai, deepseek\n */\n llmProvider?: LLMProvider;\n /** Custom endpoint URL (required if mode is 'endpoint') */\n endpointUrl?: string;\n /** Auth token for custom endpoint */\n endpointAuthToken?: string;\n /** API format for custom endpoint (default: 'openai') */\n endpointFormat?: LLMApiFormat;\n /** Model name (optional, uses provider/endpoint default) */\n model?: string;\n /** API URL (defaults to https://api.xache.xyz) */\n apiUrl?: string;\n /** Chain: 'base' or 'solana' */\n chain?: 'base' | 'solana';\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Extract memories from conversation traces.\n *\n * Can auto-store extracted memories to Xache for later retrieval.\n *\n * @example\n * ```typescript\n * import { XacheExtractor } from '@xache/langchain';\n *\n * const extractor = new XacheExtractor({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * mode: 'xache-managed',\n * });\n *\n * const result = await extractor.extract(\n * 'User: What is the capital of France?\\nAI: Paris is the capital.',\n * { autoStore: true }\n * );\n *\n * console.log(`Extracted ${result.count} memories`);\n * ```\n */\nexport class XacheExtractor {\n private client: XacheClient;\n private mode: 'xache-managed' | 'api-key' | 'endpoint';\n private llmApiKey?: string;\n private llmProvider: LLMProvider;\n private endpointUrl?: string;\n private endpointAuthToken?: string;\n private endpointFormat: LLMApiFormat;\n private model?: string;\n\n constructor(config: XacheExtractorConfig) {\n const mode = config.mode || 'xache-managed';\n\n // Validate api-key mode requires llmApiKey\n if (mode === 'api-key' && !config.llmApiKey) {\n throw new Error('llmApiKey is required when mode is \"api-key\"');\n }\n\n // Validate endpoint mode requires endpointUrl\n if (mode === 'endpoint' && !config.endpointUrl) {\n throw new Error('endpointUrl is required when mode is \"endpoint\"');\n }\n\n const chainPrefix = config.chain === 'solana' ? 'sol' : 'evm';\n const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}` as DID;\n\n this.client = new XacheClient({\n apiUrl: config.apiUrl || 'https://api.xache.xyz',\n did,\n privateKey: config.privateKey,\n timeout: config.timeout,\n debug: config.debug,\n });\n\n this.mode = mode;\n this.llmApiKey = config.llmApiKey;\n this.llmProvider = config.llmProvider || 'anthropic';\n this.endpointUrl = config.endpointUrl;\n this.endpointAuthToken = config.endpointAuthToken;\n this.endpointFormat = config.endpointFormat || 'openai';\n this.model = config.model;\n }\n\n /**\n * Extract memories from a conversation trace\n */\n async extract(\n trace: string,\n options?: {\n /** Automatically store extracted memories */\n autoStore?: boolean;\n /** Custom instructions for extraction */\n instructions?: string;\n /** Minimum confidence threshold (0-1) */\n minConfidence?: number;\n }\n ): Promise<ExtractionResult> {\n // Build llmConfig based on mode\n let llmConfig;\n if (this.mode === 'xache-managed') {\n llmConfig = {\n type: 'xache-managed' as const,\n provider: 'anthropic' as const,\n model: this.model,\n };\n } else if (this.mode === 'endpoint') {\n llmConfig = {\n type: 'endpoint' as const,\n url: this.endpointUrl!,\n authToken: this.endpointAuthToken,\n format: this.endpointFormat,\n model: this.model,\n };\n } else {\n llmConfig = {\n type: 'api-key' as const,\n provider: this.llmProvider,\n apiKey: this.llmApiKey || '',\n model: this.model,\n };\n }\n\n const result: ExtractMemoriesResponse = await this.client.extraction.extract({\n trace,\n llmConfig,\n options: {\n autoStore: options?.autoStore,\n contextHint: options?.instructions,\n },\n });\n\n const minConfidence = options?.minConfidence ?? 0;\n const memories: ExtractedMemory[] = (result.extractions || [])\n .filter((m) => (m.confidence || 1) >= minConfidence)\n .map((m, index) => ({\n content: m.reasoning || JSON.stringify(m.data) || '',\n context: m.type || 'extracted',\n tags: Object.keys(m.data || {}),\n confidence: m.confidence || 1,\n memoryId: result.stored?.[index],\n }));\n\n return {\n memories,\n count: memories.length,\n cost: 0, // Cost is handled by x402\n receiptId: result.metadata?.paymentReceiptId,\n };\n }\n\n /**\n * Extract from LangChain messages\n */\n async extractFromMessages(\n messages: Array<{ role: string; content: string }>,\n options?: {\n autoStore?: boolean;\n instructions?: string;\n minConfidence?: number;\n }\n ): Promise<ExtractionResult> {\n const trace = messages.map((m) => `${m.role}: ${m.content}`).join('\\n');\n\n return this.extract(trace, options);\n }\n}\n","/**\n * Xache Collective Intelligence for LangChain.js\n * Share and learn from collective knowledge pools\n */\n\nimport { DynamicStructuredTool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { XacheClient, DID } from '@xache/sdk';\n\n/**\n * Generate a hash for the pattern (simple implementation)\n */\nasync function generatePatternHash(pattern: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(pattern);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\nexport interface CollectiveToolConfig {\n /** Wallet address for authentication */\n walletAddress: string;\n /** Private key for signing */\n privateKey: string;\n /** API URL (defaults to https://api.xache.xyz) */\n apiUrl?: string;\n /** Chain: 'base' or 'solana' */\n chain?: 'base' | 'solana';\n}\n\n/**\n * Create an Xache client for collective tools\n */\nfunction createClient(config: CollectiveToolConfig): XacheClient {\n const chainPrefix = config.chain === 'solana' ? 'sol' : 'evm';\n const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}` as DID;\n\n return new XacheClient({\n apiUrl: config.apiUrl || 'https://api.xache.xyz',\n did,\n privateKey: config.privateKey,\n });\n}\n\n/**\n * Create a tool for contributing to collective intelligence.\n *\n * @example\n * ```typescript\n * import { createCollectiveContributeTool } from '@xache/langchain';\n *\n * const contributeTool = createCollectiveContributeTool({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * const tools = [contributeTool, ...];\n * ```\n */\nexport function createCollectiveContributeTool(\n config: CollectiveToolConfig\n): DynamicStructuredTool {\n const client = createClient(config);\n\n return new DynamicStructuredTool({\n name: 'xache_collective_contribute',\n description:\n 'Contribute an insight or learning to the collective intelligence pool. ' +\n 'Use this when you discover something valuable that could help other agents. ' +\n \"You'll earn reputation for quality contributions.\",\n schema: z.object({\n insight: z.string().describe('The insight or learning to contribute'),\n domain: z.string().describe('Domain/topic of the insight'),\n evidence: z.string().optional().describe('Supporting evidence'),\n tags: z.array(z.string()).optional().describe('Tags for categorization'),\n }),\n func: async ({ insight, domain, evidence, tags }) => {\n // Generate required fields for the SDK\n const pattern = insight;\n const patternHash = await generatePatternHash(pattern);\n const tagsArray = tags || ['general'];\n\n const result = await client.collective.contribute({\n domain,\n pattern,\n patternHash,\n tags: tagsArray,\n metrics: {\n successRate: 0.8, // Default metrics for new contributions\n sampleSize: 1,\n confidence: 0.7,\n },\n encryptedContentRef: evidence || '', // Store evidence as encrypted ref\n });\n\n const heuristicId = result.heuristicId || 'unknown';\n const receiptId = result.receiptId || 'unknown';\n\n return `Contributed insight to '${domain}'. Heuristic ID: ${heuristicId}, Receipt: ${receiptId}`;\n },\n });\n}\n\n/**\n * Create a tool for querying collective intelligence.\n *\n * @example\n * ```typescript\n * import { createCollectiveQueryTool } from '@xache/langchain';\n *\n * const queryTool = createCollectiveQueryTool({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * const tools = [queryTool, ...];\n * ```\n */\nexport function createCollectiveQueryTool(\n config: CollectiveToolConfig\n): DynamicStructuredTool {\n const client = createClient(config);\n\n return new DynamicStructuredTool({\n name: 'xache_collective_query',\n description:\n 'Query the collective intelligence pool to learn from other agents. ' +\n 'Use this when you need insights or knowledge from the community. ' +\n 'Returns relevant contributions from other agents.',\n schema: z.object({\n query: z.string().describe('What to search for in the collective'),\n domain: z.string().optional().describe('Filter by domain'),\n limit: z.number().optional().default(5).describe('Number of results'),\n }),\n func: async ({ query, domain, limit }) => {\n const result = await client.collective.query({\n queryText: query,\n domain,\n limit: limit || 5,\n });\n\n const results = result.matches || [];\n\n if (results.length === 0) {\n return 'No relevant insights found in the collective.';\n }\n\n let output = `Found ${results.length} insights:\\n`;\n\n results.forEach((item, i: number) => {\n const pattern = (item.pattern || '').slice(0, 200);\n output += `\\n${i + 1}. ${pattern}`;\n if (item.domain) {\n output += ` [Domain: ${item.domain}]`;\n }\n if (item.relevanceScore) {\n output += ` (Relevance: ${item.relevanceScore.toFixed(2)})`;\n }\n });\n\n return output;\n },\n });\n}\n\n/**\n * Class-based collective contribute tool (alternative API)\n */\nexport class XacheCollectiveContributeTool {\n private tool: DynamicStructuredTool;\n\n constructor(config: CollectiveToolConfig) {\n this.tool = createCollectiveContributeTool(config);\n }\n\n asTool(): DynamicStructuredTool {\n return this.tool;\n }\n}\n\n/**\n * Class-based collective query tool (alternative API)\n */\nexport class XacheCollectiveQueryTool {\n private tool: DynamicStructuredTool;\n\n constructor(config: CollectiveToolConfig) {\n this.tool = createCollectiveQueryTool(config);\n }\n\n asTool(): DynamicStructuredTool {\n return this.tool;\n }\n}\n","/**\n * Xache Reputation for LangChain.js\n * Portable, verifiable agent reputation with ERC-8004 support\n */\n\nimport { DynamicStructuredTool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { XacheClient, DID } from '@xache/sdk';\n\nexport interface ReputationToolConfig {\n /** Wallet address for authentication */\n walletAddress: string;\n /** Private key for signing */\n privateKey: string;\n /** API URL (defaults to https://api.xache.xyz) */\n apiUrl?: string;\n /** Chain: 'base' or 'solana' */\n chain?: 'base' | 'solana';\n}\n\nexport interface ReputationResult {\n /** Reputation score (0-1) */\n score: number;\n /** Reputation level */\n level: string;\n /** Total contributions made */\n totalContributions: number;\n /** Total payments made */\n totalPayments: number;\n /** Whether ERC-8004 is enabled */\n erc8004Enabled: boolean;\n /** ERC-8004 agent ID if enabled */\n erc8004AgentId?: string;\n}\n\n/**\n * Get reputation level from score\n */\nfunction getLevel(score: number): string {\n if (score >= 0.9) return 'Elite';\n if (score >= 0.7) return 'Trusted';\n if (score >= 0.5) return 'Established';\n if (score >= 0.3) return 'Developing';\n return 'New';\n}\n\n/**\n * Create an Xache client for reputation tools\n */\nfunction createClient(config: ReputationToolConfig): XacheClient {\n const chainPrefix = config.chain === 'solana' ? 'sol' : 'evm';\n const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}` as DID;\n\n return new XacheClient({\n apiUrl: config.apiUrl || 'https://api.xache.xyz',\n did,\n privateKey: config.privateKey,\n });\n}\n\n/**\n * Create a tool for checking your own reputation.\n *\n * @example\n * ```typescript\n * import { createReputationTool } from '@xache/langchain';\n *\n * const repTool = createReputationTool({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * const tools = [repTool, ...];\n * ```\n */\nexport function createReputationTool(\n config: ReputationToolConfig\n): DynamicStructuredTool {\n const client = createClient(config);\n\n return new DynamicStructuredTool({\n name: 'xache_check_reputation',\n description:\n 'Check your current reputation score and status. ' +\n 'Returns your score (0-1), level, and ERC-8004 on-chain status. ' +\n 'Higher reputation means lower costs and more trust from other agents.',\n schema: z.object({}),\n func: async () => {\n const result = await client.reputation.getReputation();\n\n // Overall score is 0-100, normalize to 0-1\n const score = (result.overall || 0) / 100;\n const level = getLevel(score);\n\n let output = `Reputation Score: ${score.toFixed(2)}/1.00 (${level})\\n`;\n output += `Memory Quality: ${result.memoryQuality || 0}/100\\n`;\n output += `Contribution Success: ${result.contribSuccess || 0}/100\\n`;\n output += `Economic Value: ${result.economicValue || 0}/100\\n`;\n\n // Check ERC-8004 status separately\n try {\n const erc8004Status = await client.reputation.getERC8004Status();\n if (erc8004Status.enabled) {\n output += `ERC-8004 Status: Enabled\\n`;\n output += 'Your reputation is verifiable on-chain!';\n } else {\n output += 'ERC-8004 Status: Not enabled\\n';\n output += 'Enable ERC-8004 to make your reputation portable and verifiable.';\n }\n } catch {\n output += 'ERC-8004 Status: Unknown';\n }\n\n return output;\n },\n });\n}\n\n/**\n * Class-based reputation tool (alternative API)\n */\nexport class XacheReputationTool {\n private tool: DynamicStructuredTool;\n\n constructor(config: ReputationToolConfig) {\n this.tool = createReputationTool(config);\n }\n\n asTool(): DynamicStructuredTool {\n return this.tool;\n }\n}\n\n/**\n * Utility class for checking reputation of any agent.\n *\n * @example\n * ```typescript\n * import { XacheReputationChecker } from '@xache/langchain';\n *\n * const checker = new XacheReputationChecker({\n * walletAddress: '0x...',\n * privateKey: '0x...',\n * });\n *\n * const rep = await checker.check('did:agent:evm:0xOtherAgent...');\n * if (rep.score >= 0.5) {\n * console.log('Agent is trustworthy');\n * }\n * ```\n */\nexport class XacheReputationChecker {\n private client: XacheClient;\n\n constructor(config: ReputationToolConfig) {\n this.client = createClient(config);\n }\n\n /**\n * Check an agent's reputation\n */\n async check(agentDid: string): Promise<ReputationResult> {\n const result = await this.client.reputation.getReputation(agentDid as DID);\n\n // Overall score is 0-100, normalize to 0-1\n const score = (result.overall || 0) / 100;\n\n // Try to get ERC-8004 status\n let erc8004Enabled = false;\n let erc8004AgentId: string | undefined;\n try {\n const erc8004Status = await this.client.reputation.getERC8004Status();\n erc8004Enabled = erc8004Status.enabled;\n } catch {\n // ERC-8004 status not available\n }\n\n return {\n score,\n level: getLevel(score),\n totalContributions: 0, // Not available in current API\n totalPayments: 0, // Not available in current API\n erc8004Enabled,\n erc8004AgentId,\n };\n }\n\n /**\n * Check if an agent meets minimum reputation threshold\n */\n async meetsThreshold(agentDid: string, minScore: number): Promise<boolean> {\n const result = await this.check(agentDid);\n return result.score >= minScore;\n }\n}\n"],"mappings":"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","names":["XacheClient","XacheClient","XacheClient","DynamicStructuredTool","z","XacheClient","createClient"]}
|
package/package.json
CHANGED
package/src/extraction.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { XacheClient, DID } from '@xache/sdk';
|
|
7
|
-
import type { ExtractMemoriesResponse } from '@xache/sdk';
|
|
7
|
+
import type { ExtractMemoriesResponse, LLMProvider, LLMApiFormat } from '@xache/sdk';
|
|
8
8
|
|
|
9
9
|
export interface ExtractedMemory {
|
|
10
10
|
/** Memory content */
|
|
@@ -35,12 +35,28 @@ export interface XacheExtractorConfig {
|
|
|
35
35
|
walletAddress: string;
|
|
36
36
|
/** Private key for signing */
|
|
37
37
|
privateKey: string;
|
|
38
|
-
/**
|
|
39
|
-
|
|
38
|
+
/**
|
|
39
|
+
* Extraction mode:
|
|
40
|
+
* - 'xache-managed': Xache provides the LLM ($0.011)
|
|
41
|
+
* - 'api-key': Use major provider with known endpoint ($0.002)
|
|
42
|
+
* - 'endpoint': Use custom/self-hosted endpoint ($0.002)
|
|
43
|
+
*/
|
|
44
|
+
mode?: 'xache-managed' | 'api-key' | 'endpoint';
|
|
40
45
|
/** Your LLM API key (required if mode is 'api-key') */
|
|
41
46
|
llmApiKey?: string;
|
|
42
|
-
/**
|
|
43
|
-
|
|
47
|
+
/**
|
|
48
|
+
* LLM provider for api-key mode
|
|
49
|
+
* Supports: anthropic, openai, google, mistral, groq, together, fireworks, cohere, xai, deepseek
|
|
50
|
+
*/
|
|
51
|
+
llmProvider?: LLMProvider;
|
|
52
|
+
/** Custom endpoint URL (required if mode is 'endpoint') */
|
|
53
|
+
endpointUrl?: string;
|
|
54
|
+
/** Auth token for custom endpoint */
|
|
55
|
+
endpointAuthToken?: string;
|
|
56
|
+
/** API format for custom endpoint (default: 'openai') */
|
|
57
|
+
endpointFormat?: LLMApiFormat;
|
|
58
|
+
/** Model name (optional, uses provider/endpoint default) */
|
|
59
|
+
model?: string;
|
|
44
60
|
/** API URL (defaults to https://api.xache.xyz) */
|
|
45
61
|
apiUrl?: string;
|
|
46
62
|
/** Chain: 'base' or 'solana' */
|
|
@@ -76,17 +92,27 @@ export interface XacheExtractorConfig {
|
|
|
76
92
|
*/
|
|
77
93
|
export class XacheExtractor {
|
|
78
94
|
private client: XacheClient;
|
|
79
|
-
private mode: 'xache-managed' | 'api-key';
|
|
95
|
+
private mode: 'xache-managed' | 'api-key' | 'endpoint';
|
|
80
96
|
private llmApiKey?: string;
|
|
81
|
-
private llmProvider:
|
|
97
|
+
private llmProvider: LLMProvider;
|
|
98
|
+
private endpointUrl?: string;
|
|
99
|
+
private endpointAuthToken?: string;
|
|
100
|
+
private endpointFormat: LLMApiFormat;
|
|
101
|
+
private model?: string;
|
|
82
102
|
|
|
83
103
|
constructor(config: XacheExtractorConfig) {
|
|
84
|
-
// Validate api-key mode requires llmApiKey
|
|
85
104
|
const mode = config.mode || 'xache-managed';
|
|
105
|
+
|
|
106
|
+
// Validate api-key mode requires llmApiKey
|
|
86
107
|
if (mode === 'api-key' && !config.llmApiKey) {
|
|
87
108
|
throw new Error('llmApiKey is required when mode is "api-key"');
|
|
88
109
|
}
|
|
89
110
|
|
|
111
|
+
// Validate endpoint mode requires endpointUrl
|
|
112
|
+
if (mode === 'endpoint' && !config.endpointUrl) {
|
|
113
|
+
throw new Error('endpointUrl is required when mode is "endpoint"');
|
|
114
|
+
}
|
|
115
|
+
|
|
90
116
|
const chainPrefix = config.chain === 'solana' ? 'sol' : 'evm';
|
|
91
117
|
const did = `did:agent:${chainPrefix}:${config.walletAddress.toLowerCase()}` as DID;
|
|
92
118
|
|
|
@@ -101,6 +127,10 @@ export class XacheExtractor {
|
|
|
101
127
|
this.mode = mode;
|
|
102
128
|
this.llmApiKey = config.llmApiKey;
|
|
103
129
|
this.llmProvider = config.llmProvider || 'anthropic';
|
|
130
|
+
this.endpointUrl = config.endpointUrl;
|
|
131
|
+
this.endpointAuthToken = config.endpointAuthToken;
|
|
132
|
+
this.endpointFormat = config.endpointFormat || 'openai';
|
|
133
|
+
this.model = config.model;
|
|
104
134
|
}
|
|
105
135
|
|
|
106
136
|
/**
|
|
@@ -117,14 +147,30 @@ export class XacheExtractor {
|
|
|
117
147
|
minConfidence?: number;
|
|
118
148
|
}
|
|
119
149
|
): Promise<ExtractionResult> {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
150
|
+
// Build llmConfig based on mode
|
|
151
|
+
let llmConfig;
|
|
152
|
+
if (this.mode === 'xache-managed') {
|
|
153
|
+
llmConfig = {
|
|
154
|
+
type: 'xache-managed' as const,
|
|
155
|
+
provider: 'anthropic' as const,
|
|
156
|
+
model: this.model,
|
|
157
|
+
};
|
|
158
|
+
} else if (this.mode === 'endpoint') {
|
|
159
|
+
llmConfig = {
|
|
160
|
+
type: 'endpoint' as const,
|
|
161
|
+
url: this.endpointUrl!,
|
|
162
|
+
authToken: this.endpointAuthToken,
|
|
163
|
+
format: this.endpointFormat,
|
|
164
|
+
model: this.model,
|
|
165
|
+
};
|
|
166
|
+
} else {
|
|
167
|
+
llmConfig = {
|
|
168
|
+
type: 'api-key' as const,
|
|
169
|
+
provider: this.llmProvider,
|
|
170
|
+
apiKey: this.llmApiKey || '',
|
|
171
|
+
model: this.model,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
128
174
|
|
|
129
175
|
const result: ExtractMemoriesResponse = await this.client.extraction.extract({
|
|
130
176
|
trace,
|