@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.
- package/README.md +19 -10
- package/package.json +1 -1
- package/src/app/api/agents/[id]/route.ts +16 -0
- package/src/app/api/agents/route.ts +2 -0
- package/src/app/api/chats/[id]/route.ts +21 -1
- package/src/app/api/chats/route.ts +13 -1
- package/src/app/api/connectors/[id]/route.ts +20 -2
- package/src/app/api/connectors/route.ts +12 -8
- package/src/app/api/external-agents/[id]/heartbeat/route.ts +3 -0
- package/src/app/api/external-agents/[id]/route.ts +38 -6
- package/src/app/api/external-agents/route.ts +17 -1
- package/src/app/api/gateways/[id]/health/route.ts +8 -0
- package/src/app/api/gateways/[id]/route.ts +53 -1
- package/src/app/api/gateways/route.ts +53 -0
- package/src/app/api/openclaw/deploy/route.ts +139 -0
- package/src/app/api/projects/[id]/route.ts +6 -2
- package/src/app/api/projects/route.ts +4 -3
- package/src/app/api/secrets/[id]/route.ts +1 -0
- package/src/app/api/secrets/route.ts +2 -1
- package/src/app/api/settings/route.ts +2 -0
- package/src/cli/index.js +40 -0
- package/src/cli/index.test.js +68 -0
- package/src/cli/spec.js +60 -0
- package/src/components/agents/agent-sheet.tsx +281 -33
- package/src/components/auth/setup-wizard.tsx +75 -2
- package/src/components/chat/chat-area.tsx +36 -19
- package/src/components/chat/chat-header.tsx +4 -0
- package/src/components/chat/delegation-banner.test.ts +14 -1
- package/src/components/chat/delegation-banner.tsx +1 -1
- package/src/components/gateways/gateway-sheet.tsx +140 -8
- package/src/components/layout/app-layout.tsx +40 -23
- package/src/components/openclaw/openclaw-deploy-panel.tsx +591 -9
- package/src/components/projects/project-detail.tsx +217 -0
- package/src/components/projects/project-sheet.tsx +176 -4
- package/src/components/providers/provider-list.tsx +221 -17
- package/src/components/shared/settings/section-capability-policy.tsx +38 -0
- package/src/components/shared/settings/section-voice.tsx +11 -3
- package/src/components/tasks/approvals-panel.tsx +177 -18
- package/src/components/tasks/task-board.tsx +137 -23
- package/src/components/tasks/task-card.tsx +29 -0
- package/src/components/tasks/task-sheet.tsx +16 -4
- package/src/lib/server/agent-runtime-config.ts +142 -7
- package/src/lib/server/agent-thread-session.ts +9 -1
- package/src/lib/server/capability-router.test.ts +22 -0
- package/src/lib/server/capability-router.ts +54 -18
- package/src/lib/server/chat-execution.ts +33 -3
- package/src/lib/server/connectors/manager-reconnect.test.ts +47 -0
- package/src/lib/server/connectors/manager.ts +99 -74
- package/src/lib/server/daemon-state.ts +83 -46
- package/src/lib/server/elevenlabs.test.ts +59 -1
- package/src/lib/server/heartbeat-service.ts +5 -1
- package/src/lib/server/main-agent-loop.test.ts +260 -0
- package/src/lib/server/main-agent-loop.ts +559 -14
- package/src/lib/server/openclaw-deploy.test.ts +8 -0
- package/src/lib/server/openclaw-deploy.ts +679 -19
- package/src/lib/server/orchestrator-lg.ts +1 -0
- package/src/lib/server/orchestrator.ts +11 -0
- package/src/lib/server/plugins.ts +6 -1
- package/src/lib/server/project-context.ts +162 -0
- package/src/lib/server/project-utils.ts +150 -0
- package/src/lib/server/queue-followups.test.ts +147 -2
- package/src/lib/server/queue.ts +278 -8
- package/src/lib/server/session-run-manager.ts +31 -0
- package/src/lib/server/session-tools/connector-inputs.test.ts +37 -0
- package/src/lib/server/session-tools/connector.ts +26 -1
- package/src/lib/server/session-tools/context.ts +5 -0
- package/src/lib/server/session-tools/crud.ts +265 -76
- package/src/lib/server/session-tools/delegate-resume.test.ts +50 -0
- package/src/lib/server/session-tools/delegate.ts +38 -2
- package/src/lib/server/session-tools/manage-tasks.test.ts +114 -0
- package/src/lib/server/session-tools/memory.ts +14 -2
- package/src/lib/server/session-tools/platform-access.test.ts +58 -0
- package/src/lib/server/session-tools/platform.ts +60 -19
- package/src/lib/server/session-tools/web-inputs.test.ts +17 -0
- package/src/lib/server/session-tools/web.ts +153 -6
- package/src/lib/server/stream-agent-chat.test.ts +27 -2
- package/src/lib/server/stream-agent-chat.ts +104 -30
- package/src/lib/server/tool-aliases.ts +2 -0
- package/src/lib/server/tool-capability-policy.test.ts +24 -0
- package/src/lib/server/tool-capability-policy.ts +29 -1
- package/src/lib/server/tool-planning.test.ts +44 -0
- package/src/lib/server/tool-planning.ts +269 -0
- package/src/lib/setup-defaults.ts +2 -2
- package/src/lib/tool-definitions.ts +2 -1
- package/src/lib/validation/schemas.ts +9 -0
- 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
|
-
|
|
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
|
-
|
|
495
|
-
<
|
|
496
|
-
<
|
|
497
|
-
|
|
498
|
-
|
|
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
|
-
|
|
508
|
-
<
|
|
509
|
-
<
|
|
510
|
-
|
|
511
|
-
|
|
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"/>
|