echonodesync
Version:
Autonomous, pluggable, secure memory bridge for agent/human/ritual ecosystems (DreamWeaver, EchoThreads, etc.)
50 lines (44 loc) • 1.52 kB
JavaScript
// Shared helpers for MCP actions (env/secret resolution)
// Used by all MCP memory actions for consistent environment discovery.
const fs = require('fs');
const path = require('path');
const os = require('os');
function stripQuotes(str) {
if (!str) return str;
return str.replace(/^['"]+|['"]+$/g, '').trim();
}
function resolveApiUrl() {
if (process.env.ECHONODESYNC_API_URL) return stripQuotes(process.env.ECHONODESYNC_API_URL);
const envPaths = [
path.resolve(process.cwd(), '.env'),
path.resolve(os.homedir(), '.env')
];
for (const envPath of envPaths) {
if (fs.existsSync(envPath)) {
const lines = fs.readFileSync(envPath, 'utf8').split(/\r?\n/);
for (const line of lines) {
const match = line.match(/^\s*ECHONODESYNC_API_URL\s*=\s*(.+)\s*$/);
if (match) return stripQuotes(match[1]);
}
}
}
return 'http://localhost:3000/api/memory';
}
function resolveSecret() {
if (process.env.ECHONODESYNC_SECRET) return stripQuotes(process.env.ECHONODESYNC_SECRET);
const envPaths = [
path.resolve(process.cwd(), '.env'),
path.resolve(os.homedir(), '.env')
];
for (const envPath of envPaths) {
if (fs.existsSync(envPath)) {
const lines = fs.readFileSync(envPath, 'utf8').split(/\r?\n/);
for (const line of lines) {
const match = line.match(/^\s*ECHONODESYNC_SECRET\s*=\s*(.+)\s*$/);
if (match) return stripQuotes(match[1]);
}
}
}
return null;
}
module.exports = { resolveApiUrl, resolveSecret };