mindcache 3.4.2 → 3.4.4
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/README.md +22 -0
- package/dist/{CloudAdapter-D2xxVv4E.d.mts → CloudAdapter-DOvDQswy.d.mts} +72 -23
- package/dist/{CloudAdapter-D2xxVv4E.d.ts → CloudAdapter-DOvDQswy.d.ts} +72 -23
- package/dist/cloud/index.d.mts +2 -2
- package/dist/cloud/index.d.ts +2 -2
- package/dist/cloud/index.js +1205 -794
- package/dist/cloud/index.js.map +1 -1
- package/dist/cloud/index.mjs +1205 -794
- package/dist/cloud/index.mjs.map +1 -1
- package/dist/index.d.mts +4 -31
- package/dist/index.d.ts +4 -31
- package/dist/index.js +1205 -796
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1205 -796
- package/dist/index.mjs.map +1 -1
- package/dist/server.d.mts +33 -0
- package/dist/server.d.ts +33 -0
- package/dist/server.js +2654 -0
- package/dist/server.js.map +1 -0
- package/dist/server.mjs +2624 -0
- package/dist/server.mjs.map +1 -0
- package/docs/mindcache-api.md +148 -0
- package/package.json +8 -2
package/dist/cloud/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"],"names":["CloudAdapter","encoding","syncProtocol","decoding","Y","IndexeddbPersistence","IndexedDBAdapter","length","diff"],"mappings":"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","file":"index.js","sourcesContent":["import type { MindCache } from '../core/MindCache';\n\nexport interface IndexedDBConfig {\n /** Database name (defaults to 'mindcache_db') */\n dbName?: string;\n /** Store name (defaults to 'mindcache_store') */\n storeName?: string;\n /** Storage key (defaults to 'mindcache_data') */\n key?: string;\n /** Debounce time in ms for saving (defaults to 1000) */\n debounceMs?: number;\n}\n\nexport class IndexedDBAdapter {\n private mindcache: MindCache | null = null;\n private unsubscribe: (() => void) | null = null;\n private saveTimeout: ReturnType<typeof setTimeout> | null = null;\n private db: IDBDatabase | null = null;\n\n private dbName: string;\n private storeName: string;\n private key: string;\n\n constructor(private config: IndexedDBConfig = {}) {\n this.dbName = config.dbName || 'mindcache_db';\n this.storeName = config.storeName || 'mindcache_store';\n this.key = config.key || 'mindcache_data';\n }\n\n async attach(mc: MindCache): Promise<void> {\n if (this.mindcache) {\n this.detach();\n }\n\n this.mindcache = mc;\n await this.initDB();\n await this.load();\n\n const listener = () => {\n if (this.mindcache) {\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 _isOnline: boolean = true; // Browser network status\n private listeners: Partial<{ [K in keyof CloudAdapterEvents]: CloudAdapterEvents[K][] }> = {};\n private token: string | null = null;\n private handleOnline: (() => void) | null = null;\n private handleOffline: (() => void) | 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 // Setup browser online/offline detection\n this.setupNetworkDetection();\n }\n\n /** Browser network status - instantly updated via navigator.onLine */\n get isOnline(): boolean {\n return this._isOnline;\n }\n\n private setupNetworkDetection(): void {\n // Only run in browser environment\n if (typeof window === 'undefined' || typeof navigator === 'undefined') {\n return;\n }\n\n // Set initial state\n this._isOnline = navigator.onLine;\n\n this.handleOnline = () => {\n console.log('☁️ CloudAdapter: Network is back online');\n this._isOnline = true;\n this.emit('network_online');\n\n // If we were connected or connecting before, try to reconnect\n if (this._state === 'disconnected' || this._state === 'error') {\n this.connect();\n }\n };\n\n this.handleOffline = () => {\n console.log('☁️ CloudAdapter: Network went offline');\n this._isOnline = false;\n this.emit('network_offline');\n\n // Update state immediately instead of waiting for WS timeout\n if (this._state === 'connected' || this._state === 'connecting') {\n this._state = 'disconnected';\n this.emit('disconnected');\n }\n };\n\n window.addEventListener('online', this.handleOnline);\n window.addEventListener('offline', this.handleOffline);\n }\n\n private cleanupNetworkDetection(): void {\n if (typeof window === 'undefined') {\n return;\n }\n if (this.handleOnline) {\n window.removeEventListener('online', this.handleOnline);\n }\n if (this.handleOffline) {\n window.removeEventListener('offline', this.handleOffline);\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 // Cleanup network detection listeners\n this.cleanupNetworkDetection();\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 (visible to LLM context)\n * - 'LLMRead': LLM can read this key via tools\n * - 'LLMWrite': LLM can write to this key via tools\n * - 'protected': Cannot be deleted\n * - 'ApplyTemplate': Process value through template injection\n */\nexport type SystemTag = 'SystemPrompt' | 'LLMRead' | 'LLMWrite' | 'protected' | 'ApplyTemplate';\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\n/**\n * Default attributes for new keys\n */\nexport const DEFAULT_KEY_ATTRIBUTES: KeyAttributes = {\n type: 'text',\n contentTags: [],\n systemTags: [], // Keys are private by default - explicitly add SystemPrompt/LLMRead/LLMWrite to enable LLM access\n zIndex: 0\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 * 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/**\n * Helper functions for working with system tags\n */\nexport const SystemTagHelpers = {\n /** Check if key is writable by LLM */\n isLLMWritable: (attrs: KeyAttributes): boolean =>\n attrs.systemTags.includes('LLMWrite'),\n\n /** Check if key is readable by LLM (in context or via tools) */\n isLLMReadable: (attrs: KeyAttributes): boolean =>\n attrs.systemTags.includes('SystemPrompt') || attrs.systemTags.includes('LLMRead'),\n\n /** Check if key is included in system prompt */\n isInSystemPrompt: (attrs: KeyAttributes): boolean =>\n attrs.systemTags.includes('SystemPrompt'),\n\n /** Check if key is protected from deletion */\n isProtected: (attrs: KeyAttributes): boolean =>\n attrs.systemTags.includes('protected'),\n\n /** Check if key uses template injection */\n hasTemplateInjection: (attrs: KeyAttributes): boolean =>\n attrs.systemTags.includes('ApplyTemplate')\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 isOnline: boolean;\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.3.2';\n\n // Internal flag to prevent sync loops when receiving remote updates\n // (Less critical with Yjs but kept for API compat)\n\n\n private normalizeSystemTags(tags: SystemTag[]): SystemTag[] {\n const normalized: SystemTag[] = [];\n const seen = new Set<SystemTag>();\n\n for (const tag of tags) {\n // Only include valid SystemTag values, skip duplicates\n if (['SystemPrompt', 'LLMRead', 'LLMWrite', 'protected', 'ApplyTemplate'].includes(tag)) {\n if (!seen.has(tag)) {\n seen.add(tag);\n normalized.push(tag);\n }\n }\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 // Deep observer for both key-specific and global listeners\n // Using observeDeep to catch both root-level key add/remove AND nested value changes\n this.rootMap.observeDeep((events: Y.YEvent<any>[]) => {\n const keysAffected = new Set<string>();\n\n events.forEach(event => {\n if (event.target === this.rootMap) {\n // Direct changes to rootMap (key added/removed)\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 nested entry maps (value/attributes changed)\n for (const [key, val] of this.rootMap) {\n if (val === event.target) {\n keysAffected.add(key);\n break;\n }\n }\n } else {\n // Deep changes (e.g., Y.Text changes inside entryMap)\n // Walk up the parent chain to find the key\n let current = event.target;\n while (current && current.parent) {\n if (current.parent.parent === this.rootMap) {\n // current.parent is the entryMap\n for (const [key, val] of this.rootMap) {\n if (val === current.parent) {\n keysAffected.add(key);\n break;\n }\n }\n break;\n }\n current = current.parent;\n }\n }\n });\n\n // Trigger key-specific listeners\n keysAffected.forEach(key => {\n const entryMap = this.rootMap.get(key);\n if (entryMap) {\n const value = entryMap.get('value');\n const attrs = entryMap.get('attributes') as KeyAttributes;\n // For document types, convert Y.Text to string\n const resolvedValue = (attrs?.type === 'document' && value instanceof Y.Text)\n ? value.toString()\n : value;\n if (this.listeners[key]) {\n this.listeners[key].forEach(l => l(resolvedValue));\n }\n } else {\n // Deleted\n if (this.listeners[key]) {\n this.listeners[key].forEach(l => l(undefined));\n }\n }\n });\n\n // Trigger global listeners\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 (key added/removed)\n const mapEvent = event as Y.YMapEvent<any>;\n mapEvent.keysChanged.forEach(key => keysAffected.add(key));\n } else {\n // Changes to nested structures (entry maps or Y.Text inside them)\n // Walk up the parent chain to find which root key was affected\n let current = event.target;\n while (current && current.parent) {\n if (current.parent === this.rootMap) {\n // Found the entry map - now find which key it belongs to\n for (const [key, val] of this.rootMap) {\n if (val === current) {\n keysAffected.add(key);\n break;\n }\n }\n break;\n }\n current = current.parent;\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 /**\n * Browser network status. Returns true if online or in local-only mode.\n * In cloud mode, this updates instantly when network status changes.\n */\n get isOnline(): boolean {\n if (!this._cloudAdapter) {\n // Local mode - check navigator directly or assume online\n if (typeof navigator !== 'undefined') {\n return navigator.onLine;\n }\n return true;\n }\n return this._cloudAdapter.isOnline;\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\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 contentType: attrs.contentType,\n contentTags: attrs.contentTags || [],\n systemTags: this.normalizeSystemTags(attrs.systemTags || []),\n zIndex: attrs.zIndex ?? 0\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')) {\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: ['SystemPrompt', 'protected'],\n zIndex: 999999\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 // Handle type transitions\n const currentValue = entryMap.get('value');\n\n // text -> document transition\n if (mergedAttrs.type === 'document' && !(currentValue instanceof Y.Text)) {\n const strValue = typeof currentValue === 'string' ? currentValue : String(currentValue ?? '');\n entryMap.set('value', new Y.Text(strValue));\n // Ensure undo manager is attached for the new document\n this.getUndoManager(key);\n } else if (mergedAttrs.type !== 'document' && currentValue instanceof Y.Text) {\n // document -> text transition\n entryMap.set('value', currentValue.toString());\n }\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 _replaceDocumentText for smart diff handling\n // BUT ONLY if we are not changing the type\n if (!attributes?.type || attributes.type === 'document') {\n if (typeof value === 'string') {\n this._replaceDocumentText(key, value);\n }\n // If attributes are provided, update them too\n if (attributes) {\n this.set_attributes(key, attributes);\n }\n return;\n }\n }\n }\n\n // If creating a NEW document type, use set_document\n if (!existingEntry && attributes?.type === 'document') {\n this.set_document(key, typeof value === 'string' ? value : '', attributes);\n return;\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 }\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\n\n // Ensure value type consistency with attributes\n let valueToSet = value;\n if (normalizedAttributes.type === 'document' && !(valueToSet instanceof Y.Text)) {\n valueToSet = new Y.Text(typeof value === 'string' ? value : String(value ?? ''));\n } else if (normalizedAttributes.type !== 'document' && valueToSet instanceof Y.Text) {\n valueToSet = valueToSet.toString();\n }\n\n entryMap!.set('value', valueToSet);\n entryMap!.set('attributes', normalizedAttributes);\n });\n }\n\n /**\n * LLM-safe method to write a value to a key.\n * This method:\n * - Only updates the value, never modifies attributes/systemTags\n * - Checks LLMWrite permission before writing\n * - Returns false if key doesn't exist or lacks LLMWrite permission\n *\n * Used by create_vercel_ai_tools() to prevent LLMs from escalating privileges.\n */\n llm_set_key(key: string, value: any): 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\n // Check LLMWrite permission\n if (!attributes?.systemTags?.includes('LLMWrite')) {\n return false;\n }\n\n // For document type, use diff-based replace\n if (attributes.type === 'document') {\n if (typeof value === 'string') {\n this._replaceDocumentText(key, value);\n }\n return true;\n }\n\n // For other types, just update the value (NOT attributes)\n this.doc.transact(() => {\n entryMap.set('value', value);\n });\n\n return true;\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?.systemTags?.includes('protected')) {\n return;\n }\n\n lines.push(`### ${key}`);\n const entryType = attributes?.type || 'text';\n lines.push(`- **Type**: \\`${entryType}\\``);\n lines.push(`- **System Tags**: \\`${attributes?.systemTags?.join(', ') || 'none'}\\``);\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('- **System Tags**:')) {\n const tagsStr = line.match(/`([^`]+)`/)?.[1] || '';\n if (tagsStr !== 'none') {\n currentAttributes.systemTags = tagsStr.split(', ').filter(t => t) as SystemTag[];\n }\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 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\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 (private - use set_value for public API).\n * Uses diff-based updates when changes are < diffThreshold (default 80%).\n * This preserves concurrent edits and provides better undo granularity.\n */\n private _replaceDocumentText(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 * Security: All tools use llm_set_key internally which:\n * - Only modifies VALUES, never attributes/systemTags\n * - Prevents LLMs from escalating privileges\n */\n create_vercel_ai_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?.systemTags?.includes('LLMWrite');\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 // Use llm_set_key for security - only modifies value, not attributes\n const success = this.llm_set_key(key, value);\n if (success) {\n return {\n result: `Successfully wrote \"${value}\" to ${key}`,\n key,\n value\n };\n }\n return {\n result: `Failed to write to ${key} - permission denied or key not found`,\n key,\n error: true\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 // Check permission first\n if (!attributes?.systemTags?.includes('LLMWrite')) {\n return { result: `Permission denied for ${key}`, key, error: true };\n }\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 // Check permission first\n if (!attributes?.systemTags?.includes('LLMWrite')) {\n return { result: `Permission denied for ${key}`, key, error: true };\n }\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 // Check permission first\n if (!attributes?.systemTags?.includes('LLMWrite')) {\n return { result: `Permission denied for ${key}`, key, error: true };\n }\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 * @deprecated Use create_vercel_ai_tools() instead\n */\n get_aisdk_tools(): Record<string, any> {\n return this.create_vercel_ai_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 - key is visible if it has SystemPrompt or LLMRead tag\n const isVisible = attributes?.systemTags?.includes('SystemPrompt') ||\n attributes?.systemTags?.includes('LLMRead');\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 - key is writable if it has LLMWrite tag\n const isWritable = attributes?.systemTags?.includes('LLMWrite');\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 - key is writable if it has LLMWrite tag\n const isWritable = attributes?.systemTags?.includes('LLMWrite');\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._replaceDocumentText(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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/local/IndexedDBAdapter.ts","../../src/cloud/CloudAdapter.ts","../../src/core/types.ts","../../src/core/MarkdownSerializer.ts","../../src/core/AIToolBuilder.ts","../../src/core/TagManager.ts","../../src/core/MindCache.ts","../../src/cloud/index.ts"],"names":["CloudAdapter","encoding","syncProtocol","decoding","Y","IndexeddbPersistence","IndexedDBAdapter","length","diff"],"mappings":"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","file":"index.js","sourcesContent":["import type { MindCache } from '../core/MindCache';\n\nexport interface IndexedDBConfig {\n /** Database name (defaults to 'mindcache_db') */\n dbName?: string;\n /** Store name (defaults to 'mindcache_store') */\n storeName?: string;\n /** Storage key (defaults to 'mindcache_data') */\n key?: string;\n /** Debounce time in ms for saving (defaults to 1000) */\n debounceMs?: number;\n}\n\nexport class IndexedDBAdapter {\n private mindcache: MindCache | null = null;\n private unsubscribe: (() => void) | null = null;\n private saveTimeout: ReturnType<typeof setTimeout> | null = null;\n private db: IDBDatabase | null = null;\n\n private dbName: string;\n private storeName: string;\n private key: string;\n\n constructor(private config: IndexedDBConfig = {}) {\n this.dbName = config.dbName || 'mindcache_db';\n this.storeName = config.storeName || 'mindcache_store';\n this.key = config.key || 'mindcache_data';\n }\n\n async attach(mc: MindCache): Promise<void> {\n if (this.mindcache) {\n this.detach();\n }\n\n this.mindcache = mc;\n await this.initDB();\n await this.load();\n\n const listener = () => {\n if (this.mindcache) {\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 _isOnline: boolean = true; // Browser network status\n private listeners: Partial<{ [K in keyof CloudAdapterEvents]: CloudAdapterEvents[K][] }> = {};\n private token: string | null = null;\n private handleOnline: (() => void) | null = null;\n private handleOffline: (() => void) | null = null;\n private _synced = false; // Track if initial sync is complete\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 // Setup browser online/offline detection\n this.setupNetworkDetection();\n }\n\n /** Browser network status - instantly updated via navigator.onLine */\n get isOnline(): boolean {\n return this._isOnline;\n }\n\n private setupNetworkDetection(): void {\n // Only run in browser environment\n if (typeof window === 'undefined' || typeof navigator === 'undefined') {\n return;\n }\n\n // Set initial state\n this._isOnline = navigator.onLine;\n\n this.handleOnline = () => {\n console.log('☁️ CloudAdapter: Network is back online');\n this._isOnline = true;\n this.emit('network_online');\n\n // If we were connected or connecting before, try to reconnect\n if (this._state === 'disconnected' || this._state === 'error') {\n this.connect();\n }\n };\n\n this.handleOffline = () => {\n console.log('☁️ CloudAdapter: Network went offline');\n this._isOnline = false;\n this.emit('network_offline');\n\n // Update state immediately instead of waiting for WS timeout\n if (this._state === 'connected' || this._state === 'connecting') {\n this._state = 'disconnected';\n this.emit('disconnected');\n }\n };\n\n window.addEventListener('online', this.handleOnline);\n window.addEventListener('offline', this.handleOffline);\n }\n\n private cleanupNetworkDetection(): void {\n if (typeof window === 'undefined') {\n return;\n }\n if (this.handleOnline) {\n window.removeEventListener('online', this.handleOnline);\n }\n if (this.handleOffline) {\n window.removeEventListener('offline', this.handleOffline);\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 // Cleanup network detection listeners\n this.cleanupNetworkDetection();\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 const messageType = 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 // Emit synced after receiving first sync message from server\n // messageType 0 = syncStep1, 1 = syncStep2, 2 = update\n // After receiving syncStep2 (1) or any message if not yet synced\n if (!this._synced && (messageType === 1 || messageType === 2)) {\n this._synced = true;\n this.emit('synced');\n }\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 * - 'admin': Can manage both content tags and system tags\n */\nexport type AccessLevel = 'user' | 'admin';\n\n/**\n * Context rules for filtering keys by contentTags.\n * When context is set, only keys matching ALL specified tags are visible.\n * Context is client-local and not persisted.\n */\nexport interface ContextRules {\n /** Tags that a key must have (AND logic - all tags must match) */\n tags: string[];\n /** Default contentTags added to keys created via create_key() in this context */\n defaultContentTags?: string[];\n /** Default systemTags added to keys created via create_key() in this context */\n defaultSystemTags?: SystemTag[];\n}\n\n/**\n * Known system tags that control key behavior\n * - 'SystemPrompt': Include in system prompt (visible to LLM context)\n * - 'LLMRead': LLM can read this key via tools\n * - 'LLMWrite': LLM can write to this key via tools\n * - 'ApplyTemplate': Process value through template injection\n */\nexport type SystemTag = 'SystemPrompt' | 'LLMRead' | 'LLMWrite' | 'ApplyTemplate';\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\n/**\n * Default attributes for new keys\n */\nexport const DEFAULT_KEY_ATTRIBUTES: KeyAttributes = {\n type: 'text',\n contentTags: [],\n systemTags: [], // Keys are private by default - explicitly add SystemPrompt/LLMRead/LLMWrite to enable LLM access\n zIndex: 0\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 * 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/**\n * Helper functions for working with system tags\n */\nexport const SystemTagHelpers = {\n /** Check if key is writable by LLM */\n isLLMWritable: (attrs: KeyAttributes): boolean =>\n attrs.systemTags.includes('LLMWrite'),\n\n /** Check if key is readable by LLM (in context or via tools) */\n isLLMReadable: (attrs: KeyAttributes): boolean =>\n attrs.systemTags.includes('SystemPrompt') || attrs.systemTags.includes('LLMRead'),\n\n /** Check if key is included in system prompt */\n isInSystemPrompt: (attrs: KeyAttributes): boolean =>\n attrs.systemTags.includes('SystemPrompt'),\n\n /** Check if key uses template injection */\n hasTemplateInjection: (attrs: KeyAttributes): boolean =>\n attrs.systemTags.includes('ApplyTemplate')\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { KeyAttributes, STM, SystemTag } from './types';\nimport { DEFAULT_KEY_ATTRIBUTES } from './types';\n\n/**\n * Helper interface for MindCache-like objects to avoid circular imports.\n * The MarkdownSerializer only needs these methods/properties.\n */\nexport interface IMarkdownSerializable {\n getSortedKeys(): string[];\n get_value(key: string): any;\n get_attributes(key: string): KeyAttributes | undefined;\n set_value(key: string, value: any, attributes?: Partial<KeyAttributes>): void;\n clear(): void;\n}\n\n/**\n * Serializes and deserializes MindCache data to/from Markdown format.\n */\nexport class MarkdownSerializer {\n /**\n * Export MindCache data to Markdown format.\n */\n static toMarkdown(mc: IMarkdownSerializable): 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 = mc.getSortedKeys();\n sortedKeys.forEach(key => {\n const attributes = mc.get_attributes(key);\n const value = mc.get_value(key);\n\n lines.push(`### ${key}`);\n const entryType = attributes?.type || 'text';\n lines.push(`- **Type**: \\`${entryType}\\``);\n lines.push(`- **System Tags**: \\`${attributes?.systemTags?.join(', ') || 'none'}\\``);\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 // Use code blocks for ALL values to support multi-line content\n lines.push('- **Value**:');\n lines.push('```');\n lines.push(String(value));\n lines.push('```');\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 Markdown into MindCache data.\n * @param markdown The markdown string to import\n * @param mc The MindCache instance to import into\n * @param merge If false (default), clears existing data before importing\n */\n static fromMarkdown(markdown: string, mc: IMarkdownSerializable, merge: boolean = false): 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 // Clear existing data unless merging\n if (!merge) {\n mc.clear();\n }\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 mc.set_value(currentKey, currentValue.trim(), 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 // Save previous appendix entry\n if (currentKey && currentValue !== null) {\n mc.set_value(currentKey, currentValue.trim(), currentAttributes);\n }\n\n const match = line.match(/### Appendix ([A-Z]): (.+)/);\n if (match) {\n currentKey = match[2];\n currentAttributes = {};\n currentValue = null;\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('- **System Tags**:')) {\n const tagsStr = line.match(/`([^`]+)`/)?.[1] || '';\n if (tagsStr !== 'none') {\n currentAttributes.systemTags = tagsStr.split(', ').filter(t => t) as SystemTag[];\n }\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 continue;\n }\n if (line.startsWith('- **Content Type**:')) {\n currentAttributes.contentType = line.match(/`(.+)`/)?.[1];\n continue;\n }\n // Handle Base64 Data from appendix\n if (line.startsWith('- **Base64 Data**:')) {\n // Expect code block on next line\n currentValue = '';\n continue;\n }\n // Handle Value lines - including appendix references\n if (line.startsWith('- **Value**:')) {\n const afterValue = line.substring(12).trim();\n\n if (afterValue.includes('[See Appendix')) {\n // This is an appendix reference - save the entry now with placeholder\n // The value will be updated when we parse the appendix\n if (currentKey) {\n mc.set_value(currentKey, '', currentAttributes);\n }\n currentValue = null; // Reset so we don't overwrite later\n continue;\n }\n\n if (afterValue === '') {\n // Empty - expect code block on next line\n currentValue = '';\n } else if (afterValue === '```' || afterValue === '```json') {\n // Code block starts on this line, content on next\n inCodeBlock = true;\n codeBlockContent = [];\n currentValue = '';\n } else if (afterValue.startsWith('```')) {\n // Code block with content on same line: ```mindmap or ```some text\n inCodeBlock = true;\n codeBlockContent = [afterValue.substring(3)]; // Capture content after ```\n currentValue = '';\n } else {\n // Inline value (legacy format)\n currentValue = afterValue;\n }\n continue;\n }\n\n // Handle code blocks - check trimmed line for robustness\n const trimmedLine = line.trim();\n if (trimmedLine === '```json' || trimmedLine === '```') {\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 codeBlockContent = [];\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeBlockContent.push(line);\n } else if (currentKey && currentValue !== null) {\n // Stop appending when we hit section markers\n if (line.trim() === '---' || line.startsWith('## Appendix')) {\n // Save the current entry and reset\n mc.set_value(currentKey, currentValue.trim(), currentAttributes);\n currentKey = null;\n currentValue = null;\n currentAttributes = {};\n } else {\n currentValue += '\\n' + line;\n }\n }\n }\n\n // Save last entry\n if (currentKey && currentValue !== null) {\n mc.set_value(currentKey, currentValue.trim(), currentAttributes);\n }\n\n // If no keys were parsed but we have content, treat as unstructured text\n // But skip if this is an STM export format (which might just be empty)\n\n // Check if we parsed any keys\n const hasParsedKeys = lines.some(line => line.startsWith('### ') && !line.startsWith('### Appendix'));\n const isSTMExport = markdown.includes('# MindCache STM Export') || markdown.includes('## STM Entries');\n\n if (!hasParsedKeys && !isSTMExport && markdown.trim().length > 0) {\n mc.set_value('imported_content', markdown.trim(), {\n type: 'text',\n systemTags: ['SystemPrompt', 'LLMWrite'], // Default assumptions\n zIndex: 0\n });\n }\n }\n\n /**\n * Parse markdown and return STM data without applying to a MindCache instance.\n * Useful for validation or preview.\n */\n static parseMarkdown(markdown: string): STM {\n const result: STM = {};\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\n const saveEntry = () => {\n if (currentKey && currentValue !== null) {\n result[currentKey] = {\n value: currentValue.trim(),\n attributes: { ...DEFAULT_KEY_ATTRIBUTES, ...currentAttributes } as KeyAttributes\n };\n }\n };\n\n for (const line of lines) {\n if (line.startsWith('### ') && !line.startsWith('### Appendix')) {\n saveEntry();\n currentKey = line.substring(4).trim();\n currentAttributes = {};\n currentValue = null;\n continue;\n }\n\n if (line.startsWith('### Appendix ')) {\n saveEntry();\n const match = line.match(/### Appendix ([A-Z]): (.+)/);\n if (match) {\n currentKey = match[2];\n currentAttributes = {};\n currentValue = null;\n }\n continue;\n }\n\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('- **System Tags**:')) {\n const tagsStr = line.match(/`([^`]+)`/)?.[1] || '';\n if (tagsStr !== 'none') {\n currentAttributes.systemTags = tagsStr.split(', ').filter(t => t) as SystemTag[];\n }\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 continue;\n }\n if (line.startsWith('- **Content Type**:')) {\n currentAttributes.contentType = line.match(/`(.+)`/)?.[1];\n continue;\n }\n if (line.startsWith('- **Base64 Data**:')) {\n currentValue = '';\n continue;\n }\n if (line.startsWith('- **Value**:')) {\n const afterValue = line.substring(12).trim();\n if (afterValue.includes('[See Appendix')) {\n currentValue = '';\n continue;\n }\n if (afterValue === '' || afterValue === '```' || afterValue === '```json') {\n inCodeBlock = afterValue !== '';\n codeBlockContent = [];\n currentValue = '';\n } else if (afterValue.startsWith('```')) {\n inCodeBlock = true;\n codeBlockContent = [afterValue.substring(3)];\n currentValue = '';\n } else {\n currentValue = afterValue;\n }\n continue;\n }\n\n const trimmedLine = line.trim();\n if (trimmedLine === '```json' || trimmedLine === '```') {\n if (inCodeBlock) {\n inCodeBlock = false;\n if (currentKey && codeBlockContent.length > 0) {\n currentValue = codeBlockContent.join('\\n');\n }\n codeBlockContent = [];\n } else {\n inCodeBlock = true;\n codeBlockContent = [];\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeBlockContent.push(line);\n } else if (currentKey && currentValue !== null) {\n if (line.trim() === '---' || line.startsWith('## Appendix')) {\n saveEntry();\n currentKey = null;\n currentValue = null;\n currentAttributes = {};\n } else {\n currentValue += '\\n' + line;\n }\n }\n }\n\n saveEntry();\n\n // Handle unstructured content\n const hasParsedKeys = lines.some(line => line.startsWith('### ') && !line.startsWith('### Appendix'));\n const isSTMExport = markdown.includes('# MindCache STM Export') || markdown.includes('## STM Entries');\n\n if (!hasParsedKeys && !isSTMExport && markdown.trim().length > 0) {\n result['imported_content'] = {\n value: markdown.trim(),\n attributes: {\n ...DEFAULT_KEY_ATTRIBUTES,\n systemTags: ['SystemPrompt', 'LLMWrite']\n }\n };\n }\n\n return result;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport * as Y from 'yjs';\nimport type { KeyAttributes } from './types';\n\n/**\n * Interface for MindCache methods needed by AIToolBuilder.\n * This avoids circular dependencies while enabling the builder to access MindCache internals.\n */\nexport interface IAIToolBuildable {\n // Key enumeration and context filtering\n keys(): string[];\n keyMatchesContext(key: string): boolean;\n\n // Value access\n get_value(key: string): any;\n get_attributes(key: string): KeyAttributes | undefined;\n set_value(key: string, value: any, attributes?: Partial<KeyAttributes>): void;\n llm_set_key(key: string, value: any): boolean;\n\n // Document operations\n get_document(key: string): Y.Text | undefined;\n insert_text(key: string, index: number, text: string): void;\n _replaceDocumentText(key: string, newText: string, diffThreshold?: number): void;\n}\n\n/**\n * Builds Vercel AI SDK compatible tools and system prompts from MindCache data.\n */\nexport class AIToolBuilder {\n /**\n * Sanitize key name for use in tool names\n */\n static sanitizeKeyForTool(key: string): string {\n return key.replace(/[^a-zA-Z0-9_-]/g, '_');\n }\n\n /**\n * Find original key from sanitized tool name\n */\n static findKeyFromSanitizedTool(mc: IAIToolBuildable, sanitizedKey: string): string | undefined {\n for (const key of mc.keys()) {\n if (AIToolBuilder.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 * Security: All tools use llm_set_key internally which:\n * - Only modifies VALUES, never attributes/systemTags\n * - Prevents LLMs from escalating privileges\n */\n static createVercelAITools(mc: IAIToolBuildable): Record<string, any> {\n const tools: Record<string, any> = {};\n\n for (const key of mc.keys()) {\n // Skip system keys\n if (key.startsWith('$')) {\n continue;\n }\n\n // Skip keys that don't match context\n if (!mc.keyMatchesContext(key)) {\n continue;\n }\n\n const attributes = mc.get_attributes(key);\n\n // Check if key has LLMWrite access (writable by LLM)\n const isWritable = attributes?.systemTags?.includes('LLMWrite');\n\n if (!isWritable) {\n continue;\n }\n\n const sanitizedKey = AIToolBuilder.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 // Use llm_set_key for security - only modifies value, not attributes\n const success = mc.llm_set_key(key, value);\n if (success) {\n return {\n result: `Successfully wrote \"${value}\" to ${key}`,\n key,\n value\n };\n }\n return {\n result: `Failed to write to ${key} - permission denied or key not found`,\n key,\n error: true\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 // Check permission first\n if (!attributes?.systemTags?.includes('LLMWrite')) {\n return { result: `Permission denied for ${key}`, key, error: true };\n }\n const yText = mc.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 // Check permission first\n if (!attributes?.systemTags?.includes('LLMWrite')) {\n return { result: `Permission denied for ${key}`, key, error: true };\n }\n mc.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 // Check permission first\n if (!attributes?.systemTags?.includes('LLMWrite')) {\n return { result: `Permission denied for ${key}`, key, error: true };\n }\n const yText = mc.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 static getSystemPrompt(mc: IAIToolBuildable): string {\n const lines: string[] = [];\n\n for (const key of mc.keys()) {\n // Skip system keys for now\n if (key.startsWith('$')) {\n continue;\n }\n\n // Skip keys that don't match context\n if (!mc.keyMatchesContext(key)) {\n continue;\n }\n\n const attributes = mc.get_attributes(key);\n\n // Check visibility - key is visible if it has SystemPrompt or LLMRead tag\n const isVisible = attributes?.systemTags?.includes('SystemPrompt') ||\n attributes?.systemTags?.includes('LLMRead');\n\n if (!isVisible) {\n continue;\n }\n\n const value = mc.get_value(key);\n const displayValue = typeof value === 'object' ? JSON.stringify(value) : value;\n\n // Check if writable - key is writable if it has LLMWrite tag\n const isWritable = attributes?.systemTags?.includes('LLMWrite');\n\n const isDocument = attributes?.type === 'document';\n const sanitizedKey = AIToolBuilder.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 return lines.join('\\n');\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 static executeToolCall(\n mc: IAIToolBuildable,\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 = AIToolBuilder.findKeyFromSanitizedTool(mc, sanitizedKey);\n\n if (!key) {\n return null;\n }\n\n const attributes = mc.get_attributes(key);\n if (!attributes) {\n return null;\n }\n\n // Check if writable - key is writable if it has LLMWrite tag\n const isWritable = attributes?.systemTags?.includes('LLMWrite');\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 mc._replaceDocumentText(key, value);\n } else {\n mc.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 = mc.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 mc.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 = mc.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","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport * as Y from 'yjs';\nimport type { KeyAttributes, SystemTag } from './types';\n\n/**\n * Interface for MindCache methods needed by TagManager.\n */\nexport interface ITagManageable {\n // Yjs access\n doc: Y.Doc;\n rootMap: Y.Map<Y.Map<any>>;\n\n // Access control\n hasSystemAccess: boolean;\n\n // Key utilities\n getSortedKeys(): string[];\n get_value(key: string): any;\n\n // Notifications\n notifyGlobalListeners(): void;\n\n // System tag normalization\n normalizeSystemTags(tags: SystemTag[]): SystemTag[];\n}\n\n/**\n * Manages content tags and system tags for MindCache keys.\n */\nexport class TagManager {\n // ============================================\n // Content Tag Methods\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 static addTag(mc: ITagManageable, key: string, tag: string): boolean {\n const entryMap = mc.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 mc.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 mc.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 static removeTag(mc: ITagManageable, key: string, tag: string): boolean {\n const entryMap = mc.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 mc.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 mc.notifyGlobalListeners();\n return true;\n }\n\n /**\n * Get all content tags for a key.\n */\n static getTags(mc: ITagManageable, key: string): string[] {\n const entryMap = mc.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 static getAllTags(mc: ITagManageable): string[] {\n const allTags = new Set<string>();\n\n for (const [, val] of mc.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 static hasTag(mc: ITagManageable, key: string, tag: string): boolean {\n const entryMap = mc.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 static getTagged(mc: ITagManageable, tag: string): string {\n const entries: Array<[string, any]> = [];\n\n const keys = mc.getSortedKeys();\n keys.forEach(key => {\n if (TagManager.hasTag(mc, key, tag)) {\n entries.push([key, mc.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 static getKeysByTag(mc: ITagManageable, tag: string): string[] {\n const keys = mc.getSortedKeys();\n return keys.filter(key => TagManager.hasTag(mc, key, tag));\n }\n\n // ============================================\n // System Tag Methods (requires system access)\n // ============================================\n\n /**\n * Add a system tag to a key (requires system access).\n */\n static systemAddTag(mc: ITagManageable, key: string, tag: SystemTag): boolean {\n if (!mc.hasSystemAccess) {\n console.warn('MindCache: systemAddTag requires system access level');\n return false;\n }\n\n const entryMap = mc.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 mc.doc.transact(() => {\n const newSystemTags = [...systemTags, tag];\n const normalizedTags = mc.normalizeSystemTags(newSystemTags);\n entryMap.set('attributes', {\n ...attributes,\n systemTags: normalizedTags\n });\n });\n\n mc.notifyGlobalListeners();\n return true;\n }\n\n /**\n * Remove a system tag from a key (requires system access).\n */\n static systemRemoveTag(mc: ITagManageable, key: string, tag: SystemTag): boolean {\n if (!mc.hasSystemAccess) {\n console.warn('MindCache: systemRemoveTag requires system access level');\n return false;\n }\n\n const entryMap = mc.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 mc.doc.transact(() => {\n const newSystemTags = systemTags.filter((t: SystemTag) => t !== tag);\n entryMap.set('attributes', {\n ...attributes,\n systemTags: newSystemTags\n });\n });\n\n mc.notifyGlobalListeners();\n return true;\n }\n\n /**\n * Get all system tags for a key (requires system access).\n */\n static systemGetTags(mc: ITagManageable, key: string): SystemTag[] {\n if (!mc.hasSystemAccess) {\n console.warn('MindCache: systemGetTags requires system access level');\n return [];\n }\n\n const entryMap = mc.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 static systemHasTag(mc: ITagManageable, key: string, tag: SystemTag): boolean {\n if (!mc.hasSystemAccess) {\n console.warn('MindCache: systemHasTag requires system access level');\n return false;\n }\n\n const entryMap = mc.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 static systemSetTags(mc: ITagManageable, key: string, tags: SystemTag[]): boolean {\n if (!mc.hasSystemAccess) {\n console.warn('MindCache: systemSetTags requires system access level');\n return false;\n }\n\n const entryMap = mc.rootMap.get(key);\n if (!entryMap) {\n return false;\n }\n\n mc.doc.transact(() => {\n const attributes = entryMap.get('attributes') as KeyAttributes;\n entryMap.set('attributes', {\n ...attributes,\n systemTags: [...tags]\n });\n });\n\n mc.notifyGlobalListeners();\n return true;\n }\n\n /**\n * Get all keys with a specific system tag (requires system access).\n */\n static systemGetKeysByTag(mc: ITagManageable, tag: SystemTag): string[] {\n if (!mc.hasSystemAccess) {\n console.warn('MindCache: systemGetKeysByTag requires system access level');\n return [];\n }\n\n const keys = mc.getSortedKeys();\n return keys.filter(key => TagManager.systemHasTag(mc, key, tag));\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, ContextRules } from './types';\nimport { DEFAULT_KEY_ATTRIBUTES } from './types';\nimport { MarkdownSerializer } from './MarkdownSerializer';\nimport { AIToolBuilder } from './AIToolBuilder';\nimport { TagManager } from './TagManager';\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. 'admin' allows managing system tags. */\n accessLevel?: AccessLevel;\n /** Optional existing Y.Doc instance (for server-side hydration) */\n doc?: Y.Doc;\n /** Context filtering rules. When set, only keys matching the rules are visible. */\n context?: ContextRules;\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 isOnline: boolean;\n}\n\nexport class MindCache {\n // Public doc for adapter access\n public doc: Y.Doc;\n public 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.3.2';\n\n // Internal flag to prevent sync loops when receiving remote updates\n // (Less critical with Yjs but kept for API compat)\n\n\n normalizeSystemTags(tags: SystemTag[]): SystemTag[] {\n const normalized: SystemTag[] = [];\n const seen = new Set<SystemTag>();\n\n for (const tag of tags) {\n // Only include valid SystemTag values, skip duplicates\n if (['SystemPrompt', 'LLMRead', 'LLMWrite', 'ApplyTemplate'].includes(tag)) {\n if (!seen.has(tag)) {\n seen.add(tag);\n normalized.push(tag);\n }\n }\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 admin operations\n private _accessLevel: AccessLevel = 'user';\n\n // Context filtering (client-local, not persisted)\n private _contextRules: ContextRules | null = null;\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 (use provided doc or create new)\n this.doc = options?.doc || new Y.Doc();\n this.rootMap = this.doc.getMap('mindcache');\n\n // Deep observer for both key-specific and global listeners\n // Using observeDeep to catch both root-level key add/remove AND nested value changes\n this.rootMap.observeDeep((events: Y.YEvent<any>[]) => {\n const keysAffected = new Set<string>();\n\n events.forEach(event => {\n if (event.target === this.rootMap) {\n // Direct changes to rootMap (key added/removed)\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 nested entry maps (value/attributes changed)\n for (const [key, val] of this.rootMap) {\n if (val === event.target) {\n keysAffected.add(key);\n break;\n }\n }\n } else {\n // Deep changes (e.g., Y.Text changes inside entryMap)\n // Walk up the parent chain to find the key\n let current = event.target;\n while (current && current.parent) {\n if (current.parent.parent === this.rootMap) {\n // current.parent is the entryMap\n for (const [key, val] of this.rootMap) {\n if (val === current.parent) {\n keysAffected.add(key);\n break;\n }\n }\n break;\n }\n current = current.parent;\n }\n }\n });\n\n // Trigger key-specific listeners\n keysAffected.forEach(key => {\n const entryMap = this.rootMap.get(key);\n if (entryMap) {\n const value = entryMap.get('value');\n const attrs = entryMap.get('attributes') as KeyAttributes;\n // For document types, convert Y.Text to string\n const resolvedValue = (attrs?.type === 'document' && value instanceof Y.Text)\n ? value.toString()\n : value;\n if (this.listeners[key]) {\n this.listeners[key].forEach(l => l(resolvedValue));\n }\n } else {\n // Deleted\n if (this.listeners[key]) {\n this.listeners[key].forEach(l => l(undefined));\n }\n }\n });\n\n // Trigger global listeners\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 // Initialize context from options\n if (options?.context) {\n this._contextRules = options.context;\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 (key added/removed)\n const mapEvent = event as Y.YMapEvent<any>;\n mapEvent.keysChanged.forEach(key => keysAffected.add(key));\n } else {\n // Changes to nested structures (entry maps or Y.Text inside them)\n // Walk up the parent chain to find which root key was affected\n let current = event.target;\n while (current && current.parent) {\n if (current.parent === this.rootMap) {\n // Found the entry map - now find which key it belongs to\n for (const [key, val] of this.rootMap) {\n if (val === current) {\n keysAffected.add(key);\n break;\n }\n }\n break;\n }\n current = current.parent;\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 === 'admin';\n }\n\n // ============================================\n // Context Methods (client-local filtering)\n // ============================================\n\n /**\n * Check if context filtering is currently active.\n */\n get hasContext(): boolean {\n return this._contextRules !== null;\n }\n\n /**\n * Get current context rules, or null if no context is set.\n */\n get_context(): ContextRules | null {\n return this._contextRules;\n }\n\n /**\n * Set context filtering rules.\n * When context is set, only keys with ALL specified tags are visible.\n *\n * @param rules - Context rules, or array of tags (shorthand for { tags: [...] })\n */\n set_context(rules: ContextRules | string[]): void {\n if (Array.isArray(rules)) {\n this._contextRules = { tags: rules };\n } else {\n this._contextRules = rules;\n }\n }\n\n /**\n * Clear context filtering. All keys become visible again.\n */\n reset_context(): void {\n this._contextRules = null;\n }\n\n /**\n * Check if a key matches the current context rules.\n * Returns true if no context is set.\n */\n keyMatchesContext(key: string): boolean {\n // System keys always match\n if (key.startsWith('$')) {\n return true;\n }\n\n // No context = all keys match\n if (!this._contextRules) {\n return true;\n }\n\n // If no tags required, all keys match\n if (this._contextRules.tags.length === 0) {\n return true;\n }\n\n const entryMap = this.rootMap.get(key);\n if (!entryMap) {\n return false;\n }\n\n const attrs = entryMap.get('attributes') as KeyAttributes;\n const contentTags = attrs?.contentTags || [];\n\n // AND logic: key must have ALL specified tags\n return this._contextRules.tags.every(tag => contentTags.includes(tag));\n }\n\n /**\n * Create a new key with optional default tags from context.\n *\n * @throws Error if key already exists\n */\n create_key(key: string, value: any, attributes?: Partial<KeyAttributes>): void {\n\n if (this.rootMap.has(key)) {\n throw new Error(`Key already exists: ${key}. Use set_value to update.`);\n }\n\n // Merge context defaults with provided attributes\n let finalAttributes: Partial<KeyAttributes> = { ...attributes };\n\n if (this._contextRules) {\n // Add default content tags from context\n const contextContentTags = this._contextRules.defaultContentTags || this._contextRules.tags;\n const existingContentTags = finalAttributes.contentTags || [];\n finalAttributes.contentTags = [...new Set([...existingContentTags, ...contextContentTags])];\n\n // Add default system tags from context\n if (this._contextRules.defaultSystemTags) {\n const existingSystemTags = finalAttributes.systemTags || [];\n finalAttributes.systemTags = [...new Set([...existingSystemTags, ...this._contextRules.defaultSystemTags])] as SystemTag[];\n }\n }\n\n // Create the key\n const entryMap = new Y.Map();\n this.rootMap.set(key, entryMap);\n\n // Ensure UndoManager exists\n this.getUndoManager(key);\n\n this.doc.transact(() => {\n const baseAttributes = {\n ...DEFAULT_KEY_ATTRIBUTES,\n ...finalAttributes\n };\n\n // Normalize system tags\n if (baseAttributes.systemTags) {\n baseAttributes.systemTags = this.normalizeSystemTags(baseAttributes.systemTags);\n }\n\n // Handle document type\n let valueToSet = value;\n if (baseAttributes.type === 'document' && !(valueToSet instanceof Y.Text)) {\n valueToSet = new Y.Text(typeof value === 'string' ? value : String(value ?? ''));\n }\n\n entryMap.set('value', valueToSet);\n entryMap.set('attributes', baseAttributes);\n });\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 /**\n * Browser network status. Returns true if online or in local-only mode.\n * In cloud mode, this updates instantly when network status changes.\n */\n get isOnline(): boolean {\n if (!this._cloudAdapter) {\n // Local mode - check navigator directly or assume online\n if (typeof navigator !== 'undefined') {\n return navigator.onLine;\n }\n return true;\n }\n return this._cloudAdapter.isOnline;\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\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 // Type as any to allow accessing legacy 'tags' property for migration\n const attrs: any = entry.attributes || {};\n // Migrate legacy 'tags' to 'contentTags'\n const contentTags = attrs.contentTags || attrs.tags || [];\n const normalizedAttrs: KeyAttributes = {\n type: attrs.type || 'text',\n contentType: attrs.contentType,\n contentTags: contentTags,\n systemTags: this.normalizeSystemTags(attrs.systemTags || []),\n zIndex: attrs.zIndex ?? 0\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 // Handles special template variables: $date, $time, $version\n private _injectSTMInternal(template: string, _processingStack: Set<string>): string {\n return template.replace(/\\{\\{([^}]+)\\}\\}/g, (_, key) => {\n const trimmedKey = key.trim();\n\n // Handle special template variables\n if (trimmedKey === '$date') {\n return new Date().toISOString().split('T')[0];\n }\n if (trimmedKey === '$time') {\n return new Date().toTimeString().split(' ')[0];\n }\n if (trimmedKey === '$version') {\n return this.version;\n }\n\n const val = this.get_value(trimmedKey, _processingStack);\n // Replace missing keys with empty string (standard template engine behavior)\n return val !== undefined ? String(val) : '';\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 if (this.keyMatchesContext(key)) {\n result[key] = this.get_value(key);\n }\n }\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 if (this.keyMatchesContext(key)) {\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 }\n return result;\n }\n\n get_value(key: string, _processingStack?: Set<string>): any {\n const entryMap = this.rootMap.get(key);\n if (!entryMap) {\n return undefined;\n }\n\n // Check context filtering\n if (!this.keyMatchesContext(key)) {\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')) {\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 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 * @returns true if attributes were updated, false if key doesn't exist or is protected\n */\n set_attributes(key: string, attributes: Partial<KeyAttributes>): boolean {\n\n const entryMap = this.rootMap.get(key);\n if (!entryMap) {\n return false; // Key doesn't exist\n }\n\n // Context validation: can't modify key that doesn't match context\n if (this._contextRules && !this.keyMatchesContext(key)) {\n throw new Error(`Cannot modify key \"${key}\": does not match current context`);\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 // Handle type transitions\n const currentValue = entryMap.get('value');\n\n // text -> document transition\n if (mergedAttrs.type === 'document' && !(currentValue instanceof Y.Text)) {\n const strValue = typeof currentValue === 'string' ? currentValue : String(currentValue ?? '');\n entryMap.set('value', new Y.Text(strValue));\n // Ensure undo manager is attached for the new document\n this.getUndoManager(key);\n } else if (mergedAttrs.type !== 'document' && currentValue instanceof Y.Text) {\n // document -> text transition\n entryMap.set('value', currentValue.toString());\n }\n });\n\n return true;\n }\n\n set_value(key: string, value: any, attributes?: Partial<KeyAttributes>): void {\n\n // For existing document type keys, use diff-based replace\n const existingEntry = this.rootMap.get(key);\n if (existingEntry) {\n // Context validation: can't modify key that doesn't match context\n if (this._contextRules && !this.keyMatchesContext(key)) {\n throw new Error(`Cannot modify key \"${key}\": does not match current context`);\n }\n\n const existingAttrs = existingEntry.get('attributes') as KeyAttributes;\n if (existingAttrs?.type === 'document') {\n // Route to _replaceDocumentText for smart diff handling\n // BUT ONLY if we are not changing the type\n if (!attributes?.type || attributes.type === 'document') {\n if (typeof value === 'string') {\n this._replaceDocumentText(key, value);\n }\n // If attributes are provided, update them too\n if (attributes) {\n this.set_attributes(key, attributes);\n }\n return;\n }\n }\n }\n\n // If key doesn't exist and context is set, use create_key\n if (!existingEntry && this._contextRules) {\n this.create_key(key, value, attributes);\n return;\n }\n\n // If creating a NEW document type, use set_document\n if (!existingEntry && attributes?.type === 'document') {\n this.set_document(key, typeof value === 'string' ? value : '', attributes);\n return;\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 }\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\n\n // Ensure value type consistency with attributes\n let valueToSet = value;\n if (normalizedAttributes.type === 'document' && !(valueToSet instanceof Y.Text)) {\n valueToSet = new Y.Text(typeof value === 'string' ? value : String(value ?? ''));\n } else if (normalizedAttributes.type !== 'document' && valueToSet instanceof Y.Text) {\n valueToSet = valueToSet.toString();\n }\n\n entryMap!.set('value', valueToSet);\n entryMap!.set('attributes', normalizedAttributes);\n });\n }\n\n /**\n * LLM-safe method to write a value to a key.\n * This method:\n * - Only updates the value, never modifies attributes/systemTags\n * - Checks LLMWrite permission before writing\n * - Returns false if key doesn't exist or lacks LLMWrite permission\n *\n * Used by create_vercel_ai_tools() to prevent LLMs from escalating privileges.\n */\n llm_set_key(key: string, value: any): boolean {\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\n // Check LLMWrite permission\n if (!attributes?.systemTags?.includes('LLMWrite')) {\n return false;\n }\n\n // For document type, use diff-based replace\n if (attributes.type === 'document') {\n if (typeof value === 'string') {\n this._replaceDocumentText(key, value);\n }\n return true;\n }\n\n // For other types, just update the value (NOT attributes)\n this.doc.transact(() => {\n entryMap.set('value', value);\n });\n\n return true;\n }\n\n delete_key(key: string): void {\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 (!this.rootMap.has(key)) {\n return false;\n }\n return this.keyMatchesContext(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 (!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 this.set_value(key, value);\n }\n });\n this.notifyGlobalListeners();\n }\n\n /**\n * Get the number of keys in MindCache.\n */\n size(): number {\n // Count keys that match context\n let count = 0;\n for (const [key] of this.rootMap) {\n if (this.keyMatchesContext(key)) {\n count++;\n }\n }\n return count;\n }\n\n /**\n * Get all keys in MindCache.\n */\n keys(): string[] {\n const keys: string[] = [];\n for (const [key] of this.rootMap) {\n if (this.keyMatchesContext(key)) {\n keys.push(key);\n }\n }\n return keys;\n }\n\n /**\n * Get all values in MindCache.\n */\n values(): any[] {\n const result: any[] = [];\n for (const [key] of this.rootMap) {\n if (this.keyMatchesContext(key)) {\n result.push(this.get_value(key));\n }\n }\n return result;\n }\n\n /**\n * Get all key-value entries.\n */\n entries(): Array<[string, any]> {\n const result: Array<[string, any]> = [];\n for (const [key] of this.rootMap) {\n if (this.keyMatchesContext(key)) {\n result.push([key, this.get_value(key)]);\n }\n }\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 * @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 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 return TagManager.addTag(this, key, tag);\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 return TagManager.removeTag(this, key, tag);\n }\n\n /**\n * Get all content tags for a key.\n */\n getTags(key: string): string[] {\n return TagManager.getTags(this, key);\n }\n\n /**\n * Get all unique content tags across all keys.\n */\n getAllTags(): string[] {\n return TagManager.getAllTags(this);\n }\n\n /**\n * Check if a key has a specific content tag.\n */\n hasTag(key: string, tag: string): boolean {\n return TagManager.hasTag(this, key, tag);\n }\n\n /**\n * Get all keys with a specific content tag as formatted string.\n */\n getTagged(tag: string): string {\n return TagManager.getTagged(this, tag);\n }\n\n /**\n * Get array of keys with a specific content tag.\n */\n getKeysByTag(tag: string): string[] {\n return TagManager.getKeysByTag(this, 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', 'ApplyTemplate'\n */\n systemAddTag(key: string, tag: SystemTag): boolean {\n return TagManager.systemAddTag(this, key, tag);\n }\n\n /**\n * Remove a system tag from a key (requires system access).\n */\n systemRemoveTag(key: string, tag: SystemTag): boolean {\n return TagManager.systemRemoveTag(this, key, tag);\n }\n\n /**\n * Get all system tags for a key (requires system access).\n */\n systemGetTags(key: string): SystemTag[] {\n return TagManager.systemGetTags(this, key);\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 return TagManager.systemHasTag(this, key, tag);\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 return TagManager.systemSetTags(this, key, tags);\n }\n\n /**\n * Get all keys with a specific system tag (requires system access).\n */\n systemGetKeysByTag(tag: SystemTag): string[] {\n return TagManager.systemGetKeysByTag(this, tag);\n }\n\n /**\n * Helper to get sorted keys (by zIndex).\n * Respects context filtering when set.\n */\n getSortedKeys(): string[] {\n const entries: Array<{ key: string; zIndex: number }> = [];\n\n for (const [key, val] of this.rootMap) {\n if (!this.keyMatchesContext(key)) {\n continue;\n }\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 return MarkdownSerializer.toMarkdown(this);\n }\n\n /**\n * Import from Markdown format.\n * @param markdown The markdown string to import\n * @param merge If false (default), clears existing data before importing. If true, merges with existing data.\n */\n fromMarkdown(markdown: string, merge: boolean = false): void {\n MarkdownSerializer.fromMarkdown(markdown, this, merge);\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\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\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 _replaceDocumentText(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 notifyGlobalListeners(): void {\n this.globalListeners.forEach(l => l());\n }\n\n // Sanitize key name for use in tool names\n sanitizeKeyForTool(key: string): string {\n return AIToolBuilder.sanitizeKeyForTool(key);\n }\n\n // Find original key from sanitized tool name\n findKeyFromSanitizedTool(sanitizedKey: string): string | undefined {\n return AIToolBuilder.findKeyFromSanitizedTool(this, sanitizedKey);\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 * Security: All tools use llm_set_key internally which:\n * - Only modifies VALUES, never attributes/systemTags\n * - Prevents LLMs from escalating privileges\n */\n create_vercel_ai_tools(): Record<string, any> {\n return AIToolBuilder.createVercelAITools(this);\n }\n\n /**\n * @deprecated Use create_vercel_ai_tools() instead\n */\n get_aisdk_tools(): Record<string, any> {\n return this.create_vercel_ai_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 return AIToolBuilder.getSystemPrompt(this);\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 return AIToolBuilder.executeToolCall(this, toolName, value);\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"]}
|