@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.
- package/README.md +5 -3
- package/package.json +5 -1
- package/src/app/api/chatrooms/[id]/chat/route.ts +41 -2
- package/src/app/api/chatrooms/[id]/route.ts +15 -1
- package/src/app/api/chatrooms/route.ts +15 -2
- package/src/app/api/schedules/[id]/run/route.ts +3 -0
- package/src/app/api/tasks/route.ts +24 -0
- package/src/app/api/wallets/[id]/approve/route.ts +62 -0
- package/src/app/api/wallets/[id]/balance-history/route.ts +18 -0
- package/src/app/api/wallets/[id]/route.ts +118 -0
- package/src/app/api/wallets/[id]/send/route.ts +118 -0
- package/src/app/api/wallets/[id]/transactions/route.ts +18 -0
- package/src/app/api/wallets/route.ts +74 -0
- package/src/app/globals.css +8 -0
- package/src/app/page.tsx +7 -3
- package/src/cli/index.js +15 -0
- package/src/cli/spec.js +14 -0
- package/src/components/agents/agent-avatar.tsx +15 -1
- package/src/components/agents/agent-card.tsx +1 -0
- package/src/components/agents/agent-chat-list.tsx +1 -1
- package/src/components/agents/agent-sheet.tsx +112 -26
- package/src/components/auth/access-key-gate.tsx +22 -11
- package/src/components/chat/chat-area.tsx +2 -2
- package/src/components/chat/chat-header.tsx +48 -19
- package/src/components/chat/chat-tool-toggles.tsx +1 -1
- package/src/components/chat/delegation-banner.test.ts +27 -0
- package/src/components/chat/delegation-banner.tsx +109 -23
- package/src/components/chat/message-bubble.tsx +14 -3
- package/src/components/chat/message-list.tsx +5 -4
- package/src/components/chat/streaming-bubble.tsx +3 -2
- package/src/components/chat/thinking-indicator.tsx +3 -2
- package/src/components/chat/tool-call-bubble.test.ts +28 -0
- package/src/components/chat/tool-call-bubble.tsx +13 -1
- package/src/components/chat/transfer-agent-picker.tsx +1 -1
- package/src/components/chatrooms/agent-hover-card.tsx +1 -1
- package/src/components/chatrooms/chatroom-input.tsx +7 -6
- package/src/components/chatrooms/chatroom-message.tsx +1 -1
- package/src/components/chatrooms/chatroom-sheet.tsx +1 -1
- package/src/components/chatrooms/chatroom-typing-bar.tsx +1 -1
- package/src/components/chatrooms/chatroom-view.tsx +1 -1
- package/src/components/connectors/connector-list.tsx +1 -1
- package/src/components/home/home-view.tsx +2 -1
- package/src/components/input/chat-input.tsx +5 -4
- package/src/components/knowledge/knowledge-list.tsx +1 -1
- package/src/components/knowledge/knowledge-sheet.tsx +1 -1
- package/src/components/layout/app-layout.tsx +23 -9
- package/src/components/logs/log-list.tsx +7 -7
- package/src/components/memory/memory-agent-list.tsx +1 -1
- package/src/components/memory/memory-browser.tsx +1 -0
- package/src/components/memory/memory-card.tsx +3 -2
- package/src/components/memory/memory-detail.tsx +3 -3
- package/src/components/memory/memory-sheet.tsx +2 -2
- package/src/components/projects/project-detail.tsx +4 -4
- package/src/components/secrets/secret-sheet.tsx +1 -1
- package/src/components/secrets/secrets-list.tsx +1 -1
- package/src/components/sessions/new-session-sheet.tsx +4 -3
- package/src/components/sessions/session-card.tsx +1 -1
- package/src/components/shared/agent-picker-list.tsx +1 -1
- package/src/components/shared/agent-switch-dialog.tsx +1 -1
- package/src/components/shared/settings/section-user-preferences.tsx +4 -4
- package/src/components/skills/skill-list.tsx +1 -1
- package/src/components/skills/skill-sheet.tsx +1 -1
- package/src/components/tasks/task-board.tsx +3 -3
- package/src/components/tasks/task-sheet.tsx +21 -1
- package/src/components/wallets/wallet-approval-dialog.tsx +99 -0
- package/src/components/wallets/wallet-panel.tsx +616 -0
- package/src/components/wallets/wallet-section.tsx +100 -0
- package/src/hooks/use-media-query.ts +30 -4
- package/src/lib/api-client.ts +6 -18
- package/src/lib/fetch-timeout.ts +17 -0
- package/src/lib/notification-sounds.ts +4 -4
- package/src/lib/safe-storage.ts +42 -0
- package/src/lib/server/agent-registry.ts +2 -2
- package/src/lib/server/chat-execution.ts +35 -3
- package/src/lib/server/chatroom-health.ts +60 -0
- package/src/lib/server/chatroom-helpers.test.ts +94 -0
- package/src/lib/server/chatroom-helpers.ts +64 -11
- package/src/lib/server/connectors/inbound-audio-transcription.test.ts +191 -0
- package/src/lib/server/connectors/inbound-audio-transcription.ts +261 -0
- package/src/lib/server/connectors/manager.ts +80 -2
- package/src/lib/server/connectors/whatsapp-text.test.ts +29 -0
- package/src/lib/server/connectors/whatsapp-text.ts +26 -0
- package/src/lib/server/connectors/whatsapp.ts +8 -5
- package/src/lib/server/orchestrator-lg.ts +12 -2
- package/src/lib/server/orchestrator.ts +6 -1
- package/src/lib/server/queue-followups.test.ts +224 -0
- package/src/lib/server/queue.ts +226 -24
- package/src/lib/server/scheduler.ts +3 -0
- package/src/lib/server/session-tools/chatroom.ts +11 -2
- package/src/lib/server/session-tools/context-mgmt.ts +2 -2
- package/src/lib/server/session-tools/index.ts +6 -2
- package/src/lib/server/session-tools/memory.ts +1 -1
- package/src/lib/server/session-tools/shell.ts +1 -1
- package/src/lib/server/session-tools/wallet.ts +124 -0
- package/src/lib/server/session-tools/web-output.test.ts +29 -0
- package/src/lib/server/session-tools/web-output.ts +16 -0
- package/src/lib/server/session-tools/web.ts +7 -3
- package/src/lib/server/solana.ts +122 -0
- package/src/lib/server/storage.ts +38 -0
- package/src/lib/server/stream-agent-chat.ts +126 -63
- package/src/lib/server/task-mention.test.ts +41 -0
- package/src/lib/server/task-mention.ts +3 -2
- package/src/lib/tool-definitions.ts +1 -0
- package/src/lib/view-routes.ts +6 -1
- package/src/stores/use-app-store.ts +17 -11
- 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
|
-
|
|
213
|
-
const
|
|
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)
|
|
219
|
-
else
|
|
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
|
-
|
|
331
|
+
safeStorageRemove('sc_agent')
|
|
328
332
|
return
|
|
329
333
|
}
|
|
330
334
|
set({ currentAgentId: id })
|
|
331
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
}))
|
package/src/types/index.ts
CHANGED
|
@@ -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
|