feat(automation): complete unified automation system redesign

Phase 4 completion:
- Add ApprovalQueue component for managing pending approvals
- Add ExecutionResult component for displaying hand/workflow results
- Update Sidebar navigation to use unified AutomationPanel
- Replace separate 'hands' and 'workflow' tabs with single 'automation' tab
- Fix TypeScript type safety issues with unknown types in JSX expressions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
iven
2026-03-18 17:12:05 +08:00
parent 3a7631e035
commit 3518fc8ece
74 changed files with 4984 additions and 687 deletions

View File

@@ -403,12 +403,21 @@ export const useChatStore = create<ChatState>()(
set((state) => ({ messages: [...state.messages, handMsg] }));
},
onComplete: () => {
set((state) => ({
const state = get();
// Save conversation to persist across refresh
const conversations = upsertActiveConversation([...state.conversations], state);
const currentConvId = state.currentConversationId || conversations[0]?.id;
set({
isStreaming: false,
conversations,
currentConversationId: currentConvId,
messages: state.messages.map((m) =>
m.id === assistantId ? { ...m, streaming: false, runId } : m
),
}));
});
// Async memory extraction after stream completes
const msgs = get().messages
.filter(m => m.role === 'user' || m.role === 'assistant')

View File

@@ -1294,11 +1294,15 @@ export const useGatewayStore = create<GatewayStore>((set, get) => {
},
triggerHand: async (name: string, params?: Record<string, unknown>) => {
console.log(`[GatewayStore] Triggering hand: ${name}`, params);
try {
const result = await get().client.triggerHand(name, params);
console.log(`[GatewayStore] Hand trigger result:`, result);
return result ? { runId: result.runId, status: result.status, startedAt: new Date().toISOString() } : undefined;
} catch (err: unknown) {
set({ error: err instanceof Error ? err.message : String(err) });
const errorMsg = err instanceof Error ? err.message : String(err);
console.error(`[GatewayStore] Hand trigger error:`, errorMsg, err);
set({ error: errorMsg });
return undefined;
}
},