()
| 599 | |
| 600 | // ---------- Main ---------- |
| 601 | async function run() { |
| 602 | console.log(`Mode: ${DRY_RUN ? 'DRY RUN (audit + preview)' : 'LIVE'}`) |
| 603 | console.log( |
| 604 | `Mappings: ${Object.entries(BLOCK_TYPE_TO_PROVIDER) |
| 605 | .map(([b, p]) => `${b}=${p}`) |
| 606 | .join(', ')}` |
| 607 | ) |
| 608 | console.log(`Users: ${USER_FILTER.length > 0 ? USER_FILTER.join(', ') : 'all'}`) |
| 609 | if (FROM_FILE) console.log(`From file: ${FROM_FILE}`) |
| 610 | console.log('---\n') |
| 611 | |
| 612 | const stats = createEmptyStats() |
| 613 | let workspaceIdsWritten = 0 |
| 614 | |
| 615 | try { |
| 616 | // 1. Get distinct workspace IDs that have matching blocks |
| 617 | const mappedBlockTypes = Object.keys(BLOCK_TYPE_TO_PROVIDER) |
| 618 | const agentTypes = Object.keys(TOOL_INPUT_SUBBLOCK_IDS) |
| 619 | const allBlockTypes = [...new Set([...mappedBlockTypes, ...agentTypes])] |
| 620 | |
| 621 | const userFilter = |
| 622 | USER_FILTER.length > 0 |
| 623 | ? sql` AND ${workflow.userId} IN (${sql.join( |
| 624 | USER_FILTER.map((id) => sql`${id}`), |
| 625 | sql`, ` |
| 626 | )})` |
| 627 | : sql`` |
| 628 | |
| 629 | let workspaceIds: string[] |
| 630 | |
| 631 | if (DRY_RUN) { |
| 632 | const workspaceIdRows = await db |
| 633 | .selectDistinct({ workspaceId: workflow.workspaceId }) |
| 634 | .from(workflowBlocks) |
| 635 | .innerJoin(workflow, eq(workflowBlocks.workflowId, workflow.id)) |
| 636 | .where( |
| 637 | sql`${workflow.workspaceId} IS NOT NULL AND ${workflowBlocks.type} IN (${sql.join( |
| 638 | allBlockTypes.map((t) => sql`${t}`), |
| 639 | sql`, ` |
| 640 | )})${userFilter}` |
| 641 | ) |
| 642 | |
| 643 | workspaceIds = workspaceIdRows |
| 644 | .map((r) => r.workspaceId) |
| 645 | .filter((id): id is string => id !== null) |
| 646 | |
| 647 | console.log(`Found ${workspaceIds.length} workspaces with candidate blocks\n`) |
| 648 | |
| 649 | const outPath = resolve('migrate-byok-workspace-ids.txt') |
| 650 | writeFileSync(outPath, '') |
| 651 | console.log(`[DRY RUN] Will write workspace IDs with keys to ${outPath}\n`) |
| 652 | } else { |
| 653 | const raw = readFileSync(resolve(FROM_FILE!), 'utf-8') |
| 654 | workspaceIds = raw |
| 655 | .split('\n') |
| 656 | .map((l) => l.trim()) |
| 657 | .filter(Boolean) |
| 658 | console.log(`Loaded ${workspaceIds.length} workspace IDs from ${FROM_FILE}\n`) |
no test coverage detected