chore: recovery checkpoint - v3.0 API successfully recovered
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
This commit is contained in:
parent
f65455fb22
commit
8ff382ca3b
895 changed files with 143654 additions and 28268 deletions
166
.recovery-workspace/dist-backup-20250910-141917/api/ConfigAPI.js
Normal file
166
.recovery-workspace/dist-backup-20250910-141917/api/ConfigAPI.js
Normal file
|
|
@ -0,0 +1,166 @@
|
|||
/**
|
||||
* 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue