@opentag/store 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +697 -46
- package/dist/index.js.map +1 -1
- package/dist/repository.d.ts +110 -4
- package/dist/repository.d.ts.map +1 -1
- package/dist/schema.d.ts +240 -0
- package/dist/schema.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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"]}
|
|
1
|
+
{"version":3,"sources":["../src/repository.ts","../src/schema.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport {\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 formatProjectTargetRef,\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 ProjectTargetRef,\n type ProposalLineage,\n type RunAdmissionDecision,\n type RunEventImportance,\n type RunEventVisibility,\n type SuggestedChangesSnapshot\n} from \"@opentag/core\";\nimport { and, asc, desc, eq, inArray, lt } from \"drizzle-orm\";\nimport type { BetterSQLite3Database } from \"drizzle-orm/better-sqlite3\";\nimport {\n applyPlans,\n approvalDecisions,\n channelBindings,\n controlPlaneEvents,\n repoBindings,\n repoMutationMappings,\n repoPolicyRules,\n callbackDeliveries,\n followUpRequests,\n runEvents,\n sourceDeliveries,\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 idempotencyKey?: string;\n agentId?: string;\n statusMessageKey?: string;\n externalMessageId?: string;\n blocks?: unknown[];\n rich?: 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\ntype RunSignatureState = \"verified\" | \"unverified\" | \"unknown\";\n\ntype RunProvenance = {\n source: string;\n sourceEventId: string;\n sourceDeliveryId: string | null;\n signatureState: RunSignatureState;\n projectTarget: (ProjectTargetRef & { ref: string }) | null;\n admissionDecision: Pick<RunAdmissionDecision, \"action\" | \"reasonCode\" | \"eventId\" | \"activeRunId\">;\n expectedRunnerId: string | null;\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 | {\n run: OpenTagRun;\n created: true;\n }\n | {\n run: OpenTagRun;\n created: false;\n replayKind: \"source_event\" | \"source_delivery\";\n replayDecision: RunAdmissionDecision;\n };\n\nexport type CancelRunOutcome =\n | { outcome: \"cancelled\"; run: OpenTagRun; event: OpenTagEvent }\n | { outcome: \"already_terminal\"; run: OpenTagRun; event: OpenTagEvent }\n | { outcome: \"not_found\" };\n\nexport type SourceDeliveryPruneResult = {\n scanned: number;\n pruned: number;\n retainedActive: number;\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\nexport type RecordProgressOutcome = \"recorded\" | \"duplicate\" | \"not_found\";\nexport type MarkRunningOutcome = \"running\" | \"duplicate\" | \"not_found\";\nexport type CompleteRunOutcome = \"completed\" | \"duplicate\" | \"not_found\";\n\nexport type ControlPlaneEventSeverity = \"info\" | \"warn\" | \"error\";\n\nexport type ControlPlaneEvent = {\n id: number;\n type: string;\n severity: ControlPlaneEventSeverity;\n subject?: string;\n payload: unknown;\n createdAt: string;\n};\n\nexport type ControlPlaneAlert = {\n id: string;\n type:\n | \"repeated_auth_failures\"\n | \"repeated_signature_failures\"\n | \"token_misuse\"\n | \"repeated_large_payload_rejections\"\n | \"repeated_invalid_request_body\"\n | \"repeated_unknown_project_targets\"\n | \"abnormal_runner_claim_rate\";\n severity: ControlPlaneEventSeverity;\n eventType: string;\n count: number;\n threshold: number;\n firstSeenAt: string;\n lastSeenAt: string;\n subject?: string;\n reason: string;\n nextAction: 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 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 terminalRunStatus(status: string): boolean {\n return status === \"succeeded\" || status === \"failed\" || status === \"cancelled\" || status === \"interrupted\" || status === \"timed_out\";\n}\n\nfunction sourceContainerMetadataMatches(input: {\n event: OpenTagEvent;\n source: string;\n metadata: Record<string, string>;\n}): boolean {\n if (input.event.source !== input.source) return false;\n return Object.entries(input.metadata).every(([key, value]) => input.event.metadata[key] === value);\n}\n\ntype CallbackDeliveryMetadata = {\n agentId?: string;\n statusMessageKey?: string;\n externalMessageId?: string;\n blocks?: unknown[];\n rich?: unknown;\n};\n\nfunction callbackDeliveryMetadataFromJson(metadataJson: string | null): CallbackDeliveryMetadata | undefined {\n return metadataJson && typeof metadataJson === \"string\" ? (JSON.parse(metadataJson) as CallbackDeliveryMetadata) : undefined;\n}\n\nfunction callbackDeliveryFromRow(row: typeof callbackDeliveries.$inferSelect): CallbackDelivery {\n const metadata = callbackDeliveryMetadataFromJson(row.metadataJson);\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 ...(row.idempotencyKey ? { idempotencyKey: row.idempotencyKey } : {}),\n ...(metadata?.agentId ? { agentId: metadata.agentId } : {}),\n ...(metadata?.statusMessageKey ? { statusMessageKey: metadata.statusMessageKey } : {}),\n ...(metadata?.externalMessageId ? { externalMessageId: metadata.externalMessageId } : {}),\n ...(metadata?.blocks ? { blocks: metadata.blocks } : {}),\n ...(metadata && \"rich\" in metadata ? { rich: metadata.rich } : {}),\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 callbackBodyHash(input: { body: string; blocks?: unknown[]; rich?: unknown }): string {\n return createHash(\"sha256\")\n .update(JSON.stringify({ body: input.body, blocks: input.blocks ?? [], rich: input.rich ?? null }))\n .digest(\"hex\");\n}\n\nfunction callbackIdempotencyKey(input: {\n runId: string;\n kind: CallbackDeliveryKind;\n provider: CallbackDeliveryProvider;\n uri: string;\n body: string;\n threadKey?: string;\n statusMessageKey?: string;\n blocks?: unknown[];\n rich?: unknown;\n}): string {\n return [\n input.runId,\n input.provider,\n input.threadKey ?? input.uri,\n input.kind,\n input.statusMessageKey ?? \"\",\n callbackBodyHash({ body: input.body, ...(input.blocks ? { blocks: input.blocks } : {}), ...(input.rich !== undefined ? { rich: input.rich } : {}) })\n ].join(\"|\");\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 metadataString(metadata: Record<string, unknown>, keys: string[]): string | null {\n for (const key of keys) {\n const value = metadata[key];\n if (typeof value !== \"string\") continue;\n const trimmed = value.trim();\n if (trimmed.length > 0) return trimmed;\n }\n return null;\n}\n\nfunction metadataBoolean(metadata: Record<string, unknown>, keys: string[]): boolean | null {\n for (const key of keys) {\n const value = metadata[key];\n if (typeof value === \"boolean\") return value;\n }\n return null;\n}\n\nfunction signatureStateFromEvent(event: OpenTagEvent): RunSignatureState {\n const explicitState = metadataString(event.metadata, [\"signatureState\", \"webhookSignatureState\"]);\n if (explicitState === \"verified\" || explicitState === \"unverified\" || explicitState === \"unknown\") return explicitState;\n\n const verified = metadataBoolean(event.metadata, [\n \"signatureVerified\",\n \"verifiedSignature\",\n \"webhookSignatureVerified\",\n \"githubSignatureVerified\"\n ]);\n if (verified === true) return \"verified\";\n if (verified === false) return \"unverified\";\n return \"unknown\";\n}\n\nfunction sourceDeliveryIdFromEvent(event: OpenTagEvent): string | null {\n return metadataString(event.metadata, [\n \"sourceDeliveryId\",\n \"webhookDeliveryId\",\n \"deliveryId\",\n \"githubDeliveryId\",\n \"githubDeliveryGuid\",\n \"slackEventId\",\n \"larkEventId\"\n ]);\n}\n\nfunction projectTargetProvenance(ref: ProjectTargetRef | null): RunProvenance[\"projectTarget\"] {\n if (!ref) return null;\n return {\n ref: formatProjectTargetRef(ref),\n ...ref\n };\n}\n\nfunction runProvenance(input: {\n event: OpenTagEvent;\n projectTarget: ProjectTargetRef | null;\n admissionDecision: RunAdmissionDecision;\n expectedRunnerId: string | null;\n}): RunProvenance {\n return {\n source: input.event.source,\n sourceEventId: input.event.sourceEventId,\n sourceDeliveryId: sourceDeliveryIdFromEvent(input.event),\n signatureState: signatureStateFromEvent(input.event),\n projectTarget: projectTargetProvenance(input.projectTarget),\n admissionDecision: {\n action: input.admissionDecision.action,\n reasonCode: input.admissionDecision.reasonCode,\n ...(input.admissionDecision.eventId ? { eventId: input.admissionDecision.eventId } : {}),\n ...(input.admissionDecision.activeRunId ? { activeRunId: input.admissionDecision.activeRunId } : {})\n },\n expectedRunnerId: input.expectedRunnerId\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 payloadString(payload: unknown, path: string[]): string | null {\n let current = payload;\n for (const segment of path) {\n const record = recordFromUnknown(current);\n if (!record) return null;\n current = record[segment];\n }\n return typeof current === \"string\" && current.trim().length > 0 ? current : null;\n}\n\nfunction controlPlaneAlertSubject(event: ControlPlaneEvent): string {\n if (event.type === \"run.claimed\") {\n return payloadString(event.payload, [\"runnerId\"]) ?? event.subject ?? \"unknown-runner\";\n }\n if (event.type === \"security.auth_failed\") {\n return payloadString(event.payload, [\"tokenFingerprint\"]) ?? event.subject ?? \"unknown-token\";\n }\n if (event.type === \"security.token_misuse\") {\n const provider = payloadString(event.payload, [\"provider\"]);\n const tokenKind = payloadString(event.payload, [\"tokenKind\"]);\n if (provider && tokenKind) return `${provider}:${tokenKind}`;\n return event.subject ?? \"unknown-token\";\n }\n if (event.type === \"security.signature_failed\") {\n const provider = payloadString(event.payload, [\"provider\"]);\n const endpoint = payloadString(event.payload, [\"endpoint\"]);\n if (provider && endpoint) return `${provider}:${endpoint}`;\n return event.subject ?? \"unknown-signature-source\";\n }\n if (event.type === \"security.request_body_rejected\") {\n return payloadString(event.payload, [\"endpoint\"]) ?? event.subject ?? \"unknown-endpoint\";\n }\n if (event.type === \"admission.needs_human_decision\") {\n const reasonCode = payloadString(event.payload, [\"decision\", \"reasonCode\"]) ?? payloadString(event.payload, [\"reasonCode\"]);\n if (reasonCode === \"repo_not_bound\" || reasonCode === \"repo_context_missing\") {\n return payloadString(event.payload, [\"projectTarget\"]) ?? reasonCode;\n }\n }\n return event.subject ?? event.type;\n}\n\nfunction controlPlaneAlertKind(event: ControlPlaneEvent): ControlPlaneAlert[\"type\"] | null {\n if (event.type === \"run.claimed\") return \"abnormal_runner_claim_rate\";\n if (event.type === \"security.auth_failed\") return \"repeated_auth_failures\";\n if (event.type === \"security.token_misuse\") return \"token_misuse\";\n if (event.type === \"security.signature_failed\") return \"repeated_signature_failures\";\n if (event.type === \"security.request_body_rejected\") {\n return payloadString(event.payload, [\"reason\"]) === \"request_body_too_large\"\n ? \"repeated_large_payload_rejections\"\n : \"repeated_invalid_request_body\";\n }\n if (event.type === \"admission.needs_human_decision\") {\n const reasonCode = payloadString(event.payload, [\"decision\", \"reasonCode\"]) ?? payloadString(event.payload, [\"reasonCode\"]);\n if (reasonCode === \"repo_not_bound\" || reasonCode === \"repo_context_missing\") return \"repeated_unknown_project_targets\";\n }\n return null;\n}\n\nfunction controlPlaneAlertMetadata(kind: ControlPlaneAlert[\"type\"]): Pick<ControlPlaneAlert, \"reason\" | \"nextAction\" | \"severity\"> {\n if (kind === \"repeated_auth_failures\") {\n return {\n severity: \"warn\",\n reason: \"Repeated dispatcher authorization failures were observed.\",\n nextAction: \"Check for token misuse, stale runner configuration, or a leaked/rotated pairing token.\"\n };\n }\n if (kind === \"token_misuse\") {\n return {\n severity: \"warn\",\n reason: \"A platform or relay token failed with a terminal authentication or configuration error.\",\n nextAction: \"Rotate or replace the affected token, then restart or re-pair the ingress or runner that owns it.\"\n };\n }\n if (kind === \"repeated_large_payload_rejections\") {\n return {\n severity: \"warn\",\n reason: \"Repeated oversized dispatcher request bodies were rejected.\",\n nextAction: \"Check source ingress payload size, request body limits, and whether a client is retrying an invalid payload.\"\n };\n }\n if (kind === \"repeated_invalid_request_body\") {\n return {\n severity: \"warn\",\n reason: \"Repeated malformed or schema-invalid request bodies were rejected.\",\n nextAction: \"Check source webhook payload shape, client versions, and whether unsigned or incompatible traffic is hitting the endpoint.\"\n };\n }\n if (kind === \"repeated_signature_failures\") {\n return {\n severity: \"warn\",\n reason: \"Repeated source webhook signature verification failures were observed.\",\n nextAction: \"Check the source webhook secret, signing configuration, endpoint URL, and whether unsigned traffic is hitting the ingress.\"\n };\n }\n if (kind === \"abnormal_runner_claim_rate\") {\n return {\n severity: \"warn\",\n reason: \"Runner claim volume exceeded the local alert threshold.\",\n nextAction: \"Check for runaway runner loops, token misuse, or an unexpected burst of queued runs for this runner.\"\n };\n }\n return {\n severity: \"warn\",\n reason: \"Repeated source events resolved to missing or unbound Project Targets.\",\n nextAction: \"Verify source metadata, Project Target bindings, and runner allowlists before retrying.\"\n };\n}\n\nfunction controlPlaneAlertThreshold(kind: ControlPlaneAlert[\"type\"], thresholds?: Partial<Record<ControlPlaneAlert[\"type\"], number>>): number {\n return (\n thresholds?.[kind] ??\n (kind === \"token_misuse\"\n ? 1\n : kind === \"repeated_auth_failures\" || kind === \"repeated_signature_failures\"\n ? 3\n : kind === \"abnormal_runner_claim_rate\"\n ? 10\n : 2)\n );\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 repoBindingRunnerId(projectTarget: ProjectTargetRef | null): Promise<string | null> {\n if (!projectTarget) return null;\n const row = await db\n .select()\n .from(repoBindings)\n .where(\n and(\n eq(repoBindings.provider, projectTarget.provider),\n eq(repoBindings.owner, projectTarget.owner),\n eq(repoBindings.repo, projectTarget.repo)\n )\n )\n .limit(1)\n .get();\n return row?.runnerId ?? null;\n }\n\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 async function recordCreateRunReplay(input: {\n runRow: typeof runs.$inferSelect;\n requestedRunId: string;\n event: OpenTagEvent;\n projectTarget: ProjectTargetRef | null;\n expectedRunnerId: string | null;\n replayKind: \"source_event\" | \"source_delivery\";\n sourceDeliveryId?: string | null;\n createdAt: string;\n }): Promise<Extract<CreateRunResult, { created: false }>> {\n const reason =\n input.replayKind === \"source_delivery\"\n ? \"Source delivery already created a run.\"\n : \"Source event already created a run.\";\n const reasonCode = input.replayKind === \"source_delivery\" ? \"duplicate_source_delivery\" : \"duplicate_source_event\";\n const replayDecision = RunAdmissionDecisionSchema.parse({\n action: \"drop_duplicate\",\n reason,\n reasonCode,\n decidedAt: input.createdAt,\n activeRunId: input.runRow.id,\n eventId: input.event.id\n });\n await appendRunEvent({\n runId: input.runRow.id,\n type: \"admission.decided\",\n payload: replayDecision,\n visibility: \"audit\",\n importance: \"normal\",\n message: replayDecision.reason,\n createdAt: input.createdAt\n });\n await appendRunEvent({\n runId: input.runRow.id,\n type: \"run.create_idempotent_replay\",\n payload: {\n requestedRunId: input.requestedRunId,\n eventId: input.event.id,\n replayKey:\n input.replayKind === \"source_delivery\"\n ? { kind: \"source_delivery\", source: input.event.source, deliveryId: input.sourceDeliveryId }\n : { kind: \"source_event\", eventId: input.event.id },\n provenance: runProvenance({\n event: input.event,\n projectTarget: input.projectTarget,\n admissionDecision: replayDecision,\n expectedRunnerId: input.expectedRunnerId\n })\n },\n visibility: \"audit\",\n importance: \"low\",\n createdAt: input.createdAt\n });\n return {\n run: runFromRow(input.runRow),\n created: false,\n replayKind: input.replayKind,\n replayDecision\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 findCancelableRunForSourceContainer(input: {\n source: string;\n repoProvider: string;\n owner: string;\n repo: string;\n metadata: Record<string, string>;\n }): Promise<{ run: OpenTagRun; event: OpenTagEvent } | null> {\n const rows = await db\n .select()\n .from(runs)\n .where(\n and(\n eq(runs.repoProvider, input.repoProvider),\n eq(runs.repoOwner, input.owner),\n eq(runs.repoName, input.repo),\n inArray(runs.status, [\"queued\", \"assigned\", \"running\", \"needs_approval\"])\n )\n )\n .orderBy(asc(runs.createdAt));\n for (const row of rows) {\n const event = OpenTagEventSchema.parse(JSON.parse(row.eventJson));\n if (sourceContainerMetadataMatches({ event, source: input.source, metadata: input.metadata })) {\n return { run: runFromRow(row), event };\n }\n }\n return null;\n },\n\n async cancelRun(input: { runId: string; reason?: string; requestedBy?: string }): Promise<CancelRunOutcome> {\n const row = await db.select().from(runs).where(eq(runs.id, input.runId)).limit(1).get();\n if (!row) return { outcome: \"not_found\" };\n const event = OpenTagEventSchema.parse(JSON.parse(row.eventJson));\n const existingRun = runFromRow(row);\n if (terminalRunStatus(row.status)) {\n return { outcome: \"already_terminal\", run: existingRun, event };\n }\n\n const updatedAt = nowIso();\n const result: OpenTagRunResult = {\n conclusion: \"cancelled\",\n summary: input.reason ?? \"Cancellation was requested by a human.\",\n nextAction: \"OpenTag will not treat this stop request as a successful completion.\"\n };\n await db\n .update(runs)\n .set({\n status: \"cancelled\",\n resultJson: JSON.stringify(result),\n assignedRunnerId: null,\n leasedAt: null,\n leaseExpiresAt: null,\n heartbeatAt: null,\n updatedAt\n })\n .where(eq(runs.id, input.runId));\n await appendRunEvent({\n runId: input.runId,\n type: \"run.cancel_requested\",\n payload: {\n previousStatus: row.status,\n previousRunnerId: row.assignedRunnerId,\n terminalReason: \"cancelled_by_user\",\n terminalSemantics: \"A human stop request is not a successful completion and does not auto-promote queued follow-ups.\",\n ...(input.requestedBy ? { requestedBy: input.requestedBy } : {}),\n reason: result.summary\n },\n visibility: \"audit\",\n importance: \"high\",\n message: result.summary,\n createdAt: updatedAt\n });\n return {\n outcome: \"cancelled\",\n run: {\n ...existingRun,\n status: \"cancelled\",\n assignedRunnerId: undefined,\n updatedAt,\n result\n },\n event\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 listQueuedFollowUpsForActiveRun(input: { activeRunId: string }): Promise<FollowUpRequest[]> {\n const rows = await db\n .select()\n .from(followUpRequests)\n .where(and(eq(followUpRequests.activeRunId, input.activeRunId), eq(followUpRequests.status, \"queued\")))\n .orderBy(asc(followUpRequests.createdAt));\n return rows.map(followUpRequestFromRow);\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\n .insert(runners)\n .values({ runnerId: input.runnerId, name: input.name, createdAt, heartbeatAt: createdAt })\n .onConflictDoUpdate({\n target: runners.runnerId,\n set: {\n name: input.name,\n heartbeatAt: createdAt\n }\n });\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 deleteChannelBinding(input: {\n provider: string;\n accountId: string;\n conversationId: string;\n }): Promise<boolean> {\n const existing = 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 if (!existing) return false;\n await db\n .delete(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 return true;\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 expectedRunnerId = await repoBindingRunnerId(repoKey);\n const sourceDeliveryId = sourceDeliveryIdFromEvent(event);\n if (sourceDeliveryId) {\n const existingDelivery = await db\n .select()\n .from(sourceDeliveries)\n .where(and(eq(sourceDeliveries.source, event.source), eq(sourceDeliveries.deliveryId, sourceDeliveryId)))\n .limit(1)\n .get();\n if (existingDelivery) {\n const existingByDelivery = await db.select().from(runs).where(eq(runs.id, existingDelivery.runId)).limit(1).get();\n if (existingByDelivery) {\n return recordCreateRunReplay({\n runRow: existingByDelivery,\n requestedRunId: input.id,\n event,\n projectTarget: repoKey,\n expectedRunnerId,\n replayKind: \"source_delivery\",\n sourceDeliveryId,\n createdAt\n });\n }\n }\n }\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 return recordCreateRunReplay({\n runRow: existingBySourceEvent,\n requestedRunId: input.id,\n event,\n projectTarget: repoKey,\n expectedRunnerId,\n replayKind: \"source_event\",\n sourceDeliveryId,\n createdAt\n });\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 if (sourceDeliveryId) {\n await db\n .insert(sourceDeliveries)\n .values({\n source: event.source,\n deliveryId: sourceDeliveryId,\n runId: input.id,\n eventId: event.id,\n createdAt\n })\n .onConflictDoNothing({ target: [sourceDeliveries.source, sourceDeliveries.deliveryId] });\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: {\n eventId: event.id,\n provenance: runProvenance({\n event,\n projectTarget: repoKey,\n admissionDecision: createDecision,\n expectedRunnerId\n })\n },\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 pruneSourceDeliveries(input: { olderThan: string; limit?: number }): Promise<SourceDeliveryPruneResult> {\n const cutoff = new Date(input.olderThan);\n if (!Number.isFinite(cutoff.getTime())) {\n throw new Error(\"olderThan must be a valid timestamp.\");\n }\n const requestedLimit = input.limit ?? 1_000;\n const limit = Number.isFinite(requestedLimit) ? Math.max(1, Math.floor(requestedLimit)) : 1_000;\n const rows = await db\n .select()\n .from(sourceDeliveries)\n .where(lt(sourceDeliveries.createdAt, cutoff.toISOString()))\n .orderBy(asc(sourceDeliveries.createdAt))\n .limit(limit);\n\n let pruned = 0;\n let retainedActive = 0;\n for (const row of rows) {\n const runRow = await db.select({ status: runs.status }).from(runs).where(eq(runs.id, row.runId)).limit(1).get();\n if (runRow && !terminalRunStatus(runRow.status)) {\n retainedActive += 1;\n continue;\n }\n const result = await db\n .delete(sourceDeliveries)\n .where(and(eq(sourceDeliveries.source, row.source), eq(sourceDeliveries.deliveryId, row.deliveryId)));\n pruned += result.changes;\n }\n\n return {\n scanned: rows.length,\n pruned,\n retainedActive\n };\n },\n\n async claimNextRun(input: { runnerId: string; leaseSeconds: number }): Promise<ClaimedOpenTagRun | null> {\n const now = new Date();\n const runnerHeartbeatAt = nowIso();\n await db.update(runners).set({ heartbeatAt: runnerHeartbeatAt }).where(eq(runners.runnerId, input.runnerId));\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.update(runners).set({ heartbeatAt: updatedAt }).where(eq(runners.runnerId, input.runnerId));\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: {\n runId: string;\n executor: string;\n runnerId?: string;\n runTimeoutMs?: number;\n idempotencyKey?: string;\n }): Promise<MarkRunningOutcome> {\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 if (input.idempotencyKey) {\n const existing = await db.select().from(runEvents).where(eq(runEvents.runId, input.runId)).orderBy(desc(runEvents.id)).limit(250);\n for (const event of existing) {\n if (event.type !== \"run.running\") continue;\n const payload = recordFromJson(event.payloadJson);\n if (payload?.[\"idempotencyKey\"] === input.idempotencyKey) return \"duplicate\";\n }\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 \"not_found\";\n }\n await appendRunEvent({\n runId: input.runId,\n type: \"run.running\",\n payload: {\n ...(input.runnerId ? { runnerId: input.runnerId } : {}),\n ...(input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : {}),\n executor: input.executor,\n ...(input.runTimeoutMs ? { runTimeoutMs: input.runTimeoutMs } : {})\n },\n visibility: \"audit\",\n importance: \"normal\",\n createdAt: updatedAt\n });\n return \"running\";\n },\n\n async completeRun(input: { runId: string; result: OpenTagRunResult; runnerId?: string; idempotencyKey?: string }): Promise<CompleteRunOutcome> {\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 === \"interrupted\"\n ? \"interrupted\"\n : result.conclusion === \"timed_out\"\n ? \"timed_out\"\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 \"not_found\";\n throw new Error(`Run not found: ${input.runId}`);\n }\n if (input.idempotencyKey) {\n const existing = await db.select().from(runEvents).where(eq(runEvents.runId, input.runId)).orderBy(desc(runEvents.id)).limit(250);\n for (const event of existing) {\n if (event.type !== \"run.completed\") continue;\n const payload = recordFromJson(event.payloadJson);\n if (payload?.[\"idempotencyKey\"] === input.idempotencyKey) return \"duplicate\";\n }\n }\n if (terminalRunStatus(runRow.status)) {\n return \"not_found\";\n }\n if (input.runnerId && runRow.assignedRunnerId !== input.runnerId) {\n return \"not_found\";\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: {\n ...result,\n ...(input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : {})\n },\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 \"completed\";\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 idempotencyKey?: string;\n }): Promise<RecordProgressOutcome> {\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 \"not_found\";\n }\n if (input.idempotencyKey) {\n const existing = await db.select().from(runEvents).where(eq(runEvents.runId, input.runId)).orderBy(desc(runEvents.id)).limit(250);\n for (const event of existing) {\n if (event.type !== \"run.progress\") continue;\n const payload = recordFromJson(event.payloadJson);\n if (payload?.[\"idempotencyKey\"] === input.idempotencyKey) return \"duplicate\";\n }\n }\n await appendRunEvent({\n runId: input.runId,\n type: \"run.progress\",\n payload: {\n ...(input.runnerId ? { runnerId: input.runnerId } : {}),\n ...(input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : {}),\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 \"recorded\";\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 appendControlPlaneEvent(input: {\n type: string;\n severity?: ControlPlaneEventSeverity;\n subject?: string;\n payload?: unknown;\n createdAt?: string;\n }): Promise<void> {\n await db.insert(controlPlaneEvents).values({\n type: input.type,\n severity: input.severity ?? \"info\",\n subject: input.subject ?? null,\n payloadJson: JSON.stringify(input.payload ?? {}),\n createdAt: input.createdAt ?? nowIso()\n });\n },\n\n async listControlPlaneEvents(input: { limit?: number; type?: string; severity?: ControlPlaneEventSeverity } = {}): Promise<ControlPlaneEvent[]> {\n const conditions = [\n ...(input.type ? [eq(controlPlaneEvents.type, input.type)] : []),\n ...(input.severity ? [eq(controlPlaneEvents.severity, input.severity)] : [])\n ];\n const rows = await db\n .select()\n .from(controlPlaneEvents)\n .where(conditions.length > 0 ? and(...conditions) : undefined)\n .orderBy(asc(controlPlaneEvents.id))\n .limit(input.limit ?? 100);\n return rows.map((row) => ({\n id: row.id,\n type: row.type,\n severity: row.severity as ControlPlaneEventSeverity,\n ...(row.subject ? { subject: row.subject } : {}),\n payload: JSON.parse(row.payloadJson) as unknown,\n createdAt: row.createdAt\n }));\n },\n\n async summarizeControlPlaneAlerts(input: {\n since?: string;\n limit?: number;\n thresholds?: Partial<Record<ControlPlaneAlert[\"type\"], number>>;\n } = {}): Promise<ControlPlaneAlert[]> {\n const limit = input.limit ?? 5_000;\n const rows = await db\n .select()\n .from(controlPlaneEvents)\n .orderBy(desc(controlPlaneEvents.id))\n .limit(limit);\n const claimRows = await db\n .select()\n .from(runEvents)\n .where(eq(runEvents.type, \"run.claimed\"))\n .orderBy(desc(runEvents.id))\n .limit(limit);\n const groups = new Map<string, { kind: ControlPlaneAlert[\"type\"]; eventType: string; subject: string; events: ControlPlaneEvent[] }>();\n\n function addEvent(event: ControlPlaneEvent) {\n if (input.since && event.createdAt < input.since) return;\n const kind = controlPlaneAlertKind(event);\n if (!kind) return;\n const subject = controlPlaneAlertSubject(event);\n const key = `${kind}|${event.type}|${subject}`;\n const group = groups.get(key) ?? { kind, eventType: event.type, subject, events: [] };\n group.events.push(event);\n groups.set(key, group);\n }\n\n for (const row of rows.reverse()) {\n addEvent({\n id: row.id,\n type: row.type,\n severity: row.severity as ControlPlaneEventSeverity,\n ...(row.subject ? { subject: row.subject } : {}),\n payload: JSON.parse(row.payloadJson) as unknown,\n createdAt: row.createdAt\n });\n }\n for (const row of claimRows.reverse()) {\n addEvent({\n id: row.id,\n type: row.type,\n severity: \"info\",\n subject: row.runId,\n payload: JSON.parse(row.payloadJson) as unknown,\n createdAt: row.createdAt\n });\n }\n\n return [...groups.values()]\n .flatMap((group): ControlPlaneAlert[] => {\n const threshold = controlPlaneAlertThreshold(group.kind, input.thresholds);\n if (group.events.length < threshold) return [];\n const metadata = controlPlaneAlertMetadata(group.kind);\n const first = group.events[0]!;\n const last = group.events.at(-1)!;\n return [\n {\n id: `${group.kind}:${group.eventType}:${group.subject}`,\n type: group.kind,\n severity: metadata.severity,\n eventType: group.eventType,\n count: group.events.length,\n threshold,\n firstSeenAt: first.createdAt,\n lastSeenAt: last.createdAt,\n subject: group.subject,\n reason: metadata.reason,\n nextAction: metadata.nextAction\n }\n ];\n })\n .sort((left, right) => right.count - left.count || left.id.localeCompare(right.id));\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 rich?: unknown;\n }): Promise<CallbackDelivery> {\n const createdAt = nowIso();\n const idempotencyKey = callbackIdempotencyKey(input);\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 idempotencyKey,\n metadataJson: JSON.stringify({\n ...(input.agentId ? { agentId: input.agentId } : {}),\n ...(input.statusMessageKey ? { statusMessageKey: input.statusMessageKey } : {}),\n ...(input.blocks ? { blocks: input.blocks } : {}),\n ...(input.rich !== undefined ? { rich: input.rich } : {})\n }),\n status: \"pending\",\n createdAt,\n updatedAt: createdAt\n })\n .onConflictDoNothing({ target: callbackDeliveries.idempotencyKey })\n .returning();\n const row = rows[0];\n if (!row) {\n const existing = await db.select().from(callbackDeliveries).where(eq(callbackDeliveries.idempotencyKey, idempotencyKey)).limit(1).get();\n if (!existing) throw new Error(\"callback delivery was not created\");\n await appendRunEvent({\n runId: input.runId,\n type: `callback.${input.kind}.duplicate`,\n payload: callbackDeliveryFromRow(existing),\n visibility: \"audit\",\n importance: \"normal\",\n message: \"Duplicate callback delivery suppressed.\",\n createdAt\n });\n return callbackDeliveryFromRow(existing);\n }\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; externalMessageId?: 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 const metadata = callbackDeliveryMetadataFromJson(row.metadataJson) ?? {};\n const metadataJson = JSON.stringify({\n ...metadata,\n ...(input.externalMessageId ? { externalMessageId: input.externalMessageId } : {})\n });\n await db\n .update(callbackDeliveries)\n .set({ status: \"delivered\", attempts: row.attempts + 1, lastError: null, nextAttemptAt: null, metadataJson, updatedAt })\n .where(eq(callbackDeliveries.id, input.deliveryId));\n const deliveredRow = { ...row, metadataJson };\n await appendRunEvent({\n runId: row.runId,\n type: `callback.${row.kind}.delivered`,\n payload: { ...callbackDeliveryFromRow(deliveredRow), 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 findCallbackExternalMessageId(input: {\n runId: string;\n provider: CallbackDeliveryProvider;\n threadKey?: string;\n statusMessageKey: string;\n }): Promise<string | undefined> {\n const rows = await db\n .select()\n .from(callbackDeliveries)\n .where(and(eq(callbackDeliveries.runId, input.runId), eq(callbackDeliveries.provider, input.provider), eq(callbackDeliveries.status, \"delivered\")))\n .orderBy(desc(callbackDeliveries.updatedAt), desc(callbackDeliveries.id));\n\n for (const row of rows) {\n const delivery = callbackDeliveryFromRow(row);\n if (delivery.statusMessageKey !== input.statusMessageKey) continue;\n if ((delivery.threadKey ?? undefined) !== input.threadKey) continue;\n if (delivery.externalMessageId) return delivery.externalMessageId;\n }\n return undefined;\n },\n\n async markCallbackFailed(input: { deliveryId: number; error: string; nextAttemptAt?: string; maxAttempts?: 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 const attempts = row.attempts + 1;\n await db\n .update(callbackDeliveries)\n .set({ status: \"failed\", attempts, 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,\n lastError: input.error,\n ...(input.nextAttemptAt ? { nextAttemptAt: input.nextAttemptAt } : {}),\n updatedAt\n },\n visibility: \"audit\",\n importance: \"normal\",\n createdAt: updatedAt\n });\n if (input.maxAttempts !== undefined && attempts >= input.maxAttempts && !input.nextAttemptAt) {\n await appendRunEvent({\n runId: row.runId,\n type: `callback.${row.kind}.suppressed`,\n payload: {\n ...callbackDeliveryFromRow(row),\n status: \"failed\",\n attempts,\n maxAttempts: input.maxAttempts,\n lastError: input.error,\n updatedAt\n },\n visibility: \"audit\",\n importance: \"high\",\n message: \"Callback delivery retry budget exhausted; further delivery attempts are suppressed to avoid duplicate storms.\",\n createdAt: updatedAt\n });\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 sourceDeliveries = sqliteTable(\n \"source_deliveries\",\n {\n source: text(\"source\").notNull(),\n deliveryId: text(\"delivery_id\").notNull(),\n runId: text(\"run_id\").notNull(),\n eventId: text(\"event_id\").notNull(),\n createdAt: text(\"created_at\").notNull()\n },\n (table) => ({\n pk: primaryKey({ columns: [table.source, table.deliveryId] }),\n runIdx: index(\"source_deliveries_run_idx\").on(table.runId)\n })\n);\n\nexport const controlPlaneEvents = sqliteTable(\n \"control_plane_events\",\n {\n id: integer(\"id\").primaryKey({ autoIncrement: true }),\n type: text(\"type\").notNull(),\n severity: text(\"severity\").notNull(),\n subject: text(\"subject\"),\n payloadJson: text(\"payload_json\").notNull(),\n createdAt: text(\"created_at\").notNull()\n },\n (table) => ({\n typeIdx: index(\"control_plane_events_type_idx\").on(table.type),\n severityIdx: index(\"control_plane_events_severity_idx\").on(table.severity)\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 idempotencyKey: text(\"idempotency_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 callbackIdempotencyIdx: uniqueIndex(\"callback_deliveries_idempotency_key_idx\").on(table.idempotencyKey)\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 source_deliveries (\n source TEXT NOT NULL,\n delivery_id TEXT NOT NULL,\n run_id TEXT NOT NULL,\n event_id TEXT NOT NULL,\n created_at TEXT NOT NULL,\n PRIMARY KEY (source, delivery_id)\n );\n CREATE INDEX IF NOT EXISTS source_deliveries_run_idx\n ON source_deliveries(run_id);\n CREATE TABLE IF NOT EXISTS control_plane_events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n type TEXT NOT NULL,\n severity TEXT NOT NULL,\n subject TEXT,\n payload_json TEXT NOT NULL,\n created_at TEXT NOT NULL\n );\n CREATE INDEX IF NOT EXISTS control_plane_events_type_idx\n ON control_plane_events(type);\n CREATE INDEX IF NOT EXISTS control_plane_events_severity_idx\n ON control_plane_events(severity);\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 idempotency_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 UNIQUE INDEX IF NOT EXISTS callback_deliveries_idempotency_key_idx\n ON callback_deliveries(idempotency_key);\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(`\n CREATE TABLE IF NOT EXISTS source_deliveries (\n source TEXT NOT NULL,\n delivery_id TEXT NOT NULL,\n run_id TEXT NOT NULL,\n event_id TEXT NOT NULL,\n created_at TEXT NOT NULL,\n PRIMARY KEY (source, delivery_id)\n );\n `);\n sqlite.exec(\"CREATE INDEX IF NOT EXISTS source_deliveries_run_idx ON source_deliveries(run_id)\");\n sqlite.exec(`\n CREATE TABLE IF NOT EXISTS control_plane_events (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n type TEXT NOT NULL,\n severity TEXT NOT NULL,\n subject TEXT,\n payload_json TEXT NOT NULL,\n created_at TEXT NOT NULL\n );\n `);\n sqlite.exec(\"CREATE INDEX IF NOT EXISTS control_plane_events_type_idx ON control_plane_events(type)\");\n sqlite.exec(\"CREATE INDEX IF NOT EXISTS control_plane_events_severity_idx ON control_plane_events(severity)\");\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 if (!callbackColumnNames.has(\"idempotency_key\")) {\n sqlite.exec(\"ALTER TABLE callback_deliveries ADD COLUMN idempotency_key TEXT\");\n }\n sqlite.exec(\"CREATE UNIQUE INDEX IF NOT EXISTS callback_deliveries_idempotency_key_idx ON callback_deliveries(idempotency_key)\");\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"]}
|