feat: 升级至 v0.3.9 — 工具批量审批 + run_command 频率限制优化 + Toast 规范
1. 工具批量审批:解决并行工具审批弹框覆盖问题,新增批量 IPC 通道和列表 UI,支持同工具多次调用分组展示;2. 审批弹框健壮性:超时 toast 防风暴、agent 状态同步清空、ErrorBoundary 防白屏;3. run_command maxFrequency 从 3 调整为 10;4. 开发规范新增 Toast 通知铁律(必须使用 MeToast)
This commit is contained in:
@@ -1175,6 +1175,54 @@ export function registerAllIPCHandlers(
|
||||
log.info(`[CONFIRM] Tool ${req.toolCallId} ${req.approved ? 'approved' : 'denied'}${remember ? ' (remembered)' : ''}${autoExecute ? ' (autoExecute)' : ''}`);
|
||||
});
|
||||
|
||||
// ===== v0.3.2: 批量工具确认响应(并行工具调用一次性审批)=====
|
||||
// 设计原因:多个工具并行触发时,逐条 IPC 响应会产生 N 次往返,
|
||||
// 且前端 state 覆盖会导致部分请求丢失。批量响应一次解决。
|
||||
ipcMain.on('tool:confirmationResponseBatch', (_event, data: unknown) => {
|
||||
if (!data || typeof data !== 'object') {
|
||||
log.warn('[IPC] tool:confirmationResponseBatch rejected: invalid data');
|
||||
return;
|
||||
}
|
||||
const req = data as {
|
||||
toolCallIds?: unknown;
|
||||
approved?: unknown;
|
||||
remember?: unknown;
|
||||
autoExecute?: unknown;
|
||||
};
|
||||
// 严格校验 toolCallIds 数组
|
||||
if (!Array.isArray(req.toolCallIds) || req.toolCallIds.length === 0) {
|
||||
log.warn('[IPC] tool:confirmationResponseBatch rejected: toolCallIds must be non-empty array');
|
||||
return;
|
||||
}
|
||||
// 每个元素必须是字符串
|
||||
for (const id of req.toolCallIds) {
|
||||
if (typeof id !== 'string' || !id) {
|
||||
log.warn('[IPC] tool:confirmationResponseBatch rejected: invalid toolCallId in array');
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (typeof req.approved !== 'boolean') {
|
||||
log.warn('[IPC] tool:confirmationResponseBatch rejected: invalid approved');
|
||||
return;
|
||||
}
|
||||
const remember = typeof req.remember === 'boolean' ? req.remember : false;
|
||||
const autoExecute = typeof req.autoExecute === 'boolean' ? req.autoExecute : false;
|
||||
const resolved = confirmationHook.resolveConfirmationsBatch(
|
||||
req.toolCallIds as string[],
|
||||
req.approved,
|
||||
remember,
|
||||
autoExecute,
|
||||
);
|
||||
log.info(`[CONFIRM] Batch ${req.approved ? 'approved' : 'denied'}: ${resolved.length}/${req.toolCallIds.length} resolved${remember ? ' (remembered)' : ''}${autoExecute ? ' (autoExecute)' : ''}`);
|
||||
});
|
||||
|
||||
// ===== v0.3.2: 拉取当前所有 pending 确认(前端弹框打开时调用)=====
|
||||
// 用途:解决并行工具触发的多个 IPC 事件在前端 state 中互相覆盖导致丢失的问题。
|
||||
// 前端在弹框打开时主动拉取,确保拿到完整的 pending 列表。
|
||||
ipcMain.handle('tool:getPendingConfirmations', async () => {
|
||||
return { success: true, data: confirmationHook.getPendingConfirmations() };
|
||||
});
|
||||
|
||||
// ===== v0.2.0: 持久化自动执行设置 =====
|
||||
ipcMain.handle('tool:setAutoExecute', async (_event, toolName: unknown, enabled: unknown) => {
|
||||
// M-44 修复: 校验 toolName 合法性和 enabled 类型,防止配置 key 污染
|
||||
|
||||
Reference in New Issue
Block a user