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
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:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user