UNPKG

@xynehq/jaf

Version:

Juspay Agent Framework - A purely functional agent framework with immutable state and composable tools

164 lines 6.95 kB
import { createSuccess, createFailure, createMemoryStorageError } from './types'; /** * In-memory implementation of ApprovalStorage * Non-persistent, good for development and testing */ export function createInMemoryApprovalStorage() { const approvals = new Map(); const getRunKey = (runId) => `run:${runId}`; return { storeApproval: async (runId, toolCallId, approval) => { try { const runKey = getRunKey(runId); if (!approvals.has(runKey)) { approvals.set(runKey, new Map()); } const runApprovals = approvals.get(runKey); runApprovals.set(toolCallId, approval); return createSuccess(undefined); } catch (error) { return createFailure(createMemoryStorageError('store approval', 'InMemoryApprovalStorage', error instanceof Error ? error : new Error(String(error)))); } }, getApproval: async (runId, toolCallId) => { try { const runKey = getRunKey(runId); const runApprovals = approvals.get(runKey); if (!runApprovals) { return createSuccess(null); } const approval = runApprovals.get(toolCallId) || null; return createSuccess(approval); } catch (error) { return createFailure(createMemoryStorageError('get approval', 'InMemoryApprovalStorage', error instanceof Error ? error : new Error(String(error)))); } }, getRunApprovals: async (runId) => { try { const runKey = getRunKey(runId); const runApprovals = approvals.get(runKey); if (!runApprovals) { return createSuccess(new Map()); } return createSuccess(new Map(runApprovals)); } catch (error) { return createFailure(createMemoryStorageError('get run approvals', 'InMemoryApprovalStorage', error instanceof Error ? error : new Error(String(error)))); } }, updateApproval: async (runId, toolCallId, updates) => { try { const runKey = getRunKey(runId); const runApprovals = approvals.get(runKey); if (!runApprovals || !runApprovals.has(toolCallId)) { return createFailure(createMemoryStorageError('update approval', 'InMemoryApprovalStorage', new Error(`Approval not found for tool call ${toolCallId} in run ${runId}`))); } const existingApproval = runApprovals.get(toolCallId); const updatedApproval = { ...existingApproval, ...updates, additionalContext: { ...existingApproval.additionalContext, ...updates.additionalContext } }; runApprovals.set(toolCallId, updatedApproval); return createSuccess(undefined); } catch (error) { return createFailure(createMemoryStorageError('update approval', 'InMemoryApprovalStorage', error instanceof Error ? error : new Error(String(error)))); } }, deleteApproval: async (runId, toolCallId) => { try { const runKey = getRunKey(runId); const runApprovals = approvals.get(runKey); if (!runApprovals) { return createSuccess(false); } const deleted = runApprovals.delete(toolCallId); // Clean up empty run maps if (runApprovals.size === 0) { approvals.delete(runKey); } return createSuccess(deleted); } catch (error) { return createFailure(createMemoryStorageError('delete approval', 'InMemoryApprovalStorage', error instanceof Error ? error : new Error(String(error)))); } }, clearRunApprovals: async (runId) => { try { const runKey = getRunKey(runId); const runApprovals = approvals.get(runKey); if (!runApprovals) { return createSuccess(0); } const count = runApprovals.size; approvals.delete(runKey); return createSuccess(count); } catch (error) { return createFailure(createMemoryStorageError('clear run approvals', 'InMemoryApprovalStorage', error instanceof Error ? error : new Error(String(error)))); } }, getStats: async () => { try { let totalApprovals = 0; let approvedCount = 0; let rejectedCount = 0; const runsWithApprovals = approvals.size; for (const [, runApprovals] of approvals) { for (const approval of runApprovals.values()) { totalApprovals++; if (approval.approved) { approvedCount++; } else { rejectedCount++; } } } return createSuccess({ totalApprovals, approvedCount, rejectedCount, runsWithApprovals }); } catch (error) { return createFailure(createMemoryStorageError('get stats', 'InMemoryApprovalStorage', error instanceof Error ? error : new Error(String(error)))); } }, healthCheck: async () => { try { const start = Date.now(); // Simple operation to test functionality await Promise.resolve(); const latencyMs = Date.now() - start; return createSuccess({ healthy: true, latencyMs }); } catch (error) { return createSuccess({ healthy: false, error: error instanceof Error ? error.message : String(error) }); } }, close: async () => { try { approvals.clear(); return createSuccess(undefined); } catch (error) { return createFailure(createMemoryStorageError('close', 'InMemoryApprovalStorage', error instanceof Error ? error : new Error(String(error)))); } } }; } //# sourceMappingURL=approval-storage.js.map