
    (<i                         d Z ddlZddlZddlZddlmZmZ ddlmZ dZde	de
de	fd	Zd
e	de	de	de	def
dZdede	ddfdZ	 dddd
e	de	de	de	dee	   ddfdZ	 dddd
e	dee	   de	de	dee	   ddfdZy)u   
audit_logger.py — 서브에이전트 파일 조작 감사 로거

audit-trail.jsonl에 파일 조작 이벤트를 JSONL 포맷으로 기록한다.
fcntl 파일 락으로 동시 쓰기 안전을 보장한다.
    N)datetimetimezone)Optionalz1/home/jay/workspace/memory/logs/audit-trail.jsonlnamevaluereturnc                     |t        |  d      t        |t              s#t        |  dt	        |      j
                         |j                         st        |  d      |S )uM   문자열 인자 유효성 검사 — 비어 있거나 None이면 ValueError.z must not be Nonez must be a str, got z must not be empty)
ValueError
isinstancestr	TypeErrortype__name__strip)r   r   s     C/home/jay/workspace/.worktrees/task-2057-dev2/utils/audit_logger.py_validate_strr      sg    }D6!2344eS!4& 4T%[5I5I4JKLL;;=D6!3455L    task_idfilepathtool	operationc                     | |||t        j                  t        j                        j	                         j                  dd      ddS )u%   감사 레코드 딕셔너리 생성.)tzz+00:00Zsubagent)r   filer   r   tsagent)r   nowr   utc	isoformatreplace)r   r   r   r   s       r   _make_recordr#      sC     llhll+557??#N r   record
audit_pathc                    t         j                  j                  |      }|rt        j                  |d       t	        j
                  | d      dz   }t        |dd      5 }t        j                  |j                         t        j                         	 |j                  |       |j                          t        j                  |j                                t        j                  |j                         t        j                         	 d	d	d	       y	# t        j                  |j                         t        j                         w xY w# 1 sw Y   y	xY w)
uA   레코드를 JSONL 파일에 fcntl 락으로 안전하게 append.T)exist_okF)ensure_ascii
azutf-8)encodingN)ospathdirnamemakedirsjsondumpsopenfcntlflockfilenoLOCK_EXwriteflushfsyncLOCK_UN)r$   r%   parentlinefhs        r   _append_recordr>   -   s    WW__Z(F
FT*::f51D8D	j#	0 4BBIIK/	4HHTNHHJHHRYY[!KK		U]]34 4 KK		U]]34 4s%   !3EAD2E4E		EE)r%   c                    t        d|       } t        d|      }t        d|      }t        | |||      }t        ||xs t               y)u   
    단일 파일 조작을 audit-trail.jsonl에 기록한다.

    Args:
        task_id:    작업 식별자 (예: "task-856.1")
        filepath:   조작된 파일의 절대/상대 경로
        tool:       사용된 도구 이름 (예: "Write", "Edit")
        operation:  조작 종류 (기본값 "write")
        audit_path: 감사 파일 경로 (기본값: DEFAULT_AUDIT_PATH)

    Raises:
        ValueError: task_id, filepath, tool 중 하나가 빈 문자열인 경우
        TypeError:  인자 타입이 str이 아닌 경우
    r   r   r   N)r   r#   r>   DEFAULT_AUDIT_PATH)r   r   r   r   r%   r$   s         r   log_file_operationrA   ?   sH    , Iw/GZ2H&D'8T9=F6:;);<r   	filepathsc                    t        d|       } t        d|      }|sy|xs t        }|D ](  }t        d|      }t        | |||      }t        ||       * y)u(  
    여러 파일 조작을 audit-trail.jsonl에 일괄 기록한다.

    빈 목록이 전달되면 아무것도 기록하지 않는다.

    Args:
        task_id:    작업 식별자
        filepaths:  조작된 파일 경로 목록
        tool:       사용된 도구 이름
        operation:  조작 종류 (기본값 "write")
        audit_path: 감사 파일 경로 (기본값: DEFAULT_AUDIT_PATH)

    Raises:
        ValueError: task_id 또는 tool이 빈 문자열인 경우
        TypeError:  인자 타입이 맞지 않는 경우
    r   r   Nr   )r   r@   r#   r>   )r   rB   r   r   r%   resolved_pathfpr$   s           r   log_batch_operationsrF   ]   sb    0 Iw/G&D4"4M .:r*gr4;v}-.r   )r7   )__doc__r3   r0   r,   r   r   typingr   r@   r   objectr   dictr#   r>   rA   listrF    r   r   <module>rM      s-     	 ' H  F s   	
 
"44 4S 4T 4, 	= !%=== = 	= = 
=D 	#. !%#.#.Cy#. #. 	#. #. 
#.r   