mindcache 3.6.0 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cloud/index.js.map +1 -1
- package/dist/cloud/index.mjs.map +1 -1
- package/dist/index.d.mts +366 -1
- package/dist/index.d.ts +366 -1
- package/dist/index.js +1021 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1012 -3
- package/dist/index.mjs.map +1 -1
- package/dist/server.js.map +1 -1
- package/dist/server.mjs.map +1 -1
- package/package.json +4 -8
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/SchemaParser.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","tool","z","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 console.log('☁️ CloudAdapter: Received JSON message:', msg.type, msg);\n if (msg.type === 'auth_success') {\n this._state = 'connected';\n this.reconnectAttempts = 0;\n this.emit('connected');\n console.log('☁️ Connected to MindCache cloud');\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 console.log('☁️ CloudAdapter: Received binary message, length:', event.data.byteLength);\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 console.log('☁️ Synced with cloud');\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 * A field in a custom type definition\n */\nexport interface CustomTypeField {\n /** Field name */\n name: string;\n /** Human-readable description of the field */\n description: string;\n}\n\n/**\n * A parsed custom type definition\n */\nexport interface CustomTypeDefinition {\n /** Type name (e.g., 'Contact') */\n name: string;\n /** Fields that make up this type */\n fields: CustomTypeField[];\n /** Original markdown schema */\n rawSchema: string;\n}\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 /** Custom type name (registered via registerType) */\n customType?: string;\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","import { CustomTypeDefinition, CustomTypeField } from './types';\n\n/**\n * Parses markdown-based schema definitions into structured CustomTypeDefinition objects.\n *\n * Schema format:\n * ```\n * #TypeName\n * * fieldName: description of the field\n * * anotherField: description\n * ```\n */\nexport class SchemaParser {\n /**\n * Parse a markdown schema string into a CustomTypeDefinition\n * @param schema - Markdown schema string\n * @returns Parsed type definition\n * @throws Error if schema format is invalid\n */\n static parse(schema: string): CustomTypeDefinition {\n const lines = schema.trim().split('\\n').map(line => line.trim()).filter(line => line.length > 0);\n\n if (lines.length === 0) {\n throw new Error('Schema cannot be empty');\n }\n\n // Parse type name from first line (format: #TypeName or # TypeName)\n const typeNameMatch = lines[0].match(/^#\\s*(\\w+)$/);\n if (!typeNameMatch) {\n throw new Error(`Invalid schema: first line must be \"#TypeName\", got \"${lines[0]}\"`);\n }\n const typeName = typeNameMatch[1];\n\n // Parse fields from remaining lines (format: * fieldName: description)\n const fields: CustomTypeField[] = [];\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n const fieldMatch = line.match(/^\\*\\s*([^:]+):\\s*(.+)$/);\n if (fieldMatch) {\n fields.push({\n name: fieldMatch[1].trim(),\n description: fieldMatch[2].trim()\n });\n }\n // Skip lines that don't match the field pattern (allows for comments/blank lines)\n }\n\n if (fields.length === 0) {\n throw new Error(`Schema \"${typeName}\" must have at least one field`);\n }\n\n return {\n name: typeName,\n fields,\n rawSchema: schema\n };\n }\n\n /**\n * Generate a markdown representation of a type definition\n * Useful for including in LLM prompts\n */\n static toMarkdown(typeDef: CustomTypeDefinition): string {\n const lines = [`#${typeDef.name}`];\n for (const field of typeDef.fields) {\n lines.push(`* ${field.name}: ${field.description}`);\n }\n return lines.join('\\n');\n }\n\n /**\n * Generate a prompt-friendly description of the type\n * More verbose than toMarkdown, better for LLM guidance\n */\n static toPromptDescription(typeDef: CustomTypeDefinition): string {\n const fieldDescs = typeDef.fields.map(f => ` - ${f.name}: ${f.description}`).join('\\n');\n return `Type \"${typeDef.name}\" with fields:\\n${fieldDescs}`;\n }\n\n /**\n * Generate an example value structure based on the type definition\n */\n static generateExample(typeDef: CustomTypeDefinition): string {\n const lines = [`#${typeDef.name.toLowerCase()}`];\n for (const field of typeDef.fields) {\n lines.push(`* ${field.name}: [${field.description}]`);\n }\n return lines.join('\\n');\n }\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 { tool } from 'ai';\nimport { z } from 'zod';\nimport type { KeyAttributes, CustomTypeDefinition } from './types';\nimport { SchemaParser } from './SchemaParser';\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 has(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 // Custom type operations\n getTypeSchema(typeName: string): CustomTypeDefinition | undefined;\n getKeyType(key: string): string | undefined;\n getRegisteredTypes(): string[];\n setType(key: string, typeName: string): void;\n}\n\n/**\n * Builds 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 framework-agnostic tools with raw JSON Schema.\n * Works with: OpenAI SDK, Anthropic SDK, LangChain, etc.\n *\n * Tool format:\n * {\n * description: string,\n * parameters: { type: 'object', properties: {...}, required: [...] },\n * execute: async (args) => result\n * }\n */\n static createTools(mc: IAIToolBuildable): Record<string, any> {\n return AIToolBuilder._buildTools(mc);\n }\n\n /**\n * Generate Vercel AI SDK v5 compatible tools using Zod schemas.\n * Uses tool() helper with Zod for full AI SDK v5 compatibility.\n *\n * Use this with: generateText(), streamText() from 'ai' package\n */\n static createVercelAITools(mc: IAIToolBuildable): Record<string, any> {\n const tools: Record<string, any> = {};\n const registeredTypes = mc.getRegisteredTypes();\n const typeDesc = registeredTypes.length > 0\n ? `Optional type: ${registeredTypes.join(' | ')}`\n : 'No types registered';\n\n // create_key tool with Zod schema\n tools['create_key'] = tool({\n description: `Create a new key in MindCache. ${registeredTypes.length > 0 ? `Available types: ${registeredTypes.join(', ')}` : ''}`,\n inputSchema: z.object({\n key: z.string().describe('The key name (e.g., \"contact_john_doe\")'),\n value: z.string().describe('The value (JSON string for structured data)'),\n type: z.string().optional().describe(typeDesc)\n }),\n execute: async ({ key, value, type }: { key: string; value: string; type?: string }) => {\n if (mc.has(key)) {\n return { result: `Key \"${key}\" exists. Use write_${AIToolBuilder.sanitizeKeyForTool(key)}`, error: true };\n }\n if (type && !mc.getTypeSchema(type)) {\n return { result: `Type \"${type}\" not registered`, error: true };\n }\n mc.set_value(key, value, { systemTags: ['SystemPrompt', 'LLMRead', 'LLMWrite'] });\n if (type) {\n mc.setType(key, type);\n }\n return { result: `Created \"${key}\"${type ? ` (${type})` : ''}`, key, value };\n }\n });\n\n // Add write_ tools for existing writable keys\n for (const key of mc.keys()) {\n if (key.startsWith('$') || !mc.keyMatchesContext(key)) {\n continue;\n }\n const attrs = mc.get_attributes(key);\n if (!attrs?.systemTags?.includes('LLMWrite')) {\n continue;\n }\n\n const sanitized = AIToolBuilder.sanitizeKeyForTool(key);\n const customTypeName = mc.getKeyType(key);\n const customType = customTypeName ? mc.getTypeSchema(customTypeName) : undefined;\n\n let desc = `Write to \"${key}\"`;\n if (customType) {\n desc = `Write to \"${key}\" (${customTypeName}). ${SchemaParser.toPromptDescription(customType)}`;\n }\n\n tools[`write_${sanitized}`] = tool({\n description: desc,\n inputSchema: z.object({\n value: z.string().describe(customType ? `JSON following ${customTypeName} schema` : 'Value to write')\n }),\n execute: async ({ value }: { value: string }) => {\n const success = mc.llm_set_key(key, value);\n return success\n ? { result: `Wrote to ${key}`, key, value }\n : { result: `Failed to write to ${key}`, error: true };\n }\n });\n\n // Document tools\n if (attrs?.type === 'document') {\n tools[`append_${sanitized}`] = tool({\n description: `Append to \"${key}\" document`,\n inputSchema: z.object({ text: z.string().describe('Text to append') }),\n execute: async ({ text }: { text: string }) => {\n const yText = mc.get_document(key);\n if (yText) {\n yText.insert(yText.length, text); return { result: 'Appended', key };\n }\n return { result: 'Not found', error: true };\n }\n });\n\n tools[`insert_${sanitized}`] = tool({\n description: `Insert text at position in \"${key}\" document`,\n inputSchema: z.object({\n index: z.number().describe('Position (0 = start)'),\n text: z.string().describe('Text to insert')\n }),\n execute: async ({ index, text }: { index: number; text: string }) => {\n mc.insert_text(key, index, text);\n return { result: `Inserted at ${index}`, key };\n }\n });\n\n tools[`edit_${sanitized}`] = tool({\n description: `Find and replace in \"${key}\" document`,\n inputSchema: z.object({\n find: z.string().describe('Text to find'),\n replace: z.string().describe('Replacement')\n }),\n execute: async ({ find, replace }: { find: string; replace: string }) => {\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 { result: `Replaced \"${find}\"`, key };\n }\n return { result: `\"${find}\" not found`, error: true };\n }\n return { result: 'Document not found', error: true };\n }\n });\n }\n }\n\n return tools;\n }\n\n /**\n * Internal: Build tools with raw JSON Schema (framework-agnostic).\n */\n private static _buildTools(mc: IAIToolBuildable): Record<string, any> {\n const tools: Record<string, any> = {};\n\n // Add create_key tool for creating new keys\n const registeredTypes = mc.getRegisteredTypes();\n const typeInfo = registeredTypes.length > 0\n ? `Available types: ${registeredTypes.join(', ')}`\n : 'No custom types registered';\n\n tools['create_key'] = {\n description: `Create a new key in MindCache. ${typeInfo}. The new key will be readable and writable by the LLM.`,\n parameters: {\n type: 'object',\n properties: {\n key: { type: 'string', description: 'The key name to create (e.g., \"contact_john_doe\")' },\n value: { type: 'string', description: 'The value to store (use JSON string for structured data)' },\n type: {\n type: 'string',\n description: registeredTypes.length > 0\n ? `Optional: custom type name (${registeredTypes.join(' | ')})`\n : 'Optional: custom type name (none registered)'\n }\n },\n required: ['key', 'value']\n },\n execute: async ({ key, value, type }: { key: string; value: string; type?: string }) => {\n // Check if key already exists\n if (mc.has(key)) {\n return {\n result: `Key \"${key}\" already exists. Use write_${AIToolBuilder.sanitizeKeyForTool(key)} to update it.`,\n key,\n error: true\n };\n }\n\n // Validate type if provided\n if (type && !mc.getTypeSchema(type)) {\n return {\n result: `Type \"${type}\" is not registered. Available types: ${registeredTypes.join(', ') || 'none'}`,\n key,\n error: true\n };\n }\n\n // Create the key with LLM permissions\n mc.set_value(key, value, {\n systemTags: ['SystemPrompt', 'LLMRead', 'LLMWrite']\n });\n\n // Set type if provided\n if (type) {\n mc.setType(key, type);\n }\n\n return {\n result: `Successfully created key \"${key}\"${type ? ` with type \"${type}\"` : ''}`,\n key,\n value,\n type\n };\n }\n };\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 // Check for custom type schema\n const customTypeName = mc.getKeyType(key);\n const customType = customTypeName ? mc.getTypeSchema(customTypeName) : undefined;\n\n // Build description with custom type guidance if applicable\n let writeDescription: string;\n if (customType) {\n const schemaGuidance = SchemaParser.toPromptDescription(customType);\n const example = SchemaParser.generateExample(customType);\n writeDescription = `Write a value to \"${key}\" that must follow this schema:\\n${schemaGuidance}\\n\\nExample format:\\n${example}`;\n } else if (isDocument) {\n writeDescription = `Rewrite the entire \"${key}\" document`;\n } else {\n writeDescription = `Write a value to the STM key: ${key}`;\n }\n\n // 1. write_ tool (for all writable keys)\n tools[`write_${sanitizedKey}`] = {\n description: writeDescription,\n parameters: {\n type: 'object',\n properties: {\n value: { type: 'string', description: customType ? `Value following ${customTypeName} schema` : (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 parameters: {\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 parameters: {\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 parameters: {\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 // Add info about create_key tool and registered types\n const registeredTypes = mc.getRegisteredTypes();\n if (registeredTypes.length > 0) {\n lines.push(`[create_key tool available - registered types: ${registeredTypes.join(', ')}]`);\n lines.push('');\n }\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 // Check for custom type\n const customTypeName = mc.getKeyType(key);\n const customType = customTypeName ? mc.getTypeSchema(customTypeName) : undefined;\n\n if (isWritable) {\n if (customType) {\n // Key with custom type - include schema in prompt\n const schemaInfo = SchemaParser.toMarkdown(customType);\n lines.push(\n `${key} (type: ${customTypeName}): ${displayValue}\\n` +\n `Schema:\\n${schemaInfo}\\n` +\n `Tool: write_${sanitizedKey}`\n );\n } else 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 if (customTypeName) {\n lines.push(`${key} (type: ${customTypeName}): ${displayValue}`);\n } else {\n lines.push(`${key}: ${displayValue}`);\n }\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, CustomTypeDefinition } from './types';\nimport { DEFAULT_KEY_ATTRIBUTES } from './types';\nimport { SchemaParser } from './SchemaParser';\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 (not needed for OAuth - auto-provisioned) */\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 * OAuth configuration for browser apps using \"Sign in with MindCache\"\n * When set, user authentication and instance provisioning is automatic\n */\n oauth?: {\n /** Client ID from MindCache developer portal */\n clientId: string;\n /** Redirect URI for OAuth callback (defaults to current URL) */\n redirectUri?: string;\n /** Scopes to request (default: ['read', 'write']) */\n scopes?: string[];\n /** Auto-redirect to login if not authenticated (default: false) */\n autoLogin?: boolean;\n };\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.6.0';\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 // Custom type registry\n private _typeRegistry: Map<string, CustomTypeDefinition> = new Map();\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 // Custom Type Methods\n // ============================================\n\n /**\n * Register a custom type with a markdown schema definition.\n *\n * Schema format:\n * ```\n * #TypeName\n * * fieldName: description of the field\n * * anotherField: description\n * ```\n *\n * @param name - Type name (e.g., 'Contact')\n * @param schema - Markdown schema definition\n * @throws Error if schema format is invalid\n */\n registerType(name: string, schema: string): void {\n const typeDef = SchemaParser.parse(schema);\n // Override name if different from schema header\n typeDef.name = name;\n this._typeRegistry.set(name, typeDef);\n }\n\n /**\n * Assign a custom type to a key.\n * The key must exist and the type must be registered.\n * Also sets the underlying type to 'json' since custom types are structured JSON data.\n *\n * @param key - Key to assign type to\n * @param typeName - Registered type name\n * @throws Error if key doesn't exist or type is not registered\n */\n setType(key: string, typeName: string): void {\n if (!this.rootMap.has(key)) {\n throw new Error(`Key \"${key}\" does not exist`);\n }\n if (!this._typeRegistry.has(typeName)) {\n throw new Error(`Type \"${typeName}\" is not registered. Use registerType() first.`);\n }\n // Custom types are JSON data, so set both type and customType\n this.set_attributes(key, { type: 'json', customType: typeName });\n }\n\n /**\n * Get a registered type schema definition.\n *\n * @param typeName - Type name to look up\n * @returns The type definition or undefined if not registered\n */\n getTypeSchema(typeName: string): CustomTypeDefinition | undefined {\n return this._typeRegistry.get(typeName);\n }\n\n /**\n * Get all registered type names.\n */\n getRegisteredTypes(): string[] {\n return Array.from(this._typeRegistry.keys());\n }\n\n /**\n * Get the custom type assigned to a key.\n *\n * @param key - Key to check\n * @returns Type name or undefined if no custom type assigned\n */\n getKeyType(key: string): string | undefined {\n const attrs = this.get_attributes(key);\n return attrs?.customType;\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 framework-agnostic tools with raw JSON Schema.\n * Works with: OpenAI SDK, Anthropic SDK, LangChain, and other frameworks.\n *\n * Tool format:\n * {\n * description: string,\n * parameters: { type: 'object', properties: {...}, required: [...] },\n * execute: async (args) => result\n * }\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_tools(): Record<string, any> {\n return AIToolBuilder.createTools(this);\n }\n\n /**\n * Generate Vercel AI SDK compatible tools for writable keys.\n * Wraps parameters with jsonSchema() for AI SDK v5 compatibility.\n * Use this with: generateText(), streamText() from 'ai' package.\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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/local/IndexedDBAdapter.ts","../../src/cloud/CloudAdapter.ts","../../src/core/types.ts","../../src/core/SchemaParser.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","tool","z","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 console.log('☁️ CloudAdapter: Received JSON message:', msg.type, msg);\n if (msg.type === 'auth_success') {\n this._state = 'connected';\n this.reconnectAttempts = 0;\n this.emit('connected');\n console.log('☁️ Connected to MindCache cloud');\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 console.log('☁️ CloudAdapter: Received binary message, length:', event.data.byteLength);\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 console.log('☁️ Synced with cloud');\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 * A field in a custom type definition\n */\nexport interface CustomTypeField {\n /** Field name */\n name: string;\n /** Human-readable description of the field */\n description: string;\n}\n\n/**\n * A parsed custom type definition\n */\nexport interface CustomTypeDefinition {\n /** Type name (e.g., 'Contact') */\n name: string;\n /** Fields that make up this type */\n fields: CustomTypeField[];\n /** Original markdown schema */\n rawSchema: string;\n}\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 /** Custom type name (registered via registerType) */\n customType?: string;\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","import { CustomTypeDefinition, CustomTypeField } from './types';\n\n/**\n * Parses markdown-based schema definitions into structured CustomTypeDefinition objects.\n *\n * Schema format:\n * ```\n * #TypeName\n * * fieldName: description of the field\n * * anotherField: description\n * ```\n */\nexport class SchemaParser {\n /**\n * Parse a markdown schema string into a CustomTypeDefinition\n * @param schema - Markdown schema string\n * @returns Parsed type definition\n * @throws Error if schema format is invalid\n */\n static parse(schema: string): CustomTypeDefinition {\n const lines = schema.trim().split('\\n').map(line => line.trim()).filter(line => line.length > 0);\n\n if (lines.length === 0) {\n throw new Error('Schema cannot be empty');\n }\n\n // Parse type name from first line (format: #TypeName or # TypeName)\n const typeNameMatch = lines[0].match(/^#\\s*(\\w+)$/);\n if (!typeNameMatch) {\n throw new Error(`Invalid schema: first line must be \"#TypeName\", got \"${lines[0]}\"`);\n }\n const typeName = typeNameMatch[1];\n\n // Parse fields from remaining lines (format: * fieldName: description)\n const fields: CustomTypeField[] = [];\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n const fieldMatch = line.match(/^\\*\\s*([^:]+):\\s*(.+)$/);\n if (fieldMatch) {\n fields.push({\n name: fieldMatch[1].trim(),\n description: fieldMatch[2].trim()\n });\n }\n // Skip lines that don't match the field pattern (allows for comments/blank lines)\n }\n\n if (fields.length === 0) {\n throw new Error(`Schema \"${typeName}\" must have at least one field`);\n }\n\n return {\n name: typeName,\n fields,\n rawSchema: schema\n };\n }\n\n /**\n * Generate a markdown representation of a type definition\n * Useful for including in LLM prompts\n */\n static toMarkdown(typeDef: CustomTypeDefinition): string {\n const lines = [`#${typeDef.name}`];\n for (const field of typeDef.fields) {\n lines.push(`* ${field.name}: ${field.description}`);\n }\n return lines.join('\\n');\n }\n\n /**\n * Generate a prompt-friendly description of the type\n * More verbose than toMarkdown, better for LLM guidance\n */\n static toPromptDescription(typeDef: CustomTypeDefinition): string {\n const fieldDescs = typeDef.fields.map(f => ` - ${f.name}: ${f.description}`).join('\\n');\n return `Type \"${typeDef.name}\" with fields:\\n${fieldDescs}`;\n }\n\n /**\n * Generate an example value structure based on the type definition\n */\n static generateExample(typeDef: CustomTypeDefinition): string {\n const lines = [`#${typeDef.name.toLowerCase()}`];\n for (const field of typeDef.fields) {\n lines.push(`* ${field.name}: [${field.description}]`);\n }\n return lines.join('\\n');\n }\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 { tool } from 'ai';\nimport { z } from 'zod';\nimport type { KeyAttributes, CustomTypeDefinition } from './types';\nimport { SchemaParser } from './SchemaParser';\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 has(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 // Custom type operations\n getTypeSchema(typeName: string): CustomTypeDefinition | undefined;\n getKeyType(key: string): string | undefined;\n getRegisteredTypes(): string[];\n setType(key: string, typeName: string): void;\n}\n\n/**\n * Builds 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 framework-agnostic tools with raw JSON Schema.\n * Works with: OpenAI SDK, Anthropic SDK, LangChain, etc.\n *\n * Tool format:\n * {\n * description: string,\n * parameters: { type: 'object', properties: {...}, required: [...] },\n * execute: async (args) => result\n * }\n */\n static createTools(mc: IAIToolBuildable): Record<string, any> {\n return AIToolBuilder._buildTools(mc);\n }\n\n /**\n * Generate Vercel AI SDK v5 compatible tools using Zod schemas.\n * Uses tool() helper with Zod for full AI SDK v5 compatibility.\n *\n * Use this with: generateText(), streamText() from 'ai' package\n */\n static createVercelAITools(mc: IAIToolBuildable): Record<string, any> {\n const tools: Record<string, any> = {};\n const registeredTypes = mc.getRegisteredTypes();\n const typeDesc = registeredTypes.length > 0\n ? `Optional type: ${registeredTypes.join(' | ')}`\n : 'No types registered';\n\n // create_key tool with Zod schema\n tools['create_key'] = tool({\n description: `Create a new key in MindCache. ${registeredTypes.length > 0 ? `Available types: ${registeredTypes.join(', ')}` : ''}`,\n inputSchema: z.object({\n key: z.string().describe('The key name (e.g., \"contact_john_doe\")'),\n value: z.string().describe('The value (JSON string for structured data)'),\n type: z.string().optional().describe(typeDesc)\n }),\n execute: async ({ key, value, type }: { key: string; value: string; type?: string }) => {\n if (mc.has(key)) {\n return { result: `Key \"${key}\" exists. Use write_${AIToolBuilder.sanitizeKeyForTool(key)}`, error: true };\n }\n if (type && !mc.getTypeSchema(type)) {\n return { result: `Type \"${type}\" not registered`, error: true };\n }\n mc.set_value(key, value, { systemTags: ['SystemPrompt', 'LLMRead', 'LLMWrite'] });\n if (type) {\n mc.setType(key, type);\n }\n return { result: `Created \"${key}\"${type ? ` (${type})` : ''}`, key, value };\n }\n });\n\n // Add write_ tools for existing writable keys\n for (const key of mc.keys()) {\n if (key.startsWith('$') || !mc.keyMatchesContext(key)) {\n continue;\n }\n const attrs = mc.get_attributes(key);\n if (!attrs?.systemTags?.includes('LLMWrite')) {\n continue;\n }\n\n const sanitized = AIToolBuilder.sanitizeKeyForTool(key);\n const customTypeName = mc.getKeyType(key);\n const customType = customTypeName ? mc.getTypeSchema(customTypeName) : undefined;\n\n let desc = `Write to \"${key}\"`;\n if (customType) {\n desc = `Write to \"${key}\" (${customTypeName}). ${SchemaParser.toPromptDescription(customType)}`;\n }\n\n tools[`write_${sanitized}`] = tool({\n description: desc,\n inputSchema: z.object({\n value: z.string().describe(customType ? `JSON following ${customTypeName} schema` : 'Value to write')\n }),\n execute: async ({ value }: { value: string }) => {\n const success = mc.llm_set_key(key, value);\n return success\n ? { result: `Wrote to ${key}`, key, value }\n : { result: `Failed to write to ${key}`, error: true };\n }\n });\n\n // Document tools\n if (attrs?.type === 'document') {\n tools[`append_${sanitized}`] = tool({\n description: `Append to \"${key}\" document`,\n inputSchema: z.object({ text: z.string().describe('Text to append') }),\n execute: async ({ text }: { text: string }) => {\n const yText = mc.get_document(key);\n if (yText) {\n yText.insert(yText.length, text); return { result: 'Appended', key };\n }\n return { result: 'Not found', error: true };\n }\n });\n\n tools[`insert_${sanitized}`] = tool({\n description: `Insert text at position in \"${key}\" document`,\n inputSchema: z.object({\n index: z.number().describe('Position (0 = start)'),\n text: z.string().describe('Text to insert')\n }),\n execute: async ({ index, text }: { index: number; text: string }) => {\n mc.insert_text(key, index, text);\n return { result: `Inserted at ${index}`, key };\n }\n });\n\n tools[`edit_${sanitized}`] = tool({\n description: `Find and replace in \"${key}\" document`,\n inputSchema: z.object({\n find: z.string().describe('Text to find'),\n replace: z.string().describe('Replacement')\n }),\n execute: async ({ find, replace }: { find: string; replace: string }) => {\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 { result: `Replaced \"${find}\"`, key };\n }\n return { result: `\"${find}\" not found`, error: true };\n }\n return { result: 'Document not found', error: true };\n }\n });\n }\n }\n\n return tools;\n }\n\n /**\n * Internal: Build tools with raw JSON Schema (framework-agnostic).\n */\n private static _buildTools(mc: IAIToolBuildable): Record<string, any> {\n const tools: Record<string, any> = {};\n\n // Add create_key tool for creating new keys\n const registeredTypes = mc.getRegisteredTypes();\n const typeInfo = registeredTypes.length > 0\n ? `Available types: ${registeredTypes.join(', ')}`\n : 'No custom types registered';\n\n tools['create_key'] = {\n description: `Create a new key in MindCache. ${typeInfo}. The new key will be readable and writable by the LLM.`,\n parameters: {\n type: 'object',\n properties: {\n key: { type: 'string', description: 'The key name to create (e.g., \"contact_john_doe\")' },\n value: { type: 'string', description: 'The value to store (use JSON string for structured data)' },\n type: {\n type: 'string',\n description: registeredTypes.length > 0\n ? `Optional: custom type name (${registeredTypes.join(' | ')})`\n : 'Optional: custom type name (none registered)'\n }\n },\n required: ['key', 'value']\n },\n execute: async ({ key, value, type }: { key: string; value: string; type?: string }) => {\n // Check if key already exists\n if (mc.has(key)) {\n return {\n result: `Key \"${key}\" already exists. Use write_${AIToolBuilder.sanitizeKeyForTool(key)} to update it.`,\n key,\n error: true\n };\n }\n\n // Validate type if provided\n if (type && !mc.getTypeSchema(type)) {\n return {\n result: `Type \"${type}\" is not registered. Available types: ${registeredTypes.join(', ') || 'none'}`,\n key,\n error: true\n };\n }\n\n // Create the key with LLM permissions\n mc.set_value(key, value, {\n systemTags: ['SystemPrompt', 'LLMRead', 'LLMWrite']\n });\n\n // Set type if provided\n if (type) {\n mc.setType(key, type);\n }\n\n return {\n result: `Successfully created key \"${key}\"${type ? ` with type \"${type}\"` : ''}`,\n key,\n value,\n type\n };\n }\n };\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 // Check for custom type schema\n const customTypeName = mc.getKeyType(key);\n const customType = customTypeName ? mc.getTypeSchema(customTypeName) : undefined;\n\n // Build description with custom type guidance if applicable\n let writeDescription: string;\n if (customType) {\n const schemaGuidance = SchemaParser.toPromptDescription(customType);\n const example = SchemaParser.generateExample(customType);\n writeDescription = `Write a value to \"${key}\" that must follow this schema:\\n${schemaGuidance}\\n\\nExample format:\\n${example}`;\n } else if (isDocument) {\n writeDescription = `Rewrite the entire \"${key}\" document`;\n } else {\n writeDescription = `Write a value to the STM key: ${key}`;\n }\n\n // 1. write_ tool (for all writable keys)\n tools[`write_${sanitizedKey}`] = {\n description: writeDescription,\n parameters: {\n type: 'object',\n properties: {\n value: { type: 'string', description: customType ? `Value following ${customTypeName} schema` : (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 parameters: {\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 parameters: {\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 parameters: {\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 // Add info about create_key tool and registered types\n const registeredTypes = mc.getRegisteredTypes();\n if (registeredTypes.length > 0) {\n lines.push(`[create_key tool available - registered types: ${registeredTypes.join(', ')}]`);\n lines.push('');\n }\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 // Check for custom type\n const customTypeName = mc.getKeyType(key);\n const customType = customTypeName ? mc.getTypeSchema(customTypeName) : undefined;\n\n if (isWritable) {\n if (customType) {\n // Key with custom type - include schema in prompt\n const schemaInfo = SchemaParser.toMarkdown(customType);\n lines.push(\n `${key} (type: ${customTypeName}): ${displayValue}\\n` +\n `Schema:\\n${schemaInfo}\\n` +\n `Tool: write_${sanitizedKey}`\n );\n } else 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 if (customTypeName) {\n lines.push(`${key} (type: ${customTypeName}): ${displayValue}`);\n } else {\n lines.push(`${key}: ${displayValue}`);\n }\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, CustomTypeDefinition } from './types';\nimport { DEFAULT_KEY_ATTRIBUTES } from './types';\n\n// Re-export SystemTag for convenience\nexport type { SystemTag } from './types';\nimport { SchemaParser } from './SchemaParser';\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 (not needed for OAuth - auto-provisioned) */\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 * OAuth configuration for browser apps using \"Sign in with MindCache\"\n * When set, user authentication and instance provisioning is automatic\n */\n oauth?: {\n /** Client ID from MindCache developer portal */\n clientId: string;\n /** Redirect URI for OAuth callback (defaults to current URL) */\n redirectUri?: string;\n /** Scopes to request (default: ['read', 'write']) */\n scopes?: string[];\n /** Auto-redirect to login if not authenticated (default: false) */\n autoLogin?: boolean;\n };\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.6.0';\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 // Custom type registry\n private _typeRegistry: Map<string, CustomTypeDefinition> = new Map();\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 // Custom Type Methods\n // ============================================\n\n /**\n * Register a custom type with a markdown schema definition.\n *\n * Schema format:\n * ```\n * #TypeName\n * * fieldName: description of the field\n * * anotherField: description\n * ```\n *\n * @param name - Type name (e.g., 'Contact')\n * @param schema - Markdown schema definition\n * @throws Error if schema format is invalid\n */\n registerType(name: string, schema: string): void {\n const typeDef = SchemaParser.parse(schema);\n // Override name if different from schema header\n typeDef.name = name;\n this._typeRegistry.set(name, typeDef);\n }\n\n /**\n * Assign a custom type to a key.\n * The key must exist and the type must be registered.\n * Also sets the underlying type to 'json' since custom types are structured JSON data.\n *\n * @param key - Key to assign type to\n * @param typeName - Registered type name\n * @throws Error if key doesn't exist or type is not registered\n */\n setType(key: string, typeName: string): void {\n if (!this.rootMap.has(key)) {\n throw new Error(`Key \"${key}\" does not exist`);\n }\n if (!this._typeRegistry.has(typeName)) {\n throw new Error(`Type \"${typeName}\" is not registered. Use registerType() first.`);\n }\n // Custom types are JSON data, so set both type and customType\n this.set_attributes(key, { type: 'json', customType: typeName });\n }\n\n /**\n * Get a registered type schema definition.\n *\n * @param typeName - Type name to look up\n * @returns The type definition or undefined if not registered\n */\n getTypeSchema(typeName: string): CustomTypeDefinition | undefined {\n return this._typeRegistry.get(typeName);\n }\n\n /**\n * Get all registered type names.\n */\n getRegisteredTypes(): string[] {\n return Array.from(this._typeRegistry.keys());\n }\n\n /**\n * Get the custom type assigned to a key.\n *\n * @param key - Key to check\n * @returns Type name or undefined if no custom type assigned\n */\n getKeyType(key: string): string | undefined {\n const attrs = this.get_attributes(key);\n return attrs?.customType;\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 framework-agnostic tools with raw JSON Schema.\n * Works with: OpenAI SDK, Anthropic SDK, LangChain, and other frameworks.\n *\n * Tool format:\n * {\n * description: string,\n * parameters: { type: 'object', properties: {...}, required: [...] },\n * execute: async (args) => result\n * }\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_tools(): Record<string, any> {\n return AIToolBuilder.createTools(this);\n }\n\n /**\n * Generate Vercel AI SDK compatible tools for writable keys.\n * Wraps parameters with jsonSchema() for AI SDK v5 compatibility.\n * Use this with: generateText(), streamText() from 'ai' package.\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"]}
|