mindcache 2.4.1 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/local/IndexedDBAdapter.ts","../../src/cloud/CloudAdapter.ts","../../src/core/types.ts","../../src/core/MindCache.ts","../../src/cloud/index.ts"],"names":["CloudAdapter","IndexedDBAdapter","canWrite","z"],"mappings":"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","file":"index.js","sourcesContent":["import type { MindCache } from '../core/MindCache';\n\nexport interface IndexedDBConfig {\n /** Database name (defaults to 'mindcache_db') */\n dbName?: string;\n /** Store name (defaults to 'mindcache_store') */\n storeName?: string;\n /** Storage key (defaults to 'mindcache_data') */\n key?: string;\n /** Debounce time in ms for saving (defaults to 1000) */\n debounceMs?: number;\n}\n\nexport class IndexedDBAdapter {\n private mindcache: MindCache | null = null;\n private unsubscribe: (() => void) | null = null;\n private saveTimeout: ReturnType<typeof setTimeout> | null = null;\n private db: IDBDatabase | null = null;\n\n private dbName: string;\n private storeName: string;\n private key: string;\n\n constructor(private config: IndexedDBConfig = {}) {\n this.dbName = config.dbName || 'mindcache_db';\n this.storeName = config.storeName || 'mindcache_store';\n this.key = config.key || 'mindcache_data';\n }\n\n async attach(mc: MindCache): Promise<void> {\n if (this.mindcache) {\n this.detach();\n }\n\n this.mindcache = mc;\n await this.initDB();\n await this.load();\n\n const listener = () => {\n // Don't save if this change came from deserialize (loading)\n // The isRemoteUpdate flag is set during deserialization\n if (this.mindcache && !this.mindcache.isRemoteUpdate()) {\n this.scheduleSave();\n }\n };\n\n mc.subscribeToAll(listener);\n this.unsubscribe = () => mc.unsubscribeFromAll(listener);\n console.log('🗄️ IndexedDBAdapter: Attached to MindCache instance');\n }\n\n detach(): void {\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = null;\n }\n if (this.saveTimeout) {\n clearTimeout(this.saveTimeout);\n this.saveTimeout = null;\n }\n this.mindcache = null;\n if (this.db) {\n this.db.close();\n this.db = null;\n }\n }\n\n private initDB(): Promise<void> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(this.dbName);\n\n request.onerror = () => {\n console.error('MindCache: IndexedDB error:', request.error);\n reject(request.error);\n };\n\n request.onsuccess = () => {\n const db = request.result;\n\n // Check if the required store exists\n if (!db.objectStoreNames.contains(this.storeName)) {\n // Store doesn't exist - need to trigger upgrade\n const currentVersion = db.version;\n db.close();\n\n // Reopen with incremented version to trigger onupgradeneeded\n const upgradeRequest = indexedDB.open(this.dbName, currentVersion + 1);\n\n upgradeRequest.onerror = () => {\n console.error('MindCache: IndexedDB upgrade error:', upgradeRequest.error);\n reject(upgradeRequest.error);\n };\n\n upgradeRequest.onupgradeneeded = () => {\n const upgradeDb = upgradeRequest.result;\n if (!upgradeDb.objectStoreNames.contains(this.storeName)) {\n upgradeDb.createObjectStore(this.storeName);\n }\n };\n\n upgradeRequest.onsuccess = () => {\n this.db = upgradeRequest.result;\n resolve();\n };\n } else {\n this.db = db;\n resolve();\n }\n };\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(this.storeName)) {\n db.createObjectStore(this.storeName);\n }\n };\n });\n }\n\n private load(): Promise<void> {\n if (!this.db || !this.mindcache) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n try {\n const transaction = this.db!.transaction([this.storeName], 'readonly');\n const store = transaction.objectStore(this.storeName);\n const request = store.get(this.key);\n\n request.onsuccess = () => {\n if (request.result) {\n this.mindcache!.deserialize(request.result);\n console.log('🗄️ IndexedDBAdapter: Loaded data from IndexedDB');\n }\n resolve();\n };\n\n request.onerror = () => {\n console.error('MindCache: Failed to load from IndexedDB:', request.error);\n resolve(); // Resolve anyway to avoid blocking initialization\n };\n } catch (error) {\n console.error('MindCache: Error accessing IndexedDB for load:', error);\n resolve();\n }\n });\n }\n\n private scheduleSave(): void {\n if (this.saveTimeout) {\n clearTimeout(this.saveTimeout);\n }\n\n this.saveTimeout = setTimeout(() => {\n this.save();\n this.saveTimeout = null;\n }, this.config.debounceMs ?? 1000);\n }\n\n private save(): void {\n if (!this.db || !this.mindcache) {\n return;\n }\n\n try {\n const data = this.mindcache.serialize();\n const transaction = this.db.transaction([this.storeName], 'readwrite');\n const store = transaction.objectStore(this.storeName);\n const request = store.put(data, this.key);\n\n request.onsuccess = () => {\n console.log('🗄️ IndexedDBAdapter: Saved to IndexedDB');\n };\n\n request.onerror = () => {\n console.error('MindCache: Failed to save to IndexedDB:', request.error);\n };\n } catch (error) {\n console.error('MindCache: Error accessing IndexedDB for save:', error);\n }\n }\n}\n","import type { MindCache } from '../core/MindCache';\nimport type { KeyAttributes } from '../core/types';\nimport type {\n CloudConfig,\n Operation,\n IncomingMessage,\n ConnectionState,\n CloudAdapterEvents\n} from './types';\n\nconst RECONNECT_DELAY = 1000;\nconst MAX_RECONNECT_DELAY = 30000;\n\n/**\n * CloudAdapter connects a MindCache instance to the cloud service\n * for real-time sync and persistence.\n *\n * Auth flow:\n * 1. SDK calls POST /api/ws-token with apiKey to get short-lived token\n * 2. SDK connects to WebSocket with token in query string\n * 3. Server validates token and upgrades to WebSocket\n *\n * Usage patterns:\n * - apiKey: SDK fetches tokens automatically (simple, good for demos)\n * - tokenEndpoint: Your backend fetches tokens (secure, apiKey stays server-side)\n * - tokenProvider: Custom token logic (advanced)\n */\nexport class CloudAdapter {\n private ws: WebSocket | null = null;\n private queue: Operation[] = [];\n private mindcache: MindCache | null = null;\n private unsubscribe: (() => void) | null = null;\n private reconnectAttempts = 0;\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n private _state: ConnectionState = 'disconnected';\n private listeners: Partial<{ [K in keyof CloudAdapterEvents]: CloudAdapterEvents[K][] }> = {};\n private token: string | null = null;\n\n constructor(private config: CloudConfig) {\n if (!config.baseUrl) {\n throw new Error('MindCache Cloud: baseUrl is required. Please provide the cloud API URL in your configuration.');\n }\n }\n\n /**\n * Set auth token (short-lived, from /api/ws-token)\n * Call this before connect() or use setTokenProvider for auto-refresh\n */\n setToken(token: string): void {\n this.token = token;\n }\n\n /**\n * Set a function that returns a fresh token\n * Used for automatic token refresh on reconnect\n */\n setTokenProvider(provider: () => Promise<string>): void {\n this.config.tokenProvider = provider;\n }\n\n /**\n * Get current connection state\n */\n get state(): ConnectionState {\n return this._state;\n }\n\n /**\n * Attach to a MindCache instance and start syncing\n */\n attach(mc: MindCache): void {\n if (this.mindcache) {\n this.detach();\n }\n\n this.mindcache = mc;\n\n // Subscribe to local changes → push to cloud\n const listener = () => {\n // Skip if this change came from remote\n if (mc.isRemoteUpdate()) {\n console.log('☁️ CloudAdapter: Skipping remote update');\n return;\n }\n\n console.log('☁️ CloudAdapter: Local change detected, syncing...');\n // Get the current state and queue changes\n // In a real implementation, we'd track individual changes\n // For now, we'll sync the entire state on change\n this.syncLocalChanges();\n };\n\n mc.subscribeToAll(listener);\n this.unsubscribe = () => mc.unsubscribeFromAll(listener);\n console.log('☁️ CloudAdapter: Attached to MindCache instance');\n }\n\n /**\n * Detach from the MindCache instance\n */\n detach(): void {\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = null;\n }\n this.mindcache = null;\n }\n\n /**\n * Fetch a short-lived WebSocket token from the API using the API key.\n * This keeps the API key secure by only using it for a single HTTPS request,\n * then using the short-lived token for the WebSocket connection.\n *\n * Supports two key formats:\n * - API keys: mc_live_xxx or mc_test_xxx → Bearer token\n * - Delegate keys: del_xxx:sec_xxx → ApiKey format\n */\n private async fetchTokenWithApiKey(): Promise<string> {\n if (!this.config.apiKey) {\n throw new Error('API key is required to fetch token');\n }\n\n // Convert WebSocket URL to HTTP for the token endpoint\n const httpBaseUrl = this.config.baseUrl!\n .replace('wss://', 'https://')\n .replace('ws://', 'http://');\n\n // Detect key format and use appropriate auth header\n // Delegate keys: del_xxx:sec_xxx format\n // API keys: mc_live_xxx or mc_test_xxx format\n const isDelegate = this.config.apiKey.startsWith('del_') && this.config.apiKey.includes(':');\n const authHeader = isDelegate\n ? `ApiKey ${this.config.apiKey}`\n : `Bearer ${this.config.apiKey}`;\n\n const response = await fetch(`${httpBaseUrl}/api/ws-token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': authHeader\n },\n body: JSON.stringify({\n instanceId: this.config.instanceId,\n permission: 'write'\n })\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Failed to get token' }));\n throw new Error(error.error || `Failed to get WebSocket token: ${response.status}`);\n }\n\n const data = await response.json();\n return data.token;\n }\n\n /**\n * Connect to the cloud service\n */\n async connect(): Promise<void> {\n if (this._state === 'connecting' || this._state === 'connected') {\n return;\n }\n\n this._state = 'connecting';\n\n try {\n // Get token using one of these methods (in priority order):\n // 1. tokenProvider function (for apps with custom token logic)\n // 2. apiKey (SDK fetches token automatically from API)\n // 3. pre-set token (rare, for manual token management)\n\n if (!this.token) {\n if (this.config.tokenProvider) {\n this.token = await this.config.tokenProvider();\n } else if (this.config.apiKey) {\n // Automatically fetch a short-lived token using the API key\n this.token = await this.fetchTokenWithApiKey();\n }\n }\n\n // Build WebSocket URL with token\n let url = `${this.config.baseUrl}/sync/${this.config.instanceId}`;\n if (this.token) {\n url += `?token=${encodeURIComponent(this.token)}`;\n // Token is single-use, clear it after connecting\n this.token = null;\n } else {\n throw new Error('MindCache Cloud: No authentication method available. Provide apiKey or tokenProvider.');\n }\n\n this.ws = new WebSocket(url);\n this.setupWebSocket();\n } catch (error) {\n this._state = 'error';\n this.emit('error', error as Error);\n this.scheduleReconnect();\n }\n }\n\n /**\n * Disconnect from the cloud service\n */\n disconnect(): void {\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this._state = 'disconnected';\n this.emit('disconnected');\n }\n\n /**\n * Push an operation to the cloud\n */\n push(op: Operation): void {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(op));\n } else {\n // Queue for when we reconnect\n this.queue.push(op);\n }\n }\n\n /**\n * Add event listener\n */\n on<K extends keyof CloudAdapterEvents>(event: K, listener: CloudAdapterEvents[K]): void {\n if (!this.listeners[event]) {\n this.listeners[event] = [];\n }\n this.listeners[event]!.push(listener);\n }\n\n /**\n * Remove event listener\n */\n off<K extends keyof CloudAdapterEvents>(event: K, listener: CloudAdapterEvents[K]): void {\n if (this.listeners[event]) {\n this.listeners[event] = this.listeners[event]!.filter(l => l !== listener) as any;\n }\n }\n\n private emit<K extends keyof CloudAdapterEvents>(event: K, ...args: Parameters<CloudAdapterEvents[K]>): void {\n if (this.listeners[event]) {\n this.listeners[event]!.forEach(listener => (listener as any)(...args));\n }\n }\n\n private setupWebSocket(): void {\n if (!this.ws) {\n return;\n }\n\n this.ws.onopen = () => {\n // Token auth was already verified by Worker before WebSocket upgrade\n // Server will send sync message directly\n };\n\n this.ws.onmessage = (event) => {\n try {\n const msg = JSON.parse(event.data) as IncomingMessage;\n this.handleMessage(msg);\n } catch (error) {\n console.error('MindCache Cloud: Failed to parse message:', error);\n console.error('Raw message:', typeof event.data === 'string' ? event.data.slice(0, 200) : event.data);\n }\n };\n\n this.ws.onclose = () => {\n this._state = 'disconnected';\n this.emit('disconnected');\n this.scheduleReconnect();\n };\n\n this.ws.onerror = () => {\n this._state = 'error';\n const url = `${this.config.baseUrl}/sync/${this.config.instanceId}`;\n console.error(`MindCache Cloud: WebSocket error connecting to ${url}`);\n console.error('Check that the instance ID and API key are correct, and that the server is reachable.');\n this.emit('error', new Error(`WebSocket connection failed to ${url}`));\n };\n }\n\n private handleMessage(msg: IncomingMessage): void {\n switch (msg.type) {\n case 'auth_success':\n this._state = 'connected';\n this.reconnectAttempts = 0;\n this.emit('connected');\n this.flushQueue();\n break;\n\n case 'auth_error':\n this._state = 'error';\n this.emit('error', new Error(msg.error));\n this.disconnect();\n break;\n\n case 'sync':\n // Initial sync - load all data\n if (this.mindcache && msg.data) {\n Object.entries(msg.data).forEach(([key, entry]) => {\n const { value, attributes } = entry as { value: unknown; attributes: KeyAttributes };\n this.mindcache!._setFromRemote(key, value, attributes);\n });\n this.emit('synced');\n }\n break;\n\n case 'set':\n // Remote update (legacy)\n if (this.mindcache) {\n this.mindcache._setFromRemote(msg.key, msg.value, msg.attributes as KeyAttributes);\n }\n break;\n\n case 'key_updated':\n // Server broadcast of key update\n if (this.mindcache) {\n this.mindcache._setFromRemote(msg.key, msg.value, msg.attributes);\n }\n break;\n\n case 'delete':\n // Remote delete (legacy)\n if (this.mindcache) {\n this.mindcache._deleteFromRemote(msg.key);\n }\n break;\n\n case 'key_deleted':\n // Server broadcast of key deletion\n if (this.mindcache) {\n this.mindcache._deleteFromRemote(msg.key);\n }\n break;\n\n case 'clear':\n if (this.mindcache) {\n this.mindcache._clearFromRemote();\n }\n break;\n\n case 'cleared':\n // Server broadcast of clear\n if (this.mindcache) {\n this.mindcache._clearFromRemote();\n }\n break;\n\n case 'error':\n this.emit('error', new Error(msg.error));\n break;\n }\n }\n\n private flushQueue(): void {\n while (this.queue.length > 0 && this.ws?.readyState === WebSocket.OPEN) {\n const op = this.queue.shift()!;\n this.ws.send(JSON.stringify(op));\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimeout) {\n return;\n }\n\n const delay = Math.min(\n RECONNECT_DELAY * Math.pow(2, this.reconnectAttempts),\n MAX_RECONNECT_DELAY\n );\n\n this.reconnectTimeout = setTimeout(async () => {\n this.reconnectTimeout = null;\n this.reconnectAttempts++;\n\n // connect() handles token fetching automatically\n this.connect();\n }, delay);\n }\n\n private syncLocalChanges(): void {\n if (!this.mindcache) {\n return;\n }\n\n // Get all current entries and sync them\n const entries = this.mindcache.serialize();\n\n console.log('☁️ CloudAdapter: Syncing local changes:', Object.keys(entries));\n\n Object.entries(entries).forEach(([key, entry]) => {\n console.log('☁️ CloudAdapter: Pushing key:', key, '=', entry.value);\n this.push({\n type: 'set',\n key,\n value: entry.value,\n attributes: entry.attributes,\n timestamp: Date.now()\n });\n });\n }\n}\n\n","/**\n * Access level for MindCache operations\n * - 'user': Can only manage content tags (default)\n * - 'system': Can manage both content tags and system tags\n */\nexport type AccessLevel = 'user' | 'system';\n\n/**\n * Known system tags that control key behavior\n * - 'SystemPrompt': Include in system prompt\n * - 'LLMRead': LLM can read this key (visible to LLMs)\n * - 'LLMWrite': LLM can write to this key via tools\n * - 'protected': Cannot be deleted (replaces hardcoded)\n * - 'ApplyTemplate': Process value through template injection\n *\n * @deprecated 'prompt' - Use 'SystemPrompt' instead\n * @deprecated 'readonly' - Use absence of 'LLMWrite' instead (if LLMWrite not present, readonly=true)\n * @deprecated 'template' - Use 'ApplyTemplate' instead\n */\nexport type SystemTag = 'SystemPrompt' | 'LLMRead' | 'LLMWrite' | 'protected' | 'ApplyTemplate' | 'prompt' | 'readonly' | 'template';\n\n/**\n * Attributes that can be set on a MindCache key\n */\nexport interface KeyAttributes {\n /** The type of value stored */\n type: 'text' | 'image' | 'file' | 'json';\n /** MIME type for files/images */\n contentType?: string;\n /** User-defined tags for organizing keys */\n contentTags: string[];\n /** System tags that control key behavior (requires system access) */\n systemTags: SystemTag[];\n /** Z-index for ordering keys (lower values appear first) */\n zIndex: number;\n\n // Legacy attributes - kept for backward compatibility, derived from systemTags\n /** @deprecated Use !systemTags.includes('LLMWrite') instead */\n readonly: boolean;\n /** @deprecated Use systemTags.includes('SystemPrompt') instead */\n visible: boolean;\n /** @deprecated Use systemTags.includes('protected') instead */\n hardcoded: boolean;\n /** @deprecated Use systemTags.includes('ApplyTemplate') instead */\n template: boolean;\n /** @deprecated Use contentTags instead */\n tags?: string[];\n}\n\n/**\n * A single entry in the MindCache store\n */\nexport interface STMEntry {\n value: unknown;\n attributes: KeyAttributes;\n}\n\n/**\n * The full MindCache state (key-value pairs with attributes)\n */\nexport type STM = {\n [key: string]: STMEntry;\n};\n\n/**\n * Listener callback for key-specific subscriptions\n * Receives the new value when the key changes\n */\nexport type Listener = (value: unknown) => void;\n\n/**\n * Global listener callback for all changes\n * Called when any key changes (no parameters - use getAll() to get current state)\n */\nexport type GlobalListener = () => void;\n\n/**\n * Default attributes for new keys\n */\nexport const DEFAULT_KEY_ATTRIBUTES: KeyAttributes = {\n type: 'text',\n contentTags: [],\n systemTags: ['SystemPrompt', 'LLMWrite'], // visible in system prompt and writable by LLM by default\n zIndex: 0,\n // Legacy - derived from systemTags\n readonly: false,\n visible: true,\n hardcoded: false,\n template: false,\n tags: []\n};\n\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { z } from 'zod';\nimport type { KeyAttributes, STM, STMEntry, Listener, GlobalListener, AccessLevel, SystemTag } from './types';\nimport { DEFAULT_KEY_ATTRIBUTES } from './types';\n\n// Browser environment type declarations\ninterface FileReaderType {\n onload: ((this: FileReaderType, ev: any) => any) | null;\n onerror: ((this: FileReaderType, ev: any) => any) | null;\n result: string | ArrayBuffer | null;\n readAsDataURL(file: Blob): void;\n}\n\ndeclare const FileReader: {\n prototype: FileReaderType;\n new(): FileReaderType;\n} | undefined;\n\n/**\n * Cloud configuration options for MindCache constructor\n */\nexport interface MindCacheCloudOptions {\n /** Instance ID to connect to */\n instanceId: string;\n /** Project ID (optional, defaults to 'default') */\n projectId?: string;\n /** API endpoint to fetch WS token (recommended for browser) */\n tokenEndpoint?: string;\n /** Direct API key (server-side only, never expose in browser!) */\n apiKey?: string;\n /** WebSocket base URL (defaults to production) */\n baseUrl?: string;\n}\n\nexport interface MindCacheIndexedDBOptions {\n /** Database name (defaults to 'mindcache_db') */\n dbName?: string;\n /** Store name (defaults to 'mindcache_store') */\n storeName?: string;\n /** Storage key (defaults to 'mindcache_data') */\n key?: string;\n /** Debounce time in ms for saving (defaults to 1000) */\n debounceMs?: number;\n}\n\n/**\n * Constructor options for MindCache\n */\nexport interface MindCacheOptions {\n /** Cloud sync configuration. If omitted, runs in local-only mode. */\n cloud?: MindCacheCloudOptions;\n /** IndexedDB configuration */\n indexedDB?: MindCacheIndexedDBOptions;\n /** Access level for tag operations. 'system' allows managing system tags. */\n accessLevel?: AccessLevel;\n}\n\n// Connection state type\ntype ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'error';\n\n// CloudAdapter interface to avoid circular imports\ninterface ICloudAdapter {\n attach(mc: MindCache): void;\n detach(): void;\n connect(): Promise<void>;\n disconnect(): void;\n setTokenProvider(provider: () => Promise<string>): void;\n on(event: string, listener: (...args: any[]) => void): void;\n off(event: string, listener: (...args: any[]) => void): void;\n state: ConnectionState;\n}\n\nexport class MindCache {\n private stm: STM = {};\n private listeners: { [key: string]: Listener[] } = {};\n private globalListeners: GlobalListener[] = [];\n\n // Internal flag to prevent sync loops when receiving remote updates\n private _isRemoteUpdate = false;\n\n /**\n * Normalize system tags: migrate old tags to new ones\n * - 'prompt' → 'SystemPrompt'\n * - 'readonly' → remove 'LLMWrite' (or add if not readonly)\n */\n private normalizeSystemTags(tags: SystemTag[]): SystemTag[] {\n const normalized: SystemTag[] = [];\n let hasSystemPrompt = false;\n let hasLLMRead = false;\n let hasLLMWrite = false;\n let hasReadonly = false;\n\n // First pass: identify what we have\n for (const tag of tags) {\n if (tag === 'SystemPrompt' || tag === 'prompt') {\n hasSystemPrompt = true;\n } else if (tag === 'LLMRead') {\n hasLLMRead = true;\n } else if (tag === 'LLMWrite') {\n hasLLMWrite = true;\n } else if (tag === 'readonly') {\n hasReadonly = true;\n } else if (tag === 'protected') {\n normalized.push(tag);\n } else if (tag === 'ApplyTemplate' || tag === 'template') {\n normalized.push('ApplyTemplate');\n }\n }\n\n // Add normalized tags\n if (hasSystemPrompt) {\n normalized.push('SystemPrompt');\n }\n if (hasLLMRead) {\n normalized.push('LLMRead');\n }\n\n // LLMWrite logic: if readonly exists, NO LLMWrite; otherwise, add LLMWrite\n // But if LLMWrite already exists, keep it (unless readonly also exists)\n if (hasReadonly) {\n // Keep readonly tag for backward compatibility with web package\n normalized.push('readonly');\n // Don't add LLMWrite (readonly = not writable)\n } else if (hasLLMWrite) {\n normalized.push('LLMWrite');\n } else {\n // Default: if neither readonly nor LLMWrite specified, default to LLMWrite (writable)\n normalized.push('LLMWrite');\n }\n\n return normalized;\n }\n\n /**\n * Check if key should be visible in system prompt\n */\n private hasSystemPrompt(tags: SystemTag[]): boolean {\n return tags.includes('SystemPrompt') || tags.includes('prompt');\n }\n\n /**\n * Check if key can be read by LLM (has LLMRead or SystemPrompt)\n */\n private hasLLMRead(tags: SystemTag[]): boolean {\n return tags.includes('LLMRead') || tags.includes('SystemPrompt') || tags.includes('prompt');\n }\n\n /**\n * Check if key can be written by LLM (has LLMWrite and not readonly)\n */\n private hasLLMWrite(tags: SystemTag[]): boolean {\n return tags.includes('LLMWrite') && !tags.includes('readonly');\n }\n\n // Cloud sync state\n private _cloudAdapter: ICloudAdapter | null = null;\n private _connectionState: ConnectionState = 'disconnected';\n private _isLoaded = true; // Default true for local mode\n private _cloudConfig: MindCacheCloudOptions | null = null;\n\n // Access level for system operations\n private _accessLevel: AccessLevel = 'user';\n\n private _initPromise: Promise<void> | null = null;\n\n constructor(options?: MindCacheOptions) {\n if (options?.accessLevel) {\n this._accessLevel = options.accessLevel;\n }\n\n // Cloud and IndexedDB are mutually exclusive to avoid data conflicts\n if (options?.cloud && options?.indexedDB) {\n throw new Error(\n 'MindCache: Cannot use both cloud and indexedDB together. ' +\n 'Choose one persistence method to avoid data conflicts. ' +\n 'Use cloud for real-time sync, or indexedDB for local-only persistence.'\n );\n }\n\n const initPromises: Promise<void>[] = [];\n\n if (options?.cloud) {\n this._cloudConfig = options.cloud;\n this._isLoaded = false; // Wait for sync\n this._connectionState = 'disconnected';\n initPromises.push(this._initCloud());\n }\n\n if (options?.indexedDB) {\n // IndexedDB is async, so we wait for it\n this._isLoaded = false;\n initPromises.push(this._initIndexedDB(options.indexedDB));\n }\n\n if (initPromises.length > 0) {\n this._initPromise = Promise.all(initPromises).then(() => {\n // If we are strictly local (no cloud), we are loaded when init finishes\n if (!this._cloudConfig) {\n this._isLoaded = true;\n }\n });\n }\n }\n\n\n\n /**\n * Get the current access level\n */\n get accessLevel(): AccessLevel {\n return this._accessLevel;\n }\n\n /**\n * Check if this instance has system-level access\n */\n get hasSystemAccess(): boolean {\n return this._accessLevel === 'system';\n }\n\n private async _initCloud(): Promise<void> {\n if (!this._cloudConfig) {\n return;\n }\n\n try {\n\n // Load adapter class (extracted for testing)\n const CloudAdapter = await this._getCloudAdapterClass();\n\n // Require baseUrl for cloud mode\n if (!this._cloudConfig.baseUrl) {\n throw new Error('MindCache Cloud: baseUrl is required. Please provide the cloud API URL in your configuration.');\n }\n\n // Convert HTTP URL to WebSocket URL\n const baseUrl = this._cloudConfig.baseUrl\n .replace('https://', 'wss://')\n .replace('http://', 'ws://');\n\n const adapter = new CloudAdapter({\n instanceId: this._cloudConfig.instanceId,\n projectId: this._cloudConfig.projectId || 'default',\n baseUrl,\n apiKey: this._cloudConfig.apiKey\n });\n\n // Set up token provider if tokenEndpoint is provided\n if (this._cloudConfig.tokenEndpoint) {\n const tokenEndpoint = this._cloudConfig.tokenEndpoint;\n const instanceId = this._cloudConfig.instanceId;\n\n // Capture origin at setup time (when window is available) for use during reconnects\n let resolvedBaseUrl: string;\n if (tokenEndpoint.startsWith('http://') || tokenEndpoint.startsWith('https://')) {\n resolvedBaseUrl = tokenEndpoint;\n } else if (typeof window !== 'undefined' && window.location?.origin) {\n resolvedBaseUrl = `${window.location.origin}${tokenEndpoint.startsWith('/') ? '' : '/'}${tokenEndpoint}`;\n } else {\n // This shouldn't happen in normal browser usage, but fail gracefully\n console.warn('MindCache: Cannot resolve tokenEndpoint to absolute URL - window.location not available');\n resolvedBaseUrl = tokenEndpoint;\n }\n\n adapter.setTokenProvider(async () => {\n const url = resolvedBaseUrl.includes('?')\n ? `${resolvedBaseUrl}&instanceId=${instanceId}`\n : `${resolvedBaseUrl}?instanceId=${instanceId}`;\n\n const response = await fetch(url);\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Failed to get token' }));\n throw new Error(error.error || 'Failed to get token');\n }\n\n const data = await response.json();\n return data.token;\n });\n }\n\n // Set up event handlers\n adapter.on('connected', () => {\n this._connectionState = 'connected';\n this.notifyGlobalListeners();\n });\n\n adapter.on('disconnected', () => {\n this._connectionState = 'disconnected';\n this.notifyGlobalListeners();\n });\n\n adapter.on('error', () => {\n this._connectionState = 'error';\n this.notifyGlobalListeners();\n });\n\n adapter.on('synced', () => {\n this._isLoaded = true;\n this.notifyGlobalListeners();\n });\n\n // Attach and connect\n adapter.attach(this);\n this._cloudAdapter = adapter;\n this._connectionState = 'connecting';\n\n adapter.connect();\n } catch (error) {\n console.error('MindCache: Failed to initialize cloud connection:', error);\n this._connectionState = 'error';\n this._isLoaded = true; // Allow usage even if cloud fails\n }\n }\n\n private async _initIndexedDB(config: MindCacheIndexedDBOptions): Promise<void> {\n try {\n const IndexedDBAdapter = await this._getIndexedDBAdapterClass();\n const adapter = new IndexedDBAdapter(config);\n await adapter.attach(this);\n } catch (error) {\n console.error('MindCache: Failed to initialize IndexedDB:', error);\n }\n }\n\n protected async _getIndexedDBAdapterClass(): Promise<any> {\n const { IndexedDBAdapter } = await import('../local/IndexedDBAdapter');\n return IndexedDBAdapter;\n }\n\n /**\n * Get the current cloud connection state\n */\n get connectionState(): ConnectionState {\n return this._connectionState;\n }\n\n /**\n * Check if data is loaded (true for local, true after sync for cloud)\n */\n get isLoaded(): boolean {\n return this._isLoaded;\n }\n\n /**\n * Protected method to load CloudAdapter class.\n * Can be overridden/mocked for testing.\n */\n protected async _getCloudAdapterClass(): Promise<any> {\n const { CloudAdapter } = await import('../cloud/CloudAdapter');\n return CloudAdapter;\n }\n\n /**\n * Check if this instance is connected to cloud\n */\n get isCloud(): boolean {\n return this._cloudConfig !== null;\n }\n\n /**\n * Wait for initial sync to complete (or resolve immediately if already synced/local).\n * Useful for scripts or linear execution flows.\n */\n\n async waitForSync(): Promise<void> {\n\n if (this._isLoaded) {\n return;\n }\n\n // If initialization is in progress, wait for it first\n if (this._initPromise) {\n await this._initPromise;\n }\n\n // Check again after initialization\n if (this._isLoaded) {\n return;\n }\n\n return new Promise<void>((resolve) => {\n // If we are here, we must have a cloud adapter (otherwise isLoaded would be true)\n // but double check to be safe\n if (!this._cloudAdapter) {\n resolve();\n return;\n }\n\n const handler = () => {\n this._cloudAdapter?.off('synced', handler);\n resolve();\n };\n\n this._cloudAdapter.on('synced', handler);\n });\n }\n\n /**\n * Disconnect from cloud (if connected)\n */\n disconnect(): void {\n if (this._cloudAdapter) {\n this._cloudAdapter.disconnect();\n this._cloudAdapter.detach();\n this._cloudAdapter = null;\n this._connectionState = 'disconnected';\n }\n }\n\n // Helper method to encode file to base64\n private encodeFileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n if (typeof FileReader !== 'undefined') {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result as string;\n const base64Data = result.split(',')[1];\n resolve(base64Data);\n };\n reader.onerror = reject;\n reader.readAsDataURL(file);\n } else {\n reject(new Error('FileReader not available in Node.js environment. Use set_base64() method instead.'));\n }\n });\n }\n\n // Helper method to create data URL from base64 and content type\n private createDataUrl(base64Data: string, contentType: string): string {\n return `data:${contentType};base64,${base64Data}`;\n }\n\n // Helper method to validate content type for different STM types\n private validateContentType(type: KeyAttributes['type'], contentType?: string): boolean {\n if (type === 'text' || type === 'json') {\n return true;\n }\n if (!contentType) {\n return false;\n }\n if (type === 'image') {\n return contentType.startsWith('image/');\n }\n if (type === 'file') {\n return true;\n }\n return false;\n }\n\n /** @deprecated Use get_value instead */\n get(key: string): any {\n return this.get_value(key);\n }\n\n // Get a value from the STM with template processing if enabled\n get_value(key: string, _processingStack?: Set<string>): any {\n if (key === '$date') {\n const today = new Date();\n return today.toISOString().split('T')[0];\n }\n if (key === '$time') {\n const now = new Date();\n return now.toTimeString().split(' ')[0];\n }\n\n const entry = this.stm[key];\n if (!entry) {\n return undefined;\n }\n\n if (entry.attributes.systemTags?.includes('ApplyTemplate') || entry.attributes.systemTags?.includes('template') || entry.attributes.template) {\n const processingStack = _processingStack || new Set<string>();\n if (processingStack.has(key)) {\n return entry.value;\n }\n processingStack.add(key);\n const result = this.injectSTM(entry.value as string, processingStack);\n processingStack.delete(key);\n return result;\n }\n\n return entry.value;\n }\n\n // Get attributes for a key\n get_attributes(key: string): KeyAttributes | undefined {\n if (key === '$date' || key === '$time') {\n return {\n type: 'text',\n contentTags: [],\n systemTags: ['prompt', 'readonly', 'protected'],\n zIndex: 999999, // System keys appear last\n // Legacy attributes\n readonly: true,\n visible: true,\n hardcoded: true,\n template: false,\n tags: []\n };\n }\n\n const entry = this.stm[key];\n return entry ? entry.attributes : undefined;\n }\n\n // Set a value in the STM with default attributes\n set_value(key: string, value: any, attributes?: Partial<KeyAttributes>): void {\n if (key === '$date' || key === '$time') {\n return;\n }\n\n const existingEntry = this.stm[key];\n // Preserve hardcoded status - if entry is hardcoded, it must remain hardcoded\n const wasHardcoded = existingEntry?.attributes.hardcoded || existingEntry?.attributes.systemTags?.includes('protected');\n\n // Deep copy arrays to avoid shared references\n const baseAttributes: KeyAttributes = existingEntry\n ? {\n ...existingEntry.attributes,\n contentTags: [...(existingEntry.attributes.contentTags || [])],\n systemTags: [...(existingEntry.attributes.systemTags || [])] as SystemTag[],\n tags: [...(existingEntry.attributes.tags || [])],\n zIndex: existingEntry.attributes.zIndex ?? 0\n }\n : {\n ...DEFAULT_KEY_ATTRIBUTES,\n contentTags: [], // Fresh array\n systemTags: ['SystemPrompt', 'LLMWrite'] as SystemTag[], // Fresh array with default\n tags: [], // Fresh array\n zIndex: 0\n };\n\n const finalAttributes = attributes ? { ...baseAttributes, ...attributes } : baseAttributes;\n\n // Normalize system tags first (migrate old tags to new ones)\n let systemTags = this.normalizeSystemTags(finalAttributes.systemTags || []);\n\n // If legacy boolean attributes were explicitly provided, sync them TO systemTags\n if (attributes) {\n // Handle readonly → LLMWrite mapping\n if ('readonly' in attributes) {\n if (attributes.readonly) {\n // readonly=true means remove LLMWrite and add readonly tag (for backward compat)\n systemTags = systemTags.filter(t => t !== 'LLMWrite') as SystemTag[];\n if (!systemTags.includes('readonly')) {\n systemTags.push('readonly');\n }\n } else if (!wasHardcoded) {\n // readonly=false means add LLMWrite and remove readonly tag\n if (!systemTags.includes('LLMWrite')) {\n systemTags.push('LLMWrite');\n }\n systemTags = systemTags.filter(t => t !== 'readonly') as SystemTag[];\n }\n }\n\n // Handle visible → SystemPrompt mapping\n if ('visible' in attributes) {\n if (attributes.visible) {\n if (!systemTags.includes('SystemPrompt')) {\n systemTags.push('SystemPrompt');\n }\n // Remove old 'prompt' tag if present\n systemTags = systemTags.filter(t => t !== 'prompt') as SystemTag[];\n } else {\n systemTags = systemTags.filter(t => t !== 'SystemPrompt' && t !== 'prompt') as SystemTag[];\n }\n }\n\n // Handle systemTags array directly (new API)\n if ('systemTags' in attributes && Array.isArray(attributes.systemTags)) {\n systemTags = this.normalizeSystemTags(attributes.systemTags);\n }\n if ('hardcoded' in attributes) {\n if (attributes.hardcoded && !systemTags.includes('protected')) {\n systemTags.push('protected');\n } else if (!attributes.hardcoded && !wasHardcoded) {\n // Can't remove protected if entry was already hardcoded\n systemTags = systemTags.filter(t => t !== 'protected') as SystemTag[];\n }\n // If wasHardcoded, always keep protected\n if (wasHardcoded && !systemTags.includes('protected')) {\n systemTags.push('protected');\n }\n } else if (wasHardcoded) {\n // If no hardcoded attribute provided but entry was hardcoded, preserve it\n if (!systemTags.includes('protected')) {\n systemTags.push('protected');\n }\n }\n if ('template' in attributes) {\n if (attributes.template && !wasHardcoded && !systemTags.includes('ApplyTemplate') && !systemTags.includes('template')) {\n systemTags.push('ApplyTemplate');\n } else if (!attributes.template || wasHardcoded) {\n // Can't set template if hardcoded\n systemTags = systemTags.filter(t => t !== 'ApplyTemplate' && t !== 'template') as SystemTag[];\n }\n }\n } else if (wasHardcoded) {\n // If no attributes provided but entry was hardcoded, preserve protected tag\n if (!systemTags.includes('protected')) {\n systemTags.push('protected');\n }\n // Protected means readonly (remove LLMWrite, add readonly for backward compat)\n systemTags = systemTags.filter(t => t !== 'LLMWrite') as SystemTag[];\n if (!systemTags.includes('readonly')) {\n systemTags.push('readonly');\n }\n systemTags = systemTags.filter(t => t !== 'template') as SystemTag[];\n }\n\n // Enforce: protected (hardcoded) implies readonly (no LLMWrite) and NOT template\n // Always preserve hardcoded status if entry was hardcoded\n if (wasHardcoded && !systemTags.includes('protected')) {\n systemTags.push('protected');\n }\n if (systemTags.includes('protected')) {\n // Protected means readonly (remove LLMWrite, add readonly for backward compat)\n systemTags = systemTags.filter(t => t !== 'LLMWrite') as SystemTag[];\n if (!systemTags.includes('readonly')) {\n systemTags.push('readonly');\n }\n systemTags = systemTags.filter(t => t !== 'template') as SystemTag[];\n }\n\n // Store normalized tags\n finalAttributes.systemTags = systemTags;\n\n // Sync legacy attributes FROM systemTags (canonical source)\n // readonly = NOT LLMWrite (if LLMWrite not present, or if readonly tag present)\n finalAttributes.readonly = systemTags.includes('readonly') || !systemTags.includes('LLMWrite');\n // visible = SystemPrompt (or prompt for backward compat)\n finalAttributes.visible = this.hasSystemPrompt(systemTags);\n // Always preserve hardcoded status if entry was hardcoded\n finalAttributes.hardcoded = wasHardcoded || systemTags.includes('protected');\n finalAttributes.template = systemTags.includes('ApplyTemplate') || systemTags.includes('template');\n\n // Sync tags <-> contentTags bidirectionally\n // If tags was explicitly provided, use it as source for contentTags\n if (attributes && 'tags' in attributes && attributes.tags) {\n finalAttributes.contentTags = [...attributes.tags];\n }\n // Always sync tags FROM contentTags (canonical source)\n finalAttributes.tags = [...(finalAttributes.contentTags || [])];\n\n this.stm[key] = {\n value,\n attributes: finalAttributes\n };\n\n if (this.listeners[key]) {\n this.listeners[key].forEach(listener => listener(value));\n }\n this.notifyGlobalListeners();\n }\n\n // Internal method for setting values from remote (cloud sync)\n // This doesn't trigger the global listener to prevent sync loops\n _setFromRemote(key: string, value: any, attributes: KeyAttributes): void {\n if (key === '$date' || key === '$time') {\n return;\n }\n\n this._isRemoteUpdate = true;\n\n // Ensure new tag arrays exist and sync legacy attributes\n let systemTags: SystemTag[] = attributes.systemTags || [];\n if (!attributes.systemTags || systemTags.length === 0) {\n systemTags = [];\n if (attributes.visible !== false) {\n systemTags.push('prompt'); // Will be normalized to SystemPrompt\n }\n if (attributes.readonly) {\n systemTags.push('readonly'); // Will be normalized (removes LLMWrite)\n } else {\n systemTags.push('LLMWrite'); // Default: writable\n }\n if (attributes.hardcoded) {\n systemTags.push('protected');\n }\n if (attributes.template) {\n systemTags.push('ApplyTemplate');\n }\n }\n\n // Normalize tags (migrate old tags to new ones)\n systemTags = this.normalizeSystemTags(systemTags);\n\n const contentTags = attributes.contentTags || attributes.tags || [];\n\n this.stm[key] = {\n value,\n attributes: {\n ...attributes,\n contentTags,\n systemTags,\n zIndex: attributes.zIndex ?? 0,\n tags: contentTags,\n // Sync legacy attributes FROM normalized systemTags\n readonly: systemTags.includes('readonly') || !systemTags.includes('LLMWrite'),\n visible: this.hasSystemPrompt(systemTags),\n hardcoded: systemTags.includes('protected'),\n template: systemTags.includes('ApplyTemplate') || systemTags.includes('template')\n }\n };\n\n if (this.listeners[key]) {\n this.listeners[key].forEach(listener => listener(value));\n }\n\n // Still notify global listeners for UI updates, but adapter should check _isRemoteUpdate\n this.notifyGlobalListeners();\n\n this._isRemoteUpdate = false;\n }\n\n // Check if current update is from remote\n isRemoteUpdate(): boolean {\n return this._isRemoteUpdate;\n }\n\n // Internal method for deleting from remote (cloud sync)\n _deleteFromRemote(key: string): void {\n if (key === '$date' || key === '$time') {\n return;\n }\n\n this._isRemoteUpdate = true;\n\n if (key in this.stm) {\n delete this.stm[key];\n if (this.listeners[key]) {\n this.listeners[key].forEach(listener => listener(undefined)); // Pass undefined for deleted keys\n }\n this.notifyGlobalListeners();\n }\n\n this._isRemoteUpdate = false;\n }\n\n // Internal method for clearing from remote (cloud sync)\n _clearFromRemote(): void {\n this._isRemoteUpdate = true;\n this.stm = {};\n this.notifyGlobalListeners();\n this._isRemoteUpdate = false;\n }\n\n // Set attributes for an existing key\n set_attributes(key: string, attributes: Partial<KeyAttributes>): boolean {\n if (key === '$date' || key === '$time') {\n return false;\n }\n\n const entry = this.stm[key];\n if (!entry) {\n return false;\n }\n\n // Preserve hardcoded status - if entry is hardcoded, it must remain hardcoded\n const wasHardcoded = entry.attributes.hardcoded || entry.attributes.systemTags?.includes('protected');\n\n // Don't allow direct modification of hardcoded or systemTags without system access\n const { hardcoded: _hardcoded, systemTags: _systemTags, ...allowedAttributes } = attributes;\n\n // If entry is hardcoded (protected), don't allow changing readonly to false or template to true\n if (wasHardcoded) {\n if ('readonly' in allowedAttributes) {\n delete (allowedAttributes as any).readonly; // Can't change readonly on hardcoded\n }\n if ('template' in allowedAttributes) {\n delete (allowedAttributes as any).template; // Can't change ApplyTemplate on hardcoded\n }\n }\n\n entry.attributes = { ...entry.attributes, ...allowedAttributes };\n\n // Sync legacy boolean to systemTags if legacy props are set\n if ('readonly' in attributes || 'visible' in attributes || 'template' in attributes || 'systemTags' in attributes) {\n // Start with existing tags or derive from legacy attributes\n let newSystemTags: SystemTag[] = entry.attributes.systemTags || [];\n\n // If systemTags was explicitly provided, use it and normalize\n if ('systemTags' in attributes && Array.isArray(attributes.systemTags)) {\n newSystemTags = this.normalizeSystemTags(attributes.systemTags);\n } else {\n // Otherwise, derive from legacy attributes\n newSystemTags = [];\n if (!entry.attributes.readonly) {\n newSystemTags.push('LLMWrite');\n } else {\n newSystemTags.push('readonly');\n }\n if (entry.attributes.visible) {\n newSystemTags.push('SystemPrompt');\n }\n if (entry.attributes.template) {\n newSystemTags.push('ApplyTemplate');\n }\n // Always preserve hardcoded status if it was hardcoded\n if (wasHardcoded || entry.attributes.hardcoded) {\n newSystemTags.push('protected');\n }\n newSystemTags = this.normalizeSystemTags(newSystemTags);\n }\n\n // Enforce: protected implies readonly (no LLMWrite) and NOT ApplyTemplate\n if (newSystemTags.includes('protected')) {\n newSystemTags = newSystemTags.filter(t => t !== 'LLMWrite') as SystemTag[];\n if (!newSystemTags.includes('readonly')) {\n newSystemTags.push('readonly');\n }\n newSystemTags = newSystemTags.filter(t => t !== 'ApplyTemplate' && t !== 'template') as SystemTag[];\n entry.attributes.readonly = true;\n entry.attributes.template = false;\n }\n\n entry.attributes.systemTags = newSystemTags;\n\n // Sync legacy attributes FROM normalized systemTags\n entry.attributes.readonly = newSystemTags.includes('readonly') || !newSystemTags.includes('LLMWrite');\n entry.attributes.visible = this.hasSystemPrompt(newSystemTags);\n entry.attributes.template = newSystemTags.includes('ApplyTemplate') || newSystemTags.includes('template');\n } else if (wasHardcoded) {\n // If no legacy props were set but entry was hardcoded, ensure protected tag is preserved\n let systemTags = this.normalizeSystemTags(entry.attributes.systemTags || []);\n if (!systemTags.includes('protected')) {\n systemTags.push('protected');\n }\n // Protected means readonly (remove LLMWrite, add readonly for backward compat)\n systemTags = systemTags.filter(t => t !== 'LLMWrite') as SystemTag[];\n if (!systemTags.includes('readonly')) {\n systemTags.push('readonly');\n }\n systemTags = systemTags.filter(t => t !== 'ApplyTemplate' && t !== 'template') as SystemTag[];\n entry.attributes.systemTags = systemTags;\n\n // Sync legacy attributes\n entry.attributes.readonly = true;\n entry.attributes.visible = this.hasSystemPrompt(systemTags);\n entry.attributes.template = false;\n }\n\n // Always ensure hardcoded status is preserved and synced\n if (wasHardcoded) {\n entry.attributes.hardcoded = true;\n if (!entry.attributes.systemTags?.includes('protected')) {\n entry.attributes.systemTags = [...(entry.attributes.systemTags || []), 'protected'] as SystemTag[];\n }\n entry.attributes.readonly = true;\n entry.attributes.template = false;\n }\n\n // Sync contentTags to legacy tags\n if ('contentTags' in attributes) {\n entry.attributes.tags = [...(entry.attributes.contentTags || [])];\n }\n\n this.notifyGlobalListeners();\n return true;\n }\n\n set(key: string, value: any): void {\n this.set_value(key, value);\n }\n\n async set_file(key: string, file: File, attributes?: Partial<KeyAttributes>): Promise<void> {\n const base64Data = await this.encodeFileToBase64(file);\n const contentType = file.type;\n\n const fileAttributes: Partial<KeyAttributes> = {\n type: contentType.startsWith('image/') ? 'image' : 'file',\n contentType,\n ...attributes\n };\n\n this.set_value(key, base64Data, fileAttributes);\n }\n\n set_base64(key: string, base64Data: string, contentType: string, type: 'image' | 'file' = 'file', attributes?: Partial<KeyAttributes>): void {\n if (!this.validateContentType(type, contentType)) {\n throw new Error(`Invalid content type ${contentType} for type ${type}`);\n }\n\n const fileAttributes: Partial<KeyAttributes> = {\n type,\n contentType,\n ...attributes\n };\n\n this.set_value(key, base64Data, fileAttributes);\n }\n\n add_image(key: string, base64Data: string, contentType: string = 'image/jpeg', attributes?: Partial<KeyAttributes>): void {\n if (!contentType.startsWith('image/')) {\n throw new Error(`Invalid image content type: ${contentType}. Must start with 'image/'`);\n }\n\n this.set_base64(key, base64Data, contentType, 'image', attributes);\n this.set_attributes(key, {\n type: 'image',\n contentType: contentType\n });\n }\n\n get_data_url(key: string): string | undefined {\n const entry = this.stm[key];\n if (!entry || (entry.attributes.type !== 'image' && entry.attributes.type !== 'file')) {\n return undefined;\n }\n\n if (!entry.attributes.contentType) {\n return undefined;\n }\n\n return this.createDataUrl(entry.value as string, entry.attributes.contentType);\n }\n\n get_base64(key: string): string | undefined {\n const entry = this.stm[key];\n if (!entry || (entry.attributes.type !== 'image' && entry.attributes.type !== 'file')) {\n return undefined;\n }\n\n return entry.value as string;\n }\n\n has(key: string): boolean {\n if (key === '$date' || key === '$time') {\n return true;\n }\n return key in this.stm;\n }\n\n delete(key: string): boolean {\n if (key === '$date' || key === '$time') {\n return false;\n }\n if (!(key in this.stm)) {\n return false;\n }\n const deleted = delete this.stm[key];\n if (deleted) {\n this.notifyGlobalListeners();\n if (this.listeners[key]) {\n this.listeners[key].forEach(listener => listener(undefined)); // Pass undefined for deleted keys\n }\n }\n return deleted;\n }\n\n clear(): void {\n this.stm = {};\n this.notifyGlobalListeners();\n }\n\n /**\n * Get keys sorted by zIndex (ascending), then by key name\n */\n private getSortedKeys(): string[] {\n return Object.entries(this.stm)\n .sort(([keyA, entryA], [keyB, entryB]) => {\n const zIndexA = entryA.attributes.zIndex ?? 0;\n const zIndexB = entryB.attributes.zIndex ?? 0;\n if (zIndexA !== zIndexB) {\n return zIndexA - zIndexB;\n }\n return keyA.localeCompare(keyB);\n })\n .map(([key]) => key);\n }\n\n keys(): string[] {\n return [...this.getSortedKeys(), '$date', '$time'];\n }\n\n values(): any[] {\n const now = new Date();\n const sortedKeys = this.getSortedKeys();\n const stmValues = sortedKeys.map(key => this.stm[key].value);\n return [\n ...stmValues,\n now.toISOString().split('T')[0],\n now.toTimeString().split(' ')[0]\n ];\n }\n\n entries(): [string, any][] {\n const now = new Date();\n const sortedKeys = this.getSortedKeys();\n const stmEntries = sortedKeys.map(key =>\n [key, this.stm[key].value] as [string, any]\n );\n return [\n ...stmEntries,\n ['$date', now.toISOString().split('T')[0]],\n ['$time', now.toTimeString().split(' ')[0]]\n ];\n }\n\n size(): number {\n return Object.keys(this.stm).length + 2;\n }\n\n getAll(): Record<string, any> {\n const now = new Date();\n const result: Record<string, any> = {};\n\n const sortedKeys = this.getSortedKeys();\n sortedKeys.forEach(key => {\n result[key] = this.stm[key].value;\n });\n\n result['$date'] = now.toISOString().split('T')[0];\n result['$time'] = now.toTimeString().split(' ')[0];\n\n return result;\n }\n\n update(newValues: Record<string, any>): void {\n Object.entries(newValues).forEach(([key, value]) => {\n if (key !== '$date' && key !== '$time') {\n this.stm[key] = {\n value,\n attributes: { ...DEFAULT_KEY_ATTRIBUTES }\n };\n\n if (this.listeners[key]) {\n this.listeners[key].forEach(listener => listener(this.stm[key]?.value));\n }\n }\n });\n this.notifyGlobalListeners();\n }\n\n subscribe(key: string, listener: Listener): void {\n if (!this.listeners[key]) {\n this.listeners[key] = [];\n }\n this.listeners[key].push(listener);\n }\n\n unsubscribe(key: string, listener: Listener): void {\n if (this.listeners[key]) {\n this.listeners[key] = this.listeners[key].filter(l => l !== listener);\n }\n }\n\n subscribeToAll(listener: GlobalListener): void {\n this.globalListeners.push(listener);\n }\n\n unsubscribeFromAll(listener: GlobalListener): void {\n this.globalListeners = this.globalListeners.filter(l => l !== listener);\n }\n\n private notifyGlobalListeners(): void {\n this.globalListeners.forEach(listener => listener());\n }\n\n injectSTM(template: string, _processingStack?: Set<string>): string {\n if (template === null || template === undefined) {\n return String(template);\n }\n\n const templateStr = String(template);\n const keys = templateStr.match(/\\{\\{([$\\w]+)\\}\\}/g);\n\n if (!keys) {\n return templateStr;\n }\n\n const cleanKeys = keys.map(key => key.replace(/[{}]/g, ''));\n\n const inputValues: Record<string, string> = cleanKeys.reduce((acc, key) => {\n if (key === '$date' || key === '$time') {\n return {\n ...acc,\n [key]: this.get_value(key, _processingStack)\n };\n }\n\n const attributes = this.get_attributes(key);\n if (_processingStack || (attributes && attributes.visible)) {\n if (attributes && (attributes.type === 'image' || attributes.type === 'file')) {\n return acc;\n }\n\n return {\n ...acc,\n [key]: this.get_value(key, _processingStack)\n };\n }\n\n return acc;\n }, {});\n\n return templateStr.replace(/\\{\\{([$\\w]+)\\}\\}/g, (match, key) => {\n if (inputValues[key] !== undefined) {\n return inputValues[key];\n }\n\n const attributes = this.get_attributes(key);\n if (attributes && (attributes.type === 'image' || attributes.type === 'file')) {\n return match;\n }\n\n return '';\n });\n }\n\n getSTM(): string {\n const now = new Date();\n const entries: Array<[string, any]> = [];\n\n const sortedKeys = this.getSortedKeys();\n sortedKeys.forEach(key => {\n const entry = this.stm[key];\n if (entry.attributes.visible) {\n entries.push([key, this.get_value(key)]);\n }\n });\n\n entries.push(['$date', now.toISOString().split('T')[0]]);\n entries.push(['$time', now.toTimeString().split(' ')[0]]);\n\n return entries\n .map(([key, value]) => `${key}: ${value}`)\n .join(', ');\n }\n\n getSTMObject(): Record<string, any> {\n return this.getAll();\n }\n\n getSTMForAPI(): Array<{ key: string, value: any, type: string, contentType?: string }> {\n const now = new Date();\n const apiData: Array<{ key: string, value: any, type: string, contentType?: string }> = [];\n\n const sortedKeys = this.getSortedKeys();\n sortedKeys.forEach(key => {\n const entry = this.stm[key];\n // Check for LLMRead or SystemPrompt tag (or visible for backward compat)\n if (this.hasLLMRead(entry.attributes.systemTags) || entry.attributes.visible) {\n const hasTemplate = entry.attributes.systemTags?.includes('ApplyTemplate') || entry.attributes.systemTags?.includes('template') || entry.attributes.template;\n const processedValue = hasTemplate ? this.get_value(key) : entry.value;\n\n apiData.push({\n key,\n value: processedValue,\n type: entry.attributes.type,\n contentType: entry.attributes.contentType\n });\n }\n });\n\n apiData.push({\n key: '$date',\n value: now.toISOString().split('T')[0],\n type: 'text'\n });\n\n apiData.push({\n key: '$time',\n value: now.toTimeString().split(' ')[0],\n type: 'text'\n });\n\n return apiData;\n }\n\n getVisibleImages(): Array<{ type: 'file'; mediaType: string; url: string; filename?: string }> {\n const imageParts: Array<{ type: 'file'; mediaType: string; url: string; filename?: string }> = [];\n\n const sortedKeys = this.getSortedKeys();\n sortedKeys.forEach(key => {\n const entry = this.stm[key];\n // Check for LLMRead or SystemPrompt tag (or visible for backward compat)\n if ((this.hasLLMRead(entry.attributes.systemTags) || entry.attributes.visible) && entry.attributes.type === 'image' && entry.attributes.contentType) {\n const dataUrl = this.createDataUrl(entry.value as string, entry.attributes.contentType);\n imageParts.push({\n type: 'file' as const,\n mediaType: entry.attributes.contentType,\n url: dataUrl,\n filename: key\n });\n }\n });\n\n return imageParts;\n }\n\n toJSON(): string {\n return JSON.stringify(this.serialize());\n }\n\n fromJSON(jsonString: string): void {\n try {\n const data = JSON.parse(jsonString);\n this.deserialize(data);\n } catch (error) {\n console.error('MindCache: Failed to deserialize JSON:', error);\n }\n }\n\n serialize(): Record<string, STMEntry> {\n const result: Record<string, STMEntry> = {};\n\n const sortedKeys = this.getSortedKeys();\n sortedKeys.forEach(key => {\n const entry = this.stm[key];\n if (!entry.attributes.hardcoded) {\n result[key] = {\n value: entry.value,\n attributes: { ...entry.attributes }\n };\n }\n });\n\n return result;\n }\n\n deserialize(data: Record<string, STMEntry>): void {\n if (typeof data === 'object' && data !== null) {\n // Set flag to prevent adapters from saving data we just loaded\n this._isRemoteUpdate = true;\n\n this.clear();\n\n Object.entries(data).forEach(([key, entry]) => {\n if (entry && typeof entry === 'object' && 'value' in entry && 'attributes' in entry) {\n const attrs = entry.attributes;\n\n // Skip hardcoded keys during deserialization\n if (attrs.hardcoded === true || attrs.systemTags?.includes('protected')) {\n return;\n }\n\n // Migrate from legacy format: derive systemTags from boolean flags if missing\n let systemTags: SystemTag[] = attrs.systemTags || [];\n if (!attrs.systemTags || systemTags.length === 0) {\n systemTags = [];\n if (attrs.visible !== false) {\n systemTags.push('prompt'); // Will be normalized to SystemPrompt\n } // visible true by default\n if (attrs.readonly) {\n systemTags.push('readonly'); // Will be normalized (removes LLMWrite)\n } else {\n systemTags.push('LLMWrite'); // Default: writable\n }\n if (attrs.hardcoded) {\n systemTags.push('protected');\n }\n if (attrs.template) {\n systemTags.push('ApplyTemplate');\n }\n }\n\n // Normalize tags (migrate old tags to new ones)\n systemTags = this.normalizeSystemTags(systemTags);\n\n // Migrate contentTags from legacy tags if missing\n const contentTags = attrs.contentTags || attrs.tags || [];\n\n this.stm[key] = {\n value: entry.value,\n attributes: {\n ...attrs,\n contentTags,\n systemTags,\n zIndex: attrs.zIndex ?? 0,\n // Sync legacy attributes FROM normalized systemTags\n tags: contentTags,\n readonly: systemTags.includes('readonly') || !systemTags.includes('LLMWrite'),\n visible: this.hasSystemPrompt(systemTags),\n hardcoded: systemTags.includes('protected'),\n template: systemTags.includes('ApplyTemplate') || systemTags.includes('template')\n }\n };\n }\n });\n\n this.notifyGlobalListeners();\n\n // Reset flag after notify\n this._isRemoteUpdate = false;\n }\n }\n\n get_system_prompt(): string {\n const now = new Date();\n const promptLines: string[] = [];\n\n const sortedKeys = this.getSortedKeys();\n sortedKeys.forEach(key => {\n const entry = this.stm[key];\n // Check for LLMRead or SystemPrompt tag (or visible for backward compat)\n if (this.hasLLMRead(entry.attributes.systemTags) || entry.attributes.visible) {\n if (entry.attributes.type === 'image') {\n promptLines.push(`image ${key} available`);\n return;\n }\n if (entry.attributes.type === 'file') {\n // Check if LLM can write (has LLMWrite tag and not readonly)\n const canWrite = this.hasLLMWrite(entry.attributes.systemTags) || (!entry.attributes.readonly && !entry.attributes.systemTags.includes('readonly'));\n if (!canWrite) {\n promptLines.push(`${key}: [${entry.attributes.type.toUpperCase()}] - ${entry.attributes.contentType || 'unknown format'}`);\n } else {\n const sanitizedKey = key.replace(/[^a-zA-Z0-9_-]/g, '_');\n promptLines.push(`${key}: [${entry.attributes.type.toUpperCase()}] - ${entry.attributes.contentType || 'unknown format'}. You can update this ${entry.attributes.type} using the write_${sanitizedKey} tool.`);\n }\n return;\n }\n\n const value = this.get_value(key);\n const formattedValue = typeof value === 'object' && value !== null\n ? JSON.stringify(value)\n : String(value);\n\n // Check if LLM can write (has LLMWrite tag and not readonly)\n const canWrite = this.hasLLMWrite(entry.attributes.systemTags) || (!entry.attributes.readonly && !entry.attributes.systemTags.includes('readonly'));\n if (!canWrite) {\n promptLines.push(`${key}: ${formattedValue}`);\n } else {\n const sanitizedKey = key.replace(/[^a-zA-Z0-9_-]/g, '_');\n const toolInstruction =\n `You can rewrite \"${key}\" by using the write_${sanitizedKey} tool. ` +\n 'This tool DOES NOT append — start your response with the old value ' +\n `(${formattedValue})`;\n promptLines.push(`${key}: ${formattedValue}. ${toolInstruction}`);\n }\n }\n });\n\n promptLines.push(`$date: ${now.toISOString().split('T')[0]}`);\n promptLines.push(`$time: ${now.toTimeString().split(' ')[0]}`);\n\n return promptLines.join('\\n');\n }\n\n private findKeyFromToolName(toolName: string): string | undefined {\n if (!toolName.startsWith('write_')) {\n return undefined;\n }\n\n const sanitizedKey = toolName.replace('write_', '');\n const sortedKeys = this.getSortedKeys();\n return sortedKeys.find(k =>\n k.replace(/[^a-zA-Z0-9_-]/g, '_') === sanitizedKey\n );\n }\n\n get_aisdk_tools(): Record<string, any> {\n const tools: Record<string, any> = {};\n\n const sortedKeys = this.getSortedKeys();\n const writableKeys = sortedKeys.filter(key => {\n const entry = this.stm[key];\n // Include if has LLMWrite tag (and not readonly), or if legacy readonly is false\n return this.hasLLMWrite(entry.attributes.systemTags) || (!entry.attributes.readonly && !entry.attributes.systemTags.includes('readonly'));\n });\n\n writableKeys.forEach(key => {\n const sanitizedKey = key.replace(/[^a-zA-Z0-9_-]/g, '_');\n const toolName = `write_${sanitizedKey}`;\n\n const entry = this.stm[key];\n const keyType = entry?.attributes.type || 'text';\n\n let inputSchema;\n let description = `Write a value to the STM key: ${key}`;\n\n if (keyType === 'image' || keyType === 'file') {\n description += ' (expects base64 encoded data)';\n inputSchema = z.object({\n value: z.string().describe(`Base64 encoded data for ${key}`),\n contentType: z.string().optional().describe(`MIME type for the ${keyType}`)\n });\n } else if (keyType === 'json') {\n description += ' (expects JSON string)';\n inputSchema = z.object({\n value: z.string().describe(`JSON string value for ${key}`)\n });\n } else {\n inputSchema = z.object({\n value: z.string().describe(`The text value to write to ${key}`)\n });\n }\n\n tools[toolName] = {\n description,\n inputSchema,\n execute: async (input: { value: any; contentType?: string }) => {\n if (keyType === 'image' || keyType === 'file') {\n if (input.contentType) {\n this.set_base64(key, input.value, input.contentType, keyType);\n } else {\n const existingContentType = entry?.attributes.contentType;\n if (existingContentType) {\n this.set_base64(key, input.value, existingContentType, keyType);\n } else {\n throw new Error(`Content type required for ${keyType} data`);\n }\n }\n } else {\n this.set_value(key, input.value);\n }\n\n let resultMessage: string;\n if (keyType === 'image') {\n resultMessage = `Successfully saved image to ${key}`;\n } else if (keyType === 'file') {\n resultMessage = `Successfully saved file to ${key}`;\n } else if (keyType === 'json') {\n resultMessage = `Successfully saved JSON data to ${key}`;\n } else {\n resultMessage = `Successfully wrote \"${input.value}\" to ${key}`;\n }\n\n return {\n result: resultMessage,\n key: key,\n value: input.value,\n type: keyType,\n contentType: input.contentType,\n sanitizedKey: sanitizedKey\n };\n }\n };\n });\n\n if (writableKeys.length === 0) {\n return {};\n }\n\n return tools;\n }\n\n executeToolCall(\n toolName: string,\n value: any\n ): { result: string; key: string; value: any } | null {\n const originalKey = this.findKeyFromToolName(toolName);\n if (!originalKey) {\n return null;\n }\n\n const entry = this.stm[originalKey];\n // Check if LLM can write (has LLMWrite tag and not readonly)\n const canWrite = entry && (this.hasLLMWrite(entry.attributes.systemTags) || (!entry.attributes.readonly && !entry.attributes.systemTags.includes('readonly')));\n if (!canWrite) {\n return null;\n }\n\n this.set_value(originalKey, value);\n return {\n result: `Successfully wrote \"${value}\" to ${originalKey}`,\n key: originalKey,\n value: value\n };\n }\n\n // ============================================\n // Content Tag Methods (available to all access levels)\n // ============================================\n\n /**\n * Add a content tag to a key (user-level organization)\n */\n addTag(key: string, tag: string): boolean {\n if (key === '$date' || key === '$time') {\n return false;\n }\n\n const entry = this.stm[key];\n if (!entry) {\n return false;\n }\n\n if (!entry.attributes.contentTags) {\n entry.attributes.contentTags = [];\n }\n\n if (!entry.attributes.contentTags.includes(tag)) {\n entry.attributes.contentTags.push(tag);\n // Sync legacy tags array\n entry.attributes.tags = [...entry.attributes.contentTags];\n this.notifyGlobalListeners();\n return true;\n }\n\n return false;\n }\n\n /**\n * Remove a content tag from a key\n */\n removeTag(key: string, tag: string): boolean {\n if (key === '$date' || key === '$time') {\n return false;\n }\n\n const entry = this.stm[key];\n if (!entry || !entry.attributes.contentTags) {\n return false;\n }\n\n const tagIndex = entry.attributes.contentTags.indexOf(tag);\n if (tagIndex > -1) {\n entry.attributes.contentTags.splice(tagIndex, 1);\n // Sync legacy tags array\n entry.attributes.tags = [...entry.attributes.contentTags];\n this.notifyGlobalListeners();\n return true;\n }\n\n return false;\n }\n\n /**\n * Get all content tags for a key\n */\n getTags(key: string): string[] {\n if (key === '$date' || key === '$time') {\n return [];\n }\n\n const entry = this.stm[key];\n return entry?.attributes.contentTags || [];\n }\n\n /**\n * Get all unique content tags across all keys\n */\n getAllTags(): string[] {\n const allTags = new Set<string>();\n\n Object.values(this.stm).forEach(entry => {\n if (entry.attributes.contentTags) {\n entry.attributes.contentTags.forEach(tag => allTags.add(tag));\n }\n });\n\n return Array.from(allTags);\n }\n\n /**\n * Check if a key has a specific content tag\n */\n hasTag(key: string, tag: string): boolean {\n if (key === '$date' || key === '$time') {\n return false;\n }\n\n const entry = this.stm[key];\n return entry?.attributes.contentTags?.includes(tag) || false;\n }\n\n /**\n * Get all keys with a specific content tag as formatted string\n */\n getTagged(tag: string): string {\n const entries: Array<[string, any]> = [];\n\n const sortedKeys = this.getSortedKeys();\n sortedKeys.forEach(key => {\n const entry = this.stm[key];\n if (entry.attributes.contentTags?.includes(tag)) {\n entries.push([key, this.get_value(key)]);\n }\n });\n\n return entries\n .map(([key, value]) => `${key}: ${value}`)\n .join(', ');\n }\n\n /**\n * Get all keys with a specific content tag\n */\n getKeysByTag(tag: string): string[] {\n const sortedKeys = this.getSortedKeys();\n return sortedKeys.filter(key => {\n const entry = this.stm[key];\n return entry.attributes.contentTags?.includes(tag);\n });\n }\n\n // ============================================\n // System Tag Methods (requires system access level)\n // ============================================\n\n /**\n * Add a system tag to a key (requires system access)\n * System tags: 'prompt', 'readonly', 'protected', 'template'\n */\n systemAddTag(key: string, tag: SystemTag): boolean {\n if (!this.hasSystemAccess) {\n console.warn('MindCache: systemAddTag requires system access level');\n return false;\n }\n\n if (key === '$date' || key === '$time') {\n return false;\n }\n\n const entry = this.stm[key];\n if (!entry) {\n return false;\n }\n\n if (!entry.attributes.systemTags) {\n entry.attributes.systemTags = [];\n }\n\n if (!entry.attributes.systemTags.includes(tag)) {\n entry.attributes.systemTags.push(tag);\n // Sync legacy boolean attributes\n this.syncLegacyFromSystemTags(entry);\n this.notifyGlobalListeners();\n return true;\n }\n\n return false;\n }\n\n /**\n * Remove a system tag from a key (requires system access)\n */\n systemRemoveTag(key: string, tag: SystemTag): boolean {\n if (!this.hasSystemAccess) {\n console.warn('MindCache: systemRemoveTag requires system access level');\n return false;\n }\n\n if (key === '$date' || key === '$time') {\n return false;\n }\n\n const entry = this.stm[key];\n if (!entry || !entry.attributes.systemTags) {\n return false;\n }\n\n // Prevent removing 'protected' tag from hardcoded keys\n const isHardcoded = entry.attributes.hardcoded || entry.attributes.systemTags.includes('protected');\n if (tag === 'protected' && isHardcoded) {\n return false; // Cannot remove protected tag from hardcoded keys\n }\n\n const tagIndex = entry.attributes.systemTags.indexOf(tag);\n if (tagIndex > -1) {\n entry.attributes.systemTags.splice(tagIndex, 1);\n // Sync legacy boolean attributes\n this.syncLegacyFromSystemTags(entry);\n // Ensure hardcoded status is preserved\n if (isHardcoded) {\n if (!entry.attributes.systemTags.includes('protected')) {\n entry.attributes.systemTags.push('protected');\n }\n entry.attributes.hardcoded = true;\n entry.attributes.readonly = true;\n entry.attributes.template = false;\n }\n this.notifyGlobalListeners();\n return true;\n }\n\n return false;\n }\n\n /**\n * Get all system tags for a key (requires system access)\n */\n systemGetTags(key: string): SystemTag[] {\n if (!this.hasSystemAccess) {\n console.warn('MindCache: systemGetTags requires system access level');\n return [];\n }\n\n if (key === '$date' || key === '$time') {\n return [];\n }\n\n const entry = this.stm[key];\n return entry?.attributes.systemTags || [];\n }\n\n /**\n * Check if a key has a specific system tag (requires system access)\n */\n systemHasTag(key: string, tag: SystemTag): boolean {\n if (!this.hasSystemAccess) {\n console.warn('MindCache: systemHasTag requires system access level');\n return false;\n }\n\n if (key === '$date' || key === '$time') {\n return false;\n }\n\n const entry = this.stm[key];\n return entry?.attributes.systemTags?.includes(tag) || false;\n }\n\n /**\n * Set all system tags for a key at once (requires system access)\n */\n systemSetTags(key: string, tags: SystemTag[]): boolean {\n if (!this.hasSystemAccess) {\n console.warn('MindCache: systemSetTags requires system access level');\n return false;\n }\n\n if (key === '$date' || key === '$time') {\n return false;\n }\n\n const entry = this.stm[key];\n if (!entry) {\n return false;\n }\n\n entry.attributes.systemTags = [...tags];\n // Sync legacy boolean attributes\n this.syncLegacyFromSystemTags(entry);\n this.notifyGlobalListeners();\n return true;\n }\n\n /**\n * Get all keys with a specific system tag (requires system access)\n */\n systemGetKeysByTag(tag: SystemTag): string[] {\n if (!this.hasSystemAccess) {\n console.warn('MindCache: systemGetKeysByTag requires system access level');\n return [];\n }\n\n const sortedKeys = this.getSortedKeys();\n return sortedKeys.filter(key => {\n const entry = this.stm[key];\n return entry.attributes.systemTags?.includes(tag);\n });\n }\n\n /**\n * Helper to sync legacy boolean attributes from system tags\n */\n private syncLegacyFromSystemTags(entry: STMEntry): void {\n const tags = entry.attributes.systemTags || [];\n entry.attributes.readonly = tags.includes('readonly');\n entry.attributes.visible = tags.includes('prompt');\n entry.attributes.hardcoded = tags.includes('protected');\n entry.attributes.template = tags.includes('ApplyTemplate') || tags.includes('template');\n }\n\n toMarkdown(): string {\n const now = new Date();\n const lines: string[] = [];\n const appendixEntries: Array<{\n key: string;\n type: string;\n contentType: string;\n base64: string;\n label: string;\n }> = [];\n let appendixCounter = 0;\n\n lines.push('# MindCache STM Export');\n lines.push('');\n lines.push(`Export Date: ${now.toISOString().split('T')[0]}`);\n lines.push('');\n lines.push('---');\n lines.push('');\n lines.push('## STM Entries');\n lines.push('');\n\n const sortedKeys = this.getSortedKeys();\n sortedKeys.forEach(key => {\n const entry = this.stm[key];\n if (entry.attributes.hardcoded) {\n return;\n }\n\n lines.push(`### ${key}`);\n const entryType = (entry.attributes.type && (entry.attributes.type as any) !== 'undefined') ? entry.attributes.type : 'text';\n lines.push(`- **Type**: \\`${entryType}\\``);\n lines.push(`- **Readonly**: \\`${entry.attributes.readonly}\\``);\n lines.push(`- **Visible**: \\`${entry.attributes.visible}\\``);\n lines.push(`- **Template**: \\`${entry.attributes.template}\\``);\n lines.push(`- **Z-Index**: \\`${entry.attributes.zIndex ?? 0}\\``);\n\n if (entry.attributes.tags && entry.attributes.tags.length > 0) {\n lines.push(`- **Tags**: \\`${entry.attributes.tags.join('`, `')}\\``);\n }\n\n if (entry.attributes.contentType) {\n lines.push(`- **Content Type**: \\`${entry.attributes.contentType}\\``);\n }\n\n if (entryType === 'image' || entryType === 'file') {\n const label = String.fromCharCode(65 + appendixCounter);\n appendixCounter++;\n lines.push(`- **Value**: [See Appendix ${label}]`);\n\n appendixEntries.push({\n key,\n type: entryType,\n contentType: entry.attributes.contentType || 'application/octet-stream',\n base64: entry.value as string,\n label\n });\n } else if (entryType === 'json') {\n lines.push('- **Value**:');\n lines.push('```json');\n try {\n const jsonValue = typeof entry.value === 'string' ? entry.value : JSON.stringify(entry.value, null, 2);\n lines.push(jsonValue);\n } catch {\n lines.push(String(entry.value));\n }\n lines.push('```');\n } else {\n const valueStr = String(entry.value);\n lines.push('- **Value**:');\n lines.push('```');\n lines.push(valueStr);\n lines.push('```');\n }\n\n lines.push('');\n lines.push('---');\n lines.push('');\n });\n\n if (appendixEntries.length > 0) {\n lines.push('## Appendix: Binary Data');\n lines.push('');\n\n appendixEntries.forEach(({ key, contentType, base64, label }) => {\n lines.push(`### Appendix ${label}: ${key}`);\n lines.push(`**Type**: ${contentType}`);\n lines.push('');\n lines.push('```');\n lines.push(base64);\n lines.push('```');\n lines.push('');\n lines.push('---');\n lines.push('');\n });\n }\n\n lines.push('*End of MindCache Export*');\n\n return lines.join('\\n');\n }\n\n fromMarkdown(markdown: string): void {\n const lines = markdown.split('\\n');\n let currentSection: 'header' | 'entries' | 'appendix' = 'header';\n let currentKey: string | null = null;\n let currentEntry: Partial<STMEntry> | null = null;\n let inCodeBlock = false;\n let codeBlockContent: string[] = [];\n let codeBlockType: 'value' | 'json' | 'base64' | 'default' | null = null;\n const appendixData: Record<string, { contentType: string; base64: string }> = {};\n let currentAppendixKey: string | null = null;\n const pendingEntries: Record<string, Partial<STMEntry> & { appendixLabel?: string }> = {};\n\n this.clear();\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n\n if (trimmed === '## STM Entries') {\n currentSection = 'entries';\n continue;\n }\n if (trimmed === '## Appendix: Binary Data') {\n currentSection = 'appendix';\n continue;\n }\n\n if (trimmed === '```' || trimmed === '```json') {\n if (!inCodeBlock) {\n inCodeBlock = true;\n codeBlockContent = [];\n codeBlockType = currentSection === 'appendix' ? 'base64' : (trimmed === '```json' ? 'json' : 'value');\n } else {\n inCodeBlock = false;\n const content = codeBlockContent.join('\\n');\n\n if (currentSection === 'appendix' && currentAppendixKey) {\n appendixData[currentAppendixKey].base64 = content;\n } else if (currentEntry && codeBlockType === 'json') {\n currentEntry.value = content;\n } else if (currentEntry && codeBlockType === 'value') {\n currentEntry.value = content;\n }\n\n codeBlockContent = [];\n codeBlockType = null;\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeBlockContent.push(line);\n continue;\n }\n\n if (currentSection === 'entries') {\n if (trimmed.startsWith('### ')) {\n if (currentKey && currentEntry && currentEntry.attributes) {\n pendingEntries[currentKey] = currentEntry as STMEntry & { appendixLabel?: string };\n }\n\n currentKey = trimmed.substring(4);\n currentEntry = {\n value: undefined,\n attributes: {\n ...DEFAULT_KEY_ATTRIBUTES,\n contentTags: [],\n systemTags: ['prompt'] as SystemTag[],\n tags: []\n }\n };\n } else if (trimmed.startsWith('- **Type**: `')) {\n const type = trimmed.match(/`([^`]+)`/)?.[1] as KeyAttributes['type'];\n if (currentEntry && type && (type as any) !== 'undefined') {\n currentEntry.attributes!.type = type;\n }\n } else if (trimmed.startsWith('- **Readonly**: `')) {\n const value = trimmed.match(/`([^`]+)`/)?.[1] === 'true';\n if (currentEntry) {\n currentEntry.attributes!.readonly = value;\n }\n } else if (trimmed.startsWith('- **Visible**: `')) {\n const value = trimmed.match(/`([^`]+)`/)?.[1] === 'true';\n if (currentEntry) {\n currentEntry.attributes!.visible = value;\n }\n } else if (trimmed.startsWith('- **Template**: `')) {\n const value = trimmed.match(/`([^`]+)`/)?.[1] === 'true';\n if (currentEntry) {\n currentEntry.attributes!.template = value;\n }\n } else if (trimmed.startsWith('- **Z-Index**: `')) {\n const zIndexStr = trimmed.match(/`([^`]+)`/)?.[1];\n if (currentEntry && zIndexStr) {\n const zIndex = parseInt(zIndexStr, 10);\n if (!isNaN(zIndex)) {\n currentEntry.attributes!.zIndex = zIndex;\n }\n }\n } else if (trimmed.startsWith('- **Tags**: `')) {\n const tagsStr = trimmed.substring(13, trimmed.length - 1);\n if (currentEntry) {\n currentEntry.attributes!.tags = tagsStr.split('`, `');\n }\n } else if (trimmed.startsWith('- **Content Type**: `')) {\n const contentType = trimmed.match(/`([^`]+)`/)?.[1];\n if (currentEntry && contentType) {\n currentEntry.attributes!.contentType = contentType;\n }\n } else if (trimmed.startsWith('- **Value**: `')) {\n const value = trimmed.substring(14, trimmed.length - 1);\n if (currentEntry) {\n currentEntry.value = value;\n }\n } else if (trimmed.startsWith('- **Value**: [See Appendix ')) {\n const labelMatch = trimmed.match(/Appendix ([A-Z])\\]/);\n if (currentEntry && labelMatch && currentKey) {\n (currentEntry as any).appendixLabel = labelMatch[1];\n currentEntry.value = '';\n }\n }\n }\n\n if (currentSection === 'appendix') {\n if (trimmed.startsWith('### Appendix ')) {\n const match = trimmed.match(/### Appendix ([A-Z]): (.+)/);\n if (match) {\n const label = match[1];\n const key = match[2];\n currentAppendixKey = `${label}:${key}`;\n appendixData[currentAppendixKey] = { contentType: '', base64: '' };\n }\n } else if (trimmed.startsWith('**Type**: ')) {\n const contentType = trimmed.substring(10);\n if (currentAppendixKey) {\n appendixData[currentAppendixKey].contentType = contentType;\n }\n }\n }\n }\n\n if (currentKey && currentEntry && currentEntry.attributes) {\n pendingEntries[currentKey] = currentEntry as STMEntry & { appendixLabel?: string };\n }\n\n Object.entries(pendingEntries).forEach(([key, entry]) => {\n const appendixLabel = (entry as any).appendixLabel;\n if (appendixLabel) {\n const appendixKey = `${appendixLabel}:${key}`;\n const appendixInfo = appendixData[appendixKey];\n if (appendixInfo && appendixInfo.base64) {\n entry.value = appendixInfo.base64;\n if (!entry.attributes!.contentType && appendixInfo.contentType) {\n entry.attributes!.contentType = appendixInfo.contentType;\n }\n }\n }\n\n if (entry.value !== undefined && entry.attributes) {\n const attrs = entry.attributes;\n\n // Sync tags to contentTags if tags was parsed from markdown\n if (\n attrs.tags &&\n attrs.tags.length > 0 &&\n (!attrs.contentTags || attrs.contentTags.length === 0)\n ) {\n attrs.contentTags = [...attrs.tags];\n }\n\n // Derive systemTags from legacy booleans if not present\n if (!attrs.systemTags || attrs.systemTags.length === 0) {\n const systemTags: SystemTag[] = [];\n if (attrs.visible !== false) {\n systemTags.push('prompt'); // Will be normalized to SystemPrompt\n }\n if (attrs.readonly) {\n systemTags.push('readonly'); // Will be normalized (removes LLMWrite)\n } else {\n systemTags.push('LLMWrite'); // Default: writable\n }\n if (attrs.hardcoded) {\n systemTags.push('protected');\n }\n if (attrs.template) {\n systemTags.push('template');\n }\n // Normalize tags (migrate old tags to new ones)\n attrs.systemTags = this.normalizeSystemTags(systemTags);\n } else {\n // Normalize existing tags\n attrs.systemTags = this.normalizeSystemTags(attrs.systemTags);\n }\n\n // Ensure all required fields exist\n if (!attrs.contentTags) {\n attrs.contentTags = [];\n }\n if (!attrs.tags) {\n attrs.tags = [...attrs.contentTags];\n }\n\n // Sync legacy attributes FROM normalized systemTags\n const normalizedTags = attrs.systemTags || [];\n attrs.readonly = normalizedTags.includes('readonly') || !normalizedTags.includes('LLMWrite');\n attrs.visible = this.hasSystemPrompt(normalizedTags);\n attrs.hardcoded = normalizedTags.includes('protected');\n attrs.template = normalizedTags.includes('ApplyTemplate') || normalizedTags.includes('template');\n\n this.stm[key] = {\n value: entry.value,\n attributes: attrs as KeyAttributes\n };\n }\n });\n\n this.notifyGlobalListeners();\n }\n}\n\n// Create and export a single instance of MindCache\nexport const mindcache = new MindCache();\n\n","import { MindCache } from '../core/MindCache';\nimport { CloudAdapter } from './CloudAdapter';\nimport type { CloudConfig } from './types';\n\nexport { CloudAdapter } from './CloudAdapter';\nexport type {\n CloudConfig,\n ConnectionState,\n CloudAdapterEvents,\n Operation,\n SetOperation,\n DeleteOperation,\n ClearOperation\n} from './types';\n\n/**\n * Connect a MindCache instance to the cloud for real-time sync.\n *\n * @example\n * ```typescript\n * import { MindCache } from 'mindcache';\n * import { connectCloud } from 'mindcache/cloud';\n *\n * const mc = new MindCache();\n * const adapter = connectCloud(mc, {\n * projectId: 'my-project',\n * instanceId: 'main',\n * apiKey: 'mc_live_xxxxx'\n * });\n *\n * // Now mc is synced with the cloud!\n * mc.set_value('name', 'Alice');\n * ```\n */\nexport function connectCloud(mc: MindCache, config: CloudConfig): CloudAdapter {\n const adapter = new CloudAdapter(config);\n adapter.attach(mc);\n adapter.connect();\n return adapter;\n}\n\n/**\n * Create a new MindCache instance that's already connected to the cloud.\n *\n * @example\n * ```typescript\n * import { createCloudMindCache } from 'mindcache/cloud';\n *\n * const mc = createCloudMindCache({\n * projectId: 'my-project',\n * instanceId: 'main',\n * apiKey: 'mc_live_xxxxx'\n * });\n *\n * // Ready to use with cloud sync!\n * mc.set_value('name', 'Alice');\n * ```\n */\nexport function createCloudMindCache(config: CloudConfig): MindCache & { adapter: CloudAdapter } {\n const mc = new MindCache();\n const adapter = connectCloud(mc, config);\n\n // Attach adapter to the instance for access\n return Object.assign(mc, { adapter });\n}\n\n"]}
1
+ {"version":3,"sources":["../../src/local/IndexedDBAdapter.ts","../../src/cloud/CloudAdapter.ts","../../src/core/types.ts","../../src/core/MindCache.ts","../../src/cloud/index.ts"],"names":["CloudAdapter","encoding","syncProtocol","decoding","Y","IndexeddbPersistence","IndexedDBAdapter","length","diff"],"mappings":"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","file":"index.js","sourcesContent":["import type { MindCache } from '../core/MindCache';\n\nexport interface IndexedDBConfig {\n /** Database name (defaults to 'mindcache_db') */\n dbName?: string;\n /** Store name (defaults to 'mindcache_store') */\n storeName?: string;\n /** Storage key (defaults to 'mindcache_data') */\n key?: string;\n /** Debounce time in ms for saving (defaults to 1000) */\n debounceMs?: number;\n}\n\nexport class IndexedDBAdapter {\n private mindcache: MindCache | null = null;\n private unsubscribe: (() => void) | null = null;\n private saveTimeout: ReturnType<typeof setTimeout> | null = null;\n private db: IDBDatabase | null = null;\n\n private dbName: string;\n private storeName: string;\n private key: string;\n\n constructor(private config: IndexedDBConfig = {}) {\n this.dbName = config.dbName || 'mindcache_db';\n this.storeName = config.storeName || 'mindcache_store';\n this.key = config.key || 'mindcache_data';\n }\n\n async attach(mc: MindCache): Promise<void> {\n if (this.mindcache) {\n this.detach();\n }\n\n this.mindcache = mc;\n await this.initDB();\n await this.load();\n\n const listener = () => {\n // Don't save if this change came from deserialize (loading)\n // The isRemoteUpdate flag is set during deserialization\n if (this.mindcache && !this.mindcache.isRemoteUpdate()) {\n this.scheduleSave();\n }\n };\n\n mc.subscribeToAll(listener);\n this.unsubscribe = () => mc.unsubscribeFromAll(listener);\n console.log('🗄️ IndexedDBAdapter: Attached to MindCache instance');\n }\n\n detach(): void {\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = null;\n }\n if (this.saveTimeout) {\n clearTimeout(this.saveTimeout);\n this.saveTimeout = null;\n }\n this.mindcache = null;\n if (this.db) {\n this.db.close();\n this.db = null;\n }\n }\n\n private initDB(): Promise<void> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(this.dbName);\n\n request.onerror = () => {\n console.error('MindCache: IndexedDB error:', request.error);\n reject(request.error);\n };\n\n request.onsuccess = () => {\n const db = request.result;\n\n // Check if the required store exists\n if (!db.objectStoreNames.contains(this.storeName)) {\n // Store doesn't exist - need to trigger upgrade\n const currentVersion = db.version;\n db.close();\n\n // Reopen with incremented version to trigger onupgradeneeded\n const upgradeRequest = indexedDB.open(this.dbName, currentVersion + 1);\n\n upgradeRequest.onerror = () => {\n console.error('MindCache: IndexedDB upgrade error:', upgradeRequest.error);\n reject(upgradeRequest.error);\n };\n\n upgradeRequest.onupgradeneeded = () => {\n const upgradeDb = upgradeRequest.result;\n if (!upgradeDb.objectStoreNames.contains(this.storeName)) {\n upgradeDb.createObjectStore(this.storeName);\n }\n };\n\n upgradeRequest.onsuccess = () => {\n this.db = upgradeRequest.result;\n resolve();\n };\n } else {\n this.db = db;\n resolve();\n }\n };\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(this.storeName)) {\n db.createObjectStore(this.storeName);\n }\n };\n });\n }\n\n private load(): Promise<void> {\n if (!this.db || !this.mindcache) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n try {\n const transaction = this.db!.transaction([this.storeName], 'readonly');\n const store = transaction.objectStore(this.storeName);\n const request = store.get(this.key);\n\n request.onsuccess = () => {\n if (request.result) {\n this.mindcache!.deserialize(request.result);\n console.log('🗄️ IndexedDBAdapter: Loaded data from IndexedDB');\n }\n resolve();\n };\n\n request.onerror = () => {\n console.error('MindCache: Failed to load from IndexedDB:', request.error);\n resolve();\n };\n } catch (error) {\n console.error('MindCache: Error accessing IndexedDB for load:', error);\n resolve();\n }\n });\n }\n\n private scheduleSave(): void {\n if (this.saveTimeout) {\n clearTimeout(this.saveTimeout);\n }\n\n this.saveTimeout = setTimeout(() => {\n this.save();\n this.saveTimeout = null;\n }, this.config.debounceMs ?? 1000);\n }\n\n private save(): void {\n if (!this.db || !this.mindcache) {\n return;\n }\n\n try {\n const data = this.mindcache.serialize();\n const transaction = this.db.transaction([this.storeName], 'readwrite');\n const store = transaction.objectStore(this.storeName);\n const request = store.put(data, this.key);\n\n request.onsuccess = () => {\n console.log('🗄️ IndexedDBAdapter: Saved to IndexedDB');\n };\n\n request.onerror = () => {\n console.error('MindCache: Failed to save to IndexedDB:', request.error);\n };\n } catch (error) {\n console.error('MindCache: Error accessing IndexedDB for save:', error);\n }\n }\n}\n","import * as syncProtocol from 'y-protocols/sync';\nimport * as encoding from 'lib0/encoding';\nimport * as decoding from 'lib0/decoding';\n\n\nimport type { MindCache } from '../core/MindCache';\nimport type {\n CloudConfig,\n ConnectionState,\n CloudAdapterEvents\n} from './types';\n\nconst RECONNECT_DELAY = 1000;\nconst MAX_RECONNECT_DELAY = 30000;\n\nexport class CloudAdapter {\n private ws: WebSocket | null = null;\n private mindcache: MindCache | null = null;\n private unsubscribe: (() => void) | null = null;\n private reconnectAttempts = 0;\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n private _state: ConnectionState = 'disconnected';\n private listeners: Partial<{ [K in keyof CloudAdapterEvents]: CloudAdapterEvents[K][] }> = {};\n private token: string | null = null;\n\n constructor(private config: CloudConfig) {\n\n if (!config.baseUrl) {\n throw new Error('MindCache Cloud: baseUrl is required. Please provide the cloud API URL in your configuration.');\n }\n }\n\n setToken(token: string): void {\n this.token = token;\n }\n\n setTokenProvider(provider: () => Promise<string>): void {\n this.config.tokenProvider = provider;\n }\n\n get state(): ConnectionState {\n return this._state;\n }\n\n attach(mc: MindCache): void {\n if (this.mindcache) {\n this.detach();\n }\n this.mindcache = mc;\n\n // Yjs Update Listener handled in connect/setupWebSocket\n // But we need to listen to local changes if we want to push them?\n // Yjs handles this via 'update' event on doc.\n // We attach listener to doc in connect() or better here if doc exists?\n // MindCache will expose .doc\n\n // Attach local update propagation\n mc.doc.on('update', (update: Uint8Array, origin: any) => {\n if (origin !== this && this.ws && this.ws.readyState === WebSocket.OPEN) {\n const encoder = encoding.createEncoder();\n syncProtocol.writeUpdate(encoder, update);\n this.sendBinary(encoding.toUint8Array(encoder));\n }\n });\n\n console.log('☁️ CloudAdapter: Attached to MindCache instance');\n }\n\n detach(): void {\n if (this.unsubscribe) {\n this.unsubscribe();\n this.unsubscribe = null;\n }\n this.mindcache = null;\n }\n\n private async fetchTokenWithApiKey(): Promise<string> {\n if (!this.config.apiKey) {\n throw new Error('API key is required to fetch token');\n }\n\n const httpBaseUrl = this.config.baseUrl!\n .replace('wss://', 'https://')\n .replace('ws://', 'http://');\n\n const isDelegate = this.config.apiKey.startsWith('del_') && this.config.apiKey.includes(':');\n const authHeader = isDelegate\n ? `ApiKey ${this.config.apiKey}`\n : `Bearer ${this.config.apiKey}`;\n\n const response = await fetch(`${httpBaseUrl}/api/ws-token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': authHeader\n },\n body: JSON.stringify({\n instanceId: this.config.instanceId,\n permission: 'write'\n })\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Failed to get token' }));\n throw new Error(error.error || `Failed to get WebSocket token: ${response.status}`);\n }\n\n const data = await response.json();\n return data.token;\n }\n\n async connect(): Promise<void> {\n if (this._state === 'connecting' || this._state === 'connected') {\n return;\n }\n\n this._state = 'connecting';\n\n try {\n if (!this.token) {\n if (this.config.tokenProvider) {\n this.token = await this.config.tokenProvider();\n } else if (this.config.apiKey) {\n this.token = await this.fetchTokenWithApiKey();\n }\n }\n\n let url = `${this.config.baseUrl}/sync/${this.config.instanceId}`;\n if (this.token) {\n url += `?token=${encodeURIComponent(this.token)}`;\n this.token = null;\n } else {\n throw new Error('MindCache Cloud: No authentication method available. Provide apiKey or tokenProvider.');\n }\n\n this.ws = new WebSocket(url);\n this.ws.binaryType = 'arraybuffer'; // Crucial for Yjs\n this.setupWebSocket();\n } catch (error) {\n this._state = 'error';\n this.emit('error', error as Error);\n this.scheduleReconnect();\n }\n }\n\n disconnect(): void {\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this._state = 'disconnected';\n this.emit('disconnected');\n }\n\n on<K extends keyof CloudAdapterEvents>(event: K, listener: CloudAdapterEvents[K]): void {\n if (!this.listeners[event]) {\n this.listeners[event] = [];\n }\n this.listeners[event]!.push(listener);\n }\n\n off<K extends keyof CloudAdapterEvents>(event: K, listener: CloudAdapterEvents[K]): void {\n if (this.listeners[event]) {\n this.listeners[event] = this.listeners[event]!.filter(l => l !== listener) as any;\n }\n }\n\n private emit<K extends keyof CloudAdapterEvents>(event: K, ...args: Parameters<CloudAdapterEvents[K]>): void {\n if (this.listeners[event]) {\n this.listeners[event]!.forEach(listener => (listener as any)(...args));\n }\n }\n\n private setupWebSocket(): void {\n if (!this.ws) {\n return;\n }\n\n this.ws.onopen = () => {\n // Start Sync\n if (this.mindcache) {\n const encoder = encoding.createEncoder();\n syncProtocol.writeSyncStep1(encoder, this.mindcache.doc);\n this.sendBinary(encoding.toUint8Array(encoder));\n }\n };\n\n this.ws.onmessage = (event) => {\n try {\n if (typeof event.data === 'string') {\n // Handle JSON auth messages\n const msg = JSON.parse(event.data);\n if (msg.type === 'auth_success') {\n this._state = 'connected';\n this.reconnectAttempts = 0;\n this.emit('connected');\n } else if (msg.type === 'auth_error' || msg.type === 'error') {\n this._state = 'error';\n this.emit('error', new Error(msg.error));\n }\n } else {\n // Handle Binary Yjs messages\n const encoder = encoding.createEncoder();\n const decoder = decoding.createDecoder(new Uint8Array(event.data as ArrayBuffer));\n\n if (this.mindcache) {\n syncProtocol.readSyncMessage(decoder, encoder, this.mindcache.doc, this);\n\n // If response needed\n if (encoding.length(encoder) > 0) {\n this.sendBinary(encoding.toUint8Array(encoder));\n }\n\n // Detect sync completion?\n // Yjs doesn't explicit \"sync complete\" event in protocol.\n // But usually after receive sync step 2.\n // For now, we assume if we have data we are syncing.\n }\n }\n } catch (error) {\n console.error('MindCache Cloud: Failed to handle message:', error);\n }\n };\n\n this.ws.onclose = () => {\n this._state = 'disconnected';\n this.emit('disconnected');\n this.scheduleReconnect();\n };\n\n this.ws.onerror = () => {\n this._state = 'error';\n this.emit('error', new Error('WebSocket connection failed'));\n };\n }\n\n private sendBinary(data: Uint8Array): void {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(data);\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimeout) {\n return;\n }\n\n const delay = Math.min(\n RECONNECT_DELAY * Math.pow(2, this.reconnectAttempts),\n MAX_RECONNECT_DELAY\n );\n\n this.reconnectTimeout = setTimeout(async () => {\n this.reconnectTimeout = null;\n this.reconnectAttempts++;\n this.connect();\n }, delay);\n }\n}\n\n","/**\n * Access level for MindCache operations\n * - 'user': Can only manage content tags (default)\n * - 'system': Can manage both content tags and system tags\n */\nexport type AccessLevel = 'user' | 'system';\n\n/**\n * Known system tags that control key behavior\n * - 'SystemPrompt': Include in system prompt\n * - 'LLMRead': LLM can read this key (visible to LLMs)\n * - 'LLMWrite': LLM can write to this key via tools\n * - 'protected': Cannot be deleted (replaces hardcoded)\n * - 'ApplyTemplate': Process value through template injection\n *\n * @deprecated 'prompt' - Use 'SystemPrompt' instead\n * @deprecated 'readonly' - Use absence of 'LLMWrite' instead (if LLMWrite not present, readonly=true)\n * @deprecated 'template' - Use 'ApplyTemplate' instead\n */\nexport type SystemTag = 'SystemPrompt' | 'LLMRead' | 'LLMWrite' | 'protected' | 'ApplyTemplate' | 'prompt' | 'readonly' | 'template';\n\n/**\n * Attributes that can be set on a MindCache key\n */\nexport interface KeyAttributes {\n /** The type of value stored */\n type: 'text' | 'image' | 'file' | 'json' | 'document';\n /** MIME type for files/images */\n contentType?: string;\n /** User-defined tags for organizing keys */\n contentTags: string[];\n /** System tags that control key behavior (requires system access) */\n systemTags: SystemTag[];\n /** Z-index for ordering keys (lower values appear first) */\n zIndex: number;\n\n // Legacy attributes - kept for backward compatibility, derived from systemTags\n /** @deprecated Use !systemTags.includes('LLMWrite') instead */\n readonly: boolean;\n /** @deprecated Use systemTags.includes('SystemPrompt') instead */\n visible: boolean;\n /** @deprecated Use systemTags.includes('protected') instead */\n hardcoded: boolean;\n /** @deprecated Use systemTags.includes('ApplyTemplate') instead */\n template: boolean;\n /** @deprecated Use contentTags instead */\n tags?: string[];\n}\n\n/**\n * A single entry in the MindCache store\n */\nexport interface STMEntry {\n value: unknown;\n attributes: KeyAttributes;\n}\n\n/**\n * The full MindCache state (key-value pairs with attributes)\n */\nexport type STM = {\n [key: string]: STMEntry;\n};\n\n/**\n * Listener callback for key-specific subscriptions\n * Receives the new value when the key changes\n */\nexport type Listener = (value: unknown) => void;\n\n/**\n * Global listener callback for all changes\n * Called when any key changes (no parameters - use getAll() to get current state)\n */\nexport type GlobalListener = () => void;\n\n/**\n * Default attributes for new keys\n */\nexport const DEFAULT_KEY_ATTRIBUTES: KeyAttributes = {\n type: 'text',\n contentTags: [],\n systemTags: ['SystemPrompt', 'LLMWrite'], // visible in system prompt and writable by LLM by default\n zIndex: 0,\n // Legacy - derived from systemTags\n readonly: false,\n visible: true,\n hardcoded: false,\n template: false,\n tags: []\n};\n\n/**\n * A single entry in the global history log\n */\nexport interface HistoryEntry {\n /** Unique identifier for this history entry */\n id: string;\n /** Timestamp when the change occurred */\n timestamp: number;\n /** Keys that were affected by this change */\n keysAffected?: string[];\n}\n\n/**\n * History options for offline and cloud modes\n */\nexport interface HistoryOptions {\n /** Max history entries to keep (default: 100) */\n maxEntries?: number;\n /** Save full snapshot every N entries for fast restore (default: 10) */\n snapshotInterval?: number;\n}\n\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport * as Y from 'yjs';\nimport { IndexeddbPersistence } from 'y-indexeddb';\nimport diff from 'fast-diff';\nimport type { KeyAttributes, STM, Listener, GlobalListener, AccessLevel, SystemTag, HistoryEntry, HistoryOptions } from './types';\nimport { DEFAULT_KEY_ATTRIBUTES } from './types';\n\n// Browser environment type declarations\ninterface FileReaderType {\n onload: ((this: FileReaderType, ev: any) => any) | null;\n onerror: ((this: FileReaderType, ev: any) => any) | null;\n result: string | ArrayBuffer | null;\n readAsDataURL(file: Blob): void;\n}\n\ndeclare const FileReader: {\n prototype: FileReaderType;\n new(): FileReaderType;\n} | undefined;\n\n/**\n * Cloud configuration options for MindCache constructor\n */\nexport interface MindCacheCloudOptions {\n /** Instance ID to connect to */\n instanceId: string;\n /** Project ID (optional, defaults to 'default') */\n projectId?: string;\n /** API endpoint to fetch WS token (recommended for browser) */\n tokenEndpoint?: string;\n /** Direct API key (server-side only, never expose in browser!) */\n apiKey?: string;\n /** WebSocket base URL (defaults to production) */\n baseUrl?: string;\n}\n\nexport interface MindCacheIndexedDBOptions {\n /** Database name (defaults to 'mindcache_db') */\n dbName?: string;\n /** Store name (defaults to 'mindcache_store') */\n storeName?: string;\n /** Storage key (defaults to 'mindcache_data') */\n key?: string;\n /** Debounce time in ms for saving (defaults to 1000) */\n debounceMs?: number;\n}\n\n/**\n * Constructor options for MindCache\n */\nexport interface MindCacheOptions {\n /** Cloud sync configuration. If omitted, runs in local-only mode. IndexedDB auto-enabled for offline support. */\n cloud?: MindCacheCloudOptions;\n /** IndexedDB configuration. Ignored in cloud mode (auto-enabled). */\n indexedDB?: MindCacheIndexedDBOptions;\n /** History tracking options (enabled in IndexedDB and Cloud modes) */\n history?: HistoryOptions;\n /** Access level for tag operations. 'system' allows managing system tags. */\n accessLevel?: AccessLevel;\n}\n\n// Connection state type\ntype ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'error';\n\n// CloudAdapter interface to avoid circular imports\ninterface ICloudAdapter {\n attach(mc: MindCache): void;\n detach(): void;\n connect(): Promise<void>;\n disconnect(): void;\n setTokenProvider(provider: () => Promise<string>): void;\n on(event: string, listener: (...args: any[]) => void): void;\n off(event: string, listener: (...args: any[]) => void): void;\n state: ConnectionState;\n}\n\nexport class MindCache {\n // Public doc for adapter access\n public doc: Y.Doc;\n private rootMap: Y.Map<Y.Map<any>>; // Key -> EntryMap({value, attributes})\n\n // Cache listeners\n private listeners: { [key: string]: Listener[] } = {};\n private globalListeners: GlobalListener[] = [];\n\n // Metadata\n public readonly version = '3.1.0';\n\n // Internal flag to prevent sync loops when receiving remote updates\n // (Less critical with Yjs but kept for API compat)\n private _isRemoteUpdate = false;\n\n private normalizeSystemTags(tags: SystemTag[]): SystemTag[] {\n const normalized: SystemTag[] = [];\n let hasSystemPrompt = false;\n let hasLLMRead = false;\n let hasLLMWrite = false;\n let hasReadonly = false;\n\n // First pass: identify what we have\n for (const tag of tags) {\n if (tag === 'SystemPrompt' || tag === 'prompt') {\n hasSystemPrompt = true;\n } else if (tag === 'LLMRead') {\n hasLLMRead = true;\n } else if (tag === 'LLMWrite') {\n hasLLMWrite = true;\n } else if (tag === 'readonly') {\n hasReadonly = true;\n } else if (tag === 'protected') {\n normalized.push(tag);\n } else if (tag === 'ApplyTemplate' || tag === 'template') {\n normalized.push('ApplyTemplate');\n }\n }\n\n // Add normalized tags\n if (hasSystemPrompt) {\n normalized.push('SystemPrompt');\n }\n if (hasLLMRead) {\n normalized.push('LLMRead');\n }\n\n if (hasReadonly) {\n normalized.push('readonly');\n } else if (hasLLMWrite) {\n normalized.push('LLMWrite');\n } else {\n normalized.push('LLMWrite');\n }\n\n return normalized;\n }\n\n // Cloud sync state\n private _cloudAdapter: ICloudAdapter | null = null;\n private _connectionState: ConnectionState = 'disconnected';\n private _isLoaded = true; // Default true for local mode\n private _cloudConfig: MindCacheCloudOptions | null = null;\n\n // Access level for system operations\n private _accessLevel: AccessLevel = 'user';\n\n private _initPromise: Promise<void> | null = null;\n\n // Y-IndexedDB provider\n private _idbProvider: IndexeddbPersistence | null = null;\n\n // Undo Managers Cache\n private _undoManagers: Map<string, Y.UndoManager> = new Map();\n\n // Global Undo Manager (watches entire rootMap)\n private _globalUndoManager: Y.UndoManager | null = null;\n\n // History tracking\n private _history: HistoryEntry[] = [];\n private _historyOptions: HistoryOptions = { maxEntries: 100, snapshotInterval: 10 };\n private _historyEnabled = false;\n\n constructor(options?: MindCacheOptions) {\n // Initialize Yjs\n this.doc = new Y.Doc();\n this.rootMap = this.doc.getMap('mindcache');\n\n // Observers for local reactivity\n this.rootMap.observe((event: Y.YMapEvent<any>) => {\n // Iterate changes and trigger specific key listeners\n event.keysChanged.forEach(key => {\n const entryMap = this.rootMap.get(key);\n if (entryMap) {\n // Determine value\n const value = entryMap.get('value');\n // Trigger listener\n if (this.listeners[key]) {\n this.listeners[key].forEach(l => l(value));\n }\n } else {\n // Deleted\n if (this.listeners[key]) {\n this.listeners[key].forEach(l => l(undefined));\n }\n }\n });\n });\n\n // Deep observer for global listener (so UI updates on any change)\n this.rootMap.observeDeep((_events: Y.YEvent<any>[]) => {\n this.notifyGlobalListeners();\n });\n\n // Initialize global undo manager immediately to capture all changes from start\n this.initGlobalUndoManager();\n\n if (options?.accessLevel) {\n this._accessLevel = options.accessLevel;\n }\n\n const initPromises: Promise<void>[] = [];\n\n if (options?.cloud) {\n this._cloudConfig = options.cloud;\n this._isLoaded = false; // Wait for sync\n this._connectionState = 'disconnected';\n initPromises.push(this._initCloud());\n\n // Auto-enable IndexedDB for offline support in cloud mode\n if (typeof window !== 'undefined') {\n const dbName = `mindcache_cloud_${options.cloud.instanceId}`;\n initPromises.push(this._initYIndexedDB(dbName));\n }\n\n // Enable history tracking in cloud mode\n this.enableHistory(options.history);\n }\n\n // Only use explicit indexedDB config if NOT in cloud mode\n if (options?.indexedDB && !options?.cloud) {\n // Use y-indexeddb\n this._isLoaded = false;\n initPromises.push(this._initYIndexedDB(options.indexedDB.dbName || 'mindcache_yjs_db'));\n\n // Enable history tracking in offline mode\n this.enableHistory(options.history);\n }\n\n if (initPromises.length > 0) {\n this._initPromise = Promise.all(initPromises).then(() => {\n // Only set loaded if not waiting for cloud or if cloud is effectively initialized?\n // Actually, logic is: if local IDB is used, we wait for it.\n // If cloud is used, we wait for 'synced' event or timeout/cache loaded.\n // For simplicity, we mark loaded when initial hydration promises resolve.\n if (!this._cloudConfig) {\n this._isLoaded = true;\n }\n });\n }\n }\n\n // Helper: Get or Create UndoManager for a key\n private getUndoManager(key: string): Y.UndoManager | undefined {\n const entryMap = this.rootMap.get(key);\n if (!entryMap) {\n return undefined;\n }\n\n if (!this._undoManagers.has(key)) {\n const um = new Y.UndoManager(entryMap, {\n captureTimeout: 500\n });\n this._undoManagers.set(key, um);\n }\n return this._undoManagers.get(key);\n }\n\n /**\n * Undo changes for a specific key\n */\n undo(key: string): void {\n const um = this.getUndoManager(key);\n if (um) {\n um.undo();\n }\n }\n\n /**\n * Redo changes for a specific key\n */\n redo(key: string): void {\n const um = this.getUndoManager(key);\n if (um) {\n um.redo();\n }\n }\n\n getHistory(key: string): any[] {\n const um = this.getUndoManager(key);\n if (!um) {\n return [];\n }\n return um.undoStack;\n }\n\n // Initialize global undo manager (watches entire rootMap)\n private initGlobalUndoManager(): void {\n if (!this._globalUndoManager) {\n this._globalUndoManager = new Y.UndoManager(this.rootMap, {\n captureTimeout: 500\n });\n }\n }\n\n /**\n * Undo all recent local changes (across all keys)\n * Only undoes YOUR changes, not changes from other users in cloud mode\n */\n undoAll(): void {\n this.initGlobalUndoManager();\n this._globalUndoManager?.undo();\n }\n\n /**\n * Redo previously undone local changes\n */\n redoAll(): void {\n this.initGlobalUndoManager();\n this._globalUndoManager?.redo();\n }\n\n /**\n * Check if there are changes to undo globally\n */\n canUndoAll(): boolean {\n this.initGlobalUndoManager();\n return (this._globalUndoManager?.undoStack.length ?? 0) > 0;\n }\n\n /**\n * Check if there are changes to redo globally\n */\n canRedoAll(): boolean {\n this.initGlobalUndoManager();\n return (this._globalUndoManager?.redoStack.length ?? 0) > 0;\n }\n\n // Enable history tracking (called for IndexedDB and Cloud modes)\n private enableHistory(options?: HistoryOptions): void {\n if (this._historyEnabled) {\n return;\n }\n\n this._historyEnabled = true;\n if (options) {\n this._historyOptions = { ...this._historyOptions, ...options };\n }\n\n // Track changes to record history\n this.rootMap.observeDeep((events: Y.YEvent<any>[]) => {\n // Determine which keys were affected\n const keysAffected = new Set<string>();\n events.forEach(event => {\n if (event.target === this.rootMap) {\n // Direct changes to rootMap\n const mapEvent = event as Y.YMapEvent<any>;\n mapEvent.keysChanged.forEach(key => keysAffected.add(key));\n } else if (event.target.parent === this.rootMap) {\n // Changes to entry maps\n for (const [key, val] of this.rootMap) {\n if (val === event.target) {\n keysAffected.add(key);\n break;\n }\n }\n }\n });\n\n if (keysAffected.size > 0) {\n const entry: HistoryEntry = {\n id: this.generateId(),\n timestamp: Date.now(),\n keysAffected: Array.from(keysAffected)\n };\n\n this._history.push(entry);\n\n // Trim old entries\n const max = this._historyOptions.maxEntries || 100;\n if (this._history.length > max) {\n this._history = this._history.slice(-max);\n }\n }\n });\n }\n\n private generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n }\n\n /**\n * Get global history of all changes (available in IndexedDB and Cloud modes)\n */\n getGlobalHistory(): HistoryEntry[] {\n return [...this._history];\n }\n\n /**\n * Check if history tracking is enabled\n */\n get historyEnabled(): boolean {\n return this._historyEnabled;\n }\n\n /**\n * Restore to a specific version (time travel)\n * Note: Full implementation requires storing update binaries, which is not yet implemented.\n * @returns false - not yet fully implemented\n */\n restoreToVersion(_versionId: string): boolean {\n console.warn('restoreToVersion: Full implementation requires storing update binaries. Not yet implemented.');\n return false;\n }\n\n get accessLevel(): AccessLevel {\n return this._accessLevel;\n }\n\n get hasSystemAccess(): boolean {\n return this._accessLevel === 'system';\n }\n\n private async _initCloud(): Promise<void> {\n if (!this._cloudConfig) {\n return;\n }\n\n // Dynamic import to avoid bundling CloudAdapter in small builds if technically possible (though explicit import used here)\n const CloudAdapter = await this._getCloudAdapterClass();\n\n if (!this._cloudConfig.baseUrl) {\n // Warning or error?\n // throw new Error('MindCache Cloud: baseUrl is required.');\n }\n\n // Ensure baseUrl is set or fallback\n const baseUrl = (this._cloudConfig.baseUrl || 'https://api.mindcache.io')\n .replace('https://', 'wss://')\n .replace('http://', 'ws://');\n\n const adapter = new CloudAdapter({\n instanceId: this._cloudConfig.instanceId,\n projectId: this._cloudConfig.projectId || 'default',\n baseUrl,\n apiKey: this._cloudConfig.apiKey\n });\n\n if (this._cloudConfig.tokenEndpoint) {\n const tokenEndpoint = this._cloudConfig.tokenEndpoint;\n const instanceId = this._cloudConfig.instanceId;\n let resolvedBaseUrl: string;\n if (tokenEndpoint.startsWith('http://') || tokenEndpoint.startsWith('https://')) {\n resolvedBaseUrl = tokenEndpoint;\n } else if (typeof window !== 'undefined' && window.location?.origin) {\n resolvedBaseUrl = `${window.location.origin}${tokenEndpoint.startsWith('/') ? '' : '/'}${tokenEndpoint}`;\n } else {\n resolvedBaseUrl = tokenEndpoint;\n }\n adapter.setTokenProvider(async () => {\n const url = resolvedBaseUrl.includes('?')\n ? `${resolvedBaseUrl}&instanceId=${instanceId}`\n : `${resolvedBaseUrl}?instanceId=${instanceId}`;\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error('Failed to get token');\n }\n const data = await response.json();\n return data.token;\n });\n }\n\n adapter.on('connected', () => {\n this._connectionState = 'connected';\n this.notifyGlobalListeners();\n });\n\n adapter.on('disconnected', () => {\n this._connectionState = 'disconnected';\n this.notifyGlobalListeners();\n });\n\n adapter.on('error', () => {\n this._connectionState = 'error';\n this.notifyGlobalListeners();\n });\n\n adapter.on('synced', () => {\n this._isLoaded = true;\n this.notifyGlobalListeners();\n });\n\n adapter.attach(this);\n this._cloudAdapter = adapter;\n this._connectionState = 'connecting';\n adapter.connect();\n }\n\n private async _initYIndexedDB(dbName: string): Promise<void> {\n if (typeof window === 'undefined') {\n return;\n }\n\n this._idbProvider = new IndexeddbPersistence(dbName, this.doc);\n return new Promise<void>(resolve => {\n if (!this._idbProvider) {\n return resolve();\n }\n this._idbProvider.on('synced', () => {\n this._isLoaded = true;\n resolve();\n });\n });\n }\n\n // Legacy IndexedDB method stub\n private async _initIndexedDB(_config: MindCacheIndexedDBOptions): Promise<void> {\n // Replaced by Y-IndexedDB in constructor\n }\n\n protected async _getIndexedDBAdapterClass(): Promise<any> {\n // Legacy support\n const { IndexedDBAdapter } = await import('../local/IndexedDBAdapter');\n return IndexedDBAdapter;\n }\n\n get connectionState(): ConnectionState {\n return this._connectionState;\n }\n\n get isLoaded(): boolean {\n return this._isLoaded;\n }\n\n protected async _getCloudAdapterClass(): Promise<any> {\n const { CloudAdapter } = await import('../cloud/CloudAdapter');\n return CloudAdapter;\n }\n\n get isCloud(): boolean {\n return this._cloudConfig !== null;\n }\n\n async waitForSync(): Promise<void> {\n if (this._isLoaded) {\n return;\n }\n if (this._initPromise) {\n await this._initPromise;\n }\n if (this._isLoaded) {\n return;\n }\n\n // Poll or wait for event?\n // Simple version:\n return new Promise<void>((resolve) => {\n if (this._isLoaded) {\n return resolve();\n }\n // A bit hacky, but robust enough for now\n const interval = setInterval(() => {\n if (this._isLoaded) {\n clearInterval(interval);\n resolve();\n }\n }, 100);\n });\n }\n\n disconnect(): void {\n if (this._cloudAdapter) {\n this._cloudAdapter.disconnect();\n this._cloudAdapter.detach();\n this._cloudAdapter = null;\n this._connectionState = 'disconnected';\n }\n if (this._idbProvider) {\n this._idbProvider.destroy();\n this._idbProvider = null;\n }\n }\n\n // Legacy bridge\n isRemoteUpdate(): boolean {\n return false;\n }\n\n // Serialize state\n serialize(): STM {\n const json: STM = {};\n for (const [key, val] of this.rootMap) {\n const entryMap = val as Y.Map<any>;\n const attrs = entryMap.get('attributes') as KeyAttributes;\n let value = entryMap.get('value');\n\n // Convert Y.Text to string for serialization\n if (attrs?.type === 'document' && value instanceof Y.Text) {\n value = value.toString();\n }\n\n json[key] = {\n value,\n attributes: attrs\n };\n }\n return json;\n }\n\n // Deserialize state (for IndexedDBAdapter compatibility)\n deserialize(data: STM): void {\n this.doc.transact(() => {\n for (const [key, entry] of Object.entries(data)) {\n if (key.startsWith('$')) {\n continue;\n } // Skip reserved keys\n let entryMap = this.rootMap.get(key);\n if (!entryMap) {\n entryMap = new Y.Map();\n this.rootMap.set(key, entryMap);\n }\n entryMap.set('value', entry.value);\n entryMap.set('attributes', entry.attributes);\n }\n });\n }\n\n private encodeFileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n if (typeof FileReader !== 'undefined') {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result as string;\n const base64Data = result.split(',')[1];\n resolve(base64Data);\n };\n reader.onerror = reject;\n reader.readAsDataURL(file);\n } else {\n reject(new Error('FileReader not available in Node.js environment. Use set_base64() method instead.'));\n }\n });\n }\n\n private createDataUrl(base64Data: string, contentType: string): string {\n return `data:${contentType};base64,${base64Data}`;\n }\n\n private validateContentType(type: KeyAttributes['type'], contentType?: string): boolean {\n if (type === 'text' || type === 'json') {\n return true;\n }\n if (!contentType) {\n return false;\n }\n if (type === 'image') {\n return contentType.startsWith('image/');\n }\n if (type === 'file') {\n return true;\n }\n return false;\n }\n\n // InjectSTM replacement\n private injectSTM(template: string, _processingStack: Set<string>): string {\n return template.replace(/\\{\\{([^}]+)\\}\\}/g, (_, key) => {\n const val = this.get_value(key.trim(), _processingStack);\n return val !== undefined ? String(val) : `{{${key}}}`;\n });\n }\n\n // Public API Methods\n\n getAll(): STM {\n return this.serialize();\n }\n\n get_value(key: string, _processingStack?: Set<string>): any {\n if (key === '$date') {\n const today = new Date();\n return today.toISOString().split('T')[0];\n }\n if (key === '$time') {\n const now = new Date();\n return now.toTimeString().split(' ')[0];\n }\n if (key === '$version') {\n return this.version;\n }\n\n const entryMap = this.rootMap.get(key);\n if (!entryMap) {\n return undefined;\n }\n\n const attributes = entryMap.get('attributes') as KeyAttributes;\n const value = entryMap.get('value');\n\n // For document type, return plain text representation\n if (attributes?.type === 'document' && value instanceof Y.Text) {\n return value.toString();\n }\n\n // Recursion check for templates\n if (_processingStack && _processingStack.has(key)) {\n return `{{${key}}}`; // Break cycle\n }\n\n // Apply Template Logic\n if (attributes?.systemTags?.includes('ApplyTemplate') || attributes?.systemTags?.includes('template') || attributes?.template) {\n if (typeof value === 'string') {\n const stack = _processingStack || new Set();\n stack.add(key);\n return this.injectSTM(value, stack);\n }\n }\n return value;\n }\n\n get_attributes(key: string): KeyAttributes | undefined {\n if (key === '$date' || key === '$time' || key === '$version') {\n return {\n type: 'text',\n contentTags: [],\n systemTags: ['prompt', 'readonly', 'protected'],\n zIndex: 999999,\n readonly: true,\n visible: true,\n hardcoded: true,\n template: false,\n tags: []\n };\n }\n const entryMap = this.rootMap.get(key);\n return entryMap ? entryMap.get('attributes') : undefined;\n }\n\n set_value(key: string, value: any, attributes?: Partial<KeyAttributes>): void {\n if (key === '$date' || key === '$time' || key === '$version') {\n return;\n }\n\n // For existing document type keys, use diff-based replace\n const existingEntry = this.rootMap.get(key);\n if (existingEntry) {\n const existingAttrs = existingEntry.get('attributes') as KeyAttributes;\n if (existingAttrs?.type === 'document') {\n // Route to replace_document_text for smart diff handling\n if (typeof value === 'string') {\n this.replace_document_text(key, value);\n }\n return;\n }\n }\n\n // Check if we need to create a new entry (outside transaction for UndoManager setup)\n let entryMap = this.rootMap.get(key);\n const isNewEntry = !entryMap;\n\n if (isNewEntry) {\n // Create and attach to rootMap first (so UndoManager can be attached)\n entryMap = new Y.Map();\n this.rootMap.set(key, entryMap);\n }\n\n // Ensure UndoManager exists BEFORE making changes\n this.getUndoManager(key);\n\n // Now make changes inside a transaction (these will be tracked)\n this.doc.transact(() => {\n const oldAttributes = isNewEntry\n ? {\n ...DEFAULT_KEY_ATTRIBUTES,\n contentTags: [],\n systemTags: ['SystemPrompt', 'LLMWrite'] as SystemTag[],\n tags: [],\n zIndex: 0\n }\n : entryMap!.get('attributes');\n\n const finalAttributes = attributes ? { ...oldAttributes, ...attributes } : oldAttributes;\n\n let normalizedAttributes = { ...finalAttributes };\n if (finalAttributes.systemTags) {\n normalizedAttributes.systemTags = this.normalizeSystemTags(finalAttributes.systemTags);\n }\n if (finalAttributes.template) {\n if (!normalizedAttributes.systemTags.includes('template')) {\n normalizedAttributes.systemTags.push('template');\n }\n }\n\n entryMap!.set('value', value);\n entryMap!.set('attributes', normalizedAttributes);\n });\n }\n\n delete_key(key: string): void {\n if (key === '$date' || key === '$time') {\n return;\n }\n this.rootMap.delete(key);\n }\n\n clear(): void {\n const keys = Array.from(this.rootMap.keys());\n this.doc.transact(() => {\n keys.forEach(k => this.rootMap.delete(k));\n });\n }\n\n // File methods\n async set_file(key: string, file: File, attributes?: Partial<KeyAttributes>): Promise<void> {\n const base64 = await this.encodeFileToBase64(file);\n const dataUrl = this.createDataUrl(base64, file.type);\n\n this.set_value(key, dataUrl, {\n ...attributes,\n type: 'file',\n contentType: file.type\n });\n }\n\n set_image(key: string, file: File, attributes?: Partial<KeyAttributes>): Promise<void> {\n return this.set_file(key, file, {\n ...attributes,\n type: 'image' // Override to image\n });\n }\n\n // Document methods for collaborative editing\n\n /**\n * Create or get a collaborative document key.\n * Uses Y.Text for character-level concurrent editing.\n *\n * Note: This exposes Yjs Y.Text directly for editor bindings (y-quill, y-codemirror, etc.)\n */\n set_document(key: string, initialText?: string, attributes?: Partial<KeyAttributes>): void {\n if (key === '$date' || key === '$time' || key === '$version') {\n return;\n }\n\n let entryMap = this.rootMap.get(key);\n\n if (!entryMap) {\n entryMap = new Y.Map();\n this.rootMap.set(key, entryMap);\n\n // Create Y.Text for collaborative editing\n const yText = new Y.Text(initialText || '');\n entryMap.set('value', yText);\n entryMap.set('attributes', {\n ...DEFAULT_KEY_ATTRIBUTES,\n type: 'document',\n contentTags: [],\n systemTags: ['SystemPrompt', 'LLMWrite'],\n tags: [],\n zIndex: 0,\n ...attributes\n });\n }\n\n // Ensure UndoManager for this key\n this.getUndoManager(key);\n }\n\n /**\n * Get the Y.Text object for a document key.\n * Use this to bind to editors (Quill, CodeMirror, Monaco, etc.)\n *\n * @returns Y.Text or undefined if key doesn't exist or isn't a document\n */\n get_document(key: string): Y.Text | undefined {\n const entryMap = this.rootMap.get(key);\n if (!entryMap) {\n return undefined;\n }\n\n const attrs = entryMap.get('attributes') as KeyAttributes;\n if (attrs?.type !== 'document') {\n return undefined;\n }\n\n const value = entryMap.get('value');\n if (value instanceof Y.Text) {\n return value;\n }\n\n return undefined;\n }\n\n /**\n * Get plain text content of a document key.\n * For collaborative editing, use get_document() and bind to an editor.\n */\n get_document_text(key: string): string | undefined {\n const yText = this.get_document(key);\n return yText?.toString();\n }\n\n /**\n * Insert text at a position in a document key.\n */\n insert_text(key: string, index: number, text: string): void {\n const yText = this.get_document(key);\n if (yText) {\n yText.insert(index, text);\n }\n }\n\n /**\n * Delete text from a document key.\n */\n delete_text(key: string, index: number, length: number): void {\n const yText = this.get_document(key);\n if (yText) {\n yText.delete(index, length);\n }\n }\n\n /**\n * Replace all text in a document key.\n * Uses diff-based updates when changes are < diffThreshold (default 80%).\n * This preserves concurrent edits and provides better undo granularity.\n *\n * @param key - The document key\n * @param newText - The new text content\n * @param diffThreshold - Percentage (0-1) of change above which full replace is used (default: 0.8)\n */\n replace_document_text(key: string, newText: string, diffThreshold = 0.8): void {\n const yText = this.get_document(key);\n if (!yText) {\n return;\n }\n\n const oldText = yText.toString();\n\n // If same content, do nothing\n if (oldText === newText) {\n return;\n }\n\n // If empty, just insert\n if (oldText.length === 0) {\n yText.insert(0, newText);\n return;\n }\n\n // Compute diff\n const diffs = diff(oldText, newText);\n\n // Calculate change ratio\n let changedChars = 0;\n for (const [op, text] of diffs) {\n if (op !== 0) {\n changedChars += text.length;\n }\n }\n const changeRatio = changedChars / Math.max(oldText.length, newText.length);\n\n // If too many changes, do full replace (more efficient)\n if (changeRatio > diffThreshold) {\n this.doc.transact(() => {\n yText.delete(0, yText.length);\n yText.insert(0, newText);\n });\n return;\n }\n\n // Apply incremental diff operations\n this.doc.transact(() => {\n let cursor = 0;\n for (const [op, text] of diffs) {\n if (op === 0) {\n // Equal - move cursor\n cursor += text.length;\n } else if (op === -1) {\n // Delete\n yText.delete(cursor, text.length);\n } else if (op === 1) {\n // Insert\n yText.insert(cursor, text);\n cursor += text.length;\n }\n }\n });\n }\n\n // ... (subscribe methods)\n subscribe(key: string, listener: Listener): () => void {\n if (!this.listeners[key]) {\n this.listeners[key] = [];\n }\n this.listeners[key].push(listener);\n return () => {\n this.listeners[key] = this.listeners[key].filter(l => l !== listener);\n };\n }\n\n subscribeToAll(listener: GlobalListener): () => void {\n this.globalListeners.push(listener);\n return () => {\n this.globalListeners = this.globalListeners.filter(l => l !== listener);\n };\n }\n\n unsubscribeFromAll(listener: GlobalListener): void {\n this.globalListeners = this.globalListeners.filter(l => l !== listener);\n }\n\n private notifyGlobalListeners(): void {\n this.globalListeners.forEach(l => l());\n }\n\n // Sanitize key name for use in tool names\n private sanitizeKeyForTool(key: string): string {\n return key.replace(/[^a-zA-Z0-9_-]/g, '_');\n }\n\n // Find original key from sanitized tool name\n private findKeyFromSanitizedTool(sanitizedKey: string): string | undefined {\n for (const [key] of this.rootMap) {\n if (this.sanitizeKeyForTool(key) === sanitizedKey) {\n return key;\n }\n }\n return undefined;\n }\n\n /**\n * Generate Vercel AI SDK compatible tools for writable keys.\n * For document type keys, generates additional tools: append_, insert_, edit_\n */\n get_aisdk_tools(): Record<string, any> {\n const tools: Record<string, any> = {};\n\n for (const [key, val] of this.rootMap) {\n // Skip system keys\n if (key.startsWith('$')) {\n continue;\n }\n\n const entryMap = val as Y.Map<any>;\n const attributes = entryMap.get('attributes') as KeyAttributes;\n\n // Check if key has LLMWrite access (writable by LLM)\n const isWritable = !attributes?.readonly &&\n (attributes?.systemTags?.includes('LLMWrite') || !attributes?.systemTags);\n\n if (!isWritable) {\n continue;\n }\n\n const sanitizedKey = this.sanitizeKeyForTool(key);\n const isDocument = attributes?.type === 'document';\n\n // 1. write_ tool (for all writable keys)\n tools[`write_${sanitizedKey}`] = {\n description: isDocument\n ? `Rewrite the entire \"${key}\" document`\n : `Write a value to the STM key: ${key}`,\n inputSchema: {\n type: 'object',\n properties: {\n value: { type: 'string', description: isDocument ? 'New document content' : 'The value to write' }\n },\n required: ['value']\n },\n execute: async ({ value }: { value: any }) => {\n if (isDocument) {\n this.replace_document_text(key, value);\n } else {\n this.set_value(key, value);\n }\n return {\n result: `Successfully wrote \"${value}\" to ${key}`,\n key,\n value\n };\n }\n };\n\n // For document type, add additional tools\n if (isDocument) {\n // 2. append_ tool\n tools[`append_${sanitizedKey}`] = {\n description: `Append text to the end of \"${key}\" document`,\n inputSchema: {\n type: 'object',\n properties: {\n text: { type: 'string', description: 'Text to append' }\n },\n required: ['text']\n },\n execute: async ({ text }: { text: string }) => {\n const yText = this.get_document(key);\n if (yText) {\n yText.insert(yText.length, text);\n return {\n result: `Successfully appended to ${key}`,\n key,\n appended: text\n };\n }\n return { result: `Document ${key} not found`, key };\n }\n };\n\n // 3. insert_ tool\n tools[`insert_${sanitizedKey}`] = {\n description: `Insert text at a position in \"${key}\" document`,\n inputSchema: {\n type: 'object',\n properties: {\n index: { type: 'number', description: 'Position to insert at (0 = start)' },\n text: { type: 'string', description: 'Text to insert' }\n },\n required: ['index', 'text']\n },\n execute: async ({ index, text }: { index: number; text: string }) => {\n this.insert_text(key, index, text);\n return {\n result: `Successfully inserted text at position ${index} in ${key}`,\n key,\n index,\n inserted: text\n };\n }\n };\n\n // 4. edit_ tool (find and replace)\n tools[`edit_${sanitizedKey}`] = {\n description: `Find and replace text in \"${key}\" document`,\n inputSchema: {\n type: 'object',\n properties: {\n find: { type: 'string', description: 'Text to find' },\n replace: { type: 'string', description: 'Replacement text' }\n },\n required: ['find', 'replace']\n },\n execute: async ({ find, replace }: { find: string; replace: string }) => {\n const yText = this.get_document(key);\n if (yText) {\n const text = yText.toString();\n const idx = text.indexOf(find);\n if (idx !== -1) {\n yText.delete(idx, find.length);\n yText.insert(idx, replace);\n return {\n result: `Successfully replaced \"${find}\" with \"${replace}\" in ${key}`,\n key,\n find,\n replace,\n index: idx\n };\n }\n return { result: `Text \"${find}\" not found in ${key}`, key };\n }\n return { result: `Document ${key} not found`, key };\n }\n };\n }\n }\n\n return tools;\n }\n\n /**\n * Generate a system prompt containing all visible STM keys and their values.\n * Indicates which tools can be used to modify writable keys.\n */\n get_system_prompt(): string {\n const lines: string[] = [];\n\n for (const [key, val] of this.rootMap) {\n // Skip system keys for now, add them at the end\n if (key.startsWith('$')) {\n continue;\n }\n\n const entryMap = val as Y.Map<any>;\n const attributes = entryMap.get('attributes') as KeyAttributes;\n\n // Check visibility\n const isVisible = attributes?.visible !== false &&\n (attributes?.systemTags?.includes('prompt') ||\n attributes?.systemTags?.includes('SystemPrompt') ||\n !attributes?.systemTags);\n\n if (!isVisible) {\n continue;\n }\n\n const value = this.get_value(key);\n const displayValue = typeof value === 'object' ? JSON.stringify(value) : value;\n\n // Check if writable\n const isWritable = !attributes?.readonly &&\n (attributes?.systemTags?.includes('LLMWrite') || !attributes?.systemTags);\n\n const isDocument = attributes?.type === 'document';\n const sanitizedKey = this.sanitizeKeyForTool(key);\n\n if (isWritable) {\n if (isDocument) {\n lines.push(`${key}: ${displayValue}. Document tools: write_${sanitizedKey}, append_${sanitizedKey}, edit_${sanitizedKey}`);\n } else {\n const oldValueHint = displayValue ? ` This tool DOES NOT append — start your response with the old value (${displayValue})` : '';\n lines.push(`${key}: ${displayValue}. You can rewrite \"${key}\" by using the write_${sanitizedKey} tool.${oldValueHint}`);\n }\n } else {\n lines.push(`${key}: ${displayValue}`);\n }\n }\n\n // Add temporal keys\n lines.push(`$date: ${this.get_value('$date')}`);\n lines.push(`$time: ${this.get_value('$time')}`);\n\n return lines.join(', ');\n }\n\n /**\n * Execute a tool call by name with the given value.\n * Returns the result or null if tool not found.\n */\n executeToolCall(toolName: string, value: any): { result: string; key: string; value?: any } | null {\n // Parse tool name (format: action_keyname)\n const match = toolName.match(/^(write|append|insert|edit)_(.+)$/);\n if (!match) {\n return null;\n }\n\n const [, action, sanitizedKey] = match;\n const key = this.findKeyFromSanitizedTool(sanitizedKey);\n\n if (!key) {\n return null;\n }\n\n const entryMap = this.rootMap.get(key);\n if (!entryMap) {\n return null;\n }\n\n const attributes = entryMap.get('attributes') as KeyAttributes;\n\n // Check if writable\n const isWritable = !attributes?.readonly &&\n (attributes?.systemTags?.includes('LLMWrite') || !attributes?.systemTags);\n\n if (!isWritable) {\n return null;\n }\n\n const isDocument = attributes?.type === 'document';\n\n switch (action) {\n case 'write':\n if (isDocument) {\n this.replace_document_text(key, value);\n } else {\n this.set_value(key, value);\n }\n return {\n result: `Successfully wrote \"${value}\" to ${key}`,\n key,\n value\n };\n\n case 'append':\n if (isDocument) {\n const yText = this.get_document(key);\n if (yText) {\n yText.insert(yText.length, value);\n return {\n result: `Successfully appended to ${key}`,\n key,\n value\n };\n }\n }\n return null;\n\n case 'insert':\n if (isDocument && typeof value === 'object' && value.index !== undefined && value.text) {\n this.insert_text(key, value.index, value.text);\n return {\n result: `Successfully inserted at position ${value.index} in ${key}`,\n key,\n value: value.text\n };\n }\n return null;\n\n case 'edit':\n if (isDocument && typeof value === 'object' && value.find && value.replace !== undefined) {\n const yText = this.get_document(key);\n if (yText) {\n const text = yText.toString();\n const idx = text.indexOf(value.find);\n if (idx !== -1) {\n yText.delete(idx, value.find.length);\n yText.insert(idx, value.replace);\n return {\n result: `Successfully replaced \"${value.find}\" with \"${value.replace}\" in ${key}`,\n key,\n value: value.replace\n };\n }\n }\n }\n return null;\n\n default:\n return null;\n }\n }\n\n // Internal method stub for legacy compatibility\n _setFromRemote(_key: string, _value: any, _attributes: KeyAttributes): void {\n // Legacy - no op as Yjs handles it\n }\n _deleteFromRemote(_key: string): void {\n // Legacy - no op as Yjs handles it\n }\n _clearFromRemote(): void {\n // Legacy - no op as Yjs handles it\n }\n}\n","import { MindCache } from '../core/MindCache';\nimport { CloudAdapter } from './CloudAdapter';\nimport type { CloudConfig } from './types';\n\nexport { CloudAdapter } from './CloudAdapter';\nexport type {\n CloudConfig,\n ConnectionState,\n CloudAdapterEvents,\n Operation,\n SetOperation,\n DeleteOperation,\n ClearOperation\n} from './types';\n\n/**\n * Connect a MindCache instance to the cloud for real-time sync.\n *\n * @example\n * ```typescript\n * import { MindCache } from 'mindcache';\n * import { connectCloud } from 'mindcache/cloud';\n *\n * const mc = new MindCache();\n * const adapter = connectCloud(mc, {\n * projectId: 'my-project',\n * instanceId: 'main',\n * apiKey: 'mc_live_xxxxx'\n * });\n *\n * // Now mc is synced with the cloud!\n * mc.set_value('name', 'Alice');\n * ```\n */\nexport function connectCloud(mc: MindCache, config: CloudConfig): CloudAdapter {\n const adapter = new CloudAdapter(config);\n adapter.attach(mc);\n adapter.connect();\n return adapter;\n}\n\n/**\n * Create a new MindCache instance that's already connected to the cloud.\n *\n * @example\n * ```typescript\n * import { createCloudMindCache } from 'mindcache/cloud';\n *\n * const mc = createCloudMindCache({\n * projectId: 'my-project',\n * instanceId: 'main',\n * apiKey: 'mc_live_xxxxx'\n * });\n *\n * // Ready to use with cloud sync!\n * mc.set_value('name', 'Alice');\n * ```\n */\nexport function createCloudMindCache(config: CloudConfig): MindCache & { adapter: CloudAdapter } {\n const mc = new MindCache();\n const adapter = connectCloud(mc, config);\n\n // Attach adapter to the instance for access\n return Object.assign(mc, { adapter });\n}\n\n"]}