import "dotenv/config"; import { existsSync, readdirSync, readFileSync } from "node:fs"; import { join } from "node:path"; import { loadConfig } from "../src/config.js"; import { createLogger } from "../src/logger.js"; import { MySqlSessionContextStore } from "../src/sessions/context_store.js"; const config = loadConfig(); const logger = createLogger(config.logLevel); const dryRun = process.argv.includes("--dry-run"); async function main(): Promise { const store = new MySqlSessionContextStore(config.mysql, logger); await store.init(); let migrated = 0; let skipped = 0; if (!existsSync(config.piSessionsDir)) { console.log("no pi session dir, nothing to migrate"); await store.close(); return; } for (const file of readdirSync(config.piSessionsDir)) { if (!file.endsWith(".jsonl")) continue; const match = file.match(/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/); const sessionId = match?.[1] ?? file.replace(/^.*?_/, "").replace(/\.jsonl$/, ""); if (!sessionId) { skipped += 1; continue; } const content = readFileSync(join(config.piSessionsDir, file)); if (!dryRun) await store.save(sessionId, content); migrated += 1; } console.log(`${dryRun ? "[dry-run] " : ""}migrated contexts=${migrated} skipped=${skipped}`); await store.close(); } main().catch((error) => { console.error("context migration failed:", error); process.exit(1); });