feat: 实现循环防护和安全验证功能
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

refactor(loop_guard): 为LoopGuard添加Clone派生
feat(capabilities): 实现CapabilityManager.validate()安全验证
fix(agentStore): 添加token用量追踪
chore: 删除未实现的Predictor/Lead HAND.toml文件
style(Credits): 移除假数据并标注开发中状态
refactor(Skills): 动态加载技能卡片
perf(configStore): 为定时任务添加localStorage降级
docs: 更新功能文档和版本变更记录
This commit is contained in:
iven
2026-03-27 07:56:53 +08:00
parent 0d4fa96b82
commit eed347e1a6
14 changed files with 724 additions and 476 deletions

View File

@@ -395,9 +395,18 @@ export const useConfigStore = create<ConfigStateSlice & ConfigActionsSlice>((set
try {
const result = await client.listScheduledTasks();
set({ scheduledTasks: result?.tasks || [] });
const tasks = result?.tasks || [];
set({ scheduledTasks: tasks });
// Persist to localStorage as fallback
try { localStorage.setItem('zclaw-scheduled-tasks', JSON.stringify(tasks)); } catch { /* ignore */ }
} catch {
// Ignore if heartbeat.tasks not available
// Fallback: load from localStorage
try {
const stored = localStorage.getItem('zclaw-scheduled-tasks');
if (stored) {
set({ scheduledTasks: JSON.parse(stored) });
}
} catch { /* ignore */ }
}
},
@@ -416,9 +425,11 @@ export const useConfigStore = create<ConfigStateSlice & ConfigActionsSlice>((set
nextRun: result.nextRun,
description: result.description,
};
set((state) => ({
scheduledTasks: [...state.scheduledTasks, newTask],
}));
set((state) => {
const tasks = [...state.scheduledTasks, newTask];
try { localStorage.setItem('zclaw-scheduled-tasks', JSON.stringify(tasks)); } catch { /* ignore */ }
return { scheduledTasks: tasks };
});
return newTask;
} catch (err: unknown) {
const errorMessage = err instanceof Error ? err.message : 'Failed to create scheduled task';
@@ -602,8 +613,23 @@ function createConfigClientFromKernel(client: KernelClient): ConfigStoreClient {
return null;
}
},
getQuickConfig: async () => ({ quickConfig: {} }),
saveQuickConfig: async () => null,
getQuickConfig: async () => {
// Read from localStorage in kernel mode
try {
const stored = localStorage.getItem('zclaw-quick-config');
if (stored) {
return { quickConfig: JSON.parse(stored) };
}
} catch { /* ignore */ }
return { quickConfig: {} };
},
saveQuickConfig: async (config) => {
// Persist to localStorage in kernel mode
try {
localStorage.setItem('zclaw-quick-config', JSON.stringify(config));
} catch { /* ignore */ }
return { quickConfig: config };
},
listSkills: async () => {
try {
const result = await client.listSkills();