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,
}),
}
)
)
|