File size: 4,321 Bytes
527d436
bbcfe72
9b0e1ea
527d436
bbcfe72
e585b0a
9b0e1ea
11b240f
9b0e1ea
 
 
 
 
 
11b240f
 
bbcfe72
527d436
9b0e1ea
 
bbcfe72
 
527d436
11b240f
 
 
 
 
527d436
11b240f
527d436
 
bbcfe72
 
 
876b3cb
bbcfe72
 
 
 
 
 
 
527d436
11b240f
 
 
 
bbcfe72
 
9b0e1ea
bbcfe72
 
 
 
11b240f
 
 
 
bbcfe72
 
11b240f
 
bbcfe72
 
 
 
11b240f
527d436
9b0e1ea
 
 
 
 
 
 
 
 
 
 
 
 
527d436
bbcfe72
 
 
 
 
 
 
 
 
 
 
 
 
527d436
bbcfe72
 
 
 
 
 
 
527d436
bbcfe72
 
 
 
 
 
 
 
 
 
 
 
 
527d436
bbcfe72
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import { create } from 'zustand'
import { persist } from 'zustand/middleware'
import { SPACE_CATALOG, type WorkerRole } from '@/lib/spaceCatalog'

export type Page =
  | 'chat'
  | 'dashboard'
  | 'spaces'
  | 'agents'
  | 'tasks'
  | 'memory'
  | 'knowledge'
  | 'workflows'
  | 'analytics'
  | 'settings'
  | 'connectors'
  | 'computer-use'

export type Space = string
export type Role = WorkerRole
export type Theme = 'dark' | 'amoled' | 'neon' | 'glass'
export type Locale = 'en' | 'my'

export interface SpaceStatus {
  name: Space
  active: boolean
  taskCount: number
  lastActive: number | null
  color: string
  icon: string
}

// ─── Computer-Use Step (Manus-style) ─────────────────────────────────────────
export interface ComputerUseStep {
  id: string
  type: 'thinking' | 'browsing' | 'coding' | 'executing' | 'terminal' | 'file' | 'git' | 'deploy' | 'complete' | 'error' | 'reading' | 'writing' | 'searching' | 'sandbox' | 'done'
  title: string
  detail?: string
  status: 'running' | 'done' | 'error'
  timestamp: number
  data?: Record<string, unknown>
}

interface AppState {
  currentPage: Page
  activeSpace: Space | null
  currentRole: Role
  sidebarOpen: boolean
  theme: Theme
  locale: Locale
  spaces: Record<string, SpaceStatus>
  computerUseSteps: ComputerUseStep[]
  isComputerUseOpen: boolean
  backendUrl: string
  // Actions
  setCurrentPage: (page: Page) => void
  setActiveSpace: (space: Space | null) => void
  setCurrentRole: (role: Role) => void
  setSidebarOpen: (open: boolean) => void
  setTheme: (theme: Theme) => void
  setLocale: (locale: Locale) => void
  activateSpace: (space: Space, role?: Role) => void
  deactivateSpace: (space: Space) => void
  addComputerUseStep: (step: Omit<ComputerUseStep, 'id' | 'timestamp'>) => void
  clearComputerUseSteps: () => void
  setComputerUseOpen: (open: boolean) => void
  setBackendUrl: (url: string) => void
}

const initialSpaces: Record<string, SpaceStatus> = Object.fromEntries(
  SPACE_CATALOG.map(space => [
    space.id,
    {
      name: space.id,
      active: false,
      taskCount: 0,
      lastActive: null,
      color: space.color,
      icon: space.icon,
    },
  ])
)

export const useAppStore = create<AppState>()(
  persist(
    (set) => ({
      currentPage: 'chat',
      activeSpace: null,
      currentRole: 'cognition' as Role,
      sidebarOpen: true,
      theme: 'dark',
      locale: 'en',
      spaces: initialSpaces,
      computerUseSteps: [],
      isComputerUseOpen: false,
      backendUrl: process.env.NEXT_PUBLIC_API_URL || 'https://pyae1994-autonomous-coding-system.hf.space',

      setCurrentPage: (page) => set({ currentPage: page }),
      setActiveSpace: (space) => set({ activeSpace: space }),
      setCurrentRole: (role) => set({ currentRole: role }),
      setSidebarOpen: (open) => set({ sidebarOpen: open }),
      setTheme: (theme) => set({ theme }),
      setLocale: (locale) => set({ locale }),
      setBackendUrl: (url) => set({ backendUrl: url }),

      activateSpace: (space, role) =>
        set(state => ({
          activeSpace: space,
          currentRole: role || state.currentRole,
          spaces: {
            ...state.spaces,
            [space]: {
              ...state.spaces[space],
              active: true,
              lastActive: Date.now(),
            },
          },
        })),

      deactivateSpace: (space) =>
        set(state => ({
          spaces: {
            ...state.spaces,
            [space]: { ...state.spaces[space], active: false },
          },
        })),

      addComputerUseStep: (step) =>
        set(state => ({
          computerUseSteps: [
            ...state.computerUseSteps.slice(-99),
            {
              ...step,
              id: Math.random().toString(36).slice(2, 10),
              timestamp: Date.now(),
            },
          ],
        })),

      clearComputerUseSteps: () => set({ computerUseSteps: [] }),
      setComputerUseOpen: (open) => set({ isComputerUseOpen: open }),
    }),
    {
      name: 'god-agent-store',
      partialize: (state) => ({
        theme: state.theme,
        locale: state.locale,
        sidebarOpen: state.sidebarOpen,
        backendUrl: state.backendUrl,
      }),
    }
  )
)