import { env } from "cloudflare:workers";
import { decryptSecret, encryptSecret } from "../crypto";
import { all, first, run } from "../db";
import { badRequest } from "../errors";
import { DEFAULT_THRESHOLDS } from "./decide";
import type { Thresholds } from "./decide";
import { notifyMergeFixResult } from "../notify/mergefix";
export type RepoMergeFixSettings = { queueEnabled: boolean; allowPrivate: boolean; thresholds: Thresholds };
type SettingsRow = { queue_enabled: number; allow_private: number; min_confidence: number; min_margin: number };
export async function loadRepoSettings(repoId: string): Promise<RepoMergeFixSettings> {
const row = await first<SettingsRow>("SELECT * FROM repo_mergefix_settings WHERE repo_id = ?", repoId);
return {
queueEnabled: row?.queue_enabled === 1,
allowPrivate: row?.allow_private === 1,
thresholds: row ? { confidence: row.min_confidence, margin: row.min_margin } : DEFAULT_THRESHOLDS,
};
}
export async function saveRepoSettings(repoId: string, settings: RepoMergeFixSettings): Promise<void> {
await run(
`INSERT INTO repo_mergefix_settings (repo_id, queue_enabled, allow_private, min_confidence, min_margin, updated_at)
VALUES (?, ?, ?, ?, ?, ?)
ON CONFLICT (repo_id) DO UPDATE SET queue_enabled = excluded.queue_enabled, allow_private = excluded.allow_private,
min_confidence = excluded.min_confidence, min_margin = excluded.min_margin, updated_at = excluded.updated_at`,
repoId,
settings.queueEnabled ? 1 : 0,
settings.allowPrivate ? 1 : 0,
settings.thresholds.confidence,
settings.thresholds.margin,
Date.now(),
);
}
export type ByokKey = { provider: string; model: string; apiKey: string };
type KeyRow = { provider: string; model: string; key_ciphertext: string; key_iv: string; updated_at: number };
function secretsKey(): string {