db: isolate paired turn provenance migration
This commit is contained in:
@@ -34,6 +34,7 @@ function getExpectedSchemaMigrations(): Array<{
|
|||||||
{ version: 7, name: 'runtime_service_metadata' },
|
{ version: 7, name: 'runtime_service_metadata' },
|
||||||
{ version: 8, name: 'paired_task_schema_cleanup' },
|
{ version: 8, name: 'paired_task_schema_cleanup' },
|
||||||
{ version: 9, name: 'paired_workspace_project_schema_cleanup' },
|
{ version: 9, name: 'paired_workspace_project_schema_cleanup' },
|
||||||
|
{ version: 10, name: 'paired_turn_provenance_upgrade' },
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
193
src/db/migrations/010_paired-turn-provenance-upgrade.ts
Normal file
193
src/db/migrations/010_paired-turn-provenance-upgrade.ts
Normal file
@@ -0,0 +1,193 @@
|
|||||||
|
import { backfillPairedTurnAttemptsFromTurns } from '../paired-turn-attempts.js';
|
||||||
|
import {
|
||||||
|
applyPairedTurnAttemptProvenanceConstraints,
|
||||||
|
assertPairedTurnAttemptProvenanceIntegrity,
|
||||||
|
backfillPairedTurnAttemptActiveRunIds,
|
||||||
|
backfillPairedTurnAttemptEntityIds,
|
||||||
|
backfillPairedTurnAttemptIds,
|
||||||
|
backfillPairedTurnAttemptParentIds,
|
||||||
|
backfillPairedTurnAttemptProvenance,
|
||||||
|
dropPairedTurnAttemptProvenanceConstraints,
|
||||||
|
rebuildPairedTurnAttemptForeignKeyTables,
|
||||||
|
rebuildPairedTurnsWithoutLegacyScratchColumns,
|
||||||
|
} from '../schema.js';
|
||||||
|
import { tryExecMigration } from './helpers.js';
|
||||||
|
import type { SchemaMigrationDefinition } from './types.js';
|
||||||
|
|
||||||
|
export const PAIRED_TURN_PROVENANCE_UPGRADE_MIGRATION = {
|
||||||
|
version: 10,
|
||||||
|
name: 'paired_turn_provenance_upgrade',
|
||||||
|
alwaysRun: true,
|
||||||
|
apply(database) {
|
||||||
|
tryExecMigration(
|
||||||
|
database,
|
||||||
|
`ALTER TABLE service_handoffs ADD COLUMN paired_task_id TEXT`,
|
||||||
|
);
|
||||||
|
tryExecMigration(
|
||||||
|
database,
|
||||||
|
`ALTER TABLE service_handoffs ADD COLUMN paired_task_updated_at TEXT`,
|
||||||
|
);
|
||||||
|
tryExecMigration(
|
||||||
|
database,
|
||||||
|
`ALTER TABLE service_handoffs ADD COLUMN turn_id TEXT`,
|
||||||
|
);
|
||||||
|
tryExecMigration(
|
||||||
|
database,
|
||||||
|
`ALTER TABLE service_handoffs ADD COLUMN turn_attempt_id TEXT`,
|
||||||
|
);
|
||||||
|
tryExecMigration(
|
||||||
|
database,
|
||||||
|
`ALTER TABLE service_handoffs ADD COLUMN turn_attempt_no INTEGER`,
|
||||||
|
);
|
||||||
|
tryExecMigration(
|
||||||
|
database,
|
||||||
|
`ALTER TABLE service_handoffs ADD COLUMN turn_intent_kind TEXT`,
|
||||||
|
);
|
||||||
|
tryExecMigration(
|
||||||
|
database,
|
||||||
|
`ALTER TABLE service_handoffs ADD COLUMN turn_role TEXT`,
|
||||||
|
);
|
||||||
|
tryExecMigration(
|
||||||
|
database,
|
||||||
|
`ALTER TABLE paired_task_execution_leases ADD COLUMN turn_id TEXT`,
|
||||||
|
);
|
||||||
|
tryExecMigration(
|
||||||
|
database,
|
||||||
|
`ALTER TABLE paired_task_execution_leases ADD COLUMN turn_attempt_id TEXT`,
|
||||||
|
);
|
||||||
|
tryExecMigration(
|
||||||
|
database,
|
||||||
|
`ALTER TABLE paired_task_execution_leases ADD COLUMN turn_attempt_no INTEGER`,
|
||||||
|
);
|
||||||
|
tryExecMigration(
|
||||||
|
database,
|
||||||
|
`ALTER TABLE paired_turn_attempts ADD COLUMN attempt_id TEXT`,
|
||||||
|
);
|
||||||
|
tryExecMigration(
|
||||||
|
database,
|
||||||
|
`ALTER TABLE paired_turn_attempts ADD COLUMN parent_attempt_id TEXT`,
|
||||||
|
);
|
||||||
|
tryExecMigration(
|
||||||
|
database,
|
||||||
|
`ALTER TABLE paired_turn_attempts ADD COLUMN parent_handoff_id INTEGER`,
|
||||||
|
);
|
||||||
|
tryExecMigration(
|
||||||
|
database,
|
||||||
|
`ALTER TABLE paired_turn_attempts ADD COLUMN continuation_handoff_id INTEGER`,
|
||||||
|
);
|
||||||
|
tryExecMigration(
|
||||||
|
database,
|
||||||
|
`ALTER TABLE paired_turn_attempts ADD COLUMN active_run_id TEXT`,
|
||||||
|
);
|
||||||
|
database.exec(`
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_paired_turn_attempts_parent_handoff_id
|
||||||
|
ON paired_turn_attempts(parent_handoff_id)
|
||||||
|
`);
|
||||||
|
database.exec(`
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_paired_turn_attempts_continuation_handoff_id
|
||||||
|
ON paired_turn_attempts(continuation_handoff_id)
|
||||||
|
`);
|
||||||
|
tryExecMigration(
|
||||||
|
database,
|
||||||
|
`ALTER TABLE paired_turn_reservations ADD COLUMN turn_id TEXT`,
|
||||||
|
);
|
||||||
|
tryExecMigration(
|
||||||
|
database,
|
||||||
|
`ALTER TABLE paired_turn_reservations ADD COLUMN turn_attempt_id TEXT`,
|
||||||
|
);
|
||||||
|
tryExecMigration(
|
||||||
|
database,
|
||||||
|
`ALTER TABLE paired_turn_reservations ADD COLUMN turn_attempt_no INTEGER`,
|
||||||
|
);
|
||||||
|
tryExecMigration(
|
||||||
|
database,
|
||||||
|
`ALTER TABLE paired_turn_reservations ADD COLUMN turn_role TEXT`,
|
||||||
|
);
|
||||||
|
|
||||||
|
database.exec(`
|
||||||
|
UPDATE paired_turn_reservations
|
||||||
|
SET turn_id = COALESCE(
|
||||||
|
turn_id,
|
||||||
|
task_id || ':' || task_updated_at || ':' || intent_kind
|
||||||
|
)
|
||||||
|
`);
|
||||||
|
database.exec(`
|
||||||
|
UPDATE paired_turn_reservations
|
||||||
|
SET turn_role = COALESCE(
|
||||||
|
turn_role,
|
||||||
|
CASE
|
||||||
|
WHEN intent_kind = 'reviewer-turn' THEN 'reviewer'
|
||||||
|
WHEN intent_kind = 'arbiter-turn' THEN 'arbiter'
|
||||||
|
ELSE 'owner'
|
||||||
|
END
|
||||||
|
)
|
||||||
|
`);
|
||||||
|
database.exec(`
|
||||||
|
UPDATE paired_task_execution_leases
|
||||||
|
SET turn_id = COALESCE(
|
||||||
|
turn_id,
|
||||||
|
task_id || ':' || task_updated_at || ':' || intent_kind
|
||||||
|
)
|
||||||
|
`);
|
||||||
|
database.exec(
|
||||||
|
`UPDATE service_handoffs
|
||||||
|
SET target_role = COALESCE(
|
||||||
|
target_role,
|
||||||
|
intended_role,
|
||||||
|
CASE
|
||||||
|
WHEN reason LIKE 'reviewer-%' THEN 'reviewer'
|
||||||
|
WHEN reason LIKE 'arbiter-%' THEN 'arbiter'
|
||||||
|
WHEN reason IS NOT NULL THEN 'owner'
|
||||||
|
ELSE NULL
|
||||||
|
END
|
||||||
|
)
|
||||||
|
WHERE target_role IS NULL`,
|
||||||
|
);
|
||||||
|
database.exec(
|
||||||
|
`UPDATE service_handoffs
|
||||||
|
SET source_role = COALESCE(source_role, target_role, intended_role)
|
||||||
|
WHERE source_role IS NULL`,
|
||||||
|
);
|
||||||
|
database.exec(
|
||||||
|
`UPDATE service_handoffs
|
||||||
|
SET turn_role = COALESCE(turn_role, target_role, intended_role)
|
||||||
|
WHERE turn_role IS NULL`,
|
||||||
|
);
|
||||||
|
database.exec(
|
||||||
|
`UPDATE service_handoffs
|
||||||
|
SET turn_intent_kind = COALESCE(
|
||||||
|
turn_intent_kind,
|
||||||
|
CASE
|
||||||
|
WHEN turn_role = 'reviewer' THEN 'reviewer-turn'
|
||||||
|
WHEN turn_role = 'arbiter' THEN 'arbiter-turn'
|
||||||
|
ELSE turn_intent_kind
|
||||||
|
END
|
||||||
|
)`,
|
||||||
|
);
|
||||||
|
database.exec(
|
||||||
|
`UPDATE service_handoffs
|
||||||
|
SET turn_id = COALESCE(
|
||||||
|
turn_id,
|
||||||
|
CASE
|
||||||
|
WHEN paired_task_id IS NOT NULL
|
||||||
|
AND paired_task_updated_at IS NOT NULL
|
||||||
|
AND turn_intent_kind IS NOT NULL
|
||||||
|
THEN paired_task_id || ':' || paired_task_updated_at || ':' || turn_intent_kind
|
||||||
|
ELSE turn_id
|
||||||
|
END
|
||||||
|
)`,
|
||||||
|
);
|
||||||
|
|
||||||
|
backfillPairedTurnAttemptsFromTurns(database);
|
||||||
|
backfillPairedTurnAttemptIds(database);
|
||||||
|
backfillPairedTurnAttemptParentIds(database);
|
||||||
|
backfillPairedTurnAttemptActiveRunIds(database);
|
||||||
|
backfillPairedTurnAttemptProvenance(database);
|
||||||
|
backfillPairedTurnAttemptEntityIds(database);
|
||||||
|
assertPairedTurnAttemptProvenanceIntegrity(database);
|
||||||
|
dropPairedTurnAttemptProvenanceConstraints(database);
|
||||||
|
rebuildPairedTurnsWithoutLegacyScratchColumns(database);
|
||||||
|
rebuildPairedTurnAttemptForeignKeyTables(database);
|
||||||
|
applyPairedTurnAttemptProvenanceConstraints(database);
|
||||||
|
},
|
||||||
|
} satisfies SchemaMigrationDefinition;
|
||||||
@@ -9,6 +9,7 @@ import { CHAT_CHANNEL_METADATA_MIGRATION } from './006_chat-channel-metadata.js'
|
|||||||
import { RUNTIME_SERVICE_METADATA_MIGRATION } from './007_runtime-service-metadata.js';
|
import { RUNTIME_SERVICE_METADATA_MIGRATION } from './007_runtime-service-metadata.js';
|
||||||
import { PAIRED_TASK_SCHEMA_CLEANUP_MIGRATION } from './008_paired-task-schema-cleanup.js';
|
import { PAIRED_TASK_SCHEMA_CLEANUP_MIGRATION } from './008_paired-task-schema-cleanup.js';
|
||||||
import { PAIRED_WORKSPACE_PROJECT_SCHEMA_CLEANUP_MIGRATION } from './009_paired-workspace-project-schema-cleanup.js';
|
import { PAIRED_WORKSPACE_PROJECT_SCHEMA_CLEANUP_MIGRATION } from './009_paired-workspace-project-schema-cleanup.js';
|
||||||
|
import { PAIRED_TURN_PROVENANCE_UPGRADE_MIGRATION } from './010_paired-turn-provenance-upgrade.js';
|
||||||
import type {
|
import type {
|
||||||
SchemaMigrationArgs,
|
SchemaMigrationArgs,
|
||||||
SchemaMigrationDefinition,
|
SchemaMigrationDefinition,
|
||||||
@@ -26,6 +27,7 @@ const ORDERED_SCHEMA_MIGRATIONS: readonly SchemaMigrationDefinition[] = [
|
|||||||
RUNTIME_SERVICE_METADATA_MIGRATION,
|
RUNTIME_SERVICE_METADATA_MIGRATION,
|
||||||
PAIRED_TASK_SCHEMA_CLEANUP_MIGRATION,
|
PAIRED_TASK_SCHEMA_CLEANUP_MIGRATION,
|
||||||
PAIRED_WORKSPACE_PROJECT_SCHEMA_CLEANUP_MIGRATION,
|
PAIRED_WORKSPACE_PROJECT_SCHEMA_CLEANUP_MIGRATION,
|
||||||
|
PAIRED_TURN_PROVENANCE_UPGRADE_MIGRATION,
|
||||||
];
|
];
|
||||||
|
|
||||||
function ensureSchemaMigrationsTable(database: Database): void {
|
function ensureSchemaMigrationsTable(database: Database): void {
|
||||||
|
|||||||
206
src/db/schema.ts
206
src/db/schema.ts
@@ -1,10 +1,7 @@
|
|||||||
import { Database } from 'bun:sqlite';
|
import { Database } from 'bun:sqlite';
|
||||||
|
|
||||||
import { inferExecutionLeaseServiceIdFromCanonicalMetadata } from './canonical-role-metadata.js';
|
import { inferExecutionLeaseServiceIdFromCanonicalMetadata } from './canonical-role-metadata.js';
|
||||||
import {
|
import { buildPairedTurnAttemptId } from './paired-turn-attempts.js';
|
||||||
backfillPairedTurnAttemptsFromTurns,
|
|
||||||
buildPairedTurnAttemptId,
|
|
||||||
} from './paired-turn-attempts.js';
|
|
||||||
import {
|
import {
|
||||||
getTableColumns,
|
getTableColumns,
|
||||||
tableHasColumn,
|
tableHasColumn,
|
||||||
@@ -291,7 +288,7 @@ function resolveAttemptNoForBackfill(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function backfillPairedTurnAttemptIds(database: Database): void {
|
export function backfillPairedTurnAttemptIds(database: Database): void {
|
||||||
if (!tableHasColumn(database, 'paired_turn_attempts', 'attempt_id')) {
|
if (!tableHasColumn(database, 'paired_turn_attempts', 'attempt_id')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -304,7 +301,7 @@ function backfillPairedTurnAttemptIds(database: Database): void {
|
|||||||
`);
|
`);
|
||||||
}
|
}
|
||||||
|
|
||||||
function backfillPairedTurnAttemptParentIds(database: Database): void {
|
export function backfillPairedTurnAttemptParentIds(database: Database): void {
|
||||||
if (!tableHasColumn(database, 'paired_turn_attempts', 'parent_attempt_id')) {
|
if (!tableHasColumn(database, 'paired_turn_attempts', 'parent_attempt_id')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -334,7 +331,9 @@ function backfillPairedTurnAttemptParentIds(database: Database): void {
|
|||||||
`);
|
`);
|
||||||
}
|
}
|
||||||
|
|
||||||
function backfillPairedTurnAttemptActiveRunIds(database: Database): void {
|
export function backfillPairedTurnAttemptActiveRunIds(
|
||||||
|
database: Database,
|
||||||
|
): void {
|
||||||
if (!tableHasColumn(database, 'paired_turn_attempts', 'active_run_id')) {
|
if (!tableHasColumn(database, 'paired_turn_attempts', 'active_run_id')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -418,7 +417,7 @@ function backfillPairedTurnAttemptActiveRunIds(database: Database): void {
|
|||||||
`);
|
`);
|
||||||
}
|
}
|
||||||
|
|
||||||
function backfillPairedTurnAttemptEntityIds(database: Database): void {
|
export function backfillPairedTurnAttemptEntityIds(database: Database): void {
|
||||||
if (
|
if (
|
||||||
tableHasColumn(database, 'paired_turn_reservations', 'turn_attempt_id') &&
|
tableHasColumn(database, 'paired_turn_reservations', 'turn_attempt_id') &&
|
||||||
tableHasColumn(database, 'paired_turn_reservations', 'turn_attempt_no')
|
tableHasColumn(database, 'paired_turn_reservations', 'turn_attempt_no')
|
||||||
@@ -475,7 +474,7 @@ function backfillPairedTurnAttemptEntityIds(database: Database): void {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function backfillPairedTurnAttemptProvenance(database: Database): void {
|
export function backfillPairedTurnAttemptProvenance(database: Database): void {
|
||||||
const timingsByTurnId = getPairedTurnAttemptTimingsByTurnId(database);
|
const timingsByTurnId = getPairedTurnAttemptTimingsByTurnId(database);
|
||||||
|
|
||||||
if (tableHasColumn(database, 'paired_turn_reservations', 'turn_attempt_no')) {
|
if (tableHasColumn(database, 'paired_turn_reservations', 'turn_attempt_no')) {
|
||||||
@@ -634,7 +633,9 @@ function backfillPairedTurnAttemptProvenance(database: Database): void {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function assertPairedTurnAttemptProvenanceIntegrity(database: Database): void {
|
export function assertPairedTurnAttemptProvenanceIntegrity(
|
||||||
|
database: Database,
|
||||||
|
): void {
|
||||||
if (tableHasColumn(database, 'paired_turn_attempts', 'attempt_id')) {
|
if (tableHasColumn(database, 'paired_turn_attempts', 'attempt_id')) {
|
||||||
const invalidAttemptIdRow = database
|
const invalidAttemptIdRow = database
|
||||||
.prepare(
|
.prepare(
|
||||||
@@ -1274,7 +1275,7 @@ function rebuildPairedTurnAttemptsWithForeignKeys(database: Database): void {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
|
|
||||||
function rebuildPairedTurnsWithoutLegacyScratchColumns(
|
export function rebuildPairedTurnsWithoutLegacyScratchColumns(
|
||||||
database: Database,
|
database: Database,
|
||||||
): void {
|
): void {
|
||||||
if (
|
if (
|
||||||
@@ -1707,14 +1708,18 @@ function rebuildServiceHandoffsWithForeignKeys(database: Database): void {
|
|||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
|
|
||||||
function rebuildPairedTurnAttemptForeignKeyTables(database: Database): void {
|
export function rebuildPairedTurnAttemptForeignKeyTables(
|
||||||
|
database: Database,
|
||||||
|
): void {
|
||||||
rebuildPairedTurnAttemptsWithForeignKeys(database);
|
rebuildPairedTurnAttemptsWithForeignKeys(database);
|
||||||
rebuildPairedTurnReservationsWithForeignKeys(database);
|
rebuildPairedTurnReservationsWithForeignKeys(database);
|
||||||
rebuildPairedTaskExecutionLeasesWithForeignKeys(database);
|
rebuildPairedTaskExecutionLeasesWithForeignKeys(database);
|
||||||
rebuildServiceHandoffsWithForeignKeys(database);
|
rebuildServiceHandoffsWithForeignKeys(database);
|
||||||
}
|
}
|
||||||
|
|
||||||
function dropPairedTurnAttemptProvenanceConstraints(database: Database): void {
|
export function dropPairedTurnAttemptProvenanceConstraints(
|
||||||
|
database: Database,
|
||||||
|
): void {
|
||||||
database.exec(`
|
database.exec(`
|
||||||
DROP TRIGGER IF EXISTS paired_turn_attempts_validate_insert;
|
DROP TRIGGER IF EXISTS paired_turn_attempts_validate_insert;
|
||||||
DROP TRIGGER IF EXISTS paired_turn_attempts_validate_update;
|
DROP TRIGGER IF EXISTS paired_turn_attempts_validate_update;
|
||||||
@@ -1727,7 +1732,9 @@ function dropPairedTurnAttemptProvenanceConstraints(database: Database): void {
|
|||||||
`);
|
`);
|
||||||
}
|
}
|
||||||
|
|
||||||
function applyPairedTurnAttemptProvenanceConstraints(database: Database): void {
|
export function applyPairedTurnAttemptProvenanceConstraints(
|
||||||
|
database: Database,
|
||||||
|
): void {
|
||||||
database.exec(`
|
database.exec(`
|
||||||
CREATE TRIGGER IF NOT EXISTS paired_turn_attempts_validate_insert
|
CREATE TRIGGER IF NOT EXISTS paired_turn_attempts_validate_insert
|
||||||
BEFORE INSERT ON paired_turn_attempts
|
BEFORE INSERT ON paired_turn_attempts
|
||||||
@@ -2178,34 +2185,6 @@ export function applyLegacySchemaMigrations(
|
|||||||
database,
|
database,
|
||||||
`ALTER TABLE service_handoffs ADD COLUMN target_service_id TEXT`,
|
`ALTER TABLE service_handoffs ADD COLUMN target_service_id TEXT`,
|
||||||
);
|
);
|
||||||
tryExecMigration(
|
|
||||||
database,
|
|
||||||
`ALTER TABLE service_handoffs ADD COLUMN paired_task_id TEXT`,
|
|
||||||
);
|
|
||||||
tryExecMigration(
|
|
||||||
database,
|
|
||||||
`ALTER TABLE service_handoffs ADD COLUMN paired_task_updated_at TEXT`,
|
|
||||||
);
|
|
||||||
tryExecMigration(
|
|
||||||
database,
|
|
||||||
`ALTER TABLE service_handoffs ADD COLUMN turn_id TEXT`,
|
|
||||||
);
|
|
||||||
tryExecMigration(
|
|
||||||
database,
|
|
||||||
`ALTER TABLE service_handoffs ADD COLUMN turn_attempt_id TEXT`,
|
|
||||||
);
|
|
||||||
tryExecMigration(
|
|
||||||
database,
|
|
||||||
`ALTER TABLE service_handoffs ADD COLUMN turn_attempt_no INTEGER`,
|
|
||||||
);
|
|
||||||
tryExecMigration(
|
|
||||||
database,
|
|
||||||
`ALTER TABLE service_handoffs ADD COLUMN turn_intent_kind TEXT`,
|
|
||||||
);
|
|
||||||
tryExecMigration(
|
|
||||||
database,
|
|
||||||
`ALTER TABLE service_handoffs ADD COLUMN turn_role TEXT`,
|
|
||||||
);
|
|
||||||
|
|
||||||
tryExecMigration(
|
tryExecMigration(
|
||||||
database,
|
database,
|
||||||
@@ -2235,46 +2214,6 @@ export function applyLegacySchemaMigrations(
|
|||||||
database,
|
database,
|
||||||
`ALTER TABLE paired_task_execution_leases ADD COLUMN claimed_service_id TEXT`,
|
`ALTER TABLE paired_task_execution_leases ADD COLUMN claimed_service_id TEXT`,
|
||||||
);
|
);
|
||||||
tryExecMigration(
|
|
||||||
database,
|
|
||||||
`ALTER TABLE paired_task_execution_leases ADD COLUMN turn_id TEXT`,
|
|
||||||
);
|
|
||||||
tryExecMigration(
|
|
||||||
database,
|
|
||||||
`ALTER TABLE paired_task_execution_leases ADD COLUMN turn_attempt_id TEXT`,
|
|
||||||
);
|
|
||||||
tryExecMigration(
|
|
||||||
database,
|
|
||||||
`ALTER TABLE paired_task_execution_leases ADD COLUMN turn_attempt_no INTEGER`,
|
|
||||||
);
|
|
||||||
tryExecMigration(
|
|
||||||
database,
|
|
||||||
`ALTER TABLE paired_turn_attempts ADD COLUMN attempt_id TEXT`,
|
|
||||||
);
|
|
||||||
tryExecMigration(
|
|
||||||
database,
|
|
||||||
`ALTER TABLE paired_turn_attempts ADD COLUMN parent_attempt_id TEXT`,
|
|
||||||
);
|
|
||||||
tryExecMigration(
|
|
||||||
database,
|
|
||||||
`ALTER TABLE paired_turn_attempts ADD COLUMN parent_handoff_id INTEGER`,
|
|
||||||
);
|
|
||||||
tryExecMigration(
|
|
||||||
database,
|
|
||||||
`ALTER TABLE paired_turn_attempts ADD COLUMN continuation_handoff_id INTEGER`,
|
|
||||||
);
|
|
||||||
tryExecMigration(
|
|
||||||
database,
|
|
||||||
`ALTER TABLE paired_turn_attempts ADD COLUMN active_run_id TEXT`,
|
|
||||||
);
|
|
||||||
database.exec(`
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_paired_turn_attempts_parent_handoff_id
|
|
||||||
ON paired_turn_attempts(parent_handoff_id)
|
|
||||||
`);
|
|
||||||
database.exec(`
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_paired_turn_attempts_continuation_handoff_id
|
|
||||||
ON paired_turn_attempts(continuation_handoff_id)
|
|
||||||
`);
|
|
||||||
database.exec(`
|
database.exec(`
|
||||||
UPDATE paired_task_execution_leases
|
UPDATE paired_task_execution_leases
|
||||||
SET expires_at = COALESCE(
|
SET expires_at = COALESCE(
|
||||||
@@ -2299,109 +2238,6 @@ export function applyLegacySchemaMigrations(
|
|||||||
database,
|
database,
|
||||||
`ALTER TABLE work_items ADD COLUMN service_id TEXT`,
|
`ALTER TABLE work_items ADD COLUMN service_id TEXT`,
|
||||||
);
|
);
|
||||||
tryExecMigration(
|
|
||||||
database,
|
|
||||||
`ALTER TABLE paired_turn_reservations ADD COLUMN turn_id TEXT`,
|
|
||||||
);
|
|
||||||
tryExecMigration(
|
|
||||||
database,
|
|
||||||
`ALTER TABLE paired_turn_reservations ADD COLUMN turn_attempt_id TEXT`,
|
|
||||||
);
|
|
||||||
tryExecMigration(
|
|
||||||
database,
|
|
||||||
`ALTER TABLE paired_turn_reservations ADD COLUMN turn_attempt_no INTEGER`,
|
|
||||||
);
|
|
||||||
tryExecMigration(
|
|
||||||
database,
|
|
||||||
`ALTER TABLE paired_turn_reservations ADD COLUMN turn_role TEXT`,
|
|
||||||
);
|
|
||||||
|
|
||||||
database.exec(`
|
|
||||||
UPDATE paired_turn_reservations
|
|
||||||
SET turn_id = COALESCE(
|
|
||||||
turn_id,
|
|
||||||
task_id || ':' || task_updated_at || ':' || intent_kind
|
|
||||||
)
|
|
||||||
`);
|
|
||||||
database.exec(`
|
|
||||||
UPDATE paired_turn_reservations
|
|
||||||
SET turn_role = COALESCE(
|
|
||||||
turn_role,
|
|
||||||
CASE
|
|
||||||
WHEN intent_kind = 'reviewer-turn' THEN 'reviewer'
|
|
||||||
WHEN intent_kind = 'arbiter-turn' THEN 'arbiter'
|
|
||||||
ELSE 'owner'
|
|
||||||
END
|
|
||||||
)
|
|
||||||
`);
|
|
||||||
database.exec(`
|
|
||||||
UPDATE paired_task_execution_leases
|
|
||||||
SET turn_id = COALESCE(
|
|
||||||
turn_id,
|
|
||||||
task_id || ':' || task_updated_at || ':' || intent_kind
|
|
||||||
)
|
|
||||||
`);
|
|
||||||
database.exec(
|
|
||||||
`UPDATE service_handoffs
|
|
||||||
SET target_role = COALESCE(
|
|
||||||
target_role,
|
|
||||||
intended_role,
|
|
||||||
CASE
|
|
||||||
WHEN reason LIKE 'reviewer-%' THEN 'reviewer'
|
|
||||||
WHEN reason LIKE 'arbiter-%' THEN 'arbiter'
|
|
||||||
WHEN reason IS NOT NULL THEN 'owner'
|
|
||||||
ELSE NULL
|
|
||||||
END
|
|
||||||
)
|
|
||||||
WHERE target_role IS NULL`,
|
|
||||||
);
|
|
||||||
|
|
||||||
database.exec(
|
|
||||||
`UPDATE service_handoffs
|
|
||||||
SET source_role = COALESCE(source_role, target_role, intended_role)
|
|
||||||
WHERE source_role IS NULL`,
|
|
||||||
);
|
|
||||||
database.exec(
|
|
||||||
`UPDATE service_handoffs
|
|
||||||
SET turn_role = COALESCE(turn_role, target_role, intended_role)
|
|
||||||
WHERE turn_role IS NULL`,
|
|
||||||
);
|
|
||||||
database.exec(
|
|
||||||
`UPDATE service_handoffs
|
|
||||||
SET turn_intent_kind = COALESCE(
|
|
||||||
turn_intent_kind,
|
|
||||||
CASE
|
|
||||||
WHEN turn_role = 'reviewer' THEN 'reviewer-turn'
|
|
||||||
WHEN turn_role = 'arbiter' THEN 'arbiter-turn'
|
|
||||||
ELSE turn_intent_kind
|
|
||||||
END
|
|
||||||
)`,
|
|
||||||
);
|
|
||||||
database.exec(
|
|
||||||
`UPDATE service_handoffs
|
|
||||||
SET turn_id = COALESCE(
|
|
||||||
turn_id,
|
|
||||||
CASE
|
|
||||||
WHEN paired_task_id IS NOT NULL
|
|
||||||
AND paired_task_updated_at IS NOT NULL
|
|
||||||
AND turn_intent_kind IS NOT NULL
|
|
||||||
THEN paired_task_id || ':' || paired_task_updated_at || ':' || turn_intent_kind
|
|
||||||
ELSE turn_id
|
|
||||||
END
|
|
||||||
)`,
|
|
||||||
);
|
|
||||||
|
|
||||||
backfillPairedTurnAttemptsFromTurns(database);
|
|
||||||
backfillPairedTurnAttemptIds(database);
|
|
||||||
backfillPairedTurnAttemptParentIds(database);
|
|
||||||
backfillPairedTurnAttemptActiveRunIds(database);
|
|
||||||
backfillPairedTurnAttemptProvenance(database);
|
|
||||||
backfillPairedTurnAttemptEntityIds(database);
|
|
||||||
assertPairedTurnAttemptProvenanceIntegrity(database);
|
|
||||||
dropPairedTurnAttemptProvenanceConstraints(database);
|
|
||||||
rebuildPairedTurnsWithoutLegacyScratchColumns(database);
|
|
||||||
rebuildPairedTurnAttemptForeignKeyTables(database);
|
|
||||||
applyPairedTurnAttemptProvenanceConstraints(database);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @deprecated New schema changes should be added under src/db/migrations/*. */
|
/** @deprecated New schema changes should be added under src/db/migrations/*. */
|
||||||
|
|||||||
Reference in New Issue
Block a user