
    i(                     N    d Z ddlZddlmZ ddlmZmZmZ  G d de          ZdS )u   日志记录 Skill。    N)Path)	SkillBaseSkillContextSkillResultc                       e Zd ZdZdZdZddgZddefdZddZ	ddedededed	d
f
dZ
ded	efdZdeded	efdZdeded	efdZd
S )LogSkillu%   记录和检索 Shell 交互日志。logu"   记录和检索 Shell 交互日志z/logz/historydata/logs.dbdb_pathc                     t          |          | _        | j        dk    r!| j        j                            dd           |                                  d S )Nz:memory:T)parentsexist_ok)r   r   parentmkdir_init_db)selfr   s     6/root/projects/qq-shell/src/butler/skills/log_skill.py__init__zLogSkill.__init__   sK    G}}<:%%L%%dT%BBB    returnNc                    t          j        | j                  }|                    d           |                    d           |                    d           |                                 |                                 d S )NaU  
            CREATE TABLE IF NOT EXISTS shell_logs (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                user_id TEXT NOT NULL,
                session_name TEXT NOT NULL,
                command TEXT NOT NULL,
                output TEXT,
                timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
            )
        z:CREATE INDEX IF NOT EXISTS idx_user ON shell_logs(user_id)zACREATE INDEX IF NOT EXISTS idx_timestamp ON shell_logs(timestamp)sqlite3connectr   executecommitclose)r   conns     r   r   zLogSkill._init_db   st    t|,, 	 		 		 		 	QRRRXYYY

r    user_idsession_namecommandoutputc                     t          j        | j                  }|                    d||||f           |                                 |                                 d S )NzSINSERT INTO shell_logs (user_id, session_name, command, output) VALUES (?, ?, ?, ?)r   )r   r    r!   r"   r#   r   s         r   log_commandzLogSkill.log_command'   sX    t|,,alGV4	
 	
 	
 	

r   ctxc                   K   |j         }|r|d         dk    rEt          |          dk    rt          |d                   nd}|                     |j        |          S |d         dk    rMt          |          dk    rd                    |dd                    nd}|                     |j        |          S t          dd	
          S )Nr   recent   
   search r   Fu(   用法: /log [recent N|search 关键词]successr#   )argslenint_query_recentr    join_search_commandsr   )r   r&   r/   limitkeywords        r   r   zLogSkill.execute0   s      x 	?tAw(**$'IIMMCQLLLrE%%ck5999!W  ,/IIMMchhtABBx(((rG((g>>>51[\\\\r   r5   c                    t          j        | j                  }|                    d||f          }|                                }|                                 d                    d |D                       }t          d|pd          S )Nz[SELECT command, timestamp FROM shell_logs WHERE user_id = ? ORDER BY timestamp DESC LIMIT ?
c              3   >   K   | ]}d |d          d|d          V  dS [r)   z] r   N .0rows     r   	<genexpr>z)LogSkill._query_recent.<locals>.<genexpr>F   ;      BBc1s1v11Q11BBBBBBr   Tu   无日志记录r-   r   r   r   r   fetchallr   r3   r   )r   r    r5   r   cursorrowsr#   s          r   r2   zLogSkill._query_recent=   s    t|,,ie
 
   

BBTBBBBB40K:KLLLLr   r6   c                     t          j        | j                  }|                    d|d| df          }|                                }|                                 d                    d |D                       }t          d|pd          S )NzoSELECT command, timestamp FROM shell_logs WHERE user_id = ? AND command LIKE ? ORDER BY timestamp DESC LIMIT 20%r8   c              3   >   K   | ]}d |d          d|d          V  dS r:   r<   r=   s     r   r@   z,LogSkill._search_commands.<locals>.<genexpr>R   rA   r   Tu   无匹配记录r-   rB   )r   r    r6   r   rD   rE   r#   s          r   r4   zLogSkill._search_commandsI   s    t|,,}n'nnn%
 
   

BBTBBBBB40K:KLLLLr   )r
   )r   N)r   )__name__
__module____qualname____doc__namedescriptiontriggersstrr   r   r%   r   r   r   r1   r2   r4   r<   r   r   r   r   	   s*       //D6K
#H        " 3 c C QT ^b    ] ]+ ] ] ] ]
MS 
M 
M 
M 
M 
M 
M
M 
Mc 
Mk 
M 
M 
M 
M 
M 
Mr   r   )	rL   r   pathlibr   butler.skills.baser   r   r   r   r<   r   r   <module>rS      s             C C C C C C C C C CJM JM JM JM JMy JM JM JM JM JMr   