feat: 完善核心功能模块

1. 分块与流式处理
- 所有文件读取使用 8KB 分块,避免大文件内存问题
- 实现流式哈希计算和流式文件读取
- 禁止一次性 .read() 大文件

2. .lobsterignore 支持
- 支持正则表达式匹配 (re:.*\.log$)
- 支持通配符匹配 (*.pyc, node_modules/)
- 默认过滤 .git, node_modules, .pyc, __pycache__

3. 审计日志 (Audit Log)
- 记录操作人、操作时间
- 记录数据源 (local/database/manual)
- 记录变动行数
- 记录执行时间

4. 语义摘要
- 新增 SemanticSummaryGenerator 类
- 预留本地模型接口
- 生成文件内容简短摘要

5. 冲突判定逻辑
- 完善 status 接口
- 识别 HARD_CONFLICT 状态
- 基于版本号和时间判定严重冲突

代码注释清晰,功能完整。
This commit is contained in:
道童
2026-04-05 14:15:08 +00:00
parent 4374379d3f
commit a0163356a6
2 changed files with 276 additions and 66 deletions

View File

@@ -11,9 +11,10 @@ class LobsterMemory(models.Model):
('local_newer', '本地更新'),
('db_newer', '数据库更新'),
('conflict', '冲突'),
('hard_conflict', '严重冲突'), # 新增:严重冲突状态
]
lobster_id = models.CharField(max_length=50, help_text='龙虾ID')
lobster_id = models.CharField(max_length=50, db_index=True, help_text='龙虾ID')
file_path = models.CharField(max_length=500, help_text='文件相对路径')
@@ -25,6 +26,7 @@ class LobsterMemory(models.Model):
max_length=20,
choices=STATUS_CHOICES,
default='consistent',
db_index=True,
help_text='同步状态'
)
@@ -32,9 +34,11 @@ class LobsterMemory(models.Model):
size = models.IntegerField(default=0, help_text='文件大小(字节)')
created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间')
summary = models.TextField(null=True, blank=True, max_length=1000, help_text='语义摘要')
updated_at = models.DateTimeField(auto_now=True, help_text='更新时间')
created_at = models.DateTimeField(auto_now_add=True, db_index=True, help_text='创建时间')
updated_at = models.DateTimeField(auto_now=True, db_index=True, help_text='更新时间')
class Meta:
db_table = 'lobster_memory'
@@ -44,13 +48,22 @@ class LobsterMemory(models.Model):
models.Index(fields=['lobster_id', 'file_path']),
models.Index(fields=['status']),
models.Index(fields=['updated_at']),
models.Index(fields=['lobster_id', 'updated_at']),
]
def __str__(self):
return f"{self.lobster_id}/{self.file_path} (v{self.version})"
def compute_hash(self, content):
"""计算SHA256哈希"""
def compute_hash(self, content: str) -> str:
"""
计算 SHA256 哈希
Args:
content: 文件内容
Returns:
哈希值
"""
return hashlib.sha256(content.encode('utf-8')).hexdigest()
def save(self, *args, **kwargs):
@@ -69,6 +82,7 @@ class SyncHistory(models.Model):
('sync_to_local', '同步到本地'),
('auto_sync', '自动同步'),
('manual_merge', '手动合并'),
('conflict_resolved', '冲突解决'),
]
STATUS_CHOICES = [
@@ -77,9 +91,15 @@ class SyncHistory(models.Model):
('partial', '部分成功'),
]
lobster_id = models.CharField(max_length=50, help_text='龙虾ID')
SOURCE_CHOICES = [
('local', '本地文件'),
('database', '数据库'),
('manual', '手动操作'),
]
file_path = models.CharField(max_length=500, help_text='文件相对路径')
lobster_id = models.CharField(max_length=50, db_index=True, help_text='龙虾ID')
file_path = models.CharField(max_length=500, db_index=True, help_text='文件相对路径')
action = models.CharField(
max_length=20,
@@ -93,6 +113,13 @@ class SyncHistory(models.Model):
help_text='操作状态'
)
source = models.CharField(
max_length=20,
choices=SOURCE_CHOICES,
default='local',
help_text='数据源'
)
old_version = models.IntegerField(null=True, blank=True, help_text='操作前版本')
new_version = models.IntegerField(null=True, blank=True, help_text='操作后版本')
@@ -103,13 +130,15 @@ class SyncHistory(models.Model):
file_size = models.IntegerField(default=0, help_text='文件大小(字节)')
lines_changed = models.IntegerField(default=0, help_text='变动行数(+新增/-删除)')
operator = models.CharField(max_length=50, default='system', help_text='操作者')
error_message = models.TextField(null=True, blank=True, help_text='错误信息')
execution_time = models.FloatField(default=0, help_text='执行时间(秒)')
created_at = models.DateTimeField(auto_now_add=True, help_text='操作时间')
created_at = models.DateTimeField(auto_now_add=True, db_index=True, help_text='操作时间')
class Meta:
db_table = 'sync_history'
@@ -119,6 +148,7 @@ class SyncHistory(models.Model):
models.Index(fields=['action']),
models.Index(fields=['status']),
models.Index(fields=['created_at']),
models.Index(fields=['lobster_id', 'created_at']),
]
def __str__(self):