holosphere 2.0.0-alpha1 → 2.0.0-alpha2
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/cjs/holosphere.cjs +2 -0
- package/dist/cjs/holosphere.cjs.map +1 -0
- package/dist/esm/holosphere.js +56 -0
- package/dist/esm/holosphere.js.map +1 -0
- package/dist/index-CDfIuXew.js +15974 -0
- package/dist/index-CDfIuXew.js.map +1 -0
- package/dist/index-ifOgtDvd.cjs +3 -0
- package/dist/index-ifOgtDvd.cjs.map +1 -0
- package/dist/indexeddb-storage-CMW4qRQS.js +96 -0
- package/dist/indexeddb-storage-CMW4qRQS.js.map +1 -0
- package/dist/indexeddb-storage-DLZOgetM.cjs +2 -0
- package/dist/indexeddb-storage-DLZOgetM.cjs.map +1 -0
- package/dist/memory-storage-DQzcAZlf.js +47 -0
- package/dist/memory-storage-DQzcAZlf.js.map +1 -0
- package/dist/memory-storage-DmePEP2q.cjs +2 -0
- package/dist/memory-storage-DmePEP2q.cjs.map +1 -0
- package/dist/secp256k1-CP0ZkpAx.cjs +13 -0
- package/dist/secp256k1-CP0ZkpAx.cjs.map +1 -0
- package/dist/secp256k1-vOXp40Fx.js +2281 -0
- package/dist/secp256k1-vOXp40Fx.js.map +1 -0
- package/docs/FOSDEM_PROPOSAL.md +388 -0
- package/docs/LOCALFIRST.md +266 -0
- package/docs/contracts/api-interface.md +793 -0
- package/docs/data-model.md +476 -0
- package/docs/gun-async-usage.md +338 -0
- package/docs/plan.md +349 -0
- package/docs/quickstart.md +674 -0
- package/docs/research.md +362 -0
- package/docs/spec.md +244 -0
- package/docs/storage-backends.md +326 -0
- package/docs/tasks.md +947 -0
- package/package.json +1 -1
- package/tests/unit/ai/aggregation.test.js +0 -295
- package/tests/unit/ai/breakdown.test.js +0 -446
- package/tests/unit/ai/classifier.test.js +0 -294
- package/tests/unit/ai/council.test.js +0 -262
- package/tests/unit/ai/embeddings.test.js +0 -384
- package/tests/unit/ai/federation-ai.test.js +0 -344
- package/tests/unit/ai/h3-ai.test.js +0 -458
- package/tests/unit/ai/index.test.js +0 -304
- package/tests/unit/ai/json-ops.test.js +0 -307
- package/tests/unit/ai/llm-service.test.js +0 -390
- package/tests/unit/ai/nl-query.test.js +0 -383
- package/tests/unit/ai/relationships.test.js +0 -311
- package/tests/unit/ai/schema-extractor.test.js +0 -384
- package/tests/unit/ai/spatial.test.js +0 -279
- package/tests/unit/ai/tts.test.js +0 -279
- package/tests/unit/content.test.js +0 -332
- package/tests/unit/contract/core.test.js +0 -88
- package/tests/unit/contract/crypto.test.js +0 -198
- package/tests/unit/contract/data.test.js +0 -223
- package/tests/unit/contract/federation.test.js +0 -181
- package/tests/unit/contract/hierarchical.test.js +0 -113
- package/tests/unit/contract/schema.test.js +0 -114
- package/tests/unit/contract/social.test.js +0 -217
- package/tests/unit/contract/spatial.test.js +0 -110
- package/tests/unit/contract/subscriptions.test.js +0 -128
- package/tests/unit/contract/utils.test.js +0 -159
- package/tests/unit/core.test.js +0 -152
- package/tests/unit/crypto.test.js +0 -328
- package/tests/unit/federation.test.js +0 -234
- package/tests/unit/gun-async.test.js +0 -252
- package/tests/unit/hierarchical.test.js +0 -399
- package/tests/unit/integration/scenario-01-geographic-storage.test.js +0 -74
- package/tests/unit/integration/scenario-02-federation.test.js +0 -76
- package/tests/unit/integration/scenario-03-subscriptions.test.js +0 -102
- package/tests/unit/integration/scenario-04-validation.test.js +0 -129
- package/tests/unit/integration/scenario-05-hierarchy.test.js +0 -125
- package/tests/unit/integration/scenario-06-social.test.js +0 -135
- package/tests/unit/integration/scenario-07-persistence.test.js +0 -130
- package/tests/unit/integration/scenario-08-authorization.test.js +0 -161
- package/tests/unit/integration/scenario-09-cross-dimensional.test.js +0 -139
- package/tests/unit/integration/scenario-10-cross-holosphere-capabilities.test.js +0 -357
- package/tests/unit/integration/scenario-11-cross-holosphere-federation.test.js +0 -410
- package/tests/unit/integration/scenario-12-capability-federated-read.test.js +0 -719
- package/tests/unit/performance/benchmark.test.js +0 -85
- package/tests/unit/schema.test.js +0 -213
- package/tests/unit/spatial.test.js +0 -158
- package/tests/unit/storage.test.js +0 -195
- package/tests/unit/subscriptions.test.js +0 -328
- package/tests/unit/test-data-permanence-debug.js +0 -197
- package/tests/unit/test-data-permanence.js +0 -340
- package/tests/unit/test-key-persistence-fixed.js +0 -148
- package/tests/unit/test-key-persistence.js +0 -172
- package/tests/unit/test-relay-permanence.js +0 -376
- package/tests/unit/test-second-node.js +0 -95
- package/tests/unit/test-simple-write.js +0 -89
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-CDfIuXew.js","sources":["../src/storage/outbox-queue.js","../src/storage/sync-service.js","../src/storage/persistent-storage.js","../src/storage/nostr-client.js","../src/storage/backend-factory.js","../src/core/holosphere.js","../src/spatial/h3-operations.js","../src/storage/nostr-async.js","../src/storage/nostr-wrapper.js","../src/storage/global-tables.js","../src/schema/validator.js","../node_modules/@noble/hashes/esm/_assert.js","../node_modules/@noble/hashes/esm/utils.js","../node_modules/@noble/hashes/esm/_sha2.js","../node_modules/@noble/hashes/esm/sha256.js","../src/crypto/secp256k1.js","../src/federation/registry.js","../src/federation/hologram.js","../src/content/social-protocols.js","../src/subscriptions/manager.js","../src/hierarchical/upcast.js","../src/federation/discovery.js","../node_modules/openai/internal/qs/formats.mjs","../node_modules/openai/internal/qs/utils.mjs","../node_modules/openai/internal/qs/stringify.mjs","../node_modules/openai/version.mjs","../node_modules/openai/_shims/registry.mjs","../node_modules/openai/_shims/MultipartBody.mjs","../node_modules/openai/_shims/web-runtime.mjs","../node_modules/openai/_shims/index.mjs","../node_modules/openai/error.mjs","../node_modules/openai/internal/decoders/line.mjs","../node_modules/openai/internal/stream-utils.mjs","../node_modules/openai/streaming.mjs","../node_modules/openai/uploads.mjs","../node_modules/openai/core.mjs","../node_modules/openai/pagination.mjs","../node_modules/openai/resource.mjs","../node_modules/openai/resources/chat/completions/messages.mjs","../node_modules/openai/resources/chat/completions/completions.mjs","../node_modules/openai/resources/chat/chat.mjs","../node_modules/openai/resources/audio/speech.mjs","../node_modules/openai/resources/audio/transcriptions.mjs","../node_modules/openai/resources/audio/translations.mjs","../node_modules/openai/resources/audio/audio.mjs","../node_modules/openai/resources/batches.mjs","../node_modules/openai/lib/EventStream.mjs","../node_modules/openai/lib/AssistantStream.mjs","../node_modules/openai/resources/beta/assistants.mjs","../node_modules/openai/lib/RunnableFunction.mjs","../node_modules/openai/lib/chatCompletionUtils.mjs","../node_modules/openai/lib/parser.mjs","../node_modules/openai/lib/AbstractChatCompletionRunner.mjs","../node_modules/openai/lib/ChatCompletionRunner.mjs","../node_modules/openai/_vendor/partial-json-parser/parser.mjs","../node_modules/openai/lib/ChatCompletionStream.mjs","../node_modules/openai/lib/ChatCompletionStreamingRunner.mjs","../node_modules/openai/resources/beta/chat/completions.mjs","../node_modules/openai/resources/beta/chat/chat.mjs","../node_modules/openai/resources/beta/realtime/sessions.mjs","../node_modules/openai/resources/beta/realtime/transcription-sessions.mjs","../node_modules/openai/resources/beta/realtime/realtime.mjs","../node_modules/openai/resources/beta/threads/messages.mjs","../node_modules/openai/resources/beta/threads/runs/steps.mjs","../node_modules/openai/resources/beta/threads/runs/runs.mjs","../node_modules/openai/resources/beta/threads/threads.mjs","../node_modules/openai/resources/beta/beta.mjs","../node_modules/openai/resources/completions.mjs","../node_modules/openai/resources/containers/files/content.mjs","../node_modules/openai/resources/containers/files/files.mjs","../node_modules/openai/resources/containers/containers.mjs","../node_modules/openai/resources/embeddings.mjs","../node_modules/openai/resources/evals/runs/output-items.mjs","../node_modules/openai/resources/evals/runs/runs.mjs","../node_modules/openai/resources/evals/evals.mjs","../node_modules/openai/resources/files.mjs","../node_modules/openai/resources/fine-tuning/methods.mjs","../node_modules/openai/resources/fine-tuning/alpha/graders.mjs","../node_modules/openai/resources/fine-tuning/alpha/alpha.mjs","../node_modules/openai/resources/fine-tuning/checkpoints/permissions.mjs","../node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.mjs","../node_modules/openai/resources/fine-tuning/jobs/checkpoints.mjs","../node_modules/openai/resources/fine-tuning/jobs/jobs.mjs","../node_modules/openai/resources/fine-tuning/fine-tuning.mjs","../node_modules/openai/resources/graders/grader-models.mjs","../node_modules/openai/resources/graders/graders.mjs","../node_modules/openai/resources/images.mjs","../node_modules/openai/resources/models.mjs","../node_modules/openai/resources/moderations.mjs","../node_modules/openai/lib/ResponsesParser.mjs","../node_modules/openai/resources/responses/input-items.mjs","../node_modules/openai/lib/responses/ResponseStream.mjs","../node_modules/openai/resources/responses/responses.mjs","../node_modules/openai/resources/uploads/parts.mjs","../node_modules/openai/resources/uploads/uploads.mjs","../node_modules/openai/lib/Util.mjs","../node_modules/openai/resources/vector-stores/files.mjs","../node_modules/openai/resources/vector-stores/file-batches.mjs","../node_modules/openai/resources/vector-stores/vector-stores.mjs","../node_modules/openai/index.mjs","../src/ai/llm-service.js","../src/ai/schema-extractor.js","../src/ai/json-ops.js","../src/ai/embeddings.js","../src/ai/council.js","../src/ai/tts.js","../src/ai/nl-query.js","../src/ai/classifier.js","../src/ai/spatial.js","../src/ai/aggregation.js","../src/ai/federation-ai.js","../src/ai/relationships.js","../src/ai/breakdown.js","../src/ai/h3-ai.js","../src/ai/index.js","../src/index.js"],"sourcesContent":["/**\n * OutboxQueue - Persistent queue for reliable relay delivery\n *\n * Implements guaranteed delivery with exponential backoff retry.\n * Events are persisted to local storage and retried until delivered\n * or max retries exceeded.\n */\n\nexport class OutboxQueue {\n /**\n * @param {Object} persistentStorage - Storage adapter (IndexedDB/FileSystem)\n * @param {Object} options - Configuration options\n * @param {number} options.maxRetries - Max retry attempts (default: 5)\n * @param {number} options.baseDelay - Base delay in ms (default: 1000)\n * @param {number} options.maxDelay - Max delay cap in ms (default: 60000)\n * @param {number} options.failedTTL - TTL for failed events in ms (default: 24 hours)\n */\n constructor(persistentStorage, options = {}) {\n this.storage = persistentStorage;\n this.queuePrefix = '_outbox/';\n this.maxRetries = options.maxRetries || 5;\n this.baseDelay = options.baseDelay || 1000; // 1 second\n this.maxDelay = options.maxDelay || 60000; // 1 minute\n this.failedTTL = options.failedTTL || 24 * 60 * 60 * 1000; // 24 hours\n }\n\n /**\n * Add an event to the outbox queue\n * @param {Object} event - Signed Nostr event\n * @param {string[]} relays - Target relay URLs\n * @returns {Promise<Object>} Queue entry\n */\n async enqueue(event, relays) {\n const entry = {\n id: event.id,\n event,\n relays,\n status: 'pending',\n retries: 0,\n createdAt: Date.now(),\n nextRetryAt: Date.now(),\n failedRelays: [],\n };\n\n const key = `${this.queuePrefix}${event.id}`;\n await this.storage.put(key, entry);\n return entry;\n }\n\n /**\n * Mark an event as sent (removes from queue if successful)\n * @param {string} eventId - Event ID\n * @param {string[]} successfulRelays - Relays that accepted the event\n */\n async markSent(eventId, successfulRelays) {\n const key = `${this.queuePrefix}${eventId}`;\n const entry = await this.storage.get(key);\n if (!entry) return;\n\n if (successfulRelays.length > 0) {\n // At least one relay accepted - remove from queue\n await this.storage.delete(key);\n } else {\n // All relays failed - schedule retry\n await this._scheduleRetry(key, entry);\n }\n }\n\n /**\n * Schedule a retry with exponential backoff\n * @private\n */\n async _scheduleRetry(key, entry) {\n entry.retries++;\n\n if (entry.retries >= this.maxRetries) {\n entry.status = 'failed';\n entry.failedAt = Date.now();\n } else {\n entry.status = 'pending';\n // Exponential backoff with jitter\n const delay = Math.min(\n this.baseDelay * Math.pow(2, entry.retries) + Math.random() * 1000,\n this.maxDelay\n );\n entry.nextRetryAt = Date.now() + delay;\n }\n\n await this.storage.put(key, entry);\n }\n\n /**\n * Get all pending events ready for retry\n * @returns {Promise<Object[]>} Pending queue entries sorted by creation time\n */\n async getPendingEvents() {\n const allEntries = await this.storage.getAll(this.queuePrefix);\n const now = Date.now();\n\n return allEntries\n .filter(e => e && e.status === 'pending' && e.nextRetryAt <= now)\n .sort((a, b) => a.createdAt - b.createdAt);\n }\n\n /**\n * Get all failed events (exceeded max retries)\n * @returns {Promise<Object[]>} Failed queue entries\n */\n async getFailedEvents() {\n const allEntries = await this.storage.getAll(this.queuePrefix);\n return allEntries.filter(e => e && e.status === 'failed');\n }\n\n /**\n * Get queue statistics\n * @returns {Promise<Object>} Stats object\n */\n async getStats() {\n const allEntries = await this.storage.getAll(this.queuePrefix);\n\n const stats = {\n total: allEntries.length,\n pending: 0,\n failed: 0,\n oldestPending: null,\n oldestFailed: null,\n };\n\n for (const entry of allEntries) {\n if (!entry) continue;\n\n if (entry.status === 'pending') {\n stats.pending++;\n if (!stats.oldestPending || entry.createdAt < stats.oldestPending) {\n stats.oldestPending = entry.createdAt;\n }\n } else if (entry.status === 'failed') {\n stats.failed++;\n if (!stats.oldestFailed || entry.failedAt < stats.oldestFailed) {\n stats.oldestFailed = entry.failedAt;\n }\n }\n }\n\n return stats;\n }\n\n /**\n * Purge failed events older than maxAge\n * @param {number} maxAge - Max age in ms (default: 24 hours)\n * @returns {Promise<number>} Number of entries purged\n */\n async purgeOldFailed(maxAge = this.failedTTL) {\n const allEntries = await this.storage.getAll(this.queuePrefix);\n const now = Date.now();\n let purged = 0;\n\n for (const entry of allEntries) {\n if (entry && entry.status === 'failed' && (now - entry.failedAt) > maxAge) {\n await this.storage.delete(`${this.queuePrefix}${entry.id}`);\n purged++;\n }\n }\n\n return purged;\n }\n\n /**\n * Clear all entries from the queue\n * @returns {Promise<number>} Number of entries cleared\n */\n async clear() {\n const allEntries = await this.storage.getAll(this.queuePrefix);\n let cleared = 0;\n\n for (const entry of allEntries) {\n if (entry && entry.id) {\n await this.storage.delete(`${this.queuePrefix}${entry.id}`);\n cleared++;\n }\n }\n\n return cleared;\n }\n\n /**\n * Manually retry a failed event\n * @param {string} eventId - Event ID to retry\n * @returns {Promise<Object|null>} Updated entry or null if not found\n */\n async retryFailed(eventId) {\n const key = `${this.queuePrefix}${eventId}`;\n const entry = await this.storage.get(key);\n\n if (!entry || entry.status !== 'failed') {\n return null;\n }\n\n // Reset for retry\n entry.status = 'pending';\n entry.retries = 0;\n entry.nextRetryAt = Date.now();\n delete entry.failedAt;\n\n await this.storage.put(key, entry);\n return entry;\n }\n}\n","/**\n * SyncService - Background service for reliable sync\n *\n * Periodically processes the outbox queue to retry failed deliveries\n * and purge old failed events.\n */\n\nexport class SyncService {\n /**\n * @param {Object} client - NostrClient instance\n * @param {Object} options - Configuration options\n * @param {number} options.interval - Sync interval in ms (default: 10000)\n * @param {boolean} options.autoStart - Start automatically (default: false)\n */\n constructor(client, options = {}) {\n this.client = client;\n this.interval = options.interval || 10000; // 10 seconds\n this.running = false;\n this.timer = null;\n this._processing = false;\n\n if (options.autoStart) {\n this.start();\n }\n }\n\n /**\n * Start the background sync service\n */\n start() {\n if (this.running) return;\n this.running = true;\n this._scheduleNextRun();\n }\n\n /**\n * Stop the background sync service\n */\n stop() {\n this.running = false;\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n\n /**\n * Check if the service is running\n * @returns {boolean}\n */\n isRunning() {\n return this.running;\n }\n\n /**\n * Force an immediate sync (useful for testing or manual trigger)\n * @returns {Promise<Object>} Sync result\n */\n async syncNow() {\n return this._processOutbox();\n }\n\n /**\n * Schedule the next run\n * @private\n */\n _scheduleNextRun() {\n if (!this.running) return;\n\n this.timer = setTimeout(() => {\n this._runLoop();\n }, this.interval);\n }\n\n /**\n * Main loop iteration\n * @private\n */\n async _runLoop() {\n if (!this.running) return;\n\n try {\n await this._processOutbox();\n } catch (error) {\n console.warn('[sync] Outbox processing failed:', error.message);\n }\n\n // Schedule next run\n this._scheduleNextRun();\n }\n\n /**\n * Process pending events in the outbox\n * @private\n * @returns {Promise<Object>} Processing result\n */\n async _processOutbox() {\n // Prevent concurrent processing\n if (this._processing) {\n return { skipped: true, reason: 'already processing' };\n }\n\n this._processing = true;\n\n const result = {\n processed: 0,\n succeeded: 0,\n failed: 0,\n purged: 0,\n };\n\n try {\n if (!this.client.outboxQueue) {\n return { ...result, skipped: true, reason: 'no outbox queue' };\n }\n\n // Get pending events ready for retry\n const pending = await this.client.outboxQueue.getPendingEvents();\n result.processed = pending.length;\n\n // Process each pending event\n for (const entry of pending) {\n try {\n const deliveryResult = await this.client._attemptDelivery(entry.event, entry.relays);\n\n if (deliveryResult.successful.length > 0) {\n result.succeeded++;\n } else {\n result.failed++;\n }\n } catch (error) {\n console.warn(`[sync] Retry failed for ${entry.id}:`, error.message);\n result.failed++;\n }\n }\n\n // Purge old failed events (24 hour TTL)\n result.purged = await this.client.outboxQueue.purgeOldFailed();\n\n } finally {\n this._processing = false;\n }\n\n return result;\n }\n\n /**\n * Get sync service statistics\n * @returns {Promise<Object>} Stats including queue status\n */\n async getStats() {\n const stats = {\n running: this.running,\n interval: this.interval,\n queue: null,\n };\n\n if (this.client.outboxQueue) {\n stats.queue = await this.client.outboxQueue.getStats();\n }\n\n return stats;\n }\n}\n","/**\n * Persistent Storage Interface\n * Provides a unified API for local persistence across browser and Node.js\n */\n\n/**\n * Base class for persistent storage adapters\n */\nclass PersistentStorage {\n /**\n * Initialize storage\n * @param {string} namespace - Storage namespace (appName)\n */\n async init(namespace) {\n throw new Error('init() must be implemented by subclass');\n }\n\n /**\n * Store event\n * @param {string} key - Event ID or d-tag\n * @param {Object} event - Nostr event\n */\n async put(key, event) {\n throw new Error('put() must be implemented by subclass');\n }\n\n /**\n * Retrieve event\n * @param {string} key - Event ID or d-tag\n * @returns {Promise<Object|null>} Event or null\n */\n async get(key) {\n throw new Error('get() must be implemented by subclass');\n }\n\n /**\n * Get all events matching prefix\n * @param {string} prefix - Key prefix\n * @returns {Promise<Object[]>} Array of events\n */\n async getAll(prefix) {\n throw new Error('getAll() must be implemented by subclass');\n }\n\n /**\n * Delete event\n * @param {string} key - Event ID or d-tag\n */\n async delete(key) {\n throw new Error('delete() must be implemented by subclass');\n }\n\n /**\n * Clear all data in namespace\n */\n async clear() {\n throw new Error('clear() must be implemented by subclass');\n }\n\n /**\n * Close storage\n */\n async close() {\n throw new Error('close() must be implemented by subclass');\n }\n}\n\n/**\n * Detect environment and return appropriate storage adapter\n * @param {string} namespace - Storage namespace\n * @param {Object} options - Storage options\n * @returns {Promise<PersistentStorage>} Storage instance\n */\nasync function createPersistentStorage(namespace, options = {}) {\n // Detect environment\n const isBrowser = typeof window !== 'undefined' && typeof window.indexedDB !== 'undefined';\n const isNode = typeof process !== 'undefined' && process.versions && process.versions.node;\n\n if (isBrowser) {\n // Use IndexedDB in browser\n const { IndexedDBStorage } = await import('./indexeddb-storage.js');\n const storage = new IndexedDBStorage();\n await storage.init(namespace);\n return storage;\n } else if (isNode) {\n // Use file system in Node.js\n try {\n const { FileSystemStorage } = await import('./filesystem-storage.js');\n const storage = new FileSystemStorage(options.dataDir);\n await storage.init(namespace);\n return storage;\n } catch (error) {\n // Fall back to memory storage if filesystem module fails to load\n console.warn('FileSystemStorage not available, using MemoryStorage instead');\n const { MemoryStorage } = await import('./memory-storage.js');\n const storage = new MemoryStorage();\n await storage.init(namespace);\n return storage;\n }\n } else {\n // Fallback to memory-only storage\n const { MemoryStorage } = await import('./memory-storage.js');\n const storage = new MemoryStorage();\n await storage.init(namespace);\n return storage;\n }\n}\n\nexport { PersistentStorage, createPersistentStorage };\n","/**\n * Nostr Client - SimplePool wrapper for relay management\n * Provides connection pooling and relay management\n */\n\nimport { SimplePool, finalizeEvent, getPublicKey } from 'nostr-tools';\nimport { OutboxQueue } from './outbox-queue.js';\nimport { SyncService } from './sync-service.js';\n\n// Lazy-load WebSocket polyfill for Node.js environment\nlet webSocketPolyfillPromise = null;\nfunction ensureWebSocket() {\n if (typeof globalThis.WebSocket !== 'undefined') {\n return Promise.resolve();\n }\n\n if (!webSocketPolyfillPromise) {\n webSocketPolyfillPromise = (async () => {\n try {\n const { default: WebSocket } = await import('ws');\n globalThis.WebSocket = WebSocket;\n } catch (e) {\n // WebSocket polyfill not available, will use mock pool\n }\n })();\n }\n\n return webSocketPolyfillPromise;\n}\nimport { createPersistentStorage } from './persistent-storage.js';\n\n/**\n * NostrClient - Manages connections to Nostr relays\n */\nexport class NostrClient {\n /**\n * @param {Object} config - Configuration options\n * @param {string[]} config.relays - Array of relay URLs\n * @param {string} config.privateKey - Private key for signing (hex format)\n * @param {boolean} config.enableReconnect - Auto-reconnect on disconnect (default: true)\n * @param {boolean} config.enablePing - Auto-ping relays (default: true)\n * @param {string} config.appName - Application name for storage namespace\n * @param {boolean} config.persistence - Enable persistent storage (default: true)\n */\n constructor(config = {}) {\n if (config.relays && !Array.isArray(config.relays)) {\n throw new Error('Relays must be an array');\n }\n\n this.relays = config.relays || [];\n\n // Generate or use provided private key\n // IMPORTANT: If you want keys to persist across restarts, you MUST provide\n // a privateKey in config. Otherwise, a new key is generated each time.\n this.privateKey = config.privateKey || this._generatePrivateKey();\n this.publicKey = getPublicKey(this.privateKey);\n this.config = config;\n\n this._subscriptions = new Map();\n this._eventCache = new Map(); // In-memory cache for recent events\n this.persistentStorage = null;\n\n // Initialize pool and storage asynchronously\n this._initReady = this._initialize();\n }\n\n /**\n * Initialize WebSocket polyfill and pool\n * @private\n */\n async _initialize() {\n // Ensure WebSocket is available before initializing pool\n await ensureWebSocket();\n\n // Initialize SimplePool with options (only if relays exist)\n if (this.relays.length > 0) {\n this.pool = new SimplePool({\n enableReconnect: this.config.enableReconnect !== false,\n enablePing: this.config.enablePing !== false,\n });\n } else {\n // Mock pool for testing - returns mock promise that resolves immediately\n this.pool = {\n publish: (relays, event) => [Promise.resolve()],\n querySync: (relays, filter, options) => Promise.resolve([]),\n subscribeMany: (relays, filters, opts) => ({ close: () => {} }),\n close: (relays) => {},\n };\n }\n\n // Initialize persistent storage\n await this._initPersistentStorage();\n }\n\n /**\n * Initialize persistent storage\n * @private\n */\n async _initPersistentStorage() {\n // Only enable persistence if explicitly requested or radisk is true\n if (this.config.persistence !== false && (this.config.radisk || this.config.appName)) {\n try {\n const namespace = this.config.appName || 'holosphere_default';\n this.persistentStorage = await createPersistentStorage(namespace, {\n dataDir: this.config.dataDir\n });\n\n // Load cached events from persistent storage\n await this._loadFromPersistentStorage();\n\n // Initialize outbox queue for guaranteed delivery\n this.outboxQueue = new OutboxQueue(this.persistentStorage, {\n maxRetries: this.config.maxRetries || 5,\n baseDelay: this.config.retryBaseDelay || 1000,\n maxDelay: this.config.retryMaxDelay || 60000,\n failedTTL: this.config.failedTTL || 24 * 60 * 60 * 1000, // 24 hours\n });\n\n // Start background sync service\n if (this.config.backgroundSync !== false) {\n this.syncService = new SyncService(this, {\n interval: this.config.syncInterval || 10000, // 10 seconds\n autoStart: true,\n });\n }\n } catch (error) {\n console.warn('Failed to initialize persistent storage:', error);\n // Continue without persistence\n }\n }\n }\n\n /**\n * Load events from persistent storage into cache\n * @private\n */\n async _loadFromPersistentStorage() {\n if (!this.persistentStorage) return;\n\n try {\n // Load all events (excluding outbox queue entries)\n const events = await this.persistentStorage.getAll('');\n for (const event of events) {\n // Skip outbox queue entries\n if (event && event.id && !event.status) {\n // Add to cache\n this._cacheEventSync(event);\n }\n }\n } catch (error) {\n console.warn('Failed to load from persistent storage:', error);\n }\n }\n\n /**\n * Get a single event from persistent storage by path (d-tag)\n * @param {string} path - The d-tag path to look up\n * @returns {Promise<Object|null>} The event or null if not found\n */\n async persistentGet(path) {\n await this._initReady;\n if (!this.persistentStorage) return null;\n try {\n const event = await this.persistentStorage.get(path);\n return event || null;\n } catch (error) {\n console.warn('[nostr] Persistent storage read failed:', error);\n return null;\n }\n }\n\n /**\n * Get all events from persistent storage matching a prefix\n * @param {string} prefix - The path prefix to match\n * @returns {Promise<Array>} Array of events\n */\n async persistentGetAll(prefix) {\n await this._initReady;\n if (!this.persistentStorage) return [];\n try {\n const events = await this.persistentStorage.getAll(prefix);\n // Filter out outbox queue entries and null values\n return events.filter(e => e && e.id && !e.status);\n } catch (error) {\n console.warn('[nostr] Persistent storage read failed:', error);\n return [];\n }\n }\n\n /**\n * Generate random private key\n * @private\n */\n _generatePrivateKey() {\n const bytes = new Uint8Array(32);\n if (typeof window !== 'undefined' && window.crypto) {\n window.crypto.getRandomValues(bytes);\n } else {\n // Node.js - use dynamic import\n try {\n // Use crypto.randomFillSync if available\n const crypto = globalThis.crypto || global.crypto;\n if (crypto && crypto.getRandomValues) {\n crypto.getRandomValues(bytes);\n } else {\n // Fallback to Math.random (less secure, but works in testing)\n for (let i = 0; i < 32; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n }\n } catch (e) {\n // Fallback to Math.random\n for (let i = 0; i < 32; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n }\n }\n return Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n }\n\n /**\n * Publish event to relays\n * @param {Object} event - Unsigned event object\n * @param {Object} options - Publish options\n * @param {boolean} options.waitForRelays - Wait for relay confirmation (default: false for speed)\n * @returns {Promise<Object>} Signed event with relay publish results\n */\n async publish(event, options = {}) {\n // Ensure initialization is complete\n await this._initReady;\n\n const waitForRelays = options.waitForRelays || false;\n\n // Sign the event\n const signedEvent = finalizeEvent(event, this.privateKey);\n\n // 1. Cache the event locally first (this makes reads instant)\n await this._cacheEvent(signedEvent);\n\n // 2. Enqueue for guaranteed delivery (if outbox queue available)\n if (this.outboxQueue) {\n await this.outboxQueue.enqueue(signedEvent, this.relays);\n }\n\n // 3. Publish to relays\n if (waitForRelays) {\n // Wait for relay confirmation if explicitly requested\n const deliveryResult = await this._attemptDelivery(signedEvent, this.relays);\n\n return {\n event: signedEvent,\n results: deliveryResult.results,\n queued: !!this.outboxQueue,\n };\n } else {\n // Fire and forget - publish in background, return immediately\n this._attemptDelivery(signedEvent, this.relays).catch(err => {\n console.warn('[nostr] Immediate delivery failed, queued for retry:', err.message);\n });\n\n // Return immediately (data is in local cache and queued for delivery)\n return {\n event: signedEvent,\n results: [],\n queued: !!this.outboxQueue,\n };\n }\n }\n\n /**\n * Attempt to deliver event to relays\n * Updates outbox queue with delivery status\n * @param {Object} event - Signed event to deliver\n * @param {string[]} relays - Target relay URLs\n * @returns {Promise<Object>} Delivery result with successful/failed relays\n */\n async _attemptDelivery(event, relays) {\n const results = await Promise.allSettled(\n this.pool.publish(relays, event)\n );\n\n const successful = [];\n const failed = [];\n const formattedResults = [];\n\n results.forEach((r, i) => {\n formattedResults.push({\n relay: relays[i],\n status: r.status,\n value: r.value,\n reason: r.reason,\n });\n\n if (r.status === 'fulfilled') {\n successful.push(relays[i]);\n } else {\n failed.push(relays[i]);\n }\n });\n\n // Update outbox queue with delivery status\n if (this.outboxQueue) {\n await this.outboxQueue.markSent(event.id, successful);\n }\n\n // Log failures for debugging\n if (failed.length > 0) {\n const reasons = results\n .filter(r => r.status === 'rejected')\n .map(f => f.reason?.message || f.reason || 'unknown')\n .join(', ');\n console.warn(`[nostr] ${failed.length}/${relays.length} relays failed for ${event.id.slice(0, 8)}: ${reasons}`);\n }\n\n return { successful, failed, results: formattedResults };\n }\n\n /**\n * Query events from relays\n * @param {Object} filter - Nostr filter object\n * @param {Object} options - Query options\n * @param {number} options.timeout - Query timeout in ms (default: 30000, set to 0 for no timeout)\n * @param {boolean} options.localFirst - Return local cache immediately, refresh in background (default: true)\n * @returns {Promise<Array>} Array of events\n */\n async query(filter, options = {}) {\n // Ensure initialization is complete\n await this._initReady;\n\n const timeout = options.timeout !== undefined ? options.timeout : 30000;\n const localFirst = options.localFirst !== false; // Default to true for speed\n\n // If no relays, query from cache only\n if (this.relays.length === 0) {\n const matchingEvents = this._getMatchingCachedEvents(filter);\n return matchingEvents;\n }\n\n // Check d-tag cache first for single-item queries (most common case)\n // This ensures recently written data is returned immediately\n if (filter['#d'] && filter['#d'].length === 1 && filter.kinds && filter.kinds.length === 1) {\n const dTagKey = `d:${filter.kinds[0]}:${filter['#d'][0]}`;\n const dTagCached = this._eventCache.get(dTagKey);\n if (dTagCached && Date.now() - dTagCached.timestamp < 5000) {\n return dTagCached.events;\n }\n }\n\n const cacheKey = JSON.stringify(filter);\n const cached = this._eventCache.get(cacheKey);\n\n // Return fresh cache immediately\n if (cached && Date.now() - cached.timestamp < 5000) {\n return cached.events;\n }\n\n // If we have stale cache and localFirst is enabled, return it immediately\n // and refresh in background\n if (localFirst && cached) {\n // Refresh cache in background\n this._refreshCacheInBackground(filter, cacheKey, timeout);\n return cached.events;\n }\n\n // No cache available or localFirst disabled - must query relays\n return this._queryRelaysAndCache(filter, cacheKey, timeout);\n }\n\n /**\n * Query relays and update cache\n * @private\n */\n async _queryRelaysAndCache(filter, cacheKey, timeout) {\n let events = await this.pool.querySync(this.relays, filter, { timeout });\n\n // CRITICAL: Filter out events from other authors (relay may not respect filter)\n if (filter.authors && filter.authors.length > 0) {\n events = events.filter(event => filter.authors.includes(event.pubkey));\n }\n\n // Cache results\n this._eventCache.set(cacheKey, {\n events,\n timestamp: Date.now(),\n });\n\n // Limit cache size\n if (this._eventCache.size > 100) {\n const firstKey = this._eventCache.keys().next().value;\n this._eventCache.delete(firstKey);\n }\n\n return events;\n }\n\n /**\n * Refresh cache in background (fire and forget)\n * @private\n */\n _refreshCacheInBackground(filter, cacheKey, timeout) {\n this._queryRelaysAndCache(filter, cacheKey, timeout).catch(err => {\n // Silently ignore background refresh errors - we have stale cache as fallback\n console.debug('[nostr] Background cache refresh failed:', err.message);\n });\n }\n\n /**\n * Refresh a single path from relays in the background\n * Used for persistent-first reads to update local data\n * @param {string} path - The d-tag path to refresh\n * @param {number} kind - Event kind (default: 30000)\n * @param {Object} options - Query options\n */\n refreshPathInBackground(path, kind = 30000, options = {}) {\n this._doBackgroundPathRefresh(path, kind, options).catch(err => {\n console.debug('[nostr] Background path refresh failed:', err.message);\n });\n }\n\n /**\n * Internal method to refresh a path from relays\n * @private\n */\n async _doBackgroundPathRefresh(path, kind, options) {\n if (this.relays.length === 0) return;\n\n const filter = {\n kinds: [kind],\n authors: options.authors || [this.publicKey],\n '#d': [path],\n limit: 1,\n };\n\n const timeout = options.timeout || 30000;\n const events = await this.pool.querySync(this.relays, filter, { timeout });\n\n // Filter by author (relays may not respect filter)\n const authorFiltered = events.filter(e =>\n (options.authors || [this.publicKey]).includes(e.pubkey)\n );\n\n if (authorFiltered.length > 0) {\n // Update cache and persistent storage\n await this._cacheEvent(authorFiltered[0]);\n }\n }\n\n /**\n * Refresh all paths with a prefix from relays in the background\n * Used for persistent-first collection reads\n * @param {string} prefix - The d-tag prefix to refresh\n * @param {number} kind - Event kind (default: 30000)\n * @param {Object} options - Query options\n */\n refreshPrefixInBackground(prefix, kind = 30000, options = {}) {\n this._doBackgroundPrefixRefresh(prefix, kind, options).catch(err => {\n console.debug('[nostr] Background prefix refresh failed:', err.message);\n });\n }\n\n /**\n * Internal method to refresh a prefix from relays\n * @private\n */\n async _doBackgroundPrefixRefresh(prefix, kind, options) {\n if (this.relays.length === 0) return;\n\n // Query with wildcard-ish filter (relays handle d-tag prefix matching)\n const filter = {\n kinds: [kind],\n authors: options.authors || [this.publicKey],\n limit: options.limit || 1000,\n };\n\n const timeout = options.timeout || 30000;\n let events = await this.pool.querySync(this.relays, filter, { timeout });\n\n // Filter by author\n events = events.filter(e =>\n (options.authors || [this.publicKey]).includes(e.pubkey)\n );\n\n // Filter by d-tag prefix (client-side since relays don't support prefix matching)\n events = events.filter(e => {\n const dTag = e.tags.find(t => t[0] === 'd');\n return dTag && dTag[1] && dTag[1].startsWith(prefix);\n });\n\n // Update cache and persistent storage for each event\n for (const event of events) {\n await this._cacheEvent(event);\n }\n }\n\n /**\n * Hybrid query: Check local cache first, then query relays for missing data\n * Merges local and relay results, preferring newer events\n * @param {Object} filter - Nostr filter object\n * @param {Object} options - Query options\n * @param {number} options.timeout - Query timeout in ms (default: 30000)\n * @returns {Promise<Array>} Array of events (merged from local + relay)\n */\n async queryHybrid(filter, options = {}) {\n // Ensure initialization is complete\n await this._initReady;\n\n const timeout = options.timeout !== undefined ? options.timeout : 30000;\n\n // Step 1: Get events from local cache\n const localEvents = this._getMatchingCachedEvents(filter);\n\n // If no relays configured, return local only\n if (this.relays.length === 0) {\n return localEvents;\n }\n\n // Step 2: Query relays\n let relayEvents = [];\n try {\n relayEvents = await this.pool.querySync(this.relays, filter, { timeout });\n\n // Filter out events from other authors\n if (filter.authors && filter.authors.length > 0) {\n relayEvents = relayEvents.filter(event => filter.authors.includes(event.pubkey));\n }\n } catch (error) {\n console.warn('Relay query failed, using local cache only:', error.message);\n }\n\n // Step 3: Merge results (prefer newer events for replaceable events)\n const merged = new Map();\n\n // Add local events first\n for (const event of localEvents) {\n const key = this._getEventKey(event);\n merged.set(key, event);\n }\n\n // Add or update with relay events (relay events are authoritative)\n for (const event of relayEvents) {\n const key = this._getEventKey(event);\n const existing = merged.get(key);\n\n // For replaceable events, prefer newer\n if (event.kind >= 30000 && event.kind < 40000 && existing) {\n if (event.created_at >= existing.created_at) {\n merged.set(key, event);\n }\n } else {\n // For non-replaceable or if no existing, just add\n merged.set(key, event);\n }\n }\n\n const result = Array.from(merged.values());\n\n // Cache the merged results\n const cacheKey = JSON.stringify(filter);\n this._eventCache.set(cacheKey, {\n events: result,\n timestamp: Date.now(),\n });\n\n return result;\n }\n\n /**\n * Get unique key for event (for merging)\n * @private\n */\n _getEventKey(event) {\n // For replaceable events with d-tag, use kind:dtag\n if (event.kind >= 30000 && event.kind < 40000) {\n const dTag = event.tags.find(t => t[0] === 'd');\n if (dTag && dTag[1]) {\n return `${event.kind}:${dTag[1]}`;\n }\n }\n // Otherwise use event id\n return event.id;\n }\n\n /**\n * Subscribe to events\n * @param {Object} filter - Nostr filter object\n * @param {Function} onEvent - Callback for each event\n * @param {Object} options - Subscription options\n * @returns {Object} Subscription object with unsubscribe method\n */\n async subscribe(filter, onEvent, options = {}) {\n // Ensure initialization is complete\n await this._initReady;\n\n const subId = `sub-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n // If no relays, check cache for matching events and trigger callbacks\n if (this.relays.length === 0) {\n // Trigger with cached events that match the filter\n const matchingEvents = this._getMatchingCachedEvents(filter);\n\n // Create a mock subscription that watches for new cache entries\n const mockSub = {\n filter,\n onEvent,\n active: true\n };\n\n this._subscriptions.set(subId, mockSub);\n\n // Trigger callbacks asynchronously to mimic real subscription behavior\n // Check active flag to avoid triggering if unsubscribed immediately\n setTimeout(() => {\n if (mockSub.active) {\n matchingEvents.forEach(event => onEvent(event));\n if (options.onEOSE) options.onEOSE();\n }\n }, 10);\n\n return {\n id: subId,\n unsubscribe: () => {\n mockSub.active = false;\n this._subscriptions.delete(subId);\n // Clear the subscription's onEvent to prevent any further calls\n mockSub.onEvent = () => {};\n // Note: active flag is checked before triggering callbacks\n },\n };\n }\n\n const sub = this.pool.subscribeMany(\n this.relays,\n [filter],\n {\n onevent: (event) => {\n // CRITICAL: Filter out events from other authors immediately\n // Many relays don't respect the authors filter, so we must do it client-side\n if (filter.authors && filter.authors.length > 0) {\n if (!filter.authors.includes(event.pubkey)) {\n // Silently reject events from other authors\n return;\n }\n }\n\n this._cacheEvent(event);\n onEvent(event);\n },\n oneose: () => {\n if (options.onEOSE) options.onEOSE();\n },\n }\n );\n\n this._subscriptions.set(subId, sub);\n\n return {\n id: subId,\n unsubscribe: () => {\n if (sub.close) sub.close();\n this._subscriptions.delete(subId);\n },\n };\n }\n\n /**\n * Cache event in memory (synchronous version for loading)\n * @private\n */\n _cacheEventSync(event) {\n const key = event.id;\n this._eventCache.set(key, {\n events: [event],\n timestamp: Date.now(),\n });\n\n // For replaceable events (kind 30000-39999), also cache by d-tag\n if (event.kind >= 30000 && event.kind < 40000) {\n const dTag = event.tags.find(t => t[0] === 'd');\n if (dTag && dTag[1]) {\n const dTagKey = `d:${event.kind}:${dTag[1]}`;\n const existing = this._eventCache.get(dTagKey);\n\n // Replace if newer, or if same timestamp but different event ID (for events in same second)\n const shouldReplace = !existing || !existing.events[0] ||\n event.created_at > existing.events[0].created_at ||\n (event.created_at === existing.events[0].created_at && event.id !== existing.events[0].id);\n\n if (shouldReplace) {\n this._eventCache.set(dTagKey, {\n events: [event],\n timestamp: Date.now(),\n });\n\n // Remove old event from cache if it exists\n if (existing && existing.events[0]) {\n this._eventCache.delete(existing.events[0].id);\n }\n\n // Invalidate any query caches that might contain stale data for this d-tag\n // Query caches are JSON-stringified filters, so we look for any that match this event\n this._invalidateQueryCachesForEvent(event);\n }\n }\n }\n }\n\n /**\n * Invalidate query caches that might be affected by a new event\n * @private\n */\n _invalidateQueryCachesForEvent(event) {\n // Find and remove query cache entries that could match this event\n // Query cache keys are JSON-stringified filters\n const keysToDelete = [];\n\n for (const [cacheKey, cached] of this._eventCache.entries()) {\n // Skip non-query caches (event IDs and d-tag keys)\n if (!cacheKey.startsWith('{')) continue;\n\n try {\n const filter = JSON.parse(cacheKey);\n // Check if this event would match the filter\n if (this._eventMatchesFilter(event, filter)) {\n keysToDelete.push(cacheKey);\n }\n } catch {\n // Not a JSON key, skip\n }\n }\n\n for (const key of keysToDelete) {\n this._eventCache.delete(key);\n }\n }\n\n /**\n * Cache event in memory and persist\n * @private\n */\n async _cacheEvent(event) {\n // Cache in memory\n this._cacheEventSync(event);\n\n // Persist to storage\n if (this.persistentStorage) {\n try {\n // For replaceable events, use d-tag as key\n let storageKey = event.id;\n if (event.kind >= 30000 && event.kind < 40000) {\n const dTag = event.tags.find(t => t[0] === 'd');\n if (dTag && dTag[1]) {\n storageKey = dTag[1]; // Use d-tag as key for replaceable events\n }\n }\n\n await this.persistentStorage.put(storageKey, event);\n } catch (error) {\n console.warn('Failed to persist event:', error);\n }\n }\n\n // Trigger any active subscriptions that match this event\n if (this.relays.length === 0) {\n for (const sub of this._subscriptions.values()) {\n if (sub.active && this._eventMatchesFilter(event, sub.filter)) {\n // Trigger callback asynchronously, but check active status again\n setTimeout(() => {\n if (sub.active) {\n sub.onEvent(event);\n }\n }, 10);\n }\n }\n }\n }\n\n /**\n * Get cached events matching a filter\n * @private\n */\n _getMatchingCachedEvents(filter) {\n const matchingEvents = [];\n const seenDTags = new Map(); // For deduplicating replaceable events\n\n for (const cached of this._eventCache.values()) {\n for (const event of (cached.events || [])) {\n if (this._eventMatchesFilter(event, filter)) {\n // For replaceable events (kind 30000-39999), keep only the newest\n if (event.kind >= 30000 && event.kind < 40000) {\n const dTag = event.tags.find(t => t[0] === 'd');\n if (dTag && dTag[1]) {\n const dTagKey = `${event.kind}:${dTag[1]}`;\n const existing = seenDTags.get(dTagKey);\n\n // Replace if newer, or if same timestamp with _deleted flag (tombstones)\n const shouldReplace = !existing ||\n event.created_at > existing.created_at ||\n (event.created_at === existing.created_at &&\n JSON.parse(event.content)?._deleted &&\n !JSON.parse(existing.content)?._deleted);\n\n if (shouldReplace) {\n // Remove old event if exists\n if (existing) {\n const idx = matchingEvents.indexOf(existing);\n if (idx > -1) matchingEvents.splice(idx, 1);\n }\n seenDTags.set(dTagKey, event);\n matchingEvents.push(event);\n }\n continue;\n }\n }\n\n // Regular events or replaceable events without d-tag\n matchingEvents.push(event);\n }\n }\n }\n\n return matchingEvents;\n }\n\n /**\n * Check if event matches filter\n * @private\n */\n _eventMatchesFilter(event, filter) {\n // Check kinds\n if (filter.kinds && !filter.kinds.includes(event.kind)) {\n return false;\n }\n\n // Check IDs\n if (filter.ids && !filter.ids.includes(event.id)) {\n return false;\n }\n\n // Check authors\n if (filter.authors && !filter.authors.includes(event.pubkey)) {\n return false;\n }\n\n // Check #d tag (for replaceable events)\n if (filter['#d']) {\n const dTag = event.tags.find(t => t[0] === 'd');\n if (!dTag || !filter['#d'].includes(dTag[1])) {\n return false;\n }\n }\n\n // Check since/until\n if (filter.since && event.created_at < filter.since) {\n return false;\n }\n if (filter.until && event.created_at > filter.until) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Get single event by ID\n * @param {string} eventId - Event ID (hex)\n * @returns {Promise<Object|null>} Event or null\n */\n async getEvent(eventId) {\n const events = await this.query({ ids: [eventId] });\n return events.length > 0 ? events[0] : null;\n }\n\n /**\n * Clear the event cache (or specific entries matching a pattern)\n * @param {string} [pattern] - Optional d-tag pattern to match (clears all if not provided)\n */\n clearCache(pattern = null) {\n if (!pattern) {\n this._eventCache.clear();\n return;\n }\n\n // Clear entries matching the pattern\n for (const key of this._eventCache.keys()) {\n if (key.includes(pattern)) {\n this._eventCache.delete(key);\n }\n }\n }\n\n /**\n * Close all connections and subscriptions\n */\n close() {\n // Stop background sync service\n if (this.syncService) {\n this.syncService.stop();\n }\n\n // Close all subscriptions\n for (const sub of this._subscriptions.values()) {\n if (sub.close) {\n sub.close();\n } else if (sub.active !== undefined) {\n // Mock subscription\n sub.active = false;\n }\n }\n this._subscriptions.clear();\n\n // Close pool\n this.pool.close(this.relays);\n\n // Clear cache\n this._eventCache.clear();\n }\n\n /**\n * Get relay status\n * @returns {Array} Relay connection statuses\n */\n getRelayStatus() {\n return this.relays.map(relay => ({\n url: relay,\n connected: true, // SimplePool manages this internally\n }));\n }\n}\n\n/**\n * Create NostrClient instance\n * @param {Object} config - Configuration options\n * @returns {NostrClient} Client instance\n */\nexport function createClient(config) {\n return new NostrClient(config);\n}\n","/**\n * Factory for creating storage backends\n * Supports lazy loading of backend implementations\n */\n\nconst BACKEND_MODULES = {\n nostr: './backends/nostr-backend.js',\n gundb: './backends/gundb-backend.js',\n activitypub: './backends/activitypub-backend.js',\n};\n\n// Cache for loaded backend classes\nconst loadedBackends = new Map();\n\n/**\n * Factory for creating storage backends\n */\nexport class BackendFactory {\n /**\n * Get list of available backend types\n * @returns {string[]} Available backend type names\n */\n static getAvailableBackends() {\n return Object.keys(BACKEND_MODULES);\n }\n\n /**\n * Check if a backend type is available\n * @param {string} type - Backend type\n * @returns {boolean} Whether the backend is available\n */\n static isAvailable(type) {\n return type in BACKEND_MODULES;\n }\n\n /**\n * Load a backend class dynamically\n * @param {string} type - Backend type\n * @returns {Promise<Class>} Backend class\n */\n static async loadBackend(type) {\n if (loadedBackends.has(type)) {\n return loadedBackends.get(type);\n }\n\n const modulePath = BACKEND_MODULES[type];\n if (!modulePath) {\n throw new Error(\n `Unknown backend type: '${type}'. Available backends: ${Object.keys(BACKEND_MODULES).join(', ')}`\n );\n }\n\n try {\n const module = await import(modulePath);\n const BackendClass = module.default || module[`${capitalize(type)}Backend`];\n\n if (!BackendClass) {\n throw new Error(`Backend module '${type}' does not export a valid backend class`);\n }\n\n loadedBackends.set(type, BackendClass);\n return BackendClass;\n } catch (error) {\n if (error.code === 'ERR_MODULE_NOT_FOUND') {\n throw new Error(\n `Backend '${type}' requires additional dependencies. ` +\n `Please install them: ${getDependencyHint(type)}`\n );\n }\n throw error;\n }\n }\n\n /**\n * Create a storage backend instance\n * @param {string} type - Backend type: 'nostr' | 'gundb' | 'activitypub'\n * @param {Object} config - Backend-specific configuration\n * @returns {Promise<StorageBackend>} Initialized backend\n */\n static async create(type, config) {\n const BackendClass = await this.loadBackend(type);\n const backend = new BackendClass(config);\n await backend.init();\n return backend;\n }\n\n /**\n * Register a custom backend\n * @param {string} name - Backend name\n * @param {Class|string} BackendClassOrPath - Backend class or module path\n */\n static register(name, BackendClassOrPath) {\n if (typeof BackendClassOrPath === 'string') {\n BACKEND_MODULES[name] = BackendClassOrPath;\n } else {\n loadedBackends.set(name, BackendClassOrPath);\n BACKEND_MODULES[name] = null; // Mark as registered but not file-based\n }\n }\n}\n\n/**\n * Capitalize first letter\n * @param {string} str - String to capitalize\n * @returns {string} Capitalized string\n */\nfunction capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Get dependency installation hint for a backend\n * @param {string} type - Backend type\n * @returns {string} Installation hint\n */\nfunction getDependencyHint(type) {\n const hints = {\n nostr: 'npm install nostr-tools',\n gundb: 'npm install gun',\n activitypub: 'npm install express',\n };\n return hints[type] || 'Check the documentation for required dependencies';\n}\n\nexport default BackendFactory;\n","import { createClient } from '../storage/nostr-client.js';\nimport { BackendFactory } from '../storage/backend-factory.js';\nimport pkg from '../../package.json' with { type: 'json' };\n\n/**\n * Get environment variable (works in Node.js, returns undefined in browser)\n * @param {string} name - Environment variable name\n * @returns {string|undefined}\n */\nfunction getEnv(name) {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n return undefined;\n}\n\n/**\n * Parse relay URLs from environment variable or use defaults\n * @returns {string[]}\n */\nfunction getDefaultRelays() {\n const envRelays = getEnv('HOLOSPHERE_RELAYS');\n if (envRelays) {\n return envRelays.split(',').map(r => r.trim()).filter(r => r);\n }\n return ['wss://relay.holons.io'];\n}\n\n/**\n * HoloSphere - Holonic Geospatial Communication Infrastructure\n * Combines H3 hexagonal indexing with distributed P2P storage\n * Supports multiple storage backends: nostr, gundb, activitypub\n */\nexport class HoloSphere {\n /**\n * @param {Object} config - Configuration options\n * @param {string} config.appName - Application namespace (default: 'holosphere')\n * @param {string} config.backend - Storage backend: 'nostr' | 'gundb' | 'activitypub' (default: 'nostr')\n * @param {string[]} config.relays - Nostr relay URLs (default from HOLOSPHERE_RELAYS env or ['wss://relay.holons.io', 'wss://relay.nostr.band'])\n * @param {string} config.privateKey - Private key for signing (hex format, optional)\n * @param {string} config.logLevel - Log verbosity: ERROR|WARN|INFO|DEBUG (default: 'WARN')\n * @param {boolean} config.hybridMode - Enable hybrid mode (local + relay queries) (default: true)\n * @param {Object} config.gundb - GunDB-specific configuration\n * @param {Object} config.activitypub - ActivityPub-specific configuration\n */\n constructor(config = {}) {\n // Allow string as shorthand for appName (backward compatibility)\n if (typeof config === 'string') {\n config = { appName: config };\n }\n\n // Validate config\n if (config && typeof config !== 'object') {\n throw new TypeError('Config must be an object');\n }\n\n // Validate individual config properties\n if (config.appName !== undefined && typeof config.appName !== 'string') {\n throw new TypeError('config.appName must be a string');\n }\n if (config.relays !== undefined && !Array.isArray(config.relays)) {\n throw new TypeError('config.relays must be an array');\n }\n if (config.logLevel !== undefined && !['ERROR', 'WARN', 'INFO', 'DEBUG'].includes(config.logLevel)) {\n throw new TypeError('config.logLevel must be one of: ERROR, WARN, INFO, DEBUG');\n }\n if (config.backend !== undefined && !BackendFactory.isAvailable(config.backend)) {\n throw new TypeError(`config.backend must be one of: ${BackendFactory.getAvailableBackends().join(', ')}`);\n }\n\n // Set defaults (with environment variable fallbacks)\n this.config = {\n appName: config.appName || getEnv('HOLOSPHERE_APP_NAME') || 'holosphere',\n backend: config.backend || 'nostr',\n relays: config.relays || getDefaultRelays(),\n privateKey: config.privateKey || getEnv('HOLOSPHERE_PRIVATE_KEY'),\n logLevel: config.logLevel || getEnv('HOLOSPHERE_LOG_LEVEL') || 'WARN',\n hybridMode: config.hybridMode !== false, // Enable by default\n };\n\n // Store raw config for backend initialization\n this._rawConfig = config;\n\n // Initialize logging\n this.logLevels = { ERROR: 0, WARN: 1, INFO: 2, DEBUG: 3 };\n this.currentLogLevel = this.logLevels[this.config.logLevel] || 1;\n\n // Backend instance (set during initialization)\n this._backend = null;\n\n // For backward compatibility with Nostr, initialize synchronously\n // Other backends use async initialization via _backendReady\n if (this.config.backend === 'nostr') {\n this._initNostrSync(config);\n } else {\n // Async initialization for other backends\n this._backendReady = this._initBackendAsync(config);\n }\n\n // Metrics tracking\n this._metrics = {\n writes: 0,\n reads: 0,\n subscriptions: 0,\n };\n }\n\n /**\n * Initialize Nostr backend synchronously (for backward compatibility)\n * @private\n */\n _initNostrSync(config) {\n try {\n this.client = createClient({\n relays: this.config.relays,\n privateKey: this.config.privateKey,\n enableReconnect: config.enableReconnect !== false,\n enablePing: config.enablePing !== false,\n appName: this.config.appName,\n radisk: config.radisk !== false,\n persistence: config.persistence !== false,\n dataDir: config.dataDir,\n });\n\n // Log startup information\n this._logStartup({\n version: pkg.version,\n appName: this.config.appName,\n backend: 'nostr',\n relays: this.config.relays,\n publicKey: this.client.publicKey,\n logLevel: this.config.logLevel,\n persistence: config.persistence !== false,\n reconnect: config.enableReconnect !== false,\n dataDir: config.dataDir,\n });\n\n // Backend ready immediately for Nostr\n this._backendReady = Promise.resolve();\n } catch (error) {\n this._log('ERROR', 'Nostr client initialization failed', { error: error.message });\n throw new Error(`Nostr client initialization failed: ${error.message}`);\n }\n }\n\n /**\n * Initialize non-Nostr backends asynchronously\n * @private\n */\n async _initBackendAsync(config) {\n const backendType = this.config.backend;\n const backendSpecificConfig = config[backendType] || {};\n\n try {\n // Merge common config with backend-specific config\n const backendConfig = {\n appName: this.config.appName,\n privateKey: this.config.privateKey,\n persistence: config.persistence !== false,\n dataDir: config.dataDir,\n ...backendSpecificConfig,\n };\n\n this._backend = await BackendFactory.create(backendType, backendConfig);\n\n // For compatibility, also set client if backend has one\n this.client = this._backend.client || this._backend;\n\n // Log startup information\n this._logStartup({\n version: pkg.version,\n appName: this.config.appName,\n backend: backendType,\n publicKey: this._backend.publicKey,\n logLevel: this.config.logLevel,\n persistence: config.persistence !== false,\n ...this._backend.getStatus(),\n });\n } catch (error) {\n this._log('ERROR', `${backendType} backend initialization failed`, { error: error.message });\n throw new Error(`${backendType} backend initialization failed: ${error.message}`);\n }\n }\n\n /**\n * Ensure backend is ready before operations\n * @returns {Promise<void>}\n */\n async ready() {\n if (this._backendReady) {\n await this._backendReady;\n }\n }\n\n /**\n * Get the storage backend instance\n * @returns {StorageBackend|null}\n */\n get backend() {\n return this._backend;\n }\n\n /**\n * Internal structured logging\n * @private\n */\n _log(level, message, data = {}) {\n if (this.logLevels[level] <= this.currentLogLevel) {\n const logEntry = {\n timestamp: Date.now(),\n level,\n message,\n app: this.config.appName,\n ...data,\n };\n console.log(JSON.stringify(logEntry));\n }\n }\n\n /**\n * Log startup information in a user-friendly format\n * @private\n */\n _logStartup(info) {\n // Only log if INFO or DEBUG level\n if (this.currentLogLevel >= this.logLevels.INFO) {\n console.log('\\n' + '='.repeat(60));\n console.log(' HoloSphere - Holonic Geospatial Infrastructure');\n console.log('='.repeat(60));\n console.log(` Version: ${info.version}`);\n console.log(` App Name: ${info.appName}`);\n console.log(` Backend: ${info.backend || 'nostr'}`);\n console.log(` Public Key: ${info.publicKey ? info.publicKey.substring(0, 16) + '...' : 'N/A'}`);\n console.log(` Log Level: ${info.logLevel}`);\n console.log(` Persistence: ${info.persistence ? 'Enabled' : 'Disabled'}${info.dataDir ? ` (${info.dataDir})` : ''}`);\n\n // Backend-specific info\n if (info.backend === 'nostr' || !info.backend) {\n console.log(` Auto-reconnect: ${info.reconnect ? 'Enabled' : 'Disabled'}`);\n console.log('\\n Connected Relays:');\n if (!info.relays || info.relays.length === 0) {\n console.log(' (none - running in local mode)');\n } else {\n info.relays.forEach((relay, idx) => {\n console.log(` ${idx + 1}. ${relay}`);\n });\n }\n } else if (info.backend === 'gundb') {\n console.log('\\n Gun Peers:');\n if (!info.peers || info.peers.length === 0) {\n console.log(' (none - running in local mode)');\n } else {\n info.peers.forEach((peer, idx) => {\n console.log(` ${idx + 1}. ${peer}`);\n });\n }\n } else if (info.backend === 'activitypub') {\n console.log(` Server URL: ${info.serverUrl || 'N/A'}`);\n console.log(` Actor ID: ${info.actorId || 'N/A'}`);\n }\n\n console.log('='.repeat(60) + '\\n');\n }\n }\n\n /**\n * Get metrics\n * @returns {Object} Operation counts\n */\n metrics() {\n return { ...this._metrics };\n }\n}\n","import {\n latLngToCell,\n cellToParent,\n cellToChildren,\n isValidCell,\n getResolution,\n} from 'h3-js';\n\n/**\n * Convert geographic coordinates to H3 holon ID\n * @param {number} lat - Latitude (-90 to 90)\n * @param {number} lng - Longitude (-180 to 180)\n * @param {number} resolution - H3 resolution (0-15)\n * @returns {string} H3 cell ID\n */\nexport function toHolon(lat, lng, resolution) {\n // Validate inputs\n if (typeof lat !== 'number' || lat < -90 || lat > 90) {\n throw new RangeError(`Invalid latitude: ${lat}. Must be between -90 and 90.`);\n }\n if (typeof lng !== 'number' || lng < -180 || lng > 180) {\n throw new RangeError(`Invalid longitude: ${lng}. Must be between -180 and 180.`);\n }\n if (!Number.isInteger(resolution) || resolution < 0 || resolution > 15) {\n throw new RangeError(`Invalid resolution: ${resolution}. Must be integer between 0 and 15.`);\n }\n\n try {\n const h3Index = latLngToCell(lat, lng, resolution);\n return h3Index;\n } catch (error) {\n throw new Error(`H3 conversion failed: ${error.message}`);\n }\n}\n\n/**\n * Get all parent holons up the hierarchy\n * @param {string} holonId - H3 cell ID\n * @param {number} maxResolution - Stop at this resolution (default: 0)\n * @returns {string[]} Array of parent H3 IDs (ascending hierarchy)\n */\nexport function getParents(holonId, maxResolution = 0) {\n if (!isValidH3(holonId)) {\n throw new Error(`Invalid H3 holon ID: ${holonId}`);\n }\n\n const currentResolution = getResolution(holonId);\n const parents = [];\n\n let currentCell = holonId;\n for (let res = currentResolution - 1; res >= maxResolution; res--) {\n try {\n currentCell = cellToParent(currentCell, res);\n parents.push(currentCell);\n } catch (error) {\n break; // Reached root\n }\n }\n\n return parents;\n}\n\n/**\n * Get all child holons at next resolution level\n * @param {string} holonId - H3 cell ID\n * @returns {string[]} Array of child H3 IDs (7 children per hexagon)\n */\nexport function getChildren(holonId) {\n if (!isValidH3(holonId)) {\n throw new Error(`Invalid H3 holon ID: ${holonId}`);\n }\n\n try {\n const resolution = getResolution(holonId);\n // H3 max resolution is 15, can't get children of resolution 15\n if (resolution >= 15) {\n throw new Error('Cannot get children of resolution 15 cell (maximum resolution)');\n }\n\n // cellToChildren requires the child resolution (one level down)\n const children = cellToChildren(holonId, resolution + 1);\n return children;\n } catch (error) {\n throw new Error(`Failed to get children: ${error.message}`);\n }\n}\n\n/**\n * Validate H3 cell ID format\n * @param {string} holonId - H3 cell ID\n * @returns {boolean} True if valid H3 format\n */\nexport function isValidH3(holonId) {\n if (typeof holonId !== 'string') return false;\n if (holonId.length < 15) return false;\n if (!holonId.startsWith('8')) return false;\n return isValidCell(holonId);\n}\n\n/**\n * Get H3 resolution level from cell ID\n * @param {string} holonId - H3 cell ID\n * @returns {number} Resolution (0-15)\n */\nexport function getH3Resolution(holonId) {\n if (!isValidH3(holonId)) {\n throw new Error(`Invalid H3 holon ID: ${holonId}`);\n }\n return getResolution(holonId);\n}\n","/**\n * Nostr Async Utilities\n * Provides Promise-based wrappers and async patterns for Nostr operations\n */\n\n/**\n * Global subscription manager to prevent duplicate subscriptions\n * Maps: pathPrefix -> subscription object\n */\nconst globalSubscriptions = new Map();\n\n/**\n * Write data as Nostr event (parameterized replaceable event)\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path identifier (encoded in d-tag)\n * @param {Object} data - Data to store\n * @param {number} kind - Event kind (default: 30000 for parameterized replaceable)\n * @returns {Promise<Object>} Published event result\n */\nexport async function nostrPut(client, path, data, kind = 30000) {\n const dataEvent = {\n kind,\n created_at: Math.floor(Date.now() / 1000),\n tags: [\n ['d', path], // d-tag for parameterized replaceable events\n ],\n content: JSON.stringify(data),\n };\n\n const result = await client.publish(dataEvent);\n return result;\n}\n\n/**\n * Read data from Nostr (query by d-tag)\n * LOCAL-FIRST: Checks persistent storage first, never blocks on network\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path identifier\n * @param {number} kind - Event kind (default: 30000)\n * @param {Object} options - Query options\n * @param {string[]} options.authors - Array of public keys to query (default: [client.publicKey])\n * @param {boolean} options.includeAuthor - If true, adds _author field to returned data\n * @param {boolean} options.skipPersistent - If true, skip persistent storage check (default: false)\n * @returns {Promise<Object|null>} Data or null if not found\n */\nexport async function nostrGet(client, path, kind = 30000, options = {}) {\n const timeout = options.timeout !== undefined ? options.timeout : 30000;\n const authors = options.authors || [client.publicKey];\n\n // LOCAL-FIRST: Check persistent storage FIRST (never blocks on network)\n if (!options.skipPersistent && client.persistentGet) {\n const persistedEvent = await client.persistentGet(path);\n if (persistedEvent && persistedEvent.content) {\n try {\n const data = JSON.parse(persistedEvent.content);\n\n // Skip deleted items\n if (data._deleted) {\n return null;\n }\n\n // Optionally include author information\n if (options.includeAuthor) {\n data._author = persistedEvent.pubkey;\n }\n\n // Trigger background refresh from relays (fire-and-forget)\n if (client.refreshPathInBackground) {\n client.refreshPathInBackground(path, kind, { authors, timeout });\n }\n\n return data;\n } catch (error) {\n // Fall through to relay query if parsing fails\n console.warn('[nostrGet] Failed to parse persisted event:', error);\n }\n }\n }\n\n // Fallback to relay query (existing logic)\n const filter = {\n kinds: [kind],\n authors: authors, // Support multiple authors for cross-holosphere queries\n '#d': [path],\n limit: authors.length, // Increase limit to get events from all authors\n };\n\n const events = await client.query(filter, { timeout });\n\n if (events.length === 0) {\n return null;\n }\n\n // Get most recent event (across all authors)\n const event = events.sort((a, b) => b.created_at - a.created_at)[0];\n\n try {\n const data = JSON.parse(event.content);\n // Optionally include author information\n if (options.includeAuthor) {\n data._author = event.pubkey;\n }\n return data;\n } catch (error) {\n console.error('Failed to parse event content:', error);\n return null;\n }\n}\n\n/**\n * Query all events under a path prefix\n * LOCAL-FIRST: Checks persistent storage first, never blocks on network\n * @param {Object} client - NostrClient instance\n * @param {string} pathPrefix - Path prefix to match\n * @param {number} kind - Event kind (default: 30000)\n * @param {Object} options - Query options\n * @param {string[]} options.authors - Array of public keys to query (default: [client.publicKey])\n * @param {boolean} options.includeAuthor - If true, adds _author field to returned data\n * @param {boolean} options.skipPersistent - If true, skip persistent storage check (default: false)\n * @returns {Promise<Array>} Array of data objects\n */\nexport async function nostrGetAll(client, pathPrefix, kind = 30000, options = {}) {\n const timeout = options.timeout !== undefined ? options.timeout : 30000;\n const limit = options.limit || 1000; // Increased limit to get more events\n const authors = options.authors || [client.publicKey];\n\n // LOCAL-FIRST: Check persistent storage FIRST (never blocks on network)\n if (!options.skipPersistent && client.persistentGetAll) {\n const persistedEvents = await client.persistentGetAll(pathPrefix);\n if (persistedEvents.length > 0) {\n // Parse content and group by d-tag (keep latest only)\n const byPath = new Map();\n for (const event of persistedEvents) {\n if (!event || !event.tags) continue;\n\n const dTag = event.tags.find(t => t[0] === 'd');\n if (!dTag || !dTag[1] || !dTag[1].startsWith(pathPrefix)) continue;\n\n const path = dTag[1];\n const existing = byPath.get(path);\n\n if (!existing || event.created_at > existing.created_at) {\n try {\n const data = JSON.parse(event.content);\n\n // Skip deleted items\n if (data._deleted) continue;\n\n // Optionally include author information\n if (options.includeAuthor) {\n data._author = event.pubkey;\n }\n byPath.set(path, { data, created_at: event.created_at });\n } catch (error) {\n // Skip invalid events\n }\n }\n }\n\n // Trigger background refresh from relays (fire-and-forget)\n if (client.refreshPrefixInBackground) {\n client.refreshPrefixInBackground(pathPrefix, kind, { authors, timeout, limit });\n }\n\n // Return array of data objects\n return Array.from(byPath.values()).map(item => item.data);\n }\n }\n\n // Fallback to relay query (existing logic)\n const filter = {\n kinds: [kind],\n authors: authors,\n limit,\n };\n\n const events = await client.query(filter, { timeout });\n\n // Filter by path prefix in application layer\n const matching = events.filter(event => {\n const dTag = event.tags.find(t => t[0] === 'd');\n return dTag && dTag[1] && dTag[1].startsWith(pathPrefix);\n });\n\n // Parse content and group by d-tag (keep latest only, across all authors)\n const byPath = new Map();\n for (const event of matching) {\n const dTag = event.tags.find(t => t[0] === 'd')[1];\n const existing = byPath.get(dTag);\n\n if (!existing || event.created_at > existing.created_at) {\n try {\n const data = JSON.parse(event.content);\n\n // Skip deleted items\n if (data._deleted) continue;\n\n // Optionally include author information\n if (options.includeAuthor) {\n data._author = event.pubkey;\n }\n byPath.set(dTag, { data, created_at: event.created_at });\n } catch (error) {\n console.error('Failed to parse event content:', error);\n }\n }\n }\n\n // Return array of data objects\n return Array.from(byPath.values()).map(item => item.data);\n}\n\n/**\n * Query all events under a path prefix (HYBRID MODE - local + relay)\n * Checks local cache first, then merges with relay data\n * @param {Object} client - NostrClient instance\n * @param {string} pathPrefix - Path prefix to match\n * @param {number} kind - Event kind (default: 30000)\n * @param {Object} options - Query options\n * @param {string[]} options.authors - Array of public keys to query (default: [client.publicKey])\n * @param {boolean} options.includeAuthor - If true, adds _author field to returned data\n * @returns {Promise<Array>} Array of data objects (merged from local + relay)\n */\nexport async function nostrGetAllHybrid(client, pathPrefix, kind = 30000, options = {}) {\n const timeout = options.timeout !== undefined ? options.timeout : 30000;\n const limit = options.limit || 1000;\n const authors = options.authors || [client.publicKey];\n\n // Use hybrid query if available\n const queryMethod = client.queryHybrid || client.query;\n\n const filter = {\n kinds: [kind],\n authors: authors,\n limit,\n };\n\n const events = await queryMethod.call(client, filter, { timeout });\n\n // Filter by path prefix in application layer\n const matching = events.filter(event => {\n const dTag = event.tags.find(t => t[0] === 'd');\n return dTag && dTag[1] && dTag[1].startsWith(pathPrefix);\n });\n\n // Parse content and group by d-tag (keep latest only)\n const byPath = new Map();\n for (const event of matching) {\n const dTag = event.tags.find(t => t[0] === 'd')[1];\n const existing = byPath.get(dTag);\n\n if (!existing || event.created_at > existing.created_at) {\n try {\n const data = JSON.parse(event.content);\n // Optionally include author information\n if (options.includeAuthor) {\n data._author = event.pubkey;\n }\n byPath.set(dTag, { data, created_at: event.created_at });\n } catch (error) {\n console.error('Failed to parse event content:', error);\n }\n }\n }\n\n // Return array of data objects\n return Array.from(byPath.values()).map(item => item.data);\n}\n\n/**\n * Delete data (publish deletion event - NIP-09)\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path identifier\n * @param {number} kind - Original event kind (default: 30000)\n * @returns {Promise<Object>} Deletion event result\n */\nexport async function nostrDelete(client, path, kind = 30000) {\n // Read existing data first\n const existing = await nostrGet(client, path, kind);\n\n if (!existing) {\n return { reason: 'not_found', results: [] };\n }\n\n // Create minimal tombstone - just the deleted flag, no original data\n const tombstone = {\n _deleted: true,\n _deletedAt: Date.now()\n };\n\n // Publish tombstone as replacement event\n // This ensures reads will see _deleted flag\n const result = await nostrPut(client, path, tombstone, kind);\n\n // Also delete from persistent storage to prevent resurrection on restart\n if (client.persistentStorage) {\n try {\n await client.persistentStorage.delete(path);\n } catch (e) {\n // Ignore storage deletion errors\n }\n }\n\n // Clear from memory cache\n if (client.clearCache) {\n client.clearCache(path);\n }\n\n // Also publish NIP-09 deletion event for relay compliance\n const coordinate = `${kind}:${client.publicKey}:${path}`;\n const deletionEvent = {\n kind: 5, // NIP-09 deletion event\n created_at: Math.floor(Date.now() / 1000),\n tags: [\n ['a', coordinate], // 'a' tag for parameterized replaceable events\n ],\n content: '', // Optional deletion reason/note\n };\n\n // Publish deletion event (best effort, don't block on failure)\n try {\n const publishResult = await client.publish(deletionEvent);\n console.log(`✅ NIP-09 deletion event published for ${path}:`, {\n coordinate,\n relays: publishResult?.relays?.length || 0,\n successful: publishResult?.successful || []\n });\n } catch (error) {\n console.error(`❌ Failed to publish NIP-09 deletion event for ${path}:`, error.message);\n }\n\n return result;\n}\n\n/**\n * Delete all data with path prefix (publish deletion events - NIP-09)\n * @param {Object} client - NostrClient instance\n * @param {string} pathPrefix - Path prefix to delete all items under\n * @param {number} kind - Original event kind (default: 30000)\n * @returns {Promise<Object>} Deletion results\n */\nexport async function nostrDeleteAll(client, pathPrefix, kind = 30000) {\n // Query events from relay\n const filter = {\n kinds: [kind],\n authors: [client.publicKey],\n limit: 1000,\n };\n\n const relayEvents = await client.query(filter, { timeout: 30000 });\n\n // Also get events from persistent storage (may have events not yet synced to relay)\n let persistentEvents = [];\n if (client.persistentStorage) {\n try {\n persistentEvents = await client.persistentStorage.getAll(pathPrefix);\n } catch (e) {\n // Ignore storage read errors\n }\n }\n\n // Merge events from both sources, using d-tag as key\n const eventsByDTag = new Map();\n\n // Add relay events\n for (const event of relayEvents) {\n const dTag = event.tags?.find(t => t[0] === 'd');\n if (dTag && dTag[1] && dTag[1].startsWith(pathPrefix)) {\n eventsByDTag.set(dTag[1], event);\n }\n }\n\n // Add persistent storage events (these might be newer or only exist locally)\n for (const event of persistentEvents) {\n const dTag = event.tags?.find(t => t[0] === 'd');\n if (dTag && dTag[1] && dTag[1].startsWith(pathPrefix)) {\n const existing = eventsByDTag.get(dTag[1]);\n // Use the persistent event if it's newer or doesn't exist in relay results\n if (!existing || event.created_at > existing.created_at) {\n eventsByDTag.set(dTag[1], event);\n }\n }\n }\n\n const matching = Array.from(eventsByDTag.values());\n\n if (matching.length === 0) {\n return { success: true, count: 0, results: [] };\n }\n\n // Publish tombstone events for each matching item\n const tombstoneResults = [];\n for (const event of matching) {\n const dTag = event.tags.find(t => t[0] === 'd')[1];\n\n try {\n // Create minimal tombstone - just the deleted flag, no original data\n const tombstone = {\n _deleted: true,\n _deletedAt: Date.now()\n };\n\n // Publish tombstone replacement\n const result = await nostrPut(client, dTag, tombstone, kind);\n tombstoneResults.push(result);\n\n // Also delete from persistent storage to prevent resurrection on restart\n if (client.persistentStorage) {\n try {\n await client.persistentStorage.delete(dTag);\n } catch (e) {\n // Ignore storage deletion errors\n }\n }\n\n // Clear from memory cache\n if (client.clearCache) {\n client.clearCache(dTag);\n }\n } catch (error) {\n console.error(`Failed to delete item ${dTag}:`, error);\n }\n }\n\n // Collect all coordinates for NIP-09 deletion event\n const coordinates = matching.map(event => {\n const dTag = event.tags.find(t => t[0] === 'd')[1];\n return `${kind}:${client.publicKey}:${dTag}`;\n });\n\n // Publish a single kind 5 deletion event with all coordinates\n // This is for relay compliance (best effort)\n try {\n const deletionEvent = {\n kind: 5, // NIP-09 deletion event\n created_at: Math.floor(Date.now() / 1000),\n tags: coordinates.map(coord => ['a', coord]),\n content: '', // Optional deletion reason/note\n };\n\n const publishResult = await client.publish(deletionEvent);\n console.log(`✅ NIP-09 bulk deletion event published for ${pathPrefix}:`, {\n itemsDeleted: matching.length,\n coordinates: coordinates.length,\n relays: publishResult?.relays?.length || 0,\n successful: publishResult?.successful || []\n });\n } catch (error) {\n console.error(`❌ Failed to publish NIP-09 bulk deletion event for ${pathPrefix}:`, error.message);\n }\n\n return {\n success: true,\n count: matching.length,\n results: tombstoneResults,\n };\n}\n\n/**\n * Subscribe to path changes\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path to subscribe to\n * @param {Function} callback - Callback function (data, event) => void\n * @param {Object} options - Subscription options\n * @returns {Object} Subscription object with unsubscribe method\n */\nexport function nostrSubscribe(client, path, callback, options = {}) {\n const kind = options.kind || 30000;\n const includeInitial = options.includeInitial !== false;\n\n const filter = {\n kinds: [kind],\n authors: [client.publicKey], // Filter by our public key\n '#d': [path],\n limit: 10, // Limit results for single item subscription\n };\n\n let initialLoadComplete = false;\n\n const subscription = client.subscribe(\n filter,\n (event) => {\n // Verify event is from our public key (relay may not respect author filter)\n if (event.pubkey !== client.publicKey) {\n console.warn('[nostrSubscribe] Rejecting event from different author:', {\n expected: client.publicKey,\n received: event.pubkey,\n eventId: event.id\n });\n return;\n }\n\n try {\n const data = JSON.parse(event.content);\n callback(data, event);\n } catch (error) {\n console.error('Failed to parse event in subscription:', error);\n }\n },\n {\n onEOSE: () => {\n initialLoadComplete = true;\n },\n }\n );\n\n return subscription;\n}\n\n/**\n * Subscribe to path prefix (multiple paths)\n *\n * Subscribes to data events and uses Page Visibility API to refresh when tab becomes visible.\n * Note: Nostr relays do not broadcast replaceable event updates to active subscriptions.\n *\n * @param {Object} client - NostrClient instance\n * @param {string} pathPrefix - Path prefix to match\n * @param {Function} callback - Callback function (data, path, event) => void\n * @param {Object} options - Subscription options\n * @returns {Promise<Object>} Subscription object with unsubscribe method\n */\nexport async function nostrSubscribeMany(client, pathPrefix, callback, options = {}) {\n const kind = options.kind || 30000;\n\n // Create unique key for this subscription\n const subscriptionKey = `${client.publicKey}:${kind}:${pathPrefix}`;\n\n // Check if we already have an active subscription for this path\n const existingSub = globalSubscriptions.get(subscriptionKey);\n if (existingSub) {\n // Register this callback with the existing subscription\n existingSub.callbacks.push(callback);\n\n // Return a wrapper that removes only this callback on unsubscribe\n return {\n unsubscribe: () => {\n const idx = existingSub.callbacks.indexOf(callback);\n if (idx > -1) {\n existingSub.callbacks.splice(idx, 1);\n }\n\n // If no more callbacks, unsubscribe the whole thing\n if (existingSub.callbacks.length === 0) {\n existingSub.actualSubscription.unsubscribe();\n globalSubscriptions.delete(subscriptionKey);\n }\n }\n };\n }\n\n const seenEventIds = new Set(); // Track event IDs to prevent duplicate callbacks\n const callbacks = [callback]; // Array of callbacks to notify\n\n // Track rejected events for metrics\n let rejectedCount = 0;\n let acceptedCount = 0;\n let lastLogTime = Date.now();\n const LOG_INTERVAL = 10000; // Log summary every 10 seconds\n\n // Handler for data events (kind 30000)\n const handleDataEvent = (event) => {\n // Skip duplicates\n if (seenEventIds.has(event.id)) {\n return;\n }\n seenEventIds.add(event.id);\n\n // Check if event is from a different author (relay not respecting filter)\n if (event.pubkey !== client.publicKey) {\n rejectedCount++;\n\n // Only log periodically to avoid spam\n const now = Date.now();\n if (now - lastLogTime > LOG_INTERVAL) {\n console.warn('[nostrSubscribeMany] ⚠️ Relay not respecting authors filter!', {\n rejectedCount,\n acceptedCount,\n expected: client.publicKey,\n message: 'Consider using a different relay or implementing private relay'\n });\n lastLogTime = now;\n }\n return; // Skip events from other authors\n }\n\n // Extract d-tag\n const dTagArray = event.tags.find(t => t[0] === 'd');\n const dTag = dTagArray?.[1];\n\n // Client-side prefix filter\n if (dTag && dTag.startsWith(pathPrefix)) {\n acceptedCount++;\n try {\n const data = JSON.parse(event.content);\n // Notify all registered callbacks\n for (const cb of callbacks) {\n cb(data, dTag, event);\n }\n } catch (error) {\n console.error('[nostrSubscribeMany] Failed to parse event:', error);\n }\n }\n };\n\n // Subscribe to data events (kind 30000) for initial load\n // Use 'since' to only get events from subscription time onward for real-time updates\n const subscriptionStartTime = Math.floor(Date.now() / 1000);\n const dataFilter = {\n kinds: [kind],\n authors: [client.publicKey],\n since: subscriptionStartTime // Only get new events after subscription\n };\n const dataSubscription = await client.subscribe(dataFilter, handleDataEvent);\n\n // Use Page Visibility API to refresh when tab becomes visible\n let isDocumentHidden = typeof document !== 'undefined' && document.hidden;\n let lastVisibilityCheck = subscriptionStartTime;\n\n const handleVisibilityChange = async () => {\n if (typeof document === 'undefined') return;\n\n const wasHidden = isDocumentHidden;\n isDocumentHidden = document.hidden;\n\n // Tab became visible - only check for new events since we were hidden\n if (wasHidden && !isDocumentHidden) {\n const now = Math.floor(Date.now() / 1000);\n try {\n const visibilityFilter = {\n ...dataFilter,\n since: lastVisibilityCheck, // Only events since last check\n until: now\n };\n const events = await client.query(visibilityFilter, { timeout: 30000 });\n\n for (const event of events) {\n handleDataEvent(event);\n }\n lastVisibilityCheck = now;\n } catch (error) {\n // Silently handle visibility refresh errors\n }\n }\n };\n\n // Only add listener in browser environment\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', handleVisibilityChange);\n }\n\n // Store subscription info for reuse\n const actualSubscription = {\n unsubscribe: () => {\n if (dataSubscription && dataSubscription.unsubscribe) {\n dataSubscription.unsubscribe();\n }\n if (typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n }\n globalSubscriptions.delete(subscriptionKey);\n }\n };\n\n const subscriptionInfo = {\n callbacks,\n actualSubscription\n };\n\n globalSubscriptions.set(subscriptionKey, subscriptionInfo);\n\n return actualSubscription;\n}\n\n/**\n * Update data (merge with existing)\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path identifier\n * @param {Object} updates - Fields to update\n * @param {number} kind - Event kind (default: 30000)\n * @returns {Promise<Object>} Updated event result\n */\nexport async function nostrUpdate(client, path, updates, kind = 30000) {\n // Read existing data\n const existing = await nostrGet(client, path, kind);\n\n if (!existing) {\n throw new Error(`No data found at path: ${path}`);\n }\n\n // Merge updates\n const merged = { ...existing, ...updates };\n\n // Publish updated event\n return nostrPut(client, path, merged, kind);\n}\n\n/**\n * Batch read multiple paths\n * @param {Object} client - NostrClient instance\n * @param {string[]} paths - Array of paths\n * @param {number} kind - Event kind (default: 30000)\n * @returns {Promise<Object>} Object mapping paths to data\n */\nexport async function nostrBatchGet(client, paths, kind = 30000) {\n const filter = {\n kinds: [kind],\n '#d': paths,\n limit: paths.length,\n };\n\n const events = await client.query(filter);\n\n // Group by d-tag (keep latest only)\n const byPath = new Map();\n for (const event of events) {\n const dTag = event.tags.find(t => t[0] === 'd');\n if (!dTag || !dTag[1]) continue;\n\n const path = dTag[1];\n const existing = byPath.get(path);\n\n if (!existing || event.created_at > existing.created_at) {\n try {\n const data = JSON.parse(event.content);\n byPath.set(path, data);\n } catch (error) {\n console.error('Failed to parse event content:', error);\n }\n }\n }\n\n // Return object mapping paths to data\n const result = {};\n for (const path of paths) {\n result[path] = byPath.get(path) || null;\n }\n\n return result;\n}\n\n/**\n * Batch write multiple paths\n * @param {Object} client - NostrClient instance\n * @param {Object} pathDataMap - Object mapping paths to data\n * @param {number} kind - Event kind (default: 30000)\n * @returns {Promise<Array>} Array of publish results\n */\nexport async function nostrBatchPut(client, pathDataMap, kind = 30000) {\n const promises = Object.entries(pathDataMap).map(([path, data]) =>\n nostrPut(client, path, data, kind)\n );\n\n return Promise.all(promises);\n}\n\n/**\n * Retry operation with exponential backoff\n * @param {Function} operation - Async function to retry\n * @param {number} maxRetries - Max retry attempts (default: 3)\n * @param {number} baseDelay - Base delay in ms (default: 100ms)\n * @returns {Promise<any>} Promise resolving to operation result\n */\nexport async function nostrRetry(operation, maxRetries = 3, baseDelay = 100) {\n let lastError;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error;\n if (attempt < maxRetries) {\n const delay = baseDelay * Math.pow(2, attempt);\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n }\n\n throw lastError;\n}\n\n/**\n * Wait for specific condition on data\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path to watch\n * @param {Function} predicate - Condition function (data) => boolean\n * @param {number} timeout - Timeout in ms (default: 5000ms)\n * @returns {Promise<any>} Promise resolving when condition is met\n */\nexport async function nostrWaitFor(client, path, predicate, timeout = 5000) {\n return new Promise((resolve, reject) => {\n let timeoutId;\n let subscription;\n\n const cleanup = () => {\n if (timeoutId) clearTimeout(timeoutId);\n if (subscription) subscription.unsubscribe();\n };\n\n subscription = nostrSubscribe(client, path, (data) => {\n if (predicate(data)) {\n cleanup();\n resolve(data);\n }\n });\n\n timeoutId = setTimeout(() => {\n cleanup();\n reject(new Error('Timeout waiting for condition'));\n }, timeout);\n });\n}\n","/**\n * Nostr Storage Wrapper\n * Drop-in replacement for gun-wrapper.js with same API\n * Handles path construction and CRUD operations using Nostr relays\n */\n\nimport {\n nostrPut,\n nostrGet,\n nostrGetAll,\n nostrGetAllHybrid,\n nostrUpdate as nostrAsyncUpdate,\n nostrDelete,\n nostrDeleteAll,\n nostrSubscribe,\n nostrSubscribeMany,\n} from './nostr-async.js';\n\n/**\n * Build path from components\n * @param {string} appname - Application namespace\n * @param {string} holon - Holon ID (H3 or URI)\n * @param {string} lens - Lens name\n * @param {string} key - Data key (optional)\n * @returns {string} Path string\n */\nexport function buildPath(appname, holon, lens, key = null) {\n // Encode components to handle special characters\n const encodedHolon = encodePathComponent(holon);\n const encodedLens = encodePathComponent(lens);\n\n if (key) {\n const encodedKey = encodePathComponent(key);\n return `${appname}/${encodedHolon}/${encodedLens}/${encodedKey}`;\n }\n return `${appname}/${encodedHolon}/${encodedLens}`;\n}\n\n/**\n * Encode path component to handle special characters\n * @private\n */\nfunction encodePathComponent(component) {\n return encodeURIComponent(component).replace(/%2F/g, '/');\n}\n\n/**\n * Write data to Nostr\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path\n * @param {Object} data - Data to write\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function write(client, path, data) {\n try {\n const result = await nostrPut(client, path, data);\n // Check if at least one relay accepted the event\n // If no relays (testing mode), consider it successful if event was created\n const success = result.results.length === 0 ? true : result.results.some(r => r.status === 'fulfilled');\n return success;\n } catch (error) {\n console.error('Nostr write error:', error);\n throw error;\n }\n}\n\n/**\n * Read data from Nostr\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path\n * @param {Object} options - Query options\n * @param {string[]} options.authors - Array of public keys to query (for cross-holosphere reads)\n * @param {boolean} options.includeAuthor - If true, adds _author field to returned data\n * @returns {Promise<Object|null>} Data or null if not found\n */\nexport async function read(client, path, options = {}) {\n const data = await nostrGet(client, path, 30000, options);\n\n // Return null if deleted or not found\n if (!data || data._deleted) {\n return null;\n }\n\n return data;\n}\n\n/**\n * Read all data under a path (lens query)\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path prefix\n * @param {Object} options - Query options\n * @param {boolean} options.hybrid - Use hybrid mode (local + relay) - default: false\n * @param {string[]} options.authors - Array of public keys to query (for cross-holosphere reads)\n * @param {boolean} options.includeAuthor - If true, adds _author field to returned data\n * @returns {Promise<Object[]>} Array of data objects\n */\nexport async function readAll(client, path, options = {}) {\n // Use hybrid mode if enabled and client supports it\n const useHybrid = options.hybrid && typeof client.queryHybrid === 'function';\n const queryFn = useHybrid ? nostrGetAllHybrid : nostrGetAll;\n\n const results = await queryFn(client, path, 30000, options);\n\n // Filter out deleted items\n return results.filter(data => {\n if (!data || typeof data !== 'object') return false;\n if (data._deleted) return false;\n return true;\n });\n}\n\n/**\n * Update data (merge fields)\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path\n * @param {Object} updates - Fields to update\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function update(client, path, updates) {\n try {\n const existing = await nostrGet(client, path);\n\n if (!existing || !existing.id || existing._deleted) {\n return false; // Not found or deleted\n }\n\n // Merge updates\n const merged = { ...existing, ...updates };\n\n // Update timestamp\n if (!merged._meta) merged._meta = {};\n merged._meta.timestamp = Date.now();\n\n // Write merged data\n const result = await nostrPut(client, path, merged);\n // If no relays (testing mode), consider it successful if event was created\n const success = result.results.length === 0 ? true : result.results.some(r => r.status === 'fulfilled');\n return success;\n } catch (error) {\n console.error('Nostr update error:', error);\n throw error;\n }\n}\n\n/**\n * Delete data (tombstone)\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function deleteData(client, path) {\n try {\n const result = await nostrDelete(client, path);\n\n if (result.reason === 'not_found') {\n return false; // Item doesn't exist\n }\n\n // If no relays (testing mode), consider it successful if event was created\n const success = result.results.length === 0 ? true : result.results.some(r => r.status === 'fulfilled');\n return success;\n } catch (error) {\n console.error('Nostr delete error:', error);\n throw error;\n }\n}\n\n/**\n * Delete all data under path prefix (tombstone)\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path prefix\n * @returns {Promise<Object>} Deletion results\n */\nexport async function deleteAll(client, path) {\n try {\n const result = await nostrDeleteAll(client, path);\n return result;\n } catch (error) {\n console.error('Nostr deleteAll error:', error);\n throw error;\n }\n}\n\n/**\n * Subscribe to data changes\n * @param {Object} client - NostrClient instance\n * @param {string} path - Path\n * @param {Function} callback - Called on data changes\n * @param {Object} options - Subscription options\n * @param {boolean} options.realtimeOnly - Only receive new events (default: true)\n * @returns {Promise<Object>} Subscription object with unsubscribe method\n */\nexport async function subscribe(client, path, callback, options = {}) {\n // Determine if this is a prefix subscription (no key) or single item\n const pathParts = path.split('/');\n const isPrefix = pathParts.length <= 3; // appname/holon/lens\n\n if (isPrefix) {\n // Subscribe to all items under this prefix\n return await nostrSubscribeMany(client, path + '/', (data, fullPath) => {\n // Extract key from full path\n const key = fullPath.split('/').pop();\n callback(data, key);\n }, options);\n } else {\n // Subscribe to single item\n return nostrSubscribe(client, path, (data) => {\n callback(data, path.split('/').pop());\n }, options);\n }\n}\n","/**\n * Global Data Operations\n * Non-location-specific storage (FR-044, FR-045)\n */\n\nimport { write, read, readAll, update, deleteData, deleteAll } from './nostr-wrapper.js';\n\n/**\n * Write data to global table\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} table - Global table name\n * @param {Object} data - Data to write (must contain id field)\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function writeGlobal(client, appname, table, data) {\n // Auto-generate ID if not provided\n if (!data.id) {\n data.id = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n const path = `${appname}/${table}/${data.id}`;\n return write(client, path, data);\n}\n\n/**\n * Read data from global table\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} table - Global table name\n * @param {string} key - Data key (optional, if not provided returns all)\n * @returns {Promise<Object|Object[]|null>} Data or null\n */\nexport async function readGlobal(client, appname, table, key = null) {\n if (key) {\n const path = `${appname}/${table}/${key}`;\n return read(client, path);\n } else {\n const path = `${appname}/${table}`;\n return readAll(client, path);\n }\n}\n\n/**\n * Update data in global table\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} table - Global table name\n * @param {string} key - Data key\n * @param {Object} updates - Fields to update\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function updateGlobal(client, appname, table, key, updates) {\n const path = `${appname}/${table}/${key}`;\n return update(client, path, updates);\n}\n\n/**\n * Delete data from global table\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} table - Global table name\n * @param {string} key - Data key\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function deleteGlobal(client, appname, table, key) {\n const path = `${appname}/${table}/${key}`;\n return deleteData(client, path);\n}\n\n/**\n * Delete all data from global table\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} table - Global table name\n * @returns {Promise<Object>} Deletion results\n */\nexport async function deleteAllGlobal(client, appname, table) {\n const path = `${appname}/${table}`;\n return deleteAll(client, path);\n}\n","/**\n * JSON Schema Validation with Ajv and caching\n */\n\nimport Ajv from 'ajv';\n\nconst ajv = new Ajv({ allErrors: true, strict: false });\nconst schemaCache = new Map();\nconst CACHE_TTL = 3600000; // 1 hour in milliseconds\n\n/**\n * Validation Error class\n */\nexport class ValidationError extends Error {\n constructor(message, errors = []) {\n super(message);\n this.name = 'ValidationError';\n this.errors = errors;\n }\n}\n\n/**\n * Compile and cache JSON Schema\n * @param {Object} schema - JSON Schema object\n * @param {string} lensName - Lens identifier for caching\n * @returns {Function} Ajv validator function\n */\nexport function compileSchema(schema, lensName) {\n const cacheKey = lensName;\n const cached = schemaCache.get(cacheKey);\n\n // Check if cached and not expired\n if (cached && Date.now() - cached.timestamp < CACHE_TTL) {\n return cached.validator;\n }\n\n // Compile new validator\n try {\n const validator = ajv.compile(schema);\n schemaCache.set(cacheKey, {\n validator,\n timestamp: Date.now(),\n });\n return validator;\n } catch (error) {\n throw new Error(`Schema compilation failed: ${error.message}`);\n }\n}\n\n/**\n * Validate data against schema\n * @param {Object} data - Data to validate\n * @param {Object} schema - JSON Schema object\n * @param {string} lensName - Lens name for caching\n * @param {boolean} strict - Throw error if invalid (default: false)\n * @returns {boolean} True if valid\n * @throws {ValidationError} If strict=true and validation fails\n */\nexport function validate(data, schema, lensName, strict = false) {\n const validator = compileSchema(schema, lensName);\n const valid = validator(data);\n\n if (!valid) {\n const errors = validator.errors || [];\n const errorMessage = errors.map((e) => `${e.instancePath} ${e.message}`).join('; ');\n\n if (strict) {\n throw new ValidationError(`ValidationError: Validation failed: ${errorMessage}`, errors);\n } else {\n console.warn(`[Schema Validation Warning] ${lensName}: ${errorMessage}`);\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Clear schema cache for a lens\n * @param {string} lensName - Lens name\n */\nexport function clearSchemaCache(lensName) {\n schemaCache.delete(lensName);\n}\n\n/**\n * Clear all cached schemas\n */\nexport function clearAllCaches() {\n schemaCache.clear();\n}\n","export function number(n) {\n if (!Number.isSafeInteger(n) || n < 0)\n throw new Error(`Wrong positive integer: ${n}`);\n}\nexport function bool(b) {\n if (typeof b !== 'boolean')\n throw new Error(`Expected boolean, not ${b}`);\n}\nexport function bytes(b, ...lengths) {\n if (!(b instanceof Uint8Array))\n throw new Error('Expected Uint8Array');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error(`Expected Uint8Array of length ${lengths}, not of length=${b.length}`);\n}\nexport function hash(hash) {\n if (typeof hash !== 'function' || typeof hash.create !== 'function')\n throw new Error('Hash should be wrapped by utils.wrapConstructor');\n number(hash.outputLen);\n number(hash.blockLen);\n}\nexport function exists(instance, checkFinished = true) {\n if (instance.destroyed)\n throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished)\n throw new Error('Hash#digest() has already been called');\n}\nexport function output(out, instance) {\n bytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error(`digestInto() expects output buffer of length at least ${min}`);\n }\n}\nconst assert = {\n number,\n bool,\n bytes,\n hash,\n exists,\n output,\n};\nexport default assert;\n//# sourceMappingURL=_assert.js.map","/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated, we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\nconst u8a = (a) => a instanceof Uint8Array;\n// Cast array to different type\nexport const u8 = (arr) => new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\nexport const u32 = (arr) => new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n// Cast array to view\nexport const createView = (arr) => new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n// The rotate right (circular right shift) operation for uint32\nexport const rotr = (word, shift) => (word << (32 - shift)) | (word >>> shift);\n// big-endian hardware is rare. Just in case someone still decides to run hashes:\n// early-throw an error because we don't support BE yet.\nexport const isLE = new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44;\nif (!isLE)\n throw new Error('Non little-endian hardware is not supported');\nconst hexes = Array.from({ length: 256 }, (v, i) => i.toString(16).padStart(2, '0'));\n/**\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes) {\n if (!u8a(bytes))\n throw new Error('Uint8Array expected');\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n/**\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n const len = hex.length;\n if (len % 2)\n throw new Error('padded hex string expected, got unpadded hex of length ' + len);\n const array = new Uint8Array(len / 2);\n for (let i = 0; i < array.length; i++) {\n const j = i * 2;\n const hexByte = hex.slice(j, j + 2);\n const byte = Number.parseInt(hexByte, 16);\n if (Number.isNaN(byte) || byte < 0)\n throw new Error('Invalid byte sequence');\n array[i] = byte;\n }\n return array;\n}\n// There is no setImmediate in browser and setTimeout is slow.\n// call of async fn will return Promise, which will be fullfiled only on\n// next scheduler queue processing step and this is exactly what we need.\nexport const nextTick = async () => { };\n// Returns control to thread each 'tick' ms to avoid blocking\nexport async function asyncLoop(iters, tick, cb) {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick)\n continue;\n await nextTick();\n ts += diff;\n }\n}\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\nexport function utf8ToBytes(str) {\n if (typeof str !== 'string')\n throw new Error(`utf8ToBytes expected string, got ${typeof str}`);\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data) {\n if (typeof data === 'string')\n data = utf8ToBytes(data);\n if (!u8a(data))\n throw new Error(`expected Uint8Array, got ${typeof data}`);\n return data;\n}\n/**\n * Copies several Uint8Arrays into one.\n */\nexport function concatBytes(...arrays) {\n const r = new Uint8Array(arrays.reduce((sum, a) => sum + a.length, 0));\n let pad = 0; // walk through each item, ensure they have proper type\n arrays.forEach((a) => {\n if (!u8a(a))\n throw new Error('Uint8Array expected');\n r.set(a, pad);\n pad += a.length;\n });\n return r;\n}\n// For runtime check if class implements interface\nexport class Hash {\n // Safe version that clones internal state\n clone() {\n return this._cloneInto();\n }\n}\n// Check if object doens't have custom constructor (like Uint8Array/Array)\nconst isPlainObject = (obj) => Object.prototype.toString.call(obj) === '[object Object]' && obj.constructor === Object;\nexport function checkOpts(defaults, opts) {\n if (opts !== undefined && (typeof opts !== 'object' || !isPlainObject(opts)))\n throw new Error('Options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged;\n}\nexport function wrapConstructor(hashCons) {\n const hashC = (msg) => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\nexport function wrapConstructorWithOpts(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\nexport function wrapXOFConstructorWithOpts(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\n/**\n * Secure PRNG. Uses `crypto.getRandomValues`, which defers to OS.\n */\nexport function randomBytes(bytesLength = 32) {\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n//# sourceMappingURL=utils.js.map","import assert from './_assert.js';\nimport { Hash, createView, toBytes } from './utils.js';\n// Polyfill for Safari 14\nfunction setBigUint64(view, byteOffset, value, isLE) {\n if (typeof view.setBigUint64 === 'function')\n return view.setBigUint64(byteOffset, value, isLE);\n const _32n = BigInt(32);\n const _u32_max = BigInt(0xffffffff);\n const wh = Number((value >> _32n) & _u32_max);\n const wl = Number(value & _u32_max);\n const h = isLE ? 4 : 0;\n const l = isLE ? 0 : 4;\n view.setUint32(byteOffset + h, wh, isLE);\n view.setUint32(byteOffset + l, wl, isLE);\n}\n// Base SHA2 class (RFC 6234)\nexport class SHA2 extends Hash {\n constructor(blockLen, outputLen, padOffset, isLE) {\n super();\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.finished = false;\n this.length = 0;\n this.pos = 0;\n this.destroyed = false;\n this.buffer = new Uint8Array(blockLen);\n this.view = createView(this.buffer);\n }\n update(data) {\n assert.exists(this);\n const { view, buffer, blockLen } = this;\n data = toBytes(data);\n const len = data.length;\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input, cast it to view and process\n if (take === blockLen) {\n const dataView = createView(data);\n for (; blockLen <= len - pos; pos += blockLen)\n this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out) {\n assert.exists(this);\n assert.output(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n this.buffer.subarray(pos).fill(0);\n // we have less than padOffset left in buffer, so we cannot put length in current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++)\n buffer[i] = 0;\n // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n // So we just write lowest 64 bits of that value.\n setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = createView(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT\n if (len % 4)\n throw new Error('_sha2: outputLen should be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length)\n throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++)\n oview.setUint32(4 * i, state[i], isLE);\n }\n digest() {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to) {\n to || (to = new this.constructor());\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.length = length;\n to.pos = pos;\n to.finished = finished;\n to.destroyed = destroyed;\n if (length % blockLen)\n to.buffer.set(buffer);\n return to;\n }\n}\n//# sourceMappingURL=_sha2.js.map","import { SHA2 } from './_sha2.js';\nimport { rotr, wrapConstructor } from './utils.js';\n// Choice: a ? b : c\nconst Chi = (a, b, c) => (a & b) ^ (~a & c);\n// Majority function, true if any two inpust is true\nconst Maj = (a, b, c) => (a & b) ^ (a & c) ^ (b & c);\n// Round constants:\n// first 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311)\n// prettier-ignore\nconst SHA256_K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n// Initial state (first 32 bits of the fractional parts of the square roots of the first 8 primes 2..19):\n// prettier-ignore\nconst IV = new Uint32Array([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19\n]);\n// Temporary buffer, not used to store anything between runs\n// Named this way because it matches specification.\nconst SHA256_W = new Uint32Array(64);\nclass SHA256 extends SHA2 {\n constructor() {\n super(64, 32, 8, false);\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n this.A = IV[0] | 0;\n this.B = IV[1] | 0;\n this.C = IV[2] | 0;\n this.D = IV[3] | 0;\n this.E = IV[4] | 0;\n this.F = IV[5] | 0;\n this.G = IV[6] | 0;\n this.H = IV[7] | 0;\n }\n get() {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n set(A, B, C, D, E, F, G, H) {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4)\n SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n const T2 = (sigma0 + Maj(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n roundClean() {\n SHA256_W.fill(0);\n }\n destroy() {\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n this.buffer.fill(0);\n }\n}\n// Constants from https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf\nclass SHA224 extends SHA256 {\n constructor() {\n super();\n this.A = 0xc1059ed8 | 0;\n this.B = 0x367cd507 | 0;\n this.C = 0x3070dd17 | 0;\n this.D = 0xf70e5939 | 0;\n this.E = 0xffc00b31 | 0;\n this.F = 0x68581511 | 0;\n this.G = 0x64f98fa7 | 0;\n this.H = 0xbefa4fa4 | 0;\n this.outputLen = 28;\n }\n}\n/**\n * SHA2-256 hash function\n * @param message - data that would be hashed\n */\nexport const sha256 = wrapConstructor(() => new SHA256());\nexport const sha224 = wrapConstructor(() => new SHA224());\n//# sourceMappingURL=sha256.js.map","/**\n * Cryptographic Operations (secp256k1)\n * Lazy-loaded for performance\n */\n\nimport { sha256 } from '@noble/hashes/sha256';\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils';\n\nlet secp256k1 = null;\n\n/**\n * Lazy load secp256k1 module\n * @private\n */\nasync function loadCrypto() {\n if (!secp256k1) {\n const module = await import('@noble/curves/secp256k1');\n secp256k1 = module.secp256k1;\n }\n return secp256k1;\n}\n\n/**\n * Get public key from private key\n * @param {string} privateKey - Private key (hex string)\n * @returns {Promise<string>} Public key (hex string)\n */\nexport async function getPublicKey(privateKey) {\n const crypto = await loadCrypto();\n const pubKey = crypto.getPublicKey(privateKey);\n return bytesToHex(pubKey);\n}\n\n/**\n * Sign content with private key\n * @param {string} content - Content to sign (will be hashed)\n * @param {string} privateKey - Private key (hex string)\n * @returns {Promise<string>} Signature (hex string)\n */\nexport async function sign(content, privateKey) {\n try {\n const crypto = await loadCrypto();\n\n // Hash content\n const msgHash = hashContent(content);\n\n // Sign - secp256k1.sign returns Signature object\n const signature = crypto.sign(msgHash, privateKey);\n return signature.toCompactHex();\n } catch (error) {\n throw new Error(`Signature generation failed: ${error.message}`);\n }\n}\n\n/**\n * Verify signature\n * @param {string} content - Original content\n * @param {string} signature - Signature (hex string)\n * @param {string} publicKey - Public key (hex string)\n * @returns {Promise<boolean>} True if valid\n */\nexport async function verify(content, signature, publicKey) {\n try {\n // Validate public key format\n if (!publicKey || typeof publicKey !== 'string' || publicKey.length < 64) {\n throw new Error('Invalid public key format');\n }\n\n const crypto = await loadCrypto();\n\n const msgHash = hashContent(content);\n const isValid = crypto.verify(signature, msgHash, publicKey);\n return isValid;\n } catch (error) {\n // Invalid signatures or keys throw errors\n // For test compatibility, rethrow if it's a validation error\n if (error.message === 'Invalid public key format') {\n throw error;\n }\n // Otherwise return false for invalid signatures\n return false;\n }\n}\n\n/**\n * Match token scope against requested scope with wildcard support\n * Supports:\n * - Exact match: { holonId: \"abc\", lensName: \"quests\" }\n * - Item-level: { holonId: \"abc\", lensName: \"quests\", dataId: \"quest-001\" }\n * - Wildcards: { holonId: \"*\", lensName: \"*\" } matches everything\n * @param {Object} tokenScope - Scope from capability token\n * @param {Object} requestedScope - Scope being requested\n * @returns {boolean} True if token scope covers requested scope\n */\nexport function matchScope(tokenScope, requestedScope) {\n // Handle string scopes (legacy support)\n if (typeof tokenScope === 'string' || typeof requestedScope === 'string') {\n const tokenStr = typeof tokenScope === 'string' ? tokenScope : JSON.stringify(tokenScope);\n const reqStr = typeof requestedScope === 'string' ? requestedScope : JSON.stringify(requestedScope);\n return tokenStr === reqStr;\n }\n\n // Handle holonId\n if (tokenScope.holonId !== '*' && tokenScope.holonId !== requestedScope.holonId) {\n return false;\n }\n\n // Handle lensName\n if (tokenScope.lensName !== '*' && tokenScope.lensName !== requestedScope.lensName) {\n return false;\n }\n\n // Handle optional dataId (item-level scope)\n // If token has specific dataId (not wildcard), it must match requested dataId\n if (tokenScope.dataId && tokenScope.dataId !== '*') {\n if (requestedScope.dataId && tokenScope.dataId !== requestedScope.dataId) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Issue capability token\n * @param {string[]} permissions - Permissions array (e.g., ['read', 'write', 'delete'])\n * @param {Object|string} scope - Scope (holon/lens path or object). Supports wildcards: { holonId: \"*\", lensName: \"*\" }\n * @param {string} recipient - Recipient public key\n * @param {Object} options - Options\n * @param {number} options.expiresIn - Expiration in milliseconds (default: 1 hour)\n * @param {string} options.issuer - Issuer ID\n * @param {string} options.issuerKey - Issuer private key for signing\n * @returns {Promise<string>} Capability token (base64-encoded JWT-like)\n */\nexport async function issueCapability(permissions, scope, recipient, options = {}) {\n const { expiresIn = 3600000, issuer = 'holosphere', issuerKey } = options;\n\n // Validate permissions\n if (!Array.isArray(permissions) || permissions.length === 0) {\n throw new Error('Permissions array cannot be empty');\n }\n\n // Validate scope - now supports wildcards\n if (typeof scope === 'object') {\n // holonId is required (can be '*' for wildcard)\n if (scope.holonId === undefined || scope.holonId === '') {\n throw new Error('Invalid scope: holonId is required (use \"*\" for wildcard)');\n }\n // lensName is required (can be '*' for wildcard)\n if (scope.lensName === undefined || scope.lensName === '') {\n throw new Error('Invalid scope: lensName is required (use \"*\" for wildcard)');\n }\n // dataId is optional (can be specific value, '*', or omitted)\n } else if (typeof scope === 'string' && scope === '') {\n throw new Error('Invalid scope: cannot be empty string');\n }\n\n // Validate issuerKey if provided\n if (issuerKey && (typeof issuerKey !== 'string' || issuerKey.length < 32)) {\n throw new Error('Invalid issuer key');\n }\n\n const token = {\n type: 'capability',\n permissions,\n scope,\n recipient,\n issuer,\n nonce: generateNonce(),\n issued: Date.now(),\n expires: Date.now() + expiresIn,\n };\n\n // Encode token as base64\n const payload = JSON.stringify(token);\n const encoded = Buffer.from ?\n Buffer.from(payload).toString('base64') :\n btoa(payload);\n\n // If issuerKey provided, sign the token\n if (issuerKey) {\n const signature = await sign(payload, issuerKey);\n return `${encoded}.${signature}`;\n }\n\n return encoded;\n}\n\n/**\n * Verify capability token\n * @param {string|Object} token - Capability token (string or object)\n * @param {string} requiredPermission - Required permission\n * @param {Object|string} scope - Scope to check (supports wildcards in token scope)\n * @returns {Promise<boolean>} True if valid\n */\nexport async function verifyCapability(token, requiredPermission, scope) {\n try {\n let tokenObj;\n\n // Decode if string\n if (typeof token === 'string') {\n const parts = token.split('.');\n const payload = parts[0];\n const decoded = Buffer.from ?\n Buffer.from(payload, 'base64').toString('utf8') :\n atob(payload);\n tokenObj = JSON.parse(decoded);\n\n // TODO: Verify signature if present (parts[1])\n } else {\n tokenObj = token;\n }\n\n if (!tokenObj || tokenObj.type !== 'capability') {\n return false;\n }\n\n // Check expiration\n if (Date.now() > tokenObj.expires) {\n return false;\n }\n\n // Check scope using matchScope (supports wildcards)\n if (!matchScope(tokenObj.scope, scope)) {\n return false;\n }\n\n // Check permission\n if (!tokenObj.permissions.includes(requiredPermission)) {\n return false;\n }\n\n return true;\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Generate unique nonce\n * @private\n */\nfunction generateNonce() {\n return (\n Date.now().toString(36) + Math.random().toString(36).substring(2, 15)\n );\n}\n\n/**\n * Hash content using SHA-256\n * @private\n */\nfunction hashContent(content) {\n const str = typeof content === 'string' ? content : JSON.stringify(content);\n const encoder = new TextEncoder();\n const data = encoder.encode(str);\n const hash = sha256(data);\n return bytesToHex(hash);\n}\n","/**\n * Federation Registry - Manages cross-holosphere partnerships\n * Tracks federated partners and their capability tokens\n */\n\nimport { writeGlobal, readGlobal } from '../storage/global-tables.js';\nimport { matchScope } from '../crypto/secp256k1.js';\n\nconst FEDERATION_TABLE = 'federations';\n\n/**\n * Get the federation registry for this holosphere\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @returns {Promise<Object>} Federation registry\n */\nexport async function getFederationRegistry(client, appname) {\n const registry = await readGlobal(client, appname, FEDERATION_TABLE, client.publicKey);\n\n return registry || {\n id: client.publicKey,\n federatedWith: [],\n discoveryEnabled: false,\n autoAccept: false,\n defaultScope: { holonId: '*', lensName: '*' },\n defaultPermissions: ['read'],\n };\n}\n\n/**\n * Save the federation registry\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {Object} registry - Registry to save\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function saveFederationRegistry(client, appname, registry) {\n return writeGlobal(client, appname, FEDERATION_TABLE, registry);\n}\n\n/**\n * Add a federated partner\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {string} partnerPubKey - Partner's public key\n * @param {Object} options - Partner options\n * @param {string} options.alias - Human-readable name\n * @param {string} options.addedVia - How the partner was added ('manual' or 'nostr_discovery')\n * @param {Object[]} options.inboundCapabilities - Capabilities they've granted us\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function addFederatedPartner(client, appname, partnerPubKey, options = {}) {\n const registry = await getFederationRegistry(client, appname);\n\n // Check if already exists\n const existingIndex = registry.federatedWith.findIndex(p => p.pubKey === partnerPubKey);\n\n if (existingIndex >= 0) {\n // Update existing entry\n const existing = registry.federatedWith[existingIndex];\n\n if (options.alias) {\n existing.alias = options.alias;\n }\n\n if (options.inboundCapabilities) {\n existing.inboundCapabilities = [\n ...(existing.inboundCapabilities || []),\n ...options.inboundCapabilities\n ];\n }\n\n existing.updatedAt = Date.now();\n registry.federatedWith[existingIndex] = existing;\n } else {\n // Add new partner\n registry.federatedWith.push({\n pubKey: partnerPubKey,\n alias: options.alias || null,\n addedAt: Date.now(),\n addedVia: options.addedVia || 'manual',\n inboundCapabilities: options.inboundCapabilities || [],\n outboundCapabilities: [],\n });\n }\n\n return saveFederationRegistry(client, appname, registry);\n}\n\n/**\n * Remove a federated partner\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {string} partnerPubKey - Partner's public key to remove\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function removeFederatedPartner(client, appname, partnerPubKey) {\n const registry = await getFederationRegistry(client, appname);\n\n const initialLength = registry.federatedWith.length;\n registry.federatedWith = registry.federatedWith.filter(p => p.pubKey !== partnerPubKey);\n\n if (registry.federatedWith.length === initialLength) {\n return false; // Partner not found\n }\n\n return saveFederationRegistry(client, appname, registry);\n}\n\n/**\n * Get all federated author public keys\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @returns {Promise<string[]>} Array of federated public keys\n */\nexport async function getFederatedAuthors(client, appname) {\n const registry = await getFederationRegistry(client, appname);\n return registry.federatedWith.map(p => p.pubKey);\n}\n\n/**\n * Get a specific federated partner\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {string} partnerPubKey - Partner's public key\n * @returns {Promise<Object|null>} Partner info or null\n */\nexport async function getFederatedPartner(client, appname, partnerPubKey) {\n const registry = await getFederationRegistry(client, appname);\n return registry.federatedWith.find(p => p.pubKey === partnerPubKey) || null;\n}\n\n/**\n * Get capability for a specific author and scope\n * Finds a valid, non-expired capability that covers the requested scope\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {string} authorPubKey - Author's public key\n * @param {Object} scope - Requested scope { holonId, lensName, dataId? }\n * @returns {Promise<Object|null>} Capability entry or null\n */\nexport async function getCapabilityForAuthor(client, appname, authorPubKey, scope) {\n const registry = await getFederationRegistry(client, appname);\n const partner = registry.federatedWith.find(p => p.pubKey === authorPubKey);\n\n if (!partner || !partner.inboundCapabilities) {\n return null;\n }\n\n // Find matching, non-expired capability\n return partner.inboundCapabilities.find(cap => {\n // Check expiration\n if (cap.expires && cap.expires < Date.now()) {\n return false;\n }\n\n // Check scope match (supports wildcards)\n return matchScope(cap.scope, scope);\n }) || null;\n}\n\n/**\n * Store an inbound capability (one we received from a partner)\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {string} partnerPubKey - Partner's public key\n * @param {Object} capabilityInfo - Capability information\n * @param {string} capabilityInfo.token - The capability token\n * @param {Object} capabilityInfo.scope - Token scope\n * @param {string[]} capabilityInfo.permissions - Granted permissions\n * @param {number} capabilityInfo.expires - Expiration timestamp\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function storeInboundCapability(client, appname, partnerPubKey, capabilityInfo) {\n const registry = await getFederationRegistry(client, appname);\n const partner = registry.federatedWith.find(p => p.pubKey === partnerPubKey);\n\n if (!partner) {\n // Auto-add partner if not exists\n return addFederatedPartner(client, appname, partnerPubKey, {\n addedVia: 'capability_received',\n inboundCapabilities: [capabilityInfo]\n });\n }\n\n if (!partner.inboundCapabilities) {\n partner.inboundCapabilities = [];\n }\n\n // Check if we already have this capability (by scope match)\n const existingIndex = partner.inboundCapabilities.findIndex(cap =>\n JSON.stringify(cap.scope) === JSON.stringify(capabilityInfo.scope)\n );\n\n if (existingIndex >= 0) {\n // Update existing capability\n partner.inboundCapabilities[existingIndex] = {\n ...capabilityInfo,\n updatedAt: Date.now()\n };\n } else {\n // Add new capability\n partner.inboundCapabilities.push({\n ...capabilityInfo,\n receivedAt: Date.now()\n });\n }\n\n return saveFederationRegistry(client, appname, registry);\n}\n\n/**\n * Store an outbound capability (one we issued to a partner)\n * We only store the hash, not the full token\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {string} partnerPubKey - Partner's public key\n * @param {Object} capabilityInfo - Capability information\n * @param {string} capabilityInfo.tokenHash - SHA-256 hash of the token\n * @param {Object} capabilityInfo.scope - Token scope\n * @param {string[]} capabilityInfo.permissions - Granted permissions\n * @param {number} capabilityInfo.expires - Expiration timestamp\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function storeOutboundCapability(client, appname, partnerPubKey, capabilityInfo) {\n const registry = await getFederationRegistry(client, appname);\n const partner = registry.federatedWith.find(p => p.pubKey === partnerPubKey);\n\n if (!partner) {\n throw new Error(`Partner ${partnerPubKey} not found in federation registry`);\n }\n\n if (!partner.outboundCapabilities) {\n partner.outboundCapabilities = [];\n }\n\n partner.outboundCapabilities.push({\n tokenHash: capabilityInfo.tokenHash,\n scope: capabilityInfo.scope,\n permissions: capabilityInfo.permissions,\n issuedAt: Date.now(),\n expires: capabilityInfo.expires,\n });\n\n return saveFederationRegistry(client, appname, registry);\n}\n\n/**\n * Revoke an outbound capability (by token hash)\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {string} partnerPubKey - Partner's public key\n * @param {string} tokenHash - Hash of the token to revoke\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function revokeOutboundCapability(client, appname, partnerPubKey, tokenHash) {\n const registry = await getFederationRegistry(client, appname);\n const partner = registry.federatedWith.find(p => p.pubKey === partnerPubKey);\n\n if (!partner || !partner.outboundCapabilities) {\n return false;\n }\n\n const initialLength = partner.outboundCapabilities.length;\n partner.outboundCapabilities = partner.outboundCapabilities.filter(\n cap => cap.tokenHash !== tokenHash\n );\n\n if (partner.outboundCapabilities.length === initialLength) {\n return false; // Token not found\n }\n\n return saveFederationRegistry(client, appname, registry);\n}\n\n/**\n * Update federation discovery settings\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {Object} settings - Discovery settings\n * @param {boolean} settings.discoveryEnabled - Enable Nostr discovery\n * @param {boolean} settings.autoAccept - Auto-accept federation requests\n * @param {Object} settings.defaultScope - Default scope for auto-accepted federations\n * @param {string[]} settings.defaultPermissions - Default permissions for auto-accepted federations\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function updateDiscoverySettings(client, appname, settings) {\n const registry = await getFederationRegistry(client, appname);\n\n if (settings.discoveryEnabled !== undefined) {\n registry.discoveryEnabled = settings.discoveryEnabled;\n }\n if (settings.autoAccept !== undefined) {\n registry.autoAccept = settings.autoAccept;\n }\n if (settings.defaultScope !== undefined) {\n registry.defaultScope = settings.defaultScope;\n }\n if (settings.defaultPermissions !== undefined) {\n registry.defaultPermissions = settings.defaultPermissions;\n }\n\n return saveFederationRegistry(client, appname, registry);\n}\n\n/**\n * Get all federated authors that have granted capabilities for a given scope\n * Returns pubKeys of partners who have given us access to read/write their data\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {Object} scope - Requested scope { holonId?, lensName?, dataId? }\n * @param {string} permission - Required permission ('read' or 'write')\n * @returns {Promise<Array>} Array of { pubKey, capability } for matching partners\n */\nexport async function getFederatedAuthorsForScope(client, appname, scope = {}, permission = 'read') {\n const registry = await getFederationRegistry(client, appname);\n const now = Date.now();\n const results = [];\n\n for (const partner of registry.federatedWith) {\n if (!partner.inboundCapabilities || partner.inboundCapabilities.length === 0) {\n continue;\n }\n\n // Find a valid capability that covers this scope\n for (const cap of partner.inboundCapabilities) {\n // Check expiration\n if (cap.expires && cap.expires < now) {\n continue;\n }\n\n // Check permission\n if (cap.permissions && !cap.permissions.includes(permission)) {\n continue;\n }\n\n // Check scope match (supports wildcards)\n if (matchScope(cap.scope, scope)) {\n results.push({\n pubKey: partner.pubKey,\n capability: cap,\n });\n break; // One valid capability per partner is enough\n }\n }\n }\n\n return results;\n}\n\n/**\n * Clean up expired capabilities from the registry\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @returns {Promise<Object>} Cleanup result { inboundRemoved, outboundRemoved }\n */\nexport async function cleanupExpiredCapabilities(client, appname) {\n const registry = await getFederationRegistry(client, appname);\n const now = Date.now();\n let inboundRemoved = 0;\n let outboundRemoved = 0;\n\n for (const partner of registry.federatedWith) {\n if (partner.inboundCapabilities) {\n const beforeCount = partner.inboundCapabilities.length;\n partner.inboundCapabilities = partner.inboundCapabilities.filter(\n cap => !cap.expires || cap.expires > now\n );\n inboundRemoved += beforeCount - partner.inboundCapabilities.length;\n }\n\n if (partner.outboundCapabilities) {\n const beforeCount = partner.outboundCapabilities.length;\n partner.outboundCapabilities = partner.outboundCapabilities.filter(\n cap => !cap.expires || cap.expires > now\n );\n outboundRemoved += beforeCount - partner.outboundCapabilities.length;\n }\n }\n\n if (inboundRemoved > 0 || outboundRemoved > 0) {\n await saveFederationRegistry(client, appname, registry);\n }\n\n return { inboundRemoved, outboundRemoved };\n}\n","/**\n * Federation and Hologram (reference) Management\n */\n\nimport { buildPath, write, read, update } from '../storage/nostr-wrapper.js';\nimport { verifyCapability } from '../crypto/secp256k1.js';\nimport { getCapabilityForAuthor } from './registry.js';\n\nconst MAX_RESOLUTION_DEPTH = 10;\n\n/**\n * Check if creating a hologram would result in a circular reference\n * This follows the chain from the source to see if it eventually points back to the target\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} sourceHolon - Source holon ID (where original data lives)\n * @param {string} targetHolon - Target holon ID (where hologram would be created)\n * @param {string} lensName - Lens name\n * @param {string} dataId - Data ID\n * @returns {Promise<Object>} Result with { isCircular, chain }\n */\nexport async function wouldCreateCircularHologram(client, appname, sourceHolon, targetHolon, lensName, dataId) {\n const visited = new Set();\n const chain = [];\n\n let currentHolon = sourceHolon;\n let currentLens = lensName;\n let currentDataId = dataId;\n let currentAppname = appname;\n\n // Follow the chain to see if we eventually reach targetHolon\n while (visited.size < MAX_RESOLUTION_DEPTH) {\n const key = `${currentAppname}:${currentHolon}:${currentLens}:${currentDataId}`;\n\n if (visited.has(key)) {\n // Already visited this node - there's a cycle in the existing chain\n return { isCircular: true, chain, reason: 'existing_cycle' };\n }\n\n visited.add(key);\n chain.push({ holon: currentHolon, lens: currentLens, dataId: currentDataId });\n\n // Check if current holon is our target - this would create a circular reference\n if (currentHolon === targetHolon) {\n return { isCircular: true, chain, reason: 'would_create_cycle' };\n }\n\n // Read the data at current location\n const path = buildPath(currentAppname, currentHolon, currentLens, currentDataId);\n const data = await read(client, path);\n\n if (!data) {\n // Data doesn't exist - no circular reference possible from this chain\n return { isCircular: false, chain };\n }\n\n if (!data.hologram || !data.target) {\n // Not a hologram - chain ends here, no circular reference\n return { isCircular: false, chain };\n }\n\n // Follow the hologram to its target\n currentAppname = data.target.appname || currentAppname;\n currentHolon = data.target.holonId;\n currentLens = data.target.lensName || currentLens;\n currentDataId = data.target.dataId || currentDataId;\n }\n\n // Max depth reached - treat as potential circular to be safe\n return { isCircular: true, chain, reason: 'max_depth_exceeded' };\n}\n\n/**\n * Create a hologram (lightweight reference)\n * @param {string} sourceHolon - Source holon ID\n * @param {string} targetHolon - Target holon ID\n * @param {string} lensName - Lens name\n * @param {string} dataId - Data ID\n * @param {string} appname - Application namespace\n * @param {Object} options - Optional cross-holosphere settings\n * @param {string} options.authorPubKey - Source author's public key (for cross-holosphere)\n * @param {string} options.capability - Capability token (for cross-holosphere)\n * @returns {Object} Hologram object\n */\nexport function createHologram(sourceHolon, targetHolon, lensName, dataId, appname, options = {}) {\n const { authorPubKey = null, capability = null } = options;\n\n const soul = buildPath(appname, sourceHolon, lensName, dataId);\n\n const hologram = {\n id: dataId,\n hologram: true,\n soul,\n target: {\n appname,\n holonId: sourceHolon,\n lensName,\n dataId,\n },\n _meta: {\n created: Date.now(),\n sourceHolon,\n source: sourceHolon, // Alias for compatibility\n },\n };\n\n // Cross-holosphere enhancements\n if (authorPubKey) {\n hologram.crossHolosphere = true;\n hologram.target.authorPubKey = authorPubKey;\n hologram._meta.sourcePubKey = authorPubKey;\n }\n\n if (capability) {\n hologram.capability = capability;\n hologram._meta.grantedAt = Date.now();\n }\n\n return hologram;\n}\n\n/**\n * Resolve hologram to actual data, merging local overrides\n * Supports cross-holosphere holograms with capability token verification\n * @param {Object} client - Nostr client instance\n * @param {Object} hologram - Hologram object\n * @param {Set} visited - Visited souls (circular reference detection)\n * @param {Array} chain - Chain of souls for debugging circular references\n * @param {Object} options - Resolution options\n * @param {string} options.appname - Application namespace (for registry lookup)\n * @param {boolean} options.deleteCircular - If true, delete circular holograms when detected (default: true)\n * @param {string} options.hologramPath - Path of the hologram being resolved (for deletion)\n * @returns {Promise<Object|null>} Resolved data with _hologram metadata, or null\n */\nexport async function resolveHologram(client, hologram, visited = new Set(), chain = [], options = {}) {\n const { deleteCircular = true, hologramPath = null } = options;\n\n if (!hologram || !hologram.hologram) {\n return hologram; // Not a hologram, return as-is\n }\n\n const { soul } = hologram;\n const target = hologram.target || {};\n\n // Circular reference detection\n if (visited.has(soul)) {\n const chainStr = [...chain, soul].join(' → ');\n console.warn(`🔄 Circular reference detected - removing hologram`);\n console.warn(` Soul: ${soul}`);\n console.warn(` Chain: ${chainStr}`);\n console.warn(` Source holon: ${target.holonId || 'unknown'}`);\n console.warn(` Lens: ${target.lensName || 'unknown'}`);\n console.warn(` Data ID: ${target.dataId || hologram.id || 'unknown'}`);\n console.warn(` Resolution depth: ${visited.size}`);\n\n // Delete the circular hologram\n if (deleteCircular && hologramPath) {\n console.info(` 🗑️ Deleting circular hologram at: ${hologramPath}`);\n await write(client, hologramPath, null);\n }\n\n return null;\n }\n\n if (visited.size >= MAX_RESOLUTION_DEPTH) {\n const chainStr = [...chain, soul].join(' → ');\n console.warn(`⚠️ Max resolution depth (${MAX_RESOLUTION_DEPTH}) exceeded - removing hologram`);\n console.warn(` Current soul: ${soul}`);\n console.warn(` Chain: ${chainStr}`);\n console.warn(` Source holon: ${target.holonId || 'unknown'}`);\n console.warn(` Lens: ${target.lensName || 'unknown'}`);\n\n // Delete the problematic hologram\n if (deleteCircular && hologramPath) {\n console.info(` 🗑️ Deleting deep chain hologram at: ${hologramPath}`);\n await write(client, hologramPath, null);\n }\n\n return null;\n }\n\n visited.add(soul);\n chain.push(soul);\n\n let sourceData;\n\n // Handle cross-holosphere holograms\n if (hologram.crossHolosphere && target.authorPubKey) {\n // Get capability - try embedded first, then registry fallback\n let capability = hologram.capability;\n\n if (!capability && options.appname) {\n // Fallback to registry lookup\n const capEntry = await getCapabilityForAuthor(\n client,\n options.appname,\n target.authorPubKey,\n {\n holonId: target.holonId,\n lensName: target.lensName,\n dataId: target.dataId,\n }\n );\n if (capEntry) {\n capability = capEntry.token;\n }\n }\n\n // Verify capability before resolving\n if (!capability) {\n console.warn(`❌ Cross-holosphere hologram missing capability: ${soul}`);\n return null;\n }\n\n const isValid = await verifyCapability(\n capability,\n 'read',\n {\n holonId: target.holonId,\n lensName: target.lensName,\n dataId: target.dataId,\n }\n );\n\n if (!isValid) {\n console.warn(`❌ Capability verification failed for cross-holosphere hologram: ${soul}`);\n return null;\n }\n\n // Read from federated source (different author)\n sourceData = await read(client, soul, {\n authors: [target.authorPubKey]\n });\n } else {\n // Same-holosphere resolution (original behavior)\n sourceData = await read(client, soul);\n }\n\n if (!sourceData) {\n return null;\n }\n\n // If source data is also a hologram, recursively resolve\n if (sourceData.hologram) {\n // Pass the soul as the hologramPath so circular holograms can be deleted\n return resolveHologram(client, sourceData, visited, chain, { ...options, hologramPath: soul });\n }\n\n // Merge hologram with source data\n return mergeHologramWithSource(hologram, sourceData);\n}\n\n/**\n * Merge hologram local overrides with source data\n * @private\n * @param {Object} hologram - Hologram object\n * @param {Object} sourceData - Source data\n * @returns {Object} Merged data with _hologram metadata\n */\nfunction mergeHologramWithSource(hologram, sourceData) {\n // Extract local overrides from the hologram (exclude hologram-specific fields)\n const hologramOnlyFields = ['hologram', 'soul', 'target', '_meta', 'id', 'capability', 'crossHolosphere'];\n const localOverrides = {};\n const localOverrideKeys = [];\n\n for (const key of Object.keys(hologram)) {\n if (!hologramOnlyFields.includes(key)) {\n localOverrides[key] = hologram[key];\n localOverrideKeys.push(key);\n }\n }\n\n // Merge: source data + local overrides + hologram metadata\n const sourceHolon = hologram._meta?.sourceHolon || hologram._meta?.source || hologram.target?.holonId;\n const resolved = {\n ...sourceData, // Original data from source\n ...localOverrides, // Local overrides (x, y, pinned, etc.)\n _hologram: {\n isHologram: true,\n soul: hologram.soul,\n sourceHolon: sourceHolon,\n localOverrides: localOverrideKeys,\n crossHolosphere: hologram.crossHolosphere || false,\n sourcePubKey: hologram._meta?.sourcePubKey || null,\n }\n };\n\n // Preserve original _meta and add source from hologram\n if (sourceData._meta) {\n resolved._meta = { ...sourceData._meta, source: sourceHolon };\n } else {\n resolved._meta = { source: sourceHolon };\n }\n\n return resolved;\n}\n\n/**\n * Setup federation between holons\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} sourceHolon - Source holon ID\n * @param {string} targetHolon - Target holon ID\n * @param {string} lensName - Lens name\n * @param {Object} options - Federation options\n * @param {string} options.direction - 'inbound' or 'outbound'\n * @param {string} options.mode - 'reference' or 'copy'\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function setupFederation(\n client,\n appname,\n sourceHolon,\n targetHolon,\n lensName,\n options = {}\n) {\n const { direction = 'outbound', mode = 'reference' } = options;\n\n const federationConfig = {\n sourceHolon,\n targetHolon,\n lensName,\n direction,\n mode,\n created: Date.now(),\n };\n\n // Store federation config\n const configPath = buildPath(appname, sourceHolon, lensName, '_federation');\n return write(client, configPath, federationConfig);\n}\n\n/**\n * Propagate data to federated location\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {Object} data - Data to propagate\n * @param {string} sourceHolon - Source holon ID\n * @param {string} targetHolon - Target holon ID\n * @param {string} lensName - Lens name\n * @param {string} mode - 'reference' or 'copy'\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function propagateData(\n client,\n appname,\n data,\n sourceHolon,\n targetHolon,\n lensName,\n mode = 'reference'\n) {\n const dataId = data.id;\n\n // Don't create hologram to the same holon - it would point to itself\n if (sourceHolon === targetHolon) {\n console.info(`⏭️ Skipping propagation - source and target are the same holon: ${sourceHolon}`);\n return true;\n }\n\n // Don't propagate holograms back to avoid circular references\n // If this data is already a hologram pointing to the target, skip it\n if (data.hologram === true) {\n // Check if this hologram would create a circular reference\n if (data.target && data.target.holonId === targetHolon) {\n console.info(`🔄 Skipping propagation - would create circular reference:`);\n console.info(` Data ID: ${dataId}`);\n console.info(` Source holon: ${sourceHolon}`);\n console.info(` Target holon: ${targetHolon}`);\n console.info(` Hologram points to: ${data.target.holonId}`);\n console.info(` Lens: ${lensName}`);\n console.info(` Original soul: ${data.soul || 'unknown'}`);\n return true;\n }\n\n // Check if targetHolon is already in the original source's activeHolograms\n // This prevents creating duplicate holograms when the target already has one\n if (data.target) {\n const originalSourcePath = buildPath(\n data.target.appname || appname,\n data.target.holonId,\n data.target.lensName || lensName,\n data.target.dataId || dataId\n );\n const originalSource = await read(client, originalSourcePath);\n\n if (originalSource?._meta?.activeHolograms) {\n const alreadyHasHologram = originalSource._meta.activeHolograms.some(\n h => h.targetHolon === targetHolon\n );\n if (alreadyHasHologram) {\n console.info(`⏭️ Skipping propagation - target already in activeHolograms:`);\n console.info(` Data ID: ${dataId}`);\n console.info(` Original source: ${data.target.holonId}`);\n console.info(` Target holon: ${targetHolon}`);\n return true;\n }\n }\n }\n\n // Deep circular check for hologram copy - ensure the original source doesn't eventually point to target\n const originalSourceHolon = data.target.holonId;\n const originalDataId = data.target.dataId || dataId;\n const originalLens = data.target.lensName || lensName;\n const originalAppname = data.target.appname || appname;\n\n const circularCheck = await wouldCreateCircularHologram(\n client, originalAppname, originalSourceHolon, targetHolon, originalLens, originalDataId\n );\n\n if (circularCheck.isCircular) {\n const chainStr = circularCheck.chain.map(c => c.holon).join(' → ');\n console.warn(`🔄 Preventing circular hologram copy:`);\n console.warn(` Data ID: ${dataId}`);\n console.warn(` Original source: ${originalSourceHolon}`);\n console.warn(` Would copy to: ${targetHolon}`);\n console.warn(` Existing chain: ${chainStr}`);\n console.warn(` Reason: ${circularCheck.reason}`);\n return false;\n }\n\n // When propagating a hologram, copy it instead of creating a hologram of a hologram\n // This maintains the reference to the original source\n const targetPath = buildPath(appname, targetHolon, lensName, dataId);\n const copiedHologram = {\n ...data,\n _meta: {\n ...data._meta,\n copiedFrom: sourceHolon,\n copiedAt: Date.now()\n }\n };\n const success = await write(client, targetPath, copiedHologram);\n\n // Add this new location to the original source's activeHolograms\n if (success && data.target) {\n await addActiveHologram(\n client,\n data.target.appname || appname,\n data.target.holonId,\n data.target.lensName || lensName,\n data.target.dataId || dataId,\n targetHolon\n );\n console.info(`📋 Copied hologram to ${targetHolon}:`);\n console.info(` Data ID: ${dataId}`);\n console.info(` Original source: ${data.target.holonId}`);\n console.info(` Copied from: ${sourceHolon}`);\n }\n\n return success;\n }\n\n // For non-hologram data, check if targetHolon is already in activeHolograms\n if (mode === 'reference' && data._meta?.activeHolograms) {\n const alreadyHasHologram = data._meta.activeHolograms.some(\n h => h.targetHolon === targetHolon\n );\n if (alreadyHasHologram) {\n console.info(`⏭️ Skipping propagation - target already in activeHolograms:`);\n console.info(` Data ID: ${dataId}`);\n console.info(` Source holon: ${sourceHolon}`);\n console.info(` Target holon: ${targetHolon}`);\n return true;\n }\n }\n\n if (mode === 'reference') {\n // Deep circular reference check - follow the chain from source to see if it would loop back\n const circularCheck = await wouldCreateCircularHologram(\n client, appname, sourceHolon, targetHolon, lensName, dataId\n );\n\n if (circularCheck.isCircular) {\n const chainStr = circularCheck.chain.map(c => c.holon).join(' → ');\n console.warn(`🔄 Preventing circular hologram creation:`);\n console.warn(` Data ID: ${dataId}`);\n console.warn(` Would create: ${sourceHolon} → ${targetHolon}`);\n console.warn(` Existing chain: ${chainStr}`);\n console.warn(` Reason: ${circularCheck.reason}`);\n return false;\n }\n\n // Create hologram in target\n const hologram = createHologram(sourceHolon, targetHolon, lensName, dataId, appname);\n const targetPath = buildPath(appname, targetHolon, lensName, dataId);\n const success = await write(client, targetPath, hologram);\n\n // Add hologram to source data's _meta.activeHolograms for tracking\n if (success) {\n await addActiveHologram(client, appname, sourceHolon, lensName, dataId, targetHolon);\n }\n\n return success;\n } else {\n // Copy data to target\n const targetPath = buildPath(appname, targetHolon, lensName, dataId);\n return write(client, targetPath, { ...data, _meta: { ...data._meta, source: sourceHolon } });\n }\n}\n\n/**\n * Update local overrides on an existing hologram\n * This allows storing holon-specific data (position, pinned status, etc.) on a hologram\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} holonId - Holon where the hologram lives\n * @param {string} lensName - Lens name\n * @param {string} dataId - Data ID\n * @param {Object} overrides - Local override fields to set (e.g., { x: 100, y: 200, pinned: true })\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function updateHologramOverrides(client, appname, holonId, lensName, dataId, overrides) {\n const path = buildPath(appname, holonId, lensName, dataId);\n\n // Read existing hologram\n const existing = await read(client, path);\n\n if (!existing) {\n console.warn(`Hologram not found at ${path}`);\n return false;\n }\n\n // Only update if it's actually a hologram\n if (!existing.hologram) {\n console.warn(`Data at ${path} is not a hologram, cannot update overrides`);\n return false;\n }\n\n // Merge overrides into hologram (but don't allow overriding hologram-specific fields)\n const protectedFields = ['hologram', 'soul', 'target', '_meta', 'id'];\n const safeOverrides = {};\n\n for (const [key, value] of Object.entries(overrides)) {\n if (!protectedFields.includes(key)) {\n safeOverrides[key] = value;\n }\n }\n\n const updated = {\n ...existing,\n ...safeOverrides\n };\n\n return write(client, path, updated);\n}\n\n/**\n * Check if data is a hologram (unresolved reference)\n * @param {Object} data - Data to check\n * @returns {boolean} True if data is an unresolved hologram\n */\nexport function isHologram(data) {\n return data && data.hologram === true;\n}\n\n/**\n * Check if data was resolved from a hologram\n * @param {Object} data - Data to check\n * @returns {boolean} True if data was resolved from a hologram\n */\nexport function isResolvedHologram(data) {\n return data && data._hologram && data._hologram.isHologram === true;\n}\n\n/**\n * Get hologram source information from resolved data\n * @param {Object} data - Resolved data\n * @returns {Object|null} Source info { soul, sourceHolon, localOverrides } or null\n */\nexport function getHologramSource(data) {\n if (!isResolvedHologram(data)) {\n return null;\n }\n return {\n soul: data._hologram.soul,\n sourceHolon: data._hologram.sourceHolon,\n localOverrides: data._hologram.localOverrides || []\n };\n}\n\n/**\n * Add a hologram reference to the source data's _meta.activeHolograms\n * This tracks all holograms pointing to this specific data item\n * If the source is itself a hologram, follows the chain to find the real source\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} sourceHolon - Source holon ID (where original data lives)\n * @param {string} lensName - Lens name\n * @param {string} dataId - Data ID\n * @param {string} targetHolon - Target holon ID (where hologram lives)\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function addActiveHologram(client, appname, sourceHolon, lensName, dataId, targetHolon) {\n let currentAppname = appname;\n let currentHolon = sourceHolon;\n let currentLens = lensName;\n let currentDataId = dataId;\n let sourcePath = buildPath(currentAppname, currentHolon, currentLens, currentDataId);\n\n // Read existing source data\n let sourceData = await read(client, sourcePath);\n if (!sourceData) {\n console.warn(`Source data not found at ${sourcePath}`);\n return false;\n }\n\n // If source is a hologram, follow the chain to find the real source\n // This ensures activeHolograms is always tracked on the actual data, not on holograms\n let depth = 0;\n const maxDepth = 10;\n while (sourceData.hologram === true && sourceData.target && depth < maxDepth) {\n depth++;\n currentAppname = sourceData.target.appname || currentAppname;\n currentHolon = sourceData.target.holonId;\n currentLens = sourceData.target.lensName || currentLens;\n currentDataId = sourceData.target.dataId || currentDataId;\n sourcePath = buildPath(currentAppname, currentHolon, currentLens, currentDataId);\n\n sourceData = await read(client, sourcePath);\n if (!sourceData) {\n console.warn(`Real source data not found at ${sourcePath}`);\n return false;\n }\n }\n\n if (depth > 0) {\n console.info(`📍 Followed hologram chain (depth: ${depth}) to real source: ${currentHolon}/${currentLens}/${currentDataId}`);\n }\n\n // Initialize _meta and activeHolograms if needed\n if (!sourceData._meta) {\n sourceData._meta = {};\n }\n if (!Array.isArray(sourceData._meta.activeHolograms)) {\n sourceData._meta.activeHolograms = [];\n }\n\n const now = Date.now();\n\n // Check if this hologram already exists\n const existingIndex = sourceData._meta.activeHolograms.findIndex(\n h => h.targetHolon === targetHolon\n );\n\n if (existingIndex >= 0) {\n // Update existing entry\n sourceData._meta.activeHolograms[existingIndex].lastUpdated = now;\n } else {\n // Add new entry\n sourceData._meta.activeHolograms.push({\n targetHolon,\n created: now,\n lastUpdated: now\n });\n }\n\n // Write to the real source path (not the original one if we followed a chain)\n return write(client, sourcePath, sourceData);\n}\n\n/**\n * Remove a hologram reference from the source data's _meta.activeHolograms\n * If the source is itself a hologram, follows the chain to find the real source\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} sourceHolon - Source holon ID\n * @param {string} lensName - Lens name\n * @param {string} dataId - Data ID\n * @param {string} targetHolon - Target holon ID\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function removeActiveHologram(client, appname, sourceHolon, lensName, dataId, targetHolon) {\n let currentAppname = appname;\n let currentHolon = sourceHolon;\n let currentLens = lensName;\n let currentDataId = dataId;\n let sourcePath = buildPath(currentAppname, currentHolon, currentLens, currentDataId);\n\n // Read existing source data\n let sourceData = await read(client, sourcePath);\n if (!sourceData) {\n return false;\n }\n\n // If source is a hologram, follow the chain to find the real source\n let depth = 0;\n const maxDepth = 10;\n while (sourceData.hologram === true && sourceData.target && depth < maxDepth) {\n depth++;\n currentAppname = sourceData.target.appname || currentAppname;\n currentHolon = sourceData.target.holonId;\n currentLens = sourceData.target.lensName || currentLens;\n currentDataId = sourceData.target.dataId || currentDataId;\n sourcePath = buildPath(currentAppname, currentHolon, currentLens, currentDataId);\n\n sourceData = await read(client, sourcePath);\n if (!sourceData) {\n return false;\n }\n }\n\n if (!sourceData._meta || !Array.isArray(sourceData._meta.activeHolograms)) {\n return false;\n }\n\n const initialLength = sourceData._meta.activeHolograms.length;\n sourceData._meta.activeHolograms = sourceData._meta.activeHolograms.filter(\n h => h.targetHolon !== targetHolon\n );\n\n // Only write if something changed\n if (sourceData._meta.activeHolograms.length < initialLength) {\n return write(client, sourcePath, sourceData);\n }\n\n return false;\n}\n\n/**\n * Refresh lastUpdated timestamps on all activeHolograms in source data\n * Also updates the hologram objects in target holons\n * Called when source data is updated\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} sourceHolon - Source holon ID\n * @param {string} lensName - Lens name\n * @param {string} dataId - Data ID that was updated\n * @param {Object} sourceData - The source data object (already read, to avoid re-reading)\n * @returns {Promise<Object>} Result with refreshed count\n */\nexport async function refreshActiveHolograms(client, appname, sourceHolon, lensName, dataId, sourceData = null) {\n // Read source data if not provided\n if (!sourceData) {\n const sourcePath = buildPath(appname, sourceHolon, lensName, dataId);\n sourceData = await read(client, sourcePath);\n }\n\n if (!sourceData || !sourceData._meta || !Array.isArray(sourceData._meta.activeHolograms)) {\n return { refreshed: 0, holograms: [] };\n }\n\n const now = Date.now();\n const refreshed = [];\n\n // Update timestamps on all activeHolograms\n for (const hologramEntry of sourceData._meta.activeHolograms) {\n hologramEntry.lastUpdated = now;\n\n // Also update the hologram itself in the target holon\n const hologramPath = buildPath(appname, hologramEntry.targetHolon, lensName, dataId);\n const hologram = await read(client, hologramPath);\n\n if (hologram && hologram.hologram === true) {\n // Update hologram's _meta.lastUpdated\n if (!hologram._meta) hologram._meta = {};\n hologram._meta.lastUpdated = now;\n await write(client, hologramPath, hologram);\n refreshed.push({\n targetHolon: hologramEntry.targetHolon,\n dataId,\n timestamp: now\n });\n }\n }\n\n // Source data's activeHolograms timestamps are updated in-place\n // The caller should save sourceData if needed\n\n return { refreshed: refreshed.length, holograms: refreshed, sourceData };\n}\n\n/**\n * Delete a hologram and clean up the activeHolograms list on the original source\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} holonId - Holon where the hologram lives (to be deleted from)\n * @param {string} lensName - Lens name\n * @param {string} dataId - Data ID of the hologram\n * @param {Object} options - Optional settings\n * @param {boolean} options.deleteData - If true, actually delete the data (default: true)\n * @returns {Promise<Object>} Result with deletion info\n */\nexport async function deleteHologram(client, appname, holonId, lensName, dataId, options = {}) {\n const { deleteData = true } = options;\n const path = buildPath(appname, holonId, lensName, dataId);\n const result = {\n success: false,\n wasHologram: false,\n sourceHolon: null,\n activeHologramsUpdated: false,\n error: null\n };\n\n try {\n // Read the hologram to get source information\n const hologram = await read(client, path);\n\n if (!hologram) {\n console.warn(`🗑️ Hologram not found at ${path}`);\n result.error = 'Hologram not found';\n return result;\n }\n\n // Check if it's actually a hologram\n if (hologram.hologram === true && hologram.target) {\n result.wasHologram = true;\n result.sourceHolon = hologram.target.holonId;\n\n console.info(`🗑️ Deleting hologram:`);\n console.info(` Path: ${path}`);\n console.info(` Data ID: ${dataId}`);\n console.info(` From holon: ${holonId}`);\n console.info(` Source holon: ${hologram.target.holonId}`);\n console.info(` Lens: ${lensName}`);\n\n // Remove from source's activeHolograms list\n const removed = await removeActiveHologram(\n client,\n hologram.target.appname || appname,\n hologram.target.holonId,\n hologram.target.lensName || lensName,\n hologram.target.dataId || dataId,\n holonId\n );\n\n result.activeHologramsUpdated = removed;\n\n if (removed) {\n console.info(` ✓ Removed from activeHolograms on source`);\n } else {\n console.warn(` ⚠️ Could not update activeHolograms on source (may already be removed)`);\n }\n } else {\n console.info(`🗑️ Deleting non-hologram data at ${path}`);\n }\n\n // Delete the hologram data if requested\n if (deleteData) {\n // Write null to delete (or use a delete function if available)\n const deleted = await write(client, path, null);\n result.success = deleted;\n\n if (deleted) {\n console.info(` ✓ Hologram deleted successfully`);\n } else {\n console.warn(` ⚠️ Failed to delete hologram data`);\n result.error = 'Failed to delete hologram data';\n }\n } else {\n result.success = true;\n }\n\n return result;\n } catch (error) {\n console.error(`❌ Error deleting hologram at ${path}:`, error);\n result.error = error.message || 'Unknown error';\n return result;\n }\n}\n\n/**\n * Cleanup circular holograms in a holon's lens\n * This detects and removes holograms that create circular references (A→B→A)\n * Useful for cleaning up existing bad data created before circular reference prevention was added\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} holonId - Holon to clean up\n * @param {string} lensName - Lens name to check\n * @param {Object} options - Optional settings\n * @param {boolean} options.dryRun - If true, only report what would be deleted (default: false)\n * @returns {Promise<Object>} Result with cleanup info\n */\nexport async function cleanupCircularHolograms(client, appname, holonId, lensName, options = {}) {\n const { dryRun = false } = options;\n const result = {\n scanned: 0,\n circularFound: 0,\n deleted: 0,\n errors: [],\n details: []\n };\n\n console.info(`🧹 ${dryRun ? '[DRY RUN] ' : ''}Cleaning up circular holograms in ${holonId}/${lensName}...`);\n\n try {\n // Get all data in this lens\n const basePath = buildPath(appname, holonId, lensName);\n // We need to iterate through all items - this requires listing capability\n // For now, we'll rely on the caller to provide a list of IDs to check\n // or we can use a different approach\n\n // Alternative: Read the lens index if it exists\n const lensIndexPath = buildPath(appname, holonId, lensName, '_index');\n const lensIndex = await read(client, lensIndexPath);\n\n if (!lensIndex || !Array.isArray(lensIndex.items)) {\n console.warn(` No index found for ${holonId}/${lensName}, cannot scan for circular references`);\n console.info(` Tip: Provide specific IDs to check using cleanupCircularHologramsByIds()`);\n return result;\n }\n\n for (const itemId of lensIndex.items) {\n result.scanned++;\n const itemPath = buildPath(appname, holonId, lensName, itemId);\n const item = await read(client, itemPath);\n\n if (!item || item.hologram !== true || !item.target) {\n continue; // Not a hologram, skip\n }\n\n // This is a hologram - check if it creates a circular reference\n const sourceHolon = item.target.holonId;\n const sourceDataId = item.target.dataId || itemId;\n const sourceLens = item.target.lensName || lensName;\n\n // Read the source data\n const sourcePath = buildPath(item.target.appname || appname, sourceHolon, sourceLens, sourceDataId);\n const sourceData = await read(client, sourcePath);\n\n if (sourceData && sourceData.hologram === true && sourceData.target) {\n // Source is also a hologram - check if it points back\n if (sourceData.target.holonId === holonId) {\n result.circularFound++;\n const detail = {\n itemId,\n path: itemPath,\n pointsTo: `${sourceHolon}/${sourceLens}/${sourceDataId}`,\n circularWith: `${sourceData.target.holonId}/${sourceData.target.lensName}/${sourceData.target.dataId}`\n };\n result.details.push(detail);\n\n console.warn(` 🔄 Found circular hologram:`);\n console.warn(` ${holonId}/${lensName}/${itemId} → ${sourceHolon}/${sourceLens}/${sourceDataId} → ${holonId}`);\n\n if (!dryRun) {\n // Delete this hologram\n const deleteResult = await deleteHologram(client, appname, holonId, lensName, itemId);\n if (deleteResult.success) {\n result.deleted++;\n console.info(` ✓ Deleted circular hologram`);\n } else {\n result.errors.push({ itemId, error: deleteResult.error });\n console.error(` ❌ Failed to delete: ${deleteResult.error}`);\n }\n }\n }\n }\n }\n\n console.info(`🧹 Cleanup complete for ${holonId}/${lensName}:`);\n console.info(` Scanned: ${result.scanned}`);\n console.info(` Circular found: ${result.circularFound}`);\n console.info(` Deleted: ${result.deleted}`);\n if (result.errors.length > 0) {\n console.warn(` Errors: ${result.errors.length}`);\n }\n\n return result;\n } catch (error) {\n console.error(`❌ Error during cleanup:`, error);\n result.errors.push({ error: error.message });\n return result;\n }\n}\n\n/**\n * Cleanup circular holograms for a specific list of IDs\n * Use this when you don't have an index but know which IDs to check\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} holonId - Holon to clean up\n * @param {string} lensName - Lens name\n * @param {string[]} dataIds - Array of data IDs to check\n * @param {Object} options - Optional settings\n * @param {boolean} options.dryRun - If true, only report what would be deleted\n * @returns {Promise<Object>} Result with cleanup info\n */\nexport async function cleanupCircularHologramsByIds(client, appname, holonId, lensName, dataIds, options = {}) {\n const { dryRun = false } = options;\n const result = {\n scanned: 0,\n circularFound: 0,\n deleted: 0,\n errors: [],\n details: []\n };\n\n console.info(`🧹 ${dryRun ? '[DRY RUN] ' : ''}Cleaning up circular holograms for ${dataIds.length} IDs in ${holonId}/${lensName}...`);\n\n for (const itemId of dataIds) {\n result.scanned++;\n const itemPath = buildPath(appname, holonId, lensName, itemId);\n const item = await read(client, itemPath);\n\n if (!item || item.hologram !== true || !item.target) {\n continue; // Not a hologram, skip\n }\n\n // This is a hologram - check if it creates a circular reference\n const sourceHolon = item.target.holonId;\n const sourceDataId = item.target.dataId || itemId;\n const sourceLens = item.target.lensName || lensName;\n\n // Read the source data\n const sourcePath = buildPath(item.target.appname || appname, sourceHolon, sourceLens, sourceDataId);\n const sourceData = await read(client, sourcePath);\n\n if (sourceData && sourceData.hologram === true && sourceData.target) {\n // Source is also a hologram - check if it points back\n if (sourceData.target.holonId === holonId) {\n result.circularFound++;\n const detail = {\n itemId,\n path: itemPath,\n pointsTo: `${sourceHolon}/${sourceLens}/${sourceDataId}`,\n circularWith: `${sourceData.target.holonId}/${sourceData.target.lensName}/${sourceData.target.dataId}`\n };\n result.details.push(detail);\n\n console.warn(` 🔄 Found circular hologram: ${itemId}`);\n console.warn(` Chain: ${holonId} → ${sourceHolon} → ${holonId}`);\n\n if (!dryRun) {\n // Delete this hologram\n const deleteResult = await deleteHologram(client, appname, holonId, lensName, itemId);\n if (deleteResult.success) {\n result.deleted++;\n console.info(` ✓ Deleted`);\n } else {\n result.errors.push({ itemId, error: deleteResult.error });\n console.error(` ❌ Failed: ${deleteResult.error}`);\n }\n }\n }\n }\n }\n\n console.info(`🧹 Cleanup complete: scanned=${result.scanned}, circular=${result.circularFound}, deleted=${result.deleted}`);\n return result;\n}\n","/**\n * Social Protocol Adapters (Nostr, ActivityPub)\n */\n\n// Import ValidationError from the validator module\nimport { ValidationError } from '../schema/validator.js';\n\n/**\n * Validate Nostr NIP-01 event format\n * @param {Object} event - Nostr event\n * @param {boolean} partial - Allow partial events (missing id, pubkey, sig)\n * @returns {boolean} True if valid\n * @throws {ValidationError} If strict validation fails\n */\nexport function validateNostrEvent(event, partial = true, throwOnError = false) {\n if (!event || typeof event !== 'object') {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid Nostr event format');\n return false;\n }\n\n // Required fields always\n if (typeof event.kind !== 'number') {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid Nostr event format - kind must be a number');\n return false;\n }\n if (!Array.isArray(event.tags)) {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid Nostr event format - tags must be an array');\n return false;\n }\n if (typeof event.content !== 'string') {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid Nostr event format - content must be a string');\n return false;\n }\n if (typeof event.created_at !== 'number') {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid Nostr event format - created_at must be a number');\n return false;\n }\n\n // Optional for partial events (will be added by system)\n if (!partial) {\n if (typeof event.id !== 'string') {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid Nostr event format - id must be a string');\n return false;\n }\n if (typeof event.pubkey !== 'string') {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid Nostr event format - pubkey must be a string');\n return false;\n }\n if (typeof event.sig !== 'string') {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid Nostr event format - sig must be a string');\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Validate ActivityPub object format\n * @param {Object} object - ActivityPub object\n * @param {boolean} throwOnError - Throw ValidationError on failure\n * @param {boolean} requireId - Require id field (default: false, will be auto-generated)\n * @returns {boolean} True if valid\n * @throws {ValidationError} If strict validation fails\n */\nexport function validateActivityPubObject(object, throwOnError = false, requireId = false) {\n if (!object || typeof object !== 'object') {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid ActivityPub object format');\n return false;\n }\n if (!object['@context']) {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid ActivityPub object format - @context is required');\n return false;\n }\n if (typeof object.type !== 'string') {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid ActivityPub object format - type must be a string');\n return false;\n }\n // ID is optional - will be auto-generated if not provided\n if (requireId && typeof object.id !== 'string') {\n if (throwOnError) throw new ValidationError('ValidationError: Invalid ActivityPub object format - id must be a string');\n return false;\n }\n return true;\n}\n\n/**\n * Transform Nostr event to HoloSphere format\n * @param {Object} event - Nostr event\n * @returns {Object} HoloSphere data object\n */\nexport function transformNostrEvent(event) {\n // Generate missing fields if needed\n const id = event.id || `nostr-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n const pubkey = event.pubkey || 'anonymous';\n const sig = event.sig || '';\n\n return {\n id,\n protocol: 'nostr',\n originalFormat: 'nip-01',\n pubkey,\n sig, // Keep original field name for compatibility\n created_at: event.created_at,\n kind: event.kind,\n // Gun doesn't support arrays, so serialize as JSON string\n tags: JSON.stringify(event.tags),\n content: event.content,\n signature: sig, // Also include as signature for clarity\n _meta: {\n timestamp: event.created_at * 1000,\n protocol: 'nostr',\n },\n };\n}\n\n/**\n * Transform ActivityPub object to HoloSphere format\n * @param {Object} object - ActivityPub object\n * @returns {Object} HoloSphere data object\n */\nexport function transformActivityPubObject(object) {\n // Generate ID if not provided\n const id = object.id || `ap-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n return {\n id,\n protocol: 'activitypub',\n type: object.type,\n actor: object.actor,\n published: object.published,\n content: object.content || object.name,\n originalObject: { ...object, id }, // Add generated ID to original object\n _meta: {\n timestamp: object.published ? new Date(object.published).getTime() : Date.now(),\n protocol: 'activitypub',\n },\n };\n}\n\n/**\n * Filter social content by access level\n * @param {Object[]} content - Social content array\n * @param {string} accessLevel - Access level filter\n * @returns {Object[]} Filtered content\n */\nexport function filterByAccessLevel(content, accessLevel) {\n if (!accessLevel) return content;\n\n return content.filter((item) => {\n return !item.accessLevel || item.accessLevel === accessLevel;\n });\n}\n\n/**\n * Filter social content by protocol\n * @param {Object[]} content - Social content array\n * @param {string} protocol - Protocol filter ('nostr' or 'activitypub')\n * @returns {Object[]} Filtered content\n */\nexport function filterByProtocol(content, protocol) {\n if (!protocol || protocol === 'all') return content;\n if (!Array.isArray(content)) return [];\n\n return content.filter((item) => {\n return item.protocol === protocol;\n });\n}\n","/**\n * Real-time Subscription Management\n */\n\nimport { subscribe } from '../storage/nostr-wrapper.js';\nimport { resolveHologram } from '../federation/hologram.js';\n\n/**\n * Create subscription with throttle and filter\n * @param {Object} client - Nostr client instance\n * @param {string} path - Path to subscribe to\n * @param {Function} callback - Callback function\n * @param {Object} options - Subscription options\n * @param {number} options.throttle - Throttle interval in ms\n * @param {Function} options.filter - Filter predicate\n * @param {boolean} options.includeFederated - Include federated data\n * @param {boolean} options.triggerInitial - Trigger callback with initial data (default: false)\n * @param {boolean} options.resolveHolograms - Resolve holograms before callback (default: true)\n * @returns {Object} Subscription object with unsubscribe method\n */\nexport async function createSubscription(client, path, callback, options = {}) {\n const { throttle = 0, filter = null, includeFederated = false, triggerInitial = false, realtimeOnly = true, resolveHolograms = true } = options;\n\n let lastInvoke = 0;\n let timeoutId = null;\n const seenKeys = new Set();\n let isActive = true; // Track active state\n\n const wrappedCallback = async (data, key) => {\n // Check if subscription is still active\n if (!isActive) {\n return;\n }\n\n // Skip if already seen (prevent duplicates)\n // Include timestamp in unique key to allow updates to same item\n const uniqueKey = `${key}-${data?.id || ''}-${data?._meta?.timestamp || Date.now()}`;\n if (seenKeys.has(uniqueKey)) {\n return;\n }\n seenKeys.add(uniqueKey);\n\n // Resolve holograms if enabled and data is a hologram\n let resolvedData = data;\n if (resolveHolograms && data && data.hologram === true) {\n try {\n resolvedData = await resolveHologram(client, data);\n // If resolution failed, skip this item (source data may not exist yet)\n if (!resolvedData) {\n return;\n }\n } catch (err) {\n console.warn('Failed to resolve hologram in subscription:', err);\n return;\n }\n }\n\n // Apply filter (on resolved data)\n if (filter && !filter(resolvedData, key)) {\n return;\n }\n\n // Apply throttle\n const now = Date.now();\n if (throttle > 0) {\n if (now - lastInvoke < throttle) {\n // Clear existing timeout\n if (timeoutId) clearTimeout(timeoutId);\n\n // Schedule callback\n timeoutId = setTimeout(() => {\n lastInvoke = Date.now();\n callback(resolvedData, key);\n }, throttle - (now - lastInvoke));\n return;\n }\n }\n\n lastInvoke = now;\n callback(resolvedData, key);\n };\n\n // Subscribe using Nostr wrapper\n const subscription = await subscribe(client, path, wrappedCallback, { realtimeOnly });\n\n // Return subscription object\n return {\n path,\n unsubscribe: () => {\n isActive = false; // Mark as inactive immediately\n if (timeoutId) clearTimeout(timeoutId);\n if (subscription && subscription.unsubscribe) {\n subscription.unsubscribe();\n }\n seenKeys.clear();\n },\n };\n}\n\n/**\n * Subscription registry for tracking active subscriptions\n */\nexport class SubscriptionRegistry {\n constructor() {\n this.subscriptions = new Map();\n }\n\n /**\n * Register a subscription\n */\n register(id, subscription) {\n this.subscriptions.set(id, subscription);\n }\n\n /**\n * Unregister a subscription\n */\n unregister(id) {\n const subscription = this.subscriptions.get(id);\n if (subscription) {\n subscription.unsubscribe();\n this.subscriptions.delete(id);\n }\n }\n\n /**\n * Unsubscribe all\n */\n unsubscribeAll() {\n for (const [id, subscription] of this.subscriptions) {\n subscription.unsubscribe();\n }\n this.subscriptions.clear();\n }\n\n /**\n * Get active subscription count\n */\n count() {\n return this.subscriptions.size;\n }\n}\n","/**\n * Hierarchical Aggregation (Upcast Operations)\n * FR-025 to FR-027\n */\n\nimport { getParents, isValidH3 } from '../spatial/h3-operations.js';\nimport { createHologram } from '../federation/hologram.js';\nimport { write } from '../storage/nostr-wrapper.js';\n\n/**\n * Upcast data to parent holons in hierarchy\n * @param {Object} client - Nostr client instance\n * @param {string} appname - Application namespace\n * @param {string} holonId - Source holon ID (must be H3)\n * @param {string} lensName - Lens name\n * @param {string} dataId - Data ID\n * @param {Object} options - Upcast options\n * @param {number} options.maxLevel - Maximum levels to propagate (default: 3)\n * @param {string} options.operation - 'summarize', 'aggregate', or 'concatenate'\n * @returns {Promise<boolean>} Success indicator\n */\nexport async function upcast(client, appname, holonId, lensName, dataId, options = {}) {\n const { maxLevel = 3, operation = 'summarize' } = options;\n\n // Validate H3 format\n if (!isValidH3(holonId)) {\n throw new Error('Upcast only supported for geographic (H3) holons, not noospheric holons');\n }\n\n // Get parent holons\n const parents = getParents(holonId);\n const targetParents = parents.slice(0, maxLevel);\n\n if (targetParents.length === 0) {\n return true; // Already at root\n }\n\n // Create holograms in parent holons\n const promises = targetParents.map(async (parentHolon) => {\n return propagateToParent(client, appname, holonId, parentHolon, lensName, dataId, operation);\n });\n\n await Promise.all(promises);\n return true;\n}\n\n/**\n * Propagate data to parent holon\n * @private\n */\nasync function propagateToParent(\n client,\n appname,\n sourceHolon,\n parentHolon,\n lensName,\n dataId,\n operation\n) {\n // Create hologram reference\n const hologram = createHologram(sourceHolon, parentHolon, lensName, dataId, appname);\n\n // Add operation metadata\n hologram._meta.operation = operation;\n hologram._meta.upcast = true;\n\n // Write to parent holon\n const path = `${appname}/${parentHolon}/${lensName}/${dataId}`;\n return write(client, path, hologram);\n}\n\n/**\n * Summarize operation (count aggregation)\n * @param {Object[]} items - Data items\n * @returns {Object} Summary object\n */\nexport function summarize(items) {\n return {\n operation: 'summarize',\n count: items.length,\n summary: true,\n };\n}\n\n/**\n * Aggregate operation (merge objects)\n * @param {Object[]} items - Data items\n * @returns {Object} Aggregated object\n */\nexport function aggregate(items) {\n const result = { operation: 'aggregate' };\n\n for (const item of items) {\n Object.assign(result, item);\n }\n\n return result;\n}\n\n/**\n * Concatenate operation (array merge)\n * @param {Array[]} items - Array items\n * @returns {Array} Concatenated array\n */\nexport function concatenate(items) {\n return {\n operation: 'concatenate',\n items: items.flat(),\n };\n}\n","/**\n * Nostr-based Federation Discovery Protocol\n * Optional feature for automated federation handshake via Nostr events\n */\n\nimport { issueCapability } from '../crypto/secp256k1.js';\nimport { addFederatedPartner, storeInboundCapability } from './registry.js';\n\n// Custom event kinds for federation protocol\nconst FEDERATION_REQUEST_KIND = 30078;\nconst FEDERATION_ACCEPT_KIND = 30079;\nconst FEDERATION_DECLINE_KIND = 30080;\n\n/**\n * Send a federation request to another holosphere via Nostr\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {string} targetPubKey - Target holosphere's public key\n * @param {Object} options - Request options\n * @param {Object} options.scope - Requested scope { holonId, lensName }\n * @param {string[]} options.permissions - Requested permissions\n * @param {string} options.message - Optional message to include\n * @param {number} options.expiresIn - Token expiration in ms (default: 30 days)\n * @returns {Promise<Object>} Published event info\n */\nexport async function sendFederationRequest(client, appname, targetPubKey, options = {}) {\n const {\n scope = { holonId: '*', lensName: '*' },\n permissions = ['read'],\n message = 'Federation request',\n expiresIn = 30 * 24 * 60 * 60 * 1000, // 30 days\n } = options;\n\n // Issue capability we're offering them (access to our data)\n const offeredCapability = await issueCapability(\n permissions,\n scope,\n targetPubKey,\n { issuerKey: client.privateKey, expiresIn }\n );\n\n const event = {\n kind: FEDERATION_REQUEST_KIND,\n created_at: Math.floor(Date.now() / 1000),\n tags: [\n ['d', `federation-request-${targetPubKey.slice(0, 16)}`],\n ['p', targetPubKey],\n ['holosphere', appname],\n ['scope', JSON.stringify(scope)],\n ['permissions', permissions.join(',')],\n ],\n content: JSON.stringify({\n message,\n offeredCapability,\n requestedScope: scope,\n requestedPermissions: permissions,\n }),\n };\n\n const result = await client.publish(event);\n return {\n eventId: result.id || null,\n targetPubKey,\n scope,\n permissions,\n offeredCapability,\n ...result,\n };\n}\n\n/**\n * Subscribe to incoming federation requests\n * @param {Object} client - NostrClient instance\n * @param {Function} callback - Called with each request\n * @returns {Promise<Object>} Subscription with unsubscribe method\n */\nexport async function subscribeFederationRequests(client, callback) {\n const filter = {\n kinds: [FEDERATION_REQUEST_KIND],\n '#p': [client.publicKey],\n };\n\n return client.subscribe(filter, (event) => {\n try {\n const content = JSON.parse(event.content);\n const scopeTag = event.tags.find(t => t[0] === 'scope');\n const permissionsTag = event.tags.find(t => t[0] === 'permissions');\n const holosphereTag = event.tags.find(t => t[0] === 'holosphere');\n\n const request = {\n eventId: event.id,\n requesterPubKey: event.pubkey,\n appname: holosphereTag?.[1],\n scope: scopeTag ? JSON.parse(scopeTag[1]) : { holonId: '*', lensName: '*' },\n permissions: permissionsTag ? permissionsTag[1].split(',') : ['read'],\n message: content.message,\n offeredCapability: content.offeredCapability,\n timestamp: event.created_at,\n };\n\n callback(request);\n } catch (error) {\n console.error('Failed to parse federation request:', error);\n }\n });\n}\n\n/**\n * Accept a federation request\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {Object} request - Request object from subscription\n * @param {Object} options - Acceptance options\n * @param {Object} options.scope - Scope we're granting (defaults to requested)\n * @param {string[]} options.permissions - Permissions we're granting\n * @param {string} options.alias - Alias for this partner\n * @param {number} options.expiresIn - Token expiration in ms\n * @returns {Promise<Object>} Published acceptance event info\n */\nexport async function acceptFederationRequest(client, appname, request, options = {}) {\n const {\n scope = request.scope,\n permissions = request.permissions,\n alias = null,\n expiresIn = 30 * 24 * 60 * 60 * 1000,\n } = options;\n\n // Issue our capability to them\n const grantedCapability = await issueCapability(\n permissions,\n scope,\n request.requesterPubKey,\n { issuerKey: client.privateKey, expiresIn }\n );\n\n // Store their offered capability in our registry\n await addFederatedPartner(client, appname, request.requesterPubKey, {\n alias,\n addedVia: 'nostr_discovery',\n inboundCapabilities: [{\n token: request.offeredCapability,\n scope: request.scope,\n permissions: request.permissions,\n expires: Date.now() + expiresIn,\n }],\n });\n\n // Publish acceptance event\n const event = {\n kind: FEDERATION_ACCEPT_KIND,\n created_at: Math.floor(Date.now() / 1000),\n tags: [\n ['d', `federation-accept-${request.requesterPubKey.slice(0, 16)}`],\n ['p', request.requesterPubKey],\n ['e', request.eventId], // Reference to original request\n ['holosphere', appname],\n ['scope', JSON.stringify(scope)],\n ['permissions', permissions.join(',')],\n ],\n content: JSON.stringify({\n acceptedScope: scope,\n grantedCapability,\n }),\n };\n\n const result = await client.publish(event);\n return {\n eventId: result.id || null,\n requesterPubKey: request.requesterPubKey,\n grantedCapability,\n acceptedScope: scope,\n ...result,\n };\n}\n\n/**\n * Decline a federation request\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {Object} request - Request object from subscription\n * @param {string} reason - Optional decline reason\n * @returns {Promise<Object>} Published decline event info\n */\nexport async function declineFederationRequest(client, appname, request, reason = '') {\n const event = {\n kind: FEDERATION_DECLINE_KIND,\n created_at: Math.floor(Date.now() / 1000),\n tags: [\n ['d', `federation-decline-${request.requesterPubKey.slice(0, 16)}`],\n ['p', request.requesterPubKey],\n ['e', request.eventId],\n ['holosphere', appname],\n ],\n content: JSON.stringify({ reason }),\n };\n\n const result = await client.publish(event);\n return {\n eventId: result.id || null,\n requesterPubKey: request.requesterPubKey,\n reason,\n ...result,\n };\n}\n\n/**\n * Subscribe to federation acceptances (responses to our requests)\n * @param {Object} client - NostrClient instance\n * @param {string} appname - Application namespace\n * @param {Function} callback - Called with each acceptance\n * @returns {Promise<Object>} Subscription with unsubscribe method\n */\nexport async function subscribeFederationAcceptances(client, appname, callback) {\n const filter = {\n kinds: [FEDERATION_ACCEPT_KIND],\n '#p': [client.publicKey],\n };\n\n return client.subscribe(filter, async (event) => {\n try {\n const content = JSON.parse(event.content);\n const scopeTag = event.tags.find(t => t[0] === 'scope');\n const permissionsTag = event.tags.find(t => t[0] === 'permissions');\n\n // Store their granted capability in our registry\n await storeInboundCapability(client, appname, event.pubkey, {\n token: content.grantedCapability,\n scope: scopeTag ? JSON.parse(scopeTag[1]) : content.acceptedScope,\n permissions: permissionsTag ? permissionsTag[1].split(',') : ['read'],\n expires: Date.now() + 30 * 24 * 60 * 60 * 1000, // Assume 30 day expiry\n });\n\n callback({\n accepterPubKey: event.pubkey,\n originalRequestId: event.tags.find(t => t[0] === 'e')?.[1],\n acceptedScope: content.acceptedScope,\n grantedCapability: content.grantedCapability,\n timestamp: event.created_at,\n });\n } catch (error) {\n console.error('Failed to parse federation acceptance:', error);\n }\n });\n}\n\n/**\n * Subscribe to federation declines\n * @param {Object} client - NostrClient instance\n * @param {Function} callback - Called with each decline\n * @returns {Promise<Object>} Subscription with unsubscribe method\n */\nexport async function subscribeFederationDeclines(client, callback) {\n const filter = {\n kinds: [FEDERATION_DECLINE_KIND],\n '#p': [client.publicKey],\n };\n\n return client.subscribe(filter, (event) => {\n try {\n const content = JSON.parse(event.content);\n\n callback({\n declinerPubKey: event.pubkey,\n originalRequestId: event.tags.find(t => t[0] === 'e')?.[1],\n reason: content.reason || '',\n timestamp: event.created_at,\n });\n } catch (error) {\n console.error('Failed to parse federation decline:', error);\n }\n });\n}\n\n/**\n * Query for pending federation requests (requests we've sent that haven't been answered)\n * @param {Object} client - NostrClient instance\n * @param {Object} options - Query options\n * @param {number} options.since - Only get requests since this timestamp (seconds)\n * @returns {Promise<Object[]>} Array of pending requests\n */\nexport async function getPendingFederationRequests(client, options = {}) {\n const since = options.since || Math.floor((Date.now() - 30 * 24 * 60 * 60 * 1000) / 1000);\n\n // Get our requests\n const requestFilter = {\n kinds: [FEDERATION_REQUEST_KIND],\n authors: [client.publicKey],\n since,\n };\n const requests = await client.query(requestFilter);\n\n // Get all acceptances and declines to our requests\n const responseFilter = {\n kinds: [FEDERATION_ACCEPT_KIND, FEDERATION_DECLINE_KIND],\n '#p': [client.publicKey],\n since,\n };\n const responses = await client.query(responseFilter);\n\n // Find request event IDs that have been responded to\n const respondedRequestIds = new Set();\n for (const response of responses) {\n const eTag = response.tags.find(t => t[0] === 'e');\n if (eTag) {\n respondedRequestIds.add(eTag[1]);\n }\n }\n\n // Filter to only pending requests\n const pending = [];\n for (const request of requests) {\n if (!respondedRequestIds.has(request.id)) {\n try {\n const content = JSON.parse(request.content);\n const pTag = request.tags.find(t => t[0] === 'p');\n const scopeTag = request.tags.find(t => t[0] === 'scope');\n const permissionsTag = request.tags.find(t => t[0] === 'permissions');\n\n pending.push({\n eventId: request.id,\n targetPubKey: pTag?.[1],\n scope: scopeTag ? JSON.parse(scopeTag[1]) : { holonId: '*', lensName: '*' },\n permissions: permissionsTag ? permissionsTag[1].split(',') : ['read'],\n message: content.message,\n timestamp: request.created_at,\n });\n } catch (error) {\n console.error('Failed to parse pending request:', error);\n }\n }\n }\n\n return pending;\n}\n","export const default_format = 'RFC3986';\nexport const formatters = {\n RFC1738: (v) => String(v).replace(/%20/g, '+'),\n RFC3986: (v) => String(v),\n};\nexport const RFC1738 = 'RFC1738';\nexport const RFC3986 = 'RFC3986';\n//# sourceMappingURL=formats.mjs.map","import { RFC1738 } from \"./formats.mjs\";\nconst has = Object.prototype.hasOwnProperty;\nconst is_array = Array.isArray;\nconst hex_table = (() => {\n const array = [];\n for (let i = 0; i < 256; ++i) {\n array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());\n }\n return array;\n})();\nfunction compact_queue(queue) {\n while (queue.length > 1) {\n const item = queue.pop();\n if (!item)\n continue;\n const obj = item.obj[item.prop];\n if (is_array(obj)) {\n const compacted = [];\n for (let j = 0; j < obj.length; ++j) {\n if (typeof obj[j] !== 'undefined') {\n compacted.push(obj[j]);\n }\n }\n // @ts-ignore\n item.obj[item.prop] = compacted;\n }\n }\n}\nfunction array_to_object(source, options) {\n const obj = options && options.plainObjects ? Object.create(null) : {};\n for (let i = 0; i < source.length; ++i) {\n if (typeof source[i] !== 'undefined') {\n obj[i] = source[i];\n }\n }\n return obj;\n}\nexport function merge(target, source, options = {}) {\n if (!source) {\n return target;\n }\n if (typeof source !== 'object') {\n if (is_array(target)) {\n target.push(source);\n }\n else if (target && typeof target === 'object') {\n if ((options && (options.plainObjects || options.allowPrototypes)) ||\n !has.call(Object.prototype, source)) {\n target[source] = true;\n }\n }\n else {\n return [target, source];\n }\n return target;\n }\n if (!target || typeof target !== 'object') {\n return [target].concat(source);\n }\n let mergeTarget = target;\n if (is_array(target) && !is_array(source)) {\n // @ts-ignore\n mergeTarget = array_to_object(target, options);\n }\n if (is_array(target) && is_array(source)) {\n source.forEach(function (item, i) {\n if (has.call(target, i)) {\n const targetItem = target[i];\n if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {\n target[i] = merge(targetItem, item, options);\n }\n else {\n target.push(item);\n }\n }\n else {\n target[i] = item;\n }\n });\n return target;\n }\n return Object.keys(source).reduce(function (acc, key) {\n const value = source[key];\n if (has.call(acc, key)) {\n acc[key] = merge(acc[key], value, options);\n }\n else {\n acc[key] = value;\n }\n return acc;\n }, mergeTarget);\n}\nexport function assign_single_source(target, source) {\n return Object.keys(source).reduce(function (acc, key) {\n acc[key] = source[key];\n return acc;\n }, target);\n}\nexport function decode(str, _, charset) {\n const strWithoutPlus = str.replace(/\\+/g, ' ');\n if (charset === 'iso-8859-1') {\n // unescape never throws, no try...catch needed:\n return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);\n }\n // utf-8\n try {\n return decodeURIComponent(strWithoutPlus);\n }\n catch (e) {\n return strWithoutPlus;\n }\n}\nconst limit = 1024;\nexport const encode = (str, _defaultEncoder, charset, _kind, format) => {\n // This code was originally written by Brian White for the io.js core querystring library.\n // It has been adapted here for stricter adherence to RFC 3986\n if (str.length === 0) {\n return str;\n }\n let string = str;\n if (typeof str === 'symbol') {\n string = Symbol.prototype.toString.call(str);\n }\n else if (typeof str !== 'string') {\n string = String(str);\n }\n if (charset === 'iso-8859-1') {\n return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {\n return '%26%23' + parseInt($0.slice(2), 16) + '%3B';\n });\n }\n let out = '';\n for (let j = 0; j < string.length; j += limit) {\n const segment = string.length >= limit ? string.slice(j, j + limit) : string;\n const arr = [];\n for (let i = 0; i < segment.length; ++i) {\n let c = segment.charCodeAt(i);\n if (c === 0x2d || // -\n c === 0x2e || // .\n c === 0x5f || // _\n c === 0x7e || // ~\n (c >= 0x30 && c <= 0x39) || // 0-9\n (c >= 0x41 && c <= 0x5a) || // a-z\n (c >= 0x61 && c <= 0x7a) || // A-Z\n (format === RFC1738 && (c === 0x28 || c === 0x29)) // ( )\n ) {\n arr[arr.length] = segment.charAt(i);\n continue;\n }\n if (c < 0x80) {\n arr[arr.length] = hex_table[c];\n continue;\n }\n if (c < 0x800) {\n arr[arr.length] = hex_table[0xc0 | (c >> 6)] + hex_table[0x80 | (c & 0x3f)];\n continue;\n }\n if (c < 0xd800 || c >= 0xe000) {\n arr[arr.length] =\n hex_table[0xe0 | (c >> 12)] + hex_table[0x80 | ((c >> 6) & 0x3f)] + hex_table[0x80 | (c & 0x3f)];\n continue;\n }\n i += 1;\n c = 0x10000 + (((c & 0x3ff) << 10) | (segment.charCodeAt(i) & 0x3ff));\n arr[arr.length] =\n hex_table[0xf0 | (c >> 18)] +\n hex_table[0x80 | ((c >> 12) & 0x3f)] +\n hex_table[0x80 | ((c >> 6) & 0x3f)] +\n hex_table[0x80 | (c & 0x3f)];\n }\n out += arr.join('');\n }\n return out;\n};\nexport function compact(value) {\n const queue = [{ obj: { o: value }, prop: 'o' }];\n const refs = [];\n for (let i = 0; i < queue.length; ++i) {\n const item = queue[i];\n // @ts-ignore\n const obj = item.obj[item.prop];\n const keys = Object.keys(obj);\n for (let j = 0; j < keys.length; ++j) {\n const key = keys[j];\n const val = obj[key];\n if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {\n queue.push({ obj: obj, prop: key });\n refs.push(val);\n }\n }\n }\n compact_queue(queue);\n return value;\n}\nexport function is_regexp(obj) {\n return Object.prototype.toString.call(obj) === '[object RegExp]';\n}\nexport function is_buffer(obj) {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));\n}\nexport function combine(a, b) {\n return [].concat(a, b);\n}\nexport function maybe_map(val, fn) {\n if (is_array(val)) {\n const mapped = [];\n for (let i = 0; i < val.length; i += 1) {\n mapped.push(fn(val[i]));\n }\n return mapped;\n }\n return fn(val);\n}\n//# sourceMappingURL=utils.mjs.map","import { encode, is_buffer, maybe_map } from \"./utils.mjs\";\nimport { default_format, formatters } from \"./formats.mjs\";\nconst has = Object.prototype.hasOwnProperty;\nconst array_prefix_generators = {\n brackets(prefix) {\n return String(prefix) + '[]';\n },\n comma: 'comma',\n indices(prefix, key) {\n return String(prefix) + '[' + key + ']';\n },\n repeat(prefix) {\n return String(prefix);\n },\n};\nconst is_array = Array.isArray;\nconst push = Array.prototype.push;\nconst push_to_array = function (arr, value_or_array) {\n push.apply(arr, is_array(value_or_array) ? value_or_array : [value_or_array]);\n};\nconst to_ISO = Date.prototype.toISOString;\nconst defaults = {\n addQueryPrefix: false,\n allowDots: false,\n allowEmptyArrays: false,\n arrayFormat: 'indices',\n charset: 'utf-8',\n charsetSentinel: false,\n delimiter: '&',\n encode: true,\n encodeDotInKeys: false,\n encoder: encode,\n encodeValuesOnly: false,\n format: default_format,\n formatter: formatters[default_format],\n /** @deprecated */\n indices: false,\n serializeDate(date) {\n return to_ISO.call(date);\n },\n skipNulls: false,\n strictNullHandling: false,\n};\nfunction is_non_nullish_primitive(v) {\n return (typeof v === 'string' ||\n typeof v === 'number' ||\n typeof v === 'boolean' ||\n typeof v === 'symbol' ||\n typeof v === 'bigint');\n}\nconst sentinel = {};\nfunction inner_stringify(object, prefix, generateArrayPrefix, commaRoundTrip, allowEmptyArrays, strictNullHandling, skipNulls, encodeDotInKeys, encoder, filter, sort, allowDots, serializeDate, format, formatter, encodeValuesOnly, charset, sideChannel) {\n let obj = object;\n let tmp_sc = sideChannel;\n let step = 0;\n let find_flag = false;\n while ((tmp_sc = tmp_sc.get(sentinel)) !== void undefined && !find_flag) {\n // Where object last appeared in the ref tree\n const pos = tmp_sc.get(object);\n step += 1;\n if (typeof pos !== 'undefined') {\n if (pos === step) {\n throw new RangeError('Cyclic object value');\n }\n else {\n find_flag = true; // Break while\n }\n }\n if (typeof tmp_sc.get(sentinel) === 'undefined') {\n step = 0;\n }\n }\n if (typeof filter === 'function') {\n obj = filter(prefix, obj);\n }\n else if (obj instanceof Date) {\n obj = serializeDate?.(obj);\n }\n else if (generateArrayPrefix === 'comma' && is_array(obj)) {\n obj = maybe_map(obj, function (value) {\n if (value instanceof Date) {\n return serializeDate?.(value);\n }\n return value;\n });\n }\n if (obj === null) {\n if (strictNullHandling) {\n return encoder && !encodeValuesOnly ?\n // @ts-expect-error\n encoder(prefix, defaults.encoder, charset, 'key', format)\n : prefix;\n }\n obj = '';\n }\n if (is_non_nullish_primitive(obj) || is_buffer(obj)) {\n if (encoder) {\n const key_value = encodeValuesOnly ? prefix\n // @ts-expect-error\n : encoder(prefix, defaults.encoder, charset, 'key', format);\n return [\n formatter?.(key_value) +\n '=' +\n // @ts-expect-error\n formatter?.(encoder(obj, defaults.encoder, charset, 'value', format)),\n ];\n }\n return [formatter?.(prefix) + '=' + formatter?.(String(obj))];\n }\n const values = [];\n if (typeof obj === 'undefined') {\n return values;\n }\n let obj_keys;\n if (generateArrayPrefix === 'comma' && is_array(obj)) {\n // we need to join elements in\n if (encodeValuesOnly && encoder) {\n // @ts-expect-error values only\n obj = maybe_map(obj, encoder);\n }\n obj_keys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }];\n }\n else if (is_array(filter)) {\n obj_keys = filter;\n }\n else {\n const keys = Object.keys(obj);\n obj_keys = sort ? keys.sort(sort) : keys;\n }\n const encoded_prefix = encodeDotInKeys ? String(prefix).replace(/\\./g, '%2E') : String(prefix);\n const adjusted_prefix = commaRoundTrip && is_array(obj) && obj.length === 1 ? encoded_prefix + '[]' : encoded_prefix;\n if (allowEmptyArrays && is_array(obj) && obj.length === 0) {\n return adjusted_prefix + '[]';\n }\n for (let j = 0; j < obj_keys.length; ++j) {\n const key = obj_keys[j];\n const value = \n // @ts-ignore\n typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key];\n if (skipNulls && value === null) {\n continue;\n }\n // @ts-ignore\n const encoded_key = allowDots && encodeDotInKeys ? key.replace(/\\./g, '%2E') : key;\n const key_prefix = is_array(obj) ?\n typeof generateArrayPrefix === 'function' ?\n generateArrayPrefix(adjusted_prefix, encoded_key)\n : adjusted_prefix\n : adjusted_prefix + (allowDots ? '.' + encoded_key : '[' + encoded_key + ']');\n sideChannel.set(object, step);\n const valueSideChannel = new WeakMap();\n valueSideChannel.set(sentinel, sideChannel);\n push_to_array(values, inner_stringify(value, key_prefix, generateArrayPrefix, commaRoundTrip, allowEmptyArrays, strictNullHandling, skipNulls, encodeDotInKeys, \n // @ts-ignore\n generateArrayPrefix === 'comma' && encodeValuesOnly && is_array(obj) ? null : encoder, filter, sort, allowDots, serializeDate, format, formatter, encodeValuesOnly, charset, valueSideChannel));\n }\n return values;\n}\nfunction normalize_stringify_options(opts = defaults) {\n if (typeof opts.allowEmptyArrays !== 'undefined' && typeof opts.allowEmptyArrays !== 'boolean') {\n throw new TypeError('`allowEmptyArrays` option can only be `true` or `false`, when provided');\n }\n if (typeof opts.encodeDotInKeys !== 'undefined' && typeof opts.encodeDotInKeys !== 'boolean') {\n throw new TypeError('`encodeDotInKeys` option can only be `true` or `false`, when provided');\n }\n if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') {\n throw new TypeError('Encoder has to be a function.');\n }\n const charset = opts.charset || defaults.charset;\n if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {\n throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');\n }\n let format = default_format;\n if (typeof opts.format !== 'undefined') {\n if (!has.call(formatters, opts.format)) {\n throw new TypeError('Unknown format option provided.');\n }\n format = opts.format;\n }\n const formatter = formatters[format];\n let filter = defaults.filter;\n if (typeof opts.filter === 'function' || is_array(opts.filter)) {\n filter = opts.filter;\n }\n let arrayFormat;\n if (opts.arrayFormat && opts.arrayFormat in array_prefix_generators) {\n arrayFormat = opts.arrayFormat;\n }\n else if ('indices' in opts) {\n arrayFormat = opts.indices ? 'indices' : 'repeat';\n }\n else {\n arrayFormat = defaults.arrayFormat;\n }\n if ('commaRoundTrip' in opts && typeof opts.commaRoundTrip !== 'boolean') {\n throw new TypeError('`commaRoundTrip` must be a boolean, or absent');\n }\n const allowDots = typeof opts.allowDots === 'undefined' ?\n !!opts.encodeDotInKeys === true ?\n true\n : defaults.allowDots\n : !!opts.allowDots;\n return {\n addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix,\n // @ts-ignore\n allowDots: allowDots,\n allowEmptyArrays: typeof opts.allowEmptyArrays === 'boolean' ? !!opts.allowEmptyArrays : defaults.allowEmptyArrays,\n arrayFormat: arrayFormat,\n charset: charset,\n charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,\n commaRoundTrip: !!opts.commaRoundTrip,\n delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter,\n encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode,\n encodeDotInKeys: typeof opts.encodeDotInKeys === 'boolean' ? opts.encodeDotInKeys : defaults.encodeDotInKeys,\n encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder,\n encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly,\n filter: filter,\n format: format,\n formatter: formatter,\n serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate,\n skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls,\n // @ts-ignore\n sort: typeof opts.sort === 'function' ? opts.sort : null,\n strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling,\n };\n}\nexport function stringify(object, opts = {}) {\n let obj = object;\n const options = normalize_stringify_options(opts);\n let obj_keys;\n let filter;\n if (typeof options.filter === 'function') {\n filter = options.filter;\n obj = filter('', obj);\n }\n else if (is_array(options.filter)) {\n filter = options.filter;\n obj_keys = filter;\n }\n const keys = [];\n if (typeof obj !== 'object' || obj === null) {\n return '';\n }\n const generateArrayPrefix = array_prefix_generators[options.arrayFormat];\n const commaRoundTrip = generateArrayPrefix === 'comma' && options.commaRoundTrip;\n if (!obj_keys) {\n obj_keys = Object.keys(obj);\n }\n if (options.sort) {\n obj_keys.sort(options.sort);\n }\n const sideChannel = new WeakMap();\n for (let i = 0; i < obj_keys.length; ++i) {\n const key = obj_keys[i];\n if (options.skipNulls && obj[key] === null) {\n continue;\n }\n push_to_array(keys, inner_stringify(obj[key], key, \n // @ts-expect-error\n generateArrayPrefix, commaRoundTrip, options.allowEmptyArrays, options.strictNullHandling, options.skipNulls, options.encodeDotInKeys, options.encode ? options.encoder : null, options.filter, options.sort, options.allowDots, options.serializeDate, options.format, options.formatter, options.encodeValuesOnly, options.charset, sideChannel));\n }\n const joined = keys.join(options.delimiter);\n let prefix = options.addQueryPrefix === true ? '?' : '';\n if (options.charsetSentinel) {\n if (options.charset === 'iso-8859-1') {\n // encodeURIComponent('✓'), the \"numeric entity\" representation of a checkmark\n prefix += 'utf8=%26%2310003%3B&';\n }\n else {\n // encodeURIComponent('✓')\n prefix += 'utf8=%E2%9C%93&';\n }\n }\n return joined.length > 0 ? prefix + joined : '';\n}\n//# sourceMappingURL=stringify.mjs.map","export const VERSION = '4.104.0'; // x-release-please-version\n//# sourceMappingURL=version.mjs.map","export let auto = false;\nexport let kind = undefined;\nexport let fetch = undefined;\nexport let Request = undefined;\nexport let Response = undefined;\nexport let Headers = undefined;\nexport let FormData = undefined;\nexport let Blob = undefined;\nexport let File = undefined;\nexport let ReadableStream = undefined;\nexport let getMultipartRequestOptions = undefined;\nexport let getDefaultAgent = undefined;\nexport let fileFromPath = undefined;\nexport let isFsReadStream = undefined;\nexport function setShims(shims, options = { auto: false }) {\n if (auto) {\n throw new Error(`you must \\`import 'openai/shims/${shims.kind}'\\` before importing anything else from openai`);\n }\n if (kind) {\n throw new Error(`can't \\`import 'openai/shims/${shims.kind}'\\` after \\`import 'openai/shims/${kind}'\\``);\n }\n auto = options.auto;\n kind = shims.kind;\n fetch = shims.fetch;\n Request = shims.Request;\n Response = shims.Response;\n Headers = shims.Headers;\n FormData = shims.FormData;\n Blob = shims.Blob;\n File = shims.File;\n ReadableStream = shims.ReadableStream;\n getMultipartRequestOptions = shims.getMultipartRequestOptions;\n getDefaultAgent = shims.getDefaultAgent;\n fileFromPath = shims.fileFromPath;\n isFsReadStream = shims.isFsReadStream;\n}\n//# sourceMappingURL=registry.mjs.map","/**\n * Disclaimer: modules in _shims aren't intended to be imported by SDK users.\n */\nexport class MultipartBody {\n constructor(body) {\n this.body = body;\n }\n get [Symbol.toStringTag]() {\n return 'MultipartBody';\n }\n}\n//# sourceMappingURL=MultipartBody.mjs.map","import { MultipartBody } from \"./MultipartBody.mjs\";\nexport function getRuntime({ manuallyImported } = {}) {\n const recommendation = manuallyImported ?\n `You may need to use polyfills`\n : `Add one of these imports before your first \\`import … from 'openai'\\`:\n- \\`import 'openai/shims/node'\\` (if you're running on Node)\n- \\`import 'openai/shims/web'\\` (otherwise)\n`;\n let _fetch, _Request, _Response, _Headers;\n try {\n // @ts-ignore\n _fetch = fetch;\n // @ts-ignore\n _Request = Request;\n // @ts-ignore\n _Response = Response;\n // @ts-ignore\n _Headers = Headers;\n }\n catch (error) {\n throw new Error(`this environment is missing the following Web Fetch API type: ${error.message}. ${recommendation}`);\n }\n return {\n kind: 'web',\n fetch: _fetch,\n Request: _Request,\n Response: _Response,\n Headers: _Headers,\n FormData: \n // @ts-ignore\n typeof FormData !== 'undefined' ? FormData : (class FormData {\n // @ts-ignore\n constructor() {\n throw new Error(`file uploads aren't supported in this environment yet as 'FormData' is undefined. ${recommendation}`);\n }\n }),\n Blob: typeof Blob !== 'undefined' ? Blob : (class Blob {\n constructor() {\n throw new Error(`file uploads aren't supported in this environment yet as 'Blob' is undefined. ${recommendation}`);\n }\n }),\n File: \n // @ts-ignore\n typeof File !== 'undefined' ? File : (class File {\n // @ts-ignore\n constructor() {\n throw new Error(`file uploads aren't supported in this environment yet as 'File' is undefined. ${recommendation}`);\n }\n }),\n ReadableStream: \n // @ts-ignore\n typeof ReadableStream !== 'undefined' ? ReadableStream : (class ReadableStream {\n // @ts-ignore\n constructor() {\n throw new Error(`streaming isn't supported in this environment yet as 'ReadableStream' is undefined. ${recommendation}`);\n }\n }),\n getMultipartRequestOptions: async (\n // @ts-ignore\n form, opts) => ({\n ...opts,\n body: new MultipartBody(form),\n }),\n getDefaultAgent: (url) => undefined,\n fileFromPath: () => {\n throw new Error('The `fileFromPath` function is only supported in Node. See the README for more details: https://www.github.com/openai/openai-node#file-uploads');\n },\n isFsReadStream: (value) => false,\n };\n}\n//# sourceMappingURL=web-runtime.mjs.map","/**\n * Disclaimer: modules in _shims aren't intended to be imported by SDK users.\n */\nimport * as shims from './registry.mjs';\nimport * as auto from 'openai/_shims/auto/runtime';\nexport const init = () => {\n if (!shims.kind) shims.setShims(auto.getRuntime(), { auto: true });\n};\nexport * from './registry.mjs';\n\ninit();\n","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { castToError } from \"./core.mjs\";\nexport class OpenAIError extends Error {\n}\nexport class APIError extends OpenAIError {\n constructor(status, error, message, headers) {\n super(`${APIError.makeMessage(status, error, message)}`);\n this.status = status;\n this.headers = headers;\n this.request_id = headers?.['x-request-id'];\n this.error = error;\n const data = error;\n this.code = data?.['code'];\n this.param = data?.['param'];\n this.type = data?.['type'];\n }\n static makeMessage(status, error, message) {\n const msg = error?.message ?\n typeof error.message === 'string' ?\n error.message\n : JSON.stringify(error.message)\n : error ? JSON.stringify(error)\n : message;\n if (status && msg) {\n return `${status} ${msg}`;\n }\n if (status) {\n return `${status} status code (no body)`;\n }\n if (msg) {\n return msg;\n }\n return '(no status code or body)';\n }\n static generate(status, errorResponse, message, headers) {\n if (!status || !headers) {\n return new APIConnectionError({ message, cause: castToError(errorResponse) });\n }\n const error = errorResponse?.['error'];\n if (status === 400) {\n return new BadRequestError(status, error, message, headers);\n }\n if (status === 401) {\n return new AuthenticationError(status, error, message, headers);\n }\n if (status === 403) {\n return new PermissionDeniedError(status, error, message, headers);\n }\n if (status === 404) {\n return new NotFoundError(status, error, message, headers);\n }\n if (status === 409) {\n return new ConflictError(status, error, message, headers);\n }\n if (status === 422) {\n return new UnprocessableEntityError(status, error, message, headers);\n }\n if (status === 429) {\n return new RateLimitError(status, error, message, headers);\n }\n if (status >= 500) {\n return new InternalServerError(status, error, message, headers);\n }\n return new APIError(status, error, message, headers);\n }\n}\nexport class APIUserAbortError extends APIError {\n constructor({ message } = {}) {\n super(undefined, undefined, message || 'Request was aborted.', undefined);\n }\n}\nexport class APIConnectionError extends APIError {\n constructor({ message, cause }) {\n super(undefined, undefined, message || 'Connection error.', undefined);\n // in some environments the 'cause' property is already declared\n // @ts-ignore\n if (cause)\n this.cause = cause;\n }\n}\nexport class APIConnectionTimeoutError extends APIConnectionError {\n constructor({ message } = {}) {\n super({ message: message ?? 'Request timed out.' });\n }\n}\nexport class BadRequestError extends APIError {\n}\nexport class AuthenticationError extends APIError {\n}\nexport class PermissionDeniedError extends APIError {\n}\nexport class NotFoundError extends APIError {\n}\nexport class ConflictError extends APIError {\n}\nexport class UnprocessableEntityError extends APIError {\n}\nexport class RateLimitError extends APIError {\n}\nexport class InternalServerError extends APIError {\n}\nexport class LengthFinishReasonError extends OpenAIError {\n constructor() {\n super(`Could not parse response content as the length limit was reached`);\n }\n}\nexport class ContentFilterFinishReasonError extends OpenAIError {\n constructor() {\n super(`Could not parse response content as the request was rejected by the content filter`);\n }\n}\n//# sourceMappingURL=error.mjs.map","var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _LineDecoder_carriageReturnIndex;\nimport { OpenAIError } from \"../../error.mjs\";\n/**\n * A re-implementation of httpx's `LineDecoder` in Python that handles incrementally\n * reading lines from text.\n *\n * https://github.com/encode/httpx/blob/920333ea98118e9cf617f246905d7b202510941c/httpx/_decoders.py#L258\n */\nexport class LineDecoder {\n constructor() {\n _LineDecoder_carriageReturnIndex.set(this, void 0);\n this.buffer = new Uint8Array();\n __classPrivateFieldSet(this, _LineDecoder_carriageReturnIndex, null, \"f\");\n }\n decode(chunk) {\n if (chunk == null) {\n return [];\n }\n const binaryChunk = chunk instanceof ArrayBuffer ? new Uint8Array(chunk)\n : typeof chunk === 'string' ? new TextEncoder().encode(chunk)\n : chunk;\n let newData = new Uint8Array(this.buffer.length + binaryChunk.length);\n newData.set(this.buffer);\n newData.set(binaryChunk, this.buffer.length);\n this.buffer = newData;\n const lines = [];\n let patternIndex;\n while ((patternIndex = findNewlineIndex(this.buffer, __classPrivateFieldGet(this, _LineDecoder_carriageReturnIndex, \"f\"))) != null) {\n if (patternIndex.carriage && __classPrivateFieldGet(this, _LineDecoder_carriageReturnIndex, \"f\") == null) {\n // skip until we either get a corresponding `\\n`, a new `\\r` or nothing\n __classPrivateFieldSet(this, _LineDecoder_carriageReturnIndex, patternIndex.index, \"f\");\n continue;\n }\n // we got double \\r or \\rtext\\n\n if (__classPrivateFieldGet(this, _LineDecoder_carriageReturnIndex, \"f\") != null &&\n (patternIndex.index !== __classPrivateFieldGet(this, _LineDecoder_carriageReturnIndex, \"f\") + 1 || patternIndex.carriage)) {\n lines.push(this.decodeText(this.buffer.slice(0, __classPrivateFieldGet(this, _LineDecoder_carriageReturnIndex, \"f\") - 1)));\n this.buffer = this.buffer.slice(__classPrivateFieldGet(this, _LineDecoder_carriageReturnIndex, \"f\"));\n __classPrivateFieldSet(this, _LineDecoder_carriageReturnIndex, null, \"f\");\n continue;\n }\n const endIndex = __classPrivateFieldGet(this, _LineDecoder_carriageReturnIndex, \"f\") !== null ? patternIndex.preceding - 1 : patternIndex.preceding;\n const line = this.decodeText(this.buffer.slice(0, endIndex));\n lines.push(line);\n this.buffer = this.buffer.slice(patternIndex.index);\n __classPrivateFieldSet(this, _LineDecoder_carriageReturnIndex, null, \"f\");\n }\n return lines;\n }\n decodeText(bytes) {\n if (bytes == null)\n return '';\n if (typeof bytes === 'string')\n return bytes;\n // Node:\n if (typeof Buffer !== 'undefined') {\n if (bytes instanceof Buffer) {\n return bytes.toString();\n }\n if (bytes instanceof Uint8Array) {\n return Buffer.from(bytes).toString();\n }\n throw new OpenAIError(`Unexpected: received non-Uint8Array (${bytes.constructor.name}) stream chunk in an environment with a global \"Buffer\" defined, which this library assumes to be Node. Please report this error.`);\n }\n // Browser\n if (typeof TextDecoder !== 'undefined') {\n if (bytes instanceof Uint8Array || bytes instanceof ArrayBuffer) {\n this.textDecoder ?? (this.textDecoder = new TextDecoder('utf8'));\n return this.textDecoder.decode(bytes);\n }\n throw new OpenAIError(`Unexpected: received non-Uint8Array/ArrayBuffer (${bytes.constructor.name}) in a web platform. Please report this error.`);\n }\n throw new OpenAIError(`Unexpected: neither Buffer nor TextDecoder are available as globals. Please report this error.`);\n }\n flush() {\n if (!this.buffer.length) {\n return [];\n }\n return this.decode('\\n');\n }\n}\n_LineDecoder_carriageReturnIndex = new WeakMap();\n// prettier-ignore\nLineDecoder.NEWLINE_CHARS = new Set(['\\n', '\\r']);\nLineDecoder.NEWLINE_REGEXP = /\\r\\n|[\\n\\r]/g;\n/**\n * This function searches the buffer for the end patterns, (\\r or \\n)\n * and returns an object with the index preceding the matched newline and the\n * index after the newline char. `null` is returned if no new line is found.\n *\n * ```ts\n * findNewLineIndex('abc\\ndef') -> { preceding: 2, index: 3 }\n * ```\n */\nfunction findNewlineIndex(buffer, startIndex) {\n const newline = 0x0a; // \\n\n const carriage = 0x0d; // \\r\n for (let i = startIndex ?? 0; i < buffer.length; i++) {\n if (buffer[i] === newline) {\n return { preceding: i, index: i + 1, carriage: false };\n }\n if (buffer[i] === carriage) {\n return { preceding: i, index: i + 1, carriage: true };\n }\n }\n return null;\n}\nexport function findDoubleNewlineIndex(buffer) {\n // This function searches the buffer for the end patterns (\\r\\r, \\n\\n, \\r\\n\\r\\n)\n // and returns the index right after the first occurrence of any pattern,\n // or -1 if none of the patterns are found.\n const newline = 0x0a; // \\n\n const carriage = 0x0d; // \\r\n for (let i = 0; i < buffer.length - 1; i++) {\n if (buffer[i] === newline && buffer[i + 1] === newline) {\n // \\n\\n\n return i + 2;\n }\n if (buffer[i] === carriage && buffer[i + 1] === carriage) {\n // \\r\\r\n return i + 2;\n }\n if (buffer[i] === carriage &&\n buffer[i + 1] === newline &&\n i + 3 < buffer.length &&\n buffer[i + 2] === carriage &&\n buffer[i + 3] === newline) {\n // \\r\\n\\r\\n\n return i + 4;\n }\n }\n return -1;\n}\n//# sourceMappingURL=line.mjs.map","/**\n * Most browsers don't yet have async iterable support for ReadableStream,\n * and Node has a very different way of reading bytes from its \"ReadableStream\".\n *\n * This polyfill was pulled from https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490\n */\nexport function ReadableStreamToAsyncIterable(stream) {\n if (stream[Symbol.asyncIterator])\n return stream;\n const reader = stream.getReader();\n return {\n async next() {\n try {\n const result = await reader.read();\n if (result?.done)\n reader.releaseLock(); // release lock when stream becomes closed\n return result;\n }\n catch (e) {\n reader.releaseLock(); // release lock when stream becomes errored\n throw e;\n }\n },\n async return() {\n const cancelPromise = reader.cancel();\n reader.releaseLock();\n await cancelPromise;\n return { done: true, value: undefined };\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n}\n//# sourceMappingURL=stream-utils.mjs.map","import { ReadableStream } from \"./_shims/index.mjs\";\nimport { OpenAIError } from \"./error.mjs\";\nimport { findDoubleNewlineIndex, LineDecoder } from \"./internal/decoders/line.mjs\";\nimport { ReadableStreamToAsyncIterable } from \"./internal/stream-utils.mjs\";\nimport { createResponseHeaders } from \"./core.mjs\";\nimport { APIError } from \"./error.mjs\";\nexport class Stream {\n constructor(iterator, controller) {\n this.iterator = iterator;\n this.controller = controller;\n }\n static fromSSEResponse(response, controller) {\n let consumed = false;\n async function* iterator() {\n if (consumed) {\n throw new Error('Cannot iterate over a consumed stream, use `.tee()` to split the stream.');\n }\n consumed = true;\n let done = false;\n try {\n for await (const sse of _iterSSEMessages(response, controller)) {\n if (done)\n continue;\n if (sse.data.startsWith('[DONE]')) {\n done = true;\n continue;\n }\n if (sse.event === null ||\n sse.event.startsWith('response.') ||\n sse.event.startsWith('transcript.')) {\n let data;\n try {\n data = JSON.parse(sse.data);\n }\n catch (e) {\n console.error(`Could not parse message into JSON:`, sse.data);\n console.error(`From chunk:`, sse.raw);\n throw e;\n }\n if (data && data.error) {\n throw new APIError(undefined, data.error, undefined, createResponseHeaders(response.headers));\n }\n yield data;\n }\n else {\n let data;\n try {\n data = JSON.parse(sse.data);\n }\n catch (e) {\n console.error(`Could not parse message into JSON:`, sse.data);\n console.error(`From chunk:`, sse.raw);\n throw e;\n }\n // TODO: Is this where the error should be thrown?\n if (sse.event == 'error') {\n throw new APIError(undefined, data.error, data.message, undefined);\n }\n yield { event: sse.event, data: data };\n }\n }\n done = true;\n }\n catch (e) {\n // If the user calls `stream.controller.abort()`, we should exit without throwing.\n if (e instanceof Error && e.name === 'AbortError')\n return;\n throw e;\n }\n finally {\n // If the user `break`s, abort the ongoing request.\n if (!done)\n controller.abort();\n }\n }\n return new Stream(iterator, controller);\n }\n /**\n * Generates a Stream from a newline-separated ReadableStream\n * where each item is a JSON value.\n */\n static fromReadableStream(readableStream, controller) {\n let consumed = false;\n async function* iterLines() {\n const lineDecoder = new LineDecoder();\n const iter = ReadableStreamToAsyncIterable(readableStream);\n for await (const chunk of iter) {\n for (const line of lineDecoder.decode(chunk)) {\n yield line;\n }\n }\n for (const line of lineDecoder.flush()) {\n yield line;\n }\n }\n async function* iterator() {\n if (consumed) {\n throw new Error('Cannot iterate over a consumed stream, use `.tee()` to split the stream.');\n }\n consumed = true;\n let done = false;\n try {\n for await (const line of iterLines()) {\n if (done)\n continue;\n if (line)\n yield JSON.parse(line);\n }\n done = true;\n }\n catch (e) {\n // If the user calls `stream.controller.abort()`, we should exit without throwing.\n if (e instanceof Error && e.name === 'AbortError')\n return;\n throw e;\n }\n finally {\n // If the user `break`s, abort the ongoing request.\n if (!done)\n controller.abort();\n }\n }\n return new Stream(iterator, controller);\n }\n [Symbol.asyncIterator]() {\n return this.iterator();\n }\n /**\n * Splits the stream into two streams which can be\n * independently read from at different speeds.\n */\n tee() {\n const left = [];\n const right = [];\n const iterator = this.iterator();\n const teeIterator = (queue) => {\n return {\n next: () => {\n if (queue.length === 0) {\n const result = iterator.next();\n left.push(result);\n right.push(result);\n }\n return queue.shift();\n },\n };\n };\n return [\n new Stream(() => teeIterator(left), this.controller),\n new Stream(() => teeIterator(right), this.controller),\n ];\n }\n /**\n * Converts this stream to a newline-separated ReadableStream of\n * JSON stringified values in the stream\n * which can be turned back into a Stream with `Stream.fromReadableStream()`.\n */\n toReadableStream() {\n const self = this;\n let iter;\n const encoder = new TextEncoder();\n return new ReadableStream({\n async start() {\n iter = self[Symbol.asyncIterator]();\n },\n async pull(ctrl) {\n try {\n const { value, done } = await iter.next();\n if (done)\n return ctrl.close();\n const bytes = encoder.encode(JSON.stringify(value) + '\\n');\n ctrl.enqueue(bytes);\n }\n catch (err) {\n ctrl.error(err);\n }\n },\n async cancel() {\n await iter.return?.();\n },\n });\n }\n}\nexport async function* _iterSSEMessages(response, controller) {\n if (!response.body) {\n controller.abort();\n throw new OpenAIError(`Attempted to iterate over a response with no body`);\n }\n const sseDecoder = new SSEDecoder();\n const lineDecoder = new LineDecoder();\n const iter = ReadableStreamToAsyncIterable(response.body);\n for await (const sseChunk of iterSSEChunks(iter)) {\n for (const line of lineDecoder.decode(sseChunk)) {\n const sse = sseDecoder.decode(line);\n if (sse)\n yield sse;\n }\n }\n for (const line of lineDecoder.flush()) {\n const sse = sseDecoder.decode(line);\n if (sse)\n yield sse;\n }\n}\n/**\n * Given an async iterable iterator, iterates over it and yields full\n * SSE chunks, i.e. yields when a double new-line is encountered.\n */\nasync function* iterSSEChunks(iterator) {\n let data = new Uint8Array();\n for await (const chunk of iterator) {\n if (chunk == null) {\n continue;\n }\n const binaryChunk = chunk instanceof ArrayBuffer ? new Uint8Array(chunk)\n : typeof chunk === 'string' ? new TextEncoder().encode(chunk)\n : chunk;\n let newData = new Uint8Array(data.length + binaryChunk.length);\n newData.set(data);\n newData.set(binaryChunk, data.length);\n data = newData;\n let patternIndex;\n while ((patternIndex = findDoubleNewlineIndex(data)) !== -1) {\n yield data.slice(0, patternIndex);\n data = data.slice(patternIndex);\n }\n }\n if (data.length > 0) {\n yield data;\n }\n}\nclass SSEDecoder {\n constructor() {\n this.event = null;\n this.data = [];\n this.chunks = [];\n }\n decode(line) {\n if (line.endsWith('\\r')) {\n line = line.substring(0, line.length - 1);\n }\n if (!line) {\n // empty line and we didn't previously encounter any messages\n if (!this.event && !this.data.length)\n return null;\n const sse = {\n event: this.event,\n data: this.data.join('\\n'),\n raw: this.chunks,\n };\n this.event = null;\n this.data = [];\n this.chunks = [];\n return sse;\n }\n this.chunks.push(line);\n if (line.startsWith(':')) {\n return null;\n }\n let [fieldname, _, value] = partition(line, ':');\n if (value.startsWith(' ')) {\n value = value.substring(1);\n }\n if (fieldname === 'event') {\n this.event = value;\n }\n else if (fieldname === 'data') {\n this.data.push(value);\n }\n return null;\n }\n}\nfunction partition(str, delimiter) {\n const index = str.indexOf(delimiter);\n if (index !== -1) {\n return [str.substring(0, index), delimiter, str.substring(index + delimiter.length)];\n }\n return [str, '', ''];\n}\n//# sourceMappingURL=streaming.mjs.map","import { FormData, File, getMultipartRequestOptions, isFsReadStream, } from \"./_shims/index.mjs\";\nexport { fileFromPath } from \"./_shims/index.mjs\";\nexport const isResponseLike = (value) => value != null &&\n typeof value === 'object' &&\n typeof value.url === 'string' &&\n typeof value.blob === 'function';\nexport const isFileLike = (value) => value != null &&\n typeof value === 'object' &&\n typeof value.name === 'string' &&\n typeof value.lastModified === 'number' &&\n isBlobLike(value);\n/**\n * The BlobLike type omits arrayBuffer() because @types/node-fetch@^2.6.4 lacks it; but this check\n * adds the arrayBuffer() method type because it is available and used at runtime\n */\nexport const isBlobLike = (value) => value != null &&\n typeof value === 'object' &&\n typeof value.size === 'number' &&\n typeof value.type === 'string' &&\n typeof value.text === 'function' &&\n typeof value.slice === 'function' &&\n typeof value.arrayBuffer === 'function';\nexport const isUploadable = (value) => {\n return isFileLike(value) || isResponseLike(value) || isFsReadStream(value);\n};\n/**\n * Helper for creating a {@link File} to pass to an SDK upload method from a variety of different data formats\n * @param value the raw content of the file. Can be an {@link Uploadable}, {@link BlobLikePart}, or {@link AsyncIterable} of {@link BlobLikePart}s\n * @param {string=} name the name of the file. If omitted, toFile will try to determine a file name from bits if possible\n * @param {Object=} options additional properties\n * @param {string=} options.type the MIME type of the content\n * @param {number=} options.lastModified the last modified timestamp\n * @returns a {@link File} with the given properties\n */\nexport async function toFile(value, name, options) {\n // If it's a promise, resolve it.\n value = await value;\n // If we've been given a `File` we don't need to do anything\n if (isFileLike(value)) {\n return value;\n }\n if (isResponseLike(value)) {\n const blob = await value.blob();\n name || (name = new URL(value.url).pathname.split(/[\\\\/]/).pop() ?? 'unknown_file');\n // we need to convert the `Blob` into an array buffer because the `Blob` class\n // that `node-fetch` defines is incompatible with the web standard which results\n // in `new File` interpreting it as a string instead of binary data.\n const data = isBlobLike(blob) ? [(await blob.arrayBuffer())] : [blob];\n return new File(data, name, options);\n }\n const bits = await getBytes(value);\n name || (name = getName(value) ?? 'unknown_file');\n if (!options?.type) {\n const type = bits[0]?.type;\n if (typeof type === 'string') {\n options = { ...options, type };\n }\n }\n return new File(bits, name, options);\n}\nasync function getBytes(value) {\n let parts = [];\n if (typeof value === 'string' ||\n ArrayBuffer.isView(value) || // includes Uint8Array, Buffer, etc.\n value instanceof ArrayBuffer) {\n parts.push(value);\n }\n else if (isBlobLike(value)) {\n parts.push(await value.arrayBuffer());\n }\n else if (isAsyncIterableIterator(value) // includes Readable, ReadableStream, etc.\n ) {\n for await (const chunk of value) {\n parts.push(chunk); // TODO, consider validating?\n }\n }\n else {\n throw new Error(`Unexpected data type: ${typeof value}; constructor: ${value?.constructor\n ?.name}; props: ${propsForError(value)}`);\n }\n return parts;\n}\nfunction propsForError(value) {\n const props = Object.getOwnPropertyNames(value);\n return `[${props.map((p) => `\"${p}\"`).join(', ')}]`;\n}\nfunction getName(value) {\n return (getStringFromMaybeBuffer(value.name) ||\n getStringFromMaybeBuffer(value.filename) ||\n // For fs.ReadStream\n getStringFromMaybeBuffer(value.path)?.split(/[\\\\/]/).pop());\n}\nconst getStringFromMaybeBuffer = (x) => {\n if (typeof x === 'string')\n return x;\n if (typeof Buffer !== 'undefined' && x instanceof Buffer)\n return String(x);\n return undefined;\n};\nconst isAsyncIterableIterator = (value) => value != null && typeof value === 'object' && typeof value[Symbol.asyncIterator] === 'function';\nexport const isMultipartBody = (body) => body && typeof body === 'object' && body.body && body[Symbol.toStringTag] === 'MultipartBody';\n/**\n * Returns a multipart/form-data request if any part of the given request body contains a File / Blob value.\n * Otherwise returns the request as is.\n */\nexport const maybeMultipartFormRequestOptions = async (opts) => {\n if (!hasUploadableValue(opts.body))\n return opts;\n const form = await createForm(opts.body);\n return getMultipartRequestOptions(form, opts);\n};\nexport const multipartFormRequestOptions = async (opts) => {\n const form = await createForm(opts.body);\n return getMultipartRequestOptions(form, opts);\n};\nexport const createForm = async (body) => {\n const form = new FormData();\n await Promise.all(Object.entries(body || {}).map(([key, value]) => addFormValue(form, key, value)));\n return form;\n};\nconst hasUploadableValue = (value) => {\n if (isUploadable(value))\n return true;\n if (Array.isArray(value))\n return value.some(hasUploadableValue);\n if (value && typeof value === 'object') {\n for (const k in value) {\n if (hasUploadableValue(value[k]))\n return true;\n }\n }\n return false;\n};\nconst addFormValue = async (form, key, value) => {\n if (value === undefined)\n return;\n if (value == null) {\n throw new TypeError(`Received null for \"${key}\"; to pass null in FormData, you must use the string 'null'`);\n }\n // TODO: make nested formats configurable\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n form.append(key, String(value));\n }\n else if (isUploadable(value)) {\n const file = await toFile(value);\n form.append(key, file);\n }\n else if (Array.isArray(value)) {\n await Promise.all(value.map((entry) => addFormValue(form, key + '[]', entry)));\n }\n else if (typeof value === 'object') {\n await Promise.all(Object.entries(value).map(([name, prop]) => addFormValue(form, `${key}[${name}]`, prop)));\n }\n else {\n throw new TypeError(`Invalid value given to form, expected a string, number, boolean, object, Array, File or Blob but got ${value} instead`);\n }\n};\n//# sourceMappingURL=uploads.mjs.map","var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _AbstractPage_client;\nimport { VERSION } from \"./version.mjs\";\nimport { Stream } from \"./streaming.mjs\";\nimport { OpenAIError, APIError, APIConnectionError, APIConnectionTimeoutError, APIUserAbortError, } from \"./error.mjs\";\nimport { kind as shimsKind, getDefaultAgent, fetch, init, } from \"./_shims/index.mjs\";\n// try running side effects outside of _shims/index to workaround https://github.com/vercel/next.js/issues/76881\ninit();\nimport { isBlobLike, isMultipartBody } from \"./uploads.mjs\";\nexport { maybeMultipartFormRequestOptions, multipartFormRequestOptions, createForm, } from \"./uploads.mjs\";\nasync function defaultParseResponse(props) {\n const { response } = props;\n if (props.options.stream) {\n debug('response', response.status, response.url, response.headers, response.body);\n // Note: there is an invariant here that isn't represented in the type system\n // that if you set `stream: true` the response type must also be `Stream<T>`\n if (props.options.__streamClass) {\n return props.options.__streamClass.fromSSEResponse(response, props.controller);\n }\n return Stream.fromSSEResponse(response, props.controller);\n }\n // fetch refuses to read the body when the status code is 204.\n if (response.status === 204) {\n return null;\n }\n if (props.options.__binaryResponse) {\n return response;\n }\n const contentType = response.headers.get('content-type');\n const mediaType = contentType?.split(';')[0]?.trim();\n const isJSON = mediaType?.includes('application/json') || mediaType?.endsWith('+json');\n if (isJSON) {\n const json = await response.json();\n debug('response', response.status, response.url, response.headers, json);\n return _addRequestID(json, response);\n }\n const text = await response.text();\n debug('response', response.status, response.url, response.headers, text);\n // TODO handle blob, arraybuffer, other content types, etc.\n return text;\n}\nfunction _addRequestID(value, response) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return value;\n }\n return Object.defineProperty(value, '_request_id', {\n value: response.headers.get('x-request-id'),\n enumerable: false,\n });\n}\n/**\n * A subclass of `Promise` providing additional helper methods\n * for interacting with the SDK.\n */\nexport class APIPromise extends Promise {\n constructor(responsePromise, parseResponse = defaultParseResponse) {\n super((resolve) => {\n // this is maybe a bit weird but this has to be a no-op to not implicitly\n // parse the response body; instead .then, .catch, .finally are overridden\n // to parse the response\n resolve(null);\n });\n this.responsePromise = responsePromise;\n this.parseResponse = parseResponse;\n }\n _thenUnwrap(transform) {\n return new APIPromise(this.responsePromise, async (props) => _addRequestID(transform(await this.parseResponse(props), props), props.response));\n }\n /**\n * Gets the raw `Response` instance instead of parsing the response\n * data.\n *\n * If you want to parse the response body but still get the `Response`\n * instance, you can use {@link withResponse()}.\n *\n * 👋 Getting the wrong TypeScript type for `Response`?\n * Try setting `\"moduleResolution\": \"NodeNext\"` if you can,\n * or add one of these imports before your first `import … from 'openai'`:\n * - `import 'openai/shims/node'` (if you're running on Node)\n * - `import 'openai/shims/web'` (otherwise)\n */\n asResponse() {\n return this.responsePromise.then((p) => p.response);\n }\n /**\n * Gets the parsed response data, the raw `Response` instance and the ID of the request,\n * returned via the X-Request-ID header which is useful for debugging requests and reporting\n * issues to OpenAI.\n *\n * If you just want to get the raw `Response` instance without parsing it,\n * you can use {@link asResponse()}.\n *\n *\n * 👋 Getting the wrong TypeScript type for `Response`?\n * Try setting `\"moduleResolution\": \"NodeNext\"` if you can,\n * or add one of these imports before your first `import … from 'openai'`:\n * - `import 'openai/shims/node'` (if you're running on Node)\n * - `import 'openai/shims/web'` (otherwise)\n */\n async withResponse() {\n const [data, response] = await Promise.all([this.parse(), this.asResponse()]);\n return { data, response, request_id: response.headers.get('x-request-id') };\n }\n parse() {\n if (!this.parsedPromise) {\n this.parsedPromise = this.responsePromise.then(this.parseResponse);\n }\n return this.parsedPromise;\n }\n then(onfulfilled, onrejected) {\n return this.parse().then(onfulfilled, onrejected);\n }\n catch(onrejected) {\n return this.parse().catch(onrejected);\n }\n finally(onfinally) {\n return this.parse().finally(onfinally);\n }\n}\nexport class APIClient {\n constructor({ baseURL, maxRetries = 2, timeout = 600000, // 10 minutes\n httpAgent, fetch: overriddenFetch, }) {\n this.baseURL = baseURL;\n this.maxRetries = validatePositiveInteger('maxRetries', maxRetries);\n this.timeout = validatePositiveInteger('timeout', timeout);\n this.httpAgent = httpAgent;\n this.fetch = overriddenFetch ?? fetch;\n }\n authHeaders(opts) {\n return {};\n }\n /**\n * Override this to add your own default headers, for example:\n *\n * {\n * ...super.defaultHeaders(),\n * Authorization: 'Bearer 123',\n * }\n */\n defaultHeaders(opts) {\n return {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n 'User-Agent': this.getUserAgent(),\n ...getPlatformHeaders(),\n ...this.authHeaders(opts),\n };\n }\n /**\n * Override this to add your own headers validation:\n */\n validateHeaders(headers, customHeaders) { }\n defaultIdempotencyKey() {\n return `stainless-node-retry-${uuid4()}`;\n }\n get(path, opts) {\n return this.methodRequest('get', path, opts);\n }\n post(path, opts) {\n return this.methodRequest('post', path, opts);\n }\n patch(path, opts) {\n return this.methodRequest('patch', path, opts);\n }\n put(path, opts) {\n return this.methodRequest('put', path, opts);\n }\n delete(path, opts) {\n return this.methodRequest('delete', path, opts);\n }\n methodRequest(method, path, opts) {\n return this.request(Promise.resolve(opts).then(async (opts) => {\n const body = opts && isBlobLike(opts?.body) ? new DataView(await opts.body.arrayBuffer())\n : opts?.body instanceof DataView ? opts.body\n : opts?.body instanceof ArrayBuffer ? new DataView(opts.body)\n : opts && ArrayBuffer.isView(opts?.body) ? new DataView(opts.body.buffer)\n : opts?.body;\n return { method, path, ...opts, body };\n }));\n }\n getAPIList(path, Page, opts) {\n return this.requestAPIList(Page, { method: 'get', path, ...opts });\n }\n calculateContentLength(body) {\n if (typeof body === 'string') {\n if (typeof Buffer !== 'undefined') {\n return Buffer.byteLength(body, 'utf8').toString();\n }\n if (typeof TextEncoder !== 'undefined') {\n const encoder = new TextEncoder();\n const encoded = encoder.encode(body);\n return encoded.length.toString();\n }\n }\n else if (ArrayBuffer.isView(body)) {\n return body.byteLength.toString();\n }\n return null;\n }\n buildRequest(inputOptions, { retryCount = 0 } = {}) {\n const options = { ...inputOptions };\n const { method, path, query, headers: headers = {} } = options;\n const body = ArrayBuffer.isView(options.body) || (options.__binaryRequest && typeof options.body === 'string') ?\n options.body\n : isMultipartBody(options.body) ? options.body.body\n : options.body ? JSON.stringify(options.body, null, 2)\n : null;\n const contentLength = this.calculateContentLength(body);\n const url = this.buildURL(path, query);\n if ('timeout' in options)\n validatePositiveInteger('timeout', options.timeout);\n options.timeout = options.timeout ?? this.timeout;\n const httpAgent = options.httpAgent ?? this.httpAgent ?? getDefaultAgent(url);\n const minAgentTimeout = options.timeout + 1000;\n if (typeof httpAgent?.options?.timeout === 'number' &&\n minAgentTimeout > (httpAgent.options.timeout ?? 0)) {\n // Allow any given request to bump our agent active socket timeout.\n // This may seem strange, but leaking active sockets should be rare and not particularly problematic,\n // and without mutating agent we would need to create more of them.\n // This tradeoff optimizes for performance.\n httpAgent.options.timeout = minAgentTimeout;\n }\n if (this.idempotencyHeader && method !== 'get') {\n if (!inputOptions.idempotencyKey)\n inputOptions.idempotencyKey = this.defaultIdempotencyKey();\n headers[this.idempotencyHeader] = inputOptions.idempotencyKey;\n }\n const reqHeaders = this.buildHeaders({ options, headers, contentLength, retryCount });\n const req = {\n method,\n ...(body && { body: body }),\n headers: reqHeaders,\n ...(httpAgent && { agent: httpAgent }),\n // @ts-ignore node-fetch uses a custom AbortSignal type that is\n // not compatible with standard web types\n signal: options.signal ?? null,\n };\n return { req, url, timeout: options.timeout };\n }\n buildHeaders({ options, headers, contentLength, retryCount, }) {\n const reqHeaders = {};\n if (contentLength) {\n reqHeaders['content-length'] = contentLength;\n }\n const defaultHeaders = this.defaultHeaders(options);\n applyHeadersMut(reqHeaders, defaultHeaders);\n applyHeadersMut(reqHeaders, headers);\n // let builtin fetch set the Content-Type for multipart bodies\n if (isMultipartBody(options.body) && shimsKind !== 'node') {\n delete reqHeaders['content-type'];\n }\n // Don't set theses headers if they were already set or removed through default headers or by the caller.\n // We check `defaultHeaders` and `headers`, which can contain nulls, instead of `reqHeaders` to account\n // for the removal case.\n if (getHeader(defaultHeaders, 'x-stainless-retry-count') === undefined &&\n getHeader(headers, 'x-stainless-retry-count') === undefined) {\n reqHeaders['x-stainless-retry-count'] = String(retryCount);\n }\n if (getHeader(defaultHeaders, 'x-stainless-timeout') === undefined &&\n getHeader(headers, 'x-stainless-timeout') === undefined &&\n options.timeout) {\n reqHeaders['x-stainless-timeout'] = String(Math.trunc(options.timeout / 1000));\n }\n this.validateHeaders(reqHeaders, headers);\n return reqHeaders;\n }\n /**\n * Used as a callback for mutating the given `FinalRequestOptions` object.\n */\n async prepareOptions(options) { }\n /**\n * Used as a callback for mutating the given `RequestInit` object.\n *\n * This is useful for cases where you want to add certain headers based off of\n * the request properties, e.g. `method` or `url`.\n */\n async prepareRequest(request, { url, options }) { }\n parseHeaders(headers) {\n return (!headers ? {}\n : Symbol.iterator in headers ?\n Object.fromEntries(Array.from(headers).map((header) => [...header]))\n : { ...headers });\n }\n makeStatusError(status, error, message, headers) {\n return APIError.generate(status, error, message, headers);\n }\n request(options, remainingRetries = null) {\n return new APIPromise(this.makeRequest(options, remainingRetries));\n }\n async makeRequest(optionsInput, retriesRemaining) {\n const options = await optionsInput;\n const maxRetries = options.maxRetries ?? this.maxRetries;\n if (retriesRemaining == null) {\n retriesRemaining = maxRetries;\n }\n await this.prepareOptions(options);\n const { req, url, timeout } = this.buildRequest(options, { retryCount: maxRetries - retriesRemaining });\n await this.prepareRequest(req, { url, options });\n debug('request', url, options, req.headers);\n if (options.signal?.aborted) {\n throw new APIUserAbortError();\n }\n const controller = new AbortController();\n const response = await this.fetchWithTimeout(url, req, timeout, controller).catch(castToError);\n if (response instanceof Error) {\n if (options.signal?.aborted) {\n throw new APIUserAbortError();\n }\n if (retriesRemaining) {\n return this.retryRequest(options, retriesRemaining);\n }\n if (response.name === 'AbortError') {\n throw new APIConnectionTimeoutError();\n }\n throw new APIConnectionError({ cause: response });\n }\n const responseHeaders = createResponseHeaders(response.headers);\n if (!response.ok) {\n if (retriesRemaining && this.shouldRetry(response)) {\n const retryMessage = `retrying, ${retriesRemaining} attempts remaining`;\n debug(`response (error; ${retryMessage})`, response.status, url, responseHeaders);\n return this.retryRequest(options, retriesRemaining, responseHeaders);\n }\n const errText = await response.text().catch((e) => castToError(e).message);\n const errJSON = safeJSON(errText);\n const errMessage = errJSON ? undefined : errText;\n const retryMessage = retriesRemaining ? `(error; no more retries left)` : `(error; not retryable)`;\n debug(`response (error; ${retryMessage})`, response.status, url, responseHeaders, errMessage);\n const err = this.makeStatusError(response.status, errJSON, errMessage, responseHeaders);\n throw err;\n }\n return { response, options, controller };\n }\n requestAPIList(Page, options) {\n const request = this.makeRequest(options, null);\n return new PagePromise(this, request, Page);\n }\n buildURL(path, query) {\n const url = isAbsoluteURL(path) ?\n new URL(path)\n : new URL(this.baseURL + (this.baseURL.endsWith('/') && path.startsWith('/') ? path.slice(1) : path));\n const defaultQuery = this.defaultQuery();\n if (!isEmptyObj(defaultQuery)) {\n query = { ...defaultQuery, ...query };\n }\n if (typeof query === 'object' && query && !Array.isArray(query)) {\n url.search = this.stringifyQuery(query);\n }\n return url.toString();\n }\n stringifyQuery(query) {\n return Object.entries(query)\n .filter(([_, value]) => typeof value !== 'undefined')\n .map(([key, value]) => {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;\n }\n if (value === null) {\n return `${encodeURIComponent(key)}=`;\n }\n throw new OpenAIError(`Cannot stringify type ${typeof value}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`);\n })\n .join('&');\n }\n async fetchWithTimeout(url, init, ms, controller) {\n const { signal, ...options } = init || {};\n if (signal)\n signal.addEventListener('abort', () => controller.abort());\n const timeout = setTimeout(() => controller.abort(), ms);\n const fetchOptions = {\n signal: controller.signal,\n ...options,\n };\n if (fetchOptions.method) {\n // Custom methods like 'patch' need to be uppercased\n // See https://github.com/nodejs/undici/issues/2294\n fetchOptions.method = fetchOptions.method.toUpperCase();\n }\n return (\n // use undefined this binding; fetch errors if bound to something else in browser/cloudflare\n this.fetch.call(undefined, url, fetchOptions).finally(() => {\n clearTimeout(timeout);\n }));\n }\n shouldRetry(response) {\n // Note this is not a standard header.\n const shouldRetryHeader = response.headers.get('x-should-retry');\n // If the server explicitly says whether or not to retry, obey.\n if (shouldRetryHeader === 'true')\n return true;\n if (shouldRetryHeader === 'false')\n return false;\n // Retry on request timeouts.\n if (response.status === 408)\n return true;\n // Retry on lock timeouts.\n if (response.status === 409)\n return true;\n // Retry on rate limits.\n if (response.status === 429)\n return true;\n // Retry internal errors.\n if (response.status >= 500)\n return true;\n return false;\n }\n async retryRequest(options, retriesRemaining, responseHeaders) {\n let timeoutMillis;\n // Note the `retry-after-ms` header may not be standard, but is a good idea and we'd like proactive support for it.\n const retryAfterMillisHeader = responseHeaders?.['retry-after-ms'];\n if (retryAfterMillisHeader) {\n const timeoutMs = parseFloat(retryAfterMillisHeader);\n if (!Number.isNaN(timeoutMs)) {\n timeoutMillis = timeoutMs;\n }\n }\n // About the Retry-After header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After\n const retryAfterHeader = responseHeaders?.['retry-after'];\n if (retryAfterHeader && !timeoutMillis) {\n const timeoutSeconds = parseFloat(retryAfterHeader);\n if (!Number.isNaN(timeoutSeconds)) {\n timeoutMillis = timeoutSeconds * 1000;\n }\n else {\n timeoutMillis = Date.parse(retryAfterHeader) - Date.now();\n }\n }\n // If the API asks us to wait a certain amount of time (and it's a reasonable amount),\n // just do what it says, but otherwise calculate a default\n if (!(timeoutMillis && 0 <= timeoutMillis && timeoutMillis < 60 * 1000)) {\n const maxRetries = options.maxRetries ?? this.maxRetries;\n timeoutMillis = this.calculateDefaultRetryTimeoutMillis(retriesRemaining, maxRetries);\n }\n await sleep(timeoutMillis);\n return this.makeRequest(options, retriesRemaining - 1);\n }\n calculateDefaultRetryTimeoutMillis(retriesRemaining, maxRetries) {\n const initialRetryDelay = 0.5;\n const maxRetryDelay = 8.0;\n const numRetries = maxRetries - retriesRemaining;\n // Apply exponential backoff, but not more than the max.\n const sleepSeconds = Math.min(initialRetryDelay * Math.pow(2, numRetries), maxRetryDelay);\n // Apply some jitter, take up to at most 25 percent of the retry time.\n const jitter = 1 - Math.random() * 0.25;\n return sleepSeconds * jitter * 1000;\n }\n getUserAgent() {\n return `${this.constructor.name}/JS ${VERSION}`;\n }\n}\nexport class AbstractPage {\n constructor(client, response, body, options) {\n _AbstractPage_client.set(this, void 0);\n __classPrivateFieldSet(this, _AbstractPage_client, client, \"f\");\n this.options = options;\n this.response = response;\n this.body = body;\n }\n hasNextPage() {\n const items = this.getPaginatedItems();\n if (!items.length)\n return false;\n return this.nextPageInfo() != null;\n }\n async getNextPage() {\n const nextInfo = this.nextPageInfo();\n if (!nextInfo) {\n throw new OpenAIError('No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.');\n }\n const nextOptions = { ...this.options };\n if ('params' in nextInfo && typeof nextOptions.query === 'object') {\n nextOptions.query = { ...nextOptions.query, ...nextInfo.params };\n }\n else if ('url' in nextInfo) {\n const params = [...Object.entries(nextOptions.query || {}), ...nextInfo.url.searchParams.entries()];\n for (const [key, value] of params) {\n nextInfo.url.searchParams.set(key, value);\n }\n nextOptions.query = undefined;\n nextOptions.path = nextInfo.url.toString();\n }\n return await __classPrivateFieldGet(this, _AbstractPage_client, \"f\").requestAPIList(this.constructor, nextOptions);\n }\n async *iterPages() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let page = this;\n yield page;\n while (page.hasNextPage()) {\n page = await page.getNextPage();\n yield page;\n }\n }\n async *[(_AbstractPage_client = new WeakMap(), Symbol.asyncIterator)]() {\n for await (const page of this.iterPages()) {\n for (const item of page.getPaginatedItems()) {\n yield item;\n }\n }\n }\n}\n/**\n * This subclass of Promise will resolve to an instantiated Page once the request completes.\n *\n * It also implements AsyncIterable to allow auto-paginating iteration on an unawaited list call, eg:\n *\n * for await (const item of client.items.list()) {\n * console.log(item)\n * }\n */\nexport class PagePromise extends APIPromise {\n constructor(client, request, Page) {\n super(request, async (props) => new Page(client, props.response, await defaultParseResponse(props), props.options));\n }\n /**\n * Allow auto-paginating iteration on an unawaited list call, eg:\n *\n * for await (const item of client.items.list()) {\n * console.log(item)\n * }\n */\n async *[Symbol.asyncIterator]() {\n const page = await this;\n for await (const item of page) {\n yield item;\n }\n }\n}\nexport const createResponseHeaders = (headers) => {\n return new Proxy(Object.fromEntries(\n // @ts-ignore\n headers.entries()), {\n get(target, name) {\n const key = name.toString();\n return target[key.toLowerCase()] || target[key];\n },\n });\n};\n// This is required so that we can determine if a given object matches the RequestOptions\n// type at runtime. While this requires duplication, it is enforced by the TypeScript\n// compiler such that any missing / extraneous keys will cause an error.\nconst requestOptionsKeys = {\n method: true,\n path: true,\n query: true,\n body: true,\n headers: true,\n maxRetries: true,\n stream: true,\n timeout: true,\n httpAgent: true,\n signal: true,\n idempotencyKey: true,\n __metadata: true,\n __binaryRequest: true,\n __binaryResponse: true,\n __streamClass: true,\n};\nexport const isRequestOptions = (obj) => {\n return (typeof obj === 'object' &&\n obj !== null &&\n !isEmptyObj(obj) &&\n Object.keys(obj).every((k) => hasOwn(requestOptionsKeys, k)));\n};\nconst getPlatformProperties = () => {\n if (typeof Deno !== 'undefined' && Deno.build != null) {\n return {\n 'X-Stainless-Lang': 'js',\n 'X-Stainless-Package-Version': VERSION,\n 'X-Stainless-OS': normalizePlatform(Deno.build.os),\n 'X-Stainless-Arch': normalizeArch(Deno.build.arch),\n 'X-Stainless-Runtime': 'deno',\n 'X-Stainless-Runtime-Version': typeof Deno.version === 'string' ? Deno.version : Deno.version?.deno ?? 'unknown',\n };\n }\n if (typeof EdgeRuntime !== 'undefined') {\n return {\n 'X-Stainless-Lang': 'js',\n 'X-Stainless-Package-Version': VERSION,\n 'X-Stainless-OS': 'Unknown',\n 'X-Stainless-Arch': `other:${EdgeRuntime}`,\n 'X-Stainless-Runtime': 'edge',\n 'X-Stainless-Runtime-Version': process.version,\n };\n }\n // Check if Node.js\n if (Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]') {\n return {\n 'X-Stainless-Lang': 'js',\n 'X-Stainless-Package-Version': VERSION,\n 'X-Stainless-OS': normalizePlatform(process.platform),\n 'X-Stainless-Arch': normalizeArch(process.arch),\n 'X-Stainless-Runtime': 'node',\n 'X-Stainless-Runtime-Version': process.version,\n };\n }\n const browserInfo = getBrowserInfo();\n if (browserInfo) {\n return {\n 'X-Stainless-Lang': 'js',\n 'X-Stainless-Package-Version': VERSION,\n 'X-Stainless-OS': 'Unknown',\n 'X-Stainless-Arch': 'unknown',\n 'X-Stainless-Runtime': `browser:${browserInfo.browser}`,\n 'X-Stainless-Runtime-Version': browserInfo.version,\n };\n }\n // TODO add support for Cloudflare workers, etc.\n return {\n 'X-Stainless-Lang': 'js',\n 'X-Stainless-Package-Version': VERSION,\n 'X-Stainless-OS': 'Unknown',\n 'X-Stainless-Arch': 'unknown',\n 'X-Stainless-Runtime': 'unknown',\n 'X-Stainless-Runtime-Version': 'unknown',\n };\n};\n// Note: modified from https://github.com/JS-DevTools/host-environment/blob/b1ab79ecde37db5d6e163c050e54fe7d287d7c92/src/isomorphic.browser.ts\nfunction getBrowserInfo() {\n if (typeof navigator === 'undefined' || !navigator) {\n return null;\n }\n // NOTE: The order matters here!\n const browserPatterns = [\n { key: 'edge', pattern: /Edge(?:\\W+(\\d+)\\.(\\d+)(?:\\.(\\d+))?)?/ },\n { key: 'ie', pattern: /MSIE(?:\\W+(\\d+)\\.(\\d+)(?:\\.(\\d+))?)?/ },\n { key: 'ie', pattern: /Trident(?:.*rv\\:(\\d+)\\.(\\d+)(?:\\.(\\d+))?)?/ },\n { key: 'chrome', pattern: /Chrome(?:\\W+(\\d+)\\.(\\d+)(?:\\.(\\d+))?)?/ },\n { key: 'firefox', pattern: /Firefox(?:\\W+(\\d+)\\.(\\d+)(?:\\.(\\d+))?)?/ },\n { key: 'safari', pattern: /(?:Version\\W+(\\d+)\\.(\\d+)(?:\\.(\\d+))?)?(?:\\W+Mobile\\S*)?\\W+Safari/ },\n ];\n // Find the FIRST matching browser\n for (const { key, pattern } of browserPatterns) {\n const match = pattern.exec(navigator.userAgent);\n if (match) {\n const major = match[1] || 0;\n const minor = match[2] || 0;\n const patch = match[3] || 0;\n return { browser: key, version: `${major}.${minor}.${patch}` };\n }\n }\n return null;\n}\nconst normalizeArch = (arch) => {\n // Node docs:\n // - https://nodejs.org/api/process.html#processarch\n // Deno docs:\n // - https://doc.deno.land/deno/stable/~/Deno.build\n if (arch === 'x32')\n return 'x32';\n if (arch === 'x86_64' || arch === 'x64')\n return 'x64';\n if (arch === 'arm')\n return 'arm';\n if (arch === 'aarch64' || arch === 'arm64')\n return 'arm64';\n if (arch)\n return `other:${arch}`;\n return 'unknown';\n};\nconst normalizePlatform = (platform) => {\n // Node platforms:\n // - https://nodejs.org/api/process.html#processplatform\n // Deno platforms:\n // - https://doc.deno.land/deno/stable/~/Deno.build\n // - https://github.com/denoland/deno/issues/14799\n platform = platform.toLowerCase();\n // NOTE: this iOS check is untested and may not work\n // Node does not work natively on IOS, there is a fork at\n // https://github.com/nodejs-mobile/nodejs-mobile\n // however it is unknown at the time of writing how to detect if it is running\n if (platform.includes('ios'))\n return 'iOS';\n if (platform === 'android')\n return 'Android';\n if (platform === 'darwin')\n return 'MacOS';\n if (platform === 'win32')\n return 'Windows';\n if (platform === 'freebsd')\n return 'FreeBSD';\n if (platform === 'openbsd')\n return 'OpenBSD';\n if (platform === 'linux')\n return 'Linux';\n if (platform)\n return `Other:${platform}`;\n return 'Unknown';\n};\nlet _platformHeaders;\nconst getPlatformHeaders = () => {\n return (_platformHeaders ?? (_platformHeaders = getPlatformProperties()));\n};\nexport const safeJSON = (text) => {\n try {\n return JSON.parse(text);\n }\n catch (err) {\n return undefined;\n }\n};\n// https://url.spec.whatwg.org/#url-scheme-string\nconst startsWithSchemeRegexp = /^[a-z][a-z0-9+.-]*:/i;\nconst isAbsoluteURL = (url) => {\n return startsWithSchemeRegexp.test(url);\n};\nexport const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\nconst validatePositiveInteger = (name, n) => {\n if (typeof n !== 'number' || !Number.isInteger(n)) {\n throw new OpenAIError(`${name} must be an integer`);\n }\n if (n < 0) {\n throw new OpenAIError(`${name} must be a positive integer`);\n }\n return n;\n};\nexport const castToError = (err) => {\n if (err instanceof Error)\n return err;\n if (typeof err === 'object' && err !== null) {\n try {\n return new Error(JSON.stringify(err));\n }\n catch { }\n }\n return new Error(err);\n};\nexport const ensurePresent = (value) => {\n if (value == null)\n throw new OpenAIError(`Expected a value to be given but received ${value} instead.`);\n return value;\n};\n/**\n * Read an environment variable.\n *\n * Trims beginning and trailing whitespace.\n *\n * Will return undefined if the environment variable doesn't exist or cannot be accessed.\n */\nexport const readEnv = (env) => {\n if (typeof process !== 'undefined') {\n return process.env?.[env]?.trim() ?? undefined;\n }\n if (typeof Deno !== 'undefined') {\n return Deno.env?.get?.(env)?.trim();\n }\n return undefined;\n};\nexport const coerceInteger = (value) => {\n if (typeof value === 'number')\n return Math.round(value);\n if (typeof value === 'string')\n return parseInt(value, 10);\n throw new OpenAIError(`Could not coerce ${value} (type: ${typeof value}) into a number`);\n};\nexport const coerceFloat = (value) => {\n if (typeof value === 'number')\n return value;\n if (typeof value === 'string')\n return parseFloat(value);\n throw new OpenAIError(`Could not coerce ${value} (type: ${typeof value}) into a number`);\n};\nexport const coerceBoolean = (value) => {\n if (typeof value === 'boolean')\n return value;\n if (typeof value === 'string')\n return value === 'true';\n return Boolean(value);\n};\nexport const maybeCoerceInteger = (value) => {\n if (value === undefined) {\n return undefined;\n }\n return coerceInteger(value);\n};\nexport const maybeCoerceFloat = (value) => {\n if (value === undefined) {\n return undefined;\n }\n return coerceFloat(value);\n};\nexport const maybeCoerceBoolean = (value) => {\n if (value === undefined) {\n return undefined;\n }\n return coerceBoolean(value);\n};\n// https://stackoverflow.com/a/34491287\nexport function isEmptyObj(obj) {\n if (!obj)\n return true;\n for (const _k in obj)\n return false;\n return true;\n}\n// https://eslint.org/docs/latest/rules/no-prototype-builtins\nexport function hasOwn(obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n/**\n * Copies headers from \"newHeaders\" onto \"targetHeaders\",\n * using lower-case for all properties,\n * ignoring any keys with undefined values,\n * and deleting any keys with null values.\n */\nfunction applyHeadersMut(targetHeaders, newHeaders) {\n for (const k in newHeaders) {\n if (!hasOwn(newHeaders, k))\n continue;\n const lowerKey = k.toLowerCase();\n if (!lowerKey)\n continue;\n const val = newHeaders[k];\n if (val === null) {\n delete targetHeaders[lowerKey];\n }\n else if (val !== undefined) {\n targetHeaders[lowerKey] = val;\n }\n }\n}\nconst SENSITIVE_HEADERS = new Set(['authorization', 'api-key']);\nexport function debug(action, ...args) {\n if (typeof process !== 'undefined' && process?.env?.['DEBUG'] === 'true') {\n const modifiedArgs = args.map((arg) => {\n if (!arg) {\n return arg;\n }\n // Check for sensitive headers in request body 'headers' object\n if (arg['headers']) {\n // clone so we don't mutate\n const modifiedArg = { ...arg, headers: { ...arg['headers'] } };\n for (const header in arg['headers']) {\n if (SENSITIVE_HEADERS.has(header.toLowerCase())) {\n modifiedArg['headers'][header] = 'REDACTED';\n }\n }\n return modifiedArg;\n }\n let modifiedArg = null;\n // Check for sensitive headers in headers object\n for (const header in arg) {\n if (SENSITIVE_HEADERS.has(header.toLowerCase())) {\n // avoid making a copy until we need to\n modifiedArg ?? (modifiedArg = { ...arg });\n modifiedArg[header] = 'REDACTED';\n }\n }\n return modifiedArg ?? arg;\n });\n console.log(`OpenAI:DEBUG:${action}`, ...modifiedArgs);\n }\n}\n/**\n * https://stackoverflow.com/a/2117523\n */\nconst uuid4 = () => {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n};\nexport const isRunningInBrowser = () => {\n return (\n // @ts-ignore\n typeof window !== 'undefined' &&\n // @ts-ignore\n typeof window.document !== 'undefined' &&\n // @ts-ignore\n typeof navigator !== 'undefined');\n};\nexport const isHeadersProtocol = (headers) => {\n return typeof headers?.get === 'function';\n};\nexport const getRequiredHeader = (headers, header) => {\n const foundHeader = getHeader(headers, header);\n if (foundHeader === undefined) {\n throw new Error(`Could not find ${header} header`);\n }\n return foundHeader;\n};\nexport const getHeader = (headers, header) => {\n const lowerCasedHeader = header.toLowerCase();\n if (isHeadersProtocol(headers)) {\n // to deal with the case where the header looks like Stainless-Event-Id\n const intercapsHeader = header[0]?.toUpperCase() +\n header.substring(1).replace(/([^\\w])(\\w)/g, (_m, g1, g2) => g1 + g2.toUpperCase());\n for (const key of [header, lowerCasedHeader, header.toUpperCase(), intercapsHeader]) {\n const value = headers.get(key);\n if (value) {\n return value;\n }\n }\n }\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === lowerCasedHeader) {\n if (Array.isArray(value)) {\n if (value.length <= 1)\n return value[0];\n console.warn(`Received ${value.length} entries for the ${header} header, using the first entry.`);\n return value[0];\n }\n return value;\n }\n }\n return undefined;\n};\n/**\n * Encodes a string to Base64 format.\n */\nexport const toBase64 = (str) => {\n if (!str)\n return '';\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(str).toString('base64');\n }\n if (typeof btoa !== 'undefined') {\n return btoa(str);\n }\n throw new OpenAIError('Cannot generate b64 string; Expected `Buffer` or `btoa` to be defined');\n};\n/**\n * Converts a Base64 encoded string to a Float32Array.\n * @param base64Str - The Base64 encoded string.\n * @returns An Array of numbers interpreted as Float32 values.\n */\nexport const toFloat32Array = (base64Str) => {\n if (typeof Buffer !== 'undefined') {\n // for Node.js environment\n const buf = Buffer.from(base64Str, 'base64');\n return Array.from(new Float32Array(buf.buffer, buf.byteOffset, buf.length / Float32Array.BYTES_PER_ELEMENT));\n }\n else {\n // for legacy web platform APIs\n const binaryStr = atob(base64Str);\n const len = binaryStr.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryStr.charCodeAt(i);\n }\n return Array.from(new Float32Array(bytes.buffer));\n }\n};\nexport function isObj(obj) {\n return obj != null && typeof obj === 'object' && !Array.isArray(obj);\n}\n//# sourceMappingURL=core.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { AbstractPage } from \"./core.mjs\";\n/**\n * Note: no pagination actually occurs yet, this is for forwards-compatibility.\n */\nexport class Page extends AbstractPage {\n constructor(client, response, body, options) {\n super(client, response, body, options);\n this.data = body.data || [];\n this.object = body.object;\n }\n getPaginatedItems() {\n return this.data ?? [];\n }\n // @deprecated Please use `nextPageInfo()` instead\n /**\n * This page represents a response that isn't actually paginated at the API level\n * so there will never be any next page params.\n */\n nextPageParams() {\n return null;\n }\n nextPageInfo() {\n return null;\n }\n}\nexport class CursorPage extends AbstractPage {\n constructor(client, response, body, options) {\n super(client, response, body, options);\n this.data = body.data || [];\n this.has_more = body.has_more || false;\n }\n getPaginatedItems() {\n return this.data ?? [];\n }\n hasNextPage() {\n if (this.has_more === false) {\n return false;\n }\n return super.hasNextPage();\n }\n // @deprecated Please use `nextPageInfo()` instead\n nextPageParams() {\n const info = this.nextPageInfo();\n if (!info)\n return null;\n if ('params' in info)\n return info.params;\n const params = Object.fromEntries(info.url.searchParams);\n if (!Object.keys(params).length)\n return null;\n return params;\n }\n nextPageInfo() {\n const data = this.getPaginatedItems();\n if (!data.length) {\n return null;\n }\n const id = data[data.length - 1]?.id;\n if (!id) {\n return null;\n }\n return { params: { after: id } };\n }\n}\n//# sourceMappingURL=pagination.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nexport class APIResource {\n constructor(client) {\n this._client = client;\n }\n}\n//# sourceMappingURL=resource.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport { ChatCompletionStoreMessagesPage } from \"./completions.mjs\";\nexport class Messages extends APIResource {\n list(completionId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(completionId, {}, query);\n }\n return this._client.getAPIList(`/chat/completions/${completionId}/messages`, ChatCompletionStoreMessagesPage, { query, ...options });\n }\n}\nexport { ChatCompletionStoreMessagesPage };\n//# sourceMappingURL=messages.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport * as MessagesAPI from \"./messages.mjs\";\nimport { Messages } from \"./messages.mjs\";\nimport { CursorPage } from \"../../../pagination.mjs\";\nexport class Completions extends APIResource {\n constructor() {\n super(...arguments);\n this.messages = new MessagesAPI.Messages(this._client);\n }\n create(body, options) {\n return this._client.post('/chat/completions', { body, ...options, stream: body.stream ?? false });\n }\n /**\n * Get a stored chat completion. Only Chat Completions that have been created with\n * the `store` parameter set to `true` will be returned.\n *\n * @example\n * ```ts\n * const chatCompletion =\n * await client.chat.completions.retrieve('completion_id');\n * ```\n */\n retrieve(completionId, options) {\n return this._client.get(`/chat/completions/${completionId}`, options);\n }\n /**\n * Modify a stored chat completion. Only Chat Completions that have been created\n * with the `store` parameter set to `true` can be modified. Currently, the only\n * supported modification is to update the `metadata` field.\n *\n * @example\n * ```ts\n * const chatCompletion = await client.chat.completions.update(\n * 'completion_id',\n * { metadata: { foo: 'string' } },\n * );\n * ```\n */\n update(completionId, body, options) {\n return this._client.post(`/chat/completions/${completionId}`, { body, ...options });\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/chat/completions', ChatCompletionsPage, { query, ...options });\n }\n /**\n * Delete a stored chat completion. Only Chat Completions that have been created\n * with the `store` parameter set to `true` can be deleted.\n *\n * @example\n * ```ts\n * const chatCompletionDeleted =\n * await client.chat.completions.del('completion_id');\n * ```\n */\n del(completionId, options) {\n return this._client.delete(`/chat/completions/${completionId}`, options);\n }\n}\nexport class ChatCompletionsPage extends CursorPage {\n}\nexport class ChatCompletionStoreMessagesPage extends CursorPage {\n}\nCompletions.ChatCompletionsPage = ChatCompletionsPage;\nCompletions.Messages = Messages;\n//# sourceMappingURL=completions.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as CompletionsAPI from \"./completions/completions.mjs\";\nimport { ChatCompletionsPage, Completions, } from \"./completions/completions.mjs\";\nexport class Chat extends APIResource {\n constructor() {\n super(...arguments);\n this.completions = new CompletionsAPI.Completions(this._client);\n }\n}\nChat.Completions = Completions;\nChat.ChatCompletionsPage = ChatCompletionsPage;\n//# sourceMappingURL=chat.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nexport class Speech extends APIResource {\n /**\n * Generates audio from the input text.\n *\n * @example\n * ```ts\n * const speech = await client.audio.speech.create({\n * input: 'input',\n * model: 'string',\n * voice: 'ash',\n * });\n *\n * const content = await speech.blob();\n * console.log(content);\n * ```\n */\n create(body, options) {\n return this._client.post('/audio/speech', {\n body,\n ...options,\n headers: { Accept: 'application/octet-stream', ...options?.headers },\n __binaryResponse: true,\n });\n }\n}\n//# sourceMappingURL=speech.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as Core from \"../../core.mjs\";\nexport class Transcriptions extends APIResource {\n create(body, options) {\n return this._client.post('/audio/transcriptions', Core.multipartFormRequestOptions({\n body,\n ...options,\n stream: body.stream ?? false,\n __metadata: { model: body.model },\n }));\n }\n}\n//# sourceMappingURL=transcriptions.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as Core from \"../../core.mjs\";\nexport class Translations extends APIResource {\n create(body, options) {\n return this._client.post('/audio/translations', Core.multipartFormRequestOptions({ body, ...options, __metadata: { model: body.model } }));\n }\n}\n//# sourceMappingURL=translations.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as SpeechAPI from \"./speech.mjs\";\nimport { Speech } from \"./speech.mjs\";\nimport * as TranscriptionsAPI from \"./transcriptions.mjs\";\nimport { Transcriptions, } from \"./transcriptions.mjs\";\nimport * as TranslationsAPI from \"./translations.mjs\";\nimport { Translations, } from \"./translations.mjs\";\nexport class Audio extends APIResource {\n constructor() {\n super(...arguments);\n this.transcriptions = new TranscriptionsAPI.Transcriptions(this._client);\n this.translations = new TranslationsAPI.Translations(this._client);\n this.speech = new SpeechAPI.Speech(this._client);\n }\n}\nAudio.Transcriptions = Transcriptions;\nAudio.Translations = Translations;\nAudio.Speech = Speech;\n//# sourceMappingURL=audio.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../resource.mjs\";\nimport { isRequestOptions } from \"../core.mjs\";\nimport { CursorPage } from \"../pagination.mjs\";\nexport class Batches extends APIResource {\n /**\n * Creates and executes a batch from an uploaded file of requests\n */\n create(body, options) {\n return this._client.post('/batches', { body, ...options });\n }\n /**\n * Retrieves a batch.\n */\n retrieve(batchId, options) {\n return this._client.get(`/batches/${batchId}`, options);\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/batches', BatchesPage, { query, ...options });\n }\n /**\n * Cancels an in-progress batch. The batch will be in status `cancelling` for up to\n * 10 minutes, before changing to `cancelled`, where it will have partial results\n * (if any) available in the output file.\n */\n cancel(batchId, options) {\n return this._client.post(`/batches/${batchId}/cancel`, options);\n }\n}\nexport class BatchesPage extends CursorPage {\n}\nBatches.BatchesPage = BatchesPage;\n//# sourceMappingURL=batches.mjs.map","var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _EventStream_instances, _EventStream_connectedPromise, _EventStream_resolveConnectedPromise, _EventStream_rejectConnectedPromise, _EventStream_endPromise, _EventStream_resolveEndPromise, _EventStream_rejectEndPromise, _EventStream_listeners, _EventStream_ended, _EventStream_errored, _EventStream_aborted, _EventStream_catchingPromiseCreated, _EventStream_handleError;\nimport { APIUserAbortError, OpenAIError } from \"../error.mjs\";\nexport class EventStream {\n constructor() {\n _EventStream_instances.add(this);\n this.controller = new AbortController();\n _EventStream_connectedPromise.set(this, void 0);\n _EventStream_resolveConnectedPromise.set(this, () => { });\n _EventStream_rejectConnectedPromise.set(this, () => { });\n _EventStream_endPromise.set(this, void 0);\n _EventStream_resolveEndPromise.set(this, () => { });\n _EventStream_rejectEndPromise.set(this, () => { });\n _EventStream_listeners.set(this, {});\n _EventStream_ended.set(this, false);\n _EventStream_errored.set(this, false);\n _EventStream_aborted.set(this, false);\n _EventStream_catchingPromiseCreated.set(this, false);\n __classPrivateFieldSet(this, _EventStream_connectedPromise, new Promise((resolve, reject) => {\n __classPrivateFieldSet(this, _EventStream_resolveConnectedPromise, resolve, \"f\");\n __classPrivateFieldSet(this, _EventStream_rejectConnectedPromise, reject, \"f\");\n }), \"f\");\n __classPrivateFieldSet(this, _EventStream_endPromise, new Promise((resolve, reject) => {\n __classPrivateFieldSet(this, _EventStream_resolveEndPromise, resolve, \"f\");\n __classPrivateFieldSet(this, _EventStream_rejectEndPromise, reject, \"f\");\n }), \"f\");\n // Don't let these promises cause unhandled rejection errors.\n // we will manually cause an unhandled rejection error later\n // if the user hasn't registered any error listener or called\n // any promise-returning method.\n __classPrivateFieldGet(this, _EventStream_connectedPromise, \"f\").catch(() => { });\n __classPrivateFieldGet(this, _EventStream_endPromise, \"f\").catch(() => { });\n }\n _run(executor) {\n // Unfortunately if we call `executor()` immediately we get runtime errors about\n // references to `this` before the `super()` constructor call returns.\n setTimeout(() => {\n executor().then(() => {\n this._emitFinal();\n this._emit('end');\n }, __classPrivateFieldGet(this, _EventStream_instances, \"m\", _EventStream_handleError).bind(this));\n }, 0);\n }\n _connected() {\n if (this.ended)\n return;\n __classPrivateFieldGet(this, _EventStream_resolveConnectedPromise, \"f\").call(this);\n this._emit('connect');\n }\n get ended() {\n return __classPrivateFieldGet(this, _EventStream_ended, \"f\");\n }\n get errored() {\n return __classPrivateFieldGet(this, _EventStream_errored, \"f\");\n }\n get aborted() {\n return __classPrivateFieldGet(this, _EventStream_aborted, \"f\");\n }\n abort() {\n this.controller.abort();\n }\n /**\n * Adds the listener function to the end of the listeners array for the event.\n * No checks are made to see if the listener has already been added. Multiple calls passing\n * the same combination of event and listener will result in the listener being added, and\n * called, multiple times.\n * @returns this ChatCompletionStream, so that calls can be chained\n */\n on(event, listener) {\n const listeners = __classPrivateFieldGet(this, _EventStream_listeners, \"f\")[event] || (__classPrivateFieldGet(this, _EventStream_listeners, \"f\")[event] = []);\n listeners.push({ listener });\n return this;\n }\n /**\n * Removes the specified listener from the listener array for the event.\n * off() will remove, at most, one instance of a listener from the listener array. If any single\n * listener has been added multiple times to the listener array for the specified event, then\n * off() must be called multiple times to remove each instance.\n * @returns this ChatCompletionStream, so that calls can be chained\n */\n off(event, listener) {\n const listeners = __classPrivateFieldGet(this, _EventStream_listeners, \"f\")[event];\n if (!listeners)\n return this;\n const index = listeners.findIndex((l) => l.listener === listener);\n if (index >= 0)\n listeners.splice(index, 1);\n return this;\n }\n /**\n * Adds a one-time listener function for the event. The next time the event is triggered,\n * this listener is removed and then invoked.\n * @returns this ChatCompletionStream, so that calls can be chained\n */\n once(event, listener) {\n const listeners = __classPrivateFieldGet(this, _EventStream_listeners, \"f\")[event] || (__classPrivateFieldGet(this, _EventStream_listeners, \"f\")[event] = []);\n listeners.push({ listener, once: true });\n return this;\n }\n /**\n * This is similar to `.once()`, but returns a Promise that resolves the next time\n * the event is triggered, instead of calling a listener callback.\n * @returns a Promise that resolves the next time given event is triggered,\n * or rejects if an error is emitted. (If you request the 'error' event,\n * returns a promise that resolves with the error).\n *\n * Example:\n *\n * const message = await stream.emitted('message') // rejects if the stream errors\n */\n emitted(event) {\n return new Promise((resolve, reject) => {\n __classPrivateFieldSet(this, _EventStream_catchingPromiseCreated, true, \"f\");\n if (event !== 'error')\n this.once('error', reject);\n this.once(event, resolve);\n });\n }\n async done() {\n __classPrivateFieldSet(this, _EventStream_catchingPromiseCreated, true, \"f\");\n await __classPrivateFieldGet(this, _EventStream_endPromise, \"f\");\n }\n _emit(event, ...args) {\n // make sure we don't emit any events after end\n if (__classPrivateFieldGet(this, _EventStream_ended, \"f\")) {\n return;\n }\n if (event === 'end') {\n __classPrivateFieldSet(this, _EventStream_ended, true, \"f\");\n __classPrivateFieldGet(this, _EventStream_resolveEndPromise, \"f\").call(this);\n }\n const listeners = __classPrivateFieldGet(this, _EventStream_listeners, \"f\")[event];\n if (listeners) {\n __classPrivateFieldGet(this, _EventStream_listeners, \"f\")[event] = listeners.filter((l) => !l.once);\n listeners.forEach(({ listener }) => listener(...args));\n }\n if (event === 'abort') {\n const error = args[0];\n if (!__classPrivateFieldGet(this, _EventStream_catchingPromiseCreated, \"f\") && !listeners?.length) {\n Promise.reject(error);\n }\n __classPrivateFieldGet(this, _EventStream_rejectConnectedPromise, \"f\").call(this, error);\n __classPrivateFieldGet(this, _EventStream_rejectEndPromise, \"f\").call(this, error);\n this._emit('end');\n return;\n }\n if (event === 'error') {\n // NOTE: _emit('error', error) should only be called from #handleError().\n const error = args[0];\n if (!__classPrivateFieldGet(this, _EventStream_catchingPromiseCreated, \"f\") && !listeners?.length) {\n // Trigger an unhandled rejection if the user hasn't registered any error handlers.\n // If you are seeing stack traces here, make sure to handle errors via either:\n // - runner.on('error', () => ...)\n // - await runner.done()\n // - await runner.finalChatCompletion()\n // - etc.\n Promise.reject(error);\n }\n __classPrivateFieldGet(this, _EventStream_rejectConnectedPromise, \"f\").call(this, error);\n __classPrivateFieldGet(this, _EventStream_rejectEndPromise, \"f\").call(this, error);\n this._emit('end');\n }\n }\n _emitFinal() { }\n}\n_EventStream_connectedPromise = new WeakMap(), _EventStream_resolveConnectedPromise = new WeakMap(), _EventStream_rejectConnectedPromise = new WeakMap(), _EventStream_endPromise = new WeakMap(), _EventStream_resolveEndPromise = new WeakMap(), _EventStream_rejectEndPromise = new WeakMap(), _EventStream_listeners = new WeakMap(), _EventStream_ended = new WeakMap(), _EventStream_errored = new WeakMap(), _EventStream_aborted = new WeakMap(), _EventStream_catchingPromiseCreated = new WeakMap(), _EventStream_instances = new WeakSet(), _EventStream_handleError = function _EventStream_handleError(error) {\n __classPrivateFieldSet(this, _EventStream_errored, true, \"f\");\n if (error instanceof Error && error.name === 'AbortError') {\n error = new APIUserAbortError();\n }\n if (error instanceof APIUserAbortError) {\n __classPrivateFieldSet(this, _EventStream_aborted, true, \"f\");\n return this._emit('abort', error);\n }\n if (error instanceof OpenAIError) {\n return this._emit('error', error);\n }\n if (error instanceof Error) {\n const openAIError = new OpenAIError(error.message);\n // @ts-ignore\n openAIError.cause = error;\n return this._emit('error', openAIError);\n }\n return this._emit('error', new OpenAIError(String(error)));\n};\n//# sourceMappingURL=EventStream.mjs.map","var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar _AssistantStream_instances, _AssistantStream_events, _AssistantStream_runStepSnapshots, _AssistantStream_messageSnapshots, _AssistantStream_messageSnapshot, _AssistantStream_finalRun, _AssistantStream_currentContentIndex, _AssistantStream_currentContent, _AssistantStream_currentToolCallIndex, _AssistantStream_currentToolCall, _AssistantStream_currentEvent, _AssistantStream_currentRunSnapshot, _AssistantStream_currentRunStepSnapshot, _AssistantStream_addEvent, _AssistantStream_endRequest, _AssistantStream_handleMessage, _AssistantStream_handleRunStep, _AssistantStream_handleEvent, _AssistantStream_accumulateRunStep, _AssistantStream_accumulateMessage, _AssistantStream_accumulateContent, _AssistantStream_handleRun;\nimport * as Core from \"../core.mjs\";\nimport { Stream } from \"../streaming.mjs\";\nimport { APIUserAbortError, OpenAIError } from \"../error.mjs\";\nimport { EventStream } from \"./EventStream.mjs\";\nexport class AssistantStream extends EventStream {\n constructor() {\n super(...arguments);\n _AssistantStream_instances.add(this);\n //Track all events in a single list for reference\n _AssistantStream_events.set(this, []);\n //Used to accumulate deltas\n //We are accumulating many types so the value here is not strict\n _AssistantStream_runStepSnapshots.set(this, {});\n _AssistantStream_messageSnapshots.set(this, {});\n _AssistantStream_messageSnapshot.set(this, void 0);\n _AssistantStream_finalRun.set(this, void 0);\n _AssistantStream_currentContentIndex.set(this, void 0);\n _AssistantStream_currentContent.set(this, void 0);\n _AssistantStream_currentToolCallIndex.set(this, void 0);\n _AssistantStream_currentToolCall.set(this, void 0);\n //For current snapshot methods\n _AssistantStream_currentEvent.set(this, void 0);\n _AssistantStream_currentRunSnapshot.set(this, void 0);\n _AssistantStream_currentRunStepSnapshot.set(this, void 0);\n }\n [(_AssistantStream_events = new WeakMap(), _AssistantStream_runStepSnapshots = new WeakMap(), _AssistantStream_messageSnapshots = new WeakMap(), _AssistantStream_messageSnapshot = new WeakMap(), _AssistantStream_finalRun = new WeakMap(), _AssistantStream_currentContentIndex = new WeakMap(), _AssistantStream_currentContent = new WeakMap(), _AssistantStream_currentToolCallIndex = new WeakMap(), _AssistantStream_currentToolCall = new WeakMap(), _AssistantStream_currentEvent = new WeakMap(), _AssistantStream_currentRunSnapshot = new WeakMap(), _AssistantStream_currentRunStepSnapshot = new WeakMap(), _AssistantStream_instances = new WeakSet(), Symbol.asyncIterator)]() {\n const pushQueue = [];\n const readQueue = [];\n let done = false;\n //Catch all for passing along all events\n this.on('event', (event) => {\n const reader = readQueue.shift();\n if (reader) {\n reader.resolve(event);\n }\n else {\n pushQueue.push(event);\n }\n });\n this.on('end', () => {\n done = true;\n for (const reader of readQueue) {\n reader.resolve(undefined);\n }\n readQueue.length = 0;\n });\n this.on('abort', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n this.on('error', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n return {\n next: async () => {\n if (!pushQueue.length) {\n if (done) {\n return { value: undefined, done: true };\n }\n return new Promise((resolve, reject) => readQueue.push({ resolve, reject })).then((chunk) => (chunk ? { value: chunk, done: false } : { value: undefined, done: true }));\n }\n const chunk = pushQueue.shift();\n return { value: chunk, done: false };\n },\n return: async () => {\n this.abort();\n return { value: undefined, done: true };\n },\n };\n }\n static fromReadableStream(stream) {\n const runner = new AssistantStream();\n runner._run(() => runner._fromReadableStream(stream));\n return runner;\n }\n async _fromReadableStream(readableStream, options) {\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n this._connected();\n const stream = Stream.fromReadableStream(readableStream, this.controller);\n for await (const event of stream) {\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_addEvent).call(this, event);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_endRequest).call(this));\n }\n toReadableStream() {\n const stream = new Stream(this[Symbol.asyncIterator].bind(this), this.controller);\n return stream.toReadableStream();\n }\n static createToolAssistantStream(threadId, runId, runs, params, options) {\n const runner = new AssistantStream();\n runner._run(() => runner._runToolAssistantStream(threadId, runId, runs, params, {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' },\n }));\n return runner;\n }\n async _createToolAssistantStream(run, threadId, runId, params, options) {\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n const body = { ...params, stream: true };\n const stream = await run.submitToolOutputs(threadId, runId, body, {\n ...options,\n signal: this.controller.signal,\n });\n this._connected();\n for await (const event of stream) {\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_addEvent).call(this, event);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_endRequest).call(this));\n }\n static createThreadAssistantStream(params, thread, options) {\n const runner = new AssistantStream();\n runner._run(() => runner._threadAssistantStream(params, thread, {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' },\n }));\n return runner;\n }\n static createAssistantStream(threadId, runs, params, options) {\n const runner = new AssistantStream();\n runner._run(() => runner._runAssistantStream(threadId, runs, params, {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' },\n }));\n return runner;\n }\n currentEvent() {\n return __classPrivateFieldGet(this, _AssistantStream_currentEvent, \"f\");\n }\n currentRun() {\n return __classPrivateFieldGet(this, _AssistantStream_currentRunSnapshot, \"f\");\n }\n currentMessageSnapshot() {\n return __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, \"f\");\n }\n currentRunStepSnapshot() {\n return __classPrivateFieldGet(this, _AssistantStream_currentRunStepSnapshot, \"f\");\n }\n async finalRunSteps() {\n await this.done();\n return Object.values(__classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\"));\n }\n async finalMessages() {\n await this.done();\n return Object.values(__classPrivateFieldGet(this, _AssistantStream_messageSnapshots, \"f\"));\n }\n async finalRun() {\n await this.done();\n if (!__classPrivateFieldGet(this, _AssistantStream_finalRun, \"f\"))\n throw Error('Final run was not received.');\n return __classPrivateFieldGet(this, _AssistantStream_finalRun, \"f\");\n }\n async _createThreadAssistantStream(thread, params, options) {\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n const body = { ...params, stream: true };\n const stream = await thread.createAndRun(body, { ...options, signal: this.controller.signal });\n this._connected();\n for await (const event of stream) {\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_addEvent).call(this, event);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_endRequest).call(this));\n }\n async _createAssistantStream(run, threadId, params, options) {\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n const body = { ...params, stream: true };\n const stream = await run.create(threadId, body, { ...options, signal: this.controller.signal });\n this._connected();\n for await (const event of stream) {\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_addEvent).call(this, event);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_endRequest).call(this));\n }\n static accumulateDelta(acc, delta) {\n for (const [key, deltaValue] of Object.entries(delta)) {\n if (!acc.hasOwnProperty(key)) {\n acc[key] = deltaValue;\n continue;\n }\n let accValue = acc[key];\n if (accValue === null || accValue === undefined) {\n acc[key] = deltaValue;\n continue;\n }\n // We don't accumulate these special properties\n if (key === 'index' || key === 'type') {\n acc[key] = deltaValue;\n continue;\n }\n // Type-specific accumulation logic\n if (typeof accValue === 'string' && typeof deltaValue === 'string') {\n accValue += deltaValue;\n }\n else if (typeof accValue === 'number' && typeof deltaValue === 'number') {\n accValue += deltaValue;\n }\n else if (Core.isObj(accValue) && Core.isObj(deltaValue)) {\n accValue = this.accumulateDelta(accValue, deltaValue);\n }\n else if (Array.isArray(accValue) && Array.isArray(deltaValue)) {\n if (accValue.every((x) => typeof x === 'string' || typeof x === 'number')) {\n accValue.push(...deltaValue); // Use spread syntax for efficient addition\n continue;\n }\n for (const deltaEntry of deltaValue) {\n if (!Core.isObj(deltaEntry)) {\n throw new Error(`Expected array delta entry to be an object but got: ${deltaEntry}`);\n }\n const index = deltaEntry['index'];\n if (index == null) {\n console.error(deltaEntry);\n throw new Error('Expected array delta entry to have an `index` property');\n }\n if (typeof index !== 'number') {\n throw new Error(`Expected array delta entry \\`index\\` property to be a number but got ${index}`);\n }\n const accEntry = accValue[index];\n if (accEntry == null) {\n accValue.push(deltaEntry);\n }\n else {\n accValue[index] = this.accumulateDelta(accEntry, deltaEntry);\n }\n }\n continue;\n }\n else {\n throw Error(`Unhandled record type: ${key}, deltaValue: ${deltaValue}, accValue: ${accValue}`);\n }\n acc[key] = accValue;\n }\n return acc;\n }\n _addRun(run) {\n return run;\n }\n async _threadAssistantStream(params, thread, options) {\n return await this._createThreadAssistantStream(thread, params, options);\n }\n async _runAssistantStream(threadId, runs, params, options) {\n return await this._createAssistantStream(runs, threadId, params, options);\n }\n async _runToolAssistantStream(threadId, runId, runs, params, options) {\n return await this._createToolAssistantStream(runs, threadId, runId, params, options);\n }\n}\n_AssistantStream_addEvent = function _AssistantStream_addEvent(event) {\n if (this.ended)\n return;\n __classPrivateFieldSet(this, _AssistantStream_currentEvent, event, \"f\");\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_handleEvent).call(this, event);\n switch (event.event) {\n case 'thread.created':\n //No action on this event.\n break;\n case 'thread.run.created':\n case 'thread.run.queued':\n case 'thread.run.in_progress':\n case 'thread.run.requires_action':\n case 'thread.run.completed':\n case 'thread.run.incomplete':\n case 'thread.run.failed':\n case 'thread.run.cancelling':\n case 'thread.run.cancelled':\n case 'thread.run.expired':\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_handleRun).call(this, event);\n break;\n case 'thread.run.step.created':\n case 'thread.run.step.in_progress':\n case 'thread.run.step.delta':\n case 'thread.run.step.completed':\n case 'thread.run.step.failed':\n case 'thread.run.step.cancelled':\n case 'thread.run.step.expired':\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_handleRunStep).call(this, event);\n break;\n case 'thread.message.created':\n case 'thread.message.in_progress':\n case 'thread.message.delta':\n case 'thread.message.completed':\n case 'thread.message.incomplete':\n __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_handleMessage).call(this, event);\n break;\n case 'error':\n //This is included for completeness, but errors are processed in the SSE event processing so this should not occur\n throw new Error('Encountered an error event in event processing - errors should be processed earlier');\n default:\n assertNever(event);\n }\n}, _AssistantStream_endRequest = function _AssistantStream_endRequest() {\n if (this.ended) {\n throw new OpenAIError(`stream has ended, this shouldn't happen`);\n }\n if (!__classPrivateFieldGet(this, _AssistantStream_finalRun, \"f\"))\n throw Error('Final run has not been received');\n return __classPrivateFieldGet(this, _AssistantStream_finalRun, \"f\");\n}, _AssistantStream_handleMessage = function _AssistantStream_handleMessage(event) {\n const [accumulatedMessage, newContent] = __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_accumulateMessage).call(this, event, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, \"f\"));\n __classPrivateFieldSet(this, _AssistantStream_messageSnapshot, accumulatedMessage, \"f\");\n __classPrivateFieldGet(this, _AssistantStream_messageSnapshots, \"f\")[accumulatedMessage.id] = accumulatedMessage;\n for (const content of newContent) {\n const snapshotContent = accumulatedMessage.content[content.index];\n if (snapshotContent?.type == 'text') {\n this._emit('textCreated', snapshotContent.text);\n }\n }\n switch (event.event) {\n case 'thread.message.created':\n this._emit('messageCreated', event.data);\n break;\n case 'thread.message.in_progress':\n break;\n case 'thread.message.delta':\n this._emit('messageDelta', event.data.delta, accumulatedMessage);\n if (event.data.delta.content) {\n for (const content of event.data.delta.content) {\n //If it is text delta, emit a text delta event\n if (content.type == 'text' && content.text) {\n let textDelta = content.text;\n let snapshot = accumulatedMessage.content[content.index];\n if (snapshot && snapshot.type == 'text') {\n this._emit('textDelta', textDelta, snapshot.text);\n }\n else {\n throw Error('The snapshot associated with this text delta is not text or missing');\n }\n }\n if (content.index != __classPrivateFieldGet(this, _AssistantStream_currentContentIndex, \"f\")) {\n //See if we have in progress content\n if (__classPrivateFieldGet(this, _AssistantStream_currentContent, \"f\")) {\n switch (__classPrivateFieldGet(this, _AssistantStream_currentContent, \"f\").type) {\n case 'text':\n this._emit('textDone', __classPrivateFieldGet(this, _AssistantStream_currentContent, \"f\").text, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, \"f\"));\n break;\n case 'image_file':\n this._emit('imageFileDone', __classPrivateFieldGet(this, _AssistantStream_currentContent, \"f\").image_file, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, \"f\"));\n break;\n }\n }\n __classPrivateFieldSet(this, _AssistantStream_currentContentIndex, content.index, \"f\");\n }\n __classPrivateFieldSet(this, _AssistantStream_currentContent, accumulatedMessage.content[content.index], \"f\");\n }\n }\n break;\n case 'thread.message.completed':\n case 'thread.message.incomplete':\n //We emit the latest content we were working on on completion (including incomplete)\n if (__classPrivateFieldGet(this, _AssistantStream_currentContentIndex, \"f\") !== undefined) {\n const currentContent = event.data.content[__classPrivateFieldGet(this, _AssistantStream_currentContentIndex, \"f\")];\n if (currentContent) {\n switch (currentContent.type) {\n case 'image_file':\n this._emit('imageFileDone', currentContent.image_file, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, \"f\"));\n break;\n case 'text':\n this._emit('textDone', currentContent.text, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, \"f\"));\n break;\n }\n }\n }\n if (__classPrivateFieldGet(this, _AssistantStream_messageSnapshot, \"f\")) {\n this._emit('messageDone', event.data);\n }\n __classPrivateFieldSet(this, _AssistantStream_messageSnapshot, undefined, \"f\");\n }\n}, _AssistantStream_handleRunStep = function _AssistantStream_handleRunStep(event) {\n const accumulatedRunStep = __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_accumulateRunStep).call(this, event);\n __classPrivateFieldSet(this, _AssistantStream_currentRunStepSnapshot, accumulatedRunStep, \"f\");\n switch (event.event) {\n case 'thread.run.step.created':\n this._emit('runStepCreated', event.data);\n break;\n case 'thread.run.step.delta':\n const delta = event.data.delta;\n if (delta.step_details &&\n delta.step_details.type == 'tool_calls' &&\n delta.step_details.tool_calls &&\n accumulatedRunStep.step_details.type == 'tool_calls') {\n for (const toolCall of delta.step_details.tool_calls) {\n if (toolCall.index == __classPrivateFieldGet(this, _AssistantStream_currentToolCallIndex, \"f\")) {\n this._emit('toolCallDelta', toolCall, accumulatedRunStep.step_details.tool_calls[toolCall.index]);\n }\n else {\n if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\")) {\n this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\"));\n }\n __classPrivateFieldSet(this, _AssistantStream_currentToolCallIndex, toolCall.index, \"f\");\n __classPrivateFieldSet(this, _AssistantStream_currentToolCall, accumulatedRunStep.step_details.tool_calls[toolCall.index], \"f\");\n if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\"))\n this._emit('toolCallCreated', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\"));\n }\n }\n }\n this._emit('runStepDelta', event.data.delta, accumulatedRunStep);\n break;\n case 'thread.run.step.completed':\n case 'thread.run.step.failed':\n case 'thread.run.step.cancelled':\n case 'thread.run.step.expired':\n __classPrivateFieldSet(this, _AssistantStream_currentRunStepSnapshot, undefined, \"f\");\n const details = event.data.step_details;\n if (details.type == 'tool_calls') {\n if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\")) {\n this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\"));\n __classPrivateFieldSet(this, _AssistantStream_currentToolCall, undefined, \"f\");\n }\n }\n this._emit('runStepDone', event.data, accumulatedRunStep);\n break;\n case 'thread.run.step.in_progress':\n break;\n }\n}, _AssistantStream_handleEvent = function _AssistantStream_handleEvent(event) {\n __classPrivateFieldGet(this, _AssistantStream_events, \"f\").push(event);\n this._emit('event', event);\n}, _AssistantStream_accumulateRunStep = function _AssistantStream_accumulateRunStep(event) {\n switch (event.event) {\n case 'thread.run.step.created':\n __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\")[event.data.id] = event.data;\n return event.data;\n case 'thread.run.step.delta':\n let snapshot = __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\")[event.data.id];\n if (!snapshot) {\n throw Error('Received a RunStepDelta before creation of a snapshot');\n }\n let data = event.data;\n if (data.delta) {\n const accumulated = AssistantStream.accumulateDelta(snapshot, data.delta);\n __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\")[event.data.id] = accumulated;\n }\n return __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\")[event.data.id];\n case 'thread.run.step.completed':\n case 'thread.run.step.failed':\n case 'thread.run.step.cancelled':\n case 'thread.run.step.expired':\n case 'thread.run.step.in_progress':\n __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\")[event.data.id] = event.data;\n break;\n }\n if (__classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\")[event.data.id])\n return __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, \"f\")[event.data.id];\n throw new Error('No snapshot available');\n}, _AssistantStream_accumulateMessage = function _AssistantStream_accumulateMessage(event, snapshot) {\n let newContent = [];\n switch (event.event) {\n case 'thread.message.created':\n //On creation the snapshot is just the initial message\n return [event.data, newContent];\n case 'thread.message.delta':\n if (!snapshot) {\n throw Error('Received a delta with no existing snapshot (there should be one from message creation)');\n }\n let data = event.data;\n //If this delta does not have content, nothing to process\n if (data.delta.content) {\n for (const contentElement of data.delta.content) {\n if (contentElement.index in snapshot.content) {\n let currentContent = snapshot.content[contentElement.index];\n snapshot.content[contentElement.index] = __classPrivateFieldGet(this, _AssistantStream_instances, \"m\", _AssistantStream_accumulateContent).call(this, contentElement, currentContent);\n }\n else {\n snapshot.content[contentElement.index] = contentElement;\n // This is a new element\n newContent.push(contentElement);\n }\n }\n }\n return [snapshot, newContent];\n case 'thread.message.in_progress':\n case 'thread.message.completed':\n case 'thread.message.incomplete':\n //No changes on other thread events\n if (snapshot) {\n return [snapshot, newContent];\n }\n else {\n throw Error('Received thread message event with no existing snapshot');\n }\n }\n throw Error('Tried to accumulate a non-message event');\n}, _AssistantStream_accumulateContent = function _AssistantStream_accumulateContent(contentElement, currentContent) {\n return AssistantStream.accumulateDelta(currentContent, contentElement);\n}, _AssistantStream_handleRun = function _AssistantStream_handleRun(event) {\n __classPrivateFieldSet(this, _AssistantStream_currentRunSnapshot, event.data, \"f\");\n switch (event.event) {\n case 'thread.run.created':\n break;\n case 'thread.run.queued':\n break;\n case 'thread.run.in_progress':\n break;\n case 'thread.run.requires_action':\n case 'thread.run.cancelled':\n case 'thread.run.failed':\n case 'thread.run.completed':\n case 'thread.run.expired':\n __classPrivateFieldSet(this, _AssistantStream_finalRun, event.data, \"f\");\n if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\")) {\n this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, \"f\"));\n __classPrivateFieldSet(this, _AssistantStream_currentToolCall, undefined, \"f\");\n }\n break;\n case 'thread.run.cancelling':\n break;\n }\n};\nfunction assertNever(_x) { }\n//# sourceMappingURL=AssistantStream.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport { isRequestOptions } from \"../../core.mjs\";\nimport { CursorPage } from \"../../pagination.mjs\";\nimport { AssistantStream } from \"../../lib/AssistantStream.mjs\";\nexport class Assistants extends APIResource {\n /**\n * Create an assistant with a model and instructions.\n *\n * @example\n * ```ts\n * const assistant = await client.beta.assistants.create({\n * model: 'gpt-4o',\n * });\n * ```\n */\n create(body, options) {\n return this._client.post('/assistants', {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Retrieves an assistant.\n *\n * @example\n * ```ts\n * const assistant = await client.beta.assistants.retrieve(\n * 'assistant_id',\n * );\n * ```\n */\n retrieve(assistantId, options) {\n return this._client.get(`/assistants/${assistantId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Modifies an assistant.\n *\n * @example\n * ```ts\n * const assistant = await client.beta.assistants.update(\n * 'assistant_id',\n * );\n * ```\n */\n update(assistantId, body, options) {\n return this._client.post(`/assistants/${assistantId}`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/assistants', AssistantsPage, {\n query,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Delete an assistant.\n *\n * @example\n * ```ts\n * const assistantDeleted = await client.beta.assistants.del(\n * 'assistant_id',\n * );\n * ```\n */\n del(assistantId, options) {\n return this._client.delete(`/assistants/${assistantId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n}\nexport class AssistantsPage extends CursorPage {\n}\nAssistants.AssistantsPage = AssistantsPage;\n//# sourceMappingURL=assistants.mjs.map","export function isRunnableFunctionWithParse(fn) {\n return typeof fn.parse === 'function';\n}\n/**\n * This is helper class for passing a `function` and `parse` where the `function`\n * argument type matches the `parse` return type.\n *\n * @deprecated - please use ParsingToolFunction instead.\n */\nexport class ParsingFunction {\n constructor(input) {\n this.function = input.function;\n this.parse = input.parse;\n this.parameters = input.parameters;\n this.description = input.description;\n this.name = input.name;\n }\n}\n/**\n * This is helper class for passing a `function` and `parse` where the `function`\n * argument type matches the `parse` return type.\n */\nexport class ParsingToolFunction {\n constructor(input) {\n this.type = 'function';\n this.function = input;\n }\n}\n//# sourceMappingURL=RunnableFunction.mjs.map","export const isAssistantMessage = (message) => {\n return message?.role === 'assistant';\n};\nexport const isFunctionMessage = (message) => {\n return message?.role === 'function';\n};\nexport const isToolMessage = (message) => {\n return message?.role === 'tool';\n};\nexport function isPresent(obj) {\n return obj != null;\n}\n//# sourceMappingURL=chatCompletionUtils.mjs.map","import { ContentFilterFinishReasonError, LengthFinishReasonError, OpenAIError } from \"../error.mjs\";\nexport function makeParseableResponseFormat(response_format, parser) {\n const obj = { ...response_format };\n Object.defineProperties(obj, {\n $brand: {\n value: 'auto-parseable-response-format',\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n });\n return obj;\n}\nexport function makeParseableTextFormat(response_format, parser) {\n const obj = { ...response_format };\n Object.defineProperties(obj, {\n $brand: {\n value: 'auto-parseable-response-format',\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n });\n return obj;\n}\nexport function isAutoParsableResponseFormat(response_format) {\n return response_format?.['$brand'] === 'auto-parseable-response-format';\n}\nexport function makeParseableTool(tool, { parser, callback, }) {\n const obj = { ...tool };\n Object.defineProperties(obj, {\n $brand: {\n value: 'auto-parseable-tool',\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n $callback: {\n value: callback,\n enumerable: false,\n },\n });\n return obj;\n}\nexport function isAutoParsableTool(tool) {\n return tool?.['$brand'] === 'auto-parseable-tool';\n}\nexport function maybeParseChatCompletion(completion, params) {\n if (!params || !hasAutoParseableInput(params)) {\n return {\n ...completion,\n choices: completion.choices.map((choice) => ({\n ...choice,\n message: {\n ...choice.message,\n parsed: null,\n ...(choice.message.tool_calls ?\n {\n tool_calls: choice.message.tool_calls,\n }\n : undefined),\n },\n })),\n };\n }\n return parseChatCompletion(completion, params);\n}\nexport function parseChatCompletion(completion, params) {\n const choices = completion.choices.map((choice) => {\n if (choice.finish_reason === 'length') {\n throw new LengthFinishReasonError();\n }\n if (choice.finish_reason === 'content_filter') {\n throw new ContentFilterFinishReasonError();\n }\n return {\n ...choice,\n message: {\n ...choice.message,\n ...(choice.message.tool_calls ?\n {\n tool_calls: choice.message.tool_calls?.map((toolCall) => parseToolCall(params, toolCall)) ?? undefined,\n }\n : undefined),\n parsed: choice.message.content && !choice.message.refusal ?\n parseResponseFormat(params, choice.message.content)\n : null,\n },\n };\n });\n return { ...completion, choices };\n}\nfunction parseResponseFormat(params, content) {\n if (params.response_format?.type !== 'json_schema') {\n return null;\n }\n if (params.response_format?.type === 'json_schema') {\n if ('$parseRaw' in params.response_format) {\n const response_format = params.response_format;\n return response_format.$parseRaw(content);\n }\n return JSON.parse(content);\n }\n return null;\n}\nfunction parseToolCall(params, toolCall) {\n const inputTool = params.tools?.find((inputTool) => inputTool.function?.name === toolCall.function.name);\n return {\n ...toolCall,\n function: {\n ...toolCall.function,\n parsed_arguments: isAutoParsableTool(inputTool) ? inputTool.$parseRaw(toolCall.function.arguments)\n : inputTool?.function.strict ? JSON.parse(toolCall.function.arguments)\n : null,\n },\n };\n}\nexport function shouldParseToolCall(params, toolCall) {\n if (!params) {\n return false;\n }\n const inputTool = params.tools?.find((inputTool) => inputTool.function?.name === toolCall.function.name);\n return isAutoParsableTool(inputTool) || inputTool?.function.strict || false;\n}\nexport function hasAutoParseableInput(params) {\n if (isAutoParsableResponseFormat(params.response_format)) {\n return true;\n }\n return (params.tools?.some((t) => isAutoParsableTool(t) || (t.type === 'function' && t.function.strict === true)) ?? false);\n}\nexport function validateInputTools(tools) {\n for (const tool of tools ?? []) {\n if (tool.type !== 'function') {\n throw new OpenAIError(`Currently only \\`function\\` tool types support auto-parsing; Received \\`${tool.type}\\``);\n }\n if (tool.function.strict !== true) {\n throw new OpenAIError(`The \\`${tool.function.name}\\` tool is not marked with \\`strict: true\\`. Only strict function tools can be auto-parsed`);\n }\n }\n}\n//# sourceMappingURL=parser.mjs.map","var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _AbstractChatCompletionRunner_instances, _AbstractChatCompletionRunner_getFinalContent, _AbstractChatCompletionRunner_getFinalMessage, _AbstractChatCompletionRunner_getFinalFunctionCall, _AbstractChatCompletionRunner_getFinalFunctionCallResult, _AbstractChatCompletionRunner_calculateTotalUsage, _AbstractChatCompletionRunner_validateParams, _AbstractChatCompletionRunner_stringifyFunctionCallResult;\nimport { OpenAIError } from \"../error.mjs\";\nimport { isRunnableFunctionWithParse, } from \"./RunnableFunction.mjs\";\nimport { isAssistantMessage, isFunctionMessage, isToolMessage } from \"./chatCompletionUtils.mjs\";\nimport { EventStream } from \"./EventStream.mjs\";\nimport { isAutoParsableTool, parseChatCompletion } from \"../lib/parser.mjs\";\nconst DEFAULT_MAX_CHAT_COMPLETIONS = 10;\nexport class AbstractChatCompletionRunner extends EventStream {\n constructor() {\n super(...arguments);\n _AbstractChatCompletionRunner_instances.add(this);\n this._chatCompletions = [];\n this.messages = [];\n }\n _addChatCompletion(chatCompletion) {\n this._chatCompletions.push(chatCompletion);\n this._emit('chatCompletion', chatCompletion);\n const message = chatCompletion.choices[0]?.message;\n if (message)\n this._addMessage(message);\n return chatCompletion;\n }\n _addMessage(message, emit = true) {\n if (!('content' in message))\n message.content = null;\n this.messages.push(message);\n if (emit) {\n this._emit('message', message);\n if ((isFunctionMessage(message) || isToolMessage(message)) && message.content) {\n // Note, this assumes that {role: 'tool', content: …} is always the result of a call of tool of type=function.\n this._emit('functionCallResult', message.content);\n }\n else if (isAssistantMessage(message) && message.function_call) {\n this._emit('functionCall', message.function_call);\n }\n else if (isAssistantMessage(message) && message.tool_calls) {\n for (const tool_call of message.tool_calls) {\n if (tool_call.type === 'function') {\n this._emit('functionCall', tool_call.function);\n }\n }\n }\n }\n }\n /**\n * @returns a promise that resolves with the final ChatCompletion, or rejects\n * if an error occurred or the stream ended prematurely without producing a ChatCompletion.\n */\n async finalChatCompletion() {\n await this.done();\n const completion = this._chatCompletions[this._chatCompletions.length - 1];\n if (!completion)\n throw new OpenAIError('stream ended without producing a ChatCompletion');\n return completion;\n }\n /**\n * @returns a promise that resolves with the content of the final ChatCompletionMessage, or rejects\n * if an error occurred or the stream ended prematurely without producing a ChatCompletionMessage.\n */\n async finalContent() {\n await this.done();\n return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalContent).call(this);\n }\n /**\n * @returns a promise that resolves with the the final assistant ChatCompletionMessage response,\n * or rejects if an error occurred or the stream ended prematurely without producing a ChatCompletionMessage.\n */\n async finalMessage() {\n await this.done();\n return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalMessage).call(this);\n }\n /**\n * @returns a promise that resolves with the content of the final FunctionCall, or rejects\n * if an error occurred or the stream ended prematurely without producing a ChatCompletionMessage.\n */\n async finalFunctionCall() {\n await this.done();\n return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalFunctionCall).call(this);\n }\n async finalFunctionCallResult() {\n await this.done();\n return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalFunctionCallResult).call(this);\n }\n async totalUsage() {\n await this.done();\n return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_calculateTotalUsage).call(this);\n }\n allChatCompletions() {\n return [...this._chatCompletions];\n }\n _emitFinal() {\n const completion = this._chatCompletions[this._chatCompletions.length - 1];\n if (completion)\n this._emit('finalChatCompletion', completion);\n const finalMessage = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalMessage).call(this);\n if (finalMessage)\n this._emit('finalMessage', finalMessage);\n const finalContent = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalContent).call(this);\n if (finalContent)\n this._emit('finalContent', finalContent);\n const finalFunctionCall = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalFunctionCall).call(this);\n if (finalFunctionCall)\n this._emit('finalFunctionCall', finalFunctionCall);\n const finalFunctionCallResult = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalFunctionCallResult).call(this);\n if (finalFunctionCallResult != null)\n this._emit('finalFunctionCallResult', finalFunctionCallResult);\n if (this._chatCompletions.some((c) => c.usage)) {\n this._emit('totalUsage', __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_calculateTotalUsage).call(this));\n }\n }\n async _createChatCompletion(client, params, options) {\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_validateParams).call(this, params);\n const chatCompletion = await client.chat.completions.create({ ...params, stream: false }, { ...options, signal: this.controller.signal });\n this._connected();\n return this._addChatCompletion(parseChatCompletion(chatCompletion, params));\n }\n async _runChatCompletion(client, params, options) {\n for (const message of params.messages) {\n this._addMessage(message, false);\n }\n return await this._createChatCompletion(client, params, options);\n }\n async _runFunctions(client, params, options) {\n const role = 'function';\n const { function_call = 'auto', stream, ...restParams } = params;\n const singleFunctionToCall = typeof function_call !== 'string' && function_call?.name;\n const { maxChatCompletions = DEFAULT_MAX_CHAT_COMPLETIONS } = options || {};\n const functionsByName = {};\n for (const f of params.functions) {\n functionsByName[f.name || f.function.name] = f;\n }\n const functions = params.functions.map((f) => ({\n name: f.name || f.function.name,\n parameters: f.parameters,\n description: f.description,\n }));\n for (const message of params.messages) {\n this._addMessage(message, false);\n }\n for (let i = 0; i < maxChatCompletions; ++i) {\n const chatCompletion = await this._createChatCompletion(client, {\n ...restParams,\n function_call,\n functions,\n messages: [...this.messages],\n }, options);\n const message = chatCompletion.choices[0]?.message;\n if (!message) {\n throw new OpenAIError(`missing message in ChatCompletion response`);\n }\n if (!message.function_call)\n return;\n const { name, arguments: args } = message.function_call;\n const fn = functionsByName[name];\n if (!fn) {\n const content = `Invalid function_call: ${JSON.stringify(name)}. Available options are: ${functions\n .map((f) => JSON.stringify(f.name))\n .join(', ')}. Please try again`;\n this._addMessage({ role, name, content });\n continue;\n }\n else if (singleFunctionToCall && singleFunctionToCall !== name) {\n const content = `Invalid function_call: ${JSON.stringify(name)}. ${JSON.stringify(singleFunctionToCall)} requested. Please try again`;\n this._addMessage({ role, name, content });\n continue;\n }\n let parsed;\n try {\n parsed = isRunnableFunctionWithParse(fn) ? await fn.parse(args) : args;\n }\n catch (error) {\n this._addMessage({\n role,\n name,\n content: error instanceof Error ? error.message : String(error),\n });\n continue;\n }\n // @ts-expect-error it can't rule out `never` type.\n const rawContent = await fn.function(parsed, this);\n const content = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_stringifyFunctionCallResult).call(this, rawContent);\n this._addMessage({ role, name, content });\n if (singleFunctionToCall)\n return;\n }\n }\n async _runTools(client, params, options) {\n const role = 'tool';\n const { tool_choice = 'auto', stream, ...restParams } = params;\n const singleFunctionToCall = typeof tool_choice !== 'string' && tool_choice?.function?.name;\n const { maxChatCompletions = DEFAULT_MAX_CHAT_COMPLETIONS } = options || {};\n // TODO(someday): clean this logic up\n const inputTools = params.tools.map((tool) => {\n if (isAutoParsableTool(tool)) {\n if (!tool.$callback) {\n throw new OpenAIError('Tool given to `.runTools()` that does not have an associated function');\n }\n return {\n type: 'function',\n function: {\n function: tool.$callback,\n name: tool.function.name,\n description: tool.function.description || '',\n parameters: tool.function.parameters,\n parse: tool.$parseRaw,\n strict: true,\n },\n };\n }\n return tool;\n });\n const functionsByName = {};\n for (const f of inputTools) {\n if (f.type === 'function') {\n functionsByName[f.function.name || f.function.function.name] = f.function;\n }\n }\n const tools = 'tools' in params ?\n inputTools.map((t) => t.type === 'function' ?\n {\n type: 'function',\n function: {\n name: t.function.name || t.function.function.name,\n parameters: t.function.parameters,\n description: t.function.description,\n strict: t.function.strict,\n },\n }\n : t)\n : undefined;\n for (const message of params.messages) {\n this._addMessage(message, false);\n }\n for (let i = 0; i < maxChatCompletions; ++i) {\n const chatCompletion = await this._createChatCompletion(client, {\n ...restParams,\n tool_choice,\n tools,\n messages: [...this.messages],\n }, options);\n const message = chatCompletion.choices[0]?.message;\n if (!message) {\n throw new OpenAIError(`missing message in ChatCompletion response`);\n }\n if (!message.tool_calls?.length) {\n return;\n }\n for (const tool_call of message.tool_calls) {\n if (tool_call.type !== 'function')\n continue;\n const tool_call_id = tool_call.id;\n const { name, arguments: args } = tool_call.function;\n const fn = functionsByName[name];\n if (!fn) {\n const content = `Invalid tool_call: ${JSON.stringify(name)}. Available options are: ${Object.keys(functionsByName)\n .map((name) => JSON.stringify(name))\n .join(', ')}. Please try again`;\n this._addMessage({ role, tool_call_id, content });\n continue;\n }\n else if (singleFunctionToCall && singleFunctionToCall !== name) {\n const content = `Invalid tool_call: ${JSON.stringify(name)}. ${JSON.stringify(singleFunctionToCall)} requested. Please try again`;\n this._addMessage({ role, tool_call_id, content });\n continue;\n }\n let parsed;\n try {\n parsed = isRunnableFunctionWithParse(fn) ? await fn.parse(args) : args;\n }\n catch (error) {\n const content = error instanceof Error ? error.message : String(error);\n this._addMessage({ role, tool_call_id, content });\n continue;\n }\n // @ts-expect-error it can't rule out `never` type.\n const rawContent = await fn.function(parsed, this);\n const content = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_stringifyFunctionCallResult).call(this, rawContent);\n this._addMessage({ role, tool_call_id, content });\n if (singleFunctionToCall) {\n return;\n }\n }\n }\n return;\n }\n}\n_AbstractChatCompletionRunner_instances = new WeakSet(), _AbstractChatCompletionRunner_getFinalContent = function _AbstractChatCompletionRunner_getFinalContent() {\n return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, \"m\", _AbstractChatCompletionRunner_getFinalMessage).call(this).content ?? null;\n}, _AbstractChatCompletionRunner_getFinalMessage = function _AbstractChatCompletionRunner_getFinalMessage() {\n let i = this.messages.length;\n while (i-- > 0) {\n const message = this.messages[i];\n if (isAssistantMessage(message)) {\n const { function_call, ...rest } = message;\n // TODO: support audio here\n const ret = {\n ...rest,\n content: message.content ?? null,\n refusal: message.refusal ?? null,\n };\n if (function_call) {\n ret.function_call = function_call;\n }\n return ret;\n }\n }\n throw new OpenAIError('stream ended without producing a ChatCompletionMessage with role=assistant');\n}, _AbstractChatCompletionRunner_getFinalFunctionCall = function _AbstractChatCompletionRunner_getFinalFunctionCall() {\n for (let i = this.messages.length - 1; i >= 0; i--) {\n const message = this.messages[i];\n if (isAssistantMessage(message) && message?.function_call) {\n return message.function_call;\n }\n if (isAssistantMessage(message) && message?.tool_calls?.length) {\n return message.tool_calls.at(-1)?.function;\n }\n }\n return;\n}, _AbstractChatCompletionRunner_getFinalFunctionCallResult = function _AbstractChatCompletionRunner_getFinalFunctionCallResult() {\n for (let i = this.messages.length - 1; i >= 0; i--) {\n const message = this.messages[i];\n if (isFunctionMessage(message) && message.content != null) {\n return message.content;\n }\n if (isToolMessage(message) &&\n message.content != null &&\n typeof message.content === 'string' &&\n this.messages.some((x) => x.role === 'assistant' &&\n x.tool_calls?.some((y) => y.type === 'function' && y.id === message.tool_call_id))) {\n return message.content;\n }\n }\n return;\n}, _AbstractChatCompletionRunner_calculateTotalUsage = function _AbstractChatCompletionRunner_calculateTotalUsage() {\n const total = {\n completion_tokens: 0,\n prompt_tokens: 0,\n total_tokens: 0,\n };\n for (const { usage } of this._chatCompletions) {\n if (usage) {\n total.completion_tokens += usage.completion_tokens;\n total.prompt_tokens += usage.prompt_tokens;\n total.total_tokens += usage.total_tokens;\n }\n }\n return total;\n}, _AbstractChatCompletionRunner_validateParams = function _AbstractChatCompletionRunner_validateParams(params) {\n if (params.n != null && params.n > 1) {\n throw new OpenAIError('ChatCompletion convenience helpers only support n=1 at this time. To use n>1, please use chat.completions.create() directly.');\n }\n}, _AbstractChatCompletionRunner_stringifyFunctionCallResult = function _AbstractChatCompletionRunner_stringifyFunctionCallResult(rawContent) {\n return (typeof rawContent === 'string' ? rawContent\n : rawContent === undefined ? 'undefined'\n : JSON.stringify(rawContent));\n};\n//# sourceMappingURL=AbstractChatCompletionRunner.mjs.map","import { AbstractChatCompletionRunner, } from \"./AbstractChatCompletionRunner.mjs\";\nimport { isAssistantMessage } from \"./chatCompletionUtils.mjs\";\nexport class ChatCompletionRunner extends AbstractChatCompletionRunner {\n /** @deprecated - please use `runTools` instead. */\n static runFunctions(client, params, options) {\n const runner = new ChatCompletionRunner();\n const opts = {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runFunctions' },\n };\n runner._run(() => runner._runFunctions(client, params, opts));\n return runner;\n }\n static runTools(client, params, options) {\n const runner = new ChatCompletionRunner();\n const opts = {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runTools' },\n };\n runner._run(() => runner._runTools(client, params, opts));\n return runner;\n }\n _addMessage(message, emit = true) {\n super._addMessage(message, emit);\n if (isAssistantMessage(message) && message.content) {\n this._emit('content', message.content);\n }\n }\n}\n//# sourceMappingURL=ChatCompletionRunner.mjs.map","const STR = 0b000000001;\nconst NUM = 0b000000010;\nconst ARR = 0b000000100;\nconst OBJ = 0b000001000;\nconst NULL = 0b000010000;\nconst BOOL = 0b000100000;\nconst NAN = 0b001000000;\nconst INFINITY = 0b010000000;\nconst MINUS_INFINITY = 0b100000000;\nconst INF = INFINITY | MINUS_INFINITY;\nconst SPECIAL = NULL | BOOL | INF | NAN;\nconst ATOM = STR | NUM | SPECIAL;\nconst COLLECTION = ARR | OBJ;\nconst ALL = ATOM | COLLECTION;\nconst Allow = {\n STR,\n NUM,\n ARR,\n OBJ,\n NULL,\n BOOL,\n NAN,\n INFINITY,\n MINUS_INFINITY,\n INF,\n SPECIAL,\n ATOM,\n COLLECTION,\n ALL,\n};\n// The JSON string segment was unable to be parsed completely\nclass PartialJSON extends Error {\n}\nclass MalformedJSON extends Error {\n}\n/**\n * Parse incomplete JSON\n * @param {string} jsonString Partial JSON to be parsed\n * @param {number} allowPartial Specify what types are allowed to be partial, see {@link Allow} for details\n * @returns The parsed JSON\n * @throws {PartialJSON} If the JSON is incomplete (related to the `allow` parameter)\n * @throws {MalformedJSON} If the JSON is malformed\n */\nfunction parseJSON(jsonString, allowPartial = Allow.ALL) {\n if (typeof jsonString !== 'string') {\n throw new TypeError(`expecting str, got ${typeof jsonString}`);\n }\n if (!jsonString.trim()) {\n throw new Error(`${jsonString} is empty`);\n }\n return _parseJSON(jsonString.trim(), allowPartial);\n}\nconst _parseJSON = (jsonString, allow) => {\n const length = jsonString.length;\n let index = 0;\n const markPartialJSON = (msg) => {\n throw new PartialJSON(`${msg} at position ${index}`);\n };\n const throwMalformedError = (msg) => {\n throw new MalformedJSON(`${msg} at position ${index}`);\n };\n const parseAny = () => {\n skipBlank();\n if (index >= length)\n markPartialJSON('Unexpected end of input');\n if (jsonString[index] === '\"')\n return parseStr();\n if (jsonString[index] === '{')\n return parseObj();\n if (jsonString[index] === '[')\n return parseArr();\n if (jsonString.substring(index, index + 4) === 'null' ||\n (Allow.NULL & allow && length - index < 4 && 'null'.startsWith(jsonString.substring(index)))) {\n index += 4;\n return null;\n }\n if (jsonString.substring(index, index + 4) === 'true' ||\n (Allow.BOOL & allow && length - index < 4 && 'true'.startsWith(jsonString.substring(index)))) {\n index += 4;\n return true;\n }\n if (jsonString.substring(index, index + 5) === 'false' ||\n (Allow.BOOL & allow && length - index < 5 && 'false'.startsWith(jsonString.substring(index)))) {\n index += 5;\n return false;\n }\n if (jsonString.substring(index, index + 8) === 'Infinity' ||\n (Allow.INFINITY & allow && length - index < 8 && 'Infinity'.startsWith(jsonString.substring(index)))) {\n index += 8;\n return Infinity;\n }\n if (jsonString.substring(index, index + 9) === '-Infinity' ||\n (Allow.MINUS_INFINITY & allow &&\n 1 < length - index &&\n length - index < 9 &&\n '-Infinity'.startsWith(jsonString.substring(index)))) {\n index += 9;\n return -Infinity;\n }\n if (jsonString.substring(index, index + 3) === 'NaN' ||\n (Allow.NAN & allow && length - index < 3 && 'NaN'.startsWith(jsonString.substring(index)))) {\n index += 3;\n return NaN;\n }\n return parseNum();\n };\n const parseStr = () => {\n const start = index;\n let escape = false;\n index++; // skip initial quote\n while (index < length && (jsonString[index] !== '\"' || (escape && jsonString[index - 1] === '\\\\'))) {\n escape = jsonString[index] === '\\\\' ? !escape : false;\n index++;\n }\n if (jsonString.charAt(index) == '\"') {\n try {\n return JSON.parse(jsonString.substring(start, ++index - Number(escape)));\n }\n catch (e) {\n throwMalformedError(String(e));\n }\n }\n else if (Allow.STR & allow) {\n try {\n return JSON.parse(jsonString.substring(start, index - Number(escape)) + '\"');\n }\n catch (e) {\n // SyntaxError: Invalid escape sequence\n return JSON.parse(jsonString.substring(start, jsonString.lastIndexOf('\\\\')) + '\"');\n }\n }\n markPartialJSON('Unterminated string literal');\n };\n const parseObj = () => {\n index++; // skip initial brace\n skipBlank();\n const obj = {};\n try {\n while (jsonString[index] !== '}') {\n skipBlank();\n if (index >= length && Allow.OBJ & allow)\n return obj;\n const key = parseStr();\n skipBlank();\n index++; // skip colon\n try {\n const value = parseAny();\n Object.defineProperty(obj, key, { value, writable: true, enumerable: true, configurable: true });\n }\n catch (e) {\n if (Allow.OBJ & allow)\n return obj;\n else\n throw e;\n }\n skipBlank();\n if (jsonString[index] === ',')\n index++; // skip comma\n }\n }\n catch (e) {\n if (Allow.OBJ & allow)\n return obj;\n else\n markPartialJSON(\"Expected '}' at end of object\");\n }\n index++; // skip final brace\n return obj;\n };\n const parseArr = () => {\n index++; // skip initial bracket\n const arr = [];\n try {\n while (jsonString[index] !== ']') {\n arr.push(parseAny());\n skipBlank();\n if (jsonString[index] === ',') {\n index++; // skip comma\n }\n }\n }\n catch (e) {\n if (Allow.ARR & allow) {\n return arr;\n }\n markPartialJSON(\"Expected ']' at end of array\");\n }\n index++; // skip final bracket\n return arr;\n };\n const parseNum = () => {\n if (index === 0) {\n if (jsonString === '-' && Allow.NUM & allow)\n markPartialJSON(\"Not sure what '-' is\");\n try {\n return JSON.parse(jsonString);\n }\n catch (e) {\n if (Allow.NUM & allow) {\n try {\n if ('.' === jsonString[jsonString.length - 1])\n return JSON.parse(jsonString.substring(0, jsonString.lastIndexOf('.')));\n return JSON.parse(jsonString.substring(0, jsonString.lastIndexOf('e')));\n }\n catch (e) { }\n }\n throwMalformedError(String(e));\n }\n }\n const start = index;\n if (jsonString[index] === '-')\n index++;\n while (jsonString[index] && !',]}'.includes(jsonString[index]))\n index++;\n if (index == length && !(Allow.NUM & allow))\n markPartialJSON('Unterminated number literal');\n try {\n return JSON.parse(jsonString.substring(start, index));\n }\n catch (e) {\n if (jsonString.substring(start, index) === '-' && Allow.NUM & allow)\n markPartialJSON(\"Not sure what '-' is\");\n try {\n return JSON.parse(jsonString.substring(start, jsonString.lastIndexOf('e')));\n }\n catch (e) {\n throwMalformedError(String(e));\n }\n }\n };\n const skipBlank = () => {\n while (index < length && ' \\n\\r\\t'.includes(jsonString[index])) {\n index++;\n }\n };\n return parseAny();\n};\n// using this function with malformed JSON is undefined behavior\nconst partialParse = (input) => parseJSON(input, Allow.ALL ^ Allow.NUM);\nexport { partialParse, PartialJSON, MalformedJSON };\n//# sourceMappingURL=parser.mjs.map","var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _ChatCompletionStream_instances, _ChatCompletionStream_params, _ChatCompletionStream_choiceEventStates, _ChatCompletionStream_currentChatCompletionSnapshot, _ChatCompletionStream_beginRequest, _ChatCompletionStream_getChoiceEventState, _ChatCompletionStream_addChunk, _ChatCompletionStream_emitToolCallDoneEvent, _ChatCompletionStream_emitContentDoneEvents, _ChatCompletionStream_endRequest, _ChatCompletionStream_getAutoParseableResponseFormat, _ChatCompletionStream_accumulateChatCompletion;\nimport { OpenAIError, APIUserAbortError, LengthFinishReasonError, ContentFilterFinishReasonError, } from \"../error.mjs\";\nimport { AbstractChatCompletionRunner, } from \"./AbstractChatCompletionRunner.mjs\";\nimport { Stream } from \"../streaming.mjs\";\nimport { hasAutoParseableInput, isAutoParsableResponseFormat, isAutoParsableTool, maybeParseChatCompletion, shouldParseToolCall, } from \"../lib/parser.mjs\";\nimport { partialParse } from \"../_vendor/partial-json-parser/parser.mjs\";\nexport class ChatCompletionStream extends AbstractChatCompletionRunner {\n constructor(params) {\n super();\n _ChatCompletionStream_instances.add(this);\n _ChatCompletionStream_params.set(this, void 0);\n _ChatCompletionStream_choiceEventStates.set(this, void 0);\n _ChatCompletionStream_currentChatCompletionSnapshot.set(this, void 0);\n __classPrivateFieldSet(this, _ChatCompletionStream_params, params, \"f\");\n __classPrivateFieldSet(this, _ChatCompletionStream_choiceEventStates, [], \"f\");\n }\n get currentChatCompletionSnapshot() {\n return __classPrivateFieldGet(this, _ChatCompletionStream_currentChatCompletionSnapshot, \"f\");\n }\n /**\n * Intended for use on the frontend, consuming a stream produced with\n * `.toReadableStream()` on the backend.\n *\n * Note that messages sent to the model do not appear in `.on('message')`\n * in this context.\n */\n static fromReadableStream(stream) {\n const runner = new ChatCompletionStream(null);\n runner._run(() => runner._fromReadableStream(stream));\n return runner;\n }\n static createChatCompletion(client, params, options) {\n const runner = new ChatCompletionStream(params);\n runner._run(() => runner._runChatCompletion(client, { ...params, stream: true }, { ...options, headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' } }));\n return runner;\n }\n async _createChatCompletion(client, params, options) {\n super._createChatCompletion;\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_beginRequest).call(this);\n const stream = await client.chat.completions.create({ ...params, stream: true }, { ...options, signal: this.controller.signal });\n this._connected();\n for await (const chunk of stream) {\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_addChunk).call(this, chunk);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this._addChatCompletion(__classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_endRequest).call(this));\n }\n async _fromReadableStream(readableStream, options) {\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_beginRequest).call(this);\n this._connected();\n const stream = Stream.fromReadableStream(readableStream, this.controller);\n let chatId;\n for await (const chunk of stream) {\n if (chatId && chatId !== chunk.id) {\n // A new request has been made.\n this._addChatCompletion(__classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_endRequest).call(this));\n }\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_addChunk).call(this, chunk);\n chatId = chunk.id;\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return this._addChatCompletion(__classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_endRequest).call(this));\n }\n [(_ChatCompletionStream_params = new WeakMap(), _ChatCompletionStream_choiceEventStates = new WeakMap(), _ChatCompletionStream_currentChatCompletionSnapshot = new WeakMap(), _ChatCompletionStream_instances = new WeakSet(), _ChatCompletionStream_beginRequest = function _ChatCompletionStream_beginRequest() {\n if (this.ended)\n return;\n __classPrivateFieldSet(this, _ChatCompletionStream_currentChatCompletionSnapshot, undefined, \"f\");\n }, _ChatCompletionStream_getChoiceEventState = function _ChatCompletionStream_getChoiceEventState(choice) {\n let state = __classPrivateFieldGet(this, _ChatCompletionStream_choiceEventStates, \"f\")[choice.index];\n if (state) {\n return state;\n }\n state = {\n content_done: false,\n refusal_done: false,\n logprobs_content_done: false,\n logprobs_refusal_done: false,\n done_tool_calls: new Set(),\n current_tool_call_index: null,\n };\n __classPrivateFieldGet(this, _ChatCompletionStream_choiceEventStates, \"f\")[choice.index] = state;\n return state;\n }, _ChatCompletionStream_addChunk = function _ChatCompletionStream_addChunk(chunk) {\n if (this.ended)\n return;\n const completion = __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_accumulateChatCompletion).call(this, chunk);\n this._emit('chunk', chunk, completion);\n for (const choice of chunk.choices) {\n const choiceSnapshot = completion.choices[choice.index];\n if (choice.delta.content != null &&\n choiceSnapshot.message?.role === 'assistant' &&\n choiceSnapshot.message?.content) {\n this._emit('content', choice.delta.content, choiceSnapshot.message.content);\n this._emit('content.delta', {\n delta: choice.delta.content,\n snapshot: choiceSnapshot.message.content,\n parsed: choiceSnapshot.message.parsed,\n });\n }\n if (choice.delta.refusal != null &&\n choiceSnapshot.message?.role === 'assistant' &&\n choiceSnapshot.message?.refusal) {\n this._emit('refusal.delta', {\n delta: choice.delta.refusal,\n snapshot: choiceSnapshot.message.refusal,\n });\n }\n if (choice.logprobs?.content != null && choiceSnapshot.message?.role === 'assistant') {\n this._emit('logprobs.content.delta', {\n content: choice.logprobs?.content,\n snapshot: choiceSnapshot.logprobs?.content ?? [],\n });\n }\n if (choice.logprobs?.refusal != null && choiceSnapshot.message?.role === 'assistant') {\n this._emit('logprobs.refusal.delta', {\n refusal: choice.logprobs?.refusal,\n snapshot: choiceSnapshot.logprobs?.refusal ?? [],\n });\n }\n const state = __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_getChoiceEventState).call(this, choiceSnapshot);\n if (choiceSnapshot.finish_reason) {\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_emitContentDoneEvents).call(this, choiceSnapshot);\n if (state.current_tool_call_index != null) {\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_emitToolCallDoneEvent).call(this, choiceSnapshot, state.current_tool_call_index);\n }\n }\n for (const toolCall of choice.delta.tool_calls ?? []) {\n if (state.current_tool_call_index !== toolCall.index) {\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_emitContentDoneEvents).call(this, choiceSnapshot);\n // new tool call started, the previous one is done\n if (state.current_tool_call_index != null) {\n __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_emitToolCallDoneEvent).call(this, choiceSnapshot, state.current_tool_call_index);\n }\n }\n state.current_tool_call_index = toolCall.index;\n }\n for (const toolCallDelta of choice.delta.tool_calls ?? []) {\n const toolCallSnapshot = choiceSnapshot.message.tool_calls?.[toolCallDelta.index];\n if (!toolCallSnapshot?.type) {\n continue;\n }\n if (toolCallSnapshot?.type === 'function') {\n this._emit('tool_calls.function.arguments.delta', {\n name: toolCallSnapshot.function?.name,\n index: toolCallDelta.index,\n arguments: toolCallSnapshot.function.arguments,\n parsed_arguments: toolCallSnapshot.function.parsed_arguments,\n arguments_delta: toolCallDelta.function?.arguments ?? '',\n });\n }\n else {\n assertNever(toolCallSnapshot?.type);\n }\n }\n }\n }, _ChatCompletionStream_emitToolCallDoneEvent = function _ChatCompletionStream_emitToolCallDoneEvent(choiceSnapshot, toolCallIndex) {\n const state = __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_getChoiceEventState).call(this, choiceSnapshot);\n if (state.done_tool_calls.has(toolCallIndex)) {\n // we've already fired the done event\n return;\n }\n const toolCallSnapshot = choiceSnapshot.message.tool_calls?.[toolCallIndex];\n if (!toolCallSnapshot) {\n throw new Error('no tool call snapshot');\n }\n if (!toolCallSnapshot.type) {\n throw new Error('tool call snapshot missing `type`');\n }\n if (toolCallSnapshot.type === 'function') {\n const inputTool = __classPrivateFieldGet(this, _ChatCompletionStream_params, \"f\")?.tools?.find((tool) => tool.type === 'function' && tool.function.name === toolCallSnapshot.function.name);\n this._emit('tool_calls.function.arguments.done', {\n name: toolCallSnapshot.function.name,\n index: toolCallIndex,\n arguments: toolCallSnapshot.function.arguments,\n parsed_arguments: isAutoParsableTool(inputTool) ? inputTool.$parseRaw(toolCallSnapshot.function.arguments)\n : inputTool?.function.strict ? JSON.parse(toolCallSnapshot.function.arguments)\n : null,\n });\n }\n else {\n assertNever(toolCallSnapshot.type);\n }\n }, _ChatCompletionStream_emitContentDoneEvents = function _ChatCompletionStream_emitContentDoneEvents(choiceSnapshot) {\n const state = __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_getChoiceEventState).call(this, choiceSnapshot);\n if (choiceSnapshot.message.content && !state.content_done) {\n state.content_done = true;\n const responseFormat = __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_getAutoParseableResponseFormat).call(this);\n this._emit('content.done', {\n content: choiceSnapshot.message.content,\n parsed: responseFormat ? responseFormat.$parseRaw(choiceSnapshot.message.content) : null,\n });\n }\n if (choiceSnapshot.message.refusal && !state.refusal_done) {\n state.refusal_done = true;\n this._emit('refusal.done', { refusal: choiceSnapshot.message.refusal });\n }\n if (choiceSnapshot.logprobs?.content && !state.logprobs_content_done) {\n state.logprobs_content_done = true;\n this._emit('logprobs.content.done', { content: choiceSnapshot.logprobs.content });\n }\n if (choiceSnapshot.logprobs?.refusal && !state.logprobs_refusal_done) {\n state.logprobs_refusal_done = true;\n this._emit('logprobs.refusal.done', { refusal: choiceSnapshot.logprobs.refusal });\n }\n }, _ChatCompletionStream_endRequest = function _ChatCompletionStream_endRequest() {\n if (this.ended) {\n throw new OpenAIError(`stream has ended, this shouldn't happen`);\n }\n const snapshot = __classPrivateFieldGet(this, _ChatCompletionStream_currentChatCompletionSnapshot, \"f\");\n if (!snapshot) {\n throw new OpenAIError(`request ended without sending any chunks`);\n }\n __classPrivateFieldSet(this, _ChatCompletionStream_currentChatCompletionSnapshot, undefined, \"f\");\n __classPrivateFieldSet(this, _ChatCompletionStream_choiceEventStates, [], \"f\");\n return finalizeChatCompletion(snapshot, __classPrivateFieldGet(this, _ChatCompletionStream_params, \"f\"));\n }, _ChatCompletionStream_getAutoParseableResponseFormat = function _ChatCompletionStream_getAutoParseableResponseFormat() {\n const responseFormat = __classPrivateFieldGet(this, _ChatCompletionStream_params, \"f\")?.response_format;\n if (isAutoParsableResponseFormat(responseFormat)) {\n return responseFormat;\n }\n return null;\n }, _ChatCompletionStream_accumulateChatCompletion = function _ChatCompletionStream_accumulateChatCompletion(chunk) {\n var _a, _b, _c, _d;\n let snapshot = __classPrivateFieldGet(this, _ChatCompletionStream_currentChatCompletionSnapshot, \"f\");\n const { choices, ...rest } = chunk;\n if (!snapshot) {\n snapshot = __classPrivateFieldSet(this, _ChatCompletionStream_currentChatCompletionSnapshot, {\n ...rest,\n choices: [],\n }, \"f\");\n }\n else {\n Object.assign(snapshot, rest);\n }\n for (const { delta, finish_reason, index, logprobs = null, ...other } of chunk.choices) {\n let choice = snapshot.choices[index];\n if (!choice) {\n choice = snapshot.choices[index] = { finish_reason, index, message: {}, logprobs, ...other };\n }\n if (logprobs) {\n if (!choice.logprobs) {\n choice.logprobs = Object.assign({}, logprobs);\n }\n else {\n const { content, refusal, ...rest } = logprobs;\n assertIsEmpty(rest);\n Object.assign(choice.logprobs, rest);\n if (content) {\n (_a = choice.logprobs).content ?? (_a.content = []);\n choice.logprobs.content.push(...content);\n }\n if (refusal) {\n (_b = choice.logprobs).refusal ?? (_b.refusal = []);\n choice.logprobs.refusal.push(...refusal);\n }\n }\n }\n if (finish_reason) {\n choice.finish_reason = finish_reason;\n if (__classPrivateFieldGet(this, _ChatCompletionStream_params, \"f\") && hasAutoParseableInput(__classPrivateFieldGet(this, _ChatCompletionStream_params, \"f\"))) {\n if (finish_reason === 'length') {\n throw new LengthFinishReasonError();\n }\n if (finish_reason === 'content_filter') {\n throw new ContentFilterFinishReasonError();\n }\n }\n }\n Object.assign(choice, other);\n if (!delta)\n continue; // Shouldn't happen; just in case.\n const { content, refusal, function_call, role, tool_calls, ...rest } = delta;\n assertIsEmpty(rest);\n Object.assign(choice.message, rest);\n if (refusal) {\n choice.message.refusal = (choice.message.refusal || '') + refusal;\n }\n if (role)\n choice.message.role = role;\n if (function_call) {\n if (!choice.message.function_call) {\n choice.message.function_call = function_call;\n }\n else {\n if (function_call.name)\n choice.message.function_call.name = function_call.name;\n if (function_call.arguments) {\n (_c = choice.message.function_call).arguments ?? (_c.arguments = '');\n choice.message.function_call.arguments += function_call.arguments;\n }\n }\n }\n if (content) {\n choice.message.content = (choice.message.content || '') + content;\n if (!choice.message.refusal && __classPrivateFieldGet(this, _ChatCompletionStream_instances, \"m\", _ChatCompletionStream_getAutoParseableResponseFormat).call(this)) {\n choice.message.parsed = partialParse(choice.message.content);\n }\n }\n if (tool_calls) {\n if (!choice.message.tool_calls)\n choice.message.tool_calls = [];\n for (const { index, id, type, function: fn, ...rest } of tool_calls) {\n const tool_call = ((_d = choice.message.tool_calls)[index] ?? (_d[index] = {}));\n Object.assign(tool_call, rest);\n if (id)\n tool_call.id = id;\n if (type)\n tool_call.type = type;\n if (fn)\n tool_call.function ?? (tool_call.function = { name: fn.name ?? '', arguments: '' });\n if (fn?.name)\n tool_call.function.name = fn.name;\n if (fn?.arguments) {\n tool_call.function.arguments += fn.arguments;\n if (shouldParseToolCall(__classPrivateFieldGet(this, _ChatCompletionStream_params, \"f\"), tool_call)) {\n tool_call.function.parsed_arguments = partialParse(tool_call.function.arguments);\n }\n }\n }\n }\n }\n return snapshot;\n }, Symbol.asyncIterator)]() {\n const pushQueue = [];\n const readQueue = [];\n let done = false;\n this.on('chunk', (chunk) => {\n const reader = readQueue.shift();\n if (reader) {\n reader.resolve(chunk);\n }\n else {\n pushQueue.push(chunk);\n }\n });\n this.on('end', () => {\n done = true;\n for (const reader of readQueue) {\n reader.resolve(undefined);\n }\n readQueue.length = 0;\n });\n this.on('abort', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n this.on('error', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n return {\n next: async () => {\n if (!pushQueue.length) {\n if (done) {\n return { value: undefined, done: true };\n }\n return new Promise((resolve, reject) => readQueue.push({ resolve, reject })).then((chunk) => (chunk ? { value: chunk, done: false } : { value: undefined, done: true }));\n }\n const chunk = pushQueue.shift();\n return { value: chunk, done: false };\n },\n return: async () => {\n this.abort();\n return { value: undefined, done: true };\n },\n };\n }\n toReadableStream() {\n const stream = new Stream(this[Symbol.asyncIterator].bind(this), this.controller);\n return stream.toReadableStream();\n }\n}\nfunction finalizeChatCompletion(snapshot, params) {\n const { id, choices, created, model, system_fingerprint, ...rest } = snapshot;\n const completion = {\n ...rest,\n id,\n choices: choices.map(({ message, finish_reason, index, logprobs, ...choiceRest }) => {\n if (!finish_reason) {\n throw new OpenAIError(`missing finish_reason for choice ${index}`);\n }\n const { content = null, function_call, tool_calls, ...messageRest } = message;\n const role = message.role; // this is what we expect; in theory it could be different which would make our types a slight lie but would be fine.\n if (!role) {\n throw new OpenAIError(`missing role for choice ${index}`);\n }\n if (function_call) {\n const { arguments: args, name } = function_call;\n if (args == null) {\n throw new OpenAIError(`missing function_call.arguments for choice ${index}`);\n }\n if (!name) {\n throw new OpenAIError(`missing function_call.name for choice ${index}`);\n }\n return {\n ...choiceRest,\n message: {\n content,\n function_call: { arguments: args, name },\n role,\n refusal: message.refusal ?? null,\n },\n finish_reason,\n index,\n logprobs,\n };\n }\n if (tool_calls) {\n return {\n ...choiceRest,\n index,\n finish_reason,\n logprobs,\n message: {\n ...messageRest,\n role,\n content,\n refusal: message.refusal ?? null,\n tool_calls: tool_calls.map((tool_call, i) => {\n const { function: fn, type, id, ...toolRest } = tool_call;\n const { arguments: args, name, ...fnRest } = fn || {};\n if (id == null) {\n throw new OpenAIError(`missing choices[${index}].tool_calls[${i}].id\\n${str(snapshot)}`);\n }\n if (type == null) {\n throw new OpenAIError(`missing choices[${index}].tool_calls[${i}].type\\n${str(snapshot)}`);\n }\n if (name == null) {\n throw new OpenAIError(`missing choices[${index}].tool_calls[${i}].function.name\\n${str(snapshot)}`);\n }\n if (args == null) {\n throw new OpenAIError(`missing choices[${index}].tool_calls[${i}].function.arguments\\n${str(snapshot)}`);\n }\n return { ...toolRest, id, type, function: { ...fnRest, name, arguments: args } };\n }),\n },\n };\n }\n return {\n ...choiceRest,\n message: { ...messageRest, content, role, refusal: message.refusal ?? null },\n finish_reason,\n index,\n logprobs,\n };\n }),\n created,\n model,\n object: 'chat.completion',\n ...(system_fingerprint ? { system_fingerprint } : {}),\n };\n return maybeParseChatCompletion(completion, params);\n}\nfunction str(x) {\n return JSON.stringify(x);\n}\n/**\n * Ensures the given argument is an empty object, useful for\n * asserting that all known properties on an object have been\n * destructured.\n */\nfunction assertIsEmpty(obj) {\n return;\n}\nfunction assertNever(_x) { }\n//# sourceMappingURL=ChatCompletionStream.mjs.map","import { ChatCompletionStream } from \"./ChatCompletionStream.mjs\";\nexport class ChatCompletionStreamingRunner extends ChatCompletionStream {\n static fromReadableStream(stream) {\n const runner = new ChatCompletionStreamingRunner(null);\n runner._run(() => runner._fromReadableStream(stream));\n return runner;\n }\n /** @deprecated - please use `runTools` instead. */\n static runFunctions(client, params, options) {\n const runner = new ChatCompletionStreamingRunner(null);\n const opts = {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runFunctions' },\n };\n runner._run(() => runner._runFunctions(client, params, opts));\n return runner;\n }\n static runTools(client, params, options) {\n const runner = new ChatCompletionStreamingRunner(\n // @ts-expect-error TODO these types are incompatible\n params);\n const opts = {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runTools' },\n };\n runner._run(() => runner._runTools(client, params, opts));\n return runner;\n }\n}\n//# sourceMappingURL=ChatCompletionStreamingRunner.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { ChatCompletionRunner } from \"../../../lib/ChatCompletionRunner.mjs\";\nimport { ChatCompletionStreamingRunner, } from \"../../../lib/ChatCompletionStreamingRunner.mjs\";\nimport { ChatCompletionStream } from \"../../../lib/ChatCompletionStream.mjs\";\nimport { parseChatCompletion, validateInputTools } from \"../../../lib/parser.mjs\";\nexport { ChatCompletionStreamingRunner, } from \"../../../lib/ChatCompletionStreamingRunner.mjs\";\nexport { ParsingFunction, ParsingToolFunction, } from \"../../../lib/RunnableFunction.mjs\";\nexport { ChatCompletionStream } from \"../../../lib/ChatCompletionStream.mjs\";\nexport { ChatCompletionRunner, } from \"../../../lib/ChatCompletionRunner.mjs\";\nexport class Completions extends APIResource {\n parse(body, options) {\n validateInputTools(body.tools);\n return this._client.chat.completions\n .create(body, {\n ...options,\n headers: {\n ...options?.headers,\n 'X-Stainless-Helper-Method': 'beta.chat.completions.parse',\n },\n })\n ._thenUnwrap((completion) => parseChatCompletion(completion, body));\n }\n runFunctions(body, options) {\n if (body.stream) {\n return ChatCompletionStreamingRunner.runFunctions(this._client, body, options);\n }\n return ChatCompletionRunner.runFunctions(this._client, body, options);\n }\n runTools(body, options) {\n if (body.stream) {\n return ChatCompletionStreamingRunner.runTools(this._client, body, options);\n }\n return ChatCompletionRunner.runTools(this._client, body, options);\n }\n /**\n * Creates a chat completion stream\n */\n stream(body, options) {\n return ChatCompletionStream.createChatCompletion(this._client, body, options);\n }\n}\n//# sourceMappingURL=completions.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport * as CompletionsAPI from \"./completions.mjs\";\nexport class Chat extends APIResource {\n constructor() {\n super(...arguments);\n this.completions = new CompletionsAPI.Completions(this._client);\n }\n}\n(function (Chat) {\n Chat.Completions = CompletionsAPI.Completions;\n})(Chat || (Chat = {}));\n//# sourceMappingURL=chat.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nexport class Sessions extends APIResource {\n /**\n * Create an ephemeral API token for use in client-side applications with the\n * Realtime API. Can be configured with the same session parameters as the\n * `session.update` client event.\n *\n * It responds with a session object, plus a `client_secret` key which contains a\n * usable ephemeral API token that can be used to authenticate browser clients for\n * the Realtime API.\n *\n * @example\n * ```ts\n * const session =\n * await client.beta.realtime.sessions.create();\n * ```\n */\n create(body, options) {\n return this._client.post('/realtime/sessions', {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n}\n//# sourceMappingURL=sessions.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nexport class TranscriptionSessions extends APIResource {\n /**\n * Create an ephemeral API token for use in client-side applications with the\n * Realtime API specifically for realtime transcriptions. Can be configured with\n * the same session parameters as the `transcription_session.update` client event.\n *\n * It responds with a session object, plus a `client_secret` key which contains a\n * usable ephemeral API token that can be used to authenticate browser clients for\n * the Realtime API.\n *\n * @example\n * ```ts\n * const transcriptionSession =\n * await client.beta.realtime.transcriptionSessions.create();\n * ```\n */\n create(body, options) {\n return this._client.post('/realtime/transcription_sessions', {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n}\n//# sourceMappingURL=transcription-sessions.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport * as SessionsAPI from \"./sessions.mjs\";\nimport { Sessions, } from \"./sessions.mjs\";\nimport * as TranscriptionSessionsAPI from \"./transcription-sessions.mjs\";\nimport { TranscriptionSessions, } from \"./transcription-sessions.mjs\";\nexport class Realtime extends APIResource {\n constructor() {\n super(...arguments);\n this.sessions = new SessionsAPI.Sessions(this._client);\n this.transcriptionSessions = new TranscriptionSessionsAPI.TranscriptionSessions(this._client);\n }\n}\nRealtime.Sessions = Sessions;\nRealtime.TranscriptionSessions = TranscriptionSessions;\n//# sourceMappingURL=realtime.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport { CursorPage } from \"../../../pagination.mjs\";\n/**\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\nexport class Messages extends APIResource {\n /**\n * Create a message.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n create(threadId, body, options) {\n return this._client.post(`/threads/${threadId}/messages`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Retrieve a message.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n retrieve(threadId, messageId, options) {\n return this._client.get(`/threads/${threadId}/messages/${messageId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Modifies a message.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n update(threadId, messageId, body, options) {\n return this._client.post(`/threads/${threadId}/messages/${messageId}`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n list(threadId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(threadId, {}, query);\n }\n return this._client.getAPIList(`/threads/${threadId}/messages`, MessagesPage, {\n query,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Deletes a message.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n del(threadId, messageId, options) {\n return this._client.delete(`/threads/${threadId}/messages/${messageId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n}\nexport class MessagesPage extends CursorPage {\n}\nMessages.MessagesPage = MessagesPage;\n//# sourceMappingURL=messages.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../../core.mjs\";\nimport { CursorPage } from \"../../../../pagination.mjs\";\n/**\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\nexport class Steps extends APIResource {\n retrieve(threadId, runId, stepId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.retrieve(threadId, runId, stepId, {}, query);\n }\n return this._client.get(`/threads/${threadId}/runs/${runId}/steps/${stepId}`, {\n query,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n list(threadId, runId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(threadId, runId, {}, query);\n }\n return this._client.getAPIList(`/threads/${threadId}/runs/${runId}/steps`, RunStepsPage, {\n query,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n}\nexport class RunStepsPage extends CursorPage {\n}\nSteps.RunStepsPage = RunStepsPage;\n//# sourceMappingURL=steps.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../../core.mjs\";\nimport { AssistantStream } from \"../../../../lib/AssistantStream.mjs\";\nimport { sleep } from \"../../../../core.mjs\";\nimport * as StepsAPI from \"./steps.mjs\";\nimport { RunStepsPage, Steps, } from \"./steps.mjs\";\nimport { CursorPage } from \"../../../../pagination.mjs\";\n/**\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\nexport class Runs extends APIResource {\n constructor() {\n super(...arguments);\n this.steps = new StepsAPI.Steps(this._client);\n }\n create(threadId, params, options) {\n const { include, ...body } = params;\n return this._client.post(`/threads/${threadId}/runs`, {\n query: { include },\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n stream: params.stream ?? false,\n });\n }\n /**\n * Retrieves a run.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n retrieve(threadId, runId, options) {\n return this._client.get(`/threads/${threadId}/runs/${runId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Modifies a run.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n update(threadId, runId, body, options) {\n return this._client.post(`/threads/${threadId}/runs/${runId}`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n list(threadId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(threadId, {}, query);\n }\n return this._client.getAPIList(`/threads/${threadId}/runs`, RunsPage, {\n query,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Cancels a run that is `in_progress`.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n cancel(threadId, runId, options) {\n return this._client.post(`/threads/${threadId}/runs/${runId}/cancel`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * A helper to create a run an poll for a terminal state. More information on Run\n * lifecycles can be found here:\n * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps\n */\n async createAndPoll(threadId, body, options) {\n const run = await this.create(threadId, body, options);\n return await this.poll(threadId, run.id, options);\n }\n /**\n * Create a Run stream\n *\n * @deprecated use `stream` instead\n */\n createAndStream(threadId, body, options) {\n return AssistantStream.createAssistantStream(threadId, this._client.beta.threads.runs, body, options);\n }\n /**\n * A helper to poll a run status until it reaches a terminal state. More\n * information on Run lifecycles can be found here:\n * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps\n */\n async poll(threadId, runId, options) {\n const headers = { ...options?.headers, 'X-Stainless-Poll-Helper': 'true' };\n if (options?.pollIntervalMs) {\n headers['X-Stainless-Custom-Poll-Interval'] = options.pollIntervalMs.toString();\n }\n while (true) {\n const { data: run, response } = await this.retrieve(threadId, runId, {\n ...options,\n headers: { ...options?.headers, ...headers },\n }).withResponse();\n switch (run.status) {\n //If we are in any sort of intermediate state we poll\n case 'queued':\n case 'in_progress':\n case 'cancelling':\n let sleepInterval = 5000;\n if (options?.pollIntervalMs) {\n sleepInterval = options.pollIntervalMs;\n }\n else {\n const headerInterval = response.headers.get('openai-poll-after-ms');\n if (headerInterval) {\n const headerIntervalMs = parseInt(headerInterval);\n if (!isNaN(headerIntervalMs)) {\n sleepInterval = headerIntervalMs;\n }\n }\n }\n await sleep(sleepInterval);\n break;\n //We return the run in any terminal state.\n case 'requires_action':\n case 'incomplete':\n case 'cancelled':\n case 'completed':\n case 'failed':\n case 'expired':\n return run;\n }\n }\n }\n /**\n * Create a Run stream\n */\n stream(threadId, body, options) {\n return AssistantStream.createAssistantStream(threadId, this._client.beta.threads.runs, body, options);\n }\n submitToolOutputs(threadId, runId, body, options) {\n return this._client.post(`/threads/${threadId}/runs/${runId}/submit_tool_outputs`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n stream: body.stream ?? false,\n });\n }\n /**\n * A helper to submit a tool output to a run and poll for a terminal run state.\n * More information on Run lifecycles can be found here:\n * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps\n */\n async submitToolOutputsAndPoll(threadId, runId, body, options) {\n const run = await this.submitToolOutputs(threadId, runId, body, options);\n return await this.poll(threadId, run.id, options);\n }\n /**\n * Submit the tool outputs from a previous run and stream the run to a terminal\n * state. More information on Run lifecycles can be found here:\n * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps\n */\n submitToolOutputsStream(threadId, runId, body, options) {\n return AssistantStream.createToolAssistantStream(threadId, runId, this._client.beta.threads.runs, body, options);\n }\n}\nexport class RunsPage extends CursorPage {\n}\nRuns.RunsPage = RunsPage;\nRuns.Steps = Steps;\nRuns.RunStepsPage = RunStepsPage;\n//# sourceMappingURL=runs.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport { AssistantStream } from \"../../../lib/AssistantStream.mjs\";\nimport * as MessagesAPI from \"./messages.mjs\";\nimport { Messages, MessagesPage, } from \"./messages.mjs\";\nimport * as RunsAPI from \"./runs/runs.mjs\";\nimport { Runs, RunsPage, } from \"./runs/runs.mjs\";\n/**\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\nexport class Threads extends APIResource {\n constructor() {\n super(...arguments);\n this.runs = new RunsAPI.Runs(this._client);\n this.messages = new MessagesAPI.Messages(this._client);\n }\n create(body = {}, options) {\n if (isRequestOptions(body)) {\n return this.create({}, body);\n }\n return this._client.post('/threads', {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Retrieves a thread.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n retrieve(threadId, options) {\n return this._client.get(`/threads/${threadId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Modifies a thread.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n update(threadId, body, options) {\n return this._client.post(`/threads/${threadId}`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Delete a thread.\n *\n * @deprecated The Assistants API is deprecated in favor of the Responses API\n */\n del(threadId, options) {\n return this._client.delete(`/threads/${threadId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n createAndRun(body, options) {\n return this._client.post('/threads/runs', {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n stream: body.stream ?? false,\n });\n }\n /**\n * A helper to create a thread, start a run and then poll for a terminal state.\n * More information on Run lifecycles can be found here:\n * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps\n */\n async createAndRunPoll(body, options) {\n const run = await this.createAndRun(body, options);\n return await this.runs.poll(run.thread_id, run.id, options);\n }\n /**\n * Create a thread and stream the run back\n */\n createAndRunStream(body, options) {\n return AssistantStream.createThreadAssistantStream(body, this._client.beta.threads, options);\n }\n}\nThreads.Runs = Runs;\nThreads.RunsPage = RunsPage;\nThreads.Messages = Messages;\nThreads.MessagesPage = MessagesPage;\n//# sourceMappingURL=threads.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as AssistantsAPI from \"./assistants.mjs\";\nimport * as ChatAPI from \"./chat/chat.mjs\";\nimport { Assistants, AssistantsPage, } from \"./assistants.mjs\";\nimport * as RealtimeAPI from \"./realtime/realtime.mjs\";\nimport { Realtime, } from \"./realtime/realtime.mjs\";\nimport * as ThreadsAPI from \"./threads/threads.mjs\";\nimport { Threads, } from \"./threads/threads.mjs\";\nimport { Chat } from \"./chat/chat.mjs\";\nexport class Beta extends APIResource {\n constructor() {\n super(...arguments);\n this.realtime = new RealtimeAPI.Realtime(this._client);\n this.chat = new ChatAPI.Chat(this._client);\n this.assistants = new AssistantsAPI.Assistants(this._client);\n this.threads = new ThreadsAPI.Threads(this._client);\n }\n}\nBeta.Realtime = Realtime;\nBeta.Assistants = Assistants;\nBeta.AssistantsPage = AssistantsPage;\nBeta.Threads = Threads;\n//# sourceMappingURL=beta.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../resource.mjs\";\nexport class Completions extends APIResource {\n create(body, options) {\n return this._client.post('/completions', { body, ...options, stream: body.stream ?? false });\n }\n}\n//# sourceMappingURL=completions.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nexport class Content extends APIResource {\n /**\n * Retrieve Container File Content\n */\n retrieve(containerId, fileId, options) {\n return this._client.get(`/containers/${containerId}/files/${fileId}/content`, {\n ...options,\n headers: { Accept: 'application/binary', ...options?.headers },\n __binaryResponse: true,\n });\n }\n}\n//# sourceMappingURL=content.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport * as Core from \"../../../core.mjs\";\nimport * as ContentAPI from \"./content.mjs\";\nimport { Content } from \"./content.mjs\";\nimport { CursorPage } from \"../../../pagination.mjs\";\nexport class Files extends APIResource {\n constructor() {\n super(...arguments);\n this.content = new ContentAPI.Content(this._client);\n }\n /**\n * Create a Container File\n *\n * You can send either a multipart/form-data request with the raw file content, or\n * a JSON request with a file ID.\n */\n create(containerId, body, options) {\n return this._client.post(`/containers/${containerId}/files`, Core.multipartFormRequestOptions({ body, ...options }));\n }\n /**\n * Retrieve Container File\n */\n retrieve(containerId, fileId, options) {\n return this._client.get(`/containers/${containerId}/files/${fileId}`, options);\n }\n list(containerId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(containerId, {}, query);\n }\n return this._client.getAPIList(`/containers/${containerId}/files`, FileListResponsesPage, {\n query,\n ...options,\n });\n }\n /**\n * Delete Container File\n */\n del(containerId, fileId, options) {\n return this._client.delete(`/containers/${containerId}/files/${fileId}`, {\n ...options,\n headers: { Accept: '*/*', ...options?.headers },\n });\n }\n}\nexport class FileListResponsesPage extends CursorPage {\n}\nFiles.FileListResponsesPage = FileListResponsesPage;\nFiles.Content = Content;\n//# sourceMappingURL=files.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport { isRequestOptions } from \"../../core.mjs\";\nimport * as FilesAPI from \"./files/files.mjs\";\nimport { FileListResponsesPage, Files, } from \"./files/files.mjs\";\nimport { CursorPage } from \"../../pagination.mjs\";\nexport class Containers extends APIResource {\n constructor() {\n super(...arguments);\n this.files = new FilesAPI.Files(this._client);\n }\n /**\n * Create Container\n */\n create(body, options) {\n return this._client.post('/containers', { body, ...options });\n }\n /**\n * Retrieve Container\n */\n retrieve(containerId, options) {\n return this._client.get(`/containers/${containerId}`, options);\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/containers', ContainerListResponsesPage, { query, ...options });\n }\n /**\n * Delete Container\n */\n del(containerId, options) {\n return this._client.delete(`/containers/${containerId}`, {\n ...options,\n headers: { Accept: '*/*', ...options?.headers },\n });\n }\n}\nexport class ContainerListResponsesPage extends CursorPage {\n}\nContainers.ContainerListResponsesPage = ContainerListResponsesPage;\nContainers.Files = Files;\nContainers.FileListResponsesPage = FileListResponsesPage;\n//# sourceMappingURL=containers.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../resource.mjs\";\nimport * as Core from \"../core.mjs\";\nexport class Embeddings extends APIResource {\n /**\n * Creates an embedding vector representing the input text.\n *\n * @example\n * ```ts\n * const createEmbeddingResponse =\n * await client.embeddings.create({\n * input: 'The quick brown fox jumped over the lazy dog',\n * model: 'text-embedding-3-small',\n * });\n * ```\n */\n create(body, options) {\n const hasUserProvidedEncodingFormat = !!body.encoding_format;\n // No encoding_format specified, defaulting to base64 for performance reasons\n // See https://github.com/openai/openai-node/pull/1312\n let encoding_format = hasUserProvidedEncodingFormat ? body.encoding_format : 'base64';\n if (hasUserProvidedEncodingFormat) {\n Core.debug('Request', 'User defined encoding_format:', body.encoding_format);\n }\n const response = this._client.post('/embeddings', {\n body: {\n ...body,\n encoding_format: encoding_format,\n },\n ...options,\n });\n // if the user specified an encoding_format, return the response as-is\n if (hasUserProvidedEncodingFormat) {\n return response;\n }\n // in this stage, we are sure the user did not specify an encoding_format\n // and we defaulted to base64 for performance reasons\n // we are sure then that the response is base64 encoded, let's decode it\n // the returned result will be a float32 array since this is OpenAI API's default encoding\n Core.debug('response', 'Decoding base64 embeddings to float32 array');\n return response._thenUnwrap((response) => {\n if (response && response.data) {\n response.data.forEach((embeddingBase64Obj) => {\n const embeddingBase64Str = embeddingBase64Obj.embedding;\n embeddingBase64Obj.embedding = Core.toFloat32Array(embeddingBase64Str);\n });\n }\n return response;\n });\n }\n}\n//# sourceMappingURL=embeddings.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport { CursorPage } from \"../../../pagination.mjs\";\nexport class OutputItems extends APIResource {\n /**\n * Get an evaluation run output item by ID.\n */\n retrieve(evalId, runId, outputItemId, options) {\n return this._client.get(`/evals/${evalId}/runs/${runId}/output_items/${outputItemId}`, options);\n }\n list(evalId, runId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(evalId, runId, {}, query);\n }\n return this._client.getAPIList(`/evals/${evalId}/runs/${runId}/output_items`, OutputItemListResponsesPage, { query, ...options });\n }\n}\nexport class OutputItemListResponsesPage extends CursorPage {\n}\nOutputItems.OutputItemListResponsesPage = OutputItemListResponsesPage;\n//# sourceMappingURL=output-items.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport * as OutputItemsAPI from \"./output-items.mjs\";\nimport { OutputItemListResponsesPage, OutputItems, } from \"./output-items.mjs\";\nimport { CursorPage } from \"../../../pagination.mjs\";\nexport class Runs extends APIResource {\n constructor() {\n super(...arguments);\n this.outputItems = new OutputItemsAPI.OutputItems(this._client);\n }\n /**\n * Kicks off a new run for a given evaluation, specifying the data source, and what\n * model configuration to use to test. The datasource will be validated against the\n * schema specified in the config of the evaluation.\n */\n create(evalId, body, options) {\n return this._client.post(`/evals/${evalId}/runs`, { body, ...options });\n }\n /**\n * Get an evaluation run by ID.\n */\n retrieve(evalId, runId, options) {\n return this._client.get(`/evals/${evalId}/runs/${runId}`, options);\n }\n list(evalId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(evalId, {}, query);\n }\n return this._client.getAPIList(`/evals/${evalId}/runs`, RunListResponsesPage, { query, ...options });\n }\n /**\n * Delete an eval run.\n */\n del(evalId, runId, options) {\n return this._client.delete(`/evals/${evalId}/runs/${runId}`, options);\n }\n /**\n * Cancel an ongoing evaluation run.\n */\n cancel(evalId, runId, options) {\n return this._client.post(`/evals/${evalId}/runs/${runId}`, options);\n }\n}\nexport class RunListResponsesPage extends CursorPage {\n}\nRuns.RunListResponsesPage = RunListResponsesPage;\nRuns.OutputItems = OutputItems;\nRuns.OutputItemListResponsesPage = OutputItemListResponsesPage;\n//# sourceMappingURL=runs.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport { isRequestOptions } from \"../../core.mjs\";\nimport * as RunsAPI from \"./runs/runs.mjs\";\nimport { RunListResponsesPage, Runs, } from \"./runs/runs.mjs\";\nimport { CursorPage } from \"../../pagination.mjs\";\nexport class Evals extends APIResource {\n constructor() {\n super(...arguments);\n this.runs = new RunsAPI.Runs(this._client);\n }\n /**\n * Create the structure of an evaluation that can be used to test a model's\n * performance. An evaluation is a set of testing criteria and the config for a\n * data source, which dictates the schema of the data used in the evaluation. After\n * creating an evaluation, you can run it on different models and model parameters.\n * We support several types of graders and datasources. For more information, see\n * the [Evals guide](https://platform.openai.com/docs/guides/evals).\n */\n create(body, options) {\n return this._client.post('/evals', { body, ...options });\n }\n /**\n * Get an evaluation by ID.\n */\n retrieve(evalId, options) {\n return this._client.get(`/evals/${evalId}`, options);\n }\n /**\n * Update certain properties of an evaluation.\n */\n update(evalId, body, options) {\n return this._client.post(`/evals/${evalId}`, { body, ...options });\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/evals', EvalListResponsesPage, { query, ...options });\n }\n /**\n * Delete an evaluation.\n */\n del(evalId, options) {\n return this._client.delete(`/evals/${evalId}`, options);\n }\n}\nexport class EvalListResponsesPage extends CursorPage {\n}\nEvals.EvalListResponsesPage = EvalListResponsesPage;\nEvals.Runs = Runs;\nEvals.RunListResponsesPage = RunListResponsesPage;\n//# sourceMappingURL=evals.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../resource.mjs\";\nimport { isRequestOptions } from \"../core.mjs\";\nimport { sleep } from \"../core.mjs\";\nimport { APIConnectionTimeoutError } from \"../error.mjs\";\nimport * as Core from \"../core.mjs\";\nimport { CursorPage } from \"../pagination.mjs\";\nexport class Files extends APIResource {\n /**\n * Upload a file that can be used across various endpoints. Individual files can be\n * up to 512 MB, and the size of all files uploaded by one organization can be up\n * to 100 GB.\n *\n * The Assistants API supports files up to 2 million tokens and of specific file\n * types. See the\n * [Assistants Tools guide](https://platform.openai.com/docs/assistants/tools) for\n * details.\n *\n * The Fine-tuning API only supports `.jsonl` files. The input also has certain\n * required formats for fine-tuning\n * [chat](https://platform.openai.com/docs/api-reference/fine-tuning/chat-input) or\n * [completions](https://platform.openai.com/docs/api-reference/fine-tuning/completions-input)\n * models.\n *\n * The Batch API only supports `.jsonl` files up to 200 MB in size. The input also\n * has a specific required\n * [format](https://platform.openai.com/docs/api-reference/batch/request-input).\n *\n * Please [contact us](https://help.openai.com/) if you need to increase these\n * storage limits.\n */\n create(body, options) {\n return this._client.post('/files', Core.multipartFormRequestOptions({ body, ...options }));\n }\n /**\n * Returns information about a specific file.\n */\n retrieve(fileId, options) {\n return this._client.get(`/files/${fileId}`, options);\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/files', FileObjectsPage, { query, ...options });\n }\n /**\n * Delete a file.\n */\n del(fileId, options) {\n return this._client.delete(`/files/${fileId}`, options);\n }\n /**\n * Returns the contents of the specified file.\n */\n content(fileId, options) {\n return this._client.get(`/files/${fileId}/content`, {\n ...options,\n headers: { Accept: 'application/binary', ...options?.headers },\n __binaryResponse: true,\n });\n }\n /**\n * Returns the contents of the specified file.\n *\n * @deprecated The `.content()` method should be used instead\n */\n retrieveContent(fileId, options) {\n return this._client.get(`/files/${fileId}/content`, options);\n }\n /**\n * Waits for the given file to be processed, default timeout is 30 mins.\n */\n async waitForProcessing(id, { pollInterval = 5000, maxWait = 30 * 60 * 1000 } = {}) {\n const TERMINAL_STATES = new Set(['processed', 'error', 'deleted']);\n const start = Date.now();\n let file = await this.retrieve(id);\n while (!file.status || !TERMINAL_STATES.has(file.status)) {\n await sleep(pollInterval);\n file = await this.retrieve(id);\n if (Date.now() - start > maxWait) {\n throw new APIConnectionTimeoutError({\n message: `Giving up on waiting for file ${id} to finish processing after ${maxWait} milliseconds.`,\n });\n }\n }\n return file;\n }\n}\nexport class FileObjectsPage extends CursorPage {\n}\nFiles.FileObjectsPage = FileObjectsPage;\n//# sourceMappingURL=files.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nexport class Methods extends APIResource {\n}\n//# sourceMappingURL=methods.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nexport class Graders extends APIResource {\n /**\n * Run a grader.\n *\n * @example\n * ```ts\n * const response = await client.fineTuning.alpha.graders.run({\n * grader: {\n * input: 'input',\n * name: 'name',\n * operation: 'eq',\n * reference: 'reference',\n * type: 'string_check',\n * },\n * model_sample: 'model_sample',\n * reference_answer: 'string',\n * });\n * ```\n */\n run(body, options) {\n return this._client.post('/fine_tuning/alpha/graders/run', { body, ...options });\n }\n /**\n * Validate a grader.\n *\n * @example\n * ```ts\n * const response =\n * await client.fineTuning.alpha.graders.validate({\n * grader: {\n * input: 'input',\n * name: 'name',\n * operation: 'eq',\n * reference: 'reference',\n * type: 'string_check',\n * },\n * });\n * ```\n */\n validate(body, options) {\n return this._client.post('/fine_tuning/alpha/graders/validate', { body, ...options });\n }\n}\n//# sourceMappingURL=graders.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport * as GradersAPI from \"./graders.mjs\";\nimport { Graders, } from \"./graders.mjs\";\nexport class Alpha extends APIResource {\n constructor() {\n super(...arguments);\n this.graders = new GradersAPI.Graders(this._client);\n }\n}\nAlpha.Graders = Graders;\n//# sourceMappingURL=alpha.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport { Page } from \"../../../pagination.mjs\";\nexport class Permissions extends APIResource {\n /**\n * **NOTE:** Calling this endpoint requires an [admin API key](../admin-api-keys).\n *\n * This enables organization owners to share fine-tuned models with other projects\n * in their organization.\n *\n * @example\n * ```ts\n * // Automatically fetches more pages as needed.\n * for await (const permissionCreateResponse of client.fineTuning.checkpoints.permissions.create(\n * 'ft:gpt-4o-mini-2024-07-18:org:weather:B7R9VjQd',\n * { project_ids: ['string'] },\n * )) {\n * // ...\n * }\n * ```\n */\n create(fineTunedModelCheckpoint, body, options) {\n return this._client.getAPIList(`/fine_tuning/checkpoints/${fineTunedModelCheckpoint}/permissions`, PermissionCreateResponsesPage, { body, method: 'post', ...options });\n }\n retrieve(fineTunedModelCheckpoint, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.retrieve(fineTunedModelCheckpoint, {}, query);\n }\n return this._client.get(`/fine_tuning/checkpoints/${fineTunedModelCheckpoint}/permissions`, {\n query,\n ...options,\n });\n }\n /**\n * **NOTE:** This endpoint requires an [admin API key](../admin-api-keys).\n *\n * Organization owners can use this endpoint to delete a permission for a\n * fine-tuned model checkpoint.\n *\n * @example\n * ```ts\n * const permission =\n * await client.fineTuning.checkpoints.permissions.del(\n * 'ft:gpt-4o-mini-2024-07-18:org:weather:B7R9VjQd',\n * 'cp_zc4Q7MP6XxulcVzj4MZdwsAB',\n * );\n * ```\n */\n del(fineTunedModelCheckpoint, permissionId, options) {\n return this._client.delete(`/fine_tuning/checkpoints/${fineTunedModelCheckpoint}/permissions/${permissionId}`, options);\n }\n}\n/**\n * Note: no pagination actually occurs yet, this is for forwards-compatibility.\n */\nexport class PermissionCreateResponsesPage extends Page {\n}\nPermissions.PermissionCreateResponsesPage = PermissionCreateResponsesPage;\n//# sourceMappingURL=permissions.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport * as PermissionsAPI from \"./permissions.mjs\";\nimport { PermissionCreateResponsesPage, Permissions, } from \"./permissions.mjs\";\nexport class Checkpoints extends APIResource {\n constructor() {\n super(...arguments);\n this.permissions = new PermissionsAPI.Permissions(this._client);\n }\n}\nCheckpoints.Permissions = Permissions;\nCheckpoints.PermissionCreateResponsesPage = PermissionCreateResponsesPage;\n//# sourceMappingURL=checkpoints.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport { CursorPage } from \"../../../pagination.mjs\";\nexport class Checkpoints extends APIResource {\n list(fineTuningJobId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(fineTuningJobId, {}, query);\n }\n return this._client.getAPIList(`/fine_tuning/jobs/${fineTuningJobId}/checkpoints`, FineTuningJobCheckpointsPage, { query, ...options });\n }\n}\nexport class FineTuningJobCheckpointsPage extends CursorPage {\n}\nCheckpoints.FineTuningJobCheckpointsPage = FineTuningJobCheckpointsPage;\n//# sourceMappingURL=checkpoints.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../../resource.mjs\";\nimport { isRequestOptions } from \"../../../core.mjs\";\nimport * as CheckpointsAPI from \"./checkpoints.mjs\";\nimport { Checkpoints, FineTuningJobCheckpointsPage, } from \"./checkpoints.mjs\";\nimport { CursorPage } from \"../../../pagination.mjs\";\nexport class Jobs extends APIResource {\n constructor() {\n super(...arguments);\n this.checkpoints = new CheckpointsAPI.Checkpoints(this._client);\n }\n /**\n * Creates a fine-tuning job which begins the process of creating a new model from\n * a given dataset.\n *\n * Response includes details of the enqueued job including job status and the name\n * of the fine-tuned models once complete.\n *\n * [Learn more about fine-tuning](https://platform.openai.com/docs/guides/fine-tuning)\n *\n * @example\n * ```ts\n * const fineTuningJob = await client.fineTuning.jobs.create({\n * model: 'gpt-4o-mini',\n * training_file: 'file-abc123',\n * });\n * ```\n */\n create(body, options) {\n return this._client.post('/fine_tuning/jobs', { body, ...options });\n }\n /**\n * Get info about a fine-tuning job.\n *\n * [Learn more about fine-tuning](https://platform.openai.com/docs/guides/fine-tuning)\n *\n * @example\n * ```ts\n * const fineTuningJob = await client.fineTuning.jobs.retrieve(\n * 'ft-AF1WoRqd3aJAHsqc9NY7iL8F',\n * );\n * ```\n */\n retrieve(fineTuningJobId, options) {\n return this._client.get(`/fine_tuning/jobs/${fineTuningJobId}`, options);\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/fine_tuning/jobs', FineTuningJobsPage, { query, ...options });\n }\n /**\n * Immediately cancel a fine-tune job.\n *\n * @example\n * ```ts\n * const fineTuningJob = await client.fineTuning.jobs.cancel(\n * 'ft-AF1WoRqd3aJAHsqc9NY7iL8F',\n * );\n * ```\n */\n cancel(fineTuningJobId, options) {\n return this._client.post(`/fine_tuning/jobs/${fineTuningJobId}/cancel`, options);\n }\n listEvents(fineTuningJobId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.listEvents(fineTuningJobId, {}, query);\n }\n return this._client.getAPIList(`/fine_tuning/jobs/${fineTuningJobId}/events`, FineTuningJobEventsPage, {\n query,\n ...options,\n });\n }\n /**\n * Pause a fine-tune job.\n *\n * @example\n * ```ts\n * const fineTuningJob = await client.fineTuning.jobs.pause(\n * 'ft-AF1WoRqd3aJAHsqc9NY7iL8F',\n * );\n * ```\n */\n pause(fineTuningJobId, options) {\n return this._client.post(`/fine_tuning/jobs/${fineTuningJobId}/pause`, options);\n }\n /**\n * Resume a fine-tune job.\n *\n * @example\n * ```ts\n * const fineTuningJob = await client.fineTuning.jobs.resume(\n * 'ft-AF1WoRqd3aJAHsqc9NY7iL8F',\n * );\n * ```\n */\n resume(fineTuningJobId, options) {\n return this._client.post(`/fine_tuning/jobs/${fineTuningJobId}/resume`, options);\n }\n}\nexport class FineTuningJobsPage extends CursorPage {\n}\nexport class FineTuningJobEventsPage extends CursorPage {\n}\nJobs.FineTuningJobsPage = FineTuningJobsPage;\nJobs.FineTuningJobEventsPage = FineTuningJobEventsPage;\nJobs.Checkpoints = Checkpoints;\nJobs.FineTuningJobCheckpointsPage = FineTuningJobCheckpointsPage;\n//# sourceMappingURL=jobs.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as MethodsAPI from \"./methods.mjs\";\nimport { Methods, } from \"./methods.mjs\";\nimport * as AlphaAPI from \"./alpha/alpha.mjs\";\nimport { Alpha } from \"./alpha/alpha.mjs\";\nimport * as CheckpointsAPI from \"./checkpoints/checkpoints.mjs\";\nimport { Checkpoints } from \"./checkpoints/checkpoints.mjs\";\nimport * as JobsAPI from \"./jobs/jobs.mjs\";\nimport { FineTuningJobEventsPage, FineTuningJobsPage, Jobs, } from \"./jobs/jobs.mjs\";\nexport class FineTuning extends APIResource {\n constructor() {\n super(...arguments);\n this.methods = new MethodsAPI.Methods(this._client);\n this.jobs = new JobsAPI.Jobs(this._client);\n this.checkpoints = new CheckpointsAPI.Checkpoints(this._client);\n this.alpha = new AlphaAPI.Alpha(this._client);\n }\n}\nFineTuning.Methods = Methods;\nFineTuning.Jobs = Jobs;\nFineTuning.FineTuningJobsPage = FineTuningJobsPage;\nFineTuning.FineTuningJobEventsPage = FineTuningJobEventsPage;\nFineTuning.Checkpoints = Checkpoints;\nFineTuning.Alpha = Alpha;\n//# sourceMappingURL=fine-tuning.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nexport class GraderModels extends APIResource {\n}\n//# sourceMappingURL=grader-models.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as GraderModelsAPI from \"./grader-models.mjs\";\nimport { GraderModels, } from \"./grader-models.mjs\";\nexport class Graders extends APIResource {\n constructor() {\n super(...arguments);\n this.graderModels = new GraderModelsAPI.GraderModels(this._client);\n }\n}\nGraders.GraderModels = GraderModels;\n//# sourceMappingURL=graders.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../resource.mjs\";\nimport * as Core from \"../core.mjs\";\nexport class Images extends APIResource {\n /**\n * Creates a variation of a given image. This endpoint only supports `dall-e-2`.\n *\n * @example\n * ```ts\n * const imagesResponse = await client.images.createVariation({\n * image: fs.createReadStream('otter.png'),\n * });\n * ```\n */\n createVariation(body, options) {\n return this._client.post('/images/variations', Core.multipartFormRequestOptions({ body, ...options }));\n }\n /**\n * Creates an edited or extended image given one or more source images and a\n * prompt. This endpoint only supports `gpt-image-1` and `dall-e-2`.\n *\n * @example\n * ```ts\n * const imagesResponse = await client.images.edit({\n * image: fs.createReadStream('path/to/file'),\n * prompt: 'A cute baby sea otter wearing a beret',\n * });\n * ```\n */\n edit(body, options) {\n return this._client.post('/images/edits', Core.multipartFormRequestOptions({ body, ...options }));\n }\n /**\n * Creates an image given a prompt.\n * [Learn more](https://platform.openai.com/docs/guides/images).\n *\n * @example\n * ```ts\n * const imagesResponse = await client.images.generate({\n * prompt: 'A cute baby sea otter',\n * });\n * ```\n */\n generate(body, options) {\n return this._client.post('/images/generations', { body, ...options });\n }\n}\n//# sourceMappingURL=images.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../resource.mjs\";\nimport { Page } from \"../pagination.mjs\";\nexport class Models extends APIResource {\n /**\n * Retrieves a model instance, providing basic information about the model such as\n * the owner and permissioning.\n */\n retrieve(model, options) {\n return this._client.get(`/models/${model}`, options);\n }\n /**\n * Lists the currently available models, and provides basic information about each\n * one such as the owner and availability.\n */\n list(options) {\n return this._client.getAPIList('/models', ModelsPage, options);\n }\n /**\n * Delete a fine-tuned model. You must have the Owner role in your organization to\n * delete a model.\n */\n del(model, options) {\n return this._client.delete(`/models/${model}`, options);\n }\n}\n/**\n * Note: no pagination actually occurs yet, this is for forwards-compatibility.\n */\nexport class ModelsPage extends Page {\n}\nModels.ModelsPage = ModelsPage;\n//# sourceMappingURL=models.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../resource.mjs\";\nexport class Moderations extends APIResource {\n /**\n * Classifies if text and/or image inputs are potentially harmful. Learn more in\n * the [moderation guide](https://platform.openai.com/docs/guides/moderation).\n */\n create(body, options) {\n return this._client.post('/moderations', { body, ...options });\n }\n}\n//# sourceMappingURL=moderations.mjs.map","import { OpenAIError } from \"../error.mjs\";\nimport { isAutoParsableResponseFormat } from \"../lib/parser.mjs\";\nexport function maybeParseResponse(response, params) {\n if (!params || !hasAutoParseableInput(params)) {\n return {\n ...response,\n output_parsed: null,\n output: response.output.map((item) => {\n if (item.type === 'function_call') {\n return {\n ...item,\n parsed_arguments: null,\n };\n }\n if (item.type === 'message') {\n return {\n ...item,\n content: item.content.map((content) => ({\n ...content,\n parsed: null,\n })),\n };\n }\n else {\n return item;\n }\n }),\n };\n }\n return parseResponse(response, params);\n}\nexport function parseResponse(response, params) {\n const output = response.output.map((item) => {\n if (item.type === 'function_call') {\n return {\n ...item,\n parsed_arguments: parseToolCall(params, item),\n };\n }\n if (item.type === 'message') {\n const content = item.content.map((content) => {\n if (content.type === 'output_text') {\n return {\n ...content,\n parsed: parseTextFormat(params, content.text),\n };\n }\n return content;\n });\n return {\n ...item,\n content,\n };\n }\n return item;\n });\n const parsed = Object.assign({}, response, { output });\n if (!Object.getOwnPropertyDescriptor(response, 'output_text')) {\n addOutputText(parsed);\n }\n Object.defineProperty(parsed, 'output_parsed', {\n enumerable: true,\n get() {\n for (const output of parsed.output) {\n if (output.type !== 'message') {\n continue;\n }\n for (const content of output.content) {\n if (content.type === 'output_text' && content.parsed !== null) {\n return content.parsed;\n }\n }\n }\n return null;\n },\n });\n return parsed;\n}\nfunction parseTextFormat(params, content) {\n if (params.text?.format?.type !== 'json_schema') {\n return null;\n }\n if ('$parseRaw' in params.text?.format) {\n const text_format = params.text?.format;\n return text_format.$parseRaw(content);\n }\n return JSON.parse(content);\n}\nexport function hasAutoParseableInput(params) {\n if (isAutoParsableResponseFormat(params.text?.format)) {\n return true;\n }\n return false;\n}\nexport function makeParseableResponseTool(tool, { parser, callback, }) {\n const obj = { ...tool };\n Object.defineProperties(obj, {\n $brand: {\n value: 'auto-parseable-tool',\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n $callback: {\n value: callback,\n enumerable: false,\n },\n });\n return obj;\n}\nexport function isAutoParsableTool(tool) {\n return tool?.['$brand'] === 'auto-parseable-tool';\n}\nfunction getInputToolByName(input_tools, name) {\n return input_tools.find((tool) => tool.type === 'function' && tool.name === name);\n}\nfunction parseToolCall(params, toolCall) {\n const inputTool = getInputToolByName(params.tools ?? [], toolCall.name);\n return {\n ...toolCall,\n ...toolCall,\n parsed_arguments: isAutoParsableTool(inputTool) ? inputTool.$parseRaw(toolCall.arguments)\n : inputTool?.strict ? JSON.parse(toolCall.arguments)\n : null,\n };\n}\nexport function shouldParseToolCall(params, toolCall) {\n if (!params) {\n return false;\n }\n const inputTool = getInputToolByName(params.tools ?? [], toolCall.name);\n return isAutoParsableTool(inputTool) || inputTool?.strict || false;\n}\nexport function validateInputTools(tools) {\n for (const tool of tools ?? []) {\n if (tool.type !== 'function') {\n throw new OpenAIError(`Currently only \\`function\\` tool types support auto-parsing; Received \\`${tool.type}\\``);\n }\n if (tool.function.strict !== true) {\n throw new OpenAIError(`The \\`${tool.function.name}\\` tool is not marked with \\`strict: true\\`. Only strict function tools can be auto-parsed`);\n }\n }\n}\nexport function addOutputText(rsp) {\n const texts = [];\n for (const output of rsp.output) {\n if (output.type !== 'message') {\n continue;\n }\n for (const content of output.content) {\n if (content.type === 'output_text') {\n texts.push(content.text);\n }\n }\n }\n rsp.output_text = texts.join('');\n}\n//# sourceMappingURL=ResponsesParser.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport { isRequestOptions } from \"../../core.mjs\";\nimport { ResponseItemsPage } from \"./responses.mjs\";\nexport class InputItems extends APIResource {\n list(responseId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(responseId, {}, query);\n }\n return this._client.getAPIList(`/responses/${responseId}/input_items`, ResponseItemsPage, {\n query,\n ...options,\n });\n }\n}\nexport { ResponseItemsPage };\n//# sourceMappingURL=input-items.mjs.map","var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n};\nvar __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _ResponseStream_instances, _ResponseStream_params, _ResponseStream_currentResponseSnapshot, _ResponseStream_finalResponse, _ResponseStream_beginRequest, _ResponseStream_addEvent, _ResponseStream_endRequest, _ResponseStream_accumulateResponse;\nimport { APIUserAbortError, OpenAIError } from \"../../error.mjs\";\nimport { EventStream } from \"../EventStream.mjs\";\nimport { maybeParseResponse } from \"../ResponsesParser.mjs\";\nexport class ResponseStream extends EventStream {\n constructor(params) {\n super();\n _ResponseStream_instances.add(this);\n _ResponseStream_params.set(this, void 0);\n _ResponseStream_currentResponseSnapshot.set(this, void 0);\n _ResponseStream_finalResponse.set(this, void 0);\n __classPrivateFieldSet(this, _ResponseStream_params, params, \"f\");\n }\n static createResponse(client, params, options) {\n const runner = new ResponseStream(params);\n runner._run(() => runner._createOrRetrieveResponse(client, params, {\n ...options,\n headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' },\n }));\n return runner;\n }\n async _createOrRetrieveResponse(client, params, options) {\n const signal = options?.signal;\n if (signal) {\n if (signal.aborted)\n this.controller.abort();\n signal.addEventListener('abort', () => this.controller.abort());\n }\n __classPrivateFieldGet(this, _ResponseStream_instances, \"m\", _ResponseStream_beginRequest).call(this);\n let stream;\n let starting_after = null;\n if ('response_id' in params) {\n stream = await client.responses.retrieve(params.response_id, { stream: true }, { ...options, signal: this.controller.signal, stream: true });\n starting_after = params.starting_after ?? null;\n }\n else {\n stream = await client.responses.create({ ...params, stream: true }, { ...options, signal: this.controller.signal });\n }\n this._connected();\n for await (const event of stream) {\n __classPrivateFieldGet(this, _ResponseStream_instances, \"m\", _ResponseStream_addEvent).call(this, event, starting_after);\n }\n if (stream.controller.signal?.aborted) {\n throw new APIUserAbortError();\n }\n return __classPrivateFieldGet(this, _ResponseStream_instances, \"m\", _ResponseStream_endRequest).call(this);\n }\n [(_ResponseStream_params = new WeakMap(), _ResponseStream_currentResponseSnapshot = new WeakMap(), _ResponseStream_finalResponse = new WeakMap(), _ResponseStream_instances = new WeakSet(), _ResponseStream_beginRequest = function _ResponseStream_beginRequest() {\n if (this.ended)\n return;\n __classPrivateFieldSet(this, _ResponseStream_currentResponseSnapshot, undefined, \"f\");\n }, _ResponseStream_addEvent = function _ResponseStream_addEvent(event, starting_after) {\n if (this.ended)\n return;\n const maybeEmit = (name, event) => {\n if (starting_after == null || event.sequence_number > starting_after) {\n this._emit(name, event);\n }\n };\n const response = __classPrivateFieldGet(this, _ResponseStream_instances, \"m\", _ResponseStream_accumulateResponse).call(this, event);\n maybeEmit('event', event);\n switch (event.type) {\n case 'response.output_text.delta': {\n const output = response.output[event.output_index];\n if (!output) {\n throw new OpenAIError(`missing output at index ${event.output_index}`);\n }\n if (output.type === 'message') {\n const content = output.content[event.content_index];\n if (!content) {\n throw new OpenAIError(`missing content at index ${event.content_index}`);\n }\n if (content.type !== 'output_text') {\n throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`);\n }\n maybeEmit('response.output_text.delta', {\n ...event,\n snapshot: content.text,\n });\n }\n break;\n }\n case 'response.function_call_arguments.delta': {\n const output = response.output[event.output_index];\n if (!output) {\n throw new OpenAIError(`missing output at index ${event.output_index}`);\n }\n if (output.type === 'function_call') {\n maybeEmit('response.function_call_arguments.delta', {\n ...event,\n snapshot: output.arguments,\n });\n }\n break;\n }\n default:\n maybeEmit(event.type, event);\n break;\n }\n }, _ResponseStream_endRequest = function _ResponseStream_endRequest() {\n if (this.ended) {\n throw new OpenAIError(`stream has ended, this shouldn't happen`);\n }\n const snapshot = __classPrivateFieldGet(this, _ResponseStream_currentResponseSnapshot, \"f\");\n if (!snapshot) {\n throw new OpenAIError(`request ended without sending any events`);\n }\n __classPrivateFieldSet(this, _ResponseStream_currentResponseSnapshot, undefined, \"f\");\n const parsedResponse = finalizeResponse(snapshot, __classPrivateFieldGet(this, _ResponseStream_params, \"f\"));\n __classPrivateFieldSet(this, _ResponseStream_finalResponse, parsedResponse, \"f\");\n return parsedResponse;\n }, _ResponseStream_accumulateResponse = function _ResponseStream_accumulateResponse(event) {\n let snapshot = __classPrivateFieldGet(this, _ResponseStream_currentResponseSnapshot, \"f\");\n if (!snapshot) {\n if (event.type !== 'response.created') {\n throw new OpenAIError(`When snapshot hasn't been set yet, expected 'response.created' event, got ${event.type}`);\n }\n snapshot = __classPrivateFieldSet(this, _ResponseStream_currentResponseSnapshot, event.response, \"f\");\n return snapshot;\n }\n switch (event.type) {\n case 'response.output_item.added': {\n snapshot.output.push(event.item);\n break;\n }\n case 'response.content_part.added': {\n const output = snapshot.output[event.output_index];\n if (!output) {\n throw new OpenAIError(`missing output at index ${event.output_index}`);\n }\n if (output.type === 'message') {\n output.content.push(event.part);\n }\n break;\n }\n case 'response.output_text.delta': {\n const output = snapshot.output[event.output_index];\n if (!output) {\n throw new OpenAIError(`missing output at index ${event.output_index}`);\n }\n if (output.type === 'message') {\n const content = output.content[event.content_index];\n if (!content) {\n throw new OpenAIError(`missing content at index ${event.content_index}`);\n }\n if (content.type !== 'output_text') {\n throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`);\n }\n content.text += event.delta;\n }\n break;\n }\n case 'response.function_call_arguments.delta': {\n const output = snapshot.output[event.output_index];\n if (!output) {\n throw new OpenAIError(`missing output at index ${event.output_index}`);\n }\n if (output.type === 'function_call') {\n output.arguments += event.delta;\n }\n break;\n }\n case 'response.completed': {\n __classPrivateFieldSet(this, _ResponseStream_currentResponseSnapshot, event.response, \"f\");\n break;\n }\n }\n return snapshot;\n }, Symbol.asyncIterator)]() {\n const pushQueue = [];\n const readQueue = [];\n let done = false;\n this.on('event', (event) => {\n const reader = readQueue.shift();\n if (reader) {\n reader.resolve(event);\n }\n else {\n pushQueue.push(event);\n }\n });\n this.on('end', () => {\n done = true;\n for (const reader of readQueue) {\n reader.resolve(undefined);\n }\n readQueue.length = 0;\n });\n this.on('abort', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n this.on('error', (err) => {\n done = true;\n for (const reader of readQueue) {\n reader.reject(err);\n }\n readQueue.length = 0;\n });\n return {\n next: async () => {\n if (!pushQueue.length) {\n if (done) {\n return { value: undefined, done: true };\n }\n return new Promise((resolve, reject) => readQueue.push({ resolve, reject })).then((event) => (event ? { value: event, done: false } : { value: undefined, done: true }));\n }\n const event = pushQueue.shift();\n return { value: event, done: false };\n },\n return: async () => {\n this.abort();\n return { value: undefined, done: true };\n },\n };\n }\n /**\n * @returns a promise that resolves with the final Response, or rejects\n * if an error occurred or the stream ended prematurely without producing a REsponse.\n */\n async finalResponse() {\n await this.done();\n const response = __classPrivateFieldGet(this, _ResponseStream_finalResponse, \"f\");\n if (!response)\n throw new OpenAIError('stream ended without producing a ChatCompletion');\n return response;\n }\n}\nfunction finalizeResponse(snapshot, params) {\n return maybeParseResponse(snapshot, params);\n}\n//# sourceMappingURL=ResponseStream.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { parseResponse, addOutputText, } from \"../../lib/ResponsesParser.mjs\";\nimport { APIResource } from \"../../resource.mjs\";\nimport * as InputItemsAPI from \"./input-items.mjs\";\nimport { InputItems } from \"./input-items.mjs\";\nimport { ResponseStream } from \"../../lib/responses/ResponseStream.mjs\";\nimport { CursorPage } from \"../../pagination.mjs\";\nexport class Responses extends APIResource {\n constructor() {\n super(...arguments);\n this.inputItems = new InputItemsAPI.InputItems(this._client);\n }\n create(body, options) {\n return this._client.post('/responses', { body, ...options, stream: body.stream ?? false })._thenUnwrap((rsp) => {\n if ('object' in rsp && rsp.object === 'response') {\n addOutputText(rsp);\n }\n return rsp;\n });\n }\n retrieve(responseId, query = {}, options) {\n return this._client.get(`/responses/${responseId}`, {\n query,\n ...options,\n stream: query?.stream ?? false,\n });\n }\n /**\n * Deletes a model response with the given ID.\n *\n * @example\n * ```ts\n * await client.responses.del(\n * 'resp_677efb5139a88190b512bc3fef8e535d',\n * );\n * ```\n */\n del(responseId, options) {\n return this._client.delete(`/responses/${responseId}`, {\n ...options,\n headers: { Accept: '*/*', ...options?.headers },\n });\n }\n parse(body, options) {\n return this._client.responses\n .create(body, options)\n ._thenUnwrap((response) => parseResponse(response, body));\n }\n /**\n * Creates a model response stream\n */\n stream(body, options) {\n return ResponseStream.createResponse(this._client, body, options);\n }\n /**\n * Cancels a model response with the given ID. Only responses created with the\n * `background` parameter set to `true` can be cancelled.\n * [Learn more](https://platform.openai.com/docs/guides/background).\n *\n * @example\n * ```ts\n * await client.responses.cancel(\n * 'resp_677efb5139a88190b512bc3fef8e535d',\n * );\n * ```\n */\n cancel(responseId, options) {\n return this._client.post(`/responses/${responseId}/cancel`, {\n ...options,\n headers: { Accept: '*/*', ...options?.headers },\n });\n }\n}\nexport class ResponseItemsPage extends CursorPage {\n}\nResponses.InputItems = InputItems;\n//# sourceMappingURL=responses.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as Core from \"../../core.mjs\";\nexport class Parts extends APIResource {\n /**\n * Adds a\n * [Part](https://platform.openai.com/docs/api-reference/uploads/part-object) to an\n * [Upload](https://platform.openai.com/docs/api-reference/uploads/object) object.\n * A Part represents a chunk of bytes from the file you are trying to upload.\n *\n * Each Part can be at most 64 MB, and you can add Parts until you hit the Upload\n * maximum of 8 GB.\n *\n * It is possible to add multiple Parts in parallel. You can decide the intended\n * order of the Parts when you\n * [complete the Upload](https://platform.openai.com/docs/api-reference/uploads/complete).\n */\n create(uploadId, body, options) {\n return this._client.post(`/uploads/${uploadId}/parts`, Core.multipartFormRequestOptions({ body, ...options }));\n }\n}\n//# sourceMappingURL=parts.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport * as PartsAPI from \"./parts.mjs\";\nimport { Parts } from \"./parts.mjs\";\nexport class Uploads extends APIResource {\n constructor() {\n super(...arguments);\n this.parts = new PartsAPI.Parts(this._client);\n }\n /**\n * Creates an intermediate\n * [Upload](https://platform.openai.com/docs/api-reference/uploads/object) object\n * that you can add\n * [Parts](https://platform.openai.com/docs/api-reference/uploads/part-object) to.\n * Currently, an Upload can accept at most 8 GB in total and expires after an hour\n * after you create it.\n *\n * Once you complete the Upload, we will create a\n * [File](https://platform.openai.com/docs/api-reference/files/object) object that\n * contains all the parts you uploaded. This File is usable in the rest of our\n * platform as a regular File object.\n *\n * For certain `purpose` values, the correct `mime_type` must be specified. Please\n * refer to documentation for the\n * [supported MIME types for your use case](https://platform.openai.com/docs/assistants/tools/file-search#supported-files).\n *\n * For guidance on the proper filename extensions for each purpose, please follow\n * the documentation on\n * [creating a File](https://platform.openai.com/docs/api-reference/files/create).\n */\n create(body, options) {\n return this._client.post('/uploads', { body, ...options });\n }\n /**\n * Cancels the Upload. No Parts may be added after an Upload is cancelled.\n */\n cancel(uploadId, options) {\n return this._client.post(`/uploads/${uploadId}/cancel`, options);\n }\n /**\n * Completes the\n * [Upload](https://platform.openai.com/docs/api-reference/uploads/object).\n *\n * Within the returned Upload object, there is a nested\n * [File](https://platform.openai.com/docs/api-reference/files/object) object that\n * is ready to use in the rest of the platform.\n *\n * You can specify the order of the Parts by passing in an ordered list of the Part\n * IDs.\n *\n * The number of bytes uploaded upon completion must match the number of bytes\n * initially specified when creating the Upload object. No Parts may be added after\n * an Upload is completed.\n */\n complete(uploadId, body, options) {\n return this._client.post(`/uploads/${uploadId}/complete`, { body, ...options });\n }\n}\nUploads.Parts = Parts;\n//# sourceMappingURL=uploads.mjs.map","/**\n * Like `Promise.allSettled()` but throws an error if any promises are rejected.\n */\nexport const allSettledWithThrow = async (promises) => {\n const results = await Promise.allSettled(promises);\n const rejected = results.filter((result) => result.status === 'rejected');\n if (rejected.length) {\n for (const result of rejected) {\n console.error(result.reason);\n }\n throw new Error(`${rejected.length} promise(s) failed - see the above errors`);\n }\n // Note: TS was complaining about using `.filter().map()` here for some reason\n const values = [];\n for (const result of results) {\n if (result.status === 'fulfilled') {\n values.push(result.value);\n }\n }\n return values;\n};\n//# sourceMappingURL=Util.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport { sleep, isRequestOptions } from \"../../core.mjs\";\nimport { CursorPage, Page } from \"../../pagination.mjs\";\nexport class Files extends APIResource {\n /**\n * Create a vector store file by attaching a\n * [File](https://platform.openai.com/docs/api-reference/files) to a\n * [vector store](https://platform.openai.com/docs/api-reference/vector-stores/object).\n */\n create(vectorStoreId, body, options) {\n return this._client.post(`/vector_stores/${vectorStoreId}/files`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Retrieves a vector store file.\n */\n retrieve(vectorStoreId, fileId, options) {\n return this._client.get(`/vector_stores/${vectorStoreId}/files/${fileId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Update attributes on a vector store file.\n */\n update(vectorStoreId, fileId, body, options) {\n return this._client.post(`/vector_stores/${vectorStoreId}/files/${fileId}`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n list(vectorStoreId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list(vectorStoreId, {}, query);\n }\n return this._client.getAPIList(`/vector_stores/${vectorStoreId}/files`, VectorStoreFilesPage, {\n query,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Delete a vector store file. This will remove the file from the vector store but\n * the file itself will not be deleted. To delete the file, use the\n * [delete file](https://platform.openai.com/docs/api-reference/files/delete)\n * endpoint.\n */\n del(vectorStoreId, fileId, options) {\n return this._client.delete(`/vector_stores/${vectorStoreId}/files/${fileId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Attach a file to the given vector store and wait for it to be processed.\n */\n async createAndPoll(vectorStoreId, body, options) {\n const file = await this.create(vectorStoreId, body, options);\n return await this.poll(vectorStoreId, file.id, options);\n }\n /**\n * Wait for the vector store file to finish processing.\n *\n * Note: this will return even if the file failed to process, you need to check\n * file.last_error and file.status to handle these cases\n */\n async poll(vectorStoreId, fileId, options) {\n const headers = { ...options?.headers, 'X-Stainless-Poll-Helper': 'true' };\n if (options?.pollIntervalMs) {\n headers['X-Stainless-Custom-Poll-Interval'] = options.pollIntervalMs.toString();\n }\n while (true) {\n const fileResponse = await this.retrieve(vectorStoreId, fileId, {\n ...options,\n headers,\n }).withResponse();\n const file = fileResponse.data;\n switch (file.status) {\n case 'in_progress':\n let sleepInterval = 5000;\n if (options?.pollIntervalMs) {\n sleepInterval = options.pollIntervalMs;\n }\n else {\n const headerInterval = fileResponse.response.headers.get('openai-poll-after-ms');\n if (headerInterval) {\n const headerIntervalMs = parseInt(headerInterval);\n if (!isNaN(headerIntervalMs)) {\n sleepInterval = headerIntervalMs;\n }\n }\n }\n await sleep(sleepInterval);\n break;\n case 'failed':\n case 'completed':\n return file;\n }\n }\n }\n /**\n * Upload a file to the `files` API and then attach it to the given vector store.\n *\n * Note the file will be asynchronously processed (you can use the alternative\n * polling helper method to wait for processing to complete).\n */\n async upload(vectorStoreId, file, options) {\n const fileInfo = await this._client.files.create({ file: file, purpose: 'assistants' }, options);\n return this.create(vectorStoreId, { file_id: fileInfo.id }, options);\n }\n /**\n * Add a file to a vector store and poll until processing is complete.\n */\n async uploadAndPoll(vectorStoreId, file, options) {\n const fileInfo = await this.upload(vectorStoreId, file, options);\n return await this.poll(vectorStoreId, fileInfo.id, options);\n }\n /**\n * Retrieve the parsed contents of a vector store file.\n */\n content(vectorStoreId, fileId, options) {\n return this._client.getAPIList(`/vector_stores/${vectorStoreId}/files/${fileId}/content`, FileContentResponsesPage, { ...options, headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers } });\n }\n}\nexport class VectorStoreFilesPage extends CursorPage {\n}\n/**\n * Note: no pagination actually occurs yet, this is for forwards-compatibility.\n */\nexport class FileContentResponsesPage extends Page {\n}\nFiles.VectorStoreFilesPage = VectorStoreFilesPage;\nFiles.FileContentResponsesPage = FileContentResponsesPage;\n//# sourceMappingURL=files.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport { isRequestOptions } from \"../../core.mjs\";\nimport { sleep } from \"../../core.mjs\";\nimport { allSettledWithThrow } from \"../../lib/Util.mjs\";\nimport { VectorStoreFilesPage } from \"./files.mjs\";\nexport class FileBatches extends APIResource {\n /**\n * Create a vector store file batch.\n */\n create(vectorStoreId, body, options) {\n return this._client.post(`/vector_stores/${vectorStoreId}/file_batches`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Retrieves a vector store file batch.\n */\n retrieve(vectorStoreId, batchId, options) {\n return this._client.get(`/vector_stores/${vectorStoreId}/file_batches/${batchId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Cancel a vector store file batch. This attempts to cancel the processing of\n * files in this batch as soon as possible.\n */\n cancel(vectorStoreId, batchId, options) {\n return this._client.post(`/vector_stores/${vectorStoreId}/file_batches/${batchId}/cancel`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Create a vector store batch and poll until all files have been processed.\n */\n async createAndPoll(vectorStoreId, body, options) {\n const batch = await this.create(vectorStoreId, body);\n return await this.poll(vectorStoreId, batch.id, options);\n }\n listFiles(vectorStoreId, batchId, query = {}, options) {\n if (isRequestOptions(query)) {\n return this.listFiles(vectorStoreId, batchId, {}, query);\n }\n return this._client.getAPIList(`/vector_stores/${vectorStoreId}/file_batches/${batchId}/files`, VectorStoreFilesPage, { query, ...options, headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers } });\n }\n /**\n * Wait for the given file batch to be processed.\n *\n * Note: this will return even if one of the files failed to process, you need to\n * check batch.file_counts.failed_count to handle this case.\n */\n async poll(vectorStoreId, batchId, options) {\n const headers = { ...options?.headers, 'X-Stainless-Poll-Helper': 'true' };\n if (options?.pollIntervalMs) {\n headers['X-Stainless-Custom-Poll-Interval'] = options.pollIntervalMs.toString();\n }\n while (true) {\n const { data: batch, response } = await this.retrieve(vectorStoreId, batchId, {\n ...options,\n headers,\n }).withResponse();\n switch (batch.status) {\n case 'in_progress':\n let sleepInterval = 5000;\n if (options?.pollIntervalMs) {\n sleepInterval = options.pollIntervalMs;\n }\n else {\n const headerInterval = response.headers.get('openai-poll-after-ms');\n if (headerInterval) {\n const headerIntervalMs = parseInt(headerInterval);\n if (!isNaN(headerIntervalMs)) {\n sleepInterval = headerIntervalMs;\n }\n }\n }\n await sleep(sleepInterval);\n break;\n case 'failed':\n case 'cancelled':\n case 'completed':\n return batch;\n }\n }\n }\n /**\n * Uploads the given files concurrently and then creates a vector store file batch.\n *\n * The concurrency limit is configurable using the `maxConcurrency` parameter.\n */\n async uploadAndPoll(vectorStoreId, { files, fileIds = [] }, options) {\n if (files == null || files.length == 0) {\n throw new Error(`No \\`files\\` provided to process. If you've already uploaded files you should use \\`.createAndPoll()\\` instead`);\n }\n const configuredConcurrency = options?.maxConcurrency ?? 5;\n // We cap the number of workers at the number of files (so we don't start any unnecessary workers)\n const concurrencyLimit = Math.min(configuredConcurrency, files.length);\n const client = this._client;\n const fileIterator = files.values();\n const allFileIds = [...fileIds];\n // This code is based on this design. The libraries don't accommodate our environment limits.\n // https://stackoverflow.com/questions/40639432/what-is-the-best-way-to-limit-concurrency-when-using-es6s-promise-all\n async function processFiles(iterator) {\n for (let item of iterator) {\n const fileObj = await client.files.create({ file: item, purpose: 'assistants' }, options);\n allFileIds.push(fileObj.id);\n }\n }\n // Start workers to process results\n const workers = Array(concurrencyLimit).fill(fileIterator).map(processFiles);\n // Wait for all processing to complete.\n await allSettledWithThrow(workers);\n return await this.createAndPoll(vectorStoreId, {\n file_ids: allFileIds,\n });\n }\n}\nexport { VectorStoreFilesPage };\n//# sourceMappingURL=file-batches.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nimport { APIResource } from \"../../resource.mjs\";\nimport { isRequestOptions } from \"../../core.mjs\";\nimport * as FileBatchesAPI from \"./file-batches.mjs\";\nimport { FileBatches, } from \"./file-batches.mjs\";\nimport * as FilesAPI from \"./files.mjs\";\nimport { FileContentResponsesPage, Files, VectorStoreFilesPage, } from \"./files.mjs\";\nimport { CursorPage, Page } from \"../../pagination.mjs\";\nexport class VectorStores extends APIResource {\n constructor() {\n super(...arguments);\n this.files = new FilesAPI.Files(this._client);\n this.fileBatches = new FileBatchesAPI.FileBatches(this._client);\n }\n /**\n * Create a vector store.\n */\n create(body, options) {\n return this._client.post('/vector_stores', {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Retrieves a vector store.\n */\n retrieve(vectorStoreId, options) {\n return this._client.get(`/vector_stores/${vectorStoreId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Modifies a vector store.\n */\n update(vectorStoreId, body, options) {\n return this._client.post(`/vector_stores/${vectorStoreId}`, {\n body,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n list(query = {}, options) {\n if (isRequestOptions(query)) {\n return this.list({}, query);\n }\n return this._client.getAPIList('/vector_stores', VectorStoresPage, {\n query,\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Delete a vector store.\n */\n del(vectorStoreId, options) {\n return this._client.delete(`/vector_stores/${vectorStoreId}`, {\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n /**\n * Search a vector store for relevant chunks based on a query and file attributes\n * filter.\n */\n search(vectorStoreId, body, options) {\n return this._client.getAPIList(`/vector_stores/${vectorStoreId}/search`, VectorStoreSearchResponsesPage, {\n body,\n method: 'post',\n ...options,\n headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers },\n });\n }\n}\nexport class VectorStoresPage extends CursorPage {\n}\n/**\n * Note: no pagination actually occurs yet, this is for forwards-compatibility.\n */\nexport class VectorStoreSearchResponsesPage extends Page {\n}\nVectorStores.VectorStoresPage = VectorStoresPage;\nVectorStores.VectorStoreSearchResponsesPage = VectorStoreSearchResponsesPage;\nVectorStores.Files = Files;\nVectorStores.VectorStoreFilesPage = VectorStoreFilesPage;\nVectorStores.FileContentResponsesPage = FileContentResponsesPage;\nVectorStores.FileBatches = FileBatches;\n//# sourceMappingURL=vector-stores.mjs.map","// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.\nvar _a;\nimport * as qs from \"./internal/qs/index.mjs\";\nimport * as Core from \"./core.mjs\";\nimport * as Errors from \"./error.mjs\";\nimport * as Pagination from \"./pagination.mjs\";\nimport * as Uploads from \"./uploads.mjs\";\nimport * as API from \"./resources/index.mjs\";\nimport { Batches, BatchesPage, } from \"./resources/batches.mjs\";\nimport { Completions, } from \"./resources/completions.mjs\";\nimport { Embeddings, } from \"./resources/embeddings.mjs\";\nimport { FileObjectsPage, Files, } from \"./resources/files.mjs\";\nimport { Images, } from \"./resources/images.mjs\";\nimport { Models, ModelsPage } from \"./resources/models.mjs\";\nimport { Moderations, } from \"./resources/moderations.mjs\";\nimport { Audio } from \"./resources/audio/audio.mjs\";\nimport { Beta } from \"./resources/beta/beta.mjs\";\nimport { Chat } from \"./resources/chat/chat.mjs\";\nimport { ContainerListResponsesPage, Containers, } from \"./resources/containers/containers.mjs\";\nimport { EvalListResponsesPage, Evals, } from \"./resources/evals/evals.mjs\";\nimport { FineTuning } from \"./resources/fine-tuning/fine-tuning.mjs\";\nimport { Graders } from \"./resources/graders/graders.mjs\";\nimport { Responses } from \"./resources/responses/responses.mjs\";\nimport { Uploads as UploadsAPIUploads, } from \"./resources/uploads/uploads.mjs\";\nimport { VectorStoreSearchResponsesPage, VectorStores, VectorStoresPage, } from \"./resources/vector-stores/vector-stores.mjs\";\nimport { ChatCompletionsPage, } from \"./resources/chat/completions/completions.mjs\";\n/**\n * API Client for interfacing with the OpenAI API.\n */\nexport class OpenAI extends Core.APIClient {\n /**\n * API Client for interfacing with the OpenAI API.\n *\n * @param {string | undefined} [opts.apiKey=process.env['OPENAI_API_KEY'] ?? undefined]\n * @param {string | null | undefined} [opts.organization=process.env['OPENAI_ORG_ID'] ?? null]\n * @param {string | null | undefined} [opts.project=process.env['OPENAI_PROJECT_ID'] ?? null]\n * @param {string} [opts.baseURL=process.env['OPENAI_BASE_URL'] ?? https://api.openai.com/v1] - Override the default base URL for the API.\n * @param {number} [opts.timeout=10 minutes] - The maximum amount of time (in milliseconds) the client will wait for a response before timing out.\n * @param {number} [opts.httpAgent] - An HTTP agent used to manage HTTP(s) connections.\n * @param {Core.Fetch} [opts.fetch] - Specify a custom `fetch` function implementation.\n * @param {number} [opts.maxRetries=2] - The maximum number of times the client will retry a request.\n * @param {Core.Headers} opts.defaultHeaders - Default headers to include with every request to the API.\n * @param {Core.DefaultQuery} opts.defaultQuery - Default query parameters to include with every request to the API.\n * @param {boolean} [opts.dangerouslyAllowBrowser=false] - By default, client-side use of this library is not allowed, as it risks exposing your secret API credentials to attackers.\n */\n constructor({ baseURL = Core.readEnv('OPENAI_BASE_URL'), apiKey = Core.readEnv('OPENAI_API_KEY'), organization = Core.readEnv('OPENAI_ORG_ID') ?? null, project = Core.readEnv('OPENAI_PROJECT_ID') ?? null, ...opts } = {}) {\n if (apiKey === undefined) {\n throw new Errors.OpenAIError(\"The OPENAI_API_KEY environment variable is missing or empty; either provide it, or instantiate the OpenAI client with an apiKey option, like new OpenAI({ apiKey: 'My API Key' }).\");\n }\n const options = {\n apiKey,\n organization,\n project,\n ...opts,\n baseURL: baseURL || `https://api.openai.com/v1`,\n };\n if (!options.dangerouslyAllowBrowser && Core.isRunningInBrowser()) {\n throw new Errors.OpenAIError(\"It looks like you're running in a browser-like environment.\\n\\nThis is disabled by default, as it risks exposing your secret API credentials to attackers.\\nIf you understand the risks and have appropriate mitigations in place,\\nyou can set the `dangerouslyAllowBrowser` option to `true`, e.g.,\\n\\nnew OpenAI({ apiKey, dangerouslyAllowBrowser: true });\\n\\nhttps://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety\\n\");\n }\n super({\n baseURL: options.baseURL,\n timeout: options.timeout ?? 600000 /* 10 minutes */,\n httpAgent: options.httpAgent,\n maxRetries: options.maxRetries,\n fetch: options.fetch,\n });\n this.completions = new API.Completions(this);\n this.chat = new API.Chat(this);\n this.embeddings = new API.Embeddings(this);\n this.files = new API.Files(this);\n this.images = new API.Images(this);\n this.audio = new API.Audio(this);\n this.moderations = new API.Moderations(this);\n this.models = new API.Models(this);\n this.fineTuning = new API.FineTuning(this);\n this.graders = new API.Graders(this);\n this.vectorStores = new API.VectorStores(this);\n this.beta = new API.Beta(this);\n this.batches = new API.Batches(this);\n this.uploads = new API.Uploads(this);\n this.responses = new API.Responses(this);\n this.evals = new API.Evals(this);\n this.containers = new API.Containers(this);\n this._options = options;\n this.apiKey = apiKey;\n this.organization = organization;\n this.project = project;\n }\n defaultQuery() {\n return this._options.defaultQuery;\n }\n defaultHeaders(opts) {\n return {\n ...super.defaultHeaders(opts),\n 'OpenAI-Organization': this.organization,\n 'OpenAI-Project': this.project,\n ...this._options.defaultHeaders,\n };\n }\n authHeaders(opts) {\n return { Authorization: `Bearer ${this.apiKey}` };\n }\n stringifyQuery(query) {\n return qs.stringify(query, { arrayFormat: 'brackets' });\n }\n}\n_a = OpenAI;\nOpenAI.OpenAI = _a;\nOpenAI.DEFAULT_TIMEOUT = 600000; // 10 minutes\nOpenAI.OpenAIError = Errors.OpenAIError;\nOpenAI.APIError = Errors.APIError;\nOpenAI.APIConnectionError = Errors.APIConnectionError;\nOpenAI.APIConnectionTimeoutError = Errors.APIConnectionTimeoutError;\nOpenAI.APIUserAbortError = Errors.APIUserAbortError;\nOpenAI.NotFoundError = Errors.NotFoundError;\nOpenAI.ConflictError = Errors.ConflictError;\nOpenAI.RateLimitError = Errors.RateLimitError;\nOpenAI.BadRequestError = Errors.BadRequestError;\nOpenAI.AuthenticationError = Errors.AuthenticationError;\nOpenAI.InternalServerError = Errors.InternalServerError;\nOpenAI.PermissionDeniedError = Errors.PermissionDeniedError;\nOpenAI.UnprocessableEntityError = Errors.UnprocessableEntityError;\nOpenAI.toFile = Uploads.toFile;\nOpenAI.fileFromPath = Uploads.fileFromPath;\nOpenAI.Completions = Completions;\nOpenAI.Chat = Chat;\nOpenAI.ChatCompletionsPage = ChatCompletionsPage;\nOpenAI.Embeddings = Embeddings;\nOpenAI.Files = Files;\nOpenAI.FileObjectsPage = FileObjectsPage;\nOpenAI.Images = Images;\nOpenAI.Audio = Audio;\nOpenAI.Moderations = Moderations;\nOpenAI.Models = Models;\nOpenAI.ModelsPage = ModelsPage;\nOpenAI.FineTuning = FineTuning;\nOpenAI.Graders = Graders;\nOpenAI.VectorStores = VectorStores;\nOpenAI.VectorStoresPage = VectorStoresPage;\nOpenAI.VectorStoreSearchResponsesPage = VectorStoreSearchResponsesPage;\nOpenAI.Beta = Beta;\nOpenAI.Batches = Batches;\nOpenAI.BatchesPage = BatchesPage;\nOpenAI.Uploads = UploadsAPIUploads;\nOpenAI.Responses = Responses;\nOpenAI.Evals = Evals;\nOpenAI.EvalListResponsesPage = EvalListResponsesPage;\nOpenAI.Containers = Containers;\nOpenAI.ContainerListResponsesPage = ContainerListResponsesPage;\n/** API Client for interfacing with the Azure OpenAI API. */\nexport class AzureOpenAI extends OpenAI {\n /**\n * API Client for interfacing with the Azure OpenAI API.\n *\n * @param {string | undefined} [opts.apiVersion=process.env['OPENAI_API_VERSION'] ?? undefined]\n * @param {string | undefined} [opts.endpoint=process.env['AZURE_OPENAI_ENDPOINT'] ?? undefined] - Your Azure endpoint, including the resource, e.g. `https://example-resource.azure.openai.com/`\n * @param {string | undefined} [opts.apiKey=process.env['AZURE_OPENAI_API_KEY'] ?? undefined]\n * @param {string | undefined} opts.deployment - A model deployment, if given, sets the base client URL to include `/deployments/{deployment}`.\n * @param {string | null | undefined} [opts.organization=process.env['OPENAI_ORG_ID'] ?? null]\n * @param {string} [opts.baseURL=process.env['OPENAI_BASE_URL']] - Sets the base URL for the API, e.g. `https://example-resource.azure.openai.com/openai/`.\n * @param {number} [opts.timeout=10 minutes] - The maximum amount of time (in milliseconds) the client will wait for a response before timing out.\n * @param {number} [opts.httpAgent] - An HTTP agent used to manage HTTP(s) connections.\n * @param {Core.Fetch} [opts.fetch] - Specify a custom `fetch` function implementation.\n * @param {number} [opts.maxRetries=2] - The maximum number of times the client will retry a request.\n * @param {Core.Headers} opts.defaultHeaders - Default headers to include with every request to the API.\n * @param {Core.DefaultQuery} opts.defaultQuery - Default query parameters to include with every request to the API.\n * @param {boolean} [opts.dangerouslyAllowBrowser=false] - By default, client-side use of this library is not allowed, as it risks exposing your secret API credentials to attackers.\n */\n constructor({ baseURL = Core.readEnv('OPENAI_BASE_URL'), apiKey = Core.readEnv('AZURE_OPENAI_API_KEY'), apiVersion = Core.readEnv('OPENAI_API_VERSION'), endpoint, deployment, azureADTokenProvider, dangerouslyAllowBrowser, ...opts } = {}) {\n if (!apiVersion) {\n throw new Errors.OpenAIError(\"The OPENAI_API_VERSION environment variable is missing or empty; either provide it, or instantiate the AzureOpenAI client with an apiVersion option, like new AzureOpenAI({ apiVersion: 'My API Version' }).\");\n }\n if (typeof azureADTokenProvider === 'function') {\n dangerouslyAllowBrowser = true;\n }\n if (!azureADTokenProvider && !apiKey) {\n throw new Errors.OpenAIError('Missing credentials. Please pass one of `apiKey` and `azureADTokenProvider`, or set the `AZURE_OPENAI_API_KEY` environment variable.');\n }\n if (azureADTokenProvider && apiKey) {\n throw new Errors.OpenAIError('The `apiKey` and `azureADTokenProvider` arguments are mutually exclusive; only one can be passed at a time.');\n }\n // define a sentinel value to avoid any typing issues\n apiKey ?? (apiKey = API_KEY_SENTINEL);\n opts.defaultQuery = { ...opts.defaultQuery, 'api-version': apiVersion };\n if (!baseURL) {\n if (!endpoint) {\n endpoint = process.env['AZURE_OPENAI_ENDPOINT'];\n }\n if (!endpoint) {\n throw new Errors.OpenAIError('Must provide one of the `baseURL` or `endpoint` arguments, or the `AZURE_OPENAI_ENDPOINT` environment variable');\n }\n baseURL = `${endpoint}/openai`;\n }\n else {\n if (endpoint) {\n throw new Errors.OpenAIError('baseURL and endpoint are mutually exclusive');\n }\n }\n super({\n apiKey,\n baseURL,\n ...opts,\n ...(dangerouslyAllowBrowser !== undefined ? { dangerouslyAllowBrowser } : {}),\n });\n this.apiVersion = '';\n this._azureADTokenProvider = azureADTokenProvider;\n this.apiVersion = apiVersion;\n this.deploymentName = deployment;\n }\n buildRequest(options, props = {}) {\n if (_deployments_endpoints.has(options.path) && options.method === 'post' && options.body !== undefined) {\n if (!Core.isObj(options.body)) {\n throw new Error('Expected request body to be an object');\n }\n const model = this.deploymentName || options.body['model'] || options.__metadata?.['model'];\n if (model !== undefined && !this.baseURL.includes('/deployments')) {\n options.path = `/deployments/${model}${options.path}`;\n }\n }\n return super.buildRequest(options, props);\n }\n async _getAzureADToken() {\n if (typeof this._azureADTokenProvider === 'function') {\n const token = await this._azureADTokenProvider();\n if (!token || typeof token !== 'string') {\n throw new Errors.OpenAIError(`Expected 'azureADTokenProvider' argument to return a string but it returned ${token}`);\n }\n return token;\n }\n return undefined;\n }\n authHeaders(opts) {\n return {};\n }\n async prepareOptions(opts) {\n /**\n * The user should provide a bearer token provider if they want\n * to use Azure AD authentication. The user shouldn't set the\n * Authorization header manually because the header is overwritten\n * with the Azure AD token if a bearer token provider is provided.\n */\n if (opts.headers?.['api-key']) {\n return super.prepareOptions(opts);\n }\n const token = await this._getAzureADToken();\n opts.headers ?? (opts.headers = {});\n if (token) {\n opts.headers['Authorization'] = `Bearer ${token}`;\n }\n else if (this.apiKey !== API_KEY_SENTINEL) {\n opts.headers['api-key'] = this.apiKey;\n }\n else {\n throw new Errors.OpenAIError('Unable to handle auth');\n }\n return super.prepareOptions(opts);\n }\n}\nconst _deployments_endpoints = new Set([\n '/completions',\n '/chat/completions',\n '/embeddings',\n '/audio/transcriptions',\n '/audio/translations',\n '/audio/speech',\n '/images/generations',\n '/images/edits',\n]);\nconst API_KEY_SENTINEL = '<Missing Key>';\nexport { toFile, fileFromPath } from \"./uploads.mjs\";\nexport { OpenAIError, APIError, APIConnectionError, APIConnectionTimeoutError, APIUserAbortError, NotFoundError, ConflictError, RateLimitError, BadRequestError, AuthenticationError, InternalServerError, PermissionDeniedError, UnprocessableEntityError, } from \"./error.mjs\";\nexport default OpenAI;\n//# sourceMappingURL=index.mjs.map","/**\n * LLM Service - Core OpenAI wrapper for HoloSphere\n * Provides simple chat completions without Assistants API\n */\n\nimport OpenAI from 'openai';\n\n/**\n * LLM Service class for interacting with OpenAI\n */\nexport class LLMService {\n /**\n * @param {string} apiKey - OpenAI API key\n * @param {Object} options - Configuration options\n * @param {string} options.model - Model to use (default: 'gpt-4o-mini')\n * @param {number} options.maxTokens - Max tokens (default: 2000)\n * @param {number} options.temperature - Temperature (default: 0.7)\n */\n constructor(apiKey, options = {}) {\n if (!apiKey) {\n throw new Error('OpenAI API key is required');\n }\n\n this.openai = new OpenAI({ apiKey });\n this.model = options.model || 'gpt-4o-mini';\n this.maxTokens = options.maxTokens || 2000;\n this.temperature = options.temperature || 0.7;\n }\n\n /**\n * Send a message to the LLM\n * @param {string} systemPrompt - System prompt\n * @param {string} userMessage - User message\n * @param {Object} options - Override options\n * @returns {Promise<string>} Response content\n */\n async sendMessage(systemPrompt, userMessage, options = {}) {\n try {\n const response = await this.openai.chat.completions.create({\n model: options.model || this.model,\n messages: [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userMessage }\n ],\n max_tokens: options.maxTokens || this.maxTokens,\n temperature: options.temperature ?? this.temperature,\n });\n\n return response.choices[0]?.message?.content?.trim() || '';\n } catch (error) {\n throw new Error(`LLM request failed: ${error.message}`);\n }\n }\n\n /**\n * Send multiple messages (conversation)\n * @param {Array<{role: string, content: string}>} messages - Messages array\n * @param {Object} options - Override options\n * @returns {Promise<string>} Response content\n */\n async chat(messages, options = {}) {\n try {\n const response = await this.openai.chat.completions.create({\n model: options.model || this.model,\n messages,\n max_tokens: options.maxTokens || this.maxTokens,\n temperature: options.temperature ?? this.temperature,\n });\n\n return response.choices[0]?.message?.content?.trim() || '';\n } catch (error) {\n throw new Error(`LLM chat failed: ${error.message}`);\n }\n }\n\n /**\n * Summarize text\n * @param {string} text - Text to summarize\n * @param {Object} options - Options (maxLength, style)\n * @returns {Promise<string>} Summary\n */\n async summarize(text, options = {}) {\n const systemPrompt = `You are a helpful assistant that summarizes text concisely while preserving key information. Keep summaries clear and focused.${\n options.maxLength ? ` Keep the summary under ${options.maxLength} words.` : ''\n }${options.style ? ` Style: ${options.style}.` : ''}`;\n\n return this.sendMessage(systemPrompt, text, { temperature: 0.5 });\n }\n\n /**\n * Analyze text from a specific perspective\n * @param {string} text - Text to analyze\n * @param {string} aspect - Aspect to analyze (sentiment, themes, tone, etc.)\n * @returns {Promise<string>} Analysis\n */\n async analyze(text, aspect) {\n const systemPrompt = `You are an expert analyst. Analyze the following text from the perspective of \"${aspect}\". Provide a clear, structured analysis.`;\n return this.sendMessage(systemPrompt, text, { temperature: 0.3 });\n }\n\n /**\n * Extract keywords from text\n * @param {string} text - Text to extract keywords from\n * @param {number} maxKeywords - Maximum keywords (default: 10)\n * @returns {Promise<string[]>} Array of keywords\n */\n async extractKeywords(text, maxKeywords = 10) {\n const systemPrompt = `Extract the ${maxKeywords} most important keywords or key phrases from the text. Return ONLY a JSON array of strings, nothing else. Example: [\"keyword1\", \"keyword2\"]`;\n const response = await this.sendMessage(systemPrompt, text, { temperature: 0.2 });\n\n try {\n return JSON.parse(response);\n } catch {\n // Try to extract array from response if JSON parsing fails\n const match = response.match(/\\[[\\s\\S]*\\]/);\n if (match) {\n return JSON.parse(match[0]);\n }\n return response.split(',').map(k => k.trim().replace(/[\"\\[\\]]/g, ''));\n }\n }\n\n /**\n * Categorize text into given categories\n * @param {string} text - Text to categorize\n * @param {string[]} categories - Available categories\n * @returns {Promise<{category: string, confidence: number, reasoning: string}>}\n */\n async categorize(text, categories) {\n const systemPrompt = `Categorize the following text into one of these categories: ${categories.join(', ')}.\nReturn ONLY a JSON object with: {\"category\": \"chosen_category\", \"confidence\": 0.0-1.0, \"reasoning\": \"brief explanation\"}`;\n\n const response = await this.sendMessage(systemPrompt, text, { temperature: 0.2 });\n\n try {\n return JSON.parse(response);\n } catch {\n const match = response.match(/\\{[\\s\\S]*\\}/);\n if (match) {\n return JSON.parse(match[0]);\n }\n return { category: categories[0], confidence: 0.5, reasoning: response };\n }\n }\n\n /**\n * Translate text to target language\n * @param {string} text - Text to translate\n * @param {string} targetLanguage - Target language\n * @returns {Promise<string>} Translated text\n */\n async translate(text, targetLanguage) {\n const systemPrompt = `Translate the following text to ${targetLanguage}. Return ONLY the translation, nothing else.`;\n return this.sendMessage(systemPrompt, text, { temperature: 0.3 });\n }\n\n /**\n * Generate questions about content\n * @param {string} text - Text to generate questions about\n * @param {number} count - Number of questions (default: 5)\n * @returns {Promise<string[]>} Array of questions\n */\n async generateQuestions(text, count = 5) {\n const systemPrompt = `Generate ${count} insightful questions about the following text. Return ONLY a JSON array of question strings, nothing else. Example: [\"Question 1?\", \"Question 2?\"]`;\n const response = await this.sendMessage(systemPrompt, text, { temperature: 0.7 });\n\n try {\n return JSON.parse(response);\n } catch {\n const match = response.match(/\\[[\\s\\S]*\\]/);\n if (match) {\n return JSON.parse(match[0]);\n }\n return response.split('\\n').filter(q => q.trim().endsWith('?'));\n }\n }\n\n /**\n * Get JSON response from LLM\n * @param {string} systemPrompt - System prompt\n * @param {string} userMessage - User message\n * @param {Object} options - Options\n * @returns {Promise<Object>} Parsed JSON response\n */\n async getJSON(systemPrompt, userMessage, options = {}) {\n const response = await this.sendMessage(\n systemPrompt + '\\n\\nReturn ONLY valid JSON, no additional text.',\n userMessage,\n { ...options, temperature: options.temperature ?? 0.2 }\n );\n\n try {\n return JSON.parse(response);\n } catch {\n // Try to extract JSON from response\n const match = response.match(/[\\[{][\\s\\S]*[\\]}]/);\n if (match) {\n return JSON.parse(match[0]);\n }\n throw new Error(`Failed to parse JSON response: ${response.substring(0, 100)}`);\n }\n }\n}\n\nexport default LLMService;\n","/**\n * Schema Extractor - Extract structured data from text using JSON schemas\n */\n\n/**\n * Schema Extractor class\n */\nexport class SchemaExtractor {\n /**\n * @param {LLMService} llmService - LLM service instance\n */\n constructor(llmService) {\n this.llm = llmService;\n }\n\n /**\n * Extract data from text based on JSON schema\n * @param {string} text - Text to extract from\n * @param {Object} schema - JSON schema defining expected structure\n * @param {Object} options - Extraction options\n * @returns {Promise<Object>} Extracted data conforming to schema\n */\n async extractToSchema(text, schema, options = {}) {\n const schemaDescription = this._describeSchema(schema);\n\n const systemPrompt = `You are a data extraction expert. Extract structured information from the provided text according to this JSON schema:\n\n${JSON.stringify(schema, null, 2)}\n\nSchema field descriptions:\n${schemaDescription}\n\nRules:\n1. Extract ONLY information present in the text\n2. Use null for fields where information is not available\n3. Follow the exact schema structure and field types\n4. For arrays, include all relevant items found\n5. Return ONLY valid JSON matching the schema`;\n\n const response = await this.llm.getJSON(systemPrompt, text, {\n temperature: 0.2,\n maxTokens: options.maxTokens || 2000\n });\n\n return response;\n }\n\n /**\n * Generate a human-readable description of the schema\n * @private\n */\n _describeSchema(schema, path = '') {\n const descriptions = [];\n\n if (schema.description) {\n descriptions.push(`${path || 'root'}: ${schema.description}`);\n }\n\n if (schema.properties) {\n for (const [key, prop] of Object.entries(schema.properties)) {\n const fieldPath = path ? `${path}.${key}` : key;\n const type = prop.type || 'any';\n const required = schema.required?.includes(key) ? ' (required)' : '';\n const desc = prop.description || '';\n\n descriptions.push(`- ${fieldPath} [${type}]${required}: ${desc}`);\n\n if (prop.type === 'object' && prop.properties) {\n descriptions.push(this._describeSchema(prop, fieldPath));\n }\n\n if (prop.type === 'array' && prop.items) {\n if (prop.items.properties) {\n descriptions.push(this._describeSchema(prop.items, `${fieldPath}[]`));\n }\n }\n }\n }\n\n return descriptions.join('\\n');\n }\n\n /**\n * Extract multiple items from text\n * @param {string} text - Text containing multiple items\n * @param {Object} itemSchema - Schema for each item\n * @param {Object} options - Options\n * @returns {Promise<Object[]>} Array of extracted items\n */\n async extractMultiple(text, itemSchema, options = {}) {\n const systemPrompt = `You are a data extraction expert. Extract ALL items matching this schema from the text:\n\n${JSON.stringify(itemSchema, null, 2)}\n\nReturn a JSON array of all items found. If no items found, return [].\nReturn ONLY valid JSON array.`;\n\n const response = await this.llm.getJSON(systemPrompt, text, {\n temperature: 0.2,\n maxTokens: options.maxTokens || 3000\n });\n\n return Array.isArray(response) ? response : [response];\n }\n\n /**\n * Fill missing fields in existing data\n * @param {Object} data - Existing data with some fields\n * @param {string} text - Text to extract missing data from\n * @param {Object} schema - Full schema\n * @returns {Promise<Object>} Complete data\n */\n async fillMissing(data, text, schema) {\n const missingFields = this._findMissingFields(data, schema);\n\n if (missingFields.length === 0) {\n return data;\n }\n\n const systemPrompt = `You have existing data:\n${JSON.stringify(data, null, 2)}\n\nExtract ONLY the following missing fields from the text:\n${missingFields.join(', ')}\n\nBased on this schema:\n${JSON.stringify(schema, null, 2)}\n\nReturn JSON with ONLY the missing fields that you can extract. Do not modify existing fields.`;\n\n const extracted = await this.llm.getJSON(systemPrompt, text, { temperature: 0.2 });\n\n return { ...data, ...extracted };\n }\n\n /**\n * Find fields missing from data based on schema\n * @private\n */\n _findMissingFields(data, schema, path = '') {\n const missing = [];\n\n if (schema.properties) {\n for (const [key, prop] of Object.entries(schema.properties)) {\n const fieldPath = path ? `${path}.${key}` : key;\n const value = data[key];\n\n if (value === undefined || value === null) {\n missing.push(fieldPath);\n } else if (prop.type === 'object' && prop.properties) {\n missing.push(...this._findMissingFields(value, prop, fieldPath));\n }\n }\n }\n\n return missing;\n }\n\n /**\n * Validate extracted data against schema\n * @param {Object} data - Extracted data\n * @param {Object} schema - JSON schema\n * @returns {{valid: boolean, errors: string[]}}\n */\n validateExtraction(data, schema) {\n const errors = [];\n\n if (schema.required) {\n for (const field of schema.required) {\n if (data[field] === undefined || data[field] === null) {\n errors.push(`Missing required field: ${field}`);\n }\n }\n }\n\n if (schema.properties) {\n for (const [key, prop] of Object.entries(schema.properties)) {\n const value = data[key];\n\n if (value !== undefined && value !== null) {\n const typeValid = this._validateType(value, prop.type);\n if (!typeValid) {\n errors.push(`Invalid type for ${key}: expected ${prop.type}, got ${typeof value}`);\n }\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n }\n\n /**\n * Validate value type\n * @private\n */\n _validateType(value, type) {\n switch (type) {\n case 'string':\n return typeof value === 'string';\n case 'number':\n case 'integer':\n return typeof value === 'number';\n case 'boolean':\n return typeof value === 'boolean';\n case 'array':\n return Array.isArray(value);\n case 'object':\n return typeof value === 'object' && !Array.isArray(value);\n default:\n return true;\n }\n }\n}\n\nexport default SchemaExtractor;\n","/**\n * Fuzzy JSON Operations - AI-assisted semantic operations on JSON structures\n */\n\n/**\n * JSON Operations class for semantic JSON manipulation\n */\nexport class JSONOps {\n /**\n * @param {LLMService} llmService - LLM service instance\n */\n constructor(llmService) {\n this.llm = llmService;\n }\n\n /**\n * Semantically merge two JSON objects\n * @param {Object} obj1 - First object\n * @param {Object} obj2 - Second object\n * @param {Object} options - Merge options\n * @returns {Promise<Object>} Merged object\n */\n async add(obj1, obj2, options = {}) {\n const systemPrompt = `You are a JSON merge expert. Semantically merge these two JSON objects.\n\nRules:\n1. Combine information from both objects intelligently\n2. For conflicting values, prefer the more complete/detailed one${options.preferSecond ? ', or prefer the second object' : ''}\n3. Merge arrays by combining items, removing duplicates by semantic similarity\n4. Preserve all unique information from both objects\n5. Return ONLY valid JSON`;\n\n const userMessage = `Object 1:\n${JSON.stringify(obj1, null, 2)}\n\nObject 2:\n${JSON.stringify(obj2, null, 2)}`;\n\n return this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.2 });\n }\n\n /**\n * Remove concepts from obj1 based on obj2\n * @param {Object} obj1 - Base object\n * @param {Object} obj2 - Object containing concepts to remove\n * @returns {Promise<Object>} Result with concepts removed\n */\n async subtract(obj1, obj2) {\n const systemPrompt = `You are a JSON manipulation expert. Remove concepts from the first object that are semantically present in the second object.\n\nRules:\n1. Remove fields from obj1 that have semantic equivalents in obj2\n2. For arrays, remove items that are semantically similar to items in obj2\n3. Preserve fields/items in obj1 that have no semantic match in obj2\n4. Remove nested content that matches semantically\n5. Return ONLY valid JSON`;\n\n const userMessage = `Base object (to modify):\n${JSON.stringify(obj1, null, 2)}\n\nConcepts to remove:\n${JSON.stringify(obj2, null, 2)}`;\n\n return this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.2 });\n }\n\n /**\n * Combine objects with semantic deduplication\n * @param {Object} obj1 - First object\n * @param {Object} obj2 - Second object\n * @returns {Promise<Object>} Union of objects\n */\n async union(obj1, obj2) {\n const systemPrompt = `You are a JSON merge expert. Create a semantic union of these two JSON objects.\n\nRules:\n1. Include all unique information from both objects\n2. For duplicate concepts, keep only one (the more complete version)\n3. Deduplicate array items by semantic similarity, not just exact match\n4. Merge nested objects recursively with the same rules\n5. Return ONLY valid JSON`;\n\n const userMessage = `Object 1:\n${JSON.stringify(obj1, null, 2)}\n\nObject 2:\n${JSON.stringify(obj2, null, 2)}`;\n\n return this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.2 });\n }\n\n /**\n * Find differences between two objects\n * @param {Object} obj1 - First object\n * @param {Object} obj2 - Second object\n * @returns {Promise<{added: Object, removed: Object, changed: Object}>} Differences\n */\n async difference(obj1, obj2) {\n const systemPrompt = `You are a JSON comparison expert. Find the semantic differences between these two JSON objects.\n\nReturn a JSON object with:\n- \"added\": fields/values present in obj2 but not in obj1\n- \"removed\": fields/values present in obj1 but not in obj2\n- \"changed\": fields where the value changed (show both old and new)\n\nConsider semantic similarity - fields with different names but same meaning should be considered the same.\nReturn ONLY valid JSON with the structure: {\"added\": {}, \"removed\": {}, \"changed\": {}}`;\n\n const userMessage = `Object 1 (original):\n${JSON.stringify(obj1, null, 2)}\n\nObject 2 (new):\n${JSON.stringify(obj2, null, 2)}`;\n\n return this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.2 });\n }\n\n /**\n * Concatenate arrays and text fields semantically\n * @param {Object} obj1 - First object\n * @param {Object} obj2 - Second object\n * @returns {Promise<Object>} Concatenated object\n */\n async concatenate(obj1, obj2) {\n const systemPrompt = `You are a JSON concatenation expert. Concatenate these two JSON objects.\n\nRules:\n1. For string fields: append obj2 values to obj1 values with appropriate separators\n2. For array fields: append obj2 arrays to obj1 arrays\n3. For number fields: sum the values\n4. For object fields: recursively concatenate\n5. For boolean fields: use logical OR\n6. Preserve the structure of obj1\n7. Return ONLY valid JSON`;\n\n const userMessage = `Object 1:\n${JSON.stringify(obj1, null, 2)}\n\nObject 2:\n${JSON.stringify(obj2, null, 2)}`;\n\n return this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.2 });\n }\n\n /**\n * Find intersection - common concepts between objects\n * @param {Object} obj1 - First object\n * @param {Object} obj2 - Second object\n * @returns {Promise<Object>} Common elements\n */\n async intersection(obj1, obj2) {\n const systemPrompt = `You are a JSON comparison expert. Find the semantic intersection of these two JSON objects.\n\nRules:\n1. Return only fields/values that are semantically present in BOTH objects\n2. For arrays, return only items that have semantic matches in both\n3. Consider semantic similarity, not just exact matches\n4. Return ONLY valid JSON`;\n\n const userMessage = `Object 1:\n${JSON.stringify(obj1, null, 2)}\n\nObject 2:\n${JSON.stringify(obj2, null, 2)}`;\n\n return this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.2 });\n }\n\n /**\n * Transform object structure\n * @param {Object} obj - Object to transform\n * @param {string} targetStructure - Description of target structure\n * @returns {Promise<Object>} Transformed object\n */\n async transform(obj, targetStructure) {\n const systemPrompt = `You are a JSON transformation expert. Transform this JSON object according to the target structure description.\n\nTarget structure: ${targetStructure}\n\nRules:\n1. Map existing fields to the new structure\n2. Preserve all information, reorganizing as needed\n3. Use appropriate type conversions\n4. Return ONLY valid JSON`;\n\n return this.llm.getJSON(systemPrompt, JSON.stringify(obj, null, 2), { temperature: 0.3 });\n }\n\n /**\n * Simplify/flatten nested object\n * @param {Object} obj - Object to simplify\n * @param {Object} options - Options\n * @returns {Promise<Object>} Simplified object\n */\n async simplify(obj, options = {}) {\n const systemPrompt = `You are a JSON simplification expert. Simplify this nested JSON object.\n\nRules:\n1. Flatten deeply nested structures where appropriate\n2. Combine redundant fields\n3. Remove null/empty values${options.keepEmpty ? ' (unless specified to keep)' : ''}\n4. Use clear, concise field names\n5. Return ONLY valid JSON`;\n\n return this.llm.getJSON(systemPrompt, JSON.stringify(obj, null, 2), { temperature: 0.3 });\n }\n\n /**\n * Apply a natural language operation to JSON\n * @param {Object} obj - Object to modify\n * @param {string} operation - Natural language description of operation\n * @returns {Promise<Object>} Modified object\n */\n async apply(obj, operation) {\n const systemPrompt = `You are a JSON manipulation expert. Apply the following operation to the JSON object:\n\nOperation: ${operation}\n\nReturn ONLY valid JSON with the operation applied.`;\n\n return this.llm.getJSON(systemPrompt, JSON.stringify(obj, null, 2), { temperature: 0.3 });\n }\n}\n\nexport default JSONOps;\n","/**\n * Embeddings - Vector embedding generation and semantic search\n */\n\n/**\n * Embeddings class for vector operations\n */\nexport class Embeddings {\n /**\n * @param {Object} openai - OpenAI client instance\n * @param {Object} holosphere - HoloSphere instance for storage\n */\n constructor(openai, holosphere = null) {\n this.openai = openai;\n this.holosphere = holosphere;\n this.model = 'text-embedding-3-small';\n this.dimensions = 1536;\n }\n\n /**\n * Set HoloSphere instance for storage\n * @param {Object} holosphere - HoloSphere instance\n */\n setHoloSphere(holosphere) {\n this.holosphere = holosphere;\n }\n\n /**\n * Generate embedding for text\n * @param {string} text - Text to embed\n * @returns {Promise<number[]>} Embedding vector\n */\n async embed(text) {\n try {\n const response = await this.openai.embeddings.create({\n model: this.model,\n input: text,\n });\n\n return response.data[0].embedding;\n } catch (error) {\n throw new Error(`Embedding generation failed: ${error.message}`);\n }\n }\n\n /**\n * Generate embeddings for multiple texts\n * @param {string[]} texts - Array of texts\n * @returns {Promise<number[][]>} Array of embeddings\n */\n async embedBatch(texts) {\n try {\n const response = await this.openai.embeddings.create({\n model: this.model,\n input: texts,\n });\n\n return response.data.map(d => d.embedding);\n } catch (error) {\n throw new Error(`Batch embedding failed: ${error.message}`);\n }\n }\n\n /**\n * Calculate cosine similarity between two vectors\n * @param {number[]} vec1 - First vector\n * @param {number[]} vec2 - Second vector\n * @returns {number} Similarity score (0-1)\n */\n cosineSimilarity(vec1, vec2) {\n if (vec1.length !== vec2.length) {\n throw new Error('Vectors must have same length');\n }\n\n let dotProduct = 0;\n let norm1 = 0;\n let norm2 = 0;\n\n for (let i = 0; i < vec1.length; i++) {\n dotProduct += vec1[i] * vec2[i];\n norm1 += vec1[i] * vec1[i];\n norm2 += vec2[i] * vec2[i];\n }\n\n return dotProduct / (Math.sqrt(norm1) * Math.sqrt(norm2));\n }\n\n /**\n * Store item with embedding in HoloSphere\n * @param {string} holon - Holon identifier\n * @param {string} lens - Lens name\n * @param {Object} item - Item to store\n * @param {string} textField - Field to embed (default: 'content' or 'text')\n * @returns {Promise<Object>} Stored item with embedding\n */\n async storeWithEmbedding(holon, lens, item, textField = null) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required for storage');\n }\n\n // Determine text to embed\n const text = textField\n ? item[textField]\n : item.content || item.text || item.description || JSON.stringify(item);\n\n if (!text) {\n throw new Error('No text found to embed');\n }\n\n // Generate embedding\n const embedding = await this.embed(text);\n\n // Store with embedding\n const itemWithEmbedding = {\n ...item,\n _embedding: embedding,\n _embeddedField: textField || 'auto',\n _embeddedAt: Date.now(),\n };\n\n await this.holosphere.put(holon, lens, itemWithEmbedding);\n\n return itemWithEmbedding;\n }\n\n /**\n * Semantic search within a holon/lens\n * @param {string} query - Search query\n * @param {string} holon - Holon identifier\n * @param {string} lens - Lens name\n * @param {Object} options - Search options\n * @returns {Promise<Array<{item: Object, similarity: number}>>} Ranked results\n */\n async semanticSearch(query, holon, lens, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required for search');\n }\n\n const { limit = 10, threshold = 0.5 } = options;\n\n // Get query embedding\n const queryEmbedding = await this.embed(query);\n\n // Get all items from holon/lens\n const items = await this.holosphere.getAll(holon, lens);\n\n // Calculate similarities\n const results = [];\n\n for (const item of items) {\n if (item._embedding) {\n const similarity = this.cosineSimilarity(queryEmbedding, item._embedding);\n\n if (similarity >= threshold) {\n results.push({\n item: { ...item, _embedding: undefined }, // Don't return embedding\n similarity,\n });\n }\n }\n }\n\n // Sort by similarity and limit\n results.sort((a, b) => b.similarity - a.similarity);\n\n return results.slice(0, limit);\n }\n\n /**\n * Find similar items to a given item\n * @param {Object} item - Item to find similar items for\n * @param {string} holon - Holon identifier\n * @param {string} lens - Lens name\n * @param {Object} options - Search options\n * @returns {Promise<Array>} Similar items\n */\n async findSimilar(item, holon, lens, options = {}) {\n const text = item.content || item.text || item.description || JSON.stringify(item);\n return this.semanticSearch(text, holon, lens, options);\n }\n\n /**\n * Cluster items by semantic similarity\n * @param {Object[]} items - Items to cluster\n * @param {number} numClusters - Approximate number of clusters\n * @returns {Promise<Object[][]>} Clustered items\n */\n async cluster(items, numClusters = 5) {\n // Get embeddings for items that don't have them\n const itemsWithEmbeddings = await Promise.all(\n items.map(async (item) => {\n if (item._embedding) {\n return item;\n }\n const text = item.content || item.text || item.description || JSON.stringify(item);\n const embedding = await this.embed(text);\n return { ...item, _embedding: embedding };\n })\n );\n\n // Simple k-means clustering\n const clusters = this._kMeans(itemsWithEmbeddings, numClusters);\n\n // Return clusters without embeddings\n return clusters.map(cluster =>\n cluster.map(item => ({ ...item, _embedding: undefined }))\n );\n }\n\n /**\n * Simple k-means clustering\n * @private\n */\n _kMeans(items, k, maxIterations = 100) {\n if (items.length <= k) {\n return items.map(item => [item]);\n }\n\n // Initialize centroids randomly\n const shuffled = [...items].sort(() => Math.random() - 0.5);\n let centroids = shuffled.slice(0, k).map(item => [...item._embedding]);\n\n let assignments = new Array(items.length);\n\n for (let iter = 0; iter < maxIterations; iter++) {\n // Assign items to nearest centroid\n const newAssignments = items.map((item) => {\n let minDist = Infinity;\n let nearest = 0;\n\n for (let c = 0; c < centroids.length; c++) {\n const dist = 1 - this.cosineSimilarity(item._embedding, centroids[c]);\n if (dist < minDist) {\n minDist = dist;\n nearest = c;\n }\n }\n\n return nearest;\n });\n\n // Check for convergence\n if (JSON.stringify(newAssignments) === JSON.stringify(assignments)) {\n break;\n }\n\n assignments = newAssignments;\n\n // Update centroids\n for (let c = 0; c < k; c++) {\n const clusterItems = items.filter((_, i) => assignments[i] === c);\n\n if (clusterItems.length > 0) {\n centroids[c] = new Array(this.dimensions).fill(0);\n\n for (const item of clusterItems) {\n for (let d = 0; d < this.dimensions; d++) {\n centroids[c][d] += item._embedding[d];\n }\n }\n\n for (let d = 0; d < this.dimensions; d++) {\n centroids[c][d] /= clusterItems.length;\n }\n }\n }\n }\n\n // Group items by cluster\n const clusters = Array.from({ length: k }, () => []);\n items.forEach((item, i) => {\n clusters[assignments[i]].push(item);\n });\n\n return clusters.filter(c => c.length > 0);\n }\n}\n\nexport default Embeddings;\n","/**\n * Council - Multi-perspective wisdom from different viewpoints\n */\n\n// Default 12 perspectives based on HolonsBot\nconst DEFAULT_PERSPECTIVES = [\n { name: 'Values & Worldview', prompt: 'Answer from the embodied perspective of Values and Worldview - considering ethics, beliefs, culture, and meaning.' },\n { name: 'Health & Wellbeing', prompt: 'Answer from the embodied perspective of Health & Wellbeing - considering physical, mental, and social health.' },\n { name: 'Food & Agriculture', prompt: 'Answer from the embodied perspective of Food & Agriculture - considering food systems, nutrition, and farming.' },\n { name: 'Business & Trade', prompt: 'Answer from the embodied perspective of Business & Trade - considering commerce, markets, and economic exchange.' },\n { name: 'Energy & Resources', prompt: 'Answer from the embodied perspective of Energy & Resources - considering power, materials, and sustainability.' },\n { name: 'Climate & Environment', prompt: 'Answer from the embodied perspective of Climate Change - considering environmental impact and adaptation.' },\n { name: 'Ecosystems & Biosphere', prompt: 'Answer from the embodied perspective of Ecosystems & Biosphere - considering biodiversity and natural systems.' },\n { name: 'Water Availability', prompt: 'Answer from the embodied perspective of Water Availability - considering water access, quality, and management.' },\n { name: 'Habitat & Infrastructure', prompt: 'Answer from the embodied perspective of Habitat & Infrastructure - considering built environment and housing.' },\n { name: 'Economy & Wealth', prompt: 'Answer from the embodied perspective of Economy & Wealth - considering prosperity, inequality, and resources.' },\n { name: 'Governance & Institutions', prompt: 'Answer from the embodied perspective of Governance & Institutions - considering power, policy, and organization.' },\n { name: 'Community & Resilience', prompt: 'Answer from the embodied perspective of Community & Resilience - considering social bonds and adaptability.' },\n];\n\n/**\n * Council class for multi-perspective answers\n */\nexport class Council {\n /**\n * @param {LLMService} llmService - LLM service instance\n * @param {Array} perspectives - Custom perspectives (optional)\n */\n constructor(llmService, perspectives = null) {\n this.llm = llmService;\n this.perspectives = perspectives || DEFAULT_PERSPECTIVES;\n }\n\n /**\n * Set custom perspectives\n * @param {Array<{name: string, prompt: string}>} perspectives\n */\n setPerspectives(perspectives) {\n this.perspectives = perspectives;\n }\n\n /**\n * Get default perspectives\n * @returns {Array} Default perspectives\n */\n static getDefaultPerspectives() {\n return DEFAULT_PERSPECTIVES;\n }\n\n /**\n * Ask a question to the council\n * @param {string} question - Question to ask\n * @param {Object} options - Options\n * @returns {Promise<{perspectives: Array, summary: string}>}\n */\n async ask(question, options = {}) {\n const { parallel = true, includeSummary = true } = options;\n const perspectives = options.perspectives || this.perspectives;\n\n // Get answers from all perspectives\n let answers;\n\n if (parallel) {\n answers = await Promise.all(\n perspectives.map(async (perspective) => {\n const answer = await this._askPerspective(question, perspective);\n return {\n perspective: perspective.name,\n answer,\n };\n })\n );\n } else {\n answers = [];\n for (const perspective of perspectives) {\n const answer = await this._askPerspective(question, perspective);\n answers.push({\n perspective: perspective.name,\n answer,\n });\n }\n }\n\n // Generate summary\n let summary = null;\n if (includeSummary) {\n summary = await this._summarize(question, answers);\n }\n\n return {\n question,\n perspectives: answers,\n summary,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Ask a question from specific perspective\n * @private\n */\n async _askPerspective(question, perspective) {\n const systemPrompt = `You are a wise council member representing a specific perspective.\n\n${perspective.prompt}\n\nProvide thoughtful, nuanced answers that honor your unique perspective while being constructive and helpful. Be concise but insightful.`;\n\n return this.llm.sendMessage(systemPrompt, question, { temperature: 0.7 });\n }\n\n /**\n * Summarize all perspectives\n * @private\n */\n async _summarize(question, answers) {\n const perspectiveTexts = answers\n .map(a => `**${a.perspective}**: ${a.answer}`)\n .join('\\n\\n');\n\n const systemPrompt = `You are a wise facilitator. Synthesize the following perspectives into a balanced summary that:\n1. Identifies common themes and agreements\n2. Notes important tensions or tradeoffs\n3. Provides actionable wisdom\n4. Remains neutral and balanced\n\nBe concise but comprehensive.`;\n\n const userMessage = `Question: ${question}\n\nPerspectives:\n${perspectiveTexts}`;\n\n return this.llm.sendMessage(systemPrompt, userMessage, { temperature: 0.5 });\n }\n\n /**\n * Create custom perspectives from a list of names\n * @param {string[]} names - Perspective names\n * @returns {Array} Custom perspectives\n */\n static createPerspectives(names) {\n return names.map(name => ({\n name,\n prompt: `Answer from the embodied perspective of ${name} - considering all aspects related to ${name.toLowerCase()}.`,\n }));\n }\n\n /**\n * Ask with custom perspectives (convenience method)\n * @param {string} question - Question\n * @param {string[]} perspectiveNames - List of perspective names\n * @param {Object} options - Options\n * @returns {Promise<Object>} Council response\n */\n async askCustom(question, perspectiveNames, options = {}) {\n const perspectives = Council.createPerspectives(perspectiveNames);\n return this.ask(question, { ...options, perspectives });\n }\n\n /**\n * Get a single perspective answer\n * @param {string} question - Question\n * @param {string} perspectiveName - Perspective name\n * @returns {Promise<string>} Answer\n */\n async askSingle(question, perspectiveName) {\n const perspective = this.perspectives.find(p => p.name === perspectiveName)\n || { name: perspectiveName, prompt: `Answer from the perspective of ${perspectiveName}.` };\n\n return this._askPerspective(question, perspective);\n }\n\n /**\n * Debate between perspectives\n * @param {string} topic - Topic to debate\n * @param {string[]} perspectiveNames - Two perspectives to debate\n * @param {number} rounds - Number of exchange rounds\n * @returns {Promise<Object>} Debate result\n */\n async debate(topic, perspectiveNames, rounds = 3) {\n if (perspectiveNames.length !== 2) {\n throw new Error('Debate requires exactly 2 perspectives');\n }\n\n const perspectives = perspectiveNames.map(name =>\n this.perspectives.find(p => p.name === name)\n || { name, prompt: `Argue from the perspective of ${name}.` }\n );\n\n const exchanges = [];\n let context = `Topic: ${topic}`;\n\n for (let i = 0; i < rounds; i++) {\n for (const perspective of perspectives) {\n const systemPrompt = `You are debating from the perspective of ${perspective.name}.\n${perspective.prompt}\nRespond to the previous arguments constructively, acknowledging good points but advocating for your perspective.`;\n\n const response = await this.llm.sendMessage(systemPrompt, context, { temperature: 0.7 });\n\n exchanges.push({\n perspective: perspective.name,\n round: i + 1,\n response,\n });\n\n context += `\\n\\n${perspective.name}: ${response}`;\n }\n }\n\n // Generate conclusion\n const conclusion = await this.llm.sendMessage(\n 'As a neutral moderator, summarize the key insights from this debate and identify areas of agreement and disagreement.',\n context,\n { temperature: 0.5 }\n );\n\n return {\n topic,\n perspectives: perspectiveNames,\n exchanges,\n conclusion,\n };\n }\n}\n\nexport default Council;\n","/**\n * Text-to-Speech - OpenAI TTS integration\n */\n\n/**\n * Available voices for TTS\n */\nexport const VOICES = {\n ALLOY: 'alloy',\n ECHO: 'echo',\n FABLE: 'fable',\n ONYX: 'onyx',\n NOVA: 'nova',\n SHIMMER: 'shimmer',\n};\n\n/**\n * Available TTS models\n */\nexport const MODELS = {\n TTS_1: 'tts-1',\n TTS_1_HD: 'tts-1-hd',\n};\n\n/**\n * TTS class for text-to-speech conversion\n */\nexport class TTS {\n /**\n * @param {Object} openai - OpenAI client instance\n */\n constructor(openai) {\n this.openai = openai;\n this.defaultVoice = VOICES.ECHO;\n this.defaultModel = MODELS.TTS_1;\n }\n\n /**\n * Convert text to speech\n * @param {string} text - Text to convert\n * @param {Object} options - TTS options\n * @returns {Promise<Buffer>} Audio buffer (MP3)\n */\n async speak(text, options = {}) {\n const {\n voice = this.defaultVoice,\n model = this.defaultModel,\n speed = 1.0,\n responseFormat = 'mp3',\n } = options;\n\n try {\n const response = await this.openai.audio.speech.create({\n model,\n voice,\n input: text,\n speed,\n response_format: responseFormat,\n });\n\n // Convert response to Buffer\n const arrayBuffer = await response.arrayBuffer();\n return Buffer.from(arrayBuffer);\n } catch (error) {\n throw new Error(`TTS failed: ${error.message}`);\n }\n }\n\n /**\n * Convert text to speech and return as base64\n * @param {string} text - Text to convert\n * @param {Object} options - TTS options\n * @returns {Promise<string>} Base64 encoded audio\n */\n async speakBase64(text, options = {}) {\n const buffer = await this.speak(text, options);\n return buffer.toString('base64');\n }\n\n /**\n * Convert text to speech and return as data URL\n * @param {string} text - Text to convert\n * @param {Object} options - TTS options\n * @returns {Promise<string>} Data URL for audio\n */\n async speakDataUrl(text, options = {}) {\n const format = options.responseFormat || 'mp3';\n const mimeType = format === 'mp3' ? 'audio/mpeg' : `audio/${format}`;\n const base64 = await this.speakBase64(text, options);\n return `data:${mimeType};base64,${base64}`;\n }\n\n /**\n * Set default voice\n * @param {string} voice - Voice name\n */\n setDefaultVoice(voice) {\n if (!Object.values(VOICES).includes(voice)) {\n throw new Error(`Invalid voice: ${voice}. Use one of: ${Object.values(VOICES).join(', ')}`);\n }\n this.defaultVoice = voice;\n }\n\n /**\n * Set default model\n * @param {string} model - Model name\n */\n setDefaultModel(model) {\n if (!Object.values(MODELS).includes(model)) {\n throw new Error(`Invalid model: ${model}. Use one of: ${Object.values(MODELS).join(', ')}`);\n }\n this.defaultModel = model;\n }\n\n /**\n * Get available voices\n * @returns {string[]} Available voice names\n */\n static getVoices() {\n return Object.values(VOICES);\n }\n\n /**\n * Get available models\n * @returns {string[]} Available model names\n */\n static getModels() {\n return Object.values(MODELS);\n }\n\n /**\n * Estimate audio duration (approximate)\n * @param {string} text - Text to estimate\n * @param {number} speed - Speech speed (default: 1.0)\n * @returns {number} Estimated duration in seconds\n */\n static estimateDuration(text, speed = 1.0) {\n // Average speaking rate: ~150 words per minute\n const words = text.split(/\\s+/).length;\n const minutes = words / 150;\n return (minutes * 60) / speed;\n }\n\n /**\n * Split text into chunks for long content\n * @param {string} text - Long text\n * @param {number} maxChars - Max characters per chunk (default: 4000)\n * @returns {string[]} Text chunks\n */\n static splitText(text, maxChars = 4000) {\n if (text.length <= maxChars) {\n return [text];\n }\n\n const chunks = [];\n const sentences = text.split(/(?<=[.!?])\\s+/);\n let currentChunk = '';\n\n for (const sentence of sentences) {\n if ((currentChunk + sentence).length > maxChars) {\n if (currentChunk) {\n chunks.push(currentChunk.trim());\n }\n currentChunk = sentence;\n } else {\n currentChunk += (currentChunk ? ' ' : '') + sentence;\n }\n }\n\n if (currentChunk) {\n chunks.push(currentChunk.trim());\n }\n\n return chunks;\n }\n\n /**\n * Convert long text to speech (handles chunking)\n * @param {string} text - Long text\n * @param {Object} options - TTS options\n * @returns {Promise<Buffer[]>} Array of audio buffers\n */\n async speakLong(text, options = {}) {\n const chunks = TTS.splitText(text, options.maxChars || 4000);\n\n const buffers = await Promise.all(\n chunks.map(chunk => this.speak(chunk, options))\n );\n\n return buffers;\n }\n}\n\nexport default TTS;\n","/**\n * Natural Language Query - Query HoloSphere data using natural language\n */\n\n/**\n * NL Query class for natural language to structured query conversion\n */\nexport class NLQuery {\n /**\n * @param {LLMService} llmService - LLM service instance\n * @param {Object} holosphere - HoloSphere instance\n */\n constructor(llmService, holosphere = null) {\n this.llm = llmService;\n this.holosphere = holosphere;\n }\n\n /**\n * Set HoloSphere instance\n * @param {Object} holosphere - HoloSphere instance\n */\n setHoloSphere(holosphere) {\n this.holosphere = holosphere;\n }\n\n /**\n * Parse natural language query into structured format\n * @param {string} query - Natural language query\n * @param {Object} context - Context (available holons, lenses, etc.)\n * @returns {Promise<Object>} Structured query\n */\n async parse(query, context = {}) {\n const systemPrompt = `You are a query parser. Convert natural language queries into structured JSON filters for a geospatial database.\n\nAvailable holons: ${context.holons?.join(', ') || 'any'}\nAvailable lenses: ${context.lenses?.join(', ') || 'any'}\n\nReturn a JSON object with:\n{\n \"holon\": \"holon_id or null\",\n \"lens\": \"lens_name or null\",\n \"filters\": {\n \"field_name\": { \"op\": \"eq|ne|gt|gte|lt|lte|contains|in\", \"value\": value }\n },\n \"sort\": { \"field\": \"field_name\", \"order\": \"asc|desc\" } or null,\n \"limit\": number or null,\n \"spatial\": { \"near\": \"location_name\", \"radius\": \"distance\" } or null,\n \"temporal\": { \"after\": \"date\", \"before\": \"date\" } or null\n}\n\nExamples:\n- \"show projects near Rome\" -> { \"lens\": \"projects\", \"spatial\": { \"near\": \"Rome\" } }\n- \"find quests with more than 10 participants\" -> { \"lens\": \"quests\", \"filters\": { \"participants\": { \"op\": \"gt\", \"value\": 10 } } }`;\n\n const result = await this.llm.getJSON(systemPrompt, query, { temperature: 0.2 });\n return result;\n }\n\n /**\n * Execute natural language query\n * @param {string} query - Natural language query\n * @param {Object} options - Query options\n * @returns {Promise<Array>} Query results\n */\n async execute(query, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required for query execution');\n }\n\n // Parse the query\n const parsed = await this.parse(query, options.context);\n\n // Get data from HoloSphere\n let results = [];\n\n if (parsed.holon && parsed.lens) {\n results = await this.holosphere.getAll(parsed.holon, parsed.lens);\n } else if (parsed.lens) {\n // Search across all holons for this lens (would need holon list)\n if (options.holons) {\n for (const holon of options.holons) {\n const data = await this.holosphere.getAll(holon, parsed.lens);\n results.push(...data.map(item => ({ ...item, _holon: holon })));\n }\n }\n }\n\n // Apply filters\n if (parsed.filters) {\n results = this._applyFilters(results, parsed.filters);\n }\n\n // Apply sorting\n if (parsed.sort) {\n results = this._applySort(results, parsed.sort);\n }\n\n // Apply limit\n if (parsed.limit) {\n results = results.slice(0, parsed.limit);\n }\n\n return {\n query,\n parsed,\n results,\n count: results.length,\n };\n }\n\n /**\n * Apply filters to results\n * @private\n */\n _applyFilters(results, filters) {\n return results.filter(item => {\n for (const [field, condition] of Object.entries(filters)) {\n const value = this._getNestedValue(item, field);\n\n if (!this._matchCondition(value, condition)) {\n return false;\n }\n }\n return true;\n });\n }\n\n /**\n * Get nested value from object\n * @private\n */\n _getNestedValue(obj, path) {\n return path.split('.').reduce((acc, key) => acc?.[key], obj);\n }\n\n /**\n * Check if value matches condition\n * @private\n */\n _matchCondition(value, condition) {\n const { op, value: targetValue } = condition;\n\n switch (op) {\n case 'eq':\n return value === targetValue;\n case 'ne':\n return value !== targetValue;\n case 'gt':\n return value > targetValue;\n case 'gte':\n return value >= targetValue;\n case 'lt':\n return value < targetValue;\n case 'lte':\n return value <= targetValue;\n case 'contains':\n return String(value).toLowerCase().includes(String(targetValue).toLowerCase());\n case 'in':\n return Array.isArray(targetValue) && targetValue.includes(value);\n default:\n return true;\n }\n }\n\n /**\n * Apply sorting to results\n * @private\n */\n _applySort(results, sort) {\n const { field, order } = sort;\n const multiplier = order === 'desc' ? -1 : 1;\n\n return [...results].sort((a, b) => {\n const aVal = this._getNestedValue(a, field);\n const bVal = this._getNestedValue(b, field);\n\n if (aVal < bVal) return -1 * multiplier;\n if (aVal > bVal) return 1 * multiplier;\n return 0;\n });\n }\n\n /**\n * Suggest queries based on context\n * @param {Object} context - Current context\n * @returns {Promise<string[]>} Suggested queries\n */\n async suggest(context = {}) {\n const systemPrompt = `Suggest 5 useful natural language queries for exploring geospatial data.\n\nAvailable holons: ${context.holons?.join(', ') || 'geographic areas'}\nAvailable lenses: ${context.lenses?.join(', ') || 'projects, quests, events, resources'}\n\nReturn ONLY a JSON array of query strings.`;\n\n return this.llm.getJSON(systemPrompt, 'Generate query suggestions', { temperature: 0.7 });\n }\n\n /**\n * Explain query results in natural language\n * @param {string} query - Original query\n * @param {Array} results - Query results\n * @returns {Promise<string>} Natural language explanation\n */\n async explain(query, results) {\n const systemPrompt = `You are a helpful data analyst. Explain the results of a query in natural language.\n\nOriginal query: ${query}\nNumber of results: ${results.length}\n\nProvide a brief, helpful summary of what was found.`;\n\n const sampleResults = results.slice(0, 5);\n\n return this.llm.sendMessage(\n systemPrompt,\n `Results sample: ${JSON.stringify(sampleResults, null, 2)}`,\n { temperature: 0.5 }\n );\n }\n}\n\nexport default NLQuery;\n","/**\n * Classifier - Auto-classification of content to appropriate lenses\n */\n\n/**\n * Classifier class for content categorization\n */\nexport class Classifier {\n /**\n * @param {LLMService} llmService - LLM service instance\n * @param {Object} holosphere - HoloSphere instance (optional)\n */\n constructor(llmService, holosphere = null) {\n this.llm = llmService;\n this.holosphere = holosphere;\n this.lensDescriptions = new Map();\n }\n\n /**\n * Set HoloSphere instance\n * @param {Object} holosphere - HoloSphere instance\n */\n setHoloSphere(holosphere) {\n this.holosphere = holosphere;\n }\n\n /**\n * Register a lens with its description\n * @param {string} lensName - Lens name\n * @param {string} description - Description of what goes in this lens\n * @param {Object} schema - Optional JSON schema for the lens\n */\n registerLens(lensName, description, schema = null) {\n this.lensDescriptions.set(lensName, { description, schema });\n }\n\n /**\n * Register multiple lenses\n * @param {Object<string, {description: string, schema?: Object}>} lenses\n */\n registerLenses(lenses) {\n for (const [name, config] of Object.entries(lenses)) {\n this.registerLens(name, config.description, config.schema);\n }\n }\n\n /**\n * Classify content into the best lens\n * @param {Object|string} content - Content to classify\n * @returns {Promise<{lens: string, confidence: number, reasoning: string}>}\n */\n async classifyToLens(content) {\n const lenses = Array.from(this.lensDescriptions.entries());\n\n if (lenses.length === 0) {\n throw new Error('No lenses registered. Use registerLens() first.');\n }\n\n const lensDescriptions = lenses\n .map(([name, config]) => `- ${name}: ${config.description}`)\n .join('\\n');\n\n const contentStr = typeof content === 'string' ? content : JSON.stringify(content, null, 2);\n\n const systemPrompt = `You are a content classifier. Classify the following content into the most appropriate lens.\n\nAvailable lenses:\n${lensDescriptions}\n\nReturn JSON: {\"lens\": \"lens_name\", \"confidence\": 0.0-1.0, \"reasoning\": \"brief explanation\"}`;\n\n return this.llm.getJSON(systemPrompt, contentStr, { temperature: 0.2 });\n }\n\n /**\n * Classify content into multiple possible lenses\n * @param {Object|string} content - Content to classify\n * @param {number} maxLenses - Maximum lenses to return\n * @returns {Promise<Array<{lens: string, confidence: number}>>}\n */\n async classifyMultiple(content, maxLenses = 3) {\n const lenses = Array.from(this.lensDescriptions.entries());\n\n if (lenses.length === 0) {\n throw new Error('No lenses registered');\n }\n\n const lensDescriptions = lenses\n .map(([name, config]) => `- ${name}: ${config.description}`)\n .join('\\n');\n\n const contentStr = typeof content === 'string' ? content : JSON.stringify(content, null, 2);\n\n const systemPrompt = `You are a content classifier. Classify the content into up to ${maxLenses} appropriate lenses, ranked by fit.\n\nAvailable lenses:\n${lensDescriptions}\n\nReturn JSON array: [{\"lens\": \"name\", \"confidence\": 0.0-1.0}, ...]\nOrder by confidence descending.`;\n\n return this.llm.getJSON(systemPrompt, contentStr, { temperature: 0.2 });\n }\n\n /**\n * Auto-store content in the best lens\n * @param {string} holon - Holon identifier\n * @param {Object} content - Content to store\n * @returns {Promise<{lens: string, stored: boolean, result: Object}>}\n */\n async autoStore(holon, content) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required for storage');\n }\n\n const classification = await this.classifyToLens(content);\n\n // Store in classified lens\n const result = await this.holosphere.put(holon, classification.lens, content);\n\n return {\n lens: classification.lens,\n confidence: classification.confidence,\n reasoning: classification.reasoning,\n stored: true,\n result,\n };\n }\n\n /**\n * Suggest lens for new content type\n * @param {string} contentDescription - Description of the new content type\n * @returns {Promise<{name: string, description: string}>}\n */\n async suggestNewLens(contentDescription) {\n const existingLenses = Array.from(this.lensDescriptions.keys());\n\n const systemPrompt = `You are helping design a data organization system. Suggest a new lens (category) for this type of content.\n\nExisting lenses: ${existingLenses.join(', ')}\n\nReturn JSON: {\"name\": \"lens_name\", \"description\": \"what this lens contains\"}\nUse lowercase_snake_case for names.`;\n\n return this.llm.getJSON(systemPrompt, contentDescription, { temperature: 0.5 });\n }\n\n /**\n * Analyze content and extract fields for schema\n * @param {Object} content - Sample content\n * @returns {Promise<Object>} Suggested JSON schema\n */\n async suggestSchema(content) {\n const contentStr = JSON.stringify(content, null, 2);\n\n const systemPrompt = `You are a data modeling expert. Analyze this content and suggest a JSON schema for validating similar content.\n\nReturn a valid JSON schema with:\n- Type definitions\n- Required fields\n- Field descriptions\n- Reasonable constraints`;\n\n return this.llm.getJSON(systemPrompt, contentStr, { temperature: 0.3 });\n }\n\n /**\n * Validate content against lens schema\n * @param {Object} content - Content to validate\n * @param {string} lensName - Lens to validate against\n * @returns {Promise<{valid: boolean, issues: string[]}>}\n */\n async validateForLens(content, lensName) {\n const lensConfig = this.lensDescriptions.get(lensName);\n\n if (!lensConfig) {\n throw new Error(`Lens not found: ${lensName}`);\n }\n\n if (!lensConfig.schema) {\n // If no schema, use AI to validate\n const systemPrompt = `Validate if this content is appropriate for the \"${lensName}\" lens.\nLens description: ${lensConfig.description}\n\nReturn JSON: {\"valid\": true/false, \"issues\": [\"issue1\", \"issue2\"] or []}`;\n\n return this.llm.getJSON(systemPrompt, JSON.stringify(content, null, 2), { temperature: 0.2 });\n }\n\n // Use schema validation (would integrate with schema validator)\n return { valid: true, issues: [] };\n }\n\n /**\n * Get classification stats for a collection\n * @param {Object[]} items - Items to analyze\n * @returns {Promise<Object>} Classification statistics\n */\n async analyzeCollection(items) {\n const classifications = await Promise.all(\n items.map(item => this.classifyToLens(item))\n );\n\n const stats = {};\n for (const c of classifications) {\n stats[c.lens] = (stats[c.lens] || 0) + 1;\n }\n\n return {\n total: items.length,\n byLens: stats,\n classifications,\n };\n }\n}\n\nexport default Classifier;\n","/**\n * Spatial Analysis - AI-powered analysis of data patterns across geographic regions\n */\n\n/**\n * Spatial Analysis class\n */\nexport class SpatialAnalysis {\n /**\n * @param {LLMService} llmService - LLM service instance\n * @param {Object} holosphere - HoloSphere instance\n */\n constructor(llmService, holosphere = null) {\n this.llm = llmService;\n this.holosphere = holosphere;\n }\n\n /**\n * Set HoloSphere instance\n * @param {Object} holosphere - HoloSphere instance\n */\n setHoloSphere(holosphere) {\n this.holosphere = holosphere;\n }\n\n /**\n * Analyze data patterns in a region\n * @param {string} holon - Holon identifier\n * @param {string} lens - Lens to analyze (optional, all if null)\n * @param {string} aspect - Analysis aspect (activity, trends, distribution, etc.)\n * @returns {Promise<Object>} Analysis results\n */\n async analyzeRegion(holon, lens = null, aspect = 'general') {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n // Get data from holon\n let data = [];\n if (lens) {\n data = await this.holosphere.getAll(holon, lens);\n } else {\n // Get from all known lenses - would need lens list\n data = await this.holosphere.getAll(holon, 'default');\n }\n\n const dataStr = JSON.stringify(data.slice(0, 50), null, 2); // Sample for analysis\n\n const systemPrompt = `You are a geospatial data analyst. Analyze the following data from a geographic region.\n\nRegion (holon): ${holon}\nLens: ${lens || 'all'}\nAnalysis aspect: ${aspect}\nTotal items: ${data.length}\n\nProvide insights about:\n1. Key patterns and trends\n2. Notable clusters or concentrations\n3. Anomalies or outliers\n4. Recommendations for the region\n\nReturn JSON:\n{\n \"summary\": \"brief overview\",\n \"patterns\": [\"pattern1\", \"pattern2\"],\n \"insights\": [\"insight1\", \"insight2\"],\n \"metrics\": {\"metric1\": value},\n \"recommendations\": [\"rec1\", \"rec2\"],\n \"confidence\": 0.0-1.0\n}`;\n\n const analysis = await this.llm.getJSON(systemPrompt, dataStr, { temperature: 0.3 });\n\n return {\n holon,\n lens,\n aspect,\n dataCount: data.length,\n analysis,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Compare data between two regions\n * @param {string} holon1 - First holon\n * @param {string} holon2 - Second holon\n * @param {string} lens - Lens to compare\n * @returns {Promise<Object>} Comparison results\n */\n async compareRegions(holon1, holon2, lens) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const data1 = await this.holosphere.getAll(holon1, lens);\n const data2 = await this.holosphere.getAll(holon2, lens);\n\n const systemPrompt = `You are a comparative analyst. Compare data between two geographic regions.\n\nRegion 1 (${holon1}): ${data1.length} items\nRegion 2 (${holon2}): ${data2.length} items\nLens: ${lens}\n\nAnalyze and compare:\n1. Similarities between regions\n2. Key differences\n3. Relative strengths of each region\n4. Opportunities for collaboration\n\nReturn JSON:\n{\n \"summary\": \"brief comparison\",\n \"similarities\": [\"sim1\", \"sim2\"],\n \"differences\": [\"diff1\", \"diff2\"],\n \"region1_strengths\": [\"strength1\"],\n \"region2_strengths\": [\"strength1\"],\n \"collaboration_opportunities\": [\"opp1\"],\n \"metrics_comparison\": {\"metric\": {\"region1\": val, \"region2\": val}}\n}`;\n\n const userMessage = `Region 1 data sample:\n${JSON.stringify(data1.slice(0, 25), null, 2)}\n\nRegion 2 data sample:\n${JSON.stringify(data2.slice(0, 25), null, 2)}`;\n\n const comparison = await this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.3 });\n\n return {\n regions: [holon1, holon2],\n lens,\n dataCounts: { [holon1]: data1.length, [holon2]: data2.length },\n comparison,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Identify spatial trends over time\n * @param {string} holon - Holon identifier\n * @param {string} lens - Lens to analyze\n * @param {Object} timeRange - Time range {start, end}\n * @returns {Promise<Object>} Trend analysis\n */\n async spatialTrends(holon, lens, timeRange = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const data = await this.holosphere.getAll(holon, lens);\n\n // Filter by time if timestamps available\n let filteredData = data;\n if (timeRange.start || timeRange.end) {\n filteredData = data.filter(item => {\n const ts = item.timestamp || item.created_at || item.date;\n if (!ts) return true;\n\n const itemTime = new Date(ts).getTime();\n if (timeRange.start && itemTime < new Date(timeRange.start).getTime()) return false;\n if (timeRange.end && itemTime > new Date(timeRange.end).getTime()) return false;\n return true;\n });\n }\n\n const systemPrompt = `You are a trend analyst. Analyze temporal patterns in geographic data.\n\nRegion: ${holon}\nLens: ${lens}\nTime range: ${JSON.stringify(timeRange)}\nItems analyzed: ${filteredData.length}\n\nIdentify:\n1. Growth/decline trends\n2. Seasonal patterns\n3. Emerging themes\n4. Predictions\n\nReturn JSON:\n{\n \"trends\": [{\"trend\": \"description\", \"direction\": \"up|down|stable\", \"strength\": 0.0-1.0}],\n \"patterns\": [\"pattern1\"],\n \"emerging_themes\": [\"theme1\"],\n \"predictions\": [\"pred1\"],\n \"summary\": \"overview\"\n}`;\n\n const trends = await this.llm.getJSON(\n systemPrompt,\n JSON.stringify(filteredData.slice(0, 50), null, 2),\n { temperature: 0.3 }\n );\n\n return {\n holon,\n lens,\n timeRange,\n dataCount: filteredData.length,\n trends,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Find hotspots in hierarchical data\n * @param {string} holon - Starting holon\n * @param {string} lens - Lens to analyze\n * @param {string} metric - Metric to identify hotspots by\n * @returns {Promise<Object>} Hotspot analysis\n */\n async findHotspots(holon, lens, metric = 'count') {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n // Get data from holon and children\n const data = await this.holosphere.getAll(holon, lens);\n\n const systemPrompt = `You are a spatial analyst. Identify hotspots (areas of high concentration/activity) in geographic data.\n\nRegion: ${holon}\nLens: ${lens}\nMetric: ${metric}\nData points: ${data.length}\n\nIdentify:\n1. High-activity areas\n2. Emerging areas\n3. Underserved areas\n4. Recommended focus areas\n\nReturn JSON:\n{\n \"hotspots\": [{\"location\": \"desc\", \"intensity\": 0.0-1.0, \"type\": \"high_activity|emerging|underserved\"}],\n \"concentration_patterns\": [\"pattern1\"],\n \"recommendations\": [\"rec1\"],\n \"summary\": \"overview\"\n}`;\n\n return this.llm.getJSON(\n systemPrompt,\n JSON.stringify(data.slice(0, 50), null, 2),\n { temperature: 0.3 }\n );\n }\n\n /**\n * Generate spatial report for a region\n * @param {string} holon - Holon identifier\n * @param {Object} options - Report options\n * @returns {Promise<string>} Formatted report\n */\n async generateReport(holon, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const lenses = options.lenses || ['default'];\n const allData = {};\n\n for (const lens of lenses) {\n allData[lens] = await this.holosphere.getAll(holon, lens);\n }\n\n const systemPrompt = `You are a regional analyst. Generate a comprehensive report for this geographic region.\n\nRegion: ${holon}\nData by lens: ${Object.entries(allData).map(([l, d]) => `${l}: ${d.length} items`).join(', ')}\n\nGenerate a professional report including:\n1. Executive Summary\n2. Key Statistics\n3. Notable Patterns\n4. Opportunities\n5. Recommendations\n\nFormat as markdown.`;\n\n const dataSample = {};\n for (const [lens, data] of Object.entries(allData)) {\n dataSample[lens] = data.slice(0, 20);\n }\n\n return this.llm.sendMessage(\n systemPrompt,\n JSON.stringify(dataSample, null, 2),\n { temperature: 0.5, maxTokens: 2000 }\n );\n }\n}\n\nexport default SpatialAnalysis;\n","/**\n * Smart Aggregation - AI-assisted hierarchical data aggregation up the holon tree\n */\n\nimport * as h3 from 'h3-js';\n\n/**\n * Smart Aggregation class\n */\nexport class SmartAggregation {\n /**\n * @param {LLMService} llmService - LLM service instance\n * @param {Object} holosphere - HoloSphere instance\n */\n constructor(llmService, holosphere = null) {\n this.llm = llmService;\n this.holosphere = holosphere;\n }\n\n /**\n * Set HoloSphere instance\n * @param {Object} holosphere - HoloSphere instance\n */\n setHoloSphere(holosphere) {\n this.holosphere = holosphere;\n }\n\n /**\n * Smart upcast - AI-summarized hierarchical aggregation\n * @param {string} holon - Starting holon\n * @param {string} lens - Lens to aggregate\n * @param {Object} options - Options\n * @returns {Promise<Object>} Aggregation result\n */\n async smartUpcast(holon, lens, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const { maxLevels = 5, storeResults = true } = options;\n\n // Get current data\n const data = await this.holosphere.getAll(holon, lens);\n\n // Generate summary for current level\n const summary = await this._generateSummary(data, holon, lens);\n\n // Get parent holon\n const resolution = h3.getResolution(holon);\n if (resolution <= 0 || maxLevels <= 0) {\n return { holon, lens, summary, level: resolution };\n }\n\n const parent = h3.cellToParent(holon, resolution - 1);\n\n // Store summary at parent level\n if (storeResults) {\n await this.holosphere.put(parent, `${lens}_summaries`, {\n id: holon,\n childHolon: holon,\n summary,\n dataCount: data.length,\n timestamp: Date.now(),\n });\n }\n\n // Recursively upcast to parent\n const parentResult = await this.smartUpcast(parent, lens, {\n ...options,\n maxLevels: maxLevels - 1,\n });\n\n return {\n holon,\n lens,\n summary,\n dataCount: data.length,\n parent: parentResult,\n };\n }\n\n /**\n * Generate AI summary for data\n * @private\n */\n async _generateSummary(data, holon, lens) {\n if (data.length === 0) {\n return { text: 'No data in this region', stats: { count: 0 } };\n }\n\n const systemPrompt = `You are a data summarization expert. Create a concise summary of this geographic data.\n\nRegion: ${holon}\nCategory: ${lens}\nItems: ${data.length}\n\nGenerate:\n1. A brief text summary (2-3 sentences)\n2. Key statistics\n3. Notable items\n4. Themes/patterns\n\nReturn JSON:\n{\n \"text\": \"summary text\",\n \"stats\": {\"count\": n, \"key_metric\": value},\n \"notable\": [\"item1\", \"item2\"],\n \"themes\": [\"theme1\", \"theme2\"]\n}`;\n\n return this.llm.getJSON(\n systemPrompt,\n JSON.stringify(data.slice(0, 30), null, 2),\n { temperature: 0.3 }\n );\n }\n\n /**\n * Generate comprehensive holon summary\n * @param {string} holon - Holon identifier\n * @returns {Promise<Object>} Comprehensive summary\n */\n async generateHolonSummary(holon) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n // Get all available lenses (would need to discover)\n const lenses = ['projects', 'quests', 'events', 'resources', 'default'];\n const allData = {};\n\n for (const lens of lenses) {\n try {\n const data = await this.holosphere.getAll(holon, lens);\n if (data.length > 0) {\n allData[lens] = data;\n }\n } catch {\n // Skip unavailable lenses\n }\n }\n\n const systemPrompt = `You are a regional analyst. Generate a comprehensive summary of this geographic area.\n\nRegion: ${holon}\nData available: ${Object.entries(allData).map(([l, d]) => `${l}: ${d.length}`).join(', ')}\n\nGenerate a complete overview including:\n1. Executive summary\n2. Key activities and projects\n3. Community engagement\n4. Resources and assets\n5. Challenges and opportunities\n6. Overall health assessment\n\nReturn JSON:\n{\n \"title\": \"Region Title\",\n \"executive_summary\": \"brief overview\",\n \"highlights\": [\"highlight1\", \"highlight2\"],\n \"activities\": {\"count\": n, \"summary\": \"text\"},\n \"community\": {\"engagement_level\": \"high|medium|low\", \"notes\": \"text\"},\n \"resources\": [\"resource1\"],\n \"challenges\": [\"challenge1\"],\n \"opportunities\": [\"opp1\"],\n \"health_score\": 0.0-1.0,\n \"recommendations\": [\"rec1\"]\n}`;\n\n const dataSample = {};\n for (const [lens, data] of Object.entries(allData)) {\n dataSample[lens] = data.slice(0, 15);\n }\n\n const summary = await this.llm.getJSON(\n systemPrompt,\n JSON.stringify(dataSample, null, 2),\n { temperature: 0.4, maxTokens: 2000 }\n );\n\n return {\n holon,\n summary,\n lensesAnalyzed: Object.keys(allData),\n totalItems: Object.values(allData).reduce((sum, d) => sum + d.length, 0),\n timestamp: Date.now(),\n };\n }\n\n /**\n * Aggregate child summaries into parent\n * @param {string} parentHolon - Parent holon\n * @param {string} lens - Lens\n * @returns {Promise<Object>} Aggregated summary\n */\n async aggregateChildren(parentHolon, lens) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n // Get children holons\n const resolution = h3.getResolution(parentHolon);\n const children = h3.cellToChildren(parentHolon, resolution + 1);\n\n // Collect summaries from children\n const childSummaries = [];\n for (const child of children.slice(0, 7)) { // Limit to 7 children for token limits\n try {\n const data = await this.holosphere.getAll(child, lens);\n if (data.length > 0) {\n const summary = await this._generateSummary(data, child, lens);\n childSummaries.push({ holon: child, summary });\n }\n } catch {\n // Skip\n }\n }\n\n if (childSummaries.length === 0) {\n return { holon: parentHolon, summary: null, message: 'No child data found' };\n }\n\n // Aggregate child summaries\n const systemPrompt = `You are aggregating summaries from child regions into a parent region summary.\n\nParent region: ${parentHolon}\nChild summaries: ${childSummaries.length}\n\nCreate an aggregated summary that:\n1. Synthesizes common themes\n2. Highlights regional diversity\n3. Identifies cross-cutting patterns\n4. Notes outliers\n\nReturn JSON:\n{\n \"aggregated_summary\": \"text\",\n \"common_themes\": [\"theme1\"],\n \"regional_diversity\": [\"diff1\"],\n \"patterns\": [\"pattern1\"],\n \"total_activity\": {\"count\": n, \"trend\": \"growing|stable|declining\"}\n}`;\n\n const summary = await this.llm.getJSON(\n systemPrompt,\n JSON.stringify(childSummaries, null, 2),\n { temperature: 0.3 }\n );\n\n return {\n holon: parentHolon,\n lens,\n childCount: childSummaries.length,\n summary,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Compare aggregations across different time periods\n * @param {string} holon - Holon\n * @param {string} lens - Lens\n * @param {Object} period1 - First period {start, end}\n * @param {Object} period2 - Second period {start, end}\n * @returns {Promise<Object>} Comparison\n */\n async comparePeriods(holon, lens, period1, period2) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const allData = await this.holosphere.getAll(holon, lens);\n\n const filterByPeriod = (data, period) => {\n return data.filter(item => {\n const ts = item.timestamp || item.created_at;\n if (!ts) return false;\n const itemTime = new Date(ts).getTime();\n return itemTime >= new Date(period.start).getTime() &&\n itemTime <= new Date(period.end).getTime();\n });\n };\n\n const data1 = filterByPeriod(allData, period1);\n const data2 = filterByPeriod(allData, period2);\n\n const systemPrompt = `Compare data between two time periods for a geographic region.\n\nRegion: ${holon}\nPeriod 1: ${JSON.stringify(period1)} - ${data1.length} items\nPeriod 2: ${JSON.stringify(period2)} - ${data2.length} items\n\nAnalyze:\n1. Growth/decline\n2. New themes in period 2\n3. Themes that disappeared\n4. Key changes\n\nReturn JSON:\n{\n \"growth_rate\": percentage,\n \"direction\": \"growth|decline|stable\",\n \"new_themes\": [\"theme1\"],\n \"disappeared\": [\"theme1\"],\n \"key_changes\": [\"change1\"],\n \"summary\": \"text\"\n}`;\n\n const userMessage = `Period 1 data:\n${JSON.stringify(data1.slice(0, 20), null, 2)}\n\nPeriod 2 data:\n${JSON.stringify(data2.slice(0, 20), null, 2)}`;\n\n return this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.3 });\n }\n}\n\nexport default SmartAggregation;\n","/**\n * Federation Advisor - AI-powered federation suggestions and analysis\n */\n\n/**\n * Federation Advisor class\n */\nexport class FederationAdvisor {\n /**\n * @param {LLMService} llmService - LLM service instance\n * @param {Object} holosphere - HoloSphere instance\n * @param {Object} embeddings - Embeddings instance (optional)\n */\n constructor(llmService, holosphere = null, embeddings = null) {\n this.llm = llmService;\n this.holosphere = holosphere;\n this.embeddings = embeddings;\n }\n\n /**\n * Set HoloSphere instance\n * @param {Object} holosphere - HoloSphere instance\n */\n setHoloSphere(holosphere) {\n this.holosphere = holosphere;\n }\n\n /**\n * Set Embeddings instance\n * @param {Object} embeddings - Embeddings instance\n */\n setEmbeddings(embeddings) {\n this.embeddings = embeddings;\n }\n\n /**\n * Suggest federations based on content similarity\n * @param {string} holon - Holon to find federation partners for\n * @param {Object} options - Options\n * @returns {Promise<Array>} Suggested federations\n */\n async suggestFederations(holon, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const { candidateHolons = [], lens = 'default', maxSuggestions = 5 } = options;\n\n // Get data from source holon\n const sourceData = await this.holosphere.getAll(holon, lens);\n\n if (sourceData.length === 0) {\n return { holon, suggestions: [], message: 'No data in source holon' };\n }\n\n // If we have candidate holons, compare with each\n const comparisons = [];\n\n for (const candidate of candidateHolons.slice(0, 10)) {\n if (candidate === holon) continue;\n\n try {\n const candidateData = await this.holosphere.getAll(candidate, lens);\n if (candidateData.length > 0) {\n comparisons.push({\n holon: candidate,\n dataCount: candidateData.length,\n dataSample: candidateData.slice(0, 10),\n });\n }\n } catch {\n // Skip unavailable holons\n }\n }\n\n if (comparisons.length === 0) {\n return { holon, suggestions: [], message: 'No candidate holons with data' };\n }\n\n const systemPrompt = `You are a federation advisor. Analyze which regions would benefit from federating (sharing data) with the source region.\n\nSource region: ${holon}\nSource data count: ${sourceData.length}\n\nConsider:\n1. Content similarity - similar topics benefit from shared visibility\n2. Complementary content - different but related content enables collaboration\n3. Geographic proximity relevance\n4. Potential for knowledge sharing\n\nReturn JSON array:\n[\n {\n \"holon\": \"id\",\n \"score\": 0.0-1.0,\n \"reasoning\": \"why federate\",\n \"benefits\": [\"benefit1\"],\n \"type\": \"similarity|complementary|geographic\"\n }\n]\n\nOrder by score descending, max ${maxSuggestions} suggestions.`;\n\n const userMessage = `Source data sample:\n${JSON.stringify(sourceData.slice(0, 15), null, 2)}\n\nCandidate regions:\n${JSON.stringify(comparisons, null, 2)}`;\n\n const suggestions = await this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.3 });\n\n return {\n holon,\n lens,\n suggestions: suggestions.slice(0, maxSuggestions),\n timestamp: Date.now(),\n };\n }\n\n /**\n * Analyze federation health\n * @param {string} holon - Holon to analyze\n * @returns {Promise<Object>} Federation health analysis\n */\n async analyzeFederationHealth(holon) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n // Get federation info\n const federation = await this.holosphere.getFederation(holon);\n\n if (!federation || !federation.federation || federation.federation.length === 0) {\n return {\n holon,\n health: 'none',\n message: 'No federations configured',\n score: 0,\n };\n }\n\n // Analyze each federation\n const federationAnalysis = [];\n\n for (const fedHolon of federation.federation.slice(0, 5)) {\n try {\n const fedData = await this.holosphere.getAll(fedHolon, 'default');\n federationAnalysis.push({\n holon: fedHolon,\n active: fedData.length > 0,\n dataCount: fedData.length,\n });\n } catch {\n federationAnalysis.push({\n holon: fedHolon,\n active: false,\n error: true,\n });\n }\n }\n\n const systemPrompt = `You are a federation health analyst. Assess the health of this holon's federation relationships.\n\nSource holon: ${holon}\nFederation partners: ${federation.federation.length}\nActive federations: ${federationAnalysis.filter(f => f.active).length}\n\nFederation details:\n${JSON.stringify(federationAnalysis, null, 2)}\n\nAnalyze:\n1. Overall federation health\n2. Active vs inactive relationships\n3. Balance of the federation network\n4. Recommendations\n\nReturn JSON:\n{\n \"health_score\": 0.0-1.0,\n \"status\": \"healthy|degraded|unhealthy\",\n \"active_count\": n,\n \"inactive_count\": n,\n \"issues\": [\"issue1\"],\n \"recommendations\": [\"rec1\"],\n \"summary\": \"text\"\n}`;\n\n const analysis = await this.llm.getJSON(systemPrompt, '', { temperature: 0.3 });\n\n return {\n holon,\n federation: federation.federation,\n analysis,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Suggest federation optimizations\n * @param {string} holon - Holon to optimize\n * @returns {Promise<Object>} Optimization suggestions\n */\n async optimizeFederation(holon) {\n const health = await this.analyzeFederationHealth(holon);\n\n if (health.health === 'none') {\n return { holon, suggestions: ['Consider establishing initial federations'] };\n }\n\n const systemPrompt = `Based on federation health analysis, suggest optimizations.\n\nHealth analysis:\n${JSON.stringify(health.analysis, null, 2)}\n\nSuggest:\n1. Federations to strengthen\n2. Federations to reconsider\n3. New potential federations\n4. Data flow improvements\n\nReturn JSON:\n{\n \"strengthen\": [\"holon_id\"],\n \"reconsider\": [\"holon_id\"],\n \"new_potential\": [\"description\"],\n \"improvements\": [\"improvement1\"],\n \"priority\": \"high|medium|low\"\n}`;\n\n return this.llm.getJSON(systemPrompt, '', { temperature: 0.4 });\n }\n\n /**\n * Analyze data flow in federation network\n * @param {string} holon - Starting holon\n * @returns {Promise<Object>} Data flow analysis\n */\n async analyzeDataFlow(holon) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const federation = await this.holosphere.getFederation(holon);\n\n if (!federation) {\n return { holon, message: 'No federation configured' };\n }\n\n const systemPrompt = `Analyze the data flow patterns in a federation network.\n\nSource holon: ${holon}\nFederated with: ${federation.federation?.join(', ') || 'none'}\nNotifies: ${federation.notify?.join(', ') || 'none'}\n\nConsider:\n1. Bidirectional vs unidirectional relationships\n2. Hub patterns (many connections)\n3. Data propagation paths\n4. Potential bottlenecks\n\nReturn JSON:\n{\n \"flow_type\": \"bidirectional|unidirectional|mixed\",\n \"topology\": \"hub|mesh|chain|star\",\n \"propagation_depth\": n,\n \"bottlenecks\": [\"desc\"],\n \"recommendations\": [\"rec1\"]\n}`;\n\n return this.llm.getJSON(systemPrompt, JSON.stringify(federation, null, 2), { temperature: 0.3 });\n }\n\n /**\n * Find federation bridges - holons that connect disparate networks\n * @param {string[]} holons - List of holons to analyze\n * @returns {Promise<Object>} Bridge analysis\n */\n async findBridges(holons) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const network = [];\n\n for (const holon of holons.slice(0, 20)) {\n try {\n const fed = await this.holosphere.getFederation(holon);\n if (fed) {\n network.push({\n holon,\n federations: fed.federation || [],\n notifies: fed.notify || [],\n });\n }\n } catch {\n // Skip\n }\n }\n\n const systemPrompt = `Analyze a federation network to identify bridge holons (connectors between clusters).\n\nNetwork:\n${JSON.stringify(network, null, 2)}\n\nIdentify:\n1. Bridge holons that connect clusters\n2. Isolated holons\n3. Central hubs\n4. Network clusters\n\nReturn JSON:\n{\n \"bridges\": [{\"holon\": \"id\", \"connects\": [\"cluster1\", \"cluster2\"]}],\n \"isolated\": [\"holon_id\"],\n \"hubs\": [{\"holon\": \"id\", \"connections\": n}],\n \"clusters\": [[\"holon1\", \"holon2\"]],\n \"network_health\": 0.0-1.0\n}`;\n\n return this.llm.getJSON(systemPrompt, '', { temperature: 0.3 });\n }\n}\n\nexport default FederationAdvisor;\n","/**\n * Relationship Discovery - Find hidden connections across data\n */\n\n/**\n * Relationship Discovery class\n */\nexport class RelationshipDiscovery {\n /**\n * @param {LLMService} llmService - LLM service instance\n * @param {Object} holosphere - HoloSphere instance\n * @param {Object} embeddings - Embeddings instance (optional)\n */\n constructor(llmService, holosphere = null, embeddings = null) {\n this.llm = llmService;\n this.holosphere = holosphere;\n this.embeddings = embeddings;\n }\n\n /**\n * Set HoloSphere instance\n * @param {Object} holosphere - HoloSphere instance\n */\n setHoloSphere(holosphere) {\n this.holosphere = holosphere;\n }\n\n /**\n * Set Embeddings instance\n * @param {Object} embeddings - Embeddings instance\n */\n setEmbeddings(embeddings) {\n this.embeddings = embeddings;\n }\n\n /**\n * Discover relationships in holon data\n * @param {string} holon - Holon identifier\n * @param {string} lens - Lens to analyze (optional)\n * @returns {Promise<Object>} Discovered relationships\n */\n async discoverRelationships(holon, lens = null) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n // Get data from holon\n let data = [];\n const lenses = lens ? [lens] : ['projects', 'quests', 'events', 'resources', 'default'];\n\n for (const l of lenses) {\n try {\n const lensData = await this.holosphere.getAll(holon, l);\n data.push(...lensData.map(item => ({ ...item, _lens: l })));\n } catch {\n // Skip unavailable lenses\n }\n }\n\n if (data.length < 2) {\n return { holon, relationships: [], message: 'Not enough data for relationship discovery' };\n }\n\n const systemPrompt = `You are a relationship discovery expert. Find hidden connections between items in this dataset.\n\nRegion: ${holon}\nItems: ${data.length}\n\nLook for:\n1. Thematic connections (shared topics, goals)\n2. Entity connections (shared people, organizations)\n3. Temporal connections (same timeframes)\n4. Causal connections (one enables/requires another)\n5. Geographic connections (same sub-regions)\n\nReturn JSON:\n{\n \"relationships\": [\n {\n \"item1\": {\"id\": \"id1\", \"title\": \"title\"},\n \"item2\": {\"id\": \"id2\", \"title\": \"title\"},\n \"type\": \"thematic|entity|temporal|causal|geographic\",\n \"strength\": 0.0-1.0,\n \"description\": \"relationship description\"\n }\n ],\n \"clusters\": [\n {\n \"theme\": \"cluster theme\",\n \"items\": [\"id1\", \"id2\"]\n }\n ],\n \"key_entities\": [\"entity1\", \"entity2\"],\n \"summary\": \"overview of relationship network\"\n}`;\n\n const relationships = await this.llm.getJSON(\n systemPrompt,\n JSON.stringify(data.slice(0, 40), null, 2),\n { temperature: 0.3 }\n );\n\n return {\n holon,\n lens,\n itemCount: data.length,\n relationships,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Find items similar to a given item\n * @param {Object} item - Item to find similar items for\n * @param {string} holon - Holon to search in (optional)\n * @param {string} lens - Lens to search in (optional)\n * @param {Object} options - Search options\n * @returns {Promise<Array>} Similar items\n */\n async findSimilar(item, holon = null, lens = null, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const { limit = 10, threshold = 0.5, useEmbeddings = true } = options;\n\n // If embeddings available, use semantic search\n if (useEmbeddings && this.embeddings && holon && lens) {\n return this.embeddings.findSimilar(item, holon, lens, { limit, threshold });\n }\n\n // Fall back to LLM-based similarity\n if (!holon) {\n throw new Error('Holon required for LLM-based similarity');\n }\n\n const searchLenses = lens ? [lens] : ['projects', 'quests', 'events', 'resources', 'default'];\n let candidates = [];\n\n for (const l of searchLenses) {\n try {\n const data = await this.holosphere.getAll(holon, l);\n candidates.push(...data.map(d => ({ ...d, _lens: l })));\n } catch {\n // Skip\n }\n }\n\n if (candidates.length === 0) {\n return [];\n }\n\n const systemPrompt = `Find items most similar to the reference item.\n\nReference item:\n${JSON.stringify(item, null, 2)}\n\nConsider:\n1. Topic/theme similarity\n2. Goal alignment\n3. Participant overlap\n4. Resource requirements\n5. Timeline compatibility\n\nReturn JSON array of similar items with similarity scores:\n[\n {\n \"item\": {item object},\n \"similarity\": 0.0-1.0,\n \"reasons\": [\"reason1\"]\n }\n]\n\nOrder by similarity descending. Max ${limit} items with similarity >= ${threshold}.`;\n\n const results = await this.llm.getJSON(\n systemPrompt,\n JSON.stringify(candidates.slice(0, 50), null, 2),\n { temperature: 0.2 }\n );\n\n return results.slice(0, limit).filter(r => r.similarity >= threshold);\n }\n\n /**\n * Build relationship graph\n * @param {string} holon - Holon\n * @param {string} lens - Lens\n * @returns {Promise<Object>} Graph structure\n */\n async buildGraph(holon, lens) {\n const discovered = await this.discoverRelationships(holon, lens);\n\n const nodes = new Map();\n const edges = [];\n\n // Build nodes from relationships\n for (const rel of discovered.relationships?.relationships || []) {\n if (!nodes.has(rel.item1.id)) {\n nodes.set(rel.item1.id, { id: rel.item1.id, label: rel.item1.title });\n }\n if (!nodes.has(rel.item2.id)) {\n nodes.set(rel.item2.id, { id: rel.item2.id, label: rel.item2.title });\n }\n\n edges.push({\n source: rel.item1.id,\n target: rel.item2.id,\n type: rel.type,\n weight: rel.strength,\n });\n }\n\n return {\n nodes: Array.from(nodes.values()),\n edges,\n clusters: discovered.relationships?.clusters || [],\n };\n }\n\n /**\n * Find cross-holon relationships\n * @param {string[]} holons - Holons to analyze\n * @param {string} lens - Lens\n * @returns {Promise<Object>} Cross-holon relationships\n */\n async findCrossHolonRelationships(holons, lens) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const allData = {};\n\n for (const holon of holons.slice(0, 5)) {\n try {\n const data = await this.holosphere.getAll(holon, lens);\n if (data.length > 0) {\n allData[holon] = data.slice(0, 15);\n }\n } catch {\n // Skip\n }\n }\n\n if (Object.keys(allData).length < 2) {\n return { message: 'Need at least 2 holons with data' };\n }\n\n const systemPrompt = `Find relationships between items across different geographic regions.\n\nRegions and their data:\n${JSON.stringify(allData, null, 2)}\n\nIdentify:\n1. Cross-region collaborations\n2. Shared themes across regions\n3. Potential synergies\n4. Knowledge transfer opportunities\n\nReturn JSON:\n{\n \"cross_relationships\": [\n {\n \"holon1\": \"id\",\n \"item1\": \"item_id\",\n \"holon2\": \"id\",\n \"item2\": \"item_id\",\n \"type\": \"type\",\n \"potential\": \"collaboration|knowledge_share|synergy\"\n }\n ],\n \"shared_themes\": [{\"theme\": \"theme\", \"holons\": [\"id1\", \"id2\"]}],\n \"opportunities\": [\"opp1\"]\n}`;\n\n return this.llm.getJSON(systemPrompt, '', { temperature: 0.4 });\n }\n\n /**\n * Suggest connections for an item\n * @param {Object} item - Item to find connections for\n * @param {string} holon - Holon\n * @param {string} lens - Lens\n * @returns {Promise<Object>} Suggested connections\n */\n async suggestConnections(item, holon, lens) {\n const similar = await this.findSimilar(item, holon, lens, { limit: 10 });\n\n const systemPrompt = `Based on similar items found, suggest specific actions to create connections.\n\nReference item:\n${JSON.stringify(item, null, 2)}\n\nSimilar items found:\n${JSON.stringify(similar, null, 2)}\n\nSuggest:\n1. Collaboration opportunities\n2. Resource sharing possibilities\n3. Joint initiatives\n4. Knowledge exchange\n\nReturn JSON:\n{\n \"collaborations\": [{\"with\": \"item_id\", \"action\": \"suggested action\"}],\n \"resource_sharing\": [{\"items\": [\"id1\", \"id2\"], \"resource\": \"what to share\"}],\n \"initiatives\": [{\"description\": \"joint initiative\", \"participants\": [\"id1\"]}],\n \"knowledge_exchange\": [{\"from\": \"id\", \"to\": \"id\", \"topic\": \"topic\"}]\n}`;\n\n return this.llm.getJSON(systemPrompt, '', { temperature: 0.5 });\n }\n\n /**\n * Detect relationship patterns\n * @param {string} holon - Holon\n * @param {string} lens - Lens\n * @returns {Promise<Object>} Detected patterns\n */\n async detectPatterns(holon, lens) {\n const relationships = await this.discoverRelationships(holon, lens);\n\n const systemPrompt = `Analyze relationships and detect higher-level patterns.\n\nRelationships:\n${JSON.stringify(relationships.relationships, null, 2)}\n\nDetect:\n1. Hub-spoke patterns (central connectors)\n2. Cluster patterns (tight groups)\n3. Bridge patterns (connecting different groups)\n4. Chain patterns (sequential relationships)\n5. Cyclical patterns (mutual dependencies)\n\nReturn JSON:\n{\n \"patterns\": [\n {\n \"type\": \"hub|cluster|bridge|chain|cycle\",\n \"description\": \"pattern description\",\n \"items\": [\"id1\", \"id2\"],\n \"significance\": \"why this matters\"\n }\n ],\n \"network_structure\": \"description of overall structure\",\n \"recommendations\": [\"rec1\"]\n}`;\n\n return this.llm.getJSON(systemPrompt, '', { temperature: 0.3 });\n }\n}\n\nexport default RelationshipDiscovery;\n","/**\n * Task Breakdown - Recursively decompose tasks/quests into subtasks\n */\n\n/**\n * Task Breakdown class\n */\nexport class TaskBreakdown {\n /**\n * @param {LLMService} llmService - LLM service instance\n * @param {Object} holosphere - HoloSphere instance\n */\n constructor(llmService, holosphere = null) {\n this.llm = llmService;\n this.holosphere = holosphere;\n }\n\n /**\n * Set HoloSphere instance\n * @param {Object} holosphere - HoloSphere instance\n */\n setHoloSphere(holosphere) {\n this.holosphere = holosphere;\n }\n\n /**\n * Recursively break down a task/quest into subtasks\n * @param {Object} item - The item to break down (must have id)\n * @param {string} holonId - Holon where the item lives\n * @param {string} lensName - Lens name (e.g., 'quests', 'tasks')\n * @param {Object} options - Breakdown options\n * @param {number} options.depth - Maximum recursion depth (default: 2)\n * @param {number} options.stepsPerLevel - Number of subtasks per level (default: 3-5)\n * @param {boolean} options.useContext - Look at other items for context (default: true)\n * @param {boolean} options.storeResults - Store generated subtasks (default: true)\n * @param {string} options.dependencyField - Field name for dependencies (default: 'dependencies')\n * @param {string} options.parentField - Field name for parent reference (default: 'parent')\n * @returns {Promise<Object>} Breakdown result with tree structure\n */\n async breakdown(item, holonId, lensName, options = {}) {\n if (!item || !item.id) {\n throw new Error('Item must have an id property');\n }\n\n const {\n depth = 2,\n stepsPerLevel = { min: 3, max: 5 },\n useContext = true,\n storeResults = true,\n dependencyField = 'dependencies',\n parentField = 'parent',\n } = options;\n\n // Normalize stepsPerLevel\n const steps = typeof stepsPerLevel === 'number'\n ? { min: stepsPerLevel, max: stepsPerLevel }\n : stepsPerLevel;\n\n // Get context from other items in the holon\n let context = [];\n if (useContext && this.holosphere) {\n try {\n const allItems = await this.holosphere.getAll(holonId, lensName);\n context = allItems\n .filter(i => i.id !== item.id)\n .slice(0, 10); // Limit context items\n } catch {\n // Skip if can't get context\n }\n }\n\n // Get schema for the lens if available\n let schema = null;\n if (this.holosphere) {\n try {\n schema = await this.holosphere.getSchema(lensName);\n } catch {\n // No schema available\n }\n }\n\n // Perform recursive breakdown\n const result = await this._breakdownRecursive(\n item,\n holonId,\n lensName,\n depth,\n steps,\n context,\n schema,\n dependencyField,\n parentField,\n storeResults,\n 0 // current depth\n );\n\n return {\n original: item,\n holonId,\n lensName,\n breakdown: result,\n totalSubtasks: this._countSubtasks(result),\n maxDepth: depth,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Recursive breakdown implementation\n * @private\n */\n async _breakdownRecursive(\n item,\n holonId,\n lensName,\n maxDepth,\n stepsPerLevel,\n context,\n schema,\n dependencyField,\n parentField,\n storeResults,\n currentDepth\n ) {\n if (currentDepth >= maxDepth) {\n return {\n item,\n children: [],\n depth: currentDepth,\n };\n }\n\n // Generate subtasks for this item\n const subtasks = await this._generateSubtasks(\n item,\n context,\n schema,\n stepsPerLevel,\n dependencyField,\n parentField\n );\n\n // Store subtasks if requested\n if (storeResults && this.holosphere && subtasks.length > 0) {\n for (const subtask of subtasks) {\n try {\n await this.holosphere.write(holonId, lensName, subtask);\n } catch (err) {\n console.warn(`Failed to store subtask ${subtask.id}:`, err.message);\n }\n }\n\n // Update parent item with child references if it doesn't have them\n if (item._meta?.childTasks !== subtasks.map(s => s.id)) {\n try {\n await this.holosphere.update(holonId, lensName, item.id, {\n _meta: {\n ...item._meta,\n childTasks: subtasks.map(s => s.id),\n breakdownTimestamp: Date.now(),\n }\n });\n } catch {\n // Skip if can't update\n }\n }\n }\n\n // Recursively break down each subtask\n const children = [];\n for (const subtask of subtasks) {\n const childResult = await this._breakdownRecursive(\n subtask,\n holonId,\n lensName,\n maxDepth,\n stepsPerLevel,\n context,\n schema,\n dependencyField,\n parentField,\n storeResults,\n currentDepth + 1\n );\n children.push(childResult);\n }\n\n return {\n item,\n children,\n depth: currentDepth,\n };\n }\n\n /**\n * Generate subtasks for an item using AI\n * @private\n */\n async _generateSubtasks(item, context, schema, stepsPerLevel, dependencyField, parentField) {\n const { min, max } = stepsPerLevel;\n\n const systemPrompt = `You are a task decomposition expert. Break down the given task/quest into ${min}-${max} concrete, actionable subtasks.\n\nEach subtask should:\n1. Be a clear, specific action\n2. Be smaller and more manageable than the parent\n3. Together with siblings, fully accomplish the parent task\n4. Have a unique ID (format: parentId-1, parentId-2, etc.)\n5. Reference the parent task in the \"${parentField}\" field\n6. List any dependencies on sibling tasks in \"${dependencyField}\" array\n\n${schema ? `Follow this schema structure:\\n${JSON.stringify(schema, null, 2)}` : ''}\n\n${context.length > 0 ? `Consider these existing items for context and avoid duplication:\\n${JSON.stringify(context.slice(0, 5), null, 2)}` : ''}\n\nReturn a JSON array of subtasks. Each subtask must have:\n- id: unique identifier (parentId-1, parentId-2, etc.)\n- title/name: clear action title\n- description: what needs to be done\n- ${parentField}: reference to parent id\n- ${dependencyField}: array of sibling task ids this depends on (empty if first task)\n- status: \"pending\"\n- Any other relevant fields from the parent schema\n\nExample output format:\n[\n {\n \"id\": \"parent-1\",\n \"title\": \"First subtask\",\n \"description\": \"Details...\",\n \"${parentField}\": \"parentId\",\n \"${dependencyField}\": [],\n \"status\": \"pending\"\n },\n {\n \"id\": \"parent-2\",\n \"title\": \"Second subtask (depends on first)\",\n \"description\": \"Details...\",\n \"${parentField}\": \"parentId\",\n \"${dependencyField}\": [\"parent-1\"],\n \"status\": \"pending\"\n }\n]`;\n\n const userMessage = `Break down this task into ${min}-${max} subtasks:\n\n${JSON.stringify(item, null, 2)}`;\n\n try {\n const subtasks = await this.llm.getJSON(systemPrompt, userMessage, {\n temperature: 0.4,\n maxTokens: 2000\n });\n\n // Ensure all subtasks have proper parent reference and IDs\n return subtasks.map((subtask, index) => ({\n ...subtask,\n id: subtask.id || `${item.id}-${index + 1}`,\n [parentField]: item.id,\n [dependencyField]: subtask[dependencyField] || [],\n status: subtask.status || 'pending',\n _meta: {\n ...subtask._meta,\n generatedFrom: item.id,\n generatedAt: Date.now(),\n depth: (item._meta?.depth || 0) + 1,\n }\n }));\n } catch (error) {\n console.error('Failed to generate subtasks:', error);\n return [];\n }\n }\n\n /**\n * Count total subtasks in a breakdown tree\n * @private\n */\n _countSubtasks(node) {\n if (!node.children || node.children.length === 0) {\n return 0;\n }\n return node.children.length +\n node.children.reduce((sum, child) => sum + this._countSubtasks(child), 0);\n }\n\n /**\n * Flatten a breakdown tree into a list\n * @param {Object} breakdownResult - Result from breakdown()\n * @returns {Object[]} Flat list of all items\n */\n flatten(breakdownResult) {\n const items = [];\n\n const traverse = (node) => {\n if (node.item) {\n items.push(node.item);\n }\n if (node.children) {\n for (const child of node.children) {\n traverse(child);\n }\n }\n };\n\n if (breakdownResult.breakdown) {\n traverse(breakdownResult.breakdown);\n }\n\n return items;\n }\n\n /**\n * Get dependency order for execution\n * @param {Object} breakdownResult - Result from breakdown()\n * @returns {Object[]} Items in dependency order (parents before children)\n */\n getDependencyOrder(breakdownResult) {\n const items = this.flatten(breakdownResult);\n\n // Sort by depth (parents first) then by dependency order within same depth\n return items.sort((a, b) => {\n const depthA = a._meta?.depth || 0;\n const depthB = b._meta?.depth || 0;\n if (depthA !== depthB) return depthA - depthB;\n\n // At same depth, check if b depends on a\n const bDeps = b.dependencies || [];\n if (bDeps.includes(a.id)) return -1;\n\n const aDeps = a.dependencies || [];\n if (aDeps.includes(b.id)) return 1;\n\n return 0;\n });\n }\n\n /**\n * Suggest breakdown strategy for an item\n * @param {Object} item - Item to analyze\n * @returns {Promise<Object>} Suggested breakdown strategy\n */\n async suggestStrategy(item) {\n const systemPrompt = `You are a task decomposition expert. Analyze this task and suggest the best breakdown strategy.\n\nConsider:\n1. Task complexity\n2. Recommended depth (1-4 levels)\n3. Recommended subtasks per level (2-7)\n4. Key areas to focus on\n5. Potential dependencies between subtasks\n\nReturn JSON:\n{\n \"complexity\": \"simple|moderate|complex|very_complex\",\n \"recommendedDepth\": n,\n \"recommendedStepsPerLevel\": {\"min\": n, \"max\": n},\n \"focusAreas\": [\"area1\", \"area2\"],\n \"potentialChallenges\": [\"challenge1\"],\n \"estimatedTotalSubtasks\": n,\n \"reasoning\": \"explanation\"\n}`;\n\n return this.llm.getJSON(\n systemPrompt,\n JSON.stringify(item, null, 2),\n { temperature: 0.3 }\n );\n }\n\n /**\n * Rebalance a breakdown tree (redistribute subtasks)\n * @param {Object} breakdownResult - Existing breakdown result\n * @param {Object} options - Rebalancing options\n * @returns {Promise<Object>} Rebalanced breakdown\n */\n async rebalance(breakdownResult, options = {}) {\n const { targetStepsPerLevel = { min: 3, max: 5 } } = options;\n\n const items = this.flatten(breakdownResult);\n\n const systemPrompt = `You are a task organization expert. Rebalance these tasks to have ${targetStepsPerLevel.min}-${targetStepsPerLevel.max} items per level.\n\nCurrent tasks:\n${JSON.stringify(items, null, 2)}\n\nReorganize by:\n1. Merging tasks that are too granular\n2. Splitting tasks that are too large\n3. Maintaining proper dependency chains\n4. Keeping the same overall scope\n\nReturn JSON with the rebalanced structure:\n{\n \"tasks\": [...],\n \"changes\": [{\"type\": \"merge|split|move\", \"description\": \"...\"}],\n \"summary\": \"what changed\"\n}`;\n\n return this.llm.getJSON(systemPrompt, '', { temperature: 0.3 });\n }\n\n /**\n * Update progress on a breakdown tree\n * @param {string} holonId - Holon ID\n * @param {string} lensName - Lens name\n * @param {string} itemId - Root item ID\n * @returns {Promise<Object>} Progress summary\n */\n async getProgress(holonId, lensName, itemId) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n // Get all items\n const allItems = await this.holosphere.getAll(holonId, lensName);\n\n // Find root and all descendants\n const root = allItems.find(i => i.id === itemId);\n if (!root) {\n throw new Error(`Item ${itemId} not found`);\n }\n\n const descendants = this._findDescendants(itemId, allItems);\n\n // Calculate progress\n const total = descendants.length;\n const completed = descendants.filter(i =>\n i.status === 'completed' || i.status === 'done'\n ).length;\n const inProgress = descendants.filter(i =>\n i.status === 'in_progress' || i.status === 'active'\n ).length;\n const pending = total - completed - inProgress;\n\n return {\n itemId,\n title: root.title || root.name,\n total,\n completed,\n inProgress,\n pending,\n percentComplete: total > 0 ? Math.round((completed / total) * 100) : 0,\n blockers: this._findBlockers(descendants),\n nextUp: this._findNextTasks(descendants),\n };\n }\n\n /**\n * Find all descendants of an item\n * @private\n */\n _findDescendants(itemId, allItems, parentField = 'parent') {\n const descendants = [];\n const children = allItems.filter(i => i[parentField] === itemId);\n\n for (const child of children) {\n descendants.push(child);\n descendants.push(...this._findDescendants(child.id, allItems, parentField));\n }\n\n return descendants;\n }\n\n /**\n * Find blocked tasks\n * @private\n */\n _findBlockers(items, dependencyField = 'dependencies') {\n return items.filter(item => {\n const deps = item[dependencyField] || [];\n if (deps.length === 0) return false;\n\n // Check if any dependency is not completed\n return deps.some(depId => {\n const dep = items.find(i => i.id === depId);\n return dep && dep.status !== 'completed' && dep.status !== 'done';\n });\n }).map(item => ({\n id: item.id,\n title: item.title || item.name,\n blockedBy: item[dependencyField],\n }));\n }\n\n /**\n * Find next tasks ready to work on\n * @private\n */\n _findNextTasks(items, dependencyField = 'dependencies') {\n return items.filter(item => {\n if (item.status === 'completed' || item.status === 'done') return false;\n if (item.status === 'in_progress' || item.status === 'active') return false;\n\n const deps = item[dependencyField] || [];\n if (deps.length === 0) return true;\n\n // All dependencies must be completed\n return deps.every(depId => {\n const dep = items.find(i => i.id === depId);\n return !dep || dep.status === 'completed' || dep.status === 'done';\n });\n }).slice(0, 5).map(item => ({\n id: item.id,\n title: item.title || item.name,\n description: item.description,\n }));\n }\n}\n\nexport default TaskBreakdown;\n","/**\n * H3 AI - Geospatial intelligence for H3 hexagonal hierarchies\n */\n\nimport * as h3 from 'h3-js';\n\n/**\n * H3 AI class for geospatial intelligence\n */\nexport class H3AI {\n /**\n * @param {LLMService} llmService - LLM service instance\n * @param {Object} holosphere - HoloSphere instance\n */\n constructor(llmService, holosphere = null) {\n this.llm = llmService;\n this.holosphere = holosphere;\n }\n\n /**\n * Set HoloSphere instance\n * @param {Object} holosphere - HoloSphere instance\n */\n setHoloSphere(holosphere) {\n this.holosphere = holosphere;\n }\n\n /**\n * Suggest optimal H3 resolution for a task/project based on its scope\n * @param {Object} item - Item to analyze (task, project, quest)\n * @param {Object} options - Options\n * @returns {Promise<Object>} Resolution recommendation\n */\n async suggestResolution(item, options = {}) {\n const { currentResolution = null, context = null } = options;\n\n const systemPrompt = `You are a geospatial planning expert. Analyze this item and suggest the optimal H3 hexagonal resolution (0-15) for organizing it.\n\nH3 Resolution Guide:\n- Resolution 0-2: Continental/country scale (thousands of km)\n- Resolution 3-4: Regional/state scale (hundreds of km)\n- Resolution 5-6: Metropolitan/city scale (tens of km)\n- Resolution 7-8: District/neighborhood scale (km)\n- Resolution 9-10: Block/street scale (hundreds of meters)\n- Resolution 11-12: Building/lot scale (tens of meters)\n- Resolution 13-15: Room/precise scale (meters)\n\nConsider:\n1. Geographic scope mentioned in the item\n2. Number of potential participants/stakeholders\n3. Type of activity (local vs regional)\n4. Resource requirements and logistics\n5. Similar projects' typical scale\n\n${currentResolution !== null ? `Current resolution: ${currentResolution}` : ''}\n${context ? `Context:\\n${JSON.stringify(context, null, 2)}` : ''}\n\nReturn JSON:\n{\n \"recommendedResolution\": n,\n \"reasoning\": \"why this resolution\",\n \"alternativeResolutions\": [{\"resolution\": n, \"useCase\": \"when to use\"}],\n \"geographicScope\": \"description of area covered\",\n \"scaleSuggestions\": {\n \"expansion\": {\"resolution\": n, \"reason\": \"when to expand\"},\n \"contraction\": {\"resolution\": n, \"reason\": \"when to focus\"}\n }\n}`;\n\n return this.llm.getJSON(\n systemPrompt,\n JSON.stringify(item, null, 2),\n { temperature: 0.3 }\n );\n }\n\n /**\n * Analyze geographic distribution of data across H3 cells\n * @param {string} holonId - Parent holon to analyze\n * @param {string} lensName - Lens to analyze\n * @param {Object} options - Options\n * @returns {Promise<Object>} Distribution analysis\n */\n async analyzeDistribution(holonId, lensName, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const { includeChildren = true, maxChildren = 20 } = options;\n\n // Get data from the holon\n const parentData = await this.holosphere.getAll(holonId, lensName);\n\n // Get data from children if requested\n const childrenData = {};\n if (includeChildren && h3.isValidCell(holonId)) {\n const resolution = h3.getResolution(holonId);\n if (resolution < 15) {\n const children = h3.cellToChildren(holonId, resolution + 1);\n for (const child of children.slice(0, maxChildren)) {\n try {\n const data = await this.holosphere.getAll(child, lensName);\n if (data.length > 0) {\n childrenData[child] = {\n count: data.length,\n sample: data.slice(0, 3),\n };\n }\n } catch {\n // Skip unavailable children\n }\n }\n }\n }\n\n const systemPrompt = `You are a geospatial analyst. Analyze the distribution of data across this H3 hexagonal region.\n\nParent holon: ${holonId}\nResolution: ${h3.isValidCell(holonId) ? h3.getResolution(holonId) : 'N/A'}\nParent data count: ${parentData.length}\nChildren with data: ${Object.keys(childrenData).length}\n\nAnalyze:\n1. Data density and distribution patterns\n2. Geographic hotspots and cold spots\n3. Coverage gaps\n4. Clustering patterns\n5. Recommendations for better coverage\n\nReturn JSON:\n{\n \"distribution\": {\n \"pattern\": \"clustered|uniform|sparse|concentrated\",\n \"density\": \"high|medium|low\",\n \"coverage\": 0.0-1.0\n },\n \"hotspots\": [{\"holonId\": \"id\", \"reason\": \"why\"}],\n \"gaps\": [{\"description\": \"gap description\", \"suggestedAction\": \"what to do\"}],\n \"clusters\": [{\"theme\": \"cluster theme\", \"holons\": [\"id1\"]}],\n \"recommendations\": [\"rec1\"],\n \"summary\": \"overview\"\n}`;\n\n const userMessage = `Parent data sample:\n${JSON.stringify(parentData.slice(0, 10), null, 2)}\n\nChildren distribution:\n${JSON.stringify(childrenData, null, 2)}`;\n\n const analysis = await this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.3 });\n\n return {\n holonId,\n lensName,\n resolution: h3.isValidCell(holonId) ? h3.getResolution(holonId) : null,\n parentDataCount: parentData.length,\n childrenAnalyzed: Object.keys(childrenData).length,\n analysis,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Find relevant data from neighboring H3 cells\n * @param {string} holonId - Center holon\n * @param {string} lensName - Lens to search\n * @param {Object} options - Options\n * @returns {Promise<Object>} Neighbor recommendations\n */\n async findNeighborRelevance(holonId, lensName, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n if (!h3.isValidCell(holonId)) {\n throw new Error('Invalid H3 cell');\n }\n\n const { ringSize = 1, relevanceThreshold = 0.5 } = options;\n\n // Get center data\n const centerData = await this.holosphere.getAll(holonId, lensName);\n\n // Get neighbor data\n const neighbors = h3.gridDisk(holonId, ringSize).filter(n => n !== holonId);\n const neighborData = {};\n\n for (const neighbor of neighbors) {\n try {\n const data = await this.holosphere.getAll(neighbor, lensName);\n if (data.length > 0) {\n neighborData[neighbor] = data.slice(0, 5);\n }\n } catch {\n // Skip\n }\n }\n\n if (Object.keys(neighborData).length === 0) {\n return {\n holonId,\n neighbors: [],\n message: 'No data found in neighboring cells',\n };\n }\n\n const systemPrompt = `You are a geospatial relevance analyst. Find items in neighboring H3 cells that are relevant to the center cell's data.\n\nCenter cell: ${holonId}\nRing size: ${ringSize} (immediate neighbors)\n\nConsider:\n1. Thematic overlap\n2. Potential collaborations\n3. Shared resources\n4. Cross-boundary projects\n5. Geographic continuity of activities\n\nReturn JSON:\n{\n \"relevantNeighbors\": [\n {\n \"holonId\": \"neighbor_id\",\n \"relevanceScore\": 0.0-1.0,\n \"relevantItems\": [{\"id\": \"item_id\", \"reason\": \"why relevant\"}],\n \"collaborationPotential\": \"description\"\n }\n ],\n \"crossBoundaryOpportunities\": [\n {\n \"description\": \"opportunity\",\n \"involvedHolons\": [\"id1\", \"id2\"],\n \"suggestedAction\": \"what to do\"\n }\n ],\n \"geographicPatterns\": [\"pattern1\"],\n \"summary\": \"overview\"\n}`;\n\n const userMessage = `Center cell data:\n${JSON.stringify(centerData.slice(0, 10), null, 2)}\n\nNeighbor data:\n${JSON.stringify(neighborData, null, 2)}`;\n\n const analysis = await this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.4 });\n\n // Filter by threshold\n if (analysis.relevantNeighbors) {\n analysis.relevantNeighbors = analysis.relevantNeighbors\n .filter(n => n.relevanceScore >= relevanceThreshold);\n }\n\n return {\n holonId,\n lensName,\n ringSize,\n neighborsAnalyzed: Object.keys(neighborData).length,\n analysis,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Suggest geographic expansion or contraction for an item\n * @param {Object} item - Item to analyze\n * @param {string} currentHolonId - Current holon\n * @param {string} lensName - Lens name\n * @param {Object} options - Options\n * @returns {Promise<Object>} Expansion/contraction suggestions\n */\n async suggestGeographicScope(item, currentHolonId, lensName, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n if (!h3.isValidCell(currentHolonId)) {\n throw new Error('Invalid H3 cell');\n }\n\n const currentResolution = h3.getResolution(currentHolonId);\n\n // Get parent data\n let parentData = [];\n if (currentResolution > 0) {\n const parent = h3.cellToParent(currentHolonId, currentResolution - 1);\n try {\n parentData = await this.holosphere.getAll(parent, lensName);\n } catch {\n // No parent data\n }\n }\n\n // Get sample children data\n let childrenData = [];\n if (currentResolution < 15) {\n const children = h3.cellToChildren(currentHolonId, currentResolution + 1);\n for (const child of children.slice(0, 7)) {\n try {\n const data = await this.holosphere.getAll(child, lensName);\n childrenData.push(...data.slice(0, 2));\n } catch {\n // Skip\n }\n }\n }\n\n const systemPrompt = `You are a geographic scope advisor. Analyze whether this item should expand to a larger region (parent holon) or focus on smaller sub-regions (children holons).\n\nCurrent holon: ${currentHolonId}\nCurrent resolution: ${currentResolution}\n\nFactors to consider:\n1. Item's stated scope and goals\n2. Current participation/activity level\n3. Resource requirements\n4. Similar activities in parent/children\n5. Natural geographic boundaries\n\nReturn JSON:\n{\n \"currentScopeAssessment\": {\n \"appropriate\": true/false,\n \"reasoning\": \"why\"\n },\n \"expansionRecommendation\": {\n \"recommended\": true/false,\n \"targetResolution\": n,\n \"reasoning\": \"why expand\",\n \"benefits\": [\"benefit1\"],\n \"risks\": [\"risk1\"]\n },\n \"contractionRecommendation\": {\n \"recommended\": true/false,\n \"targetResolution\": n,\n \"reasoning\": \"why contract\",\n \"suggestedFocusAreas\": [\"description\"],\n \"benefits\": [\"benefit1\"],\n \"risks\": [\"risk1\"]\n },\n \"optimalAction\": \"expand|contract|maintain\",\n \"summary\": \"recommendation summary\"\n}`;\n\n const userMessage = `Item to analyze:\n${JSON.stringify(item, null, 2)}\n\nParent region data (${parentData.length} items):\n${JSON.stringify(parentData.slice(0, 5), null, 2)}\n\nChildren regions data (${childrenData.length} items):\n${JSON.stringify(childrenData.slice(0, 5), null, 2)}`;\n\n return this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.3 });\n }\n\n /**\n * Analyze coverage gaps in a region\n * @param {string} holonId - Region to analyze\n * @param {string} lensName - Lens\n * @param {Object} options - Options\n * @returns {Promise<Object>} Coverage analysis\n */\n async analyzeCoverage(holonId, lensName, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n if (!h3.isValidCell(holonId)) {\n throw new Error('Invalid H3 cell');\n }\n\n const { targetResolution = null } = options;\n const currentResolution = h3.getResolution(holonId);\n const childResolution = targetResolution || Math.min(currentResolution + 1, 15);\n\n // Get all children at target resolution\n const children = h3.cellToChildren(holonId, childResolution);\n\n // Check which children have data\n const coverage = {\n total: children.length,\n withData: 0,\n withoutData: 0,\n dataDistribution: {},\n };\n\n const childrenWithData = [];\n const childrenWithoutData = [];\n\n for (const child of children) {\n try {\n const data = await this.holosphere.getAll(child, lensName);\n if (data.length > 0) {\n coverage.withData++;\n coverage.dataDistribution[child] = data.length;\n childrenWithData.push({ holon: child, count: data.length });\n } else {\n coverage.withoutData++;\n childrenWithoutData.push(child);\n }\n } catch {\n coverage.withoutData++;\n childrenWithoutData.push(child);\n }\n }\n\n const systemPrompt = `You are a geographic coverage analyst. Analyze the data coverage in this H3 region.\n\nRegion: ${holonId}\nResolution: ${currentResolution}\nChild resolution analyzed: ${childResolution}\nTotal children: ${coverage.total}\nChildren with data: ${coverage.withData}\nChildren without data: ${coverage.withoutData}\nCoverage ratio: ${(coverage.withData / coverage.total * 100).toFixed(1)}%\n\nAnalyze:\n1. Coverage patterns\n2. Potential reasons for gaps\n3. Priority areas for expansion\n4. Whether gaps are concerning or expected\n\nReturn JSON:\n{\n \"coverageScore\": 0.0-1.0,\n \"coverageQuality\": \"excellent|good|moderate|poor|minimal\",\n \"patterns\": {\n \"type\": \"clustered|scattered|peripheral|central|uniform\",\n \"description\": \"pattern description\"\n },\n \"gaps\": {\n \"count\": n,\n \"significance\": \"high|medium|low\",\n \"likelyReasons\": [\"reason1\"],\n \"priorityAreas\": [\"description of areas to focus\"]\n },\n \"recommendations\": [\n {\n \"action\": \"what to do\",\n \"priority\": \"high|medium|low\",\n \"targetArea\": \"description\"\n }\n ],\n \"summary\": \"overview\"\n}`;\n\n const analysis = await this.llm.getJSON(systemPrompt, '', { temperature: 0.3 });\n\n return {\n holonId,\n lensName,\n resolution: currentResolution,\n childResolution,\n coverage: {\n ...coverage,\n ratio: coverage.withData / coverage.total,\n },\n childrenWithData: childrenWithData.slice(0, 10),\n gapCount: childrenWithoutData.length,\n analysis,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Find patterns across multiple H3 resolutions\n * @param {string} holonId - Starting holon\n * @param {string} lensName - Lens\n * @param {Object} options - Options\n * @returns {Promise<Object>} Cross-resolution insights\n */\n async crossResolutionInsights(holonId, lensName, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n if (!h3.isValidCell(holonId)) {\n throw new Error('Invalid H3 cell');\n }\n\n const { levels = 3 } = options;\n const currentResolution = h3.getResolution(holonId);\n\n // Collect data at multiple resolutions\n const resolutionData = {};\n\n // Current level\n const currentData = await this.holosphere.getAll(holonId, lensName);\n resolutionData[currentResolution] = {\n holon: holonId,\n count: currentData.length,\n sample: currentData.slice(0, 5),\n };\n\n // Parent levels\n let parentHolon = holonId;\n for (let i = 0; i < levels && h3.getResolution(parentHolon) > 0; i++) {\n const res = h3.getResolution(parentHolon) - 1;\n parentHolon = h3.cellToParent(parentHolon, res);\n try {\n const data = await this.holosphere.getAll(parentHolon, lensName);\n resolutionData[res] = {\n holon: parentHolon,\n count: data.length,\n sample: data.slice(0, 5),\n };\n } catch {\n // Skip\n }\n }\n\n // Child level (one level down)\n if (currentResolution < 15) {\n const childRes = currentResolution + 1;\n const children = h3.cellToChildren(holonId, childRes);\n let childTotal = 0;\n const childSamples = [];\n\n for (const child of children.slice(0, 7)) {\n try {\n const data = await this.holosphere.getAll(child, lensName);\n childTotal += data.length;\n if (data.length > 0) {\n childSamples.push(...data.slice(0, 2));\n }\n } catch {\n // Skip\n }\n }\n\n resolutionData[childRes] = {\n holon: `${children.length} children`,\n count: childTotal,\n sample: childSamples.slice(0, 5),\n };\n }\n\n const systemPrompt = `You are a multi-scale geographic analyst. Find patterns that emerge across different H3 resolutions.\n\nStarting holon: ${holonId}\nResolutions analyzed: ${Object.keys(resolutionData).sort().join(', ')}\n\nData at each resolution:\n${JSON.stringify(resolutionData, null, 2)}\n\nAnalyze:\n1. How themes evolve across scales\n2. What appears only at certain resolutions\n3. Aggregation patterns (local vs regional)\n4. Scale-dependent opportunities\n5. Optimal resolution for different activities\n\nReturn JSON:\n{\n \"scalePatterns\": [\n {\n \"pattern\": \"description\",\n \"visibleAt\": [resolution_numbers],\n \"significance\": \"why this matters\"\n }\n ],\n \"themeEvolution\": {\n \"localThemes\": [\"themes at fine resolution\"],\n \"regionalThemes\": [\"themes at coarse resolution\"],\n \"consistentThemes\": [\"themes across all scales\"]\n },\n \"optimalResolutions\": {\n \"forCollaboration\": n,\n \"forResources\": n,\n \"forCommunity\": n,\n \"reasoning\": \"why\"\n },\n \"insights\": [\"insight1\"],\n \"recommendations\": [\"rec1\"],\n \"summary\": \"overview\"\n}`;\n\n return this.llm.getJSON(systemPrompt, '', { temperature: 0.4 });\n }\n\n /**\n * Suggest item migration between holons based on geographic fit\n * @param {Object} item - Item to analyze\n * @param {string} currentHolonId - Current location\n * @param {string} lensName - Lens\n * @param {Object} options - Options\n * @returns {Promise<Object>} Migration suggestions\n */\n async suggestMigration(item, currentHolonId, lensName, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n if (!h3.isValidCell(currentHolonId)) {\n throw new Error('Invalid H3 cell');\n }\n\n const { searchRadius = 2 } = options;\n\n // Get data from nearby cells\n const nearby = h3.gridDisk(currentHolonId, searchRadius);\n const nearbyData = {};\n\n for (const cell of nearby) {\n if (cell === currentHolonId) continue;\n try {\n const data = await this.holosphere.getAll(cell, lensName);\n if (data.length > 0) {\n nearbyData[cell] = {\n count: data.length,\n sample: data.slice(0, 3),\n };\n }\n } catch {\n // Skip\n }\n }\n\n // Also check parent\n const currentRes = h3.getResolution(currentHolonId);\n let parentData = null;\n if (currentRes > 0) {\n const parent = h3.cellToParent(currentHolonId, currentRes - 1);\n try {\n const data = await this.holosphere.getAll(parent, lensName);\n parentData = { holon: parent, count: data.length, sample: data.slice(0, 3) };\n } catch {\n // Skip\n }\n }\n\n const systemPrompt = `You are a geographic placement advisor. Determine if this item would be better suited in a different H3 cell.\n\nCurrent location: ${currentHolonId}\nCurrent resolution: ${currentRes}\n\nConsider:\n1. Thematic fit with existing data in each cell\n2. Geographic scope of the item\n3. Collaboration opportunities\n4. Resource proximity\n5. Community alignment\n\nReturn JSON:\n{\n \"currentFit\": {\n \"score\": 0.0-1.0,\n \"reasoning\": \"why current location is/isn't appropriate\"\n },\n \"migrationRecommended\": true/false,\n \"suggestedDestinations\": [\n {\n \"holonId\": \"cell_id\",\n \"fitScore\": 0.0-1.0,\n \"reasoning\": \"why this location\",\n \"benefits\": [\"benefit1\"],\n \"drawbacks\": [\"drawback1\"]\n }\n ],\n \"stayReasons\": [\"reason to stay if applicable\"],\n \"moveReasons\": [\"reason to move if applicable\"],\n \"recommendation\": \"stay|move|duplicate\",\n \"summary\": \"final recommendation\"\n}`;\n\n const userMessage = `Item to place:\n${JSON.stringify(item, null, 2)}\n\nNearby cells with data:\n${JSON.stringify(nearbyData, null, 2)}\n\n${parentData ? `Parent cell data:\\n${JSON.stringify(parentData, null, 2)}` : ''}`;\n\n return this.llm.getJSON(systemPrompt, userMessage, { temperature: 0.3 });\n }\n\n /**\n * Generate a geographic activity report for a region\n * @param {string} holonId - Region to report on\n * @param {Object} options - Options\n * @returns {Promise<Object>} Geographic report\n */\n async generateGeographicReport(holonId, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n const { lenses = ['projects', 'quests', 'events', 'resources', 'default'] } = options;\n\n // Collect data from all lenses\n const lensData = {};\n for (const lens of lenses) {\n try {\n const data = await this.holosphere.getAll(holonId, lens);\n if (data.length > 0) {\n lensData[lens] = {\n count: data.length,\n sample: data.slice(0, 5),\n };\n }\n } catch {\n // Skip\n }\n }\n\n // Get geographic context\n let geoContext = {};\n if (h3.isValidCell(holonId)) {\n const res = h3.getResolution(holonId);\n const [lat, lng] = h3.cellToLatLng(holonId);\n const boundary = h3.cellToBoundary(holonId);\n const area = h3.cellArea(holonId, 'km2');\n\n geoContext = {\n resolution: res,\n center: { lat, lng },\n areaKm2: area,\n vertexCount: boundary.length,\n };\n }\n\n const systemPrompt = `You are a regional activity reporter. Generate a comprehensive report on geographic activity in this H3 region.\n\nRegion: ${holonId}\nGeographic context: ${JSON.stringify(geoContext, null, 2)}\nData available in ${Object.keys(lensData).length} categories\n\nGenerate a report covering:\n1. Executive summary\n2. Activity overview by category\n3. Key highlights and achievements\n4. Geographic patterns\n5. Opportunities and challenges\n6. Recommendations\n\nReturn JSON:\n{\n \"title\": \"Region Report Title\",\n \"executiveSummary\": \"2-3 sentence overview\",\n \"activityOverview\": {\n \"totalItems\": n,\n \"categorySummaries\": {\"lens\": \"summary\"}\n },\n \"highlights\": [\n {\"title\": \"highlight\", \"description\": \"details\", \"category\": \"lens\"}\n ],\n \"geographicPatterns\": [\"pattern1\"],\n \"strengths\": [\"strength1\"],\n \"challenges\": [\"challenge1\"],\n \"opportunities\": [\"opportunity1\"],\n \"recommendations\": [\n {\"priority\": \"high|medium|low\", \"action\": \"what to do\", \"rationale\": \"why\"}\n ],\n \"metrics\": {\n \"activityLevel\": \"high|medium|low\",\n \"diversity\": \"high|medium|low\",\n \"growth\": \"growing|stable|declining\"\n }\n}`;\n\n const report = await this.llm.getJSON(\n systemPrompt,\n JSON.stringify(lensData, null, 2),\n { temperature: 0.4, maxTokens: 2000 }\n );\n\n return {\n holonId,\n geoContext,\n lensesAnalyzed: Object.keys(lensData),\n totalItems: Object.values(lensData).reduce((sum, l) => sum + l.count, 0),\n report,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Find geographic clusters of related items\n * @param {string} holonId - Region to analyze\n * @param {string} lensName - Lens\n * @param {Object} options - Options\n * @returns {Promise<Object>} Geographic clusters\n */\n async findGeographicClusters(holonId, lensName, options = {}) {\n if (!this.holosphere) {\n throw new Error('HoloSphere instance required');\n }\n\n if (!h3.isValidCell(holonId)) {\n throw new Error('Invalid H3 cell');\n }\n\n const { clusterResolution = null } = options;\n const currentRes = h3.getResolution(holonId);\n const targetRes = clusterResolution || Math.min(currentRes + 1, 15);\n\n // Get data from children at cluster resolution\n const children = h3.cellToChildren(holonId, targetRes);\n const cellData = {};\n\n for (const child of children) {\n try {\n const data = await this.holosphere.getAll(child, lensName);\n if (data.length > 0) {\n cellData[child] = data;\n }\n } catch {\n // Skip\n }\n }\n\n if (Object.keys(cellData).length < 2) {\n return {\n holonId,\n clusters: [],\n message: 'Not enough data for clustering',\n };\n }\n\n const systemPrompt = `You are a geographic clustering expert. Find thematic clusters in this spatial data.\n\nRegion: ${holonId}\nResolution analyzed: ${targetRes}\nCells with data: ${Object.keys(cellData).length}\n\nIdentify:\n1. Thematic clusters (cells with similar content)\n2. Activity clusters (cells with related activities)\n3. Isolated cells (unique content)\n4. Potential connections between clusters\n\nReturn JSON:\n{\n \"clusters\": [\n {\n \"name\": \"cluster name\",\n \"theme\": \"what unifies this cluster\",\n \"cells\": [\"cell_id1\", \"cell_id2\"],\n \"strength\": 0.0-1.0,\n \"characteristics\": [\"char1\"]\n }\n ],\n \"isolatedCells\": [\n {\"cellId\": \"id\", \"uniqueAspect\": \"what makes it unique\"}\n ],\n \"interClusterConnections\": [\n {\"cluster1\": \"name\", \"cluster2\": \"name\", \"connection\": \"how related\"}\n ],\n \"spatialPatterns\": [\"pattern1\"],\n \"recommendations\": [\"rec1\"]\n}`;\n\n const analysis = await this.llm.getJSON(\n systemPrompt,\n JSON.stringify(cellData, null, 2),\n { temperature: 0.4 }\n );\n\n return {\n holonId,\n lensName,\n clusterResolution: targetRes,\n cellsAnalyzed: Object.keys(cellData).length,\n analysis,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Calculate and explain geographic impact of an item\n * @param {Object} item - Item to analyze\n * @param {string} holonId - Item's holon\n * @param {string} lensName - Lens\n * @param {Object} options - Options\n * @returns {Promise<Object>} Impact analysis\n */\n async analyzeGeographicImpact(item, holonId, lensName, options = {}) {\n if (!h3.isValidCell(holonId)) {\n throw new Error('Invalid H3 cell');\n }\n\n const res = h3.getResolution(holonId);\n const [lat, lng] = h3.cellToLatLng(holonId);\n const area = h3.cellArea(holonId, 'km2');\n\n // Get parent info for context\n let parentContext = null;\n if (res > 0) {\n const parent = h3.cellToParent(holonId, Math.max(0, res - 2));\n const parentArea = h3.cellArea(parent, 'km2');\n parentContext = {\n holon: parent,\n resolution: res - 2,\n areaKm2: parentArea,\n };\n }\n\n const systemPrompt = `You are a geographic impact analyst. Analyze the geographic reach and impact of this item.\n\nItem location: ${holonId}\nResolution: ${res}\nCenter: ${lat.toFixed(4)}, ${lng.toFixed(4)}\nArea: ${area.toFixed(2)} km²\n\n${parentContext ? `Broader region: ${parentContext.areaKm2.toFixed(2)} km²` : ''}\n\nAnalyze:\n1. Direct impact area (immediate cell)\n2. Indirect impact area (spillover effects)\n3. Potential reach (if expanded)\n4. Geographic barriers/enablers\n5. Network effects\n\nReturn JSON:\n{\n \"directImpact\": {\n \"areaKm2\": n,\n \"description\": \"direct impact area\",\n \"affectedPopulation\": \"estimate or N/A\"\n },\n \"indirectImpact\": {\n \"estimatedReach\": n,\n \"mechanisms\": [\"how impact spreads\"],\n \"neighboringAreas\": [\"affected areas\"]\n },\n \"potentialReach\": {\n \"ifExpanded\": {\n \"maxAreaKm2\": n,\n \"optimalResolution\": n,\n \"limitingFactors\": [\"factor1\"]\n }\n },\n \"geographicFactors\": {\n \"enablers\": [\"what helps geographic spread\"],\n \"barriers\": [\"what limits spread\"]\n },\n \"impactScore\": {\n \"local\": 0.0-1.0,\n \"regional\": 0.0-1.0,\n \"network\": 0.0-1.0\n },\n \"recommendations\": [\"how to increase impact\"],\n \"summary\": \"impact overview\"\n}`;\n\n return this.llm.getJSON(\n systemPrompt,\n JSON.stringify(item, null, 2),\n { temperature: 0.3 }\n );\n }\n}\n\nexport default H3AI;\n","/**\n * HoloSphere AI Module\n * Comprehensive AI functionality using OpenAI chat completions\n */\n\n// Import all modules for local use and re-export\nimport { LLMService, default as LLM } from './llm-service.js';\nimport { SchemaExtractor } from './schema-extractor.js';\nimport { JSONOps } from './json-ops.js';\nimport { Embeddings } from './embeddings.js';\nimport { Council } from './council.js';\nimport { TTS, VOICES, MODELS } from './tts.js';\nimport { NLQuery } from './nl-query.js';\nimport { Classifier } from './classifier.js';\nimport { SpatialAnalysis } from './spatial.js';\nimport { SmartAggregation } from './aggregation.js';\nimport { FederationAdvisor } from './federation-ai.js';\nimport { RelationshipDiscovery } from './relationships.js';\nimport { TaskBreakdown } from './breakdown.js';\nimport { H3AI } from './h3-ai.js';\n\n// Re-export all modules\nexport {\n LLMService,\n LLM,\n SchemaExtractor,\n JSONOps,\n Embeddings,\n Council,\n TTS,\n VOICES,\n MODELS,\n NLQuery,\n Classifier,\n SpatialAnalysis,\n SmartAggregation,\n FederationAdvisor,\n RelationshipDiscovery,\n TaskBreakdown,\n H3AI,\n};\n\n/**\n * Create all AI services with shared LLM instance\n * @param {string} apiKey - OpenAI API key\n * @param {Object} holosphere - HoloSphere instance (optional)\n * @param {Object} options - Configuration options\n * @param {Object} openaiClient - Optional pre-created OpenAI client\n * @returns {Object} AI services\n */\nexport function createAIServices(apiKey, holosphere = null, options = {}, openaiClient = null) {\n // Create shared LLM service\n const llm = new LLMService(apiKey, options.llm);\n\n // Use provided OpenAI client or create a placeholder\n // Note: For embeddings/TTS, caller should provide openaiClient or use individual services\n const openai = openaiClient;\n\n // Create all services\n const embeddings = new Embeddings(openai, holosphere);\n const schemaExtractor = new SchemaExtractor(llm);\n const jsonOps = new JSONOps(llm);\n const council = new Council(llm);\n const tts = new TTS(openai);\n const nlQuery = new NLQuery(llm, holosphere);\n const classifier = new Classifier(llm, holosphere);\n const spatial = new SpatialAnalysis(llm, holosphere);\n const aggregation = new SmartAggregation(llm, holosphere);\n const federationAdvisor = new FederationAdvisor(llm, holosphere, embeddings);\n const relationships = new RelationshipDiscovery(llm, holosphere, embeddings);\n const taskBreakdown = new TaskBreakdown(llm, holosphere);\n const h3ai = new H3AI(llm, holosphere);\n\n return {\n llm,\n openai,\n embeddings,\n schemaExtractor,\n jsonOps,\n council,\n tts,\n nlQuery,\n classifier,\n spatial,\n aggregation,\n federationAdvisor,\n relationships,\n taskBreakdown,\n h3ai,\n };\n}\n\n// Default export\nexport default {\n LLMService,\n SchemaExtractor,\n JSONOps,\n Embeddings,\n Council,\n TTS,\n VOICES,\n MODELS,\n NLQuery,\n Classifier,\n SpatialAnalysis,\n SmartAggregation,\n FederationAdvisor,\n RelationshipDiscovery,\n TaskBreakdown,\n H3AI,\n createAIServices,\n};\n","/**\n * HoloSphere - Holonic Geospatial Communication Infrastructure\n * Public API\n */\n\nimport { HoloSphere as HoloSphereCore } from './core/holosphere.js';\nimport * as spatial from './spatial/h3-operations.js';\nimport * as storage from './storage/nostr-wrapper.js';\nimport * as nostrAsync from './storage/nostr-async.js';\nimport * as globalTables from './storage/global-tables.js';\nimport * as schema from './schema/validator.js';\nimport { ValidationError } from './schema/validator.js';\nimport * as federation from './federation/hologram.js';\nimport * as crypto from './crypto/secp256k1.js';\nimport * as social from './content/social-protocols.js';\nimport * as subscriptions from './subscriptions/manager.js';\nimport * as hierarchical from './hierarchical/upcast.js';\nimport * as registry from './federation/registry.js';\nimport * as discovery from './federation/discovery.js';\n\n// AI Module imports\nimport { LLMService } from './ai/llm-service.js';\nimport { SchemaExtractor } from './ai/schema-extractor.js';\nimport { JSONOps } from './ai/json-ops.js';\nimport { Embeddings } from './ai/embeddings.js';\nimport { Council } from './ai/council.js';\nimport { TTS, VOICES, MODELS } from './ai/tts.js';\nimport { NLQuery } from './ai/nl-query.js';\nimport { Classifier } from './ai/classifier.js';\nimport { SpatialAnalysis } from './ai/spatial.js';\nimport { SmartAggregation } from './ai/aggregation.js';\nimport { FederationAdvisor } from './ai/federation-ai.js';\nimport { RelationshipDiscovery } from './ai/relationships.js';\nimport { TaskBreakdown } from './ai/breakdown.js';\nimport { H3AI } from './ai/h3-ai.js';\n\n/**\n * Main HoloSphere class with all methods\n */\nexport class HoloSphere extends HoloSphereCore {\n constructor(config) {\n super(config);\n this.schemas = new Map();\n this.subscriptionRegistry = new subscriptions.SubscriptionRegistry();\n\n // Initialize AI services if openaiKey is provided or OPENAI_API_KEY env var is set\n this._ai = null;\n const openaiKey = config.openaiKey || this._getEnv('OPENAI_API_KEY');\n if (openaiKey) {\n const aiOptions = {\n ...config.aiOptions,\n model: config.aiOptions?.model || this._getEnv('HOLOSPHERE_AI_MODEL'),\n temperature: config.aiOptions?.temperature ?? this._parseFloat(this._getEnv('HOLOSPHERE_AI_TEMPERATURE')),\n };\n this._initializeAI(openaiKey, aiOptions);\n }\n }\n\n /**\n * Get environment variable (works in Node.js)\n * @private\n */\n _getEnv(name) {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n return undefined;\n }\n\n /**\n * Parse float from string, return undefined if invalid\n * @private\n */\n _parseFloat(value) {\n if (value === undefined || value === null) return undefined;\n const parsed = parseFloat(value);\n return isNaN(parsed) ? undefined : parsed;\n }\n\n /**\n * Initialize AI services\n * @private\n */\n _initializeAI(apiKey, options = {}) {\n // Build LLM options from config\n const llmOptions = {\n ...options.llm,\n model: options.model || options.llm?.model,\n temperature: options.temperature ?? options.llm?.temperature,\n };\n\n // Create shared LLM service\n this._ai = {\n llm: new LLMService(apiKey, llmOptions),\n };\n\n // Create OpenAI client for embeddings and TTS\n const OpenAI = require('openai').default;\n const openai = new OpenAI({ apiKey });\n this._ai.openai = openai;\n\n // Create all services\n this._ai.embeddings = new Embeddings(openai, this);\n this._ai.schemaExtractor = new SchemaExtractor(this._ai.llm);\n this._ai.jsonOps = new JSONOps(this._ai.llm);\n this._ai.council = new Council(this._ai.llm);\n this._ai.tts = new TTS(openai);\n this._ai.nlQuery = new NLQuery(this._ai.llm, this);\n this._ai.classifier = new Classifier(this._ai.llm, this);\n this._ai.spatial = new SpatialAnalysis(this._ai.llm, this);\n this._ai.aggregation = new SmartAggregation(this._ai.llm, this);\n this._ai.federationAdvisor = new FederationAdvisor(this._ai.llm, this, this._ai.embeddings);\n this._ai.relationships = new RelationshipDiscovery(this._ai.llm, this, this._ai.embeddings);\n this._ai.taskBreakdown = new TaskBreakdown(this._ai.llm, this);\n this._ai.h3ai = new H3AI(this._ai.llm, this);\n }\n\n /**\n * Check if AI services are initialized\n * @returns {boolean}\n */\n hasAI() {\n return this._ai !== null;\n }\n\n /**\n * Get AI services object (for advanced usage)\n * @returns {Object|null}\n */\n getAIServices() {\n return this._ai;\n }\n\n // === Spatial Operations ===\n async toHolon(lat, lng, resolution) {\n return spatial.toHolon(lat, lng, resolution);\n }\n\n async getParents(holonId, maxResolution) {\n return spatial.getParents(holonId, maxResolution);\n }\n\n async getChildren(holonId) {\n return spatial.getChildren(holonId);\n }\n\n isValidH3(holonId) {\n return spatial.isValidH3(holonId);\n }\n\n // === Data Operations ===\n async write(holonId, lensName, data, options = {}) {\n // Validate inputs\n if (!holonId || typeof holonId !== 'string') {\n throw new ValidationError('ValidationError: holonId must be a non-empty string');\n }\n if (!lensName || typeof lensName !== 'string') {\n throw new ValidationError('ValidationError: lensName must be a non-empty string');\n }\n if (!data || typeof data !== 'object') {\n throw new ValidationError('ValidationError: data must be an object');\n }\n\n // Check authorization if capability token provided\n const capToken = options.capabilityToken || options.capability;\n if (capToken) {\n const authorized = await this.verifyCapability(\n capToken,\n 'write',\n { holonId, lensName }\n );\n if (!authorized) {\n throw new AuthorizationError('AuthorizationError: Invalid capability token for write operation', 'write');\n }\n }\n\n // Auto-generate ID if not provided\n if (!data.id) {\n data.id = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n // Check if we're writing to an existing hologram location\n const path = storage.buildPath(this.config.appName, holonId, lensName, data.id);\n const existingData = await storage.read(this.client, path);\n\n // If existing data is a hologram, split the write between local overrides and source\n if (existingData && existingData.hologram === true && existingData.target) {\n // Fields that define the hologram structure (never overwrite these)\n const hologramStructureFields = ['hologram', 'soul', 'target', 'id', '_meta'];\n // Fields that exist in the hologram as local overrides\n const localOverrideFields = Object.keys(existingData).filter(k => !hologramStructureFields.includes(k));\n\n // Split data: local fields stay local, everything else goes to source\n const localData = {\n ...existingData, // Keep hologram structure\n };\n const sourceUpdates = {};\n\n for (const [key, value] of Object.entries(data)) {\n if (hologramStructureFields.includes(key)) {\n // Skip - don't overwrite hologram structure\n continue;\n } else if (key === '_hologram') {\n // Skip - this is resolved metadata, not real data\n continue;\n } else if (localOverrideFields.includes(key)) {\n // This field exists in the hologram - update locally\n localData[key] = value;\n } else {\n // This field doesn't exist in hologram - update source\n sourceUpdates[key] = value;\n }\n }\n\n // Schema validation for source updates (if schema exists)\n if (Object.keys(sourceUpdates).length > 0 && options.validate !== false && this.schemas.has(lensName)) {\n // Read current source data to merge with updates for validation\n const sourcePath = storage.buildPath(\n existingData.target.appname || this.config.appName,\n existingData.target.holonId,\n existingData.target.lensName,\n existingData.target.dataId\n );\n const currentSourceData = await storage.read(this.client, sourcePath);\n const mergedSourceData = { ...currentSourceData, ...sourceUpdates };\n\n const schemaObj = this.schemas.get(lensName);\n const strict = options.strict !== undefined ? options.strict : schemaObj.strict;\n\n if (schemaObj.schema && typeof schemaObj.schema === 'object' && !schemaObj.schema.$ref) {\n schema.validate(mergedSourceData, schemaObj.schema, lensName, strict);\n }\n }\n\n // Update local hologram with its override fields\n const startTime = Date.now();\n await storage.write(this.client, path, localData);\n\n // Update source data with non-local fields (partial update, not replace)\n if (Object.keys(sourceUpdates).length > 0) {\n const sourceAppname = existingData.target.appname || this.config.appName;\n const sourceHolonId = existingData.target.holonId;\n const sourceLensName = existingData.target.lensName;\n const sourceDataId = existingData.target.dataId;\n\n const sourcePath = storage.buildPath(sourceAppname, sourceHolonId, sourceLensName, sourceDataId);\n await storage.update(this.client, sourcePath, sourceUpdates);\n\n // Refresh timestamps on all activeHolograms in source data's _meta\n await federation.refreshActiveHolograms(\n this.client,\n sourceAppname,\n sourceHolonId,\n sourceLensName,\n sourceDataId\n );\n }\n\n const endTime = Date.now();\n this._metrics.writes++;\n if (!this._metrics.totalWriteTime) this._metrics.totalWriteTime = 0;\n this._metrics.totalWriteTime += (endTime - startTime);\n\n return true;\n }\n\n // Regular write (not a hologram) - proceed normally\n // Add metadata\n if (!data._meta) {\n data._meta = {};\n }\n data._meta.timestamp = Date.now();\n\n // Schema validation if exists\n if (options.validate !== false && this.schemas.has(lensName)) {\n const schemaObj = this.schemas.get(lensName);\n const strict = options.strict !== undefined ? options.strict : schemaObj.strict;\n\n // If schema is a URI reference\n if (schemaObj.schema && typeof schemaObj.schema === 'object' && schemaObj.schema.$ref) {\n // URI schemas cannot be validated - skip validation in both modes\n // In a real implementation, URIs would be resolved first\n // For now, we allow writes through (no validation possible)\n } else if (schemaObj.schema && typeof schemaObj.schema === 'object') {\n // Validate if schema is an actual object\n schema.validate(data, schemaObj.schema, lensName, strict);\n }\n }\n\n // Write to storage\n const startTime = Date.now();\n const success = await storage.write(this.client, path, data);\n const endTime = Date.now();\n\n if (success) {\n this._metrics.writes++;\n // Track average write time\n if (!this._metrics.totalWriteTime) this._metrics.totalWriteTime = 0;\n this._metrics.totalWriteTime += (endTime - startTime);\n\n // Refresh timestamps on all activeHolograms in the source data's _meta\n // This allows interfaces to detect updates automatically\n if (data._meta && Array.isArray(data._meta.activeHolograms) && data._meta.activeHolograms.length > 0) {\n const result = await federation.refreshActiveHolograms(\n this.client,\n this.config.appName,\n holonId,\n lensName,\n data.id,\n data // Pass the data we already have\n );\n // Update the written data with refreshed timestamps (already done in-place by refreshActiveHolograms)\n if (result.refreshed > 0) {\n // Re-write to persist the updated activeHolograms timestamps\n await storage.write(this.client, path, result.sourceData);\n }\n }\n }\n\n return success;\n }\n\n /**\n * Resolve holograms recursively\n * @private\n * @param {*} data - Data that may contain holograms (object, array, or primitive)\n * @returns {Promise<*>} Resolved data\n */\n async _resolveHolograms(data) {\n // Handle null/undefined\n if (!data) return data;\n\n // Handle arrays - resolve each item and filter out nulls\n if (Array.isArray(data)) {\n const resolved = [];\n for (const item of data) {\n const resolvedItem = await this._resolveHolograms(item);\n // Only add non-null items to preserve array integrity\n if (resolvedItem != null) {\n resolved.push(resolvedItem);\n }\n }\n return resolved;\n }\n\n // Handle objects\n if (typeof data === 'object') {\n // Check if this is a hologram - ONLY if explicitly marked with hologram:true\n // Having a 'soul' property alone does NOT make it a hologram (soul is used for metadata/linking)\n const isHologram = data.hologram === true;\n\n if (isHologram) {\n const resolved = await federation.resolveHologram(this.client, data);\n // Recursively resolve the resolved data (in case it contains more holograms)\n return resolved ? await this._resolveHolograms(resolved) : null;\n }\n\n // Not a hologram, but might contain holograms in nested properties\n // For now, just return as-is to avoid deep traversal overhead\n // If needed, we can add deep resolution later\n return data;\n }\n\n // Primitive value\n return data;\n }\n\n async read(holonId, lensName, dataId = null, options = {}) {\n // Validate inputs\n if (!holonId || typeof holonId !== 'string') {\n throw new ValidationError('ValidationError: holonId must be a non-empty string');\n }\n if (!lensName || typeof lensName !== 'string') {\n throw new ValidationError('ValidationError: lensName must be a non-empty string');\n }\n\n const startTime = Date.now();\n this._metrics.reads++;\n\n // Build the scope for capability lookup\n const scope = { holonId, lensName };\n if (dataId) scope.dataId = dataId;\n\n // Get federated authors (partners who granted us read access)\n // Default: federated=true unless explicitly disabled\n const federated = options.federated !== false;\n let authors = [this.client.publicKey]; // Always include our own data\n\n if (federated) {\n try {\n const federatedAuthors = await registry.getFederatedAuthorsForScope(\n this.client,\n this.config.appName,\n scope,\n 'read'\n );\n // Add federated author pubKeys\n for (const { pubKey } of federatedAuthors) {\n if (!authors.includes(pubKey)) {\n authors.push(pubKey);\n }\n }\n } catch (error) {\n // Silently continue with just our own data if federation lookup fails\n console.debug('[read] Federation lookup failed, using local only:', error.message);\n }\n }\n\n // Query options including federated authors\n const queryOptions = {\n authors,\n includeAuthor: true, // Track which author each item came from\n };\n\n if (dataId) {\n const path = storage.buildPath(this.config.appName, holonId, lensName, dataId);\n const data = await storage.read(this.client, path, queryOptions);\n\n // Filter out deleted items\n if (data && data._deleted) {\n const endTime = Date.now();\n if (!this._metrics.totalReadTime) this._metrics.totalReadTime = 0;\n this._metrics.totalReadTime += (endTime - startTime);\n return null;\n }\n\n // Always resolve holograms\n const resolved = await this._resolveHolograms(data);\n\n const endTime = Date.now();\n if (!this._metrics.totalReadTime) this._metrics.totalReadTime = 0;\n this._metrics.totalReadTime += (endTime - startTime);\n return resolved;\n } else {\n const path = storage.buildPath(this.config.appName, holonId, lensName);\n const result = await storage.readAll(this.client, path, {\n ...queryOptions,\n hybrid: this.config.hybridMode\n });\n\n // Always resolve holograms in array results\n const resolved = await this._resolveHolograms(result);\n\n // Filter out deleted items\n const filtered = Array.isArray(resolved)\n ? resolved.filter(item => !item || !item._deleted)\n : (resolved && resolved._deleted ? null : resolved);\n\n const endTime = Date.now();\n if (!this._metrics.totalReadTime) this._metrics.totalReadTime = 0;\n this._metrics.totalReadTime += (endTime - startTime);\n return filtered;\n }\n }\n\n async update(holonId, lensName, dataId, updates, options = {}) {\n // Check authorization if capability token provided\n const capToken = options.capabilityToken || options.capability;\n if (capToken) {\n const authorized = await this.verifyCapability(\n capToken,\n 'write',\n { holonId, lensName }\n );\n if (!authorized) {\n throw new AuthorizationError('AuthorizationError: Invalid capability token for update operation', 'write');\n }\n }\n\n // Read raw data (without resolving) to check if it's a hologram\n const path = storage.buildPath(this.config.appName, holonId, lensName, dataId);\n const rawData = await storage.read(this.client, path);\n\n // If this is a hologram, split updates between local overrides and source\n if (rawData && rawData.hologram === true && rawData.target) {\n // Fields that are stored in the hologram itself (local overrides)\n // These are fields that exist in the hologram beyond the core hologram structure\n const hologramStructureFields = ['hologram', 'soul', 'target', 'id', '_meta'];\n const localOverrideFields = Object.keys(rawData).filter(k => !hologramStructureFields.includes(k));\n\n // Split updates: local fields stay local, everything else goes to source\n const localUpdates = {};\n const sourceUpdates = {};\n\n for (const [key, value] of Object.entries(updates)) {\n if (hologramStructureFields.includes(key)) {\n // Skip hologram structure fields entirely\n continue;\n } else if (localOverrideFields.includes(key)) {\n // This field exists in the hologram - update locally\n localUpdates[key] = value;\n } else {\n // This field doesn't exist in hologram - update source\n sourceUpdates[key] = value;\n }\n }\n\n // Update local hologram overrides\n if (Object.keys(localUpdates).length > 0) {\n await storage.update(this.client, path, localUpdates);\n }\n\n // Update source data\n if (Object.keys(sourceUpdates).length > 0) {\n const sourcePath = storage.buildPath(\n rawData.target.appname || this.config.appName,\n rawData.target.holonId,\n rawData.target.lensName,\n rawData.target.dataId\n );\n await storage.update(this.client, sourcePath, sourceUpdates);\n }\n\n return true;\n }\n\n // Regular data (not a hologram) - proceed with normal update\n // Schema validation if exists and updates data\n if (options.validate !== false && this.schemas.has(lensName)) {\n const existing = await this.read(holonId, lensName, dataId);\n const merged = { ...existing, ...updates };\n const schemaObj = this.schemas.get(lensName);\n const strict = options.strict !== undefined ? options.strict : schemaObj.strict;\n\n // If schema is a URI reference\n if (schemaObj.schema && typeof schemaObj.schema === 'object' && schemaObj.schema.$ref) {\n // URI schemas cannot be validated - skip validation in both modes\n // In a real implementation, URIs would be resolved first\n // For now, we allow updates through (no validation possible)\n } else if (schemaObj.schema && typeof schemaObj.schema === 'object') {\n schema.validate(merged, schemaObj.schema, lensName, strict);\n }\n }\n\n return storage.update(this.client, path, updates);\n }\n\n async delete(holonId, lensName, dataId, options = {}) {\n // Read existing data to check ownership and get activeHolograms\n const existing = await this.read(holonId, lensName, dataId);\n\n // If data doesn't exist, return false\n if (!existing) {\n return false;\n }\n\n // Check authorization\n const capToken = options.capabilityToken || options.capability;\n const creator = existing._creator || existing.owner;\n const currentUser = this.client.publicKey;\n\n // Authorization logic:\n // 1. If capability token provided, verify it\n // 2. Else if data has a creator/owner AND it's not the current user, deny\n // 3. Else allow (no owner or current user is owner)\n\n if (capToken) {\n const authorized = await this.verifyCapability(\n capToken,\n 'delete',\n { holonId, lensName }\n );\n if (!authorized) {\n const error = new AuthorizationError('AuthorizationError: Invalid capability token for delete operation', 'delete');\n throw error;\n }\n } else if (creator && creator !== currentUser) {\n // Data has an owner and it's not the current user - require authorization\n const error = new AuthorizationError('AuthorizationError: Delete operation requires capability token', 'delete');\n throw error;\n }\n // else: no owner or current user is owner - allow deletion\n\n // Delete all holograms that point to this data\n if (existing._meta?.activeHolograms && Array.isArray(existing._meta.activeHolograms)) {\n console.info(`🗑️ Deleting ${existing._meta.activeHolograms.length} holograms for ${holonId}/${lensName}/${dataId}`);\n for (const hologramEntry of existing._meta.activeHolograms) {\n try {\n const hologramPath = storage.buildPath(\n this.config.appName,\n hologramEntry.targetHolon,\n lensName,\n dataId\n );\n await storage.deleteData(this.client, hologramPath);\n console.info(` ✓ Deleted hologram in ${hologramEntry.targetHolon}`);\n } catch (err) {\n console.warn(` ⚠️ Failed to delete hologram in ${hologramEntry.targetHolon}:`, err.message);\n }\n }\n }\n\n const path = storage.buildPath(this.config.appName, holonId, lensName, dataId);\n return storage.deleteData(this.client, path);\n }\n\n // === Global Data Operations ===\n async writeGlobal(table, data) {\n return globalTables.writeGlobal(this.client, this.config.appName, table, data);\n }\n\n async readGlobal(table, key = null) {\n return globalTables.readGlobal(this.client, this.config.appName, table, key);\n }\n\n async updateGlobal(table, key, updates) {\n return globalTables.updateGlobal(this.client, this.config.appName, table, key, updates);\n }\n\n async deleteGlobal(table, key) {\n return globalTables.deleteGlobal(this.client, this.config.appName, table, key);\n }\n\n async getAllGlobal(table) {\n return globalTables.readGlobal(this.client, this.config.appName, table);\n }\n\n async deleteAllGlobal(table) {\n return globalTables.deleteAllGlobal(this.client, this.config.appName, table);\n }\n\n // === Holon Data Operations ===\n async getAll(holonId, lensName) {\n return this.read(holonId, lensName);\n }\n\n async deleteAll(holonId, lensName) {\n const path = storage.buildPath(this.config.appName, holonId, lensName);\n return storage.deleteAll(this.client, path);\n }\n\n // === Schema Operations ===\n async setSchema(lensName, schemaObj, strict = false) {\n let resolvedSchema = schemaObj;\n\n // If schemaObj is a string (URI), store as reference\n if (typeof schemaObj === 'string') {\n // Store as URI reference - validation will happen when used\n resolvedSchema = { $ref: schemaObj };\n }\n\n if (!resolvedSchema || (typeof resolvedSchema !== 'object' && typeof resolvedSchema !== 'boolean')) {\n throw new ValidationError('Schema must be a valid JSON Schema object or boolean');\n }\n\n // Validate that it's a valid JSON Schema (basic check) - only for actual schemas, not refs\n if (typeof resolvedSchema === 'object' && !resolvedSchema.$ref) {\n if (!resolvedSchema.type && !resolvedSchema.properties && !resolvedSchema.items && resolvedSchema !== true && resolvedSchema !== false) {\n throw new ValidationError('ValidationError: Invalid JSON Schema format - must have type, properties, or items');\n }\n }\n\n this.schemas.set(lensName, { schema: resolvedSchema, strict });\n }\n\n async getSchema(lensName) {\n const schemaObj = this.schemas.get(lensName);\n return schemaObj ? schemaObj.schema : null;\n }\n\n async clearSchema(lensName) {\n this.schemas.delete(lensName);\n schema.clearSchemaCache(lensName);\n }\n\n // === Federation Operations ===\n async federate(sourceHolon, targetHolon, lensName, options = {}) {\n // Validate self-federation\n if (sourceHolon === targetHolon) {\n throw new Error('Cannot federate a holon with itself');\n }\n\n // Validate direction (if provided)\n if (options.direction && !['inbound', 'outbound', 'bidirectional'].includes(options.direction)) {\n throw new Error('Invalid federation direction - must be inbound, outbound, or bidirectional');\n }\n\n // Handle bidirectional as both inbound and outbound\n if (options.direction === 'bidirectional') {\n const { direction, ...restOptions } = options;\n const outboundResult = await this.federate(sourceHolon, targetHolon, lensName, { ...restOptions, direction: 'outbound' });\n const inboundResult = await this.federate(sourceHolon, targetHolon, lensName, { ...restOptions, direction: 'inbound' });\n return outboundResult && inboundResult;\n }\n\n const result = await federation.setupFederation(\n this.client,\n this.config.appName,\n sourceHolon,\n targetHolon,\n lensName,\n options\n );\n\n if (result) {\n if (!this._metrics.federations) this._metrics.federations = 0;\n this._metrics.federations++;\n\n // By default, propagate existing data when federation is set up\n // Set propagateExisting: false to only federate future writes\n const propagateExisting = options.propagateExisting !== false;\n\n if (!propagateExisting) {\n return result;\n }\n\n // Propagate existing data based on direction\n // Default to 'outbound' (source -> target) if no direction specified\n const direction = options.direction || 'outbound';\n const mode = options.mode || 'reference';\n const filter = options.filter;\n\n if (direction === 'outbound') {\n // Source -> Target: propagate data from source to target\n // Check if receiver accepts this lens in their inbound\n const targetFederation = await this.getFederation(targetHolon);\n const receiverLensConfig = targetFederation?.lensConfig?.[sourceHolon];\n if (receiverLensConfig && receiverLensConfig.inbound && !receiverLensConfig.inbound.includes(lensName)) {\n console.log(`Skipping outbound propagation - ${targetHolon} doesn't accept lens '${lensName}' in inbound from ${sourceHolon}`);\n } else {\n // Read raw data to avoid resolving holograms\n const path = storage.buildPath(this.config.appName, sourceHolon, lensName);\n const sourceData = await storage.readAll(this.client, path);\n const sourceArray = Array.isArray(sourceData) ? sourceData : (sourceData ? [sourceData] : []);\n\n for (const item of sourceArray) {\n if (item.id === '_federation') continue; // Skip federation config\n // Skip items that are already holograms or from another source\n if (item.hologram === true) continue;\n if (item._meta && item._meta.source && item._meta.source !== sourceHolon) continue;\n if (filter && !filter(item)) continue; // Apply filter if provided\n\n await federation.propagateData(\n this.client,\n this.config.appName,\n item,\n sourceHolon,\n targetHolon,\n lensName,\n mode\n );\n }\n }\n }\n\n if (direction === 'inbound') {\n // Target -> Source: propagate data from target to source\n // Check if receiver (source) accepts this lens in their inbound\n const sourceFederation = await this.getFederation(sourceHolon);\n const receiverLensConfig = sourceFederation?.lensConfig?.[targetHolon];\n if (receiverLensConfig && receiverLensConfig.inbound && !receiverLensConfig.inbound.includes(lensName)) {\n console.log(`Skipping inbound propagation - ${sourceHolon} doesn't accept lens '${lensName}' in inbound from ${targetHolon}`);\n } else {\n // Read raw data to avoid resolving holograms\n const path = storage.buildPath(this.config.appName, targetHolon, lensName);\n const targetData = await storage.readAll(this.client, path);\n const targetArray = Array.isArray(targetData) ? targetData : (targetData ? [targetData] : []);\n\n for (const item of targetArray) {\n if (item.id === '_federation') continue; // Skip federation config\n // Skip items that are already holograms or from another source\n if (item.hologram === true) continue;\n if (item._meta && item._meta.source && item._meta.source !== targetHolon) continue;\n if (filter && !filter(item)) continue; // Apply filter if provided\n\n await federation.propagateData(\n this.client,\n this.config.appName,\n item,\n targetHolon,\n sourceHolon,\n lensName,\n mode\n );\n }\n }\n }\n }\n\n return result;\n }\n\n async getFederatedData(holonId, lensName, options = {}) {\n const { resolveHolograms = true } = options;\n\n // For getFederatedData, we just return the local data\n // The federation setup already propagates data (as holograms or copies)\n // So all federated data should already be accessible locally\n\n if (resolveHolograms) {\n // Use normal read which auto-resolves holograms\n const localData = await this.read(holonId, lensName);\n const localArray = Array.isArray(localData) ? localData : (localData ? [localData] : []);\n\n // Filter out federation config and nulls\n return localArray.filter(item => item != null && item.id !== '_federation');\n } else {\n // Read without resolving holograms - need to read raw data\n const path = storage.buildPath(this.config.appName, holonId, lensName);\n const rawData = await storage.readAll(this.client, path);\n const rawArray = Array.isArray(rawData) ? rawData : (rawData ? [rawData] : []);\n\n // Filter out federation config\n return rawArray.filter(item => item != null && item.id !== '_federation');\n }\n }\n\n async unfederate(sourceHolon, targetHolon, lensName) {\n // Delete federation config (idempotent - always returns true)\n const path = storage.buildPath(this.config.appName, sourceHolon, lensName, '_federation');\n await storage.deleteData(this.client, path);\n return true;\n }\n\n /**\n * Update local overrides on a hologram (e.g., position, pinned status)\n * @param {string} holonId - Holon where the hologram lives\n * @param {string} lensName - Lens name (e.g., 'quests')\n * @param {string} dataId - Data ID of the hologram\n * @param {Object} overrides - Local fields to update (e.g., { x: 100, y: 200 })\n * @returns {Promise<boolean>} Success indicator\n */\n async updateHologramOverrides(holonId, lensName, dataId, overrides) {\n return federation.updateHologramOverrides(\n this.client,\n this.config.appName,\n holonId,\n lensName,\n dataId,\n overrides\n );\n }\n\n /**\n * Create a hologram (lightweight reference) for federation\n * @param {string} sourceHolon - Source holon ID where the original data lives\n * @param {string} lensName - Lens name (e.g., 'quests')\n * @param {Object} data - Data object (must have an 'id' property)\n * @param {string} [targetHolon] - Optional target holon ID (defaults to sourceHolon)\n * @returns {Object} Hologram object ready to be written to a holon\n */\n createHologram(sourceHolon, lensName, data, targetHolon = null) {\n if (!data || !data.id) {\n throw new Error('createHologram: data must have an id property');\n }\n return federation.createHologram(\n sourceHolon,\n targetHolon || sourceHolon,\n lensName,\n data.id,\n this.config.appName\n );\n }\n\n /**\n * Get active holograms for a specific data item\n * Returns the activeHolograms array from the source data's _meta\n * @param {string} holonId - Source holon ID\n * @param {string} lensName - Lens name (e.g., 'quests')\n * @param {string} dataId - Data ID to get holograms for\n * @returns {Promise<Object[]>} Array of hologram info objects with timestamps\n */\n async getActiveHolograms(holonId, lensName, dataId) {\n const data = await this.read(holonId, lensName, dataId);\n if (!data || !data._meta || !Array.isArray(data._meta.activeHolograms)) {\n return [];\n }\n return data._meta.activeHolograms;\n }\n\n /**\n * Remove a hologram reference from source data's _meta.activeHolograms\n * Call this when a hologram is deleted\n * @param {string} sourceHolon - Source holon ID\n * @param {string} lensName - Lens name\n * @param {string} dataId - Data ID\n * @param {string} targetHolon - Target holon where hologram lives\n * @returns {Promise<boolean>} Success indicator\n */\n async removeActiveHologram(sourceHolon, lensName, dataId, targetHolon) {\n return federation.removeActiveHologram(\n this.client,\n this.config.appName,\n sourceHolon,\n lensName,\n dataId,\n targetHolon\n );\n }\n\n /**\n * Delete a hologram and clean up activeHolograms on the original source\n * @param {string} holonId - Holon where the hologram lives\n * @param {string} lensName - Lens name\n * @param {string} dataId - Data ID of the hologram\n * @param {Object} options - Optional settings\n * @returns {Promise<Object>} Result with deletion info\n */\n async deleteHologram(holonId, lensName, dataId, options = {}) {\n return federation.deleteHologram(\n this.client,\n this.config.appName,\n holonId,\n lensName,\n dataId,\n options\n );\n }\n\n /**\n * Propagate data to a specific target holon (creates hologram or copy)\n * Use this for direct propagation; use propagate() for federation-based propagation\n * @param {Object} data - Data to propagate\n * @param {string} sourceHolon - Source holon ID\n * @param {string} targetHolon - Target holon ID\n * @param {string} lensName - Lens name\n * @param {Object} options - Options\n * @param {string} options.mode - 'reference' (creates hologram) or 'copy' (copies data)\n * @returns {Promise<boolean>} Success indicator\n */\n async propagateData(data, sourceHolon, targetHolon, lensName, options = {}) {\n const { mode = 'reference' } = options;\n return federation.propagateData(\n this.client,\n this.config.appName,\n data,\n sourceHolon,\n targetHolon,\n lensName,\n mode\n );\n }\n\n /**\n * Resolve a hologram to its actual data, merging local overrides\n * @param {Object} hologram - Hologram object to resolve\n * @returns {Promise<Object|null>} Resolved data or null\n */\n async resolveHologram(hologram) {\n return federation.resolveHologram(this.client, hologram);\n }\n\n /**\n * Check if data is a hologram (unresolved reference)\n * @param {Object} data - Data to check\n * @returns {boolean} True if data is a hologram\n */\n isHologram(data) {\n return federation.isHologram(data);\n }\n\n /**\n * Check if data was resolved from a hologram\n * @param {Object} data - Data to check\n * @returns {boolean} True if data was resolved from a hologram\n */\n isResolvedHologram(data) {\n return federation.isResolvedHologram(data);\n }\n\n /**\n * Get hologram source information from resolved data\n * @param {Object} data - Resolved data\n * @returns {Object|null} Source info { soul, sourceHolon, localOverrides } or null\n */\n getHologramSource(data) {\n return federation.getHologramSource(data);\n }\n\n /**\n * Cleanup circular holograms in a holon's lens\n * Detects and removes holograms that create circular references (A→B→A)\n * @param {string} holonId - Holon to clean up\n * @param {string} lensName - Lens name to check\n * @param {Object} options - Optional settings\n * @param {boolean} options.dryRun - If true, only report what would be deleted\n * @returns {Promise<Object>} Result with cleanup info\n */\n async cleanupCircularHolograms(holonId, lensName, options = {}) {\n return federation.cleanupCircularHolograms(\n this.client,\n this.config.appName,\n holonId,\n lensName,\n options\n );\n }\n\n /**\n * Cleanup circular holograms for a specific list of IDs\n * Use this when you don't have an index but know which IDs to check\n * @param {string} holonId - Holon to clean up\n * @param {string} lensName - Lens name\n * @param {string[]} dataIds - Array of data IDs to check\n * @param {Object} options - Optional settings\n * @param {boolean} options.dryRun - If true, only report what would be deleted\n * @returns {Promise<Object>} Result with cleanup info\n */\n async cleanupCircularHologramsByIds(holonId, lensName, dataIds, options = {}) {\n return federation.cleanupCircularHologramsByIds(\n this.client,\n this.config.appName,\n holonId,\n lensName,\n dataIds,\n options\n );\n }\n\n /**\n * Propagate data to federated holons and optionally to parent holons\n * @param {string} holonId - Source holon ID\n * @param {string} lensName - Lens name (e.g., 'quests')\n * @param {Object} data - Data or hologram to propagate\n * @param {Object} options - Propagation options\n * @param {boolean} options.useHolograms - Use holograms instead of copies (default: true)\n * @param {boolean} options.propagateToParents - Propagate to parent holons for H3 holons (default: false)\n * @param {number} options.maxParentLevels - Maximum parent levels to propagate (default: 3)\n * @returns {Promise<Object>} Result with success/failure counts\n */\n async propagate(holonId, lensName, data, options = {}) {\n const {\n useHolograms = true,\n propagateToParents = false,\n maxParentLevels = 3\n } = options;\n\n const result = {\n success: 0,\n failed: 0,\n targets: [],\n parentPropagation: null\n };\n\n // Get federation config for this holon\n const federationData = await this.getFederation(holonId);\n\n // Propagate to federated holons (outbound)\n if (federationData && federationData.outbound) {\n for (const targetHolon of federationData.outbound) {\n // Check if sender has this lens configured for outbound to this target\n const senderLensConfig = federationData.lensConfig?.[targetHolon];\n if (senderLensConfig && senderLensConfig.outbound && !senderLensConfig.outbound.includes(lensName)) {\n continue; // Skip - sender hasn't configured this lens for outbound to this target\n }\n\n // Check if receiver accepts this lens in their inbound from sender\n try {\n const targetFederation = await this.getFederation(targetHolon);\n const receiverLensConfig = targetFederation?.lensConfig?.[holonId];\n if (receiverLensConfig && receiverLensConfig.inbound && !receiverLensConfig.inbound.includes(lensName)) {\n console.log(`Skipping propagation to ${targetHolon} - lens '${lensName}' not in their inbound config for ${holonId}`);\n continue; // Skip - receiver doesn't accept this lens from sender\n }\n } catch (error) {\n console.warn(`Could not verify receiver's inbound config for ${targetHolon}, proceeding anyway:`, error);\n }\n\n try {\n const mode = useHolograms ? 'reference' : 'copy';\n await federation.propagateData(\n this.client,\n this.config.appName,\n data,\n holonId,\n targetHolon,\n lensName,\n mode\n );\n result.success++;\n result.targets.push(targetHolon);\n } catch (error) {\n console.error(`Failed to propagate to ${targetHolon}:`, error);\n result.failed++;\n }\n }\n }\n\n // Propagate to parent holons (for H3/geographic holons)\n if (propagateToParents && spatial.isValidH3(holonId)) {\n const parents = spatial.getParents(holonId);\n const targetParents = parents.slice(0, maxParentLevels);\n\n result.parentPropagation = {\n success: 0,\n failed: 0,\n targets: []\n };\n\n for (const parentHolon of targetParents) {\n try {\n const mode = useHolograms ? 'reference' : 'copy';\n await federation.propagateData(\n this.client,\n this.config.appName,\n data,\n holonId,\n parentHolon,\n lensName,\n mode\n );\n result.parentPropagation.success++;\n result.parentPropagation.targets.push(parentHolon);\n } catch (error) {\n console.error(`Failed to propagate to parent ${parentHolon}:`, error);\n result.parentPropagation.failed++;\n }\n }\n }\n\n return result;\n }\n\n async getFederation(holonId) {\n if (!holonId) {\n throw new Error('getFederation: Missing holon ID');\n }\n const data = await this.getGlobal('federation', holonId);\n if (!data) return null;\n\n // Ensure arrays exist (in case data from storage is malformed)\n if (!Array.isArray(data.inbound)) {\n data.inbound = [];\n }\n if (!Array.isArray(data.outbound)) {\n data.outbound = [];\n }\n if (!data.lensConfig || typeof data.lensConfig !== 'object') {\n data.lensConfig = {};\n }\n\n // Backwards compatibility: populate federated from inbound/outbound if it doesn't exist\n if (!Array.isArray(data.federated)) {\n // Combine inbound and outbound into a unique set\n const allFederated = new Set([...data.inbound, ...data.outbound]);\n data.federated = Array.from(allFederated);\n }\n\n return data;\n }\n\n /**\n * Federate two holons at the holon level (manages multiple lenses)\n * This is a higher-level method that manages federation metadata and lens-specific federations\n * @param {string} sourceHolon - Source holon ID\n * @param {string} targetHolon - Target holon ID\n * @param {Object} options - Federation options\n * @param {Object} options.lensConfig - Lens configuration {inbound: [], outbound: []}\n * @returns {Promise<boolean>} Success indicator\n */\n async federateHolon(sourceHolon, targetHolon, options = {}) {\n const { lensConfig = { inbound: [], outbound: [] } } = options;\n\n // Validate self-federation\n if (sourceHolon === targetHolon) {\n throw new Error('Cannot federate a holon with itself');\n }\n\n // Get or create federation record for source holon\n let federationData = await this.getGlobal('federation', sourceHolon) || {\n id: sourceHolon,\n name: sourceHolon,\n federated: [],\n inbound: [],\n outbound: [],\n lensConfig: {},\n timestamp: Date.now()\n };\n\n // Ensure arrays exist (in case data from storage is malformed)\n if (!Array.isArray(federationData.federated)) {\n federationData.federated = [];\n }\n if (!Array.isArray(federationData.inbound)) {\n federationData.inbound = [];\n }\n if (!Array.isArray(federationData.outbound)) {\n federationData.outbound = [];\n }\n if (!federationData.lensConfig || typeof federationData.lensConfig !== 'object') {\n federationData.lensConfig = {};\n }\n\n // Always add target to federated list (tracks all federation links)\n if (!federationData.federated.includes(targetHolon)) {\n federationData.federated.push(targetHolon);\n }\n\n // Add target to inbound/outbound lists based on lensConfig\n // If there are outbound lenses, add to outbound list\n if (lensConfig.outbound && lensConfig.outbound.length > 0) {\n if (!federationData.outbound.includes(targetHolon)) {\n federationData.outbound.push(targetHolon);\n }\n } else {\n // Remove from outbound if no outbound lenses\n federationData.outbound = federationData.outbound.filter(id => id !== targetHolon);\n }\n\n // If there are inbound lenses, add to inbound list\n if (lensConfig.inbound && lensConfig.inbound.length > 0) {\n if (!federationData.inbound.includes(targetHolon)) {\n federationData.inbound.push(targetHolon);\n }\n } else {\n // Remove from inbound if no inbound lenses\n federationData.inbound = federationData.inbound.filter(id => id !== targetHolon);\n }\n\n // Store lens configuration for this target holon\n federationData.lensConfig[targetHolon] = {\n inbound: lensConfig.inbound || [],\n outbound: lensConfig.outbound || [],\n timestamp: Date.now()\n };\n\n // Save federation metadata\n const success = await this.writeGlobal('federation', federationData);\n\n // Clear cache so getFederation returns fresh data immediately\n this.clearCache('federation');\n\n // Setup lens-specific federations\n if (success) {\n // Federate each lens specified in inbound array (receive from target)\n for (const lens of (lensConfig.inbound || [])) {\n await this.federate(targetHolon, sourceHolon, lens, { direction: 'outbound', mode: 'reference' });\n }\n\n // Federate each lens specified in outbound array (send to target)\n for (const lens of (lensConfig.outbound || [])) {\n await this.federate(sourceHolon, targetHolon, lens, { direction: 'outbound', mode: 'reference' });\n }\n }\n\n return success;\n }\n\n /**\n * Unfederate two holons at the holon level\n * @param {string} sourceHolon - Source holon ID\n * @param {string} targetHolon - Target holon ID\n * @returns {Promise<boolean>} Success indicator\n */\n async unfederateHolon(sourceHolon, targetHolon) {\n // Get federation record\n const federationData = await this.getGlobal('federation', sourceHolon);\n if (!federationData) {\n return false;\n }\n\n // Get lens config for this target before removing\n const lensConfig = federationData.lensConfig?.[targetHolon];\n\n // Remove target from federation lists\n federationData.federated = (federationData.federated || []).filter(id => id !== targetHolon);\n federationData.inbound = (federationData.inbound || []).filter(id => id !== targetHolon);\n federationData.outbound = (federationData.outbound || []).filter(id => id !== targetHolon);\n\n // Remove lens config for this target\n if (federationData.lensConfig) {\n delete federationData.lensConfig[targetHolon];\n }\n\n // Update federation metadata\n const success = await this.writeGlobal('federation', federationData);\n\n // Clear cache so getFederation returns fresh data immediately\n this.clearCache('federation');\n\n // Unfederate lens-specific federations\n if (success && lensConfig) {\n // Unfederate each lens that was in inbound array\n for (const lens of (lensConfig.inbound || [])) {\n await this.unfederate(targetHolon, sourceHolon, lens);\n }\n\n // Unfederate each lens that was in outbound array\n for (const lens of (lensConfig.outbound || [])) {\n await this.unfederate(sourceHolon, targetHolon, lens);\n }\n }\n\n return success;\n }\n\n /**\n * Get the lens configuration for a specific federated holon\n * @param {string} sourceHolon - Source holon ID\n * @param {string} targetHolon - Target holon ID\n * @returns {Promise<Object|null>} Lens config {inbound: [], outbound: []} or null\n */\n async getFederatedConfig(sourceHolon, targetHolon) {\n const federationData = await this.getGlobal('federation', sourceHolon);\n if (!federationData || !federationData.lensConfig) {\n return null;\n }\n return federationData.lensConfig[targetHolon] || null;\n }\n\n // === Hierarchical Operations ===\n async upcast(holonId, lensName, dataId, options = {}) {\n return hierarchical.upcast(this.client, this.config.appName, holonId, lensName, dataId, options);\n }\n\n // === Subscription Operations ===\n subscribe(holonId, lensName, callback, options = {}) {\n if (typeof callback !== 'function') {\n throw new TypeError('callback must be a function');\n }\n\n const path = storage.buildPath(this.config.appName, holonId, lensName);\n\n // Default to real-time only mode (only receive new events, not historical)\n const subscriptionOptions = {\n realtimeOnly: true, // Only get events from subscription time forward\n ...options\n };\n\n const subscriptionId = `${holonId}-${lensName}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n let innerSubscription = null;\n let unsubscribeCalled = false;\n\n // Start async subscription setup in background\n subscriptions.createSubscription(this.client, path, callback, subscriptionOptions)\n .then(subscription => {\n innerSubscription = subscription;\n // If unsubscribe was called before setup completed, clean up immediately\n if (unsubscribeCalled) {\n subscription.unsubscribe();\n } else {\n this.subscriptionRegistry.register(subscriptionId, subscription);\n }\n })\n .catch(err => {\n this._log('ERROR', 'Subscription setup failed', { path, error: err.message });\n });\n\n this._metrics.subscriptions++;\n\n // Return synchronous subscription object\n return {\n unsubscribe: () => {\n unsubscribeCalled = true;\n if (innerSubscription) {\n this.subscriptionRegistry.unregister(subscriptionId);\n }\n },\n };\n }\n\n /**\n * Subscribe to global table changes\n * @param {string} table - The global table name (e.g., 'federation')\n * @param {string} key - The specific key within the table (e.g., holonId)\n * @param {Function} callback - Callback function called on data changes\n * @param {Object} options - Subscription options\n * @returns {Object} Subscription object with unsubscribe method\n */\n async subscribeGlobal(table, key, callback, options = {}) {\n if (typeof callback !== 'function') {\n throw new TypeError('callback must be a function');\n }\n\n // Build global table path: appname/table/key\n const path = `${this.config.appName}/${table}/${key}`;\n\n // Default to real-time only mode\n const subscriptionOptions = {\n realtimeOnly: true,\n ...options\n };\n\n const subscription = await subscriptions.createSubscription(this.client, path, callback, subscriptionOptions);\n\n const subscriptionId = `global-${table}-${key}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n this.subscriptionRegistry.register(subscriptionId, subscription);\n this._metrics.subscriptions++;\n\n return {\n unsubscribe: () => {\n this.subscriptionRegistry.unregister(subscriptionId);\n },\n };\n }\n\n // === Crypto Operations ===\n async getPublicKey(privateKey) {\n return crypto.getPublicKey(privateKey);\n }\n\n async sign(content, privateKey) {\n return crypto.sign(content, privateKey);\n }\n\n async verify(content, signature, publicKey) {\n return crypto.verify(content, signature, publicKey);\n }\n\n async issueCapability(permissions, scope, recipient, options) {\n return crypto.issueCapability(permissions, scope, recipient, options);\n }\n\n async verifyCapability(token, requiredPermission, scope) {\n return crypto.verifyCapability(token, requiredPermission, scope);\n }\n\n // === Social Protocol Operations ===\n async publishNostr(event, holonId, lensName = 'social') {\n // Validate with throwing error (partial=true allows missing id/pubkey/sig)\n social.validateNostrEvent(event, true, true);\n\n // Sign the event if not already signed\n if (!event.id || !event.pubkey || !event.sig) {\n // Use nostr-tools to properly sign the event\n const { finalizeEvent } = await import('nostr-tools');\n const signedEvent = finalizeEvent(event, this.client.privateKey);\n\n // Update event with signature fields\n event.id = signedEvent.id;\n event.pubkey = signedEvent.pubkey;\n event.sig = signedEvent.sig;\n }\n\n const transformed = social.transformNostrEvent(event);\n return this.write(holonId, lensName, transformed);\n }\n\n async publishActivityPub(object, holonId, lensName = 'social') {\n // Validate with throwing error\n social.validateActivityPubObject(object, true);\n\n const transformed = social.transformActivityPubObject(object);\n return this.write(holonId, lensName, transformed);\n }\n\n async querySocial(holonId, options = {}) {\n const { protocol, accessLevel } = options;\n let data = await this.read(holonId, 'social');\n\n if (protocol) {\n data = social.filterByProtocol(data, protocol);\n }\n\n if (accessLevel) {\n data = social.filterByAccessLevel(data, accessLevel);\n }\n\n // Parse tags back to array for Nostr events (stored as JSON string)\n if (Array.isArray(data)) {\n data = data.map(item => {\n if (item.protocol === 'nostr' && typeof item.tags === 'string') {\n return { ...item, tags: JSON.parse(item.tags) };\n }\n return item;\n });\n }\n\n return data;\n }\n\n async verifyNostrEvent(event) {\n // Verify a Nostr event signature\n const { verifyEvent } = await import('nostr-tools');\n\n // Parse tags if they're stored as a string\n const eventToVerify = {\n ...event,\n tags: typeof event.tags === 'string' ? JSON.parse(event.tags) : event.tags\n };\n\n return verifyEvent(eventToVerify);\n }\n\n // === Metrics ===\n metrics() {\n const baseMetrics = super.metrics();\n return {\n ...baseMetrics,\n federations: this._metrics.federations || 0,\n avgWriteTime: this._metrics.writes > 0\n ? (this._metrics.totalWriteTime || 0) / this._metrics.writes\n : 0,\n avgReadTime: this._metrics.reads > 0\n ? (this._metrics.totalReadTime || 0) / this._metrics.reads\n : 0,\n };\n }\n\n // === Functional Aliases ===\n // Common CRUD-style aliases for data operations\n\n /**\n * Alias for write() - stores data in a holon/lens\n * @alias write\n */\n async put(holonId, lensName, data, options = {}) {\n return this.write(holonId, lensName, data, options);\n }\n\n /**\n * Alias for read() - retrieves data from a holon/lens\n * @alias read\n */\n async get(holonId, lensName, dataId = null, options = {}) {\n return this.read(holonId, lensName, dataId, options);\n }\n\n /**\n * Alias for delete() - removes data from a holon/lens\n * @alias delete\n */\n async remove(holonId, lensName, dataId, options = {}) {\n return this.delete(holonId, lensName, dataId, options);\n }\n\n /**\n * Alias for writeGlobal() - stores data in global table\n * @alias writeGlobal\n */\n async putGlobal(table, data) {\n return this.writeGlobal(table, data);\n }\n\n /**\n * Alias for readGlobal() - retrieves data from global table\n * @alias readGlobal\n */\n async getGlobal(table, key = null) {\n return this.readGlobal(table, key);\n }\n\n /**\n * Alias for deleteGlobal() - removes data from global table\n * @alias deleteGlobal\n */\n async removeGlobal(table, key) {\n return this.deleteGlobal(table, key);\n }\n\n /**\n * Alias for setSchema() - defines a schema for a lens\n * @alias setSchema\n */\n async defineSchema(lensName, schemaObj, strict = false) {\n return this.setSchema(lensName, schemaObj, strict);\n }\n\n /**\n * Alias for getSchema() - retrieves schema for a lens\n * @alias getSchema\n */\n async fetchSchema(lensName) {\n return this.getSchema(lensName);\n }\n\n /**\n * Alias for clearSchema() - removes schema for a lens\n * @alias clearSchema\n */\n async removeSchema(lensName) {\n return this.clearSchema(lensName);\n }\n\n /**\n * Store data - more semantic alias for write\n * @alias write\n */\n async store(holonId, lensName, data, options = {}) {\n return this.write(holonId, lensName, data, options);\n }\n\n /**\n * Fetch data - more semantic alias for read\n * @alias read\n */\n async fetch(holonId, lensName, dataId = null, options = {}) {\n return this.read(holonId, lensName, dataId, options);\n }\n\n /**\n * Save data - alternative alias for write\n * @alias write\n */\n async save(holonId, lensName, data, options = {}) {\n return this.write(holonId, lensName, data, options);\n }\n\n /**\n * Load data - alternative alias for read\n * @alias read\n */\n async load(holonId, lensName, dataId = null, options = {}) {\n return this.read(holonId, lensName, dataId, options);\n }\n\n /**\n * Clear the internal cache (or specific entries matching a pattern)\n * Useful after write operations when you need to immediately read fresh data\n * @param {string} [pattern] - Optional pattern to match cache keys (clears all if not provided)\n */\n clearCache(pattern = null) {\n if (this.client && this.client.clearCache) {\n this.client.clearCache(pattern);\n }\n }\n\n // === AI Operations ===\n\n /**\n * Check if AI is available and throw if not\n * @private\n */\n _requireAI() {\n if (!this._ai) {\n throw new Error('AI services not initialized. Provide openaiKey in config.');\n }\n }\n\n // --- Core LLM Methods ---\n\n /**\n * Summarize text using AI\n * @param {string} text - Text to summarize\n * @param {Object} options - Options for summarization\n * @returns {Promise<string>} Summary\n */\n async summarize(text, options = {}) {\n this._requireAI();\n return this._ai.llm.summarize(text, options);\n }\n\n /**\n * Analyze text from a specific perspective\n * @param {string} text - Text to analyze\n * @param {string} aspect - Perspective to analyze from\n * @param {Object} options - Options\n * @returns {Promise<string>} Analysis\n */\n async analyze(text, aspect, options = {}) {\n this._requireAI();\n return this._ai.llm.analyze(text, aspect, options);\n }\n\n /**\n * Extract keywords from text\n * @param {string} text - Text to extract keywords from\n * @param {Object} options - Options\n * @returns {Promise<string[]>} Keywords\n */\n async extractKeywords(text, options = {}) {\n this._requireAI();\n return this._ai.llm.extractKeywords(text, options);\n }\n\n /**\n * Categorize text into one of the provided categories\n * @param {string} text - Text to categorize\n * @param {string[]} categories - Available categories\n * @param {Object} options - Options\n * @returns {Promise<string>} Selected category\n */\n async categorize(text, categories, options = {}) {\n this._requireAI();\n return this._ai.llm.categorize(text, categories, options);\n }\n\n /**\n * Translate text to a target language\n * @param {string} text - Text to translate\n * @param {string} targetLanguage - Target language\n * @param {Object} options - Options\n * @returns {Promise<string>} Translated text\n */\n async translate(text, targetLanguage, options = {}) {\n this._requireAI();\n return this._ai.llm.translate(text, targetLanguage, options);\n }\n\n /**\n * Generate questions based on text\n * @param {string} text - Text to generate questions from\n * @param {Object} options - Options\n * @returns {Promise<string[]>} Generated questions\n */\n async generateQuestions(text, options = {}) {\n this._requireAI();\n return this._ai.llm.generateQuestions(text, options);\n }\n\n // --- Schema Extraction ---\n\n /**\n * Extract structured data from text based on a lens schema\n * @param {string} text - Natural language text\n * @param {string} lensName - Name of the lens to get schema from\n * @param {Object} options - Options\n * @returns {Promise<Object>} Extracted structured data\n */\n async extractToSchema(text, lensName, options = {}) {\n this._requireAI();\n const schemaObj = await this.getSchema(lensName);\n if (!schemaObj) {\n throw new Error(`No schema found for lens: ${lensName}`);\n }\n return this._ai.schemaExtractor.extractToSchema(text, schemaObj, options);\n }\n\n // --- Fuzzy JSON Operations ---\n\n /**\n * Semantically merge two JSON objects\n * @param {Object} obj1 - First object\n * @param {Object} obj2 - Second object\n * @param {Object} options - Options\n * @returns {Promise<Object>} Merged object\n */\n async jsonAdd(obj1, obj2, options = {}) {\n this._requireAI();\n return this._ai.jsonOps.add(obj1, obj2, options);\n }\n\n /**\n * Remove concepts from obj1 based on obj2\n * @param {Object} obj1 - Base object\n * @param {Object} obj2 - Object with concepts to remove\n * @param {Object} options - Options\n * @returns {Promise<Object>} Result\n */\n async jsonSubtract(obj1, obj2, options = {}) {\n this._requireAI();\n return this._ai.jsonOps.subtract(obj1, obj2, options);\n }\n\n /**\n * Union two objects with intelligent deduplication\n * @param {Object} obj1 - First object\n * @param {Object} obj2 - Second object\n * @param {Object} options - Options\n * @returns {Promise<Object>} United object\n */\n async jsonUnion(obj1, obj2, options = {}) {\n this._requireAI();\n return this._ai.jsonOps.union(obj1, obj2, options);\n }\n\n /**\n * Find semantic differences between two objects\n * @param {Object} obj1 - First object\n * @param {Object} obj2 - Second object\n * @param {Object} options - Options\n * @returns {Promise<Object>} Differences\n */\n async jsonDifference(obj1, obj2, options = {}) {\n this._requireAI();\n return this._ai.jsonOps.difference(obj1, obj2, options);\n }\n\n /**\n * Semantically concatenate objects/arrays\n * @param {Object} obj1 - First object\n * @param {Object} obj2 - Second object\n * @param {Object} options - Options\n * @returns {Promise<Object>} Concatenated result\n */\n async jsonConcatenate(obj1, obj2, options = {}) {\n this._requireAI();\n return this._ai.jsonOps.concatenate(obj1, obj2, options);\n }\n\n // --- Embeddings & Semantic Search ---\n\n /**\n * Generate embedding vector for text\n * @param {string} text - Text to embed\n * @returns {Promise<number[]>} Embedding vector\n */\n async embed(text) {\n this._requireAI();\n return this._ai.embeddings.embed(text);\n }\n\n /**\n * Perform semantic search in a holon/lens\n * @param {string} query - Search query\n * @param {string} holonId - Holon to search in\n * @param {string} lensName - Lens to search in\n * @param {Object} options - Search options\n * @returns {Promise<Array>} Search results\n */\n async semanticSearch(query, holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.embeddings.semanticSearch(query, holonId, lensName, options);\n }\n\n /**\n * Store data with embedding for later semantic search\n * @param {string} holonId - Holon ID\n * @param {string} lensName - Lens name\n * @param {Object} data - Data to store\n * @param {string} textField - Field to generate embedding from\n * @returns {Promise<boolean>} Success\n */\n async storeWithEmbedding(holonId, lensName, data, textField = 'description') {\n this._requireAI();\n return this._ai.embeddings.storeWithEmbedding(holonId, lensName, data, textField);\n }\n\n // --- Multi-Perspective Council ---\n\n /**\n * Ask the council of perspectives for wisdom\n * @param {string} question - Question to ask\n * @param {Object} options - Options\n * @returns {Promise<Object>} Council responses\n */\n async askCouncil(question, options = {}) {\n this._requireAI();\n return this._ai.council.ask(question, options);\n }\n\n /**\n * Ask council with custom perspectives\n * @param {string} question - Question to ask\n * @param {string[]} perspectives - Custom perspectives\n * @param {Object} options - Options\n * @returns {Promise<Object>} Council responses\n */\n async askCouncilCustom(question, perspectives, options = {}) {\n this._requireAI();\n return this._ai.council.askCustom(question, perspectives, options);\n }\n\n // --- Text-to-Speech ---\n\n /**\n * Convert text to speech\n * @param {string} text - Text to speak\n * @param {string} voice - Voice to use\n * @param {Object} options - TTS options\n * @returns {Promise<Buffer>} Audio buffer\n */\n async textToSpeech(text, voice = 'nova', options = {}) {\n this._requireAI();\n return this._ai.tts.speak(text, voice, options);\n }\n\n /**\n * Convert text to speech as base64\n * @param {string} text - Text to speak\n * @param {string} voice - Voice to use\n * @param {Object} options - TTS options\n * @returns {Promise<string>} Base64 audio\n */\n async textToSpeechBase64(text, voice = 'nova', options = {}) {\n this._requireAI();\n return this._ai.tts.speakBase64(text, voice, options);\n }\n\n // --- Natural Language Queries ---\n\n /**\n * Query data using natural language\n * @param {string} query - Natural language query\n * @param {string} holonId - Holon to query (optional)\n * @param {string} lensName - Lens to query (optional)\n * @param {Object} options - Options\n * @returns {Promise<Array>} Query results\n */\n async nlQuery(query, holonId = null, lensName = null, options = {}) {\n this._requireAI();\n return this._ai.nlQuery.execute(query, holonId, lensName, options);\n }\n\n /**\n * Parse natural language query to structured query\n * @param {string} query - Natural language query\n * @returns {Promise<Object>} Parsed query structure\n */\n async parseNLQuery(query) {\n this._requireAI();\n return this._ai.nlQuery.parse(query);\n }\n\n // --- Auto-Classification ---\n\n /**\n * Classify content to suggest the best lens\n * @param {Object} content - Content to classify\n * @param {Object} options - Options\n * @returns {Promise<Object>} Classification result\n */\n async classifyToLens(content, options = {}) {\n this._requireAI();\n return this._ai.classifier.classifyToLens(content, options);\n }\n\n /**\n * Automatically store content in the best lens\n * @param {string} holonId - Holon ID\n * @param {Object} content - Content to store\n * @param {Object} options - Options\n * @returns {Promise<Object>} Storage result\n */\n async autoStore(holonId, content, options = {}) {\n this._requireAI();\n return this._ai.classifier.autoStore(holonId, content, options);\n }\n\n /**\n * Register a lens with the classifier\n * @param {string} lensName - Lens name\n * @param {string} description - Lens description\n * @param {string[]} keywords - Keywords for this lens\n */\n registerLensForClassification(lensName, description, keywords = []) {\n this._requireAI();\n this._ai.classifier.registerLens(lensName, description, keywords);\n }\n\n // --- Spatial Analysis ---\n\n /**\n * AI-powered analysis of a geographic region\n * @param {string} holonId - Holon to analyze\n * @param {string} lensName - Lens to analyze (optional)\n * @param {string} aspect - Aspect to focus on (optional)\n * @param {Object} options - Options\n * @returns {Promise<Object>} Analysis result\n */\n async analyzeRegion(holonId, lensName = null, aspect = null, options = {}) {\n this._requireAI();\n return this._ai.spatial.analyzeRegion(holonId, lensName, aspect, options);\n }\n\n /**\n * Compare data between two regions\n * @param {string} holon1 - First holon\n * @param {string} holon2 - Second holon\n * @param {string} lensName - Lens to compare (optional)\n * @returns {Promise<Object>} Comparison result\n */\n async compareRegions(holon1, holon2, lensName = null) {\n this._requireAI();\n return this._ai.spatial.compareRegions(holon1, holon2, lensName);\n }\n\n /**\n * Identify trends over time/space\n * @param {string} holonId - Holon to analyze\n * @param {string} lensName - Lens\n * @param {Object} timeRange - Time range\n * @returns {Promise<Object>} Trends\n */\n async spatialTrends(holonId, lensName, timeRange = null) {\n this._requireAI();\n return this._ai.spatial.spatialTrends(holonId, lensName, timeRange);\n }\n\n // --- Smart Aggregation ---\n\n /**\n * AI-summarized hierarchical aggregation up the holon tree\n * @param {string} holonId - Starting holon\n * @param {string} lensName - Lens to aggregate\n * @param {Object} options - Options\n * @returns {Promise<Object>} Aggregation result\n */\n async smartUpcast(holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.aggregation.smartUpcast(holonId, lensName, options);\n }\n\n /**\n * Generate comprehensive holon summary\n * @param {string} holonId - Holon to summarize\n * @returns {Promise<Object>} Summary\n */\n async generateHolonSummary(holonId) {\n this._requireAI();\n return this._ai.aggregation.generateHolonSummary(holonId);\n }\n\n // --- Federation Advisor ---\n\n /**\n * Get AI suggestions for federation partners\n * @param {string} holonId - Holon to find partners for\n * @param {Object} options - Options including candidateHolons\n * @returns {Promise<Object>} Federation suggestions\n */\n async suggestFederations(holonId, options = {}) {\n this._requireAI();\n return this._ai.federationAdvisor.suggestFederations(holonId, options);\n }\n\n /**\n * Analyze federation health\n * @param {string} holonId - Holon to analyze\n * @returns {Promise<Object>} Health analysis\n */\n async analyzeFederationHealth(holonId) {\n this._requireAI();\n return this._ai.federationAdvisor.analyzeFederationHealth(holonId);\n }\n\n /**\n * Get federation optimization suggestions\n * @param {string} holonId - Holon to optimize\n * @returns {Promise<Object>} Optimization suggestions\n */\n async optimizeFederation(holonId) {\n this._requireAI();\n return this._ai.federationAdvisor.optimizeFederation(holonId);\n }\n\n // --- Relationship Discovery ---\n\n /**\n * Discover hidden relationships in data\n * @param {string} holonId - Holon to analyze\n * @param {string} lensName - Lens (optional)\n * @returns {Promise<Object>} Discovered relationships\n */\n async discoverRelationships(holonId, lensName = null) {\n this._requireAI();\n return this._ai.relationships.discoverRelationships(holonId, lensName);\n }\n\n /**\n * Find semantically similar items\n * @param {Object} item - Item to find similar items for\n * @param {string} holonId - Holon to search in\n * @param {string} lensName - Lens to search in (optional)\n * @param {Object} options - Options\n * @returns {Promise<Array>} Similar items\n */\n async findSimilar(item, holonId, lensName = null, options = {}) {\n this._requireAI();\n return this._ai.relationships.findSimilar(item, holonId, lensName, options);\n }\n\n /**\n * Build relationship graph\n * @param {string} holonId - Holon\n * @param {string} lensName - Lens\n * @returns {Promise<Object>} Graph structure\n */\n async buildRelationshipGraph(holonId, lensName) {\n this._requireAI();\n return this._ai.relationships.buildGraph(holonId, lensName);\n }\n\n /**\n * Suggest connections for an item\n * @param {Object} item - Item to find connections for\n * @param {string} holonId - Holon\n * @param {string} lensName - Lens\n * @returns {Promise<Object>} Suggested connections\n */\n async suggestConnections(item, holonId, lensName) {\n this._requireAI();\n return this._ai.relationships.suggestConnections(item, holonId, lensName);\n }\n\n // --- Task Breakdown ---\n\n /**\n * Recursively break down a task/quest into subtasks\n * @param {Object} item - The item to break down (must have id)\n * @param {string} holonId - Holon where the item lives\n * @param {string} lensName - Lens name (e.g., 'quests', 'tasks')\n * @param {Object} options - Breakdown options\n * @param {number} options.depth - Maximum recursion depth (default: 2)\n * @param {number|Object} options.stepsPerLevel - Subtasks per level (default: {min:3, max:5})\n * @param {boolean} options.useContext - Look at other items for context (default: true)\n * @param {boolean} options.storeResults - Store generated subtasks (default: true)\n * @returns {Promise<Object>} Breakdown result with tree structure\n */\n async breakdown(item, holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.taskBreakdown.breakdown(item, holonId, lensName, options);\n }\n\n /**\n * Suggest breakdown strategy for a task\n * @param {Object} item - Item to analyze\n * @returns {Promise<Object>} Suggested breakdown strategy\n */\n async suggestBreakdownStrategy(item) {\n this._requireAI();\n return this._ai.taskBreakdown.suggestStrategy(item);\n }\n\n /**\n * Flatten a breakdown tree into a list\n * @param {Object} breakdownResult - Result from breakdown()\n * @returns {Object[]} Flat list of all items\n */\n flattenBreakdown(breakdownResult) {\n this._requireAI();\n return this._ai.taskBreakdown.flatten(breakdownResult);\n }\n\n /**\n * Get items in dependency order for execution\n * @param {Object} breakdownResult - Result from breakdown()\n * @returns {Object[]} Items in dependency order\n */\n getBreakdownDependencyOrder(breakdownResult) {\n this._requireAI();\n return this._ai.taskBreakdown.getDependencyOrder(breakdownResult);\n }\n\n /**\n * Get progress on a breakdown tree\n * @param {string} holonId - Holon ID\n * @param {string} lensName - Lens name\n * @param {string} itemId - Root item ID\n * @returns {Promise<Object>} Progress summary\n */\n async getBreakdownProgress(holonId, lensName, itemId) {\n this._requireAI();\n return this._ai.taskBreakdown.getProgress(holonId, lensName, itemId);\n }\n\n // --- H3 Geospatial AI ---\n\n /**\n * Suggest optimal H3 resolution for a task/project\n * @param {Object} item - Item to analyze\n * @param {Object} options - Options including currentResolution\n * @returns {Promise<Object>} Resolution recommendation\n */\n async suggestH3Resolution(item, options = {}) {\n this._requireAI();\n return this._ai.h3ai.suggestResolution(item, options);\n }\n\n /**\n * Analyze geographic distribution of data in a region\n * @param {string} holonId - Parent holon to analyze\n * @param {string} lensName - Lens to analyze\n * @param {Object} options - Options\n * @returns {Promise<Object>} Distribution analysis\n */\n async analyzeH3Distribution(holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.h3ai.analyzeDistribution(holonId, lensName, options);\n }\n\n /**\n * Find relevant data from neighboring H3 cells\n * @param {string} holonId - Center holon\n * @param {string} lensName - Lens to search\n * @param {Object} options - Options including ringSize\n * @returns {Promise<Object>} Neighbor analysis\n */\n async findH3NeighborRelevance(holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.h3ai.findNeighborRelevance(holonId, lensName, options);\n }\n\n /**\n * Suggest geographic expansion or contraction for an item\n * @param {Object} item - Item to analyze\n * @param {string} holonId - Current holon\n * @param {string} lensName - Lens\n * @param {Object} options - Options\n * @returns {Promise<Object>} Scope suggestions\n */\n async suggestGeographicScope(item, holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.h3ai.suggestGeographicScope(item, holonId, lensName, options);\n }\n\n /**\n * Analyze coverage gaps in a region\n * @param {string} holonId - Region to analyze\n * @param {string} lensName - Lens\n * @param {Object} options - Options including targetResolution\n * @returns {Promise<Object>} Coverage analysis\n */\n async analyzeH3Coverage(holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.h3ai.analyzeCoverage(holonId, lensName, options);\n }\n\n /**\n * Find patterns across multiple H3 resolutions\n * @param {string} holonId - Starting holon\n * @param {string} lensName - Lens\n * @param {Object} options - Options including levels\n * @returns {Promise<Object>} Cross-resolution insights\n */\n async crossH3ResolutionInsights(holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.h3ai.crossResolutionInsights(holonId, lensName, options);\n }\n\n /**\n * Suggest item migration between holons based on geographic fit\n * @param {Object} item - Item to analyze\n * @param {string} holonId - Current location\n * @param {string} lensName - Lens\n * @param {Object} options - Options including searchRadius\n * @returns {Promise<Object>} Migration suggestions\n */\n async suggestH3Migration(item, holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.h3ai.suggestMigration(item, holonId, lensName, options);\n }\n\n /**\n * Generate a geographic activity report for a region\n * @param {string} holonId - Region to report on\n * @param {Object} options - Options including lenses array\n * @returns {Promise<Object>} Geographic report\n */\n async generateH3Report(holonId, options = {}) {\n this._requireAI();\n return this._ai.h3ai.generateGeographicReport(holonId, options);\n }\n\n /**\n * Find geographic clusters of related items\n * @param {string} holonId - Region to analyze\n * @param {string} lensName - Lens\n * @param {Object} options - Options including clusterResolution\n * @returns {Promise<Object>} Geographic clusters\n */\n async findH3Clusters(holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.h3ai.findGeographicClusters(holonId, lensName, options);\n }\n\n /**\n * Analyze geographic impact of an item\n * @param {Object} item - Item to analyze\n * @param {string} holonId - Item's holon\n * @param {string} lensName - Lens\n * @param {Object} options - Options\n * @returns {Promise<Object>} Impact analysis\n */\n async analyzeH3Impact(item, holonId, lensName, options = {}) {\n this._requireAI();\n return this._ai.h3ai.analyzeGeographicImpact(item, holonId, lensName, options);\n }\n\n // === Cross-Holosphere Federation ===\n\n /**\n * Add a federated holosphere partner (manual key exchange)\n * @param {string} pubKey - Partner's public key\n * @param {Object} options - Federation options\n * @param {string} options.alias - Human-readable name for this partner\n * @param {Object[]} options.inboundCapabilities - Capabilities they've granted us\n * @returns {Promise<boolean>} Success indicator\n */\n async addFederatedHolosphere(pubKey, options = {}) {\n if (!pubKey || typeof pubKey !== 'string') {\n throw new ValidationError('pubKey must be a valid public key string');\n }\n\n return registry.addFederatedPartner(\n this.client,\n this.config.appName,\n pubKey,\n options\n );\n }\n\n /**\n * Remove a federated holosphere partner\n * @param {string} pubKey - Partner's public key\n * @returns {Promise<boolean>} Success indicator\n */\n async removeFederatedHolosphere(pubKey) {\n return registry.removeFederatedPartner(\n this.client,\n this.config.appName,\n pubKey\n );\n }\n\n /**\n * Get all federated holosphere public keys\n * @returns {Promise<string[]>} Array of federated public keys\n */\n async getFederatedHolospheres() {\n return registry.getFederatedAuthors(\n this.client,\n this.config.appName\n );\n }\n\n /**\n * Get the full federation registry for this holosphere\n * @returns {Promise<Object>} Federation registry\n */\n async getFederationRegistry() {\n return registry.getFederationRegistry(\n this.client,\n this.config.appName\n );\n }\n\n /**\n * Store a capability token received from another holosphere\n * @param {string} partnerPubKey - Partner's public key\n * @param {Object} capabilityInfo - Capability information\n * @param {string} capabilityInfo.token - The capability token\n * @param {Object} capabilityInfo.scope - Token scope\n * @param {string[]} capabilityInfo.permissions - Granted permissions\n * @param {number} capabilityInfo.expires - Expiration timestamp\n * @returns {Promise<boolean>} Success indicator\n */\n async storeInboundCapability(partnerPubKey, capabilityInfo) {\n return registry.storeInboundCapability(\n this.client,\n this.config.appName,\n partnerPubKey,\n capabilityInfo\n );\n }\n\n /**\n * Read data from a federated source (cross-holosphere)\n * @param {string} sourcePubKey - Source holosphere's public key\n * @param {string} holonId - Holon ID\n * @param {string} lensName - Lens name\n * @param {string} dataId - Optional specific data ID\n * @returns {Promise<Object|Object[]|null>} Data from federated source\n */\n async readFromFederatedSource(sourcePubKey, holonId, lensName, dataId = null) {\n // Get capability for this source\n const capabilityEntry = await registry.getCapabilityForAuthor(\n this.client,\n this.config.appName,\n sourcePubKey,\n { holonId, lensName, dataId }\n );\n\n if (!capabilityEntry) {\n throw new AuthorizationError('No valid capability for federated source', 'read');\n }\n\n // Verify capability is still valid\n const isValid = await this.verifyCapability(\n capabilityEntry.token,\n 'read',\n { holonId, lensName, dataId }\n );\n\n if (!isValid) {\n throw new AuthorizationError('Capability verification failed', 'read');\n }\n\n // Read with specific author\n if (dataId) {\n const path = storage.buildPath(this.config.appName, holonId, lensName, dataId);\n return nostrAsync.nostrGet(this.client, path, 30000, {\n authors: [sourcePubKey],\n includeAuthor: true,\n });\n } else {\n const path = storage.buildPath(this.config.appName, holonId, lensName);\n return nostrAsync.nostrGetAll(this.client, path, 30000, {\n authors: [sourcePubKey],\n includeAuthor: true,\n });\n }\n }\n\n /**\n * Create a cross-holosphere hologram with embedded capability\n * @param {string} sourcePubKey - Source holosphere's public key\n * @param {string} sourceHolon - Source holon ID\n * @param {string} lensName - Lens name\n * @param {string} dataId - Data ID\n * @param {string} targetHolon - Target holon ID (where hologram will live)\n * @param {Object} options - Creation options\n * @param {boolean} options.embedCapability - Whether to embed capability in hologram (default: true)\n * @returns {Promise<Object>} Hologram object\n */\n async createCrossHolosphereHologram(sourcePubKey, sourceHolon, lensName, dataId, targetHolon, options = {}) {\n const { embedCapability = true } = options;\n\n // Get capability for this source\n const capabilityEntry = await registry.getCapabilityForAuthor(\n this.client,\n this.config.appName,\n sourcePubKey,\n { holonId: sourceHolon, lensName, dataId }\n );\n\n if (!capabilityEntry) {\n throw new AuthorizationError('No valid capability for cross-holosphere hologram', 'read');\n }\n\n // Create hologram with embedded capability\n const hologram = federation.createHologram(\n sourceHolon,\n targetHolon,\n lensName,\n dataId,\n this.config.appName,\n {\n authorPubKey: sourcePubKey,\n capability: embedCapability ? capabilityEntry.token : null,\n }\n );\n\n // Write hologram to target holon\n const targetPath = storage.buildPath(this.config.appName, targetHolon, lensName, dataId);\n await storage.write(this.client, targetPath, hologram);\n\n return hologram;\n }\n\n /**\n * Issue a capability token for federation with another holosphere\n * @param {string} targetPubKey - Recipient's public key\n * @param {Object} scope - Capability scope { holonId, lensName, dataId? }\n * @param {string[]} permissions - Array of permissions ['read', 'write', 'delete']\n * @param {Object} options - Additional options\n * @param {number} options.expiresIn - Expiration in ms (default: 1 hour)\n * @param {boolean} options.trackInRegistry - Store in registry (default: true)\n * @returns {Promise<string>} Capability token\n */\n async issueCapabilityForFederation(targetPubKey, scope, permissions, options = {}) {\n const { expiresIn = 3600000, trackInRegistry = true } = options;\n\n const token = await crypto.issueCapability(\n permissions,\n scope,\n targetPubKey,\n {\n expiresIn,\n issuerKey: this.client.privateKey,\n }\n );\n\n // Track in registry\n if (trackInRegistry) {\n // Ensure partner exists in registry\n const partner = await registry.getFederatedPartner(\n this.client,\n this.config.appName,\n targetPubKey\n );\n\n if (!partner) {\n await registry.addFederatedPartner(\n this.client,\n this.config.appName,\n targetPubKey,\n { addedVia: 'capability_issued' }\n );\n }\n\n await registry.storeOutboundCapability(\n this.client,\n this.config.appName,\n targetPubKey,\n {\n tokenHash: await this._hashToken(token),\n scope,\n permissions,\n expires: Date.now() + expiresIn,\n }\n );\n }\n\n return token;\n }\n\n /**\n * Hash a token for storage (don't store full token)\n * @private\n */\n async _hashToken(token) {\n const { sha256 } = await import('@noble/hashes/sha256');\n const { bytesToHex } = await import('@noble/hashes/utils');\n const encoder = new TextEncoder();\n return bytesToHex(sha256(encoder.encode(token)));\n }\n\n // === Nostr Discovery Protocol (Optional) ===\n\n /**\n * Send a federation request via Nostr\n * @param {string} targetPubKey - Target holosphere's public key\n * @param {Object} options - Request options\n * @param {Object} options.scope - Requested scope { holonId, lensName }\n * @param {string[]} options.permissions - Requested permissions\n * @param {string} options.message - Optional message\n * @returns {Promise<Object>} Published event info\n */\n async sendFederationRequest(targetPubKey, options = {}) {\n return discovery.sendFederationRequest(\n this.client,\n this.config.appName,\n targetPubKey,\n options\n );\n }\n\n /**\n * Subscribe to incoming federation requests\n * @param {Function} callback - Called with each request\n * @returns {Promise<Object>} Subscription with unsubscribe method\n */\n async subscribeFederationRequests(callback) {\n return discovery.subscribeFederationRequests(this.client, callback);\n }\n\n /**\n * Accept a federation request\n * @param {Object} request - Request object from subscription\n * @param {Object} options - Acceptance options\n * @returns {Promise<Object>} Published acceptance event info\n */\n async acceptFederationRequest(request, options = {}) {\n return discovery.acceptFederationRequest(\n this.client,\n this.config.appName,\n request,\n options\n );\n }\n\n /**\n * Decline a federation request\n * @param {Object} request - Request object from subscription\n * @param {string} reason - Optional decline reason\n * @returns {Promise<Object>} Published decline event info\n */\n async declineFederationRequest(request, reason = '') {\n return discovery.declineFederationRequest(\n this.client,\n this.config.appName,\n request,\n reason\n );\n }\n\n /**\n * Subscribe to federation acceptances (responses to our requests)\n * @param {Function} callback - Called with each acceptance\n * @returns {Promise<Object>} Subscription with unsubscribe method\n */\n async subscribeFederationAcceptances(callback) {\n return discovery.subscribeFederationAcceptances(\n this.client,\n this.config.appName,\n callback\n );\n }\n\n /**\n * Subscribe to federation declines\n * @param {Function} callback - Called with each decline\n * @returns {Promise<Object>} Subscription with unsubscribe method\n */\n async subscribeFederationDeclines(callback) {\n return discovery.subscribeFederationDeclines(this.client, callback);\n }\n\n /**\n * Get pending federation requests (requests we've sent that haven't been answered)\n * @param {Object} options - Query options\n * @returns {Promise<Object[]>} Array of pending requests\n */\n async getPendingFederationRequests(options = {}) {\n return discovery.getPendingFederationRequests(this.client, options);\n }\n}\n\n// Export error classes\nexport class AuthorizationError extends Error {\n constructor(message, requiredPermission = null) {\n super(message);\n this.name = 'AuthorizationError';\n this.requiredPermission = requiredPermission;\n }\n}\n\nexport class HolosphereError extends Error {\n constructor(message) {\n super(message);\n this.name = 'HolosphereError';\n }\n}\n\n// Re-export ValidationError from validator module\nexport { ValidationError } from './schema/validator.js';\n\n// Export utilities\nexport { nostrAsync };\n\n// Export hologram helper functions\nexport {\n isHologram,\n isResolvedHologram,\n getHologramSource,\n updateHologramOverrides,\n addActiveHologram,\n removeActiveHologram,\n refreshActiveHolograms,\n deleteHologram,\n propagateData,\n createHologram,\n resolveHologram,\n cleanupCircularHolograms,\n cleanupCircularHologramsByIds\n} from './federation/hologram.js';\n\n// Export federation registry functions\nexport {\n getFederationRegistry,\n addFederatedPartner,\n removeFederatedPartner,\n getFederatedAuthors,\n getCapabilityForAuthor,\n storeInboundCapability,\n storeOutboundCapability,\n cleanupExpiredCapabilities\n} from './federation/registry.js';\n\n// Export Nostr discovery protocol functions\nexport {\n sendFederationRequest,\n subscribeFederationRequests,\n acceptFederationRequest,\n declineFederationRequest,\n subscribeFederationAcceptances,\n subscribeFederationDeclines,\n getPendingFederationRequests\n} from './federation/discovery.js';\n\n// Export scope matching utility\nexport { matchScope } from './crypto/secp256k1.js';\n\n// Export AI modules for standalone use\nexport {\n LLMService,\n SchemaExtractor,\n JSONOps,\n Embeddings,\n Council,\n TTS,\n VOICES,\n MODELS,\n NLQuery,\n Classifier,\n SpatialAnalysis,\n SmartAggregation,\n FederationAdvisor,\n RelationshipDiscovery,\n TaskBreakdown,\n H3AI\n};\n\n// Export AI factory function\nexport { createAIServices } from './ai/index.js';\n\n// Default export for backward compatibility\nexport default HoloSphere;\n"],"names":["getPublicKey","bytes","kind","type","module","name","str","limit","byPath","hash","isLE","deleteData","is_array","fetch","FormData","File","ReadableStream","shims.kind","shims.setShims","auto.getRuntime","__classPrivateFieldSet","__classPrivateFieldGet","parseResponse","opts","Page","shimsKind","retryMessage","init","modifiedArg","MessagesAPI.Messages","Completions","Messages","CompletionsAPI.Completions","Chat","Core.multipartFormRequestOptions","TranscriptionsAPI.Transcriptions","TranslationsAPI.Translations","SpeechAPI.Speech","_EventStream_handleError","chunk","Core.isObj","_AssistantStream_addEvent","_AssistantStream_endRequest","_AssistantStream_handleMessage","_AssistantStream_handleRunStep","_AssistantStream_handleEvent","_AssistantStream_accumulateRunStep","_AssistantStream_accumulateMessage","_AssistantStream_accumulateContent","_AssistantStream_handleRun","isAutoParsableTool","hasAutoParseableInput","parseToolCall","inputTool","content","_AbstractChatCompletionRunner_getFinalContent","_AbstractChatCompletionRunner_getFinalMessage","_AbstractChatCompletionRunner_getFinalFunctionCall","_AbstractChatCompletionRunner_getFinalFunctionCallResult","_AbstractChatCompletionRunner_calculateTotalUsage","_AbstractChatCompletionRunner_validateParams","_AbstractChatCompletionRunner_stringifyFunctionCallResult","escape","e","_ChatCompletionStream_beginRequest","_ChatCompletionStream_getChoiceEventState","_ChatCompletionStream_addChunk","_ChatCompletionStream_emitToolCallDoneEvent","_ChatCompletionStream_emitContentDoneEvents","_ChatCompletionStream_endRequest","_ChatCompletionStream_getAutoParseableResponseFormat","_ChatCompletionStream_accumulateChatCompletion","_a","refusal","rest","index","id","SessionsAPI.Sessions","TranscriptionSessionsAPI.TranscriptionSessions","StepsAPI.Steps","Runs","RunsAPI.Runs","RealtimeAPI.Realtime","ChatAPI.Chat","AssistantsAPI.Assistants","ThreadsAPI.Threads","ContentAPI.Content","Files","FilesAPI.Files","Core.debug","response","Core.toFloat32Array","OutputItemsAPI.OutputItems","GradersAPI.Graders","Graders","PermissionsAPI.Permissions","Checkpoints","CheckpointsAPI.Checkpoints","MethodsAPI.Methods","JobsAPI.Jobs","AlphaAPI.Alpha","GraderModelsAPI.GraderModels","output","_ResponseStream_beginRequest","_ResponseStream_addEvent","event","_ResponseStream_endRequest","_ResponseStream_accumulateResponse","InputItemsAPI.InputItems","PartsAPI.Parts","FileBatchesAPI.FileBatches","Core.APIClient","Core.readEnv","Errors.OpenAIError","Core.isRunningInBrowser","API.Completions","API.Chat","API.Embeddings","API.Files","API.Images","API.Audio","API.Moderations","API.Models","API.FineTuning","API.Graders","API.VectorStores","API.Beta","API.Batches","API.Uploads","API.Responses","API.Evals","API.Containers","qs.stringify","Errors.APIError","Errors.APIConnectionError","Errors.APIConnectionTimeoutError","Errors.APIUserAbortError","Errors.NotFoundError","Errors.ConflictError","Errors.RateLimitError","Errors.BadRequestError","Errors.AuthenticationError","Errors.InternalServerError","Errors.PermissionDeniedError","Errors.UnprocessableEntityError","Uploads.toFile","Uploads.fileFromPath","Embeddings","UploadsAPIUploads","description","summary","HoloSphere","HoloSphereCore","subscriptions.SubscriptionRegistry","OpenAI","spatial.toHolon","spatial.getParents","spatial.getChildren","spatial.isValidH3","storage.buildPath","storage.read","schema.validate","startTime","storage.write","storage.update","federation.refreshActiveHolograms","endTime","isHologram","federation.resolveHologram","registry.getFederatedAuthorsForScope","storage.readAll","storage.deleteData","globalTables.writeGlobal","globalTables.readGlobal","globalTables.updateGlobal","globalTables.deleteGlobal","globalTables.deleteAllGlobal","storage.deleteAll","schema.clearSchemaCache","federation.setupFederation","federation.propagateData","federation.updateHologramOverrides","federation.createHologram","federation.removeActiveHologram","federation.deleteHologram","federation.isHologram","federation.isResolvedHologram","federation.getHologramSource","federation.cleanupCircularHolograms","federation.cleanupCircularHologramsByIds","hierarchical.upcast","subscriptions.createSubscription","crypto.getPublicKey","crypto.sign","crypto.verify","crypto.issueCapability","crypto.verifyCapability","social.validateNostrEvent","finalizeEvent","social.transformNostrEvent","social.validateActivityPubObject","social.transformActivityPubObject","social.filterByProtocol","social.filterByAccessLevel","keywords","registry.addFederatedPartner","registry.removeFederatedPartner","registry.getFederatedAuthors","registry.getFederationRegistry","registry.storeInboundCapability","registry.getCapabilityForAuthor","nostrAsync.nostrGet","nostrAsync.nostrGetAll","registry.getFederatedPartner","registry.storeOutboundCapability","sha256","bytesToHex","discovery.sendFederationRequest","discovery.subscribeFederationRequests","discovery.acceptFederationRequest","discovery.declineFederationRequest","discovery.subscribeFederationAcceptances","discovery.subscribeFederationDeclines","discovery.getPendingFederationRequests"],"mappings":"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","x_google_ignoreList":[11,12,13,14,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99]}
|