refactor(store): split gatewayStore into specialized domain stores

Major restructuring:
- Split monolithic gatewayStore into 5 focused stores:
  - connectionStore: WebSocket connection and gateway lifecycle
  - configStore: quickConfig, workspaceInfo, MCP services
  - agentStore: clones, usage stats, agent management
  - handStore: hands, approvals, triggers, hand runs
  - workflowStore: workflows, workflow runs, execution

- Update all components to use new stores with selector pattern
- Remove
This commit is contained in:
iven
2026-03-20 22:14:13 +08:00
parent 6f72442531
commit 1cf3f585d3
43 changed files with 2826 additions and 3103 deletions

View File

@@ -6,7 +6,7 @@
*/
import { useState, useEffect, useCallback } from 'react';
import { useGatewayStore, type Hand, type HandRun } from '../store/gatewayStore';
import { useHandStore, type Hand, type HandRun } from '../store/handStore';
import {
Zap,
Loader2,
@@ -39,7 +39,12 @@ const RUN_STATUS_CONFIG: Record<string, { label: string; className: string; icon
};
export function HandTaskPanel({ handId, onBack }: HandTaskPanelProps) {
const { hands, handRuns, loadHands, loadHandRuns, triggerHand, isLoading } = useGatewayStore();
const hands = useHandStore((s) => s.hands);
const handRuns = useHandStore((s) => s.handRuns);
const loadHands = useHandStore((s) => s.loadHands);
const loadHandRuns = useHandStore((s) => s.loadHandRuns);
const triggerHand = useHandStore((s) => s.triggerHand);
const isLoading = useHandStore((s) => s.isLoading);
const { toast } = useToast();
const [selectedHand, setSelectedHand] = useState<Hand | null>(null);
const [isActivating, setIsActivating] = useState(false);
@@ -103,7 +108,7 @@ export function HandTaskPanel({ handId, onBack }: HandTaskPanelProps) {
]);
} else {
// Check for specific error in store
const storeError = useGatewayStore.getState().error;
const storeError = useHandStore.getState().error;
if (storeError?.includes('already active')) {
toast(`Hand "${selectedHand.name}" 已在运行中`, 'warning');
} else {