@swarmclawai/swarmclaw 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/README.md +577 -0
  2. package/bin/server-cmd.js +359 -0
  3. package/bin/swarmclaw.js +29 -0
  4. package/bin/swarmclaw.mjs +1504 -0
  5. package/next.config.ts +33 -0
  6. package/package.json +112 -0
  7. package/postcss.config.mjs +7 -0
  8. package/public/branding/swarmclaw-org-avatar.png +0 -0
  9. package/public/branding/swarmclaw-org-avatar.svg +58 -0
  10. package/public/file.svg +1 -0
  11. package/public/globe.svg +1 -0
  12. package/public/next.svg +1 -0
  13. package/public/screenshots/agents.png +0 -0
  14. package/public/screenshots/connectors.png +0 -0
  15. package/public/screenshots/dashboard.png +0 -0
  16. package/public/screenshots/new-session-openclaw.png +0 -0
  17. package/public/screenshots/providers.png +0 -0
  18. package/public/screenshots/schedules.png +0 -0
  19. package/public/screenshots/tasks.png +0 -0
  20. package/public/vercel.svg +1 -0
  21. package/public/window.svg +1 -0
  22. package/src/app/api/agents/[id]/route.ts +30 -0
  23. package/src/app/api/agents/[id]/thread/route.ts +66 -0
  24. package/src/app/api/agents/generate/route.ts +42 -0
  25. package/src/app/api/agents/route.ts +33 -0
  26. package/src/app/api/auth/route.ts +25 -0
  27. package/src/app/api/claude-skills/route.ts +42 -0
  28. package/src/app/api/clawhub/install/route.ts +39 -0
  29. package/src/app/api/clawhub/search/route.ts +11 -0
  30. package/src/app/api/connectors/[id]/route.ts +79 -0
  31. package/src/app/api/connectors/route.ts +60 -0
  32. package/src/app/api/credentials/[id]/route.ts +14 -0
  33. package/src/app/api/credentials/route.ts +31 -0
  34. package/src/app/api/daemon/health-check/route.ts +11 -0
  35. package/src/app/api/daemon/route.ts +22 -0
  36. package/src/app/api/dirs/pick/route.ts +60 -0
  37. package/src/app/api/dirs/route.ts +29 -0
  38. package/src/app/api/documents/[id]/route.ts +47 -0
  39. package/src/app/api/documents/route.ts +93 -0
  40. package/src/app/api/files/serve/route.ts +69 -0
  41. package/src/app/api/generate/info/route.ts +12 -0
  42. package/src/app/api/generate/route.ts +106 -0
  43. package/src/app/api/ip/route.ts +6 -0
  44. package/src/app/api/knowledge/[id]/route.ts +61 -0
  45. package/src/app/api/knowledge/route.ts +48 -0
  46. package/src/app/api/knowledge/upload/route.ts +86 -0
  47. package/src/app/api/logs/route.ts +65 -0
  48. package/src/app/api/mcp-servers/[id]/route.ts +32 -0
  49. package/src/app/api/mcp-servers/[id]/test/route.ts +23 -0
  50. package/src/app/api/mcp-servers/[id]/tools/route.ts +32 -0
  51. package/src/app/api/mcp-servers/route.ts +27 -0
  52. package/src/app/api/memory/[id]/route.ts +126 -0
  53. package/src/app/api/memory/maintenance/route.ts +63 -0
  54. package/src/app/api/memory/route.ts +111 -0
  55. package/src/app/api/memory-images/[filename]/route.ts +36 -0
  56. package/src/app/api/orchestrator/run/route.ts +43 -0
  57. package/src/app/api/plugins/install/route.ts +58 -0
  58. package/src/app/api/plugins/marketplace/route.ts +33 -0
  59. package/src/app/api/plugins/route.ts +21 -0
  60. package/src/app/api/preview-server/route.ts +339 -0
  61. package/src/app/api/providers/[id]/models/route.ts +29 -0
  62. package/src/app/api/providers/[id]/route.ts +34 -0
  63. package/src/app/api/providers/configs/route.ts +7 -0
  64. package/src/app/api/providers/ollama/route.ts +30 -0
  65. package/src/app/api/providers/openclaw/health/route.ts +23 -0
  66. package/src/app/api/providers/route.ts +28 -0
  67. package/src/app/api/runs/[id]/route.ts +9 -0
  68. package/src/app/api/runs/route.ts +13 -0
  69. package/src/app/api/schedules/[id]/route.ts +28 -0
  70. package/src/app/api/schedules/[id]/run/route.ts +104 -0
  71. package/src/app/api/schedules/route.ts +78 -0
  72. package/src/app/api/secrets/[id]/route.ts +29 -0
  73. package/src/app/api/secrets/route.ts +42 -0
  74. package/src/app/api/sessions/[id]/browser/route.ts +13 -0
  75. package/src/app/api/sessions/[id]/chat/route.ts +96 -0
  76. package/src/app/api/sessions/[id]/clear/route.ts +19 -0
  77. package/src/app/api/sessions/[id]/deploy/route.ts +34 -0
  78. package/src/app/api/sessions/[id]/devserver/route.ts +69 -0
  79. package/src/app/api/sessions/[id]/mailbox/route.ts +70 -0
  80. package/src/app/api/sessions/[id]/main-loop/route.ts +94 -0
  81. package/src/app/api/sessions/[id]/messages/route.ts +9 -0
  82. package/src/app/api/sessions/[id]/retry/route.ts +28 -0
  83. package/src/app/api/sessions/[id]/route.ts +103 -0
  84. package/src/app/api/sessions/[id]/stop/route.ts +13 -0
  85. package/src/app/api/sessions/heartbeat/route.ts +26 -0
  86. package/src/app/api/sessions/route.ts +85 -0
  87. package/src/app/api/settings/route.ts +58 -0
  88. package/src/app/api/setup/check-provider/route.ts +326 -0
  89. package/src/app/api/setup/doctor/route.ts +250 -0
  90. package/src/app/api/skills/[id]/route.ts +40 -0
  91. package/src/app/api/skills/import/route.ts +69 -0
  92. package/src/app/api/skills/route.ts +28 -0
  93. package/src/app/api/tasks/[id]/route.ts +102 -0
  94. package/src/app/api/tasks/route.ts +115 -0
  95. package/src/app/api/tts/route.ts +40 -0
  96. package/src/app/api/upload/route.ts +18 -0
  97. package/src/app/api/uploads/[filename]/route.ts +59 -0
  98. package/src/app/api/usage/route.ts +35 -0
  99. package/src/app/api/version/route.ts +81 -0
  100. package/src/app/api/version/update/route.ts +95 -0
  101. package/src/app/api/webhooks/[id]/history/route.ts +13 -0
  102. package/src/app/api/webhooks/[id]/route.ts +204 -0
  103. package/src/app/api/webhooks/route.ts +37 -0
  104. package/src/app/favicon.ico +0 -0
  105. package/src/app/globals.css +370 -0
  106. package/src/app/layout.tsx +52 -0
  107. package/src/app/page.tsx +172 -0
  108. package/src/cli/index.js +1232 -0
  109. package/src/cli/index.test.js +281 -0
  110. package/src/cli/index.ts +1158 -0
  111. package/src/cli/spec.js +284 -0
  112. package/src/components/agents/agent-card.tsx +219 -0
  113. package/src/components/agents/agent-chat-list.tsx +165 -0
  114. package/src/components/agents/agent-list.tsx +110 -0
  115. package/src/components/agents/agent-sheet.tsx +1220 -0
  116. package/src/components/auth/access-key-gate.tsx +248 -0
  117. package/src/components/auth/setup-wizard.tsx +940 -0
  118. package/src/components/auth/user-picker.tsx +88 -0
  119. package/src/components/chat/chat-area.tsx +406 -0
  120. package/src/components/chat/chat-header.tsx +491 -0
  121. package/src/components/chat/chat-tool-toggles.tsx +161 -0
  122. package/src/components/chat/code-block.tsx +146 -0
  123. package/src/components/chat/dev-server-bar.tsx +39 -0
  124. package/src/components/chat/message-bubble.tsx +486 -0
  125. package/src/components/chat/message-list.tsx +299 -0
  126. package/src/components/chat/session-debug-panel.tsx +196 -0
  127. package/src/components/chat/streaming-bubble.tsx +85 -0
  128. package/src/components/chat/thinking-indicator.tsx +26 -0
  129. package/src/components/chat/tool-call-bubble.tsx +438 -0
  130. package/src/components/chat/tool-request-banner.tsx +103 -0
  131. package/src/components/connectors/connector-list.tsx +196 -0
  132. package/src/components/connectors/connector-sheet.tsx +804 -0
  133. package/src/components/input/chat-input.tsx +235 -0
  134. package/src/components/knowledge/knowledge-list.tsx +206 -0
  135. package/src/components/knowledge/knowledge-sheet.tsx +316 -0
  136. package/src/components/layout/app-layout.tsx +1016 -0
  137. package/src/components/layout/daemon-indicator.tsx +56 -0
  138. package/src/components/layout/mobile-header.tsx +31 -0
  139. package/src/components/layout/network-banner.tsx +17 -0
  140. package/src/components/layout/update-banner.tsx +130 -0
  141. package/src/components/logs/log-list.tsx +358 -0
  142. package/src/components/mcp-servers/mcp-server-list.tsx +122 -0
  143. package/src/components/mcp-servers/mcp-server-sheet.tsx +243 -0
  144. package/src/components/memory/memory-card.tsx +63 -0
  145. package/src/components/memory/memory-detail.tsx +339 -0
  146. package/src/components/memory/memory-list.tsx +198 -0
  147. package/src/components/memory/memory-sheet.tsx +70 -0
  148. package/src/components/plugins/plugin-list.tsx +60 -0
  149. package/src/components/plugins/plugin-sheet.tsx +311 -0
  150. package/src/components/providers/provider-list.tsx +96 -0
  151. package/src/components/providers/provider-sheet.tsx +542 -0
  152. package/src/components/runs/run-list.tsx +231 -0
  153. package/src/components/schedules/schedule-card.tsx +63 -0
  154. package/src/components/schedules/schedule-list.tsx +76 -0
  155. package/src/components/schedules/schedule-sheet.tsx +336 -0
  156. package/src/components/secrets/secret-sheet.tsx +180 -0
  157. package/src/components/secrets/secrets-list.tsx +91 -0
  158. package/src/components/sessions/new-session-sheet.tsx +478 -0
  159. package/src/components/sessions/session-card.tsx +144 -0
  160. package/src/components/sessions/session-list.tsx +202 -0
  161. package/src/components/shared/ai-gen-block.tsx +77 -0
  162. package/src/components/shared/avatar.tsx +48 -0
  163. package/src/components/shared/bottom-sheet.tsx +30 -0
  164. package/src/components/shared/confirm-dialog.tsx +47 -0
  165. package/src/components/shared/connector-platform-icon.tsx +113 -0
  166. package/src/components/shared/dir-browser.tsx +285 -0
  167. package/src/components/shared/dropdown.tsx +55 -0
  168. package/src/components/shared/icon-button.tsx +25 -0
  169. package/src/components/shared/settings/plugin-manager.tsx +207 -0
  170. package/src/components/shared/settings/section-capability-policy.tsx +93 -0
  171. package/src/components/shared/settings/section-embedding.tsx +99 -0
  172. package/src/components/shared/settings/section-heartbeat.tsx +168 -0
  173. package/src/components/shared/settings/section-memory.tsx +77 -0
  174. package/src/components/shared/settings/section-orchestrator.tsx +108 -0
  175. package/src/components/shared/settings/section-providers.tsx +181 -0
  176. package/src/components/shared/settings/section-runtime-loop.tsx +183 -0
  177. package/src/components/shared/settings/section-secrets.tsx +132 -0
  178. package/src/components/shared/settings/section-user-preferences.tsx +24 -0
  179. package/src/components/shared/settings/section-voice.tsx +53 -0
  180. package/src/components/shared/settings/settings-sheet.tsx +88 -0
  181. package/src/components/shared/settings/types.ts +7 -0
  182. package/src/components/shared/settings/utils.ts +13 -0
  183. package/src/components/shared/settings-sheet.tsx +1 -0
  184. package/src/components/shared/skeleton.tsx +19 -0
  185. package/src/components/shared/usage-badge.tsx +28 -0
  186. package/src/components/skills/clawhub-browser.tsx +225 -0
  187. package/src/components/skills/skill-list.tsx +70 -0
  188. package/src/components/skills/skill-sheet.tsx +254 -0
  189. package/src/components/tasks/task-board.tsx +96 -0
  190. package/src/components/tasks/task-card.tsx +179 -0
  191. package/src/components/tasks/task-column.tsx +73 -0
  192. package/src/components/tasks/task-list.tsx +118 -0
  193. package/src/components/tasks/task-sheet.tsx +415 -0
  194. package/src/components/ui/avatar.tsx +109 -0
  195. package/src/components/ui/badge.tsx +48 -0
  196. package/src/components/ui/button.tsx +64 -0
  197. package/src/components/ui/card.tsx +92 -0
  198. package/src/components/ui/dialog.tsx +158 -0
  199. package/src/components/ui/dropdown-menu.tsx +257 -0
  200. package/src/components/ui/input.tsx +21 -0
  201. package/src/components/ui/scroll-area.tsx +58 -0
  202. package/src/components/ui/select.tsx +190 -0
  203. package/src/components/ui/separator.tsx +28 -0
  204. package/src/components/ui/sheet.tsx +143 -0
  205. package/src/components/ui/sonner.tsx +22 -0
  206. package/src/components/ui/textarea.tsx +18 -0
  207. package/src/components/ui/tooltip.tsx +56 -0
  208. package/src/components/usage/usage-list.tsx +105 -0
  209. package/src/components/webhooks/webhook-list.tsx +166 -0
  210. package/src/components/webhooks/webhook-sheet.tsx +402 -0
  211. package/src/hooks/use-auto-resize.ts +20 -0
  212. package/src/hooks/use-media-query.ts +21 -0
  213. package/src/hooks/use-speech-recognition.ts +83 -0
  214. package/src/instrumentation.ts +8 -0
  215. package/src/lib/agents.ts +13 -0
  216. package/src/lib/api-client.ts +100 -0
  217. package/src/lib/chat.ts +60 -0
  218. package/src/lib/memory.ts +42 -0
  219. package/src/lib/openclaw-endpoint.test.ts +48 -0
  220. package/src/lib/openclaw-endpoint.ts +67 -0
  221. package/src/lib/provider-config.ts +13 -0
  222. package/src/lib/providers/anthropic.ts +135 -0
  223. package/src/lib/providers/claude-cli.ts +202 -0
  224. package/src/lib/providers/codex-cli.ts +260 -0
  225. package/src/lib/providers/index.ts +351 -0
  226. package/src/lib/providers/ollama.ts +131 -0
  227. package/src/lib/providers/openai.ts +164 -0
  228. package/src/lib/providers/openclaw.ts +330 -0
  229. package/src/lib/providers/opencode-cli.ts +164 -0
  230. package/src/lib/runtime-loop.ts +15 -0
  231. package/src/lib/schedule-dedupe.test.ts +84 -0
  232. package/src/lib/schedule-dedupe.ts +174 -0
  233. package/src/lib/schedule-name.ts +62 -0
  234. package/src/lib/schedules.ts +16 -0
  235. package/src/lib/server/agent-registry.ts +70 -0
  236. package/src/lib/server/api-routes.test.ts +362 -0
  237. package/src/lib/server/autonomy-contract.ts +200 -0
  238. package/src/lib/server/build-llm.ts +155 -0
  239. package/src/lib/server/capability-router.test.ts +21 -0
  240. package/src/lib/server/capability-router.ts +172 -0
  241. package/src/lib/server/chat-execution.ts +894 -0
  242. package/src/lib/server/clawhub-client.test.ts +161 -0
  243. package/src/lib/server/clawhub-client.ts +26 -0
  244. package/src/lib/server/connectors/connector-routing.test.ts +243 -0
  245. package/src/lib/server/connectors/discord.ts +116 -0
  246. package/src/lib/server/connectors/googlechat.ts +66 -0
  247. package/src/lib/server/connectors/manager.ts +559 -0
  248. package/src/lib/server/connectors/matrix.ts +78 -0
  249. package/src/lib/server/connectors/media.ts +149 -0
  250. package/src/lib/server/connectors/openclaw.test.ts +375 -0
  251. package/src/lib/server/connectors/openclaw.ts +1132 -0
  252. package/src/lib/server/connectors/signal.ts +183 -0
  253. package/src/lib/server/connectors/slack.ts +258 -0
  254. package/src/lib/server/connectors/teams.ts +94 -0
  255. package/src/lib/server/connectors/telegram.ts +221 -0
  256. package/src/lib/server/connectors/types.ts +62 -0
  257. package/src/lib/server/connectors/whatsapp.ts +349 -0
  258. package/src/lib/server/context-manager.ts +232 -0
  259. package/src/lib/server/cost.ts +31 -0
  260. package/src/lib/server/daemon-state.ts +354 -0
  261. package/src/lib/server/data-dir.ts +3 -0
  262. package/src/lib/server/embeddings.ts +111 -0
  263. package/src/lib/server/execution-log.ts +257 -0
  264. package/src/lib/server/gateway/protocol.test.ts +54 -0
  265. package/src/lib/server/gateway/protocol.ts +114 -0
  266. package/src/lib/server/heartbeat-service.ts +366 -0
  267. package/src/lib/server/knowledge-db.test.ts +441 -0
  268. package/src/lib/server/logger.ts +47 -0
  269. package/src/lib/server/main-agent-loop.ts +1017 -0
  270. package/src/lib/server/mcp-client.test.ts +342 -0
  271. package/src/lib/server/mcp-client.ts +130 -0
  272. package/src/lib/server/memory-db.ts +1078 -0
  273. package/src/lib/server/memory-graph.test.ts +153 -0
  274. package/src/lib/server/memory-graph.ts +138 -0
  275. package/src/lib/server/openclaw-health.ts +245 -0
  276. package/src/lib/server/orchestrator-lg.ts +431 -0
  277. package/src/lib/server/orchestrator.ts +364 -0
  278. package/src/lib/server/playwright-proxy.mjs +70 -0
  279. package/src/lib/server/plugins.ts +229 -0
  280. package/src/lib/server/process-manager.ts +327 -0
  281. package/src/lib/server/provider-health.ts +113 -0
  282. package/src/lib/server/queue.ts +859 -0
  283. package/src/lib/server/runtime-settings.ts +119 -0
  284. package/src/lib/server/scheduler.ts +196 -0
  285. package/src/lib/server/session-mailbox.ts +129 -0
  286. package/src/lib/server/session-run-manager.ts +512 -0
  287. package/src/lib/server/session-tools/connector.ts +124 -0
  288. package/src/lib/server/session-tools/context-mgmt.ts +103 -0
  289. package/src/lib/server/session-tools/context.ts +114 -0
  290. package/src/lib/server/session-tools/crud.ts +673 -0
  291. package/src/lib/server/session-tools/delegate.ts +708 -0
  292. package/src/lib/server/session-tools/file.ts +264 -0
  293. package/src/lib/server/session-tools/index.ts +164 -0
  294. package/src/lib/server/session-tools/memory.ts +230 -0
  295. package/src/lib/server/session-tools/session-info.ts +422 -0
  296. package/src/lib/server/session-tools/session-tools-wiring.test.ts +166 -0
  297. package/src/lib/server/session-tools/shell.ts +171 -0
  298. package/src/lib/server/session-tools/web.ts +408 -0
  299. package/src/lib/server/session-tools.ts +9 -0
  300. package/src/lib/server/skills-normalize.ts +130 -0
  301. package/src/lib/server/storage-mcp.test.ts +161 -0
  302. package/src/lib/server/storage.ts +670 -0
  303. package/src/lib/server/stream-agent-chat.ts +571 -0
  304. package/src/lib/server/task-reports.ts +122 -0
  305. package/src/lib/server/task-result.ts +161 -0
  306. package/src/lib/server/task-validation.test.ts +27 -0
  307. package/src/lib/server/task-validation.ts +90 -0
  308. package/src/lib/server/tool-capability-policy.test.ts +58 -0
  309. package/src/lib/server/tool-capability-policy.ts +262 -0
  310. package/src/lib/sessions.ts +68 -0
  311. package/src/lib/tasks.ts +20 -0
  312. package/src/lib/tts.ts +42 -0
  313. package/src/lib/upload.ts +10 -0
  314. package/src/lib/utils.ts +6 -0
  315. package/src/proxy.ts +43 -0
  316. package/src/stores/use-app-store.ts +468 -0
  317. package/src/stores/use-chat-store.ts +323 -0
  318. package/src/types/index.ts +621 -0
  319. package/tsconfig.json +34 -0
@@ -0,0 +1,468 @@
1
+ 'use client'
2
+
3
+ import { create } from 'zustand'
4
+ import type { Sessions, Session, NetworkInfo, Directory, ProviderInfo, Credentials, Agent, Schedule, AppView, BoardTask, AppSettings, OrchestratorSecret, ProviderConfig, Skill, Connector, Webhook, McpServerConfig, PluginMeta } from '../types'
5
+ import { fetchSessions, fetchDirs, fetchProviders, fetchCredentials } from '../lib/sessions'
6
+ import { fetchAgents } from '../lib/agents'
7
+ import { fetchSchedules } from '../lib/schedules'
8
+ import { fetchTasks } from '../lib/tasks'
9
+ import { api } from '../lib/api-client'
10
+
11
+ interface AppState {
12
+ currentUser: string | null
13
+ _hydrated: boolean
14
+ hydrate: () => void
15
+ setUser: (user: string | null) => void
16
+
17
+ sessions: Sessions
18
+ currentSessionId: string | null
19
+ loadSessions: () => Promise<void>
20
+ setCurrentSession: (id: string | null) => void
21
+ removeSession: (id: string) => void
22
+ clearSessions: (ids: string[]) => Promise<void>
23
+ togglePinSession: (id: string) => void
24
+ updateSessionInStore: (session: Session) => void
25
+
26
+ sidebarOpen: boolean
27
+ setSidebarOpen: (open: boolean) => void
28
+ toggleSidebar: () => void
29
+
30
+ networkInfo: NetworkInfo | null
31
+ loadNetworkInfo: () => Promise<void>
32
+
33
+ dirs: Directory[]
34
+ loadDirs: () => Promise<void>
35
+
36
+ providers: ProviderInfo[]
37
+ credentials: Credentials
38
+ loadProviders: () => Promise<void>
39
+ loadCredentials: () => Promise<void>
40
+
41
+ settingsOpen: boolean
42
+ setSettingsOpen: (open: boolean) => void
43
+
44
+ newSessionOpen: boolean
45
+ setNewSessionOpen: (open: boolean) => void
46
+
47
+ activeView: AppView
48
+ setActiveView: (view: AppView) => void
49
+
50
+ currentAgentId: string | null
51
+ setCurrentAgent: (id: string | null) => Promise<void>
52
+
53
+ agents: Record<string, Agent>
54
+ loadAgents: () => Promise<void>
55
+
56
+ schedules: Record<string, Schedule>
57
+ loadSchedules: () => Promise<void>
58
+
59
+ agentSheetOpen: boolean
60
+ setAgentSheetOpen: (open: boolean) => void
61
+ editingAgentId: string | null
62
+ setEditingAgentId: (id: string | null) => void
63
+
64
+ scheduleSheetOpen: boolean
65
+ setScheduleSheetOpen: (open: boolean) => void
66
+ editingScheduleId: string | null
67
+ setEditingScheduleId: (id: string | null) => void
68
+
69
+ memorySheetOpen: boolean
70
+ setMemorySheetOpen: (open: boolean) => void
71
+ selectedMemoryId: string | null
72
+ setSelectedMemoryId: (id: string | null) => void
73
+ memoryRefreshKey: number
74
+ triggerMemoryRefresh: () => void
75
+ memoryAgentFilter: string | null
76
+ setMemoryAgentFilter: (agentId: string | null) => void
77
+
78
+ appSettings: AppSettings
79
+ loadSettings: () => Promise<void>
80
+ updateSettings: (patch: Partial<AppSettings>) => Promise<void>
81
+
82
+ secrets: Record<string, OrchestratorSecret>
83
+ loadSecrets: () => Promise<void>
84
+ secretSheetOpen: boolean
85
+ setSecretSheetOpen: (open: boolean) => void
86
+ editingSecretId: string | null
87
+ setEditingSecretId: (id: string | null) => void
88
+
89
+ tasks: Record<string, BoardTask>
90
+ loadTasks: (includeArchived?: boolean) => Promise<void>
91
+ showArchivedTasks: boolean
92
+ setShowArchivedTasks: (show: boolean) => void
93
+ taskSheetOpen: boolean
94
+ setTaskSheetOpen: (open: boolean) => void
95
+ editingTaskId: string | null
96
+ setEditingTaskId: (id: string | null) => void
97
+
98
+ // Provider configs (custom providers)
99
+ providerConfigs: ProviderConfig[]
100
+ loadProviderConfigs: () => Promise<void>
101
+ providerSheetOpen: boolean
102
+ setProviderSheetOpen: (open: boolean) => void
103
+ editingProviderId: string | null
104
+ setEditingProviderId: (id: string | null) => void
105
+
106
+ // Skills
107
+ skills: Record<string, Skill>
108
+ loadSkills: () => Promise<void>
109
+ skillSheetOpen: boolean
110
+ setSkillSheetOpen: (open: boolean) => void
111
+ editingSkillId: string | null
112
+ setEditingSkillId: (id: string | null) => void
113
+
114
+ // Connectors
115
+ connectors: Record<string, Connector>
116
+ loadConnectors: () => Promise<void>
117
+ connectorSheetOpen: boolean
118
+ setConnectorSheetOpen: (open: boolean) => void
119
+ editingConnectorId: string | null
120
+ setEditingConnectorId: (id: string | null) => void
121
+
122
+ // Webhooks
123
+ webhooks: Record<string, Webhook>
124
+ loadWebhooks: () => Promise<void>
125
+ webhookSheetOpen: boolean
126
+ setWebhookSheetOpen: (open: boolean) => void
127
+ editingWebhookId: string | null
128
+ setEditingWebhookId: (id: string | null) => void
129
+
130
+ // MCP Servers
131
+ mcpServers: Record<string, McpServerConfig>
132
+ loadMcpServers: () => Promise<void>
133
+ mcpServerSheetOpen: boolean
134
+ setMcpServerSheetOpen: (open: boolean) => void
135
+ editingMcpServerId: string | null
136
+ setEditingMcpServerId: (id: string | null) => void
137
+
138
+ // Knowledge Base
139
+ knowledgeSheetOpen: boolean
140
+ setKnowledgeSheetOpen: (open: boolean) => void
141
+ editingKnowledgeId: string | null
142
+ setEditingKnowledgeId: (id: string | null) => void
143
+ knowledgeRefreshKey: number
144
+ triggerKnowledgeRefresh: () => void
145
+
146
+ // Plugins
147
+ plugins: Record<string, PluginMeta>
148
+ loadPlugins: () => Promise<void>
149
+ pluginSheetOpen: boolean
150
+ setPluginSheetOpen: (open: boolean) => void
151
+ editingPluginFilename: string | null
152
+ setEditingPluginFilename: (filename: string | null) => void
153
+
154
+ }
155
+
156
+ export const useAppStore = create<AppState>((set, get) => ({
157
+ currentUser: null,
158
+ _hydrated: false,
159
+ hydrate: () => {
160
+ if (typeof window === 'undefined') return
161
+ const user = localStorage.getItem('sc_user')
162
+ set({ currentUser: user, _hydrated: true })
163
+ },
164
+ setUser: (user) => {
165
+ if (user) localStorage.setItem('sc_user', user)
166
+ else localStorage.removeItem('sc_user')
167
+ set({ currentUser: user })
168
+ },
169
+
170
+ sessions: {},
171
+ currentSessionId: null,
172
+ loadSessions: async () => {
173
+ try {
174
+ const sessions = await fetchSessions()
175
+ set({ sessions })
176
+ } catch {
177
+ // ignore
178
+ }
179
+ },
180
+ setCurrentSession: (id) => set({ currentSessionId: id }),
181
+ removeSession: (id) => {
182
+ const sessions = { ...get().sessions }
183
+ delete sessions[id]
184
+ set({ sessions, currentSessionId: get().currentSessionId === id ? null : get().currentSessionId })
185
+ },
186
+ clearSessions: async (ids) => {
187
+ if (!ids.length) return
188
+ await api('DELETE', '/sessions', { ids })
189
+ const sessions = { ...get().sessions }
190
+ for (const id of ids) delete sessions[id]
191
+ set({ sessions, currentSessionId: ids.includes(get().currentSessionId!) ? null : get().currentSessionId })
192
+ },
193
+ togglePinSession: (id) => {
194
+ const sessions = { ...get().sessions }
195
+ if (sessions[id]) {
196
+ sessions[id] = { ...sessions[id], pinned: !sessions[id].pinned }
197
+ set({ sessions })
198
+ // Persist to server
199
+ void api('PUT', `/sessions/${id}`, { pinned: sessions[id].pinned })
200
+ }
201
+ },
202
+ updateSessionInStore: (session) => {
203
+ set({ sessions: { ...get().sessions, [session.id]: session } })
204
+ },
205
+
206
+ sidebarOpen: false,
207
+ setSidebarOpen: (open) => set({ sidebarOpen: open }),
208
+ toggleSidebar: () => set((s) => ({ sidebarOpen: !s.sidebarOpen })),
209
+
210
+ networkInfo: null,
211
+ loadNetworkInfo: async () => {
212
+ try {
213
+ const info = await api<NetworkInfo>('GET', '/ip')
214
+ set({ networkInfo: info })
215
+ } catch {
216
+ // ignore
217
+ }
218
+ },
219
+
220
+ dirs: [],
221
+ loadDirs: async () => {
222
+ try {
223
+ const dirs = await fetchDirs()
224
+ set({ dirs })
225
+ } catch {
226
+ set({ dirs: [] })
227
+ }
228
+ },
229
+
230
+ providers: [],
231
+ credentials: {},
232
+ loadProviders: async () => {
233
+ try {
234
+ const providers = await fetchProviders()
235
+ set({ providers })
236
+ } catch {
237
+ // ignore
238
+ }
239
+ },
240
+ loadCredentials: async () => {
241
+ try {
242
+ const credentials = await fetchCredentials()
243
+ set({ credentials })
244
+ } catch {
245
+ // ignore
246
+ }
247
+ },
248
+
249
+ settingsOpen: false,
250
+ setSettingsOpen: (open) => set({ settingsOpen: open }),
251
+
252
+ newSessionOpen: false,
253
+ setNewSessionOpen: (open) => set({ newSessionOpen: open }),
254
+
255
+ activeView: 'agents',
256
+ setActiveView: (view) => set({ activeView: view }),
257
+
258
+ currentAgentId: null,
259
+ setCurrentAgent: async (id) => {
260
+ if (!id) {
261
+ set({ currentAgentId: null })
262
+ return
263
+ }
264
+ set({ currentAgentId: id })
265
+ try {
266
+ const user = get().currentUser || 'default'
267
+ const session = await api<Session>('POST', `/agents/${id}/thread`, { user })
268
+ if (session?.id) {
269
+ const sessions = { ...get().sessions, [session.id]: session }
270
+ set({ sessions, currentSessionId: session.id })
271
+ }
272
+ } catch {
273
+ // ignore — thread creation failed
274
+ }
275
+ },
276
+
277
+ agents: {},
278
+ loadAgents: async () => {
279
+ try {
280
+ const agents = await fetchAgents()
281
+ set({ agents })
282
+ } catch {
283
+ // ignore
284
+ }
285
+ },
286
+
287
+ schedules: {},
288
+ loadSchedules: async () => {
289
+ try {
290
+ const schedules = await fetchSchedules()
291
+ set({ schedules })
292
+ } catch {
293
+ // ignore
294
+ }
295
+ },
296
+
297
+ agentSheetOpen: false,
298
+ setAgentSheetOpen: (open) => set({ agentSheetOpen: open }),
299
+ editingAgentId: null,
300
+ setEditingAgentId: (id) => set({ editingAgentId: id }),
301
+
302
+ scheduleSheetOpen: false,
303
+ setScheduleSheetOpen: (open) => set({ scheduleSheetOpen: open }),
304
+ editingScheduleId: null,
305
+ setEditingScheduleId: (id) => set({ editingScheduleId: id }),
306
+
307
+ memorySheetOpen: false,
308
+ setMemorySheetOpen: (open) => set({ memorySheetOpen: open }),
309
+ selectedMemoryId: null,
310
+ setSelectedMemoryId: (id) => set({ selectedMemoryId: id }),
311
+ memoryRefreshKey: 0,
312
+ triggerMemoryRefresh: () => set((s) => ({ memoryRefreshKey: s.memoryRefreshKey + 1 })),
313
+ memoryAgentFilter: null,
314
+ setMemoryAgentFilter: (agentId) => set({ memoryAgentFilter: agentId }),
315
+
316
+ appSettings: {},
317
+ loadSettings: async () => {
318
+ try {
319
+ const settings = await api<AppSettings>('GET', '/settings')
320
+ set({ appSettings: settings })
321
+ } catch {
322
+ // ignore
323
+ }
324
+ },
325
+ updateSettings: async (patch) => {
326
+ try {
327
+ const settings = await api<AppSettings>('PUT', '/settings', patch)
328
+ set({ appSettings: settings })
329
+ } catch {
330
+ // ignore
331
+ }
332
+ },
333
+
334
+ secrets: {},
335
+ loadSecrets: async () => {
336
+ try {
337
+ const secrets = await api<Record<string, OrchestratorSecret>>('GET', '/secrets')
338
+ set({ secrets })
339
+ } catch {
340
+ // ignore
341
+ }
342
+ },
343
+ secretSheetOpen: false,
344
+ setSecretSheetOpen: (open) => set({ secretSheetOpen: open }),
345
+ editingSecretId: null,
346
+ setEditingSecretId: (id) => set({ editingSecretId: id }),
347
+
348
+ tasks: {},
349
+ loadTasks: async (includeArchived) => {
350
+ try {
351
+ const show = includeArchived ?? get().showArchivedTasks
352
+ const tasks = await fetchTasks(show)
353
+ set({ tasks })
354
+ } catch {
355
+ // ignore
356
+ }
357
+ },
358
+ showArchivedTasks: false,
359
+ setShowArchivedTasks: (show) => {
360
+ set({ showArchivedTasks: show })
361
+ get().loadTasks(show)
362
+ },
363
+ taskSheetOpen: false,
364
+ setTaskSheetOpen: (open) => set({ taskSheetOpen: open }),
365
+ editingTaskId: null,
366
+ setEditingTaskId: (id) => set({ editingTaskId: id }),
367
+
368
+ // Provider configs (custom providers)
369
+ providerConfigs: [],
370
+ loadProviderConfigs: async () => {
371
+ try {
372
+ const configs = await api<ProviderConfig[]>('GET', '/providers/configs')
373
+ set({ providerConfigs: configs })
374
+ } catch {
375
+ // ignore
376
+ }
377
+ },
378
+ providerSheetOpen: false,
379
+ setProviderSheetOpen: (open) => set({ providerSheetOpen: open }),
380
+ editingProviderId: null,
381
+ setEditingProviderId: (id) => set({ editingProviderId: id }),
382
+
383
+ // Skills
384
+ skills: {},
385
+ loadSkills: async () => {
386
+ try {
387
+ const skills = await api<Record<string, Skill>>('GET', '/skills')
388
+ set({ skills })
389
+ } catch {
390
+ // ignore
391
+ }
392
+ },
393
+ skillSheetOpen: false,
394
+ setSkillSheetOpen: (open) => set({ skillSheetOpen: open }),
395
+ editingSkillId: null,
396
+ setEditingSkillId: (id) => set({ editingSkillId: id }),
397
+
398
+ // Connectors
399
+ connectors: {},
400
+ loadConnectors: async () => {
401
+ try {
402
+ const connectors = await api<Record<string, Connector>>('GET', '/connectors')
403
+ set({ connectors })
404
+ } catch {
405
+ // ignore
406
+ }
407
+ },
408
+ connectorSheetOpen: false,
409
+ setConnectorSheetOpen: (open) => set({ connectorSheetOpen: open }),
410
+ editingConnectorId: null,
411
+ setEditingConnectorId: (id) => set({ editingConnectorId: id }),
412
+
413
+ // Webhooks
414
+ webhooks: {},
415
+ loadWebhooks: async () => {
416
+ try {
417
+ const webhooks = await api<Record<string, Webhook>>('GET', '/webhooks')
418
+ set({ webhooks })
419
+ } catch {
420
+ // ignore
421
+ }
422
+ },
423
+ webhookSheetOpen: false,
424
+ setWebhookSheetOpen: (open) => set({ webhookSheetOpen: open }),
425
+ editingWebhookId: null,
426
+ setEditingWebhookId: (id) => set({ editingWebhookId: id }),
427
+
428
+ // MCP Servers
429
+ mcpServers: {},
430
+ loadMcpServers: async () => {
431
+ try {
432
+ const mcpServers = await api<Record<string, McpServerConfig>>('GET', '/mcp-servers')
433
+ set({ mcpServers })
434
+ } catch {
435
+ // ignore
436
+ }
437
+ },
438
+ mcpServerSheetOpen: false,
439
+ setMcpServerSheetOpen: (open) => set({ mcpServerSheetOpen: open }),
440
+ editingMcpServerId: null,
441
+ setEditingMcpServerId: (id) => set({ editingMcpServerId: id }),
442
+
443
+ // Knowledge Base
444
+ knowledgeSheetOpen: false,
445
+ setKnowledgeSheetOpen: (open) => set({ knowledgeSheetOpen: open }),
446
+ editingKnowledgeId: null,
447
+ setEditingKnowledgeId: (id) => set({ editingKnowledgeId: id }),
448
+ knowledgeRefreshKey: 0,
449
+ triggerKnowledgeRefresh: () => set((s) => ({ knowledgeRefreshKey: s.knowledgeRefreshKey + 1 })),
450
+
451
+ // Plugins
452
+ plugins: {},
453
+ loadPlugins: async () => {
454
+ try {
455
+ const list = await api<PluginMeta[]>('GET', '/plugins')
456
+ const plugins: Record<string, PluginMeta> = {}
457
+ for (const p of list) plugins[p.filename] = p
458
+ set({ plugins })
459
+ } catch {
460
+ // ignore
461
+ }
462
+ },
463
+ pluginSheetOpen: false,
464
+ setPluginSheetOpen: (open) => set({ pluginSheetOpen: open }),
465
+ editingPluginFilename: null,
466
+ setEditingPluginFilename: (filename) => set({ editingPluginFilename: filename }),
467
+
468
+ }))