File size: 1,839 Bytes
68d7816 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | import type { WireMigration, WireMigrationRecord } from './migration';
interface V1_1ApprovalResult {
readonly decision: 'approved' | 'rejected' | 'cancelled';
readonly scope?: 'session';
readonly feedback?: string;
readonly selectedLabel?: string;
}
interface V1_1ApprovalResultRecord extends WireMigrationRecord {
readonly type: 'permission.record_approval_result';
readonly turnId: number;
readonly toolCallId: string;
readonly toolName: string;
readonly action: string;
readonly sessionApprovalRule?: string;
readonly result: V1_1ApprovalResult;
}
const LEGACY_SESSION_APPROVAL_ACTION_TO_PATTERN: Readonly<Record<string, string>> = {
'run command': 'Bash',
'stop background task': 'TaskStop',
'edit file': 'Write',
'edit file outside of working directory': 'Write',
'write file': 'Write',
};
const LEGACY_SESSION_APPROVAL_UNRESTORABLE_ACTIONS = new Set<string>([
'run command in plan mode',
'run background command',
]);
export const migrateV1_1ToV1_2: WireMigration = {
sourceVersion: '1.1',
targetVersion: '1.2',
migrateRecord(record: WireMigrationRecord): WireMigrationRecord {
if (record.type !== 'permission.record_approval_result') return record;
const approvalRecord = record as V1_1ApprovalResultRecord;
if (
approvalRecord.result.decision !== 'approved' ||
approvalRecord.result.scope !== 'session'
) {
return record;
}
if (approvalRecord.sessionApprovalRule !== undefined) return record;
const pattern = LEGACY_SESSION_APPROVAL_UNRESTORABLE_ACTIONS.has(approvalRecord.action)
? undefined
: LEGACY_SESSION_APPROVAL_ACTION_TO_PATTERN[approvalRecord.action] ??
approvalRecord.toolName;
if (pattern === undefined) return record;
return {
...record,
sessionApprovalRule: pattern,
};
},
};
|