@opentag/store 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1 -1
- package/dist/index.js +1463 -54
- package/dist/index.js.map +1 -1
- package/dist/repository.d.ts +269 -5
- package/dist/repository.d.ts.map +1 -1
- package/dist/schema.d.ts +1399 -119
- package/dist/schema.d.ts.map +1 -1
- package/package.json +6 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/repository.ts","../src/schema.ts"],"sourcesContent":["import { OpenTagEventSchema, OpenTagRunResultSchema, type OpenTagEvent, type OpenTagRun, type OpenTagRunResult } from \"@opentag/core\";\nimport { and, asc, eq } from \"drizzle-orm\";\nimport type { BetterSQLite3Database } from \"drizzle-orm/better-sqlite3\";\nimport { repoBindings, runEvents, runners, runs, slackChannelBindings } from \"./schema.js\";\n\nexport type ClaimedOpenTagRun = {\n run: OpenTagRun;\n event: OpenTagEvent;\n};\n\nexport type OpenTagAuditEvent = {\n id: number;\n runId: string;\n type: string;\n payload: unknown;\n createdAt: string;\n};\n\nexport type RepoBinding = {\n provider: string;\n owner: string;\n repo: string;\n runnerId: string;\n workspacePath?: string;\n defaultExecutor?: string;\n allowedActors?: string[];\n};\n\nexport type SlackChannelBinding = {\n teamId: string;\n channelId: string;\n owner: string;\n repo: string;\n};\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction isIsoExpired(iso: string | null, now: Date): boolean {\n if (!iso) return false;\n return new Date(iso).getTime() <= now.getTime();\n}\n\nfunction runFromRow(row: typeof runs.$inferSelect): OpenTagRun {\n const result = row.resultJson ? OpenTagRunResultSchema.parse(JSON.parse(row.resultJson)) : undefined;\n return {\n id: row.id,\n eventId: row.eventId,\n status: row.status as OpenTagRun[\"status\"],\n assignedRunnerId: row.assignedRunnerId ?? undefined,\n executor: row.executor ?? undefined,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n ...(result ? { result } : {})\n };\n}\n\nfunction repoKeyFromEvent(event: OpenTagEvent): { provider: string; owner: string; repo: string } | null {\n const owner = event.metadata[\"owner\"];\n const repo = event.metadata[\"repo\"];\n if (typeof owner !== \"string\" || typeof repo !== \"string\") return null;\n return {\n provider: typeof event.metadata[\"repoProvider\"] === \"string\" ? (event.metadata[\"repoProvider\"] as string) : \"github\",\n owner,\n repo\n };\n}\n\nexport function createOpenTagRepository(db: BetterSQLite3Database) {\n async function appendRunEvent(input: { runId: string; type: string; payload: unknown; createdAt?: string }): Promise<void> {\n await db.insert(runEvents).values({\n runId: input.runId,\n type: input.type,\n payloadJson: JSON.stringify(input.payload),\n createdAt: input.createdAt ?? nowIso()\n });\n }\n\n return {\n appendRunEvent,\n\n async registerRunner(input: { runnerId: string; name: string }): Promise<void> {\n const createdAt = nowIso();\n await db.insert(runners).values({ runnerId: input.runnerId, name: input.name, createdAt }).onConflictDoNothing();\n },\n\n async createRepoBinding(input: {\n provider: string;\n owner: string;\n repo: string;\n runnerId: string;\n workspacePath?: string;\n defaultExecutor?: string;\n allowedActors?: string[];\n }): Promise<void> {\n await db\n .insert(repoBindings)\n .values({\n ...input,\n workspacePath: input.workspacePath ?? null,\n defaultExecutor: input.defaultExecutor ?? null,\n allowedActorsJson: input.allowedActors ? JSON.stringify(input.allowedActors) : null,\n createdAt: nowIso()\n })\n .onConflictDoUpdate({\n target: [repoBindings.provider, repoBindings.owner, repoBindings.repo],\n set: {\n runnerId: input.runnerId,\n workspacePath: input.workspacePath ?? null,\n defaultExecutor: input.defaultExecutor ?? null,\n allowedActorsJson: input.allowedActors ? JSON.stringify(input.allowedActors) : null\n }\n });\n },\n\n async createSlackChannelBinding(input: SlackChannelBinding): Promise<void> {\n await db\n .insert(slackChannelBindings)\n .values({\n teamId: input.teamId,\n channelId: input.channelId,\n owner: input.owner,\n repo: input.repo,\n createdAt: nowIso()\n })\n .onConflictDoUpdate({\n target: [slackChannelBindings.teamId, slackChannelBindings.channelId],\n set: {\n owner: input.owner,\n repo: input.repo\n }\n });\n },\n\n async createRun(input: { id: string; event: OpenTagEvent }): Promise<OpenTagRun> {\n const event = OpenTagEventSchema.parse(input.event);\n const createdAt = nowIso();\n await db.insert(runs).values({\n id: input.id,\n eventId: event.id,\n status: \"queued\",\n eventJson: JSON.stringify(event),\n createdAt,\n updatedAt: createdAt\n });\n await appendRunEvent({\n runId: input.id,\n type: \"run.created\",\n payload: { eventId: event.id },\n createdAt\n });\n return {\n id: input.id,\n eventId: event.id,\n status: \"queued\",\n createdAt,\n updatedAt: createdAt\n };\n },\n\n async claimNextRun(input: { runnerId: string; leaseSeconds: number }): Promise<ClaimedOpenTagRun | null> {\n const now = new Date();\n const activeRows = await db.select().from(runs).where(and(eq(runs.status, \"assigned\"))).orderBy(asc(runs.createdAt));\n for (const activeRow of activeRows) {\n if (!isIsoExpired(activeRow.leaseExpiresAt, now)) continue;\n const updatedAt = nowIso();\n await db\n .update(runs)\n .set({\n status: \"queued\",\n assignedRunnerId: null,\n leasedAt: null,\n leaseExpiresAt: null,\n heartbeatAt: null,\n updatedAt\n })\n .where(eq(runs.id, activeRow.id));\n await appendRunEvent({\n runId: activeRow.id,\n type: \"run.lease_expired\",\n payload: { previousRunnerId: activeRow.assignedRunnerId, previousLeaseExpiresAt: activeRow.leaseExpiresAt },\n createdAt: updatedAt\n });\n }\n\n const queuedRows = await db.select().from(runs).where(eq(runs.status, \"queued\")).orderBy(asc(runs.createdAt));\n const row = queuedRows.find((candidate) => {\n const event = OpenTagEventSchema.parse(JSON.parse(candidate.eventJson));\n const repoKey = repoKeyFromEvent(event);\n if (!repoKey) return false;\n const binding = db\n .select()\n .from(repoBindings)\n .where(\n and(\n eq(repoBindings.provider, repoKey.provider),\n eq(repoBindings.owner, repoKey.owner),\n eq(repoBindings.repo, repoKey.repo),\n eq(repoBindings.runnerId, input.runnerId)\n )\n )\n .limit(1)\n .get();\n return Boolean(binding);\n });\n if (!row) return null;\n\n const updatedAt = nowIso();\n const leasedAt = updatedAt;\n const leaseExpiresAt = new Date(Date.now() + input.leaseSeconds * 1000).toISOString();\n await db\n .update(runs)\n .set({\n status: \"assigned\",\n assignedRunnerId: input.runnerId,\n leasedAt,\n leaseExpiresAt,\n heartbeatAt: leasedAt,\n updatedAt\n })\n .where(eq(runs.id, row.id));\n await appendRunEvent({\n runId: row.id,\n type: \"run.claimed\",\n payload: { runnerId: input.runnerId, leasedAt, leaseExpiresAt },\n createdAt: updatedAt\n });\n\n return {\n run: {\n id: row.id,\n eventId: row.eventId,\n status: \"assigned\",\n assignedRunnerId: input.runnerId,\n executor: row.executor ?? undefined,\n createdAt: row.createdAt,\n updatedAt\n },\n event: OpenTagEventSchema.parse(JSON.parse(row.eventJson))\n };\n },\n\n async getRepoBinding(input: { provider: string; owner: string; repo: string }): Promise<RepoBinding | null> {\n const row = await db\n .select()\n .from(repoBindings)\n .where(\n and(eq(repoBindings.provider, input.provider), eq(repoBindings.owner, input.owner), eq(repoBindings.repo, input.repo))\n )\n .limit(1)\n .get();\n if (!row) return null;\n return {\n provider: row.provider,\n owner: row.owner,\n repo: row.repo,\n runnerId: row.runnerId,\n ...(row.workspacePath ? { workspacePath: row.workspacePath } : {}),\n ...(row.defaultExecutor ? { defaultExecutor: row.defaultExecutor } : {}),\n ...(row.allowedActorsJson ? { allowedActors: JSON.parse(row.allowedActorsJson) as string[] } : {})\n };\n },\n\n async getSlackChannelBinding(input: { teamId: string; channelId: string }): Promise<SlackChannelBinding | null> {\n const row = await db\n .select()\n .from(slackChannelBindings)\n .where(and(eq(slackChannelBindings.teamId, input.teamId), eq(slackChannelBindings.channelId, input.channelId)))\n .limit(1)\n .get();\n if (!row) return null;\n return {\n teamId: row.teamId,\n channelId: row.channelId,\n owner: row.owner,\n repo: row.repo\n };\n },\n\n async heartbeat(input: { runId: string; runnerId: string; leaseSeconds?: number }): Promise<boolean> {\n const updatedAt = nowIso();\n const row = await db\n .select()\n .from(runs)\n .where(and(eq(runs.id, input.runId), eq(runs.assignedRunnerId, input.runnerId)))\n .limit(1)\n .get();\n if (!row) return false;\n const leaseSeconds = input.leaseSeconds ?? 60;\n const leaseExpiresAt = new Date(Date.now() + leaseSeconds * 1000).toISOString();\n await db\n .update(runs)\n .set({ heartbeatAt: updatedAt, leaseExpiresAt, updatedAt })\n .where(eq(runs.id, input.runId));\n await appendRunEvent({\n runId: input.runId,\n type: \"run.heartbeat\",\n payload: { runnerId: input.runnerId, heartbeatAt: updatedAt, leaseExpiresAt },\n createdAt: updatedAt\n });\n return true;\n },\n\n async markRunning(input: { runId: string; executor: string }): Promise<void> {\n const updatedAt = nowIso();\n await db.update(runs).set({ status: \"running\", executor: input.executor, updatedAt }).where(eq(runs.id, input.runId));\n await appendRunEvent({\n runId: input.runId,\n type: \"run.running\",\n payload: { executor: input.executor },\n createdAt: updatedAt\n });\n },\n\n async completeRun(input: { runId: string; result: OpenTagRunResult }): Promise<void> {\n const result = OpenTagRunResultSchema.parse(input.result);\n const updatedAt = nowIso();\n const status = result.conclusion === \"success\" ? \"succeeded\" : result.conclusion === \"cancelled\" ? \"cancelled\" : \"failed\";\n await db.update(runs).set({ status, resultJson: JSON.stringify(result), updatedAt }).where(eq(runs.id, input.runId));\n await appendRunEvent({\n runId: input.runId,\n type: \"run.completed\",\n payload: result,\n createdAt: updatedAt\n });\n },\n\n async recordProgress(input: { runId: string; message: string; type?: string; at?: string }): Promise<void> {\n await appendRunEvent({\n runId: input.runId,\n type: \"run.progress\",\n payload: {\n type: input.type ?? \"progress\",\n message: input.message,\n at: input.at ?? nowIso()\n }\n });\n },\n\n async getRun(input: { runId: string }): Promise<ClaimedOpenTagRun | null> {\n const row = await db.select().from(runs).where(eq(runs.id, input.runId)).limit(1).get();\n if (!row) return null;\n return {\n run: runFromRow(row),\n event: OpenTagEventSchema.parse(JSON.parse(row.eventJson))\n };\n },\n\n async listRunEvents(input: { runId: string }): Promise<OpenTagAuditEvent[]> {\n const rows = await db.select().from(runEvents).where(eq(runEvents.runId, input.runId)).orderBy(asc(runEvents.id));\n return rows.map((row) => ({\n id: row.id,\n runId: row.runId,\n type: row.type,\n payload: JSON.parse(row.payloadJson) as unknown,\n createdAt: row.createdAt\n }));\n }\n };\n}\n","import type Database from \"better-sqlite3\";\nimport { index, integer, sqliteTable, text, uniqueIndex } from \"drizzle-orm/sqlite-core\";\n\nexport const runs = sqliteTable(\n \"runs\",\n {\n id: text(\"id\").primaryKey(),\n eventId: text(\"event_id\").notNull(),\n status: text(\"status\").notNull(),\n eventJson: text(\"event_json\").notNull(),\n resultJson: text(\"result_json\"),\n assignedRunnerId: text(\"assigned_runner_id\"),\n executor: text(\"executor\"),\n leasedAt: text(\"leased_at\"),\n leaseExpiresAt: text(\"lease_expires_at\"),\n heartbeatAt: text(\"heartbeat_at\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull()\n },\n (table) => ({\n statusIdx: index(\"runs_status_idx\").on(table.status),\n runnerIdx: index(\"runs_runner_idx\").on(table.assignedRunnerId)\n })\n);\n\nexport const runEvents = sqliteTable(\"run_events\", {\n id: integer(\"id\").primaryKey({ autoIncrement: true }),\n runId: text(\"run_id\").notNull(),\n type: text(\"type\").notNull(),\n payloadJson: text(\"payload_json\").notNull(),\n createdAt: text(\"created_at\").notNull()\n});\n\nexport const runners = sqliteTable(\"runners\", {\n runnerId: text(\"runner_id\").primaryKey(),\n name: text(\"name\").notNull(),\n createdAt: text(\"created_at\").notNull(),\n heartbeatAt: text(\"heartbeat_at\")\n});\n\nexport const repoBindings = sqliteTable(\n \"repo_bindings\",\n {\n id: integer(\"id\").primaryKey({ autoIncrement: true }),\n provider: text(\"provider\").notNull(),\n owner: text(\"owner\").notNull(),\n repo: text(\"repo\").notNull(),\n runnerId: text(\"runner_id\").notNull(),\n workspacePath: text(\"workspace_path\"),\n defaultExecutor: text(\"default_executor\"),\n allowedActorsJson: text(\"allowed_actors_json\"),\n createdAt: text(\"created_at\").notNull()\n },\n (table) => ({\n repoUniqueIdx: uniqueIndex(\"repo_bindings_provider_owner_repo_idx\").on(table.provider, table.owner, table.repo)\n })\n);\n\nexport const slackChannelBindings = sqliteTable(\n \"slack_channel_bindings\",\n {\n id: integer(\"id\").primaryKey({ autoIncrement: true }),\n teamId: text(\"team_id\").notNull(),\n channelId: text(\"channel_id\").notNull(),\n owner: text(\"owner\").notNull(),\n repo: text(\"repo\").notNull(),\n createdAt: text(\"created_at\").notNull()\n },\n (table) => ({\n slackChannelUniqueIdx: uniqueIndex(\"slack_channel_bindings_team_channel_idx\").on(table.teamId, table.channelId)\n })\n);\n\nexport function migrateSchema(sqlite: Database.Database): void {\n sqlite.exec(`\n CREATE TABLE IF NOT EXISTS runs (\n id TEXT PRIMARY KEY,\n event_id TEXT NOT NULL,\n status TEXT NOT NULL,\n event_json TEXT NOT NULL,\n result_json TEXT,\n assigned_runner_id TEXT,\n executor TEXT,\n leased_at TEXT,\n lease_expires_at TEXT,\n heartbeat_at TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n CREATE INDEX IF NOT EXISTS runs_status_idx ON runs(status);\n CREATE INDEX IF NOT EXISTS runs_runner_idx ON runs(assigned_runner_id);\n CREATE TABLE IF NOT EXISTS run_events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n run_id TEXT NOT NULL,\n type TEXT NOT NULL,\n payload_json TEXT NOT NULL,\n created_at TEXT NOT NULL\n );\n CREATE TABLE IF NOT EXISTS runners (\n runner_id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n created_at TEXT NOT NULL,\n heartbeat_at TEXT\n );\n CREATE TABLE IF NOT EXISTS repo_bindings (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n provider TEXT NOT NULL,\n owner TEXT NOT NULL,\n repo TEXT NOT NULL,\n runner_id TEXT NOT NULL,\n workspace_path TEXT,\n default_executor TEXT,\n allowed_actors_json TEXT,\n created_at TEXT NOT NULL\n );\n CREATE UNIQUE INDEX IF NOT EXISTS repo_bindings_provider_owner_repo_idx\n ON repo_bindings(provider, owner, repo);\n CREATE TABLE IF NOT EXISTS slack_channel_bindings (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n team_id TEXT NOT NULL,\n channel_id TEXT NOT NULL,\n owner TEXT NOT NULL,\n repo TEXT NOT NULL,\n created_at TEXT NOT NULL\n );\n CREATE UNIQUE INDEX IF NOT EXISTS slack_channel_bindings_team_channel_idx\n ON slack_channel_bindings(team_id, channel_id);\n `);\n const columns = sqlite.prepare(\"PRAGMA table_info(repo_bindings)\").all() as { name: string }[];\n const columnNames = new Set(columns.map((column) => column.name));\n if (!columnNames.has(\"workspace_path\")) {\n sqlite.exec(\"ALTER TABLE repo_bindings ADD COLUMN workspace_path TEXT\");\n }\n if (!columnNames.has(\"default_executor\")) {\n sqlite.exec(\"ALTER TABLE repo_bindings ADD COLUMN default_executor TEXT\");\n }\n if (!columnNames.has(\"allowed_actors_json\")) {\n sqlite.exec(\"ALTER TABLE repo_bindings ADD COLUMN allowed_actors_json TEXT\");\n }\n const runColumns = sqlite.prepare(\"PRAGMA table_info(runs)\").all() as { name: string }[];\n const runColumnNames = new Set(runColumns.map((column) => column.name));\n if (!runColumnNames.has(\"leased_at\")) {\n sqlite.exec(\"ALTER TABLE runs ADD COLUMN leased_at TEXT\");\n }\n if (!runColumnNames.has(\"heartbeat_at\")) {\n sqlite.exec(\"ALTER TABLE runs ADD COLUMN heartbeat_at TEXT\");\n }\n}\n"],"mappings":"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","names":["updatedAt"]}
|
|
1
|
+
{"version":3,"sources":["../src/repository.ts","../src/schema.ts"],"sourcesContent":["import {\n ApprovalDecisionSchema,\n ApplyIntentOutcomeSchema,\n ApplyPlanSchema,\n ActionHintSchema,\n AdapterMutationMappingSchema,\n ContextPacketSchema,\n conversationKeyFromEvent,\n defaultRunEventMetadata,\n OpenTagEventSchema,\n OpenTagRunResultSchema,\n PolicyRuleSchema,\n ProposalLineageSchema,\n preflightMutationIntent,\n projectTargetRefFromEvent,\n protocolRunFieldsFromEvent,\n RunAdmissionDecisionSchema,\n RunEventImportanceSchema,\n RunEventVisibilitySchema,\n SuggestedChangesSnapshotSchema,\n type ApprovalDecision,\n type ApplyIntentOutcome,\n type ApplyPlan,\n type ActionHint,\n type AdapterMutationMapping,\n type MutationIntentActionability,\n type OpenTagEvent,\n type OpenTagRun,\n type OpenTagRunResult,\n type PolicyRule,\n type ProposalLineage,\n type RunAdmissionDecision,\n type RunEventImportance,\n type RunEventVisibility,\n type SuggestedChangesSnapshot\n} from \"@opentag/core\";\nimport { and, asc, eq, inArray } from \"drizzle-orm\";\nimport type { BetterSQLite3Database } from \"drizzle-orm/better-sqlite3\";\nimport {\n applyPlans,\n approvalDecisions,\n channelBindings,\n repoBindings,\n repoMutationMappings,\n repoPolicyRules,\n callbackDeliveries,\n followUpRequests,\n runEvents,\n runners,\n runs,\n suggestedChanges\n} from \"./schema.js\";\n\nexport type ClaimedOpenTagRun = {\n run: OpenTagRun;\n event: OpenTagEvent;\n};\n\nexport type OpenTagAuditEvent = {\n id: number;\n runId: string;\n type: string;\n visibility: RunEventVisibility;\n importance: RunEventImportance;\n message?: string;\n payload: unknown;\n createdAt: string;\n};\n\nexport type CallbackDeliveryKind = \"acknowledgement\" | \"progress\" | \"final\";\nexport type CallbackDeliveryProvider = string;\nexport type CallbackDeliveryStatus = \"pending\" | \"delivering\" | \"delivered\" | \"failed\";\n\nexport type CallbackDelivery = {\n id: number;\n runId: string;\n kind: CallbackDeliveryKind;\n provider: CallbackDeliveryProvider;\n uri: string;\n body: string;\n threadKey?: string;\n agentId?: string;\n statusMessageKey?: string;\n blocks?: unknown[];\n status: CallbackDeliveryStatus;\n attempts: number;\n lastError?: string;\n nextAttemptAt?: string;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type RepoBinding = {\n provider: string;\n owner: string;\n repo: string;\n runnerId: string;\n workspacePath?: string;\n defaultExecutor?: string;\n allowedActors?: string[];\n};\n\nexport type ChannelBinding = {\n provider: string;\n accountId: string;\n conversationId: string;\n repoProvider: string;\n owner: string;\n repo: string;\n metadata?: Record<string, unknown>;\n};\n\nexport type SlackChannelBinding = {\n teamId: string;\n channelId: string;\n repoProvider?: string;\n owner: string;\n repo: string;\n};\n\nexport type RunnerRegistration = {\n runnerId: string;\n name: string;\n createdAt: string;\n heartbeatAt?: string;\n};\n\nexport type StoredSuggestedChangesSnapshot = {\n runId: string;\n snapshot: SuggestedChangesSnapshot;\n};\n\nexport type StoredSuggestedChangesInConversation = StoredSuggestedChangesSnapshot & {\n run: OpenTagRun;\n event: OpenTagEvent;\n};\n\nexport type ApplyOutcomeCounts = {\n applied: number;\n skipped: number;\n failed: number;\n stale: number;\n unsupported: number;\n};\n\nexport type CreateRunResult = {\n run: OpenTagRun;\n created: boolean;\n};\n\nexport type FollowUpRequest = {\n id: string;\n sourceEventId: string;\n conversationKey: string;\n activeRunId?: string;\n event: OpenTagEvent;\n decision: RunAdmissionDecision;\n status: \"queued\" | \"promoted\" | \"cancelled\";\n createdRunId?: string;\n createdAt: string;\n updatedAt: string;\n};\n\nexport type OpenTagRunMetrics = {\n runId: string;\n totalEventCount: number;\n humanEventCount: number;\n auditEventCount: number;\n debugEventCount: number;\n humanCallbackCount: number;\n threadNoiseRatio: number;\n suggestedChangesCount: number;\n approvalDecisionCount: number;\n applyPlanCount: number;\n childRunCount: number;\n applyOutcomeCounts: ApplyOutcomeCounts;\n staleIntentCount: number;\n};\n\nexport type OpenTagAggregateMetrics = {\n scope: \"repo\" | \"work_thread\";\n scopeId: string;\n runCount: number;\n totalEventCount: number;\n humanEventCount: number;\n auditEventCount: number;\n debugEventCount: number;\n humanCallbackCount: number;\n threadNoiseRatio: number;\n suggestedChangesCount: number;\n approvalDecisionCount: number;\n applyPlanCount: number;\n childRunCount: number;\n applyOutcomeCounts: ApplyOutcomeCounts;\n staleIntentCount: number;\n};\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction isIsoExpired(iso: string | null, now: Date): boolean {\n if (!iso) return false;\n return new Date(iso).getTime() <= now.getTime();\n}\n\nfunction runFromRow(row: typeof runs.$inferSelect): OpenTagRun {\n const event = OpenTagEventSchema.parse(JSON.parse(row.eventJson));\n const result = row.resultJson ? OpenTagRunResultSchema.parse(JSON.parse(row.resultJson)) : undefined;\n const triggeredByAction = row.triggeredByActionJson ? ActionHintSchema.parse(JSON.parse(row.triggeredByActionJson)) : undefined;\n const protocolFields = protocolRunFieldsFromEvent(event, row.createdAt);\n const contextPacket = row.contextPacketJson\n ? ContextPacketSchema.parse(JSON.parse(row.contextPacketJson))\n : protocolFields.contextPacket;\n return {\n id: row.id,\n eventId: row.eventId,\n status: row.status as OpenTagRun[\"status\"],\n ...(protocolFields.thread ? { thread: protocolFields.thread } : {}),\n contextPacket,\n ...(row.parentRunId ? { parentRunId: row.parentRunId } : {}),\n ...(triggeredByAction ? { triggeredByAction } : {}),\n ...(row.sourceProposalId ? { sourceProposalId: row.sourceProposalId } : {}),\n ...(row.sourceApplyPlanId ? { sourceApplyPlanId: row.sourceApplyPlanId } : {}),\n assignedRunnerId: row.assignedRunnerId ?? undefined,\n executor: row.executor ?? undefined,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n ...(result ? { result } : {})\n };\n}\n\nfunction callbackDeliveryFromRow(row: typeof callbackDeliveries.$inferSelect): CallbackDelivery {\n const metadata =\n row.metadataJson && typeof row.metadataJson === \"string\"\n ? (JSON.parse(row.metadataJson) as { agentId?: string; statusMessageKey?: string; blocks?: unknown[] })\n : undefined;\n return {\n id: row.id,\n runId: row.runId,\n kind: row.kind as CallbackDeliveryKind,\n provider: row.provider as CallbackDeliveryProvider,\n uri: row.uri,\n body: row.body,\n ...(row.threadKey ? { threadKey: row.threadKey } : {}),\n ...(metadata?.agentId ? { agentId: metadata.agentId } : {}),\n ...(metadata?.statusMessageKey ? { statusMessageKey: metadata.statusMessageKey } : {}),\n ...(metadata?.blocks ? { blocks: metadata.blocks } : {}),\n status: row.status as CallbackDeliveryStatus,\n attempts: row.attempts,\n ...(row.lastError ? { lastError: row.lastError } : {}),\n ...(row.nextAttemptAt ? { nextAttemptAt: row.nextAttemptAt } : {}),\n createdAt: row.createdAt,\n updatedAt: row.updatedAt\n };\n}\n\nfunction followUpRequestFromRow(row: typeof followUpRequests.$inferSelect): FollowUpRequest {\n return {\n id: row.id,\n sourceEventId: row.sourceEventId,\n conversationKey: row.conversationKey,\n ...(row.activeRunId ? { activeRunId: row.activeRunId } : {}),\n event: OpenTagEventSchema.parse(JSON.parse(row.eventJson)),\n decision: RunAdmissionDecisionSchema.parse(JSON.parse(row.decisionJson)),\n status: row.status as FollowUpRequest[\"status\"],\n ...(row.createdRunId ? { createdRunId: row.createdRunId } : {}),\n createdAt: row.createdAt,\n updatedAt: row.updatedAt\n };\n}\n\nfunction runnerFromRow(row: typeof runners.$inferSelect): RunnerRegistration {\n return {\n runnerId: row.runnerId,\n name: row.name,\n createdAt: row.createdAt,\n ...(row.heartbeatAt ? { heartbeatAt: row.heartbeatAt } : {})\n };\n}\n\nfunction recordFromJson(value: string | null): Record<string, unknown> | undefined {\n if (!value) return undefined;\n try {\n const parsed = JSON.parse(value);\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction channelBindingFromRow(row: typeof channelBindings.$inferSelect): ChannelBinding {\n const metadata = recordFromJson(row.metadataJson);\n return {\n provider: row.provider,\n accountId: row.accountId,\n conversationId: row.conversationId,\n repoProvider: row.repoProvider,\n owner: row.owner,\n repo: row.repo,\n ...(metadata ? { metadata } : {})\n };\n}\n\nfunction syntheticManualApprovalPolicyRules(decision: ApprovalDecision): PolicyRule[] {\n return [\n {\n id: `manual_approval_${decision.id}`,\n scope: \"primary_anchor_override\",\n effect: \"allow\",\n reason: \"Manual approval decision authorized selected proposal intents.\"\n }\n ];\n}\n\nfunction executorConditionsFromIntent(intent: { params?: Record<string, unknown> | undefined }): string[] {\n const value = intent.params?.[\"executorConditions\"];\n if (!Array.isArray(value)) return [];\n return value.filter((condition): condition is string => typeof condition === \"string\" && condition.length > 0);\n}\n\nfunction lineageScopeKey(input: { runId: string; snapshot: SuggestedChangesSnapshot }): string {\n return input.snapshot.workThread?.id ?? `run:${input.runId}`;\n}\n\nfunction computeProposalLineage(snapshots: StoredSuggestedChangesSnapshot[], targetScopeKey: string): ProposalLineage {\n const scoped = snapshots\n .filter((snapshot) => lineageScopeKey(snapshot) === targetScopeKey)\n .sort((left, right) => {\n const timeDelta = new Date(left.snapshot.createdAt).getTime() - new Date(right.snapshot.createdAt).getTime();\n if (timeDelta !== 0) return timeDelta;\n return left.snapshot.proposalId.localeCompare(right.snapshot.proposalId);\n });\n\n const latestProposalByDomain = new Map<string, string>();\n const explicitSupersession = new Map<string, { proposalId: string; intentId: string }>();\n for (const stored of scoped) {\n const domainsInProposal = new Set<string>();\n for (const intent of stored.snapshot.intents) {\n domainsInProposal.add(intent.domain);\n for (const supersededIntentId of intent.supersedesIntentIds ?? []) {\n explicitSupersession.set(supersededIntentId, { proposalId: stored.snapshot.proposalId, intentId: intent.intentId });\n }\n }\n for (const domain of domainsInProposal) {\n latestProposalByDomain.set(domain, stored.snapshot.proposalId);\n }\n }\n\n const entries: MutationIntentActionability[] = [];\n for (const stored of scoped) {\n for (const intent of stored.snapshot.intents) {\n const explicit = explicitSupersession.get(intent.intentId);\n const latestProposalId = latestProposalByDomain.get(intent.domain);\n if (explicit) {\n entries.push({\n proposalId: stored.snapshot.proposalId,\n intentId: intent.intentId,\n domain: intent.domain,\n status: \"superseded\",\n supersededByProposalId: explicit.proposalId,\n supersededByIntentId: explicit.intentId,\n reason: \"A later intent explicitly superseded this intent.\"\n });\n } else if (latestProposalId && latestProposalId !== stored.snapshot.proposalId) {\n const supersedingIntent = scoped\n .find((candidate) => candidate.snapshot.proposalId === latestProposalId)\n ?.snapshot.intents.find((candidateIntent) => candidateIntent.domain === intent.domain);\n entries.push({\n proposalId: stored.snapshot.proposalId,\n intentId: intent.intentId,\n domain: intent.domain,\n status: \"superseded\",\n supersededByProposalId: latestProposalId,\n ...(supersedingIntent ? { supersededByIntentId: supersedingIntent.intentId } : {}),\n reason: `A newer proposal superseded the ${intent.domain} domain.`\n });\n } else {\n entries.push({\n proposalId: stored.snapshot.proposalId,\n intentId: intent.intentId,\n domain: intent.domain,\n status: \"current\"\n });\n }\n }\n }\n\n return ProposalLineageSchema.parse({ scopeKey: targetScopeKey, entries });\n}\n\nfunction emptyApplyOutcomeCounts(): ApplyOutcomeCounts {\n return {\n applied: 0,\n skipped: 0,\n failed: 0,\n stale: 0,\n unsupported: 0\n };\n}\n\nfunction recordFromUnknown(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : null;\n}\n\nfunction metricsFromEvents(runId: string, events: OpenTagAuditEvent[]): OpenTagRunMetrics {\n const latestApplyPlans = new Map<string, ApplyPlan>();\n for (const event of events) {\n if (event.type !== \"apply_plan.created\" && event.type !== \"apply_plan.executed\") continue;\n const parsed = ApplyPlanSchema.safeParse(event.payload);\n if (parsed.success) {\n latestApplyPlans.set(parsed.data.id, parsed.data);\n }\n }\n\n const applyOutcomeCounts = emptyApplyOutcomeCounts();\n for (const plan of latestApplyPlans.values()) {\n for (const outcome of plan.outcomes ?? []) {\n applyOutcomeCounts[outcome.outcome] += 1;\n }\n }\n\n const humanCallbackCount = events.filter((event) => event.visibility === \"human\" && event.type.startsWith(\"callback.\")).length;\n const auditEventCount = events.filter((event) => event.visibility === \"audit\").length;\n return {\n runId,\n totalEventCount: events.length,\n humanEventCount: events.filter((event) => event.visibility === \"human\").length,\n auditEventCount,\n debugEventCount: events.filter((event) => event.visibility === \"debug\").length,\n humanCallbackCount,\n threadNoiseRatio: auditEventCount === 0 ? humanCallbackCount : humanCallbackCount / auditEventCount,\n suggestedChangesCount: events\n .filter((event) => event.type === \"proposal.snapshot.created\")\n .reduce((count, event) => {\n const payload = recordFromUnknown(event.payload);\n const intents = payload?.[\"intents\"];\n return count + (Array.isArray(intents) ? intents.length : 1);\n }, 0),\n approvalDecisionCount: events.filter((event) => event.type === \"approval.decision.recorded\").length,\n applyPlanCount: latestApplyPlans.size,\n childRunCount: events.filter((event) => event.type === \"run.child_created\").length,\n applyOutcomeCounts,\n staleIntentCount: applyOutcomeCounts.stale\n };\n}\n\nfunction aggregateMetrics(input: {\n scope: OpenTagAggregateMetrics[\"scope\"];\n scopeId: string;\n runs: OpenTagRunMetrics[];\n}): OpenTagAggregateMetrics {\n const applyOutcomeCounts = emptyApplyOutcomeCounts();\n for (const run of input.runs) {\n applyOutcomeCounts.applied += run.applyOutcomeCounts.applied;\n applyOutcomeCounts.skipped += run.applyOutcomeCounts.skipped;\n applyOutcomeCounts.failed += run.applyOutcomeCounts.failed;\n applyOutcomeCounts.stale += run.applyOutcomeCounts.stale;\n applyOutcomeCounts.unsupported += run.applyOutcomeCounts.unsupported;\n }\n const auditEventCount = input.runs.reduce((sum, run) => sum + run.auditEventCount, 0);\n const humanCallbackCount = input.runs.reduce((sum, run) => sum + run.humanCallbackCount, 0);\n return {\n scope: input.scope,\n scopeId: input.scopeId,\n runCount: input.runs.length,\n totalEventCount: input.runs.reduce((sum, run) => sum + run.totalEventCount, 0),\n humanEventCount: input.runs.reduce((sum, run) => sum + run.humanEventCount, 0),\n auditEventCount,\n debugEventCount: input.runs.reduce((sum, run) => sum + run.debugEventCount, 0),\n humanCallbackCount,\n threadNoiseRatio: auditEventCount === 0 ? humanCallbackCount : humanCallbackCount / auditEventCount,\n suggestedChangesCount: input.runs.reduce((sum, run) => sum + run.suggestedChangesCount, 0),\n approvalDecisionCount: input.runs.reduce((sum, run) => sum + run.approvalDecisionCount, 0),\n applyPlanCount: input.runs.reduce((sum, run) => sum + run.applyPlanCount, 0),\n childRunCount: input.runs.reduce((sum, run) => sum + run.childRunCount, 0),\n applyOutcomeCounts,\n staleIntentCount: input.runs.reduce((sum, run) => sum + run.staleIntentCount, 0)\n };\n}\n\nexport function createOpenTagRepository(db: BetterSQLite3Database) {\n async function appendRunEvent(input: {\n runId: string;\n type: string;\n payload: unknown;\n createdAt?: string;\n visibility?: RunEventVisibility;\n importance?: RunEventImportance;\n message?: string;\n }): Promise<void> {\n await db.insert(runEvents).values({\n runId: input.runId,\n type: input.type,\n visibility: input.visibility ?? defaultRunEventMetadata(input.type).visibility,\n importance: input.importance ?? defaultRunEventMetadata(input.type).importance,\n message: input.message ?? null,\n payloadJson: JSON.stringify(input.payload),\n createdAt: input.createdAt ?? nowIso()\n });\n }\n\n type CreateApplyPlanInput = {\n id: string;\n proposalId: string;\n approvalDecisionId: string;\n selectedIntentIds?: string[];\n adapter?: string;\n policyRules?: PolicyRule[];\n };\n\n async function buildApplyPlan(input: CreateApplyPlanInput): Promise<{ plan: ApplyPlan; runId: string; createdAt: string } | null> {\n const storedProposalRow = await db\n .select()\n .from(suggestedChanges)\n .where(eq(suggestedChanges.proposalId, input.proposalId))\n .limit(1)\n .get();\n const decisionRow = await db\n .select()\n .from(approvalDecisions)\n .where(eq(approvalDecisions.id, input.approvalDecisionId))\n .limit(1)\n .get();\n const decision = decisionRow ? ApprovalDecisionSchema.parse(JSON.parse(decisionRow.decisionJson)) : null;\n if (!storedProposalRow || !decision || decision.proposalId !== input.proposalId) return null;\n const storedProposal = {\n runId: storedProposalRow.runId,\n snapshot: SuggestedChangesSnapshotSchema.parse(JSON.parse(storedProposalRow.snapshotJson))\n };\n\n const runRow = await db.select().from(runs).where(eq(runs.id, storedProposal.runId)).limit(1).get();\n if (!runRow) return null;\n const event = OpenTagEventSchema.parse(JSON.parse(runRow.eventJson));\n const repoKey = projectTargetRefFromEvent(event);\n const storedPolicyRuleRows = repoKey\n ? await db\n .select()\n .from(repoPolicyRules)\n .where(and(eq(repoPolicyRules.provider, repoKey.provider), eq(repoPolicyRules.owner, repoKey.owner), eq(repoPolicyRules.repo, repoKey.repo)))\n .orderBy(asc(repoPolicyRules.createdAt))\n : [];\n const storedPolicyRules = storedPolicyRuleRows.map((row) => PolicyRuleSchema.parse(JSON.parse(row.ruleJson)));\n const storedMappingRows = repoKey\n ? await db\n .select()\n .from(repoMutationMappings)\n .where(\n and(\n eq(repoMutationMappings.provider, repoKey.provider),\n eq(repoMutationMappings.owner, repoKey.owner),\n eq(repoMutationMappings.repo, repoKey.repo)\n )\n )\n .orderBy(asc(repoMutationMappings.createdAt))\n : [];\n const storedMappings = storedMappingRows.map((row) => AdapterMutationMappingSchema.parse(JSON.parse(row.mappingJson)));\n const selectedIntentIds = input.selectedIntentIds ?? decision.approvedIntentIds;\n const approvedIntentIds = new Set(decision.approvedIntentIds);\n const proposalIntents = new Map(storedProposal.snapshot.intents.map((intent) => [intent.intentId, intent]));\n const lineageRows = await db.select().from(suggestedChanges).orderBy(asc(suggestedChanges.createdAt));\n const lineage = computeProposalLineage(\n lineageRows.map((row) => ({\n runId: row.runId,\n snapshot: SuggestedChangesSnapshotSchema.parse(JSON.parse(row.snapshotJson))\n })),\n lineageScopeKey(storedProposal)\n );\n const actionabilityByIntentId = new Map(lineage.entries.map((entry) => [entry.intentId, entry]));\n const policyRules = [...storedPolicyRules, ...(input.policyRules ?? []), ...syntheticManualApprovalPolicyRules(decision)];\n\n const outcomes = selectedIntentIds.map((intentId) => {\n if (!approvedIntentIds.has(intentId)) {\n return {\n intentId,\n outcome: \"skipped\" as const,\n message: \"Intent was not approved by the approval decision.\"\n };\n }\n const intent = proposalIntents.get(intentId);\n if (!intent) {\n return {\n intentId,\n outcome: \"failed\" as const,\n message: \"Intent does not exist on the referenced proposal.\"\n };\n }\n const actionability = actionabilityByIntentId.get(intentId);\n if (actionability?.status !== \"current\") {\n return {\n intentId,\n outcome: \"stale\" as const,\n message: actionability?.reason ?? \"Intent is no longer current for its mutation domain.\"\n };\n }\n return preflightMutationIntent({\n intent,\n permissions: event.permissions,\n policyRules,\n executorConditions: executorConditionsFromIntent(intent),\n ...(input.adapter ? { adapter: input.adapter } : {})\n }).outcome;\n });\n\n return {\n runId: storedProposal.runId,\n createdAt: nowIso(),\n plan: ApplyPlanSchema.parse({\n id: input.id,\n proposalId: input.proposalId,\n approvalDecisionId: input.approvalDecisionId,\n selectedIntentIds,\n ...(input.adapter ? { adapter: input.adapter } : {}),\n adapterPlan: {\n semantics: \"preflight first, then per-intent outcome\",\n externalWritesExecuted: false,\n mappings: storedMappings\n },\n outcomes\n })\n };\n }\n\n function applyPlanCreatedEventRow(input: { runId: string; plan: ApplyPlan; createdAt: string }): typeof runEvents.$inferInsert {\n return {\n runId: input.runId,\n type: \"apply_plan.created\",\n visibility: \"audit\",\n importance: \"high\",\n message: `Created apply plan for ${input.plan.selectedIntentIds.length} intent(s).`,\n payloadJson: JSON.stringify(input.plan),\n createdAt: input.createdAt\n };\n }\n\n async function appendApplyPlanCreatedEvent(input: { runId: string; plan: ApplyPlan; createdAt: string }): Promise<void> {\n await db.insert(runEvents).values(applyPlanCreatedEventRow(input));\n }\n\n return {\n appendRunEvent,\n\n async getRunByEventId(input: { eventId: string }): Promise<{ run: OpenTagRun; event: OpenTagEvent } | null> {\n const row = await db.select().from(runs).where(eq(runs.eventId, input.eventId)).limit(1).get();\n if (!row) return null;\n return {\n run: runFromRow(row),\n event: OpenTagEventSchema.parse(JSON.parse(row.eventJson))\n };\n },\n\n async findActiveRunForConversation(input: { conversationKey: string }): Promise<{ run: OpenTagRun; event: OpenTagEvent } | null> {\n const row = await db\n .select()\n .from(runs)\n .where(and(eq(runs.conversationKey, input.conversationKey), inArray(runs.status, [\"assigned\", \"running\"])))\n .orderBy(asc(runs.createdAt))\n .limit(1)\n .get();\n if (!row) return null;\n return {\n run: runFromRow(row),\n event: OpenTagEventSchema.parse(JSON.parse(row.eventJson))\n };\n },\n\n async createFollowUpRequest(input: {\n id: string;\n event: OpenTagEvent;\n decision: RunAdmissionDecision;\n activeRunId?: string;\n }): Promise<{ followUpRequest: FollowUpRequest; created: boolean }> {\n const event = OpenTagEventSchema.parse(input.event);\n const decision = RunAdmissionDecisionSchema.parse(input.decision);\n const createdAt = nowIso();\n const conversationKey = conversationKeyFromEvent(event);\n const insertResult = await db\n .insert(followUpRequests)\n .values({\n id: input.id,\n sourceEventId: event.id,\n conversationKey,\n activeRunId: input.activeRunId ?? null,\n eventJson: JSON.stringify(event),\n decisionJson: JSON.stringify(decision),\n status: \"queued\",\n createdRunId: null,\n createdAt,\n updatedAt: createdAt\n })\n .onConflictDoNothing({ target: followUpRequests.sourceEventId });\n if (insertResult.changes === 0) {\n const existing = await db.select().from(followUpRequests).where(eq(followUpRequests.sourceEventId, event.id)).limit(1).get();\n if (!existing) {\n throw new Error(`Follow-up request already exists for event ${event.id}, but it could not be loaded`);\n }\n return { followUpRequest: followUpRequestFromRow(existing), created: false };\n }\n const created = await db.select().from(followUpRequests).where(eq(followUpRequests.id, input.id)).limit(1).get();\n if (!created) {\n throw new Error(`Follow-up request ${input.id} was created but could not be loaded`);\n }\n return { followUpRequest: followUpRequestFromRow(created), created: true };\n },\n\n async getFollowUpRequest(input: { id: string }): Promise<FollowUpRequest | null> {\n const row = await db.select().from(followUpRequests).where(eq(followUpRequests.id, input.id)).limit(1).get();\n return row ? followUpRequestFromRow(row) : null;\n },\n\n async createRunFromFollowUpRequest(input: { followUpRequestId: string; runId: string }): Promise<{ followUpRequest: FollowUpRequest; run: OpenTagRun }> {\n const row = await db.select().from(followUpRequests).where(eq(followUpRequests.id, input.followUpRequestId)).limit(1).get();\n if (!row) {\n throw new Error(`Follow-up request not found: ${input.followUpRequestId}`);\n }\n if (row.status !== \"queued\") {\n throw new Error(`Follow-up request ${input.followUpRequestId} is not queued.`);\n }\n const updatedAt = nowIso();\n const promoteResult = await db\n .update(followUpRequests)\n .set({\n status: \"promoting\",\n updatedAt\n })\n .where(and(eq(followUpRequests.id, input.followUpRequestId), eq(followUpRequests.status, \"queued\")));\n if (promoteResult.changes === 0) {\n throw new Error(`Follow-up request ${input.followUpRequestId} is not queued.`);\n }\n const followUp = followUpRequestFromRow({ ...row, status: \"promoting\", updatedAt });\n try {\n const { run, created } = await this.createRun({\n id: input.runId,\n event: followUp.event,\n ...(followUp.activeRunId ? { parentRunId: followUp.activeRunId } : {})\n });\n if (!created) {\n throw new Error(`Run already exists for follow-up request ${input.followUpRequestId}.`);\n }\n await db\n .update(followUpRequests)\n .set({\n status: \"promoted\",\n createdRunId: run.id,\n updatedAt\n })\n .where(eq(followUpRequests.id, input.followUpRequestId));\n const updated = await db.select().from(followUpRequests).where(eq(followUpRequests.id, input.followUpRequestId)).limit(1).get();\n if (!updated) {\n throw new Error(`Follow-up request ${input.followUpRequestId} was promoted but could not be loaded`);\n }\n if (followUp.activeRunId) {\n await appendRunEvent({\n runId: followUp.activeRunId,\n type: \"follow_up_request.promoted\",\n payload: { followUpRequestId: followUp.id, createdRunId: run.id, sourceEventId: followUp.sourceEventId },\n visibility: \"audit\",\n importance: \"normal\",\n createdAt: updatedAt\n });\n }\n return { followUpRequest: followUpRequestFromRow(updated), run };\n } catch (error) {\n await db\n .update(followUpRequests)\n .set({\n status: \"queued\",\n updatedAt: nowIso()\n })\n .where(and(eq(followUpRequests.id, input.followUpRequestId), eq(followUpRequests.status, \"promoting\")));\n throw error;\n }\n },\n\n async registerRunner(input: { runnerId: string; name: string }): Promise<void> {\n const createdAt = nowIso();\n await db.insert(runners).values({ runnerId: input.runnerId, name: input.name, createdAt }).onConflictDoNothing();\n },\n\n async getRunner(input: { runnerId: string }): Promise<RunnerRegistration | null> {\n const row = await db.select().from(runners).where(eq(runners.runnerId, input.runnerId)).limit(1).get();\n return row ? runnerFromRow(row) : null;\n },\n\n async createRepoBinding(input: {\n provider: string;\n owner: string;\n repo: string;\n runnerId: string;\n workspacePath?: string;\n defaultExecutor?: string;\n allowedActors?: string[];\n }): Promise<void> {\n await db\n .insert(repoBindings)\n .values({\n ...input,\n workspacePath: input.workspacePath ?? null,\n defaultExecutor: input.defaultExecutor ?? null,\n allowedActorsJson: input.allowedActors ? JSON.stringify(input.allowedActors) : null,\n createdAt: nowIso()\n })\n .onConflictDoUpdate({\n target: [repoBindings.provider, repoBindings.owner, repoBindings.repo],\n set: {\n runnerId: input.runnerId,\n workspacePath: input.workspacePath ?? null,\n defaultExecutor: input.defaultExecutor ?? null,\n allowedActorsJson: input.allowedActors ? JSON.stringify(input.allowedActors) : null\n }\n });\n },\n\n async upsertRepoPolicyRule(input: { provider: string; owner: string; repo: string; rule: PolicyRule }): Promise<PolicyRule> {\n const rule = PolicyRuleSchema.parse(input.rule);\n const createdAt = nowIso();\n await db\n .insert(repoPolicyRules)\n .values({\n id: rule.id,\n provider: input.provider,\n owner: input.owner,\n repo: input.repo,\n ruleJson: JSON.stringify(rule),\n createdAt\n })\n .onConflictDoUpdate({\n target: [repoPolicyRules.provider, repoPolicyRules.owner, repoPolicyRules.repo, repoPolicyRules.id],\n set: {\n ruleJson: JSON.stringify(rule),\n createdAt\n }\n });\n return rule;\n },\n\n async listRepoPolicyRules(input: { provider: string; owner: string; repo: string }): Promise<PolicyRule[]> {\n const rows = await db\n .select()\n .from(repoPolicyRules)\n .where(and(eq(repoPolicyRules.provider, input.provider), eq(repoPolicyRules.owner, input.owner), eq(repoPolicyRules.repo, input.repo)))\n .orderBy(asc(repoPolicyRules.createdAt));\n return rows.map((row) => PolicyRuleSchema.parse(JSON.parse(row.ruleJson)));\n },\n\n async upsertRepoMutationMapping(input: {\n provider: string;\n owner: string;\n repo: string;\n mapping: AdapterMutationMapping;\n }): Promise<AdapterMutationMapping> {\n const mapping = AdapterMutationMappingSchema.parse(input.mapping);\n const createdAt = nowIso();\n await db\n .insert(repoMutationMappings)\n .values({\n id: mapping.id,\n provider: input.provider,\n owner: input.owner,\n repo: input.repo,\n mappingJson: JSON.stringify(mapping),\n createdAt\n })\n .onConflictDoUpdate({\n target: [repoMutationMappings.provider, repoMutationMappings.owner, repoMutationMappings.repo, repoMutationMappings.id],\n set: {\n mappingJson: JSON.stringify(mapping),\n createdAt\n }\n });\n return mapping;\n },\n\n async listRepoMutationMappings(input: { provider: string; owner: string; repo: string }): Promise<AdapterMutationMapping[]> {\n const rows = await db\n .select()\n .from(repoMutationMappings)\n .where(and(eq(repoMutationMappings.provider, input.provider), eq(repoMutationMappings.owner, input.owner), eq(repoMutationMappings.repo, input.repo)))\n .orderBy(asc(repoMutationMappings.createdAt));\n return rows.map((row) => AdapterMutationMappingSchema.parse(JSON.parse(row.mappingJson)));\n },\n\n async upsertChannelBinding(input: ChannelBinding): Promise<void> {\n await db\n .insert(channelBindings)\n .values({\n provider: input.provider,\n accountId: input.accountId,\n conversationId: input.conversationId,\n repoProvider: input.repoProvider,\n owner: input.owner,\n repo: input.repo,\n metadataJson: input.metadata ? JSON.stringify(input.metadata) : null,\n createdAt: nowIso()\n })\n .onConflictDoUpdate({\n target: [channelBindings.provider, channelBindings.accountId, channelBindings.conversationId],\n set: {\n repoProvider: input.repoProvider,\n owner: input.owner,\n repo: input.repo,\n metadataJson: input.metadata ? JSON.stringify(input.metadata) : null\n }\n });\n },\n\n async createSlackChannelBinding(input: SlackChannelBinding): Promise<void> {\n const repoProvider = input.repoProvider ?? \"github\";\n await db\n .insert(channelBindings)\n .values({\n provider: \"slack\",\n accountId: input.teamId,\n conversationId: input.channelId,\n repoProvider,\n owner: input.owner,\n repo: input.repo,\n metadataJson: null,\n createdAt: nowIso()\n })\n .onConflictDoUpdate({\n target: [channelBindings.provider, channelBindings.accountId, channelBindings.conversationId],\n set: {\n repoProvider,\n owner: input.owner,\n repo: input.repo\n }\n });\n },\n\n async createRun(input: {\n id: string;\n event: OpenTagEvent;\n parentRunId?: string;\n triggeredByAction?: ActionHint;\n sourceProposalId?: string;\n sourceApplyPlanId?: string;\n }): Promise<CreateRunResult> {\n const event = OpenTagEventSchema.parse(input.event);\n const triggeredByAction = input.triggeredByAction ? ActionHintSchema.parse(input.triggeredByAction) : undefined;\n const createdAt = nowIso();\n const protocolFields = protocolRunFieldsFromEvent(event, createdAt);\n const repoKey = projectTargetRefFromEvent(event);\n const insertResult = await db\n .insert(runs)\n .values({\n id: input.id,\n eventId: event.id,\n status: \"queued\",\n eventJson: JSON.stringify(event),\n contextPacketJson: JSON.stringify(protocolFields.contextPacket),\n parentRunId: input.parentRunId ?? null,\n triggeredByActionJson: triggeredByAction ? JSON.stringify(triggeredByAction) : null,\n sourceProposalId: input.sourceProposalId ?? null,\n sourceApplyPlanId: input.sourceApplyPlanId ?? null,\n repoProvider: repoKey?.provider ?? null,\n repoOwner: repoKey?.owner ?? null,\n repoName: repoKey?.repo ?? null,\n workThreadId: protocolFields.thread?.id ?? null,\n conversationKey: conversationKeyFromEvent(event),\n createdAt,\n updatedAt: createdAt\n })\n .onConflictDoNothing({ target: runs.eventId });\n if (insertResult.changes === 0) {\n const existingBySourceEvent = await db.select().from(runs).where(eq(runs.eventId, event.id)).limit(1).get();\n if (!existingBySourceEvent) {\n throw new Error(`Run already exists for event ${event.id}, but it could not be loaded`);\n }\n const replayDecision = RunAdmissionDecisionSchema.parse({\n action: \"drop_duplicate\",\n reason: \"Source event already created a run.\",\n reasonCode: \"duplicate_source_event\",\n decidedAt: createdAt,\n activeRunId: existingBySourceEvent.id,\n eventId: event.id\n });\n await appendRunEvent({\n runId: existingBySourceEvent.id,\n type: \"admission.decided\",\n payload: replayDecision,\n visibility: \"audit\",\n importance: \"normal\",\n message: replayDecision.reason,\n createdAt\n });\n await appendRunEvent({\n runId: existingBySourceEvent.id,\n type: \"run.create_idempotent_replay\",\n payload: { requestedRunId: input.id, eventId: event.id },\n visibility: \"audit\",\n importance: \"low\",\n createdAt\n });\n return { run: runFromRow(existingBySourceEvent), created: false };\n }\n const createDecision = RunAdmissionDecisionSchema.parse({\n action: \"start\",\n reason: \"Source event accepted and ready to create a run.\",\n reasonCode: \"new_event\",\n decidedAt: createdAt,\n eventId: event.id\n });\n await appendRunEvent({\n runId: input.id,\n type: \"admission.decided\",\n payload: createDecision,\n visibility: \"audit\",\n importance: \"normal\",\n message: createDecision.reason,\n createdAt\n });\n await appendRunEvent({\n runId: input.id,\n type: \"run.created\",\n payload: { eventId: event.id },\n visibility: \"audit\",\n importance: \"low\",\n createdAt\n });\n await appendRunEvent({\n runId: input.id,\n type: \"context_packet.generated\",\n payload: {\n contextPacket: protocolFields.contextPacket,\n ...(protocolFields.thread ? { thread: protocolFields.thread } : {})\n },\n visibility: \"audit\",\n importance: \"normal\",\n message: protocolFields.contextPacket.summary,\n createdAt\n });\n if (input.parentRunId) {\n await appendRunEvent({\n runId: input.parentRunId,\n type: \"run.child_created\",\n payload: {\n childRunId: input.id,\n ...(triggeredByAction ? { triggeredByAction } : {}),\n ...(input.sourceProposalId ? { sourceProposalId: input.sourceProposalId } : {}),\n ...(input.sourceApplyPlanId ? { sourceApplyPlanId: input.sourceApplyPlanId } : {})\n },\n visibility: \"audit\",\n importance: \"normal\",\n message: `Created child run ${input.id}.`,\n createdAt\n });\n }\n return {\n run: {\n id: input.id,\n eventId: event.id,\n status: \"queued\",\n ...protocolFields,\n ...(input.parentRunId ? { parentRunId: input.parentRunId } : {}),\n ...(triggeredByAction ? { triggeredByAction } : {}),\n ...(input.sourceProposalId ? { sourceProposalId: input.sourceProposalId } : {}),\n ...(input.sourceApplyPlanId ? { sourceApplyPlanId: input.sourceApplyPlanId } : {}),\n contextPacket: protocolFields.contextPacket,\n createdAt,\n updatedAt: createdAt\n },\n created: true\n };\n },\n\n async claimNextRun(input: { runnerId: string; leaseSeconds: number }): Promise<ClaimedOpenTagRun | null> {\n const now = new Date();\n const activeRows = await db\n .select()\n .from(runs)\n .where(inArray(runs.status, [\"assigned\", \"running\"]))\n .orderBy(asc(runs.createdAt));\n for (const activeRow of activeRows) {\n if (!isIsoExpired(activeRow.leaseExpiresAt, now)) continue;\n const updatedAt = nowIso();\n await db\n .update(runs)\n .set({\n status: \"queued\",\n assignedRunnerId: null,\n leasedAt: null,\n leaseExpiresAt: null,\n heartbeatAt: null,\n updatedAt\n })\n .where(eq(runs.id, activeRow.id));\n await appendRunEvent({\n runId: activeRow.id,\n type: \"run.lease_expired\",\n payload: { previousRunnerId: activeRow.assignedRunnerId, previousLeaseExpiresAt: activeRow.leaseExpiresAt },\n visibility: \"audit\",\n importance: \"normal\",\n createdAt: updatedAt\n });\n }\n\n const queuedRows = await db.select().from(runs).where(eq(runs.status, \"queued\")).orderBy(asc(runs.createdAt));\n const row = queuedRows.find((candidate) => {\n const event = OpenTagEventSchema.parse(JSON.parse(candidate.eventJson));\n const repoKey = projectTargetRefFromEvent(event);\n if (!repoKey) return false;\n const binding = db\n .select()\n .from(repoBindings)\n .where(\n and(\n eq(repoBindings.provider, repoKey.provider),\n eq(repoBindings.owner, repoKey.owner),\n eq(repoBindings.repo, repoKey.repo),\n eq(repoBindings.runnerId, input.runnerId)\n )\n )\n .limit(1)\n .get();\n return Boolean(binding);\n });\n if (!row) return null;\n\n const updatedAt = nowIso();\n const leasedAt = updatedAt;\n const leaseExpiresAt = new Date(Date.now() + input.leaseSeconds * 1000).toISOString();\n const updateResult = await db\n .update(runs)\n .set({\n status: \"assigned\",\n assignedRunnerId: input.runnerId,\n leasedAt,\n leaseExpiresAt,\n heartbeatAt: leasedAt,\n updatedAt\n })\n .where(and(eq(runs.id, row.id), eq(runs.status, \"queued\")));\n if (updateResult.changes === 0) {\n return null;\n }\n await appendRunEvent({\n runId: row.id,\n type: \"run.claimed\",\n payload: { runnerId: input.runnerId, leasedAt, leaseExpiresAt },\n visibility: \"audit\",\n importance: \"normal\",\n createdAt: updatedAt\n });\n\n return {\n run: {\n ...runFromRow({\n ...row,\n status: \"assigned\",\n assignedRunnerId: input.runnerId,\n updatedAt\n }),\n status: \"assigned\",\n assignedRunnerId: input.runnerId,\n updatedAt\n },\n event: OpenTagEventSchema.parse(JSON.parse(row.eventJson))\n };\n },\n\n async getRepoBinding(input: { provider: string; owner: string; repo: string }): Promise<RepoBinding | null> {\n const row = await db\n .select()\n .from(repoBindings)\n .where(\n and(eq(repoBindings.provider, input.provider), eq(repoBindings.owner, input.owner), eq(repoBindings.repo, input.repo))\n )\n .limit(1)\n .get();\n if (!row) return null;\n return {\n provider: row.provider,\n owner: row.owner,\n repo: row.repo,\n runnerId: row.runnerId,\n ...(row.workspacePath ? { workspacePath: row.workspacePath } : {}),\n ...(row.defaultExecutor ? { defaultExecutor: row.defaultExecutor } : {}),\n ...(row.allowedActorsJson ? { allowedActors: JSON.parse(row.allowedActorsJson) as string[] } : {})\n };\n },\n\n async getChannelBinding(input: {\n provider: string;\n accountId: string;\n conversationId: string;\n }): Promise<ChannelBinding | null> {\n const row = await db\n .select()\n .from(channelBindings)\n .where(\n and(\n eq(channelBindings.provider, input.provider),\n eq(channelBindings.accountId, input.accountId),\n eq(channelBindings.conversationId, input.conversationId)\n )\n )\n .limit(1)\n .get();\n return row ? channelBindingFromRow(row) : null;\n },\n\n async getSlackChannelBinding(input: { teamId: string; channelId: string }): Promise<SlackChannelBinding | null> {\n const row = await db\n .select()\n .from(channelBindings)\n .where(\n and(\n eq(channelBindings.provider, \"slack\"),\n eq(channelBindings.accountId, input.teamId),\n eq(channelBindings.conversationId, input.channelId)\n )\n )\n .limit(1)\n .get();\n if (!row) return null;\n const binding = channelBindingFromRow(row);\n return {\n teamId: binding.accountId,\n channelId: binding.conversationId,\n repoProvider: binding.repoProvider,\n owner: binding.owner,\n repo: binding.repo\n };\n },\n\n async heartbeat(input: { runId: string; runnerId: string; leaseSeconds?: number }): Promise<boolean> {\n const updatedAt = nowIso();\n const row = await db\n .select()\n .from(runs)\n .where(and(eq(runs.id, input.runId), eq(runs.assignedRunnerId, input.runnerId)))\n .limit(1)\n .get();\n if (!row) return false;\n const leaseSeconds = input.leaseSeconds ?? 60;\n const leaseExpiresAt = new Date(Date.now() + leaseSeconds * 1000).toISOString();\n await db\n .update(runs)\n .set({ heartbeatAt: updatedAt, leaseExpiresAt, updatedAt })\n .where(eq(runs.id, input.runId));\n await appendRunEvent({\n runId: input.runId,\n type: \"run.heartbeat\",\n payload: { runnerId: input.runnerId, heartbeatAt: updatedAt, leaseExpiresAt },\n visibility: \"debug\",\n importance: \"low\",\n createdAt: updatedAt\n });\n return true;\n },\n\n async markRunning(input: { runId: string; executor: string; runnerId?: string }): Promise<boolean> {\n const updatedAt = nowIso();\n const conditions = [eq(runs.id, input.runId)];\n if (input.runnerId) {\n conditions.push(eq(runs.assignedRunnerId, input.runnerId));\n }\n const updateResult = await db\n .update(runs)\n .set({ status: \"running\", executor: input.executor, updatedAt })\n .where(and(...conditions));\n if (updateResult.changes === 0) {\n return false;\n }\n await appendRunEvent({\n runId: input.runId,\n type: \"run.running\",\n payload: input.runnerId ? { runnerId: input.runnerId, executor: input.executor } : { executor: input.executor },\n visibility: \"audit\",\n importance: \"normal\",\n createdAt: updatedAt\n });\n return true;\n },\n\n async completeRun(input: { runId: string; result: OpenTagRunResult; runnerId?: string }): Promise<boolean> {\n const result = OpenTagRunResultSchema.parse(input.result);\n const updatedAt = nowIso();\n const status =\n result.conclusion === \"success\"\n ? \"succeeded\"\n : result.conclusion === \"cancelled\"\n ? \"cancelled\"\n : result.conclusion === \"needs_human\"\n ? \"needs_approval\"\n : \"failed\";\n const runRow = await db.select().from(runs).where(eq(runs.id, input.runId)).limit(1).get();\n if (!runRow) {\n if (input.runnerId) return false;\n throw new Error(`Run not found: ${input.runId}`);\n }\n if (input.runnerId && runRow.assignedRunnerId !== input.runnerId) {\n return false;\n }\n const runThread = runRow ? protocolRunFieldsFromEvent(OpenTagEventSchema.parse(JSON.parse(runRow.eventJson)), runRow.createdAt).thread : undefined;\n await db\n .update(runs)\n .set({\n status,\n resultJson: JSON.stringify(result),\n assignedRunnerId: null,\n leasedAt: null,\n leaseExpiresAt: null,\n heartbeatAt: null,\n updatedAt\n })\n .where(input.runnerId ? and(eq(runs.id, input.runId), eq(runs.assignedRunnerId, input.runnerId)) : eq(runs.id, input.runId));\n for (const snapshot of result.suggestedChanges ?? []) {\n const parsedSnapshot = SuggestedChangesSnapshotSchema.parse({\n ...snapshot,\n sourceRunId: snapshot.sourceRunId ?? input.runId,\n ...(snapshot.workThread || !runThread ? {} : { workThread: runThread })\n });\n await db\n .insert(suggestedChanges)\n .values({\n proposalId: parsedSnapshot.proposalId,\n runId: input.runId,\n snapshotJson: JSON.stringify(parsedSnapshot),\n createdAt: parsedSnapshot.createdAt\n })\n .onConflictDoUpdate({\n target: suggestedChanges.proposalId,\n set: {\n runId: input.runId,\n snapshotJson: JSON.stringify(parsedSnapshot),\n createdAt: parsedSnapshot.createdAt\n }\n });\n await appendRunEvent({\n runId: input.runId,\n type: \"proposal.snapshot.created\",\n payload: parsedSnapshot,\n visibility: \"audit\",\n importance: \"high\",\n message: parsedSnapshot.summary,\n createdAt: updatedAt\n });\n }\n await appendRunEvent({\n runId: input.runId,\n type: \"run.completed\",\n payload: result,\n visibility: \"audit\",\n importance: \"high\",\n message: result.summary,\n createdAt: updatedAt\n });\n if ((result.suggestedChanges?.length ?? 0) > 0 || (result.artifacts?.length ?? 0) > 0) {\n await appendRunEvent({\n runId: input.runId,\n type: \"success_metric.observed\",\n payload: {\n metric: \"time_to_first_useful_artifact\",\n artifactCount: result.artifacts?.length ?? 0,\n suggestedChangesCount: result.suggestedChanges?.length ?? 0\n },\n visibility: \"audit\",\n importance: \"normal\",\n createdAt: updatedAt\n });\n }\n return true;\n },\n\n async getSuggestedChanges(input: { proposalId: string }): Promise<StoredSuggestedChangesSnapshot | null> {\n const row = await db.select().from(suggestedChanges).where(eq(suggestedChanges.proposalId, input.proposalId)).limit(1).get();\n if (!row) return null;\n return {\n runId: row.runId,\n snapshot: SuggestedChangesSnapshotSchema.parse(JSON.parse(row.snapshotJson))\n };\n },\n\n async listSuggestedChangesForRun(input: { runId: string }): Promise<SuggestedChangesSnapshot[]> {\n const rows = await db.select().from(suggestedChanges).where(eq(suggestedChanges.runId, input.runId)).orderBy(asc(suggestedChanges.createdAt));\n return rows.map((row) => SuggestedChangesSnapshotSchema.parse(JSON.parse(row.snapshotJson)));\n },\n\n async listLatestSuggestedChangesForConversation(input: {\n conversationKey: string;\n }): Promise<StoredSuggestedChangesInConversation[]> {\n const runRows = await db\n .select()\n .from(runs)\n .where(eq(runs.conversationKey, input.conversationKey))\n .orderBy(asc(runs.createdAt));\n for (const runRow of [...runRows].reverse()) {\n const proposalRows = await db\n .select()\n .from(suggestedChanges)\n .where(eq(suggestedChanges.runId, runRow.id))\n .orderBy(asc(suggestedChanges.createdAt));\n if (proposalRows.length === 0) continue;\n const run = runFromRow(runRow);\n const event = OpenTagEventSchema.parse(JSON.parse(runRow.eventJson));\n return proposalRows.map((row) => ({\n runId: row.runId,\n run,\n event,\n snapshot: SuggestedChangesSnapshotSchema.parse(JSON.parse(row.snapshotJson))\n }));\n }\n return [];\n },\n\n async getProposalLineage(input: { proposalId: string }): Promise<ProposalLineage | null> {\n const targetRow = await db.select().from(suggestedChanges).where(eq(suggestedChanges.proposalId, input.proposalId)).limit(1).get();\n if (!targetRow) return null;\n const target = {\n runId: targetRow.runId,\n snapshot: SuggestedChangesSnapshotSchema.parse(JSON.parse(targetRow.snapshotJson))\n };\n const rows = await db.select().from(suggestedChanges).orderBy(asc(suggestedChanges.createdAt));\n const snapshots = rows.map((row) => ({\n runId: row.runId,\n snapshot: SuggestedChangesSnapshotSchema.parse(JSON.parse(row.snapshotJson))\n }));\n return computeProposalLineage(snapshots, lineageScopeKey(target));\n },\n\n async listCurrentMutationIntents(input: { proposalId: string }): Promise<MutationIntentActionability[] | null> {\n const targetRow = await db.select().from(suggestedChanges).where(eq(suggestedChanges.proposalId, input.proposalId)).limit(1).get();\n if (!targetRow) return null;\n const rows = await db.select().from(suggestedChanges).orderBy(asc(suggestedChanges.createdAt));\n const lineage = computeProposalLineage(\n rows.map((row) => ({\n runId: row.runId,\n snapshot: SuggestedChangesSnapshotSchema.parse(JSON.parse(row.snapshotJson))\n })),\n lineageScopeKey({\n runId: targetRow.runId,\n snapshot: SuggestedChangesSnapshotSchema.parse(JSON.parse(targetRow.snapshotJson))\n })\n );\n if (!lineage) return null;\n return lineage.entries.filter((entry) => entry.status === \"current\");\n },\n\n async recordApprovalDecision(input: ApprovalDecision): Promise<ApprovalDecision | null> {\n const decision = ApprovalDecisionSchema.parse(input);\n const storedProposalRow = await db\n .select()\n .from(suggestedChanges)\n .where(eq(suggestedChanges.proposalId, decision.proposalId))\n .limit(1)\n .get();\n if (!storedProposalRow) return null;\n await db\n .insert(approvalDecisions)\n .values({\n id: decision.id,\n proposalId: decision.proposalId,\n decisionJson: JSON.stringify(decision),\n createdAt: decision.approvedAt\n })\n .onConflictDoUpdate({\n target: approvalDecisions.id,\n set: {\n proposalId: decision.proposalId,\n decisionJson: JSON.stringify(decision),\n createdAt: decision.approvedAt\n }\n });\n await appendRunEvent({\n runId: storedProposalRow.runId,\n type: \"approval.decision.recorded\",\n payload: decision,\n visibility: \"audit\",\n importance: \"high\",\n message: `Approved ${decision.approvedIntentIds.length} intent(s).`,\n createdAt: decision.approvedAt\n });\n await appendRunEvent({\n runId: storedProposalRow.runId,\n type: \"success_metric.observed\",\n payload: {\n metric: \"external_write_approval_rate\",\n proposalId: decision.proposalId,\n approvedIntentCount: decision.approvedIntentIds.length\n },\n visibility: \"audit\",\n importance: \"normal\",\n createdAt: decision.approvedAt\n });\n return decision;\n },\n\n async getApprovalDecision(input: { id: string }): Promise<ApprovalDecision | null> {\n const row = await db.select().from(approvalDecisions).where(eq(approvalDecisions.id, input.id)).limit(1).get();\n return row ? ApprovalDecisionSchema.parse(JSON.parse(row.decisionJson)) : null;\n },\n\n async createApplyPlan(input: {\n id: string;\n proposalId: string;\n approvalDecisionId: string;\n selectedIntentIds?: string[];\n adapter?: string;\n policyRules?: PolicyRule[];\n }): Promise<ApplyPlan | null> {\n const built = await buildApplyPlan(input);\n if (!built) return null;\n await db\n .insert(applyPlans)\n .values({\n id: built.plan.id,\n proposalId: built.plan.proposalId,\n approvalDecisionId: built.plan.approvalDecisionId,\n planJson: JSON.stringify(built.plan),\n createdAt: built.createdAt\n })\n .onConflictDoUpdate({\n target: applyPlans.id,\n set: {\n proposalId: built.plan.proposalId,\n approvalDecisionId: built.plan.approvalDecisionId,\n planJson: JSON.stringify(built.plan),\n createdAt: built.createdAt\n }\n });\n await appendApplyPlanCreatedEvent(built);\n return built.plan;\n },\n\n async createApplyPlanOnce(input: {\n id: string;\n proposalId: string;\n approvalDecisionId: string;\n selectedIntentIds?: string[];\n adapter?: string;\n policyRules?: PolicyRule[];\n }): Promise<{ plan: ApplyPlan; created: boolean } | null> {\n const built = await buildApplyPlan(input);\n if (!built) return null;\n const result = db.transaction((tx) => {\n const insertResult = tx\n .insert(applyPlans)\n .values({\n id: built.plan.id,\n proposalId: built.plan.proposalId,\n approvalDecisionId: built.plan.approvalDecisionId,\n planJson: JSON.stringify(built.plan),\n createdAt: built.createdAt\n })\n .onConflictDoNothing({ target: applyPlans.id })\n .run();\n if (insertResult.changes === 0) {\n return { created: false as const };\n }\n tx.insert(runEvents).values(applyPlanCreatedEventRow(built)).run();\n return { created: true as const };\n });\n if (!result.created) {\n const existing = await db.select().from(applyPlans).where(eq(applyPlans.id, input.id)).limit(1).get();\n if (!existing) {\n throw new Error(`Apply plan ${input.id} already exists but could not be loaded`);\n }\n return { plan: ApplyPlanSchema.parse(JSON.parse(existing.planJson)), created: false };\n }\n return { plan: built.plan, created: true };\n },\n\n async getApplyPlan(input: { id: string }): Promise<ApplyPlan | null> {\n const row = await db.select().from(applyPlans).where(eq(applyPlans.id, input.id)).limit(1).get();\n return row ? ApplyPlanSchema.parse(JSON.parse(row.planJson)) : null;\n },\n\n async updateApplyPlanOutcomes(input: { id: string; outcomes: ApplyIntentOutcome[]; externalWritesExecuted: boolean }): Promise<ApplyPlan | null> {\n const row = await db.select().from(applyPlans).where(eq(applyPlans.id, input.id)).limit(1).get();\n if (!row) return null;\n const currentPlan = ApplyPlanSchema.parse(JSON.parse(row.planJson));\n const outcomes = input.outcomes.map((outcome) => ApplyIntentOutcomeSchema.parse(outcome));\n const updatedPlan = ApplyPlanSchema.parse({\n ...currentPlan,\n adapterPlan: {\n ...(currentPlan.adapterPlan && typeof currentPlan.adapterPlan === \"object\" && !Array.isArray(currentPlan.adapterPlan)\n ? currentPlan.adapterPlan\n : {}),\n externalWritesExecuted: input.externalWritesExecuted\n },\n outcomes\n });\n const updatedAt = nowIso();\n await db\n .update(applyPlans)\n .set({ planJson: JSON.stringify(updatedPlan), createdAt: row.createdAt })\n .where(eq(applyPlans.id, input.id));\n\n const storedProposalRow = await db\n .select()\n .from(suggestedChanges)\n .where(eq(suggestedChanges.proposalId, updatedPlan.proposalId))\n .limit(1)\n .get();\n if (storedProposalRow) {\n await appendRunEvent({\n runId: storedProposalRow.runId,\n type: \"apply_plan.executed\",\n payload: updatedPlan,\n visibility: \"audit\",\n importance: \"high\",\n message: `Executed apply plan with ${outcomes.length} outcome(s).`,\n createdAt: updatedAt\n });\n }\n return updatedPlan;\n },\n\n async recordProgress(input: {\n runId: string;\n message: string;\n type?: string;\n at?: string;\n visibility?: RunEventVisibility;\n importance?: RunEventImportance;\n runnerId?: string;\n }): Promise<boolean> {\n if (input.runnerId) {\n const row = await db\n .select()\n .from(runs)\n .where(and(eq(runs.id, input.runId), eq(runs.assignedRunnerId, input.runnerId)))\n .limit(1)\n .get();\n if (!row) return false;\n }\n await appendRunEvent({\n runId: input.runId,\n type: \"run.progress\",\n payload: {\n ...(input.runnerId ? { runnerId: input.runnerId } : {}),\n type: input.type ?? \"progress\",\n message: input.message,\n at: input.at ?? nowIso()\n },\n visibility: input.visibility ?? \"audit\",\n importance: input.importance ?? \"normal\",\n message: input.message,\n createdAt: input.at ?? nowIso()\n });\n return true;\n },\n\n async getRun(input: { runId: string }): Promise<ClaimedOpenTagRun | null> {\n const row = await db.select().from(runs).where(eq(runs.id, input.runId)).limit(1).get();\n if (!row) return null;\n return {\n run: runFromRow(row),\n event: OpenTagEventSchema.parse(JSON.parse(row.eventJson))\n };\n },\n\n async listRunEvents(input: { runId: string }): Promise<OpenTagAuditEvent[]> {\n const rows = await db.select().from(runEvents).where(eq(runEvents.runId, input.runId)).orderBy(asc(runEvents.id));\n return rows.map((row) => ({\n id: row.id,\n runId: row.runId,\n type: row.type,\n visibility: RunEventVisibilitySchema.parse(row.visibility),\n importance: RunEventImportanceSchema.parse(row.importance),\n ...(row.message ? { message: row.message } : {}),\n payload: JSON.parse(row.payloadJson) as unknown,\n createdAt: row.createdAt\n }));\n },\n\n async enqueueCallbackDelivery(input: {\n runId: string;\n kind: CallbackDeliveryKind;\n provider: CallbackDeliveryProvider;\n uri: string;\n body: string;\n threadKey?: string;\n agentId?: string;\n statusMessageKey?: string;\n blocks?: unknown[];\n }): Promise<CallbackDelivery> {\n const createdAt = nowIso();\n const rows = await db\n .insert(callbackDeliveries)\n .values({\n runId: input.runId,\n kind: input.kind,\n provider: input.provider,\n uri: input.uri,\n body: input.body,\n threadKey: input.threadKey ?? null,\n metadataJson: JSON.stringify({\n ...(input.agentId ? { agentId: input.agentId } : {}),\n ...(input.statusMessageKey ? { statusMessageKey: input.statusMessageKey } : {}),\n ...(input.blocks ? { blocks: input.blocks } : {})\n }),\n status: \"pending\",\n createdAt,\n updatedAt: createdAt\n })\n .returning();\n const row = rows[0];\n if (!row) throw new Error(\"callback delivery was not created\");\n await appendRunEvent({\n runId: input.runId,\n type: `callback.${input.kind}.queued`,\n payload: callbackDeliveryFromRow(row),\n visibility: \"audit\",\n importance: \"normal\",\n createdAt\n });\n return callbackDeliveryFromRow(row);\n },\n\n async markCallbackDelivered(input: { deliveryId: number }): Promise<void> {\n const updatedAt = nowIso();\n const row = await db\n .select()\n .from(callbackDeliveries)\n .where(eq(callbackDeliveries.id, input.deliveryId))\n .limit(1)\n .get();\n if (!row) return;\n await db\n .update(callbackDeliveries)\n .set({ status: \"delivered\", attempts: row.attempts + 1, lastError: null, nextAttemptAt: null, updatedAt })\n .where(eq(callbackDeliveries.id, input.deliveryId));\n await appendRunEvent({\n runId: row.runId,\n type: `callback.${row.kind}.delivered`,\n payload: { ...callbackDeliveryFromRow(row), status: \"delivered\", attempts: row.attempts + 1, updatedAt },\n visibility: \"human\",\n importance: row.kind === \"final\" ? \"high\" : \"normal\",\n message: row.body,\n createdAt: updatedAt\n });\n },\n\n async markCallbackFailed(input: { deliveryId: number; error: string; nextAttemptAt?: string }): Promise<void> {\n const updatedAt = nowIso();\n const row = await db\n .select()\n .from(callbackDeliveries)\n .where(eq(callbackDeliveries.id, input.deliveryId))\n .limit(1)\n .get();\n if (!row) return;\n await db\n .update(callbackDeliveries)\n .set({ status: \"failed\", attempts: row.attempts + 1, lastError: input.error, nextAttemptAt: input.nextAttemptAt ?? null, updatedAt })\n .where(eq(callbackDeliveries.id, input.deliveryId));\n await appendRunEvent({\n runId: row.runId,\n type: `callback.${row.kind}.failed`,\n payload: {\n ...callbackDeliveryFromRow(row),\n status: \"failed\",\n attempts: row.attempts + 1,\n lastError: input.error,\n ...(input.nextAttemptAt ? { nextAttemptAt: input.nextAttemptAt } : {}),\n updatedAt\n },\n visibility: \"audit\",\n importance: \"normal\",\n createdAt: updatedAt\n });\n },\n\n async listPendingCallbackDeliveries(input: { limit: number; now?: Date; maxAttempts?: number }): Promise<CallbackDelivery[]> {\n const now = input.now ?? new Date();\n const maxAttempts = input.maxAttempts ?? Number.POSITIVE_INFINITY;\n const rows = await db\n .select()\n .from(callbackDeliveries)\n .where(inArray(callbackDeliveries.status, [\"pending\", \"failed\"]))\n .orderBy(asc(callbackDeliveries.id));\n return rows\n .map(callbackDeliveryFromRow)\n .filter((delivery) => delivery.attempts < maxAttempts)\n .filter((delivery) => !delivery.nextAttemptAt || new Date(delivery.nextAttemptAt).getTime() <= now.getTime())\n .slice(0, input.limit);\n },\n\n async claimPendingCallbackDeliveries(input: { limit: number; now?: Date; maxAttempts?: number; staleDeliveryThresholdMs?: number }): Promise<CallbackDelivery[]> {\n const now = input.now ?? new Date();\n const maxAttempts = input.maxAttempts ?? Number.POSITIVE_INFINITY;\n const staleThresholdMs = input.staleDeliveryThresholdMs ?? 60_000;\n const staleDeliveryCutoff = new Date(now.getTime() - staleThresholdMs).toISOString();\n\n const rows = await db\n .select()\n .from(callbackDeliveries)\n .where(inArray(callbackDeliveries.status, [\"pending\", \"failed\", \"delivering\"]))\n .orderBy(asc(callbackDeliveries.id));\n\n const claimed: CallbackDelivery[] = [];\n for (const row of rows) {\n const delivery = callbackDeliveryFromRow(row);\n if (delivery.attempts >= maxAttempts) continue;\n if (delivery.nextAttemptAt && new Date(delivery.nextAttemptAt).getTime() > now.getTime()) continue;\n if (row.status === \"delivering\" && row.updatedAt > staleDeliveryCutoff) continue;\n\n const updatedAt = input.now ? input.now.toISOString() : nowIso();\n const claimWhere =\n row.status === \"delivering\"\n ? and(eq(callbackDeliveries.id, row.id), eq(callbackDeliveries.status, \"delivering\"), eq(callbackDeliveries.updatedAt, row.updatedAt))\n : and(eq(callbackDeliveries.id, row.id), inArray(callbackDeliveries.status, [\"pending\", \"failed\"]));\n const claimResult = await db.update(callbackDeliveries).set({ status: \"delivering\", updatedAt }).where(claimWhere);\n if (claimResult.changes === 0) continue;\n\n claimed.push({\n ...delivery,\n status: \"delivering\",\n updatedAt\n });\n if (claimed.length >= input.limit) break;\n }\n\n return claimed;\n },\n\n async getRunMetrics(input: { runId: string }): Promise<OpenTagRunMetrics> {\n const rows = await db.select().from(runEvents).where(eq(runEvents.runId, input.runId)).orderBy(asc(runEvents.id));\n const events = rows.map((row) => ({\n id: row.id,\n runId: row.runId,\n type: row.type,\n visibility: RunEventVisibilitySchema.parse(row.visibility),\n importance: RunEventImportanceSchema.parse(row.importance),\n ...(row.message ? { message: row.message } : {}),\n payload: JSON.parse(row.payloadJson) as unknown,\n createdAt: row.createdAt\n }));\n return metricsFromEvents(input.runId, events);\n },\n\n async getRepoMetrics(input: { provider: string; owner: string; repo: string }): Promise<OpenTagAggregateMetrics> {\n const runRows = await db\n .select()\n .from(runs)\n .where(and(eq(runs.repoProvider, input.provider), eq(runs.repoOwner, input.owner), eq(runs.repoName, input.repo)))\n .orderBy(asc(runs.createdAt));\n const matchingRunIds = runRows.map((row) => row.id);\n const runMetrics = [];\n for (const runId of matchingRunIds) {\n const rows = await db.select().from(runEvents).where(eq(runEvents.runId, runId)).orderBy(asc(runEvents.id));\n runMetrics.push(\n metricsFromEvents(\n runId,\n rows.map((row) => ({\n id: row.id,\n runId: row.runId,\n type: row.type,\n visibility: RunEventVisibilitySchema.parse(row.visibility),\n importance: RunEventImportanceSchema.parse(row.importance),\n ...(row.message ? { message: row.message } : {}),\n payload: JSON.parse(row.payloadJson) as unknown,\n createdAt: row.createdAt\n }))\n )\n );\n }\n return aggregateMetrics({\n scope: \"repo\",\n scopeId: `${input.provider}:${input.owner}/${input.repo}`,\n runs: runMetrics\n });\n },\n\n async getWorkThreadMetrics(input: { threadId: string }): Promise<OpenTagAggregateMetrics> {\n const runRows = await db.select().from(runs).where(eq(runs.workThreadId, input.threadId)).orderBy(asc(runs.createdAt));\n const matchingRunIds = runRows.map((row) => row.id);\n const runMetrics = [];\n for (const runId of matchingRunIds) {\n const rows = await db.select().from(runEvents).where(eq(runEvents.runId, runId)).orderBy(asc(runEvents.id));\n runMetrics.push(\n metricsFromEvents(\n runId,\n rows.map((row) => ({\n id: row.id,\n runId: row.runId,\n type: row.type,\n visibility: RunEventVisibilitySchema.parse(row.visibility),\n importance: RunEventImportanceSchema.parse(row.importance),\n ...(row.message ? { message: row.message } : {}),\n payload: JSON.parse(row.payloadJson) as unknown,\n createdAt: row.createdAt\n }))\n )\n );\n }\n return aggregateMetrics({\n scope: \"work_thread\",\n scopeId: input.threadId,\n runs: runMetrics\n });\n }\n };\n}\n","import type Database from \"better-sqlite3\";\nimport { index, integer, primaryKey, sqliteTable, text, uniqueIndex } from \"drizzle-orm/sqlite-core\";\n\nexport const runs = sqliteTable(\n \"runs\",\n {\n id: text(\"id\").primaryKey(),\n eventId: text(\"event_id\").notNull(),\n status: text(\"status\").notNull(),\n eventJson: text(\"event_json\").notNull(),\n contextPacketJson: text(\"context_packet_json\"),\n resultJson: text(\"result_json\"),\n assignedRunnerId: text(\"assigned_runner_id\"),\n executor: text(\"executor\"),\n parentRunId: text(\"parent_run_id\"),\n triggeredByActionJson: text(\"triggered_by_action_json\"),\n sourceProposalId: text(\"source_proposal_id\"),\n sourceApplyPlanId: text(\"source_apply_plan_id\"),\n repoProvider: text(\"repo_provider\"),\n repoOwner: text(\"repo_owner\"),\n repoName: text(\"repo_name\"),\n workThreadId: text(\"work_thread_id\"),\n conversationKey: text(\"conversation_key\"),\n leasedAt: text(\"leased_at\"),\n leaseExpiresAt: text(\"lease_expires_at\"),\n heartbeatAt: text(\"heartbeat_at\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull()\n },\n (table) => ({\n statusIdx: index(\"runs_status_idx\").on(table.status),\n runnerIdx: index(\"runs_runner_idx\").on(table.assignedRunnerId),\n repoIdx: index(\"runs_repo_idx\").on(table.repoProvider, table.repoOwner, table.repoName),\n workThreadIdx: index(\"runs_work_thread_idx\").on(table.workThreadId),\n conversationIdx: index(\"runs_conversation_idx\").on(table.conversationKey)\n })\n);\n\nexport const followUpRequests = sqliteTable(\n \"follow_up_requests\",\n {\n id: text(\"id\").primaryKey(),\n sourceEventId: text(\"source_event_id\").notNull(),\n conversationKey: text(\"conversation_key\").notNull(),\n activeRunId: text(\"active_run_id\"),\n eventJson: text(\"event_json\").notNull(),\n decisionJson: text(\"decision_json\").notNull(),\n status: text(\"status\").notNull(),\n createdRunId: text(\"created_run_id\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull()\n },\n (table) => ({\n sourceEventIdx: uniqueIndex(\"follow_up_requests_source_event_idx\").on(table.sourceEventId),\n conversationIdx: index(\"follow_up_requests_conversation_idx\").on(table.conversationKey, table.status)\n })\n);\n\nexport const runEvents = sqliteTable(\n \"run_events\",\n {\n id: integer(\"id\").primaryKey({ autoIncrement: true }),\n runId: text(\"run_id\").notNull(),\n type: text(\"type\").notNull(),\n visibility: text(\"visibility\").notNull().default(\"audit\"),\n importance: text(\"importance\").notNull().default(\"normal\"),\n message: text(\"message\"),\n payloadJson: text(\"payload_json\").notNull(),\n createdAt: text(\"created_at\").notNull()\n },\n (table) => ({\n runIdx: index(\"run_events_run_idx\").on(table.runId)\n })\n);\n\nexport const suggestedChanges = sqliteTable(\"suggested_changes\", {\n proposalId: text(\"proposal_id\").primaryKey(),\n runId: text(\"run_id\").notNull(),\n snapshotJson: text(\"snapshot_json\").notNull(),\n createdAt: text(\"created_at\").notNull()\n});\n\nexport const approvalDecisions = sqliteTable(\"approval_decisions\", {\n id: text(\"id\").primaryKey(),\n proposalId: text(\"proposal_id\").notNull(),\n decisionJson: text(\"decision_json\").notNull(),\n createdAt: text(\"created_at\").notNull()\n});\n\nexport const applyPlans = sqliteTable(\"apply_plans\", {\n id: text(\"id\").primaryKey(),\n proposalId: text(\"proposal_id\").notNull(),\n approvalDecisionId: text(\"approval_decision_id\").notNull(),\n planJson: text(\"plan_json\").notNull(),\n createdAt: text(\"created_at\").notNull()\n});\n\nexport const runners = sqliteTable(\"runners\", {\n runnerId: text(\"runner_id\").primaryKey(),\n name: text(\"name\").notNull(),\n createdAt: text(\"created_at\").notNull(),\n heartbeatAt: text(\"heartbeat_at\")\n});\n\nexport const repoBindings = sqliteTable(\n \"repo_bindings\",\n {\n id: integer(\"id\").primaryKey({ autoIncrement: true }),\n provider: text(\"provider\").notNull(),\n owner: text(\"owner\").notNull(),\n repo: text(\"repo\").notNull(),\n runnerId: text(\"runner_id\").notNull(),\n workspacePath: text(\"workspace_path\"),\n defaultExecutor: text(\"default_executor\"),\n allowedActorsJson: text(\"allowed_actors_json\"),\n createdAt: text(\"created_at\").notNull()\n },\n (table) => ({\n repoUniqueIdx: uniqueIndex(\"repo_bindings_provider_owner_repo_idx\").on(table.provider, table.owner, table.repo)\n })\n);\n\nexport const repoPolicyRules = sqliteTable(\n \"repo_policy_rules\",\n {\n id: text(\"id\").notNull(),\n provider: text(\"provider\").notNull(),\n owner: text(\"owner\").notNull(),\n repo: text(\"repo\").notNull(),\n ruleJson: text(\"rule_json\").notNull(),\n createdAt: text(\"created_at\").notNull()\n },\n (table) => ({\n pk: primaryKey({ columns: [table.provider, table.owner, table.repo, table.id] })\n })\n);\n\nexport const repoMutationMappings = sqliteTable(\n \"repo_mutation_mappings\",\n {\n id: text(\"id\").notNull(),\n provider: text(\"provider\").notNull(),\n owner: text(\"owner\").notNull(),\n repo: text(\"repo\").notNull(),\n mappingJson: text(\"mapping_json\").notNull(),\n createdAt: text(\"created_at\").notNull()\n },\n (table) => ({\n pk: primaryKey({ columns: [table.provider, table.owner, table.repo, table.id] })\n })\n);\n\nexport const channelBindings = sqliteTable(\n \"channel_bindings\",\n {\n id: integer(\"id\").primaryKey({ autoIncrement: true }),\n provider: text(\"provider\").notNull(),\n accountId: text(\"account_id\").notNull(),\n conversationId: text(\"conversation_id\").notNull(),\n repoProvider: text(\"repo_provider\").notNull(),\n owner: text(\"owner\").notNull(),\n repo: text(\"repo\").notNull(),\n metadataJson: text(\"metadata_json\"),\n createdAt: text(\"created_at\").notNull()\n },\n (table) => ({\n channelBindingUniqueIdx: uniqueIndex(\"channel_bindings_provider_account_conversation_idx\").on(\n table.provider,\n table.accountId,\n table.conversationId\n )\n })\n);\n\nexport const callbackDeliveries = sqliteTable(\n \"callback_deliveries\",\n {\n id: integer(\"id\").primaryKey({ autoIncrement: true }),\n runId: text(\"run_id\").notNull(),\n kind: text(\"kind\").notNull(),\n provider: text(\"provider\").notNull(),\n uri: text(\"uri\").notNull(),\n body: text(\"body\").notNull(),\n threadKey: text(\"thread_key\"),\n metadataJson: text(\"metadata_json\"),\n status: text(\"status\").notNull(),\n attempts: integer(\"attempts\").notNull().default(0),\n lastError: text(\"last_error\"),\n nextAttemptAt: text(\"next_attempt_at\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull()\n },\n (table) => ({\n callbackRunIdx: index(\"callback_deliveries_run_idx\").on(table.runId),\n callbackStatusIdx: index(\"callback_deliveries_status_idx\").on(table.status)\n })\n);\n\nexport function migrateSchema(sqlite: Database.Database): void {\n sqlite.exec(`\n CREATE TABLE IF NOT EXISTS runs (\n id TEXT PRIMARY KEY,\n event_id TEXT NOT NULL,\n status TEXT NOT NULL,\n event_json TEXT NOT NULL,\n context_packet_json TEXT,\n result_json TEXT,\n assigned_runner_id TEXT,\n executor TEXT,\n parent_run_id TEXT,\n triggered_by_action_json TEXT,\n source_proposal_id TEXT,\n source_apply_plan_id TEXT,\n repo_provider TEXT,\n repo_owner TEXT,\n repo_name TEXT,\n work_thread_id TEXT,\n conversation_key TEXT,\n leased_at TEXT,\n lease_expires_at TEXT,\n heartbeat_at TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n CREATE INDEX IF NOT EXISTS runs_status_idx ON runs(status);\n CREATE INDEX IF NOT EXISTS runs_runner_idx ON runs(assigned_runner_id);\n CREATE INDEX IF NOT EXISTS runs_conversation_idx ON runs(conversation_key);\n CREATE TABLE IF NOT EXISTS run_events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n run_id TEXT NOT NULL,\n type TEXT NOT NULL,\n visibility TEXT NOT NULL DEFAULT 'audit',\n importance TEXT NOT NULL DEFAULT 'normal',\n message TEXT,\n payload_json TEXT NOT NULL,\n created_at TEXT NOT NULL\n );\n CREATE INDEX IF NOT EXISTS run_events_run_idx ON run_events(run_id);\n CREATE TABLE IF NOT EXISTS suggested_changes (\n proposal_id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n snapshot_json TEXT NOT NULL,\n created_at TEXT NOT NULL\n );\n CREATE TABLE IF NOT EXISTS approval_decisions (\n id TEXT PRIMARY KEY,\n proposal_id TEXT NOT NULL,\n decision_json TEXT NOT NULL,\n created_at TEXT NOT NULL\n );\n CREATE TABLE IF NOT EXISTS apply_plans (\n id TEXT PRIMARY KEY,\n proposal_id TEXT NOT NULL,\n approval_decision_id TEXT NOT NULL,\n plan_json TEXT NOT NULL,\n created_at TEXT NOT NULL\n );\n CREATE TABLE IF NOT EXISTS runners (\n runner_id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n created_at TEXT NOT NULL,\n heartbeat_at TEXT\n );\n CREATE TABLE IF NOT EXISTS repo_bindings (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n provider TEXT NOT NULL,\n owner TEXT NOT NULL,\n repo TEXT NOT NULL,\n runner_id TEXT NOT NULL,\n workspace_path TEXT,\n default_executor TEXT,\n allowed_actors_json TEXT,\n created_at TEXT NOT NULL\n );\n CREATE UNIQUE INDEX IF NOT EXISTS repo_bindings_provider_owner_repo_idx\n ON repo_bindings(provider, owner, repo);\n CREATE TABLE IF NOT EXISTS repo_policy_rules (\n id TEXT NOT NULL,\n provider TEXT NOT NULL,\n owner TEXT NOT NULL,\n repo TEXT NOT NULL,\n rule_json TEXT NOT NULL,\n created_at TEXT NOT NULL,\n PRIMARY KEY (provider, owner, repo, id)\n );\n CREATE UNIQUE INDEX IF NOT EXISTS repo_policy_rules_repo_id_idx\n ON repo_policy_rules(provider, owner, repo, id);\n CREATE TABLE IF NOT EXISTS repo_mutation_mappings (\n id TEXT NOT NULL,\n provider TEXT NOT NULL,\n owner TEXT NOT NULL,\n repo TEXT NOT NULL,\n mapping_json TEXT NOT NULL,\n created_at TEXT NOT NULL,\n PRIMARY KEY (provider, owner, repo, id)\n );\n CREATE UNIQUE INDEX IF NOT EXISTS repo_mutation_mappings_repo_id_idx\n ON repo_mutation_mappings(provider, owner, repo, id);\n CREATE TABLE IF NOT EXISTS channel_bindings (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n provider TEXT NOT NULL,\n account_id TEXT NOT NULL,\n conversation_id TEXT NOT NULL,\n repo_provider TEXT NOT NULL,\n owner TEXT NOT NULL,\n repo TEXT NOT NULL,\n metadata_json TEXT,\n created_at TEXT NOT NULL\n );\n CREATE UNIQUE INDEX IF NOT EXISTS channel_bindings_provider_account_conversation_idx\n ON channel_bindings(provider, account_id, conversation_id);\n CREATE TABLE IF NOT EXISTS callback_deliveries (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n run_id TEXT NOT NULL,\n kind TEXT NOT NULL,\n provider TEXT NOT NULL,\n uri TEXT NOT NULL,\n body TEXT NOT NULL,\n thread_key TEXT,\n metadata_json TEXT,\n status TEXT NOT NULL,\n attempts INTEGER NOT NULL DEFAULT 0,\n last_error TEXT,\n next_attempt_at TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n CREATE INDEX IF NOT EXISTS callback_deliveries_run_idx\n ON callback_deliveries(run_id);\n CREATE INDEX IF NOT EXISTS callback_deliveries_status_idx\n ON callback_deliveries(status);\n CREATE TABLE IF NOT EXISTS follow_up_requests (\n id TEXT PRIMARY KEY,\n source_event_id TEXT NOT NULL,\n conversation_key TEXT NOT NULL,\n active_run_id TEXT,\n event_json TEXT NOT NULL,\n decision_json TEXT NOT NULL,\n status TEXT NOT NULL,\n created_run_id TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n CREATE UNIQUE INDEX IF NOT EXISTS follow_up_requests_source_event_idx\n ON follow_up_requests(source_event_id);\n CREATE INDEX IF NOT EXISTS follow_up_requests_conversation_idx\n ON follow_up_requests(conversation_key, status);\n `);\n const columns = sqlite.prepare(\"PRAGMA table_info(repo_bindings)\").all() as { name: string }[];\n const columnNames = new Set(columns.map((column) => column.name));\n if (!columnNames.has(\"workspace_path\")) {\n sqlite.exec(\"ALTER TABLE repo_bindings ADD COLUMN workspace_path TEXT\");\n }\n if (!columnNames.has(\"default_executor\")) {\n sqlite.exec(\"ALTER TABLE repo_bindings ADD COLUMN default_executor TEXT\");\n }\n if (!columnNames.has(\"allowed_actors_json\")) {\n sqlite.exec(\"ALTER TABLE repo_bindings ADD COLUMN allowed_actors_json TEXT\");\n }\n const channelBindingColumns = sqlite.prepare(\"PRAGMA table_info(channel_bindings)\").all() as { name: string }[];\n const channelBindingColumnNames = new Set(channelBindingColumns.map((column) => column.name));\n if (!channelBindingColumnNames.has(\"repo_provider\")) {\n sqlite.exec(\"ALTER TABLE channel_bindings ADD COLUMN repo_provider TEXT\");\n sqlite.exec(\"UPDATE channel_bindings SET repo_provider = 'github' WHERE repo_provider IS NULL\");\n }\n if (!channelBindingColumnNames.has(\"metadata_json\")) {\n sqlite.exec(\"ALTER TABLE channel_bindings ADD COLUMN metadata_json TEXT\");\n }\n const runColumns = sqlite.prepare(\"PRAGMA table_info(runs)\").all() as { name: string }[];\n const runColumnNames = new Set(runColumns.map((column) => column.name));\n if (!runColumnNames.has(\"leased_at\")) {\n sqlite.exec(\"ALTER TABLE runs ADD COLUMN leased_at TEXT\");\n }\n if (!runColumnNames.has(\"context_packet_json\")) {\n sqlite.exec(\"ALTER TABLE runs ADD COLUMN context_packet_json TEXT\");\n }\n if (!runColumnNames.has(\"heartbeat_at\")) {\n sqlite.exec(\"ALTER TABLE runs ADD COLUMN heartbeat_at TEXT\");\n }\n if (!runColumnNames.has(\"parent_run_id\")) {\n sqlite.exec(\"ALTER TABLE runs ADD COLUMN parent_run_id TEXT\");\n }\n if (!runColumnNames.has(\"triggered_by_action_json\")) {\n sqlite.exec(\"ALTER TABLE runs ADD COLUMN triggered_by_action_json TEXT\");\n }\n if (!runColumnNames.has(\"source_proposal_id\")) {\n sqlite.exec(\"ALTER TABLE runs ADD COLUMN source_proposal_id TEXT\");\n }\n if (!runColumnNames.has(\"source_apply_plan_id\")) {\n sqlite.exec(\"ALTER TABLE runs ADD COLUMN source_apply_plan_id TEXT\");\n }\n if (!runColumnNames.has(\"repo_provider\")) {\n sqlite.exec(\"ALTER TABLE runs ADD COLUMN repo_provider TEXT\");\n }\n if (!runColumnNames.has(\"repo_owner\")) {\n sqlite.exec(\"ALTER TABLE runs ADD COLUMN repo_owner TEXT\");\n }\n if (!runColumnNames.has(\"repo_name\")) {\n sqlite.exec(\"ALTER TABLE runs ADD COLUMN repo_name TEXT\");\n }\n if (!runColumnNames.has(\"work_thread_id\")) {\n sqlite.exec(\"ALTER TABLE runs ADD COLUMN work_thread_id TEXT\");\n }\n if (!runColumnNames.has(\"conversation_key\")) {\n sqlite.exec(\"ALTER TABLE runs ADD COLUMN conversation_key TEXT\");\n }\n sqlite.exec(\"CREATE INDEX IF NOT EXISTS runs_repo_idx ON runs(repo_provider, repo_owner, repo_name)\");\n sqlite.exec(\"CREATE INDEX IF NOT EXISTS runs_work_thread_idx ON runs(work_thread_id)\");\n sqlite.exec(\"CREATE INDEX IF NOT EXISTS runs_conversation_idx ON runs(conversation_key)\");\n sqlite.exec(`\n UPDATE runs\n SET event_id = event_id || '#duplicate:' || id\n WHERE rowid NOT IN (\n SELECT MIN(rowid)\n FROM runs\n GROUP BY event_id\n )\n AND event_id IN (\n SELECT event_id\n FROM runs\n GROUP BY event_id\n HAVING COUNT(*) > 1\n );\n `);\n sqlite.exec(\"CREATE UNIQUE INDEX IF NOT EXISTS runs_source_event_id_idx ON runs(event_id)\");\n const runEventColumns = sqlite.prepare(\"PRAGMA table_info(run_events)\").all() as { name: string }[];\n const runEventColumnNames = new Set(runEventColumns.map((column) => column.name));\n if (!runEventColumnNames.has(\"visibility\")) {\n sqlite.exec(\"ALTER TABLE run_events ADD COLUMN visibility TEXT NOT NULL DEFAULT 'audit'\");\n }\n if (!runEventColumnNames.has(\"importance\")) {\n sqlite.exec(\"ALTER TABLE run_events ADD COLUMN importance TEXT NOT NULL DEFAULT 'normal'\");\n }\n if (!runEventColumnNames.has(\"message\")) {\n sqlite.exec(\"ALTER TABLE run_events ADD COLUMN message TEXT\");\n }\n sqlite.exec(\"CREATE INDEX IF NOT EXISTS run_events_run_idx ON run_events(run_id)\");\n sqlite.exec(\"CREATE UNIQUE INDEX IF NOT EXISTS repo_policy_rules_repo_id_idx ON repo_policy_rules(provider, owner, repo, id)\");\n sqlite.exec(\"CREATE UNIQUE INDEX IF NOT EXISTS repo_mutation_mappings_repo_id_idx ON repo_mutation_mappings(provider, owner, repo, id)\");\n const callbackColumns = sqlite.prepare(\"PRAGMA table_info(callback_deliveries)\").all() as { name: string }[];\n const callbackColumnNames = new Set(callbackColumns.map((column) => column.name));\n if (!callbackColumnNames.has(\"next_attempt_at\")) {\n sqlite.exec(\"ALTER TABLE callback_deliveries ADD COLUMN next_attempt_at TEXT\");\n }\n if (!callbackColumnNames.has(\"metadata_json\")) {\n sqlite.exec(\"ALTER TABLE callback_deliveries ADD COLUMN metadata_json TEXT\");\n }\n const legacySlackTable = sqlite\n .prepare(\"SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'slack_channel_bindings'\")\n .get() as { name: string } | undefined;\n if (legacySlackTable) {\n sqlite.exec(`\n INSERT OR IGNORE INTO channel_bindings (\n provider,\n account_id,\n conversation_id,\n repo_provider,\n owner,\n repo,\n created_at\n )\n SELECT\n 'slack',\n team_id,\n channel_id,\n 'github',\n owner,\n repo,\n created_at\n FROM slack_channel_bindings;\n `);\n }\n}\n"],"mappings":"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","names":["updatedAt"]}
|