{"version":3,"sources":["../src/miniflare.ts","../src/index.ts","../src/client.ts","../src/sync.ts"],"sourcesContent":["/**\n * Miniflare Integration\n *\n * Provides a miniflare-based Durable Object binding for Node.js development/testing.\n * This allows you to use the same MDXDatabase API locally.\n *\n * @example\n * ```ts\n * import { createMiniflareBinding } from '@mdxdb/sqlite/miniflare'\n *\n * const binding = await createMiniflareBinding('./.data')\n * const id = binding.idFromName('example.com')\n * const db = binding.get(id)\n *\n * // Use the same RPC methods\n * await db.create({ ns: 'example.com', type: 'Post', data: { title: 'Hello' } })\n * ```\n *\n * @packageDocumentation\n */\n\n// DurableObjectNamespace, DurableObjectId, DurableObjectStub are global from @cloudflare/workers-types\nimport type {\n  MDXDatabaseRPC,\n  Thing,\n  Artifact,\n  ArtifactType,\n  ActionStatus,\n} from './types.js'\n\n// Miniflare types (we'll import dynamically)\ninterface MiniflareOptions {\n  modules: boolean\n  script?: string\n  scriptPath?: string\n  durableObjects: Record<string, string>\n  durableObjectsPersist?: string\n}\n\ninterface Miniflare {\n  getDurableObjectNamespace(name: string): Promise<DurableObjectNamespace<MDXDatabaseRPC>>\n  dispose(): Promise<void>\n}\n\n// Cache miniflare instance\nlet miniflareInstance: Miniflare | null = null\nlet miniflareBinding: DurableObjectNamespace<MDXDatabaseRPC> | null = null\n\n/**\n * Create a miniflare-based Durable Object binding\n *\n * This creates a local miniflare instance that emulates the Cloudflare Workers\n * runtime with Durable Objects SQLite storage.\n */\nexport async function createMiniflareBinding(\n  persistPath?: string\n): Promise<DurableObjectNamespace<MDXDatabaseRPC>> {\n  // Return cached binding if available\n  if (miniflareBinding) {\n    return miniflareBinding\n  }\n\n  // Dynamic import miniflare and path\n  const { Miniflare: MF } = await import('miniflare')\n  const { fileURLToPath } = await import('node:url')\n  const { dirname, join } = await import('node:path')\n  const { existsSync } = await import('node:fs')\n\n  // Get the path to the durable-object.js file\n  // When running from source (vitest), __dirname is src/\n  // When running from dist, __dirname is dist/\n  const __filename = fileURLToPath(import.meta.url)\n  const __dirname = dirname(__filename)\n\n  // Check if we're running from source (src/) or dist\n  // Miniflare needs the bundled version (no code splitting)\n  let doPath = join(__dirname, 'durable-object.bundled.js')\n  if (!existsSync(doPath)) {\n    // Try dist directory (when running tests from src/)\n    const distPath = join(__dirname, '..', 'dist', 'durable-object.bundled.js')\n    if (existsSync(distPath)) {\n      doPath = distPath\n    } else {\n      throw new Error(\n        `Cannot find durable-object.bundled.js. Tried:\\n  - ${doPath}\\n  - ${distPath}\\n` +\n        `Run 'pnpm build' first if testing with miniflare.`\n      )\n    }\n  }\n\n  // Create miniflare instance with the actual module file\n  // Using type assertion because newer miniflare versions changed the script field to required\n  // but we're using scriptPath which is a valid alternative\n  miniflareInstance = new MF({\n    modules: true,\n    scriptPath: doPath,\n    durableObjects: {\n      MDXDB: {\n        className: 'MDXDatabase',\n        // Enable SQLite for this DO class\n        useSQLite: true,\n      },\n    },\n    durableObjectsPersist: persistPath ?? '.mf/do',\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  } as any) as unknown as Miniflare\n\n  // Get the binding\n  miniflareBinding = await miniflareInstance.getDurableObjectNamespace('MDXDB')\n\n  return miniflareBinding\n}\n\n/**\n * Dispose the miniflare instance\n *\n * Call this when you're done to clean up resources.\n */\nexport async function disposeMiniflare(): Promise<void> {\n  if (miniflareInstance) {\n    await miniflareInstance.dispose()\n    miniflareInstance = null\n    miniflareBinding = null\n  }\n}\n\n/**\n * Create a simple in-memory implementation for testing\n *\n * This is a lighter alternative to miniflare for unit tests.\n */\nexport function createInMemoryBinding(): DurableObjectNamespace<MDXDatabaseRPC> {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const instances = new Map<string, any>()\n\n  // Create a simple in-memory SQLite-like storage\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const createInMemoryInstance = (name: string): any => {\n    // Storage maps\n    const things = new Map<string, Record<string, unknown>>()\n    const relationships = new Map<string, Record<string, unknown>>()\n    const search = new Map<string, Record<string, unknown>>()\n    const events = new Map<string, Record<string, unknown>>()\n    const actions = new Map<string, Record<string, unknown>>()\n    const artifacts = new Map<string, Record<string, unknown>>()\n\n    const generateId = () => `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 9)}`\n\n    const instance: MDXDatabaseRPC = {\n      // Thing operations\n      async list(options = {}) {\n        let result = Array.from(things.values())\n          .filter((t: Record<string, unknown>) => !t.deleted_at)\n\n        if (options.type) {\n          result = result.filter((t: Record<string, unknown>) => t.type === options.type)\n        }\n        if (options.ns) {\n          result = result.filter((t: Record<string, unknown>) => t.ns === options.ns)\n        }\n\n        // Handle where clause\n        if (options.where) {\n          for (const [key, value] of Object.entries(options.where)) {\n            result = result.filter((t: Record<string, unknown>) => {\n              const data = t.data as Record<string, unknown>\n              return data[key] === value\n            })\n          }\n        }\n\n        // Handle ordering\n        if (options.orderBy) {\n          const orderBy = options.orderBy as string\n          result.sort((a: Record<string, unknown>, b: Record<string, unknown>) => {\n            let aVal: string | number | boolean | null | undefined\n            let bVal: string | number | boolean | null | undefined\n            if (['url', 'ns', 'type', 'id', 'created_at', 'updated_at'].includes(orderBy)) {\n              aVal = a[orderBy] as string | number | boolean | null | undefined\n              bVal = b[orderBy] as string | number | boolean | null | undefined\n            } else {\n              // JSON field\n              aVal = (a.data as Record<string, unknown>)[orderBy] as string | number | boolean | null | undefined\n              bVal = (b.data as Record<string, unknown>)[orderBy] as string | number | boolean | null | undefined\n            }\n            if (aVal === undefined || aVal === null) return 1\n            if (bVal === undefined || bVal === null) return -1\n            if (aVal < bVal) return -1\n            if (aVal > bVal) return 1\n            return 0\n          })\n          if (options.order === 'desc') {\n            result.reverse()\n          }\n        }\n\n        // Handle offset and limit\n        if (options.offset) {\n          result = result.slice(options.offset)\n        }\n        if (options.limit) {\n          result = result.slice(0, options.limit)\n        }\n\n        return result.map((row: Record<string, unknown>) => ({\n          ns: row.ns as string,\n          type: row.type as string,\n          id: row.id as string,\n          url: row.url as string,\n          data: row.data as Record<string, unknown>,\n          content: row.content as string | undefined,\n          createdAt: new Date(row.created_at as string),\n          updatedAt: new Date(row.updated_at as string),\n        }))\n      },\n\n      async read(url) {\n        const row = things.get(url)\n        if (!row || row.deleted_at) return null\n\n        return {\n          ns: row.ns as string,\n          type: row.type as string,\n          id: row.id as string,\n          url: row.url as string,\n          data: row.data as Record<string, unknown>,\n          content: row.content as string | undefined,\n          createdAt: new Date(row.created_at as string),\n          updatedAt: new Date(row.updated_at as string),\n        }\n      },\n\n      async readById(type, id) {\n        const url = `https://${name}/${type}/${id}`\n        return instance.read(url)\n      },\n\n      async create(options) {\n        const id = options.id ?? generateId()\n        const url = options.url ?? `https://${options.ns}/${options.type}/${id}`\n        const now = new Date().toISOString()\n\n        if (things.has(url)) {\n          throw new Error(`Thing already exists: ${url}`)\n        }\n\n        const row = {\n          url,\n          ns: options.ns,\n          type: options.type,\n          id,\n          data: options.data,\n          content: options.content ?? '',\n          created_at: now,\n          updated_at: now,\n          deleted_at: null,\n        }\n\n        things.set(url, row)\n\n        return {\n          ns: options.ns,\n          type: options.type,\n          id,\n          url,\n          data: options.data,\n          content: options.content,\n          createdAt: new Date(now),\n          updatedAt: new Date(now),\n        }\n      },\n\n      async update(url, options) {\n        const existing = things.get(url)\n        if (!existing || existing.deleted_at) {\n          throw new Error(`Thing not found: ${url}`)\n        }\n\n        const now = new Date().toISOString()\n        const merged = { ...(existing.data as Record<string, unknown>), ...options.data }\n\n        existing.data = merged\n        existing.updated_at = now\n        if (options.content !== undefined) {\n          existing.content = options.content\n        }\n\n        return {\n          ns: existing.ns as string,\n          type: existing.type as string,\n          id: existing.id as string,\n          url: existing.url as string,\n          data: merged as Record<string, unknown>,\n          content: existing.content as string | undefined,\n          createdAt: new Date(existing.created_at as string),\n          updatedAt: new Date(now),\n        } as Thing\n      },\n\n      async upsert(options) {\n        const id = options.id ?? generateId()\n        const url = options.url ?? `https://${options.ns}/${options.type}/${id}`\n\n        const existing = things.get(url)\n        if (existing && !existing.deleted_at) {\n          return instance.update(url, { data: options.data, content: options.content })\n        }\n\n        return instance.create({ ...options, id, url })\n      },\n\n      async remove(url) {\n        const deleted = things.delete(url)\n        // Also delete relationships\n        for (const [key, rel] of relationships) {\n          if (rel.from_url === url || rel.to_url === url) {\n            relationships.delete(key)\n          }\n        }\n        return deleted\n      },\n\n      async search(options) {\n        const queryLower = options.query.toLowerCase()\n        const all = await instance.list({ type: options.type, limit: options.limit })\n\n        return all.filter(thing => {\n          const searchText = JSON.stringify(thing).toLowerCase()\n          return searchText.includes(queryLower)\n        })\n      },\n\n      // Relationship operations\n      async relate(options) {\n        const id = `rel_${options.from}_${options.type}_${options.to}`\n        const now = new Date().toISOString()\n\n        relationships.set(id, {\n          id,\n          type: options.type,\n          from_url: options.from,\n          to_url: options.to,\n          data: options.data,\n          created_at: now,\n        })\n\n        return {\n          id,\n          type: options.type,\n          from: options.from,\n          to: options.to,\n          data: options.data,\n          createdAt: new Date(now),\n        }\n      },\n\n      async unrelate(from, type, to) {\n        const id = `rel_${from}_${type}_${to}`\n        return relationships.delete(id)\n      },\n\n      async related(url, type, direction) {\n        // Default to 'from' if direction is not specified or undefined\n        const dir = direction ?? 'from'\n        const urls: string[] = []\n\n        for (const rel of relationships.values()) {\n          if (type && rel.type !== type) continue\n\n          // dir='to': Return things this URL points TO (outbound, where from_url = url)\n          if ((dir === 'to' || dir === 'both') && rel.from_url === url) {\n            urls.push(rel.to_url as string)\n          }\n          // dir='from': Return things that point TO this URL (inbound, where to_url = url)\n          if ((dir === 'from' || dir === 'both') && rel.to_url === url) {\n            urls.push(rel.from_url as string)\n          }\n        }\n\n        const result = []\n        for (const u of [...new Set(urls)]) {\n          const thing = await instance.read(u)\n          if (thing) result.push(thing)\n        }\n        return result\n      },\n\n      async relationships(url, type, direction) {\n        // Default to 'both' if direction is not specified or undefined\n        const dir = direction ?? 'both'\n        const result = []\n\n        for (const rel of relationships.values()) {\n          if (type && rel.type !== type) continue\n\n          const matches =\n            (dir === 'from' && rel.from_url === url) ||\n            (dir === 'to' && rel.to_url === url) ||\n            (dir === 'both' && (rel.from_url === url || rel.to_url === url))\n\n          if (matches) {\n            result.push({\n              id: rel.id as string,\n              type: rel.type as string,\n              from: rel.from_url as string,\n              to: rel.to_url as string,\n              data: rel.data as Record<string, unknown> | undefined,\n              createdAt: new Date(rel.created_at as string),\n            })\n          }\n        }\n\n        return result\n      },\n\n      // Vector search (placeholder - requires Vectorize binding in production)\n      async vectorSearch() {\n        return []\n      },\n\n      async setEmbedding() {},\n\n      async upsertEmbeddings() {},\n\n      async deleteVectors() {},\n\n      // Event operations\n      async track(options) {\n        const id = generateId()\n        const now = new Date().toISOString()\n\n        events.set(id, {\n          id,\n          type: options.type,\n          timestamp: now,\n          source: options.source,\n          data: options.data,\n          correlation_id: options.correlationId,\n          causation_id: options.causationId,\n        })\n\n        return {\n          id,\n          type: options.type,\n          timestamp: new Date(now),\n          source: options.source,\n          data: options.data,\n          correlationId: options.correlationId,\n          causationId: options.causationId,\n        }\n      },\n\n      async getEvent(id) {\n        const row = events.get(id)\n        if (!row) return null\n\n        return {\n          id: row.id as string,\n          type: row.type as string,\n          timestamp: new Date(row.timestamp as string),\n          source: row.source as string,\n          data: row.data as Record<string, unknown>,\n          correlationId: row.correlation_id as string | undefined,\n          causationId: row.causation_id as string | undefined,\n        }\n      },\n\n      async queryEvents(options = {}) {\n        let result = Array.from(events.values())\n\n        if (options.type) {\n          result = result.filter((e: Record<string, unknown>) => e.type === options.type)\n        }\n        if (options.source) {\n          result = result.filter((e: Record<string, unknown>) => e.source === options.source)\n        }\n        if (options.limit) {\n          result = result.slice(0, options.limit)\n        }\n\n        return result.map((row: Record<string, unknown>) => ({\n          id: row.id as string,\n          type: row.type as string,\n          timestamp: new Date(row.timestamp as string),\n          source: row.source as string,\n          data: row.data as Record<string, unknown>,\n          correlationId: row.correlation_id as string | undefined,\n          causationId: row.causation_id as string | undefined,\n        }))\n      },\n\n      // Action operations\n      async send(options) {\n        const id = generateId()\n        const now = new Date().toISOString()\n\n        actions.set(id, {\n          id,\n          actor: options.actor,\n          object: options.object,\n          action: options.action,\n          status: options.status ?? 'pending',\n          created_at: now,\n          updated_at: now,\n          metadata: options.metadata,\n        })\n\n        return {\n          id,\n          actor: options.actor,\n          object: options.object,\n          action: options.action,\n          status: options.status ?? 'pending',\n          createdAt: new Date(now),\n          updatedAt: new Date(now),\n          metadata: options.metadata,\n        }\n      },\n\n      async do(options) {\n        const id = generateId()\n        const now = new Date().toISOString()\n\n        actions.set(id, {\n          id,\n          actor: options.actor,\n          object: options.object,\n          action: options.action,\n          status: 'active',\n          created_at: now,\n          updated_at: now,\n          started_at: now,\n          metadata: options.metadata,\n        })\n\n        return {\n          id,\n          actor: options.actor,\n          object: options.object,\n          action: options.action,\n          status: 'active',\n          createdAt: new Date(now),\n          updatedAt: new Date(now),\n          startedAt: new Date(now),\n          metadata: options.metadata,\n        }\n      },\n\n      async getAction(id) {\n        const row = actions.get(id)\n        if (!row) return null\n\n        return {\n          id: row.id as string,\n          actor: row.actor as string,\n          object: row.object as string,\n          action: row.action as string,\n          status: row.status as 'pending' | 'active' | 'completed' | 'failed' | 'cancelled',\n          createdAt: new Date(row.created_at as string),\n          updatedAt: new Date(row.updated_at as string),\n          startedAt: row.started_at ? new Date(row.started_at as string) : undefined,\n          completedAt: row.completed_at ? new Date(row.completed_at as string) : undefined,\n          result: row.result,\n          error: row.error as string | undefined,\n          metadata: row.metadata as Record<string, unknown> | undefined,\n        }\n      },\n\n      async queryActions(options = {}) {\n        let result = Array.from(actions.values())\n\n        if (options.actor) {\n          result = result.filter((a: Record<string, unknown>) => a.actor === options.actor)\n        }\n        if (options.status) {\n          const statuses = Array.isArray(options.status) ? options.status : [options.status]\n          result = result.filter((a: Record<string, unknown>) => statuses.includes(a.status as ActionStatus))\n        }\n        if (options.limit) {\n          result = result.slice(0, options.limit)\n        }\n\n        return result.map((row: Record<string, unknown>) => ({\n          id: row.id as string,\n          actor: row.actor as string,\n          object: row.object as string,\n          action: row.action as string,\n          status: row.status as 'pending' | 'active' | 'completed' | 'failed' | 'cancelled',\n          createdAt: new Date(row.created_at as string),\n          updatedAt: new Date(row.updated_at as string),\n          startedAt: row.started_at ? new Date(row.started_at as string) : undefined,\n          completedAt: row.completed_at ? new Date(row.completed_at as string) : undefined,\n          result: row.result,\n          error: row.error as string | undefined,\n          metadata: row.metadata as Record<string, unknown> | undefined,\n        }))\n      },\n\n      async startAction(id) {\n        const row = actions.get(id)\n        if (!row) throw new Error(`Action not found: ${id}`)\n\n        const now = new Date().toISOString()\n        row.status = 'active'\n        row.started_at = now\n        row.updated_at = now\n\n        return instance.getAction(id) as Promise<import('./types.js').Action>\n      },\n\n      async completeAction(id, result) {\n        const row = actions.get(id)\n        if (!row) throw new Error(`Action not found: ${id}`)\n\n        const now = new Date().toISOString()\n        row.status = 'completed'\n        row.completed_at = now\n        row.updated_at = now\n        row.result = result\n\n        return instance.getAction(id) as Promise<import('./types.js').Action>\n      },\n\n      async failAction(id, error) {\n        const row = actions.get(id)\n        if (!row) throw new Error(`Action not found: ${id}`)\n\n        const now = new Date().toISOString()\n        row.status = 'failed'\n        row.completed_at = now\n        row.updated_at = now\n        row.error = error\n\n        return instance.getAction(id) as Promise<import('./types.js').Action>\n      },\n\n      async cancelAction(id) {\n        const row = actions.get(id)\n        if (!row) throw new Error(`Action not found: ${id}`)\n\n        const now = new Date().toISOString()\n        row.status = 'cancelled'\n        row.completed_at = now\n        row.updated_at = now\n\n        return instance.getAction(id) as Promise<import('./types.js').Action>\n      },\n\n      // Artifact operations\n      async storeArtifact(options) {\n        const now = new Date().toISOString()\n        const expiresAt = options.ttl\n          ? new Date(Date.now() + options.ttl).toISOString()\n          : undefined\n\n        artifacts.set(options.key, {\n          key: options.key,\n          type: options.type,\n          source: options.source,\n          source_hash: options.sourceHash,\n          created_at: now,\n          expires_at: expiresAt,\n          content: options.content,\n          metadata: options.metadata,\n        })\n\n        return {\n          key: options.key,\n          type: options.type,\n          source: options.source,\n          sourceHash: options.sourceHash,\n          createdAt: new Date(now),\n          expiresAt: expiresAt ? new Date(expiresAt) : undefined,\n          content: options.content,\n          metadata: options.metadata,\n        }\n      },\n\n      async getArtifact(key) {\n        const row = artifacts.get(key)\n        if (!row) return null\n\n        if (row.expires_at && new Date(row.expires_at as string) < new Date()) {\n          artifacts.delete(key)\n          return null\n        }\n\n        return {\n          key: row.key as string,\n          type: row.type as ArtifactType,\n          source: row.source as string,\n          sourceHash: row.source_hash as string,\n          createdAt: new Date(row.created_at as string),\n          expiresAt: row.expires_at ? new Date(row.expires_at as string) : undefined,\n          content: row.content,\n          metadata: row.metadata as Record<string, unknown> | undefined,\n        } as Artifact\n      },\n\n      async getArtifactBySource(source, type) {\n        for (const row of artifacts.values()) {\n          if (row.source === source && row.type === type) {\n            return instance.getArtifact(row.key as string)\n          }\n        }\n        return null\n      },\n\n      async deleteArtifact(key) {\n        return artifacts.delete(key)\n      },\n\n      async cleanExpiredArtifacts() {\n        const now = new Date()\n        let count = 0\n\n        for (const [key, row] of artifacts) {\n          if (row.expires_at && new Date(row.expires_at as string) < now) {\n            artifacts.delete(key)\n            count++\n          }\n        }\n\n        return count\n      },\n\n      // Database info\n      getDatabaseSize() {\n        return 0\n      },\n\n      getNamespace() {\n        return name\n      },\n    }\n\n    return instance\n  }\n\n  return {\n    idFromName(name: string): DurableObjectId {\n      return { toString: () => name, name }\n    },\n\n    idFromString(id: string): DurableObjectId {\n      return { toString: () => id }\n    },\n\n    newUniqueId(): DurableObjectId {\n      const id = `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 9)}`\n      return { toString: () => id }\n    },\n\n    get(id: DurableObjectId): DurableObjectStub<MDXDatabaseRPC> {\n      const name = id.name ?? id.toString()\n\n      if (!instances.has(name)) {\n        instances.set(name, createInMemoryInstance(name))\n      }\n\n      const instance = instances.get(name)!\n\n      return {\n        ...instance,\n        id,\n        name,\n      } as DurableObjectStub<MDXDatabaseRPC>\n    },\n  }\n}\n","/**\n * @mdxdb/sqlite - Cloudflare Durable Objects SQLite adapter for mdxdb\n *\n * A Durable Objects-based implementation with:\n * - Things: Graph nodes following ai-database conventions\n * - Relationships: Graph edges between things\n * - Search: Chunked content with vector embeddings for semantic search\n * - Events: Immutable event log\n * - Actions: Durable action tracking\n * - Artifacts: Cached compiled content\n *\n * Uses Workers RPC for direct method calls on Durable Object stubs.\n * Each namespace gets its own Durable Object with isolated SQLite storage.\n *\n * @example Workers\n * ```ts\n * import { createMDXClient, MDXDatabase } from '@mdxdb/sqlite'\n *\n * // Export the Durable Object for wrangler.toml\n * export { MDXDatabase }\n *\n * export default {\n *   async fetch(request: Request, env: Env) {\n *     const client = createMDXClient({\n *       namespace: 'example.com',\n *       binding: env.MDXDB,\n *     })\n *\n *     const posts = await client.list({ type: 'Post' })\n *     return Response.json(posts)\n *   }\n * }\n * ```\n *\n * @example Node.js with miniflare\n * ```ts\n * import { createMiniflareClient } from '@mdxdb/sqlite'\n *\n * const client = await createMiniflareClient({\n *   namespace: 'example.com',\n *   persistPath: './.data',\n * })\n *\n * await client.create({\n *   ns: 'example.com',\n *   type: 'Post',\n *   data: { title: 'Hello World' }\n * })\n * ```\n *\n * @example In-memory testing\n * ```ts\n * import { createInMemoryBinding, MDXClient } from '@mdxdb/sqlite'\n *\n * const binding = createInMemoryBinding()\n * const id = binding.idFromName('test.local')\n * const stub = binding.get(id)\n * const client = new MDXClient(stub, 'test.local')\n *\n * // Use in tests\n * const thing = await client.create({ ... })\n * ```\n *\n * @packageDocumentation\n */\n\nexport const name = '@mdxdb/sqlite'\n\n// NOTE: MDXDatabase is NOT exported from the main entry point because it imports\n// cloudflare:workers which breaks Node.js imports. For Workers, import directly:\n//   import { MDXDatabase } from '@mdxdb/sqlite/durable-object'\n//\n// For Node.js usage with miniflare, use createMiniflareClient or createInMemoryBinding.\n\n// Client for calling DO methods via RPC\nexport { MDXClient, createMDXClient, createMiniflareClient } from './client.js'\n\n// Miniflare integration for Node.js\nexport {\n  createMiniflareBinding,\n  createInMemoryBinding,\n  disposeMiniflare,\n} from './miniflare.js'\n\n// Sync manager for forwarding mutations\nexport { SyncManager, createSyncManager } from './sync.js'\nexport type { SyncTarget, MutationType, MutationEvent, SyncResult } from './sync.js'\n\n// Types\n// Note: Cloudflare types (SqlStorageCursor, SqlStorage, DurableObjectState,\n// DurableObjectId, DurableObjectNamespace, DurableObjectStub) are provided\n// globally by @cloudflare/workers-types. They're not re-exported from here\n// to avoid issues with cloudflare:workers module resolution.\nexport type {\n  // Entity types\n  Thing,\n  Relationship,\n  Event,\n  Action,\n  Artifact,\n  ActionStatus,\n  ArtifactType,\n\n  // Query/operation options\n  QueryOptions,\n  SearchOptions,\n  CreateOptions,\n  UpdateOptions,\n  RelateOptions,\n  CreateEventOptions,\n  CreateActionOptions,\n  StoreArtifactOptions,\n  EventQueryOptions,\n  ActionQueryOptions,\n  VectorSearchOptions,\n  VectorSearchResult,\n\n  // RPC interface\n  MDXDatabaseRPC,\n\n  // Environment\n  Env,\n\n  // Config\n  MDXClientConfig,\n\n  // Internal row types\n  ThingRow,\n  RelationshipRow,\n  SearchRow,\n  EventRow,\n  ActionRow,\n  ArtifactRow,\n  Chunk,\n} from './types.js'\n","/**\n * MDXDatabase Client\n *\n * Client for interacting with MDXDatabase Durable Objects.\n * Works in both Cloudflare Workers (via DO binding) and Node.js (via miniflare).\n *\n * @example Workers\n * ```ts\n * // In a Cloudflare Worker\n * const client = createMDXClient({\n *   namespace: 'example.com',\n *   binding: env.MDXDB,\n * })\n *\n * const post = await client.create({\n *   ns: 'example.com',\n *   type: 'Post',\n *   data: { title: 'Hello World' }\n * })\n * ```\n *\n * @example Node.js with miniflare\n * ```ts\n * // In Node.js (uses miniflare automatically)\n * const client = await createMDXClient({\n *   namespace: 'example.com',\n *   miniflare: true,\n *   persistPath: './.data',\n * })\n *\n * const posts = await client.list({ type: 'Post' })\n * ```\n *\n * @packageDocumentation\n */\n\n// DurableObjectNamespace and DurableObjectStub are global types from @cloudflare/workers-types\nimport type {\n  MDXClientConfig,\n  MDXDatabaseRPC,\n  Thing,\n  Relationship,\n  Event,\n  Action,\n  Artifact,\n  QueryOptions,\n  SearchOptions,\n  CreateOptions,\n  UpdateOptions,\n  RelateOptions,\n  CreateEventOptions,\n  CreateActionOptions,\n  StoreArtifactOptions,\n  EventQueryOptions,\n  ActionQueryOptions,\n  VectorSearchOptions,\n  VectorSearchResult,\n  ArtifactType,\n} from './types.js'\n\n/**\n * MDXDatabase Client\n *\n * Provides a typed interface to the MDXDatabase Durable Object.\n * Methods are called directly via Workers RPC.\n */\nexport class MDXClient implements MDXDatabaseRPC {\n  private stub: DurableObjectStub<MDXDatabaseRPC>\n  private embedFn?: (text: string) => Promise<number[]>\n  private _namespace: string\n\n  constructor(\n    stub: DurableObjectStub<MDXDatabaseRPC>,\n    namespace: string,\n    embedFn?: (text: string) => Promise<number[]>\n  ) {\n    this.stub = stub\n    this._namespace = namespace\n    this.embedFn = embedFn\n  }\n\n  // ===========================================================================\n  // Thing Operations\n  // ===========================================================================\n\n  async list(options?: QueryOptions): Promise<Thing[]> {\n    return this.stub.list(options)\n  }\n\n  // Interface methods (matching MDXDatabaseRPC)\n  async read(url: string): Promise<Thing | null> {\n    return this.stub.read(url)\n  }\n\n  async readById(type: string, id: string): Promise<Thing | null> {\n    return this.stub.readById(type, id)\n  }\n\n  // Backwards-compatible aliases\n  async get(url: string): Promise<Thing | null> {\n    return this.read(url)\n  }\n\n  async getById(type: string, id: string): Promise<Thing | null> {\n    return this.readById(type, id)\n  }\n\n  async create<TData = Record<string, unknown>>(options: CreateOptions<TData>): Promise<Thing<TData>> {\n    const thing = await this.stub.create(options as CreateOptions)\n\n    // If we have an embed function, generate embeddings for the content\n    if (this.embedFn) {\n      await this.generateEmbeddings(thing.url)\n    }\n\n    return thing as Thing<TData>\n  }\n\n  async update<TData = Record<string, unknown>>(url: string, options: UpdateOptions<TData>): Promise<Thing<TData>> {\n    const thing = await this.stub.update(url, options as UpdateOptions)\n\n    // If we have an embed function, regenerate embeddings\n    if (this.embedFn) {\n      await this.generateEmbeddings(url)\n    }\n\n    return thing as Thing<TData>\n  }\n\n  async upsert<TData = Record<string, unknown>>(options: CreateOptions<TData>): Promise<Thing<TData>> {\n    const thing = await this.stub.upsert(options as CreateOptions)\n\n    // If we have an embed function, generate embeddings\n    if (this.embedFn) {\n      await this.generateEmbeddings(thing.url)\n    }\n\n    return thing as Thing<TData>\n  }\n\n  // Interface method (matching MDXDatabaseRPC)\n  async remove(url: string): Promise<boolean> {\n    return this.stub.remove(url)\n  }\n\n  // Backwards-compatible alias\n  async delete(url: string): Promise<boolean> {\n    return this.remove(url)\n  }\n\n  async search(options: SearchOptions): Promise<Thing[]> {\n    // If we have embeddings, try vector search\n    if (this.embedFn) {\n      const embedding = await this.embedFn(options.query)\n      const results = await this.vectorSearchWithEmbedding(embedding, options)\n      if (results.length > 0) {\n        // Get things from URLs\n        const things: Thing[] = []\n        const seen = new Set<string>()\n        for (const result of results) {\n          if (!seen.has(result.thingUrl)) {\n            seen.add(result.thingUrl)\n            const thing = await this.get(result.thingUrl)\n            if (thing) things.push(thing)\n          }\n        }\n        return things\n      }\n    }\n\n    // Fallback to text search\n    return this.stub.search(options)\n  }\n\n  // ===========================================================================\n  // Relationship Operations\n  // ===========================================================================\n\n  async relate<TData = Record<string, unknown>>(options: RelateOptions<TData>): Promise<Relationship<TData>> {\n    return this.stub.relate(options as RelateOptions) as Promise<Relationship<TData>>\n  }\n\n  async unrelate(from: string, type: string, to: string): Promise<boolean> {\n    return this.stub.unrelate(from, type, to)\n  }\n\n  async related(url: string, type?: string, direction?: 'from' | 'to' | 'both'): Promise<Thing[]> {\n    return this.stub.related(url, type, direction)\n  }\n\n  async relationships(url: string, type?: string, direction?: 'from' | 'to' | 'both'): Promise<Relationship[]> {\n    return this.stub.relationships(url, type, direction)\n  }\n\n  // ===========================================================================\n  // Vector Search Operations\n  // ===========================================================================\n\n  async vectorSearch(options: VectorSearchOptions): Promise<VectorSearchResult[]> {\n    // If embedding is provided directly, use it\n    if (options.embedding) {\n      return this.stub.vectorSearch(options)\n    }\n\n    // If query is provided and we have an embed function, generate embedding\n    if (options.query && this.embedFn) {\n      const embedding = await this.embedFn(options.query)\n      return this.stub.vectorSearch({ ...options, embedding })\n    }\n\n    // No embedding and no query - delegate to stub (will return empty or error)\n    return this.stub.vectorSearch(options)\n  }\n\n  async setEmbedding(thingUrl: string, chunkIndex: number, embedding: number[]): Promise<void> {\n    return this.stub.setEmbedding(thingUrl, chunkIndex, embedding)\n  }\n\n  async upsertEmbeddings(\n    thingUrl: string,\n    embeddings: Array<{ chunkIndex: number; embedding: number[] }>\n  ): Promise<void> {\n    return this.stub.upsertEmbeddings(thingUrl, embeddings)\n  }\n\n  async deleteVectors(thingUrl: string): Promise<void> {\n    return this.stub.deleteVectors(thingUrl)\n  }\n\n  /**\n   * Generate embeddings for a thing's search chunks\n   */\n  private async generateEmbeddings(thingUrl: string): Promise<void> {\n    if (!this.embedFn) return\n\n    // Get the thing to find its chunks\n    const thing = await this.get(thingUrl)\n    if (!thing) return\n\n    // Get content to embed\n    const data = thing.data as Record<string, unknown>\n    const content = [\n      data.title,\n      data.name,\n      data.description,\n      data.content,\n      data.text,\n      thing.content,\n    ].filter(v => typeof v === 'string').join('\\n\\n')\n\n    if (!content) return\n\n    // Chunk and embed (simple chunking, matches DO implementation)\n    const chunks = this.chunkContent(content)\n    for (const chunk of chunks) {\n      try {\n        const embedding = await this.embedFn(chunk.content)\n        await this.setEmbedding(thingUrl, chunk.index, embedding)\n      } catch (e) {\n        console.warn(`Failed to embed chunk ${chunk.index} for ${thingUrl}:`, e)\n      }\n    }\n  }\n\n  private chunkContent(content: string, size = 1000, overlap = 200): Array<{ content: string; index: number }> {\n    if (!content || content.length === 0) return []\n\n    const chunks: Array<{ content: string; index: number }> = []\n    let start = 0\n    let index = 0\n\n    while (start < content.length) {\n      let end = Math.min(start + size, content.length)\n\n      if (end < content.length) {\n        const slice = content.slice(start, end)\n        const lastPara = slice.lastIndexOf('\\n\\n')\n        const lastSentence = Math.max(\n          slice.lastIndexOf('. '),\n          slice.lastIndexOf('! '),\n          slice.lastIndexOf('? ')\n        )\n\n        if (lastPara > size * 0.5) {\n          end = start + lastPara + 2\n        } else if (lastSentence > size * 0.5) {\n          end = start + lastSentence + 2\n        }\n      }\n\n      chunks.push({\n        content: content.slice(start, end).trim(),\n        index,\n      })\n\n      start = end - overlap\n      if (start >= content.length - overlap) break\n      index++\n    }\n\n    return chunks\n  }\n\n  /**\n   * Vector search with pre-computed embedding\n   */\n  private async vectorSearchWithEmbedding(\n    queryEmbedding: number[],\n    options: Omit<VectorSearchOptions, 'query'> & { query?: string }\n  ): Promise<VectorSearchResult[]> {\n    // This would need to fetch chunks and compute similarity client-side\n    // since DO SQLite doesn't have vector operations\n    // For now, delegate to stub's implementation\n    return this.stub.vectorSearch({ ...options, query: options.query ?? '' })\n  }\n\n  // ===========================================================================\n  // Event Operations\n  // ===========================================================================\n\n  async track<TData = Record<string, unknown>>(options: CreateEventOptions<TData>): Promise<Event<TData>> {\n    return this.stub.track(options as CreateEventOptions) as Promise<Event<TData>>\n  }\n\n  async getEvent(id: string): Promise<Event | null> {\n    return this.stub.getEvent(id)\n  }\n\n  async queryEvents(options?: EventQueryOptions): Promise<Event[]> {\n    return this.stub.queryEvents(options)\n  }\n\n  // ===========================================================================\n  // Action Operations\n  // ===========================================================================\n\n  async send<TData = Record<string, unknown>>(options: CreateActionOptions<TData>): Promise<Action<TData>> {\n    return this.stub.send(options as CreateActionOptions) as Promise<Action<TData>>\n  }\n\n  async do<TData = Record<string, unknown>>(options: CreateActionOptions<TData>): Promise<Action<TData>> {\n    return this.stub.do(options as CreateActionOptions) as Promise<Action<TData>>\n  }\n\n  async getAction(id: string): Promise<Action | null> {\n    return this.stub.getAction(id)\n  }\n\n  async queryActions(options?: ActionQueryOptions): Promise<Action[]> {\n    return this.stub.queryActions(options)\n  }\n\n  async startAction(id: string): Promise<Action> {\n    return this.stub.startAction(id)\n  }\n\n  async completeAction(id: string, result?: unknown): Promise<Action> {\n    return this.stub.completeAction(id, result)\n  }\n\n  async failAction(id: string, error: string): Promise<Action> {\n    return this.stub.failAction(id, error)\n  }\n\n  async cancelAction(id: string): Promise<Action> {\n    return this.stub.cancelAction(id)\n  }\n\n  // ===========================================================================\n  // Artifact Operations\n  // ===========================================================================\n\n  async storeArtifact<TContent = unknown>(options: StoreArtifactOptions<TContent>): Promise<Artifact<TContent>> {\n    return this.stub.storeArtifact(options) as Promise<Artifact<TContent>>\n  }\n\n  async getArtifact<TContent = unknown>(key: string): Promise<Artifact<TContent> | null> {\n    return this.stub.getArtifact(key) as Promise<Artifact<TContent> | null>\n  }\n\n  async getArtifactBySource(source: string, type: ArtifactType): Promise<Artifact | null> {\n    return this.stub.getArtifactBySource(source, type)\n  }\n\n  async deleteArtifact(key: string): Promise<boolean> {\n    return this.stub.deleteArtifact(key)\n  }\n\n  async cleanExpiredArtifacts(): Promise<number> {\n    return this.stub.cleanExpiredArtifacts()\n  }\n\n  // ===========================================================================\n  // Database Info\n  // ===========================================================================\n\n  getDatabaseSize(): number {\n    return this.stub.getDatabaseSize()\n  }\n\n  getNamespace(): string {\n    return this._namespace\n  }\n}\n\n/**\n * Create an MDXDatabase client for Workers\n *\n * @example\n * ```ts\n * const client = createMDXClient({\n *   namespace: 'example.com',\n *   binding: env.MDXDB,\n * })\n * ```\n */\nexport function createMDXClient(config: MDXClientConfig & { binding: DurableObjectNamespace<MDXDatabaseRPC> }): MDXClient {\n  const id = config.binding.idFromName(config.namespace)\n  const stub = config.binding.get(id)\n  return new MDXClient(stub, config.namespace, config.embedFn)\n}\n\n/**\n * Create an MDXDatabase client for Node.js using miniflare\n *\n * @example\n * ```ts\n * const client = await createMiniflareClient({\n *   namespace: 'example.com',\n *   persistPath: './.data',\n * })\n * ```\n */\nexport async function createMiniflareClient(config: Omit<MDXClientConfig, 'binding'>): Promise<MDXClient> {\n  // Dynamic import to avoid bundling miniflare in Workers\n  const { createMiniflareBinding } = await import('./miniflare.js')\n  const binding = await createMiniflareBinding(config.persistPath)\n  const id = binding.idFromName(config.namespace)\n  const stub = binding.get(id)\n  return new MDXClient(stub, config.namespace, config.embedFn)\n}\n","/**\n * @mdxdb/sqlite Sync\n *\n * Synchronization hooks for forwarding mutations to Vectorize and ClickHouse.\n * Designed to be called from the MDXDatabase Durable Object.\n *\n * Architecture:\n * - MDXDatabase (DO) is the primary source of truth\n * - Mutations are forwarded to Vectorize for vector search\n * - Mutations are forwarded to ClickHouse for analytics\n *\n * @packageDocumentation\n */\n\nimport type { Thing, Relationship, Event, Action, Artifact } from './types.js'\n\n// =============================================================================\n// Sync Target Types\n// =============================================================================\n\n/**\n * Sync target configuration\n */\nexport interface SyncTarget {\n  /** Target name */\n  name: string\n  /** Target type */\n  type: 'vectorize' | 'clickhouse' | 'custom'\n  /** Worker URL for HTTP calls */\n  url?: string\n  /** Service binding for Worker-to-Worker RPC */\n  binding?: {\n    fetch(request: Request): Promise<Response>\n  }\n  /** Whether sync is enabled */\n  enabled: boolean\n  /** Retry configuration */\n  retry?: {\n    maxAttempts?: number\n    backoffMs?: number\n  }\n}\n\n/**\n * Mutation types\n */\nexport type MutationType = 'create' | 'update' | 'delete'\n\n/**\n * Mutation event\n */\nexport interface MutationEvent<T = unknown> {\n  /** Mutation type */\n  type: MutationType\n  /** Entity type (thing, relationship, event, action, artifact) */\n  entity: 'thing' | 'relationship' | 'event' | 'action' | 'artifact'\n  /** Namespace */\n  namespace: string\n  /** Entity URL or ID */\n  id: string\n  /** Entity data (for create/update) */\n  data?: T\n  /** Previous data (for update) */\n  previousData?: T\n  /** Timestamp */\n  timestamp: Date\n}\n\n/**\n * Sync result\n */\nexport interface SyncResult {\n  /** Target name */\n  target: string\n  /** Success status */\n  success: boolean\n  /** Error message if failed */\n  error?: string\n  /** Duration in ms */\n  durationMs: number\n}\n\n// =============================================================================\n// Sync Manager\n// =============================================================================\n\n/**\n * SyncManager handles forwarding mutations to sync targets\n */\nexport class SyncManager {\n  private targets: SyncTarget[] = []\n  private namespace: string\n  private embedFn?: (text: string) => Promise<number[]>\n\n  constructor(\n    namespace: string,\n    options?: {\n      embedFn?: (text: string) => Promise<number[]>\n    }\n  ) {\n    this.namespace = namespace\n    this.embedFn = options?.embedFn\n  }\n\n  /**\n   * Add a sync target\n   */\n  addTarget(target: SyncTarget): void {\n    this.targets.push(target)\n  }\n\n  /**\n   * Remove a sync target\n   */\n  removeTarget(name: string): void {\n    this.targets = this.targets.filter((t) => t.name !== name)\n  }\n\n  /**\n   * Get all sync targets\n   */\n  getTargets(): SyncTarget[] {\n    return [...this.targets]\n  }\n\n  /**\n   * Sync a mutation to all enabled targets\n   */\n  async sync(event: MutationEvent): Promise<SyncResult[]> {\n    const results: SyncResult[] = []\n    const enabledTargets = this.targets.filter((t) => t.enabled)\n\n    await Promise.all(\n      enabledTargets.map(async (target) => {\n        const start = Date.now()\n        try {\n          await this.syncToTarget(target, event)\n          results.push({\n            target: target.name,\n            success: true,\n            durationMs: Date.now() - start,\n          })\n        } catch (error) {\n          results.push({\n            target: target.name,\n            success: false,\n            error: error instanceof Error ? error.message : String(error),\n            durationMs: Date.now() - start,\n          })\n        }\n      })\n    )\n\n    return results\n  }\n\n  /**\n   * Sync to a specific target\n   */\n  private async syncToTarget(target: SyncTarget, event: MutationEvent): Promise<void> {\n    switch (target.type) {\n      case 'vectorize':\n        await this.syncToVectorize(target, event)\n        break\n      case 'clickhouse':\n        await this.syncToClickHouse(target, event)\n        break\n      case 'custom':\n        await this.syncToCustom(target, event)\n        break\n    }\n  }\n\n  /**\n   * Sync to Vectorize\n   */\n  private async syncToVectorize(target: SyncTarget, event: MutationEvent): Promise<void> {\n    // Only sync things to vectorize\n    if (event.entity !== 'thing') return\n\n    const thing = event.data as Thing | undefined\n\n    if (event.type === 'delete') {\n      // Delete vectors for this thing\n      await this.callTarget(target, 'delete', {\n        thingUrls: [event.id],\n      })\n    } else if (thing && this.embedFn) {\n      // Get content to embed\n      const content = this.getThingContent(thing)\n      if (!content) return\n\n      // Chunk and embed\n      const chunks = this.chunkContent(content)\n      const vectors = await Promise.all(\n        chunks.map(async (chunk, index) => ({\n          thingUrl: thing.url,\n          chunkIndex: index,\n          embedding: await this.embedFn!(chunk),\n          content: chunk,\n          type: thing.type,\n        }))\n      )\n\n      // Upsert vectors\n      await this.callTarget(target, 'upsert', vectors)\n    }\n  }\n\n  /**\n   * Sync to ClickHouse\n   */\n  private async syncToClickHouse(target: SyncTarget, event: MutationEvent): Promise<void> {\n    // Map entity to ClickHouse table\n    const tableMap: Record<string, string> = {\n      thing: 'Things',\n      relationship: 'Relationships',\n      event: 'Events',\n      action: 'Actions',\n      artifact: 'Artifacts',\n    }\n\n    const table = tableMap[event.entity]\n    if (!table) return\n\n    if (event.type === 'delete') {\n      // Soft delete in ClickHouse\n      await this.callTarget(target, 'command', {\n        query: `ALTER TABLE ${table} UPDATE event = 'deleted' WHERE url = {url:String}`,\n        params: { url: event.id },\n      })\n    } else {\n      // Insert/update - ClickHouse uses ReplacingMergeTree so just insert\n      const row = this.toClickHouseRow(event.entity, event.data)\n      if (row) {\n        await this.callTarget(target, 'insert', {\n          table,\n          rows: [row],\n        })\n      }\n    }\n  }\n\n  /**\n   * Sync to custom target\n   */\n  private async syncToCustom(target: SyncTarget, event: MutationEvent): Promise<void> {\n    await this.callTarget(target, 'sync', event)\n  }\n\n  /**\n   * Call a sync target\n   */\n  private async callTarget(\n    target: SyncTarget,\n    method: string,\n    params: unknown\n  ): Promise<unknown> {\n    const body = JSON.stringify({ method, params: [params] })\n    const headers = {\n      'Content-Type': 'application/json',\n      'X-MDXDB-Namespace': this.namespace,\n    }\n\n    let response: Response\n\n    if (target.binding) {\n      response = await target.binding.fetch(\n        new Request(`https://internal/${target.type}`, {\n          method: 'POST',\n          headers,\n          body,\n        })\n      )\n    } else if (target.url) {\n      response = await fetch(target.url, {\n        method: 'POST',\n        headers,\n        body,\n      })\n    } else {\n      throw new Error(`No URL or binding configured for target: ${target.name}`)\n    }\n\n    if (!response.ok) {\n      const error = await response.text()\n      throw new Error(`Sync failed: ${error}`)\n    }\n\n    const result = await response.json() as { result?: unknown; error?: string }\n    if (result.error) {\n      throw new Error(result.error)\n    }\n\n    return result.result\n  }\n\n  /**\n   * Get content to embed from a thing\n   */\n  private getThingContent(thing: Thing): string | null {\n    const parts: string[] = []\n    const data = thing.data as Record<string, unknown>\n\n    // Extract text fields\n    for (const field of ['title', 'name', 'description', 'content', 'text', 'body']) {\n      const value = data[field]\n      if (typeof value === 'string' && value.trim()) {\n        parts.push(value)\n      }\n    }\n\n    // Add thing.content if present\n    if (thing.content) {\n      parts.push(thing.content)\n    }\n\n    return parts.length > 0 ? parts.join('\\n\\n') : null\n  }\n\n  /**\n   * Chunk content for embedding\n   */\n  private chunkContent(content: string, size = 1000, overlap = 200): string[] {\n    if (!content || content.length === 0) return []\n\n    const chunks: string[] = []\n    let start = 0\n\n    while (start < content.length) {\n      let end = Math.min(start + size, content.length)\n\n      if (end < content.length) {\n        const slice = content.slice(start, end)\n        const lastPara = slice.lastIndexOf('\\n\\n')\n        const lastSentence = Math.max(\n          slice.lastIndexOf('. '),\n          slice.lastIndexOf('! '),\n          slice.lastIndexOf('? ')\n        )\n\n        if (lastPara > size * 0.5) {\n          end = start + lastPara + 2\n        } else if (lastSentence > size * 0.5) {\n          end = start + lastSentence + 2\n        }\n      }\n\n      chunks.push(content.slice(start, end).trim())\n\n      start = end - overlap\n      if (start >= content.length - overlap) break\n    }\n\n    return chunks\n  }\n\n  /**\n   * Convert entity to ClickHouse row format\n   */\n  private toClickHouseRow(entity: string, data: unknown): Record<string, unknown> | null {\n    if (!data) return null\n\n    const now = new Date().toISOString()\n\n    switch (entity) {\n      case 'thing': {\n        const thing = data as Thing\n        return {\n          url: thing.url,\n          ns: thing.ns,\n          type: thing.type,\n          id: thing.id,\n          branch: 'main',\n          variant: '',\n          version: 1,\n          repo: '',\n          patch: '',\n          commit: '',\n          data: thing.data,\n          content: thing.content ?? '',\n          code: '',\n          meta: thing['@context'] ? { '@context': thing['@context'] } : {},\n          visibility: 'tenant',\n          event: 'synced',\n          ts: now,\n        }\n      }\n      case 'relationship': {\n        const rel = data as Relationship\n        return {\n          ns: this.namespace,\n          from: rel.from,\n          to: rel.to,\n          predicate: rel.type,\n          reverse: '',\n          data: rel.data ?? {},\n          meta: {},\n          visibility: '',\n          event: 'synced',\n          ts: now,\n        }\n      }\n      case 'event': {\n        const evt = data as Event\n        return {\n          ns: this.namespace,\n          actor: evt.source,\n          actorData: {},\n          event: evt.type,\n          object: '',\n          objectData: evt.data,\n          result: '',\n          resultData: {},\n          meta: {\n            correlationId: evt.correlationId,\n            causationId: evt.causationId,\n          },\n          ts: now,\n        }\n      }\n      case 'action': {\n        const action = data as Action\n        return {\n          ns: this.namespace,\n          id: action.id,\n          act: action.action,\n          action: `${action.action}s`,\n          activity: `${action.action}ing`,\n          event: '',\n          actor: action.actor,\n          actorData: {},\n          object: action.object,\n          objectData: {},\n          status: action.status,\n          progress: 0,\n          total: 0,\n          result: action.result ?? {},\n          error: action.error ?? '',\n          data: action.metadata ?? {},\n          meta: {},\n          priority: 5,\n          attempts: 0,\n          maxAttempts: 3,\n          timeout: 0,\n          ttl: 0,\n          batch: '',\n          batchIndex: 0,\n          batchTotal: 0,\n          parent: '',\n          children: [],\n          dependencies: [],\n          scheduledAt: null,\n          startedAt: action.startedAt?.toISOString() ?? null,\n          completedAt: action.completedAt?.toISOString() ?? null,\n          createdAt: action.createdAt.toISOString(),\n          updatedAt: action.updatedAt.toISOString(),\n        }\n      }\n      case 'artifact': {\n        const artifact = data as Artifact\n        return {\n          ns: this.namespace,\n          id: artifact.key,\n          type: artifact.type,\n          thing: '',\n          source: artifact.source,\n          name: '',\n          description: '',\n          path: '',\n          storage: '',\n          content: JSON.stringify(artifact.content),\n          code: '',\n          data: {},\n          meta: artifact.metadata ?? {},\n          contentType: '',\n          encoding: 'utf-8',\n          size: artifact.size ?? 0,\n          hash: artifact.sourceHash,\n          build: '',\n          status: 'success',\n          log: '',\n          expires: artifact.expiresAt?.toISOString() ?? '2999-12-31 23:59:59',\n          event: 'synced',\n          ts: now,\n        }\n      }\n      default:\n        return null\n    }\n  }\n}\n\n/**\n * Create a sync manager with default targets\n */\nexport function createSyncManager(\n  namespace: string,\n  options?: {\n    vectorizeUrl?: string\n    vectorizeBinding?: SyncTarget['binding']\n    clickhouseUrl?: string\n    clickhouseBinding?: SyncTarget['binding']\n    embedFn?: (text: string) => Promise<number[]>\n  }\n): SyncManager {\n  const manager = new SyncManager(namespace, { embedFn: options?.embedFn })\n\n  // Add vectorize target if configured\n  if (options?.vectorizeUrl || options?.vectorizeBinding) {\n    manager.addTarget({\n      name: 'vectorize',\n      type: 'vectorize',\n      url: options.vectorizeUrl,\n      binding: options.vectorizeBinding,\n      enabled: true,\n    })\n  }\n\n  // Add clickhouse target if configured\n  if (options?.clickhouseUrl || options?.clickhouseBinding) {\n    manager.addTarget({\n      name: 'clickhouse',\n      type: 'clickhouse',\n      url: options.clickhouseUrl,\n      binding: options.clickhouseBinding,\n      enabled: true,\n    })\n  }\n\n  return manager\n}\n\n// Re-export types\nexport type { Thing, Relationship, Event, Action, Artifact }\n"],"mappings":"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","names":["name","createMiniflareBinding","name"]}