@axiom-lattice/local-stores 1.0.1
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/.turbo/turbo-build.log +20 -0
- package/CHANGELOG.md +10 -0
- package/LICENSE +201 -0
- package/dist/index.d.mts +547 -0
- package/dist/index.d.ts +547 -0
- package/dist/index.js +3372 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +3308 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +42 -0
- package/src/createLocalStoreConfig.ts +81 -0
- package/src/database.ts +259 -0
- package/src/index.ts +44 -0
- package/src/stores/LocalA2AApiKeyStore.ts +177 -0
- package/src/stores/LocalAssistantStore.ts +149 -0
- package/src/stores/LocalChannelBindingStore.ts +204 -0
- package/src/stores/LocalChannelInstallationStore.ts +170 -0
- package/src/stores/LocalDatabaseConfigStore.ts +183 -0
- package/src/stores/LocalEvalStore.ts +510 -0
- package/src/stores/LocalMcpServerConfigStore.ts +223 -0
- package/src/stores/LocalMetricsServerConfigStore.ts +162 -0
- package/src/stores/LocalProjectStore.ts +150 -0
- package/src/stores/LocalScheduleStorage.ts +287 -0
- package/src/stores/LocalSkillStore.ts +188 -0
- package/src/stores/LocalTenantStore.ts +128 -0
- package/src/stores/LocalThreadMessageQueueStore.ts +172 -0
- package/src/stores/LocalThreadStore.ts +149 -0
- package/src/stores/LocalUserStore.ts +136 -0
- package/src/stores/LocalUserTenantLinkStore.ts +135 -0
- package/src/stores/LocalWorkflowTrackingStore.ts +299 -0
- package/src/stores/LocalWorkspaceStore.ts +143 -0
- package/tsconfig.json +23 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/database.ts","../src/createLocalStoreConfig.ts","../src/stores/LocalThreadStore.ts","../src/stores/LocalAssistantStore.ts","../src/stores/LocalWorkspaceStore.ts","../src/stores/LocalProjectStore.ts","../src/stores/LocalUserStore.ts","../src/stores/LocalTenantStore.ts","../src/stores/LocalUserTenantLinkStore.ts","../src/stores/LocalDatabaseConfigStore.ts","../src/stores/LocalMetricsServerConfigStore.ts","../src/stores/LocalMcpServerConfigStore.ts","../src/stores/LocalWorkflowTrackingStore.ts","../src/stores/LocalEvalStore.ts","../src/stores/LocalChannelBindingStore.ts","../src/stores/LocalChannelInstallationStore.ts","../src/stores/LocalA2AApiKeyStore.ts","../src/stores/LocalThreadMessageQueueStore.ts","../src/stores/LocalSkillStore.ts","../src/stores/LocalScheduleStorage.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 { 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 { LocalUserStore } from \"./stores/LocalUserStore\";\nexport { LocalTenantStore } from \"./stores/LocalTenantStore\";\nexport { LocalUserTenantLinkStore } from \"./stores/LocalUserTenantLinkStore\";\nexport { LocalDatabaseConfigStore } from \"./stores/LocalDatabaseConfigStore\";\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\";\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 this.save();\n return new RunResult(this.db);\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 if (this.parent) {\n this.parent.save();\n }\n return new RunResult(this.db);\n }\n}\n\n/**\n * Result of a run operation.\n */\nexport class RunResult {\n private db: SqlJsDatabase;\n\n constructor(db: SqlJsDatabase) {\n this.db = db;\n }\n\n /** Number of rows modified by the last INSERT/UPDATE/DELETE. */\n get changes(): number {\n return this.db.getRowsModified();\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 * 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 { LocalUserStore } from \"./stores/LocalUserStore\";\nimport { LocalTenantStore } from \"./stores/LocalTenantStore\";\nimport { LocalUserTenantLinkStore } from \"./stores/LocalUserTenantLinkStore\";\nimport { LocalDatabaseConfigStore } from \"./stores/LocalDatabaseConfigStore\";\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 { LocalThreadMessageQueueStore } from \"./stores/LocalThreadMessageQueueStore\";\nimport { LocalSkillStore } from \"./stores/LocalSkillStore\";\nimport { LocalScheduleStorage } from \"./stores/LocalScheduleStorage\";\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 user: new LocalUserStore(db),\n tenant: new LocalTenantStore(db),\n userTenantLink: new LocalUserTenantLinkStore(db),\n database: new LocalDatabaseConfigStore(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 threadMessageQueue: new LocalThreadMessageQueueStore(db),\n skill: new LocalSkillStore(db),\n schedule: new LocalScheduleStorage(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 { ensureTable, nowISO, parseISO } from \"../database\";\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 ensureTable(db, DDL);\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 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 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, 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 updated_at = excluded.updated_at`,\n ).run(id, tenantId, data.name, data.description || null, JSON.stringify(data.graphDefinition), now, now);\n\n return {\n id,\n tenantId,\n name: data.name,\n description: data.description,\n graphDefinition: data.graphDefinition,\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 (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\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 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 CreateProjectRequest,\n UpdateProjectRequest,\n} 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 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 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 }\n\n async getProjectsByWorkspace(tenantId: string, workspaceId: string): Promise<Project[]> {\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 const now = nowISO();\n\n this.db.prepare(\n `INSERT INTO lt_projects (id, tenant_id, workspace_id, name, description, config, 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 = excluded.config,\n updated_at = excluded.updated_at`,\n ).run(id, tenantId, workspaceId, data.name, data.description || null, data.config ? JSON.stringify(data.config) : null, now, now);\n\n return {\n id,\n tenantId,\n workspaceId,\n name: data.name,\n description: data.description,\n config: data.config,\n createdAt: parseISO(now),\n updatedAt: parseISO(now),\n };\n }\n\n async updateProject(\n tenantId: string,\n id: string,\n updates: UpdateProjectRequest,\n ): Promise<Project | null> {\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 = ?\");\n values.push(updates.config ? JSON.stringify(updates.config) : 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_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\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 createdAt: parseISO(row.created_at),\n updatedAt: parseISO(row.updated_at),\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 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 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 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} 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);\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 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`;\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 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 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, 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.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 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 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 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: JSON.parse(row.topology_edges || \"[]\"),\n totalEdges: row.total_edges,\n completedEdges: row.completed_edges,\n errorMessage: row.error_message || undefined,\n metadata: JSON.parse(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 edgeFrom: row.edge_from || undefined,\n edgeTo: row.edge_to || undefined,\n edgePurpose: row.edge_purpose || undefined,\n input: row.input ? JSON.parse(row.input) : undefined,\n output: row.output ? JSON.parse(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} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\nimport { randomUUID } from \"crypto\";\n\nconst 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 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 avg_score REAL NOT NULL DEFAULT 0,\n error 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 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 }\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 result = this.db.prepare(`DELETE FROM lt_eval_projects WHERE tenant_id = ? AND id = ?`).run(tenantId, id);\n return result.changes > 0;\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, 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 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 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, created_at)\n VALUES (?, ?, ?, 'running', ?, ?, 0, 0, 0, ?)`,\n ).run(actualId, projectId, tenantId, data.concurrency, data.totalCases, 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; 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.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, 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, 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 (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 // -------------------------------------------------------------------------\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 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 avgScore: (row.avg_score as number) ?? 0,\n error: row.error 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 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 type {\n Binding,\n BindingRegistry,\n CreateBindingInput,\n} from \"@axiom-lattice/protocols\";\nimport { ensureTable, nowISO, parseISO } from \"../database\";\nimport { randomUUID } from \"crypto\";\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);\nCREATE INDEX IF NOT EXISTS idx_lt_cb_resolve ON lt_channel_bindings(channel, sender_id, channel_installation_id, tenant_id);\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 }\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 this.db.prepare(\n `INSERT INTO lt_channel_bindings\n (id, channel, channel_installation_id, tenant_id, sender_id, agent_id,\n thread_mode, sender_display_name, sender_metadata, workspace_id, project_id, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n id, input.channel, input.channelInstallationId, input.tenantId,\n input.senderId, input.agentId, input.threadMode || \"fixed\",\n input.senderDisplayName || null,\n input.senderMetadata ? JSON.stringify(input.senderMetadata) : null,\n input.workspaceId || null, input.projectId || null,\n now, now,\n );\n\n return (await this.getById(id))!;\n }\n\n async update(id: string, patch: Partial<Binding>): Promise<Binding> {\n const existing = await this.getById(id);\n if (!existing) throw new Error(`Binding ${id} not found`);\n\n const updated = {\n channel: patch.channel ?? existing.channel,\n channelInstallationId: patch.channelInstallationId ?? existing.channelInstallationId,\n senderId: patch.senderId ?? existing.senderId,\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 channel = ?, channel_installation_id = ?, sender_id = ?, agent_id = ?,\n thread_id = ?, workspace_id = ?, project_id = ?, thread_mode = ?,\n sender_display_name = ?, sender_metadata = ?, enabled = ?, updated_at = ?\n WHERE id = ?`,\n ).run(\n updated.channel, updated.channelInstallationId, updated.senderId,\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,\n );\n\n return (await this.getById(id))!;\n }\n\n async delete(id: string): Promise<void> {\n this.db.prepare(`DELETE FROM lt_channel_bindings WHERE id = ?`).run(id);\n }\n\n async list(params: {\n channel?: string;\n agentId?: string;\n tenantId: string;\n channelInstallationId?: string;\n limit?: number;\n offset?: number;\n }): 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\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(bindings: CreateBindingInput[]): Promise<Binding[]> {\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({ tenantId: params.tenantId, limit: 10000, offset: 0 });\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","/**\n * Local SQLite implementation of ChannelInstallationStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n ChannelInstallationStore,\n ChannelInstallation,\n ChannelInstallationType,\n CreateChannelInstallationRequest,\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 createInstallation(\n tenantId: string,\n installationId: string,\n data: CreateChannelInstallationRequest,\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 ON CONFLICT(id) DO UPDATE SET\n channel = excluded.channel,\n name = excluded.name,\n config = excluded.config,\n enabled = excluded.enabled,\n fallback_agent_id = excluded.fallback_agent_id,\n reject_when_no_binding = excluded.reject_when_no_binding,\n updated_at = excluded.updated_at`,\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) 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(installationId);\n\n this.db.prepare(\n `UPDATE lt_channel_installations SET ${setClauses.join(\", \")} WHERE 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 A2AApiKeyStore,\n A2AApiKeyRecord,\n CreateA2AApiKeyInput,\n A2AApiKeyEntry,\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 workspace_id 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 | null;\n workspace_id: 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\nexport class LocalA2AApiKeyStore implements A2AApiKeyStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\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 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 key = generateApiKey();\n const now = nowISO();\n this.db.prepare(\n `INSERT INTO lt_a2a_api_keys (key_value, tenant_id, project_id, workspace_id, label, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n ).run(encrypt(key), input.tenantId, input.projectId || null, input.workspaceId || null, input.label || null, now, now);\n\n const lastId = this.db.prepare(`SELECT last_insert_rowid() as id`).get() as { id: number };\n\n const record: A2AApiKeyRecord = {\n id: String(lastId.id),\n key,\n tenantId: input.tenantId,\n projectId: input.projectId,\n workspaceId: input.workspaceId,\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 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 || undefined,\n workspaceId: row.workspace_id || undefined,\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 || undefined,\n workspaceId: row.workspace_id || undefined,\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 IMessageQueueStore.\n */\n\nimport { DatabaseWrapper } from \"../database\";\nimport type {\n IMessageQueueStore,\n PendingMessage,\n AddMessageParams,\n ThreadInfo,\n} from \"@axiom-lattice/core\";\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 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 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 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 created_at: string;\n}\n\nexport class LocalThreadMessageQueueStore implements IMessageQueueStore {\n private db: DatabaseWrapper;\n\n constructor(db: DatabaseWrapper) {\n this.db = db;\n ensureTable(db, DDL);\n }\n\n async addMessage(params: AddMessageParams): Promise<PendingMessage> {\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, message_content, message_type, sequence_order, priority, command, custom_run_config, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n id, params.threadId, params.tenantId, params.assistantId,\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 now,\n );\n\n return this.getById(id);\n }\n\n async addMessageAtHead(params: AddMessageParams): Promise<PendingMessage> {\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, message_content, message_type, sequence_order, priority, command, custom_run_config, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, 100, ?, ?, ?)`,\n ).run(\n id, params.threadId, params.tenantId!, params.assistantId!,\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 now,\n );\n\n return this.getById(id);\n }\n\n async getPendingMessages(threadId: string): Promise<PendingMessage[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_thread_message_queue WHERE thread_id = ? AND status = 'pending' ORDER BY priority DESC, sequence_order ASC`,\n ).all(threadId) as unknown as QueueRow[];\n return rows.map(rowToMessage);\n }\n\n async getProcessingMessages(threadId: string): Promise<PendingMessage[]> {\n const rows = this.db.prepare(\n `SELECT * FROM lt_thread_message_queue WHERE thread_id = ? AND status = 'processing' ORDER BY priority DESC, sequence_order ASC`,\n ).all(threadId) as unknown as QueueRow[];\n return rows.map(rowToMessage);\n }\n\n async getQueueSize(threadId: string): Promise<number> {\n const row = this.db.prepare(\n `SELECT COUNT(*) as count FROM lt_thread_message_queue WHERE thread_id = ? AND status = 'pending'`,\n ).get(threadId) as { count: number };\n return row.count;\n }\n\n async getThreadsWithPendingMessages(): Promise<ThreadInfo[]> {\n const rows = this.db.prepare(\n `SELECT DISTINCT tenant_id, assistant_id, thread_id FROM lt_thread_message_queue WHERE status IN ('pending', 'processing') ORDER BY thread_id`,\n ).all() as { tenant_id: string; assistant_id: string; thread_id: string }[];\n return rows.map((r) => ({\n tenantId: r.tenant_id,\n assistantId: r.assistant_id,\n threadId: r.thread_id,\n }));\n }\n\n async removeMessage(messageId: string): Promise<boolean> {\n const result = this.db.prepare(`DELETE FROM lt_thread_message_queue WHERE id = ?`).run(messageId);\n return result.changes > 0;\n }\n\n async clearMessages(threadId: string): Promise<void> {\n this.db.prepare(`DELETE FROM lt_thread_message_queue WHERE thread_id = ?`).run(threadId);\n }\n\n async markProcessing(messageId: string): Promise<void> {\n this.db.prepare(`UPDATE lt_thread_message_queue SET status = 'processing' WHERE id = ?`).run(messageId);\n }\n\n async resetProcessingToPending(threadId: string): Promise<number> {\n const result = this.db.prepare(\n `UPDATE lt_thread_message_queue SET status = 'pending' WHERE thread_id = ? AND status = 'processing'`,\n ).run(threadId);\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 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 };\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"],"mappings":"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","names":["initSqlJs","DDL","DDL","DDL","DDL","DDL","DDL","DDL","DDL","mapRowToEntry","import_core","DDL","mapRowToEntry","DDL","DDL","import_crypto","DDL","DDL","import_core","import_crypto","DDL","import_crypto","DDL","DDL","DDL"]}
|