feat(automation): complete unified automation system redesign

Phase 4 completion:
- Add ApprovalQueue component for managing pending approvals
- Add ExecutionResult component for displaying hand/workflow results
- Update Sidebar navigation to use unified AutomationPanel
- Replace separate 'hands' and 'workflow' tabs with single 'automation' tab
- Fix TypeScript type safety issues with unknown types in JSX expressions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
iven
2026-03-18 17:12:05 +08:00
parent 3a7631e035
commit 3518fc8ece
74 changed files with 4984 additions and 687 deletions

View File

@@ -80,9 +80,9 @@ const EXTRACTION_PROMPT = `请从以下对话中提取值得长期记住的信
// === Default Config ===
export const DEFAULT_EXTRACTION_CONFIG: ExtractionConfig = {
useLLM: false,
useLLM: true, // Enable LLM-powered semantic extraction by default
llmFallbackToRules: true,
minMessagesForExtraction: 4,
minMessagesForExtraction: 2, // Lowered from 4 to capture memories earlier
extractionCooldownMs: 30_000,
minImportanceThreshold: 3,
};
@@ -119,12 +119,15 @@ export class MemoryExtractor {
): Promise<ExtractionResult> {
// Cooldown check
if (Date.now() - this.lastExtractionTime < this.config.extractionCooldownMs) {
console.log('[MemoryExtractor] Skipping extraction: cooldown active');
return { items: [], saved: 0, skipped: 0, userProfileUpdated: false };
}
// Minimum message threshold
const chatMessages = messages.filter(m => m.role === 'user' || m.role === 'assistant');
console.log(`[MemoryExtractor] Checking extraction: ${chatMessages.length} messages (min: ${this.config.minMessagesForExtraction})`);
if (chatMessages.length < this.config.minMessagesForExtraction) {
console.log('[MemoryExtractor] Skipping extraction: not enough messages');
return { items: [], saved: 0, skipped: 0, userProfileUpdated: false };
}
@@ -146,11 +149,14 @@ export class MemoryExtractor {
}
} else {
// Rule-based extraction
console.log('[MemoryExtractor] Using rule-based extraction');
extracted = this.ruleBasedExtraction(chatMessages);
console.log(`[MemoryExtractor] Rule-based extracted ${extracted.length} items before filtering`);
}
// Filter by importance threshold
extracted = extracted.filter(item => item.importance >= this.config.minImportanceThreshold);
console.log(`[MemoryExtractor] After importance filtering (>= ${this.config.minImportanceThreshold}): ${extracted.length} items`);
// Save to memory
const memoryManager = getMemoryManager();