ai-chatbot/scripts/backfill-agent-workflow-preview-images.ts

117 lines
3.0 KiB
TypeScript

import { config as loadEnv } from "dotenv";
import { eq } from "drizzle-orm";
import Module from "node:module";
import { mkdir, writeFile } from "node:fs/promises";
import path from "node:path";
loadEnv({ path: ".env.local" });
const moduleLoader = Module as typeof Module & {
_load: (request: string, parent: NodeModule | null, isMain: boolean) => unknown;
};
const originalLoad = moduleLoader._load;
moduleLoader._load = function patchedServerOnlyLoad(
this: typeof moduleLoader,
request,
parent,
isMain
) {
if (request === "server-only") {
return {};
}
return originalLoad.call(this, request, parent, isMain);
};
const dryRun = process.argv.includes("--dry-run");
const force = process.argv.includes("--force");
const skipBackup = process.argv.includes("--skip-backup");
function createBackupPath() {
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
return path.join(
process.cwd(),
"backups",
`agent-workflow-ui-config-before-preview-backfill-${timestamp}.json`
);
}
async function main() {
const dbModule = await import("../lib/db");
const schemaModule = await import("../lib/db/schema");
const workflowConfig = await import("../lib/agents/workflow-ui-config");
const previewImages = await import("../lib/agents/workflow-preview-images");
const { db } = dbModule;
const { systemSettings } = schemaModule;
const [setting] = await db
.select({ value: systemSettings.value })
.from(systemSettings)
.where(eq(systemSettings.key, workflowConfig.AGENT_WORKFLOW_UI_CONFIG_KEY))
.limit(1);
if (!setting?.value) {
console.log("No agent workflow UI config found.");
return;
}
const normalized = workflowConfig.normalizeAgentWorkflowUiConfig(setting.value);
const { config: optimized, summary } =
await previewImages.optimizeAgentWorkflowUiConfigPreviewImages(normalized, {
force,
concurrency: 3,
dryRun,
});
console.log(
JSON.stringify(
{
dryRun,
force,
summary,
},
null,
2
)
);
if (dryRun) {
return;
}
if (summary.optimized > 0) {
if (!skipBackup) {
const backupPath = createBackupPath();
await mkdir(path.dirname(backupPath), { recursive: true });
await writeFile(
backupPath,
JSON.stringify(
{
key: workflowConfig.AGENT_WORKFLOW_UI_CONFIG_KEY,
backedUpAt: new Date().toISOString(),
value: setting.value,
},
null,
2
)
);
console.log(`Backup written: ${backupPath}`);
}
await db
.update(systemSettings)
.set({
value: optimized,
updatedAt: new Date(),
})
.where(eq(systemSettings.key, workflowConfig.AGENT_WORKFLOW_UI_CONFIG_KEY));
console.log(`Updated ${summary.optimized} agent workflow preview images.`);
} else {
console.log("No preview image update needed.");
}
}
main().catch((error) => {
console.error(error);
process.exit(1);
});