@swarmclawai/swarmclaw 0.6.3 → 0.6.6

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 (106) hide show
  1. package/README.md +5 -3
  2. package/package.json +5 -1
  3. package/src/app/api/chatrooms/[id]/chat/route.ts +41 -2
  4. package/src/app/api/chatrooms/[id]/route.ts +15 -1
  5. package/src/app/api/chatrooms/route.ts +15 -2
  6. package/src/app/api/schedules/[id]/run/route.ts +3 -0
  7. package/src/app/api/tasks/route.ts +24 -0
  8. package/src/app/api/wallets/[id]/approve/route.ts +62 -0
  9. package/src/app/api/wallets/[id]/balance-history/route.ts +18 -0
  10. package/src/app/api/wallets/[id]/route.ts +118 -0
  11. package/src/app/api/wallets/[id]/send/route.ts +118 -0
  12. package/src/app/api/wallets/[id]/transactions/route.ts +18 -0
  13. package/src/app/api/wallets/route.ts +74 -0
  14. package/src/app/globals.css +8 -0
  15. package/src/app/page.tsx +7 -3
  16. package/src/cli/index.js +15 -0
  17. package/src/cli/spec.js +14 -0
  18. package/src/components/agents/agent-avatar.tsx +15 -1
  19. package/src/components/agents/agent-card.tsx +1 -0
  20. package/src/components/agents/agent-chat-list.tsx +1 -1
  21. package/src/components/agents/agent-sheet.tsx +112 -26
  22. package/src/components/auth/access-key-gate.tsx +22 -11
  23. package/src/components/chat/chat-area.tsx +2 -2
  24. package/src/components/chat/chat-header.tsx +48 -19
  25. package/src/components/chat/chat-tool-toggles.tsx +1 -1
  26. package/src/components/chat/delegation-banner.test.ts +27 -0
  27. package/src/components/chat/delegation-banner.tsx +109 -23
  28. package/src/components/chat/message-bubble.tsx +14 -3
  29. package/src/components/chat/message-list.tsx +5 -4
  30. package/src/components/chat/streaming-bubble.tsx +3 -2
  31. package/src/components/chat/thinking-indicator.tsx +3 -2
  32. package/src/components/chat/tool-call-bubble.test.ts +28 -0
  33. package/src/components/chat/tool-call-bubble.tsx +13 -1
  34. package/src/components/chat/transfer-agent-picker.tsx +1 -1
  35. package/src/components/chatrooms/agent-hover-card.tsx +1 -1
  36. package/src/components/chatrooms/chatroom-input.tsx +7 -6
  37. package/src/components/chatrooms/chatroom-message.tsx +1 -1
  38. package/src/components/chatrooms/chatroom-sheet.tsx +1 -1
  39. package/src/components/chatrooms/chatroom-typing-bar.tsx +1 -1
  40. package/src/components/chatrooms/chatroom-view.tsx +1 -1
  41. package/src/components/connectors/connector-list.tsx +1 -1
  42. package/src/components/home/home-view.tsx +2 -1
  43. package/src/components/input/chat-input.tsx +5 -4
  44. package/src/components/knowledge/knowledge-list.tsx +1 -1
  45. package/src/components/knowledge/knowledge-sheet.tsx +1 -1
  46. package/src/components/layout/app-layout.tsx +23 -9
  47. package/src/components/logs/log-list.tsx +7 -7
  48. package/src/components/memory/memory-agent-list.tsx +1 -1
  49. package/src/components/memory/memory-browser.tsx +1 -0
  50. package/src/components/memory/memory-card.tsx +3 -2
  51. package/src/components/memory/memory-detail.tsx +3 -3
  52. package/src/components/memory/memory-sheet.tsx +2 -2
  53. package/src/components/projects/project-detail.tsx +4 -4
  54. package/src/components/secrets/secret-sheet.tsx +1 -1
  55. package/src/components/secrets/secrets-list.tsx +1 -1
  56. package/src/components/sessions/new-session-sheet.tsx +4 -3
  57. package/src/components/sessions/session-card.tsx +1 -1
  58. package/src/components/shared/agent-picker-list.tsx +1 -1
  59. package/src/components/shared/agent-switch-dialog.tsx +1 -1
  60. package/src/components/shared/settings/section-user-preferences.tsx +4 -4
  61. package/src/components/skills/skill-list.tsx +1 -1
  62. package/src/components/skills/skill-sheet.tsx +1 -1
  63. package/src/components/tasks/task-board.tsx +3 -3
  64. package/src/components/tasks/task-sheet.tsx +21 -1
  65. package/src/components/wallets/wallet-approval-dialog.tsx +99 -0
  66. package/src/components/wallets/wallet-panel.tsx +616 -0
  67. package/src/components/wallets/wallet-section.tsx +100 -0
  68. package/src/hooks/use-media-query.ts +30 -4
  69. package/src/lib/api-client.ts +6 -18
  70. package/src/lib/fetch-timeout.ts +17 -0
  71. package/src/lib/notification-sounds.ts +4 -4
  72. package/src/lib/safe-storage.ts +42 -0
  73. package/src/lib/server/agent-registry.ts +2 -2
  74. package/src/lib/server/chat-execution.ts +35 -3
  75. package/src/lib/server/chatroom-health.ts +60 -0
  76. package/src/lib/server/chatroom-helpers.test.ts +94 -0
  77. package/src/lib/server/chatroom-helpers.ts +64 -11
  78. package/src/lib/server/connectors/inbound-audio-transcription.test.ts +191 -0
  79. package/src/lib/server/connectors/inbound-audio-transcription.ts +261 -0
  80. package/src/lib/server/connectors/manager.ts +80 -2
  81. package/src/lib/server/connectors/whatsapp-text.test.ts +29 -0
  82. package/src/lib/server/connectors/whatsapp-text.ts +26 -0
  83. package/src/lib/server/connectors/whatsapp.ts +8 -5
  84. package/src/lib/server/orchestrator-lg.ts +12 -2
  85. package/src/lib/server/orchestrator.ts +6 -1
  86. package/src/lib/server/queue-followups.test.ts +224 -0
  87. package/src/lib/server/queue.ts +226 -24
  88. package/src/lib/server/scheduler.ts +3 -0
  89. package/src/lib/server/session-tools/chatroom.ts +11 -2
  90. package/src/lib/server/session-tools/context-mgmt.ts +2 -2
  91. package/src/lib/server/session-tools/index.ts +6 -2
  92. package/src/lib/server/session-tools/memory.ts +1 -1
  93. package/src/lib/server/session-tools/shell.ts +1 -1
  94. package/src/lib/server/session-tools/wallet.ts +124 -0
  95. package/src/lib/server/session-tools/web-output.test.ts +29 -0
  96. package/src/lib/server/session-tools/web-output.ts +16 -0
  97. package/src/lib/server/session-tools/web.ts +7 -3
  98. package/src/lib/server/solana.ts +122 -0
  99. package/src/lib/server/storage.ts +38 -0
  100. package/src/lib/server/stream-agent-chat.ts +126 -63
  101. package/src/lib/server/task-mention.test.ts +41 -0
  102. package/src/lib/server/task-mention.ts +3 -2
  103. package/src/lib/tool-definitions.ts +1 -0
  104. package/src/lib/view-routes.ts +6 -1
  105. package/src/stores/use-app-store.ts +17 -11
  106. package/src/types/index.ts +60 -1
@@ -7,6 +7,7 @@ import { fetchAgents } from '../lib/agents'
7
7
  import { fetchSchedules } from '../lib/schedules'
8
8
  import { fetchTasks } from '../lib/tasks'
9
9
  import { api } from '../lib/api-client'
10
+ import { safeStorageGet, safeStorageGetJson, safeStorageRemove, safeStorageSet } from '../lib/safe-storage'
10
11
 
11
12
  interface AppState {
12
13
  currentUser: string | null
@@ -203,20 +204,23 @@ interface AppState {
203
204
  markAllNotificationsRead: () => Promise<void>
204
205
  clearReadNotifications: () => Promise<void>
205
206
 
207
+ // Wallets
208
+ walletPanelAgentId: string | null
209
+ setWalletPanelAgentId: (id: string | null) => void
210
+
206
211
  }
207
212
 
208
213
  export const useAppStore = create<AppState>((set, get) => ({
209
214
  currentUser: null,
210
215
  _hydrated: false,
211
216
  hydrate: () => {
212
- if (typeof window === 'undefined') return
213
- const user = localStorage.getItem('sc_user')
214
- const savedAgentId = localStorage.getItem('sc_agent')
217
+ const user = safeStorageGet('sc_user')
218
+ const savedAgentId = safeStorageGet('sc_agent')
215
219
  set({ currentUser: user, currentAgentId: savedAgentId, _hydrated: true })
216
220
  },
217
221
  setUser: (user) => {
218
- if (user) localStorage.setItem('sc_user', user)
219
- else localStorage.removeItem('sc_user')
222
+ if (user) safeStorageSet('sc_user', user)
223
+ else safeStorageRemove('sc_user')
220
224
  set({ currentUser: user })
221
225
  },
222
226
 
@@ -324,11 +328,11 @@ export const useAppStore = create<AppState>((set, get) => ({
324
328
  setCurrentAgent: async (id) => {
325
329
  if (!id) {
326
330
  set({ currentAgentId: null })
327
- if (typeof window !== 'undefined') localStorage.removeItem('sc_agent')
331
+ safeStorageRemove('sc_agent')
328
332
  return
329
333
  }
330
334
  set({ currentAgentId: id })
331
- if (typeof window !== 'undefined') localStorage.setItem('sc_agent', id)
335
+ safeStorageSet('sc_agent', id)
332
336
  try {
333
337
  const user = get().currentUser || 'default'
334
338
  const session = await api<Session>('POST', `/agents/${id}/thread`, { user })
@@ -628,13 +632,11 @@ export const useAppStore = create<AppState>((set, get) => ({
628
632
  },
629
633
 
630
634
  // Unread tracking
631
- lastReadTimestamps: typeof window !== 'undefined'
632
- ? (() => { try { return JSON.parse(localStorage.getItem('sc_last_read') || '{}') } catch { return {} } })()
633
- : {},
635
+ lastReadTimestamps: safeStorageGetJson<Record<string, number>>('sc_last_read', {}),
634
636
  markChatRead: (id) => {
635
637
  const ts = { ...get().lastReadTimestamps, [id]: Date.now() }
636
638
  set({ lastReadTimestamps: ts })
637
- try { localStorage.setItem('sc_last_read', JSON.stringify(ts)) } catch { /* ignore */ }
639
+ safeStorageSet('sc_last_read', JSON.stringify(ts))
638
640
  },
639
641
 
640
642
  // Notifications
@@ -686,4 +688,8 @@ export const useAppStore = create<AppState>((set, get) => ({
686
688
  }
687
689
  },
688
690
 
691
+ // Wallets
692
+ walletPanelAgentId: null,
693
+ setWalletPanelAgentId: (id) => set({ walletPanelAgentId: id }),
694
+
689
695
  }))
@@ -264,16 +264,64 @@ export interface Agent {
264
264
  elevenLabsVoiceId?: string | null
265
265
  projectId?: string
266
266
  avatarSeed?: string
267
+ avatarUrl?: string | null
267
268
  pinned?: boolean
268
269
  lastUsedAt?: number
269
270
  totalCost?: number
270
271
  trashedAt?: number
271
272
  openclawSkillMode?: SkillAllowlistMode
272
273
  openclawAllowedSkills?: string[]
274
+ walletId?: string | null
273
275
  createdAt: number
274
276
  updatedAt: number
275
277
  }
276
278
 
279
+ // --- Agent Wallets ---
280
+
281
+ export type WalletChain = 'solana'
282
+
283
+ export interface AgentWallet {
284
+ id: string
285
+ agentId: string
286
+ chain: WalletChain
287
+ publicKey: string
288
+ encryptedPrivateKey: string // AES-256-GCM via encryptKey()
289
+ label?: string
290
+ spendingLimitLamports?: number // per-tx cap (default 0.1 SOL = 100_000_000)
291
+ dailyLimitLamports?: number // 24h rolling cap (default 1 SOL = 1_000_000_000)
292
+ requireApproval: boolean // default true
293
+ createdAt: number
294
+ updatedAt: number
295
+ }
296
+
297
+ export type WalletTransactionType = 'send' | 'receive' | 'swap'
298
+ export type WalletTransactionStatus = 'pending_approval' | 'pending' | 'confirmed' | 'failed' | 'denied'
299
+
300
+ export interface WalletTransaction {
301
+ id: string
302
+ walletId: string
303
+ agentId: string
304
+ chain: WalletChain
305
+ type: WalletTransactionType
306
+ signature: string
307
+ fromAddress: string
308
+ toAddress: string
309
+ amountLamports: number
310
+ feeLamports?: number
311
+ status: WalletTransactionStatus
312
+ memo?: string // agent's reason for tx
313
+ approvedBy?: 'user' | 'auto'
314
+ tokenMint?: string // null = native SOL
315
+ timestamp: number
316
+ }
317
+
318
+ export interface WalletBalanceSnapshot {
319
+ id: string
320
+ walletId: string
321
+ balanceLamports: number
322
+ timestamp: number
323
+ }
324
+
277
325
  export type AgentTool = 'browser'
278
326
 
279
327
  export interface ClaudeSkill {
@@ -356,7 +404,7 @@ export interface MemoryEntry {
356
404
  }
357
405
 
358
406
  export type SessionType = 'human' | 'orchestrated'
359
- export type AppView = 'home' | 'agents' | 'chatrooms' | 'schedules' | 'memory' | 'tasks' | 'secrets' | 'providers' | 'skills' | 'connectors' | 'webhooks' | 'mcp_servers' | 'knowledge' | 'plugins' | 'usage' | 'runs' | 'logs' | 'settings' | 'projects' | 'activity'
407
+ export type AppView = 'home' | 'agents' | 'chatrooms' | 'schedules' | 'memory' | 'tasks' | 'secrets' | 'providers' | 'skills' | 'connectors' | 'webhooks' | 'mcp_servers' | 'knowledge' | 'plugins' | 'usage' | 'wallets' | 'runs' | 'logs' | 'settings' | 'projects' | 'activity'
360
408
 
361
409
  // --- Chatrooms ---
362
410
 
@@ -646,6 +694,8 @@ export interface MessageSource {
646
694
  platform: ConnectorPlatform
647
695
  connectorId: string
648
696
  connectorName: string
697
+ channelId?: string
698
+ senderId?: string
649
699
  senderName?: string
650
700
  }
651
701
 
@@ -711,8 +761,17 @@ export interface BoardTask {
711
761
  completionReportPath?: string | null
712
762
  result?: string | null
713
763
  error?: string | null
764
+ outputFiles?: string[]
765
+ artifacts?: Array<{
766
+ url: string
767
+ type: 'image' | 'video' | 'pdf' | 'file'
768
+ filename: string
769
+ }>
714
770
  comments?: TaskComment[]
715
771
  images?: string[]
772
+ createdByAgentId?: string | null
773
+ createdInSessionId?: string | null
774
+ delegatedByAgentId?: string | null
716
775
  createdAt: number
717
776
  updatedAt: number
718
777
  queuedAt?: number | null