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,
    };
  },
};