Compare commits

...

5 Commits

Author SHA1 Message Date
iven
2843bd204f chore: 更新测试注释 — 阈值已从 5 降为 3
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
2026-04-11 14:26:53 +08:00
iven
05374f99b0 chore: 移除未使用的 loadConnectionModeTimestamp 函数 2026-04-11 14:26:52 +08:00
iven
c88e3ac630 fix(kernel): UserProfile 序列化失败时记录 warn 而非静默吞掉 2026-04-11 14:26:52 +08:00
iven
dc94a5323a fix(butler): 降低痛点检测阈值 3→2/2→1,更早发现用户需求 2026-04-11 14:26:51 +08:00
iven
69d3feb865 fix(lint): IdentityChangeProposal console.error → createLogger 2026-04-11 14:26:50 +08:00
5 changed files with 14 additions and 22 deletions

View File

@@ -322,10 +322,10 @@ pub fn analyze_for_pain_signals(messages: &[zclaw_types::Message]) -> Option<Pai
let combined = user_frustrations.join(" "); let combined = user_frustrations.join(" ");
let severity = if combined.contains("烦死了") let severity = if combined.contains("烦死了")
|| combined.contains("受不了") || combined.contains("受不了")
|| user_frustrations.len() >= 3 || user_frustrations.len() >= 2
{ {
PainSeverity::High PainSeverity::High
} else if user_frustrations.len() >= 2 { } else if user_frustrations.len() >= 1 {
PainSeverity::Medium PainSeverity::Medium
} else { } else {
PainSeverity::Low PainSeverity::Low

View File

@@ -893,7 +893,7 @@ mod tests {
]; ];
let patterns = engine.analyze_patterns(&memories); let patterns = engine.analyze_patterns(&memories);
// Should not trigger (only 2 tasks, threshold is 5) // Should not trigger (only 2 tasks, threshold is 3)
assert!(!patterns.iter().any(|p| p.observation.contains("待办任务"))); assert!(!patterns.iter().any(|p| p.observation.contains("待办任务")));
} }

View File

@@ -187,7 +187,10 @@ pub async fn agent_get(
if let Ok(storage) = crate::viking_commands::get_storage().await { if let Ok(storage) = crate::viking_commands::get_storage().await {
let profile_store = zclaw_memory::UserProfileStore::new(storage.pool().clone()); let profile_store = zclaw_memory::UserProfileStore::new(storage.pool().clone());
if let Ok(Some(profile)) = profile_store.get(&agent_id).await { if let Ok(Some(profile)) = profile_store.get(&agent_id).await {
agent_info.user_profile = Some(serde_json::to_value(profile).unwrap_or_default()); match serde_json::to_value(&profile) {
Ok(val) => agent_info.user_profile = Some(val),
Err(e) => tracing::warn!("[agent_get] Failed to serialize UserProfile: {}", e),
}
} }
} }
} }

View File

@@ -11,6 +11,9 @@
import { useState, useEffect, useMemo } from 'react'; import { useState, useEffect, useMemo } from 'react';
import { motion, AnimatePresence } from 'framer-motion'; import { motion, AnimatePresence } from 'framer-motion';
import { createLogger } from '../lib/logger';
const log = createLogger('IdentityChangeProposal');
import { import {
Check, Check,
X, X,
@@ -381,7 +384,7 @@ export function IdentityChangeProposalPanel() {
setProposals(pendingProposals); setProposals(pendingProposals);
setSnapshots(agentSnapshots); setSnapshots(agentSnapshots);
} catch (err) { } catch (err) {
console.error('[IdentityChangeProposal] Failed to load data:', err); log.error('[IdentityChangeProposal] Failed to load data:', err);
setError('加载失败'); setError('加载失败');
} finally { } finally {
setLoading(false); setLoading(false);
@@ -405,7 +408,7 @@ export function IdentityChangeProposalPanel() {
setProposals(pendingProposals); setProposals(pendingProposals);
setSnapshots(agentSnapshots); setSnapshots(agentSnapshots);
} catch (err) { } catch (err) {
console.error('[IdentityChangeProposal] Failed to approve:', err); log.error('[IdentityChangeProposal] Failed to approve:', err);
setError(parseProposalError(err, 'approval')); setError(parseProposalError(err, 'approval'));
} finally { } finally {
setProcessingId(null); setProcessingId(null);
@@ -422,7 +425,7 @@ export function IdentityChangeProposalPanel() {
const pendingProposals = await intelligenceClient.identity.getPendingProposals(agentId); const pendingProposals = await intelligenceClient.identity.getPendingProposals(agentId);
setProposals(pendingProposals); setProposals(pendingProposals);
} catch (err) { } catch (err) {
console.error('[IdentityChangeProposal] Failed to reject:', err); log.error('[IdentityChangeProposal] Failed to reject:', err);
setError(parseProposalError(err, 'rejection')); setError(parseProposalError(err, 'rejection'));
} finally { } finally {
setProcessingId(null); setProcessingId(null);
@@ -439,7 +442,7 @@ export function IdentityChangeProposalPanel() {
const agentSnapshots = await intelligenceClient.identity.getSnapshots(agentId, 10); const agentSnapshots = await intelligenceClient.identity.getSnapshots(agentId, 10);
setSnapshots(agentSnapshots); setSnapshots(agentSnapshots);
} catch (err) { } catch (err) {
console.error('[IdentityChangeProposal] Failed to restore:', err); log.error('[IdentityChangeProposal] Failed to restore:', err);
setError(parseProposalError(err, 'restore')); setError(parseProposalError(err, 'restore'));
} finally { } finally {
setProcessingId(null); setProcessingId(null);

View File

@@ -181,17 +181,3 @@ export function loadConnectionMode(): string | null {
} }
} }
/**
* Load the timestamp of the persisted connection mode.
* Returns null if not set or format is legacy.
*/
export function loadConnectionModeTimestamp(): number | null {
const raw = localStorage.getItem(SAASMODE_KEY);
if (!raw) return null;
try {
const parsed = JSON.parse(raw);
return parsed.timestamp ?? null;
} catch {
return null;
}
}