memory-bridge/auth.js
Zero cf36c06c31 Initial release: memory-bridge v1.0.0
Persistent semantic memory HTTP server for AI agents.
No cloud, no API keys. Local vector index with Ollama/TF-IDF embeddings.
Endpoints: /store, /recall, /forget, /list, /health
2026-03-31 06:36:11 +02:00

65 lines
2.0 KiB
JavaScript

'use strict';
const fs = require('fs');
const path = require('path');
const os = require('os');
const { randomBytes } = require('crypto');
const ENV_PATH = path.join(os.homedir(), '.memory-bridge', '.env');
let token = null;
function init() {
// Prefer env var (loaded by dotenv on subsequent runs)
if (process.env.MEMORY_BRIDGE_TOKEN) {
token = process.env.MEMORY_BRIDGE_TOKEN;
return;
}
// Try reading directly from file (handles edge cases)
try {
const raw = fs.readFileSync(ENV_PATH, 'utf8');
const m = raw.match(/^MEMORY_BRIDGE_TOKEN=(.+)$/m);
if (m) {
token = m[1].trim();
process.env.MEMORY_BRIDGE_TOKEN = token;
return;
}
} catch { /* file doesn't exist yet */ }
// First run: generate and persist
token = randomBytes(32).toString('hex');
const dir = path.dirname(ENV_PATH);
fs.mkdirSync(dir, { recursive: true });
if (fs.existsSync(ENV_PATH)) {
fs.appendFileSync(ENV_PATH, `\nMEMORY_BRIDGE_TOKEN=${token}\n`);
} else {
fs.writeFileSync(
ENV_PATH,
`MEMORY_BRIDGE_TOKEN=${token}\nMEMORY_BRIDGE_PORT=3722\nOLLAMA_URL=http://localhost:11434\n`
);
}
process.env.MEMORY_BRIDGE_TOKEN = token;
console.log('\n══════════════════════════════════════════════════');
console.log('First run — your auth token (save this):');
console.log(` ${token}`);
console.log(`Persisted to: ${ENV_PATH}`);
console.log('══════════════════════════════════════════════════\n');
}
function middleware(req, res, next) {
const hdr = req.headers['authorization'] || '';
if (!hdr.startsWith('Bearer ')) {
return res.status(401).json({ error: 'Authorization: Bearer <token> required' });
}
if (hdr.slice(7).trim() !== token) {
return res.status(401).json({ error: 'Invalid token' });
}
next();
}
module.exports = { init, middleware };