CRITICAL CHECKPOINT - DO NOT PUSH TO GITHUB Recovery Status: - Successfully recovered brainy.ts from compiled JavaScript - All core v3.0 API methods functional (add, get, update, delete, relate, find, etc.) - Neural subsystem intact (562KB embedded patterns, NLP working) - Augmentation pipeline operational (20+ augmentations) - HNSW clustering system complete - Triple Intelligence compiled (needs constructor fix) - Test suite validates functionality Changes preserved: - 898 files with changes from last 3 days - 144,475 insertions - All augmentation improvements - All test coverage enhancements - Complete v3.0 feature set This is a LOCAL checkpoint only - contains recovered work after corruption incident. Created backup in .backups/brainy-full-20250910-151314.tar.gz Branch: recovery-checkpoint-20250910-151433 Date: Wed Sep 10 03:18:04 PM PDT 2025
166 lines
No EOL
5.1 KiB
JavaScript
166 lines
No EOL
5.1 KiB
JavaScript
/**
|
|
* Configuration API for Brainy 3.0
|
|
* Provides configuration storage with optional encryption
|
|
*/
|
|
import { SecurityAPI } from './SecurityAPI.js';
|
|
export class ConfigAPI {
|
|
constructor(storage) {
|
|
this.storage = storage;
|
|
this.configCache = new Map();
|
|
this.CONFIG_NOUN_PREFIX = '_config_';
|
|
this.security = new SecurityAPI();
|
|
}
|
|
/**
|
|
* Set a configuration value with optional encryption
|
|
*/
|
|
async set(params) {
|
|
const { key, value, encrypt = false } = params;
|
|
// Serialize and optionally encrypt the value
|
|
let storedValue = value;
|
|
if (typeof value !== 'string') {
|
|
storedValue = JSON.stringify(value);
|
|
}
|
|
if (encrypt) {
|
|
storedValue = await this.security.encrypt(storedValue);
|
|
}
|
|
// Create config entry
|
|
const entry = {
|
|
key,
|
|
value: storedValue,
|
|
encrypted: encrypt,
|
|
createdAt: this.configCache.get(key)?.createdAt || Date.now(),
|
|
updatedAt: Date.now()
|
|
};
|
|
// Store in cache
|
|
this.configCache.set(key, entry);
|
|
// Persist to storage
|
|
const configId = this.CONFIG_NOUN_PREFIX + key;
|
|
await this.storage.saveMetadata(configId, entry);
|
|
}
|
|
/**
|
|
* Get a configuration value with optional decryption
|
|
*/
|
|
async get(params) {
|
|
const { key, decrypt, defaultValue } = params;
|
|
// Check cache first
|
|
let entry = this.configCache.get(key);
|
|
// If not in cache, load from storage
|
|
if (!entry) {
|
|
const configId = this.CONFIG_NOUN_PREFIX + key;
|
|
const metadata = await this.storage.getMetadata(configId);
|
|
if (!metadata) {
|
|
return defaultValue;
|
|
}
|
|
entry = metadata;
|
|
this.configCache.set(key, entry);
|
|
}
|
|
let value = entry.value;
|
|
// Decrypt if needed
|
|
const shouldDecrypt = decrypt !== undefined ? decrypt : entry.encrypted;
|
|
if (shouldDecrypt && entry.encrypted && typeof value === 'string') {
|
|
value = await this.security.decrypt(value);
|
|
}
|
|
// Try to parse JSON if it looks like JSON
|
|
if (typeof value === 'string' && (value.startsWith('{') || value.startsWith('['))) {
|
|
try {
|
|
value = JSON.parse(value);
|
|
}
|
|
catch {
|
|
// Not JSON, return as string
|
|
}
|
|
}
|
|
return value;
|
|
}
|
|
/**
|
|
* Delete a configuration value
|
|
*/
|
|
async delete(key) {
|
|
// Remove from cache
|
|
this.configCache.delete(key);
|
|
// Remove from storage
|
|
const configId = this.CONFIG_NOUN_PREFIX + key;
|
|
await this.storage.saveMetadata(configId, null);
|
|
}
|
|
/**
|
|
* List all configuration keys
|
|
*/
|
|
async list() {
|
|
// Get all metadata keys from storage
|
|
const allMetadata = await this.storage.getMetadata('');
|
|
if (!allMetadata || typeof allMetadata !== 'object') {
|
|
return [];
|
|
}
|
|
// Filter for config keys
|
|
const configKeys = [];
|
|
for (const key of Object.keys(allMetadata)) {
|
|
if (key.startsWith(this.CONFIG_NOUN_PREFIX)) {
|
|
configKeys.push(key.substring(this.CONFIG_NOUN_PREFIX.length));
|
|
}
|
|
}
|
|
return configKeys;
|
|
}
|
|
/**
|
|
* Check if a configuration key exists
|
|
*/
|
|
async has(key) {
|
|
if (this.configCache.has(key)) {
|
|
return true;
|
|
}
|
|
const configId = this.CONFIG_NOUN_PREFIX + key;
|
|
const metadata = await this.storage.getMetadata(configId);
|
|
return metadata !== null && metadata !== undefined;
|
|
}
|
|
/**
|
|
* Clear all configuration
|
|
*/
|
|
async clear() {
|
|
// Clear cache
|
|
this.configCache.clear();
|
|
// Clear from storage
|
|
const keys = await this.list();
|
|
for (const key of keys) {
|
|
await this.delete(key);
|
|
}
|
|
}
|
|
/**
|
|
* Export all configuration
|
|
*/
|
|
async export() {
|
|
const keys = await this.list();
|
|
const config = {};
|
|
for (const key of keys) {
|
|
const entry = await this.getEntry(key);
|
|
if (entry) {
|
|
config[key] = entry;
|
|
}
|
|
}
|
|
return config;
|
|
}
|
|
/**
|
|
* Import configuration
|
|
*/
|
|
async import(config) {
|
|
for (const [key, entry] of Object.entries(config)) {
|
|
this.configCache.set(key, entry);
|
|
const configId = this.CONFIG_NOUN_PREFIX + key;
|
|
await this.storage.saveMetadata(configId, entry);
|
|
}
|
|
}
|
|
/**
|
|
* Get raw config entry (without decryption)
|
|
*/
|
|
async getEntry(key) {
|
|
if (this.configCache.has(key)) {
|
|
return this.configCache.get(key);
|
|
}
|
|
const configId = this.CONFIG_NOUN_PREFIX + key;
|
|
const metadata = await this.storage.getMetadata(configId);
|
|
if (!metadata) {
|
|
return null;
|
|
}
|
|
const entry = metadata;
|
|
this.configCache.set(key, entry);
|
|
return entry;
|
|
}
|
|
}
|
|
//# sourceMappingURL=ConfigAPI.js.map
|