UNPKG

mcard-js

Version:

MCard - Content-addressable storage with cryptographic hashing, handle resolution, and vector search for Node.js and browsers

121 lines 4.75 kB
/** * Multi-runtime execution with consensus verification. */ import * as fs from 'fs'; import * as path from 'path'; import { RuntimeFactory } from '../runtimes/index.js'; import { resultsEqual } from './utils.js'; /** * Execute a CLM across multiple runtimes and verify consensus. */ export async function executeMultiRuntime(clm, chapterDir, input) { const startTime = Date.now(); const config = clm.clm.concrete; const runtimesConfig = config?.runtimes_config || []; if (runtimesConfig.length === 0) { return buildMultiRuntimeResult(false, false, [], startTime, clm, 'No runtimes_config defined'); } const results = []; // Execute on each runtime for (const rtConfig of runtimesConfig) { const result = await executeOnRuntime(rtConfig, config, chapterDir, input); results.push(result); } // Check consensus - all successful results must be equal const successfulResults = results.filter(r => r.success); const availableResults = results.filter(r => r.success || !r.error?.includes('Runtime not available')); let consensus = false; let consensusValue = undefined; if (successfulResults.length > 0) { const firstResult = successfulResults[0].result; consensus = successfulResults.every(r => resultsEqual(firstResult, r.result, 1e-9)); if (consensus) { consensusValue = firstResult; } } // Success if at least 2 runtimes succeeded and achieved consensus const availableSuccess = successfulResults.length >= 2 && consensus; const allAvailableSuccess = availableResults.length > 0 && availableResults.every(r => r.success); return buildMultiRuntimeResult(availableSuccess || (allAvailableSuccess && consensus), consensus, results, startTime, clm, undefined, consensusValue); } // ─── Private Helpers ───────────────────────────────────────────────────────── async function executeOnRuntime(rtConfig, config, chapterDir, input) { const runtimeName = rtConfig.name; const rtStartTime = Date.now(); try { const runtime = RuntimeFactory.getRuntime(runtimeName); let codeOrPath = null; // Determine source based on runtime type if (['rust', 'c'].includes(runtimeName)) { codeOrPath = rtConfig.binary || null; } else if (runtimeName === 'wasm') { codeOrPath = rtConfig.module || null; } else { const file = rtConfig.file; if (file) { codeOrPath = path.resolve(chapterDir, file); } } if (!codeOrPath) { return { runtime: runtimeName, success: false, error: `No source file/binary specified for ${runtimeName}`, executionTime: Date.now() - rtStartTime }; } // For source file runtimes, read the file content let codeContent = codeOrPath; if (!['rust', 'c', 'wasm'].includes(runtimeName)) { try { codeContent = fs.readFileSync(codeOrPath, 'utf-8'); } catch (e) { return { runtime: runtimeName, success: false, error: `Cannot read source file: ${codeOrPath}`, executionTime: Date.now() - rtStartTime }; } } const result = await runtime.execute(codeContent, input, { ...config, entry_point: rtConfig.entry }, chapterDir); return { runtime: runtimeName, success: true, result, executionTime: Date.now() - rtStartTime }; } catch (e) { const errorMsg = e instanceof Error ? e.message : String(e); const isUnavailable = errorMsg.includes('Unknown runtime'); return { runtime: runtimeName, success: false, error: isUnavailable ? `Runtime not available: ${runtimeName}` : errorMsg, executionTime: Date.now() - rtStartTime }; } } function buildMultiRuntimeResult(success, consensus, results, startTime, clm, error, consensusValue) { return { success, consensus, results, consensusValue, error, executionTime: Date.now() - startTime, clm: { chapter: clm.chapter.title, concept: clm.clm.abstract?.concept || 'Unknown', manifestation: clm.clm.concrete?.manifestation || 'Unknown', } }; } //# sourceMappingURL=multiruntime.js.map