@swarmclawai/swarmclaw 0.7.6 → 0.7.8

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 (86) hide show
  1. package/README.md +19 -10
  2. package/package.json +1 -1
  3. package/src/app/api/agents/[id]/route.ts +16 -0
  4. package/src/app/api/agents/route.ts +2 -0
  5. package/src/app/api/chats/[id]/route.ts +21 -1
  6. package/src/app/api/chats/route.ts +13 -1
  7. package/src/app/api/connectors/[id]/route.ts +20 -2
  8. package/src/app/api/connectors/route.ts +12 -8
  9. package/src/app/api/external-agents/[id]/heartbeat/route.ts +3 -0
  10. package/src/app/api/external-agents/[id]/route.ts +38 -6
  11. package/src/app/api/external-agents/route.ts +17 -1
  12. package/src/app/api/gateways/[id]/health/route.ts +8 -0
  13. package/src/app/api/gateways/[id]/route.ts +53 -1
  14. package/src/app/api/gateways/route.ts +53 -0
  15. package/src/app/api/openclaw/deploy/route.ts +139 -0
  16. package/src/app/api/projects/[id]/route.ts +6 -2
  17. package/src/app/api/projects/route.ts +4 -3
  18. package/src/app/api/secrets/[id]/route.ts +1 -0
  19. package/src/app/api/secrets/route.ts +2 -1
  20. package/src/app/api/settings/route.ts +2 -0
  21. package/src/cli/index.js +40 -0
  22. package/src/cli/index.test.js +68 -0
  23. package/src/cli/spec.js +60 -0
  24. package/src/components/agents/agent-sheet.tsx +281 -33
  25. package/src/components/auth/setup-wizard.tsx +75 -2
  26. package/src/components/chat/chat-area.tsx +36 -19
  27. package/src/components/chat/chat-header.tsx +4 -0
  28. package/src/components/chat/delegation-banner.test.ts +14 -1
  29. package/src/components/chat/delegation-banner.tsx +1 -1
  30. package/src/components/gateways/gateway-sheet.tsx +140 -8
  31. package/src/components/layout/app-layout.tsx +40 -23
  32. package/src/components/openclaw/openclaw-deploy-panel.tsx +591 -9
  33. package/src/components/projects/project-detail.tsx +217 -0
  34. package/src/components/projects/project-sheet.tsx +176 -4
  35. package/src/components/providers/provider-list.tsx +221 -17
  36. package/src/components/shared/settings/section-capability-policy.tsx +38 -0
  37. package/src/components/shared/settings/section-voice.tsx +11 -3
  38. package/src/components/tasks/approvals-panel.tsx +177 -18
  39. package/src/components/tasks/task-board.tsx +137 -23
  40. package/src/components/tasks/task-card.tsx +29 -0
  41. package/src/components/tasks/task-sheet.tsx +16 -4
  42. package/src/lib/server/agent-runtime-config.ts +142 -7
  43. package/src/lib/server/agent-thread-session.ts +9 -1
  44. package/src/lib/server/capability-router.test.ts +22 -0
  45. package/src/lib/server/capability-router.ts +54 -18
  46. package/src/lib/server/chat-execution.ts +33 -3
  47. package/src/lib/server/connectors/manager-reconnect.test.ts +47 -0
  48. package/src/lib/server/connectors/manager.ts +99 -74
  49. package/src/lib/server/daemon-state.ts +83 -46
  50. package/src/lib/server/elevenlabs.test.ts +59 -1
  51. package/src/lib/server/heartbeat-service.ts +5 -1
  52. package/src/lib/server/main-agent-loop.test.ts +260 -0
  53. package/src/lib/server/main-agent-loop.ts +559 -14
  54. package/src/lib/server/openclaw-deploy.test.ts +8 -0
  55. package/src/lib/server/openclaw-deploy.ts +679 -19
  56. package/src/lib/server/orchestrator-lg.ts +1 -0
  57. package/src/lib/server/orchestrator.ts +11 -0
  58. package/src/lib/server/plugins.ts +6 -1
  59. package/src/lib/server/project-context.ts +162 -0
  60. package/src/lib/server/project-utils.ts +150 -0
  61. package/src/lib/server/queue-followups.test.ts +147 -2
  62. package/src/lib/server/queue.ts +278 -8
  63. package/src/lib/server/session-run-manager.ts +31 -0
  64. package/src/lib/server/session-tools/connector-inputs.test.ts +37 -0
  65. package/src/lib/server/session-tools/connector.ts +26 -1
  66. package/src/lib/server/session-tools/context.ts +5 -0
  67. package/src/lib/server/session-tools/crud.ts +265 -76
  68. package/src/lib/server/session-tools/delegate-resume.test.ts +50 -0
  69. package/src/lib/server/session-tools/delegate.ts +38 -2
  70. package/src/lib/server/session-tools/manage-tasks.test.ts +114 -0
  71. package/src/lib/server/session-tools/memory.ts +14 -2
  72. package/src/lib/server/session-tools/platform-access.test.ts +58 -0
  73. package/src/lib/server/session-tools/platform.ts +60 -19
  74. package/src/lib/server/session-tools/web-inputs.test.ts +17 -0
  75. package/src/lib/server/session-tools/web.ts +153 -6
  76. package/src/lib/server/stream-agent-chat.test.ts +27 -2
  77. package/src/lib/server/stream-agent-chat.ts +104 -30
  78. package/src/lib/server/tool-aliases.ts +2 -0
  79. package/src/lib/server/tool-capability-policy.test.ts +24 -0
  80. package/src/lib/server/tool-capability-policy.ts +29 -1
  81. package/src/lib/server/tool-planning.test.ts +44 -0
  82. package/src/lib/server/tool-planning.ts +269 -0
  83. package/src/lib/setup-defaults.ts +2 -2
  84. package/src/lib/tool-definitions.ts +2 -1
  85. package/src/lib/validation/schemas.ts +9 -0
  86. package/src/types/index.ts +104 -0
@@ -141,6 +141,7 @@ export function AppLayout() {
141
141
  const execApprovals = useApprovalStore((s) => s.approvals)
142
142
  const loadExecApprovals = useApprovalStore((s) => s.loadApprovals)
143
143
  const pruneExecApprovals = useApprovalStore((s) => s.pruneExpired)
144
+ const appSettings = useAppStore((s) => s.appSettings)
144
145
  const isDesktop = useMediaQuery('(min-width: 768px)')
145
146
  const hasSelectedSession = !!(currentSessionId && sessions[currentSessionId])
146
147
 
@@ -168,11 +169,23 @@ export function AppLayout() {
168
169
  pruneExecApprovals()
169
170
  }, 10000)
170
171
 
171
- const appSettings = useAppStore((s) => s.appSettings)
172
172
  const [agentViewMode, setAgentViewMode] = useState<'chat' | 'config'>('chat')
173
173
  const [profileSheetOpen, setProfileSheetOpen] = useState(false)
174
174
  const [canvasDismissedFor, setCanvasDismissedFor] = useState<string | null>(null)
175
175
 
176
+ const isViewEnabled = useCallback((view: AppView) => {
177
+ if (view === 'projects') return appSettings.projectManagementEnabled !== false
178
+ if (view === 'tasks') return appSettings.taskManagementEnabled !== false
179
+ if (view === 'chatrooms') return plugins['chatroom']?.enabled !== false
180
+ if (view === 'schedules') return plugins['schedule']?.enabled !== false
181
+ if (view === 'memory') return plugins['memory']?.enabled !== false
182
+ if (view === 'connectors') return plugins['connectors']?.enabled !== false
183
+ if (view === 'webhooks') return plugins['http']?.enabled !== false
184
+ if (view === 'wallets') return plugins['wallet']?.enabled !== false
185
+ if (view === 'logs') return plugins['monitor']?.enabled !== false
186
+ return true
187
+ }, [appSettings.projectManagementEnabled, appSettings.taskManagementEnabled, plugins])
188
+
176
189
  const handleShortcutKey = useCallback((e: KeyboardEvent) => {
177
190
  const mod = e.metaKey || e.ctrlKey
178
191
  // Cmd+N / Ctrl+N — jump to the default agent shortcut
@@ -188,8 +201,10 @@ export function AppLayout() {
188
201
  }
189
202
  // Cmd+Shift+T / Ctrl+Shift+T — jump to tasks
190
203
  if (mod && e.shiftKey && e.key.toLowerCase() === 't') {
204
+ const state = useAppStore.getState()
205
+ if (state.appSettings.taskManagementEnabled === false) return
191
206
  e.preventDefault()
192
- useAppStore.getState().setActiveView('tasks')
207
+ state.setActiveView('tasks')
193
208
  }
194
209
  }, [])
195
210
 
@@ -222,6 +237,13 @@ export function AppLayout() {
222
237
  }
223
238
  }, [appSettings.themeHue])
224
239
 
240
+ useEffect(() => {
241
+ if (!isViewEnabled(activeView)) {
242
+ setActiveView('home')
243
+ setSidebarOpen(false)
244
+ }
245
+ }, [activeView, isViewEnabled, setActiveView, setSidebarOpen])
246
+
225
247
  const [pluginSidebarItems, setPluginSidebarItems] = useState<Array<{ id: string; label: string; href: string }>>([])
226
248
 
227
249
  const refreshPluginState = useCallback(() => {
@@ -235,17 +257,6 @@ export function AppLayout() {
235
257
 
236
258
  useWs('plugins', refreshPluginState)
237
259
 
238
- const isViewEnabled = useCallback((view: AppView) => {
239
- if (view === 'chatrooms') return plugins['chatroom']?.enabled !== false
240
- if (view === 'schedules') return plugins['schedule']?.enabled !== false
241
- if (view === 'memory') return plugins['memory']?.enabled !== false
242
- if (view === 'connectors') return plugins['connectors']?.enabled !== false
243
- if (view === 'webhooks') return plugins['http']?.enabled !== false
244
- if (view === 'wallets') return plugins['wallet']?.enabled !== false
245
- if (view === 'logs') return plugins['monitor']?.enabled !== false
246
- return true
247
- }, [plugins])
248
-
249
260
  const [railExpanded, setRailExpanded] = useState(() => {
250
261
  const stored = safeStorageGet(RAIL_EXPANDED_KEY)
251
262
  return stored === null ? true : stored === 'true'
@@ -262,6 +273,7 @@ export function AppLayout() {
262
273
  }
263
274
 
264
275
  const openNewSheet = () => {
276
+ if (!isViewEnabled(activeView)) return
265
277
  if (activeView === 'agents') setAgentSheetOpen(true)
266
278
  else if (activeView === 'schedules') setScheduleSheetOpen(true)
267
279
  else if (activeView === 'tasks') setTaskSheetOpen(true)
@@ -278,6 +290,7 @@ export function AppLayout() {
278
290
  }
279
291
 
280
292
  const handleNavClick = (view: AppView) => {
293
+ if (!isViewEnabled(view)) return
281
294
  if (FULL_WIDTH_VIEWS.has(view)) {
282
295
  setActiveView(view)
283
296
  setSidebarOpen(false)
@@ -491,11 +504,13 @@ export function AppLayout() {
491
504
  </svg>
492
505
  </NavItem>
493
506
  )}
494
- <NavItem view="projects" label="Projects" expanded={railExpanded} active={activeView} sidebarOpen={sidebarOpen} onClick={() => handleNavClick('projects')}>
495
- <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round">
496
- <path d="M2 20a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V8l-7-7H4a2 2 0 0 0-2 2v17Z" /><path d="M14 2v7h7" />
497
- </svg>
498
- </NavItem>
507
+ {isViewEnabled('projects') && (
508
+ <NavItem view="projects" label="Projects" expanded={railExpanded} active={activeView} sidebarOpen={sidebarOpen} onClick={() => handleNavClick('projects')}>
509
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round">
510
+ <path d="M2 20a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V8l-7-7H4a2 2 0 0 0-2 2v17Z" /><path d="M14 2v7h7" />
511
+ </svg>
512
+ </NavItem>
513
+ )}
499
514
  </div>
500
515
 
501
516
  <div className={`flex flex-col gap-0.5 ${railExpanded ? '' : 'items-center'}`}>
@@ -504,11 +519,13 @@ export function AppLayout() {
504
519
  ) : (
505
520
  <div className="my-1 h-px w-6 bg-white/[0.06]" />
506
521
  )}
507
- <NavItem view="tasks" label="Tasks" expanded={railExpanded} active={activeView} sidebarOpen={sidebarOpen} onClick={() => handleNavClick('tasks')} badge={pendingApprovalCount}>
508
- <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round">
509
- <path d="M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2" /><rect x="9" y="3" width="6" height="4" rx="1" /><path d="M9 14l2 2 4-4" />
510
- </svg>
511
- </NavItem>
522
+ {isViewEnabled('tasks') && (
523
+ <NavItem view="tasks" label="Tasks" expanded={railExpanded} active={activeView} sidebarOpen={sidebarOpen} onClick={() => handleNavClick('tasks')} badge={pendingApprovalCount}>
524
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round">
525
+ <path d="M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2" /><rect x="9" y="3" width="6" height="4" rx="1" /><path d="M9 14l2 2 4-4" />
526
+ </svg>
527
+ </NavItem>
528
+ )}
512
529
  <NavItem view="approvals" label="Approvals" expanded={railExpanded} active={activeView} sidebarOpen={sidebarOpen} onClick={() => handleNavClick('approvals')} badge={pendingApprovalCount}>
513
530
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round">
514
531
  <path d="M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10z"/>