mindcache 3.1.0 → 3.3.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.
- package/dist/{CloudAdapter-Bx-ITNdi.d.mts → CloudAdapter-CSncOr3V.d.mts} +168 -4
- package/dist/{CloudAdapter-Bx-ITNdi.d.ts → CloudAdapter-CSncOr3V.d.ts} +168 -4
- package/dist/cloud/index.d.mts +2 -2
- package/dist/cloud/index.d.ts +2 -2
- package/dist/cloud/index.js +722 -16
- package/dist/cloud/index.js.map +1 -1
- package/dist/cloud/index.mjs +722 -16
- package/dist/cloud/index.mjs.map +1 -1
- package/dist/index.d.mts +5 -3
- package/dist/index.d.ts +5 -3
- package/dist/index.js +726 -16
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +726 -17
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -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","../src/local/index.ts","../src/react/useMindCache.ts"],"names":["IndexedDBAdapter","CloudAdapter","encoding","syncProtocol","decoding","Y","IndexeddbPersistence","length","diff","useState","useRef","useEffect"],"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","export { IndexedDBAdapter } from './IndexedDBAdapter';\nexport type { IndexedDBConfig } from './IndexedDBAdapter';\n","'use client';\n\nimport { useState, useEffect, useRef } from 'react';\nimport { MindCache, type MindCacheOptions } from '../core/MindCache';\n\nexport interface UseMindCacheResult {\n /** The MindCache instance, null until loaded */\n mindcache: MindCache | null;\n /** Whether the MindCache is fully loaded and ready to use */\n isLoaded: boolean;\n /** Any error that occurred during initialization */\n error: Error | null;\n}\n\n/**\n * React hook for using MindCache with automatic lifecycle management.\n *\n * Handles async initialization (IndexedDB/Cloud) and provides loading state.\n * The MindCache instance is created once and persists across re-renders.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { mindcache, isLoaded } = useMindCache({\n * indexedDB: { dbName: 'my-app' }\n * });\n *\n * if (!isLoaded) return <Loading />;\n *\n * return <div>{mindcache.get_value('key')}</div>;\n * }\n * ```\n */\nexport function useMindCache(options?: MindCacheOptions): UseMindCacheResult {\n const [isLoaded, setIsLoaded] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mindcacheRef = useRef<MindCache | null>(null);\n const initializingRef = useRef(false);\n\n useEffect(() => {\n // Prevent double initialization in React StrictMode\n if (initializingRef.current) {\n return;\n }\n initializingRef.current = true;\n\n const initialize = async () => {\n try {\n const mc = new MindCache(options);\n mindcacheRef.current = mc;\n\n await mc.waitForSync();\n setIsLoaded(true);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n // Still mark as loaded so the component can handle the error\n setIsLoaded(true);\n }\n };\n\n initialize();\n\n // Cleanup on unmount\n return () => {\n if (mindcacheRef.current) {\n mindcacheRef.current.disconnect();\n }\n };\n }, []); // Empty deps - only run once\n\n return {\n mindcache: mindcacheRef.current,\n isLoaded,\n error\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","../src/local/index.ts","../src/react/useMindCache.ts","../src/index.ts"],"names":["IndexedDBAdapter","CloudAdapter","encoding","syncProtocol","decoding","Y","IndexeddbPersistence","length","diff","useState","useRef","useEffect"],"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 } else {\n // Log unhandled message types for debugging (not an error, just informational)\n console.debug('MindCache Cloud: Received message type:', msg.type, msg);\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 * Type of value stored in a MindCache key\n */\nexport type KeyType = 'text' | 'image' | 'file' | 'json' | 'document';\n\n/**\n * Attributes that can be set on a MindCache key\n */\nexport interface KeyAttributes {\n /** The type of value stored */\n type: KeyType;\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 /** Function to fetch token dynamically (overrides tokenEndpoint) */\n tokenProvider?: () => Promise<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 }\n // If neither readonly nor LLMWrite is set, that's fine - key is readable but not LLM-writable\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 to production\n const baseUrl = (this._cloudConfig.baseUrl || 'https://api.mindcache.dev')\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.tokenProvider) {\n adapter.setTokenProvider(this._cloudConfig.tokenProvider);\n } else 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 if (!data || typeof data !== 'object') {\n return; // Handle null/undefined gracefully\n }\n this.doc.transact(() => {\n // Clear existing data first\n for (const key of this.rootMap.keys()) {\n this.rootMap.delete(key);\n }\n // Then load new data\n for (const [key, entry] of Object.entries(data)) {\n if (key.startsWith('$')) {\n continue;\n } // Skip reserved keys\n const entryMap = new Y.Map();\n this.rootMap.set(key, entryMap);\n entryMap.set('value', entry.value);\n // Normalize attributes (fill in missing fields with defaults)\n const attrs = entry.attributes || {};\n const normalizedAttrs: KeyAttributes = {\n type: attrs.type || 'text',\n contentTags: attrs.contentTags || [],\n systemTags: attrs.systemTags || this.normalizeSystemTags(attrs.visible !== false ? ['prompt'] : []),\n zIndex: attrs.zIndex ?? 0,\n // Legacy fields\n readonly: attrs.readonly ?? false,\n visible: attrs.visible ?? true,\n hardcoded: attrs.hardcoded ?? false,\n template: attrs.template ?? false,\n tags: attrs.tags || [],\n contentType: attrs.contentType\n };\n entryMap.set('attributes', normalizedAttrs);\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 (private helper)\n private _injectSTMInternal(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 /**\n * Replace {{key}} placeholders in a template string with values from MindCache.\n * @param template The template string with {{key}} placeholders\n * @returns The template with placeholders replaced by values\n */\n injectSTM(template: string): string {\n return this._injectSTMInternal(template, new Set());\n }\n\n // Public API Methods\n\n getAll(): Record<string, any> {\n const result: Record<string, any> = {};\n for (const [key] of this.rootMap) {\n result[key] = this.get_value(key);\n }\n // Add temporal keys\n result['$date'] = this.get_value('$date');\n result['$time'] = this.get_value('$time');\n return result;\n }\n\n /**\n * Get all entries with their full structure (value + attributes).\n * Use this for UI/admin interfaces that need to display key properties.\n * Unlike serialize(), this format is stable and won't change.\n */\n getAllEntries(): STM {\n const result: STM = {};\n for (const [key] of this.rootMap) {\n const value = this.get_value(key);\n const attributes = this.get_attributes(key);\n if (attributes) {\n result[key] = { value, attributes };\n }\n }\n return result;\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._injectSTMInternal(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 /**\n * Update only the attributes of a key without modifying the value.\n * Useful for updating tags, permissions etc. on document type keys.\n */\n set_attributes(key: string, attributes: Partial<KeyAttributes>): void {\n if (key === '$date' || key === '$time' || key === '$version') {\n return;\n }\n\n const entryMap = this.rootMap.get(key);\n if (!entryMap) {\n return; // Key doesn't exist\n }\n\n this.doc.transact(() => {\n const existingAttrs = entryMap.get('attributes') as KeyAttributes;\n const mergedAttrs = { ...existingAttrs, ...attributes };\n\n // Normalize system tags\n if (mergedAttrs.systemTags) {\n mergedAttrs.systemTags = this.normalizeSystemTags(mergedAttrs.systemTags);\n }\n\n entryMap.set('attributes', mergedAttrs);\n });\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 // ============================================\n // Restored Methods (from v2.x)\n // ============================================\n\n /**\n * Check if a key exists in MindCache.\n */\n has(key: string): boolean {\n if (key === '$date' || key === '$time' || key === '$version') {\n return true;\n }\n return this.rootMap.has(key);\n }\n\n /**\n * Delete a key from MindCache.\n * @returns true if the key existed and was deleted\n */\n delete(key: string): boolean {\n if (key === '$date' || key === '$time' || key === '$version') {\n return false;\n }\n if (!this.rootMap.has(key)) {\n return false;\n }\n this.rootMap.delete(key);\n this.notifyGlobalListeners();\n if (this.listeners[key]) {\n this.listeners[key].forEach(listener => listener(undefined));\n }\n return true;\n }\n\n /** @deprecated Use get_value instead */\n get(key: string): any {\n return this.get_value(key);\n }\n\n /** @deprecated Use set_value instead */\n set(key: string, value: any): void {\n this.set_value(key, value);\n }\n\n /**\n * Update multiple values at once from an object.\n * @deprecated Use set_value for individual keys\n */\n update(data: Record<string, any>): void {\n this.doc.transact(() => {\n for (const [key, value] of Object.entries(data)) {\n if (key !== '$date' && key !== '$time' && key !== '$version') {\n this.set_value(key, value);\n }\n }\n });\n this.notifyGlobalListeners();\n }\n\n /**\n * Get the number of keys in MindCache.\n */\n size(): number {\n // Include temporal keys in count\n return this.rootMap.size + 2; // +2 for $date and $time\n }\n\n /**\n * Get all keys in MindCache (including temporal keys).\n */\n keys(): string[] {\n const keys = Array.from(this.rootMap.keys());\n keys.push('$date', '$time');\n return keys;\n }\n\n /**\n * Get all values in MindCache (including temporal values).\n */\n values(): any[] {\n const result: any[] = [];\n for (const [key] of this.rootMap) {\n result.push(this.get_value(key));\n }\n // Add temporal values\n result.push(this.get_value('$date'));\n result.push(this.get_value('$time'));\n return result;\n }\n\n /**\n * Get all key-value entries (including temporal entries).\n */\n entries(): Array<[string, any]> {\n const result: Array<[string, any]> = [];\n for (const [key] of this.rootMap) {\n result.push([key, this.get_value(key)]);\n }\n // Add temporal entries\n result.push(['$date', this.get_value('$date')]);\n result.push(['$time', this.get_value('$time')]);\n return result;\n }\n\n /**\n * Unsubscribe from key changes.\n * @deprecated Use the cleanup function returned by subscribe() instead\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 /**\n * Get the STM as a formatted string for LLM context.\n * @deprecated Use get_system_prompt() instead\n */\n getSTM(): string {\n return this.get_system_prompt();\n }\n\n /**\n * Get the STM as an object with values directly (no attributes).\n * Includes system keys ($date, $time).\n * @deprecated Use getAll() for full STM format\n */\n getSTMObject(): Record<string, any> {\n const result: Record<string, any> = {};\n for (const [key] of this.rootMap) {\n result[key] = this.get_value(key);\n }\n // Add system keys\n result['$date'] = this.get_value('$date');\n result['$time'] = this.get_value('$time');\n return result;\n }\n\n /**\n * Add a content tag to a key.\n * @returns true if the tag was added, false if key doesn't exist or tag already exists\n */\n addTag(key: string, tag: string): boolean {\n if (key === '$date' || key === '$time' || key === '$version') {\n return false;\n }\n\n const entryMap = this.rootMap.get(key);\n if (!entryMap) {\n return false;\n }\n\n const attributes = entryMap.get('attributes') as KeyAttributes;\n const contentTags = attributes?.contentTags || [];\n\n if (contentTags.includes(tag)) {\n return false;\n }\n\n this.doc.transact(() => {\n const newContentTags = [...contentTags, tag];\n entryMap.set('attributes', {\n ...attributes,\n contentTags: newContentTags,\n tags: newContentTags // Sync legacy tags array\n });\n });\n\n this.notifyGlobalListeners();\n return true;\n }\n\n /**\n * Remove a content tag from a key.\n * @returns true if the tag was removed\n */\n removeTag(key: string, tag: string): boolean {\n if (key === '$date' || key === '$time' || key === '$version') {\n return false;\n }\n\n const entryMap = this.rootMap.get(key);\n if (!entryMap) {\n return false;\n }\n\n const attributes = entryMap.get('attributes') as KeyAttributes;\n const contentTags = attributes?.contentTags || [];\n const tagIndex = contentTags.indexOf(tag);\n\n if (tagIndex === -1) {\n return false;\n }\n\n this.doc.transact(() => {\n const newContentTags = contentTags.filter((t: string) => t !== tag);\n entryMap.set('attributes', {\n ...attributes,\n contentTags: newContentTags,\n tags: newContentTags // Sync legacy tags array\n });\n });\n\n this.notifyGlobalListeners();\n return true;\n }\n\n /**\n * Get all content tags for a key.\n */\n getTags(key: string): string[] {\n if (key === '$date' || key === '$time' || key === '$version') {\n return [];\n }\n\n const entryMap = this.rootMap.get(key);\n if (!entryMap) {\n return [];\n }\n\n const attributes = entryMap.get('attributes') as KeyAttributes;\n return 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 for (const [, val] of this.rootMap) {\n const entryMap = val as Y.Map<any>;\n const attributes = entryMap.get('attributes') as KeyAttributes;\n if (attributes?.contentTags) {\n attributes.contentTags.forEach((tag: string) => 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' || key === '$version') {\n return false;\n }\n\n const entryMap = this.rootMap.get(key);\n if (!entryMap) {\n return false;\n }\n\n const attributes = entryMap.get('attributes') as KeyAttributes;\n return 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 keys = this.getSortedKeys();\n keys.forEach(key => {\n if (this.hasTag(key, 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 array of keys with a specific content tag.\n */\n getKeysByTag(tag: string): string[] {\n const keys = this.getSortedKeys();\n return keys.filter(key => this.hasTag(key, tag));\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: 'SystemPrompt', 'LLMRead', 'LLMWrite', 'readonly', 'protected', 'ApplyTemplate'\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' || key === '$version') {\n return false;\n }\n\n const entryMap = this.rootMap.get(key);\n if (!entryMap) {\n return false;\n }\n\n const attributes = entryMap.get('attributes') as KeyAttributes;\n const systemTags = attributes?.systemTags || [];\n\n if (systemTags.includes(tag)) {\n return false;\n }\n\n this.doc.transact(() => {\n const newSystemTags = [...systemTags, tag];\n const normalizedTags = this.normalizeSystemTags(newSystemTags);\n entryMap.set('attributes', {\n ...attributes,\n systemTags: normalizedTags\n });\n });\n\n this.notifyGlobalListeners();\n return true;\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' || key === '$version') {\n return false;\n }\n\n const entryMap = this.rootMap.get(key);\n if (!entryMap) {\n return false;\n }\n\n const attributes = entryMap.get('attributes') as KeyAttributes;\n const systemTags = attributes?.systemTags || [];\n const tagIndex = systemTags.indexOf(tag);\n\n if (tagIndex === -1) {\n return false;\n }\n\n this.doc.transact(() => {\n const newSystemTags = systemTags.filter((t: SystemTag) => t !== tag);\n entryMap.set('attributes', {\n ...attributes,\n systemTags: newSystemTags\n });\n });\n\n this.notifyGlobalListeners();\n return true;\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' || key === '$version') {\n return [];\n }\n\n const entryMap = this.rootMap.get(key);\n if (!entryMap) {\n return [];\n }\n\n const attributes = entryMap.get('attributes') as KeyAttributes;\n return 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' || key === '$version') {\n return false;\n }\n\n const entryMap = this.rootMap.get(key);\n if (!entryMap) {\n return false;\n }\n\n const attributes = entryMap.get('attributes') as KeyAttributes;\n return 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' || key === '$version') {\n return false;\n }\n\n const entryMap = this.rootMap.get(key);\n if (!entryMap) {\n return false;\n }\n\n this.doc.transact(() => {\n const attributes = entryMap.get('attributes') as KeyAttributes;\n entryMap.set('attributes', {\n ...attributes,\n systemTags: [...tags]\n });\n });\n\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 keys = this.getSortedKeys();\n return keys.filter(key => this.systemHasTag(key, tag));\n }\n\n /**\n * Helper to get sorted keys (by zIndex).\n */\n private getSortedKeys(): string[] {\n const entries: Array<{ key: string; zIndex: number }> = [];\n\n for (const [key, val] of this.rootMap) {\n const entryMap = val as Y.Map<any>;\n const attributes = entryMap.get('attributes') as KeyAttributes;\n entries.push({ key, zIndex: attributes?.zIndex ?? 0 });\n }\n\n return entries\n .sort((a, b) => a.zIndex - b.zIndex)\n .map(e => e.key);\n }\n\n /**\n * Serialize to JSON string.\n */\n toJSON(): string {\n return JSON.stringify(this.serialize());\n }\n\n /**\n * Deserialize from JSON string.\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 /**\n * Export to Markdown format.\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 entryMap = this.rootMap.get(key);\n if (!entryMap) {\n return;\n }\n\n const attributes = entryMap.get('attributes') as KeyAttributes;\n const value = entryMap.get('value');\n\n if (attributes?.hardcoded) {\n return;\n }\n\n lines.push(`### ${key}`);\n const entryType = attributes?.type || 'text';\n lines.push(`- **Type**: \\`${entryType}\\``);\n lines.push(`- **Readonly**: \\`${attributes?.readonly ?? false}\\``);\n lines.push(`- **Visible**: \\`${attributes?.visible ?? true}\\``);\n lines.push(`- **Template**: \\`${attributes?.template ?? false}\\``);\n lines.push(`- **Z-Index**: \\`${attributes?.zIndex ?? 0}\\``);\n\n if (attributes?.contentTags && attributes.contentTags.length > 0) {\n lines.push(`- **Tags**: \\`${attributes.contentTags.join('`, `')}\\``);\n }\n\n if (attributes?.contentType) {\n lines.push(`- **Content Type**: \\`${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: attributes?.contentType || 'application/octet-stream',\n base64: 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 value === 'string' ? value : JSON.stringify(value, null, 2);\n lines.push(jsonValue);\n } catch {\n lines.push(String(value));\n }\n lines.push('```');\n } else {\n lines.push(`- **Value**: ${value}`);\n }\n\n lines.push('');\n });\n\n // Add appendix for binary data\n if (appendixEntries.length > 0) {\n lines.push('---');\n lines.push('');\n lines.push('## Appendix: Binary Data');\n lines.push('');\n\n appendixEntries.forEach(entry => {\n lines.push(`### Appendix ${entry.label}: ${entry.key}`);\n lines.push(`- **Type**: \\`${entry.type}\\``);\n lines.push(`- **Content Type**: \\`${entry.contentType}\\``);\n lines.push('- **Base64 Data**:');\n lines.push('```');\n lines.push(entry.base64);\n lines.push('```');\n lines.push('');\n });\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Import from Markdown format.\n */\n fromMarkdown(markdown: string): void {\n const lines = markdown.split('\\n');\n let currentKey: string | null = null;\n let currentAttributes: Partial<KeyAttributes> = {};\n let currentValue: string | null = null;\n let inCodeBlock = false;\n let codeBlockContent: string[] = [];\n const _appendixData: Record<string, string> = {};\n\n for (const line of lines) {\n // Parse key headers\n if (line.startsWith('### ') && !line.startsWith('### Appendix')) {\n // Save previous entry\n if (currentKey && currentValue !== null) {\n this.set_value(currentKey, currentValue, currentAttributes);\n }\n\n currentKey = line.substring(4).trim();\n currentAttributes = {};\n currentValue = null;\n continue;\n }\n\n // Parse appendix\n if (line.startsWith('### Appendix ')) {\n const match = line.match(/### Appendix ([A-Z]): (.+)/);\n if (match) {\n currentKey = match[2];\n }\n continue;\n }\n\n // Parse attributes\n if (line.startsWith('- **Type**:')) {\n const type = line.match(/`(.+)`/)?.[1] as KeyAttributes['type'];\n if (type) {\n currentAttributes.type = type;\n }\n continue;\n }\n if (line.startsWith('- **Readonly**:')) {\n currentAttributes.readonly = line.includes('`true`');\n continue;\n }\n if (line.startsWith('- **Visible**:')) {\n currentAttributes.visible = line.includes('`true`');\n continue;\n }\n if (line.startsWith('- **Template**:')) {\n currentAttributes.template = line.includes('`true`');\n continue;\n }\n if (line.startsWith('- **Z-Index**:')) {\n const zIndex = parseInt(line.match(/`(\\d+)`/)?.[1] || '0', 10);\n currentAttributes.zIndex = zIndex;\n continue;\n }\n if (line.startsWith('- **Tags**:')) {\n const tags = line.match(/`([^`]+)`/g)?.map(t => t.slice(1, -1)) || [];\n currentAttributes.contentTags = tags;\n currentAttributes.tags = tags;\n continue;\n }\n if (line.startsWith('- **Content Type**:')) {\n currentAttributes.contentType = line.match(/`(.+)`/)?.[1];\n continue;\n }\n if (line.startsWith('- **Value**:') && !line.includes('[See Appendix')) {\n currentValue = line.substring(12).trim();\n continue;\n }\n\n // Handle code blocks\n if (line === '```json' || line === '```') {\n if (inCodeBlock) {\n // End of code block\n inCodeBlock = false;\n if (currentKey && codeBlockContent.length > 0) {\n currentValue = codeBlockContent.join('\\n');\n }\n codeBlockContent = [];\n } else {\n inCodeBlock = true;\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeBlockContent.push(line);\n }\n }\n\n // Save last entry\n if (currentKey && currentValue !== null) {\n this.set_value(currentKey, currentValue, currentAttributes);\n }\n }\n\n /**\n * Set base64 binary data.\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 /**\n * Add an image from base64 data.\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 }\n\n /**\n * Get the data URL for an image or file key.\n */\n get_data_url(key: string): string | undefined {\n const entryMap = this.rootMap.get(key);\n if (!entryMap) {\n return undefined;\n }\n\n const attributes = entryMap.get('attributes') as KeyAttributes;\n if (attributes?.type !== 'image' && attributes?.type !== 'file') {\n return undefined;\n }\n\n if (!attributes?.contentType) {\n return undefined;\n }\n\n const value = entryMap.get('value') as string;\n return this.createDataUrl(value, attributes.contentType);\n }\n\n /**\n * Get the base64 data for an image or file key.\n */\n get_base64(key: string): string | undefined {\n const entryMap = this.rootMap.get(key);\n if (!entryMap) {\n return undefined;\n }\n\n const attributes = entryMap.get('attributes') as KeyAttributes;\n if (attributes?.type !== 'image' && attributes?.type !== 'file') {\n return undefined;\n }\n\n return entryMap.get('value') as string;\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(\n `${key}: ${displayValue}. ` +\n `Document tools: write_${sanitizedKey}, append_${sanitizedKey}, edit_${sanitizedKey}`\n );\n } else {\n const oldValueHint = displayValue\n ? ' This tool DOES NOT append — start your response ' +\n `with the old value (${displayValue})`\n : '';\n lines.push(\n `${key}: ${displayValue}. ` +\n `You can rewrite \"${key}\" by using the write_${sanitizedKey} tool.${oldValueHint}`\n );\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(\n toolName: string,\n value: any\n ): { 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","export { IndexedDBAdapter } from './IndexedDBAdapter';\nexport type { IndexedDBConfig } from './IndexedDBAdapter';\n","'use client';\n\nimport { useState, useEffect, useRef } from 'react';\nimport { MindCache, type MindCacheOptions } from '../core/MindCache';\n\nexport interface UseMindCacheResult {\n /** The MindCache instance, null until loaded */\n mindcache: MindCache | null;\n /** Whether the MindCache is fully loaded and ready to use */\n isLoaded: boolean;\n /** Any error that occurred during initialization */\n error: Error | null;\n}\n\n/**\n * React hook for using MindCache with automatic lifecycle management.\n *\n * Handles async initialization (IndexedDB/Cloud) and provides loading state.\n * The MindCache instance is created once and persists across re-renders.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { mindcache, isLoaded } = useMindCache({\n * indexedDB: { dbName: 'my-app' }\n * });\n *\n * if (!isLoaded) return <Loading />;\n *\n * return <div>{mindcache.get_value('key')}</div>;\n * }\n * ```\n */\nexport function useMindCache(options?: MindCacheOptions): UseMindCacheResult {\n const [isLoaded, setIsLoaded] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mindcacheRef = useRef<MindCache | null>(null);\n const initializingRef = useRef(false);\n\n useEffect(() => {\n // Prevent double initialization in React StrictMode\n if (initializingRef.current) {\n return;\n }\n initializingRef.current = true;\n\n const initialize = async () => {\n try {\n const mc = new MindCache(options);\n mindcacheRef.current = mc;\n\n await mc.waitForSync();\n setIsLoaded(true);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n // Still mark as loaded so the component can handle the error\n setIsLoaded(true);\n }\n };\n\n initialize();\n\n // Cleanup on unmount\n return () => {\n if (mindcacheRef.current) {\n mindcacheRef.current.disconnect();\n }\n };\n }, []); // Empty deps - only run once\n\n return {\n mindcache: mindcacheRef.current,\n isLoaded,\n error\n };\n}\n","// Core exports (MindCache 1.0 compatible)\nimport { MindCache } from './core';\nexport { MindCache } from './core';\n\n// Singleton instance for backwards compatibility\nexport const mindcache = new MindCache();\n\n// Types - import like: import { KeyAttributes, KeyType, SystemTag } from 'mindcache'\nexport type {\n KeyAttributes,\n KeyType,\n SystemTag,\n AccessLevel,\n STM,\n STMEntry,\n Listener,\n GlobalListener,\n HistoryEntry,\n HistoryOptions,\n MindCacheOptions,\n MindCacheCloudOptions,\n MindCacheIndexedDBOptions\n} from './core';\nexport { DEFAULT_KEY_ATTRIBUTES } from './core';\n\n// Cloud exports (for advanced usage)\nexport { CloudAdapter } from './cloud';\nexport type { CloudConfig, ConnectionState, CloudAdapterEvents } from './cloud';\n\n// Local Persistence exports\nexport { IndexedDBAdapter } from './local';\nexport type { IndexedDBConfig } from './local';\n\n// React exports\nexport { useMindCache } from './react';\nexport type { UseMindCacheResult } from './react';\n"]}
|