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 severity = if combined.contains("烦死了")
|| combined.contains("受不了")
|| user_frustrations.len() >= 3
|| user_frustrations.len() >= 2
{
PainSeverity::High
} else if user_frustrations.len() >= 2 {
} else if user_frustrations.len() >= 1 {
PainSeverity::Medium
} else {
PainSeverity::Low

View File

@@ -893,7 +893,7 @@ mod tests {
];
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("待办任务")));
}

View File

@@ -187,7 +187,10 @@ pub async fn agent_get(
if let Ok(storage) = crate::viking_commands::get_storage().await {
let profile_store = zclaw_memory::UserProfileStore::new(storage.pool().clone());
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 { motion, AnimatePresence } from 'framer-motion';
import { createLogger } from '../lib/logger';
const log = createLogger('IdentityChangeProposal');
import {
Check,
X,
@@ -381,7 +384,7 @@ export function IdentityChangeProposalPanel() {
setProposals(pendingProposals);
setSnapshots(agentSnapshots);
} catch (err) {
console.error('[IdentityChangeProposal] Failed to load data:', err);
log.error('[IdentityChangeProposal] Failed to load data:', err);
setError('加载失败');
} finally {
setLoading(false);
@@ -405,7 +408,7 @@ export function IdentityChangeProposalPanel() {
setProposals(pendingProposals);
setSnapshots(agentSnapshots);
} catch (err) {
console.error('[IdentityChangeProposal] Failed to approve:', err);
log.error('[IdentityChangeProposal] Failed to approve:', err);
setError(parseProposalError(err, 'approval'));
} finally {
setProcessingId(null);
@@ -422,7 +425,7 @@ export function IdentityChangeProposalPanel() {
const pendingProposals = await intelligenceClient.identity.getPendingProposals(agentId);
setProposals(pendingProposals);
} catch (err) {
console.error('[IdentityChangeProposal] Failed to reject:', err);
log.error('[IdentityChangeProposal] Failed to reject:', err);
setError(parseProposalError(err, 'rejection'));
} finally {
setProcessingId(null);
@@ -439,7 +442,7 @@ export function IdentityChangeProposalPanel() {
const agentSnapshots = await intelligenceClient.identity.getSnapshots(agentId, 10);
setSnapshots(agentSnapshots);
} catch (err) {
console.error('[IdentityChangeProposal] Failed to restore:', err);
log.error('[IdentityChangeProposal] Failed to restore:', err);
setError(parseProposalError(err, 'restore'));
} finally {
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;
}
}