personal-data-wallet-sdk
Version:
TypeScript SDK for Personal Data Wallet - Decentralized memory system with AI embeddings, HNSW vector search, SEAL encryption and Walrus storage
413 lines (354 loc) • 12.6 kB
text/typescript
/**
* Configuration Utilities for Personal Data Wallet SDK
*
* Provides helpers for managing API keys, environment variables,
* and configuration validation across the SDK.
*/
export interface SDKConfig {
// AI/Embedding configuration
geminiApiKey?: string;
embeddingModel?: string;
// Blockchain configuration
suiNetwork?: 'testnet' | 'mainnet' | 'devnet' | 'localnet';
suiPackageId?: string;
suiAdminPrivateKey?: string;
// Storage configuration
walrusNetwork?: 'testnet' | 'mainnet';
walrusUploadRelay?: string;
// SEAL encryption configuration
sealKeyServerUrl?: string;
sealKeyServerObjectId?: string;
sealSessionTTL?: number;
sealEnableBatch?: boolean;
sealBatchSize?: number;
sealDecryptionTimeout?: number;
sealVerifyServers?: boolean;
sealEnableAudit?: boolean;
// Feature flags
enableEncryption?: boolean;
enableBatching?: boolean;
enableMonitoring?: boolean;
}
export interface EnvironmentConfig {
// Gemini AI
GEMINI_API_KEY?: string;
GOOGLE_AI_API_KEY?: string;
// Sui Blockchain
SUI_NETWORK?: string;
SUI_PACKAGE_ID?: string;
SUI_ADMIN_PRIVATE_KEY?: string;
// Walrus Storage
WALRUS_NETWORK?: string;
WALRUS_UPLOAD_RELAY?: string;
// SEAL Encryption
SEAL_KEY_SERVER_URL?: string;
SEAL_KEY_SERVER_OBJECT_ID?: string;
SEAL_SESSION_TTL?: string;
SEAL_ENABLE_BATCH?: string;
SEAL_BATCH_SIZE?: string;
SEAL_DECRYPTION_TIMEOUT?: string;
SEAL_VERIFY_SERVERS?: string;
SEAL_ENABLE_AUDIT?: string;
// Feature toggles
PDW_ENABLE_ENCRYPTION?: string;
PDW_ENABLE_BATCHING?: string;
PDW_ENABLE_MONITORING?: string;
}
/**
* Configuration helper with environment variable support
*/
export class ConfigurationHelper {
constructor() {
// Instance constructor for backwards compatibility
}
/**
* Get Gemini API key from various sources
*/
static getGeminiApiKey(providedKey?: string): string {
const apiKey = providedKey ||
process.env.GEMINI_API_KEY ||
process.env.GOOGLE_AI_API_KEY;
if (!apiKey) {
throw new Error(
'🔑 Gemini API key is required. Set it via:\n\n' +
'1. Direct configuration:\n' +
' const pipeline = createQuickStartPipeline("BASIC", {\n' +
' embedding: { apiKey: "your-api-key" }\n' +
' });\n\n' +
'2. Environment variable:\n' +
' export GEMINI_API_KEY="your-api-key"\n' +
' # or\n' +
' export GOOGLE_AI_API_KEY="your-api-key"\n\n' +
'3. .env file:\n' +
' GEMINI_API_KEY=your-api-key\n\n' +
'📝 Get your free API key from: https://makersuite.google.com/app/apikey'
);
}
return apiKey;
}
/**
* Get Sui configuration from environment
*/
static getSuiConfig(): {
network: 'testnet' | 'mainnet' | 'devnet' | 'localnet';
packageId?: string;
adminPrivateKey?: string;
} {
const network = (process.env.SUI_NETWORK as any) || 'testnet';
return {
network,
packageId: process.env.SUI_PACKAGE_ID,
adminPrivateKey: process.env.SUI_ADMIN_PRIVATE_KEY
};
}
/**
* Get Walrus configuration from environment
*/
static getWalrusConfig(): {
network: 'testnet' | 'mainnet';
uploadRelay?: string;
} {
const network = (process.env.WALRUS_NETWORK as any) || 'testnet';
return {
network,
uploadRelay: process.env.WALRUS_UPLOAD_RELAY
};
}
/**
* Get SEAL key server configuration from environment
*/
static getSealConfig(): {
keyServerUrl?: string;
keyServerObjectId?: string;
sessionTTL: number;
enableBatch: boolean;
batchSize: number;
decryptionTimeout: number;
verifyServers: boolean;
enableAudit: boolean;
network: string;
retryAttempts: number;
} {
return {
keyServerUrl: process.env.SEAL_KEY_SERVER_URL || 'https://testnet.seal.mysten.app',
keyServerObjectId: process.env.SEAL_KEY_SERVER_OBJECT_ID,
sessionTTL: process.env.SEAL_SESSION_TTL ? parseInt(process.env.SEAL_SESSION_TTL) : 60,
enableBatch: process.env.SEAL_ENABLE_BATCH === 'true',
batchSize: process.env.SEAL_BATCH_SIZE ? parseInt(process.env.SEAL_BATCH_SIZE) : 10,
decryptionTimeout: process.env.SEAL_DECRYPTION_TIMEOUT ? parseInt(process.env.SEAL_DECRYPTION_TIMEOUT) : 30000,
verifyServers: process.env.SEAL_VERIFY_SERVERS !== 'false', // Default true
enableAudit: process.env.SEAL_ENABLE_AUDIT === 'true',
network: process.env.SEAL_NETWORK || 'testnet',
retryAttempts: process.env.SEAL_RETRY_ATTEMPTS ? parseInt(process.env.SEAL_RETRY_ATTEMPTS) : 3
};
}
/**
* Instance method for getSealConfig (for backwards compatibility)
*/
getSealConfig(): {
keyServerUrl?: string;
keyServerObjectId?: string;
sessionTTL: number;
enableBatch: boolean;
batchSize: number;
decryptionTimeout: number;
verifyServers: boolean;
enableAudit: boolean;
network: string;
retryAttempts: number;
} {
return ConfigurationHelper.getSealConfig();
}
/**
* Load configuration from environment variables
*/
static loadFromEnvironment(): SDKConfig {
return {
// AI Configuration
geminiApiKey: process.env.GEMINI_API_KEY || process.env.GOOGLE_AI_API_KEY,
embeddingModel: process.env.EMBEDDING_MODEL || 'text-embedding-004',
// Blockchain Configuration
suiNetwork: (process.env.SUI_NETWORK as any) || 'testnet',
suiPackageId: process.env.SUI_PACKAGE_ID,
suiAdminPrivateKey: process.env.SUI_ADMIN_PRIVATE_KEY,
// Storage Configuration
walrusNetwork: (process.env.WALRUS_NETWORK as any) || 'testnet',
walrusUploadRelay: process.env.WALRUS_UPLOAD_RELAY,
// Feature Flags
enableEncryption: this.parseBooleanEnv('PDW_ENABLE_ENCRYPTION', true),
enableBatching: this.parseBooleanEnv('PDW_ENABLE_BATCHING', true),
enableMonitoring: this.parseBooleanEnv('PDW_ENABLE_MONITORING', true)
};
}
/**
* Validate that required configuration is present
*/
static validateConfig(config: Partial<SDKConfig>): {
isValid: boolean;
errors: string[];
warnings: string[];
} {
const errors: string[] = [];
const warnings: string[] = [];
// Check for Gemini API key
try {
this.getGeminiApiKey(config.geminiApiKey);
} catch (error) {
errors.push('Missing Gemini API key for AI embedding generation');
}
// Validate Sui configuration
if (config.suiPackageId && !config.suiPackageId.startsWith('0x')) {
errors.push('Invalid Sui package ID format (should start with 0x)');
}
if (config.suiAdminPrivateKey && config.suiAdminPrivateKey.length < 32) {
warnings.push('Sui admin private key seems too short');
}
// Network consistency check
if (config.suiNetwork !== config.walrusNetwork) {
warnings.push('Sui and Walrus networks should typically match');
}
return {
isValid: errors.length === 0,
errors,
warnings
};
}
/**
* Create a complete configuration with smart defaults
*/
static createConfig(overrides: Partial<SDKConfig> = {}): SDKConfig {
const envConfig = this.loadFromEnvironment();
const merged = { ...envConfig, ...overrides };
// Validate the final configuration
const validation = this.validateConfig(merged);
if (!validation.isValid) {
throw new Error(
`Configuration validation failed:\n${validation.errors.join('\n')}`
);
}
if (validation.warnings.length > 0) {
console.warn('⚠️ Configuration warnings:', validation.warnings);
}
return merged;
}
/**
* Print current configuration (masking sensitive data)
*/
static printConfig(config: SDKConfig): void {
const masked = {
...config,
geminiApiKey: config.geminiApiKey ? this.maskApiKey(config.geminiApiKey) : undefined,
suiAdminPrivateKey: config.suiAdminPrivateKey ? this.maskPrivateKey(config.suiAdminPrivateKey) : undefined
};
console.log('📋 PDW SDK Configuration:');
console.table(masked);
}
/**
* Generate example .env file content
*/
static generateEnvTemplate(): string {
return `# Personal Data Wallet SDK Configuration
# Copy this to your .env file and fill in your values
# 🧠 AI/Embedding Configuration (Required)
GEMINI_API_KEY=your_gemini_api_key_here
# Get your key from: https://makersuite.google.com/app/apikey
# ⛓️ Sui Blockchain Configuration (Optional)
SUI_NETWORK=testnet
SUI_PACKAGE_ID=your_deployed_package_id_here
SUI_ADMIN_PRIVATE_KEY=your_sui_private_key_here
# 🗄️ Walrus Storage Configuration (Optional)
WALRUS_NETWORK=testnet
WALRUS_UPLOAD_RELAY=https://upload-relay.testnet.walrus.space
# 🔐 SEAL Encryption Configuration (Optional)
# Uses official Mysten Labs testnet servers by default
# Configure custom key server if needed:
SEAL_KEY_SERVER_URL=your_custom_key_server_url
SEAL_KEY_SERVER_OBJECT_ID=your_custom_key_server_object_id
SEAL_SESSION_TTL=60
SEAL_ENABLE_BATCH=true
SEAL_BATCH_SIZE=10
SEAL_DECRYPTION_TIMEOUT=30000
SEAL_VERIFY_SERVERS=true
SEAL_ENABLE_AUDIT=false
# 🎛️ Feature Flags (Optional)
PDW_ENABLE_ENCRYPTION=true
PDW_ENABLE_BATCHING=true
PDW_ENABLE_MONITORING=true
# 🔧 Advanced Settings (Optional)
EMBEDDING_MODEL=text-embedding-004
`;
}
/**
* Generate SEAL-specific environment template
*/
static generateSealEnvTemplate(): string {
return `# SEAL Encryption Configuration for Personal Data Wallet SDK
# 🔑 SEAL Key Server Configuration
SEAL_KEY_SERVER_URL=https://testnet.seal.mysten.app
SEAL_NETWORK=testnet
# 🔧 SEAL Performance Settings
SEAL_BATCH_SIZE=10
SEAL_RETRY_ATTEMPTS=3
SEAL_DECRYPTION_TIMEOUT=30000
SEAL_SESSION_TTL=60
# 🛡️ SEAL Security Settings
SEAL_VERIFY_SERVERS=true
SEAL_ENABLE_AUDIT=false
SEAL_ENABLE_BATCH=true
# 📦 Deployed Contract Configuration
SUI_PACKAGE_ID=0x067706fc08339b715dab0383bd853b04d06ef6dff3a642c5e7056222da038bde
SUI_NETWORK=testnet
# 🔑 Testnet Key Servers (Official Mysten Labs)
SEAL_KEY_SERVER_1_URL=https://seal-key-server-testnet-1.mystenlabs.com
SEAL_KEY_SERVER_1_OBJECT=0x73d05d62c18d9374e3ea529e8e0ed6161da1a141a94d3f76ae3fe4e99356db75
SEAL_KEY_SERVER_2_URL=https://seal-key-server-testnet-2.mystenlabs.com
SEAL_KEY_SERVER_2_OBJECT=0xf5d14a81a982144ae441cd7d64b09027f116a468bd36e7eca494f750591623c8
`;
}
/**
* Instance method for generateSealEnvTemplate (for backwards compatibility)
*/
generateSealEnvTemplate(): string {
return ConfigurationHelper.generateSealEnvTemplate();
}
// Private helper methods
private static parseBooleanEnv(key: string, defaultValue: boolean): boolean {
const value = process.env[key];
if (value === undefined) return defaultValue;
return value.toLowerCase() === 'true' || value === '1';
}
private static maskApiKey(apiKey: string): string {
if (apiKey.length <= 8) return '*'.repeat(apiKey.length);
return apiKey.substring(0, 4) + '*'.repeat(apiKey.length - 8) + apiKey.substring(apiKey.length - 4);
}
private static maskPrivateKey(privateKey: string): string {
if (privateKey.length <= 16) return '*'.repeat(privateKey.length);
return privateKey.substring(0, 6) + '*'.repeat(privateKey.length - 12) + privateKey.substring(privateKey.length - 6);
}
}
/**
* Quick configuration helpers
*/
export const Config = {
/**
* Create configuration from environment variables
*/
fromEnv: (): SDKConfig => ConfigurationHelper.loadFromEnvironment(),
/**
* Create configuration with validation
*/
create: (overrides?: Partial<SDKConfig>): SDKConfig => ConfigurationHelper.createConfig(overrides),
/**
* Validate existing configuration
*/
validate: (config: Partial<SDKConfig>) => ConfigurationHelper.validateConfig(config),
/**
* Get Gemini API key with helpful error messages
*/
getGeminiKey: (key?: string): string => ConfigurationHelper.getGeminiApiKey(key),
/**
* Generate .env template
*/
generateEnvTemplate: (): string => ConfigurationHelper.generateEnvTemplate()
};
export default ConfigurationHelper;