@swarmclawai/swarmclaw 0.7.1 → 0.7.2
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 +85 -139
- package/package.json +1 -1
- package/src/app/api/agents/[id]/thread/route.ts +1 -2
- package/src/app/api/agents/route.ts +1 -1
- package/src/app/api/{sessions → chats}/[id]/checkpoints/route.ts +1 -1
- package/src/app/api/{sessions → chats}/[id]/main-loop/route.ts +2 -2
- package/src/app/api/{sessions → chats}/[id]/restore/route.ts +1 -1
- package/src/app/api/{sessions → chats}/[id]/route.ts +4 -52
- package/src/app/api/{sessions → chats}/route.ts +5 -7
- package/src/app/api/plugins/route.ts +3 -0
- package/src/app/api/plugins/settings/route.ts +35 -0
- package/src/app/api/usage/route.ts +30 -0
- package/src/cli/index.js +35 -33
- package/src/cli/index.ts +40 -39
- package/src/cli/spec.js +29 -27
- package/src/components/agents/agent-card.tsx +1 -1
- package/src/components/agents/agent-chat-list.tsx +3 -3
- package/src/components/agents/agent-list.tsx +8 -13
- package/src/components/agents/agent-sheet.tsx +2 -2
- package/src/components/agents/cron-job-form.tsx +3 -3
- package/src/components/agents/inspector-panel.tsx +2 -2
- package/src/components/auth/setup-wizard.tsx +5 -38
- package/src/components/chat/chat-area.tsx +10 -14
- package/src/components/{sessions/session-card.tsx → chat/chat-card.tsx} +3 -3
- package/src/components/chat/chat-header.tsx +156 -73
- package/src/components/{sessions/session-list.tsx → chat/chat-list.tsx} +4 -5
- package/src/components/chat/chat-tool-toggles.tsx +26 -17
- package/src/components/chat/checkpoint-timeline.tsx +4 -4
- package/src/components/chat/message-bubble.tsx +4 -1
- package/src/components/chat/message-list.tsx +2 -2
- package/src/components/{sessions/new-session-sheet.tsx → chat/new-chat-sheet.tsx} +6 -6
- package/src/components/chat/session-debug-panel.tsx +1 -1
- package/src/components/chat/tool-request-banner.tsx +3 -3
- package/src/components/chatrooms/agent-hover-card.tsx +3 -3
- package/src/components/chatrooms/chatroom-tool-request-banner.tsx +2 -2
- package/src/components/connectors/connector-sheet.tsx +1 -1
- package/src/components/home/home-view.tsx +1 -1
- package/src/components/layout/app-layout.tsx +23 -2
- package/src/components/plugins/plugin-list.tsx +475 -254
- package/src/components/plugins/plugin-sheet.tsx +124 -10
- package/src/components/settings/gateway-connection-panel.tsx +1 -1
- package/src/components/shared/command-palette.tsx +0 -1
- package/src/components/shared/settings/section-heartbeat.tsx +1 -1
- package/src/components/shared/settings/section-providers.tsx +1 -1
- package/src/components/shared/settings/settings-page.tsx +1 -12
- package/src/components/usage/metrics-dashboard.tsx +73 -0
- package/src/components/webhooks/webhook-sheet.tsx +1 -1
- package/src/lib/chat.ts +1 -1
- package/src/lib/{sessions.ts → chats.ts} +28 -18
- package/src/lib/providers/claude-cli.ts +1 -1
- package/src/lib/server/approvals.ts +4 -4
- package/src/lib/server/capability-router.ts +10 -8
- package/src/lib/server/chat-execution.ts +36 -105
- package/src/lib/server/chatroom-helpers.ts +3 -3
- package/src/lib/server/connectors/manager.ts +4 -4
- package/src/lib/server/cost.ts +34 -1
- package/src/lib/server/daemon-state.ts +2 -2
- package/src/lib/server/heartbeat-service.ts +1 -1
- package/src/lib/server/main-agent-loop.ts +25 -160
- package/src/lib/server/main-session.ts +6 -13
- package/src/lib/server/orchestrator-lg.ts +3 -3
- package/src/lib/server/orchestrator.ts +5 -5
- package/src/lib/server/plugins.ts +112 -4
- package/src/lib/server/provider-health.ts +5 -3
- package/src/lib/server/queue.ts +12 -10
- package/src/lib/server/session-run-manager.test.ts +9 -6
- package/src/lib/server/session-run-manager.ts +1 -3
- package/src/lib/server/session-tools/calendar.ts +376 -0
- package/src/lib/server/session-tools/canvas.ts +1 -1
- package/src/lib/server/session-tools/chatroom.ts +4 -2
- package/src/lib/server/session-tools/connector.ts +5 -2
- package/src/lib/server/session-tools/context.ts +7 -3
- package/src/lib/server/session-tools/crud.ts +14 -6
- package/src/lib/server/session-tools/delegate.ts +95 -8
- package/src/lib/server/session-tools/discovery.ts +2 -2
- package/src/lib/server/session-tools/edit_file.ts +4 -2
- package/src/lib/server/session-tools/email.ts +322 -0
- package/src/lib/server/session-tools/file.ts +5 -2
- package/src/lib/server/session-tools/git.ts +1 -1
- package/src/lib/server/session-tools/http.ts +1 -1
- package/src/lib/server/session-tools/image-gen.ts +382 -0
- package/src/lib/server/session-tools/index.ts +74 -49
- package/src/lib/server/session-tools/memory.ts +139 -2
- package/src/lib/server/session-tools/monitor.ts +1 -1
- package/src/lib/server/session-tools/openclaw-nodes.ts +1 -1
- package/src/lib/server/session-tools/openclaw-workspace.ts +1 -1
- package/src/lib/server/session-tools/platform.ts +6 -3
- package/src/lib/server/session-tools/plugin-creator.ts +3 -3
- package/src/lib/server/session-tools/replicate.ts +303 -0
- package/src/lib/server/session-tools/sample-ui.ts +1 -1
- package/src/lib/server/session-tools/sandbox.ts +4 -2
- package/src/lib/server/session-tools/schedule.ts +4 -2
- package/src/lib/server/session-tools/session-info.ts +7 -4
- package/src/lib/server/session-tools/shell.ts +5 -2
- package/src/lib/server/session-tools/subagent.ts +2 -2
- package/src/lib/server/session-tools/wallet.ts +29 -2
- package/src/lib/server/session-tools/web.ts +44 -5
- package/src/lib/server/storage.ts +29 -9
- package/src/lib/server/stream-agent-chat.ts +72 -249
- package/src/lib/server/tool-aliases.ts +26 -15
- package/src/lib/server/tool-capability-policy.test.ts +9 -9
- package/src/lib/server/tool-capability-policy.ts +32 -27
- package/src/lib/tool-definitions.ts +4 -0
- package/src/lib/validation/schemas.ts +3 -1
- package/src/stores/use-app-store.ts +5 -5
- package/src/stores/use-chat-store.ts +7 -7
- package/src/types/index.ts +65 -3
- /package/src/app/api/{sessions → chats}/[id]/browser/route.ts +0 -0
- /package/src/app/api/{sessions → chats}/[id]/chat/route.ts +0 -0
- /package/src/app/api/{sessions → chats}/[id]/clear/route.ts +0 -0
- /package/src/app/api/{sessions → chats}/[id]/deploy/route.ts +0 -0
- /package/src/app/api/{sessions → chats}/[id]/devserver/route.ts +0 -0
- /package/src/app/api/{sessions → chats}/[id]/edit-resend/route.ts +0 -0
- /package/src/app/api/{sessions → chats}/[id]/fork/route.ts +0 -0
- /package/src/app/api/{sessions → chats}/[id]/mailbox/route.ts +0 -0
- /package/src/app/api/{sessions → chats}/[id]/messages/route.ts +0 -0
- /package/src/app/api/{sessions → chats}/[id]/retry/route.ts +0 -0
- /package/src/app/api/{sessions → chats}/[id]/stop/route.ts +0 -0
- /package/src/app/api/{sessions → chats}/heartbeat/route.ts +0 -0
|
@@ -315,7 +315,7 @@ export function SetupWizard({ onComplete }: SetupWizardProps) {
|
|
|
315
315
|
provider: provider as ProviderType,
|
|
316
316
|
model: agentModel.trim() || DEFAULT_AGENTS[provider].model,
|
|
317
317
|
credentialId: credentialId || null,
|
|
318
|
-
|
|
318
|
+
plugins: DEFAULT_AGENTS[provider].tools,
|
|
319
319
|
}
|
|
320
320
|
|
|
321
321
|
if (supportsEndpoint && endpoint.trim()) {
|
|
@@ -340,44 +340,11 @@ export function SetupWizard({ onComplete }: SetupWizardProps) {
|
|
|
340
340
|
await api('PUT', '/agents/default', payload)
|
|
341
341
|
}
|
|
342
342
|
|
|
343
|
-
//
|
|
343
|
+
// Set the default agent and open its thread
|
|
344
344
|
const appState = useAppStore.getState()
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
const existingMain = Object.values(sessionMap).find((s) => s.name === '__main__' && s.user === currentUser)
|
|
349
|
-
const mainId = existingMain?.id || `main-${currentUser}`
|
|
350
|
-
const selectedModel = (payload.model as string) || DEFAULT_AGENTS[provider].model
|
|
351
|
-
const selectedEndpoint = supportsEndpoint ? (payload.apiEndpoint as string | undefined) || null : null
|
|
352
|
-
const selectedTools = Array.isArray(payload.tools) ? payload.tools as string[] : DEFAULT_AGENTS[provider].tools
|
|
353
|
-
|
|
354
|
-
if (!existingMain) {
|
|
355
|
-
await api('POST', '/sessions', {
|
|
356
|
-
id: mainId,
|
|
357
|
-
name: '__main__',
|
|
358
|
-
user: currentUser,
|
|
359
|
-
agentId,
|
|
360
|
-
provider,
|
|
361
|
-
model: selectedModel,
|
|
362
|
-
credentialId: credentialId || null,
|
|
363
|
-
apiEndpoint: selectedEndpoint,
|
|
364
|
-
tools: selectedTools,
|
|
365
|
-
heartbeatEnabled: true,
|
|
366
|
-
})
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
await api('PUT', `/sessions/${mainId}`, {
|
|
370
|
-
agentId,
|
|
371
|
-
provider,
|
|
372
|
-
model: selectedModel,
|
|
373
|
-
credentialId: credentialId || null,
|
|
374
|
-
apiEndpoint: selectedEndpoint,
|
|
375
|
-
tools: selectedTools,
|
|
376
|
-
heartbeatEnabled: true,
|
|
377
|
-
})
|
|
378
|
-
|
|
379
|
-
await appState.loadSessions()
|
|
380
|
-
appState.setCurrentSession(mainId)
|
|
345
|
+
if (agentId) {
|
|
346
|
+
await appState.updateSettings({ defaultAgentId: agentId })
|
|
347
|
+
await appState.setCurrentAgent(agentId)
|
|
381
348
|
}
|
|
382
349
|
} else {
|
|
383
350
|
// Additional providers just create the agent
|
|
@@ -4,7 +4,7 @@ import { useEffect, useCallback, useState, useRef, useMemo } from 'react'
|
|
|
4
4
|
import { useAppStore } from '@/stores/use-app-store'
|
|
5
5
|
import { useWs } from '@/hooks/use-ws'
|
|
6
6
|
import { useChatStore } from '@/stores/use-chat-store'
|
|
7
|
-
import { fetchMessages, fetchMessagesPaginated, clearMessages,
|
|
7
|
+
import { fetchMessages, fetchMessagesPaginated, clearMessages, deleteChat, devServer, checkBrowser, stopBrowser } from '@/lib/chats'
|
|
8
8
|
import { uploadImage } from '@/lib/upload'
|
|
9
9
|
import { deleteAgent } from '@/lib/agents'
|
|
10
10
|
import { useMediaQuery } from '@/hooks/use-media-query'
|
|
@@ -133,7 +133,7 @@ export function ChatArea() {
|
|
|
133
133
|
setDevServer(r.running ? r : null)
|
|
134
134
|
}).catch(() => setDevServer(null))
|
|
135
135
|
// Check browser status
|
|
136
|
-
if (session?.
|
|
136
|
+
if (session?.plugins?.includes('browser')) {
|
|
137
137
|
checkBrowser(sessionId).then((r) => setBrowserActive(r.active)).catch((err) => { console.error('Browser check failed:', err); setBrowserActive(false) })
|
|
138
138
|
} else {
|
|
139
139
|
setBrowserActive(false)
|
|
@@ -143,7 +143,7 @@ export function ChatArea() {
|
|
|
143
143
|
// Auto-poll messages for orchestrated or server-active sessions
|
|
144
144
|
const isOrchestrated = session?.sessionType === 'orchestrated'
|
|
145
145
|
const isServerActive = session?.active === true
|
|
146
|
-
const isOngoingMonitored = appSettings.loopMode === 'ongoing' && !!session?.
|
|
146
|
+
const isOngoingMonitored = appSettings.loopMode === 'ongoing' && !!session?.plugins?.length
|
|
147
147
|
const shouldPollMessages = !!sessionId && (isOrchestrated || isServerActive || isOngoingMonitored)
|
|
148
148
|
const messagesLenRef = useRef(messages.length)
|
|
149
149
|
messagesLenRef.current = messages.length
|
|
@@ -200,7 +200,7 @@ export function ChatArea() {
|
|
|
200
200
|
}, [isServerActive, sessionId])
|
|
201
201
|
|
|
202
202
|
// Poll browser status while session has browser tools
|
|
203
|
-
const hasBrowserTool = session?.
|
|
203
|
+
const hasBrowserTool = session?.plugins?.includes('browser')
|
|
204
204
|
const checkBrowserStatus = useCallback(() => {
|
|
205
205
|
if (!sessionId || !hasBrowserTool) return
|
|
206
206
|
checkBrowser(sessionId).then((r) => setBrowserActive(r.active)).catch(() => {})
|
|
@@ -235,7 +235,7 @@ export function ChatArea() {
|
|
|
235
235
|
const handleDelete = useCallback(async () => {
|
|
236
236
|
setConfirmDelete(false)
|
|
237
237
|
if (!sessionId) return
|
|
238
|
-
await
|
|
238
|
+
await deleteChat(sessionId)
|
|
239
239
|
removeSessionFromStore(sessionId)
|
|
240
240
|
setCurrentSession(null)
|
|
241
241
|
}, [sessionId])
|
|
@@ -281,7 +281,6 @@ export function ChatArea() {
|
|
|
281
281
|
if (!session) return null
|
|
282
282
|
|
|
283
283
|
const streamingForThisSession = streaming && (!streamingSessionId || streamingSessionId === session.id)
|
|
284
|
-
const isMainChat = session.name === '__main__'
|
|
285
284
|
const isEmpty = !messages.length && !streamingForThisSession && !messagesLoading
|
|
286
285
|
|
|
287
286
|
return (
|
|
@@ -438,11 +437,9 @@ export function ChatArea() {
|
|
|
438
437
|
<DropdownItem onClick={() => { setMenuOpen(false); setConfirmClear(true) }}>
|
|
439
438
|
Clear History
|
|
440
439
|
</DropdownItem>
|
|
441
|
-
{
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
</DropdownItem>
|
|
445
|
-
)}
|
|
440
|
+
<DropdownItem danger onClick={() => { setMenuOpen(false); setConfirmDelete(true) }}>
|
|
441
|
+
Delete Chat
|
|
442
|
+
</DropdownItem>
|
|
446
443
|
</Dropdown>
|
|
447
444
|
|
|
448
445
|
<ConfirmDialog
|
|
@@ -500,9 +497,8 @@ export function ChatArea() {
|
|
|
500
497
|
agent={currentAgent}
|
|
501
498
|
onEditAgent={() => { setEditingAgentId(session.agentId!); setAgentSheetOpen(true) }}
|
|
502
499
|
onClearHistory={() => setConfirmClear(true)}
|
|
503
|
-
onDeleteAgent={
|
|
504
|
-
onDeleteChat={
|
|
505
|
-
isMainChat={isMainChat}
|
|
500
|
+
onDeleteAgent={() => setConfirmDeleteAgent(true)}
|
|
501
|
+
onDeleteChat={() => setConfirmDelete(true)}
|
|
506
502
|
/>
|
|
507
503
|
)}
|
|
508
504
|
{isDesktop && heartbeatHistoryOpen && currentAgent?.heartbeatEnabled && (
|
|
@@ -34,7 +34,7 @@ interface Props {
|
|
|
34
34
|
onClick: () => void
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
export function
|
|
37
|
+
export function ChatCard({ session, active, onClick }: Props) {
|
|
38
38
|
const removeSession = useAppStore((s) => s.removeSession)
|
|
39
39
|
const appSettings = useAppStore((s) => s.appSettings)
|
|
40
40
|
const agents = useAppStore((s) => s.agents)
|
|
@@ -50,7 +50,7 @@ export function SessionCard({ session, active, onClick }: Props) {
|
|
|
50
50
|
if (!confirm(`Delete chat session "${session.name}"?`)) return
|
|
51
51
|
|
|
52
52
|
try {
|
|
53
|
-
await api('DELETE', `/
|
|
53
|
+
await api('DELETE', `/chats/${session.id}`)
|
|
54
54
|
removeSession(session.id)
|
|
55
55
|
toast.success('Session deleted')
|
|
56
56
|
} catch (err: unknown) {
|
|
@@ -74,7 +74,7 @@ export function SessionCard({ session, active, onClick }: Props) {
|
|
|
74
74
|
const intervalEnabled = Number.isFinite(intervalNum) ? intervalNum > 0 : true
|
|
75
75
|
const heartbeatEnabled =
|
|
76
76
|
(loopIsOngoing || explicitOptIn)
|
|
77
|
-
&& (session.
|
|
77
|
+
&& (session.plugins?.length ?? 0) > 0
|
|
78
78
|
&& intervalEnabled
|
|
79
79
|
&& session.heartbeatEnabled !== false
|
|
80
80
|
&& agent?.heartbeatEnabled !== false
|