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
JavaScript
/**
* 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