@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.
Files changed (119) hide show
  1. package/README.md +85 -139
  2. package/package.json +1 -1
  3. package/src/app/api/agents/[id]/thread/route.ts +1 -2
  4. package/src/app/api/agents/route.ts +1 -1
  5. package/src/app/api/{sessions → chats}/[id]/checkpoints/route.ts +1 -1
  6. package/src/app/api/{sessions → chats}/[id]/main-loop/route.ts +2 -2
  7. package/src/app/api/{sessions → chats}/[id]/restore/route.ts +1 -1
  8. package/src/app/api/{sessions → chats}/[id]/route.ts +4 -52
  9. package/src/app/api/{sessions → chats}/route.ts +5 -7
  10. package/src/app/api/plugins/route.ts +3 -0
  11. package/src/app/api/plugins/settings/route.ts +35 -0
  12. package/src/app/api/usage/route.ts +30 -0
  13. package/src/cli/index.js +35 -33
  14. package/src/cli/index.ts +40 -39
  15. package/src/cli/spec.js +29 -27
  16. package/src/components/agents/agent-card.tsx +1 -1
  17. package/src/components/agents/agent-chat-list.tsx +3 -3
  18. package/src/components/agents/agent-list.tsx +8 -13
  19. package/src/components/agents/agent-sheet.tsx +2 -2
  20. package/src/components/agents/cron-job-form.tsx +3 -3
  21. package/src/components/agents/inspector-panel.tsx +2 -2
  22. package/src/components/auth/setup-wizard.tsx +5 -38
  23. package/src/components/chat/chat-area.tsx +10 -14
  24. package/src/components/{sessions/session-card.tsx → chat/chat-card.tsx} +3 -3
  25. package/src/components/chat/chat-header.tsx +156 -73
  26. package/src/components/{sessions/session-list.tsx → chat/chat-list.tsx} +4 -5
  27. package/src/components/chat/chat-tool-toggles.tsx +26 -17
  28. package/src/components/chat/checkpoint-timeline.tsx +4 -4
  29. package/src/components/chat/message-bubble.tsx +4 -1
  30. package/src/components/chat/message-list.tsx +2 -2
  31. package/src/components/{sessions/new-session-sheet.tsx → chat/new-chat-sheet.tsx} +6 -6
  32. package/src/components/chat/session-debug-panel.tsx +1 -1
  33. package/src/components/chat/tool-request-banner.tsx +3 -3
  34. package/src/components/chatrooms/agent-hover-card.tsx +3 -3
  35. package/src/components/chatrooms/chatroom-tool-request-banner.tsx +2 -2
  36. package/src/components/connectors/connector-sheet.tsx +1 -1
  37. package/src/components/home/home-view.tsx +1 -1
  38. package/src/components/layout/app-layout.tsx +23 -2
  39. package/src/components/plugins/plugin-list.tsx +475 -254
  40. package/src/components/plugins/plugin-sheet.tsx +124 -10
  41. package/src/components/settings/gateway-connection-panel.tsx +1 -1
  42. package/src/components/shared/command-palette.tsx +0 -1
  43. package/src/components/shared/settings/section-heartbeat.tsx +1 -1
  44. package/src/components/shared/settings/section-providers.tsx +1 -1
  45. package/src/components/shared/settings/settings-page.tsx +1 -12
  46. package/src/components/usage/metrics-dashboard.tsx +73 -0
  47. package/src/components/webhooks/webhook-sheet.tsx +1 -1
  48. package/src/lib/chat.ts +1 -1
  49. package/src/lib/{sessions.ts → chats.ts} +28 -18
  50. package/src/lib/providers/claude-cli.ts +1 -1
  51. package/src/lib/server/approvals.ts +4 -4
  52. package/src/lib/server/capability-router.ts +10 -8
  53. package/src/lib/server/chat-execution.ts +36 -105
  54. package/src/lib/server/chatroom-helpers.ts +3 -3
  55. package/src/lib/server/connectors/manager.ts +4 -4
  56. package/src/lib/server/cost.ts +34 -1
  57. package/src/lib/server/daemon-state.ts +2 -2
  58. package/src/lib/server/heartbeat-service.ts +1 -1
  59. package/src/lib/server/main-agent-loop.ts +25 -160
  60. package/src/lib/server/main-session.ts +6 -13
  61. package/src/lib/server/orchestrator-lg.ts +3 -3
  62. package/src/lib/server/orchestrator.ts +5 -5
  63. package/src/lib/server/plugins.ts +112 -4
  64. package/src/lib/server/provider-health.ts +5 -3
  65. package/src/lib/server/queue.ts +12 -10
  66. package/src/lib/server/session-run-manager.test.ts +9 -6
  67. package/src/lib/server/session-run-manager.ts +1 -3
  68. package/src/lib/server/session-tools/calendar.ts +376 -0
  69. package/src/lib/server/session-tools/canvas.ts +1 -1
  70. package/src/lib/server/session-tools/chatroom.ts +4 -2
  71. package/src/lib/server/session-tools/connector.ts +5 -2
  72. package/src/lib/server/session-tools/context.ts +7 -3
  73. package/src/lib/server/session-tools/crud.ts +14 -6
  74. package/src/lib/server/session-tools/delegate.ts +95 -8
  75. package/src/lib/server/session-tools/discovery.ts +2 -2
  76. package/src/lib/server/session-tools/edit_file.ts +4 -2
  77. package/src/lib/server/session-tools/email.ts +322 -0
  78. package/src/lib/server/session-tools/file.ts +5 -2
  79. package/src/lib/server/session-tools/git.ts +1 -1
  80. package/src/lib/server/session-tools/http.ts +1 -1
  81. package/src/lib/server/session-tools/image-gen.ts +382 -0
  82. package/src/lib/server/session-tools/index.ts +74 -49
  83. package/src/lib/server/session-tools/memory.ts +139 -2
  84. package/src/lib/server/session-tools/monitor.ts +1 -1
  85. package/src/lib/server/session-tools/openclaw-nodes.ts +1 -1
  86. package/src/lib/server/session-tools/openclaw-workspace.ts +1 -1
  87. package/src/lib/server/session-tools/platform.ts +6 -3
  88. package/src/lib/server/session-tools/plugin-creator.ts +3 -3
  89. package/src/lib/server/session-tools/replicate.ts +303 -0
  90. package/src/lib/server/session-tools/sample-ui.ts +1 -1
  91. package/src/lib/server/session-tools/sandbox.ts +4 -2
  92. package/src/lib/server/session-tools/schedule.ts +4 -2
  93. package/src/lib/server/session-tools/session-info.ts +7 -4
  94. package/src/lib/server/session-tools/shell.ts +5 -2
  95. package/src/lib/server/session-tools/subagent.ts +2 -2
  96. package/src/lib/server/session-tools/wallet.ts +29 -2
  97. package/src/lib/server/session-tools/web.ts +44 -5
  98. package/src/lib/server/storage.ts +29 -9
  99. package/src/lib/server/stream-agent-chat.ts +72 -249
  100. package/src/lib/server/tool-aliases.ts +26 -15
  101. package/src/lib/server/tool-capability-policy.test.ts +9 -9
  102. package/src/lib/server/tool-capability-policy.ts +32 -27
  103. package/src/lib/tool-definitions.ts +4 -0
  104. package/src/lib/validation/schemas.ts +3 -1
  105. package/src/stores/use-app-store.ts +5 -5
  106. package/src/stores/use-chat-store.ts +7 -7
  107. package/src/types/index.ts +65 -3
  108. /package/src/app/api/{sessions → chats}/[id]/browser/route.ts +0 -0
  109. /package/src/app/api/{sessions → chats}/[id]/chat/route.ts +0 -0
  110. /package/src/app/api/{sessions → chats}/[id]/clear/route.ts +0 -0
  111. /package/src/app/api/{sessions → chats}/[id]/deploy/route.ts +0 -0
  112. /package/src/app/api/{sessions → chats}/[id]/devserver/route.ts +0 -0
  113. /package/src/app/api/{sessions → chats}/[id]/edit-resend/route.ts +0 -0
  114. /package/src/app/api/{sessions → chats}/[id]/fork/route.ts +0 -0
  115. /package/src/app/api/{sessions → chats}/[id]/mailbox/route.ts +0 -0
  116. /package/src/app/api/{sessions → chats}/[id]/messages/route.ts +0 -0
  117. /package/src/app/api/{sessions → chats}/[id]/retry/route.ts +0 -0
  118. /package/src/app/api/{sessions → chats}/[id]/stop/route.ts +0 -0
  119. /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
- tools: DEFAULT_AGENTS[provider].tools,
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
- // Create/update __main__ chat for the first provider
343
+ // Set the default agent and open its thread
344
344
  const appState = useAppStore.getState()
345
- const currentUser = appState.currentUser
346
- if (currentUser && agentId) {
347
- const sessionMap = await api<Record<string, { id: string; name: string; user: string }>>('GET', '/sessions')
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, deleteSession, devServer, checkBrowser, stopBrowser } from '@/lib/sessions'
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?.tools?.includes('browser')) {
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?.tools?.length
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?.tools?.includes('browser')
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 deleteSession(sessionId)
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
- {!isMainChat && (
442
- <DropdownItem danger onClick={() => { setMenuOpen(false); setConfirmDelete(true) }}>
443
- Delete Chat
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={!isMainChat ? () => setConfirmDeleteAgent(true) : undefined}
504
- onDeleteChat={!isMainChat ? () => setConfirmDelete(true) : undefined}
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 SessionCard({ session, active, onClick }: Props) {
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', `/sessions/${session.id}`)
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.tools?.length ?? 0) > 0
77
+ && (session.plugins?.length ?? 0) > 0
78
78
  && intervalEnabled
79
79
  && session.heartbeatEnabled !== false
80
80
  && agent?.heartbeatEnabled !== false