@axiom-lattice/local-stores 3.1.21 → 3.1.23

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/database.ts","../src/migrations/migration.ts","../src/createLocalStoreConfig.ts","../src/stores/LocalThreadStore.ts","../src/stores/LocalAssistantStore.ts","../src/stores/LocalWorkspaceStore.ts","../src/stores/LocalProjectStore.ts","../src/stores/project-room-schema.ts","../src/stores/LocalProjectRoomStore.ts","../src/stores/LocalProjectMembershipStore.ts","../src/stores/LocalProjectBotMembershipStore.ts","../src/stores/LocalProjectRoomMessageStore.ts","../src/stores/LocalProjectRoomReadStateStore.ts","../src/stores/LocalUserStore.ts","../src/stores/LocalTenantStore.ts","../src/stores/LocalUserTenantLinkStore.ts","../src/stores/LocalDatabaseConfigStore.ts","../src/stores/LocalConnectionStore.ts","../src/stores/LocalMetricsServerConfigStore.ts","../src/stores/LocalMcpServerConfigStore.ts","../src/stores/LocalWorkflowTrackingStore.ts","../src/stores/LocalEvalStore.ts","../src/stores/LocalChannelBindingStore.ts","../src/stores/room-channel-binding-index.ts","../src/stores/LocalChannelInstallationStore.ts","../src/stores/LocalA2AApiKeyStore.ts","../src/stores/LocalOpenAuditStore.ts","../src/stores/LocalThreadMessageQueueStore.ts","../src/stores/LocalSkillStore.ts","../src/stores/LocalScheduleStorage.ts","../src/stores/LocalTaskStore.ts","../src/stores/LocalTaskWorkItemStore.ts","../src/stores/LocalCapabilityBundleStore.ts","../src/stores/InMemoryConversationStore.ts"],"sourcesContent":["/**\n * @axiom-lattice/local-stores\n *\n * Local SQLite-based store implementations for the Axiom Lattice framework.\n * All stores share a single SQLite database file for zero-config persistence.\n *\n * @example\n * ```ts\n * import { createLocalStoreConfig, closeDatabase } from \"@axiom-lattice/local-stores\";\n * import { configureStores } from \"@axiom-lattice/core\";\n *\n * const stores = await createLocalStoreConfig({ dbPath: \"./data/lattice.db\" });\n * const dispose = await configureStores(stores);\n *\n * // On shutdown:\n * await dispose();\n * closeDatabase();\n * ```\n */\n\nexport { initDatabase, getDatabase, closeDatabase, ensureTable, nowISO, parseISO, DatabaseWrapper, StatementWrapper, RunResult } from \"./database\";\nexport type { LocalStoreOptions } from \"./database\";\n\nexport { MigrationManager } from \"./migrations/migration\";\nexport type { Migration } from \"./migrations/migration\";\n\nexport { createLocalStoreConfig } from \"./createLocalStoreConfig\";\nexport type { LocalStoreConfigOptions } from \"./createLocalStoreConfig\";\n\nexport { LocalThreadStore } from \"./stores/LocalThreadStore\";\nexport { LocalAssistantStore } from \"./stores/LocalAssistantStore\";\nexport { LocalWorkspaceStore } from \"./stores/LocalWorkspaceStore\";\nexport { LocalProjectStore } from \"./stores/LocalProjectStore\";\nexport { LocalProjectRoomStore } from \"./stores/LocalProjectRoomStore\";\nexport { LocalProjectMembershipStore, DuplicateProjectMembershipError, ProjectMembershipIdConflictError } from \"./stores/LocalProjectMembershipStore\";\nexport { LocalProjectBotMembershipStore, ProjectBotMembershipIdConflictError } from \"./stores/LocalProjectBotMembershipStore\";\nexport { LocalProjectRoomMessageStore, ProjectRoomMessageIdConflictError, DuplicateProjectRoomMessageIdempotencyKeyError } from \"./stores/LocalProjectRoomMessageStore\";\nexport { LocalProjectRoomReadStateStore } from \"./stores/LocalProjectRoomReadStateStore\";\nexport { LocalUserStore } from \"./stores/LocalUserStore\";\nexport { LocalTenantStore } from \"./stores/LocalTenantStore\";\nexport { LocalUserTenantLinkStore } from \"./stores/LocalUserTenantLinkStore\";\nexport { LocalDatabaseConfigStore } from \"./stores/LocalDatabaseConfigStore\";\nexport { LocalConnectionStore } from \"./stores/LocalConnectionStore\";\nexport { LocalMetricsServerConfigStore } from \"./stores/LocalMetricsServerConfigStore\";\nexport { LocalMcpServerConfigStore } from \"./stores/LocalMcpServerConfigStore\";\nexport { LocalWorkflowTrackingStore } from \"./stores/LocalWorkflowTrackingStore\";\nexport { LocalEvalStore } from \"./stores/LocalEvalStore\";\nexport { LocalChannelBindingStore } from \"./stores/LocalChannelBindingStore\";\nexport { LocalChannelInstallationStore } from \"./stores/LocalChannelInstallationStore\";\nexport { LocalA2AApiKeyStore } from \"./stores/LocalA2AApiKeyStore\";\nexport { LocalThreadMessageQueueStore } from \"./stores/LocalThreadMessageQueueStore\";\nexport { LocalSkillStore } from \"./stores/LocalSkillStore\";\nexport { LocalScheduleStorage } from \"./stores/LocalScheduleStorage\";\nexport { LocalTaskStore } from \"./stores/LocalTaskStore\";\nexport { LocalTaskWorkItemStore } from \"./stores/LocalTaskWorkItemStore\";\nexport { LocalCapabilityBundleStore } from \"./stores/LocalCapabilityBundleStore\";\nexport { InMemoryConversationStore } from \"./stores/InMemoryConversationStore\";\n\nexport * from \"./stores/LocalOpenAuditStore\";\n","/**\n * Shared SQLite database connection for local stores using sql.js (WASM).\n *\n * sql.js is a pure JavaScript/WASM SQLite implementation that requires\n * no native dependencies. The database is persisted to a file on disk.\n *\n * @example\n * ```ts\n * import { initDatabase, closeDatabase } from \"@axiom-lattice/local-stores\";\n *\n * await initDatabase({ dbPath: \"~/.axiom/lattice.db\" });\n * // ... create stores using getDatabase() ...\n * await closeDatabase();\n * ```\n */\n\nimport initSqlJs, { type Database as SqlJsDatabase, type SqlJsStatic, type BindParams } from \"sql.js\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport * as fs from \"fs\";\n\nexport interface LocalStoreOptions {\n /**\n * Path to the SQLite database file.\n * Supports `~` for home directory expansion.\n * @default \"~/.axiom/lattice.db\"\n */\n dbPath?: string;\n}\n\nlet _SQL: SqlJsStatic | null = null;\nlet _db: DatabaseWrapper | null = null;\n\nfunction expandHome(filePath: string): string {\n if (filePath.startsWith(\"~\")) {\n return path.join(os.homedir(), filePath.slice(1));\n }\n return filePath;\n}\n\n/**\n * A thin wrapper around sql.js that provides an API similar to better-sqlite3.\n */\nexport class DatabaseWrapper {\n private db: SqlJsDatabase;\n private dbPath: string;\n\n constructor(sql: SqlJsStatic, dbPath: string) {\n this.dbPath = dbPath;\n if (fs.existsSync(dbPath)) {\n const buffer = fs.readFileSync(dbPath);\n this.db = new sql.Database(buffer);\n } else {\n this.db = new sql.Database();\n }\n }\n\n /**\n * Execute a SQL statement and return the wrapper for chaining (run).\n * Automatically persists changes to disk.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n run(sql: string, ...params: any[]): RunResult {\n this.db.run(sql, params);\n const changes = this.db.getRowsModified();\n this.save();\n return new RunResult(changes);\n }\n\n /**\n * Prepare and execute a query returning all matching rows as objects.\n */\n prepare(sql: string): StatementWrapper {\n return new StatementWrapper(this.db, sql, this);\n }\n\n /**\n * Execute raw SQL (for DDL statements).\n */\n exec(sql: string): void {\n this.db.exec(sql);\n }\n\n /**\n * Persist the database to disk.\n */\n save(): void {\n const data = this.db.export();\n const buffer = Buffer.from(data);\n fs.writeFileSync(this.dbPath, buffer);\n }\n\n /**\n * Close the database.\n */\n close(): void {\n this.db.close();\n }\n\n /**\n * Get the underlying sql.js database instance.\n */\n getRawDb(): SqlJsDatabase {\n return this.db;\n }\n}\n\n/**\n * Wraps a prepared statement with a better-sqlite3-like API.\n */\nexport class StatementWrapper {\n private db: SqlJsDatabase;\n private sql: string;\n private parent: DatabaseWrapper | null;\n\n constructor(db: SqlJsDatabase, sql: string, parent?: DatabaseWrapper) {\n this.db = db;\n this.sql = sql;\n this.parent = parent || null;\n }\n\n /**\n * Execute and return all rows as objects.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n all(...params: any[]): unknown[] {\n const stmt = this.db.prepare(this.sql);\n try {\n if (params.length > 0) {\n stmt.bind(params as BindParams);\n }\n const rows: Record<string, unknown>[] = [];\n while (stmt.step()) {\n rows.push(stmt.getAsObject());\n }\n return rows;\n } finally {\n stmt.free();\n }\n }\n\n /**\n * Execute and return the first row as an object, or undefined.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get(...params: any[]): unknown {\n const stmt = this.db.prepare(this.sql);\n try {\n if (params.length > 0) {\n stmt.bind(params as BindParams);\n }\n if (stmt.step()) {\n return stmt.getAsObject();\n }\n return undefined;\n } finally {\n stmt.free();\n }\n }\n\n /**\n * Execute without returning rows (INSERT/UPDATE/DELETE).\n * Automatically persists changes to disk.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n run(...params: any[]): RunResult {\n this.db.run(this.sql, params as BindParams);\n const changes = this.db.getRowsModified();\n if (this.parent) {\n this.parent.save();\n }\n return new RunResult(changes);\n }\n}\n\n/**\n * Result of a run operation.\n */\nexport class RunResult {\n private modifiedRows: number;\n\n constructor(modifiedRows: number) {\n this.modifiedRows = modifiedRows;\n }\n\n /** Number of rows modified by the last INSERT/UPDATE/DELETE. */\n get changes(): number {\n return this.modifiedRows;\n }\n}\n\n/**\n * Initialize the shared SQLite database.\n * Must be called (and awaited) before using any stores.\n */\nexport async function initDatabase(options: LocalStoreOptions = {}): Promise<DatabaseWrapper> {\n if (_db) return _db;\n\n if (!_SQL) {\n _SQL = await initSqlJs();\n }\n\n const rawPath = options.dbPath || \"~/.axiom/lattice.db\";\n const dbPath = expandHome(rawPath);\n\n // Ensure parent directory exists\n const dir = path.dirname(dbPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n _db = new DatabaseWrapper(_SQL, dbPath);\n _db.exec(\"PRAGMA journal_mode = WAL;\");\n _db.exec(\"PRAGMA foreign_keys = ON;\");\n\n return _db;\n}\n\n/**\n * Get the shared database instance.\n * Must be called after `await initDatabase()`.\n */\nexport function getDatabase(): DatabaseWrapper {\n if (!_db) {\n throw new Error(\"Database not initialized. Call await initDatabase() first.\");\n }\n return _db;\n}\n\n/**\n * Persist and close the database connection.\n */\nexport function closeDatabase(): void {\n if (_db) {\n _db.save();\n _db.close();\n _db = null;\n }\n}\n\n/**\n * Execute a CREATE TABLE IF NOT EXISTS statement.\n * Helper for idempotent schema initialization.\n */\nexport function ensureTable(db: DatabaseWrapper, ddl: string): void {\n db.exec(ddl);\n}\n\n/**\n * ISO timestamp helper — returns current time as ISO string.\n */\nexport function nowISO(): string {\n return new Date().toISOString();\n}\n\n/**\n * Parse an ISO timestamp string back to a Date object.\n */\nexport function parseISO(iso: string): Date {\n return new Date(iso);\n}\n","/**\n * Migration system for SQLite (sql.js) local stores.\n *\n * ## Identity vs Ordering\n *\n * **name = identity** — each migration is uniquely identified by its name\n * within a store. Two stores may use the same name without conflict because\n * the tracking table includes a `store_name` column.\n *\n * **version = ordering** — migrations are applied in ascending version order.\n *\n * ## Usage\n *\n * Each store creates its own MigrationManager with a unique store name:\n *\n * ```ts\n * const mm = new MigrationManager(db, \"lt_threads\");\n * mm.register({ version: 1, name: \"create_table\", up: (db) => { db.exec(DDL); } });\n * mm.register({ version: 2, name: \"add_column_x\", up: (db) => { db.exec(ALTER); } });\n * mm.migrate();\n * ```\n *\n * @remarks\n * - All methods are synchronous (SQLite via sql.js is single-threaded)\n * - Duplicate **names** within the same store are rejected at registration time\n * - Duplicate **versions** are allowed (same positioning, different tables)\n */\n\nimport { DatabaseWrapper } from \"../database\";\n\n/**\n * Migration definition\n */\nexport interface Migration {\n version: number;\n name: string;\n up: (db: DatabaseWrapper) => void;\n down?: (db: DatabaseWrapper) => void;\n}\n\n/**\n * Migration manager — one per store.\n * Each store manages its own independent migration namespace via `storeName`.\n */\nexport class MigrationManager {\n private db: DatabaseWrapper;\n private storeName: string;\n private migrations: Migration[] = [];\n\n constructor(db: DatabaseWrapper, storeName: string) {\n this.db = db;\n this.storeName = storeName;\n this.ensureTrackingTable();\n }\n\n /**\n * Register a migration.\n * Duplicate names within this store are rejected immediately.\n * Duplicate versions are allowed.\n */\n register(migration: Migration): void {\n const existing = this.migrations.find((m) => m.name === migration.name);\n if (existing) {\n throw new Error(\n `[${this.storeName}] Migration name conflict: \"${migration.name}\" v${migration.version} ` +\n `collides with existing registration at v${existing.version}`\n );\n }\n this.migrations.push(migration);\n this.migrations.sort((a, b) => a.version - b.version);\n }\n\n /**\n * Apply all pending migrations in version order.\n */\n migrate(): void {\n const appliedNames = this.getAppliedNames();\n const pending = this.migrations.filter((m) => !appliedNames.has(m.name));\n\n if (pending.length === 0) return;\n\n for (const m of pending) {\n m.up(this.db);\n this.db.run(\n `INSERT INTO lattice_schema_migrations (store_name, name, version, applied_at)\n VALUES (?, ?, ?, ?)`,\n this.storeName, m.name, m.version, new Date().toISOString()\n );\n }\n }\n\n /**\n * Rollback the last-applied migration (highest version) for this store.\n */\n rollback(): void {\n const row = this.db\n .prepare(\n `SELECT name, version FROM lattice_schema_migrations\n WHERE store_name = ? ORDER BY version DESC LIMIT 1`\n )\n .get(this.storeName) as { name: string; version: number } | undefined;\n\n if (!row) {\n throw new Error(`[${this.storeName}] No migrations to rollback`);\n }\n\n const migration = this.migrations.find((m) => m.name === row!.name);\n if (!migration?.down) {\n throw new Error(\n `[${this.storeName}] Migration \"${row!.name}\" (v${row!.version}) has no down migration`\n );\n }\n\n migration.down(this.db);\n this.db.run(\n `DELETE FROM lattice_schema_migrations WHERE store_name = ? AND name = ?`,\n [this.storeName, row!.name]\n );\n }\n\n /**\n * Get the highest applied migration version for this store.\n */\n getCurrentVersion(): number {\n const row = this.db\n .prepare(\n `SELECT COALESCE(MAX(version), 0) AS max FROM lattice_schema_migrations\n WHERE store_name = ?`\n )\n .get(this.storeName) as { max: number } | undefined;\n return row?.max ?? 0;\n }\n\n // ── private ────────────────────────────────────────────────\n\n private ensureTrackingTable(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS lattice_schema_migrations (\n store_name TEXT NOT NULL,\n name TEXT NOT NULL,\n version INTEGER NOT NULL,\n applied_at TEXT NOT NULL,\n PRIMARY KEY (store_name, name)\n )\n `);\n }\n\n private getAppliedNames(): Set<string> {\n const rows = this.db\n .prepare(\n `SELECT name FROM lattice_schema_migrations WHERE store_name = ? ORDER BY version`\n )\n .all(this.storeName) as { name: string }[];\n return new Set(rows.map((r) => r.name));\n }\n}\n","/**\n * createLocalStoreConfig\n *\n * Creates a map of all local SQLite store instances from a single database,\n * ready to pass directly to configureStores().\n *\n * @example\n * ```ts\n * import { createLocalStoreConfig } from \"@axiom-lattice/local-stores\";\n * import { configureStores } from \"@axiom-lattice/core\";\n *\n * const stores = await createLocalStoreConfig({ dbPath: \"~/.axiom/lattice.db\" });\n * await configureStores(stores);\n * ```\n */\n\nimport { initDatabase } from \"./database\";\nimport { SqliteSaver } from \"@langchain/langgraph-checkpoint-sqlite\";\nimport { LocalThreadStore } from \"./stores/LocalThreadStore\";\nimport { LocalAssistantStore } from \"./stores/LocalAssistantStore\";\nimport { LocalWorkspaceStore } from \"./stores/LocalWorkspaceStore\";\nimport { LocalProjectStore } from \"./stores/LocalProjectStore\";\nimport { LocalProjectRoomStore } from \"./stores/LocalProjectRoomStore\";\nimport { LocalProjectMembershipStore } from \"./stores/LocalProjectMembershipStore\";\nimport { LocalProjectBotMembershipStore } from \"./stores/LocalProjectBotMembershipStore\";\nimport { LocalProjectRoomMessageStore } from \"./stores/LocalProjectRoomMessageStore\";\nimport { LocalProjectRoomReadStateStore } from \"./stores/LocalProjectRoomReadStateStore\";\nimport { LocalUserStore } from \"./stores/LocalUserStore\";\nimport { LocalTenantStore } from \"./stores/LocalTenantStore\";\nimport { LocalUserTenantLinkStore } from \"./stores/LocalUserTenantLinkStore\";\nimport { LocalDatabaseConfigStore } from \"./stores/LocalDatabaseConfigStore\";\nimport { LocalConnectionStore } from \"./stores/LocalConnectionStore\";\nimport { LocalMetricsServerConfigStore } from \"./stores/LocalMetricsServerConfigStore\";\nimport { LocalMcpServerConfigStore } from \"./stores/LocalMcpServerConfigStore\";\nimport { LocalWorkflowTrackingStore } from \"./stores/LocalWorkflowTrackingStore\";\nimport { LocalEvalStore } from \"./stores/LocalEvalStore\";\nimport { LocalChannelBindingStore } from \"./stores/LocalChannelBindingStore\";\nimport { LocalChannelInstallationStore } from \"./stores/LocalChannelInstallationStore\";\nimport { LocalA2AApiKeyStore } from \"./stores/LocalA2AApiKeyStore\";\nimport { LocalOpenAuditStore } from \"./stores/LocalOpenAuditStore\";\nimport { LocalThreadMessageQueueStore } from \"./stores/LocalThreadMessageQueueStore\";\nimport { LocalSkillStore } from \"./stores/LocalSkillStore\";\nimport { LocalScheduleStorage } from \"./stores/LocalScheduleStorage\";\nimport { LocalTaskStore } from \"./stores/LocalTaskStore\";\nimport { LocalTaskWorkItemStore } from \"./stores/LocalTaskWorkItemStore\";\nimport { LocalCapabilityBundleStore } from \"./stores/LocalCapabilityBundleStore\";\n\nexport interface LocalStoreConfigOptions {\n /**\n * Path to the SQLite database file.\n * Supports `~` for home directory expansion.\n * @default \"~/.axiom/lattice.db\"\n */\n dbPath?: string;\n}\n\n/**\n * Creates a full set of local (SQLite-backed) stores sharing a single database.\n *\n * @returns An object with all store instances, ready for `configureStores()`.\n *\n * @remarks\n * - The `schedule` key is registered via ScheduleLatticeManager (not StoreLatticeManager).\n * - Call `closeDatabase()` from `@axiom-lattice/local-stores` to gracefully close the connection.\n */\nexport async function createLocalStoreConfig(options: LocalStoreConfigOptions = {}) {\n const dbPath = options.dbPath || \"~/.axiom/lattice.db\";\n const db = await initDatabase({ dbPath });\n\n return {\n thread: new LocalThreadStore(db),\n assistant: new LocalAssistantStore(db),\n workspace: new LocalWorkspaceStore(db),\n project: new LocalProjectStore(db),\n projectRoom: new LocalProjectRoomStore(db),\n projectMembership: new LocalProjectMembershipStore(db),\n projectBotMembership: new LocalProjectBotMembershipStore(db),\n projectRoomMessage: new LocalProjectRoomMessageStore(db),\n projectRoomReadState: new LocalProjectRoomReadStateStore(db),\n user: new LocalUserStore(db),\n tenant: new LocalTenantStore(db),\n userTenantLink: new LocalUserTenantLinkStore(db),\n database: new LocalDatabaseConfigStore(db),\n connection: new LocalConnectionStore(db),\n metrics: new LocalMetricsServerConfigStore(db),\n mcp: new LocalMcpServerConfigStore(db),\n workflowTracking: new LocalWorkflowTrackingStore(db),\n eval: new LocalEvalStore(db),\n channelBinding: new LocalChannelBindingStore(db),\n channelInstallation: new LocalChannelInstallationStore(db),\n a2aApiKey: new LocalA2AApiKeyStore(db),\n openAudit: new LocalOpenAuditStore(db),\n threadMessageQueue: new LocalThreadMessageQueueStore(db),\n skill: new LocalSkillStore(db),\n schedule: new LocalScheduleStorage(db),\n task: new LocalTaskStore(db),\n taskWorkItem: new LocalTaskWorkItemStore(db),\n capabilityBundle: new LocalCapabilityBundleStore(db),\n checkpoint: SqliteSaver.fromConnString(dbPath),\n };\n}\n","/**\n * Local SQLite implementation of ThreadStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n ThreadStore,\n Thread,\n CreateThreadRequest,\n} from \"@axiom-lattice/protocols\";\nimport { nowISO, parseISO } from \"../database\";\nimport { MigrationManager } from \"../migrations/migration\";\n\nconst STORE_NAME = \"lt_threads\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_threads (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n assistant_id TEXT NOT NULL,\n metadata TEXT DEFAULT '{}',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\nCREATE INDEX IF NOT EXISTS idx_lt_threads_assistant ON lt_threads(tenant_id, assistant_id);\n`;\n\ninterface ThreadRow {\n id: string;\n tenant_id: string;\n assistant_id: string;\n metadata: string;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalThreadStore implements ThreadStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n const mm = new MigrationManager(db, STORE_NAME);\n mm.register({\n version: 1,\n name: \"create_lt_threads\",\n up: (d) => { d.exec(DDL); },\n });\n mm.migrate();\n }\n\n async getThreadsByAssistantId(\n tenantId: string,\n assistantId: string,\n metadataFilter?: Record<string, string>,\n ): Promise<Thread[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_threads WHERE tenant_id = ? AND assistant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId, assistantId) as unknown as ThreadRow[];\n\n let threads = rows.map(mapRowToThread);\n\n if (metadataFilter && Object.keys(metadataFilter).length > 0) {\n threads = threads.filter((t) =>\n Object.entries(metadataFilter).every(\n ([key, value]) => t.metadata?.[key] === value,\n ),\n );\n }\n\n return threads;\n }\n\n async getThreadById(tenantId: string, threadId: string): Promise<Thread | undefined> {\n const row = this.db.prepare(\n `SELECT * FROM lt_threads WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, threadId) as unknown as ThreadRow | undefined;\n return row ? mapRowToThread(row) : undefined;\n }\n\n async createThread(\n tenantId: string,\n assistantId: string,\n threadId: string,\n data: CreateThreadRequest,\n ): Promise<Thread> {\n const now = nowISO();\n const metadata = JSON.stringify(data.metadata || {});\n\n this.db.prepare(\n `INSERT INTO lt_threads (id, tenant_id, assistant_id, metadata, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(tenant_id, id) DO UPDATE SET\n assistant_id = excluded.assistant_id,\n metadata = excluded.metadata,\n updated_at = excluded.updated_at`,\n ).run(threadId, tenantId, assistantId, metadata, now, now);\n\n return {\n id: threadId,\n tenantId,\n assistantId,\n metadata: data.metadata || {},\n createdAt: parseISO(now),\n updatedAt: parseISO(now),\n };\n }\n\n async updateThread(\n tenantId: string,\n threadId: string,\n updates: Partial<CreateThreadRequest>,\n ): Promise<Thread | null> {\n const existing = await this.getThreadById(tenantId, threadId);\n if (!existing) return null;\n\n const updatedMetadata = {\n ...existing.metadata,\n ...(updates.metadata || {}),\n };\n const now = nowISO();\n\n this.db.prepare(\n `UPDATE lt_threads SET metadata = ?, updated_at = ? WHERE tenant_id = ? AND id = ?`,\n ).run(JSON.stringify(updatedMetadata), now, tenantId, threadId);\n\n return {\n ...existing,\n metadata: updatedMetadata,\n updatedAt: parseISO(now),\n };\n }\n\n async deleteThread(tenantId: string, threadId: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_threads WHERE tenant_id = ? AND id = ?`,\n ).run(tenantId, threadId);\n return result.changes > 0;\n }\n\n async hasThread(tenantId: string, threadId: string): Promise<boolean> {\n const row = this.db.prepare(\n `SELECT 1 FROM lt_threads WHERE tenant_id = ? AND id = ? LIMIT 1`,\n ).get(tenantId, threadId);\n return row !== undefined;\n }\n}\n\nfunction mapRowToThread(row: ThreadRow): Thread {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n assistantId: row.assistant_id,\n metadata: JSON.parse(row.metadata || \"{}\"),\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","/**\n * Local SQLite implementation of AssistantStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n AssistantStore,\n Assistant,\n CreateAssistantRequest,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_assistants (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n name TEXT NOT NULL,\n description TEXT,\n graph_definition TEXT NOT NULL,\n owner_user_id TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\n`;\n\ninterface AssistantRow {\n id: string;\n tenant_id: string;\n name: string;\n description: string | null;\n graph_definition: string;\n owner_user_id: string | null;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalAssistantStore implements AssistantStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async getAllAssistants(tenantId: string): Promise<Assistant[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_assistants WHERE tenant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId) as unknown as AssistantRow[];\n return rows.map(mapRowToAssistant);\n }\n\n async getAssistantById(tenantId: string, id: string): Promise<Assistant | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_assistants WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as AssistantRow | undefined;\n return row ? mapRowToAssistant(row) : null;\n }\n\n async createAssistant(\n tenantId: string,\n id: string,\n data: CreateAssistantRequest,\n ): Promise<Assistant> {\n const now = nowISO();\n\n this.db.prepare(\n `INSERT INTO lt_assistants (id, tenant_id, name, description, graph_definition, owner_user_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(tenant_id, id) DO UPDATE SET\n name = excluded.name,\n description = excluded.description,\n graph_definition = excluded.graph_definition,\n owner_user_id = excluded.owner_user_id,\n updated_at = excluded.updated_at`,\n ).run(id, tenantId, data.name, data.description || null, JSON.stringify(data.graphDefinition), data.ownerUserId || null, now, now);\n\n return {\n id,\n tenantId,\n name: data.name,\n description: data.description,\n graphDefinition: data.graphDefinition,\n ownerUserId: data.ownerUserId,\n createdAt: parseISO(now),\n updatedAt: parseISO(now),\n };\n }\n\n async updateAssistant(\n tenantId: string,\n id: string,\n updates: Partial<CreateAssistantRequest>,\n ): Promise<Assistant | null> {\n const existing = await this.getAssistantById(tenantId, id);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.name !== undefined) {\n setClauses.push(\"name = ?\");\n values.push(updates.name);\n }\n if (updates.description !== undefined) {\n setClauses.push(\"description = ?\");\n values.push(updates.description || null);\n }\n if (updates.graphDefinition !== undefined) {\n setClauses.push(\"graph_definition = ?\");\n values.push(JSON.stringify(updates.graphDefinition));\n }\n\n if (updates.ownerUserId !== undefined) {\n setClauses.push(\"owner_user_id = ?\");\n values.push(updates.ownerUserId || null);\n }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_assistants SET ${setClauses.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...values);\n\n return this.getAssistantById(tenantId, id);\n }\n\n async deleteAssistant(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_assistants WHERE tenant_id = ? AND id = ?`,\n ).run(tenantId, id);\n return result.changes > 0;\n }\n\n async hasAssistant(tenantId: string, id: string): Promise<boolean> {\n const row = this.db.prepare(\n `SELECT 1 FROM lt_assistants WHERE tenant_id = ? AND id = ? LIMIT 1`,\n ).get(tenantId, id);\n return row !== undefined;\n }\n\n async getByOwner(tenantId: string, userId: string): Promise<Assistant | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_assistants WHERE tenant_id = ? AND owner_user_id = ? LIMIT 1`,\n ).get(tenantId, userId) as unknown as AssistantRow | undefined;\n return row ? mapRowToAssistant(row) : null;\n }\n}\n\nfunction mapRowToAssistant(row: AssistantRow): Assistant {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n description: row.description || undefined,\n graphDefinition: JSON.parse(row.graph_definition),\n ownerUserId: row.owner_user_id || undefined,\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","/**\n * Local SQLite implementation of WorkspaceStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n WorkspaceStore,\n Workspace,\n CreateWorkspaceRequest,\n UpdateWorkspaceRequest,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_workspaces (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n name TEXT NOT NULL,\n description TEXT,\n storage_type TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\n`;\n\ninterface WorkspaceRow {\n id: string;\n tenant_id: string;\n name: string;\n description: string | null;\n storage_type: string;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalWorkspaceStore implements WorkspaceStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async getAllWorkspaces(tenantId: string): Promise<Workspace[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_workspaces WHERE tenant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId) as unknown as WorkspaceRow[];\n return rows.map(mapRowToWorkspace);\n }\n\n async getWorkspaceById(tenantId: string, id: string): Promise<Workspace | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_workspaces WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as WorkspaceRow | undefined;\n return row ? mapRowToWorkspace(row) : null;\n }\n\n async createWorkspace(\n tenantId: string,\n id: string,\n data: CreateWorkspaceRequest,\n ): Promise<Workspace> {\n const now = nowISO();\n\n this.db.prepare(\n `INSERT INTO lt_workspaces (id, tenant_id, name, description, storage_type, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(tenant_id, id) DO UPDATE SET\n name = excluded.name,\n description = excluded.description,\n storage_type = excluded.storage_type,\n updated_at = excluded.updated_at`,\n ).run(id, tenantId, data.name, data.description || null, data.storageType, now, now);\n\n return {\n id,\n tenantId,\n name: data.name,\n description: data.description,\n storageType: data.storageType,\n createdAt: parseISO(now),\n updatedAt: parseISO(now),\n };\n }\n\n async updateWorkspace(\n tenantId: string,\n id: string,\n updates: UpdateWorkspaceRequest,\n ): Promise<Workspace | null> {\n const existing = await this.getWorkspaceById(tenantId, id);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.name !== undefined) {\n setClauses.push(\"name = ?\");\n values.push(updates.name);\n }\n if (updates.description !== undefined) {\n setClauses.push(\"description = ?\");\n values.push(updates.description || null);\n }\n if (updates.storageType !== undefined) {\n setClauses.push(\"storage_type = ?\");\n values.push(updates.storageType);\n }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_workspaces SET ${setClauses.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...values);\n\n return this.getWorkspaceById(tenantId, id);\n }\n\n async deleteWorkspace(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_workspaces WHERE tenant_id = ? AND id = ?`,\n ).run(tenantId, id);\n return result.changes > 0;\n }\n}\n\nfunction mapRowToWorkspace(row: WorkspaceRow): Workspace {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n description: row.description || undefined,\n storageType: row.storage_type as Workspace[\"storageType\"],\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","/**\n * Local SQLite implementation of ProjectStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n ProjectStore,\n Project,\n ProjectFilter,\n CreateProjectRequest,\n UpdateProjectRequest,\n UpdateProjectCapabilityBundlesResult,\n} from \"@axiom-lattice/protocols\";\nimport { assertGenericProjectConfig } from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_projects (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n workspace_id TEXT NOT NULL,\n name TEXT NOT NULL,\n description TEXT,\n config TEXT,\n kind TEXT DEFAULT 'business',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\nCREATE INDEX IF NOT EXISTS idx_lt_projects_workspace ON lt_projects(tenant_id, workspace_id);\n`;\n\ninterface ProjectRow {\n id: string;\n tenant_id: string;\n workspace_id: string;\n name: string;\n description: string | null;\n config: string | null;\n kind: string | null;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalProjectStore implements ProjectStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n this.ensureColumn(\"lt_projects\", \"kind\", \"kind TEXT DEFAULT 'business'\");\n }\n\n async getProjectsByWorkspace(tenantId: string, workspaceId: string, filter?: ProjectFilter): Promise<Project[]> {\n if (filter?.kind !== undefined) {\n const rows = this.db.prepare(\n `SELECT * FROM lt_projects WHERE tenant_id = ? AND workspace_id = ? AND kind = ? ORDER BY created_at DESC`,\n ).all(tenantId, workspaceId, filter.kind) as unknown as ProjectRow[];\n return rows.map(mapRowToProject);\n }\n const rows = this.db.prepare(\n `SELECT * FROM lt_projects WHERE tenant_id = ? AND workspace_id = ? ORDER BY created_at DESC`,\n ).all(tenantId, workspaceId) as unknown as ProjectRow[];\n return rows.map(mapRowToProject);\n }\n\n async getProjectById(tenantId: string, id: string): Promise<Project | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_projects WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as ProjectRow | undefined;\n return row ? mapRowToProject(row) : null;\n }\n\n async createProject(\n tenantId: string,\n workspaceId: string,\n id: string,\n data: CreateProjectRequest,\n ): Promise<Project> {\n assertGenericProjectConfig(data.config);\n const now = nowISO();\n const kind = data.kind || \"business\";\n\n this.db.prepare(\n `INSERT INTO lt_projects (id, tenant_id, workspace_id, name, description, config, kind, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(tenant_id, id) DO UPDATE SET\n workspace_id = excluded.workspace_id,\n name = excluded.name,\n description = excluded.description,\n config = CASE\n WHEN json_type(lt_projects.config, '$.capabilityBundleIds') IS NOT NULL\n THEN json_set(COALESCE(excluded.config, '{}'), '$.capabilityBundleIds', json_extract(lt_projects.config, '$.capabilityBundleIds'))\n ELSE excluded.config\n END,\n kind = excluded.kind,\n updated_at = excluded.updated_at`,\n ).run(id, tenantId, workspaceId, data.name, data.description || null, data.config ? JSON.stringify(data.config) : null, kind, now, now);\n\n return (await this.getProjectById(tenantId, id)) as Project;\n }\n\n async updateProject(\n tenantId: string,\n id: string,\n updates: UpdateProjectRequest,\n ): Promise<Project | null> {\n assertGenericProjectConfig(updates.config);\n const existing = await this.getProjectById(tenantId, id);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.name !== undefined) {\n setClauses.push(\"name = ?\");\n values.push(updates.name);\n }\n if (updates.description !== undefined) {\n setClauses.push(\"description = ?\");\n values.push(updates.description || null);\n }\n if (updates.config !== undefined) {\n setClauses.push(`config = CASE\n WHEN json_type(config, '$.capabilityBundleIds') IS NOT NULL\n THEN json_set(json(?), '$.capabilityBundleIds', json_extract(config, '$.capabilityBundleIds'))\n ELSE ?\n END`);\n const config = JSON.stringify(updates.config ?? {});\n values.push(config, config);\n }\n if (updates.kind !== undefined) {\n setClauses.push(\"kind = ?\");\n values.push(updates.kind);\n }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_projects SET ${setClauses.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...values);\n\n return this.getProjectById(tenantId, id);\n }\n\n async deleteProject(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_projects WHERE tenant_id = ? AND id = ?`,\n ).run(tenantId, id);\n return result.changes > 0;\n }\n\n async updateCapabilityBundleIds(tenantId: string, projectId: string, bundleIds: string[], expectedRevisions: Record<string, string> = {}): Promise<UpdateProjectCapabilityBundlesResult> {\n const now = nowISO();\n const result = this.db.prepare(\n `UPDATE lt_projects\n SET config = json_set(COALESCE(config, '{}'), '$.capabilityBundleIds', json(?)), updated_at = ?\n WHERE tenant_id = ? AND id = ?\n AND NOT EXISTS (\n SELECT 1 FROM json_each(?) AS requested\n WHERE NOT EXISTS (\n SELECT 1 FROM lt_capability_bundles\n WHERE tenant_id = ? AND id = requested.value\n )\n )\n AND NOT EXISTS (\n SELECT 1 FROM json_each(?) AS expected\n WHERE EXISTS (\n SELECT 1 FROM lt_capability_bundles\n WHERE tenant_id = ? AND id = expected.key AND updated_at <> expected.value\n )\n )`,\n ).run(JSON.stringify(bundleIds), now, tenantId, projectId, JSON.stringify(bundleIds), tenantId, JSON.stringify(expectedRevisions), tenantId);\n if (result.changes > 0) {\n const project = await this.getProjectById(tenantId, projectId);\n return project ? { status: \"updated\", project } : { status: \"project_not_found\" };\n }\n const revisionMismatch = this.db.prepare(\n \"SELECT 1 FROM lt_capability_bundles WHERE tenant_id = ? AND id IN (SELECT key FROM json_each(?)) AND updated_at <> (SELECT value FROM json_each(?) WHERE key = lt_capability_bundles.id) LIMIT 1\",\n ).get(tenantId, JSON.stringify(expectedRevisions), JSON.stringify(expectedRevisions));\n if (revisionMismatch) return { status: \"bundle_conflict\" };\n return await this.getProjectById(tenantId, projectId)\n ? { status: \"bundle_not_found\" }\n : { status: \"project_not_found\" };\n }\n\n async isCapabilityBundleReferenced(tenantId: string, bundleId: string): Promise<boolean> {\n const rows = this.db.prepare(\"SELECT config FROM lt_projects WHERE tenant_id = ?\").all(tenantId) as unknown as Array<{ config: string | null }>;\n return rows.some((row) => {\n if (!row.config) return false;\n let config: Record<string, unknown>;\n try {\n config = JSON.parse(row.config) as Record<string, unknown>;\n } catch {\n return false;\n }\n if (config === null || typeof config !== \"object\" || Array.isArray(config)) return false;\n const ids = config.capabilityBundleIds;\n return Array.isArray(ids) && ids.every((id) => typeof id === \"string\") && ids.includes(bundleId);\n });\n }\n\n /** Add a column if it does not exist (SQLite version compatible). */\n private ensureColumn(table: string, column: string, ddl: string): void {\n const cols = this.db.prepare(`PRAGMA table_info(${table})`).all() as unknown as Array<{ name: string }>;\n if (!cols.some((c) => c.name === column)) {\n this.db.exec(`ALTER TABLE ${table} ADD COLUMN ${ddl}`);\n }\n }\n}\n\nfunction mapRowToProject(row: ProjectRow): Project {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n workspaceId: row.workspace_id,\n name: row.name,\n description: row.description || undefined,\n config: row.config ? JSON.parse(row.config) as Record<string, unknown> : undefined,\n kind: (row.kind || \"business\") as Project[\"kind\"],\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","import { DatabaseWrapper } from \"../database\";\n\nconst schemaMarker = Symbol(\"projectRoomSchema\");\ntype SchemaDatabase = DatabaseWrapper & { [schemaMarker]?: boolean };\ntype ColumnRow = { name: unknown; type: unknown; notnull: unknown };\ntype IndexRow = { name: unknown; unique: unknown; partial: unknown };\ntype IndexColumnRow = { name: unknown };\nconst activeTransactions = new WeakSet<DatabaseWrapper>();\nconst migrationName = \"create_project_room_tables\";\nconst migrationTableDdl = `CREATE TABLE IF NOT EXISTS lattice_schema_migrations (\n store_name TEXT NOT NULL, name TEXT NOT NULL, version INTEGER NOT NULL, applied_at TEXT NOT NULL,\n PRIMARY KEY (store_name, name)\n)`;\n\nconst ddl = `\nCREATE TABLE IF NOT EXISTS lt_project_rooms (\n id TEXT NOT NULL, tenant_id TEXT NOT NULL, workspace_id TEXT NOT NULL, project_id TEXT NOT NULL,\n type TEXT NOT NULL CHECK (type = 'main'), name TEXT NOT NULL, created_at TEXT NOT NULL, updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id), UNIQUE (tenant_id, project_id, type)\n);\nCREATE TABLE IF NOT EXISTS lt_project_memberships (\n id TEXT NOT NULL, tenant_id TEXT NOT NULL, project_id TEXT NOT NULL, user_id TEXT NOT NULL,\n role TEXT NOT NULL CHECK (role IN ('owner','admin','member','viewer')),\n status TEXT NOT NULL CHECK (status IN ('active','removed')), joined_at TEXT NOT NULL, updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id), UNIQUE (tenant_id, project_id, user_id)\n);\nCREATE INDEX IF NOT EXISTS idx_lt_project_memberships_project ON lt_project_memberships (tenant_id, project_id);\nCREATE TABLE IF NOT EXISTS lt_project_bot_memberships (\n id TEXT NOT NULL, tenant_id TEXT NOT NULL, workspace_id TEXT NOT NULL, project_id TEXT NOT NULL,\n room_id TEXT NOT NULL, assistant_id TEXT NOT NULL, role TEXT NOT NULL CHECK (role IN ('coordinator','specialist')),\n title TEXT NOT NULL, responsibility TEXT, mention_name TEXT NOT NULL,\n status TEXT NOT NULL CHECK (status IN ('active','paused','removed')), room_thread_id TEXT NOT NULL,\n joined_at TEXT NOT NULL, updated_at TEXT NOT NULL, PRIMARY KEY (tenant_id, id),\n UNIQUE (tenant_id, project_id, assistant_id)\n);\nCREATE UNIQUE INDEX IF NOT EXISTS uq_lt_project_bot_memberships_coordinator\n ON lt_project_bot_memberships (tenant_id, project_id) WHERE role = 'coordinator' AND status IN ('active','paused');\nCREATE UNIQUE INDEX IF NOT EXISTS uq_lt_project_bot_memberships_mention\n ON lt_project_bot_memberships (tenant_id, room_id, mention_name) WHERE status IN ('active','paused');\nCREATE INDEX IF NOT EXISTS idx_lt_project_bot_memberships_project ON lt_project_bot_memberships (tenant_id, project_id);\nCREATE INDEX IF NOT EXISTS idx_lt_project_bot_memberships_room ON lt_project_bot_memberships (tenant_id, room_id);\nCREATE TABLE IF NOT EXISTS lt_project_room_messages (\n id TEXT NOT NULL, tenant_id TEXT NOT NULL, workspace_id TEXT NOT NULL, project_id TEXT NOT NULL, room_id TEXT NOT NULL,\n author TEXT NOT NULL, content TEXT NOT NULL, mentions TEXT NOT NULL DEFAULT '[]', reply_to_message_id TEXT,\n source TEXT NOT NULL CHECK (source IN ('user','agent','task','routine','system')), source_id TEXT,\n idempotency_key TEXT, created_at TEXT NOT NULL, PRIMARY KEY (tenant_id, id)\n);\nCREATE UNIQUE INDEX IF NOT EXISTS uq_lt_project_room_messages_idempotency\n ON lt_project_room_messages (tenant_id, room_id, idempotency_key) WHERE idempotency_key IS NOT NULL;\nCREATE INDEX IF NOT EXISTS idx_lt_project_room_messages_room_created\n ON lt_project_room_messages (tenant_id, room_id, created_at DESC, id DESC);\nCREATE INDEX IF NOT EXISTS idx_lt_project_room_messages_chat_created\n ON lt_project_room_messages (created_at) WHERE source IN ('user','agent');\nCREATE TABLE IF NOT EXISTS lt_project_room_read_states (\n tenant_id TEXT NOT NULL, room_id TEXT NOT NULL, user_id TEXT NOT NULL,\n last_read_at TEXT NOT NULL, updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, room_id, user_id)\n);\nCREATE INDEX IF NOT EXISTS idx_lt_project_room_read_states_user\n ON lt_project_room_read_states (tenant_id, user_id);\n`;\n\nconst tableColumns: Record<string, string[]> = {\n lt_project_rooms: [\"id\", \"tenant_id\", \"workspace_id\", \"project_id\", \"type\", \"name\", \"created_at\", \"updated_at\"],\n lt_project_memberships: [\"id\", \"tenant_id\", \"project_id\", \"user_id\", \"role\", \"status\", \"joined_at\", \"updated_at\"],\n lt_project_bot_memberships: [\"id\", \"tenant_id\", \"workspace_id\", \"project_id\", \"room_id\", \"assistant_id\", \"role\", \"title\", \"responsibility\", \"mention_name\", \"status\", \"room_thread_id\", \"joined_at\", \"updated_at\"],\n lt_project_room_messages: [\"id\", \"tenant_id\", \"workspace_id\", \"project_id\", \"room_id\", \"author\", \"content\", \"mentions\", \"reply_to_message_id\", \"source\", \"source_id\", \"idempotency_key\", \"created_at\"],\n lt_project_room_read_states: [\"tenant_id\", \"room_id\", \"user_id\", \"last_read_at\", \"updated_at\"],\n};\nconst indexes: Record<string, { table: string; columns: string[]; unique: boolean; partial: boolean; sql?: string[] }> = {\n idx_lt_project_memberships_project: { table: \"lt_project_memberships\", columns: [\"tenant_id\", \"project_id\"], unique: false, partial: false },\n uq_lt_project_bot_memberships_coordinator: { table: \"lt_project_bot_memberships\", columns: [\"tenant_id\", \"project_id\"], unique: true, partial: true, sql: [\"role = 'coordinator'\", \"status in ('active','paused')\"] },\n uq_lt_project_bot_memberships_mention: { table: \"lt_project_bot_memberships\", columns: [\"tenant_id\", \"room_id\", \"mention_name\"], unique: true, partial: true, sql: [\"status in ('active','paused')\"] },\n idx_lt_project_bot_memberships_project: { table: \"lt_project_bot_memberships\", columns: [\"tenant_id\", \"project_id\"], unique: false, partial: false },\n idx_lt_project_bot_memberships_room: { table: \"lt_project_bot_memberships\", columns: [\"tenant_id\", \"room_id\"], unique: false, partial: false },\n uq_lt_project_room_messages_idempotency: { table: \"lt_project_room_messages\", columns: [\"tenant_id\", \"room_id\", \"idempotency_key\"], unique: true, partial: true, sql: [\"idempotency_key is not null\"] },\n idx_lt_project_room_messages_room_created: { table: \"lt_project_room_messages\", columns: [\"tenant_id\", \"room_id\", \"created_at\", \"id\"], unique: false, partial: false, sql: [\"created_at desc\", \"id desc\"] },\n idx_lt_project_room_read_states_user: { table: \"lt_project_room_read_states\", columns: [\"tenant_id\", \"user_id\"], unique: false, partial: false },\n};\nconst uniqueConstraints: Record<string, string[][]> = {\n lt_project_rooms: [[\"tenant_id\", \"id\"], [\"tenant_id\", \"project_id\", \"type\"]],\n lt_project_memberships: [[\"tenant_id\", \"id\"], [\"tenant_id\", \"project_id\", \"user_id\"]],\n lt_project_bot_memberships: [[\"tenant_id\", \"id\"], [\"tenant_id\", \"project_id\", \"assistant_id\"]],\n lt_project_room_messages: [[\"tenant_id\", \"id\"]],\n lt_project_room_read_states: [[\"tenant_id\", \"room_id\", \"user_id\"]],\n};\nconst checkConstraints: Record<string, Array<{ name: string; fragment: string }>> = {\n lt_project_rooms: [{ name: \"type\", fragment: \"type='main'\" }],\n lt_project_memberships: [\n { name: \"role\", fragment: \"role in ('owner','admin','member','viewer')\" },\n { name: \"status\", fragment: \"status in ('active','removed')\" },\n ],\n lt_project_bot_memberships: [\n { name: \"role\", fragment: \"role in ('coordinator','specialist')\" },\n { name: \"status\", fragment: \"status in ('active','paused','removed')\" },\n ],\n lt_project_room_messages: [{ name: \"source\", fragment: \"source in ('user','agent','task','routine','system')\" }],\n lt_project_room_read_states: [],\n};\n\nfunction rows(db: DatabaseWrapper, sql: string): Record<string, unknown>[] {\n const result = db.getRawDb().exec(sql);\n if (!result[0]) return [];\n return result[0].values.map((values) => Object.fromEntries(result[0].columns.map((column, index) => [column, values[index]])));\n}\n\nfunction normalizeSql(value: string): string {\n return value.toLowerCase()\n .replace(/[\"`]/g, \"\")\n .replace(/\\[|\\]/g, \"\")\n .replace(/\\s+/g, \" \")\n .replace(/\\s*([=,])\\s*/g, \"$1\")\n .replace(/[()]/g, \"\")\n .trim();\n}\n\nfunction extractCheckExpressions(sql: string): string[] {\n const checks: string[] = [];\n let quoted = false;\n for (let index = 0; index < sql.length; index += 1) {\n if (sql[index] === \"'\") {\n if (quoted && sql[index + 1] === \"'\") { index += 1; continue; }\n quoted = !quoted;\n continue;\n }\n if (quoted || sql.slice(index, index + 5).toLowerCase() !== \"check\") continue;\n const before = sql[index - 1];\n const after = sql[index + 5];\n if ((before && /[a-z0-9_]/i.test(before)) || (after && /[a-z0-9_]/i.test(after))) continue;\n let opening = index + 5;\n while (/\\s/.test(sql[opening] ?? \"\")) opening += 1;\n if (sql[opening] !== \"(\") continue;\n let depth = 1;\n let expressionQuoted = false;\n for (let cursor = opening + 1; cursor < sql.length; cursor += 1) {\n if (sql[cursor] === \"'\") {\n if (expressionQuoted && sql[cursor + 1] === \"'\") { cursor += 1; continue; }\n expressionQuoted = !expressionQuoted;\n } else if (!expressionQuoted && sql[cursor] === \"(\") {\n depth += 1;\n } else if (!expressionQuoted && sql[cursor] === \")\") {\n depth -= 1;\n if (depth === 0) {\n checks.push(sql.slice(opening + 1, cursor));\n index = cursor;\n break;\n }\n }\n }\n }\n return checks;\n}\n\n/** Validates every table and named index required by project-room version 1. */\nexport function validateProjectRoomSchema(db: DatabaseWrapper): void {\n for (const [table, expected] of Object.entries(tableColumns)) {\n const actual = rows(db, `PRAGMA table_info(${table})`) as ColumnRow[];\n if (actual.map((column) => column.name).join(\",\") !== expected.join(\",\") || actual.some((column) => column.type !== \"TEXT\")\n || actual.some((column) => column.name !== \"responsibility\" && column.name !== \"reply_to_message_id\" && column.name !== \"source_id\" && column.name !== \"idempotency_key\" && column.notnull !== 1)) {\n throw new Error(`Invalid project room schema: table '${table}' has incompatible columns`);\n }\n const uniqueIndexes = (rows(db, `PRAGMA index_list(${table})`) as IndexRow[]).filter((index) => index.unique === 1);\n const signatures = uniqueIndexes.map((index) => (rows(db, `PRAGMA index_info(${String(index.name)})`) as IndexColumnRow[]).map((column) => column.name).join(\",\"));\n if (uniqueConstraints[table].some((constraint) => !signatures.includes(constraint.join(\",\")))) {\n throw new Error(`Invalid project room schema: table '${table}' is missing required uniqueness`);\n }\n const definition = rows(db, `SELECT sql FROM sqlite_master WHERE type = 'table' AND name = '${table}'`)[0]?.sql;\n const checks = typeof definition === \"string\" ? extractCheckExpressions(definition).map(normalizeSql) : [];\n const missingCheck = checkConstraints[table].find((constraint) => !checks.includes(normalizeSql(constraint.fragment)));\n if (missingCheck) {\n throw new Error(`Invalid project room schema: table '${table}' is missing required CHECK constraint '${missingCheck.name}'`);\n }\n }\n for (const [name, expected] of Object.entries(indexes)) {\n const listed = (rows(db, `PRAGMA index_list(${expected.table})`) as IndexRow[]).find((index) => index.name === name);\n const columns = (rows(db, `PRAGMA index_info(${name})`) as IndexColumnRow[]).map((column) => column.name);\n const definition = rows(db, `SELECT sql FROM sqlite_master WHERE type = 'index' AND name = '${name}'`)[0]?.sql;\n const normalized = typeof definition === \"string\" ? definition.toLowerCase().replace(/\\s+/g, \" \") : \"\";\n if (!listed || listed.unique !== Number(expected.unique) || listed.partial !== Number(expected.partial)\n || columns.join(\",\") !== expected.columns.join(\",\") || expected.sql?.some((fragment) => !normalized.includes(fragment))) {\n throw new Error(`Invalid project room schema: index '${name}' is incompatible`);\n }\n }\n}\n\n/** Atomically installs and validates project-room migration version 1. */\nexport function ensureProjectRoomSchema(db: DatabaseWrapper): void {\n const marked = db as SchemaDatabase;\n if (marked[schemaMarker]) return;\n const raw = db.getRawDb();\n const hasMigrationTable = rows(db, \"SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'lattice_schema_migrations'\").length > 0;\n const applied = hasMigrationTable ? rows(db, `SELECT name, version FROM lattice_schema_migrations WHERE store_name = 'project_room' AND name = '${migrationName}'`)[0] : undefined;\n if (applied) {\n if (applied.version !== 1) throw new Error(`Invalid project room schema migration version: ${String(applied.version)}`);\n const hasReadStates = rows(db, \"SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'lt_project_room_read_states'\").length > 0;\n if (!hasReadStates) {\n raw.exec(\"BEGIN IMMEDIATE\");\n try {\n raw.exec(`CREATE TABLE IF NOT EXISTS lt_project_room_read_states (\n tenant_id TEXT NOT NULL, room_id TEXT NOT NULL, user_id TEXT NOT NULL,\n last_read_at TEXT NOT NULL, updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, room_id, user_id)\n ); CREATE INDEX IF NOT EXISTS idx_lt_project_room_read_states_user\n ON lt_project_room_read_states (tenant_id, user_id);`);\n raw.run(\"INSERT INTO lattice_schema_migrations (store_name, name, version, applied_at) VALUES (?, ?, ?, ?)\",\n [\"project_room\", \"create_project_room_read_states\", 2, new Date().toISOString()]);\n raw.exec(\"COMMIT\");\n db.save();\n } catch (error) {\n try { raw.exec(\"ROLLBACK\"); } catch { /* preserve the schema failure */ }\n throw error;\n }\n }\n validateProjectRoomSchema(db);\n const hasRetentionIndex = rows(db, \"SELECT name FROM sqlite_master WHERE type = 'index' AND name = 'idx_lt_project_room_messages_chat_created'\").length > 0;\n if (!hasRetentionIndex) {\n raw.exec(\"BEGIN IMMEDIATE\");\n try {\n raw.exec(\"CREATE INDEX IF NOT EXISTS idx_lt_project_room_messages_chat_created ON lt_project_room_messages (created_at) WHERE source IN ('user','agent');\");\n raw.run(\"INSERT INTO lattice_schema_migrations (store_name, name, version, applied_at) VALUES (?, ?, ?, ?)\",\n [\"project_room\", \"add_project_room_message_retention_index\", 3, new Date().toISOString()]);\n raw.exec(\"COMMIT\");\n db.save();\n } catch (error) {\n try { raw.exec(\"ROLLBACK\"); } catch { /* preserve the schema failure */ }\n throw error;\n }\n }\n marked[schemaMarker] = true;\n return;\n }\n raw.exec(\"BEGIN IMMEDIATE\");\n try {\n raw.exec(migrationTableDdl);\n raw.exec(ddl);\n validateProjectRoomSchema(db);\n raw.run(\"INSERT INTO lattice_schema_migrations (store_name, name, version, applied_at) VALUES (?, ?, ?, ?)\", [\"project_room\", migrationName, 1, new Date().toISOString()]);\n raw.exec(\"COMMIT\");\n } catch (error) {\n try { raw.exec(\"ROLLBACK\"); } catch { /* preserve the schema failure */ }\n throw error;\n }\n db.save();\n marked[schemaMarker] = true;\n}\n\n/** Runs synchronous sql.js work atomically. This helper is intentionally non-reentrant. */\nexport function transaction<T>(db: DatabaseWrapper, work: () => T): T {\n if (activeTransactions.has(db)) throw new Error(\"Nested local store transactions are not supported\");\n activeTransactions.add(db);\n let began = false;\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n began = true;\n const result = work();\n db.exec(\"COMMIT\");\n db.save();\n return result;\n } catch (error) {\n if (began) {\n try { db.exec(\"ROLLBACK\"); } catch { /* preserve the original error */ }\n db.save();\n }\n throw error;\n } finally {\n activeTransactions.delete(db);\n }\n}\n\n/** Executes a write without persisting mid-transaction. */\nexport function write(db: DatabaseWrapper, sql: string, params: Array<string | number | null>): number {\n const raw = db.getRawDb();\n raw.run(sql, params);\n return raw.getRowsModified();\n}\n\nexport function timestamp(previous?: string): string {\n const previousTime = previous === undefined ? Number.NaN : Date.parse(previous);\n const now = Date.now();\n return new Date(Math.max(now, Number.isFinite(previousTime) ? previousTime + 1 : now)).toISOString();\n}\n\nexport function validDate(value: unknown): value is Date {\n return value instanceof Date && !Number.isNaN(value.getTime());\n}\n\nexport function isUniqueError(error: unknown): boolean {\n return error instanceof Error && error.message.includes(\"UNIQUE constraint failed\");\n}\n","import type { ProjectRoom, ProjectRoomStore } from \"@axiom-lattice/protocols\";\nimport { DatabaseWrapper } from \"../database\";\nimport { ensureProjectRoomSchema, timestamp, transaction, validDate, write } from \"./project-room-schema\";\n\ntype Row = { id: unknown; tenant_id: unknown; workspace_id: unknown; project_id: unknown; type: unknown; name: unknown; created_at: unknown; updated_at: unknown };\nconst columns = \"id, tenant_id, workspace_id, project_id, type, name, created_at, updated_at\";\n\nfunction mapRow(row: Row): ProjectRoom {\n const createdAt = typeof row.created_at === \"string\" ? new Date(row.created_at) : undefined;\n const updatedAt = typeof row.updated_at === \"string\" ? new Date(row.updated_at) : undefined;\n if (typeof row.id !== \"string\" || typeof row.tenant_id !== \"string\" || typeof row.workspace_id !== \"string\"\n || typeof row.project_id !== \"string\" || row.type !== \"main\" || typeof row.name !== \"string\"\n || !validDate(createdAt) || !validDate(updatedAt)) throw new Error(\"Invalid project room row\");\n return { id: row.id, tenantId: row.tenant_id, workspaceId: row.workspace_id, projectId: row.project_id,\n type: \"main\", name: row.name, createdAt, updatedAt };\n}\n\n/** Persists canonical project main rooms in local SQLite. */\nexport class LocalProjectRoomStore implements ProjectRoomStore {\n constructor(private readonly db: DatabaseWrapper) { ensureProjectRoomSchema(db); }\n async ensureMainRoom(input: { id: string; tenantId: string; workspaceId: string; projectId: string; name: string }): Promise<ProjectRoom> {\n return transaction(this.db, () => {\n const existing = this.getRow(input.tenantId, input.projectId);\n if (existing) return mapRow(existing);\n const now = timestamp();\n write(this.db, \"INSERT INTO lt_project_rooms (id, tenant_id, workspace_id, project_id, type, name, created_at, updated_at) VALUES (?, ?, ?, ?, 'main', ?, ?, ?)\", [input.id, input.tenantId, input.workspaceId, input.projectId, input.name, now, now]);\n return mapRow(this.getRow(input.tenantId, input.projectId) as Row);\n });\n }\n async getMainRoom(tenantId: string, projectId: string): Promise<ProjectRoom | null> {\n const row = this.getRow(tenantId, projectId);\n return row ? mapRow(row) : null;\n }\n private getRow(tenantId: string, projectId: string): Row | undefined {\n return this.db.prepare(`SELECT ${columns} FROM lt_project_rooms WHERE tenant_id = ? AND project_id = ? AND type = 'main'`).get(tenantId, projectId) as Row | undefined;\n }\n}\n","import type { ProjectHumanRole, ProjectMembership, ProjectMembershipMutationResult, ProjectMembershipStore } from \"@axiom-lattice/protocols\";\nimport { DatabaseWrapper } from \"../database\";\nimport { ensureProjectRoomSchema, isUniqueError, timestamp, transaction, validDate, write } from \"./project-room-schema\";\n\ntype Row = { id: unknown; tenant_id: unknown; project_id: unknown; user_id: unknown; role: unknown; status: unknown; joined_at: unknown; updated_at: unknown };\nconst columns = \"id, tenant_id, project_id, user_id, role, status, joined_at, updated_at\";\n\nexport class DuplicateProjectMembershipError extends Error { constructor() { super(\"Project membership already exists for tenant, project, and user\"); this.name = \"DuplicateProjectMembershipError\"; } }\nexport class ProjectMembershipIdConflictError extends Error { constructor() { super(\"Project membership ID already exists for tenant\"); this.name = \"ProjectMembershipIdConflictError\"; } }\nfunction role(value: unknown): value is ProjectHumanRole { return value === \"owner\" || value === \"admin\" || value === \"member\" || value === \"viewer\"; }\nfunction mapRow(row: Row): ProjectMembership {\n const joinedAt = typeof row.joined_at === \"string\" ? new Date(row.joined_at) : undefined;\n const updatedAt = typeof row.updated_at === \"string\" ? new Date(row.updated_at) : undefined;\n if (typeof row.id !== \"string\" || typeof row.tenant_id !== \"string\" || typeof row.project_id !== \"string\"\n || typeof row.user_id !== \"string\" || !role(row.role) || (row.status !== \"active\" && row.status !== \"removed\")\n || !validDate(joinedAt) || !validDate(updatedAt)) throw new Error(\"Invalid project membership row\");\n return { id: row.id, tenantId: row.tenant_id, projectId: row.project_id, userId: row.user_id,\n role: row.role, status: row.status, joinedAt, updatedAt };\n}\n\n/** Persists human project memberships in local SQLite. */\nexport class LocalProjectMembershipStore implements ProjectMembershipStore {\n constructor(private readonly db: DatabaseWrapper) { ensureProjectRoomSchema(db); }\n async list(tenantId: string, projectId: string): Promise<ProjectMembership[]> { return (this.db.prepare(`SELECT ${columns} FROM lt_project_memberships WHERE tenant_id = ? AND project_id = ? ORDER BY joined_at ASC, id ASC`).all(tenantId, projectId) as Row[]).map(mapRow); }\n async findByUser(tenantId: string, projectId: string, userId: string): Promise<ProjectMembership | null> { const row = this.db.prepare(`SELECT ${columns} FROM lt_project_memberships WHERE tenant_id = ? AND project_id = ? AND user_id = ?`).get(tenantId, projectId, userId) as Row | undefined; return row ? mapRow(row) : null; }\n async create(input: Omit<ProjectMembership, \"joinedAt\" | \"updatedAt\">): Promise<ProjectMembership> {\n return transaction(this.db, () => {\n if (this.byId(input.tenantId, input.id)) throw new ProjectMembershipIdConflictError();\n const now = timestamp();\n try { write(this.db, \"INSERT INTO lt_project_memberships (id, tenant_id, project_id, user_id, role, status, joined_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\", [input.id, input.tenantId, input.projectId, input.userId, input.role, input.status, now, now]); }\n catch (error) { if (isUniqueError(error)) throw this.classifyUnique(input.tenantId, input.id, input.projectId, input.userId); throw error; }\n return mapRow(this.byId(input.tenantId, input.id) as Row);\n });\n }\n async createInitialOwner(input: Omit<ProjectMembership, \"role\" | \"status\" | \"joinedAt\" | \"updatedAt\">): Promise<{ kind: \"created\" | \"existing\"; membership: ProjectMembership } | { kind: \"already_initialized\" }> {\n return transaction(this.db, () => {\n const rows = this.db.prepare(`SELECT ${columns} FROM lt_project_memberships WHERE tenant_id = ? AND project_id = ?`).all(input.tenantId, input.projectId) as Row[];\n if (rows.length > 0) { const existing = rows.map(mapRow).find((item) => item.userId === input.userId && item.role === \"owner\" && item.status === \"active\"); return existing ? { kind: \"existing\", membership: existing } : { kind: \"already_initialized\" }; }\n if (this.byId(input.tenantId, input.id)) throw new ProjectMembershipIdConflictError();\n const now = timestamp();\n try { write(this.db, \"INSERT INTO lt_project_memberships (id, tenant_id, project_id, user_id, role, status, joined_at, updated_at) VALUES (?, ?, ?, ?, 'owner', 'active', ?, ?)\", [input.id, input.tenantId, input.projectId, input.userId, now, now]); }\n catch (error) { if (isUniqueError(error)) throw this.classifyUnique(input.tenantId, input.id, input.projectId, input.userId); throw error; }\n return { kind: \"created\", membership: mapRow(this.byId(input.tenantId, input.id) as Row) };\n });\n }\n async updateRole(input: { tenantId: string; id: string; role: ProjectHumanRole; expectedUpdatedAt: Date }): Promise<ProjectMembershipMutationResult> { return this.mutate(input.tenantId, input.id, input.expectedUpdatedAt, input.role, false); }\n async remove(input: { tenantId: string; id: string; expectedUpdatedAt: Date }): Promise<ProjectMembershipMutationResult> { return this.mutate(input.tenantId, input.id, input.expectedUpdatedAt, undefined, true); }\n private mutate(tenantId: string, id: string, expected: Date, nextRole: ProjectHumanRole, remove: false): ProjectMembershipMutationResult;\n private mutate(tenantId: string, id: string, expected: Date, nextRole: undefined, remove: true): ProjectMembershipMutationResult;\n private mutate(tenantId: string, id: string, expected: Date, nextRole: ProjectHumanRole | undefined, remove: boolean): ProjectMembershipMutationResult {\n return transaction(this.db, () => {\n const row = this.byId(tenantId, id); if (!row) return { kind: \"not_found\" };\n const current = mapRow(row); if (!validDate(expected) || current.updatedAt.getTime() !== expected.getTime()) return { kind: \"conflict\" };\n if (current.role === \"owner\" && current.status === \"active\" && (remove || nextRole !== \"owner\")) {\n const other = this.db.prepare(\"SELECT 1 FROM lt_project_memberships WHERE tenant_id = ? AND project_id = ? AND id <> ? AND role = 'owner' AND status = 'active'\").get(tenantId, current.projectId, id);\n if (!other) return { kind: \"last_owner\" };\n }\n const updatedAt = timestamp(row.updated_at as string);\n const changes = remove\n ? write(this.db, \"UPDATE lt_project_memberships SET status = 'removed', updated_at = ? WHERE tenant_id = ? AND id = ? AND updated_at = ?\", [updatedAt, tenantId, id, row.updated_at as string])\n : write(this.db, \"UPDATE lt_project_memberships SET role = ?, updated_at = ? WHERE tenant_id = ? AND id = ? AND updated_at = ?\", [nextRole as ProjectHumanRole, updatedAt, tenantId, id, row.updated_at as string]);\n if (changes === 0) return { kind: \"conflict\" };\n return { kind: remove ? \"removed\" : \"updated\", membership: mapRow(this.byId(tenantId, id) as Row) };\n });\n }\n private byId(tenantId: string, id: string): Row | undefined { return this.db.prepare(`SELECT ${columns} FROM lt_project_memberships WHERE tenant_id = ? AND id = ?`).get(tenantId, id) as Row | undefined; }\n private classifyUnique(tenantId: string, id: string, projectId: string, userId: string): Error {\n if (this.byId(tenantId, id)) return new ProjectMembershipIdConflictError();\n if (this.db.prepare(\"SELECT 1 FROM lt_project_memberships WHERE tenant_id = ? AND project_id = ? AND user_id = ?\").get(tenantId, projectId, userId)) return new DuplicateProjectMembershipError();\n return new Error(\"Unclassified project membership uniqueness conflict\");\n }\n}\n","import type { ProjectBotMembership, ProjectBotMembershipStatus, ProjectBotMembershipStore, ProjectBotRole } from \"@axiom-lattice/protocols\";\nimport { DatabaseWrapper } from \"../database\";\nimport { ensureProjectRoomSchema, isUniqueError, timestamp, transaction, validDate, write } from \"./project-room-schema\";\n\ntype Row = { id: unknown; tenant_id: unknown; workspace_id: unknown; project_id: unknown; room_id: unknown; assistant_id: unknown; role: unknown; title: unknown; responsibility: unknown; mention_name: unknown; status: unknown; room_thread_id: unknown; joined_at: unknown; updated_at: unknown };\ntype Conflict = \"coordinator_conflict\" | \"mention_conflict\";\nconst columns = \"id, tenant_id, workspace_id, project_id, room_id, assistant_id, role, title, responsibility, mention_name, status, room_thread_id, joined_at, updated_at\";\n\nexport class ProjectBotMembershipIdConflictError extends Error { constructor(tenantId: string, id: string) { super(`Project bot membership ID '${id}' already exists in tenant '${tenantId}'`); this.name = \"ProjectBotMembershipIdConflictError\"; } }\nfunction isRole(value: unknown): value is ProjectBotRole { return value === \"coordinator\" || value === \"specialist\"; }\nfunction isStatus(value: unknown): value is ProjectBotMembershipStatus { return value === \"active\" || value === \"paused\" || value === \"removed\"; }\nfunction mapRow(row: Row): ProjectBotMembership {\n const joinedAt = typeof row.joined_at === \"string\" ? new Date(row.joined_at) : undefined;\n const updatedAt = typeof row.updated_at === \"string\" ? new Date(row.updated_at) : undefined;\n if (typeof row.id !== \"string\" || typeof row.tenant_id !== \"string\" || typeof row.workspace_id !== \"string\"\n || typeof row.project_id !== \"string\" || typeof row.room_id !== \"string\" || typeof row.assistant_id !== \"string\"\n || !isRole(row.role) || typeof row.title !== \"string\" || (row.responsibility !== null && typeof row.responsibility !== \"string\")\n || typeof row.mention_name !== \"string\" || !isStatus(row.status) || typeof row.room_thread_id !== \"string\"\n || !validDate(joinedAt) || !validDate(updatedAt)) throw new Error(\"Invalid project bot membership row\");\n return { id: row.id, tenantId: row.tenant_id, workspaceId: row.workspace_id, projectId: row.project_id,\n roomId: row.room_id, assistantId: row.assistant_id, role: row.role, title: row.title,\n ...(row.responsibility === null ? {} : { responsibility: row.responsibility }), mentionName: row.mention_name,\n status: row.status, roomThreadId: row.room_thread_id, joinedAt, updatedAt };\n}\n\n/** Persists durable project bot roster memberships in local SQLite. */\nexport class LocalProjectBotMembershipStore implements ProjectBotMembershipStore {\n constructor(private readonly db: DatabaseWrapper) { ensureProjectRoomSchema(db); }\n async list(tenantId: string, projectId: string): Promise<ProjectBotMembership[]> { return (this.db.prepare(`SELECT ${columns} FROM lt_project_bot_memberships WHERE tenant_id = ? AND project_id = ? ORDER BY joined_at ASC, id ASC`).all(tenantId, projectId) as Row[]).map(mapRow); }\n async findById(tenantId: string, id: string): Promise<ProjectBotMembership | null> { const row = this.byId(tenantId, id); return row ? mapRow(row) : null; }\n async findByAssistant(tenantId: string, projectId: string, assistantId: string): Promise<ProjectBotMembership | null> { const row = this.db.prepare(`SELECT ${columns} FROM lt_project_bot_memberships WHERE tenant_id = ? AND project_id = ? AND assistant_id = ?`).get(tenantId, projectId, assistantId) as Row | undefined; return row ? mapRow(row) : null; }\n async save(input: Omit<ProjectBotMembership, \"joinedAt\" | \"updatedAt\">): Promise<{ kind: \"created\" | \"updated\" | \"reactivated\"; membership: ProjectBotMembership } | { kind: Conflict }> {\n try {\n return transaction(this.db, () => {\n const existing = this.db.prepare(`SELECT ${columns} FROM lt_project_bot_memberships WHERE tenant_id = ? AND project_id = ? AND assistant_id = ?`).get(input.tenantId, input.projectId, input.assistantId) as Row | undefined;\n if (existing) return this.reactivate(existing, input);\n if (this.byId(input.tenantId, input.id)) throw new ProjectBotMembershipIdConflictError(input.tenantId, input.id);\n const conflict = this.preflight(input.tenantId, input.projectId, input.roomId, input.role, input.mentionName, input.status, input.id);\n if (conflict) return { kind: conflict };\n const now = timestamp();\n try { write(this.db, \"INSERT INTO lt_project_bot_memberships (id, tenant_id, workspace_id, project_id, room_id, assistant_id, role, title, responsibility, mention_name, status, room_thread_id, joined_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", [input.id, input.tenantId, input.workspaceId, input.projectId, input.roomId, input.assistantId, input.role, input.title, input.responsibility ?? null, input.mentionName, input.status, input.roomThreadId, now, now]); }\n catch (error) {\n if (!isUniqueError(error)) throw error;\n if (this.byId(input.tenantId, input.id)) throw new ProjectBotMembershipIdConflictError(input.tenantId, input.id);\n const raced = this.byAssistant(input.tenantId, input.projectId, input.assistantId);\n if (raced) return this.reactivate(raced, input);\n const racedConflict = this.preflight(input.tenantId, input.projectId, input.roomId, input.role, input.mentionName, input.status, input.id);\n if (racedConflict) return { kind: racedConflict };\n throw new Error(\"Unclassified project bot membership uniqueness conflict\");\n }\n return { kind: \"created\", membership: mapRow(this.byId(input.tenantId, input.id) as Row) };\n });\n } catch (error) { const conflict = this.conflict(error); if (conflict) return { kind: conflict }; throw error; }\n }\n async update(input: { tenantId: string; id: string; patch: Partial<Pick<ProjectBotMembership, \"role\" | \"title\" | \"responsibility\" | \"mentionName\" | \"status\">>; expectedUpdatedAt: Date }): Promise<{ kind: \"updated\"; membership: ProjectBotMembership } | { kind: \"not_found\" | \"conflict\" | Conflict }> {\n try {\n return transaction(this.db, () => {\n const row = this.byId(input.tenantId, input.id); if (!row) return { kind: \"not_found\" as const };\n const existing = mapRow(row);\n if (!validDate(input.expectedUpdatedAt) || existing.updatedAt.getTime() !== input.expectedUpdatedAt.getTime()) return { kind: \"conflict\" as const };\n const candidate = { ...existing, ...input.patch };\n const conflict = this.preflight(candidate.tenantId, candidate.projectId, candidate.roomId, candidate.role, candidate.mentionName, candidate.status, candidate.id);\n if (conflict) return { kind: conflict };\n let changes: number;\n try { changes = write(this.db, \"UPDATE lt_project_bot_memberships SET role = ?, title = ?, responsibility = ?, mention_name = ?, status = ?, updated_at = ? WHERE tenant_id = ? AND id = ? AND updated_at = ?\", [candidate.role, candidate.title, candidate.responsibility ?? null, candidate.mentionName, candidate.status, timestamp(row.updated_at as string), input.tenantId, input.id, row.updated_at as string]); }\n catch (error) {\n if (!isUniqueError(error)) throw error;\n const racedConflict = this.preflight(candidate.tenantId, candidate.projectId, candidate.roomId, candidate.role, candidate.mentionName, candidate.status, candidate.id);\n if (racedConflict) return { kind: racedConflict };\n throw new Error(\"Unclassified project bot membership uniqueness conflict\");\n }\n if (changes === 0) return { kind: \"conflict\" as const };\n return { kind: \"updated\" as const, membership: mapRow(this.byId(input.tenantId, input.id) as Row) };\n });\n } catch (error) { const conflict = this.conflict(error); if (conflict) return { kind: conflict }; throw error; }\n }\n private byId(tenantId: string, id: string): Row | undefined { return this.db.prepare(`SELECT ${columns} FROM lt_project_bot_memberships WHERE tenant_id = ? AND id = ?`).get(tenantId, id) as Row | undefined; }\n private byAssistant(tenantId: string, projectId: string, assistantId: string): Row | undefined { return this.db.prepare(`SELECT ${columns} FROM lt_project_bot_memberships WHERE tenant_id = ? AND project_id = ? AND assistant_id = ?`).get(tenantId, projectId, assistantId) as Row | undefined; }\n private reactivate(existing: Row, input: Omit<ProjectBotMembership, \"joinedAt\" | \"updatedAt\">): { kind: \"updated\" | \"reactivated\"; membership: ProjectBotMembership } | { kind: Conflict } {\n const persisted = mapRow(existing);\n const wasRemoved = persisted.status === \"removed\";\n const conflict = this.preflight(input.tenantId, input.projectId, persisted.roomId, input.role, input.mentionName, \"active\", persisted.id);\n if (conflict) return { kind: conflict };\n try { write(this.db, \"UPDATE lt_project_bot_memberships SET role = ?, title = ?, responsibility = ?, mention_name = ?, status = 'active', updated_at = ? WHERE tenant_id = ? AND id = ?\", [input.role, input.title, input.responsibility ?? null, input.mentionName, timestamp(existing.updated_at as string), input.tenantId, persisted.id]); }\n catch (error) {\n if (!isUniqueError(error)) throw error;\n const racedConflict = this.preflight(input.tenantId, input.projectId, persisted.roomId, input.role, input.mentionName, \"active\", persisted.id);\n if (racedConflict) return { kind: racedConflict };\n throw new Error(\"Unclassified project bot membership uniqueness conflict\");\n }\n return { kind: wasRemoved ? \"reactivated\" : \"updated\", membership: mapRow(this.byId(input.tenantId, persisted.id) as Row) };\n }\n private preflight(tenantId: string, projectId: string, roomId: string, role: ProjectBotRole, mentionName: string, status: ProjectBotMembershipStatus, excludeId: string): Conflict | undefined {\n if (status === \"removed\") return undefined;\n if (role === \"coordinator\" && this.db.prepare(\"SELECT 1 FROM lt_project_bot_memberships WHERE tenant_id = ? AND project_id = ? AND id <> ? AND role = 'coordinator' AND status IN ('active', 'paused')\").get(tenantId, projectId, excludeId)) return \"coordinator_conflict\";\n if (this.db.prepare(\"SELECT 1 FROM lt_project_bot_memberships WHERE tenant_id = ? AND room_id = ? AND mention_name = ? AND id <> ? AND status IN ('active', 'paused')\").get(tenantId, roomId, mentionName, excludeId)) return \"mention_conflict\";\n return undefined;\n }\n private conflict(error: unknown): Conflict | undefined {\n if (!isUniqueError(error) || !(error instanceof Error)) return undefined;\n if (error.message.includes(\"tenant_id, lt_project_bot_memberships.project_id\")) return \"coordinator_conflict\";\n if (error.message.includes(\"room_id\") && error.message.includes(\"mention_name\")) return \"mention_conflict\";\n return undefined;\n }\n}\n","import type { ProjectRoomMention, ProjectRoomMessage, ProjectRoomMessageAuthor, ProjectRoomMessageSource, ProjectRoomMessageStore } from \"@axiom-lattice/protocols\";\nimport { DatabaseWrapper } from \"../database\";\nimport { ensureProjectRoomSchema, isUniqueError, timestamp, transaction, validDate, write } from \"./project-room-schema\";\n\ntype Row = { id: unknown; tenant_id: unknown; workspace_id: unknown; project_id: unknown; room_id: unknown; author: unknown; content: unknown; mentions: unknown; reply_to_message_id: unknown; source: unknown; source_id: unknown; idempotency_key: unknown; created_at: unknown };\nconst columns = \"id, tenant_id, workspace_id, project_id, room_id, author, content, mentions, reply_to_message_id, source, source_id, idempotency_key, created_at\";\nexport class ProjectRoomMessageIdConflictError extends Error { constructor(tenantId: string, id: string) { super(`Project room message ID '${id}' already exists in tenant '${tenantId}'`); this.name = \"ProjectRoomMessageIdConflictError\"; } }\nexport class DuplicateProjectRoomMessageIdempotencyKeyError extends Error { constructor(tenantId: string, roomId: string, key: string) { super(`Project room message idempotency key '${key}' already exists in tenant '${tenantId}' room '${roomId}'`); this.name = \"DuplicateProjectRoomMessageIdempotencyKeyError\"; } }\nfunction record(value: unknown): value is Record<string, unknown> { return typeof value === \"object\" && value !== null && !Array.isArray(value); }\nfunction only(value: Record<string, unknown>, keys: string[]): boolean { return Object.keys(value).every((key) => keys.includes(key)); }\nfunction parseJson(value: unknown): unknown { if (typeof value !== \"string\") return undefined; try { return JSON.parse(value) as unknown; } catch { return undefined; } }\nfunction author(value: unknown): ProjectRoomMessageAuthor | undefined { if (!record(value)) return undefined; if (value.type === \"human\" && only(value, [\"type\", \"userId\"]) && typeof value.userId === \"string\") return { type: \"human\", userId: value.userId }; if (value.type === \"bot\" && only(value, [\"type\", \"membershipId\", \"assistantId\"]) && typeof value.membershipId === \"string\" && typeof value.assistantId === \"string\") return { type: \"bot\", membershipId: value.membershipId, assistantId: value.assistantId }; if (value.type === \"system\" && only(value, [\"type\"])) return { type: \"system\" }; return undefined; }\nfunction mention(value: unknown): ProjectRoomMention | undefined { if (!record(value)) return undefined; if (value.type === \"bot\" && only(value, [\"type\", \"membershipId\"]) && typeof value.membershipId === \"string\") return { type: \"bot\", membershipId: value.membershipId }; if (value.type === \"team\" && only(value, [\"type\"])) return { type: \"team\" }; return undefined; }\nfunction source(value: unknown): value is ProjectRoomMessageSource { return value === \"user\" || value === \"agent\" || value === \"task\" || value === \"routine\" || value === \"system\"; }\nfunction mapRow(row: Row): ProjectRoomMessage {\n const mappedAuthor = author(parseJson(row.author)); const content = parseJson(row.content); const rawMentions = parseJson(row.mentions);\n const mappedMentions = Array.isArray(rawMentions) ? rawMentions.map(mention) : undefined;\n const createdAt = typeof row.created_at === \"string\" ? new Date(row.created_at) : undefined;\n if (typeof row.id !== \"string\" || typeof row.tenant_id !== \"string\" || typeof row.workspace_id !== \"string\" || typeof row.project_id !== \"string\" || typeof row.room_id !== \"string\" || !mappedAuthor\n || !record(content) || content.type !== \"text\" || typeof content.text !== \"string\" || !only(content, [\"type\", \"text\"])\n || !mappedMentions || mappedMentions.some((item) => item === undefined) || (row.reply_to_message_id !== null && typeof row.reply_to_message_id !== \"string\")\n || !source(row.source) || (row.source_id !== null && typeof row.source_id !== \"string\") || (row.idempotency_key !== null && typeof row.idempotency_key !== \"string\") || !validDate(createdAt)) throw new Error(\"Invalid project room message row\");\n return { id: row.id, tenantId: row.tenant_id, workspaceId: row.workspace_id, projectId: row.project_id, roomId: row.room_id,\n author: mappedAuthor, content: { type: \"text\", text: content.text }, mentions: mappedMentions as ProjectRoomMention[],\n ...(row.reply_to_message_id === null ? {} : { replyToMessageId: row.reply_to_message_id }), source: row.source,\n ...(row.source_id === null ? {} : { sourceId: row.source_id }), ...(row.idempotency_key === null ? {} : { idempotencyKey: row.idempotency_key }), createdAt };\n}\n\nfunction mapRowsTolerant(\n rows: Row[],\n scope: { tenantId: string; roomId: string },\n): ProjectRoomMessage[] {\n const messages: ProjectRoomMessage[] = [];\n for (const row of rows) {\n try {\n messages.push(mapRow(row));\n } catch (error) {\n console.warn(\"[ProjectRoomMessageStore] Skipping invalid message row\", {\n tenantId: scope.tenantId,\n roomId: scope.roomId,\n rowId: typeof row.id === \"string\" ? row.id : undefined,\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return messages;\n}\n\n/** Persists validated project room messages in local SQLite. */\nexport class LocalProjectRoomMessageStore implements ProjectRoomMessageStore {\n constructor(private readonly db: DatabaseWrapper) { ensureProjectRoomSchema(db); }\n async create(input: Omit<ProjectRoomMessage, \"createdAt\">): Promise<ProjectRoomMessage> { return this.insert(input, false); }\n async createIdempotent(input: Omit<ProjectRoomMessage, \"createdAt\"> & { idempotencyKey: string }): Promise<ProjectRoomMessage> { return this.insert(input, true); }\n async list(input: { tenantId: string; roomId: string; before?: { createdAt: Date; id: string }; limit: number }): Promise<ProjectRoomMessage[]> {\n if (input.before && !validDate(input.before.createdAt)) throw new RangeError(\"Project room message cursor date is invalid\");\n const limit = Math.min(100, Math.max(1, Math.trunc(Number.isFinite(input.limit) ? input.limit : 1)));\n const rows = input.before\n ? this.db.prepare(`SELECT ${columns} FROM lt_project_room_messages WHERE tenant_id = ? AND room_id = ? AND (created_at < ? OR (created_at = ? AND id < ?)) ORDER BY created_at DESC, id DESC LIMIT ?`).all(input.tenantId, input.roomId, input.before.createdAt.toISOString(), input.before.createdAt.toISOString(), input.before.id, limit)\n : this.db.prepare(`SELECT ${columns} FROM lt_project_room_messages WHERE tenant_id = ? AND room_id = ? ORDER BY created_at DESC, id DESC LIMIT ?`).all(input.tenantId, input.roomId, limit);\n return mapRowsTolerant(rows as Row[], { tenantId: input.tenantId, roomId: input.roomId });\n }\n async findById(tenantId: string, id: string): Promise<ProjectRoomMessage | null> { const row = this.byId(tenantId, id); return row ? mapRow(row) : null; }\n async countAfter(input: {\n tenantId: string; roomId: string; after: Date; excludeAuthorUserId?: string;\n }): Promise<number> {\n if (!validDate(input.after)) throw new RangeError(\"Project room message count horizon date is invalid\");\n const rows = this.db.prepare(\n `SELECT author FROM lt_project_room_messages\n WHERE tenant_id = ? AND room_id = ? AND created_at > ?`,\n ).all(input.tenantId, input.roomId, input.after.toISOString()) as Array<{ author: string }>;\n return rows.filter((row) => {\n if (input.excludeAuthorUserId === undefined) return true;\n const parsed = parseJson(row.author);\n return !(record(parsed) && parsed.type === \"human\" && parsed.userId === input.excludeAuthorUserId);\n }).length;\n }\n /**\n * Deletes one bounded batch of chat messages older than a horizon.\n *\n * @param input Exclusive upper time bound and requested batch size (clamped to 1..1000).\n * @returns The number of deleted rows.\n * @remarks Only `source: \"user\" | \"agent\"` rows are eligible; task/system events are retained.\n */\n async deleteChatOlderThan(input: { before: Date; limit: number }): Promise<number> {\n if (!validDate(input.before)) throw new RangeError(\"Project room message retention horizon date is invalid\");\n const limit = Math.min(1_000, Math.max(1, Math.trunc(Number.isFinite(input.limit) ? input.limit : 1)));\n return transaction(this.db, () => write(this.db,\n `DELETE FROM lt_project_room_messages WHERE rowid IN (\n SELECT rowid FROM lt_project_room_messages\n WHERE created_at < ? AND source IN ('user','agent')\n ORDER BY created_at ASC LIMIT ?\n )`,\n [input.before.toISOString(), limit]));\n }\n\n private insert(input: Omit<ProjectRoomMessage, \"createdAt\">, idempotent: boolean): ProjectRoomMessage {\n return transaction(this.db, () => {\n if (idempotent && input.idempotencyKey) { const canonical = this.byKey(input.tenantId, input.roomId, input.idempotencyKey); if (canonical) return mapRow(canonical); }\n if (this.byId(input.tenantId, input.id)) throw new ProjectRoomMessageIdConflictError(input.tenantId, input.id);\n try { write(this.db, \"INSERT INTO lt_project_room_messages (id, tenant_id, workspace_id, project_id, room_id, author, content, mentions, reply_to_message_id, source, source_id, idempotency_key, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", [input.id, input.tenantId, input.workspaceId, input.projectId, input.roomId, JSON.stringify(input.author), JSON.stringify(input.content), JSON.stringify(input.mentions), input.replyToMessageId ?? null, input.source, input.sourceId ?? null, input.idempotencyKey ?? null, timestamp()]); }\n catch (error) {\n if (!isUniqueError(error)) throw error;\n if (this.byId(input.tenantId, input.id)) throw new ProjectRoomMessageIdConflictError(input.tenantId, input.id);\n if (input.idempotencyKey) {\n const canonical = this.byKey(input.tenantId, input.roomId, input.idempotencyKey);\n if (canonical && idempotent) return mapRow(canonical);\n if (canonical) throw new DuplicateProjectRoomMessageIdempotencyKeyError(input.tenantId, input.roomId, input.idempotencyKey);\n }\n throw new Error(\"Unclassified project room message uniqueness conflict\");\n }\n return mapRow(this.byId(input.tenantId, input.id) as Row);\n });\n }\n private byId(tenantId: string, id: string): Row | undefined { return this.db.prepare(`SELECT ${columns} FROM lt_project_room_messages WHERE tenant_id = ? AND id = ?`).get(tenantId, id) as Row | undefined; }\n private byKey(tenantId: string, roomId: string, key: string): Row | undefined { return this.db.prepare(`SELECT ${columns} FROM lt_project_room_messages WHERE tenant_id = ? AND room_id = ? AND idempotency_key = ?`).get(tenantId, roomId, key) as Row | undefined; }\n}\n","import type { ProjectRoomReadState, ProjectRoomReadStateStore } from \"@axiom-lattice/protocols\";\nimport type { DatabaseWrapper } from \"../database\";\nimport { ensureProjectRoomSchema, timestamp, transaction, validDate, write } from \"./project-room-schema\";\n\ntype ReadStateRow = { tenant_id: string; room_id: string; user_id: string; last_read_at: string; updated_at: string };\nconst columns = \"tenant_id, room_id, user_id, last_read_at, updated_at\";\n\nfunction mapRow(row: ReadStateRow): ProjectRoomReadState {\n const lastReadAt = new Date(row.last_read_at);\n const updatedAt = new Date(row.updated_at);\n if (Number.isNaN(lastReadAt.getTime()) || Number.isNaN(updatedAt.getTime())) throw new Error(\"Invalid project room read state row\");\n return { tenantId: row.tenant_id, roomId: row.room_id, userId: row.user_id, lastReadAt, updatedAt };\n}\n\n/** Persists per-user project room read markers in the local SQLite store. */\nexport class LocalProjectRoomReadStateStore implements ProjectRoomReadStateStore {\n /** Creates a store over a managed local database wrapper. */\n constructor(private readonly db: DatabaseWrapper) { ensureProjectRoomSchema(db); }\n\n /** Returns the user's read marker for a room, or null when never reported. */\n async get(tenantId: string, roomId: string, userId: string): Promise<ProjectRoomReadState | null> {\n const row = this.byKey(tenantId, roomId, userId);\n return row ? mapRow(row) : null;\n }\n\n /** Upserts the marker monotonically (an older report never regresses the horizon). */\n async markRead(input: { tenantId: string; roomId: string; userId: string; lastReadAt: Date }): Promise<ProjectRoomReadState> {\n if (!validDate(input.lastReadAt)) throw new RangeError(\"Project room read state lastReadAt is invalid\");\n return transaction(this.db, () => {\n const existing = this.byKey(input.tenantId, input.roomId, input.userId);\n const lastReadAt = existing !== undefined && new Date(existing.last_read_at).getTime() > input.lastReadAt.getTime()\n ? new Date(existing.last_read_at)\n : input.lastReadAt;\n write(this.db,\n `INSERT INTO lt_project_room_read_states (${columns})\n VALUES (?, ?, ?, ?, ?)\n ON CONFLICT (tenant_id, room_id, user_id) DO UPDATE\n SET last_read_at = excluded.last_read_at, updated_at = excluded.updated_at`,\n [input.tenantId, input.roomId, input.userId, lastReadAt.toISOString(), timestamp()]);\n const row = this.byKey(input.tenantId, input.roomId, input.userId) as ReadStateRow;\n return mapRow(row);\n });\n }\n\n private byKey(tenantId: string, roomId: string, userId: string): ReadStateRow | undefined {\n return this.db.prepare(\n `SELECT ${columns} FROM lt_project_room_read_states WHERE tenant_id = ? AND room_id = ? AND user_id = ?`,\n ).get(tenantId, roomId, userId) as ReadStateRow | undefined;\n }\n}\n","/**\n * Local SQLite implementation of UserStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n UserStore,\n User,\n UserStatus,\n CreateUserRequest,\n UpdateUserRequest,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_users (\n id TEXT PRIMARY KEY,\n email TEXT NOT NULL,\n name TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n metadata TEXT DEFAULT '{}',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_lt_users_email ON lt_users(email);\n`;\n\ninterface UserRow {\n id: string;\n email: string;\n name: string;\n status: string;\n metadata: string;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalUserStore implements UserStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async getAllUsers(): Promise<User[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_users ORDER BY created_at DESC`,\n ).all() as unknown as UserRow[];\n return rows.map(mapRowToUser);\n }\n\n async getUserById(id: string): Promise<User | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_users WHERE id = ?`,\n ).get(id) as unknown as UserRow | undefined;\n return row ? mapRowToUser(row) : null;\n }\n\n async getUserByEmail(email: string): Promise<User | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_users WHERE email = ?`,\n ).get(email) as unknown as UserRow | undefined;\n return row ? mapRowToUser(row) : null;\n }\n\n async createUser(id: string, data: CreateUserRequest): Promise<User> {\n const now = nowISO();\n const status = data.status || \"pending\";\n const metadata = JSON.stringify(data.metadata || {});\n\n this.db.prepare(\n `INSERT INTO lt_users (id, email, name, status, metadata, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n email = excluded.email,\n name = excluded.name,\n status = excluded.status,\n metadata = excluded.metadata,\n updated_at = excluded.updated_at`,\n ).run(id, data.email, data.name, status, metadata, now, now);\n\n return {\n id,\n email: data.email,\n name: data.name,\n status,\n metadata: data.metadata,\n createdAt: parseISO(now),\n updatedAt: parseISO(now),\n };\n }\n\n async updateUser(id: string, updates: UpdateUserRequest): Promise<User | null> {\n const existing = await this.getUserById(id);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.email !== undefined) { setClauses.push(\"email = ?\"); values.push(updates.email); }\n if (updates.name !== undefined) { setClauses.push(\"name = ?\"); values.push(updates.name); }\n if (updates.status !== undefined) { setClauses.push(\"status = ?\"); values.push(updates.status); }\n if (updates.metadata !== undefined) { setClauses.push(\"metadata = ?\"); values.push(JSON.stringify(updates.metadata)); }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(id);\n\n this.db.prepare(\n `UPDATE lt_users SET ${setClauses.join(\", \")} WHERE id = ?`,\n ).run(...values);\n\n return this.getUserById(id);\n }\n\n async deleteUser(id: string): Promise<boolean> {\n const result = this.db.prepare(`DELETE FROM lt_users WHERE id = ?`).run(id);\n return result.changes > 0;\n }\n}\n\nfunction mapRowToUser(row: UserRow): User {\n return {\n id: row.id,\n email: row.email,\n name: row.name,\n status: row.status as UserStatus,\n metadata: JSON.parse(row.metadata || \"{}\"),\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","/**\n * Local SQLite implementation of TenantStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n TenantStore,\n Tenant,\n TenantStatus,\n CreateTenantRequest,\n UpdateTenantRequest,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_tenants (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'active',\n metadata TEXT DEFAULT '{}',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\n`;\n\ninterface TenantRow {\n id: string;\n name: string;\n description: string | null;\n status: string;\n metadata: string;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalTenantStore implements TenantStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async getAllTenants(): Promise<Tenant[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_tenants ORDER BY created_at DESC`,\n ).all() as unknown as TenantRow[];\n return rows.map(mapRowToTenant);\n }\n\n async getTenantById(id: string): Promise<Tenant | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_tenants WHERE id = ?`,\n ).get(id) as unknown as TenantRow | undefined;\n return row ? mapRowToTenant(row) : null;\n }\n\n async createTenant(id: string, data: CreateTenantRequest): Promise<Tenant> {\n const now = nowISO();\n const status = data.status || \"active\";\n const metadata = JSON.stringify(data.metadata || {});\n\n this.db.prepare(\n `INSERT INTO lt_tenants (id, name, description, status, metadata, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n name = excluded.name,\n description = excluded.description,\n status = excluded.status,\n metadata = excluded.metadata,\n updated_at = excluded.updated_at`,\n ).run(id, data.name, data.description || null, status, metadata, now, now);\n\n return {\n id,\n name: data.name,\n description: data.description,\n status: status as TenantStatus,\n metadata: data.metadata,\n createdAt: parseISO(now),\n updatedAt: parseISO(now),\n };\n }\n\n async updateTenant(id: string, updates: UpdateTenantRequest): Promise<Tenant | null> {\n const existing = await this.getTenantById(id);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.name !== undefined) { setClauses.push(\"name = ?\"); values.push(updates.name); }\n if (updates.description !== undefined) { setClauses.push(\"description = ?\"); values.push(updates.description || null); }\n if (updates.status !== undefined) { setClauses.push(\"status = ?\"); values.push(updates.status); }\n if (updates.metadata !== undefined) { setClauses.push(\"metadata = ?\"); values.push(JSON.stringify(updates.metadata)); }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(id);\n\n this.db.prepare(\n `UPDATE lt_tenants SET ${setClauses.join(\", \")} WHERE id = ?`,\n ).run(...values);\n\n return this.getTenantById(id);\n }\n\n async deleteTenant(id: string): Promise<boolean> {\n const result = this.db.prepare(`DELETE FROM lt_tenants WHERE id = ?`).run(id);\n return result.changes > 0;\n }\n}\n\nfunction mapRowToTenant(row: TenantRow): Tenant {\n return {\n id: row.id,\n name: row.name,\n description: row.description || undefined,\n status: row.status as TenantStatus,\n metadata: JSON.parse(row.metadata || \"{}\"),\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","/**\n * Local SQLite implementation of UserTenantLinkStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n UserTenantLinkStore,\n UserTenantLink,\n UserTenantRole,\n CreateUserTenantLinkRequest,\n UpdateUserTenantLinkRequest,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_user_tenant_links (\n user_id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n role TEXT NOT NULL DEFAULT 'member',\n joined_at TEXT NOT NULL,\n metadata TEXT DEFAULT '{}',\n PRIMARY KEY (user_id, tenant_id)\n);\nCREATE INDEX IF NOT EXISTS idx_lt_utl_user ON lt_user_tenant_links(user_id);\nCREATE INDEX IF NOT EXISTS idx_lt_utl_tenant ON lt_user_tenant_links(tenant_id);\n`;\n\ninterface LinkRow {\n user_id: string;\n tenant_id: string;\n role: string;\n joined_at: string;\n metadata: string;\n}\n\nexport class LocalUserTenantLinkStore implements UserTenantLinkStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async getTenantsByUser(userId: string): Promise<UserTenantLink[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_user_tenant_links WHERE user_id = ? ORDER BY joined_at DESC`,\n ).all(userId) as unknown as LinkRow[];\n return rows.map(mapRowToLink);\n }\n\n async getUsersByTenant(tenantId: string): Promise<UserTenantLink[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_user_tenant_links WHERE tenant_id = ? ORDER BY joined_at DESC`,\n ).all(tenantId) as unknown as LinkRow[];\n return rows.map(mapRowToLink);\n }\n\n async getLink(userId: string, tenantId: string): Promise<UserTenantLink | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_user_tenant_links WHERE user_id = ? AND tenant_id = ?`,\n ).get(userId, tenantId) as unknown as LinkRow | undefined;\n return row ? mapRowToLink(row) : null;\n }\n\n async createLink(data: CreateUserTenantLinkRequest): Promise<UserTenantLink> {\n const now = nowISO();\n const role = data.role || \"member\";\n const metadata = JSON.stringify(data.metadata || {});\n\n this.db.prepare(\n `INSERT INTO lt_user_tenant_links (user_id, tenant_id, role, joined_at, metadata)\n VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(user_id, tenant_id) DO UPDATE SET\n role = excluded.role,\n metadata = excluded.metadata`,\n ).run(data.userId, data.tenantId, role, now, metadata);\n\n return {\n userId: data.userId,\n tenantId: data.tenantId,\n role,\n joinedAt: parseISO(now),\n metadata: data.metadata,\n };\n }\n\n async updateLink(\n userId: string,\n tenantId: string,\n updates: UpdateUserTenantLinkRequest,\n ): Promise<UserTenantLink | null> {\n const existing = await this.getLink(userId, tenantId);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.role !== undefined) { setClauses.push(\"role = ?\"); values.push(updates.role); }\n if (updates.metadata !== undefined) { setClauses.push(\"metadata = ?\"); values.push(JSON.stringify(updates.metadata)); }\n\n if (setClauses.length === 0) return existing;\n\n values.push(userId, tenantId);\n\n this.db.prepare(\n `UPDATE lt_user_tenant_links SET ${setClauses.join(\", \")} WHERE user_id = ? AND tenant_id = ?`,\n ).run(...values);\n\n return this.getLink(userId, tenantId);\n }\n\n async deleteLink(userId: string, tenantId: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_user_tenant_links WHERE user_id = ? AND tenant_id = ?`,\n ).run(userId, tenantId);\n return result.changes > 0;\n }\n\n async hasLink(userId: string, tenantId: string): Promise<boolean> {\n const row = this.db.prepare(\n `SELECT 1 FROM lt_user_tenant_links WHERE user_id = ? AND tenant_id = ? LIMIT 1`,\n ).get(userId, tenantId);\n return row !== undefined;\n }\n}\n\nfunction mapRowToLink(row: LinkRow): UserTenantLink {\n return {\n userId: row.user_id,\n tenantId: row.tenant_id,\n role: row.role as UserTenantRole,\n joinedAt: parseISO(row.joined_at),\n metadata: JSON.parse(row.metadata || \"{}\"),\n };\n}\n","/**\n * Local SQLite implementation of DatabaseConfigStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n DatabaseConfigStore,\n DatabaseConfigEntry,\n CreateDatabaseConfigRequest,\n UpdateDatabaseConfigRequest,\n DatabaseConfig,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\nimport { encrypt, decrypt } from \"@axiom-lattice/core\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_database_configs (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n key TEXT NOT NULL,\n name TEXT,\n description TEXT,\n config TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_lt_dbconfig_key ON lt_database_configs(tenant_id, key);\n`;\n\ninterface ConfigRow {\n id: string;\n tenant_id: string;\n key: string;\n name: string | null;\n description: string | null;\n config: string;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalDatabaseConfigStore implements DatabaseConfigStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async getAllConfigs(tenantId: string): Promise<DatabaseConfigEntry[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_database_configs WHERE tenant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId) as unknown as ConfigRow[];\n return rows.map((r) => mapRowToEntry(r));\n }\n\n async getAllConfigsWithoutTenant(): Promise<DatabaseConfigEntry[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_database_configs ORDER BY created_at DESC`,\n ).all() as unknown as ConfigRow[];\n return rows.map((r) => mapRowToEntry(r));\n }\n\n async getConfigById(tenantId: string, id: string): Promise<DatabaseConfigEntry | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_database_configs WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as ConfigRow | undefined;\n return row ? mapRowToEntry(row) : null;\n }\n\n async getConfigByKey(tenantId: string, key: string): Promise<DatabaseConfigEntry | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_database_configs WHERE tenant_id = ? AND key = ?`,\n ).get(tenantId, key) as unknown as ConfigRow | undefined;\n return row ? mapRowToEntry(row) : null;\n }\n\n async createConfig(\n tenantId: string,\n id: string,\n data: CreateDatabaseConfigRequest,\n ): Promise<DatabaseConfigEntry> {\n const now = nowISO();\n const configWithEncrypted = encryptPasswordInConfig(data.config);\n\n this.db.prepare(\n `INSERT INTO lt_database_configs (id, tenant_id, key, name, description, config, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(tenant_id, id) DO UPDATE SET\n key = excluded.key,\n name = excluded.name,\n description = excluded.description,\n config = excluded.config,\n updated_at = excluded.updated_at`,\n ).run(id, tenantId, data.key, data.name || null, data.description || null, JSON.stringify(configWithEncrypted), now, now);\n\n return {\n id,\n tenantId,\n key: data.key,\n config: data.config,\n name: data.name,\n description: data.description,\n createdAt: parseISO(now),\n updatedAt: parseISO(now),\n };\n }\n\n async updateConfig(\n tenantId: string,\n id: string,\n updates: Partial<UpdateDatabaseConfigRequest>,\n ): Promise<DatabaseConfigEntry | null> {\n const existing = await this.getConfigById(tenantId, id);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.key !== undefined) { setClauses.push(\"key = ?\"); values.push(updates.key); }\n if (updates.name !== undefined) { setClauses.push(\"name = ?\"); values.push(updates.name || null); }\n if (updates.description !== undefined) { setClauses.push(\"description = ?\"); values.push(updates.description || null); }\n if (updates.config !== undefined) {\n setClauses.push(\"config = ?\");\n values.push(JSON.stringify(encryptPasswordInConfig(updates.config)));\n }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_database_configs SET ${setClauses.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...values);\n\n return this.getConfigById(tenantId, id);\n }\n\n async deleteConfig(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_database_configs WHERE tenant_id = ? AND id = ?`,\n ).run(tenantId, id);\n return result.changes > 0;\n }\n\n async hasConfig(tenantId: string, id: string): Promise<boolean> {\n const row = this.db.prepare(\n `SELECT 1 FROM lt_database_configs WHERE tenant_id = ? AND id = ? LIMIT 1`,\n ).get(tenantId, id);\n return row !== undefined;\n }\n}\n\nfunction mapRowToEntry(row: ConfigRow): DatabaseConfigEntry {\n const config = JSON.parse(row.config) as DatabaseConfig;\n if (config.password) {\n try {\n config.password = decrypt(config.password);\n } catch {\n // password might not be encrypted (legacy data)\n }\n }\n return {\n id: row.id,\n tenantId: row.tenant_id,\n key: row.key,\n config,\n name: row.name || undefined,\n description: row.description || undefined,\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n\nfunction encryptPasswordInConfig(config: DatabaseConfig): DatabaseConfig {\n if (config.password) {\n return { ...config, password: encrypt(config.password) };\n }\n return config;\n}\n","/**\n * Local SQLite implementation of ConnectionStore.\n */\nimport { DatabaseWrapper, ensureTable, nowISO } from \"../database\";\nimport type { ConnectionEntry, ConnectionStore } from \"@axiom-lattice/protocols\";\nimport { v4 as uuid } from \"uuid\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS connection_configs (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n type TEXT NOT NULL,\n key TEXT NOT NULL,\n name TEXT NOT NULL,\n description TEXT,\n config TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id),\n UNIQUE (tenant_id, type, key)\n);\nCREATE INDEX IF NOT EXISTS idx_conn_type ON connection_configs(tenant_id, type);\n`;\n\ninterface ConnectionRow {\n id: string;\n tenant_id: string;\n type: string;\n key: string;\n name: string;\n description: string | null;\n config: string;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalConnectionStore implements ConnectionStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async listByTenant(tenantId: string): Promise<ConnectionEntry[]> {\n const rows = this.db.prepare(\n `SELECT * FROM connection_configs WHERE tenant_id = ? ORDER BY created_at`,\n ).all(tenantId) as unknown as ConnectionRow[];\n return rows.map((r) => this.mapRow(r));\n }\n\n async listByType(tenantId: string, type: string): Promise<ConnectionEntry[]> {\n const rows = this.db.prepare(\n `SELECT * FROM connection_configs WHERE tenant_id = ? AND type = ? ORDER BY created_at`,\n ).all(tenantId, type) as unknown as ConnectionRow[];\n return rows.map((r) => this.mapRow(r));\n }\n\n async getByKey(tenantId: string, type: string, key: string): Promise<ConnectionEntry | null> {\n const row = this.db.prepare(\n `SELECT * FROM connection_configs WHERE tenant_id = ? AND type = ? AND key = ?`,\n ).get(tenantId, type, key) as unknown as ConnectionRow | undefined;\n return row ? this.mapRow(row) : null;\n }\n\n async create(entry: Omit<ConnectionEntry, \"id\" | \"createdAt\" | \"updatedAt\">): Promise<ConnectionEntry> {\n const id = uuid();\n const now = nowISO();\n\n this.db.prepare(\n `INSERT INTO connection_configs (id, tenant_id, type, key, name, description, config, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(id, entry.tenantId, entry.type, entry.key, entry.name, entry.description || null, JSON.stringify(entry.config), now, now);\n\n return { id, ...entry, createdAt: now, updatedAt: now };\n }\n\n async update(\n tenantId: string, type: string, key: string, updates: Partial<ConnectionEntry>,\n ): Promise<ConnectionEntry | null> {\n const existing = await this.getByKey(tenantId, type, key);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.name !== undefined) {\n setClauses.push(\"name = ?\");\n values.push(updates.name);\n }\n if (updates.description !== undefined) {\n setClauses.push(\"description = ?\");\n values.push(updates.description || null);\n }\n if (updates.config !== undefined) {\n setClauses.push(\"config = ?\");\n values.push(JSON.stringify(updates.config));\n }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(tenantId, type, key);\n\n this.db.prepare(\n `UPDATE connection_configs SET ${setClauses.join(\", \")} WHERE tenant_id = ? AND type = ? AND key = ?`,\n ).run(...values);\n\n return this.getByKey(tenantId, type, key);\n }\n\n async delete(tenantId: string, type: string, key: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM connection_configs WHERE tenant_id = ? AND type = ? AND key = ?`,\n ).run(tenantId, type, key);\n return result.changes > 0;\n }\n\n private mapRow(row: ConnectionRow): ConnectionEntry {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n type: row.type,\n key: row.key,\n name: row.name,\n description: row.description || undefined,\n config: JSON.parse(row.config) as Record<string, unknown>,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n }\n}\n","/**\n * Local SQLite implementation of MetricsServerConfigStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n MetricsServerConfigStore,\n MetricsServerConfigEntry,\n CreateMetricsServerConfigRequest,\n UpdateMetricsServerConfigRequest,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_metrics_configs (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n key TEXT NOT NULL,\n name TEXT,\n description TEXT,\n config TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_lt_metrics_key ON lt_metrics_configs(tenant_id, key);\n`;\n\ninterface ConfigRow {\n id: string;\n tenant_id: string;\n key: string;\n name: string | null;\n description: string | null;\n config: string;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalMetricsServerConfigStore implements MetricsServerConfigStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async getAllConfigs(tenantId: string): Promise<MetricsServerConfigEntry[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_metrics_configs WHERE tenant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId) as unknown as ConfigRow[];\n return rows.map(mapRowToEntry);\n }\n\n async getAllConfigsWithoutTenant(): Promise<MetricsServerConfigEntry[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_metrics_configs ORDER BY created_at DESC`,\n ).all() as unknown as ConfigRow[];\n return rows.map(mapRowToEntry);\n }\n\n async getConfigById(tenantId: string, id: string): Promise<MetricsServerConfigEntry | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_metrics_configs WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as ConfigRow | undefined;\n return row ? mapRowToEntry(row) : null;\n }\n\n async getConfigByKey(tenantId: string, key: string): Promise<MetricsServerConfigEntry | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_metrics_configs WHERE tenant_id = ? AND key = ?`,\n ).get(tenantId, key) as unknown as ConfigRow | undefined;\n return row ? mapRowToEntry(row) : null;\n }\n\n async createConfig(\n tenantId: string,\n id: string,\n data: CreateMetricsServerConfigRequest,\n ): Promise<MetricsServerConfigEntry> {\n const now = nowISO();\n\n this.db.prepare(\n `INSERT INTO lt_metrics_configs (id, tenant_id, key, name, description, config, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(tenant_id, id) DO UPDATE SET\n key = excluded.key,\n name = excluded.name,\n description = excluded.description,\n config = excluded.config,\n updated_at = excluded.updated_at`,\n ).run(id, tenantId, data.key, data.name || null, data.description || null, JSON.stringify(data.config), now, now);\n\n return {\n id,\n tenantId,\n key: data.key,\n config: data.config,\n name: data.name,\n description: data.description,\n createdAt: parseISO(now),\n updatedAt: parseISO(now),\n };\n }\n\n async updateConfig(\n tenantId: string,\n id: string,\n updates: Partial<UpdateMetricsServerConfigRequest>,\n ): Promise<MetricsServerConfigEntry | null> {\n const existing = await this.getConfigById(tenantId, id);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.key !== undefined) { setClauses.push(\"key = ?\"); values.push(updates.key); }\n if (updates.name !== undefined) { setClauses.push(\"name = ?\"); values.push(updates.name || null); }\n if (updates.description !== undefined) { setClauses.push(\"description = ?\"); values.push(updates.description || null); }\n if (updates.config !== undefined) { setClauses.push(\"config = ?\"); values.push(JSON.stringify(updates.config)); }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_metrics_configs SET ${setClauses.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...values);\n\n return this.getConfigById(tenantId, id);\n }\n\n async deleteConfig(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_metrics_configs WHERE tenant_id = ? AND id = ?`,\n ).run(tenantId, id);\n return result.changes > 0;\n }\n\n async hasConfig(tenantId: string, id: string): Promise<boolean> {\n const row = this.db.prepare(\n `SELECT 1 FROM lt_metrics_configs WHERE tenant_id = ? AND id = ? LIMIT 1`,\n ).get(tenantId, id);\n return row !== undefined;\n }\n}\n\nfunction mapRowToEntry(row: ConfigRow): MetricsServerConfigEntry {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n key: row.key,\n config: JSON.parse(row.config),\n name: row.name || undefined,\n description: row.description || undefined,\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","/**\n * Local SQLite implementation of McpServerConfigStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n McpServerConfigStore,\n McpServerConfigEntry,\n CreateMcpServerConfigRequest,\n UpdateMcpServerConfigRequest,\n McpServerConfig,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\nimport { encrypt, decrypt } from \"@axiom-lattice/core\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_mcp_configs (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n key TEXT NOT NULL,\n name TEXT,\n description TEXT,\n config TEXT NOT NULL,\n selected_tools TEXT DEFAULT '[]',\n is_env_encrypted INTEGER NOT NULL DEFAULT 0,\n status TEXT NOT NULL DEFAULT 'disconnected',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_lt_mcp_key ON lt_mcp_configs(tenant_id, key);\n`;\n\ninterface ConfigRow {\n id: string;\n tenant_id: string;\n key: string;\n name: string | null;\n description: string | null;\n config: string;\n selected_tools: string;\n is_env_encrypted: number;\n status: string;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalMcpServerConfigStore implements McpServerConfigStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async getAllConfigs(tenantId: string): Promise<McpServerConfigEntry[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_mcp_configs WHERE tenant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId) as unknown as ConfigRow[];\n return rows.map(mapRowToEntry);\n }\n\n async getAllConfigsWithoutTenant(): Promise<McpServerConfigEntry[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_mcp_configs ORDER BY created_at DESC`,\n ).all() as unknown as ConfigRow[];\n return rows.map(mapRowToEntry);\n }\n\n async getConfigById(tenantId: string, id: string): Promise<McpServerConfigEntry | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_mcp_configs WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as ConfigRow | undefined;\n return row ? mapRowToEntry(row) : null;\n }\n\n async getConfigByKey(tenantId: string, key: string): Promise<McpServerConfigEntry | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_mcp_configs WHERE tenant_id = ? AND key = ?`,\n ).get(tenantId, key) as unknown as ConfigRow | undefined;\n return row ? mapRowToEntry(row) : null;\n }\n\n async createConfig(\n tenantId: string,\n id: string,\n data: CreateMcpServerConfigRequest,\n ): Promise<McpServerConfigEntry> {\n const now = nowISO();\n const { config: configWithEncryptedEnv, isEnvEncrypted } = encryptEnvInConfig(data.config);\n\n this.db.prepare(\n `INSERT INTO lt_mcp_configs (id, tenant_id, key, name, description, config, selected_tools, is_env_encrypted, status, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(tenant_id, id) DO UPDATE SET\n key = excluded.key,\n name = excluded.name,\n description = excluded.description,\n config = excluded.config,\n selected_tools = excluded.selected_tools,\n is_env_encrypted = excluded.is_env_encrypted,\n status = excluded.status,\n updated_at = excluded.updated_at`,\n ).run(\n id, tenantId, data.key, data.name || null, data.description || null,\n JSON.stringify(configWithEncryptedEnv),\n JSON.stringify(data.selectedTools || []),\n isEnvEncrypted ? 1 : 0, \"disconnected\",\n now, now,\n );\n\n return {\n id,\n tenantId,\n key: data.key,\n config: data.config,\n name: data.name,\n description: data.description,\n selectedTools: data.selectedTools || [],\n isEnvEncrypted,\n status: \"disconnected\",\n createdAt: parseISO(now),\n updatedAt: parseISO(now),\n };\n }\n\n async updateConfig(\n tenantId: string,\n id: string,\n updates: Partial<UpdateMcpServerConfigRequest>,\n ): Promise<McpServerConfigEntry | null> {\n const existing = await this.getConfigById(tenantId, id);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.key !== undefined) { setClauses.push(\"key = ?\"); values.push(updates.key); }\n if (updates.name !== undefined) { setClauses.push(\"name = ?\"); values.push(updates.name || null); }\n if (updates.description !== undefined) { setClauses.push(\"description = ?\"); values.push(updates.description || null); }\n if (updates.config !== undefined) {\n const { config: configWithEncryptedEnv, isEnvEncrypted } = encryptEnvInConfig(updates.config);\n setClauses.push(\"config = ?\"); values.push(JSON.stringify(configWithEncryptedEnv));\n setClauses.push(\"is_env_encrypted = ?\"); values.push(isEnvEncrypted ? 1 : 0);\n }\n if (updates.selectedTools !== undefined) { setClauses.push(\"selected_tools = ?\"); values.push(JSON.stringify(updates.selectedTools)); }\n if (updates.status !== undefined) { setClauses.push(\"status = ?\"); values.push(updates.status); }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_mcp_configs SET ${setClauses.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...values);\n\n return this.getConfigById(tenantId, id);\n }\n\n async deleteConfig(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_mcp_configs WHERE tenant_id = ? AND id = ?`,\n ).run(tenantId, id);\n return result.changes > 0;\n }\n\n async hasConfig(tenantId: string, id: string): Promise<boolean> {\n const row = this.db.prepare(\n `SELECT 1 FROM lt_mcp_configs WHERE tenant_id = ? AND id = ? LIMIT 1`,\n ).get(tenantId, id);\n return row !== undefined;\n }\n}\n\nfunction mapRowToEntry(row: ConfigRow): McpServerConfigEntry {\n const config: McpServerConfig = JSON.parse(row.config);\n\n if (config.env && row.is_env_encrypted) {\n try {\n const decryptedEnv: Record<string, string> = {};\n for (const [key, value] of Object.entries(config.env)) {\n decryptedEnv[key] = decrypt(value);\n }\n config.env = decryptedEnv;\n } catch (error) {\n console.error(\"Failed to decrypt MCP server env:\", error);\n throw new Error(\"Failed to decrypt MCP server configuration\");\n }\n }\n\n if (config.headers && row.is_env_encrypted) {\n try {\n const decryptedHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(config.headers)) {\n decryptedHeaders[key] = decrypt(value);\n }\n config.headers = decryptedHeaders;\n } catch (error) {\n console.error(\"Failed to decrypt MCP server headers:\", error);\n throw new Error(\"Failed to decrypt MCP server configuration\");\n }\n }\n\n return {\n id: row.id,\n tenantId: row.tenant_id,\n key: row.key,\n config,\n name: row.name || undefined,\n description: row.description || undefined,\n selectedTools: JSON.parse(row.selected_tools || \"[]\"),\n isEnvEncrypted: row.is_env_encrypted === 1,\n status: row.status as McpServerConfigEntry[\"status\"],\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n\nfunction encryptEnvInConfig(config: McpServerConfig): { config: McpServerConfig; isEnvEncrypted: boolean } {\n const configCopy = { ...config };\n let isEnvEncrypted = false;\n\n if (configCopy.env && Object.keys(configCopy.env).length > 0) {\n const encryptedEnv: Record<string, string> = {};\n for (const [key, value] of Object.entries(configCopy.env)) {\n encryptedEnv[key] = encrypt(value);\n }\n configCopy.env = encryptedEnv;\n isEnvEncrypted = true;\n }\n\n if (configCopy.headers && Object.keys(configCopy.headers).length > 0) {\n const encryptedHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(configCopy.headers)) {\n encryptedHeaders[key] = encrypt(value);\n }\n configCopy.headers = encryptedHeaders;\n isEnvEncrypted = true;\n }\n\n return { config: configCopy, isEnvEncrypted };\n}\n","/**\n * Local SQLite implementation of WorkflowTrackingStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n WorkflowTrackingStore,\n WorkflowRun,\n RunStep,\n CreateWorkflowRunRequest,\n UpdateWorkflowRunRequest,\n CreateRunStepRequest,\n UpdateRunStepRequest,\n StepType,\n WorkflowRunStatus,\n QueryWorkflowRunsOptions,\n QueryWorkflowRunsResult,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_workflow_runs (\n id TEXT PRIMARY KEY,\n tenant_id TEXT NOT NULL,\n assistant_id TEXT NOT NULL,\n thread_id TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'running',\n topology_edges TEXT NOT NULL DEFAULT '[]',\n total_edges INTEGER NOT NULL DEFAULT 0,\n completed_edges INTEGER NOT NULL DEFAULT 0,\n error_message TEXT,\n metadata TEXT DEFAULT '{}',\n started_at TEXT NOT NULL,\n completed_at TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_lt_wr_thread ON lt_workflow_runs(tenant_id, thread_id);\nCREATE INDEX IF NOT EXISTS idx_lt_wr_assistant ON lt_workflow_runs(tenant_id, assistant_id);\nCREATE INDEX IF NOT EXISTS idx_lt_wr_tenant_status ON lt_workflow_runs(tenant_id, status, updated_at DESC);\n\nCREATE TABLE IF NOT EXISTS lt_workflow_steps (\n id TEXT NOT NULL,\n run_id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n step_type TEXT NOT NULL,\n step_name TEXT NOT NULL,\n thread_id TEXT,\n edge_from TEXT,\n edge_to TEXT,\n edge_purpose TEXT,\n input TEXT,\n output TEXT,\n status TEXT NOT NULL DEFAULT 'running',\n error_message TEXT,\n started_at TEXT NOT NULL,\n completed_at TEXT,\n duration_ms INTEGER,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (run_id, id)\n);\nCREATE INDEX IF NOT EXISTS idx_lt_ws_type ON lt_workflow_steps(run_id, step_type);\n-- Backfill for existing databases that don't have the column\nALTER TABLE lt_workflow_steps ADD COLUMN IF NOT EXISTS thread_id TEXT;\n`;\n\ninterface RunRow {\n id: string;\n tenant_id: string;\n assistant_id: string;\n thread_id: string;\n status: string;\n topology_edges: string;\n total_edges: number;\n completed_edges: number;\n error_message: string | null;\n metadata: string;\n started_at: string;\n completed_at: string | null;\n created_at: string;\n updated_at: string;\n}\n\ninterface StepRow {\n id: string;\n run_id: string;\n tenant_id: string;\n step_type: string;\n step_name: string;\n thread_id: string | null;\n edge_from: string | null;\n edge_to: string | null;\n edge_purpose: string | null;\n input: string | null;\n output: string | null;\n status: string;\n error_message: string | null;\n started_at: string;\n completed_at: string | null;\n duration_ms: number | null;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalWorkflowTrackingStore implements WorkflowTrackingStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async createWorkflowRun(request: CreateWorkflowRunRequest): Promise<WorkflowRun> {\n const now = nowISO();\n const id = `${request.threadId}_${Date.now()}`;\n\n this.db.prepare(\n `INSERT INTO lt_workflow_runs (id, tenant_id, assistant_id, thread_id, status, topology_edges, total_edges, completed_edges, metadata, started_at, created_at, updated_at)\n VALUES (?, ?, ?, ?, 'running', ?, ?, 0, ?, ?, ?, ?)`,\n ).run(id, request.tenantId, request.assistantId, request.threadId,\n JSON.stringify(request.topologyEdges), request.topologyEdges.length,\n JSON.stringify(request.metadata || {}), now, now, now);\n\n return {\n id, tenantId: request.tenantId, assistantId: request.assistantId,\n threadId: request.threadId, status: 'running',\n topologyEdges: request.topologyEdges, totalEdges: request.topologyEdges.length,\n completedEdges: 0, metadata: request.metadata,\n startedAt: parseISO(now), completedAt: undefined,\n createdAt: parseISO(now), updatedAt: parseISO(now),\n };\n }\n\n async getWorkflowRun(runId: string): Promise<WorkflowRun | null> {\n const row = this.db.prepare(`SELECT * FROM lt_workflow_runs WHERE id = ?`).get(runId) as unknown as RunRow | undefined;\n return row ? mapRowToRun(row) : null;\n }\n\n async updateWorkflowRun(runId: string, updates: UpdateWorkflowRunRequest): Promise<WorkflowRun | null> {\n const existing = await this.getWorkflowRun(runId);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.status !== undefined) { setClauses.push(\"status = ?\"); values.push(updates.status); }\n if (updates.completedEdges !== undefined) { setClauses.push(\"completed_edges = ?\"); values.push(updates.completedEdges); }\n if (updates.errorMessage !== undefined) { setClauses.push(\"error_message = ?\"); values.push(updates.errorMessage); }\n if (updates.completedAt !== undefined) { setClauses.push(\"completed_at = ?\"); values.push(updates.completedAt ? updates.completedAt.toISOString() : null); }\n if (updates.metadata !== undefined) { setClauses.push(\"metadata = ?\"); values.push(JSON.stringify(updates.metadata)); }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(runId);\n\n this.db.prepare(\n `UPDATE lt_workflow_runs SET ${setClauses.join(\", \")} WHERE id = ?`,\n ).run(...values);\n\n return this.getWorkflowRun(runId);\n }\n\n async deleteWorkflowRun(runId: string): Promise<void> {\n this.db.prepare(`DELETE FROM lt_workflow_runs WHERE id = ?`).run(runId);\n }\n\n async getWorkflowRunsByThreadId(tenantId: string, threadId: string): Promise<WorkflowRun[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_workflow_runs WHERE tenant_id = ? AND thread_id = ? ORDER BY created_at DESC`,\n ).all(tenantId, threadId) as unknown as RunRow[];\n return rows.map(mapRowToRun);\n }\n\n async getWorkflowRunsByAssistantId(tenantId: string, assistantId: string): Promise<WorkflowRun[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_workflow_runs WHERE tenant_id = ? AND assistant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId, assistantId) as unknown as RunRow[];\n return rows.map(mapRowToRun);\n }\n\n async getWorkflowRunsByTenantId(tenantId: string): Promise<WorkflowRun[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_workflow_runs WHERE tenant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId) as unknown as RunRow[];\n return rows.map(mapRowToRun);\n }\n\n async queryWorkflowRuns(tenantId: string, options: QueryWorkflowRunsOptions = {}): Promise<QueryWorkflowRunsResult> {\n const conditions: string[] = [\"tenant_id = ?\"];\n const whereParams: unknown[] = [tenantId];\n if (options.status) { conditions.push(\"status = ?\"); whereParams.push(options.status); }\n if (options.assistantId) { conditions.push(\"assistant_id = ?\"); whereParams.push(options.assistantId); }\n const where = conditions.join(\" AND \");\n\n const countRow = this.db.prepare(\n `SELECT COUNT(*) AS count FROM lt_workflow_runs WHERE ${where}`,\n ).get(...whereParams) as { count: number };\n\n const selectParams: unknown[] = [...whereParams];\n let sql = `SELECT * FROM lt_workflow_runs WHERE ${where} ORDER BY updated_at DESC, id DESC`;\n if (options.limit !== undefined) {\n sql += \" LIMIT ?\";\n selectParams.push(options.limit);\n } else if (options.offset !== undefined) {\n sql += \" LIMIT -1\"; // SQLite requires LIMIT before OFFSET\n }\n if (options.offset !== undefined) {\n sql += \" OFFSET ?\";\n selectParams.push(options.offset);\n }\n\n const rows = this.db.prepare(sql).all(...selectParams) as unknown as RunRow[];\n return { records: rows.map(mapRowToRun), total: countRow.count };\n }\n\n async createRunStep(request: CreateRunStepRequest): Promise<RunStep> {\n const now = nowISO();\n const id = `step_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n\n this.db.prepare(\n `INSERT INTO lt_workflow_steps (id, run_id, tenant_id, step_type, step_name, thread_id, edge_from, edge_to, edge_purpose, input, status, started_at, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?)`,\n ).run(id, request.runId, request.tenantId, request.stepType, request.stepName,\n request.threadId || null,\n request.edgeFrom || null, request.edgeTo || null, request.edgePurpose || null,\n request.input ? JSON.stringify(request.input) : null, now, now, now);\n\n return {\n id, runId: request.runId, tenantId: request.tenantId,\n stepType: request.stepType, stepName: request.stepName,\n threadId: request.threadId,\n edgeFrom: request.edgeFrom, edgeTo: request.edgeTo, edgePurpose: request.edgePurpose,\n input: request.input, status: 'running', startedAt: parseISO(now),\n createdAt: parseISO(now), updatedAt: parseISO(now),\n };\n }\n\n async upsertRunStep(request: CreateRunStepRequest): Promise<RunStep> {\n // Look up by (run_id, step_type, step_name) — the idempotency key\n const row = this.db.prepare(\n `SELECT * FROM lt_workflow_steps WHERE run_id = ? AND step_type = ? AND step_name = ?`,\n ).get(request.runId, request.stepType, request.stepName) as unknown as StepRow | undefined;\n if (row) {\n const existing = mapRowToStep(row);\n if (!existing.threadId && request.threadId) {\n this.db.prepare(\n `UPDATE lt_workflow_steps SET thread_id = ?, updated_at = ? WHERE run_id = ? AND id = ?`,\n ).run(request.threadId, nowISO(), request.runId, existing.id);\n existing.threadId = request.threadId;\n }\n return existing;\n }\n return this.createRunStep(request);\n }\n\n async updateRunStep(runId: string, stepId: string, updates: UpdateRunStepRequest): Promise<RunStep | null> {\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.status !== undefined) { setClauses.push(\"status = ?\"); values.push(updates.status); }\n if (updates.output !== undefined) { setClauses.push(\"output = ?\"); values.push(JSON.stringify(updates.output)); }\n if (updates.errorMessage !== undefined) { setClauses.push(\"error_message = ?\"); values.push(updates.errorMessage); }\n if (updates.completedAt !== undefined) { setClauses.push(\"completed_at = ?\"); values.push(updates.completedAt ? updates.completedAt.toISOString() : null); }\n if (updates.durationMs !== undefined) { setClauses.push(\"duration_ms = ?\"); values.push(updates.durationMs); }\n\n if (setClauses.length === 0) {\n return this.getStepById(runId, stepId);\n }\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(runId, stepId);\n\n this.db.prepare(\n `UPDATE lt_workflow_steps SET ${setClauses.join(\", \")} WHERE run_id = ? AND id = ?`,\n ).run(...values);\n\n return this.getStepById(runId, stepId);\n }\n\n async getRunSteps(runId: string): Promise<RunStep[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_workflow_steps WHERE run_id = ? ORDER BY created_at ASC`,\n ).all(runId) as unknown as StepRow[];\n return rows.map(mapRowToStep);\n }\n\n async getRunStepsByType(runId: string, stepType: StepType): Promise<RunStep[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_workflow_steps WHERE run_id = ? AND step_type = ? ORDER BY created_at ASC`,\n ).all(runId, stepType) as unknown as StepRow[];\n return rows.map(mapRowToStep);\n }\n\n async getInterruptedSteps(runId: string): Promise<RunStep[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_workflow_steps WHERE run_id = ? AND status = 'interrupted' ORDER BY created_at ASC`,\n ).all(runId) as unknown as StepRow[];\n return rows.map(mapRowToStep);\n }\n\n private getStepById(runId: string, id: string): RunStep | null {\n const row = this.db.prepare(\n `SELECT * FROM lt_workflow_steps WHERE run_id = ? AND id = ?`,\n ).get(runId, id) as unknown as StepRow | undefined;\n return row ? mapRowToStep(row) : null;\n }\n}\n\nfunction safeParse<T>(value: string | null | undefined, fallback: T): T {\n if (!value) return fallback;\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n}\n\nfunction mapRowToRun(row: RunRow): WorkflowRun {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n assistantId: row.assistant_id,\n threadId: row.thread_id,\n status: row.status as WorkflowRunStatus,\n topologyEdges: safeParse(row.topology_edges, []),\n totalEdges: row.total_edges,\n completedEdges: row.completed_edges,\n errorMessage: row.error_message || undefined,\n metadata: safeParse(row.metadata, {}),\n startedAt: parseISO(row.started_at),\n completedAt: row.completed_at ? parseISO(row.completed_at) : undefined,\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n\nfunction mapRowToStep(row: StepRow): RunStep {\n return {\n id: row.id,\n runId: row.run_id,\n tenantId: row.tenant_id,\n stepType: row.step_type as StepType,\n stepName: row.step_name,\n threadId: row.thread_id,\n edgeFrom: row.edge_from || undefined,\n edgeTo: row.edge_to || undefined,\n edgePurpose: row.edge_purpose || undefined,\n input: safeParse(row.input, undefined),\n output: safeParse(row.output, undefined),\n status: row.status as RunStep[\"status\"],\n errorMessage: row.error_message || undefined,\n startedAt: parseISO(row.started_at),\n completedAt: row.completed_at ? parseISO(row.completed_at) : undefined,\n durationMs: row.duration_ms ?? undefined,\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","/**\n * Local SQLite implementation of EvalStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport {\n EvalStore,\n EvalProject,\n CreateEvalProjectRequest,\n EvalSuite,\n CreateEvalSuiteRequest,\n EvalCase,\n CreateEvalCaseRequest,\n EvalRun,\n CreateEvalRunRequest,\n EvalRunResult,\n EvalProjectReport,\n InterruptPolicy,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\nimport { randomUUID } from \"crypto\";\n\nexport const DDL = `\nCREATE TABLE IF NOT EXISTS lt_eval_projects (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n name TEXT NOT NULL,\n description TEXT,\n version TEXT,\n judge_model_config TEXT NOT NULL DEFAULT '{}',\n target_server_config TEXT NOT NULL DEFAULT '{}',\n concurrency INTEGER NOT NULL DEFAULT 3,\n report_config TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\n\nCREATE TABLE IF NOT EXISTS lt_eval_suites (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n project_id TEXT NOT NULL,\n name TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\nCREATE INDEX IF NOT EXISTS idx_lt_es_project ON lt_eval_suites(tenant_id, project_id);\n\nCREATE TABLE IF NOT EXISTS lt_eval_cases (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n suite_id TEXT NOT NULL,\n input_message TEXT NOT NULL,\n input_files TEXT,\n steps TEXT NOT NULL DEFAULT '[]',\n output_type TEXT NOT NULL DEFAULT 'message_content',\n content_assertion TEXT NOT NULL DEFAULT '',\n rubrics TEXT,\n interrupt_policy TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\nCREATE INDEX IF NOT EXISTS idx_lt_ec_suite ON lt_eval_cases(tenant_id, suite_id);\n\nCREATE TABLE IF NOT EXISTS lt_eval_runs (\n id TEXT NOT NULL,\n project_id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'running',\n concurrency INTEGER NOT NULL DEFAULT 3,\n total_cases INTEGER NOT NULL DEFAULT 0,\n passed_cases INTEGER NOT NULL DEFAULT 0,\n failed_cases INTEGER NOT NULL DEFAULT 0,\n interrupted_cases INTEGER NOT NULL DEFAULT 0,\n avg_score REAL NOT NULL DEFAULT 0,\n error TEXT,\n holdout INTEGER NOT NULL DEFAULT 0,\n env_project_id TEXT,\n env_workspace_id TEXT,\n task_id TEXT,\n created_at TEXT NOT NULL,\n started_at TEXT,\n completed_at TEXT,\n PRIMARY KEY (tenant_id, id)\n);\nCREATE INDEX IF NOT EXISTS idx_lt_er_project ON lt_eval_runs(tenant_id, project_id);\n\nCREATE TABLE IF NOT EXISTS lt_eval_run_results (\n id TEXT NOT NULL,\n run_id TEXT NOT NULL,\n suite_name TEXT NOT NULL,\n case_id TEXT,\n pass INTEGER NOT NULL DEFAULT 0,\n score REAL NOT NULL DEFAULT 0,\n summary TEXT,\n dimension_results TEXT DEFAULT '[]',\n duration_ms INTEGER,\n messages TEXT DEFAULT '[]',\n logs TEXT DEFAULT '[]',\n error TEXT,\n interrupted INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL,\n PRIMARY KEY (run_id, id)\n);\n`;\n\nfunction parseJson<T>(val: unknown, fallback: T): T {\n if (val == null) return fallback;\n if (typeof val === \"string\") {\n try { return JSON.parse(val) as T; } catch { return fallback; }\n }\n return val as T;\n}\n\nfunction parseOptionalJson<T>(val: unknown): T | undefined {\n if (val == null) return undefined;\n if (typeof val === \"string\") {\n try { return JSON.parse(val) as T; } catch { return undefined; }\n }\n return val as T;\n}\n\nexport class LocalEvalStore implements EvalStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n // Existing installs: add HITL interrupt tracking columns.\n // sql.js bundles an older SQLite that does not support\n // `ADD COLUMN IF NOT EXISTS`, so check via PRAGMA instead.\n this.ensureColumn(\"lt_eval_runs\", \"interrupted_cases\", \"interrupted_cases INTEGER NOT NULL DEFAULT 0\");\n this.ensureColumn(\"lt_eval_run_results\", \"interrupted\", \"interrupted INTEGER NOT NULL DEFAULT 0\");\n this.ensureColumn(\"lt_eval_cases\", \"interrupt_policy\", \"interrupt_policy TEXT\");\n this.ensureColumn(\"lt_eval_runs\", \"task_id\", \"task_id TEXT\");\n // Project name must be unique per tenant (eval-{agent-id} convention).\n // Repoint child rows (suites, runs) of duplicate projects onto the kept\n // project (newest by created_at, tie-break rowid — mirrors the pg\n // migration's (created_at, id) DESC policy) BEFORE deleting, so eval\n // history is preserved. SQLite has no FK cascade here, so this is manual.\n this.db.exec(`\n UPDATE lt_eval_suites\n SET project_id = (\n SELECT p2.id FROM lt_eval_projects p2\n WHERE p2.tenant_id = (\n SELECT p.tenant_id FROM lt_eval_projects p WHERE p.id = lt_eval_suites.project_id\n )\n AND p2.name = (\n SELECT p.name FROM lt_eval_projects p WHERE p.id = lt_eval_suites.project_id\n )\n ORDER BY p2.created_at DESC, p2.rowid DESC\n LIMIT 1\n )\n WHERE project_id IN (\n SELECT p3.id FROM lt_eval_projects p3\n WHERE p3.id <> (\n SELECT p2.id FROM lt_eval_projects p2\n WHERE p2.tenant_id = p3.tenant_id AND p2.name = p3.name\n ORDER BY p2.created_at DESC, p2.rowid DESC\n LIMIT 1\n )\n )\n `);\n this.db.exec(`\n UPDATE lt_eval_runs\n SET project_id = (\n SELECT p2.id FROM lt_eval_projects p2\n WHERE p2.tenant_id = (\n SELECT p.tenant_id FROM lt_eval_projects p WHERE p.id = lt_eval_runs.project_id\n )\n AND p2.name = (\n SELECT p.name FROM lt_eval_projects p WHERE p.id = lt_eval_runs.project_id\n )\n ORDER BY p2.created_at DESC, p2.rowid DESC\n LIMIT 1\n )\n WHERE project_id IN (\n SELECT p3.id FROM lt_eval_projects p3\n WHERE p3.id <> (\n SELECT p2.id FROM lt_eval_projects p2\n WHERE p2.tenant_id = p3.tenant_id AND p2.name = p3.name\n ORDER BY p2.created_at DESC, p2.rowid DESC\n LIMIT 1\n )\n )\n `);\n this.db.exec(`\n DELETE FROM lt_eval_projects\n WHERE id <> (\n SELECT p2.id FROM lt_eval_projects p2\n WHERE p2.tenant_id = lt_eval_projects.tenant_id\n AND p2.name = lt_eval_projects.name\n ORDER BY p2.created_at DESC, p2.rowid DESC\n LIMIT 1\n )\n `);\n this.db.exec(`\n CREATE UNIQUE INDEX IF NOT EXISTS idx_lt_eval_projects_tenant_name\n ON lt_eval_projects(tenant_id, name)\n `);\n }\n\n /** Add a column if it does not exist (SQLite version compatible). */\n private ensureColumn(table: string, column: string, ddl: string): void {\n const cols = this.db.prepare(`PRAGMA table_info(${table})`).all() as Array<{ name: string }>;\n if (!cols.some((c) => c.name === column)) {\n this.db.exec(`ALTER TABLE ${table} ADD COLUMN ${ddl}`);\n }\n }\n\n // -------------------------------------------------------------------------\n // Projects\n // -------------------------------------------------------------------------\n\n async getProjectsByTenant(tenantId: string): Promise<EvalProject[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_eval_projects WHERE tenant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId) as unknown as Record<string, unknown>[];\n return rows.map(this.mapRowToProject);\n }\n\n async getProjectById(tenantId: string, id: string): Promise<EvalProject | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_eval_projects WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as Record<string, unknown> | undefined;\n return row ? this.mapRowToProject(row) : null;\n }\n\n async createProject(tenantId: string, id: string, data: CreateEvalProjectRequest): Promise<EvalProject> {\n const actualId = id || randomUUID();\n this.db.prepare(\n `INSERT INTO lt_eval_projects (id, tenant_id, name, description, version, judge_model_config, target_server_config, concurrency, report_config, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(actualId, tenantId, data.name, data.description || null, data.version || null,\n JSON.stringify(data.judgeModelConfig), JSON.stringify(data.targetServerConfig), data.concurrency ?? 3,\n data.reportConfig === undefined ? null : JSON.stringify(data.reportConfig),\n nowISO(), nowISO());\n return (await this.getProjectById(tenantId, actualId))!;\n }\n\n async updateProject(tenantId: string, id: string, updates: Partial<CreateEvalProjectRequest>): Promise<EvalProject | null> {\n const existing = await this.getProjectById(tenantId, id);\n if (!existing) return null;\n\n const set: string[] = [];\n const vals: unknown[] = [];\n if (updates.name !== undefined) { set.push(\"name = ?\"); vals.push(updates.name); }\n if (updates.description !== undefined) { set.push(\"description = ?\"); vals.push(updates.description || null); }\n if (updates.version !== undefined) { set.push(\"version = ?\"); vals.push(updates.version || null); }\n if (updates.judgeModelConfig !== undefined) { set.push(\"judge_model_config = ?\"); vals.push(JSON.stringify(updates.judgeModelConfig)); }\n if (updates.targetServerConfig !== undefined) { set.push(\"target_server_config = ?\"); vals.push(JSON.stringify(updates.targetServerConfig)); }\n if (updates.concurrency !== undefined) { set.push(\"concurrency = ?\"); vals.push(updates.concurrency); }\n if (updates.reportConfig !== undefined) { set.push(\"report_config = ?\"); vals.push(JSON.stringify(updates.reportConfig)); }\n set.push(\"updated_at = ?\"); vals.push(nowISO());\n vals.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_eval_projects SET ${set.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...vals);\n\n return this.getProjectById(tenantId, id);\n }\n\n async deleteProject(tenantId: string, id: string): Promise<boolean> {\n const db = this.db.getRawDb();\n db.run(\"BEGIN TRANSACTION\");\n try {\n db.run(\n `DELETE FROM lt_eval_run_results\n WHERE run_id IN (\n SELECT id FROM lt_eval_runs WHERE tenant_id = ? AND project_id = ?\n )`,\n [tenantId, id]\n );\n db.run(\n `DELETE FROM lt_eval_cases\n WHERE tenant_id = ? AND suite_id IN (\n SELECT id FROM lt_eval_suites WHERE tenant_id = ? AND project_id = ?\n )`,\n [tenantId, tenantId, id]\n );\n db.run(`DELETE FROM lt_eval_runs WHERE tenant_id = ? AND project_id = ?`, [tenantId, id]);\n db.run(`DELETE FROM lt_eval_suites WHERE tenant_id = ? AND project_id = ?`, [tenantId, id]);\n db.run(`DELETE FROM lt_eval_projects WHERE tenant_id = ? AND id = ?`, [tenantId, id]);\n const deleted = db.getRowsModified() > 0;\n db.run(\"COMMIT\");\n this.db.save();\n return deleted;\n } catch (error) {\n db.run(\"ROLLBACK\");\n throw error;\n }\n }\n\n // -------------------------------------------------------------------------\n // Suites\n // -------------------------------------------------------------------------\n\n async getSuitesByProject(tenantId: string, projectId: string): Promise<EvalSuite[]> {\n const rows = this.db.prepare(\n `SELECT s.*, (SELECT COUNT(*) FROM lt_eval_cases c WHERE c.suite_id = s.id AND c.tenant_id = s.tenant_id) as case_count\n FROM lt_eval_suites s WHERE s.tenant_id = ? AND s.project_id = ? ORDER BY s.created_at DESC`,\n ).all(tenantId, projectId) as unknown as Record<string, unknown>[];\n return rows.map(this.mapRowToSuite);\n }\n\n async getSuiteById(tenantId: string, id: string): Promise<EvalSuite | null> {\n const row = this.db.prepare(\n `SELECT s.*, (SELECT COUNT(*) FROM lt_eval_cases c WHERE c.suite_id = s.id AND c.tenant_id = s.tenant_id) as case_count\n FROM lt_eval_suites s WHERE s.tenant_id = ? AND s.id = ?`,\n ).get(tenantId, id) as unknown as Record<string, unknown> | undefined;\n return row ? this.mapRowToSuite(row) : null;\n }\n\n async createSuite(tenantId: string, projectId: string, id: string, data: CreateEvalSuiteRequest): Promise<EvalSuite> {\n const actualId = id || randomUUID();\n this.db.prepare(\n `INSERT INTO lt_eval_suites (id, tenant_id, project_id, name, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?)`,\n ).run(actualId, tenantId, projectId, data.name, nowISO(), nowISO());\n return (await this.getSuiteById(tenantId, actualId))!;\n }\n\n async updateSuite(tenantId: string, id: string, updates: Partial<CreateEvalSuiteRequest>): Promise<EvalSuite | null> {\n const existing = await this.getSuiteById(tenantId, id);\n if (!existing) return null;\n const set: string[] = [];\n const vals: unknown[] = [];\n if (updates.name !== undefined) { set.push(\"name = ?\"); vals.push(updates.name); }\n set.push(\"updated_at = ?\"); vals.push(nowISO());\n vals.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_eval_suites SET ${set.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...vals);\n return this.getSuiteById(tenantId, id);\n }\n\n async deleteSuite(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(`DELETE FROM lt_eval_suites WHERE tenant_id = ? AND id = ?`).run(tenantId, id);\n return result.changes > 0;\n }\n\n // -------------------------------------------------------------------------\n // Cases\n // -------------------------------------------------------------------------\n\n async getCasesBySuite(tenantId: string, suiteId: string): Promise<EvalCase[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_eval_cases WHERE tenant_id = ? AND suite_id = ? ORDER BY created_at DESC`,\n ).all(tenantId, suiteId) as unknown as Record<string, unknown>[];\n return rows.map(this.mapRowToCase);\n }\n\n async getCaseById(tenantId: string, id: string): Promise<EvalCase | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_eval_cases WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as Record<string, unknown> | undefined;\n return row ? this.mapRowToCase(row) : null;\n }\n\n async createCase(tenantId: string, suiteId: string, id: string, data: CreateEvalCaseRequest): Promise<EvalCase> {\n const actualId = id || randomUUID();\n this.db.prepare(\n `INSERT INTO lt_eval_cases (id, tenant_id, suite_id, input_message, input_files, steps, output_type, content_assertion, rubrics, interrupt_policy, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(actualId, tenantId, suiteId, data.inputMessage,\n data.inputFiles ? JSON.stringify(data.inputFiles) : null,\n JSON.stringify(data.steps), data.outputType || \"message_content\",\n data.contentAssertion || \"\",\n data.rubrics ? JSON.stringify(data.rubrics) : null,\n data.interruptPolicy ? JSON.stringify(data.interruptPolicy) : null,\n nowISO(), nowISO());\n return (await this.getCaseById(tenantId, actualId))!;\n }\n\n async updateCase(tenantId: string, id: string, updates: Partial<CreateEvalCaseRequest>): Promise<EvalCase | null> {\n const existing = await this.getCaseById(tenantId, id);\n if (!existing) return null;\n\n const set: string[] = [];\n const vals: unknown[] = [];\n if (updates.inputMessage !== undefined) { set.push(\"input_message = ?\"); vals.push(updates.inputMessage); }\n if (updates.inputFiles !== undefined) { set.push(\"input_files = ?\"); vals.push(JSON.stringify(updates.inputFiles)); }\n if (updates.steps !== undefined) { set.push(\"steps = ?\"); vals.push(JSON.stringify(updates.steps)); }\n if (updates.outputType !== undefined) { set.push(\"output_type = ?\"); vals.push(updates.outputType); }\n if (updates.contentAssertion !== undefined) { set.push(\"content_assertion = ?\"); vals.push(updates.contentAssertion); }\n if (updates.rubrics !== undefined) { set.push(\"rubrics = ?\"); vals.push(JSON.stringify(updates.rubrics)); }\n if (updates.interruptPolicy !== undefined) { set.push(\"interrupt_policy = ?\"); vals.push(updates.interruptPolicy ? JSON.stringify(updates.interruptPolicy) : null); }\n set.push(\"updated_at = ?\"); vals.push(nowISO());\n vals.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_eval_cases SET ${set.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...vals);\n return this.getCaseById(tenantId, id);\n }\n\n async deleteCase(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(`DELETE FROM lt_eval_cases WHERE tenant_id = ? AND id = ?`).run(tenantId, id);\n return result.changes > 0;\n }\n\n // -------------------------------------------------------------------------\n // Runs\n // -------------------------------------------------------------------------\n\n async getRunsByTenant(tenantId: string, opts?: { projectId?: string; status?: string }): Promise<EvalRun[]> {\n let query = `SELECT * FROM lt_eval_runs WHERE tenant_id = ?`;\n const vals: unknown[] = [tenantId];\n if (opts?.projectId) { query += ` AND project_id = ?`; vals.push(opts.projectId); }\n if (opts?.status) { query += ` AND status = ?`; vals.push(opts.status); }\n query += ` ORDER BY created_at DESC`;\n const rows = this.db.prepare(query).all(...vals) as unknown as Record<string, unknown>[];\n return rows.map(this.mapRowToRun);\n }\n\n async getRunById(tenantId: string, id: string): Promise<EvalRun | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_eval_runs WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as Record<string, unknown> | undefined;\n return row ? this.mapRowToRun(row) : null;\n }\n\n async createRun(tenantId: string, projectId: string, id: string, data: CreateEvalRunRequest): Promise<EvalRun> {\n const actualId = id || randomUUID();\n this.db.prepare(\n `INSERT INTO lt_eval_runs (id, project_id, tenant_id, status, concurrency, total_cases, passed_cases, failed_cases, avg_score, holdout, env_project_id, env_workspace_id, task_id, created_at)\n VALUES (?, ?, ?, 'running', ?, ?, 0, 0, 0, ?, ?, ?, ?, ?)`,\n ).run(actualId, projectId, tenantId, data.concurrency, data.totalCases, data.holdout ? 1 : 0, data.envProjectId || null, data.envWorkspaceId || null, data.taskId || null, nowISO());\n return (await this.getRunById(tenantId, actualId))!;\n }\n\n async updateRunStatus(tenantId: string, id: string, updates: {\n status?: EvalRun[\"status\"]; passedCases?: number; failedCases?: number; interruptedCases?: number; avgScore?: number; error?: string; completedAt?: Date;\n }): Promise<EvalRun | null> {\n const existing = await this.getRunById(tenantId, id);\n if (!existing) return null;\n\n const set: string[] = [];\n const vals: unknown[] = [];\n if (updates.status !== undefined) { set.push(\"status = ?\"); vals.push(updates.status); }\n if (updates.passedCases !== undefined) { set.push(\"passed_cases = ?\"); vals.push(updates.passedCases); }\n if (updates.failedCases !== undefined) { set.push(\"failed_cases = ?\"); vals.push(updates.failedCases); }\n if (updates.interruptedCases !== undefined) { set.push(\"interrupted_cases = ?\"); vals.push(updates.interruptedCases); }\n if (updates.avgScore !== undefined) { set.push(\"avg_score = ?\"); vals.push(updates.avgScore); }\n if (updates.error !== undefined) { set.push(\"error = ?\"); vals.push(updates.error || null); }\n if (updates.completedAt !== undefined) { set.push(\"completed_at = ?\"); vals.push(updates.completedAt ? updates.completedAt.toISOString() : null); }\n vals.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_eval_runs SET ${set.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...vals);\n return this.getRunById(tenantId, id);\n }\n\n async deleteRun(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(`DELETE FROM lt_eval_runs WHERE tenant_id = ? AND id = ?`).run(tenantId, id);\n return result.changes > 0;\n }\n\n // -------------------------------------------------------------------------\n // Run Results\n // -------------------------------------------------------------------------\n\n async getResultsByRun(tenantId: string, runId: string): Promise<EvalRunResult[]> {\n const rows = this.db.prepare(\n `SELECT rr.* FROM lt_eval_run_results rr\n INNER JOIN lt_eval_runs r ON r.id = rr.run_id\n WHERE r.tenant_id = ? AND rr.run_id = ? ORDER BY rr.created_at ASC`,\n ).all(tenantId, runId) as unknown as Record<string, unknown>[];\n return rows.map(this.mapRowToRunResult);\n }\n\n private async getRunResultById(tenantId: string, id: string): Promise<EvalRunResult | null> {\n const row = this.db.prepare(\n `SELECT rr.* FROM lt_eval_run_results rr\n INNER JOIN lt_eval_runs r ON r.id = rr.run_id\n WHERE r.tenant_id = ? AND rr.id = ?`,\n ).get(tenantId, id) as unknown as Record<string, unknown> | undefined;\n return row ? this.mapRowToRunResult(row) : null;\n }\n\n async createRunResult(tenantId: string, runId: string, id: string, data: Omit<EvalRunResult, \"id\" | \"runId\" | \"createdAt\">): Promise<EvalRunResult> {\n const actualId = id || randomUUID();\n this.db.prepare(\n `INSERT INTO lt_eval_run_results (id, run_id, suite_name, case_id, pass, score, summary, dimension_results, duration_ms, messages, logs, error, interrupted, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(actualId, runId, data.suiteName, data.caseId || null,\n data.pass ? 1 : 0, data.score, data.summary || null,\n JSON.stringify(data.dimensionResults || []), data.durationMs ?? null,\n JSON.stringify(data.messages || []), JSON.stringify(data.logs || []),\n data.error || null, data.interrupted ? 1 : 0, nowISO());\n return (await this.getRunResultById(tenantId, actualId))!;\n }\n\n async updateRunResult(tenantId: string, id: string, updates: Partial<EvalRunResult>): Promise<EvalRunResult | null> {\n if (updates.runId !== undefined) throw new Error(\"runId cannot be updated on an existing result\");\n\n const set: string[] = [];\n const vals: unknown[] = [];\n if (updates.suiteName !== undefined) { set.push(\"suite_name = ?\"); vals.push(updates.suiteName); }\n if (updates.caseId !== undefined) { set.push(\"case_id = ?\"); vals.push(updates.caseId); }\n if (updates.pass !== undefined) { set.push(\"pass = ?\"); vals.push(updates.pass ? 1 : 0); }\n if (updates.score !== undefined) { set.push(\"score = ?\"); vals.push(updates.score); }\n if (updates.summary !== undefined) { set.push(\"summary = ?\"); vals.push(updates.summary || null); }\n if (updates.dimensionResults !== undefined) { set.push(\"dimension_results = ?\"); vals.push(JSON.stringify(updates.dimensionResults)); }\n if (updates.durationMs !== undefined) { set.push(\"duration_ms = ?\"); vals.push(updates.durationMs ?? null); }\n if (updates.messages !== undefined) { set.push(\"messages = ?\"); vals.push(JSON.stringify(updates.messages)); }\n if (updates.logs !== undefined) { set.push(\"logs = ?\"); vals.push(JSON.stringify(updates.logs)); }\n if (updates.error !== undefined) { set.push(\"error = ?\"); vals.push(updates.error || null); }\n if (updates.interrupted !== undefined) { set.push(\"interrupted = ?\"); vals.push(updates.interrupted ? 1 : 0); }\n if (set.length === 0) return this.getRunResultById(tenantId, id);\n\n vals.push(id, tenantId);\n this.db.prepare(\n `UPDATE lt_eval_run_results SET ${set.join(\", \")}\n WHERE id = ? AND run_id IN (SELECT id FROM lt_eval_runs WHERE tenant_id = ?)`,\n ).run(...vals);\n\n return this.getRunResultById(tenantId, id);\n }\n\n async deleteRunResult(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_eval_run_results\n WHERE id = ? AND run_id IN (SELECT id FROM lt_eval_runs WHERE tenant_id = ?)`,\n ).run(id, tenantId);\n return result.changes > 0;\n }\n\n // -------------------------------------------------------------------------\n // Reports\n // -------------------------------------------------------------------------\n\n async getProjectReport(tenantId: string, projectId: string): Promise<EvalProjectReport | null> {\n const project = await this.getProjectById(tenantId, projectId);\n if (!project) return null;\n\n const runs = await this.getRunsByTenant(tenantId, { projectId });\n const totalRuns = runs.length;\n const latestPassRate = runs.length > 0\n ? (runs[0].totalCases > 0 ? runs[0].passedCases / runs[0].totalCases : 0)\n : 0;\n const avgScore = runs.length > 0\n ? runs.reduce((sum, r) => sum + r.avgScore, 0) / runs.length\n : 0;\n\n return { projectId: project.id, projectName: project.name, totalRuns, latestPassRate, avgScore, runs };\n }\n\n // -------------------------------------------------------------------------\n // Row mappers\n // -------------------------------------------------------------------------\n\n private mapRowToProject(row: Record<string, unknown>): EvalProject {\n return {\n id: row.id as string,\n tenantId: row.tenant_id as string,\n name: row.name as string,\n description: row.description as string | undefined,\n version: row.version as string | undefined,\n judgeModelConfig: parseJson<Record<string, unknown>>(row.judge_model_config, {}),\n targetServerConfig: parseJson<Record<string, unknown>>(row.target_server_config, {}),\n concurrency: (row.concurrency as number) ?? 3,\n reportConfig: parseOptionalJson<Record<string, unknown>>(row.report_config),\n createdAt: parseISO(row.created_at as string),\n updatedAt: parseISO(row.updated_at as string),\n };\n }\n\n private mapRowToSuite(row: Record<string, unknown>): EvalSuite {\n return {\n id: row.id as string,\n tenantId: row.tenant_id as string,\n projectId: row.project_id as string,\n name: row.name as string,\n createdAt: parseISO(row.created_at as string),\n updatedAt: parseISO(row.updated_at as string),\n caseCount: row.case_count !== undefined ? (row.case_count as number) : undefined,\n };\n }\n\n private mapRowToCase(row: Record<string, unknown>): EvalCase {\n return {\n id: row.id as string,\n tenantId: row.tenant_id as string,\n suiteId: row.suite_id as string,\n inputMessage: row.input_message as string,\n inputFiles: parseOptionalJson<Record<string, string>>(row.input_files),\n steps: parseJson<Array<{ agent_id: string; override_message?: string }>>(row.steps, []),\n outputType: (row.output_type as EvalCase[\"outputType\"]) || \"message_content\",\n contentAssertion: (row.content_assertion as string) || \"\",\n rubrics: parseOptionalJson<Array<{ name: string; weight: number; description: string }>>(row.rubrics),\n interruptPolicy: parseOptionalJson<InterruptPolicy>(row.interrupt_policy),\n createdAt: parseISO(row.created_at as string),\n updatedAt: parseISO(row.updated_at as string),\n };\n }\n\n private mapRowToRun(row: Record<string, unknown>): EvalRun {\n return {\n id: row.id as string,\n projectId: row.project_id as string,\n tenantId: row.tenant_id as string,\n status: row.status as EvalRun[\"status\"],\n concurrency: (row.concurrency as number) ?? 3,\n totalCases: (row.total_cases as number) ?? 0,\n passedCases: (row.passed_cases as number) ?? 0,\n failedCases: (row.failed_cases as number) ?? 0,\n interruptedCases: (row.interrupted_cases as number) ?? 0,\n avgScore: (row.avg_score as number) ?? 0,\n error: row.error as string | undefined,\n holdout: row.holdout ? Boolean(row.holdout) : undefined,\n envProjectId: row.env_project_id as string | undefined,\n envWorkspaceId: row.env_workspace_id as string | undefined,\n taskId: row.task_id as string | undefined,\n createdAt: parseISO(row.created_at as string),\n startedAt: row.started_at ? parseISO(row.started_at as string) : undefined,\n completedAt: row.completed_at ? parseISO(row.completed_at as string) : undefined,\n };\n }\n\n private mapRowToRunResult(row: Record<string, unknown>): EvalRunResult {\n return {\n id: row.id as string,\n runId: row.run_id as string,\n suiteName: row.suite_name as string,\n caseId: row.case_id as string | undefined,\n pass: (row.pass as number) === 1,\n score: (row.score as number) ?? 0,\n summary: row.summary as string | undefined,\n dimensionResults: parseOptionalJson<Array<{ name: string; score: number; reason: string }>>(row.dimension_results),\n durationMs: row.duration_ms as number | undefined,\n messages: parseOptionalJson<Array<{ role: string; content: string; id?: string }>>(row.messages),\n logs: parseOptionalJson<Array<{ timestamp: string; level: string; message: string; data?: unknown }>>(row.logs),\n error: row.error as string | undefined,\n interrupted: (row.interrupted as number) === 1,\n createdAt: parseISO(row.created_at as string),\n };\n }\n}\n","/**\n * Local SQLite implementation of ChannelBindingStore (BindingRegistry).\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport {\n DuplicateChannelBindingSubjectError,\n type Binding, type BindingListParams, type BindingMutablePatch,\n type BindingRegistry, type CreateBindingInput,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\nimport { randomUUID } from \"crypto\";\nimport { ensureChannelBindingSubjectIndex } from \"./room-channel-binding-index\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_channel_bindings (\n id TEXT PRIMARY KEY,\n channel TEXT NOT NULL,\n channel_installation_id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n sender_id TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n thread_id TEXT,\n workspace_id TEXT,\n project_id TEXT,\n thread_mode TEXT NOT NULL DEFAULT 'fixed',\n sender_display_name TEXT,\n sender_metadata TEXT,\n enabled INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\n`;\n\ninterface BindingRow {\n id: string;\n channel: string;\n channel_installation_id: string;\n tenant_id: string;\n sender_id: string;\n agent_id: string;\n thread_id: string | null;\n workspace_id: string | null;\n project_id: string | null;\n thread_mode: string;\n sender_display_name: string | null;\n sender_metadata: string | null;\n enabled: number;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalChannelBindingStore implements BindingRegistry {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n ensureChannelBindingSubjectIndex(db);\n }\n\n async findById(tenantId: string, id: string): Promise<Binding | null> {\n const row = this.db.prepare(\n \"SELECT * FROM lt_channel_bindings WHERE id = ? AND tenant_id = ?\",\n ).get(id, tenantId) as unknown as BindingRow | undefined;\n return row ? mapRowToBinding(row) : null;\n }\n\n async findBySubject(params: {\n tenantId: string; channel: string; channelInstallationId: string; senderId: string;\n }): Promise<Binding | null> {\n const row = this.db.prepare(`SELECT * FROM lt_channel_bindings\n WHERE tenant_id = ? AND channel = ? AND channel_installation_id = ? AND sender_id = ? LIMIT 1`)\n .get(params.tenantId, params.channel, params.channelInstallationId, params.senderId) as unknown as BindingRow | undefined;\n return row ? mapRowToBinding(row) : null;\n }\n\n async resolve(params: {\n channel: string;\n senderId: string;\n channelInstallationId: string;\n tenantId: string;\n }): Promise<Binding | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_channel_bindings\n WHERE channel = ? AND sender_id = ? AND channel_installation_id = ? AND tenant_id = ? AND enabled = 1\n LIMIT 1`,\n ).get(params.channel, params.senderId, params.channelInstallationId, params.tenantId) as unknown as BindingRow | undefined;\n return row ? mapRowToBinding(row) : null;\n }\n\n async create(input: CreateBindingInput): Promise<Binding> {\n const id = randomUUID();\n const now = nowISO();\n\n try {\n this.db.prepare(`INSERT INTO lt_channel_bindings\n (id, channel, channel_installation_id, tenant_id, sender_id, agent_id,\n thread_id, thread_mode, sender_display_name, sender_metadata, workspace_id, project_id, enabled, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n id, input.channel, input.channelInstallationId, input.tenantId,\n input.senderId, input.agentId, input.threadId || null, input.threadMode || \"fixed\",\n input.senderDisplayName || null,\n input.senderMetadata ? JSON.stringify(input.senderMetadata) : null,\n input.workspaceId || null, input.projectId || null, (input.enabled ?? true) ? 1 : 0,\n now, now,\n );\n } catch (error) {\n if (error instanceof Error && /UNIQUE constraint failed/.test(error.message)) {\n throw new DuplicateChannelBindingSubjectError();\n }\n throw error;\n }\n\n return (await this.getById(id))!;\n }\n\n async update(tenantId: string, id: string, patch: BindingMutablePatch): Promise<Binding> {\n const existing = await this.findById(tenantId, id);\n if (!existing) throw new Error(`Binding ${id} not found`);\n\n const updated = {\n agentId: patch.agentId ?? existing.agentId,\n threadId: patch.threadId !== undefined ? patch.threadId : existing.threadId,\n workspaceId: patch.workspaceId !== undefined ? patch.workspaceId : existing.workspaceId,\n projectId: patch.projectId !== undefined ? patch.projectId : existing.projectId,\n threadMode: patch.threadMode ?? existing.threadMode,\n senderDisplayName: patch.senderDisplayName !== undefined ? patch.senderDisplayName : existing.senderDisplayName,\n senderMetadata: patch.senderMetadata !== undefined ? patch.senderMetadata : existing.senderMetadata,\n enabled: patch.enabled ?? existing.enabled,\n };\n\n const now = nowISO();\n\n this.db.prepare(\n `UPDATE lt_channel_bindings SET\n agent_id = ?, thread_id = ?, workspace_id = ?, project_id = ?, thread_mode = ?,\n sender_display_name = ?, sender_metadata = ?, enabled = ?, updated_at = ?\n WHERE id = ? AND tenant_id = ?`,\n ).run(\n updated.agentId, updated.threadId || null, updated.workspaceId || null,\n updated.projectId || null, updated.threadMode, updated.senderDisplayName || null,\n updated.senderMetadata ? JSON.stringify(updated.senderMetadata) : null,\n updated.enabled ? 1 : 0, now, id, tenantId,\n );\n\n return (await this.findById(tenantId, id))!;\n }\n\n async delete(tenantId: string, id: string): Promise<void> {\n this.db.prepare(`DELETE FROM lt_channel_bindings WHERE id = ? AND tenant_id = ?`).run(id, tenantId);\n }\n\n async list(params: BindingListParams): Promise<Binding[]> {\n const conditions: string[] = [\"tenant_id = ?\"];\n const values: unknown[] = [params.tenantId];\n\n if (params.channel) { conditions.push(\"channel = ?\"); values.push(params.channel); }\n if (params.agentId) { conditions.push(\"agent_id = ?\"); values.push(params.agentId); }\n if (params.channelInstallationId) { conditions.push(\"channel_installation_id = ?\"); values.push(params.channelInstallationId); }\n if (params.excludeChannels?.length) {\n conditions.push(`channel NOT IN (${params.excludeChannels.map(() => \"?\").join(\", \")})`);\n values.push(...params.excludeChannels);\n }\n for (const prefix of params.excludeInstallationIdPrefixes ?? []) {\n conditions.push(\"substr(channel_installation_id, 1, length(?)) <> ?\");\n values.push(prefix, prefix);\n }\n\n const limit = params.limit ?? 50;\n const offset = params.offset ?? 0;\n values.push(limit, offset);\n\n const rows = this.db.prepare(\n `SELECT * FROM lt_channel_bindings\n WHERE ${conditions.join(\" AND \")}\n ORDER BY created_at DESC\n LIMIT ? OFFSET ?`,\n ).all(...values) as unknown as BindingRow[];\n\n return rows.map(mapRowToBinding);\n }\n\n async import(tenantId: string, bindings: CreateBindingInput[]): Promise<Binding[]> {\n if (bindings.some((binding) => binding.channel === \"room\")) {\n throw new Error(\"Room bindings cannot be imported through the public store API\");\n }\n if (bindings.some((binding) => binding.channelInstallationId.startsWith(\"room-internal:\"))) {\n throw new Error(\"Internal bindings cannot be imported through the public store API\");\n }\n if (bindings.some((binding) => binding.tenantId !== tenantId)) {\n throw new Error(\"Binding import tenant mismatch\");\n }\n const result: Binding[] = [];\n for (const input of bindings) {\n result.push(await this.create(input));\n }\n return result;\n }\n\n async export(params: { tenantId: string }): Promise<Binding[]> {\n return this.list({\n tenantId: params.tenantId,\n excludeChannels: [\"room\"],\n excludeInstallationIdPrefixes: [\"room-internal:\"],\n limit: 10000,\n offset: 0,\n });\n }\n\n private async getById(id: string): Promise<Binding | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_channel_bindings WHERE id = ?`,\n ).get(id) as unknown as BindingRow | undefined;\n return row ? mapRowToBinding(row) : null;\n }\n}\n\nfunction mapRowToBinding(row: BindingRow): Binding {\n return {\n id: row.id,\n channel: row.channel,\n channelInstallationId: row.channel_installation_id,\n tenantId: row.tenant_id,\n senderId: row.sender_id,\n agentId: row.agent_id,\n threadId: row.thread_id || undefined,\n workspaceId: row.workspace_id || undefined,\n projectId: row.project_id || undefined,\n threadMode: row.thread_mode as Binding[\"threadMode\"],\n senderDisplayName: row.sender_display_name || undefined,\n senderMetadata: row.sender_metadata ? JSON.parse(row.sender_metadata) : undefined,\n enabled: row.enabled === 1,\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","import {\n ChannelBindingMigrationConflictError,\n type ChannelBindingMigrationConflict,\n} from \"@axiom-lattice/protocols\";\nimport type { DatabaseWrapper } from \"../database\";\n\nconst UNIQUE_INDEX_SQL = `CREATE UNIQUE INDEX IF NOT EXISTS idx_lt_cb_subject_unique\n ON lt_channel_bindings(channel, channel_installation_id, tenant_id, sender_id)`;\nconst LOOKUP_INDEX_SQL = `CREATE INDEX IF NOT EXISTS idx_lt_cb_resolve\n ON lt_channel_bindings(channel, sender_id, channel_installation_id, tenant_id)`;\n\n/**\n * Installs global binding-subject uniqueness without silently reconciling legacy rows.\n *\n * @param db - Synchronous sql.js database wrapper.\n * @throws {ChannelBindingMigrationConflictError} When existing subjects require operator repair.\n */\nexport function ensureChannelBindingSubjectIndex(db: DatabaseWrapper): void {\n db.exec(\"BEGIN\");\n try {\n const conflicts = db.prepare(`SELECT tenant_id, channel, channel_installation_id, sender_id, COUNT(*) AS count\n FROM lt_channel_bindings\n GROUP BY channel, channel_installation_id, tenant_id, sender_id\n HAVING COUNT(*) > 1\n ORDER BY tenant_id, channel, channel_installation_id, sender_id`).all() as ChannelBindingConflictRow[];\n if (conflicts.length > 0) {\n throw new ChannelBindingMigrationConflictError(conflicts.map(mapConflict));\n }\n db.exec(\"DROP INDEX IF EXISTS idx_lt_cb_room_subject\");\n db.exec(UNIQUE_INDEX_SQL);\n db.exec(LOOKUP_INDEX_SQL);\n db.exec(\"COMMIT\");\n } catch (error) {\n try {\n db.exec(\"ROLLBACK\");\n } catch {\n // Preserve the migration failure that triggered rollback.\n }\n throw error;\n }\n db.save();\n}\n\ninterface ChannelBindingConflictRow {\n tenant_id: string;\n channel: string;\n channel_installation_id: string;\n sender_id: string;\n count: number;\n}\n\nfunction mapConflict(row: ChannelBindingConflictRow): ChannelBindingMigrationConflict {\n return {\n tenantId: row.tenant_id,\n channel: row.channel,\n channelInstallationId: row.channel_installation_id,\n senderId: row.sender_id,\n count: row.count,\n };\n}\n","/**\n * Local SQLite implementation of ChannelInstallationStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n ChannelInstallationStore,\n ChannelInstallation,\n ChannelInstallationType,\n CreateChannelInstallationInput,\n UpdateChannelInstallationRequest,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_channel_installations (\n id TEXT PRIMARY KEY,\n tenant_id TEXT NOT NULL,\n channel TEXT NOT NULL,\n name TEXT,\n config TEXT NOT NULL,\n enabled INTEGER NOT NULL DEFAULT 1,\n fallback_agent_id TEXT,\n reject_when_no_binding INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_lt_ci_tenant ON lt_channel_installations(tenant_id);\n`;\n\ninterface Row {\n id: string;\n tenant_id: string;\n channel: string;\n name: string | null;\n config: string;\n enabled: number;\n fallback_agent_id: string | null;\n reject_when_no_binding: number;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalChannelInstallationStore implements ChannelInstallationStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async getInstallationById(installationId: string): Promise<ChannelInstallation | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_channel_installations WHERE id = ?`,\n ).get(installationId) as Row | undefined;\n return row ? mapRow(row) : null;\n }\n\n async getInstallationsByTenant(\n tenantId: string,\n channel?: ChannelInstallationType,\n ): Promise<ChannelInstallation[]> {\n let rows: Row[];\n if (channel) {\n rows = this.db.prepare(\n `SELECT * FROM lt_channel_installations WHERE tenant_id = ? AND channel = ? ORDER BY created_at DESC`,\n ).all(tenantId, channel) as Row[];\n } else {\n rows = this.db.prepare(\n `SELECT * FROM lt_channel_installations WHERE tenant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId) as Row[];\n }\n return rows.map(mapRow);\n }\n\n async getAllInstallations(\n channel?: ChannelInstallationType,\n ): Promise<ChannelInstallation[]> {\n let rows: Row[];\n if (channel) {\n rows = this.db.prepare(\n `SELECT * FROM lt_channel_installations WHERE channel = ? ORDER BY created_at DESC`,\n ).all(channel) as Row[];\n } else {\n rows = this.db.prepare(\n `SELECT * FROM lt_channel_installations ORDER BY created_at DESC`,\n ).all() as Row[];\n }\n return rows.map(mapRow);\n }\n\n async createInstallation(\n tenantId: string,\n installationId: string,\n data: CreateChannelInstallationInput,\n ): Promise<ChannelInstallation> {\n const now = nowISO();\n\n this.db.prepare(\n `INSERT INTO lt_channel_installations\n (id, tenant_id, channel, name, config, enabled, fallback_agent_id, reject_when_no_binding, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n installationId, tenantId, data.channel,\n data.name || null, JSON.stringify(data.config),\n data.enabled !== false ? 1 : 0,\n data.fallbackAgentId || null,\n data.rejectWhenNoBinding ? 1 : 0,\n now, now,\n );\n\n return {\n id: installationId,\n tenantId,\n channel: data.channel,\n name: data.name,\n config: { ...data.config },\n enabled: data.enabled !== false,\n fallbackAgentId: data.fallbackAgentId,\n rejectWhenNoBinding: data.rejectWhenNoBinding ?? false,\n createdAt: parseISO(now),\n updatedAt: parseISO(now),\n };\n }\n\n async updateInstallation(\n tenantId: string,\n installationId: string,\n updates: UpdateChannelInstallationRequest,\n ): Promise<ChannelInstallation | null> {\n const existing = await this.getInstallationById(installationId);\n if (!existing || existing.tenantId !== tenantId) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.name !== undefined) { setClauses.push(\"name = ?\"); values.push(updates.name || null); }\n if (updates.config !== undefined) { setClauses.push(\"config = ?\"); values.push(JSON.stringify(updates.config)); }\n if (updates.enabled !== undefined) { setClauses.push(\"enabled = ?\"); values.push(updates.enabled ? 1 : 0); }\n if (updates.fallbackAgentId !== undefined) { setClauses.push(\"fallback_agent_id = ?\"); values.push(updates.fallbackAgentId || null); }\n if (updates.rejectWhenNoBinding !== undefined) { setClauses.push(\"reject_when_no_binding = ?\"); values.push(updates.rejectWhenNoBinding ? 1 : 0); }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(tenantId);\n values.push(installationId);\n\n this.db.prepare(\n `UPDATE lt_channel_installations SET ${setClauses.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...values);\n\n return this.getInstallationById(installationId);\n }\n\n async deleteInstallation(tenantId: string, installationId: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_channel_installations WHERE id = ? AND tenant_id = ?`,\n ).run(installationId, tenantId);\n return result.changes > 0;\n }\n}\n\nfunction mapRow(row: Row): ChannelInstallation {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n channel: row.channel as ChannelInstallationType,\n name: row.name || undefined,\n config: JSON.parse(row.config),\n enabled: row.enabled === 1,\n fallbackAgentId: row.fallback_agent_id || undefined,\n rejectWhenNoBinding: row.reject_when_no_binding === 1,\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","/**\n * Local SQLite implementation of A2AApiKeyStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n UpdateA2AApiKeyInput,\n A2AApiKeyStore,\n A2AApiKeyRecord,\n CreateA2AApiKeyInput,\n A2AApiKeyEntry,\n OpenGrant,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\nimport { encrypt, decrypt } from \"@axiom-lattice/core\";\nimport { randomUUID } from \"crypto\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_a2a_api_keys (\n id TEXT PRIMARY KEY,\n key_value TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n project_id TEXT,\n assistant_ids TEXT,\n grants TEXT,\n label TEXT,\n enabled INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\n`;\n\ninterface KeyRow {\n id: string;\n key_value: string;\n tenant_id: string;\n project_id: string;\n assistant_ids: string | null;\n grants: string | null;\n label: string | null;\n enabled: number;\n created_at: string;\n updated_at: string;\n}\n\nfunction generateApiKey(): string {\n return `a2a_${randomUUID().replace(/-/g, \"\")}`;\n}\n\nfunction parseGrants(raw: string | null): OpenGrant[] | undefined {\n if (!raw) return undefined;\n try {\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as OpenGrant[]) : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction parseAssistantIds(raw: string | null): string[] | undefined {\n if (!raw) return undefined;\n try {\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** SQLite-backed A2A API key persistence for local deployments. */\nexport class LocalA2AApiKeyStore implements A2AApiKeyStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n // Existing installs: add columns shipped after the original schema.\n this.ensureColumn(\"lt_a2a_api_keys\", \"assistant_ids\", \"assistant_ids TEXT\");\n this.ensureColumn(\"lt_a2a_api_keys\", \"grants\", \"grants TEXT\");\n this.repairManagementIds();\n }\n\n /** Add a column if it does not exist (SQLite version compatible). */\n private ensureColumn(table: string, column: string, ddl: string): void {\n const cols = this.db.prepare(`PRAGMA table_info(${table})`).all() as Array<{ name: string }>;\n if (!cols.some((c) => c.name === column)) {\n this.db.exec(`ALTER TABLE ${table} ADD COLUMN ${ddl}`);\n }\n }\n\n private repairManagementIds(): void {\n const rows = this.db.prepare(\n `SELECT rowid, id FROM lt_a2a_api_keys`,\n ).all() as Array<{ rowid: number; id: string | null }>;\n const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n for (const row of rows) {\n if (!row.id || !uuidPattern.test(row.id)) {\n this.db.prepare(\n `UPDATE lt_a2a_api_keys SET id = ? WHERE rowid = ?`,\n ).run(randomUUID(), row.rowid);\n }\n }\n }\n\n async findByKey(key: string): Promise<A2AApiKeyRecord | null> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_a2a_api_keys WHERE enabled = 1`,\n ).all() as unknown as KeyRow[];\n for (const row of rows) {\n try {\n if (decrypt(row.key_value) === key) return mapRowToRecord(row);\n } catch { /* skip unreadable */ }\n }\n return null;\n }\n\n async findById(id: string): Promise<A2AApiKeyRecord | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_a2a_api_keys WHERE id = ?`,\n ).get(id) as unknown as KeyRow | undefined;\n return row ? mapRowToRecord(row) : null;\n }\n\n async list(params: { tenantId?: string; limit?: number; offset?: number }): Promise<A2AApiKeyRecord[]> {\n const limit = params.limit || 100;\n const offset = params.offset || 0;\n let rows: KeyRow[];\n if (params.tenantId) {\n rows = this.db.prepare(\n `SELECT * FROM lt_a2a_api_keys WHERE tenant_id = ? ORDER BY created_at DESC LIMIT ? OFFSET ?`,\n ).all(params.tenantId, limit, offset) as unknown as KeyRow[];\n } else {\n rows = this.db.prepare(\n `SELECT * FROM lt_a2a_api_keys ORDER BY created_at DESC LIMIT ? OFFSET ?`,\n ).all(limit, offset) as unknown as KeyRow[];\n }\n return rows.map(mapRowToRecord);\n }\n\n async create(input: CreateA2AApiKeyInput): Promise<A2AApiKeyRecord> {\n const id = randomUUID();\n const key = generateApiKey();\n const now = nowISO();\n this.db.prepare(\n `INSERT INTO lt_a2a_api_keys (id, key_value, tenant_id, project_id, assistant_ids, grants, label, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(id, encrypt(key), input.tenantId, input.projectId, input.assistantIds ? JSON.stringify(input.assistantIds) : null, input.grants ? JSON.stringify(input.grants) : null, input.label || null, now, now);\n\n const record: A2AApiKeyRecord = {\n id,\n key,\n tenantId: input.tenantId,\n projectId: input.projectId,\n assistantIds: input.assistantIds,\n label: input.label,\n enabled: true,\n createdAt: parseISO(now),\n updatedAt: parseISO(now),\n };\n return record;\n }\n\n async disable(id: string): Promise<A2AApiKeyRecord> {\n const now = nowISO();\n this.db.prepare(\n `UPDATE lt_a2a_api_keys SET enabled = 0, updated_at = ? WHERE id = ?`,\n ).run(now, id);\n const row = this.db.prepare(`SELECT * FROM lt_a2a_api_keys WHERE id = ?`).get(id) as unknown as KeyRow;\n if (!row) throw new Error(`A2A API key not found: ${id}`);\n return mapRowToRecord(row);\n }\n\n async enable(id: string): Promise<A2AApiKeyRecord> {\n const now = nowISO();\n this.db.prepare(\n `UPDATE lt_a2a_api_keys SET enabled = 1, updated_at = ? WHERE id = ?`,\n ).run(now, id);\n const row = this.db.prepare(`SELECT * FROM lt_a2a_api_keys WHERE id = ?`).get(id) as unknown as KeyRow;\n if (!row) throw new Error(`A2A API key not found: ${id}`);\n return mapRowToRecord(row);\n }\n\n\n async update(id: string, input: UpdateA2AApiKeyInput): Promise<A2AApiKeyRecord> {\n const sets: string[] = [];\n const values: unknown[] = [];\n if (input.label !== undefined) { sets.push(\"label = ?\"); values.push(input.label || null); }\n if (input.projectId !== undefined) { sets.push(\"project_id = ?\"); values.push(input.projectId); }\n if (input.assistantIds !== undefined) { sets.push(\"assistant_ids = ?\"); values.push(input.assistantIds ? JSON.stringify(input.assistantIds) : null); }\n if (input.grants !== undefined) { sets.push(\"grants = ?\"); values.push(input.grants ? JSON.stringify(input.grants) : null); }\n if (sets.length === 0) {\n const row = this.db.prepare(\"SELECT * FROM lt_a2a_api_keys WHERE id = ?\").get(id) as unknown as KeyRow | undefined;\n if (!row) throw new Error(`A2A API key not found: ${id}`);\n return mapRowToRecord(row);\n }\n sets.push(\"updated_at = ?\");\n values.push(nowISO());\n values.push(id);\n this.db.prepare(`UPDATE lt_a2a_api_keys SET ${sets.join(\", \")} WHERE id = ?`).run(...values);\n const row = this.db.prepare(\"SELECT * FROM lt_a2a_api_keys WHERE id = ?\").get(id) as unknown as KeyRow | undefined;\n if (!row) throw new Error(`A2A API key not found: ${id}`);\n return mapRowToRecord(row);\n }\n\n async rotate(id: string): Promise<A2AApiKeyRecord> {\n const key = generateApiKey();\n const now = nowISO();\n this.db.prepare(\n `UPDATE lt_a2a_api_keys SET key_value = ?, updated_at = ? WHERE id = ?`,\n ).run(encrypt(key), now, id);\n const row = this.db.prepare(`SELECT * FROM lt_a2a_api_keys WHERE id = ?`).get(id) as unknown as KeyRow;\n if (!row) throw new Error(`A2A API key not found: ${id}`);\n const record = mapRowToRecord(row);\n record.key = key;\n return record;\n }\n\n async delete(id: string): Promise<void> {\n this.db.prepare(`DELETE FROM lt_a2a_api_keys WHERE id = ?`).run(id);\n }\n\n async loadIntoMap(): Promise<Map<string, A2AApiKeyEntry>> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_a2a_api_keys WHERE enabled = 1`,\n ).all() as unknown as KeyRow[];\n const map = new Map<string, A2AApiKeyEntry>();\n for (const row of rows) {\n try {\n const key = decrypt(row.key_value);\n map.set(key, {\n key,\n tenantId: row.tenant_id,\n projectId: row.project_id,\n assistantIds: parseAssistantIds(row.assistant_ids),\n });\n } catch { /* skip */ }\n }\n return map;\n }\n}\n\nfunction mapRowToRecord(row: KeyRow): A2AApiKeyRecord {\n let key = \"\";\n try { key = decrypt(row.key_value); } catch { key = row.key_value; }\n return {\n id: row.id,\n key,\n tenantId: row.tenant_id,\n projectId: row.project_id,\n assistantIds: parseAssistantIds(row.assistant_ids),\n grants: parseGrants(row.grants),\n label: row.label || undefined,\n enabled: row.enabled === 1,\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","/**\n * Local SQLite implementation of the Open audit store (append-only).\n */\n\nimport { DatabaseWrapper, ensureTable, nowISO, parseISO } from \"../database\";\nimport type {\n OpenAuditStore,\n OpenAuditAppendInput,\n OpenAuditQuery,\n OpenAuditRecord,\n} from \"@axiom-lattice/protocols\";\nimport { randomUUID } from \"crypto\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_open_audit (\n id TEXT PRIMARY KEY,\n tenant_id TEXT NOT NULL,\n credential_id TEXT NOT NULL,\n credential_kind TEXT NOT NULL,\n project_id TEXT NOT NULL,\n domain TEXT NOT NULL,\n action TEXT NOT NULL,\n args TEXT,\n status TEXT NOT NULL,\n error_code TEXT,\n duration_ms INTEGER NOT NULL,\n created_at TEXT NOT NULL\n);\n`;\n\n/** SQLite-backed append-only audit store for the Open API surface. */\nexport class LocalOpenAuditStore implements OpenAuditStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async query(params: OpenAuditQuery): Promise<OpenAuditRecord[]> {\n const clauses = [\"tenant_id = ?\"];\n const values: unknown[] = [params.tenantId];\n if (params.credentialId) {\n clauses.push(\"credential_id = ?\");\n values.push(params.credentialId);\n }\n if (params.domain) {\n clauses.push(\"domain = ?\");\n values.push(params.domain);\n }\n if (params.status) {\n clauses.push(\"status = ?\");\n values.push(params.status);\n }\n if (params.from) {\n clauses.push(\"created_at >= ?\");\n values.push(params.from);\n }\n if (params.to) {\n clauses.push(\"created_at < ?\");\n values.push(params.to);\n }\n const limit = params.limit ?? 100;\n const offset = params.offset ?? 0;\n values.push(limit, offset);\n const rows = this.db\n .prepare(\n `SELECT * FROM lt_open_audit WHERE ${clauses.join(\" AND \")}\n ORDER BY created_at DESC LIMIT ? OFFSET ?`,\n )\n .all(...values) as unknown as Array<Record<string, unknown>>;\n return rows.map((row) => ({\n id: row.id as string,\n tenantId: row.tenant_id as string,\n credentialId: row.credential_id as string,\n credentialKind: row.credential_kind as OpenAuditRecord[\"credentialKind\"],\n projectId: row.project_id as string,\n domain: row.domain as string,\n action: row.action as string,\n args: row.args ? JSON.parse(row.args as string) : undefined,\n status: row.status as \"ok\" | \"error\",\n errorCode: (row.error_code as string) ?? undefined,\n durationMs: row.duration_ms as number,\n createdAt: parseISO(row.created_at as string),\n }));\n }\n\n async append(record: OpenAuditAppendInput): Promise<void> {\n this.db\n .prepare(\n `INSERT INTO lt_open_audit\n (id, tenant_id, credential_id, credential_kind, project_id, domain, action, args, status, error_code, duration_ms, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n randomUUID(),\n record.tenantId,\n record.credentialId,\n record.credentialKind,\n record.projectId,\n record.domain,\n record.action,\n record.args === undefined ? null : JSON.stringify(record.args),\n record.status,\n record.errorCode ?? null,\n Math.max(0, Math.round(record.durationMs)),\n nowISO(),\n );\n }\n}\n","/**\n * Local SQLite implementation of IMessageQueueStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n IMessageQueueStore,\n PendingMessage,\n AddMessageParams,\n ThreadInfo,\n QueueScope,\n} from \"@axiom-lattice/core\";\nimport {\n parseQueuedExecutionMode,\n parseTrustedRunContext,\n type QueuedExecutionMode,\n type TrustedRunContext,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\nimport { randomUUID } from \"crypto\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_thread_message_queue (\n id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n assistant_id TEXT NOT NULL,\n workspace_id TEXT,\n project_id TEXT,\n message_content TEXT NOT NULL,\n message_type TEXT NOT NULL DEFAULT 'human',\n sequence_order INTEGER NOT NULL DEFAULT 0,\n priority INTEGER NOT NULL DEFAULT 0,\n status TEXT NOT NULL DEFAULT 'pending',\n command TEXT,\n custom_run_config TEXT,\n trusted_run_context TEXT,\n execution_mode TEXT CHECK (execution_mode IS NULL OR execution_mode = 'followup'),\n created_at TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_lt_tmq_thread ON lt_thread_message_queue(thread_id, status);\nCREATE INDEX IF NOT EXISTS idx_lt_tmq_pending ON lt_thread_message_queue(status, priority DESC, sequence_order ASC);\n`;\n\ninterface QueueRow {\n id: string;\n thread_id: string;\n tenant_id: string;\n assistant_id: string;\n workspace_id: string | null;\n project_id: string | null;\n message_content: string;\n message_type: string;\n sequence_order: number;\n priority: number;\n status: string;\n command: string | null;\n custom_run_config: string | null;\n trusted_run_context: string | null;\n execution_mode: string | null;\n created_at: string;\n}\n\nexport class LocalThreadMessageQueueStore implements IMessageQueueStore {\n private db: DatabaseWrapper;\n private capacityTail: Promise<void> = Promise.resolve();\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n const columns = db.prepare(\"PRAGMA table_info(lt_thread_message_queue)\").all() as Array<{ name: string }>;\n const names = new Set(columns.map(({ name }) => name));\n if (!names.has(\"trusted_run_context\")) {\n db.run(\"ALTER TABLE lt_thread_message_queue ADD COLUMN trusted_run_context TEXT\");\n }\n if (!names.has(\"execution_mode\")) {\n db.run(\"ALTER TABLE lt_thread_message_queue ADD COLUMN execution_mode TEXT CHECK (execution_mode IS NULL OR execution_mode = 'followup')\");\n }\n }\n\n async addMessage(params: AddMessageParams): Promise<PendingMessage> {\n const trusted = validateQueueTrust(params);\n const now = nowISO();\n const id = params.id || randomUUID();\n\n const seqRow = this.db.prepare(\n `SELECT COALESCE(MAX(sequence_order), 0) + 1 as next_seq FROM lt_thread_message_queue WHERE thread_id = ?`,\n ).get(params.threadId) as { next_seq: number };\n const nextSeq = seqRow.next_seq;\n\n this.db.prepare(\n `INSERT INTO lt_thread_message_queue (id, thread_id, tenant_id, assistant_id, workspace_id, project_id, message_content, message_type, sequence_order, priority, command, custom_run_config, trusted_run_context, execution_mode, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n id, params.threadId, params.tenantId, params.assistantId,\n params.workspaceId ?? null, params.projectId ?? null,\n JSON.stringify(params.content), params.type || \"human\", nextSeq,\n params.priority ?? 0,\n params.command ? JSON.stringify(params.command) : null,\n params.custom_run_config ? JSON.stringify(params.custom_run_config) : null,\n trusted.trustedRunContext ? JSON.stringify(trusted.trustedRunContext) : null,\n trusted.executionMode ?? null,\n now,\n );\n\n return this.getById(id);\n }\n\n async addMessageIfCapacity(params: AddMessageParams, maxSize: number): Promise<boolean> {\n const trusted = validateQueueTrust(params);\n let release!: () => void;\n const previous = this.capacityTail;\n this.capacityTail = new Promise<void>((resolve) => { release = resolve; });\n await previous;\n try {\n const scope = {\n tenantId: params.tenantId,\n assistantId: params.assistantId,\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n };\n const filter = scopeClause(scope);\n const id = params.id || randomUUID();\n const limit = maxSize === Infinity ? -1 : maxSize;\n const result = this.db.prepare(\n `INSERT INTO lt_thread_message_queue (id, thread_id, tenant_id, assistant_id, workspace_id, project_id, message_content, message_type, sequence_order, priority, command, custom_run_config, trusted_run_context, execution_mode, created_at)\n SELECT ?, ?, ?, ?, ?, ?, ?, ?,\n (SELECT COALESCE(MAX(sequence_order), 0) + 1 FROM lt_thread_message_queue WHERE thread_id = ?),\n ?, ?, ?, ?, ?,\n ?\n WHERE ? = -1 OR (SELECT COUNT(*) FROM lt_thread_message_queue WHERE thread_id = ? AND status = 'pending'${filter.sql}) < ?`,\n ).run(\n id, params.threadId, params.tenantId, params.assistantId,\n params.workspaceId ?? null, params.projectId ?? null,\n JSON.stringify(params.content), params.type || \"human\",\n params.threadId,\n params.priority ?? 0,\n params.command ? JSON.stringify(params.command) : null,\n params.custom_run_config ? JSON.stringify(params.custom_run_config) : null,\n trusted.trustedRunContext ? JSON.stringify(trusted.trustedRunContext) : null,\n trusted.executionMode ?? null,\n nowISO(), limit, params.threadId, ...filter.params, limit,\n );\n return result.changes > 0;\n } finally {\n release();\n }\n }\n\n async addMessageAtHead(params: AddMessageParams): Promise<PendingMessage> {\n const trusted = validateQueueTrust(params);\n const now = nowISO();\n const id = params.id || randomUUID();\n\n const seqRow = this.db.prepare(\n `SELECT COALESCE(MAX(sequence_order), 0) + 1 as next_seq FROM lt_thread_message_queue WHERE thread_id = ?`,\n ).get(params.threadId) as { next_seq: number };\n\n this.db.prepare(\n `INSERT INTO lt_thread_message_queue (id, thread_id, tenant_id, assistant_id, workspace_id, project_id, message_content, message_type, sequence_order, priority, command, custom_run_config, trusted_run_context, execution_mode, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 100, ?, ?, ?, ?, ?)`,\n ).run(\n id, params.threadId, params.tenantId!, params.assistantId!,\n params.workspaceId ?? null, params.projectId ?? null,\n JSON.stringify(params.content), params.type || \"human\", seqRow.next_seq,\n params.command ? JSON.stringify(params.command) : null,\n params.custom_run_config ? JSON.stringify(params.custom_run_config) : null,\n trusted.trustedRunContext ? JSON.stringify(trusted.trustedRunContext) : null,\n trusted.executionMode ?? null,\n now,\n );\n\n return this.getById(id);\n }\n\n async getPendingMessages(threadId: string, scope?: QueueScope): Promise<PendingMessage[]> {\n const filter = scopeClause(scope);\n const rows = this.db.prepare(\n `SELECT * FROM lt_thread_message_queue WHERE thread_id = ? AND status = 'pending'${filter.sql} ORDER BY priority DESC, sequence_order ASC`,\n ).all(threadId, ...filter.params) as unknown as QueueRow[];\n return rows.map(rowToMessage);\n }\n\n async getProcessingMessages(threadId: string, scope?: QueueScope): Promise<PendingMessage[]> {\n const filter = scopeClause(scope);\n const rows = this.db.prepare(\n `SELECT * FROM lt_thread_message_queue WHERE thread_id = ? AND status = 'processing'${filter.sql} ORDER BY priority DESC, sequence_order ASC`,\n ).all(threadId, ...filter.params) as unknown as QueueRow[];\n return rows.map(rowToMessage);\n }\n\n async getQueueSize(threadId: string, scope?: QueueScope): Promise<number> {\n const filter = scopeClause(scope);\n const row = this.db.prepare(\n `SELECT COUNT(*) as count FROM lt_thread_message_queue WHERE thread_id = ? AND status = 'pending'${filter.sql}`,\n ).get(threadId, ...filter.params) as { count: number };\n return row.count;\n }\n\n async getThreadsWithPendingMessages(): Promise<ThreadInfo[]> {\n const rows = this.db.prepare(\n `SELECT tenant_id, assistant_id, thread_id, workspace_id, project_id FROM lt_thread_message_queue WHERE status IN ('pending', 'processing') GROUP BY tenant_id, assistant_id, thread_id, workspace_id, project_id ORDER BY thread_id`,\n ).all() as { tenant_id: string; assistant_id: string; thread_id: string; workspace_id: string | null; project_id: string | null }[];\n return rows.map((r) => ({\n tenantId: r.tenant_id,\n assistantId: r.assistant_id,\n threadId: r.thread_id,\n workspaceId: r.workspace_id,\n projectId: r.project_id,\n }));\n }\n\n async removeMessage(messageId: string, scope?: QueueScope): Promise<boolean> {\n const filter = scopeClause(scope);\n const result = this.db.prepare(`DELETE FROM lt_thread_message_queue WHERE id = ?${filter.sql}`).run(messageId, ...filter.params);\n return result.changes > 0;\n }\n\n async clearMessages(threadId: string, scope?: QueueScope): Promise<void> {\n const filter = scopeClause(scope);\n this.db.prepare(`DELETE FROM lt_thread_message_queue WHERE thread_id = ?${filter.sql}`).run(threadId, ...filter.params);\n }\n\n async markProcessing(messageId: string, customRunConfig?: unknown, scope?: QueueScope): Promise<void> {\n const filter = scopeClause(scope);\n if (customRunConfig === undefined) {\n this.db.prepare(`UPDATE lt_thread_message_queue SET status = 'processing' WHERE id = ?${filter.sql}`).run(messageId, ...filter.params);\n return;\n }\n this.db.prepare(\n `UPDATE lt_thread_message_queue SET status = 'processing', custom_run_config = ? WHERE id = ?${filter.sql}`,\n ).run(JSON.stringify(customRunConfig), messageId, ...filter.params);\n }\n\n async resetProcessingToPending(threadId: string, scope?: QueueScope): Promise<number> {\n const filter = scopeClause(scope);\n const result = this.db.prepare(\n `UPDATE lt_thread_message_queue SET status = 'pending' WHERE thread_id = ? AND status = 'processing'${filter.sql}`,\n ).run(threadId, ...filter.params);\n return result.changes;\n }\n\n private getById(id: string): PendingMessage {\n const row = this.db.prepare(`SELECT * FROM lt_thread_message_queue WHERE id = ?`).get(id) as unknown as QueueRow;\n return rowToMessage(row);\n }\n}\n\nfunction validateQueueTrust(params: AddMessageParams): {\n trustedRunContext: TrustedRunContext | undefined;\n executionMode: QueuedExecutionMode | undefined;\n} {\n return {\n trustedRunContext: params.trusted_run_context === undefined\n ? undefined\n : parseTrustedRunContext(params.trusted_run_context),\n executionMode: params.execution_mode === undefined\n ? undefined\n : parseQueuedExecutionMode(params.execution_mode),\n };\n}\n\nfunction scopeClause(scope?: QueueScope): { sql: string; params: unknown[] } {\n if (!scope) return { sql: \"\", params: [] };\n const entries = ([\"tenantId\", \"assistantId\", \"workspaceId\", \"projectId\"] as const)\n .map((key) => [key, scope[key]] as const);\n return {\n sql: entries.map(([key, value]) => ` AND ${key.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`)} ${value == null ? \"IS NULL\" : \"= ?\"}`).join(\"\"),\n params: entries.flatMap(([, value]) => value == null ? [] : [value]),\n };\n}\n\nfunction rowToMessage(row: QueueRow): PendingMessage {\n return {\n id: row.id,\n content: JSON.parse(row.message_content),\n type: row.message_type as \"human\" | \"system\",\n sequence: row.sequence_order,\n createdAt: parseISO(row.created_at),\n priority: row.priority || 0,\n command: row.command ? JSON.parse(row.command) : undefined,\n custom_run_config: row.custom_run_config ? JSON.parse(row.custom_run_config) : undefined,\n trusted_run_context: row.trusted_run_context\n ? parseTrustedRunContext(JSON.parse(row.trusted_run_context))\n : undefined,\n execution_mode: row.execution_mode == null ? undefined : parseQueuedExecutionMode(row.execution_mode),\n };\n}\n","/**\n * Local SQLite implementation of SkillStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n SkillStore,\n Skill,\n CreateSkillRequest,\n SkillStoreContext,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_skills (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n name TEXT NOT NULL,\n description TEXT NOT NULL,\n license TEXT,\n compatibility TEXT,\n metadata TEXT DEFAULT '{}',\n content TEXT,\n sub_skills TEXT DEFAULT '[]',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\n`;\n\ninterface SkillRow {\n id: string;\n tenant_id: string;\n name: string;\n description: string;\n license: string | null;\n compatibility: string | null;\n metadata: string;\n content: string | null;\n sub_skills: string;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalSkillStore implements SkillStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async getAllSkills(tenantId: string, _context?: SkillStoreContext): Promise<Skill[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_skills WHERE tenant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId) as unknown as SkillRow[];\n return rows.map(mapRowToSkill);\n }\n\n async getSkillById(tenantId: string, id: string, _context?: SkillStoreContext): Promise<Skill | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_skills WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as SkillRow | undefined;\n return row ? mapRowToSkill(row) : null;\n }\n\n async createSkill(tenantId: string, id: string, data: CreateSkillRequest, _context?: SkillStoreContext): Promise<Skill> {\n const now = nowISO();\n\n this.db.prepare(\n `INSERT INTO lt_skills (id, tenant_id, name, description, license, compatibility, metadata, content, sub_skills, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(tenant_id, id) DO UPDATE SET\n name = excluded.name, description = excluded.description,\n license = excluded.license, compatibility = excluded.compatibility,\n metadata = excluded.metadata, content = excluded.content,\n sub_skills = excluded.sub_skills, updated_at = excluded.updated_at`,\n ).run(id, tenantId, data.name, data.description,\n data.license || null, data.compatibility || null,\n JSON.stringify(data.metadata || {}), data.content || null,\n JSON.stringify(data.subSkills || []), now, now);\n\n return {\n id, tenantId, name: data.name, description: data.description,\n license: data.license, compatibility: data.compatibility,\n metadata: data.metadata || {}, content: data.content,\n subSkills: data.subSkills,\n createdAt: parseISO(now), updatedAt: parseISO(now),\n };\n }\n\n async updateSkill(\n tenantId: string, id: string, updates: Partial<CreateSkillRequest>, _context?: SkillStoreContext,\n ): Promise<Skill | null> {\n const existing = await this.getSkillById(tenantId, id);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.name !== undefined) { setClauses.push(\"name = ?\"); values.push(updates.name); }\n if (updates.description !== undefined) { setClauses.push(\"description = ?\"); values.push(updates.description); }\n if (updates.license !== undefined) { setClauses.push(\"license = ?\"); values.push(updates.license || null); }\n if (updates.compatibility !== undefined) { setClauses.push(\"compatibility = ?\"); values.push(updates.compatibility || null); }\n if (updates.metadata !== undefined) { setClauses.push(\"metadata = ?\"); values.push(JSON.stringify(updates.metadata || {})); }\n if (updates.content !== undefined) { setClauses.push(\"content = ?\"); values.push(updates.content || null); }\n if (updates.subSkills !== undefined) { setClauses.push(\"sub_skills = ?\"); values.push(JSON.stringify(updates.subSkills || [])); }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_skills SET ${setClauses.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...values);\n\n return this.getSkillById(tenantId, id);\n }\n\n async deleteSkill(tenantId: string, id: string, _context?: SkillStoreContext): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_skills WHERE tenant_id = ? AND id = ?`,\n ).run(tenantId, id);\n return result.changes > 0;\n }\n\n async hasSkill(tenantId: string, id: string, _context?: SkillStoreContext): Promise<boolean> {\n const row = this.db.prepare(\n `SELECT 1 FROM lt_skills WHERE tenant_id = ? AND id = ? LIMIT 1`,\n ).get(tenantId, id);\n return row !== undefined;\n }\n\n async searchByMetadata(\n tenantId: string, metadataKey: string, metadataValue: string, _context?: SkillStoreContext,\n ): Promise<Skill[]> {\n // SQLite doesn't have JSONB operators, so filter in JS\n const all = await this.getAllSkills(tenantId);\n return all.filter((s) => s.metadata?.[metadataKey] === metadataValue);\n }\n\n async filterByCompatibility(tenantId: string, compatibility: string, _context?: SkillStoreContext): Promise<Skill[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_skills WHERE tenant_id = ? AND compatibility = ? ORDER BY created_at DESC`,\n ).all(tenantId, compatibility) as unknown as SkillRow[];\n return rows.map(mapRowToSkill);\n }\n\n async filterByLicense(tenantId: string, license: string, _context?: SkillStoreContext): Promise<Skill[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_skills WHERE tenant_id = ? AND license = ? ORDER BY created_at DESC`,\n ).all(tenantId, license) as unknown as SkillRow[];\n return rows.map(mapRowToSkill);\n }\n\n async getSubSkills(tenantId: string, parentSkillName: string, _context?: SkillStoreContext): Promise<Skill[]> {\n // SQLite doesn't have @> for JSON arrays, so filter in JS\n const all = await this.getAllSkills(tenantId);\n return all.filter((s) => s.subSkills?.includes(parentSkillName));\n }\n\n async listSkillResources?(_tenantId: string, _id: string, _context?: SkillStoreContext): Promise<string[]> {\n return [];\n }\n\n async loadSkillResource?(_tenantId: string, _id: string, _resourcePath: string, _context?: SkillStoreContext): Promise<string | null> {\n return null;\n }\n}\n\nfunction mapRowToSkill(row: SkillRow): Skill {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n description: row.description,\n license: row.license || undefined,\n compatibility: row.compatibility || undefined,\n metadata: JSON.parse(row.metadata || \"{}\"),\n content: row.content || undefined,\n subSkills: JSON.parse(row.sub_skills || \"[]\"),\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","/**\n * Local SQLite implementation of ScheduleStorage.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport {\n ScheduleStorage,\n ScheduledTaskDefinition,\n ScheduledTaskStatus,\n ScheduleExecutionType,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_scheduled_tasks (\n task_id TEXT PRIMARY KEY,\n task_type TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n payload TEXT NOT NULL DEFAULT '{}',\n assistant_id TEXT,\n thread_id TEXT,\n execution_type TEXT NOT NULL,\n execute_at TEXT,\n delay_ms INTEGER,\n cron_expression TEXT,\n timezone TEXT,\n next_run_at TEXT,\n last_run_at TEXT,\n status TEXT NOT NULL DEFAULT 'pending',\n run_count INTEGER NOT NULL DEFAULT 0,\n max_runs INTEGER,\n retry_count INTEGER NOT NULL DEFAULT 0,\n max_retries INTEGER NOT NULL DEFAULT 0,\n last_error TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n expires_at TEXT,\n metadata TEXT\n);\nCREATE INDEX IF NOT EXISTS idx_lt_st_status ON lt_scheduled_tasks(status);\nCREATE INDEX IF NOT EXISTS idx_lt_st_type ON lt_scheduled_tasks(task_type);\nCREATE INDEX IF NOT EXISTS idx_lt_st_tenant ON lt_scheduled_tasks(tenant_id);\n`;\n\ninterface TaskRow {\n task_id: string;\n task_type: string;\n tenant_id: string;\n payload: string;\n assistant_id: string | null;\n thread_id: string | null;\n execution_type: string;\n execute_at: string | null;\n delay_ms: number | null;\n cron_expression: string | null;\n timezone: string | null;\n next_run_at: string | null;\n last_run_at: string | null;\n status: string;\n run_count: number;\n max_runs: number | null;\n retry_count: number;\n max_retries: number;\n last_error: string | null;\n created_at: string;\n updated_at: string;\n expires_at: string | null;\n metadata: string | null;\n}\n\nexport class LocalScheduleStorage implements ScheduleStorage {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async save(task: ScheduledTaskDefinition): Promise<void> {\n this.db.prepare(\n `INSERT INTO lt_scheduled_tasks (\n task_id, task_type, tenant_id, payload, assistant_id, thread_id, execution_type,\n execute_at, delay_ms, cron_expression, timezone, next_run_at, last_run_at,\n status, run_count, max_runs, retry_count, max_retries, last_error,\n created_at, updated_at, expires_at, metadata\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(task_id) DO UPDATE SET\n task_type = excluded.task_type, tenant_id = excluded.tenant_id,\n payload = excluded.payload, assistant_id = excluded.assistant_id,\n thread_id = excluded.thread_id, execution_type = excluded.execution_type,\n execute_at = excluded.execute_at, delay_ms = excluded.delay_ms,\n cron_expression = excluded.cron_expression, timezone = excluded.timezone,\n next_run_at = excluded.next_run_at, last_run_at = excluded.last_run_at,\n status = excluded.status, run_count = excluded.run_count,\n max_runs = excluded.max_runs, retry_count = excluded.retry_count,\n max_retries = excluded.max_retries, last_error = excluded.last_error,\n updated_at = excluded.updated_at, expires_at = excluded.expires_at,\n metadata = excluded.metadata`,\n ).run(\n task.taskId, task.taskType, task.tenantId, JSON.stringify(task.payload),\n task.assistantId ?? null, task.threadId ?? null, task.executionType,\n task.executeAt ? new Date(task.executeAt).toISOString() : null,\n task.delayMs ?? null, task.cronExpression ?? null, task.timezone ?? null,\n task.nextRunAt ? new Date(task.nextRunAt).toISOString() : null,\n task.lastRunAt ? new Date(task.lastRunAt).toISOString() : null,\n task.status, task.runCount, task.maxRuns ?? null,\n task.retryCount, task.maxRetries, task.lastError ?? null,\n new Date(task.createdAt).toISOString(), new Date(task.updatedAt).toISOString(),\n task.expiresAt ? new Date(task.expiresAt).toISOString() : null,\n task.metadata ? JSON.stringify(task.metadata) : null,\n );\n }\n\n async get(taskId: string): Promise<ScheduledTaskDefinition | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_scheduled_tasks WHERE task_id = ?`,\n ).get(taskId) as unknown as TaskRow | undefined;\n return row ? mapRowToTask(row) : null;\n }\n\n async update(taskId: string, updates: Partial<ScheduledTaskDefinition>): Promise<void> {\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.taskType !== undefined) { setClauses.push(\"task_type = ?\"); values.push(updates.taskType); }\n if (updates.tenantId !== undefined) { setClauses.push(\"tenant_id = ?\"); values.push(updates.tenantId); }\n if (updates.payload !== undefined) { setClauses.push(\"payload = ?\"); values.push(JSON.stringify(updates.payload)); }\n if (updates.assistantId !== undefined) { setClauses.push(\"assistant_id = ?\"); values.push(updates.assistantId ?? null); }\n if (updates.threadId !== undefined) { setClauses.push(\"thread_id = ?\"); values.push(updates.threadId ?? null); }\n if (updates.executionType !== undefined) { setClauses.push(\"execution_type = ?\"); values.push(updates.executionType); }\n if (updates.executeAt !== undefined) { setClauses.push(\"execute_at = ?\"); values.push(updates.executeAt ? new Date(updates.executeAt).toISOString() : null); }\n if (updates.delayMs !== undefined) { setClauses.push(\"delay_ms = ?\"); values.push(updates.delayMs ?? null); }\n if (updates.cronExpression !== undefined) { setClauses.push(\"cron_expression = ?\"); values.push(updates.cronExpression ?? null); }\n if (updates.timezone !== undefined) { setClauses.push(\"timezone = ?\"); values.push(updates.timezone ?? null); }\n if (updates.nextRunAt !== undefined) { setClauses.push(\"next_run_at = ?\"); values.push(updates.nextRunAt ? new Date(updates.nextRunAt).toISOString() : null); }\n if (updates.lastRunAt !== undefined) { setClauses.push(\"last_run_at = ?\"); values.push(updates.lastRunAt ? new Date(updates.lastRunAt).toISOString() : null); }\n if (updates.status !== undefined) { setClauses.push(\"status = ?\"); values.push(updates.status); }\n if (updates.runCount !== undefined) { setClauses.push(\"run_count = ?\"); values.push(updates.runCount); }\n if (updates.maxRuns !== undefined) { setClauses.push(\"max_runs = ?\"); values.push(updates.maxRuns ?? null); }\n if (updates.retryCount !== undefined) { setClauses.push(\"retry_count = ?\"); values.push(updates.retryCount); }\n if (updates.maxRetries !== undefined) { setClauses.push(\"max_retries = ?\"); values.push(updates.maxRetries); }\n if (updates.lastError !== undefined) { setClauses.push(\"last_error = ?\"); values.push(updates.lastError ?? null); }\n if (updates.expiresAt !== undefined) { setClauses.push(\"expires_at = ?\"); values.push(updates.expiresAt ? new Date(updates.expiresAt).toISOString() : null); }\n if (updates.metadata !== undefined) { setClauses.push(\"metadata = ?\"); values.push(updates.metadata ? JSON.stringify(updates.metadata) : null); }\n\n if (setClauses.length === 0) return;\n\n setClauses.push(\"updated_at = ?\");\n values.push(new Date().toISOString());\n values.push(taskId);\n\n this.db.prepare(\n `UPDATE lt_scheduled_tasks SET ${setClauses.join(\", \")} WHERE task_id = ?`,\n ).run(...values);\n }\n\n async delete(taskId: string): Promise<void> {\n this.db.prepare(`DELETE FROM lt_scheduled_tasks WHERE task_id = ?`).run(taskId);\n }\n\n async getActiveTasks(): Promise<ScheduledTaskDefinition[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_scheduled_tasks WHERE status IN ('pending', 'paused') ORDER BY created_at ASC`,\n ).all() as unknown as TaskRow[];\n return rows.map(mapRowToTask);\n }\n\n async getTasksByType(taskType: string): Promise<ScheduledTaskDefinition[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_scheduled_tasks WHERE task_type = ? ORDER BY created_at DESC`,\n ).all(taskType) as unknown as TaskRow[];\n return rows.map(mapRowToTask);\n }\n\n async getTasksByStatus(status: ScheduledTaskStatus): Promise<ScheduledTaskDefinition[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_scheduled_tasks WHERE status = ? ORDER BY created_at DESC`,\n ).all(status) as unknown as TaskRow[];\n return rows.map(mapRowToTask);\n }\n\n async getTasksByExecutionType(executionType: ScheduleExecutionType): Promise<ScheduledTaskDefinition[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_scheduled_tasks WHERE execution_type = ? ORDER BY created_at DESC`,\n ).all(executionType) as unknown as TaskRow[];\n return rows.map(mapRowToTask);\n }\n\n async getTasksByAssistantId(assistantId: string): Promise<ScheduledTaskDefinition[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_scheduled_tasks WHERE assistant_id = ? ORDER BY created_at DESC`,\n ).all(assistantId) as unknown as TaskRow[];\n return rows.map(mapRowToTask);\n }\n\n async getTasksByThreadId(threadId: string): Promise<ScheduledTaskDefinition[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_scheduled_tasks WHERE thread_id = ? ORDER BY created_at DESC`,\n ).all(threadId) as unknown as TaskRow[];\n return rows.map(mapRowToTask);\n }\n\n async getAllTasks(filters?: {\n tenantId?: string; status?: ScheduledTaskStatus;\n executionType?: ScheduleExecutionType; taskType?: string;\n assistantId?: string; threadId?: string;\n limit?: number; offset?: number;\n }): Promise<ScheduledTaskDefinition[]> {\n const conditions: string[] = [];\n const values: unknown[] = [];\n\n if (filters?.tenantId !== undefined) { conditions.push(\"tenant_id = ?\"); values.push(filters.tenantId); }\n if (filters?.status !== undefined) { conditions.push(\"status = ?\"); values.push(filters.status); }\n if (filters?.executionType !== undefined) { conditions.push(\"execution_type = ?\"); values.push(filters.executionType); }\n if (filters?.taskType !== undefined) { conditions.push(\"task_type = ?\"); values.push(filters.taskType); }\n if (filters?.assistantId !== undefined) { conditions.push(\"assistant_id = ?\"); values.push(filters.assistantId); }\n if (filters?.threadId !== undefined) { conditions.push(\"thread_id = ?\"); values.push(filters.threadId); }\n\n let query = `SELECT * FROM lt_scheduled_tasks`;\n if (conditions.length > 0) query += ` WHERE ${conditions.join(\" AND \")}`;\n query += ` ORDER BY created_at DESC`;\n\n if (filters?.limit !== undefined) { query += ` LIMIT ?`; values.push(filters.limit); }\n if (filters?.offset !== undefined) { query += ` OFFSET ?`; values.push(filters.offset); }\n\n const rows = this.db.prepare(query).all(...values) as unknown as TaskRow[];\n return rows.map(mapRowToTask);\n }\n\n async countTasks(filters?: {\n tenantId?: string; status?: ScheduledTaskStatus;\n executionType?: ScheduleExecutionType; taskType?: string;\n assistantId?: string; threadId?: string;\n }): Promise<number> {\n const conditions: string[] = [];\n const values: unknown[] = [];\n\n if (filters?.tenantId !== undefined) { conditions.push(\"tenant_id = ?\"); values.push(filters.tenantId); }\n if (filters?.status !== undefined) { conditions.push(\"status = ?\"); values.push(filters.status); }\n if (filters?.executionType !== undefined) { conditions.push(\"execution_type = ?\"); values.push(filters.executionType); }\n if (filters?.taskType !== undefined) { conditions.push(\"task_type = ?\"); values.push(filters.taskType); }\n if (filters?.assistantId !== undefined) { conditions.push(\"assistant_id = ?\"); values.push(filters.assistantId); }\n if (filters?.threadId !== undefined) { conditions.push(\"thread_id = ?\"); values.push(filters.threadId); }\n\n let query = `SELECT COUNT(*) as count FROM lt_scheduled_tasks`;\n if (conditions.length > 0) query += ` WHERE ${conditions.join(\" AND \")}`;\n\n const row = this.db.prepare(query).get(...values) as { count: number };\n return row.count;\n }\n\n async deleteOldTasks(olderThanMs: number): Promise<number> {\n const cutoff = new Date(Date.now() - olderThanMs).toISOString();\n const result = this.db.prepare(\n `DELETE FROM lt_scheduled_tasks WHERE status IN ('completed', 'cancelled', 'failed') AND updated_at < ?`,\n ).run(cutoff);\n return result.changes;\n }\n}\n\nfunction mapRowToTask(row: TaskRow): ScheduledTaskDefinition {\n return {\n taskId: row.task_id,\n taskType: row.task_type,\n tenantId: row.tenant_id,\n payload: JSON.parse(row.payload || \"{}\"),\n assistantId: row.assistant_id ?? undefined,\n threadId: row.thread_id ?? undefined,\n executionType: row.execution_type as ScheduleExecutionType,\n executeAt: row.execute_at ? new Date(row.execute_at).getTime() : undefined,\n delayMs: row.delay_ms ?? undefined,\n cronExpression: row.cron_expression ?? undefined,\n timezone: row.timezone ?? undefined,\n nextRunAt: row.next_run_at ? new Date(row.next_run_at).getTime() : undefined,\n lastRunAt: row.last_run_at ? new Date(row.last_run_at).getTime() : undefined,\n status: row.status as ScheduledTaskStatus,\n runCount: row.run_count,\n maxRuns: row.max_runs ?? undefined,\n retryCount: row.retry_count,\n maxRetries: row.max_retries,\n lastError: row.last_error ?? undefined,\n createdAt: new Date(row.created_at).getTime(),\n updatedAt: new Date(row.updated_at).getTime(),\n expiresAt: row.expires_at ? new Date(row.expires_at).getTime() : undefined,\n metadata: row.metadata ? JSON.parse(row.metadata) : undefined,\n };\n}\n","/**\n * Local SQLite implementation of TaskStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport { normalizeTaskMetadataScalar } from \"@axiom-lattice/protocols\";\nimport type {\n TaskStore,\n TaskItem,\n TaskFileRef,\n CreateTaskRequest,\n UpdateTaskRequest,\n TaskListFilter,\n TaskDependentListQuery,\n TaskMutationSnapshot,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\nimport { randomUUID } from \"crypto\";\n\nconst MAX_CANONICAL_TASK_TIME = \"9999-12-31T23:59:59.999Z\";\nconst TASK_STATUSES: ReadonlySet<string> = new Set([\n \"pending\", \"in_progress\", \"review\", \"failed\", \"interrupted\", \"completed\", \"cancelled\",\n]);\nconst NEXT_UPDATED_AT_SQL = `updated_at = CASE\n WHEN strftime('%Y-%m-%dT%H:%M:%fZ', updated_at) = updated_at AND updated_at >= ?\n THEN strftime('%Y-%m-%dT%H:%M:%fZ', updated_at, '+0.001 seconds')\n ELSE ?\nEND`;\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_tasks (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n owner_type TEXT NOT NULL DEFAULT 'user',\n owner_id TEXT NOT NULL,\n title TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'pending',\n priority TEXT NOT NULL DEFAULT 'medium',\n due_date TEXT,\n metadata TEXT,\n parent_id TEXT,\n source_id TEXT,\n context TEXT,\n require_review INTEGER DEFAULT 0,\n dependencies TEXT,\n result TEXT,\n failure_reason TEXT,\n workspace_id TEXT,\n project_id TEXT,\n files TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\n`;\n\ninterface TaskRow {\n id: string;\n tenant_id: string;\n owner_type: string;\n owner_id: string;\n title: string;\n description: string | null;\n status: string;\n priority: string;\n due_date: string | null;\n metadata: string | null;\n parent_id: string | null;\n source_id: string | null;\n context: string | null;\n require_review: number | null;\n dependencies: string | null;\n result: string | null;\n failure_reason: string | null;\n workspace_id: string | null;\n project_id: string | null;\n files: string | null;\n created_at: string;\n updated_at: string;\n}\n\nfunction parseTaskFiles(raw: unknown): TaskFileRef[] | undefined {\n if (!raw) return undefined;\n try {\n const parsed = typeof raw === \"string\" ? JSON.parse(raw) : raw;\n if (!Array.isArray(parsed)) return undefined;\n return parsed as TaskFileRef[];\n } catch {\n return undefined;\n }\n}\n\nfunction mapRowToTask(row: TaskRow): TaskItem {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n ownerType: row.owner_type as 'user' | 'agent',\n ownerId: row.owner_id,\n title: row.title,\n description: row.description ?? undefined,\n status: row.status as TaskItem['status'],\n priority: row.priority as TaskItem['priority'],\n dueDate: row.due_date ?? undefined,\n metadata: row.metadata ? JSON.parse(row.metadata) : undefined,\n parentId: row.parent_id ?? undefined,\n sourceId: row.source_id ?? undefined,\n context: row.context ? JSON.parse(row.context) : undefined,\n requireReview: row.require_review === 1 ? true : (row.require_review ? true : undefined),\n dependencies: row.dependencies ? JSON.parse(row.dependencies) : undefined,\n result: row.result || undefined,\n failureReason: row.failure_reason || undefined,\n workspaceId: row.workspace_id ?? undefined,\n projectId: row.project_id ?? undefined,\n files: parseTaskFiles(row.files),\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n\nfunction nextISO(previous: Date | string): string {\n const previousMs = new Date(previous).getTime();\n return new Date(Math.max(Date.now(), previousMs + 1)).toISOString();\n}\n\nfunction assertPage(limit: number, offset = 0): void {\n if (!Number.isSafeInteger(limit) || limit < 1 || limit > 100\n || !Number.isSafeInteger(offset) || offset < 0) throw new RangeError(\"Invalid task page\");\n}\n\nexport class LocalTaskStore implements TaskStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n // Existing installs: add columns shipped after the original schema.\n // sql.js bundles an older SQLite that does not support\n // `ADD COLUMN IF NOT EXISTS`, so check via PRAGMA instead.\n this.ensureColumn(\"lt_tasks\", \"require_review\", \"require_review INTEGER DEFAULT 0\");\n this.ensureColumn(\"lt_tasks\", \"dependencies\", \"dependencies TEXT\");\n this.ensureColumn(\"lt_tasks\", \"result\", \"result TEXT\");\n this.ensureColumn(\"lt_tasks\", \"failure_reason\", \"failure_reason TEXT\");\n this.ensureColumn(\"lt_tasks\", \"workspace_id\", \"workspace_id TEXT\");\n this.ensureColumn(\"lt_tasks\", \"project_id\", \"project_id TEXT\");\n this.ensureColumn(\"lt_tasks\", \"files\", \"files TEXT\");\n }\n\n /** Add a column if it does not exist (SQLite version compatible). */\n private ensureColumn(table: string, column: string, ddl: string): void {\n const cols = this.db.prepare(`PRAGMA table_info(${table})`).all() as Array<{ name: string }>;\n if (!cols.some((c) => c.name === column)) {\n this.db.exec(`ALTER TABLE ${table} ADD COLUMN ${ddl}`);\n }\n }\n\n async create(\n params: CreateTaskRequest & { tenantId: string; ownerType: string; ownerId: string },\n ): Promise<TaskItem> {\n const id = params.id ?? randomUUID();\n const now = nowISO();\n\n this.db.prepare(\n `INSERT INTO lt_tasks (id, tenant_id, owner_type, owner_id, title, description, status, priority, due_date, metadata, parent_id, source_id, context, require_review, dependencies, result, failure_reason, workspace_id, project_id, files, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n id, params.tenantId, params.ownerType, params.ownerId, params.title,\n params.description || null, params.status || 'pending', params.priority || 'medium',\n params.dueDate || null, params.metadata ? JSON.stringify(params.metadata) : null,\n params.parentId || null, params.sourceId || null,\n params.context ? JSON.stringify(params.context) : null,\n params.requireReview ? 1 : 0,\n params.dependencies ? JSON.stringify(params.dependencies) : null,\n params.result || null, params.failureReason || null,\n params.workspaceId || null, params.projectId || null,\n params.files ? JSON.stringify(params.files) : null,\n now, now,\n );\n\n return (await this.getById(params.tenantId, id))!;\n }\n\n async getById(tenantId: string, id: string): Promise<TaskItem | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_tasks WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as TaskRow | undefined;\n return row ? mapRowToTask(row) : null;\n }\n\n async list(filter: TaskListFilter): Promise<TaskItem[]> {\n const conditions: string[] = ['tenant_id = ?'];\n const params: unknown[] = [filter.tenantId];\n\n if (filter.ownerType) { conditions.push('owner_type = ?'); params.push(filter.ownerType); }\n if (filter.ownerId) { conditions.push('owner_id = ?'); params.push(filter.ownerId); }\n if (filter.status) {\n const statuses = filter.status.split(',').map(s => s.trim()).filter(Boolean);\n const placeholders = statuses.map(() => '?').join(', ');\n conditions.push(`status IN (${placeholders})`);\n params.push(...statuses);\n }\n if (filter.priority) { conditions.push('priority = ?'); params.push(filter.priority); }\n if (filter.workspaceId) { conditions.push('workspace_id = ?'); params.push(filter.workspaceId); }\n if (filter.projectId === null) conditions.push(\"(project_id IS NULL OR project_id = '' OR project_id = 'default')\");\n else if (filter.projectId !== undefined) { conditions.push('project_id = ?'); params.push(filter.projectId); }\n if (filter.parentId) { conditions.push('parent_id = ?'); params.push(filter.parentId); }\n if (filter.sourceId) { conditions.push('source_id = ?'); params.push(filter.sourceId); }\n if (filter.metadata) {\n for (const [key, value] of Object.entries(filter.metadata)) {\n const safeKey = key.replace(/[^a-zA-Z0-9_]/g, '');\n const expected = normalizeTaskMetadataScalar(value);\n if (!safeKey || expected === undefined) continue;\n // Match PostgreSQL's metadata->> text convention: JSON booleans map to\n // 'true'/'false', and everything else compares by CAST-to-text so a\n // stored number 2 and string \"2\" are equal. Excluding json_type\n // true/false from the text branch keeps boolean true distinct from 1.\n if (expected === 'true' || expected === 'false') {\n conditions.push(\n `(json_type(metadata, '$.${safeKey}') = ? OR CAST(json_extract(metadata, '$.${safeKey}') AS TEXT) = ?)`,\n );\n params.push(expected, expected);\n } else {\n conditions.push(\n `(json_type(metadata, '$.${safeKey}') NOT IN ('true', 'false') AND CAST(json_extract(metadata, '$.${safeKey}') AS TEXT) = ?)`,\n );\n params.push(expected);\n }\n }\n }\n\n const where = conditions.join(' AND ');\n const limit = filter.limit || 100;\n const offset = filter.offset || 0;\n\n const rows = this.db.prepare(\n `SELECT * FROM lt_tasks WHERE ${where} ORDER BY created_at DESC, id DESC LIMIT ? OFFSET ?`,\n ).all(...params, limit, offset) as unknown as TaskRow[];\n return rows.map(mapRowToTask);\n }\n\n /** Lists exact project tasks containing a string dependency. */\n async listDependents(query: TaskDependentListQuery): Promise<TaskItem[]> {\n assertPage(query.limit, query.offset);\n if (query.statuses.length === 0 || query.statuses.some((status) => !TASK_STATUSES.has(status))) {\n throw new RangeError(\"Invalid task statuses\");\n }\n const rows = this.db.prepare(\n `SELECT task.* FROM lt_tasks AS task\n WHERE task.tenant_id = ? AND task.workspace_id = ? AND task.project_id = ?\n AND task.status IN (${query.statuses.map(() => \"?\").join(\", \")})\n AND task.dependencies IS NOT NULL\n AND json_valid(task.dependencies) = 1\n AND json_type(CASE WHEN json_valid(task.dependencies)=1\n THEN task.dependencies ELSE '[]' END) = 'array'\n AND EXISTS (\n SELECT 1 FROM json_each(\n CASE WHEN json_valid(task.dependencies)=1 THEN\n CASE WHEN json_type(task.dependencies)='array' THEN task.dependencies ELSE '[]' END\n ELSE '[]' END\n ) AS dependency\n WHERE dependency.type = 'text' AND dependency.value = ?\n )\n ORDER BY task.created_at DESC, task.id DESC LIMIT ? OFFSET ?`,\n ).all(query.tenantId, query.workspaceId, query.projectId, ...query.statuses,\n query.dependencyTaskId, query.limit, query.offset) as unknown as TaskRow[];\n return rows.map(mapRowToTask);\n }\n\n async update(\n tenantId: string,\n id: string,\n updates: UpdateTaskRequest,\n ): Promise<TaskItem | null> {\n const existing = await this.getById(tenantId, id);\n if (!existing) return null;\n\n const now = nowISO();\n const setClauses: string[] = [NEXT_UPDATED_AT_SQL];\n const values: unknown[] = [now, now];\n\n if (updates.title !== undefined) { setClauses.push('title = ?'); values.push(updates.title); }\n if (updates.description !== undefined) { setClauses.push('description = ?'); values.push(updates.description); }\n if (updates.status !== undefined) { setClauses.push('status = ?'); values.push(updates.status); }\n if (updates.priority !== undefined) { setClauses.push('priority = ?'); values.push(updates.priority); }\n if (updates.dueDate !== undefined) { setClauses.push('due_date = ?'); values.push(updates.dueDate); }\n if (updates.metadata !== undefined) { setClauses.push('metadata = ?'); values.push(JSON.stringify(updates.metadata)); }\n if (updates.parentId !== undefined) { setClauses.push('parent_id = ?'); values.push(updates.parentId); }\n if (updates.sourceId !== undefined) { setClauses.push('source_id = ?'); values.push(updates.sourceId); }\n if (updates.context !== undefined) {\n setClauses.push('context = ?'); values.push(updates.context === null ? null : JSON.stringify(updates.context));\n }\n if (updates.ownerType !== undefined) { setClauses.push('owner_type = ?'); values.push(updates.ownerType); }\n if (updates.ownerId !== undefined) { setClauses.push('owner_id = ?'); values.push(updates.ownerId); }\n if (updates.requireReview !== undefined) { setClauses.push('require_review = ?'); values.push(updates.requireReview ? 1 : 0); }\n if (updates.dependencies !== undefined) { setClauses.push('dependencies = ?'); values.push(JSON.stringify(updates.dependencies)); }\n if (updates.result !== undefined) { setClauses.push('result = ?'); values.push(updates.result); }\n if (updates.failureReason !== undefined) { setClauses.push('failure_reason = ?'); values.push(updates.failureReason); }\n if (updates.workspaceId !== undefined) { setClauses.push('workspace_id = ?'); values.push(updates.workspaceId); }\n if (updates.projectId !== undefined) { setClauses.push('project_id = ?'); values.push(updates.projectId); }\n if (updates.files !== undefined) { setClauses.push('files = ?'); values.push(JSON.stringify(updates.files)); }\n\n if (setClauses.length === 1) return existing;\n\n values.push(tenantId, id, MAX_CANONICAL_TASK_TIME);\n const result = this.db.prepare(\n `UPDATE lt_tasks SET ${setClauses.join(', ')} WHERE tenant_id = ? AND id = ? AND updated_at <> ?`,\n ).run(...values);\n if (result.changes === 0) return null;\n\n return this.getById(tenantId, id);\n }\n\n /**\n * Atomically update a task unless its current status is blocked.\n *\n * @param tenantId Tenant identifier.\n * @param id Task identifier.\n * @param updates Partial task data to update.\n * @param blockedStatuses Current statuses that prevent the update.\n * @returns The updated task, or `null` when missing or blocked.\n */\n async updateIfStatusNotIn(\n tenantId: string,\n id: string,\n updates: UpdateTaskRequest,\n blockedStatuses: TaskItem[\"status\"][],\n ): Promise<TaskItem | null> {\n const now = nowISO();\n const setClauses: string[] = [NEXT_UPDATED_AT_SQL];\n const values: unknown[] = [now, now];\n\n if (updates.title !== undefined) { setClauses.push('title = ?'); values.push(updates.title); }\n if (updates.description !== undefined) { setClauses.push('description = ?'); values.push(updates.description); }\n if (updates.status !== undefined) { setClauses.push('status = ?'); values.push(updates.status); }\n if (updates.priority !== undefined) { setClauses.push('priority = ?'); values.push(updates.priority); }\n if (updates.dueDate !== undefined) { setClauses.push('due_date = ?'); values.push(updates.dueDate); }\n if (updates.metadata !== undefined) { setClauses.push('metadata = ?'); values.push(JSON.stringify(updates.metadata)); }\n if (updates.parentId !== undefined) { setClauses.push('parent_id = ?'); values.push(updates.parentId); }\n if (updates.sourceId !== undefined) { setClauses.push('source_id = ?'); values.push(updates.sourceId); }\n if (updates.context !== undefined) {\n setClauses.push('context = ?'); values.push(updates.context === null ? null : JSON.stringify(updates.context));\n }\n if (updates.ownerType !== undefined) { setClauses.push('owner_type = ?'); values.push(updates.ownerType); }\n if (updates.ownerId !== undefined) { setClauses.push('owner_id = ?'); values.push(updates.ownerId); }\n if (updates.requireReview !== undefined) { setClauses.push('require_review = ?'); values.push(updates.requireReview ? 1 : 0); }\n if (updates.dependencies !== undefined) { setClauses.push('dependencies = ?'); values.push(JSON.stringify(updates.dependencies)); }\n if (updates.result !== undefined) { setClauses.push('result = ?'); values.push(updates.result); }\n if (updates.failureReason !== undefined) { setClauses.push('failure_reason = ?'); values.push(updates.failureReason); }\n if (updates.workspaceId !== undefined) { setClauses.push('workspace_id = ?'); values.push(updates.workspaceId); }\n if (updates.projectId !== undefined) { setClauses.push('project_id = ?'); values.push(updates.projectId); }\n if (updates.files !== undefined) { setClauses.push('files = ?'); values.push(JSON.stringify(updates.files)); }\n\n const statusClause = blockedStatuses.length > 0\n ? ` AND status NOT IN (${blockedStatuses.map(() => \"?\").join(\", \")})`\n : \"\";\n values.push(tenantId, id, MAX_CANONICAL_TASK_TIME, ...blockedStatuses);\n const result = this.db.prepare(\n `UPDATE lt_tasks SET ${setClauses.join(', ')} WHERE tenant_id = ? AND id = ? AND updated_at <> ?${statusClause}`,\n ).run(...values);\n if (result.changes === 0) return null;\n return this.getById(tenantId, id);\n }\n\n /** Atomically update a task only when its current status is expected. */\n async updateIfStatusIn(\n tenantId: string,\n id: string,\n updates: UpdateTaskRequest,\n expectedStatuses: TaskItem[\"status\"][],\n ): Promise<TaskItem | null> {\n if (expectedStatuses.length === 0) return null;\n\n const now = nowISO();\n const setClauses: string[] = [NEXT_UPDATED_AT_SQL];\n const values: unknown[] = [now, now];\n if (updates.title !== undefined) { setClauses.push('title = ?'); values.push(updates.title); }\n if (updates.description !== undefined) { setClauses.push('description = ?'); values.push(updates.description); }\n if (updates.status !== undefined) { setClauses.push('status = ?'); values.push(updates.status); }\n if (updates.priority !== undefined) { setClauses.push('priority = ?'); values.push(updates.priority); }\n if (updates.dueDate !== undefined) { setClauses.push('due_date = ?'); values.push(updates.dueDate); }\n if (updates.metadata !== undefined) { setClauses.push('metadata = ?'); values.push(JSON.stringify(updates.metadata)); }\n if (updates.parentId !== undefined) { setClauses.push('parent_id = ?'); values.push(updates.parentId); }\n if (updates.sourceId !== undefined) { setClauses.push('source_id = ?'); values.push(updates.sourceId); }\n if (updates.context !== undefined) {\n setClauses.push('context = ?'); values.push(updates.context === null ? null : JSON.stringify(updates.context));\n }\n if (updates.ownerType !== undefined) { setClauses.push('owner_type = ?'); values.push(updates.ownerType); }\n if (updates.ownerId !== undefined) { setClauses.push('owner_id = ?'); values.push(updates.ownerId); }\n if (updates.requireReview !== undefined) { setClauses.push('require_review = ?'); values.push(updates.requireReview ? 1 : 0); }\n if (updates.dependencies !== undefined) { setClauses.push('dependencies = ?'); values.push(JSON.stringify(updates.dependencies)); }\n if (updates.result !== undefined) { setClauses.push('result = ?'); values.push(updates.result); }\n if (updates.failureReason !== undefined) { setClauses.push('failure_reason = ?'); values.push(updates.failureReason); }\n if (updates.workspaceId !== undefined) { setClauses.push('workspace_id = ?'); values.push(updates.workspaceId); }\n if (updates.projectId !== undefined) { setClauses.push('project_id = ?'); values.push(updates.projectId); }\n if (updates.files !== undefined) { setClauses.push('files = ?'); values.push(JSON.stringify(updates.files)); }\n\n values.push(tenantId, id, MAX_CANONICAL_TASK_TIME, ...expectedStatuses);\n const result = this.db.prepare(\n `UPDATE lt_tasks SET ${setClauses.join(', ')} WHERE tenant_id = ? AND id = ? AND updated_at <> ? AND status IN (${expectedStatuses.map(() => \"?\").join(\", \")})`,\n ).run(...values);\n if (result.changes === 0) return null;\n return this.getById(tenantId, id);\n }\n\n /** Atomically update a task only when status and updatedAt match a read snapshot. */\n async updateIfStatusAndUpdatedAt(\n tenantId: string,\n id: string,\n updates: UpdateTaskRequest,\n expectedStatuses: TaskItem[\"status\"][],\n expectedUpdatedAt: Date | string,\n ): Promise<TaskItem | null> {\n if (expectedStatuses.length === 0) return null;\n const expectedIso = new Date(expectedUpdatedAt).toISOString();\n if (expectedIso === MAX_CANONICAL_TASK_TIME) return null;\n const setClauses: string[] = [\"updated_at = ?\"];\n const values: unknown[] = [nextISO(expectedIso)];\n if (updates.title !== undefined) { setClauses.push('title = ?'); values.push(updates.title); }\n if (updates.description !== undefined) { setClauses.push('description = ?'); values.push(updates.description); }\n if (updates.status !== undefined) { setClauses.push('status = ?'); values.push(updates.status); }\n if (updates.priority !== undefined) { setClauses.push('priority = ?'); values.push(updates.priority); }\n if (updates.dueDate !== undefined) { setClauses.push('due_date = ?'); values.push(updates.dueDate); }\n if (updates.metadata !== undefined) { setClauses.push('metadata = ?'); values.push(JSON.stringify(updates.metadata)); }\n if (updates.parentId !== undefined) { setClauses.push('parent_id = ?'); values.push(updates.parentId); }\n if (updates.sourceId !== undefined) { setClauses.push('source_id = ?'); values.push(updates.sourceId); }\n if (updates.context !== undefined) {\n setClauses.push('context = ?'); values.push(updates.context === null ? null : JSON.stringify(updates.context));\n }\n if (updates.ownerType !== undefined) { setClauses.push('owner_type = ?'); values.push(updates.ownerType); }\n if (updates.ownerId !== undefined) { setClauses.push('owner_id = ?'); values.push(updates.ownerId); }\n if (updates.requireReview !== undefined) { setClauses.push('require_review = ?'); values.push(updates.requireReview ? 1 : 0); }\n if (updates.dependencies !== undefined) { setClauses.push('dependencies = ?'); values.push(JSON.stringify(updates.dependencies)); }\n if (updates.result !== undefined) { setClauses.push('result = ?'); values.push(updates.result); }\n if (updates.failureReason !== undefined) { setClauses.push('failure_reason = ?'); values.push(updates.failureReason); }\n if (updates.workspaceId !== undefined) { setClauses.push('workspace_id = ?'); values.push(updates.workspaceId); }\n if (updates.projectId !== undefined) { setClauses.push('project_id = ?'); values.push(updates.projectId); }\n if (updates.files !== undefined) { setClauses.push('files = ?'); values.push(JSON.stringify(updates.files)); }\n\n values.push(tenantId, id, ...expectedStatuses, expectedIso);\n const result = this.db.prepare(\n `UPDATE lt_tasks SET ${setClauses.join(', ')} WHERE tenant_id = ? AND id = ? AND status IN (${expectedStatuses.map(() => \"?\").join(\", \")}) AND updated_at = ?`,\n ).run(...values);\n if (result.changes === 0) return null;\n return this.getById(tenantId, id);\n }\n\n /** Atomically update only while status, timestamp, owner, and Project scope match. */\n async updateIfSnapshot(\n tenantId: string, id: string, updates: UpdateTaskRequest, snapshot: TaskMutationSnapshot,\n ): Promise<TaskItem | null> {\n const expectedIso = new Date(snapshot.updatedAt).toISOString();\n if (expectedIso === MAX_CANONICAL_TASK_TIME) return null;\n const setClauses = [\"updated_at = ?\"];\n const values: unknown[] = [nextISO(expectedIso)];\n const fields: Array<[keyof UpdateTaskRequest, string, boolean?]> = [\n [\"title\", \"title\"], [\"description\", \"description\"], [\"status\", \"status\"], [\"priority\", \"priority\"],\n [\"dueDate\", \"due_date\"], [\"metadata\", \"metadata\", true], [\"parentId\", \"parent_id\"],\n [\"sourceId\", \"source_id\"], [\"context\", \"context\", true], [\"ownerType\", \"owner_type\"],\n [\"ownerId\", \"owner_id\"], [\"requireReview\", \"require_review\"], [\"dependencies\", \"dependencies\", true],\n [\"result\", \"result\"], [\"failureReason\", \"failure_reason\"], [\"workspaceId\", \"workspace_id\"],\n [\"projectId\", \"project_id\"], [\"files\", \"files\", true],\n ];\n for (const [field, column, json] of fields) {\n const value = updates[field];\n if (value === undefined) continue;\n setClauses.push(`${column} = ?`);\n values.push(json && value !== null ? JSON.stringify(value) : field === \"requireReview\" ? (value ? 1 : 0) : value);\n }\n values.push(tenantId, id, snapshot.status, expectedIso, snapshot.ownerType, snapshot.ownerId,\n snapshot.workspaceId, snapshot.projectId);\n const result = this.db.prepare(\n `UPDATE lt_tasks SET ${setClauses.join(\", \")} WHERE tenant_id = ? AND id = ? AND status = ?\n AND updated_at = ? AND owner_type = ? AND owner_id = ? AND workspace_id IS ? AND project_id IS ?`,\n ).run(...values);\n return result.changes === 0 ? null : this.getById(tenantId, id);\n }\n\n /** Atomically update a child only when both child and parent snapshots match. */\n async updateIfStatusUpdatedAtAndParentUpdatedAt(\n tenantId: string,\n id: string,\n updates: UpdateTaskRequest,\n expectedStatuses: TaskItem[\"status\"][],\n expectedUpdatedAt: Date | string,\n parentId: string,\n expectedParentUpdatedAt: Date | string,\n ): Promise<TaskItem | null> {\n if (expectedStatuses.length === 0) return null;\n const expectedIso = new Date(expectedUpdatedAt).toISOString();\n if (expectedIso === MAX_CANONICAL_TASK_TIME) return null;\n const parentExpectedIso = new Date(expectedParentUpdatedAt).toISOString();\n const setClauses: string[] = [\"updated_at = ?\"];\n const values: unknown[] = [nextISO(expectedIso)];\n if (updates.title !== undefined) { setClauses.push('title = ?'); values.push(updates.title); }\n if (updates.description !== undefined) { setClauses.push('description = ?'); values.push(updates.description); }\n if (updates.status !== undefined) { setClauses.push('status = ?'); values.push(updates.status); }\n if (updates.priority !== undefined) { setClauses.push('priority = ?'); values.push(updates.priority); }\n if (updates.dueDate !== undefined) { setClauses.push('due_date = ?'); values.push(updates.dueDate); }\n if (updates.metadata !== undefined) { setClauses.push('metadata = ?'); values.push(JSON.stringify(updates.metadata)); }\n if (updates.parentId !== undefined) { setClauses.push('parent_id = ?'); values.push(updates.parentId); }\n if (updates.sourceId !== undefined) { setClauses.push('source_id = ?'); values.push(updates.sourceId); }\n if (updates.context !== undefined) {\n setClauses.push('context = ?'); values.push(updates.context === null ? null : JSON.stringify(updates.context));\n }\n if (updates.ownerType !== undefined) { setClauses.push('owner_type = ?'); values.push(updates.ownerType); }\n if (updates.ownerId !== undefined) { setClauses.push('owner_id = ?'); values.push(updates.ownerId); }\n if (updates.requireReview !== undefined) { setClauses.push('require_review = ?'); values.push(updates.requireReview ? 1 : 0); }\n if (updates.dependencies !== undefined) { setClauses.push('dependencies = ?'); values.push(JSON.stringify(updates.dependencies)); }\n if (updates.result !== undefined) { setClauses.push('result = ?'); values.push(updates.result); }\n if (updates.failureReason !== undefined) { setClauses.push('failure_reason = ?'); values.push(updates.failureReason); }\n if (updates.workspaceId !== undefined) { setClauses.push('workspace_id = ?'); values.push(updates.workspaceId); }\n if (updates.projectId !== undefined) { setClauses.push('project_id = ?'); values.push(updates.projectId); }\n if (updates.files !== undefined) { setClauses.push('files = ?'); values.push(JSON.stringify(updates.files)); }\n\n values.push(tenantId, id, ...expectedStatuses, expectedIso, parentId, parentExpectedIso);\n const result = this.db.prepare(\n `UPDATE lt_tasks AS child SET ${setClauses.join(', ')}\n WHERE tenant_id = ? AND id = ?\n AND status IN (${expectedStatuses.map(() => \"?\").join(\", \")})\n AND updated_at = ?\n AND EXISTS (\n SELECT 1 FROM lt_tasks AS parent\n WHERE parent.tenant_id = child.tenant_id AND parent.id = ? AND parent.updated_at = ?\n )`,\n ).run(...values);\n if (result.changes === 0) return null;\n return this.getById(tenantId, id);\n }\n\n async delete(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_tasks WHERE tenant_id = ? AND id = ?`,\n ).run(tenantId, id);\n return result.changes > 0;\n }\n\n /** Atomically delete only while status, timestamp, owner, and Project scope match. */\n async deleteIfSnapshot(tenantId: string, id: string, snapshot: TaskMutationSnapshot): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_tasks WHERE tenant_id = ? AND id = ? AND status = ? AND updated_at = ?\n AND owner_type = ? AND owner_id = ? AND workspace_id IS ? AND project_id IS ?`,\n ).run(tenantId, id, snapshot.status, new Date(snapshot.updatedAt).toISOString(), snapshot.ownerType,\n snapshot.ownerId, snapshot.workspaceId, snapshot.projectId);\n return result.changes > 0;\n }\n}\n","/**\n * Local SQLite implementation of TaskWorkItemStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n TaskWorkItemStore,\n TaskWorkItem,\n CreateWorkItemRequest,\n CreateWorkItemIfAbsentRequest,\n TaskWorkItemListFilter,\n ProjectLifecycleEventQuery,\n TaskMutationSnapshot,\n} from \"@axiom-lattice/protocols\";\nimport { MAX_PENDING_EXECUTION_RESULTS_LIMIT } from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\nimport { v4 as uuid } from \"uuid\";\n\nconst PROJECT_LIFECYCLE_ACTIONS: ReadonlySet<string> = new Set([\n \"in_progress\", \"interrupted\", \"failed\", \"completed\", \"cancelled\", \"reassigned\",\n]);\n\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_task_work_items (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n task_id TEXT NOT NULL,\n action TEXT NOT NULL,\n actor TEXT NOT NULL,\n thread_id TEXT,\n summary TEXT,\n detail TEXT,\n attempt INTEGER,\n workspace_id TEXT,\n project_id TEXT,\n created_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\n`;\n\ninterface WorkItemRow {\n id: string;\n tenant_id: string;\n task_id: string;\n action: string;\n actor: string;\n thread_id: string | null;\n summary: string | null;\n detail: string | null;\n attempt: number | null;\n workspace_id: string | null;\n project_id: string | null;\n event_key: string | null;\n created_at: string;\n}\n\nfunction parseDetail(raw: string | null): Record<string, unknown> | undefined {\n if (!raw) return undefined;\n try {\n const parsed: unknown = JSON.parse(raw);\n return parsed !== null && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction mapRowToWorkItem(row: WorkItemRow): TaskWorkItem {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n taskId: row.task_id,\n action: row.action,\n actor: row.actor,\n threadId: row.thread_id ?? undefined,\n summary: row.summary ?? undefined,\n detail: parseDetail(row.detail),\n attempt: row.attempt ?? undefined,\n workspaceId: row.workspace_id ?? undefined,\n projectId: row.project_id ?? undefined,\n eventKey: row.event_key ?? undefined,\n createdAt: parseISO(row.created_at),\n };\n}\n\nfunction assertAndCloneProjectLifecycleEvent(item: TaskWorkItem): TaskWorkItem {\n let milliseconds: number;\n try { milliseconds = Date.prototype.getTime.call(item.createdAt) as number; }\n catch { throw new Error(\"Invalid project lifecycle event row\"); }\n if (!Number.isFinite(milliseconds) || typeof item.id !== \"string\" || item.id.length === 0\n || typeof item.eventKey !== \"string\" || item.eventKey.length === 0) {\n throw new Error(\"Invalid project lifecycle event row\");\n }\n return { ...item, createdAt: new Date(milliseconds) };\n}\n\nfunction assertLifecyclePage(query: ProjectLifecycleEventQuery): number | null {\n if (!Number.isSafeInteger(query.limit) || query.limit < 1 || query.limit > 100\n || query.actions.length === 0\n || query.actions.some((action) => !PROJECT_LIFECYCLE_ACTIONS.has(action))) {\n throw new RangeError(\"Invalid project lifecycle event page\");\n }\n if (!query.before) return null;\n let milliseconds: number;\n try { milliseconds = Date.prototype.getTime.call(query.before.createdAt) as number; }\n catch { throw new RangeError(\"Invalid project lifecycle event cursor\"); }\n if (!Number.isFinite(milliseconds) || typeof query.before.id !== \"string\" || query.before.id.length === 0) {\n throw new RangeError(\"Invalid project lifecycle event cursor\");\n }\n return milliseconds;\n}\n\nexport class LocalTaskWorkItemStore implements TaskWorkItemStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n this.ensureColumn(\"lt_task_work_items\", \"workspace_id\", \"workspace_id TEXT\");\n this.ensureColumn(\"lt_task_work_items\", \"project_id\", \"project_id TEXT\");\n this.ensureColumn(\"lt_task_work_items\", \"event_key\", \"event_key TEXT\");\n this.db.exec(`CREATE UNIQUE INDEX IF NOT EXISTS idx_task_work_items_event_key\n ON lt_task_work_items (tenant_id, task_id, event_key);`);\n this.db.exec(`CREATE INDEX IF NOT EXISTS idx_task_work_items_pending_order\n ON lt_task_work_items (tenant_id, task_id, action, created_at DESC, id DESC);`);\n this.db.exec(`CREATE INDEX IF NOT EXISTS idx_task_work_items_reconciled_result\n ON lt_task_work_items (tenant_id, task_id, json_extract(detail, '$.executionResultId'))\n WHERE action = 'execution_reconciled';`);\n this.db.exec(`CREATE INDEX IF NOT EXISTS idx_task_work_items_project_lifecycle\n ON lt_task_work_items (tenant_id, workspace_id, project_id, created_at DESC, id DESC)\n WHERE event_key IS NOT NULL;`);\n }\n\n /** Add a column if it does not exist (SQLite version compatible). */\n private ensureColumn(table: string, column: string, ddl: string): void {\n const cols = this.db.prepare(`PRAGMA table_info(${table})`).all() as Array<{ name: string }>;\n if (!cols.some((c) => c.name === column)) {\n this.db.exec(`ALTER TABLE ${table} ADD COLUMN ${ddl}`);\n }\n }\n\n async create(params: CreateWorkItemRequest): Promise<TaskWorkItem> {\n const id = uuid();\n const now = nowISO();\n\n this.db.prepare(\n `INSERT INTO lt_task_work_items (id, tenant_id, task_id, action, actor, thread_id, summary, detail, attempt, workspace_id, project_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n id, params.tenantId, params.taskId, params.action, params.actor,\n params.threadId || null, params.summary || null,\n params.detail ? JSON.stringify(params.detail) : null,\n params.attempt ?? null,\n params.workspaceId || null,\n params.projectId || null,\n now,\n );\n\n const row = this.db.prepare(\n `SELECT * FROM lt_task_work_items WHERE tenant_id = ? AND id = ?`,\n ).get(params.tenantId, id) as unknown as WorkItemRow | undefined;\n return mapRowToWorkItem(row!);\n }\n\n /** Atomically inserts a work item by selecting one exact task snapshot. */\n async createIfTaskSnapshot(\n params: CreateWorkItemRequest,\n snapshot: TaskMutationSnapshot,\n ): Promise<TaskWorkItem | null> {\n const id = uuid();\n const result = this.db.prepare(\n `INSERT INTO lt_task_work_items\n (id, tenant_id, task_id, action, actor, thread_id, summary, detail, attempt, workspace_id, project_id, created_at)\n SELECT ?, task.tenant_id, task.id, ?, ?, ?, ?, ?, ?, task.workspace_id, task.project_id, ?\n FROM lt_tasks AS task\n WHERE task.tenant_id = ? AND task.id = ? AND task.status = ? AND task.updated_at = ?\n AND task.owner_type = ? AND task.owner_id = ? AND task.workspace_id IS ? AND task.project_id IS ?\n AND ? IS task.workspace_id AND ? IS task.project_id`,\n ).run(id, params.action, params.actor, params.threadId || null, params.summary || null,\n params.detail ? JSON.stringify(params.detail) : null, params.attempt ?? null, nowISO(),\n params.tenantId, params.taskId, snapshot.status, new Date(snapshot.updatedAt).toISOString(),\n snapshot.ownerType, snapshot.ownerId, snapshot.workspaceId, snapshot.projectId,\n params.workspaceId, params.projectId);\n if (result.changes === 0) return null;\n const row = this.db.prepare(`SELECT * FROM lt_task_work_items WHERE tenant_id = ? AND id = ?`)\n .get(params.tenantId, id) as unknown as WorkItemRow | undefined;\n return row ? mapRowToWorkItem(row) : null;\n }\n\n /** Find an event by its tenant- and task-scoped key without pagination. */\n async findByEventKey(tenantId: string, taskId: string, eventKey: string): Promise<TaskWorkItem | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_task_work_items WHERE tenant_id = ? AND task_id = ? AND event_key = ?`,\n ).get(tenantId, taskId, eventKey) as unknown as WorkItemRow | undefined;\n return row ? mapRowToWorkItem(row) : null;\n }\n\n /** Atomically return an existing event or create it once. */\n async createIfAbsentByEventKey(params: CreateWorkItemIfAbsentRequest): Promise<TaskWorkItem> {\n const id = uuid();\n this.db.prepare(\n `INSERT INTO lt_task_work_items (id, tenant_id, task_id, action, actor, thread_id, summary, detail, attempt, workspace_id, project_id, event_key, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT (tenant_id, task_id, event_key) DO NOTHING`,\n ).run(\n id, params.tenantId, params.taskId, params.action, params.actor,\n params.threadId || null, params.summary || null,\n params.detail ? JSON.stringify(params.detail) : null,\n params.attempt ?? null, params.workspaceId || null, params.projectId || null,\n params.eventKey, nowISO(),\n );\n const item = await this.findByEventKey(params.tenantId, params.taskId, params.eventKey);\n if (!item) throw new Error(\"Task work item insert did not return a row\");\n return item;\n }\n\n async list(filter: TaskWorkItemListFilter): Promise<TaskWorkItem[]> {\n const conditions: string[] = ['tenant_id = ?', 'task_id = ?'];\n const params: unknown[] = [filter.tenantId, filter.taskId];\n\n if (filter.action) { conditions.push('action = ?'); params.push(filter.action); }\n if (filter.workspaceId) { conditions.push('workspace_id = ?'); params.push(filter.workspaceId); }\n if (filter.projectId) { conditions.push('project_id = ?'); params.push(filter.projectId); }\n\n const where = conditions.join(' AND ');\n const limit = filter.limit || 100;\n const offset = filter.offset || 0;\n const order = filter.order === 'asc' ? 'ASC' : 'DESC';\n\n const rows = this.db.prepare(\n `SELECT * FROM lt_task_work_items WHERE ${where} ORDER BY created_at ${order}, id ${order} LIMIT ? OFFSET ?`,\n ).all(...params, limit, offset) as unknown as WorkItemRow[];\n return rows.map(mapRowToWorkItem);\n }\n\n /** List pending execution results using one bounded SQLite anti-join query. */\n async listPendingExecutionResults(params: {\n tenantId: string;\n taskId: string;\n limit: number;\n }): Promise<TaskWorkItem[]> {\n if (!Number.isSafeInteger(params.limit)\n || params.limit < 0\n || params.limit > MAX_PENDING_EXECUTION_RESULTS_LIMIT) {\n const error = new RangeError(`limit must be a safe integer between 0 and ${MAX_PENDING_EXECUTION_RESULTS_LIMIT}`) as RangeError & {\n code: \"INVALID_LIMIT\";\n };\n error.code = \"INVALID_LIMIT\";\n throw error;\n }\n if (params.limit === 0) return [];\n const rows = this.db.prepare(\n `SELECT result.*\n FROM lt_task_work_items AS result\n WHERE result.tenant_id = ?\n AND result.task_id = ?\n AND result.action = 'execution_result'\n AND substr(result.event_key, 1, 17) = 'execution-result:'\n AND length(result.event_key) > 17\n AND result.event_key NOT GLOB '*[^A-Za-z0-9._:-]*'\n AND NOT EXISTS (\n SELECT 1\n FROM lt_task_work_items AS reconciled\n WHERE reconciled.tenant_id = result.tenant_id\n AND reconciled.task_id = result.task_id\n AND reconciled.action = 'execution_reconciled'\n AND json_extract(reconciled.detail, '$.executionResultId') = result.event_key\n )\n ORDER BY result.created_at DESC, result.id DESC\n LIMIT ?`,\n ).all(params.tenantId, params.taskId, params.limit) as unknown as WorkItemRow[];\n return rows.map(mapRowToWorkItem);\n }\n\n /** Lists canonical project lifecycle events with an exclusive cursor. */\n async listProjectLifecycleEvents(query: ProjectLifecycleEventQuery): Promise<TaskWorkItem[]> {\n const cursorMilliseconds = assertLifecyclePage(query);\n const cursor = cursorMilliseconds === null ? null : new Date(cursorMilliseconds).toISOString();\n const rows = this.db.prepare(\n `SELECT * FROM lt_task_work_items\n WHERE tenant_id = ? AND workspace_id = ? AND project_id = ?\n AND action IN (${query.actions.map(() => \"?\").join(\", \")})\n AND event_key IS NOT NULL AND event_key <> ''\n AND (? IS NULL OR created_at < ? OR (created_at = ? AND id < ?))\n ORDER BY created_at DESC, id DESC LIMIT ?`,\n ).all(query.tenantId, query.workspaceId, query.projectId, ...query.actions,\n cursor, cursor, cursor, query.before?.id ?? null, query.limit) as unknown as WorkItemRow[];\n return rows.map(mapRowToWorkItem).map(assertAndCloneProjectLifecycleEvent);\n }\n}\n","import { randomUUID } from \"crypto\";\nimport type { CapabilityBundle, CapabilityBundleDeleteResult, CapabilityBundleStore, InternalCreateCapabilityBundleInput, InternalUpdateCapabilityBundleInput } from \"@axiom-lattice/protocols\";\nimport { DatabaseWrapper, ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `CREATE TABLE IF NOT EXISTS lt_capability_bundles (id TEXT NOT NULL, tenant_id TEXT NOT NULL, bundle_key TEXT NOT NULL, name TEXT NOT NULL, description TEXT, capabilities TEXT NOT NULL DEFAULT '[]', created_at TEXT NOT NULL, updated_at TEXT NOT NULL, PRIMARY KEY (tenant_id, id), UNIQUE (tenant_id, bundle_key)); CREATE INDEX IF NOT EXISTS idx_lt_capability_bundles_tenant ON lt_capability_bundles(tenant_id);`;\ntype Row = { id: string; tenant_id: string; bundle_key: string; name: string; description: string | null; capabilities: string; created_at: string; updated_at: string };\nconst duplicateMessage = \"Capability bundle key already exists for tenant\";\nfunction map(row: Row): CapabilityBundle { return { id: row.id, tenantId: row.tenant_id, key: row.bundle_key, name: row.name, description: row.description ?? undefined, capabilities: JSON.parse(row.capabilities), createdAt: parseISO(row.created_at).toISOString(), updatedAt: parseISO(row.updated_at).toISOString() }; }\nfunction isConstraint(error: unknown): boolean { return error instanceof Error && /UNIQUE constraint failed/.test(error.message); }\nfunction nextTimestamp(previous?: string): string { const now = Date.now(); const previousTime = previous ? Date.parse(previous) : Number.NaN; return new Date(Math.max(now, Number.isFinite(previousTime) ? previousTime + 1 : now)).toISOString(); }\n\n/**\n * Persists tenant-scoped capability bundles in a shared local sql.js database.\n *\n * The constructor creates the required table and index idempotently. Database\n * lifecycle remains owned by the caller through `initDatabase` and\n * `closeDatabase`.\n *\n * @example\n * ```ts\n * const db = await initDatabase({ dbPath: \"./lattice.db\" });\n * const store = new LocalCapabilityBundleStore(db);\n * const bundles = await store.listByTenant(\"tenant-1\");\n * ```\n */\nexport class LocalCapabilityBundleStore implements CapabilityBundleStore {\n /**\n * Creates a capability bundle store over an initialized sql.js database.\n *\n * @param db - Shared local database wrapper used for persistence.\n */\n constructor(private readonly db: DatabaseWrapper) { ensureTable(db, DDL); }\n async listByTenant(tenantId: string): Promise<CapabilityBundle[]> { return (this.db.prepare(\"SELECT * FROM lt_capability_bundles WHERE tenant_id = ? ORDER BY created_at\").all(tenantId) as unknown as Row[]).map(map); }\n async getById(tenantId: string, id: string): Promise<CapabilityBundle | null> { const row = this.db.prepare(\"SELECT * FROM lt_capability_bundles WHERE tenant_id = ? AND id = ?\").get(tenantId, id) as unknown as Row | undefined; return row ? map(row) : null; }\n async getManyByIds(tenantId: string, ids: string[]): Promise<CapabilityBundle[]> { return ids.flatMap((id) => { const row = this.db.prepare(\"SELECT * FROM lt_capability_bundles WHERE tenant_id = ? AND id = ?\").get(tenantId, id) as unknown as Row | undefined; return row ? [map(row)] : []; }); }\n async create(tenantId: string, input: InternalCreateCapabilityBundleInput): Promise<CapabilityBundle> { const now = nextTimestamp(); const id = randomUUID(); try { this.db.prepare(\"INSERT INTO lt_capability_bundles (id, tenant_id, bundle_key, name, description, capabilities, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\").run(id, tenantId, input.key, input.name, input.description ?? null, JSON.stringify(input.capabilities), now, now); } catch (error) { if (isConstraint(error)) throw new Error(duplicateMessage); throw error; } return (await this.getById(tenantId, id)) as CapabilityBundle; }\n async update(tenantId: string, id: string, input: InternalUpdateCapabilityBundleInput): Promise<CapabilityBundle | { status: \"conflict\" } | null> { const existing = await this.getById(tenantId, id); if (!existing) return null; if (input.expectedUpdatedAt !== existing.updatedAt) return { status: \"conflict\" }; const fields: string[] = []; const values: unknown[] = []; const add = (field: string, value: unknown): void => { fields.push(`${field} = ?`); values.push(value); }; if (input.name !== undefined) add(\"name\", input.name); if (Object.prototype.hasOwnProperty.call(input, \"description\")) add(\"description\", input.description ?? null); if (input.capabilities !== undefined) add(\"capabilities\", JSON.stringify(input.capabilities)); if (!fields.length) return existing; const now = nextTimestamp(existing.updatedAt); fields.push(\"updated_at = ?\"); values.push(now, tenantId, id); try { const result = this.db.prepare(`UPDATE lt_capability_bundles SET ${fields.join(\", \")} WHERE tenant_id = ? AND id = ? AND updated_at = ?`).run(...values, input.expectedUpdatedAt); if (result.changes === 0) return { status: \"conflict\" }; } catch (error) { if (isConstraint(error)) throw new Error(duplicateMessage); throw error; } return this.getById(tenantId, id); }\n async deleteIfUnreferenced(tenantId: string, id: string): Promise<CapabilityBundleDeleteResult> {\n const result = this.db.prepare(\n `DELETE FROM lt_capability_bundles\n WHERE tenant_id = ? AND id = ?\n AND NOT EXISTS (\n SELECT 1 FROM lt_projects\n WHERE tenant_id = ?\n AND json_type(config, '$.capabilityBundleIds') = 'array'\n AND EXISTS (SELECT 1 FROM json_each(config, '$.capabilityBundleIds') WHERE value = ?)\n )`,\n ).run(tenantId, id, tenantId, id);\n if (result.changes > 0) return \"deleted\";\n if (await this.getById(tenantId, id)) return \"in_use\";\n return \"not_found\";\n }\n}\n","/**\n * InMemoryConversationStore\n *\n * In-memory implementation of IConversationStore. Maps application\n * conversation IDs to A2A task IDs. Not persisted — for production\n * use, swap with a PG-backed implementation.\n */\n\nimport type {\n IConversationStore,\n ConversationRecord,\n CreateConversationInput,\n} from \"@axiom-lattice/protocols\";\n\nconst isoNow = (): string => new Date().toISOString();\n\nexport class InMemoryConversationStore implements IConversationStore {\n private store = new Map<string, ConversationRecord>();\n\n async getConversation(conversationId: string): Promise<ConversationRecord | null> {\n return this.store.get(conversationId) ?? null;\n }\n\n async createConversation(input: CreateConversationInput): Promise<ConversationRecord> {\n const now = isoNow();\n const record: ConversationRecord = {\n conversationId: input.conversationId,\n tenantId: input.tenantId,\n taskIds: [],\n contextId: input.contextId,\n metadata: input.metadata,\n createdAt: now,\n updatedAt: now,\n };\n this.store.set(input.conversationId, record);\n return record;\n }\n\n async addTaskToConversation(conversationId: string, taskId: string): Promise<ConversationRecord> {\n const record = this.store.get(conversationId);\n if (!record) {\n throw new Error(`Conversation not found: ${conversationId}`);\n }\n record.taskIds.push(taskId);\n record.updatedAt = isoNow();\n return record;\n }\n\n async deleteConversation(conversationId: string): Promise<void> {\n this.store.delete(conversationId);\n }\n}\n"],"mappings":"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","names":["rows","initSqlJs","ddl","rows","rows","DDL","rows","DDL","rows","DDL","rows","ddl","columns","columns","mapRow","rows","columns","mapRow","role","columns","mapRow","rows","columns","mapRow","DDL","rows","DDL","rows","DDL","rows","role","DDL","rows","DDL","rows","uuid","DDL","rows","mapRowToEntry","import_core","DDL","rows","mapRowToEntry","DDL","rows","DDL","parseJson","ddl","rows","import_protocols","import_crypto","import_protocols","DDL","rows","DDL","mapRow","rows","import_core","import_crypto","DDL","ddl","rows","record","row","map","import_crypto","DDL","rows","record","import_protocols","import_crypto","DDL","columns","rows","DDL","rows","DDL","rows","import_protocols","import_crypto","DDL","mapRowToTask","ddl","rows","import_protocols","import_uuid","DDL","ddl","uuid","rows","import_crypto","DDL","record"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/database.ts","../src/migrations/migration.ts","../src/createLocalStoreConfig.ts","../src/stores/LocalThreadStore.ts","../src/stores/LocalAssistantStore.ts","../src/stores/LocalWorkspaceStore.ts","../src/stores/LocalProjectStore.ts","../src/stores/project-room-schema.ts","../src/stores/LocalProjectRoomStore.ts","../src/stores/LocalProjectMembershipStore.ts","../src/stores/LocalProjectBotMembershipStore.ts","../src/stores/LocalProjectRoomMessageStore.ts","../src/stores/LocalProjectRoomReadStateStore.ts","../src/stores/LocalUserStore.ts","../src/stores/LocalTenantStore.ts","../src/stores/LocalUserTenantLinkStore.ts","../src/stores/LocalDatabaseConfigStore.ts","../src/stores/LocalConnectionStore.ts","../src/stores/LocalMetricsServerConfigStore.ts","../src/stores/LocalMcpServerConfigStore.ts","../src/stores/LocalModelProviderStore.ts","../src/stores/LocalWorkflowTrackingStore.ts","../src/stores/LocalEvalStore.ts","../src/stores/LocalChannelBindingStore.ts","../src/stores/room-channel-binding-index.ts","../src/stores/LocalChannelInstallationStore.ts","../src/stores/LocalA2AApiKeyStore.ts","../src/stores/LocalOpenAuditStore.ts","../src/stores/LocalThreadMessageQueueStore.ts","../src/stores/LocalSkillStore.ts","../src/stores/LocalScheduleStorage.ts","../src/stores/LocalTaskStore.ts","../src/stores/LocalTaskWorkItemStore.ts","../src/stores/LocalCapabilityBundleStore.ts","../src/stores/InMemoryConversationStore.ts"],"sourcesContent":["/**\n * @axiom-lattice/local-stores\n *\n * Local SQLite-based store implementations for the Axiom Lattice framework.\n * All stores share a single SQLite database file for zero-config persistence.\n *\n * @example\n * ```ts\n * import { createLocalStoreConfig, closeDatabase } from \"@axiom-lattice/local-stores\";\n * import { configureStores } from \"@axiom-lattice/core\";\n *\n * const stores = await createLocalStoreConfig({ dbPath: \"./data/lattice.db\" });\n * const dispose = await configureStores(stores);\n *\n * // On shutdown:\n * await dispose();\n * closeDatabase();\n * ```\n */\n\nexport { initDatabase, getDatabase, closeDatabase, ensureTable, nowISO, parseISO, DatabaseWrapper, StatementWrapper, RunResult } from \"./database\";\nexport type { LocalStoreOptions } from \"./database\";\n\nexport { MigrationManager } from \"./migrations/migration\";\nexport type { Migration } from \"./migrations/migration\";\n\nexport { createLocalStoreConfig } from \"./createLocalStoreConfig\";\nexport type { LocalStoreConfigOptions } from \"./createLocalStoreConfig\";\n\nexport { LocalThreadStore } from \"./stores/LocalThreadStore\";\nexport { LocalAssistantStore } from \"./stores/LocalAssistantStore\";\nexport { LocalWorkspaceStore } from \"./stores/LocalWorkspaceStore\";\nexport { LocalProjectStore } from \"./stores/LocalProjectStore\";\nexport { LocalProjectRoomStore } from \"./stores/LocalProjectRoomStore\";\nexport { LocalProjectMembershipStore, DuplicateProjectMembershipError, ProjectMembershipIdConflictError } from \"./stores/LocalProjectMembershipStore\";\nexport { LocalProjectBotMembershipStore, ProjectBotMembershipIdConflictError } from \"./stores/LocalProjectBotMembershipStore\";\nexport { LocalProjectRoomMessageStore, ProjectRoomMessageIdConflictError, DuplicateProjectRoomMessageIdempotencyKeyError } from \"./stores/LocalProjectRoomMessageStore\";\nexport { LocalProjectRoomReadStateStore } from \"./stores/LocalProjectRoomReadStateStore\";\nexport { LocalUserStore } from \"./stores/LocalUserStore\";\nexport { LocalTenantStore } from \"./stores/LocalTenantStore\";\nexport { LocalUserTenantLinkStore } from \"./stores/LocalUserTenantLinkStore\";\nexport { LocalDatabaseConfigStore } from \"./stores/LocalDatabaseConfigStore\";\nexport { LocalConnectionStore } from \"./stores/LocalConnectionStore\";\nexport { LocalMetricsServerConfigStore } from \"./stores/LocalMetricsServerConfigStore\";\nexport { LocalMcpServerConfigStore } from \"./stores/LocalMcpServerConfigStore\";\nexport { LocalModelProviderStore } from \"./stores/LocalModelProviderStore\";\nexport { LocalWorkflowTrackingStore } from \"./stores/LocalWorkflowTrackingStore\";\nexport { LocalEvalStore } from \"./stores/LocalEvalStore\";\nexport { LocalChannelBindingStore } from \"./stores/LocalChannelBindingStore\";\nexport { LocalChannelInstallationStore } from \"./stores/LocalChannelInstallationStore\";\nexport { LocalA2AApiKeyStore } from \"./stores/LocalA2AApiKeyStore\";\nexport { LocalThreadMessageQueueStore } from \"./stores/LocalThreadMessageQueueStore\";\nexport { LocalSkillStore } from \"./stores/LocalSkillStore\";\nexport { LocalScheduleStorage } from \"./stores/LocalScheduleStorage\";\nexport { LocalTaskStore } from \"./stores/LocalTaskStore\";\nexport { LocalTaskWorkItemStore } from \"./stores/LocalTaskWorkItemStore\";\nexport { LocalCapabilityBundleStore } from \"./stores/LocalCapabilityBundleStore\";\nexport { InMemoryConversationStore } from \"./stores/InMemoryConversationStore\";\n\nexport * from \"./stores/LocalOpenAuditStore\";\n","/**\n * Shared SQLite database connection for local stores using sql.js (WASM).\n *\n * sql.js is a pure JavaScript/WASM SQLite implementation that requires\n * no native dependencies. The database is persisted to a file on disk.\n *\n * @example\n * ```ts\n * import { initDatabase, closeDatabase } from \"@axiom-lattice/local-stores\";\n *\n * await initDatabase({ dbPath: \"~/.axiom/lattice.db\" });\n * // ... create stores using getDatabase() ...\n * await closeDatabase();\n * ```\n */\n\nimport initSqlJs, { type Database as SqlJsDatabase, type SqlJsStatic, type BindParams } from \"sql.js\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport * as fs from \"fs\";\n\nexport interface LocalStoreOptions {\n /**\n * Path to the SQLite database file.\n * Supports `~` for home directory expansion.\n * @default \"~/.axiom/lattice.db\"\n */\n dbPath?: string;\n}\n\nlet _SQL: SqlJsStatic | null = null;\nlet _db: DatabaseWrapper | null = null;\n\nfunction expandHome(filePath: string): string {\n if (filePath.startsWith(\"~\")) {\n return path.join(os.homedir(), filePath.slice(1));\n }\n return filePath;\n}\n\n/**\n * A thin wrapper around sql.js that provides an API similar to better-sqlite3.\n */\nexport class DatabaseWrapper {\n private db: SqlJsDatabase;\n private dbPath: string;\n\n constructor(sql: SqlJsStatic, dbPath: string) {\n this.dbPath = dbPath;\n if (fs.existsSync(dbPath)) {\n const buffer = fs.readFileSync(dbPath);\n this.db = new sql.Database(buffer);\n } else {\n this.db = new sql.Database();\n }\n }\n\n /**\n * Execute a SQL statement and return the wrapper for chaining (run).\n * Automatically persists changes to disk.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n run(sql: string, ...params: any[]): RunResult {\n this.db.run(sql, params);\n const changes = this.db.getRowsModified();\n this.save();\n return new RunResult(changes);\n }\n\n /**\n * Prepare and execute a query returning all matching rows as objects.\n */\n prepare(sql: string): StatementWrapper {\n return new StatementWrapper(this.db, sql, this);\n }\n\n /**\n * Execute raw SQL (for DDL statements).\n */\n exec(sql: string): void {\n this.db.exec(sql);\n }\n\n /**\n * Persist the database to disk.\n */\n save(): void {\n const data = this.db.export();\n const buffer = Buffer.from(data);\n fs.writeFileSync(this.dbPath, buffer);\n }\n\n /**\n * Close the database.\n */\n close(): void {\n this.db.close();\n }\n\n /**\n * Get the underlying sql.js database instance.\n */\n getRawDb(): SqlJsDatabase {\n return this.db;\n }\n}\n\n/**\n * Wraps a prepared statement with a better-sqlite3-like API.\n */\nexport class StatementWrapper {\n private db: SqlJsDatabase;\n private sql: string;\n private parent: DatabaseWrapper | null;\n\n constructor(db: SqlJsDatabase, sql: string, parent?: DatabaseWrapper) {\n this.db = db;\n this.sql = sql;\n this.parent = parent || null;\n }\n\n /**\n * Execute and return all rows as objects.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n all(...params: any[]): unknown[] {\n const stmt = this.db.prepare(this.sql);\n try {\n if (params.length > 0) {\n stmt.bind(params as BindParams);\n }\n const rows: Record<string, unknown>[] = [];\n while (stmt.step()) {\n rows.push(stmt.getAsObject());\n }\n return rows;\n } finally {\n stmt.free();\n }\n }\n\n /**\n * Execute and return the first row as an object, or undefined.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get(...params: any[]): unknown {\n const stmt = this.db.prepare(this.sql);\n try {\n if (params.length > 0) {\n stmt.bind(params as BindParams);\n }\n if (stmt.step()) {\n return stmt.getAsObject();\n }\n return undefined;\n } finally {\n stmt.free();\n }\n }\n\n /**\n * Execute without returning rows (INSERT/UPDATE/DELETE).\n * Automatically persists changes to disk.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n run(...params: any[]): RunResult {\n this.db.run(this.sql, params as BindParams);\n const changes = this.db.getRowsModified();\n if (this.parent) {\n this.parent.save();\n }\n return new RunResult(changes);\n }\n}\n\n/**\n * Result of a run operation.\n */\nexport class RunResult {\n private modifiedRows: number;\n\n constructor(modifiedRows: number) {\n this.modifiedRows = modifiedRows;\n }\n\n /** Number of rows modified by the last INSERT/UPDATE/DELETE. */\n get changes(): number {\n return this.modifiedRows;\n }\n}\n\n/**\n * Initialize the shared SQLite database.\n * Must be called (and awaited) before using any stores.\n */\nexport async function initDatabase(options: LocalStoreOptions = {}): Promise<DatabaseWrapper> {\n if (_db) return _db;\n\n if (!_SQL) {\n _SQL = await initSqlJs();\n }\n\n const rawPath = options.dbPath || \"~/.axiom/lattice.db\";\n const dbPath = expandHome(rawPath);\n\n // Ensure parent directory exists\n const dir = path.dirname(dbPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n _db = new DatabaseWrapper(_SQL, dbPath);\n _db.exec(\"PRAGMA journal_mode = WAL;\");\n _db.exec(\"PRAGMA foreign_keys = ON;\");\n\n return _db;\n}\n\n/**\n * Get the shared database instance.\n * Must be called after `await initDatabase()`.\n */\nexport function getDatabase(): DatabaseWrapper {\n if (!_db) {\n throw new Error(\"Database not initialized. Call await initDatabase() first.\");\n }\n return _db;\n}\n\n/**\n * Persist and close the database connection.\n */\nexport function closeDatabase(): void {\n if (_db) {\n _db.save();\n _db.close();\n _db = null;\n }\n}\n\n/**\n * Execute a CREATE TABLE IF NOT EXISTS statement.\n * Helper for idempotent schema initialization.\n */\nexport function ensureTable(db: DatabaseWrapper, ddl: string): void {\n db.exec(ddl);\n}\n\n/**\n * ISO timestamp helper — returns current time as ISO string.\n */\nexport function nowISO(): string {\n return new Date().toISOString();\n}\n\n/**\n * Parse an ISO timestamp string back to a Date object.\n */\nexport function parseISO(iso: string): Date {\n return new Date(iso);\n}\n","/**\n * Migration system for SQLite (sql.js) local stores.\n *\n * ## Identity vs Ordering\n *\n * **name = identity** — each migration is uniquely identified by its name\n * within a store. Two stores may use the same name without conflict because\n * the tracking table includes a `store_name` column.\n *\n * **version = ordering** — migrations are applied in ascending version order.\n *\n * ## Usage\n *\n * Each store creates its own MigrationManager with a unique store name:\n *\n * ```ts\n * const mm = new MigrationManager(db, \"lt_threads\");\n * mm.register({ version: 1, name: \"create_table\", up: (db) => { db.exec(DDL); } });\n * mm.register({ version: 2, name: \"add_column_x\", up: (db) => { db.exec(ALTER); } });\n * mm.migrate();\n * ```\n *\n * @remarks\n * - All methods are synchronous (SQLite via sql.js is single-threaded)\n * - Duplicate **names** within the same store are rejected at registration time\n * - Duplicate **versions** are allowed (same positioning, different tables)\n */\n\nimport { DatabaseWrapper } from \"../database\";\n\n/**\n * Migration definition\n */\nexport interface Migration {\n version: number;\n name: string;\n up: (db: DatabaseWrapper) => void;\n down?: (db: DatabaseWrapper) => void;\n}\n\n/**\n * Migration manager — one per store.\n * Each store manages its own independent migration namespace via `storeName`.\n */\nexport class MigrationManager {\n private db: DatabaseWrapper;\n private storeName: string;\n private migrations: Migration[] = [];\n\n constructor(db: DatabaseWrapper, storeName: string) {\n this.db = db;\n this.storeName = storeName;\n this.ensureTrackingTable();\n }\n\n /**\n * Register a migration.\n * Duplicate names within this store are rejected immediately.\n * Duplicate versions are allowed.\n */\n register(migration: Migration): void {\n const existing = this.migrations.find((m) => m.name === migration.name);\n if (existing) {\n throw new Error(\n `[${this.storeName}] Migration name conflict: \"${migration.name}\" v${migration.version} ` +\n `collides with existing registration at v${existing.version}`\n );\n }\n this.migrations.push(migration);\n this.migrations.sort((a, b) => a.version - b.version);\n }\n\n /**\n * Apply all pending migrations in version order.\n */\n migrate(): void {\n const appliedNames = this.getAppliedNames();\n const pending = this.migrations.filter((m) => !appliedNames.has(m.name));\n\n if (pending.length === 0) return;\n\n for (const m of pending) {\n m.up(this.db);\n this.db.run(\n `INSERT INTO lattice_schema_migrations (store_name, name, version, applied_at)\n VALUES (?, ?, ?, ?)`,\n this.storeName, m.name, m.version, new Date().toISOString()\n );\n }\n }\n\n /**\n * Rollback the last-applied migration (highest version) for this store.\n */\n rollback(): void {\n const row = this.db\n .prepare(\n `SELECT name, version FROM lattice_schema_migrations\n WHERE store_name = ? ORDER BY version DESC LIMIT 1`\n )\n .get(this.storeName) as { name: string; version: number } | undefined;\n\n if (!row) {\n throw new Error(`[${this.storeName}] No migrations to rollback`);\n }\n\n const migration = this.migrations.find((m) => m.name === row!.name);\n if (!migration?.down) {\n throw new Error(\n `[${this.storeName}] Migration \"${row!.name}\" (v${row!.version}) has no down migration`\n );\n }\n\n migration.down(this.db);\n this.db.run(\n `DELETE FROM lattice_schema_migrations WHERE store_name = ? AND name = ?`,\n [this.storeName, row!.name]\n );\n }\n\n /**\n * Get the highest applied migration version for this store.\n */\n getCurrentVersion(): number {\n const row = this.db\n .prepare(\n `SELECT COALESCE(MAX(version), 0) AS max FROM lattice_schema_migrations\n WHERE store_name = ?`\n )\n .get(this.storeName) as { max: number } | undefined;\n return row?.max ?? 0;\n }\n\n // ── private ────────────────────────────────────────────────\n\n private ensureTrackingTable(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS lattice_schema_migrations (\n store_name TEXT NOT NULL,\n name TEXT NOT NULL,\n version INTEGER NOT NULL,\n applied_at TEXT NOT NULL,\n PRIMARY KEY (store_name, name)\n )\n `);\n }\n\n private getAppliedNames(): Set<string> {\n const rows = this.db\n .prepare(\n `SELECT name FROM lattice_schema_migrations WHERE store_name = ? ORDER BY version`\n )\n .all(this.storeName) as { name: string }[];\n return new Set(rows.map((r) => r.name));\n }\n}\n","/**\n * createLocalStoreConfig\n *\n * Creates a map of all local SQLite store instances from a single database,\n * ready to pass directly to configureStores().\n *\n * @example\n * ```ts\n * import { createLocalStoreConfig } from \"@axiom-lattice/local-stores\";\n * import { configureStores } from \"@axiom-lattice/core\";\n *\n * const stores = await createLocalStoreConfig({ dbPath: \"~/.axiom/lattice.db\" });\n * await configureStores(stores);\n * ```\n */\n\nimport { initDatabase } from \"./database\";\nimport { SqliteSaver } from \"@langchain/langgraph-checkpoint-sqlite\";\nimport { LocalThreadStore } from \"./stores/LocalThreadStore\";\nimport { LocalAssistantStore } from \"./stores/LocalAssistantStore\";\nimport { LocalWorkspaceStore } from \"./stores/LocalWorkspaceStore\";\nimport { LocalProjectStore } from \"./stores/LocalProjectStore\";\nimport { LocalProjectRoomStore } from \"./stores/LocalProjectRoomStore\";\nimport { LocalProjectMembershipStore } from \"./stores/LocalProjectMembershipStore\";\nimport { LocalProjectBotMembershipStore } from \"./stores/LocalProjectBotMembershipStore\";\nimport { LocalProjectRoomMessageStore } from \"./stores/LocalProjectRoomMessageStore\";\nimport { LocalProjectRoomReadStateStore } from \"./stores/LocalProjectRoomReadStateStore\";\nimport { LocalUserStore } from \"./stores/LocalUserStore\";\nimport { LocalTenantStore } from \"./stores/LocalTenantStore\";\nimport { LocalUserTenantLinkStore } from \"./stores/LocalUserTenantLinkStore\";\nimport { LocalDatabaseConfigStore } from \"./stores/LocalDatabaseConfigStore\";\nimport { LocalConnectionStore } from \"./stores/LocalConnectionStore\";\nimport { LocalMetricsServerConfigStore } from \"./stores/LocalMetricsServerConfigStore\";\nimport { LocalMcpServerConfigStore } from \"./stores/LocalMcpServerConfigStore\";\nimport { LocalModelProviderStore } from \"./stores/LocalModelProviderStore\";\nimport { LocalWorkflowTrackingStore } from \"./stores/LocalWorkflowTrackingStore\";\nimport { LocalEvalStore } from \"./stores/LocalEvalStore\";\nimport { LocalChannelBindingStore } from \"./stores/LocalChannelBindingStore\";\nimport { LocalChannelInstallationStore } from \"./stores/LocalChannelInstallationStore\";\nimport { LocalA2AApiKeyStore } from \"./stores/LocalA2AApiKeyStore\";\nimport { LocalOpenAuditStore } from \"./stores/LocalOpenAuditStore\";\nimport { LocalThreadMessageQueueStore } from \"./stores/LocalThreadMessageQueueStore\";\nimport { LocalSkillStore } from \"./stores/LocalSkillStore\";\nimport { LocalScheduleStorage } from \"./stores/LocalScheduleStorage\";\nimport { LocalTaskStore } from \"./stores/LocalTaskStore\";\nimport { LocalTaskWorkItemStore } from \"./stores/LocalTaskWorkItemStore\";\nimport { LocalCapabilityBundleStore } from \"./stores/LocalCapabilityBundleStore\";\n\nexport interface LocalStoreConfigOptions {\n /**\n * Path to the SQLite database file.\n * Supports `~` for home directory expansion.\n * @default \"~/.axiom/lattice.db\"\n */\n dbPath?: string;\n}\n\n/**\n * Creates a full set of local (SQLite-backed) stores sharing a single database.\n *\n * @returns An object with all store instances, ready for `configureStores()`.\n *\n * @remarks\n * - The `schedule` key is registered via ScheduleLatticeManager (not StoreLatticeManager).\n * - Call `closeDatabase()` from `@axiom-lattice/local-stores` to gracefully close the connection.\n */\nexport async function createLocalStoreConfig(options: LocalStoreConfigOptions = {}) {\n const dbPath = options.dbPath || \"~/.axiom/lattice.db\";\n const db = await initDatabase({ dbPath });\n\n return {\n thread: new LocalThreadStore(db),\n assistant: new LocalAssistantStore(db),\n workspace: new LocalWorkspaceStore(db),\n project: new LocalProjectStore(db),\n projectRoom: new LocalProjectRoomStore(db),\n projectMembership: new LocalProjectMembershipStore(db),\n projectBotMembership: new LocalProjectBotMembershipStore(db),\n projectRoomMessage: new LocalProjectRoomMessageStore(db),\n projectRoomReadState: new LocalProjectRoomReadStateStore(db),\n user: new LocalUserStore(db),\n tenant: new LocalTenantStore(db),\n userTenantLink: new LocalUserTenantLinkStore(db),\n database: new LocalDatabaseConfigStore(db),\n connection: new LocalConnectionStore(db),\n metrics: new LocalMetricsServerConfigStore(db),\n mcp: new LocalMcpServerConfigStore(db),\n modelProvider: new LocalModelProviderStore(db),\n workflowTracking: new LocalWorkflowTrackingStore(db),\n eval: new LocalEvalStore(db),\n channelBinding: new LocalChannelBindingStore(db),\n channelInstallation: new LocalChannelInstallationStore(db),\n a2aApiKey: new LocalA2AApiKeyStore(db),\n openAudit: new LocalOpenAuditStore(db),\n threadMessageQueue: new LocalThreadMessageQueueStore(db),\n skill: new LocalSkillStore(db),\n schedule: new LocalScheduleStorage(db),\n task: new LocalTaskStore(db),\n taskWorkItem: new LocalTaskWorkItemStore(db),\n capabilityBundle: new LocalCapabilityBundleStore(db),\n checkpoint: SqliteSaver.fromConnString(dbPath),\n };\n}\n","/**\n * Local SQLite implementation of ThreadStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n ThreadStore,\n Thread,\n CreateThreadRequest,\n} from \"@axiom-lattice/protocols\";\nimport { nowISO, parseISO } from \"../database\";\nimport { MigrationManager } from \"../migrations/migration\";\n\nconst STORE_NAME = \"lt_threads\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_threads (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n assistant_id TEXT NOT NULL,\n metadata TEXT DEFAULT '{}',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\nCREATE INDEX IF NOT EXISTS idx_lt_threads_assistant ON lt_threads(tenant_id, assistant_id);\n`;\n\ninterface ThreadRow {\n id: string;\n tenant_id: string;\n assistant_id: string;\n metadata: string;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalThreadStore implements ThreadStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n const mm = new MigrationManager(db, STORE_NAME);\n mm.register({\n version: 1,\n name: \"create_lt_threads\",\n up: (d) => { d.exec(DDL); },\n });\n mm.migrate();\n }\n\n async getThreadsByAssistantId(\n tenantId: string,\n assistantId: string,\n metadataFilter?: Record<string, string>,\n ): Promise<Thread[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_threads WHERE tenant_id = ? AND assistant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId, assistantId) as unknown as ThreadRow[];\n\n let threads = rows.map(mapRowToThread);\n\n if (metadataFilter && Object.keys(metadataFilter).length > 0) {\n threads = threads.filter((t) =>\n Object.entries(metadataFilter).every(\n ([key, value]) => t.metadata?.[key] === value,\n ),\n );\n }\n\n return threads;\n }\n\n async getThreadById(tenantId: string, threadId: string): Promise<Thread | undefined> {\n const row = this.db.prepare(\n `SELECT * FROM lt_threads WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, threadId) as unknown as ThreadRow | undefined;\n return row ? mapRowToThread(row) : undefined;\n }\n\n async createThread(\n tenantId: string,\n assistantId: string,\n threadId: string,\n data: CreateThreadRequest,\n ): Promise<Thread> {\n const now = nowISO();\n const metadata = JSON.stringify(data.metadata || {});\n\n this.db.prepare(\n `INSERT INTO lt_threads (id, tenant_id, assistant_id, metadata, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(tenant_id, id) DO UPDATE SET\n assistant_id = excluded.assistant_id,\n metadata = excluded.metadata,\n updated_at = excluded.updated_at`,\n ).run(threadId, tenantId, assistantId, metadata, now, now);\n\n return {\n id: threadId,\n tenantId,\n assistantId,\n metadata: data.metadata || {},\n createdAt: parseISO(now),\n updatedAt: parseISO(now),\n };\n }\n\n async updateThread(\n tenantId: string,\n threadId: string,\n updates: Partial<CreateThreadRequest>,\n ): Promise<Thread | null> {\n const existing = await this.getThreadById(tenantId, threadId);\n if (!existing) return null;\n\n const updatedMetadata = {\n ...existing.metadata,\n ...(updates.metadata || {}),\n };\n const now = nowISO();\n\n this.db.prepare(\n `UPDATE lt_threads SET metadata = ?, updated_at = ? WHERE tenant_id = ? AND id = ?`,\n ).run(JSON.stringify(updatedMetadata), now, tenantId, threadId);\n\n return {\n ...existing,\n metadata: updatedMetadata,\n updatedAt: parseISO(now),\n };\n }\n\n async deleteThread(tenantId: string, threadId: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_threads WHERE tenant_id = ? AND id = ?`,\n ).run(tenantId, threadId);\n return result.changes > 0;\n }\n\n async hasThread(tenantId: string, threadId: string): Promise<boolean> {\n const row = this.db.prepare(\n `SELECT 1 FROM lt_threads WHERE tenant_id = ? AND id = ? LIMIT 1`,\n ).get(tenantId, threadId);\n return row !== undefined;\n }\n}\n\nfunction mapRowToThread(row: ThreadRow): Thread {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n assistantId: row.assistant_id,\n metadata: JSON.parse(row.metadata || \"{}\"),\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","/**\n * Local SQLite implementation of AssistantStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n AssistantStore,\n Assistant,\n CreateAssistantRequest,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_assistants (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n name TEXT NOT NULL,\n description TEXT,\n graph_definition TEXT NOT NULL,\n owner_user_id TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\n`;\n\ninterface AssistantRow {\n id: string;\n tenant_id: string;\n name: string;\n description: string | null;\n graph_definition: string;\n owner_user_id: string | null;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalAssistantStore implements AssistantStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async getAllAssistants(tenantId: string): Promise<Assistant[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_assistants WHERE tenant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId) as unknown as AssistantRow[];\n return rows.map(mapRowToAssistant);\n }\n\n async getAssistantById(tenantId: string, id: string): Promise<Assistant | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_assistants WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as AssistantRow | undefined;\n return row ? mapRowToAssistant(row) : null;\n }\n\n async createAssistant(\n tenantId: string,\n id: string,\n data: CreateAssistantRequest,\n ): Promise<Assistant> {\n const now = nowISO();\n\n this.db.prepare(\n `INSERT INTO lt_assistants (id, tenant_id, name, description, graph_definition, owner_user_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(tenant_id, id) DO UPDATE SET\n name = excluded.name,\n description = excluded.description,\n graph_definition = excluded.graph_definition,\n owner_user_id = excluded.owner_user_id,\n updated_at = excluded.updated_at`,\n ).run(id, tenantId, data.name, data.description || null, JSON.stringify(data.graphDefinition), data.ownerUserId || null, now, now);\n\n return {\n id,\n tenantId,\n name: data.name,\n description: data.description,\n graphDefinition: data.graphDefinition,\n ownerUserId: data.ownerUserId,\n createdAt: parseISO(now),\n updatedAt: parseISO(now),\n };\n }\n\n async updateAssistant(\n tenantId: string,\n id: string,\n updates: Partial<CreateAssistantRequest>,\n ): Promise<Assistant | null> {\n const existing = await this.getAssistantById(tenantId, id);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.name !== undefined) {\n setClauses.push(\"name = ?\");\n values.push(updates.name);\n }\n if (updates.description !== undefined) {\n setClauses.push(\"description = ?\");\n values.push(updates.description || null);\n }\n if (updates.graphDefinition !== undefined) {\n setClauses.push(\"graph_definition = ?\");\n values.push(JSON.stringify(updates.graphDefinition));\n }\n\n if (updates.ownerUserId !== undefined) {\n setClauses.push(\"owner_user_id = ?\");\n values.push(updates.ownerUserId || null);\n }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_assistants SET ${setClauses.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...values);\n\n return this.getAssistantById(tenantId, id);\n }\n\n async deleteAssistant(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_assistants WHERE tenant_id = ? AND id = ?`,\n ).run(tenantId, id);\n return result.changes > 0;\n }\n\n async hasAssistant(tenantId: string, id: string): Promise<boolean> {\n const row = this.db.prepare(\n `SELECT 1 FROM lt_assistants WHERE tenant_id = ? AND id = ? LIMIT 1`,\n ).get(tenantId, id);\n return row !== undefined;\n }\n\n async getByOwner(tenantId: string, userId: string): Promise<Assistant | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_assistants WHERE tenant_id = ? AND owner_user_id = ? LIMIT 1`,\n ).get(tenantId, userId) as unknown as AssistantRow | undefined;\n return row ? mapRowToAssistant(row) : null;\n }\n}\n\nfunction mapRowToAssistant(row: AssistantRow): Assistant {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n description: row.description || undefined,\n graphDefinition: JSON.parse(row.graph_definition),\n ownerUserId: row.owner_user_id || undefined,\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","/**\n * Local SQLite implementation of WorkspaceStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n WorkspaceStore,\n Workspace,\n CreateWorkspaceRequest,\n UpdateWorkspaceRequest,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_workspaces (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n name TEXT NOT NULL,\n description TEXT,\n storage_type TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\n`;\n\ninterface WorkspaceRow {\n id: string;\n tenant_id: string;\n name: string;\n description: string | null;\n storage_type: string;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalWorkspaceStore implements WorkspaceStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async getAllWorkspaces(tenantId: string): Promise<Workspace[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_workspaces WHERE tenant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId) as unknown as WorkspaceRow[];\n return rows.map(mapRowToWorkspace);\n }\n\n async getWorkspaceById(tenantId: string, id: string): Promise<Workspace | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_workspaces WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as WorkspaceRow | undefined;\n return row ? mapRowToWorkspace(row) : null;\n }\n\n async createWorkspace(\n tenantId: string,\n id: string,\n data: CreateWorkspaceRequest,\n ): Promise<Workspace> {\n const now = nowISO();\n\n this.db.prepare(\n `INSERT INTO lt_workspaces (id, tenant_id, name, description, storage_type, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(tenant_id, id) DO UPDATE SET\n name = excluded.name,\n description = excluded.description,\n storage_type = excluded.storage_type,\n updated_at = excluded.updated_at`,\n ).run(id, tenantId, data.name, data.description || null, data.storageType, now, now);\n\n return {\n id,\n tenantId,\n name: data.name,\n description: data.description,\n storageType: data.storageType,\n createdAt: parseISO(now),\n updatedAt: parseISO(now),\n };\n }\n\n async updateWorkspace(\n tenantId: string,\n id: string,\n updates: UpdateWorkspaceRequest,\n ): Promise<Workspace | null> {\n const existing = await this.getWorkspaceById(tenantId, id);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.name !== undefined) {\n setClauses.push(\"name = ?\");\n values.push(updates.name);\n }\n if (updates.description !== undefined) {\n setClauses.push(\"description = ?\");\n values.push(updates.description || null);\n }\n if (updates.storageType !== undefined) {\n setClauses.push(\"storage_type = ?\");\n values.push(updates.storageType);\n }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_workspaces SET ${setClauses.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...values);\n\n return this.getWorkspaceById(tenantId, id);\n }\n\n async deleteWorkspace(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_workspaces WHERE tenant_id = ? AND id = ?`,\n ).run(tenantId, id);\n return result.changes > 0;\n }\n}\n\nfunction mapRowToWorkspace(row: WorkspaceRow): Workspace {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n description: row.description || undefined,\n storageType: row.storage_type as Workspace[\"storageType\"],\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","/**\n * Local SQLite implementation of ProjectStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n ProjectStore,\n Project,\n ProjectFilter,\n CreateProjectRequest,\n UpdateProjectRequest,\n UpdateProjectCapabilityBundlesResult,\n} from \"@axiom-lattice/protocols\";\nimport { assertGenericProjectConfig } from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_projects (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n workspace_id TEXT NOT NULL,\n name TEXT NOT NULL,\n description TEXT,\n config TEXT,\n kind TEXT DEFAULT 'business',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\nCREATE INDEX IF NOT EXISTS idx_lt_projects_workspace ON lt_projects(tenant_id, workspace_id);\n`;\n\ninterface ProjectRow {\n id: string;\n tenant_id: string;\n workspace_id: string;\n name: string;\n description: string | null;\n config: string | null;\n kind: string | null;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalProjectStore implements ProjectStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n this.ensureColumn(\"lt_projects\", \"kind\", \"kind TEXT DEFAULT 'business'\");\n }\n\n async getProjectsByWorkspace(tenantId: string, workspaceId: string, filter?: ProjectFilter): Promise<Project[]> {\n if (filter?.kind !== undefined) {\n const rows = this.db.prepare(\n `SELECT * FROM lt_projects WHERE tenant_id = ? AND workspace_id = ? AND kind = ? ORDER BY created_at DESC`,\n ).all(tenantId, workspaceId, filter.kind) as unknown as ProjectRow[];\n return rows.map(mapRowToProject);\n }\n const rows = this.db.prepare(\n `SELECT * FROM lt_projects WHERE tenant_id = ? AND workspace_id = ? ORDER BY created_at DESC`,\n ).all(tenantId, workspaceId) as unknown as ProjectRow[];\n return rows.map(mapRowToProject);\n }\n\n async getProjectById(tenantId: string, id: string): Promise<Project | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_projects WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as ProjectRow | undefined;\n return row ? mapRowToProject(row) : null;\n }\n\n async createProject(\n tenantId: string,\n workspaceId: string,\n id: string,\n data: CreateProjectRequest,\n ): Promise<Project> {\n assertGenericProjectConfig(data.config);\n const now = nowISO();\n const kind = data.kind || \"business\";\n\n this.db.prepare(\n `INSERT INTO lt_projects (id, tenant_id, workspace_id, name, description, config, kind, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(tenant_id, id) DO UPDATE SET\n workspace_id = excluded.workspace_id,\n name = excluded.name,\n description = excluded.description,\n config = CASE\n WHEN json_type(lt_projects.config, '$.capabilityBundleIds') IS NOT NULL\n THEN json_set(COALESCE(excluded.config, '{}'), '$.capabilityBundleIds', json_extract(lt_projects.config, '$.capabilityBundleIds'))\n ELSE excluded.config\n END,\n kind = excluded.kind,\n updated_at = excluded.updated_at`,\n ).run(id, tenantId, workspaceId, data.name, data.description || null, data.config ? JSON.stringify(data.config) : null, kind, now, now);\n\n return (await this.getProjectById(tenantId, id)) as Project;\n }\n\n async updateProject(\n tenantId: string,\n id: string,\n updates: UpdateProjectRequest,\n ): Promise<Project | null> {\n assertGenericProjectConfig(updates.config);\n const existing = await this.getProjectById(tenantId, id);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.name !== undefined) {\n setClauses.push(\"name = ?\");\n values.push(updates.name);\n }\n if (updates.description !== undefined) {\n setClauses.push(\"description = ?\");\n values.push(updates.description || null);\n }\n if (updates.config !== undefined) {\n setClauses.push(`config = CASE\n WHEN json_type(config, '$.capabilityBundleIds') IS NOT NULL\n THEN json_set(json(?), '$.capabilityBundleIds', json_extract(config, '$.capabilityBundleIds'))\n ELSE ?\n END`);\n const config = JSON.stringify(updates.config ?? {});\n values.push(config, config);\n }\n if (updates.kind !== undefined) {\n setClauses.push(\"kind = ?\");\n values.push(updates.kind);\n }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_projects SET ${setClauses.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...values);\n\n return this.getProjectById(tenantId, id);\n }\n\n async deleteProject(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_projects WHERE tenant_id = ? AND id = ?`,\n ).run(tenantId, id);\n return result.changes > 0;\n }\n\n async updateCapabilityBundleIds(tenantId: string, projectId: string, bundleIds: string[], expectedRevisions: Record<string, string> = {}): Promise<UpdateProjectCapabilityBundlesResult> {\n const now = nowISO();\n const result = this.db.prepare(\n `UPDATE lt_projects\n SET config = json_set(COALESCE(config, '{}'), '$.capabilityBundleIds', json(?)), updated_at = ?\n WHERE tenant_id = ? AND id = ?\n AND NOT EXISTS (\n SELECT 1 FROM json_each(?) AS requested\n WHERE NOT EXISTS (\n SELECT 1 FROM lt_capability_bundles\n WHERE tenant_id = ? AND id = requested.value\n )\n )\n AND NOT EXISTS (\n SELECT 1 FROM json_each(?) AS expected\n WHERE EXISTS (\n SELECT 1 FROM lt_capability_bundles\n WHERE tenant_id = ? AND id = expected.key AND updated_at <> expected.value\n )\n )`,\n ).run(JSON.stringify(bundleIds), now, tenantId, projectId, JSON.stringify(bundleIds), tenantId, JSON.stringify(expectedRevisions), tenantId);\n if (result.changes > 0) {\n const project = await this.getProjectById(tenantId, projectId);\n return project ? { status: \"updated\", project } : { status: \"project_not_found\" };\n }\n const revisionMismatch = this.db.prepare(\n \"SELECT 1 FROM lt_capability_bundles WHERE tenant_id = ? AND id IN (SELECT key FROM json_each(?)) AND updated_at <> (SELECT value FROM json_each(?) WHERE key = lt_capability_bundles.id) LIMIT 1\",\n ).get(tenantId, JSON.stringify(expectedRevisions), JSON.stringify(expectedRevisions));\n if (revisionMismatch) return { status: \"bundle_conflict\" };\n return await this.getProjectById(tenantId, projectId)\n ? { status: \"bundle_not_found\" }\n : { status: \"project_not_found\" };\n }\n\n async isCapabilityBundleReferenced(tenantId: string, bundleId: string): Promise<boolean> {\n const rows = this.db.prepare(\"SELECT config FROM lt_projects WHERE tenant_id = ?\").all(tenantId) as unknown as Array<{ config: string | null }>;\n return rows.some((row) => {\n if (!row.config) return false;\n let config: Record<string, unknown>;\n try {\n config = JSON.parse(row.config) as Record<string, unknown>;\n } catch {\n return false;\n }\n if (config === null || typeof config !== \"object\" || Array.isArray(config)) return false;\n const ids = config.capabilityBundleIds;\n return Array.isArray(ids) && ids.every((id) => typeof id === \"string\") && ids.includes(bundleId);\n });\n }\n\n /** Add a column if it does not exist (SQLite version compatible). */\n private ensureColumn(table: string, column: string, ddl: string): void {\n const cols = this.db.prepare(`PRAGMA table_info(${table})`).all() as unknown as Array<{ name: string }>;\n if (!cols.some((c) => c.name === column)) {\n this.db.exec(`ALTER TABLE ${table} ADD COLUMN ${ddl}`);\n }\n }\n}\n\nfunction mapRowToProject(row: ProjectRow): Project {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n workspaceId: row.workspace_id,\n name: row.name,\n description: row.description || undefined,\n config: row.config ? JSON.parse(row.config) as Record<string, unknown> : undefined,\n kind: (row.kind || \"business\") as Project[\"kind\"],\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","import { DatabaseWrapper } from \"../database\";\n\nconst schemaMarker = Symbol(\"projectRoomSchema\");\ntype SchemaDatabase = DatabaseWrapper & { [schemaMarker]?: boolean };\ntype ColumnRow = { name: unknown; type: unknown; notnull: unknown };\ntype IndexRow = { name: unknown; unique: unknown; partial: unknown };\ntype IndexColumnRow = { name: unknown };\nconst activeTransactions = new WeakSet<DatabaseWrapper>();\nconst migrationName = \"create_project_room_tables\";\nconst migrationTableDdl = `CREATE TABLE IF NOT EXISTS lattice_schema_migrations (\n store_name TEXT NOT NULL, name TEXT NOT NULL, version INTEGER NOT NULL, applied_at TEXT NOT NULL,\n PRIMARY KEY (store_name, name)\n)`;\n\nconst ddl = `\nCREATE TABLE IF NOT EXISTS lt_project_rooms (\n id TEXT NOT NULL, tenant_id TEXT NOT NULL, workspace_id TEXT NOT NULL, project_id TEXT NOT NULL,\n type TEXT NOT NULL CHECK (type = 'main'), name TEXT NOT NULL, created_at TEXT NOT NULL, updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id), UNIQUE (tenant_id, project_id, type)\n);\nCREATE TABLE IF NOT EXISTS lt_project_memberships (\n id TEXT NOT NULL, tenant_id TEXT NOT NULL, project_id TEXT NOT NULL, user_id TEXT NOT NULL,\n role TEXT NOT NULL CHECK (role IN ('owner','admin','member','viewer')),\n status TEXT NOT NULL CHECK (status IN ('active','removed')), joined_at TEXT NOT NULL, updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id), UNIQUE (tenant_id, project_id, user_id)\n);\nCREATE INDEX IF NOT EXISTS idx_lt_project_memberships_project ON lt_project_memberships (tenant_id, project_id);\nCREATE TABLE IF NOT EXISTS lt_project_bot_memberships (\n id TEXT NOT NULL, tenant_id TEXT NOT NULL, workspace_id TEXT NOT NULL, project_id TEXT NOT NULL,\n room_id TEXT NOT NULL, assistant_id TEXT NOT NULL, role TEXT NOT NULL CHECK (role IN ('coordinator','specialist')),\n title TEXT NOT NULL, responsibility TEXT, mention_name TEXT NOT NULL,\n status TEXT NOT NULL CHECK (status IN ('active','paused','removed')), room_thread_id TEXT NOT NULL,\n joined_at TEXT NOT NULL, updated_at TEXT NOT NULL, PRIMARY KEY (tenant_id, id),\n UNIQUE (tenant_id, project_id, assistant_id)\n);\nCREATE UNIQUE INDEX IF NOT EXISTS uq_lt_project_bot_memberships_coordinator\n ON lt_project_bot_memberships (tenant_id, project_id) WHERE role = 'coordinator' AND status IN ('active','paused');\nCREATE UNIQUE INDEX IF NOT EXISTS uq_lt_project_bot_memberships_mention\n ON lt_project_bot_memberships (tenant_id, room_id, mention_name) WHERE status IN ('active','paused');\nCREATE INDEX IF NOT EXISTS idx_lt_project_bot_memberships_project ON lt_project_bot_memberships (tenant_id, project_id);\nCREATE INDEX IF NOT EXISTS idx_lt_project_bot_memberships_room ON lt_project_bot_memberships (tenant_id, room_id);\nCREATE TABLE IF NOT EXISTS lt_project_room_messages (\n id TEXT NOT NULL, tenant_id TEXT NOT NULL, workspace_id TEXT NOT NULL, project_id TEXT NOT NULL, room_id TEXT NOT NULL,\n author TEXT NOT NULL, content TEXT NOT NULL, mentions TEXT NOT NULL DEFAULT '[]', reply_to_message_id TEXT,\n source TEXT NOT NULL CHECK (source IN ('user','agent','task','routine','system')), source_id TEXT,\n idempotency_key TEXT, created_at TEXT NOT NULL, PRIMARY KEY (tenant_id, id)\n);\nCREATE UNIQUE INDEX IF NOT EXISTS uq_lt_project_room_messages_idempotency\n ON lt_project_room_messages (tenant_id, room_id, idempotency_key) WHERE idempotency_key IS NOT NULL;\nCREATE INDEX IF NOT EXISTS idx_lt_project_room_messages_room_created\n ON lt_project_room_messages (tenant_id, room_id, created_at DESC, id DESC);\nCREATE INDEX IF NOT EXISTS idx_lt_project_room_messages_chat_created\n ON lt_project_room_messages (created_at) WHERE source IN ('user','agent');\nCREATE TABLE IF NOT EXISTS lt_project_room_read_states (\n tenant_id TEXT NOT NULL, room_id TEXT NOT NULL, user_id TEXT NOT NULL,\n last_read_at TEXT NOT NULL, updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, room_id, user_id)\n);\nCREATE INDEX IF NOT EXISTS idx_lt_project_room_read_states_user\n ON lt_project_room_read_states (tenant_id, user_id);\n`;\n\nconst tableColumns: Record<string, string[]> = {\n lt_project_rooms: [\"id\", \"tenant_id\", \"workspace_id\", \"project_id\", \"type\", \"name\", \"created_at\", \"updated_at\"],\n lt_project_memberships: [\"id\", \"tenant_id\", \"project_id\", \"user_id\", \"role\", \"status\", \"joined_at\", \"updated_at\"],\n lt_project_bot_memberships: [\"id\", \"tenant_id\", \"workspace_id\", \"project_id\", \"room_id\", \"assistant_id\", \"role\", \"title\", \"responsibility\", \"mention_name\", \"status\", \"room_thread_id\", \"joined_at\", \"updated_at\"],\n lt_project_room_messages: [\"id\", \"tenant_id\", \"workspace_id\", \"project_id\", \"room_id\", \"author\", \"content\", \"mentions\", \"reply_to_message_id\", \"source\", \"source_id\", \"idempotency_key\", \"created_at\"],\n lt_project_room_read_states: [\"tenant_id\", \"room_id\", \"user_id\", \"last_read_at\", \"updated_at\"],\n};\nconst indexes: Record<string, { table: string; columns: string[]; unique: boolean; partial: boolean; sql?: string[] }> = {\n idx_lt_project_memberships_project: { table: \"lt_project_memberships\", columns: [\"tenant_id\", \"project_id\"], unique: false, partial: false },\n uq_lt_project_bot_memberships_coordinator: { table: \"lt_project_bot_memberships\", columns: [\"tenant_id\", \"project_id\"], unique: true, partial: true, sql: [\"role = 'coordinator'\", \"status in ('active','paused')\"] },\n uq_lt_project_bot_memberships_mention: { table: \"lt_project_bot_memberships\", columns: [\"tenant_id\", \"room_id\", \"mention_name\"], unique: true, partial: true, sql: [\"status in ('active','paused')\"] },\n idx_lt_project_bot_memberships_project: { table: \"lt_project_bot_memberships\", columns: [\"tenant_id\", \"project_id\"], unique: false, partial: false },\n idx_lt_project_bot_memberships_room: { table: \"lt_project_bot_memberships\", columns: [\"tenant_id\", \"room_id\"], unique: false, partial: false },\n uq_lt_project_room_messages_idempotency: { table: \"lt_project_room_messages\", columns: [\"tenant_id\", \"room_id\", \"idempotency_key\"], unique: true, partial: true, sql: [\"idempotency_key is not null\"] },\n idx_lt_project_room_messages_room_created: { table: \"lt_project_room_messages\", columns: [\"tenant_id\", \"room_id\", \"created_at\", \"id\"], unique: false, partial: false, sql: [\"created_at desc\", \"id desc\"] },\n idx_lt_project_room_read_states_user: { table: \"lt_project_room_read_states\", columns: [\"tenant_id\", \"user_id\"], unique: false, partial: false },\n};\nconst uniqueConstraints: Record<string, string[][]> = {\n lt_project_rooms: [[\"tenant_id\", \"id\"], [\"tenant_id\", \"project_id\", \"type\"]],\n lt_project_memberships: [[\"tenant_id\", \"id\"], [\"tenant_id\", \"project_id\", \"user_id\"]],\n lt_project_bot_memberships: [[\"tenant_id\", \"id\"], [\"tenant_id\", \"project_id\", \"assistant_id\"]],\n lt_project_room_messages: [[\"tenant_id\", \"id\"]],\n lt_project_room_read_states: [[\"tenant_id\", \"room_id\", \"user_id\"]],\n};\nconst checkConstraints: Record<string, Array<{ name: string; fragment: string }>> = {\n lt_project_rooms: [{ name: \"type\", fragment: \"type='main'\" }],\n lt_project_memberships: [\n { name: \"role\", fragment: \"role in ('owner','admin','member','viewer')\" },\n { name: \"status\", fragment: \"status in ('active','removed')\" },\n ],\n lt_project_bot_memberships: [\n { name: \"role\", fragment: \"role in ('coordinator','specialist')\" },\n { name: \"status\", fragment: \"status in ('active','paused','removed')\" },\n ],\n lt_project_room_messages: [{ name: \"source\", fragment: \"source in ('user','agent','task','routine','system')\" }],\n lt_project_room_read_states: [],\n};\n\nfunction rows(db: DatabaseWrapper, sql: string): Record<string, unknown>[] {\n const result = db.getRawDb().exec(sql);\n if (!result[0]) return [];\n return result[0].values.map((values) => Object.fromEntries(result[0].columns.map((column, index) => [column, values[index]])));\n}\n\nfunction normalizeSql(value: string): string {\n return value.toLowerCase()\n .replace(/[\"`]/g, \"\")\n .replace(/\\[|\\]/g, \"\")\n .replace(/\\s+/g, \" \")\n .replace(/\\s*([=,])\\s*/g, \"$1\")\n .replace(/[()]/g, \"\")\n .trim();\n}\n\nfunction extractCheckExpressions(sql: string): string[] {\n const checks: string[] = [];\n let quoted = false;\n for (let index = 0; index < sql.length; index += 1) {\n if (sql[index] === \"'\") {\n if (quoted && sql[index + 1] === \"'\") { index += 1; continue; }\n quoted = !quoted;\n continue;\n }\n if (quoted || sql.slice(index, index + 5).toLowerCase() !== \"check\") continue;\n const before = sql[index - 1];\n const after = sql[index + 5];\n if ((before && /[a-z0-9_]/i.test(before)) || (after && /[a-z0-9_]/i.test(after))) continue;\n let opening = index + 5;\n while (/\\s/.test(sql[opening] ?? \"\")) opening += 1;\n if (sql[opening] !== \"(\") continue;\n let depth = 1;\n let expressionQuoted = false;\n for (let cursor = opening + 1; cursor < sql.length; cursor += 1) {\n if (sql[cursor] === \"'\") {\n if (expressionQuoted && sql[cursor + 1] === \"'\") { cursor += 1; continue; }\n expressionQuoted = !expressionQuoted;\n } else if (!expressionQuoted && sql[cursor] === \"(\") {\n depth += 1;\n } else if (!expressionQuoted && sql[cursor] === \")\") {\n depth -= 1;\n if (depth === 0) {\n checks.push(sql.slice(opening + 1, cursor));\n index = cursor;\n break;\n }\n }\n }\n }\n return checks;\n}\n\n/** Validates every table and named index required by project-room version 1. */\nexport function validateProjectRoomSchema(db: DatabaseWrapper): void {\n for (const [table, expected] of Object.entries(tableColumns)) {\n const actual = rows(db, `PRAGMA table_info(${table})`) as ColumnRow[];\n if (actual.map((column) => column.name).join(\",\") !== expected.join(\",\") || actual.some((column) => column.type !== \"TEXT\")\n || actual.some((column) => column.name !== \"responsibility\" && column.name !== \"reply_to_message_id\" && column.name !== \"source_id\" && column.name !== \"idempotency_key\" && column.notnull !== 1)) {\n throw new Error(`Invalid project room schema: table '${table}' has incompatible columns`);\n }\n const uniqueIndexes = (rows(db, `PRAGMA index_list(${table})`) as IndexRow[]).filter((index) => index.unique === 1);\n const signatures = uniqueIndexes.map((index) => (rows(db, `PRAGMA index_info(${String(index.name)})`) as IndexColumnRow[]).map((column) => column.name).join(\",\"));\n if (uniqueConstraints[table].some((constraint) => !signatures.includes(constraint.join(\",\")))) {\n throw new Error(`Invalid project room schema: table '${table}' is missing required uniqueness`);\n }\n const definition = rows(db, `SELECT sql FROM sqlite_master WHERE type = 'table' AND name = '${table}'`)[0]?.sql;\n const checks = typeof definition === \"string\" ? extractCheckExpressions(definition).map(normalizeSql) : [];\n const missingCheck = checkConstraints[table].find((constraint) => !checks.includes(normalizeSql(constraint.fragment)));\n if (missingCheck) {\n throw new Error(`Invalid project room schema: table '${table}' is missing required CHECK constraint '${missingCheck.name}'`);\n }\n }\n for (const [name, expected] of Object.entries(indexes)) {\n const listed = (rows(db, `PRAGMA index_list(${expected.table})`) as IndexRow[]).find((index) => index.name === name);\n const columns = (rows(db, `PRAGMA index_info(${name})`) as IndexColumnRow[]).map((column) => column.name);\n const definition = rows(db, `SELECT sql FROM sqlite_master WHERE type = 'index' AND name = '${name}'`)[0]?.sql;\n const normalized = typeof definition === \"string\" ? definition.toLowerCase().replace(/\\s+/g, \" \") : \"\";\n if (!listed || listed.unique !== Number(expected.unique) || listed.partial !== Number(expected.partial)\n || columns.join(\",\") !== expected.columns.join(\",\") || expected.sql?.some((fragment) => !normalized.includes(fragment))) {\n throw new Error(`Invalid project room schema: index '${name}' is incompatible`);\n }\n }\n}\n\n/** Atomically installs and validates project-room migration version 1. */\nexport function ensureProjectRoomSchema(db: DatabaseWrapper): void {\n const marked = db as SchemaDatabase;\n if (marked[schemaMarker]) return;\n const raw = db.getRawDb();\n const hasMigrationTable = rows(db, \"SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'lattice_schema_migrations'\").length > 0;\n const applied = hasMigrationTable ? rows(db, `SELECT name, version FROM lattice_schema_migrations WHERE store_name = 'project_room' AND name = '${migrationName}'`)[0] : undefined;\n if (applied) {\n if (applied.version !== 1) throw new Error(`Invalid project room schema migration version: ${String(applied.version)}`);\n const hasReadStates = rows(db, \"SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'lt_project_room_read_states'\").length > 0;\n if (!hasReadStates) {\n raw.exec(\"BEGIN IMMEDIATE\");\n try {\n raw.exec(`CREATE TABLE IF NOT EXISTS lt_project_room_read_states (\n tenant_id TEXT NOT NULL, room_id TEXT NOT NULL, user_id TEXT NOT NULL,\n last_read_at TEXT NOT NULL, updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, room_id, user_id)\n ); CREATE INDEX IF NOT EXISTS idx_lt_project_room_read_states_user\n ON lt_project_room_read_states (tenant_id, user_id);`);\n raw.run(\"INSERT INTO lattice_schema_migrations (store_name, name, version, applied_at) VALUES (?, ?, ?, ?)\",\n [\"project_room\", \"create_project_room_read_states\", 2, new Date().toISOString()]);\n raw.exec(\"COMMIT\");\n db.save();\n } catch (error) {\n try { raw.exec(\"ROLLBACK\"); } catch { /* preserve the schema failure */ }\n throw error;\n }\n }\n validateProjectRoomSchema(db);\n const hasRetentionIndex = rows(db, \"SELECT name FROM sqlite_master WHERE type = 'index' AND name = 'idx_lt_project_room_messages_chat_created'\").length > 0;\n if (!hasRetentionIndex) {\n raw.exec(\"BEGIN IMMEDIATE\");\n try {\n raw.exec(\"CREATE INDEX IF NOT EXISTS idx_lt_project_room_messages_chat_created ON lt_project_room_messages (created_at) WHERE source IN ('user','agent');\");\n raw.run(\"INSERT INTO lattice_schema_migrations (store_name, name, version, applied_at) VALUES (?, ?, ?, ?)\",\n [\"project_room\", \"add_project_room_message_retention_index\", 3, new Date().toISOString()]);\n raw.exec(\"COMMIT\");\n db.save();\n } catch (error) {\n try { raw.exec(\"ROLLBACK\"); } catch { /* preserve the schema failure */ }\n throw error;\n }\n }\n marked[schemaMarker] = true;\n return;\n }\n raw.exec(\"BEGIN IMMEDIATE\");\n try {\n raw.exec(migrationTableDdl);\n raw.exec(ddl);\n validateProjectRoomSchema(db);\n raw.run(\"INSERT INTO lattice_schema_migrations (store_name, name, version, applied_at) VALUES (?, ?, ?, ?)\", [\"project_room\", migrationName, 1, new Date().toISOString()]);\n raw.exec(\"COMMIT\");\n } catch (error) {\n try { raw.exec(\"ROLLBACK\"); } catch { /* preserve the schema failure */ }\n throw error;\n }\n db.save();\n marked[schemaMarker] = true;\n}\n\n/** Runs synchronous sql.js work atomically. This helper is intentionally non-reentrant. */\nexport function transaction<T>(db: DatabaseWrapper, work: () => T): T {\n if (activeTransactions.has(db)) throw new Error(\"Nested local store transactions are not supported\");\n activeTransactions.add(db);\n let began = false;\n try {\n db.exec(\"BEGIN IMMEDIATE\");\n began = true;\n const result = work();\n db.exec(\"COMMIT\");\n db.save();\n return result;\n } catch (error) {\n if (began) {\n try { db.exec(\"ROLLBACK\"); } catch { /* preserve the original error */ }\n db.save();\n }\n throw error;\n } finally {\n activeTransactions.delete(db);\n }\n}\n\n/** Executes a write without persisting mid-transaction. */\nexport function write(db: DatabaseWrapper, sql: string, params: Array<string | number | null>): number {\n const raw = db.getRawDb();\n raw.run(sql, params);\n return raw.getRowsModified();\n}\n\nexport function timestamp(previous?: string): string {\n const previousTime = previous === undefined ? Number.NaN : Date.parse(previous);\n const now = Date.now();\n return new Date(Math.max(now, Number.isFinite(previousTime) ? previousTime + 1 : now)).toISOString();\n}\n\nexport function validDate(value: unknown): value is Date {\n return value instanceof Date && !Number.isNaN(value.getTime());\n}\n\nexport function isUniqueError(error: unknown): boolean {\n return error instanceof Error && error.message.includes(\"UNIQUE constraint failed\");\n}\n","import type { ProjectRoom, ProjectRoomStore } from \"@axiom-lattice/protocols\";\nimport { DatabaseWrapper } from \"../database\";\nimport { ensureProjectRoomSchema, timestamp, transaction, validDate, write } from \"./project-room-schema\";\n\ntype Row = { id: unknown; tenant_id: unknown; workspace_id: unknown; project_id: unknown; type: unknown; name: unknown; created_at: unknown; updated_at: unknown };\nconst columns = \"id, tenant_id, workspace_id, project_id, type, name, created_at, updated_at\";\n\nfunction mapRow(row: Row): ProjectRoom {\n const createdAt = typeof row.created_at === \"string\" ? new Date(row.created_at) : undefined;\n const updatedAt = typeof row.updated_at === \"string\" ? new Date(row.updated_at) : undefined;\n if (typeof row.id !== \"string\" || typeof row.tenant_id !== \"string\" || typeof row.workspace_id !== \"string\"\n || typeof row.project_id !== \"string\" || row.type !== \"main\" || typeof row.name !== \"string\"\n || !validDate(createdAt) || !validDate(updatedAt)) throw new Error(\"Invalid project room row\");\n return { id: row.id, tenantId: row.tenant_id, workspaceId: row.workspace_id, projectId: row.project_id,\n type: \"main\", name: row.name, createdAt, updatedAt };\n}\n\n/** Persists canonical project main rooms in local SQLite. */\nexport class LocalProjectRoomStore implements ProjectRoomStore {\n constructor(private readonly db: DatabaseWrapper) { ensureProjectRoomSchema(db); }\n async ensureMainRoom(input: { id: string; tenantId: string; workspaceId: string; projectId: string; name: string }): Promise<ProjectRoom> {\n return transaction(this.db, () => {\n const existing = this.getRow(input.tenantId, input.projectId);\n if (existing) return mapRow(existing);\n const now = timestamp();\n write(this.db, \"INSERT INTO lt_project_rooms (id, tenant_id, workspace_id, project_id, type, name, created_at, updated_at) VALUES (?, ?, ?, ?, 'main', ?, ?, ?)\", [input.id, input.tenantId, input.workspaceId, input.projectId, input.name, now, now]);\n return mapRow(this.getRow(input.tenantId, input.projectId) as Row);\n });\n }\n async getMainRoom(tenantId: string, projectId: string): Promise<ProjectRoom | null> {\n const row = this.getRow(tenantId, projectId);\n return row ? mapRow(row) : null;\n }\n private getRow(tenantId: string, projectId: string): Row | undefined {\n return this.db.prepare(`SELECT ${columns} FROM lt_project_rooms WHERE tenant_id = ? AND project_id = ? AND type = 'main'`).get(tenantId, projectId) as Row | undefined;\n }\n}\n","import type { ProjectHumanRole, ProjectMembership, ProjectMembershipMutationResult, ProjectMembershipStore } from \"@axiom-lattice/protocols\";\nimport { DatabaseWrapper } from \"../database\";\nimport { ensureProjectRoomSchema, isUniqueError, timestamp, transaction, validDate, write } from \"./project-room-schema\";\n\ntype Row = { id: unknown; tenant_id: unknown; project_id: unknown; user_id: unknown; role: unknown; status: unknown; joined_at: unknown; updated_at: unknown };\nconst columns = \"id, tenant_id, project_id, user_id, role, status, joined_at, updated_at\";\n\nexport class DuplicateProjectMembershipError extends Error { constructor() { super(\"Project membership already exists for tenant, project, and user\"); this.name = \"DuplicateProjectMembershipError\"; } }\nexport class ProjectMembershipIdConflictError extends Error { constructor() { super(\"Project membership ID already exists for tenant\"); this.name = \"ProjectMembershipIdConflictError\"; } }\nfunction role(value: unknown): value is ProjectHumanRole { return value === \"owner\" || value === \"admin\" || value === \"member\" || value === \"viewer\"; }\nfunction mapRow(row: Row): ProjectMembership {\n const joinedAt = typeof row.joined_at === \"string\" ? new Date(row.joined_at) : undefined;\n const updatedAt = typeof row.updated_at === \"string\" ? new Date(row.updated_at) : undefined;\n if (typeof row.id !== \"string\" || typeof row.tenant_id !== \"string\" || typeof row.project_id !== \"string\"\n || typeof row.user_id !== \"string\" || !role(row.role) || (row.status !== \"active\" && row.status !== \"removed\")\n || !validDate(joinedAt) || !validDate(updatedAt)) throw new Error(\"Invalid project membership row\");\n return { id: row.id, tenantId: row.tenant_id, projectId: row.project_id, userId: row.user_id,\n role: row.role, status: row.status, joinedAt, updatedAt };\n}\n\n/** Persists human project memberships in local SQLite. */\nexport class LocalProjectMembershipStore implements ProjectMembershipStore {\n constructor(private readonly db: DatabaseWrapper) { ensureProjectRoomSchema(db); }\n async list(tenantId: string, projectId: string): Promise<ProjectMembership[]> { return (this.db.prepare(`SELECT ${columns} FROM lt_project_memberships WHERE tenant_id = ? AND project_id = ? ORDER BY joined_at ASC, id ASC`).all(tenantId, projectId) as Row[]).map(mapRow); }\n async findByUser(tenantId: string, projectId: string, userId: string): Promise<ProjectMembership | null> { const row = this.db.prepare(`SELECT ${columns} FROM lt_project_memberships WHERE tenant_id = ? AND project_id = ? AND user_id = ?`).get(tenantId, projectId, userId) as Row | undefined; return row ? mapRow(row) : null; }\n async create(input: Omit<ProjectMembership, \"joinedAt\" | \"updatedAt\">): Promise<ProjectMembership> {\n return transaction(this.db, () => {\n if (this.byId(input.tenantId, input.id)) throw new ProjectMembershipIdConflictError();\n const now = timestamp();\n try { write(this.db, \"INSERT INTO lt_project_memberships (id, tenant_id, project_id, user_id, role, status, joined_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\", [input.id, input.tenantId, input.projectId, input.userId, input.role, input.status, now, now]); }\n catch (error) { if (isUniqueError(error)) throw this.classifyUnique(input.tenantId, input.id, input.projectId, input.userId); throw error; }\n return mapRow(this.byId(input.tenantId, input.id) as Row);\n });\n }\n async createInitialOwner(input: Omit<ProjectMembership, \"role\" | \"status\" | \"joinedAt\" | \"updatedAt\">): Promise<{ kind: \"created\" | \"existing\"; membership: ProjectMembership } | { kind: \"already_initialized\" }> {\n return transaction(this.db, () => {\n const rows = this.db.prepare(`SELECT ${columns} FROM lt_project_memberships WHERE tenant_id = ? AND project_id = ?`).all(input.tenantId, input.projectId) as Row[];\n if (rows.length > 0) { const existing = rows.map(mapRow).find((item) => item.userId === input.userId && item.role === \"owner\" && item.status === \"active\"); return existing ? { kind: \"existing\", membership: existing } : { kind: \"already_initialized\" }; }\n if (this.byId(input.tenantId, input.id)) throw new ProjectMembershipIdConflictError();\n const now = timestamp();\n try { write(this.db, \"INSERT INTO lt_project_memberships (id, tenant_id, project_id, user_id, role, status, joined_at, updated_at) VALUES (?, ?, ?, ?, 'owner', 'active', ?, ?)\", [input.id, input.tenantId, input.projectId, input.userId, now, now]); }\n catch (error) { if (isUniqueError(error)) throw this.classifyUnique(input.tenantId, input.id, input.projectId, input.userId); throw error; }\n return { kind: \"created\", membership: mapRow(this.byId(input.tenantId, input.id) as Row) };\n });\n }\n async updateRole(input: { tenantId: string; id: string; role: ProjectHumanRole; expectedUpdatedAt: Date }): Promise<ProjectMembershipMutationResult> { return this.mutate(input.tenantId, input.id, input.expectedUpdatedAt, input.role, false); }\n async remove(input: { tenantId: string; id: string; expectedUpdatedAt: Date }): Promise<ProjectMembershipMutationResult> { return this.mutate(input.tenantId, input.id, input.expectedUpdatedAt, undefined, true); }\n private mutate(tenantId: string, id: string, expected: Date, nextRole: ProjectHumanRole, remove: false): ProjectMembershipMutationResult;\n private mutate(tenantId: string, id: string, expected: Date, nextRole: undefined, remove: true): ProjectMembershipMutationResult;\n private mutate(tenantId: string, id: string, expected: Date, nextRole: ProjectHumanRole | undefined, remove: boolean): ProjectMembershipMutationResult {\n return transaction(this.db, () => {\n const row = this.byId(tenantId, id); if (!row) return { kind: \"not_found\" };\n const current = mapRow(row); if (!validDate(expected) || current.updatedAt.getTime() !== expected.getTime()) return { kind: \"conflict\" };\n if (current.role === \"owner\" && current.status === \"active\" && (remove || nextRole !== \"owner\")) {\n const other = this.db.prepare(\"SELECT 1 FROM lt_project_memberships WHERE tenant_id = ? AND project_id = ? AND id <> ? AND role = 'owner' AND status = 'active'\").get(tenantId, current.projectId, id);\n if (!other) return { kind: \"last_owner\" };\n }\n const updatedAt = timestamp(row.updated_at as string);\n const changes = remove\n ? write(this.db, \"UPDATE lt_project_memberships SET status = 'removed', updated_at = ? WHERE tenant_id = ? AND id = ? AND updated_at = ?\", [updatedAt, tenantId, id, row.updated_at as string])\n : write(this.db, \"UPDATE lt_project_memberships SET role = ?, updated_at = ? WHERE tenant_id = ? AND id = ? AND updated_at = ?\", [nextRole as ProjectHumanRole, updatedAt, tenantId, id, row.updated_at as string]);\n if (changes === 0) return { kind: \"conflict\" };\n return { kind: remove ? \"removed\" : \"updated\", membership: mapRow(this.byId(tenantId, id) as Row) };\n });\n }\n private byId(tenantId: string, id: string): Row | undefined { return this.db.prepare(`SELECT ${columns} FROM lt_project_memberships WHERE tenant_id = ? AND id = ?`).get(tenantId, id) as Row | undefined; }\n private classifyUnique(tenantId: string, id: string, projectId: string, userId: string): Error {\n if (this.byId(tenantId, id)) return new ProjectMembershipIdConflictError();\n if (this.db.prepare(\"SELECT 1 FROM lt_project_memberships WHERE tenant_id = ? AND project_id = ? AND user_id = ?\").get(tenantId, projectId, userId)) return new DuplicateProjectMembershipError();\n return new Error(\"Unclassified project membership uniqueness conflict\");\n }\n}\n","import type { ProjectBotMembership, ProjectBotMembershipStatus, ProjectBotMembershipStore, ProjectBotRole } from \"@axiom-lattice/protocols\";\nimport { DatabaseWrapper } from \"../database\";\nimport { ensureProjectRoomSchema, isUniqueError, timestamp, transaction, validDate, write } from \"./project-room-schema\";\n\ntype Row = { id: unknown; tenant_id: unknown; workspace_id: unknown; project_id: unknown; room_id: unknown; assistant_id: unknown; role: unknown; title: unknown; responsibility: unknown; mention_name: unknown; status: unknown; room_thread_id: unknown; joined_at: unknown; updated_at: unknown };\ntype Conflict = \"coordinator_conflict\" | \"mention_conflict\";\nconst columns = \"id, tenant_id, workspace_id, project_id, room_id, assistant_id, role, title, responsibility, mention_name, status, room_thread_id, joined_at, updated_at\";\n\nexport class ProjectBotMembershipIdConflictError extends Error { constructor(tenantId: string, id: string) { super(`Project bot membership ID '${id}' already exists in tenant '${tenantId}'`); this.name = \"ProjectBotMembershipIdConflictError\"; } }\nfunction isRole(value: unknown): value is ProjectBotRole { return value === \"coordinator\" || value === \"specialist\"; }\nfunction isStatus(value: unknown): value is ProjectBotMembershipStatus { return value === \"active\" || value === \"paused\" || value === \"removed\"; }\nfunction mapRow(row: Row): ProjectBotMembership {\n const joinedAt = typeof row.joined_at === \"string\" ? new Date(row.joined_at) : undefined;\n const updatedAt = typeof row.updated_at === \"string\" ? new Date(row.updated_at) : undefined;\n if (typeof row.id !== \"string\" || typeof row.tenant_id !== \"string\" || typeof row.workspace_id !== \"string\"\n || typeof row.project_id !== \"string\" || typeof row.room_id !== \"string\" || typeof row.assistant_id !== \"string\"\n || !isRole(row.role) || typeof row.title !== \"string\" || (row.responsibility !== null && typeof row.responsibility !== \"string\")\n || typeof row.mention_name !== \"string\" || !isStatus(row.status) || typeof row.room_thread_id !== \"string\"\n || !validDate(joinedAt) || !validDate(updatedAt)) throw new Error(\"Invalid project bot membership row\");\n return { id: row.id, tenantId: row.tenant_id, workspaceId: row.workspace_id, projectId: row.project_id,\n roomId: row.room_id, assistantId: row.assistant_id, role: row.role, title: row.title,\n ...(row.responsibility === null ? {} : { responsibility: row.responsibility }), mentionName: row.mention_name,\n status: row.status, roomThreadId: row.room_thread_id, joinedAt, updatedAt };\n}\n\n/** Persists durable project bot roster memberships in local SQLite. */\nexport class LocalProjectBotMembershipStore implements ProjectBotMembershipStore {\n constructor(private readonly db: DatabaseWrapper) { ensureProjectRoomSchema(db); }\n async list(tenantId: string, projectId: string): Promise<ProjectBotMembership[]> { return (this.db.prepare(`SELECT ${columns} FROM lt_project_bot_memberships WHERE tenant_id = ? AND project_id = ? ORDER BY joined_at ASC, id ASC`).all(tenantId, projectId) as Row[]).map(mapRow); }\n async findById(tenantId: string, id: string): Promise<ProjectBotMembership | null> { const row = this.byId(tenantId, id); return row ? mapRow(row) : null; }\n async findByAssistant(tenantId: string, projectId: string, assistantId: string): Promise<ProjectBotMembership | null> { const row = this.db.prepare(`SELECT ${columns} FROM lt_project_bot_memberships WHERE tenant_id = ? AND project_id = ? AND assistant_id = ?`).get(tenantId, projectId, assistantId) as Row | undefined; return row ? mapRow(row) : null; }\n async save(input: Omit<ProjectBotMembership, \"joinedAt\" | \"updatedAt\">): Promise<{ kind: \"created\" | \"updated\" | \"reactivated\"; membership: ProjectBotMembership } | { kind: Conflict }> {\n try {\n return transaction(this.db, () => {\n const existing = this.db.prepare(`SELECT ${columns} FROM lt_project_bot_memberships WHERE tenant_id = ? AND project_id = ? AND assistant_id = ?`).get(input.tenantId, input.projectId, input.assistantId) as Row | undefined;\n if (existing) return this.reactivate(existing, input);\n if (this.byId(input.tenantId, input.id)) throw new ProjectBotMembershipIdConflictError(input.tenantId, input.id);\n const conflict = this.preflight(input.tenantId, input.projectId, input.roomId, input.role, input.mentionName, input.status, input.id);\n if (conflict) return { kind: conflict };\n const now = timestamp();\n try { write(this.db, \"INSERT INTO lt_project_bot_memberships (id, tenant_id, workspace_id, project_id, room_id, assistant_id, role, title, responsibility, mention_name, status, room_thread_id, joined_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", [input.id, input.tenantId, input.workspaceId, input.projectId, input.roomId, input.assistantId, input.role, input.title, input.responsibility ?? null, input.mentionName, input.status, input.roomThreadId, now, now]); }\n catch (error) {\n if (!isUniqueError(error)) throw error;\n if (this.byId(input.tenantId, input.id)) throw new ProjectBotMembershipIdConflictError(input.tenantId, input.id);\n const raced = this.byAssistant(input.tenantId, input.projectId, input.assistantId);\n if (raced) return this.reactivate(raced, input);\n const racedConflict = this.preflight(input.tenantId, input.projectId, input.roomId, input.role, input.mentionName, input.status, input.id);\n if (racedConflict) return { kind: racedConflict };\n throw new Error(\"Unclassified project bot membership uniqueness conflict\");\n }\n return { kind: \"created\", membership: mapRow(this.byId(input.tenantId, input.id) as Row) };\n });\n } catch (error) { const conflict = this.conflict(error); if (conflict) return { kind: conflict }; throw error; }\n }\n async update(input: { tenantId: string; id: string; patch: Partial<Pick<ProjectBotMembership, \"role\" | \"title\" | \"responsibility\" | \"mentionName\" | \"status\">>; expectedUpdatedAt: Date }): Promise<{ kind: \"updated\"; membership: ProjectBotMembership } | { kind: \"not_found\" | \"conflict\" | Conflict }> {\n try {\n return transaction(this.db, () => {\n const row = this.byId(input.tenantId, input.id); if (!row) return { kind: \"not_found\" as const };\n const existing = mapRow(row);\n if (!validDate(input.expectedUpdatedAt) || existing.updatedAt.getTime() !== input.expectedUpdatedAt.getTime()) return { kind: \"conflict\" as const };\n const candidate = { ...existing, ...input.patch };\n const conflict = this.preflight(candidate.tenantId, candidate.projectId, candidate.roomId, candidate.role, candidate.mentionName, candidate.status, candidate.id);\n if (conflict) return { kind: conflict };\n let changes: number;\n try { changes = write(this.db, \"UPDATE lt_project_bot_memberships SET role = ?, title = ?, responsibility = ?, mention_name = ?, status = ?, updated_at = ? WHERE tenant_id = ? AND id = ? AND updated_at = ?\", [candidate.role, candidate.title, candidate.responsibility ?? null, candidate.mentionName, candidate.status, timestamp(row.updated_at as string), input.tenantId, input.id, row.updated_at as string]); }\n catch (error) {\n if (!isUniqueError(error)) throw error;\n const racedConflict = this.preflight(candidate.tenantId, candidate.projectId, candidate.roomId, candidate.role, candidate.mentionName, candidate.status, candidate.id);\n if (racedConflict) return { kind: racedConflict };\n throw new Error(\"Unclassified project bot membership uniqueness conflict\");\n }\n if (changes === 0) return { kind: \"conflict\" as const };\n return { kind: \"updated\" as const, membership: mapRow(this.byId(input.tenantId, input.id) as Row) };\n });\n } catch (error) { const conflict = this.conflict(error); if (conflict) return { kind: conflict }; throw error; }\n }\n private byId(tenantId: string, id: string): Row | undefined { return this.db.prepare(`SELECT ${columns} FROM lt_project_bot_memberships WHERE tenant_id = ? AND id = ?`).get(tenantId, id) as Row | undefined; }\n private byAssistant(tenantId: string, projectId: string, assistantId: string): Row | undefined { return this.db.prepare(`SELECT ${columns} FROM lt_project_bot_memberships WHERE tenant_id = ? AND project_id = ? AND assistant_id = ?`).get(tenantId, projectId, assistantId) as Row | undefined; }\n private reactivate(existing: Row, input: Omit<ProjectBotMembership, \"joinedAt\" | \"updatedAt\">): { kind: \"updated\" | \"reactivated\"; membership: ProjectBotMembership } | { kind: Conflict } {\n const persisted = mapRow(existing);\n const wasRemoved = persisted.status === \"removed\";\n const conflict = this.preflight(input.tenantId, input.projectId, persisted.roomId, input.role, input.mentionName, \"active\", persisted.id);\n if (conflict) return { kind: conflict };\n try { write(this.db, \"UPDATE lt_project_bot_memberships SET role = ?, title = ?, responsibility = ?, mention_name = ?, status = 'active', updated_at = ? WHERE tenant_id = ? AND id = ?\", [input.role, input.title, input.responsibility ?? null, input.mentionName, timestamp(existing.updated_at as string), input.tenantId, persisted.id]); }\n catch (error) {\n if (!isUniqueError(error)) throw error;\n const racedConflict = this.preflight(input.tenantId, input.projectId, persisted.roomId, input.role, input.mentionName, \"active\", persisted.id);\n if (racedConflict) return { kind: racedConflict };\n throw new Error(\"Unclassified project bot membership uniqueness conflict\");\n }\n return { kind: wasRemoved ? \"reactivated\" : \"updated\", membership: mapRow(this.byId(input.tenantId, persisted.id) as Row) };\n }\n private preflight(tenantId: string, projectId: string, roomId: string, role: ProjectBotRole, mentionName: string, status: ProjectBotMembershipStatus, excludeId: string): Conflict | undefined {\n if (status === \"removed\") return undefined;\n if (role === \"coordinator\" && this.db.prepare(\"SELECT 1 FROM lt_project_bot_memberships WHERE tenant_id = ? AND project_id = ? AND id <> ? AND role = 'coordinator' AND status IN ('active', 'paused')\").get(tenantId, projectId, excludeId)) return \"coordinator_conflict\";\n if (this.db.prepare(\"SELECT 1 FROM lt_project_bot_memberships WHERE tenant_id = ? AND room_id = ? AND mention_name = ? AND id <> ? AND status IN ('active', 'paused')\").get(tenantId, roomId, mentionName, excludeId)) return \"mention_conflict\";\n return undefined;\n }\n private conflict(error: unknown): Conflict | undefined {\n if (!isUniqueError(error) || !(error instanceof Error)) return undefined;\n if (error.message.includes(\"tenant_id, lt_project_bot_memberships.project_id\")) return \"coordinator_conflict\";\n if (error.message.includes(\"room_id\") && error.message.includes(\"mention_name\")) return \"mention_conflict\";\n return undefined;\n }\n}\n","import type { ProjectRoomMention, ProjectRoomMessage, ProjectRoomMessageAuthor, ProjectRoomMessageSource, ProjectRoomMessageStore } from \"@axiom-lattice/protocols\";\nimport { DatabaseWrapper } from \"../database\";\nimport { ensureProjectRoomSchema, isUniqueError, timestamp, transaction, validDate, write } from \"./project-room-schema\";\n\ntype Row = { id: unknown; tenant_id: unknown; workspace_id: unknown; project_id: unknown; room_id: unknown; author: unknown; content: unknown; mentions: unknown; reply_to_message_id: unknown; source: unknown; source_id: unknown; idempotency_key: unknown; created_at: unknown };\nconst columns = \"id, tenant_id, workspace_id, project_id, room_id, author, content, mentions, reply_to_message_id, source, source_id, idempotency_key, created_at\";\nexport class ProjectRoomMessageIdConflictError extends Error { constructor(tenantId: string, id: string) { super(`Project room message ID '${id}' already exists in tenant '${tenantId}'`); this.name = \"ProjectRoomMessageIdConflictError\"; } }\nexport class DuplicateProjectRoomMessageIdempotencyKeyError extends Error { constructor(tenantId: string, roomId: string, key: string) { super(`Project room message idempotency key '${key}' already exists in tenant '${tenantId}' room '${roomId}'`); this.name = \"DuplicateProjectRoomMessageIdempotencyKeyError\"; } }\nfunction record(value: unknown): value is Record<string, unknown> { return typeof value === \"object\" && value !== null && !Array.isArray(value); }\nfunction only(value: Record<string, unknown>, keys: string[]): boolean { return Object.keys(value).every((key) => keys.includes(key)); }\nfunction parseJson(value: unknown): unknown { if (typeof value !== \"string\") return undefined; try { return JSON.parse(value) as unknown; } catch { return undefined; } }\nfunction author(value: unknown): ProjectRoomMessageAuthor | undefined { if (!record(value)) return undefined; if (value.type === \"human\" && only(value, [\"type\", \"userId\"]) && typeof value.userId === \"string\") return { type: \"human\", userId: value.userId }; if (value.type === \"bot\" && only(value, [\"type\", \"membershipId\", \"assistantId\"]) && typeof value.membershipId === \"string\" && typeof value.assistantId === \"string\") return { type: \"bot\", membershipId: value.membershipId, assistantId: value.assistantId }; if (value.type === \"system\" && only(value, [\"type\"])) return { type: \"system\" }; return undefined; }\nfunction mention(value: unknown): ProjectRoomMention | undefined { if (!record(value)) return undefined; if (value.type === \"bot\" && only(value, [\"type\", \"membershipId\"]) && typeof value.membershipId === \"string\") return { type: \"bot\", membershipId: value.membershipId }; if (value.type === \"team\" && only(value, [\"type\"])) return { type: \"team\" }; return undefined; }\nfunction source(value: unknown): value is ProjectRoomMessageSource { return value === \"user\" || value === \"agent\" || value === \"task\" || value === \"routine\" || value === \"system\"; }\nfunction mapRow(row: Row): ProjectRoomMessage {\n const mappedAuthor = author(parseJson(row.author)); const content = parseJson(row.content); const rawMentions = parseJson(row.mentions);\n const mappedMentions = Array.isArray(rawMentions) ? rawMentions.map(mention) : undefined;\n const createdAt = typeof row.created_at === \"string\" ? new Date(row.created_at) : undefined;\n if (typeof row.id !== \"string\" || typeof row.tenant_id !== \"string\" || typeof row.workspace_id !== \"string\" || typeof row.project_id !== \"string\" || typeof row.room_id !== \"string\" || !mappedAuthor\n || !record(content) || content.type !== \"text\" || typeof content.text !== \"string\" || !only(content, [\"type\", \"text\"])\n || !mappedMentions || mappedMentions.some((item) => item === undefined) || (row.reply_to_message_id !== null && typeof row.reply_to_message_id !== \"string\")\n || !source(row.source) || (row.source_id !== null && typeof row.source_id !== \"string\") || (row.idempotency_key !== null && typeof row.idempotency_key !== \"string\") || !validDate(createdAt)) throw new Error(\"Invalid project room message row\");\n return { id: row.id, tenantId: row.tenant_id, workspaceId: row.workspace_id, projectId: row.project_id, roomId: row.room_id,\n author: mappedAuthor, content: { type: \"text\", text: content.text }, mentions: mappedMentions as ProjectRoomMention[],\n ...(row.reply_to_message_id === null ? {} : { replyToMessageId: row.reply_to_message_id }), source: row.source,\n ...(row.source_id === null ? {} : { sourceId: row.source_id }), ...(row.idempotency_key === null ? {} : { idempotencyKey: row.idempotency_key }), createdAt };\n}\n\nfunction mapRowsTolerant(\n rows: Row[],\n scope: { tenantId: string; roomId: string },\n): ProjectRoomMessage[] {\n const messages: ProjectRoomMessage[] = [];\n for (const row of rows) {\n try {\n messages.push(mapRow(row));\n } catch (error) {\n console.warn(\"[ProjectRoomMessageStore] Skipping invalid message row\", {\n tenantId: scope.tenantId,\n roomId: scope.roomId,\n rowId: typeof row.id === \"string\" ? row.id : undefined,\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return messages;\n}\n\n/** Persists validated project room messages in local SQLite. */\nexport class LocalProjectRoomMessageStore implements ProjectRoomMessageStore {\n constructor(private readonly db: DatabaseWrapper) { ensureProjectRoomSchema(db); }\n async create(input: Omit<ProjectRoomMessage, \"createdAt\">): Promise<ProjectRoomMessage> { return this.insert(input, false); }\n async createIdempotent(input: Omit<ProjectRoomMessage, \"createdAt\"> & { idempotencyKey: string }): Promise<ProjectRoomMessage> { return this.insert(input, true); }\n async list(input: { tenantId: string; roomId: string; before?: { createdAt: Date; id: string }; limit: number }): Promise<ProjectRoomMessage[]> {\n if (input.before && !validDate(input.before.createdAt)) throw new RangeError(\"Project room message cursor date is invalid\");\n const limit = Math.min(100, Math.max(1, Math.trunc(Number.isFinite(input.limit) ? input.limit : 1)));\n const rows = input.before\n ? this.db.prepare(`SELECT ${columns} FROM lt_project_room_messages WHERE tenant_id = ? AND room_id = ? AND (created_at < ? OR (created_at = ? AND id < ?)) ORDER BY created_at DESC, id DESC LIMIT ?`).all(input.tenantId, input.roomId, input.before.createdAt.toISOString(), input.before.createdAt.toISOString(), input.before.id, limit)\n : this.db.prepare(`SELECT ${columns} FROM lt_project_room_messages WHERE tenant_id = ? AND room_id = ? ORDER BY created_at DESC, id DESC LIMIT ?`).all(input.tenantId, input.roomId, limit);\n return mapRowsTolerant(rows as Row[], { tenantId: input.tenantId, roomId: input.roomId });\n }\n async findById(tenantId: string, id: string): Promise<ProjectRoomMessage | null> { const row = this.byId(tenantId, id); return row ? mapRow(row) : null; }\n async countAfter(input: {\n tenantId: string; roomId: string; after: Date; excludeAuthorUserId?: string;\n }): Promise<number> {\n if (!validDate(input.after)) throw new RangeError(\"Project room message count horizon date is invalid\");\n const rows = this.db.prepare(\n `SELECT author FROM lt_project_room_messages\n WHERE tenant_id = ? AND room_id = ? AND created_at > ?`,\n ).all(input.tenantId, input.roomId, input.after.toISOString()) as Array<{ author: string }>;\n return rows.filter((row) => {\n if (input.excludeAuthorUserId === undefined) return true;\n const parsed = parseJson(row.author);\n return !(record(parsed) && parsed.type === \"human\" && parsed.userId === input.excludeAuthorUserId);\n }).length;\n }\n /**\n * Deletes one bounded batch of chat messages older than a horizon.\n *\n * @param input Exclusive upper time bound and requested batch size (clamped to 1..1000).\n * @returns The number of deleted rows.\n * @remarks Only `source: \"user\" | \"agent\"` rows are eligible; task/system events are retained.\n */\n async deleteChatOlderThan(input: { before: Date; limit: number }): Promise<number> {\n if (!validDate(input.before)) throw new RangeError(\"Project room message retention horizon date is invalid\");\n const limit = Math.min(1_000, Math.max(1, Math.trunc(Number.isFinite(input.limit) ? input.limit : 1)));\n return transaction(this.db, () => write(this.db,\n `DELETE FROM lt_project_room_messages WHERE rowid IN (\n SELECT rowid FROM lt_project_room_messages\n WHERE created_at < ? AND source IN ('user','agent')\n ORDER BY created_at ASC LIMIT ?\n )`,\n [input.before.toISOString(), limit]));\n }\n\n private insert(input: Omit<ProjectRoomMessage, \"createdAt\">, idempotent: boolean): ProjectRoomMessage {\n return transaction(this.db, () => {\n if (idempotent && input.idempotencyKey) { const canonical = this.byKey(input.tenantId, input.roomId, input.idempotencyKey); if (canonical) return mapRow(canonical); }\n if (this.byId(input.tenantId, input.id)) throw new ProjectRoomMessageIdConflictError(input.tenantId, input.id);\n try { write(this.db, \"INSERT INTO lt_project_room_messages (id, tenant_id, workspace_id, project_id, room_id, author, content, mentions, reply_to_message_id, source, source_id, idempotency_key, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\", [input.id, input.tenantId, input.workspaceId, input.projectId, input.roomId, JSON.stringify(input.author), JSON.stringify(input.content), JSON.stringify(input.mentions), input.replyToMessageId ?? null, input.source, input.sourceId ?? null, input.idempotencyKey ?? null, timestamp()]); }\n catch (error) {\n if (!isUniqueError(error)) throw error;\n if (this.byId(input.tenantId, input.id)) throw new ProjectRoomMessageIdConflictError(input.tenantId, input.id);\n if (input.idempotencyKey) {\n const canonical = this.byKey(input.tenantId, input.roomId, input.idempotencyKey);\n if (canonical && idempotent) return mapRow(canonical);\n if (canonical) throw new DuplicateProjectRoomMessageIdempotencyKeyError(input.tenantId, input.roomId, input.idempotencyKey);\n }\n throw new Error(\"Unclassified project room message uniqueness conflict\");\n }\n return mapRow(this.byId(input.tenantId, input.id) as Row);\n });\n }\n private byId(tenantId: string, id: string): Row | undefined { return this.db.prepare(`SELECT ${columns} FROM lt_project_room_messages WHERE tenant_id = ? AND id = ?`).get(tenantId, id) as Row | undefined; }\n private byKey(tenantId: string, roomId: string, key: string): Row | undefined { return this.db.prepare(`SELECT ${columns} FROM lt_project_room_messages WHERE tenant_id = ? AND room_id = ? AND idempotency_key = ?`).get(tenantId, roomId, key) as Row | undefined; }\n}\n","import type { ProjectRoomReadState, ProjectRoomReadStateStore } from \"@axiom-lattice/protocols\";\nimport type { DatabaseWrapper } from \"../database\";\nimport { ensureProjectRoomSchema, timestamp, transaction, validDate, write } from \"./project-room-schema\";\n\ntype ReadStateRow = { tenant_id: string; room_id: string; user_id: string; last_read_at: string; updated_at: string };\nconst columns = \"tenant_id, room_id, user_id, last_read_at, updated_at\";\n\nfunction mapRow(row: ReadStateRow): ProjectRoomReadState {\n const lastReadAt = new Date(row.last_read_at);\n const updatedAt = new Date(row.updated_at);\n if (Number.isNaN(lastReadAt.getTime()) || Number.isNaN(updatedAt.getTime())) throw new Error(\"Invalid project room read state row\");\n return { tenantId: row.tenant_id, roomId: row.room_id, userId: row.user_id, lastReadAt, updatedAt };\n}\n\n/** Persists per-user project room read markers in the local SQLite store. */\nexport class LocalProjectRoomReadStateStore implements ProjectRoomReadStateStore {\n /** Creates a store over a managed local database wrapper. */\n constructor(private readonly db: DatabaseWrapper) { ensureProjectRoomSchema(db); }\n\n /** Returns the user's read marker for a room, or null when never reported. */\n async get(tenantId: string, roomId: string, userId: string): Promise<ProjectRoomReadState | null> {\n const row = this.byKey(tenantId, roomId, userId);\n return row ? mapRow(row) : null;\n }\n\n /** Upserts the marker monotonically (an older report never regresses the horizon). */\n async markRead(input: { tenantId: string; roomId: string; userId: string; lastReadAt: Date }): Promise<ProjectRoomReadState> {\n if (!validDate(input.lastReadAt)) throw new RangeError(\"Project room read state lastReadAt is invalid\");\n return transaction(this.db, () => {\n const existing = this.byKey(input.tenantId, input.roomId, input.userId);\n const lastReadAt = existing !== undefined && new Date(existing.last_read_at).getTime() > input.lastReadAt.getTime()\n ? new Date(existing.last_read_at)\n : input.lastReadAt;\n write(this.db,\n `INSERT INTO lt_project_room_read_states (${columns})\n VALUES (?, ?, ?, ?, ?)\n ON CONFLICT (tenant_id, room_id, user_id) DO UPDATE\n SET last_read_at = excluded.last_read_at, updated_at = excluded.updated_at`,\n [input.tenantId, input.roomId, input.userId, lastReadAt.toISOString(), timestamp()]);\n const row = this.byKey(input.tenantId, input.roomId, input.userId) as ReadStateRow;\n return mapRow(row);\n });\n }\n\n private byKey(tenantId: string, roomId: string, userId: string): ReadStateRow | undefined {\n return this.db.prepare(\n `SELECT ${columns} FROM lt_project_room_read_states WHERE tenant_id = ? AND room_id = ? AND user_id = ?`,\n ).get(tenantId, roomId, userId) as ReadStateRow | undefined;\n }\n}\n","/**\n * Local SQLite implementation of UserStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n UserStore,\n User,\n UserStatus,\n CreateUserRequest,\n UpdateUserRequest,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_users (\n id TEXT PRIMARY KEY,\n email TEXT NOT NULL,\n name TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n metadata TEXT DEFAULT '{}',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_lt_users_email ON lt_users(email);\n`;\n\ninterface UserRow {\n id: string;\n email: string;\n name: string;\n status: string;\n metadata: string;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalUserStore implements UserStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async getAllUsers(): Promise<User[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_users ORDER BY created_at DESC`,\n ).all() as unknown as UserRow[];\n return rows.map(mapRowToUser);\n }\n\n async getUserById(id: string): Promise<User | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_users WHERE id = ?`,\n ).get(id) as unknown as UserRow | undefined;\n return row ? mapRowToUser(row) : null;\n }\n\n async getUserByEmail(email: string): Promise<User | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_users WHERE email = ?`,\n ).get(email) as unknown as UserRow | undefined;\n return row ? mapRowToUser(row) : null;\n }\n\n async createUser(id: string, data: CreateUserRequest): Promise<User> {\n const now = nowISO();\n const status = data.status || \"pending\";\n const metadata = JSON.stringify(data.metadata || {});\n\n this.db.prepare(\n `INSERT INTO lt_users (id, email, name, status, metadata, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n email = excluded.email,\n name = excluded.name,\n status = excluded.status,\n metadata = excluded.metadata,\n updated_at = excluded.updated_at`,\n ).run(id, data.email, data.name, status, metadata, now, now);\n\n return {\n id,\n email: data.email,\n name: data.name,\n status,\n metadata: data.metadata,\n createdAt: parseISO(now),\n updatedAt: parseISO(now),\n };\n }\n\n async updateUser(id: string, updates: UpdateUserRequest): Promise<User | null> {\n const existing = await this.getUserById(id);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.email !== undefined) { setClauses.push(\"email = ?\"); values.push(updates.email); }\n if (updates.name !== undefined) { setClauses.push(\"name = ?\"); values.push(updates.name); }\n if (updates.status !== undefined) { setClauses.push(\"status = ?\"); values.push(updates.status); }\n if (updates.metadata !== undefined) { setClauses.push(\"metadata = ?\"); values.push(JSON.stringify(updates.metadata)); }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(id);\n\n this.db.prepare(\n `UPDATE lt_users SET ${setClauses.join(\", \")} WHERE id = ?`,\n ).run(...values);\n\n return this.getUserById(id);\n }\n\n async deleteUser(id: string): Promise<boolean> {\n const result = this.db.prepare(`DELETE FROM lt_users WHERE id = ?`).run(id);\n return result.changes > 0;\n }\n}\n\nfunction mapRowToUser(row: UserRow): User {\n return {\n id: row.id,\n email: row.email,\n name: row.name,\n status: row.status as UserStatus,\n metadata: JSON.parse(row.metadata || \"{}\"),\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","/**\n * Local SQLite implementation of TenantStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n TenantStore,\n Tenant,\n TenantStatus,\n CreateTenantRequest,\n UpdateTenantRequest,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_tenants (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'active',\n metadata TEXT DEFAULT '{}',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\n`;\n\ninterface TenantRow {\n id: string;\n name: string;\n description: string | null;\n status: string;\n metadata: string;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalTenantStore implements TenantStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async getAllTenants(): Promise<Tenant[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_tenants ORDER BY created_at DESC`,\n ).all() as unknown as TenantRow[];\n return rows.map(mapRowToTenant);\n }\n\n async getTenantById(id: string): Promise<Tenant | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_tenants WHERE id = ?`,\n ).get(id) as unknown as TenantRow | undefined;\n return row ? mapRowToTenant(row) : null;\n }\n\n async createTenant(id: string, data: CreateTenantRequest): Promise<Tenant> {\n const now = nowISO();\n const status = data.status || \"active\";\n const metadata = JSON.stringify(data.metadata || {});\n\n this.db.prepare(\n `INSERT INTO lt_tenants (id, name, description, status, metadata, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n name = excluded.name,\n description = excluded.description,\n status = excluded.status,\n metadata = excluded.metadata,\n updated_at = excluded.updated_at`,\n ).run(id, data.name, data.description || null, status, metadata, now, now);\n\n return {\n id,\n name: data.name,\n description: data.description,\n status: status as TenantStatus,\n metadata: data.metadata,\n createdAt: parseISO(now),\n updatedAt: parseISO(now),\n };\n }\n\n async updateTenant(id: string, updates: UpdateTenantRequest): Promise<Tenant | null> {\n const existing = await this.getTenantById(id);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.name !== undefined) { setClauses.push(\"name = ?\"); values.push(updates.name); }\n if (updates.description !== undefined) { setClauses.push(\"description = ?\"); values.push(updates.description || null); }\n if (updates.status !== undefined) { setClauses.push(\"status = ?\"); values.push(updates.status); }\n if (updates.metadata !== undefined) { setClauses.push(\"metadata = ?\"); values.push(JSON.stringify(updates.metadata)); }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(id);\n\n this.db.prepare(\n `UPDATE lt_tenants SET ${setClauses.join(\", \")} WHERE id = ?`,\n ).run(...values);\n\n return this.getTenantById(id);\n }\n\n async deleteTenant(id: string): Promise<boolean> {\n const result = this.db.prepare(`DELETE FROM lt_tenants WHERE id = ?`).run(id);\n return result.changes > 0;\n }\n}\n\nfunction mapRowToTenant(row: TenantRow): Tenant {\n return {\n id: row.id,\n name: row.name,\n description: row.description || undefined,\n status: row.status as TenantStatus,\n metadata: JSON.parse(row.metadata || \"{}\"),\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","/**\n * Local SQLite implementation of UserTenantLinkStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n UserTenantLinkStore,\n UserTenantLink,\n UserTenantRole,\n CreateUserTenantLinkRequest,\n UpdateUserTenantLinkRequest,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_user_tenant_links (\n user_id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n role TEXT NOT NULL DEFAULT 'member',\n joined_at TEXT NOT NULL,\n metadata TEXT DEFAULT '{}',\n PRIMARY KEY (user_id, tenant_id)\n);\nCREATE INDEX IF NOT EXISTS idx_lt_utl_user ON lt_user_tenant_links(user_id);\nCREATE INDEX IF NOT EXISTS idx_lt_utl_tenant ON lt_user_tenant_links(tenant_id);\n`;\n\ninterface LinkRow {\n user_id: string;\n tenant_id: string;\n role: string;\n joined_at: string;\n metadata: string;\n}\n\nexport class LocalUserTenantLinkStore implements UserTenantLinkStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async getTenantsByUser(userId: string): Promise<UserTenantLink[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_user_tenant_links WHERE user_id = ? ORDER BY joined_at DESC`,\n ).all(userId) as unknown as LinkRow[];\n return rows.map(mapRowToLink);\n }\n\n async getUsersByTenant(tenantId: string): Promise<UserTenantLink[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_user_tenant_links WHERE tenant_id = ? ORDER BY joined_at DESC`,\n ).all(tenantId) as unknown as LinkRow[];\n return rows.map(mapRowToLink);\n }\n\n async getLink(userId: string, tenantId: string): Promise<UserTenantLink | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_user_tenant_links WHERE user_id = ? AND tenant_id = ?`,\n ).get(userId, tenantId) as unknown as LinkRow | undefined;\n return row ? mapRowToLink(row) : null;\n }\n\n async createLink(data: CreateUserTenantLinkRequest): Promise<UserTenantLink> {\n const now = nowISO();\n const role = data.role || \"member\";\n const metadata = JSON.stringify(data.metadata || {});\n\n this.db.prepare(\n `INSERT INTO lt_user_tenant_links (user_id, tenant_id, role, joined_at, metadata)\n VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(user_id, tenant_id) DO UPDATE SET\n role = excluded.role,\n metadata = excluded.metadata`,\n ).run(data.userId, data.tenantId, role, now, metadata);\n\n return {\n userId: data.userId,\n tenantId: data.tenantId,\n role,\n joinedAt: parseISO(now),\n metadata: data.metadata,\n };\n }\n\n async updateLink(\n userId: string,\n tenantId: string,\n updates: UpdateUserTenantLinkRequest,\n ): Promise<UserTenantLink | null> {\n const existing = await this.getLink(userId, tenantId);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.role !== undefined) { setClauses.push(\"role = ?\"); values.push(updates.role); }\n if (updates.metadata !== undefined) { setClauses.push(\"metadata = ?\"); values.push(JSON.stringify(updates.metadata)); }\n\n if (setClauses.length === 0) return existing;\n\n values.push(userId, tenantId);\n\n this.db.prepare(\n `UPDATE lt_user_tenant_links SET ${setClauses.join(\", \")} WHERE user_id = ? AND tenant_id = ?`,\n ).run(...values);\n\n return this.getLink(userId, tenantId);\n }\n\n async deleteLink(userId: string, tenantId: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_user_tenant_links WHERE user_id = ? AND tenant_id = ?`,\n ).run(userId, tenantId);\n return result.changes > 0;\n }\n\n async hasLink(userId: string, tenantId: string): Promise<boolean> {\n const row = this.db.prepare(\n `SELECT 1 FROM lt_user_tenant_links WHERE user_id = ? AND tenant_id = ? LIMIT 1`,\n ).get(userId, tenantId);\n return row !== undefined;\n }\n}\n\nfunction mapRowToLink(row: LinkRow): UserTenantLink {\n return {\n userId: row.user_id,\n tenantId: row.tenant_id,\n role: row.role as UserTenantRole,\n joinedAt: parseISO(row.joined_at),\n metadata: JSON.parse(row.metadata || \"{}\"),\n };\n}\n","/**\n * Local SQLite implementation of DatabaseConfigStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n DatabaseConfigStore,\n DatabaseConfigEntry,\n CreateDatabaseConfigRequest,\n UpdateDatabaseConfigRequest,\n DatabaseConfig,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\nimport { encrypt, decrypt } from \"@axiom-lattice/core\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_database_configs (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n key TEXT NOT NULL,\n name TEXT,\n description TEXT,\n config TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_lt_dbconfig_key ON lt_database_configs(tenant_id, key);\n`;\n\ninterface ConfigRow {\n id: string;\n tenant_id: string;\n key: string;\n name: string | null;\n description: string | null;\n config: string;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalDatabaseConfigStore implements DatabaseConfigStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async getAllConfigs(tenantId: string): Promise<DatabaseConfigEntry[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_database_configs WHERE tenant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId) as unknown as ConfigRow[];\n return rows.map((r) => mapRowToEntry(r));\n }\n\n async getAllConfigsWithoutTenant(): Promise<DatabaseConfigEntry[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_database_configs ORDER BY created_at DESC`,\n ).all() as unknown as ConfigRow[];\n return rows.map((r) => mapRowToEntry(r));\n }\n\n async getConfigById(tenantId: string, id: string): Promise<DatabaseConfigEntry | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_database_configs WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as ConfigRow | undefined;\n return row ? mapRowToEntry(row) : null;\n }\n\n async getConfigByKey(tenantId: string, key: string): Promise<DatabaseConfigEntry | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_database_configs WHERE tenant_id = ? AND key = ?`,\n ).get(tenantId, key) as unknown as ConfigRow | undefined;\n return row ? mapRowToEntry(row) : null;\n }\n\n async createConfig(\n tenantId: string,\n id: string,\n data: CreateDatabaseConfigRequest,\n ): Promise<DatabaseConfigEntry> {\n const now = nowISO();\n const configWithEncrypted = encryptPasswordInConfig(data.config);\n\n this.db.prepare(\n `INSERT INTO lt_database_configs (id, tenant_id, key, name, description, config, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(tenant_id, id) DO UPDATE SET\n key = excluded.key,\n name = excluded.name,\n description = excluded.description,\n config = excluded.config,\n updated_at = excluded.updated_at`,\n ).run(id, tenantId, data.key, data.name || null, data.description || null, JSON.stringify(configWithEncrypted), now, now);\n\n return {\n id,\n tenantId,\n key: data.key,\n config: data.config,\n name: data.name,\n description: data.description,\n createdAt: parseISO(now),\n updatedAt: parseISO(now),\n };\n }\n\n async updateConfig(\n tenantId: string,\n id: string,\n updates: Partial<UpdateDatabaseConfigRequest>,\n ): Promise<DatabaseConfigEntry | null> {\n const existing = await this.getConfigById(tenantId, id);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.key !== undefined) { setClauses.push(\"key = ?\"); values.push(updates.key); }\n if (updates.name !== undefined) { setClauses.push(\"name = ?\"); values.push(updates.name || null); }\n if (updates.description !== undefined) { setClauses.push(\"description = ?\"); values.push(updates.description || null); }\n if (updates.config !== undefined) {\n setClauses.push(\"config = ?\");\n values.push(JSON.stringify(encryptPasswordInConfig(updates.config)));\n }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_database_configs SET ${setClauses.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...values);\n\n return this.getConfigById(tenantId, id);\n }\n\n async deleteConfig(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_database_configs WHERE tenant_id = ? AND id = ?`,\n ).run(tenantId, id);\n return result.changes > 0;\n }\n\n async hasConfig(tenantId: string, id: string): Promise<boolean> {\n const row = this.db.prepare(\n `SELECT 1 FROM lt_database_configs WHERE tenant_id = ? AND id = ? LIMIT 1`,\n ).get(tenantId, id);\n return row !== undefined;\n }\n}\n\nfunction mapRowToEntry(row: ConfigRow): DatabaseConfigEntry {\n const config = JSON.parse(row.config) as DatabaseConfig;\n if (config.password) {\n try {\n config.password = decrypt(config.password);\n } catch {\n // password might not be encrypted (legacy data)\n }\n }\n return {\n id: row.id,\n tenantId: row.tenant_id,\n key: row.key,\n config,\n name: row.name || undefined,\n description: row.description || undefined,\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n\nfunction encryptPasswordInConfig(config: DatabaseConfig): DatabaseConfig {\n if (config.password) {\n return { ...config, password: encrypt(config.password) };\n }\n return config;\n}\n","/**\n * Local SQLite implementation of ConnectionStore.\n */\nimport { DatabaseWrapper, ensureTable, nowISO } from \"../database\";\nimport type { ConnectionEntry, ConnectionStore } from \"@axiom-lattice/protocols\";\nimport { v4 as uuid } from \"uuid\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS connection_configs (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n type TEXT NOT NULL,\n key TEXT NOT NULL,\n name TEXT NOT NULL,\n description TEXT,\n config TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id),\n UNIQUE (tenant_id, type, key)\n);\nCREATE INDEX IF NOT EXISTS idx_conn_type ON connection_configs(tenant_id, type);\n`;\n\ninterface ConnectionRow {\n id: string;\n tenant_id: string;\n type: string;\n key: string;\n name: string;\n description: string | null;\n config: string;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalConnectionStore implements ConnectionStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async listByTenant(tenantId: string): Promise<ConnectionEntry[]> {\n const rows = this.db.prepare(\n `SELECT * FROM connection_configs WHERE tenant_id = ? ORDER BY created_at`,\n ).all(tenantId) as unknown as ConnectionRow[];\n return rows.map((r) => this.mapRow(r));\n }\n\n async listByType(tenantId: string, type: string): Promise<ConnectionEntry[]> {\n const rows = this.db.prepare(\n `SELECT * FROM connection_configs WHERE tenant_id = ? AND type = ? ORDER BY created_at`,\n ).all(tenantId, type) as unknown as ConnectionRow[];\n return rows.map((r) => this.mapRow(r));\n }\n\n async getByKey(tenantId: string, type: string, key: string): Promise<ConnectionEntry | null> {\n const row = this.db.prepare(\n `SELECT * FROM connection_configs WHERE tenant_id = ? AND type = ? AND key = ?`,\n ).get(tenantId, type, key) as unknown as ConnectionRow | undefined;\n return row ? this.mapRow(row) : null;\n }\n\n async create(entry: Omit<ConnectionEntry, \"id\" | \"createdAt\" | \"updatedAt\">): Promise<ConnectionEntry> {\n const id = uuid();\n const now = nowISO();\n\n this.db.prepare(\n `INSERT INTO connection_configs (id, tenant_id, type, key, name, description, config, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(id, entry.tenantId, entry.type, entry.key, entry.name, entry.description || null, JSON.stringify(entry.config), now, now);\n\n return { id, ...entry, createdAt: now, updatedAt: now };\n }\n\n async update(\n tenantId: string, type: string, key: string, updates: Partial<ConnectionEntry>,\n ): Promise<ConnectionEntry | null> {\n const existing = await this.getByKey(tenantId, type, key);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.name !== undefined) {\n setClauses.push(\"name = ?\");\n values.push(updates.name);\n }\n if (updates.description !== undefined) {\n setClauses.push(\"description = ?\");\n values.push(updates.description || null);\n }\n if (updates.config !== undefined) {\n setClauses.push(\"config = ?\");\n values.push(JSON.stringify(updates.config));\n }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(tenantId, type, key);\n\n this.db.prepare(\n `UPDATE connection_configs SET ${setClauses.join(\", \")} WHERE tenant_id = ? AND type = ? AND key = ?`,\n ).run(...values);\n\n return this.getByKey(tenantId, type, key);\n }\n\n async delete(tenantId: string, type: string, key: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM connection_configs WHERE tenant_id = ? AND type = ? AND key = ?`,\n ).run(tenantId, type, key);\n return result.changes > 0;\n }\n\n private mapRow(row: ConnectionRow): ConnectionEntry {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n type: row.type,\n key: row.key,\n name: row.name,\n description: row.description || undefined,\n config: JSON.parse(row.config) as Record<string, unknown>,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n }\n}\n","/**\n * Local SQLite implementation of MetricsServerConfigStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n MetricsServerConfigStore,\n MetricsServerConfigEntry,\n CreateMetricsServerConfigRequest,\n UpdateMetricsServerConfigRequest,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_metrics_configs (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n key TEXT NOT NULL,\n name TEXT,\n description TEXT,\n config TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_lt_metrics_key ON lt_metrics_configs(tenant_id, key);\n`;\n\ninterface ConfigRow {\n id: string;\n tenant_id: string;\n key: string;\n name: string | null;\n description: string | null;\n config: string;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalMetricsServerConfigStore implements MetricsServerConfigStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async getAllConfigs(tenantId: string): Promise<MetricsServerConfigEntry[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_metrics_configs WHERE tenant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId) as unknown as ConfigRow[];\n return rows.map(mapRowToEntry);\n }\n\n async getAllConfigsWithoutTenant(): Promise<MetricsServerConfigEntry[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_metrics_configs ORDER BY created_at DESC`,\n ).all() as unknown as ConfigRow[];\n return rows.map(mapRowToEntry);\n }\n\n async getConfigById(tenantId: string, id: string): Promise<MetricsServerConfigEntry | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_metrics_configs WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as ConfigRow | undefined;\n return row ? mapRowToEntry(row) : null;\n }\n\n async getConfigByKey(tenantId: string, key: string): Promise<MetricsServerConfigEntry | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_metrics_configs WHERE tenant_id = ? AND key = ?`,\n ).get(tenantId, key) as unknown as ConfigRow | undefined;\n return row ? mapRowToEntry(row) : null;\n }\n\n async createConfig(\n tenantId: string,\n id: string,\n data: CreateMetricsServerConfigRequest,\n ): Promise<MetricsServerConfigEntry> {\n const now = nowISO();\n\n this.db.prepare(\n `INSERT INTO lt_metrics_configs (id, tenant_id, key, name, description, config, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(tenant_id, id) DO UPDATE SET\n key = excluded.key,\n name = excluded.name,\n description = excluded.description,\n config = excluded.config,\n updated_at = excluded.updated_at`,\n ).run(id, tenantId, data.key, data.name || null, data.description || null, JSON.stringify(data.config), now, now);\n\n return {\n id,\n tenantId,\n key: data.key,\n config: data.config,\n name: data.name,\n description: data.description,\n createdAt: parseISO(now),\n updatedAt: parseISO(now),\n };\n }\n\n async updateConfig(\n tenantId: string,\n id: string,\n updates: Partial<UpdateMetricsServerConfigRequest>,\n ): Promise<MetricsServerConfigEntry | null> {\n const existing = await this.getConfigById(tenantId, id);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.key !== undefined) { setClauses.push(\"key = ?\"); values.push(updates.key); }\n if (updates.name !== undefined) { setClauses.push(\"name = ?\"); values.push(updates.name || null); }\n if (updates.description !== undefined) { setClauses.push(\"description = ?\"); values.push(updates.description || null); }\n if (updates.config !== undefined) { setClauses.push(\"config = ?\"); values.push(JSON.stringify(updates.config)); }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_metrics_configs SET ${setClauses.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...values);\n\n return this.getConfigById(tenantId, id);\n }\n\n async deleteConfig(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_metrics_configs WHERE tenant_id = ? AND id = ?`,\n ).run(tenantId, id);\n return result.changes > 0;\n }\n\n async hasConfig(tenantId: string, id: string): Promise<boolean> {\n const row = this.db.prepare(\n `SELECT 1 FROM lt_metrics_configs WHERE tenant_id = ? AND id = ? LIMIT 1`,\n ).get(tenantId, id);\n return row !== undefined;\n }\n}\n\nfunction mapRowToEntry(row: ConfigRow): MetricsServerConfigEntry {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n key: row.key,\n config: JSON.parse(row.config),\n name: row.name || undefined,\n description: row.description || undefined,\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","/**\n * Local SQLite implementation of McpServerConfigStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n McpServerConfigStore,\n McpServerConfigEntry,\n CreateMcpServerConfigRequest,\n UpdateMcpServerConfigRequest,\n McpServerConfig,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\nimport { encrypt, decrypt } from \"@axiom-lattice/core\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_mcp_configs (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n key TEXT NOT NULL,\n name TEXT,\n description TEXT,\n config TEXT NOT NULL,\n selected_tools TEXT DEFAULT '[]',\n is_env_encrypted INTEGER NOT NULL DEFAULT 0,\n status TEXT NOT NULL DEFAULT 'disconnected',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_lt_mcp_key ON lt_mcp_configs(tenant_id, key);\n`;\n\ninterface ConfigRow {\n id: string;\n tenant_id: string;\n key: string;\n name: string | null;\n description: string | null;\n config: string;\n selected_tools: string;\n is_env_encrypted: number;\n status: string;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalMcpServerConfigStore implements McpServerConfigStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async getAllConfigs(tenantId: string): Promise<McpServerConfigEntry[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_mcp_configs WHERE tenant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId) as unknown as ConfigRow[];\n return rows.map(mapRowToEntry);\n }\n\n async getAllConfigsWithoutTenant(): Promise<McpServerConfigEntry[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_mcp_configs ORDER BY created_at DESC`,\n ).all() as unknown as ConfigRow[];\n return rows.map(mapRowToEntry);\n }\n\n async getConfigById(tenantId: string, id: string): Promise<McpServerConfigEntry | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_mcp_configs WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as ConfigRow | undefined;\n return row ? mapRowToEntry(row) : null;\n }\n\n async getConfigByKey(tenantId: string, key: string): Promise<McpServerConfigEntry | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_mcp_configs WHERE tenant_id = ? AND key = ?`,\n ).get(tenantId, key) as unknown as ConfigRow | undefined;\n return row ? mapRowToEntry(row) : null;\n }\n\n async createConfig(\n tenantId: string,\n id: string,\n data: CreateMcpServerConfigRequest,\n ): Promise<McpServerConfigEntry> {\n const now = nowISO();\n const { config: configWithEncryptedEnv, isEnvEncrypted } = encryptEnvInConfig(data.config);\n\n this.db.prepare(\n `INSERT INTO lt_mcp_configs (id, tenant_id, key, name, description, config, selected_tools, is_env_encrypted, status, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(tenant_id, id) DO UPDATE SET\n key = excluded.key,\n name = excluded.name,\n description = excluded.description,\n config = excluded.config,\n selected_tools = excluded.selected_tools,\n is_env_encrypted = excluded.is_env_encrypted,\n status = excluded.status,\n updated_at = excluded.updated_at`,\n ).run(\n id, tenantId, data.key, data.name || null, data.description || null,\n JSON.stringify(configWithEncryptedEnv),\n JSON.stringify(data.selectedTools || []),\n isEnvEncrypted ? 1 : 0, \"disconnected\",\n now, now,\n );\n\n return {\n id,\n tenantId,\n key: data.key,\n config: data.config,\n name: data.name,\n description: data.description,\n selectedTools: data.selectedTools || [],\n isEnvEncrypted,\n status: \"disconnected\",\n createdAt: parseISO(now),\n updatedAt: parseISO(now),\n };\n }\n\n async updateConfig(\n tenantId: string,\n id: string,\n updates: Partial<UpdateMcpServerConfigRequest>,\n ): Promise<McpServerConfigEntry | null> {\n const existing = await this.getConfigById(tenantId, id);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.key !== undefined) { setClauses.push(\"key = ?\"); values.push(updates.key); }\n if (updates.name !== undefined) { setClauses.push(\"name = ?\"); values.push(updates.name || null); }\n if (updates.description !== undefined) { setClauses.push(\"description = ?\"); values.push(updates.description || null); }\n if (updates.config !== undefined) {\n const { config: configWithEncryptedEnv, isEnvEncrypted } = encryptEnvInConfig(updates.config);\n setClauses.push(\"config = ?\"); values.push(JSON.stringify(configWithEncryptedEnv));\n setClauses.push(\"is_env_encrypted = ?\"); values.push(isEnvEncrypted ? 1 : 0);\n }\n if (updates.selectedTools !== undefined) { setClauses.push(\"selected_tools = ?\"); values.push(JSON.stringify(updates.selectedTools)); }\n if (updates.status !== undefined) { setClauses.push(\"status = ?\"); values.push(updates.status); }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_mcp_configs SET ${setClauses.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...values);\n\n return this.getConfigById(tenantId, id);\n }\n\n async deleteConfig(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_mcp_configs WHERE tenant_id = ? AND id = ?`,\n ).run(tenantId, id);\n return result.changes > 0;\n }\n\n async hasConfig(tenantId: string, id: string): Promise<boolean> {\n const row = this.db.prepare(\n `SELECT 1 FROM lt_mcp_configs WHERE tenant_id = ? AND id = ? LIMIT 1`,\n ).get(tenantId, id);\n return row !== undefined;\n }\n}\n\nfunction mapRowToEntry(row: ConfigRow): McpServerConfigEntry {\n const config: McpServerConfig = JSON.parse(row.config);\n\n if (config.env && row.is_env_encrypted) {\n try {\n const decryptedEnv: Record<string, string> = {};\n for (const [key, value] of Object.entries(config.env)) {\n decryptedEnv[key] = decrypt(value);\n }\n config.env = decryptedEnv;\n } catch (error) {\n console.error(\"Failed to decrypt MCP server env:\", error);\n throw new Error(\"Failed to decrypt MCP server configuration\");\n }\n }\n\n if (config.headers && row.is_env_encrypted) {\n try {\n const decryptedHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(config.headers)) {\n decryptedHeaders[key] = decrypt(value);\n }\n config.headers = decryptedHeaders;\n } catch (error) {\n console.error(\"Failed to decrypt MCP server headers:\", error);\n throw new Error(\"Failed to decrypt MCP server configuration\");\n }\n }\n\n return {\n id: row.id,\n tenantId: row.tenant_id,\n key: row.key,\n config,\n name: row.name || undefined,\n description: row.description || undefined,\n selectedTools: JSON.parse(row.selected_tools || \"[]\"),\n isEnvEncrypted: row.is_env_encrypted === 1,\n status: row.status as McpServerConfigEntry[\"status\"],\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n\nfunction encryptEnvInConfig(config: McpServerConfig): { config: McpServerConfig; isEnvEncrypted: boolean } {\n const configCopy = { ...config };\n let isEnvEncrypted = false;\n\n if (configCopy.env && Object.keys(configCopy.env).length > 0) {\n const encryptedEnv: Record<string, string> = {};\n for (const [key, value] of Object.entries(configCopy.env)) {\n encryptedEnv[key] = encrypt(value);\n }\n configCopy.env = encryptedEnv;\n isEnvEncrypted = true;\n }\n\n if (configCopy.headers && Object.keys(configCopy.headers).length > 0) {\n const encryptedHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(configCopy.headers)) {\n encryptedHeaders[key] = encrypt(value);\n }\n configCopy.headers = encryptedHeaders;\n isEnvEncrypted = true;\n }\n\n return { config: configCopy, isEnvEncrypted };\n}\n","/**\n * Local SQLite implementation of ModelProviderStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n ModelProviderStore,\n ModelProviderEntry,\n ModelProviderModelEntry,\n ModelProviderStatus,\n ModelProviderWireProtocol,\n ModelProviderApiStyle,\n ModelProviderLlmProvider,\n CreateModelProviderRequest,\n UpdateModelProviderRequest,\n ProviderModelInput,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\nimport { encrypt, decrypt } from \"@axiom-lattice/core\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_model_providers (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n name TEXT NOT NULL,\n display_name TEXT,\n protocol TEXT NOT NULL,\n api_style TEXT NOT NULL DEFAULT 'chat-completions',\n llm_provider TEXT NOT NULL,\n base_url TEXT NOT NULL,\n api_key_enc TEXT,\n api_key_hint TEXT,\n enabled INTEGER NOT NULL DEFAULT 1,\n status TEXT NOT NULL DEFAULT 'unknown',\n last_error TEXT,\n last_discovered_at TEXT,\n created_by TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_lt_model_providers_name\n ON lt_model_providers(tenant_id, name);\n\nCREATE TABLE IF NOT EXISTS lt_model_provider_models (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n provider_id TEXT NOT NULL,\n model_id TEXT NOT NULL,\n display_name TEXT,\n owned_by TEXT,\n upstream_created TEXT,\n enabled INTEGER NOT NULL DEFAULT 1,\n stale INTEGER NOT NULL DEFAULT 0,\n raw TEXT,\n discovered_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, provider_id, model_id)\n);\nCREATE INDEX IF NOT EXISTS idx_lt_model_provider_models_tenant\n ON lt_model_provider_models(tenant_id, model_id);\n`;\n\ninterface ProviderRow {\n id: string;\n tenant_id: string;\n name: string;\n display_name: string | null;\n protocol: string;\n api_style: string;\n llm_provider: string;\n base_url: string;\n api_key_enc: string | null;\n api_key_hint: string | null;\n enabled: number;\n status: string;\n last_error: string | null;\n last_discovered_at: string | null;\n created_by: string | null;\n created_at: string;\n updated_at: string;\n}\n\ninterface ModelRow {\n id: string;\n tenant_id: string;\n provider_id: string;\n model_id: string;\n display_name: string | null;\n owned_by: string | null;\n upstream_created: string | null;\n enabled: number;\n stale: number;\n discovered_at: string;\n}\n\n/**\n * SQLite implementation of ModelProviderStore.\n *\n * Mirrors the PostgreSQL store's semantics: tenant-scoped, API keys encrypted\n * at rest, and `enabled` preserved across a re-discovery.\n */\nexport class LocalModelProviderStore implements ModelProviderStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n // `CREATE TABLE IF NOT EXISTS` cannot add a column to a table that already\n // exists, and this one gained `api_style` after it shipped — the same gap\n // the PostgreSQL path needed v183 for.\n this.ensureColumn(\n \"lt_model_providers\",\n \"api_style\",\n \"api_style TEXT NOT NULL DEFAULT 'chat-completions'\"\n );\n this.ensureColumn(\n \"lt_model_provider_models\",\n \"stale\",\n \"stale INTEGER NOT NULL DEFAULT 0\"\n );\n }\n\n /** Add a column if it does not exist (SQLite version compatible). */\n private ensureColumn(table: string, column: string, ddl: string): void {\n const cols = this.db\n .prepare(`PRAGMA table_info(${table})`)\n .all() as unknown as Array<{ name: string }>;\n\n if (!cols.some((c) => c.name === column)) {\n this.db.exec(`ALTER TABLE ${table} ADD COLUMN ${ddl}`);\n }\n }\n\n async listProviders(tenantId: string): Promise<ModelProviderEntry[]> {\n const rows = this.db\n .prepare(\n `SELECT * FROM lt_model_providers WHERE tenant_id = ? ORDER BY created_at DESC`\n )\n .all(tenantId) as unknown as ProviderRow[];\n return rows.map((row) => mapRowToEntry(row));\n }\n\n async getProviderById(\n tenantId: string,\n id: string\n ): Promise<ModelProviderEntry | null> {\n const row = this.db\n .prepare(\n `SELECT * FROM lt_model_providers WHERE tenant_id = ? AND id = ?`\n )\n .get(tenantId, id) as unknown as ProviderRow | undefined;\n return row ? mapRowToEntry(row) : null;\n }\n\n async getProviderByName(\n tenantId: string,\n name: string\n ): Promise<ModelProviderEntry | null> {\n const row = this.db\n .prepare(\n `SELECT * FROM lt_model_providers WHERE tenant_id = ? AND name = ?`\n )\n .get(tenantId, name) as unknown as ProviderRow | undefined;\n return row ? mapRowToEntry(row) : null;\n }\n\n async createProvider(\n tenantId: string,\n id: string,\n data: CreateModelProviderRequest\n ): Promise<ModelProviderEntry> {\n const now = nowISO();\n\n this.db\n .prepare(\n `INSERT INTO lt_model_providers (\n id, tenant_id, name, display_name, protocol, api_style, llm_provider, base_url,\n api_key_enc, api_key_hint, enabled, status, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'unknown', ?, ?)\n ON CONFLICT (tenant_id, id) DO UPDATE SET\n name = excluded.name,\n display_name = excluded.display_name,\n protocol = excluded.protocol,\n api_style = excluded.api_style,\n llm_provider = excluded.llm_provider,\n base_url = excluded.base_url,\n api_key_enc = excluded.api_key_enc,\n api_key_hint = excluded.api_key_hint,\n enabled = excluded.enabled,\n updated_at = excluded.updated_at`\n )\n .run(\n id,\n tenantId,\n data.name,\n data.displayName || null,\n data.protocol,\n data.apiStyle ?? \"chat-completions\",\n // Phase 1 pins the LLM provider (ADR-138 decision 7b)\n \"openai\",\n data.baseURL,\n data.apiKey ? encrypt(data.apiKey) : null,\n data.apiKey ? data.apiKey.slice(-4) : null,\n data.enabled === false ? 0 : 1,\n now,\n now\n );\n\n const created = await this.getProviderById(tenantId, id);\n if (!created) {\n throw new Error(\"Failed to create model provider\");\n }\n\n return created;\n }\n\n async updateProvider(\n tenantId: string,\n id: string,\n updates: Partial<UpdateModelProviderRequest>\n ): Promise<ModelProviderEntry | null> {\n const existing = await this.getProviderById(tenantId, id);\n if (!existing) {\n return null;\n }\n\n const fields: string[] = [];\n const values: unknown[] = [];\n\n const set = (column: string, value: unknown): void => {\n fields.push(`${column} = ?`);\n values.push(value);\n };\n\n if (updates.name !== undefined) set(\"name\", updates.name);\n if (updates.displayName !== undefined) {\n set(\"display_name\", updates.displayName || null);\n }\n if (updates.protocol !== undefined) set(\"protocol\", updates.protocol);\n if (updates.apiStyle !== undefined) set(\"api_style\", updates.apiStyle);\n if (updates.baseURL !== undefined) set(\"base_url\", updates.baseURL);\n if (updates.enabled !== undefined) set(\"enabled\", updates.enabled ? 1 : 0);\n\n // An empty or omitted apiKey means \"keep the existing key\"; `clearApiKey`\n // is the only way to remove one outright.\n if (updates.clearApiKey === true) {\n set(\"api_key_enc\", null);\n set(\"api_key_hint\", null);\n } else if (updates.apiKey) {\n set(\"api_key_enc\", encrypt(updates.apiKey));\n set(\"api_key_hint\", updates.apiKey.slice(-4));\n }\n\n if (fields.length === 0) {\n return existing;\n }\n\n fields.push(\"updated_at = ?\");\n values.push(nowISO(), tenantId, id);\n\n this.db\n .prepare(\n `UPDATE lt_model_providers SET ${fields.join(\", \")}\n WHERE tenant_id = ? AND id = ?`\n )\n .run(...values);\n\n return this.getProviderById(tenantId, id);\n }\n\n async deleteProvider(tenantId: string, id: string): Promise<boolean> {\n await this.deleteModelsByProvider(tenantId, id);\n\n const result = this.db\n .prepare(`DELETE FROM lt_model_providers WHERE tenant_id = ? AND id = ?`)\n .run(tenantId, id);\n\n return result.changes > 0;\n }\n\n async markProviderStatus(\n tenantId: string,\n id: string,\n status: ModelProviderStatus,\n lastError?: string,\n discoveredAt?: Date\n ): Promise<void> {\n this.db\n .prepare(\n `UPDATE lt_model_providers\n SET status = ?,\n last_error = ?,\n last_discovered_at = COALESCE(?, last_discovered_at),\n updated_at = ?\n WHERE tenant_id = ? AND id = ?`\n )\n .run(\n status,\n status === \"ok\" ? null : lastError || null,\n discoveredAt ? discoveredAt.toISOString() : null,\n nowISO(),\n tenantId,\n id\n );\n }\n\n async listModels(\n tenantId: string,\n providerId?: string\n ): Promise<ModelProviderModelEntry[]> {\n const rows = providerId\n ? (this.db\n .prepare(\n `SELECT * FROM lt_model_provider_models\n WHERE tenant_id = ? AND provider_id = ? ORDER BY model_id ASC`\n )\n .all(tenantId, providerId) as unknown as ModelRow[])\n : (this.db\n .prepare(\n `SELECT * FROM lt_model_provider_models\n WHERE tenant_id = ? ORDER BY model_id ASC`\n )\n .all(tenantId) as unknown as ModelRow[]);\n\n return rows.map((row) => mapRowToModel(row));\n }\n\n async getModel(\n tenantId: string,\n providerId: string,\n modelId: string\n ): Promise<ModelProviderModelEntry | null> {\n const row = this.db\n .prepare(\n `SELECT * FROM lt_model_provider_models\n WHERE tenant_id = ? AND provider_id = ? AND model_id = ?`\n )\n .get(tenantId, providerId, modelId) as unknown as ModelRow | undefined;\n\n return row ? mapRowToModel(row) : null;\n }\n\n /**\n * Replace a provider's model snapshot.\n *\n * Models the upstream no longer offers are deleted; survivors are upserted\n * without touching `enabled`, so the tenant's enable/disable choice survives.\n */\n async replaceProviderModels(\n tenantId: string,\n providerId: string,\n models: ProviderModelInput[]\n ): Promise<string[]> {\n const now = nowISO();\n\n // De-duplicate by model id: the upsert below targets\n // (tenant_id, provider_id, model_id), and upstreams do repeat ids.\n const deduped = new Map<string, ProviderModelInput>();\n for (const model of models) {\n deduped.set(model.id, model);\n }\n const rows = [...deduped.values()];\n\n if (rows.length === 0) {\n await this.deleteModelsByProvider(tenantId, providerId);\n return [];\n }\n\n // Read the current enabled state first so the write can state it\n // explicitly: discovery leaves `enabled` out (keeping the tenant's choice)\n // while an explicit selection supplies it.\n const current = new Map(\n (await this.listModels(tenantId, providerId)).map((model) => [\n model.modelId,\n model.enabled,\n ])\n );\n\n const placeholders = rows.map(() => \"?\").join(\", \");\n this.db\n .prepare(\n `DELETE FROM lt_model_provider_models\n WHERE tenant_id = ? AND provider_id = ? AND model_id NOT IN (${placeholders})`\n )\n .run(tenantId, providerId, ...rows.map((model) => model.id));\n\n for (const model of rows) {\n this.db\n .prepare(\n `INSERT INTO lt_model_provider_models (\n id, tenant_id, provider_id, model_id, display_name, owned_by,\n upstream_created, raw, enabled, stale, discovered_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT (tenant_id, provider_id, model_id) DO UPDATE SET\n display_name = excluded.display_name,\n owned_by = excluded.owned_by,\n upstream_created = excluded.upstream_created,\n raw = excluded.raw,\n enabled = excluded.enabled,\n stale = excluded.stale,\n discovered_at = excluded.discovered_at`\n )\n .run(\n `${providerId}:${model.id}`,\n tenantId,\n providerId,\n model.id,\n model.displayName || null,\n model.ownedBy || null,\n model.createdAt || null,\n model.raw === undefined ? null : JSON.stringify(model.raw),\n model.enabled ?? current.get(model.id) ?? true ? 1 : 0,\n model.stale ? 1 : 0,\n now\n );\n }\n\n return rows.map((model) => model.id);\n }\n\n async setModelEnabled(\n tenantId: string,\n providerId: string,\n modelId: string,\n enabled: boolean\n ): Promise<ModelProviderModelEntry | null> {\n const result = this.db\n .prepare(\n `UPDATE lt_model_provider_models SET enabled = ?\n WHERE tenant_id = ? AND provider_id = ? AND model_id = ?`\n )\n .run(enabled ? 1 : 0, tenantId, providerId, modelId);\n\n if (result.changes === 0) {\n return null;\n }\n\n return this.getModel(tenantId, providerId, modelId);\n }\n\n async deleteModelsByProvider(\n tenantId: string,\n providerId: string\n ): Promise<number> {\n const result = this.db\n .prepare(\n `DELETE FROM lt_model_provider_models\n WHERE tenant_id = ? AND provider_id = ?`\n )\n .run(tenantId, providerId);\n\n return result.changes;\n }\n}\n\nfunction mapRowToEntry(row: ProviderRow): ModelProviderEntry {\n let apiKey: string | undefined;\n\n if (row.api_key_enc) {\n try {\n apiKey = decrypt(row.api_key_enc);\n } catch (error) {\n console.error(\"Failed to decrypt model provider API key:\", error);\n throw new Error(\"Failed to decrypt model provider API key\");\n }\n }\n\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n displayName: row.display_name || undefined,\n protocol: row.protocol as ModelProviderWireProtocol,\n apiStyle: row.api_style as ModelProviderApiStyle,\n llmProvider: row.llm_provider as ModelProviderLlmProvider,\n baseURL: row.base_url,\n apiKey,\n apiKeyHint: row.api_key_hint || undefined,\n enabled: row.enabled === 1,\n status: row.status as ModelProviderStatus,\n lastError: row.last_error || undefined,\n lastDiscoveredAt: row.last_discovered_at\n ? parseISO(row.last_discovered_at)\n : undefined,\n createdBy: row.created_by || undefined,\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n\nfunction mapRowToModel(row: ModelRow): ModelProviderModelEntry {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n providerId: row.provider_id,\n modelId: row.model_id,\n displayName: row.display_name || undefined,\n ownedBy: row.owned_by || undefined,\n upstreamCreatedAt: row.upstream_created\n ? parseISO(row.upstream_created)\n : undefined,\n enabled: row.enabled === 1,\n stale: row.stale === 1,\n discoveredAt: parseISO(row.discovered_at),\n };\n}\n","/**\n * Local SQLite implementation of WorkflowTrackingStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n WorkflowTrackingStore,\n WorkflowRun,\n RunStep,\n CreateWorkflowRunRequest,\n UpdateWorkflowRunRequest,\n CreateRunStepRequest,\n UpdateRunStepRequest,\n StepType,\n WorkflowRunStatus,\n QueryWorkflowRunsOptions,\n QueryWorkflowRunsResult,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_workflow_runs (\n id TEXT PRIMARY KEY,\n tenant_id TEXT NOT NULL,\n assistant_id TEXT NOT NULL,\n thread_id TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'running',\n topology_edges TEXT NOT NULL DEFAULT '[]',\n total_edges INTEGER NOT NULL DEFAULT 0,\n completed_edges INTEGER NOT NULL DEFAULT 0,\n error_message TEXT,\n metadata TEXT DEFAULT '{}',\n started_at TEXT NOT NULL,\n completed_at TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_lt_wr_thread ON lt_workflow_runs(tenant_id, thread_id);\nCREATE INDEX IF NOT EXISTS idx_lt_wr_assistant ON lt_workflow_runs(tenant_id, assistant_id);\nCREATE INDEX IF NOT EXISTS idx_lt_wr_tenant_status ON lt_workflow_runs(tenant_id, status, updated_at DESC);\n\nCREATE TABLE IF NOT EXISTS lt_workflow_steps (\n id TEXT NOT NULL,\n run_id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n step_type TEXT NOT NULL,\n step_name TEXT NOT NULL,\n thread_id TEXT,\n edge_from TEXT,\n edge_to TEXT,\n edge_purpose TEXT,\n input TEXT,\n output TEXT,\n status TEXT NOT NULL DEFAULT 'running',\n error_message TEXT,\n started_at TEXT NOT NULL,\n completed_at TEXT,\n duration_ms INTEGER,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (run_id, id)\n);\nCREATE INDEX IF NOT EXISTS idx_lt_ws_type ON lt_workflow_steps(run_id, step_type);\n-- Backfill for existing databases that don't have the column\nALTER TABLE lt_workflow_steps ADD COLUMN IF NOT EXISTS thread_id TEXT;\n`;\n\ninterface RunRow {\n id: string;\n tenant_id: string;\n assistant_id: string;\n thread_id: string;\n status: string;\n topology_edges: string;\n total_edges: number;\n completed_edges: number;\n error_message: string | null;\n metadata: string;\n started_at: string;\n completed_at: string | null;\n created_at: string;\n updated_at: string;\n}\n\ninterface StepRow {\n id: string;\n run_id: string;\n tenant_id: string;\n step_type: string;\n step_name: string;\n thread_id: string | null;\n edge_from: string | null;\n edge_to: string | null;\n edge_purpose: string | null;\n input: string | null;\n output: string | null;\n status: string;\n error_message: string | null;\n started_at: string;\n completed_at: string | null;\n duration_ms: number | null;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalWorkflowTrackingStore implements WorkflowTrackingStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async createWorkflowRun(request: CreateWorkflowRunRequest): Promise<WorkflowRun> {\n const now = nowISO();\n const id = `${request.threadId}_${Date.now()}`;\n\n this.db.prepare(\n `INSERT INTO lt_workflow_runs (id, tenant_id, assistant_id, thread_id, status, topology_edges, total_edges, completed_edges, metadata, started_at, created_at, updated_at)\n VALUES (?, ?, ?, ?, 'running', ?, ?, 0, ?, ?, ?, ?)`,\n ).run(id, request.tenantId, request.assistantId, request.threadId,\n JSON.stringify(request.topologyEdges), request.topologyEdges.length,\n JSON.stringify(request.metadata || {}), now, now, now);\n\n return {\n id, tenantId: request.tenantId, assistantId: request.assistantId,\n threadId: request.threadId, status: 'running',\n topologyEdges: request.topologyEdges, totalEdges: request.topologyEdges.length,\n completedEdges: 0, metadata: request.metadata,\n startedAt: parseISO(now), completedAt: undefined,\n createdAt: parseISO(now), updatedAt: parseISO(now),\n };\n }\n\n async getWorkflowRun(runId: string): Promise<WorkflowRun | null> {\n const row = this.db.prepare(`SELECT * FROM lt_workflow_runs WHERE id = ?`).get(runId) as unknown as RunRow | undefined;\n return row ? mapRowToRun(row) : null;\n }\n\n async updateWorkflowRun(runId: string, updates: UpdateWorkflowRunRequest): Promise<WorkflowRun | null> {\n const existing = await this.getWorkflowRun(runId);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.status !== undefined) { setClauses.push(\"status = ?\"); values.push(updates.status); }\n if (updates.completedEdges !== undefined) { setClauses.push(\"completed_edges = ?\"); values.push(updates.completedEdges); }\n if (updates.errorMessage !== undefined) { setClauses.push(\"error_message = ?\"); values.push(updates.errorMessage); }\n if (updates.completedAt !== undefined) { setClauses.push(\"completed_at = ?\"); values.push(updates.completedAt ? updates.completedAt.toISOString() : null); }\n if (updates.metadata !== undefined) { setClauses.push(\"metadata = ?\"); values.push(JSON.stringify(updates.metadata)); }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(runId);\n\n this.db.prepare(\n `UPDATE lt_workflow_runs SET ${setClauses.join(\", \")} WHERE id = ?`,\n ).run(...values);\n\n return this.getWorkflowRun(runId);\n }\n\n async deleteWorkflowRun(runId: string): Promise<void> {\n this.db.prepare(`DELETE FROM lt_workflow_runs WHERE id = ?`).run(runId);\n }\n\n async getWorkflowRunsByThreadId(tenantId: string, threadId: string): Promise<WorkflowRun[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_workflow_runs WHERE tenant_id = ? AND thread_id = ? ORDER BY created_at DESC`,\n ).all(tenantId, threadId) as unknown as RunRow[];\n return rows.map(mapRowToRun);\n }\n\n async getWorkflowRunsByAssistantId(tenantId: string, assistantId: string): Promise<WorkflowRun[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_workflow_runs WHERE tenant_id = ? AND assistant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId, assistantId) as unknown as RunRow[];\n return rows.map(mapRowToRun);\n }\n\n async getWorkflowRunsByTenantId(tenantId: string): Promise<WorkflowRun[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_workflow_runs WHERE tenant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId) as unknown as RunRow[];\n return rows.map(mapRowToRun);\n }\n\n async queryWorkflowRuns(tenantId: string, options: QueryWorkflowRunsOptions = {}): Promise<QueryWorkflowRunsResult> {\n const conditions: string[] = [\"tenant_id = ?\"];\n const whereParams: unknown[] = [tenantId];\n if (options.status) { conditions.push(\"status = ?\"); whereParams.push(options.status); }\n if (options.assistantId) { conditions.push(\"assistant_id = ?\"); whereParams.push(options.assistantId); }\n const where = conditions.join(\" AND \");\n\n const countRow = this.db.prepare(\n `SELECT COUNT(*) AS count FROM lt_workflow_runs WHERE ${where}`,\n ).get(...whereParams) as { count: number };\n\n const selectParams: unknown[] = [...whereParams];\n let sql = `SELECT * FROM lt_workflow_runs WHERE ${where} ORDER BY updated_at DESC, id DESC`;\n if (options.limit !== undefined) {\n sql += \" LIMIT ?\";\n selectParams.push(options.limit);\n } else if (options.offset !== undefined) {\n sql += \" LIMIT -1\"; // SQLite requires LIMIT before OFFSET\n }\n if (options.offset !== undefined) {\n sql += \" OFFSET ?\";\n selectParams.push(options.offset);\n }\n\n const rows = this.db.prepare(sql).all(...selectParams) as unknown as RunRow[];\n return { records: rows.map(mapRowToRun), total: countRow.count };\n }\n\n async createRunStep(request: CreateRunStepRequest): Promise<RunStep> {\n const now = nowISO();\n const id = `step_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n\n this.db.prepare(\n `INSERT INTO lt_workflow_steps (id, run_id, tenant_id, step_type, step_name, thread_id, edge_from, edge_to, edge_purpose, input, status, started_at, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?)`,\n ).run(id, request.runId, request.tenantId, request.stepType, request.stepName,\n request.threadId || null,\n request.edgeFrom || null, request.edgeTo || null, request.edgePurpose || null,\n request.input ? JSON.stringify(request.input) : null, now, now, now);\n\n return {\n id, runId: request.runId, tenantId: request.tenantId,\n stepType: request.stepType, stepName: request.stepName,\n threadId: request.threadId,\n edgeFrom: request.edgeFrom, edgeTo: request.edgeTo, edgePurpose: request.edgePurpose,\n input: request.input, status: 'running', startedAt: parseISO(now),\n createdAt: parseISO(now), updatedAt: parseISO(now),\n };\n }\n\n async upsertRunStep(request: CreateRunStepRequest): Promise<RunStep> {\n // Look up by (run_id, step_type, step_name) — the idempotency key\n const row = this.db.prepare(\n `SELECT * FROM lt_workflow_steps WHERE run_id = ? AND step_type = ? AND step_name = ?`,\n ).get(request.runId, request.stepType, request.stepName) as unknown as StepRow | undefined;\n if (row) {\n const existing = mapRowToStep(row);\n if (!existing.threadId && request.threadId) {\n this.db.prepare(\n `UPDATE lt_workflow_steps SET thread_id = ?, updated_at = ? WHERE run_id = ? AND id = ?`,\n ).run(request.threadId, nowISO(), request.runId, existing.id);\n existing.threadId = request.threadId;\n }\n return existing;\n }\n return this.createRunStep(request);\n }\n\n async updateRunStep(runId: string, stepId: string, updates: UpdateRunStepRequest): Promise<RunStep | null> {\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.status !== undefined) { setClauses.push(\"status = ?\"); values.push(updates.status); }\n if (updates.output !== undefined) { setClauses.push(\"output = ?\"); values.push(JSON.stringify(updates.output)); }\n if (updates.errorMessage !== undefined) { setClauses.push(\"error_message = ?\"); values.push(updates.errorMessage); }\n if (updates.completedAt !== undefined) { setClauses.push(\"completed_at = ?\"); values.push(updates.completedAt ? updates.completedAt.toISOString() : null); }\n if (updates.durationMs !== undefined) { setClauses.push(\"duration_ms = ?\"); values.push(updates.durationMs); }\n\n if (setClauses.length === 0) {\n return this.getStepById(runId, stepId);\n }\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(runId, stepId);\n\n this.db.prepare(\n `UPDATE lt_workflow_steps SET ${setClauses.join(\", \")} WHERE run_id = ? AND id = ?`,\n ).run(...values);\n\n return this.getStepById(runId, stepId);\n }\n\n async getRunSteps(runId: string): Promise<RunStep[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_workflow_steps WHERE run_id = ? ORDER BY created_at ASC`,\n ).all(runId) as unknown as StepRow[];\n return rows.map(mapRowToStep);\n }\n\n async getRunStepsByType(runId: string, stepType: StepType): Promise<RunStep[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_workflow_steps WHERE run_id = ? AND step_type = ? ORDER BY created_at ASC`,\n ).all(runId, stepType) as unknown as StepRow[];\n return rows.map(mapRowToStep);\n }\n\n async getInterruptedSteps(runId: string): Promise<RunStep[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_workflow_steps WHERE run_id = ? AND status = 'interrupted' ORDER BY created_at ASC`,\n ).all(runId) as unknown as StepRow[];\n return rows.map(mapRowToStep);\n }\n\n private getStepById(runId: string, id: string): RunStep | null {\n const row = this.db.prepare(\n `SELECT * FROM lt_workflow_steps WHERE run_id = ? AND id = ?`,\n ).get(runId, id) as unknown as StepRow | undefined;\n return row ? mapRowToStep(row) : null;\n }\n}\n\nfunction safeParse<T>(value: string | null | undefined, fallback: T): T {\n if (!value) return fallback;\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n}\n\nfunction mapRowToRun(row: RunRow): WorkflowRun {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n assistantId: row.assistant_id,\n threadId: row.thread_id,\n status: row.status as WorkflowRunStatus,\n topologyEdges: safeParse(row.topology_edges, []),\n totalEdges: row.total_edges,\n completedEdges: row.completed_edges,\n errorMessage: row.error_message || undefined,\n metadata: safeParse(row.metadata, {}),\n startedAt: parseISO(row.started_at),\n completedAt: row.completed_at ? parseISO(row.completed_at) : undefined,\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n\nfunction mapRowToStep(row: StepRow): RunStep {\n return {\n id: row.id,\n runId: row.run_id,\n tenantId: row.tenant_id,\n stepType: row.step_type as StepType,\n stepName: row.step_name,\n threadId: row.thread_id,\n edgeFrom: row.edge_from || undefined,\n edgeTo: row.edge_to || undefined,\n edgePurpose: row.edge_purpose || undefined,\n input: safeParse(row.input, undefined),\n output: safeParse(row.output, undefined),\n status: row.status as RunStep[\"status\"],\n errorMessage: row.error_message || undefined,\n startedAt: parseISO(row.started_at),\n completedAt: row.completed_at ? parseISO(row.completed_at) : undefined,\n durationMs: row.duration_ms ?? undefined,\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","/**\n * Local SQLite implementation of EvalStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport {\n EvalStore,\n EvalProject,\n CreateEvalProjectRequest,\n EvalSuite,\n CreateEvalSuiteRequest,\n EvalCase,\n CreateEvalCaseRequest,\n EvalRun,\n CreateEvalRunRequest,\n EvalRunResult,\n EvalProjectReport,\n InterruptPolicy,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\nimport { randomUUID } from \"crypto\";\n\nexport const DDL = `\nCREATE TABLE IF NOT EXISTS lt_eval_projects (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n name TEXT NOT NULL,\n description TEXT,\n version TEXT,\n judge_model_config TEXT NOT NULL DEFAULT '{}',\n target_server_config TEXT NOT NULL DEFAULT '{}',\n concurrency INTEGER NOT NULL DEFAULT 3,\n report_config TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\n\nCREATE TABLE IF NOT EXISTS lt_eval_suites (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n project_id TEXT NOT NULL,\n name TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\nCREATE INDEX IF NOT EXISTS idx_lt_es_project ON lt_eval_suites(tenant_id, project_id);\n\nCREATE TABLE IF NOT EXISTS lt_eval_cases (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n suite_id TEXT NOT NULL,\n input_message TEXT NOT NULL,\n input_files TEXT,\n steps TEXT NOT NULL DEFAULT '[]',\n output_type TEXT NOT NULL DEFAULT 'message_content',\n content_assertion TEXT NOT NULL DEFAULT '',\n rubrics TEXT,\n interrupt_policy TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\nCREATE INDEX IF NOT EXISTS idx_lt_ec_suite ON lt_eval_cases(tenant_id, suite_id);\n\nCREATE TABLE IF NOT EXISTS lt_eval_runs (\n id TEXT NOT NULL,\n project_id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'running',\n concurrency INTEGER NOT NULL DEFAULT 3,\n total_cases INTEGER NOT NULL DEFAULT 0,\n passed_cases INTEGER NOT NULL DEFAULT 0,\n failed_cases INTEGER NOT NULL DEFAULT 0,\n interrupted_cases INTEGER NOT NULL DEFAULT 0,\n avg_score REAL NOT NULL DEFAULT 0,\n error TEXT,\n holdout INTEGER NOT NULL DEFAULT 0,\n env_project_id TEXT,\n env_workspace_id TEXT,\n task_id TEXT,\n created_at TEXT NOT NULL,\n started_at TEXT,\n completed_at TEXT,\n PRIMARY KEY (tenant_id, id)\n);\nCREATE INDEX IF NOT EXISTS idx_lt_er_project ON lt_eval_runs(tenant_id, project_id);\n\nCREATE TABLE IF NOT EXISTS lt_eval_run_results (\n id TEXT NOT NULL,\n run_id TEXT NOT NULL,\n suite_name TEXT NOT NULL,\n case_id TEXT,\n pass INTEGER NOT NULL DEFAULT 0,\n score REAL NOT NULL DEFAULT 0,\n summary TEXT,\n dimension_results TEXT DEFAULT '[]',\n duration_ms INTEGER,\n messages TEXT DEFAULT '[]',\n logs TEXT DEFAULT '[]',\n error TEXT,\n interrupted INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL,\n PRIMARY KEY (run_id, id)\n);\n`;\n\nfunction parseJson<T>(val: unknown, fallback: T): T {\n if (val == null) return fallback;\n if (typeof val === \"string\") {\n try { return JSON.parse(val) as T; } catch { return fallback; }\n }\n return val as T;\n}\n\nfunction parseOptionalJson<T>(val: unknown): T | undefined {\n if (val == null) return undefined;\n if (typeof val === \"string\") {\n try { return JSON.parse(val) as T; } catch { return undefined; }\n }\n return val as T;\n}\n\nexport class LocalEvalStore implements EvalStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n // Existing installs: add HITL interrupt tracking columns.\n // sql.js bundles an older SQLite that does not support\n // `ADD COLUMN IF NOT EXISTS`, so check via PRAGMA instead.\n this.ensureColumn(\"lt_eval_runs\", \"interrupted_cases\", \"interrupted_cases INTEGER NOT NULL DEFAULT 0\");\n this.ensureColumn(\"lt_eval_run_results\", \"interrupted\", \"interrupted INTEGER NOT NULL DEFAULT 0\");\n this.ensureColumn(\"lt_eval_cases\", \"interrupt_policy\", \"interrupt_policy TEXT\");\n this.ensureColumn(\"lt_eval_runs\", \"task_id\", \"task_id TEXT\");\n // Project name must be unique per tenant (eval-{agent-id} convention).\n // Repoint child rows (suites, runs) of duplicate projects onto the kept\n // project (newest by created_at, tie-break rowid — mirrors the pg\n // migration's (created_at, id) DESC policy) BEFORE deleting, so eval\n // history is preserved. SQLite has no FK cascade here, so this is manual.\n this.db.exec(`\n UPDATE lt_eval_suites\n SET project_id = (\n SELECT p2.id FROM lt_eval_projects p2\n WHERE p2.tenant_id = (\n SELECT p.tenant_id FROM lt_eval_projects p WHERE p.id = lt_eval_suites.project_id\n )\n AND p2.name = (\n SELECT p.name FROM lt_eval_projects p WHERE p.id = lt_eval_suites.project_id\n )\n ORDER BY p2.created_at DESC, p2.rowid DESC\n LIMIT 1\n )\n WHERE project_id IN (\n SELECT p3.id FROM lt_eval_projects p3\n WHERE p3.id <> (\n SELECT p2.id FROM lt_eval_projects p2\n WHERE p2.tenant_id = p3.tenant_id AND p2.name = p3.name\n ORDER BY p2.created_at DESC, p2.rowid DESC\n LIMIT 1\n )\n )\n `);\n this.db.exec(`\n UPDATE lt_eval_runs\n SET project_id = (\n SELECT p2.id FROM lt_eval_projects p2\n WHERE p2.tenant_id = (\n SELECT p.tenant_id FROM lt_eval_projects p WHERE p.id = lt_eval_runs.project_id\n )\n AND p2.name = (\n SELECT p.name FROM lt_eval_projects p WHERE p.id = lt_eval_runs.project_id\n )\n ORDER BY p2.created_at DESC, p2.rowid DESC\n LIMIT 1\n )\n WHERE project_id IN (\n SELECT p3.id FROM lt_eval_projects p3\n WHERE p3.id <> (\n SELECT p2.id FROM lt_eval_projects p2\n WHERE p2.tenant_id = p3.tenant_id AND p2.name = p3.name\n ORDER BY p2.created_at DESC, p2.rowid DESC\n LIMIT 1\n )\n )\n `);\n this.db.exec(`\n DELETE FROM lt_eval_projects\n WHERE id <> (\n SELECT p2.id FROM lt_eval_projects p2\n WHERE p2.tenant_id = lt_eval_projects.tenant_id\n AND p2.name = lt_eval_projects.name\n ORDER BY p2.created_at DESC, p2.rowid DESC\n LIMIT 1\n )\n `);\n this.db.exec(`\n CREATE UNIQUE INDEX IF NOT EXISTS idx_lt_eval_projects_tenant_name\n ON lt_eval_projects(tenant_id, name)\n `);\n }\n\n /** Add a column if it does not exist (SQLite version compatible). */\n private ensureColumn(table: string, column: string, ddl: string): void {\n const cols = this.db.prepare(`PRAGMA table_info(${table})`).all() as Array<{ name: string }>;\n if (!cols.some((c) => c.name === column)) {\n this.db.exec(`ALTER TABLE ${table} ADD COLUMN ${ddl}`);\n }\n }\n\n // -------------------------------------------------------------------------\n // Projects\n // -------------------------------------------------------------------------\n\n async getProjectsByTenant(tenantId: string): Promise<EvalProject[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_eval_projects WHERE tenant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId) as unknown as Record<string, unknown>[];\n return rows.map(this.mapRowToProject);\n }\n\n async getProjectById(tenantId: string, id: string): Promise<EvalProject | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_eval_projects WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as Record<string, unknown> | undefined;\n return row ? this.mapRowToProject(row) : null;\n }\n\n async createProject(tenantId: string, id: string, data: CreateEvalProjectRequest): Promise<EvalProject> {\n const actualId = id || randomUUID();\n this.db.prepare(\n `INSERT INTO lt_eval_projects (id, tenant_id, name, description, version, judge_model_config, target_server_config, concurrency, report_config, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(actualId, tenantId, data.name, data.description || null, data.version || null,\n JSON.stringify(data.judgeModelConfig), JSON.stringify(data.targetServerConfig), data.concurrency ?? 3,\n data.reportConfig === undefined ? null : JSON.stringify(data.reportConfig),\n nowISO(), nowISO());\n return (await this.getProjectById(tenantId, actualId))!;\n }\n\n async updateProject(tenantId: string, id: string, updates: Partial<CreateEvalProjectRequest>): Promise<EvalProject | null> {\n const existing = await this.getProjectById(tenantId, id);\n if (!existing) return null;\n\n const set: string[] = [];\n const vals: unknown[] = [];\n if (updates.name !== undefined) { set.push(\"name = ?\"); vals.push(updates.name); }\n if (updates.description !== undefined) { set.push(\"description = ?\"); vals.push(updates.description || null); }\n if (updates.version !== undefined) { set.push(\"version = ?\"); vals.push(updates.version || null); }\n if (updates.judgeModelConfig !== undefined) { set.push(\"judge_model_config = ?\"); vals.push(JSON.stringify(updates.judgeModelConfig)); }\n if (updates.targetServerConfig !== undefined) { set.push(\"target_server_config = ?\"); vals.push(JSON.stringify(updates.targetServerConfig)); }\n if (updates.concurrency !== undefined) { set.push(\"concurrency = ?\"); vals.push(updates.concurrency); }\n if (updates.reportConfig !== undefined) { set.push(\"report_config = ?\"); vals.push(JSON.stringify(updates.reportConfig)); }\n set.push(\"updated_at = ?\"); vals.push(nowISO());\n vals.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_eval_projects SET ${set.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...vals);\n\n return this.getProjectById(tenantId, id);\n }\n\n async deleteProject(tenantId: string, id: string): Promise<boolean> {\n const db = this.db.getRawDb();\n db.run(\"BEGIN TRANSACTION\");\n try {\n db.run(\n `DELETE FROM lt_eval_run_results\n WHERE run_id IN (\n SELECT id FROM lt_eval_runs WHERE tenant_id = ? AND project_id = ?\n )`,\n [tenantId, id]\n );\n db.run(\n `DELETE FROM lt_eval_cases\n WHERE tenant_id = ? AND suite_id IN (\n SELECT id FROM lt_eval_suites WHERE tenant_id = ? AND project_id = ?\n )`,\n [tenantId, tenantId, id]\n );\n db.run(`DELETE FROM lt_eval_runs WHERE tenant_id = ? AND project_id = ?`, [tenantId, id]);\n db.run(`DELETE FROM lt_eval_suites WHERE tenant_id = ? AND project_id = ?`, [tenantId, id]);\n db.run(`DELETE FROM lt_eval_projects WHERE tenant_id = ? AND id = ?`, [tenantId, id]);\n const deleted = db.getRowsModified() > 0;\n db.run(\"COMMIT\");\n this.db.save();\n return deleted;\n } catch (error) {\n db.run(\"ROLLBACK\");\n throw error;\n }\n }\n\n // -------------------------------------------------------------------------\n // Suites\n // -------------------------------------------------------------------------\n\n async getSuitesByProject(tenantId: string, projectId: string): Promise<EvalSuite[]> {\n const rows = this.db.prepare(\n `SELECT s.*, (SELECT COUNT(*) FROM lt_eval_cases c WHERE c.suite_id = s.id AND c.tenant_id = s.tenant_id) as case_count\n FROM lt_eval_suites s WHERE s.tenant_id = ? AND s.project_id = ? ORDER BY s.created_at DESC`,\n ).all(tenantId, projectId) as unknown as Record<string, unknown>[];\n return rows.map(this.mapRowToSuite);\n }\n\n async getSuiteById(tenantId: string, id: string): Promise<EvalSuite | null> {\n const row = this.db.prepare(\n `SELECT s.*, (SELECT COUNT(*) FROM lt_eval_cases c WHERE c.suite_id = s.id AND c.tenant_id = s.tenant_id) as case_count\n FROM lt_eval_suites s WHERE s.tenant_id = ? AND s.id = ?`,\n ).get(tenantId, id) as unknown as Record<string, unknown> | undefined;\n return row ? this.mapRowToSuite(row) : null;\n }\n\n async createSuite(tenantId: string, projectId: string, id: string, data: CreateEvalSuiteRequest): Promise<EvalSuite> {\n const actualId = id || randomUUID();\n this.db.prepare(\n `INSERT INTO lt_eval_suites (id, tenant_id, project_id, name, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?)`,\n ).run(actualId, tenantId, projectId, data.name, nowISO(), nowISO());\n return (await this.getSuiteById(tenantId, actualId))!;\n }\n\n async updateSuite(tenantId: string, id: string, updates: Partial<CreateEvalSuiteRequest>): Promise<EvalSuite | null> {\n const existing = await this.getSuiteById(tenantId, id);\n if (!existing) return null;\n const set: string[] = [];\n const vals: unknown[] = [];\n if (updates.name !== undefined) { set.push(\"name = ?\"); vals.push(updates.name); }\n set.push(\"updated_at = ?\"); vals.push(nowISO());\n vals.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_eval_suites SET ${set.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...vals);\n return this.getSuiteById(tenantId, id);\n }\n\n async deleteSuite(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(`DELETE FROM lt_eval_suites WHERE tenant_id = ? AND id = ?`).run(tenantId, id);\n return result.changes > 0;\n }\n\n // -------------------------------------------------------------------------\n // Cases\n // -------------------------------------------------------------------------\n\n async getCasesBySuite(tenantId: string, suiteId: string): Promise<EvalCase[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_eval_cases WHERE tenant_id = ? AND suite_id = ? ORDER BY created_at DESC`,\n ).all(tenantId, suiteId) as unknown as Record<string, unknown>[];\n return rows.map(this.mapRowToCase);\n }\n\n async getCaseById(tenantId: string, id: string): Promise<EvalCase | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_eval_cases WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as Record<string, unknown> | undefined;\n return row ? this.mapRowToCase(row) : null;\n }\n\n async createCase(tenantId: string, suiteId: string, id: string, data: CreateEvalCaseRequest): Promise<EvalCase> {\n const actualId = id || randomUUID();\n this.db.prepare(\n `INSERT INTO lt_eval_cases (id, tenant_id, suite_id, input_message, input_files, steps, output_type, content_assertion, rubrics, interrupt_policy, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(actualId, tenantId, suiteId, data.inputMessage,\n data.inputFiles ? JSON.stringify(data.inputFiles) : null,\n JSON.stringify(data.steps), data.outputType || \"message_content\",\n data.contentAssertion || \"\",\n data.rubrics ? JSON.stringify(data.rubrics) : null,\n data.interruptPolicy ? JSON.stringify(data.interruptPolicy) : null,\n nowISO(), nowISO());\n return (await this.getCaseById(tenantId, actualId))!;\n }\n\n async updateCase(tenantId: string, id: string, updates: Partial<CreateEvalCaseRequest>): Promise<EvalCase | null> {\n const existing = await this.getCaseById(tenantId, id);\n if (!existing) return null;\n\n const set: string[] = [];\n const vals: unknown[] = [];\n if (updates.inputMessage !== undefined) { set.push(\"input_message = ?\"); vals.push(updates.inputMessage); }\n if (updates.inputFiles !== undefined) { set.push(\"input_files = ?\"); vals.push(JSON.stringify(updates.inputFiles)); }\n if (updates.steps !== undefined) { set.push(\"steps = ?\"); vals.push(JSON.stringify(updates.steps)); }\n if (updates.outputType !== undefined) { set.push(\"output_type = ?\"); vals.push(updates.outputType); }\n if (updates.contentAssertion !== undefined) { set.push(\"content_assertion = ?\"); vals.push(updates.contentAssertion); }\n if (updates.rubrics !== undefined) { set.push(\"rubrics = ?\"); vals.push(JSON.stringify(updates.rubrics)); }\n if (updates.interruptPolicy !== undefined) { set.push(\"interrupt_policy = ?\"); vals.push(updates.interruptPolicy ? JSON.stringify(updates.interruptPolicy) : null); }\n set.push(\"updated_at = ?\"); vals.push(nowISO());\n vals.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_eval_cases SET ${set.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...vals);\n return this.getCaseById(tenantId, id);\n }\n\n async deleteCase(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(`DELETE FROM lt_eval_cases WHERE tenant_id = ? AND id = ?`).run(tenantId, id);\n return result.changes > 0;\n }\n\n // -------------------------------------------------------------------------\n // Runs\n // -------------------------------------------------------------------------\n\n async getRunsByTenant(tenantId: string, opts?: { projectId?: string; status?: string }): Promise<EvalRun[]> {\n let query = `SELECT * FROM lt_eval_runs WHERE tenant_id = ?`;\n const vals: unknown[] = [tenantId];\n if (opts?.projectId) { query += ` AND project_id = ?`; vals.push(opts.projectId); }\n if (opts?.status) { query += ` AND status = ?`; vals.push(opts.status); }\n query += ` ORDER BY created_at DESC`;\n const rows = this.db.prepare(query).all(...vals) as unknown as Record<string, unknown>[];\n return rows.map(this.mapRowToRun);\n }\n\n async getRunById(tenantId: string, id: string): Promise<EvalRun | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_eval_runs WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as Record<string, unknown> | undefined;\n return row ? this.mapRowToRun(row) : null;\n }\n\n async createRun(tenantId: string, projectId: string, id: string, data: CreateEvalRunRequest): Promise<EvalRun> {\n const actualId = id || randomUUID();\n this.db.prepare(\n `INSERT INTO lt_eval_runs (id, project_id, tenant_id, status, concurrency, total_cases, passed_cases, failed_cases, avg_score, holdout, env_project_id, env_workspace_id, task_id, created_at)\n VALUES (?, ?, ?, 'running', ?, ?, 0, 0, 0, ?, ?, ?, ?, ?)`,\n ).run(actualId, projectId, tenantId, data.concurrency, data.totalCases, data.holdout ? 1 : 0, data.envProjectId || null, data.envWorkspaceId || null, data.taskId || null, nowISO());\n return (await this.getRunById(tenantId, actualId))!;\n }\n\n async updateRunStatus(tenantId: string, id: string, updates: {\n status?: EvalRun[\"status\"]; passedCases?: number; failedCases?: number; interruptedCases?: number; avgScore?: number; error?: string; completedAt?: Date;\n }): Promise<EvalRun | null> {\n const existing = await this.getRunById(tenantId, id);\n if (!existing) return null;\n\n const set: string[] = [];\n const vals: unknown[] = [];\n if (updates.status !== undefined) { set.push(\"status = ?\"); vals.push(updates.status); }\n if (updates.passedCases !== undefined) { set.push(\"passed_cases = ?\"); vals.push(updates.passedCases); }\n if (updates.failedCases !== undefined) { set.push(\"failed_cases = ?\"); vals.push(updates.failedCases); }\n if (updates.interruptedCases !== undefined) { set.push(\"interrupted_cases = ?\"); vals.push(updates.interruptedCases); }\n if (updates.avgScore !== undefined) { set.push(\"avg_score = ?\"); vals.push(updates.avgScore); }\n if (updates.error !== undefined) { set.push(\"error = ?\"); vals.push(updates.error || null); }\n if (updates.completedAt !== undefined) { set.push(\"completed_at = ?\"); vals.push(updates.completedAt ? updates.completedAt.toISOString() : null); }\n vals.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_eval_runs SET ${set.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...vals);\n return this.getRunById(tenantId, id);\n }\n\n async deleteRun(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(`DELETE FROM lt_eval_runs WHERE tenant_id = ? AND id = ?`).run(tenantId, id);\n return result.changes > 0;\n }\n\n // -------------------------------------------------------------------------\n // Run Results\n // -------------------------------------------------------------------------\n\n async getResultsByRun(tenantId: string, runId: string): Promise<EvalRunResult[]> {\n const rows = this.db.prepare(\n `SELECT rr.* FROM lt_eval_run_results rr\n INNER JOIN lt_eval_runs r ON r.id = rr.run_id\n WHERE r.tenant_id = ? AND rr.run_id = ? ORDER BY rr.created_at ASC`,\n ).all(tenantId, runId) as unknown as Record<string, unknown>[];\n return rows.map(this.mapRowToRunResult);\n }\n\n private async getRunResultById(tenantId: string, id: string): Promise<EvalRunResult | null> {\n const row = this.db.prepare(\n `SELECT rr.* FROM lt_eval_run_results rr\n INNER JOIN lt_eval_runs r ON r.id = rr.run_id\n WHERE r.tenant_id = ? AND rr.id = ?`,\n ).get(tenantId, id) as unknown as Record<string, unknown> | undefined;\n return row ? this.mapRowToRunResult(row) : null;\n }\n\n async createRunResult(tenantId: string, runId: string, id: string, data: Omit<EvalRunResult, \"id\" | \"runId\" | \"createdAt\">): Promise<EvalRunResult> {\n const actualId = id || randomUUID();\n this.db.prepare(\n `INSERT INTO lt_eval_run_results (id, run_id, suite_name, case_id, pass, score, summary, dimension_results, duration_ms, messages, logs, error, interrupted, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(actualId, runId, data.suiteName, data.caseId || null,\n data.pass ? 1 : 0, data.score, data.summary || null,\n JSON.stringify(data.dimensionResults || []), data.durationMs ?? null,\n JSON.stringify(data.messages || []), JSON.stringify(data.logs || []),\n data.error || null, data.interrupted ? 1 : 0, nowISO());\n return (await this.getRunResultById(tenantId, actualId))!;\n }\n\n async updateRunResult(tenantId: string, id: string, updates: Partial<EvalRunResult>): Promise<EvalRunResult | null> {\n if (updates.runId !== undefined) throw new Error(\"runId cannot be updated on an existing result\");\n\n const set: string[] = [];\n const vals: unknown[] = [];\n if (updates.suiteName !== undefined) { set.push(\"suite_name = ?\"); vals.push(updates.suiteName); }\n if (updates.caseId !== undefined) { set.push(\"case_id = ?\"); vals.push(updates.caseId); }\n if (updates.pass !== undefined) { set.push(\"pass = ?\"); vals.push(updates.pass ? 1 : 0); }\n if (updates.score !== undefined) { set.push(\"score = ?\"); vals.push(updates.score); }\n if (updates.summary !== undefined) { set.push(\"summary = ?\"); vals.push(updates.summary || null); }\n if (updates.dimensionResults !== undefined) { set.push(\"dimension_results = ?\"); vals.push(JSON.stringify(updates.dimensionResults)); }\n if (updates.durationMs !== undefined) { set.push(\"duration_ms = ?\"); vals.push(updates.durationMs ?? null); }\n if (updates.messages !== undefined) { set.push(\"messages = ?\"); vals.push(JSON.stringify(updates.messages)); }\n if (updates.logs !== undefined) { set.push(\"logs = ?\"); vals.push(JSON.stringify(updates.logs)); }\n if (updates.error !== undefined) { set.push(\"error = ?\"); vals.push(updates.error || null); }\n if (updates.interrupted !== undefined) { set.push(\"interrupted = ?\"); vals.push(updates.interrupted ? 1 : 0); }\n if (set.length === 0) return this.getRunResultById(tenantId, id);\n\n vals.push(id, tenantId);\n this.db.prepare(\n `UPDATE lt_eval_run_results SET ${set.join(\", \")}\n WHERE id = ? AND run_id IN (SELECT id FROM lt_eval_runs WHERE tenant_id = ?)`,\n ).run(...vals);\n\n return this.getRunResultById(tenantId, id);\n }\n\n async deleteRunResult(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_eval_run_results\n WHERE id = ? AND run_id IN (SELECT id FROM lt_eval_runs WHERE tenant_id = ?)`,\n ).run(id, tenantId);\n return result.changes > 0;\n }\n\n // -------------------------------------------------------------------------\n // Reports\n // -------------------------------------------------------------------------\n\n async getProjectReport(tenantId: string, projectId: string): Promise<EvalProjectReport | null> {\n const project = await this.getProjectById(tenantId, projectId);\n if (!project) return null;\n\n const runs = await this.getRunsByTenant(tenantId, { projectId });\n const totalRuns = runs.length;\n const latestPassRate = runs.length > 0\n ? (runs[0].totalCases > 0 ? runs[0].passedCases / runs[0].totalCases : 0)\n : 0;\n const avgScore = runs.length > 0\n ? runs.reduce((sum, r) => sum + r.avgScore, 0) / runs.length\n : 0;\n\n return { projectId: project.id, projectName: project.name, totalRuns, latestPassRate, avgScore, runs };\n }\n\n // -------------------------------------------------------------------------\n // Row mappers\n // -------------------------------------------------------------------------\n\n private mapRowToProject(row: Record<string, unknown>): EvalProject {\n return {\n id: row.id as string,\n tenantId: row.tenant_id as string,\n name: row.name as string,\n description: row.description as string | undefined,\n version: row.version as string | undefined,\n judgeModelConfig: parseJson<Record<string, unknown>>(row.judge_model_config, {}),\n targetServerConfig: parseJson<Record<string, unknown>>(row.target_server_config, {}),\n concurrency: (row.concurrency as number) ?? 3,\n reportConfig: parseOptionalJson<Record<string, unknown>>(row.report_config),\n createdAt: parseISO(row.created_at as string),\n updatedAt: parseISO(row.updated_at as string),\n };\n }\n\n private mapRowToSuite(row: Record<string, unknown>): EvalSuite {\n return {\n id: row.id as string,\n tenantId: row.tenant_id as string,\n projectId: row.project_id as string,\n name: row.name as string,\n createdAt: parseISO(row.created_at as string),\n updatedAt: parseISO(row.updated_at as string),\n caseCount: row.case_count !== undefined ? (row.case_count as number) : undefined,\n };\n }\n\n private mapRowToCase(row: Record<string, unknown>): EvalCase {\n return {\n id: row.id as string,\n tenantId: row.tenant_id as string,\n suiteId: row.suite_id as string,\n inputMessage: row.input_message as string,\n inputFiles: parseOptionalJson<Record<string, string>>(row.input_files),\n steps: parseJson<Array<{ agent_id: string; override_message?: string }>>(row.steps, []),\n outputType: (row.output_type as EvalCase[\"outputType\"]) || \"message_content\",\n contentAssertion: (row.content_assertion as string) || \"\",\n rubrics: parseOptionalJson<Array<{ name: string; weight: number; description: string }>>(row.rubrics),\n interruptPolicy: parseOptionalJson<InterruptPolicy>(row.interrupt_policy),\n createdAt: parseISO(row.created_at as string),\n updatedAt: parseISO(row.updated_at as string),\n };\n }\n\n private mapRowToRun(row: Record<string, unknown>): EvalRun {\n return {\n id: row.id as string,\n projectId: row.project_id as string,\n tenantId: row.tenant_id as string,\n status: row.status as EvalRun[\"status\"],\n concurrency: (row.concurrency as number) ?? 3,\n totalCases: (row.total_cases as number) ?? 0,\n passedCases: (row.passed_cases as number) ?? 0,\n failedCases: (row.failed_cases as number) ?? 0,\n interruptedCases: (row.interrupted_cases as number) ?? 0,\n avgScore: (row.avg_score as number) ?? 0,\n error: row.error as string | undefined,\n holdout: row.holdout ? Boolean(row.holdout) : undefined,\n envProjectId: row.env_project_id as string | undefined,\n envWorkspaceId: row.env_workspace_id as string | undefined,\n taskId: row.task_id as string | undefined,\n createdAt: parseISO(row.created_at as string),\n startedAt: row.started_at ? parseISO(row.started_at as string) : undefined,\n completedAt: row.completed_at ? parseISO(row.completed_at as string) : undefined,\n };\n }\n\n private mapRowToRunResult(row: Record<string, unknown>): EvalRunResult {\n return {\n id: row.id as string,\n runId: row.run_id as string,\n suiteName: row.suite_name as string,\n caseId: row.case_id as string | undefined,\n pass: (row.pass as number) === 1,\n score: (row.score as number) ?? 0,\n summary: row.summary as string | undefined,\n dimensionResults: parseOptionalJson<Array<{ name: string; score: number; reason: string }>>(row.dimension_results),\n durationMs: row.duration_ms as number | undefined,\n messages: parseOptionalJson<Array<{ role: string; content: string; id?: string }>>(row.messages),\n logs: parseOptionalJson<Array<{ timestamp: string; level: string; message: string; data?: unknown }>>(row.logs),\n error: row.error as string | undefined,\n interrupted: (row.interrupted as number) === 1,\n createdAt: parseISO(row.created_at as string),\n };\n }\n}\n","/**\n * Local SQLite implementation of ChannelBindingStore (BindingRegistry).\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport {\n DuplicateChannelBindingSubjectError,\n type Binding, type BindingListParams, type BindingMutablePatch,\n type BindingRegistry, type CreateBindingInput,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\nimport { randomUUID } from \"crypto\";\nimport { ensureChannelBindingSubjectIndex } from \"./room-channel-binding-index\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_channel_bindings (\n id TEXT PRIMARY KEY,\n channel TEXT NOT NULL,\n channel_installation_id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n sender_id TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n thread_id TEXT,\n workspace_id TEXT,\n project_id TEXT,\n thread_mode TEXT NOT NULL DEFAULT 'fixed',\n sender_display_name TEXT,\n sender_metadata TEXT,\n enabled INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\n`;\n\ninterface BindingRow {\n id: string;\n channel: string;\n channel_installation_id: string;\n tenant_id: string;\n sender_id: string;\n agent_id: string;\n thread_id: string | null;\n workspace_id: string | null;\n project_id: string | null;\n thread_mode: string;\n sender_display_name: string | null;\n sender_metadata: string | null;\n enabled: number;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalChannelBindingStore implements BindingRegistry {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n ensureChannelBindingSubjectIndex(db);\n }\n\n async findById(tenantId: string, id: string): Promise<Binding | null> {\n const row = this.db.prepare(\n \"SELECT * FROM lt_channel_bindings WHERE id = ? AND tenant_id = ?\",\n ).get(id, tenantId) as unknown as BindingRow | undefined;\n return row ? mapRowToBinding(row) : null;\n }\n\n async findBySubject(params: {\n tenantId: string; channel: string; channelInstallationId: string; senderId: string;\n }): Promise<Binding | null> {\n const row = this.db.prepare(`SELECT * FROM lt_channel_bindings\n WHERE tenant_id = ? AND channel = ? AND channel_installation_id = ? AND sender_id = ? LIMIT 1`)\n .get(params.tenantId, params.channel, params.channelInstallationId, params.senderId) as unknown as BindingRow | undefined;\n return row ? mapRowToBinding(row) : null;\n }\n\n async resolve(params: {\n channel: string;\n senderId: string;\n channelInstallationId: string;\n tenantId: string;\n }): Promise<Binding | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_channel_bindings\n WHERE channel = ? AND sender_id = ? AND channel_installation_id = ? AND tenant_id = ? AND enabled = 1\n LIMIT 1`,\n ).get(params.channel, params.senderId, params.channelInstallationId, params.tenantId) as unknown as BindingRow | undefined;\n return row ? mapRowToBinding(row) : null;\n }\n\n async create(input: CreateBindingInput): Promise<Binding> {\n const id = randomUUID();\n const now = nowISO();\n\n try {\n this.db.prepare(`INSERT INTO lt_channel_bindings\n (id, channel, channel_installation_id, tenant_id, sender_id, agent_id,\n thread_id, thread_mode, sender_display_name, sender_metadata, workspace_id, project_id, enabled, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n id, input.channel, input.channelInstallationId, input.tenantId,\n input.senderId, input.agentId, input.threadId || null, input.threadMode || \"fixed\",\n input.senderDisplayName || null,\n input.senderMetadata ? JSON.stringify(input.senderMetadata) : null,\n input.workspaceId || null, input.projectId || null, (input.enabled ?? true) ? 1 : 0,\n now, now,\n );\n } catch (error) {\n if (error instanceof Error && /UNIQUE constraint failed/.test(error.message)) {\n throw new DuplicateChannelBindingSubjectError();\n }\n throw error;\n }\n\n return (await this.getById(id))!;\n }\n\n async update(tenantId: string, id: string, patch: BindingMutablePatch): Promise<Binding> {\n const existing = await this.findById(tenantId, id);\n if (!existing) throw new Error(`Binding ${id} not found`);\n\n const updated = {\n agentId: patch.agentId ?? existing.agentId,\n threadId: patch.threadId !== undefined ? patch.threadId : existing.threadId,\n workspaceId: patch.workspaceId !== undefined ? patch.workspaceId : existing.workspaceId,\n projectId: patch.projectId !== undefined ? patch.projectId : existing.projectId,\n threadMode: patch.threadMode ?? existing.threadMode,\n senderDisplayName: patch.senderDisplayName !== undefined ? patch.senderDisplayName : existing.senderDisplayName,\n senderMetadata: patch.senderMetadata !== undefined ? patch.senderMetadata : existing.senderMetadata,\n enabled: patch.enabled ?? existing.enabled,\n };\n\n const now = nowISO();\n\n this.db.prepare(\n `UPDATE lt_channel_bindings SET\n agent_id = ?, thread_id = ?, workspace_id = ?, project_id = ?, thread_mode = ?,\n sender_display_name = ?, sender_metadata = ?, enabled = ?, updated_at = ?\n WHERE id = ? AND tenant_id = ?`,\n ).run(\n updated.agentId, updated.threadId || null, updated.workspaceId || null,\n updated.projectId || null, updated.threadMode, updated.senderDisplayName || null,\n updated.senderMetadata ? JSON.stringify(updated.senderMetadata) : null,\n updated.enabled ? 1 : 0, now, id, tenantId,\n );\n\n return (await this.findById(tenantId, id))!;\n }\n\n async delete(tenantId: string, id: string): Promise<void> {\n this.db.prepare(`DELETE FROM lt_channel_bindings WHERE id = ? AND tenant_id = ?`).run(id, tenantId);\n }\n\n async list(params: BindingListParams): Promise<Binding[]> {\n const conditions: string[] = [\"tenant_id = ?\"];\n const values: unknown[] = [params.tenantId];\n\n if (params.channel) { conditions.push(\"channel = ?\"); values.push(params.channel); }\n if (params.agentId) { conditions.push(\"agent_id = ?\"); values.push(params.agentId); }\n if (params.channelInstallationId) { conditions.push(\"channel_installation_id = ?\"); values.push(params.channelInstallationId); }\n if (params.excludeChannels?.length) {\n conditions.push(`channel NOT IN (${params.excludeChannels.map(() => \"?\").join(\", \")})`);\n values.push(...params.excludeChannels);\n }\n for (const prefix of params.excludeInstallationIdPrefixes ?? []) {\n conditions.push(\"substr(channel_installation_id, 1, length(?)) <> ?\");\n values.push(prefix, prefix);\n }\n\n const limit = params.limit ?? 50;\n const offset = params.offset ?? 0;\n values.push(limit, offset);\n\n const rows = this.db.prepare(\n `SELECT * FROM lt_channel_bindings\n WHERE ${conditions.join(\" AND \")}\n ORDER BY created_at DESC\n LIMIT ? OFFSET ?`,\n ).all(...values) as unknown as BindingRow[];\n\n return rows.map(mapRowToBinding);\n }\n\n async import(tenantId: string, bindings: CreateBindingInput[]): Promise<Binding[]> {\n if (bindings.some((binding) => binding.channel === \"room\")) {\n throw new Error(\"Room bindings cannot be imported through the public store API\");\n }\n if (bindings.some((binding) => binding.channelInstallationId.startsWith(\"room-internal:\"))) {\n throw new Error(\"Internal bindings cannot be imported through the public store API\");\n }\n if (bindings.some((binding) => binding.tenantId !== tenantId)) {\n throw new Error(\"Binding import tenant mismatch\");\n }\n const result: Binding[] = [];\n for (const input of bindings) {\n result.push(await this.create(input));\n }\n return result;\n }\n\n async export(params: { tenantId: string }): Promise<Binding[]> {\n return this.list({\n tenantId: params.tenantId,\n excludeChannels: [\"room\"],\n excludeInstallationIdPrefixes: [\"room-internal:\"],\n limit: 10000,\n offset: 0,\n });\n }\n\n private async getById(id: string): Promise<Binding | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_channel_bindings WHERE id = ?`,\n ).get(id) as unknown as BindingRow | undefined;\n return row ? mapRowToBinding(row) : null;\n }\n}\n\nfunction mapRowToBinding(row: BindingRow): Binding {\n return {\n id: row.id,\n channel: row.channel,\n channelInstallationId: row.channel_installation_id,\n tenantId: row.tenant_id,\n senderId: row.sender_id,\n agentId: row.agent_id,\n threadId: row.thread_id || undefined,\n workspaceId: row.workspace_id || undefined,\n projectId: row.project_id || undefined,\n threadMode: row.thread_mode as Binding[\"threadMode\"],\n senderDisplayName: row.sender_display_name || undefined,\n senderMetadata: row.sender_metadata ? JSON.parse(row.sender_metadata) : undefined,\n enabled: row.enabled === 1,\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","import {\n ChannelBindingMigrationConflictError,\n type ChannelBindingMigrationConflict,\n} from \"@axiom-lattice/protocols\";\nimport type { DatabaseWrapper } from \"../database\";\n\nconst UNIQUE_INDEX_SQL = `CREATE UNIQUE INDEX IF NOT EXISTS idx_lt_cb_subject_unique\n ON lt_channel_bindings(channel, channel_installation_id, tenant_id, sender_id)`;\nconst LOOKUP_INDEX_SQL = `CREATE INDEX IF NOT EXISTS idx_lt_cb_resolve\n ON lt_channel_bindings(channel, sender_id, channel_installation_id, tenant_id)`;\n\n/**\n * Installs global binding-subject uniqueness without silently reconciling legacy rows.\n *\n * @param db - Synchronous sql.js database wrapper.\n * @throws {ChannelBindingMigrationConflictError} When existing subjects require operator repair.\n */\nexport function ensureChannelBindingSubjectIndex(db: DatabaseWrapper): void {\n db.exec(\"BEGIN\");\n try {\n const conflicts = db.prepare(`SELECT tenant_id, channel, channel_installation_id, sender_id, COUNT(*) AS count\n FROM lt_channel_bindings\n GROUP BY channel, channel_installation_id, tenant_id, sender_id\n HAVING COUNT(*) > 1\n ORDER BY tenant_id, channel, channel_installation_id, sender_id`).all() as ChannelBindingConflictRow[];\n if (conflicts.length > 0) {\n throw new ChannelBindingMigrationConflictError(conflicts.map(mapConflict));\n }\n db.exec(\"DROP INDEX IF EXISTS idx_lt_cb_room_subject\");\n db.exec(UNIQUE_INDEX_SQL);\n db.exec(LOOKUP_INDEX_SQL);\n db.exec(\"COMMIT\");\n } catch (error) {\n try {\n db.exec(\"ROLLBACK\");\n } catch {\n // Preserve the migration failure that triggered rollback.\n }\n throw error;\n }\n db.save();\n}\n\ninterface ChannelBindingConflictRow {\n tenant_id: string;\n channel: string;\n channel_installation_id: string;\n sender_id: string;\n count: number;\n}\n\nfunction mapConflict(row: ChannelBindingConflictRow): ChannelBindingMigrationConflict {\n return {\n tenantId: row.tenant_id,\n channel: row.channel,\n channelInstallationId: row.channel_installation_id,\n senderId: row.sender_id,\n count: row.count,\n };\n}\n","/**\n * Local SQLite implementation of ChannelInstallationStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n ChannelInstallationStore,\n ChannelInstallation,\n ChannelInstallationType,\n CreateChannelInstallationInput,\n UpdateChannelInstallationRequest,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_channel_installations (\n id TEXT PRIMARY KEY,\n tenant_id TEXT NOT NULL,\n channel TEXT NOT NULL,\n name TEXT,\n config TEXT NOT NULL,\n enabled INTEGER NOT NULL DEFAULT 1,\n fallback_agent_id TEXT,\n reject_when_no_binding INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_lt_ci_tenant ON lt_channel_installations(tenant_id);\n`;\n\ninterface Row {\n id: string;\n tenant_id: string;\n channel: string;\n name: string | null;\n config: string;\n enabled: number;\n fallback_agent_id: string | null;\n reject_when_no_binding: number;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalChannelInstallationStore implements ChannelInstallationStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async getInstallationById(installationId: string): Promise<ChannelInstallation | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_channel_installations WHERE id = ?`,\n ).get(installationId) as Row | undefined;\n return row ? mapRow(row) : null;\n }\n\n async getInstallationsByTenant(\n tenantId: string,\n channel?: ChannelInstallationType,\n ): Promise<ChannelInstallation[]> {\n let rows: Row[];\n if (channel) {\n rows = this.db.prepare(\n `SELECT * FROM lt_channel_installations WHERE tenant_id = ? AND channel = ? ORDER BY created_at DESC`,\n ).all(tenantId, channel) as Row[];\n } else {\n rows = this.db.prepare(\n `SELECT * FROM lt_channel_installations WHERE tenant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId) as Row[];\n }\n return rows.map(mapRow);\n }\n\n async getAllInstallations(\n channel?: ChannelInstallationType,\n ): Promise<ChannelInstallation[]> {\n let rows: Row[];\n if (channel) {\n rows = this.db.prepare(\n `SELECT * FROM lt_channel_installations WHERE channel = ? ORDER BY created_at DESC`,\n ).all(channel) as Row[];\n } else {\n rows = this.db.prepare(\n `SELECT * FROM lt_channel_installations ORDER BY created_at DESC`,\n ).all() as Row[];\n }\n return rows.map(mapRow);\n }\n\n async createInstallation(\n tenantId: string,\n installationId: string,\n data: CreateChannelInstallationInput,\n ): Promise<ChannelInstallation> {\n const now = nowISO();\n\n this.db.prepare(\n `INSERT INTO lt_channel_installations\n (id, tenant_id, channel, name, config, enabled, fallback_agent_id, reject_when_no_binding, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n installationId, tenantId, data.channel,\n data.name || null, JSON.stringify(data.config),\n data.enabled !== false ? 1 : 0,\n data.fallbackAgentId || null,\n data.rejectWhenNoBinding ? 1 : 0,\n now, now,\n );\n\n return {\n id: installationId,\n tenantId,\n channel: data.channel,\n name: data.name,\n config: { ...data.config },\n enabled: data.enabled !== false,\n fallbackAgentId: data.fallbackAgentId,\n rejectWhenNoBinding: data.rejectWhenNoBinding ?? false,\n createdAt: parseISO(now),\n updatedAt: parseISO(now),\n };\n }\n\n async updateInstallation(\n tenantId: string,\n installationId: string,\n updates: UpdateChannelInstallationRequest,\n ): Promise<ChannelInstallation | null> {\n const existing = await this.getInstallationById(installationId);\n if (!existing || existing.tenantId !== tenantId) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.name !== undefined) { setClauses.push(\"name = ?\"); values.push(updates.name || null); }\n if (updates.config !== undefined) { setClauses.push(\"config = ?\"); values.push(JSON.stringify(updates.config)); }\n if (updates.enabled !== undefined) { setClauses.push(\"enabled = ?\"); values.push(updates.enabled ? 1 : 0); }\n if (updates.fallbackAgentId !== undefined) { setClauses.push(\"fallback_agent_id = ?\"); values.push(updates.fallbackAgentId || null); }\n if (updates.rejectWhenNoBinding !== undefined) { setClauses.push(\"reject_when_no_binding = ?\"); values.push(updates.rejectWhenNoBinding ? 1 : 0); }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(tenantId);\n values.push(installationId);\n\n this.db.prepare(\n `UPDATE lt_channel_installations SET ${setClauses.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...values);\n\n return this.getInstallationById(installationId);\n }\n\n async deleteInstallation(tenantId: string, installationId: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_channel_installations WHERE id = ? AND tenant_id = ?`,\n ).run(installationId, tenantId);\n return result.changes > 0;\n }\n}\n\nfunction mapRow(row: Row): ChannelInstallation {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n channel: row.channel as ChannelInstallationType,\n name: row.name || undefined,\n config: JSON.parse(row.config),\n enabled: row.enabled === 1,\n fallbackAgentId: row.fallback_agent_id || undefined,\n rejectWhenNoBinding: row.reject_when_no_binding === 1,\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","/**\n * Local SQLite implementation of A2AApiKeyStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n UpdateA2AApiKeyInput,\n A2AApiKeyStore,\n A2AApiKeyRecord,\n CreateA2AApiKeyInput,\n A2AApiKeyEntry,\n OpenGrant,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\nimport { encrypt, decrypt } from \"@axiom-lattice/core\";\nimport { randomUUID } from \"crypto\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_a2a_api_keys (\n id TEXT PRIMARY KEY,\n key_value TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n project_id TEXT,\n assistant_ids TEXT,\n grants TEXT,\n label TEXT,\n enabled INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\n`;\n\ninterface KeyRow {\n id: string;\n key_value: string;\n tenant_id: string;\n project_id: string;\n assistant_ids: string | null;\n grants: string | null;\n label: string | null;\n enabled: number;\n created_at: string;\n updated_at: string;\n}\n\nfunction generateApiKey(): string {\n return `a2a_${randomUUID().replace(/-/g, \"\")}`;\n}\n\nfunction parseGrants(raw: string | null): OpenGrant[] | undefined {\n if (!raw) return undefined;\n try {\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as OpenGrant[]) : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction parseAssistantIds(raw: string | null): string[] | undefined {\n if (!raw) return undefined;\n try {\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** SQLite-backed A2A API key persistence for local deployments. */\nexport class LocalA2AApiKeyStore implements A2AApiKeyStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n // Existing installs: add columns shipped after the original schema.\n this.ensureColumn(\"lt_a2a_api_keys\", \"assistant_ids\", \"assistant_ids TEXT\");\n this.ensureColumn(\"lt_a2a_api_keys\", \"grants\", \"grants TEXT\");\n this.repairManagementIds();\n }\n\n /** Add a column if it does not exist (SQLite version compatible). */\n private ensureColumn(table: string, column: string, ddl: string): void {\n const cols = this.db.prepare(`PRAGMA table_info(${table})`).all() as Array<{ name: string }>;\n if (!cols.some((c) => c.name === column)) {\n this.db.exec(`ALTER TABLE ${table} ADD COLUMN ${ddl}`);\n }\n }\n\n private repairManagementIds(): void {\n const rows = this.db.prepare(\n `SELECT rowid, id FROM lt_a2a_api_keys`,\n ).all() as Array<{ rowid: number; id: string | null }>;\n const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n for (const row of rows) {\n if (!row.id || !uuidPattern.test(row.id)) {\n this.db.prepare(\n `UPDATE lt_a2a_api_keys SET id = ? WHERE rowid = ?`,\n ).run(randomUUID(), row.rowid);\n }\n }\n }\n\n async findByKey(key: string): Promise<A2AApiKeyRecord | null> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_a2a_api_keys WHERE enabled = 1`,\n ).all() as unknown as KeyRow[];\n for (const row of rows) {\n try {\n if (decrypt(row.key_value) === key) return mapRowToRecord(row);\n } catch { /* skip unreadable */ }\n }\n return null;\n }\n\n async findById(id: string): Promise<A2AApiKeyRecord | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_a2a_api_keys WHERE id = ?`,\n ).get(id) as unknown as KeyRow | undefined;\n return row ? mapRowToRecord(row) : null;\n }\n\n async list(params: { tenantId?: string; limit?: number; offset?: number }): Promise<A2AApiKeyRecord[]> {\n const limit = params.limit || 100;\n const offset = params.offset || 0;\n let rows: KeyRow[];\n if (params.tenantId) {\n rows = this.db.prepare(\n `SELECT * FROM lt_a2a_api_keys WHERE tenant_id = ? ORDER BY created_at DESC LIMIT ? OFFSET ?`,\n ).all(params.tenantId, limit, offset) as unknown as KeyRow[];\n } else {\n rows = this.db.prepare(\n `SELECT * FROM lt_a2a_api_keys ORDER BY created_at DESC LIMIT ? OFFSET ?`,\n ).all(limit, offset) as unknown as KeyRow[];\n }\n return rows.map(mapRowToRecord);\n }\n\n async create(input: CreateA2AApiKeyInput): Promise<A2AApiKeyRecord> {\n const id = randomUUID();\n const key = generateApiKey();\n const now = nowISO();\n this.db.prepare(\n `INSERT INTO lt_a2a_api_keys (id, key_value, tenant_id, project_id, assistant_ids, grants, label, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(id, encrypt(key), input.tenantId, input.projectId, input.assistantIds ? JSON.stringify(input.assistantIds) : null, input.grants ? JSON.stringify(input.grants) : null, input.label || null, now, now);\n\n const record: A2AApiKeyRecord = {\n id,\n key,\n tenantId: input.tenantId,\n projectId: input.projectId,\n assistantIds: input.assistantIds,\n label: input.label,\n enabled: true,\n createdAt: parseISO(now),\n updatedAt: parseISO(now),\n };\n return record;\n }\n\n async disable(id: string): Promise<A2AApiKeyRecord> {\n const now = nowISO();\n this.db.prepare(\n `UPDATE lt_a2a_api_keys SET enabled = 0, updated_at = ? WHERE id = ?`,\n ).run(now, id);\n const row = this.db.prepare(`SELECT * FROM lt_a2a_api_keys WHERE id = ?`).get(id) as unknown as KeyRow;\n if (!row) throw new Error(`A2A API key not found: ${id}`);\n return mapRowToRecord(row);\n }\n\n async enable(id: string): Promise<A2AApiKeyRecord> {\n const now = nowISO();\n this.db.prepare(\n `UPDATE lt_a2a_api_keys SET enabled = 1, updated_at = ? WHERE id = ?`,\n ).run(now, id);\n const row = this.db.prepare(`SELECT * FROM lt_a2a_api_keys WHERE id = ?`).get(id) as unknown as KeyRow;\n if (!row) throw new Error(`A2A API key not found: ${id}`);\n return mapRowToRecord(row);\n }\n\n\n async update(id: string, input: UpdateA2AApiKeyInput): Promise<A2AApiKeyRecord> {\n const sets: string[] = [];\n const values: unknown[] = [];\n if (input.label !== undefined) { sets.push(\"label = ?\"); values.push(input.label || null); }\n if (input.projectId !== undefined) { sets.push(\"project_id = ?\"); values.push(input.projectId); }\n if (input.assistantIds !== undefined) { sets.push(\"assistant_ids = ?\"); values.push(input.assistantIds ? JSON.stringify(input.assistantIds) : null); }\n if (input.grants !== undefined) { sets.push(\"grants = ?\"); values.push(input.grants ? JSON.stringify(input.grants) : null); }\n if (sets.length === 0) {\n const row = this.db.prepare(\"SELECT * FROM lt_a2a_api_keys WHERE id = ?\").get(id) as unknown as KeyRow | undefined;\n if (!row) throw new Error(`A2A API key not found: ${id}`);\n return mapRowToRecord(row);\n }\n sets.push(\"updated_at = ?\");\n values.push(nowISO());\n values.push(id);\n this.db.prepare(`UPDATE lt_a2a_api_keys SET ${sets.join(\", \")} WHERE id = ?`).run(...values);\n const row = this.db.prepare(\"SELECT * FROM lt_a2a_api_keys WHERE id = ?\").get(id) as unknown as KeyRow | undefined;\n if (!row) throw new Error(`A2A API key not found: ${id}`);\n return mapRowToRecord(row);\n }\n\n async rotate(id: string): Promise<A2AApiKeyRecord> {\n const key = generateApiKey();\n const now = nowISO();\n this.db.prepare(\n `UPDATE lt_a2a_api_keys SET key_value = ?, updated_at = ? WHERE id = ?`,\n ).run(encrypt(key), now, id);\n const row = this.db.prepare(`SELECT * FROM lt_a2a_api_keys WHERE id = ?`).get(id) as unknown as KeyRow;\n if (!row) throw new Error(`A2A API key not found: ${id}`);\n const record = mapRowToRecord(row);\n record.key = key;\n return record;\n }\n\n async delete(id: string): Promise<void> {\n this.db.prepare(`DELETE FROM lt_a2a_api_keys WHERE id = ?`).run(id);\n }\n\n async loadIntoMap(): Promise<Map<string, A2AApiKeyEntry>> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_a2a_api_keys WHERE enabled = 1`,\n ).all() as unknown as KeyRow[];\n const map = new Map<string, A2AApiKeyEntry>();\n for (const row of rows) {\n try {\n const key = decrypt(row.key_value);\n map.set(key, {\n key,\n tenantId: row.tenant_id,\n projectId: row.project_id,\n assistantIds: parseAssistantIds(row.assistant_ids),\n });\n } catch { /* skip */ }\n }\n return map;\n }\n}\n\nfunction mapRowToRecord(row: KeyRow): A2AApiKeyRecord {\n let key = \"\";\n try { key = decrypt(row.key_value); } catch { key = row.key_value; }\n return {\n id: row.id,\n key,\n tenantId: row.tenant_id,\n projectId: row.project_id,\n assistantIds: parseAssistantIds(row.assistant_ids),\n grants: parseGrants(row.grants),\n label: row.label || undefined,\n enabled: row.enabled === 1,\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","/**\n * Local SQLite implementation of the Open audit store (append-only).\n */\n\nimport { DatabaseWrapper, ensureTable, nowISO, parseISO } from \"../database\";\nimport type {\n OpenAuditStore,\n OpenAuditAppendInput,\n OpenAuditQuery,\n OpenAuditRecord,\n} from \"@axiom-lattice/protocols\";\nimport { randomUUID } from \"crypto\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_open_audit (\n id TEXT PRIMARY KEY,\n tenant_id TEXT NOT NULL,\n credential_id TEXT NOT NULL,\n credential_kind TEXT NOT NULL,\n project_id TEXT NOT NULL,\n domain TEXT NOT NULL,\n action TEXT NOT NULL,\n args TEXT,\n status TEXT NOT NULL,\n error_code TEXT,\n duration_ms INTEGER NOT NULL,\n created_at TEXT NOT NULL\n);\n`;\n\n/** SQLite-backed append-only audit store for the Open API surface. */\nexport class LocalOpenAuditStore implements OpenAuditStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async query(params: OpenAuditQuery): Promise<OpenAuditRecord[]> {\n const clauses = [\"tenant_id = ?\"];\n const values: unknown[] = [params.tenantId];\n if (params.credentialId) {\n clauses.push(\"credential_id = ?\");\n values.push(params.credentialId);\n }\n if (params.domain) {\n clauses.push(\"domain = ?\");\n values.push(params.domain);\n }\n if (params.status) {\n clauses.push(\"status = ?\");\n values.push(params.status);\n }\n if (params.from) {\n clauses.push(\"created_at >= ?\");\n values.push(params.from);\n }\n if (params.to) {\n clauses.push(\"created_at < ?\");\n values.push(params.to);\n }\n const limit = params.limit ?? 100;\n const offset = params.offset ?? 0;\n values.push(limit, offset);\n const rows = this.db\n .prepare(\n `SELECT * FROM lt_open_audit WHERE ${clauses.join(\" AND \")}\n ORDER BY created_at DESC LIMIT ? OFFSET ?`,\n )\n .all(...values) as unknown as Array<Record<string, unknown>>;\n return rows.map((row) => ({\n id: row.id as string,\n tenantId: row.tenant_id as string,\n credentialId: row.credential_id as string,\n credentialKind: row.credential_kind as OpenAuditRecord[\"credentialKind\"],\n projectId: row.project_id as string,\n domain: row.domain as string,\n action: row.action as string,\n args: row.args ? JSON.parse(row.args as string) : undefined,\n status: row.status as \"ok\" | \"error\",\n errorCode: (row.error_code as string) ?? undefined,\n durationMs: row.duration_ms as number,\n createdAt: parseISO(row.created_at as string),\n }));\n }\n\n async append(record: OpenAuditAppendInput): Promise<void> {\n this.db\n .prepare(\n `INSERT INTO lt_open_audit\n (id, tenant_id, credential_id, credential_kind, project_id, domain, action, args, status, error_code, duration_ms, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n randomUUID(),\n record.tenantId,\n record.credentialId,\n record.credentialKind,\n record.projectId,\n record.domain,\n record.action,\n record.args === undefined ? null : JSON.stringify(record.args),\n record.status,\n record.errorCode ?? null,\n Math.max(0, Math.round(record.durationMs)),\n nowISO(),\n );\n }\n}\n","/**\n * Local SQLite implementation of IMessageQueueStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n IMessageQueueStore,\n PendingMessage,\n AddMessageParams,\n ThreadInfo,\n QueueScope,\n} from \"@axiom-lattice/core\";\nimport {\n parseQueuedExecutionMode,\n parseTrustedRunContext,\n type QueuedExecutionMode,\n type TrustedRunContext,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\nimport { randomUUID } from \"crypto\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_thread_message_queue (\n id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n assistant_id TEXT NOT NULL,\n workspace_id TEXT,\n project_id TEXT,\n message_content TEXT NOT NULL,\n message_type TEXT NOT NULL DEFAULT 'human',\n sequence_order INTEGER NOT NULL DEFAULT 0,\n priority INTEGER NOT NULL DEFAULT 0,\n status TEXT NOT NULL DEFAULT 'pending',\n command TEXT,\n custom_run_config TEXT,\n trusted_run_context TEXT,\n execution_mode TEXT CHECK (execution_mode IS NULL OR execution_mode = 'followup'),\n created_at TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_lt_tmq_thread ON lt_thread_message_queue(thread_id, status);\nCREATE INDEX IF NOT EXISTS idx_lt_tmq_pending ON lt_thread_message_queue(status, priority DESC, sequence_order ASC);\n`;\n\ninterface QueueRow {\n id: string;\n thread_id: string;\n tenant_id: string;\n assistant_id: string;\n workspace_id: string | null;\n project_id: string | null;\n message_content: string;\n message_type: string;\n sequence_order: number;\n priority: number;\n status: string;\n command: string | null;\n custom_run_config: string | null;\n trusted_run_context: string | null;\n execution_mode: string | null;\n created_at: string;\n}\n\nexport class LocalThreadMessageQueueStore implements IMessageQueueStore {\n private db: DatabaseWrapper;\n private capacityTail: Promise<void> = Promise.resolve();\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n const columns = db.prepare(\"PRAGMA table_info(lt_thread_message_queue)\").all() as Array<{ name: string }>;\n const names = new Set(columns.map(({ name }) => name));\n if (!names.has(\"trusted_run_context\")) {\n db.run(\"ALTER TABLE lt_thread_message_queue ADD COLUMN trusted_run_context TEXT\");\n }\n if (!names.has(\"execution_mode\")) {\n db.run(\"ALTER TABLE lt_thread_message_queue ADD COLUMN execution_mode TEXT CHECK (execution_mode IS NULL OR execution_mode = 'followup')\");\n }\n }\n\n async addMessage(params: AddMessageParams): Promise<PendingMessage> {\n const trusted = validateQueueTrust(params);\n const now = nowISO();\n const id = params.id || randomUUID();\n\n const seqRow = this.db.prepare(\n `SELECT COALESCE(MAX(sequence_order), 0) + 1 as next_seq FROM lt_thread_message_queue WHERE thread_id = ?`,\n ).get(params.threadId) as { next_seq: number };\n const nextSeq = seqRow.next_seq;\n\n this.db.prepare(\n `INSERT INTO lt_thread_message_queue (id, thread_id, tenant_id, assistant_id, workspace_id, project_id, message_content, message_type, sequence_order, priority, command, custom_run_config, trusted_run_context, execution_mode, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n id, params.threadId, params.tenantId, params.assistantId,\n params.workspaceId ?? null, params.projectId ?? null,\n JSON.stringify(params.content), params.type || \"human\", nextSeq,\n params.priority ?? 0,\n params.command ? JSON.stringify(params.command) : null,\n params.custom_run_config ? JSON.stringify(params.custom_run_config) : null,\n trusted.trustedRunContext ? JSON.stringify(trusted.trustedRunContext) : null,\n trusted.executionMode ?? null,\n now,\n );\n\n return this.getById(id);\n }\n\n async addMessageIfCapacity(params: AddMessageParams, maxSize: number): Promise<boolean> {\n const trusted = validateQueueTrust(params);\n let release!: () => void;\n const previous = this.capacityTail;\n this.capacityTail = new Promise<void>((resolve) => { release = resolve; });\n await previous;\n try {\n const scope = {\n tenantId: params.tenantId,\n assistantId: params.assistantId,\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n };\n const filter = scopeClause(scope);\n const id = params.id || randomUUID();\n const limit = maxSize === Infinity ? -1 : maxSize;\n const result = this.db.prepare(\n `INSERT INTO lt_thread_message_queue (id, thread_id, tenant_id, assistant_id, workspace_id, project_id, message_content, message_type, sequence_order, priority, command, custom_run_config, trusted_run_context, execution_mode, created_at)\n SELECT ?, ?, ?, ?, ?, ?, ?, ?,\n (SELECT COALESCE(MAX(sequence_order), 0) + 1 FROM lt_thread_message_queue WHERE thread_id = ?),\n ?, ?, ?, ?, ?,\n ?\n WHERE ? = -1 OR (SELECT COUNT(*) FROM lt_thread_message_queue WHERE thread_id = ? AND status = 'pending'${filter.sql}) < ?`,\n ).run(\n id, params.threadId, params.tenantId, params.assistantId,\n params.workspaceId ?? null, params.projectId ?? null,\n JSON.stringify(params.content), params.type || \"human\",\n params.threadId,\n params.priority ?? 0,\n params.command ? JSON.stringify(params.command) : null,\n params.custom_run_config ? JSON.stringify(params.custom_run_config) : null,\n trusted.trustedRunContext ? JSON.stringify(trusted.trustedRunContext) : null,\n trusted.executionMode ?? null,\n nowISO(), limit, params.threadId, ...filter.params, limit,\n );\n return result.changes > 0;\n } finally {\n release();\n }\n }\n\n async addMessageAtHead(params: AddMessageParams): Promise<PendingMessage> {\n const trusted = validateQueueTrust(params);\n const now = nowISO();\n const id = params.id || randomUUID();\n\n const seqRow = this.db.prepare(\n `SELECT COALESCE(MAX(sequence_order), 0) + 1 as next_seq FROM lt_thread_message_queue WHERE thread_id = ?`,\n ).get(params.threadId) as { next_seq: number };\n\n this.db.prepare(\n `INSERT INTO lt_thread_message_queue (id, thread_id, tenant_id, assistant_id, workspace_id, project_id, message_content, message_type, sequence_order, priority, command, custom_run_config, trusted_run_context, execution_mode, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 100, ?, ?, ?, ?, ?)`,\n ).run(\n id, params.threadId, params.tenantId!, params.assistantId!,\n params.workspaceId ?? null, params.projectId ?? null,\n JSON.stringify(params.content), params.type || \"human\", seqRow.next_seq,\n params.command ? JSON.stringify(params.command) : null,\n params.custom_run_config ? JSON.stringify(params.custom_run_config) : null,\n trusted.trustedRunContext ? JSON.stringify(trusted.trustedRunContext) : null,\n trusted.executionMode ?? null,\n now,\n );\n\n return this.getById(id);\n }\n\n async getPendingMessages(threadId: string, scope?: QueueScope): Promise<PendingMessage[]> {\n const filter = scopeClause(scope);\n const rows = this.db.prepare(\n `SELECT * FROM lt_thread_message_queue WHERE thread_id = ? AND status = 'pending'${filter.sql} ORDER BY priority DESC, sequence_order ASC`,\n ).all(threadId, ...filter.params) as unknown as QueueRow[];\n return rows.map(rowToMessage);\n }\n\n async getProcessingMessages(threadId: string, scope?: QueueScope): Promise<PendingMessage[]> {\n const filter = scopeClause(scope);\n const rows = this.db.prepare(\n `SELECT * FROM lt_thread_message_queue WHERE thread_id = ? AND status = 'processing'${filter.sql} ORDER BY priority DESC, sequence_order ASC`,\n ).all(threadId, ...filter.params) as unknown as QueueRow[];\n return rows.map(rowToMessage);\n }\n\n async getQueueSize(threadId: string, scope?: QueueScope): Promise<number> {\n const filter = scopeClause(scope);\n const row = this.db.prepare(\n `SELECT COUNT(*) as count FROM lt_thread_message_queue WHERE thread_id = ? AND status = 'pending'${filter.sql}`,\n ).get(threadId, ...filter.params) as { count: number };\n return row.count;\n }\n\n async getThreadsWithPendingMessages(): Promise<ThreadInfo[]> {\n const rows = this.db.prepare(\n `SELECT tenant_id, assistant_id, thread_id, workspace_id, project_id FROM lt_thread_message_queue WHERE status IN ('pending', 'processing') GROUP BY tenant_id, assistant_id, thread_id, workspace_id, project_id ORDER BY thread_id`,\n ).all() as { tenant_id: string; assistant_id: string; thread_id: string; workspace_id: string | null; project_id: string | null }[];\n return rows.map((r) => ({\n tenantId: r.tenant_id,\n assistantId: r.assistant_id,\n threadId: r.thread_id,\n workspaceId: r.workspace_id,\n projectId: r.project_id,\n }));\n }\n\n async removeMessage(messageId: string, scope?: QueueScope): Promise<boolean> {\n const filter = scopeClause(scope);\n const result = this.db.prepare(`DELETE FROM lt_thread_message_queue WHERE id = ?${filter.sql}`).run(messageId, ...filter.params);\n return result.changes > 0;\n }\n\n async clearMessages(threadId: string, scope?: QueueScope): Promise<void> {\n const filter = scopeClause(scope);\n this.db.prepare(`DELETE FROM lt_thread_message_queue WHERE thread_id = ?${filter.sql}`).run(threadId, ...filter.params);\n }\n\n async markProcessing(messageId: string, customRunConfig?: unknown, scope?: QueueScope): Promise<void> {\n const filter = scopeClause(scope);\n if (customRunConfig === undefined) {\n this.db.prepare(`UPDATE lt_thread_message_queue SET status = 'processing' WHERE id = ?${filter.sql}`).run(messageId, ...filter.params);\n return;\n }\n this.db.prepare(\n `UPDATE lt_thread_message_queue SET status = 'processing', custom_run_config = ? WHERE id = ?${filter.sql}`,\n ).run(JSON.stringify(customRunConfig), messageId, ...filter.params);\n }\n\n async resetProcessingToPending(threadId: string, scope?: QueueScope): Promise<number> {\n const filter = scopeClause(scope);\n const result = this.db.prepare(\n `UPDATE lt_thread_message_queue SET status = 'pending' WHERE thread_id = ? AND status = 'processing'${filter.sql}`,\n ).run(threadId, ...filter.params);\n return result.changes;\n }\n\n private getById(id: string): PendingMessage {\n const row = this.db.prepare(`SELECT * FROM lt_thread_message_queue WHERE id = ?`).get(id) as unknown as QueueRow;\n return rowToMessage(row);\n }\n}\n\nfunction validateQueueTrust(params: AddMessageParams): {\n trustedRunContext: TrustedRunContext | undefined;\n executionMode: QueuedExecutionMode | undefined;\n} {\n return {\n trustedRunContext: params.trusted_run_context === undefined\n ? undefined\n : parseTrustedRunContext(params.trusted_run_context),\n executionMode: params.execution_mode === undefined\n ? undefined\n : parseQueuedExecutionMode(params.execution_mode),\n };\n}\n\nfunction scopeClause(scope?: QueueScope): { sql: string; params: unknown[] } {\n if (!scope) return { sql: \"\", params: [] };\n const entries = ([\"tenantId\", \"assistantId\", \"workspaceId\", \"projectId\"] as const)\n .map((key) => [key, scope[key]] as const);\n return {\n sql: entries.map(([key, value]) => ` AND ${key.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`)} ${value == null ? \"IS NULL\" : \"= ?\"}`).join(\"\"),\n params: entries.flatMap(([, value]) => value == null ? [] : [value]),\n };\n}\n\nfunction rowToMessage(row: QueueRow): PendingMessage {\n return {\n id: row.id,\n content: JSON.parse(row.message_content),\n type: row.message_type as \"human\" | \"system\",\n sequence: row.sequence_order,\n createdAt: parseISO(row.created_at),\n priority: row.priority || 0,\n command: row.command ? JSON.parse(row.command) : undefined,\n custom_run_config: row.custom_run_config ? JSON.parse(row.custom_run_config) : undefined,\n trusted_run_context: row.trusted_run_context\n ? parseTrustedRunContext(JSON.parse(row.trusted_run_context))\n : undefined,\n execution_mode: row.execution_mode == null ? undefined : parseQueuedExecutionMode(row.execution_mode),\n };\n}\n","/**\n * Local SQLite implementation of SkillStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n SkillStore,\n Skill,\n CreateSkillRequest,\n SkillStoreContext,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_skills (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n name TEXT NOT NULL,\n description TEXT NOT NULL,\n license TEXT,\n compatibility TEXT,\n metadata TEXT DEFAULT '{}',\n content TEXT,\n sub_skills TEXT DEFAULT '[]',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\n`;\n\ninterface SkillRow {\n id: string;\n tenant_id: string;\n name: string;\n description: string;\n license: string | null;\n compatibility: string | null;\n metadata: string;\n content: string | null;\n sub_skills: string;\n created_at: string;\n updated_at: string;\n}\n\nexport class LocalSkillStore implements SkillStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async getAllSkills(tenantId: string, _context?: SkillStoreContext): Promise<Skill[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_skills WHERE tenant_id = ? ORDER BY created_at DESC`,\n ).all(tenantId) as unknown as SkillRow[];\n return rows.map(mapRowToSkill);\n }\n\n async getSkillById(tenantId: string, id: string, _context?: SkillStoreContext): Promise<Skill | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_skills WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as SkillRow | undefined;\n return row ? mapRowToSkill(row) : null;\n }\n\n async createSkill(tenantId: string, id: string, data: CreateSkillRequest, _context?: SkillStoreContext): Promise<Skill> {\n const now = nowISO();\n\n this.db.prepare(\n `INSERT INTO lt_skills (id, tenant_id, name, description, license, compatibility, metadata, content, sub_skills, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(tenant_id, id) DO UPDATE SET\n name = excluded.name, description = excluded.description,\n license = excluded.license, compatibility = excluded.compatibility,\n metadata = excluded.metadata, content = excluded.content,\n sub_skills = excluded.sub_skills, updated_at = excluded.updated_at`,\n ).run(id, tenantId, data.name, data.description,\n data.license || null, data.compatibility || null,\n JSON.stringify(data.metadata || {}), data.content || null,\n JSON.stringify(data.subSkills || []), now, now);\n\n return {\n id, tenantId, name: data.name, description: data.description,\n license: data.license, compatibility: data.compatibility,\n metadata: data.metadata || {}, content: data.content,\n subSkills: data.subSkills,\n createdAt: parseISO(now), updatedAt: parseISO(now),\n };\n }\n\n async updateSkill(\n tenantId: string, id: string, updates: Partial<CreateSkillRequest>, _context?: SkillStoreContext,\n ): Promise<Skill | null> {\n const existing = await this.getSkillById(tenantId, id);\n if (!existing) return null;\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.name !== undefined) { setClauses.push(\"name = ?\"); values.push(updates.name); }\n if (updates.description !== undefined) { setClauses.push(\"description = ?\"); values.push(updates.description); }\n if (updates.license !== undefined) { setClauses.push(\"license = ?\"); values.push(updates.license || null); }\n if (updates.compatibility !== undefined) { setClauses.push(\"compatibility = ?\"); values.push(updates.compatibility || null); }\n if (updates.metadata !== undefined) { setClauses.push(\"metadata = ?\"); values.push(JSON.stringify(updates.metadata || {})); }\n if (updates.content !== undefined) { setClauses.push(\"content = ?\"); values.push(updates.content || null); }\n if (updates.subSkills !== undefined) { setClauses.push(\"sub_skills = ?\"); values.push(JSON.stringify(updates.subSkills || [])); }\n\n if (setClauses.length === 0) return existing;\n\n const now = nowISO();\n setClauses.push(\"updated_at = ?\");\n values.push(now);\n values.push(tenantId, id);\n\n this.db.prepare(\n `UPDATE lt_skills SET ${setClauses.join(\", \")} WHERE tenant_id = ? AND id = ?`,\n ).run(...values);\n\n return this.getSkillById(tenantId, id);\n }\n\n async deleteSkill(tenantId: string, id: string, _context?: SkillStoreContext): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_skills WHERE tenant_id = ? AND id = ?`,\n ).run(tenantId, id);\n return result.changes > 0;\n }\n\n async hasSkill(tenantId: string, id: string, _context?: SkillStoreContext): Promise<boolean> {\n const row = this.db.prepare(\n `SELECT 1 FROM lt_skills WHERE tenant_id = ? AND id = ? LIMIT 1`,\n ).get(tenantId, id);\n return row !== undefined;\n }\n\n async searchByMetadata(\n tenantId: string, metadataKey: string, metadataValue: string, _context?: SkillStoreContext,\n ): Promise<Skill[]> {\n // SQLite doesn't have JSONB operators, so filter in JS\n const all = await this.getAllSkills(tenantId);\n return all.filter((s) => s.metadata?.[metadataKey] === metadataValue);\n }\n\n async filterByCompatibility(tenantId: string, compatibility: string, _context?: SkillStoreContext): Promise<Skill[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_skills WHERE tenant_id = ? AND compatibility = ? ORDER BY created_at DESC`,\n ).all(tenantId, compatibility) as unknown as SkillRow[];\n return rows.map(mapRowToSkill);\n }\n\n async filterByLicense(tenantId: string, license: string, _context?: SkillStoreContext): Promise<Skill[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_skills WHERE tenant_id = ? AND license = ? ORDER BY created_at DESC`,\n ).all(tenantId, license) as unknown as SkillRow[];\n return rows.map(mapRowToSkill);\n }\n\n async getSubSkills(tenantId: string, parentSkillName: string, _context?: SkillStoreContext): Promise<Skill[]> {\n // SQLite doesn't have @> for JSON arrays, so filter in JS\n const all = await this.getAllSkills(tenantId);\n return all.filter((s) => s.subSkills?.includes(parentSkillName));\n }\n\n async listSkillResources?(_tenantId: string, _id: string, _context?: SkillStoreContext): Promise<string[]> {\n return [];\n }\n\n async loadSkillResource?(_tenantId: string, _id: string, _resourcePath: string, _context?: SkillStoreContext): Promise<string | null> {\n return null;\n }\n}\n\nfunction mapRowToSkill(row: SkillRow): Skill {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n name: row.name,\n description: row.description,\n license: row.license || undefined,\n compatibility: row.compatibility || undefined,\n metadata: JSON.parse(row.metadata || \"{}\"),\n content: row.content || undefined,\n subSkills: JSON.parse(row.sub_skills || \"[]\"),\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n","/**\n * Local SQLite implementation of ScheduleStorage.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport {\n ScheduleStorage,\n ScheduledTaskDefinition,\n ScheduledTaskStatus,\n ScheduleExecutionType,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable } from \"../database\";\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_scheduled_tasks (\n task_id TEXT PRIMARY KEY,\n task_type TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n payload TEXT NOT NULL DEFAULT '{}',\n assistant_id TEXT,\n thread_id TEXT,\n execution_type TEXT NOT NULL,\n execute_at TEXT,\n delay_ms INTEGER,\n cron_expression TEXT,\n timezone TEXT,\n next_run_at TEXT,\n last_run_at TEXT,\n status TEXT NOT NULL DEFAULT 'pending',\n run_count INTEGER NOT NULL DEFAULT 0,\n max_runs INTEGER,\n retry_count INTEGER NOT NULL DEFAULT 0,\n max_retries INTEGER NOT NULL DEFAULT 0,\n last_error TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n expires_at TEXT,\n metadata TEXT\n);\nCREATE INDEX IF NOT EXISTS idx_lt_st_status ON lt_scheduled_tasks(status);\nCREATE INDEX IF NOT EXISTS idx_lt_st_type ON lt_scheduled_tasks(task_type);\nCREATE INDEX IF NOT EXISTS idx_lt_st_tenant ON lt_scheduled_tasks(tenant_id);\n`;\n\ninterface TaskRow {\n task_id: string;\n task_type: string;\n tenant_id: string;\n payload: string;\n assistant_id: string | null;\n thread_id: string | null;\n execution_type: string;\n execute_at: string | null;\n delay_ms: number | null;\n cron_expression: string | null;\n timezone: string | null;\n next_run_at: string | null;\n last_run_at: string | null;\n status: string;\n run_count: number;\n max_runs: number | null;\n retry_count: number;\n max_retries: number;\n last_error: string | null;\n created_at: string;\n updated_at: string;\n expires_at: string | null;\n metadata: string | null;\n}\n\nexport class LocalScheduleStorage implements ScheduleStorage {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async save(task: ScheduledTaskDefinition): Promise<void> {\n this.db.prepare(\n `INSERT INTO lt_scheduled_tasks (\n task_id, task_type, tenant_id, payload, assistant_id, thread_id, execution_type,\n execute_at, delay_ms, cron_expression, timezone, next_run_at, last_run_at,\n status, run_count, max_runs, retry_count, max_retries, last_error,\n created_at, updated_at, expires_at, metadata\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(task_id) DO UPDATE SET\n task_type = excluded.task_type, tenant_id = excluded.tenant_id,\n payload = excluded.payload, assistant_id = excluded.assistant_id,\n thread_id = excluded.thread_id, execution_type = excluded.execution_type,\n execute_at = excluded.execute_at, delay_ms = excluded.delay_ms,\n cron_expression = excluded.cron_expression, timezone = excluded.timezone,\n next_run_at = excluded.next_run_at, last_run_at = excluded.last_run_at,\n status = excluded.status, run_count = excluded.run_count,\n max_runs = excluded.max_runs, retry_count = excluded.retry_count,\n max_retries = excluded.max_retries, last_error = excluded.last_error,\n updated_at = excluded.updated_at, expires_at = excluded.expires_at,\n metadata = excluded.metadata`,\n ).run(\n task.taskId, task.taskType, task.tenantId, JSON.stringify(task.payload),\n task.assistantId ?? null, task.threadId ?? null, task.executionType,\n task.executeAt ? new Date(task.executeAt).toISOString() : null,\n task.delayMs ?? null, task.cronExpression ?? null, task.timezone ?? null,\n task.nextRunAt ? new Date(task.nextRunAt).toISOString() : null,\n task.lastRunAt ? new Date(task.lastRunAt).toISOString() : null,\n task.status, task.runCount, task.maxRuns ?? null,\n task.retryCount, task.maxRetries, task.lastError ?? null,\n new Date(task.createdAt).toISOString(), new Date(task.updatedAt).toISOString(),\n task.expiresAt ? new Date(task.expiresAt).toISOString() : null,\n task.metadata ? JSON.stringify(task.metadata) : null,\n );\n }\n\n async get(taskId: string): Promise<ScheduledTaskDefinition | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_scheduled_tasks WHERE task_id = ?`,\n ).get(taskId) as unknown as TaskRow | undefined;\n return row ? mapRowToTask(row) : null;\n }\n\n async update(taskId: string, updates: Partial<ScheduledTaskDefinition>): Promise<void> {\n const setClauses: string[] = [];\n const values: unknown[] = [];\n\n if (updates.taskType !== undefined) { setClauses.push(\"task_type = ?\"); values.push(updates.taskType); }\n if (updates.tenantId !== undefined) { setClauses.push(\"tenant_id = ?\"); values.push(updates.tenantId); }\n if (updates.payload !== undefined) { setClauses.push(\"payload = ?\"); values.push(JSON.stringify(updates.payload)); }\n if (updates.assistantId !== undefined) { setClauses.push(\"assistant_id = ?\"); values.push(updates.assistantId ?? null); }\n if (updates.threadId !== undefined) { setClauses.push(\"thread_id = ?\"); values.push(updates.threadId ?? null); }\n if (updates.executionType !== undefined) { setClauses.push(\"execution_type = ?\"); values.push(updates.executionType); }\n if (updates.executeAt !== undefined) { setClauses.push(\"execute_at = ?\"); values.push(updates.executeAt ? new Date(updates.executeAt).toISOString() : null); }\n if (updates.delayMs !== undefined) { setClauses.push(\"delay_ms = ?\"); values.push(updates.delayMs ?? null); }\n if (updates.cronExpression !== undefined) { setClauses.push(\"cron_expression = ?\"); values.push(updates.cronExpression ?? null); }\n if (updates.timezone !== undefined) { setClauses.push(\"timezone = ?\"); values.push(updates.timezone ?? null); }\n if (updates.nextRunAt !== undefined) { setClauses.push(\"next_run_at = ?\"); values.push(updates.nextRunAt ? new Date(updates.nextRunAt).toISOString() : null); }\n if (updates.lastRunAt !== undefined) { setClauses.push(\"last_run_at = ?\"); values.push(updates.lastRunAt ? new Date(updates.lastRunAt).toISOString() : null); }\n if (updates.status !== undefined) { setClauses.push(\"status = ?\"); values.push(updates.status); }\n if (updates.runCount !== undefined) { setClauses.push(\"run_count = ?\"); values.push(updates.runCount); }\n if (updates.maxRuns !== undefined) { setClauses.push(\"max_runs = ?\"); values.push(updates.maxRuns ?? null); }\n if (updates.retryCount !== undefined) { setClauses.push(\"retry_count = ?\"); values.push(updates.retryCount); }\n if (updates.maxRetries !== undefined) { setClauses.push(\"max_retries = ?\"); values.push(updates.maxRetries); }\n if (updates.lastError !== undefined) { setClauses.push(\"last_error = ?\"); values.push(updates.lastError ?? null); }\n if (updates.expiresAt !== undefined) { setClauses.push(\"expires_at = ?\"); values.push(updates.expiresAt ? new Date(updates.expiresAt).toISOString() : null); }\n if (updates.metadata !== undefined) { setClauses.push(\"metadata = ?\"); values.push(updates.metadata ? JSON.stringify(updates.metadata) : null); }\n\n if (setClauses.length === 0) return;\n\n setClauses.push(\"updated_at = ?\");\n values.push(new Date().toISOString());\n values.push(taskId);\n\n this.db.prepare(\n `UPDATE lt_scheduled_tasks SET ${setClauses.join(\", \")} WHERE task_id = ?`,\n ).run(...values);\n }\n\n async delete(taskId: string): Promise<void> {\n this.db.prepare(`DELETE FROM lt_scheduled_tasks WHERE task_id = ?`).run(taskId);\n }\n\n async getActiveTasks(): Promise<ScheduledTaskDefinition[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_scheduled_tasks WHERE status IN ('pending', 'paused') ORDER BY created_at ASC`,\n ).all() as unknown as TaskRow[];\n return rows.map(mapRowToTask);\n }\n\n async getTasksByType(taskType: string): Promise<ScheduledTaskDefinition[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_scheduled_tasks WHERE task_type = ? ORDER BY created_at DESC`,\n ).all(taskType) as unknown as TaskRow[];\n return rows.map(mapRowToTask);\n }\n\n async getTasksByStatus(status: ScheduledTaskStatus): Promise<ScheduledTaskDefinition[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_scheduled_tasks WHERE status = ? ORDER BY created_at DESC`,\n ).all(status) as unknown as TaskRow[];\n return rows.map(mapRowToTask);\n }\n\n async getTasksByExecutionType(executionType: ScheduleExecutionType): Promise<ScheduledTaskDefinition[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_scheduled_tasks WHERE execution_type = ? ORDER BY created_at DESC`,\n ).all(executionType) as unknown as TaskRow[];\n return rows.map(mapRowToTask);\n }\n\n async getTasksByAssistantId(assistantId: string): Promise<ScheduledTaskDefinition[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_scheduled_tasks WHERE assistant_id = ? ORDER BY created_at DESC`,\n ).all(assistantId) as unknown as TaskRow[];\n return rows.map(mapRowToTask);\n }\n\n async getTasksByThreadId(threadId: string): Promise<ScheduledTaskDefinition[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_scheduled_tasks WHERE thread_id = ? ORDER BY created_at DESC`,\n ).all(threadId) as unknown as TaskRow[];\n return rows.map(mapRowToTask);\n }\n\n async getAllTasks(filters?: {\n tenantId?: string; status?: ScheduledTaskStatus;\n executionType?: ScheduleExecutionType; taskType?: string;\n assistantId?: string; threadId?: string;\n limit?: number; offset?: number;\n }): Promise<ScheduledTaskDefinition[]> {\n const conditions: string[] = [];\n const values: unknown[] = [];\n\n if (filters?.tenantId !== undefined) { conditions.push(\"tenant_id = ?\"); values.push(filters.tenantId); }\n if (filters?.status !== undefined) { conditions.push(\"status = ?\"); values.push(filters.status); }\n if (filters?.executionType !== undefined) { conditions.push(\"execution_type = ?\"); values.push(filters.executionType); }\n if (filters?.taskType !== undefined) { conditions.push(\"task_type = ?\"); values.push(filters.taskType); }\n if (filters?.assistantId !== undefined) { conditions.push(\"assistant_id = ?\"); values.push(filters.assistantId); }\n if (filters?.threadId !== undefined) { conditions.push(\"thread_id = ?\"); values.push(filters.threadId); }\n\n let query = `SELECT * FROM lt_scheduled_tasks`;\n if (conditions.length > 0) query += ` WHERE ${conditions.join(\" AND \")}`;\n query += ` ORDER BY created_at DESC`;\n\n if (filters?.limit !== undefined) { query += ` LIMIT ?`; values.push(filters.limit); }\n if (filters?.offset !== undefined) { query += ` OFFSET ?`; values.push(filters.offset); }\n\n const rows = this.db.prepare(query).all(...values) as unknown as TaskRow[];\n return rows.map(mapRowToTask);\n }\n\n async countTasks(filters?: {\n tenantId?: string; status?: ScheduledTaskStatus;\n executionType?: ScheduleExecutionType; taskType?: string;\n assistantId?: string; threadId?: string;\n }): Promise<number> {\n const conditions: string[] = [];\n const values: unknown[] = [];\n\n if (filters?.tenantId !== undefined) { conditions.push(\"tenant_id = ?\"); values.push(filters.tenantId); }\n if (filters?.status !== undefined) { conditions.push(\"status = ?\"); values.push(filters.status); }\n if (filters?.executionType !== undefined) { conditions.push(\"execution_type = ?\"); values.push(filters.executionType); }\n if (filters?.taskType !== undefined) { conditions.push(\"task_type = ?\"); values.push(filters.taskType); }\n if (filters?.assistantId !== undefined) { conditions.push(\"assistant_id = ?\"); values.push(filters.assistantId); }\n if (filters?.threadId !== undefined) { conditions.push(\"thread_id = ?\"); values.push(filters.threadId); }\n\n let query = `SELECT COUNT(*) as count FROM lt_scheduled_tasks`;\n if (conditions.length > 0) query += ` WHERE ${conditions.join(\" AND \")}`;\n\n const row = this.db.prepare(query).get(...values) as { count: number };\n return row.count;\n }\n\n async deleteOldTasks(olderThanMs: number): Promise<number> {\n const cutoff = new Date(Date.now() - olderThanMs).toISOString();\n const result = this.db.prepare(\n `DELETE FROM lt_scheduled_tasks WHERE status IN ('completed', 'cancelled', 'failed') AND updated_at < ?`,\n ).run(cutoff);\n return result.changes;\n }\n}\n\nfunction mapRowToTask(row: TaskRow): ScheduledTaskDefinition {\n return {\n taskId: row.task_id,\n taskType: row.task_type,\n tenantId: row.tenant_id,\n payload: JSON.parse(row.payload || \"{}\"),\n assistantId: row.assistant_id ?? undefined,\n threadId: row.thread_id ?? undefined,\n executionType: row.execution_type as ScheduleExecutionType,\n executeAt: row.execute_at ? new Date(row.execute_at).getTime() : undefined,\n delayMs: row.delay_ms ?? undefined,\n cronExpression: row.cron_expression ?? undefined,\n timezone: row.timezone ?? undefined,\n nextRunAt: row.next_run_at ? new Date(row.next_run_at).getTime() : undefined,\n lastRunAt: row.last_run_at ? new Date(row.last_run_at).getTime() : undefined,\n status: row.status as ScheduledTaskStatus,\n runCount: row.run_count,\n maxRuns: row.max_runs ?? undefined,\n retryCount: row.retry_count,\n maxRetries: row.max_retries,\n lastError: row.last_error ?? undefined,\n createdAt: new Date(row.created_at).getTime(),\n updatedAt: new Date(row.updated_at).getTime(),\n expiresAt: row.expires_at ? new Date(row.expires_at).getTime() : undefined,\n metadata: row.metadata ? JSON.parse(row.metadata) : undefined,\n };\n}\n","/**\n * Local SQLite implementation of TaskStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport { normalizeTaskMetadataScalar } from \"@axiom-lattice/protocols\";\nimport type {\n TaskStore,\n TaskItem,\n TaskFileRef,\n CreateTaskRequest,\n UpdateTaskRequest,\n TaskListFilter,\n TaskDependentListQuery,\n TaskMutationSnapshot,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\nimport { randomUUID } from \"crypto\";\n\nconst MAX_CANONICAL_TASK_TIME = \"9999-12-31T23:59:59.999Z\";\nconst TASK_STATUSES: ReadonlySet<string> = new Set([\n \"pending\", \"in_progress\", \"review\", \"failed\", \"interrupted\", \"completed\", \"cancelled\",\n]);\nconst NEXT_UPDATED_AT_SQL = `updated_at = CASE\n WHEN strftime('%Y-%m-%dT%H:%M:%fZ', updated_at) = updated_at AND updated_at >= ?\n THEN strftime('%Y-%m-%dT%H:%M:%fZ', updated_at, '+0.001 seconds')\n ELSE ?\nEND`;\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_tasks (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n owner_type TEXT NOT NULL DEFAULT 'user',\n owner_id TEXT NOT NULL,\n title TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'pending',\n priority TEXT NOT NULL DEFAULT 'medium',\n due_date TEXT,\n metadata TEXT,\n parent_id TEXT,\n source_id TEXT,\n context TEXT,\n require_review INTEGER DEFAULT 0,\n dependencies TEXT,\n result TEXT,\n failure_reason TEXT,\n workspace_id TEXT,\n project_id TEXT,\n files TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\n`;\n\ninterface TaskRow {\n id: string;\n tenant_id: string;\n owner_type: string;\n owner_id: string;\n title: string;\n description: string | null;\n status: string;\n priority: string;\n due_date: string | null;\n metadata: string | null;\n parent_id: string | null;\n source_id: string | null;\n context: string | null;\n require_review: number | null;\n dependencies: string | null;\n result: string | null;\n failure_reason: string | null;\n workspace_id: string | null;\n project_id: string | null;\n files: string | null;\n created_at: string;\n updated_at: string;\n}\n\nfunction parseTaskFiles(raw: unknown): TaskFileRef[] | undefined {\n if (!raw) return undefined;\n try {\n const parsed = typeof raw === \"string\" ? JSON.parse(raw) : raw;\n if (!Array.isArray(parsed)) return undefined;\n return parsed as TaskFileRef[];\n } catch {\n return undefined;\n }\n}\n\nfunction mapRowToTask(row: TaskRow): TaskItem {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n ownerType: row.owner_type as 'user' | 'agent',\n ownerId: row.owner_id,\n title: row.title,\n description: row.description ?? undefined,\n status: row.status as TaskItem['status'],\n priority: row.priority as TaskItem['priority'],\n dueDate: row.due_date ?? undefined,\n metadata: row.metadata ? JSON.parse(row.metadata) : undefined,\n parentId: row.parent_id ?? undefined,\n sourceId: row.source_id ?? undefined,\n context: row.context ? JSON.parse(row.context) : undefined,\n requireReview: row.require_review === 1 ? true : (row.require_review ? true : undefined),\n dependencies: row.dependencies ? JSON.parse(row.dependencies) : undefined,\n result: row.result || undefined,\n failureReason: row.failure_reason || undefined,\n workspaceId: row.workspace_id ?? undefined,\n projectId: row.project_id ?? undefined,\n files: parseTaskFiles(row.files),\n createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\n };\n}\n\nfunction nextISO(previous: Date | string): string {\n const previousMs = new Date(previous).getTime();\n return new Date(Math.max(Date.now(), previousMs + 1)).toISOString();\n}\n\nfunction assertPage(limit: number, offset = 0): void {\n if (!Number.isSafeInteger(limit) || limit < 1 || limit > 100\n || !Number.isSafeInteger(offset) || offset < 0) throw new RangeError(\"Invalid task page\");\n}\n\nexport class LocalTaskStore implements TaskStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n // Existing installs: add columns shipped after the original schema.\n // sql.js bundles an older SQLite that does not support\n // `ADD COLUMN IF NOT EXISTS`, so check via PRAGMA instead.\n this.ensureColumn(\"lt_tasks\", \"require_review\", \"require_review INTEGER DEFAULT 0\");\n this.ensureColumn(\"lt_tasks\", \"dependencies\", \"dependencies TEXT\");\n this.ensureColumn(\"lt_tasks\", \"result\", \"result TEXT\");\n this.ensureColumn(\"lt_tasks\", \"failure_reason\", \"failure_reason TEXT\");\n this.ensureColumn(\"lt_tasks\", \"workspace_id\", \"workspace_id TEXT\");\n this.ensureColumn(\"lt_tasks\", \"project_id\", \"project_id TEXT\");\n this.ensureColumn(\"lt_tasks\", \"files\", \"files TEXT\");\n }\n\n /** Add a column if it does not exist (SQLite version compatible). */\n private ensureColumn(table: string, column: string, ddl: string): void {\n const cols = this.db.prepare(`PRAGMA table_info(${table})`).all() as Array<{ name: string }>;\n if (!cols.some((c) => c.name === column)) {\n this.db.exec(`ALTER TABLE ${table} ADD COLUMN ${ddl}`);\n }\n }\n\n async create(\n params: CreateTaskRequest & { tenantId: string; ownerType: string; ownerId: string },\n ): Promise<TaskItem> {\n const id = params.id ?? randomUUID();\n const now = nowISO();\n\n this.db.prepare(\n `INSERT INTO lt_tasks (id, tenant_id, owner_type, owner_id, title, description, status, priority, due_date, metadata, parent_id, source_id, context, require_review, dependencies, result, failure_reason, workspace_id, project_id, files, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n id, params.tenantId, params.ownerType, params.ownerId, params.title,\n params.description || null, params.status || 'pending', params.priority || 'medium',\n params.dueDate || null, params.metadata ? JSON.stringify(params.metadata) : null,\n params.parentId || null, params.sourceId || null,\n params.context ? JSON.stringify(params.context) : null,\n params.requireReview ? 1 : 0,\n params.dependencies ? JSON.stringify(params.dependencies) : null,\n params.result || null, params.failureReason || null,\n params.workspaceId || null, params.projectId || null,\n params.files ? JSON.stringify(params.files) : null,\n now, now,\n );\n\n return (await this.getById(params.tenantId, id))!;\n }\n\n async getById(tenantId: string, id: string): Promise<TaskItem | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_tasks WHERE tenant_id = ? AND id = ?`,\n ).get(tenantId, id) as unknown as TaskRow | undefined;\n return row ? mapRowToTask(row) : null;\n }\n\n async list(filter: TaskListFilter): Promise<TaskItem[]> {\n const conditions: string[] = ['tenant_id = ?'];\n const params: unknown[] = [filter.tenantId];\n\n if (filter.ownerType) { conditions.push('owner_type = ?'); params.push(filter.ownerType); }\n if (filter.ownerId) { conditions.push('owner_id = ?'); params.push(filter.ownerId); }\n if (filter.status) {\n const statuses = filter.status.split(',').map(s => s.trim()).filter(Boolean);\n const placeholders = statuses.map(() => '?').join(', ');\n conditions.push(`status IN (${placeholders})`);\n params.push(...statuses);\n }\n if (filter.priority) { conditions.push('priority = ?'); params.push(filter.priority); }\n if (filter.workspaceId) { conditions.push('workspace_id = ?'); params.push(filter.workspaceId); }\n if (filter.projectId === null) conditions.push(\"(project_id IS NULL OR project_id = '' OR project_id = 'default')\");\n else if (filter.projectId !== undefined) { conditions.push('project_id = ?'); params.push(filter.projectId); }\n if (filter.parentId) { conditions.push('parent_id = ?'); params.push(filter.parentId); }\n if (filter.sourceId) { conditions.push('source_id = ?'); params.push(filter.sourceId); }\n if (filter.metadata) {\n for (const [key, value] of Object.entries(filter.metadata)) {\n const safeKey = key.replace(/[^a-zA-Z0-9_]/g, '');\n const expected = normalizeTaskMetadataScalar(value);\n if (!safeKey || expected === undefined) continue;\n // Match PostgreSQL's metadata->> text convention: JSON booleans map to\n // 'true'/'false', and everything else compares by CAST-to-text so a\n // stored number 2 and string \"2\" are equal. Excluding json_type\n // true/false from the text branch keeps boolean true distinct from 1.\n if (expected === 'true' || expected === 'false') {\n conditions.push(\n `(json_type(metadata, '$.${safeKey}') = ? OR CAST(json_extract(metadata, '$.${safeKey}') AS TEXT) = ?)`,\n );\n params.push(expected, expected);\n } else {\n conditions.push(\n `(json_type(metadata, '$.${safeKey}') NOT IN ('true', 'false') AND CAST(json_extract(metadata, '$.${safeKey}') AS TEXT) = ?)`,\n );\n params.push(expected);\n }\n }\n }\n\n const where = conditions.join(' AND ');\n const limit = filter.limit || 100;\n const offset = filter.offset || 0;\n\n const rows = this.db.prepare(\n `SELECT * FROM lt_tasks WHERE ${where} ORDER BY created_at DESC, id DESC LIMIT ? OFFSET ?`,\n ).all(...params, limit, offset) as unknown as TaskRow[];\n return rows.map(mapRowToTask);\n }\n\n /** Lists exact project tasks containing a string dependency. */\n async listDependents(query: TaskDependentListQuery): Promise<TaskItem[]> {\n assertPage(query.limit, query.offset);\n if (query.statuses.length === 0 || query.statuses.some((status) => !TASK_STATUSES.has(status))) {\n throw new RangeError(\"Invalid task statuses\");\n }\n const rows = this.db.prepare(\n `SELECT task.* FROM lt_tasks AS task\n WHERE task.tenant_id = ? AND task.workspace_id = ? AND task.project_id = ?\n AND task.status IN (${query.statuses.map(() => \"?\").join(\", \")})\n AND task.dependencies IS NOT NULL\n AND json_valid(task.dependencies) = 1\n AND json_type(CASE WHEN json_valid(task.dependencies)=1\n THEN task.dependencies ELSE '[]' END) = 'array'\n AND EXISTS (\n SELECT 1 FROM json_each(\n CASE WHEN json_valid(task.dependencies)=1 THEN\n CASE WHEN json_type(task.dependencies)='array' THEN task.dependencies ELSE '[]' END\n ELSE '[]' END\n ) AS dependency\n WHERE dependency.type = 'text' AND dependency.value = ?\n )\n ORDER BY task.created_at DESC, task.id DESC LIMIT ? OFFSET ?`,\n ).all(query.tenantId, query.workspaceId, query.projectId, ...query.statuses,\n query.dependencyTaskId, query.limit, query.offset) as unknown as TaskRow[];\n return rows.map(mapRowToTask);\n }\n\n async update(\n tenantId: string,\n id: string,\n updates: UpdateTaskRequest,\n ): Promise<TaskItem | null> {\n const existing = await this.getById(tenantId, id);\n if (!existing) return null;\n\n const now = nowISO();\n const setClauses: string[] = [NEXT_UPDATED_AT_SQL];\n const values: unknown[] = [now, now];\n\n if (updates.title !== undefined) { setClauses.push('title = ?'); values.push(updates.title); }\n if (updates.description !== undefined) { setClauses.push('description = ?'); values.push(updates.description); }\n if (updates.status !== undefined) { setClauses.push('status = ?'); values.push(updates.status); }\n if (updates.priority !== undefined) { setClauses.push('priority = ?'); values.push(updates.priority); }\n if (updates.dueDate !== undefined) { setClauses.push('due_date = ?'); values.push(updates.dueDate); }\n if (updates.metadata !== undefined) { setClauses.push('metadata = ?'); values.push(JSON.stringify(updates.metadata)); }\n if (updates.parentId !== undefined) { setClauses.push('parent_id = ?'); values.push(updates.parentId); }\n if (updates.sourceId !== undefined) { setClauses.push('source_id = ?'); values.push(updates.sourceId); }\n if (updates.context !== undefined) {\n setClauses.push('context = ?'); values.push(updates.context === null ? null : JSON.stringify(updates.context));\n }\n if (updates.ownerType !== undefined) { setClauses.push('owner_type = ?'); values.push(updates.ownerType); }\n if (updates.ownerId !== undefined) { setClauses.push('owner_id = ?'); values.push(updates.ownerId); }\n if (updates.requireReview !== undefined) { setClauses.push('require_review = ?'); values.push(updates.requireReview ? 1 : 0); }\n if (updates.dependencies !== undefined) { setClauses.push('dependencies = ?'); values.push(JSON.stringify(updates.dependencies)); }\n if (updates.result !== undefined) { setClauses.push('result = ?'); values.push(updates.result); }\n if (updates.failureReason !== undefined) { setClauses.push('failure_reason = ?'); values.push(updates.failureReason); }\n if (updates.workspaceId !== undefined) { setClauses.push('workspace_id = ?'); values.push(updates.workspaceId); }\n if (updates.projectId !== undefined) { setClauses.push('project_id = ?'); values.push(updates.projectId); }\n if (updates.files !== undefined) { setClauses.push('files = ?'); values.push(JSON.stringify(updates.files)); }\n\n if (setClauses.length === 1) return existing;\n\n values.push(tenantId, id, MAX_CANONICAL_TASK_TIME);\n const result = this.db.prepare(\n `UPDATE lt_tasks SET ${setClauses.join(', ')} WHERE tenant_id = ? AND id = ? AND updated_at <> ?`,\n ).run(...values);\n if (result.changes === 0) return null;\n\n return this.getById(tenantId, id);\n }\n\n /**\n * Atomically update a task unless its current status is blocked.\n *\n * @param tenantId Tenant identifier.\n * @param id Task identifier.\n * @param updates Partial task data to update.\n * @param blockedStatuses Current statuses that prevent the update.\n * @returns The updated task, or `null` when missing or blocked.\n */\n async updateIfStatusNotIn(\n tenantId: string,\n id: string,\n updates: UpdateTaskRequest,\n blockedStatuses: TaskItem[\"status\"][],\n ): Promise<TaskItem | null> {\n const now = nowISO();\n const setClauses: string[] = [NEXT_UPDATED_AT_SQL];\n const values: unknown[] = [now, now];\n\n if (updates.title !== undefined) { setClauses.push('title = ?'); values.push(updates.title); }\n if (updates.description !== undefined) { setClauses.push('description = ?'); values.push(updates.description); }\n if (updates.status !== undefined) { setClauses.push('status = ?'); values.push(updates.status); }\n if (updates.priority !== undefined) { setClauses.push('priority = ?'); values.push(updates.priority); }\n if (updates.dueDate !== undefined) { setClauses.push('due_date = ?'); values.push(updates.dueDate); }\n if (updates.metadata !== undefined) { setClauses.push('metadata = ?'); values.push(JSON.stringify(updates.metadata)); }\n if (updates.parentId !== undefined) { setClauses.push('parent_id = ?'); values.push(updates.parentId); }\n if (updates.sourceId !== undefined) { setClauses.push('source_id = ?'); values.push(updates.sourceId); }\n if (updates.context !== undefined) {\n setClauses.push('context = ?'); values.push(updates.context === null ? null : JSON.stringify(updates.context));\n }\n if (updates.ownerType !== undefined) { setClauses.push('owner_type = ?'); values.push(updates.ownerType); }\n if (updates.ownerId !== undefined) { setClauses.push('owner_id = ?'); values.push(updates.ownerId); }\n if (updates.requireReview !== undefined) { setClauses.push('require_review = ?'); values.push(updates.requireReview ? 1 : 0); }\n if (updates.dependencies !== undefined) { setClauses.push('dependencies = ?'); values.push(JSON.stringify(updates.dependencies)); }\n if (updates.result !== undefined) { setClauses.push('result = ?'); values.push(updates.result); }\n if (updates.failureReason !== undefined) { setClauses.push('failure_reason = ?'); values.push(updates.failureReason); }\n if (updates.workspaceId !== undefined) { setClauses.push('workspace_id = ?'); values.push(updates.workspaceId); }\n if (updates.projectId !== undefined) { setClauses.push('project_id = ?'); values.push(updates.projectId); }\n if (updates.files !== undefined) { setClauses.push('files = ?'); values.push(JSON.stringify(updates.files)); }\n\n const statusClause = blockedStatuses.length > 0\n ? ` AND status NOT IN (${blockedStatuses.map(() => \"?\").join(\", \")})`\n : \"\";\n values.push(tenantId, id, MAX_CANONICAL_TASK_TIME, ...blockedStatuses);\n const result = this.db.prepare(\n `UPDATE lt_tasks SET ${setClauses.join(', ')} WHERE tenant_id = ? AND id = ? AND updated_at <> ?${statusClause}`,\n ).run(...values);\n if (result.changes === 0) return null;\n return this.getById(tenantId, id);\n }\n\n /** Atomically update a task only when its current status is expected. */\n async updateIfStatusIn(\n tenantId: string,\n id: string,\n updates: UpdateTaskRequest,\n expectedStatuses: TaskItem[\"status\"][],\n ): Promise<TaskItem | null> {\n if (expectedStatuses.length === 0) return null;\n\n const now = nowISO();\n const setClauses: string[] = [NEXT_UPDATED_AT_SQL];\n const values: unknown[] = [now, now];\n if (updates.title !== undefined) { setClauses.push('title = ?'); values.push(updates.title); }\n if (updates.description !== undefined) { setClauses.push('description = ?'); values.push(updates.description); }\n if (updates.status !== undefined) { setClauses.push('status = ?'); values.push(updates.status); }\n if (updates.priority !== undefined) { setClauses.push('priority = ?'); values.push(updates.priority); }\n if (updates.dueDate !== undefined) { setClauses.push('due_date = ?'); values.push(updates.dueDate); }\n if (updates.metadata !== undefined) { setClauses.push('metadata = ?'); values.push(JSON.stringify(updates.metadata)); }\n if (updates.parentId !== undefined) { setClauses.push('parent_id = ?'); values.push(updates.parentId); }\n if (updates.sourceId !== undefined) { setClauses.push('source_id = ?'); values.push(updates.sourceId); }\n if (updates.context !== undefined) {\n setClauses.push('context = ?'); values.push(updates.context === null ? null : JSON.stringify(updates.context));\n }\n if (updates.ownerType !== undefined) { setClauses.push('owner_type = ?'); values.push(updates.ownerType); }\n if (updates.ownerId !== undefined) { setClauses.push('owner_id = ?'); values.push(updates.ownerId); }\n if (updates.requireReview !== undefined) { setClauses.push('require_review = ?'); values.push(updates.requireReview ? 1 : 0); }\n if (updates.dependencies !== undefined) { setClauses.push('dependencies = ?'); values.push(JSON.stringify(updates.dependencies)); }\n if (updates.result !== undefined) { setClauses.push('result = ?'); values.push(updates.result); }\n if (updates.failureReason !== undefined) { setClauses.push('failure_reason = ?'); values.push(updates.failureReason); }\n if (updates.workspaceId !== undefined) { setClauses.push('workspace_id = ?'); values.push(updates.workspaceId); }\n if (updates.projectId !== undefined) { setClauses.push('project_id = ?'); values.push(updates.projectId); }\n if (updates.files !== undefined) { setClauses.push('files = ?'); values.push(JSON.stringify(updates.files)); }\n\n values.push(tenantId, id, MAX_CANONICAL_TASK_TIME, ...expectedStatuses);\n const result = this.db.prepare(\n `UPDATE lt_tasks SET ${setClauses.join(', ')} WHERE tenant_id = ? AND id = ? AND updated_at <> ? AND status IN (${expectedStatuses.map(() => \"?\").join(\", \")})`,\n ).run(...values);\n if (result.changes === 0) return null;\n return this.getById(tenantId, id);\n }\n\n /** Atomically update a task only when status and updatedAt match a read snapshot. */\n async updateIfStatusAndUpdatedAt(\n tenantId: string,\n id: string,\n updates: UpdateTaskRequest,\n expectedStatuses: TaskItem[\"status\"][],\n expectedUpdatedAt: Date | string,\n ): Promise<TaskItem | null> {\n if (expectedStatuses.length === 0) return null;\n const expectedIso = new Date(expectedUpdatedAt).toISOString();\n if (expectedIso === MAX_CANONICAL_TASK_TIME) return null;\n const setClauses: string[] = [\"updated_at = ?\"];\n const values: unknown[] = [nextISO(expectedIso)];\n if (updates.title !== undefined) { setClauses.push('title = ?'); values.push(updates.title); }\n if (updates.description !== undefined) { setClauses.push('description = ?'); values.push(updates.description); }\n if (updates.status !== undefined) { setClauses.push('status = ?'); values.push(updates.status); }\n if (updates.priority !== undefined) { setClauses.push('priority = ?'); values.push(updates.priority); }\n if (updates.dueDate !== undefined) { setClauses.push('due_date = ?'); values.push(updates.dueDate); }\n if (updates.metadata !== undefined) { setClauses.push('metadata = ?'); values.push(JSON.stringify(updates.metadata)); }\n if (updates.parentId !== undefined) { setClauses.push('parent_id = ?'); values.push(updates.parentId); }\n if (updates.sourceId !== undefined) { setClauses.push('source_id = ?'); values.push(updates.sourceId); }\n if (updates.context !== undefined) {\n setClauses.push('context = ?'); values.push(updates.context === null ? null : JSON.stringify(updates.context));\n }\n if (updates.ownerType !== undefined) { setClauses.push('owner_type = ?'); values.push(updates.ownerType); }\n if (updates.ownerId !== undefined) { setClauses.push('owner_id = ?'); values.push(updates.ownerId); }\n if (updates.requireReview !== undefined) { setClauses.push('require_review = ?'); values.push(updates.requireReview ? 1 : 0); }\n if (updates.dependencies !== undefined) { setClauses.push('dependencies = ?'); values.push(JSON.stringify(updates.dependencies)); }\n if (updates.result !== undefined) { setClauses.push('result = ?'); values.push(updates.result); }\n if (updates.failureReason !== undefined) { setClauses.push('failure_reason = ?'); values.push(updates.failureReason); }\n if (updates.workspaceId !== undefined) { setClauses.push('workspace_id = ?'); values.push(updates.workspaceId); }\n if (updates.projectId !== undefined) { setClauses.push('project_id = ?'); values.push(updates.projectId); }\n if (updates.files !== undefined) { setClauses.push('files = ?'); values.push(JSON.stringify(updates.files)); }\n\n values.push(tenantId, id, ...expectedStatuses, expectedIso);\n const result = this.db.prepare(\n `UPDATE lt_tasks SET ${setClauses.join(', ')} WHERE tenant_id = ? AND id = ? AND status IN (${expectedStatuses.map(() => \"?\").join(\", \")}) AND updated_at = ?`,\n ).run(...values);\n if (result.changes === 0) return null;\n return this.getById(tenantId, id);\n }\n\n /** Atomically update only while status, timestamp, owner, and Project scope match. */\n async updateIfSnapshot(\n tenantId: string, id: string, updates: UpdateTaskRequest, snapshot: TaskMutationSnapshot,\n ): Promise<TaskItem | null> {\n const expectedIso = new Date(snapshot.updatedAt).toISOString();\n if (expectedIso === MAX_CANONICAL_TASK_TIME) return null;\n const setClauses = [\"updated_at = ?\"];\n const values: unknown[] = [nextISO(expectedIso)];\n const fields: Array<[keyof UpdateTaskRequest, string, boolean?]> = [\n [\"title\", \"title\"], [\"description\", \"description\"], [\"status\", \"status\"], [\"priority\", \"priority\"],\n [\"dueDate\", \"due_date\"], [\"metadata\", \"metadata\", true], [\"parentId\", \"parent_id\"],\n [\"sourceId\", \"source_id\"], [\"context\", \"context\", true], [\"ownerType\", \"owner_type\"],\n [\"ownerId\", \"owner_id\"], [\"requireReview\", \"require_review\"], [\"dependencies\", \"dependencies\", true],\n [\"result\", \"result\"], [\"failureReason\", \"failure_reason\"], [\"workspaceId\", \"workspace_id\"],\n [\"projectId\", \"project_id\"], [\"files\", \"files\", true],\n ];\n for (const [field, column, json] of fields) {\n const value = updates[field];\n if (value === undefined) continue;\n setClauses.push(`${column} = ?`);\n values.push(json && value !== null ? JSON.stringify(value) : field === \"requireReview\" ? (value ? 1 : 0) : value);\n }\n values.push(tenantId, id, snapshot.status, expectedIso, snapshot.ownerType, snapshot.ownerId,\n snapshot.workspaceId, snapshot.projectId);\n const result = this.db.prepare(\n `UPDATE lt_tasks SET ${setClauses.join(\", \")} WHERE tenant_id = ? AND id = ? AND status = ?\n AND updated_at = ? AND owner_type = ? AND owner_id = ? AND workspace_id IS ? AND project_id IS ?`,\n ).run(...values);\n return result.changes === 0 ? null : this.getById(tenantId, id);\n }\n\n /** Atomically update a child only when both child and parent snapshots match. */\n async updateIfStatusUpdatedAtAndParentUpdatedAt(\n tenantId: string,\n id: string,\n updates: UpdateTaskRequest,\n expectedStatuses: TaskItem[\"status\"][],\n expectedUpdatedAt: Date | string,\n parentId: string,\n expectedParentUpdatedAt: Date | string,\n ): Promise<TaskItem | null> {\n if (expectedStatuses.length === 0) return null;\n const expectedIso = new Date(expectedUpdatedAt).toISOString();\n if (expectedIso === MAX_CANONICAL_TASK_TIME) return null;\n const parentExpectedIso = new Date(expectedParentUpdatedAt).toISOString();\n const setClauses: string[] = [\"updated_at = ?\"];\n const values: unknown[] = [nextISO(expectedIso)];\n if (updates.title !== undefined) { setClauses.push('title = ?'); values.push(updates.title); }\n if (updates.description !== undefined) { setClauses.push('description = ?'); values.push(updates.description); }\n if (updates.status !== undefined) { setClauses.push('status = ?'); values.push(updates.status); }\n if (updates.priority !== undefined) { setClauses.push('priority = ?'); values.push(updates.priority); }\n if (updates.dueDate !== undefined) { setClauses.push('due_date = ?'); values.push(updates.dueDate); }\n if (updates.metadata !== undefined) { setClauses.push('metadata = ?'); values.push(JSON.stringify(updates.metadata)); }\n if (updates.parentId !== undefined) { setClauses.push('parent_id = ?'); values.push(updates.parentId); }\n if (updates.sourceId !== undefined) { setClauses.push('source_id = ?'); values.push(updates.sourceId); }\n if (updates.context !== undefined) {\n setClauses.push('context = ?'); values.push(updates.context === null ? null : JSON.stringify(updates.context));\n }\n if (updates.ownerType !== undefined) { setClauses.push('owner_type = ?'); values.push(updates.ownerType); }\n if (updates.ownerId !== undefined) { setClauses.push('owner_id = ?'); values.push(updates.ownerId); }\n if (updates.requireReview !== undefined) { setClauses.push('require_review = ?'); values.push(updates.requireReview ? 1 : 0); }\n if (updates.dependencies !== undefined) { setClauses.push('dependencies = ?'); values.push(JSON.stringify(updates.dependencies)); }\n if (updates.result !== undefined) { setClauses.push('result = ?'); values.push(updates.result); }\n if (updates.failureReason !== undefined) { setClauses.push('failure_reason = ?'); values.push(updates.failureReason); }\n if (updates.workspaceId !== undefined) { setClauses.push('workspace_id = ?'); values.push(updates.workspaceId); }\n if (updates.projectId !== undefined) { setClauses.push('project_id = ?'); values.push(updates.projectId); }\n if (updates.files !== undefined) { setClauses.push('files = ?'); values.push(JSON.stringify(updates.files)); }\n\n values.push(tenantId, id, ...expectedStatuses, expectedIso, parentId, parentExpectedIso);\n const result = this.db.prepare(\n `UPDATE lt_tasks AS child SET ${setClauses.join(', ')}\n WHERE tenant_id = ? AND id = ?\n AND status IN (${expectedStatuses.map(() => \"?\").join(\", \")})\n AND updated_at = ?\n AND EXISTS (\n SELECT 1 FROM lt_tasks AS parent\n WHERE parent.tenant_id = child.tenant_id AND parent.id = ? AND parent.updated_at = ?\n )`,\n ).run(...values);\n if (result.changes === 0) return null;\n return this.getById(tenantId, id);\n }\n\n async delete(tenantId: string, id: string): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_tasks WHERE tenant_id = ? AND id = ?`,\n ).run(tenantId, id);\n return result.changes > 0;\n }\n\n /** Atomically delete only while status, timestamp, owner, and Project scope match. */\n async deleteIfSnapshot(tenantId: string, id: string, snapshot: TaskMutationSnapshot): Promise<boolean> {\n const result = this.db.prepare(\n `DELETE FROM lt_tasks WHERE tenant_id = ? AND id = ? AND status = ? AND updated_at = ?\n AND owner_type = ? AND owner_id = ? AND workspace_id IS ? AND project_id IS ?`,\n ).run(tenantId, id, snapshot.status, new Date(snapshot.updatedAt).toISOString(), snapshot.ownerType,\n snapshot.ownerId, snapshot.workspaceId, snapshot.projectId);\n return result.changes > 0;\n }\n}\n","/**\n * Local SQLite implementation of TaskWorkItemStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n TaskWorkItemStore,\n TaskWorkItem,\n CreateWorkItemRequest,\n CreateWorkItemIfAbsentRequest,\n TaskWorkItemListFilter,\n ProjectLifecycleEventQuery,\n TaskMutationSnapshot,\n} from \"@axiom-lattice/protocols\";\nimport { MAX_PENDING_EXECUTION_RESULTS_LIMIT } from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\nimport { v4 as uuid } from \"uuid\";\n\nconst PROJECT_LIFECYCLE_ACTIONS: ReadonlySet<string> = new Set([\n \"in_progress\", \"interrupted\", \"failed\", \"completed\", \"cancelled\", \"reassigned\",\n]);\n\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS lt_task_work_items (\n id TEXT NOT NULL,\n tenant_id TEXT NOT NULL,\n task_id TEXT NOT NULL,\n action TEXT NOT NULL,\n actor TEXT NOT NULL,\n thread_id TEXT,\n summary TEXT,\n detail TEXT,\n attempt INTEGER,\n workspace_id TEXT,\n project_id TEXT,\n created_at TEXT NOT NULL,\n PRIMARY KEY (tenant_id, id)\n);\n`;\n\ninterface WorkItemRow {\n id: string;\n tenant_id: string;\n task_id: string;\n action: string;\n actor: string;\n thread_id: string | null;\n summary: string | null;\n detail: string | null;\n attempt: number | null;\n workspace_id: string | null;\n project_id: string | null;\n event_key: string | null;\n created_at: string;\n}\n\nfunction parseDetail(raw: string | null): Record<string, unknown> | undefined {\n if (!raw) return undefined;\n try {\n const parsed: unknown = JSON.parse(raw);\n return parsed !== null && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? parsed as Record<string, unknown>\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction mapRowToWorkItem(row: WorkItemRow): TaskWorkItem {\n return {\n id: row.id,\n tenantId: row.tenant_id,\n taskId: row.task_id,\n action: row.action,\n actor: row.actor,\n threadId: row.thread_id ?? undefined,\n summary: row.summary ?? undefined,\n detail: parseDetail(row.detail),\n attempt: row.attempt ?? undefined,\n workspaceId: row.workspace_id ?? undefined,\n projectId: row.project_id ?? undefined,\n eventKey: row.event_key ?? undefined,\n createdAt: parseISO(row.created_at),\n };\n}\n\nfunction assertAndCloneProjectLifecycleEvent(item: TaskWorkItem): TaskWorkItem {\n let milliseconds: number;\n try { milliseconds = Date.prototype.getTime.call(item.createdAt) as number; }\n catch { throw new Error(\"Invalid project lifecycle event row\"); }\n if (!Number.isFinite(milliseconds) || typeof item.id !== \"string\" || item.id.length === 0\n || typeof item.eventKey !== \"string\" || item.eventKey.length === 0) {\n throw new Error(\"Invalid project lifecycle event row\");\n }\n return { ...item, createdAt: new Date(milliseconds) };\n}\n\nfunction assertLifecyclePage(query: ProjectLifecycleEventQuery): number | null {\n if (!Number.isSafeInteger(query.limit) || query.limit < 1 || query.limit > 100\n || query.actions.length === 0\n || query.actions.some((action) => !PROJECT_LIFECYCLE_ACTIONS.has(action))) {\n throw new RangeError(\"Invalid project lifecycle event page\");\n }\n if (!query.before) return null;\n let milliseconds: number;\n try { milliseconds = Date.prototype.getTime.call(query.before.createdAt) as number; }\n catch { throw new RangeError(\"Invalid project lifecycle event cursor\"); }\n if (!Number.isFinite(milliseconds) || typeof query.before.id !== \"string\" || query.before.id.length === 0) {\n throw new RangeError(\"Invalid project lifecycle event cursor\");\n }\n return milliseconds;\n}\n\nexport class LocalTaskWorkItemStore implements TaskWorkItemStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n this.ensureColumn(\"lt_task_work_items\", \"workspace_id\", \"workspace_id TEXT\");\n this.ensureColumn(\"lt_task_work_items\", \"project_id\", \"project_id TEXT\");\n this.ensureColumn(\"lt_task_work_items\", \"event_key\", \"event_key TEXT\");\n this.db.exec(`CREATE UNIQUE INDEX IF NOT EXISTS idx_task_work_items_event_key\n ON lt_task_work_items (tenant_id, task_id, event_key);`);\n this.db.exec(`CREATE INDEX IF NOT EXISTS idx_task_work_items_pending_order\n ON lt_task_work_items (tenant_id, task_id, action, created_at DESC, id DESC);`);\n this.db.exec(`CREATE INDEX IF NOT EXISTS idx_task_work_items_reconciled_result\n ON lt_task_work_items (tenant_id, task_id, json_extract(detail, '$.executionResultId'))\n WHERE action = 'execution_reconciled';`);\n this.db.exec(`CREATE INDEX IF NOT EXISTS idx_task_work_items_project_lifecycle\n ON lt_task_work_items (tenant_id, workspace_id, project_id, created_at DESC, id DESC)\n WHERE event_key IS NOT NULL;`);\n }\n\n /** Add a column if it does not exist (SQLite version compatible). */\n private ensureColumn(table: string, column: string, ddl: string): void {\n const cols = this.db.prepare(`PRAGMA table_info(${table})`).all() as Array<{ name: string }>;\n if (!cols.some((c) => c.name === column)) {\n this.db.exec(`ALTER TABLE ${table} ADD COLUMN ${ddl}`);\n }\n }\n\n async create(params: CreateWorkItemRequest): Promise<TaskWorkItem> {\n const id = uuid();\n const now = nowISO();\n\n this.db.prepare(\n `INSERT INTO lt_task_work_items (id, tenant_id, task_id, action, actor, thread_id, summary, detail, attempt, workspace_id, project_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n id, params.tenantId, params.taskId, params.action, params.actor,\n params.threadId || null, params.summary || null,\n params.detail ? JSON.stringify(params.detail) : null,\n params.attempt ?? null,\n params.workspaceId || null,\n params.projectId || null,\n now,\n );\n\n const row = this.db.prepare(\n `SELECT * FROM lt_task_work_items WHERE tenant_id = ? AND id = ?`,\n ).get(params.tenantId, id) as unknown as WorkItemRow | undefined;\n return mapRowToWorkItem(row!);\n }\n\n /** Atomically inserts a work item by selecting one exact task snapshot. */\n async createIfTaskSnapshot(\n params: CreateWorkItemRequest,\n snapshot: TaskMutationSnapshot,\n ): Promise<TaskWorkItem | null> {\n const id = uuid();\n const result = this.db.prepare(\n `INSERT INTO lt_task_work_items\n (id, tenant_id, task_id, action, actor, thread_id, summary, detail, attempt, workspace_id, project_id, created_at)\n SELECT ?, task.tenant_id, task.id, ?, ?, ?, ?, ?, ?, task.workspace_id, task.project_id, ?\n FROM lt_tasks AS task\n WHERE task.tenant_id = ? AND task.id = ? AND task.status = ? AND task.updated_at = ?\n AND task.owner_type = ? AND task.owner_id = ? AND task.workspace_id IS ? AND task.project_id IS ?\n AND ? IS task.workspace_id AND ? IS task.project_id`,\n ).run(id, params.action, params.actor, params.threadId || null, params.summary || null,\n params.detail ? JSON.stringify(params.detail) : null, params.attempt ?? null, nowISO(),\n params.tenantId, params.taskId, snapshot.status, new Date(snapshot.updatedAt).toISOString(),\n snapshot.ownerType, snapshot.ownerId, snapshot.workspaceId, snapshot.projectId,\n params.workspaceId, params.projectId);\n if (result.changes === 0) return null;\n const row = this.db.prepare(`SELECT * FROM lt_task_work_items WHERE tenant_id = ? AND id = ?`)\n .get(params.tenantId, id) as unknown as WorkItemRow | undefined;\n return row ? mapRowToWorkItem(row) : null;\n }\n\n /** Find an event by its tenant- and task-scoped key without pagination. */\n async findByEventKey(tenantId: string, taskId: string, eventKey: string): Promise<TaskWorkItem | null> {\n const row = this.db.prepare(\n `SELECT * FROM lt_task_work_items WHERE tenant_id = ? AND task_id = ? AND event_key = ?`,\n ).get(tenantId, taskId, eventKey) as unknown as WorkItemRow | undefined;\n return row ? mapRowToWorkItem(row) : null;\n }\n\n /** Atomically return an existing event or create it once. */\n async createIfAbsentByEventKey(params: CreateWorkItemIfAbsentRequest): Promise<TaskWorkItem> {\n const id = uuid();\n this.db.prepare(\n `INSERT INTO lt_task_work_items (id, tenant_id, task_id, action, actor, thread_id, summary, detail, attempt, workspace_id, project_id, event_key, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT (tenant_id, task_id, event_key) DO NOTHING`,\n ).run(\n id, params.tenantId, params.taskId, params.action, params.actor,\n params.threadId || null, params.summary || null,\n params.detail ? JSON.stringify(params.detail) : null,\n params.attempt ?? null, params.workspaceId || null, params.projectId || null,\n params.eventKey, nowISO(),\n );\n const item = await this.findByEventKey(params.tenantId, params.taskId, params.eventKey);\n if (!item) throw new Error(\"Task work item insert did not return a row\");\n return item;\n }\n\n async list(filter: TaskWorkItemListFilter): Promise<TaskWorkItem[]> {\n const conditions: string[] = ['tenant_id = ?', 'task_id = ?'];\n const params: unknown[] = [filter.tenantId, filter.taskId];\n\n if (filter.action) { conditions.push('action = ?'); params.push(filter.action); }\n if (filter.workspaceId) { conditions.push('workspace_id = ?'); params.push(filter.workspaceId); }\n if (filter.projectId) { conditions.push('project_id = ?'); params.push(filter.projectId); }\n\n const where = conditions.join(' AND ');\n const limit = filter.limit || 100;\n const offset = filter.offset || 0;\n const order = filter.order === 'asc' ? 'ASC' : 'DESC';\n\n const rows = this.db.prepare(\n `SELECT * FROM lt_task_work_items WHERE ${where} ORDER BY created_at ${order}, id ${order} LIMIT ? OFFSET ?`,\n ).all(...params, limit, offset) as unknown as WorkItemRow[];\n return rows.map(mapRowToWorkItem);\n }\n\n /** List pending execution results using one bounded SQLite anti-join query. */\n async listPendingExecutionResults(params: {\n tenantId: string;\n taskId: string;\n limit: number;\n }): Promise<TaskWorkItem[]> {\n if (!Number.isSafeInteger(params.limit)\n || params.limit < 0\n || params.limit > MAX_PENDING_EXECUTION_RESULTS_LIMIT) {\n const error = new RangeError(`limit must be a safe integer between 0 and ${MAX_PENDING_EXECUTION_RESULTS_LIMIT}`) as RangeError & {\n code: \"INVALID_LIMIT\";\n };\n error.code = \"INVALID_LIMIT\";\n throw error;\n }\n if (params.limit === 0) return [];\n const rows = this.db.prepare(\n `SELECT result.*\n FROM lt_task_work_items AS result\n WHERE result.tenant_id = ?\n AND result.task_id = ?\n AND result.action = 'execution_result'\n AND substr(result.event_key, 1, 17) = 'execution-result:'\n AND length(result.event_key) > 17\n AND result.event_key NOT GLOB '*[^A-Za-z0-9._:-]*'\n AND NOT EXISTS (\n SELECT 1\n FROM lt_task_work_items AS reconciled\n WHERE reconciled.tenant_id = result.tenant_id\n AND reconciled.task_id = result.task_id\n AND reconciled.action = 'execution_reconciled'\n AND json_extract(reconciled.detail, '$.executionResultId') = result.event_key\n )\n ORDER BY result.created_at DESC, result.id DESC\n LIMIT ?`,\n ).all(params.tenantId, params.taskId, params.limit) as unknown as WorkItemRow[];\n return rows.map(mapRowToWorkItem);\n }\n\n /** Lists canonical project lifecycle events with an exclusive cursor. */\n async listProjectLifecycleEvents(query: ProjectLifecycleEventQuery): Promise<TaskWorkItem[]> {\n const cursorMilliseconds = assertLifecyclePage(query);\n const cursor = cursorMilliseconds === null ? null : new Date(cursorMilliseconds).toISOString();\n const rows = this.db.prepare(\n `SELECT * FROM lt_task_work_items\n WHERE tenant_id = ? AND workspace_id = ? AND project_id = ?\n AND action IN (${query.actions.map(() => \"?\").join(\", \")})\n AND event_key IS NOT NULL AND event_key <> ''\n AND (? IS NULL OR created_at < ? OR (created_at = ? AND id < ?))\n ORDER BY created_at DESC, id DESC LIMIT ?`,\n ).all(query.tenantId, query.workspaceId, query.projectId, ...query.actions,\n cursor, cursor, cursor, query.before?.id ?? null, query.limit) as unknown as WorkItemRow[];\n return rows.map(mapRowToWorkItem).map(assertAndCloneProjectLifecycleEvent);\n }\n}\n","import { randomUUID } from \"crypto\";\nimport type { CapabilityBundle, CapabilityBundleDeleteResult, CapabilityBundleStore, InternalCreateCapabilityBundleInput, InternalUpdateCapabilityBundleInput } from \"@axiom-lattice/protocols\";\nimport { DatabaseWrapper, ensureTable, nowISO, parseISO } from \"../database\";\n\nconst DDL = `CREATE TABLE IF NOT EXISTS lt_capability_bundles (id TEXT NOT NULL, tenant_id TEXT NOT NULL, bundle_key TEXT NOT NULL, name TEXT NOT NULL, description TEXT, capabilities TEXT NOT NULL DEFAULT '[]', created_at TEXT NOT NULL, updated_at TEXT NOT NULL, PRIMARY KEY (tenant_id, id), UNIQUE (tenant_id, bundle_key)); CREATE INDEX IF NOT EXISTS idx_lt_capability_bundles_tenant ON lt_capability_bundles(tenant_id);`;\ntype Row = { id: string; tenant_id: string; bundle_key: string; name: string; description: string | null; capabilities: string; created_at: string; updated_at: string };\nconst duplicateMessage = \"Capability bundle key already exists for tenant\";\nfunction map(row: Row): CapabilityBundle { return { id: row.id, tenantId: row.tenant_id, key: row.bundle_key, name: row.name, description: row.description ?? undefined, capabilities: JSON.parse(row.capabilities), createdAt: parseISO(row.created_at).toISOString(), updatedAt: parseISO(row.updated_at).toISOString() }; }\nfunction isConstraint(error: unknown): boolean { return error instanceof Error && /UNIQUE constraint failed/.test(error.message); }\nfunction nextTimestamp(previous?: string): string { const now = Date.now(); const previousTime = previous ? Date.parse(previous) : Number.NaN; return new Date(Math.max(now, Number.isFinite(previousTime) ? previousTime + 1 : now)).toISOString(); }\n\n/**\n * Persists tenant-scoped capability bundles in a shared local sql.js database.\n *\n * The constructor creates the required table and index idempotently. Database\n * lifecycle remains owned by the caller through `initDatabase` and\n * `closeDatabase`.\n *\n * @example\n * ```ts\n * const db = await initDatabase({ dbPath: \"./lattice.db\" });\n * const store = new LocalCapabilityBundleStore(db);\n * const bundles = await store.listByTenant(\"tenant-1\");\n * ```\n */\nexport class LocalCapabilityBundleStore implements CapabilityBundleStore {\n /**\n * Creates a capability bundle store over an initialized sql.js database.\n *\n * @param db - Shared local database wrapper used for persistence.\n */\n constructor(private readonly db: DatabaseWrapper) { ensureTable(db, DDL); }\n async listByTenant(tenantId: string): Promise<CapabilityBundle[]> { return (this.db.prepare(\"SELECT * FROM lt_capability_bundles WHERE tenant_id = ? ORDER BY created_at\").all(tenantId) as unknown as Row[]).map(map); }\n async getById(tenantId: string, id: string): Promise<CapabilityBundle | null> { const row = this.db.prepare(\"SELECT * FROM lt_capability_bundles WHERE tenant_id = ? AND id = ?\").get(tenantId, id) as unknown as Row | undefined; return row ? map(row) : null; }\n async getManyByIds(tenantId: string, ids: string[]): Promise<CapabilityBundle[]> { return ids.flatMap((id) => { const row = this.db.prepare(\"SELECT * FROM lt_capability_bundles WHERE tenant_id = ? AND id = ?\").get(tenantId, id) as unknown as Row | undefined; return row ? [map(row)] : []; }); }\n async create(tenantId: string, input: InternalCreateCapabilityBundleInput): Promise<CapabilityBundle> { const now = nextTimestamp(); const id = randomUUID(); try { this.db.prepare(\"INSERT INTO lt_capability_bundles (id, tenant_id, bundle_key, name, description, capabilities, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\").run(id, tenantId, input.key, input.name, input.description ?? null, JSON.stringify(input.capabilities), now, now); } catch (error) { if (isConstraint(error)) throw new Error(duplicateMessage); throw error; } return (await this.getById(tenantId, id)) as CapabilityBundle; }\n async update(tenantId: string, id: string, input: InternalUpdateCapabilityBundleInput): Promise<CapabilityBundle | { status: \"conflict\" } | null> { const existing = await this.getById(tenantId, id); if (!existing) return null; if (input.expectedUpdatedAt !== existing.updatedAt) return { status: \"conflict\" }; const fields: string[] = []; const values: unknown[] = []; const add = (field: string, value: unknown): void => { fields.push(`${field} = ?`); values.push(value); }; if (input.name !== undefined) add(\"name\", input.name); if (Object.prototype.hasOwnProperty.call(input, \"description\")) add(\"description\", input.description ?? null); if (input.capabilities !== undefined) add(\"capabilities\", JSON.stringify(input.capabilities)); if (!fields.length) return existing; const now = nextTimestamp(existing.updatedAt); fields.push(\"updated_at = ?\"); values.push(now, tenantId, id); try { const result = this.db.prepare(`UPDATE lt_capability_bundles SET ${fields.join(\", \")} WHERE tenant_id = ? AND id = ? AND updated_at = ?`).run(...values, input.expectedUpdatedAt); if (result.changes === 0) return { status: \"conflict\" }; } catch (error) { if (isConstraint(error)) throw new Error(duplicateMessage); throw error; } return this.getById(tenantId, id); }\n async deleteIfUnreferenced(tenantId: string, id: string): Promise<CapabilityBundleDeleteResult> {\n const result = this.db.prepare(\n `DELETE FROM lt_capability_bundles\n WHERE tenant_id = ? AND id = ?\n AND NOT EXISTS (\n SELECT 1 FROM lt_projects\n WHERE tenant_id = ?\n AND json_type(config, '$.capabilityBundleIds') = 'array'\n AND EXISTS (SELECT 1 FROM json_each(config, '$.capabilityBundleIds') WHERE value = ?)\n )`,\n ).run(tenantId, id, tenantId, id);\n if (result.changes > 0) return \"deleted\";\n if (await this.getById(tenantId, id)) return \"in_use\";\n return \"not_found\";\n }\n}\n","/**\n * InMemoryConversationStore\n *\n * In-memory implementation of IConversationStore. Maps application\n * conversation IDs to A2A task IDs. Not persisted — for production\n * use, swap with a PG-backed implementation.\n */\n\nimport type {\n IConversationStore,\n ConversationRecord,\n CreateConversationInput,\n} from \"@axiom-lattice/protocols\";\n\nconst isoNow = (): string => new Date().toISOString();\n\nexport class InMemoryConversationStore implements IConversationStore {\n private store = new Map<string, ConversationRecord>();\n\n async getConversation(conversationId: string): Promise<ConversationRecord | null> {\n return this.store.get(conversationId) ?? null;\n }\n\n async createConversation(input: CreateConversationInput): Promise<ConversationRecord> {\n const now = isoNow();\n const record: ConversationRecord = {\n conversationId: input.conversationId,\n tenantId: input.tenantId,\n taskIds: [],\n contextId: input.contextId,\n metadata: input.metadata,\n createdAt: now,\n updatedAt: now,\n };\n this.store.set(input.conversationId, record);\n return record;\n }\n\n async addTaskToConversation(conversationId: string, taskId: string): Promise<ConversationRecord> {\n const record = this.store.get(conversationId);\n if (!record) {\n throw new Error(`Conversation not found: ${conversationId}`);\n }\n record.taskIds.push(taskId);\n record.updatedAt = isoNow();\n return record;\n }\n\n async deleteConversation(conversationId: string): Promise<void> {\n this.store.delete(conversationId);\n }\n}\n"],"mappings":"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","names":["rows","initSqlJs","ddl","rows","rows","DDL","rows","DDL","rows","DDL","rows","ddl","columns","columns","mapRow","rows","columns","mapRow","role","columns","mapRow","rows","columns","mapRow","DDL","rows","DDL","rows","DDL","rows","role","DDL","rows","DDL","rows","uuid","DDL","rows","mapRowToEntry","import_core","DDL","rows","mapRowToEntry","import_core","DDL","ddl","rows","mapRowToEntry","DDL","rows","DDL","parseJson","ddl","rows","import_protocols","import_crypto","import_protocols","DDL","rows","DDL","mapRow","rows","import_core","import_crypto","DDL","ddl","rows","record","row","map","import_crypto","DDL","rows","record","import_protocols","import_crypto","DDL","columns","rows","DDL","rows","DDL","rows","import_protocols","import_crypto","DDL","mapRowToTask","ddl","rows","import_protocols","import_uuid","DDL","ddl","uuid","rows","import_crypto","DDL","record"]}