@swarmclawai/swarmclaw 0.7.1 → 0.7.3
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 +155 -150
- package/package.json +1 -1
- package/src/app/api/agents/[id]/route.ts +26 -0
- package/src/app/api/agents/[id]/thread/route.ts +37 -9
- package/src/app/api/agents/route.ts +13 -2
- package/src/app/api/auth/route.ts +76 -7
- package/src/app/api/chatrooms/[id]/chat/route.ts +7 -2
- package/src/app/api/{sessions → chats}/[id]/browser/route.ts +5 -1
- package/src/app/api/{sessions → chats}/[id]/chat/route.ts +7 -3
- package/src/app/api/{sessions → chats}/[id]/checkpoints/route.ts +1 -1
- package/src/app/api/chats/[id]/main-loop/route.ts +13 -0
- package/src/app/api/{sessions → chats}/[id]/messages/route.ts +19 -13
- package/src/app/api/{sessions → chats}/[id]/restore/route.ts +1 -1
- package/src/app/api/{sessions → chats}/[id]/route.ts +22 -52
- package/src/app/api/{sessions → chats}/[id]/stop/route.ts +6 -1
- package/src/app/api/{sessions → chats}/route.ts +21 -7
- package/src/app/api/connectors/[id]/doctor/route.ts +26 -0
- package/src/app/api/connectors/doctor/route.ts +13 -0
- package/src/app/api/files/open/route.ts +16 -14
- package/src/app/api/memory/maintenance/route.ts +11 -1
- package/src/app/api/openclaw/agent-files/route.ts +27 -4
- package/src/app/api/openclaw/skills/route.ts +11 -3
- package/src/app/api/plugins/dependencies/route.ts +24 -0
- package/src/app/api/plugins/install/route.ts +15 -92
- package/src/app/api/plugins/route.ts +6 -26
- package/src/app/api/plugins/settings/route.ts +40 -0
- package/src/app/api/plugins/ui/route.ts +1 -0
- package/src/app/api/settings/route.ts +49 -7
- package/src/app/api/tasks/[id]/route.ts +15 -6
- package/src/app/api/tasks/bulk/route.ts +2 -2
- package/src/app/api/tasks/route.ts +9 -4
- package/src/app/api/usage/route.ts +30 -0
- package/src/app/api/webhooks/[id]/route.ts +8 -1
- package/src/app/page.tsx +9 -2
- package/src/cli/index.js +39 -33
- package/src/cli/index.ts +43 -49
- package/src/cli/spec.js +29 -27
- package/src/components/agents/agent-card.tsx +16 -13
- package/src/components/agents/agent-chat-list.tsx +104 -4
- package/src/components/agents/agent-list.tsx +54 -22
- package/src/components/agents/agent-sheet.tsx +209 -18
- package/src/components/agents/cron-job-form.tsx +3 -3
- package/src/components/agents/inspector-panel.tsx +110 -50
- package/src/components/auth/access-key-gate.tsx +36 -97
- package/src/components/auth/setup-wizard.tsx +5 -38
- package/src/components/chat/chat-area.tsx +39 -27
- package/src/components/{sessions/session-card.tsx → chat/chat-card.tsx} +7 -23
- package/src/components/chat/chat-header.tsx +299 -314
- package/src/components/{sessions/session-list.tsx → chat/chat-list.tsx} +11 -14
- 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 +5 -3
- 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/chatrooms/chatroom-view.tsx +347 -205
- package/src/components/connectors/connector-list.tsx +265 -127
- package/src/components/connectors/connector-sheet.tsx +218 -1
- package/src/components/home/home-view.tsx +129 -5
- package/src/components/layout/app-layout.tsx +392 -182
- package/src/components/layout/mobile-header.tsx +26 -8
- package/src/components/plugins/plugin-list.tsx +487 -254
- package/src/components/plugins/plugin-sheet.tsx +236 -13
- package/src/components/projects/project-detail.tsx +183 -0
- package/src/components/settings/gateway-connection-panel.tsx +1 -1
- package/src/components/shared/agent-picker-list.tsx +2 -2
- package/src/components/shared/command-palette.tsx +111 -25
- package/src/components/shared/settings/plugin-manager.tsx +20 -4
- package/src/components/shared/settings/section-capability-policy.tsx +105 -0
- package/src/components/shared/settings/section-heartbeat.tsx +78 -1
- package/src/components/shared/settings/section-orchestrator.tsx +3 -3
- package/src/components/shared/settings/section-providers.tsx +1 -1
- package/src/components/shared/settings/section-runtime-loop.tsx +5 -5
- package/src/components/shared/settings/section-secrets.tsx +6 -6
- package/src/components/shared/settings/section-user-preferences.tsx +1 -1
- package/src/components/shared/settings/section-voice.tsx +5 -1
- package/src/components/shared/settings/section-web-search.tsx +10 -2
- package/src/components/shared/settings/settings-page.tsx +244 -56
- package/src/components/tasks/approvals-panel.tsx +205 -18
- package/src/components/tasks/task-board.tsx +242 -46
- package/src/components/usage/metrics-dashboard.tsx +147 -1
- package/src/components/wallets/wallet-panel.tsx +17 -5
- package/src/components/webhooks/webhook-sheet.tsx +8 -8
- package/src/lib/auth.ts +17 -0
- package/src/lib/chat-streaming-state.test.ts +108 -0
- package/src/lib/chat-streaming-state.ts +108 -0
- package/src/lib/chat.ts +1 -1
- package/src/lib/{sessions.ts → chats.ts} +28 -18
- package/src/lib/openclaw-agent-id.test.ts +14 -0
- package/src/lib/openclaw-agent-id.ts +31 -0
- package/src/lib/providers/claude-cli.ts +1 -1
- package/src/lib/server/agent-assignment.test.ts +112 -0
- package/src/lib/server/agent-assignment.ts +169 -0
- package/src/lib/server/approval-connector-notify.test.ts +253 -0
- package/src/lib/server/approvals-auto-approve.test.ts +205 -0
- package/src/lib/server/approvals.ts +483 -75
- package/src/lib/server/autonomy-runtime.test.ts +341 -0
- package/src/lib/server/browser-state.test.ts +118 -0
- package/src/lib/server/browser-state.ts +123 -0
- package/src/lib/server/build-llm.test.ts +36 -0
- package/src/lib/server/build-llm.ts +11 -4
- package/src/lib/server/builtin-plugins.ts +34 -0
- package/src/lib/server/capability-router.ts +10 -8
- package/src/lib/server/chat-execution-heartbeat.test.ts +40 -0
- package/src/lib/server/chat-execution-tool-events.test.ts +134 -0
- package/src/lib/server/chat-execution.ts +285 -165
- package/src/lib/server/chatroom-health.test.ts +26 -0
- package/src/lib/server/chatroom-health.ts +2 -3
- package/src/lib/server/chatroom-helpers.test.ts +67 -2
- package/src/lib/server/chatroom-helpers.ts +48 -8
- package/src/lib/server/connectors/discord.ts +175 -11
- package/src/lib/server/connectors/doctor.test.ts +80 -0
- package/src/lib/server/connectors/doctor.ts +116 -0
- package/src/lib/server/connectors/manager.ts +948 -112
- package/src/lib/server/connectors/policy.test.ts +222 -0
- package/src/lib/server/connectors/policy.ts +452 -0
- package/src/lib/server/connectors/slack.ts +188 -9
- package/src/lib/server/connectors/telegram.ts +65 -15
- package/src/lib/server/connectors/thread-context.test.ts +44 -0
- package/src/lib/server/connectors/thread-context.ts +72 -0
- package/src/lib/server/connectors/types.ts +41 -11
- package/src/lib/server/cost.ts +34 -1
- package/src/lib/server/daemon-state.ts +61 -3
- package/src/lib/server/data-dir.ts +13 -0
- package/src/lib/server/delegation-jobs.test.ts +140 -0
- package/src/lib/server/delegation-jobs.ts +248 -0
- package/src/lib/server/document-utils.test.ts +47 -0
- package/src/lib/server/document-utils.ts +397 -0
- package/src/lib/server/heartbeat-service.ts +14 -40
- package/src/lib/server/heartbeat-source.test.ts +22 -0
- package/src/lib/server/heartbeat-source.ts +7 -0
- package/src/lib/server/identity-continuity.test.ts +77 -0
- package/src/lib/server/identity-continuity.ts +127 -0
- package/src/lib/server/mailbox-utils.ts +347 -0
- package/src/lib/server/main-agent-loop.ts +28 -1103
- package/src/lib/server/memory-db.ts +4 -6
- package/src/lib/server/memory-tiers.ts +40 -0
- package/src/lib/server/openclaw-agent-resolver.test.ts +70 -0
- package/src/lib/server/openclaw-agent-resolver.ts +128 -0
- package/src/lib/server/openclaw-exec-config.ts +5 -6
- package/src/lib/server/openclaw-skills-normalize.test.ts +56 -0
- package/src/lib/server/openclaw-skills-normalize.ts +136 -0
- package/src/lib/server/openclaw-sync.ts +3 -2
- package/src/lib/server/orchestrator-lg.ts +20 -9
- package/src/lib/server/orchestrator.ts +7 -7
- package/src/lib/server/playwright-proxy.mjs +27 -3
- package/src/lib/server/plugins.test.ts +207 -0
- package/src/lib/server/plugins.ts +927 -66
- package/src/lib/server/provider-health.ts +38 -6
- package/src/lib/server/queue.ts +13 -28
- package/src/lib/server/scheduler.ts +2 -0
- package/src/lib/server/session-archive-memory.test.ts +85 -0
- package/src/lib/server/session-archive-memory.ts +230 -0
- package/src/lib/server/session-mailbox.ts +8 -18
- package/src/lib/server/session-reset-policy.test.ts +99 -0
- package/src/lib/server/session-reset-policy.ts +311 -0
- package/src/lib/server/session-run-manager.ts +33 -82
- package/src/lib/server/session-tools/autonomy-tools.test.ts +105 -0
- package/src/lib/server/session-tools/calendar.ts +366 -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 +114 -10
- package/src/lib/server/session-tools/context.ts +21 -5
- package/src/lib/server/session-tools/crawl.ts +447 -0
- package/src/lib/server/session-tools/crud.ts +74 -28
- package/src/lib/server/session-tools/delegate-fallback.test.ts +219 -0
- package/src/lib/server/session-tools/delegate.ts +497 -24
- package/src/lib/server/session-tools/discovery.ts +24 -6
- package/src/lib/server/session-tools/document.ts +283 -0
- package/src/lib/server/session-tools/edit_file.ts +4 -2
- package/src/lib/server/session-tools/email.ts +320 -0
- package/src/lib/server/session-tools/extract.ts +137 -0
- package/src/lib/server/session-tools/file-normalize.test.ts +93 -0
- package/src/lib/server/session-tools/file-send.test.ts +84 -1
- package/src/lib/server/session-tools/file.ts +241 -25
- 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/human-loop.ts +227 -0
- package/src/lib/server/session-tools/image-gen.ts +380 -0
- package/src/lib/server/session-tools/index.ts +130 -50
- package/src/lib/server/session-tools/mailbox.ts +276 -0
- package/src/lib/server/session-tools/memory.ts +172 -3
- package/src/lib/server/session-tools/monitor.ts +151 -8
- package/src/lib/server/session-tools/normalize-tool-args.ts +17 -14
- 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-normalize.test.ts +142 -0
- package/src/lib/server/session-tools/platform.ts +148 -7
- package/src/lib/server/session-tools/plugin-creator.ts +89 -26
- package/src/lib/server/session-tools/primitive-tools.test.ts +257 -0
- package/src/lib/server/session-tools/replicate.ts +301 -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 +24 -12
- package/src/lib/server/session-tools/session-info.ts +43 -7
- package/src/lib/server/session-tools/session-tools-wiring.test.ts +31 -17
- package/src/lib/server/session-tools/shell.ts +5 -2
- package/src/lib/server/session-tools/subagent.ts +194 -28
- package/src/lib/server/session-tools/table.ts +587 -0
- package/src/lib/server/session-tools/wallet.ts +42 -12
- package/src/lib/server/session-tools/web-browser-config.test.ts +39 -0
- package/src/lib/server/session-tools/web.ts +926 -91
- package/src/lib/server/storage.ts +255 -16
- package/src/lib/server/stream-agent-chat.ts +116 -268
- package/src/lib/server/structured-extract.test.ts +72 -0
- package/src/lib/server/structured-extract.ts +373 -0
- package/src/lib/server/task-mention.test.ts +16 -2
- package/src/lib/server/task-mention.ts +61 -10
- package/src/lib/server/tool-aliases.ts +66 -18
- package/src/lib/server/tool-capability-policy.test.ts +9 -9
- package/src/lib/server/tool-capability-policy.ts +38 -27
- package/src/lib/server/tool-retry.ts +2 -0
- package/src/lib/server/watch-jobs.test.ts +173 -0
- package/src/lib/server/watch-jobs.ts +532 -0
- package/src/lib/server/ws-hub.ts +5 -3
- package/src/lib/tool-definitions.ts +4 -0
- package/src/lib/validation/schemas.test.ts +26 -0
- package/src/lib/validation/schemas.ts +10 -1
- package/src/lib/ws-client.ts +14 -12
- package/src/proxy.ts +5 -5
- package/src/stores/use-app-store.ts +5 -11
- package/src/stores/use-chat-store.ts +38 -9
- package/src/types/index.ts +352 -47
- package/src/app/api/sessions/[id]/main-loop/route.ts +0 -94
- package/src/components/sessions/new-session-sheet.tsx +0 -253
- package/src/lib/server/main-session.ts +0 -24
- package/src/lib/server/session-run-manager.test.ts +0 -23
- /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]/retry/route.ts +0 -0
- /package/src/app/api/{sessions → chats}/heartbeat/route.ts +0 -0
|
@@ -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'
|
|
@@ -22,12 +22,20 @@ import { Dropdown, DropdownItem } from '@/components/shared/dropdown'
|
|
|
22
22
|
import { ConfirmDialog } from '@/components/shared/confirm-dialog'
|
|
23
23
|
import { speak } from '@/lib/tts'
|
|
24
24
|
import { api } from '@/lib/api-client'
|
|
25
|
+
import { messagesDiffer } from '@/lib/chat-streaming-state'
|
|
25
26
|
|
|
26
|
-
const
|
|
27
|
+
const DIRECT_PROMPT_SUGGESTIONS = [
|
|
27
28
|
{ text: 'What can you help me with?', icon: 'book', gradient: 'from-[#6366F1]/10 to-[#818CF8]/5' },
|
|
29
|
+
{ text: 'Help me choose the right agent for this', icon: 'bot', gradient: 'from-[#34D399]/10 to-[#6EE7B7]/5' },
|
|
28
30
|
{ text: 'Help me set up a new connector', icon: 'link', gradient: 'from-[#EC4899]/10 to-[#F472B6]/5' },
|
|
29
|
-
{ text: '
|
|
30
|
-
|
|
31
|
+
{ text: 'Summarize what needs attention in this workspace', icon: 'check', gradient: 'from-[#F59E0B]/10 to-[#FBBF24]/5' },
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
const AGENT_PROMPT_SUGGESTIONS = [
|
|
35
|
+
{ text: 'Give me a quick overview of what you can help with', icon: 'book', gradient: 'from-[#6366F1]/10 to-[#818CF8]/5' },
|
|
36
|
+
{ text: 'Review what needs attention right now', icon: 'check', gradient: 'from-[#F59E0B]/10 to-[#FBBF24]/5' },
|
|
37
|
+
{ text: 'Summarize our recent context before we continue', icon: 'link', gradient: 'from-[#EC4899]/10 to-[#F472B6]/5' },
|
|
38
|
+
{ text: 'Help me map the next best step', icon: 'bot', gradient: 'from-[#34D399]/10 to-[#6EE7B7]/5' },
|
|
31
39
|
]
|
|
32
40
|
|
|
33
41
|
export function ChatArea() {
|
|
@@ -52,6 +60,10 @@ export function ChatArea() {
|
|
|
52
60
|
const sidebarOpen = useAppStore((s) => s.sidebarOpen)
|
|
53
61
|
const setSidebarOpen = useAppStore((s) => s.setSidebarOpen)
|
|
54
62
|
const currentAgent = session?.agentId ? agents[session.agentId] ?? null : null
|
|
63
|
+
const promptSuggestions = useMemo(
|
|
64
|
+
() => (currentAgent ? AGENT_PROMPT_SUGGESTIONS : DIRECT_PROMPT_SUGGESTIONS),
|
|
65
|
+
[currentAgent],
|
|
66
|
+
)
|
|
55
67
|
|
|
56
68
|
const voice = useVoiceConversation()
|
|
57
69
|
const handleVoiceToggle = useCallback(() => {
|
|
@@ -133,20 +145,19 @@ export function ChatArea() {
|
|
|
133
145
|
setDevServer(r.running ? r : null)
|
|
134
146
|
}).catch(() => setDevServer(null))
|
|
135
147
|
// Check browser status
|
|
136
|
-
if (session?.
|
|
148
|
+
if (session?.plugins?.includes('browser')) {
|
|
137
149
|
checkBrowser(sessionId).then((r) => setBrowserActive(r.active)).catch((err) => { console.error('Browser check failed:', err); setBrowserActive(false) })
|
|
138
150
|
} else {
|
|
139
151
|
setBrowserActive(false)
|
|
140
152
|
}
|
|
141
153
|
}, [sessionId])
|
|
142
154
|
|
|
143
|
-
// Auto-poll messages for
|
|
144
|
-
const isOrchestrated = session?.sessionType === 'orchestrated'
|
|
155
|
+
// Auto-poll messages for sessions that are actively running on the server
|
|
145
156
|
const isServerActive = session?.active === true
|
|
146
|
-
const isOngoingMonitored = appSettings.loopMode === 'ongoing' && !!session?.
|
|
147
|
-
const shouldPollMessages = !!sessionId && (
|
|
148
|
-
const
|
|
149
|
-
|
|
157
|
+
const isOngoingMonitored = appSettings.loopMode === 'ongoing' && !!session?.plugins?.length
|
|
158
|
+
const shouldPollMessages = !!sessionId && (isServerActive || isOngoingMonitored)
|
|
159
|
+
const messagesRef = useRef(messages)
|
|
160
|
+
messagesRef.current = messages
|
|
150
161
|
const isServerActiveRef = useRef(isServerActive)
|
|
151
162
|
isServerActiveRef.current = isServerActive
|
|
152
163
|
const ttsEnabledRef = useRef(ttsEnabled)
|
|
@@ -156,8 +167,9 @@ export function ChatArea() {
|
|
|
156
167
|
if (!sessionId) return
|
|
157
168
|
try {
|
|
158
169
|
const msgs = await fetchMessages(sessionId)
|
|
159
|
-
|
|
160
|
-
|
|
170
|
+
const previous = messagesRef.current
|
|
171
|
+
if (messagesDiffer(msgs, previous)) {
|
|
172
|
+
const newMsgs = msgs.length > previous.length ? msgs.slice(previous.length) : []
|
|
161
173
|
setMessages(msgs)
|
|
162
174
|
if (ttsEnabledRef.current && typeof document !== 'undefined' && document.visibilityState === 'visible') {
|
|
163
175
|
const latestAssistant = [...newMsgs].reverse().find((m) => {
|
|
@@ -200,7 +212,7 @@ export function ChatArea() {
|
|
|
200
212
|
}, [isServerActive, sessionId])
|
|
201
213
|
|
|
202
214
|
// Poll browser status while session has browser tools
|
|
203
|
-
const hasBrowserTool = session?.
|
|
215
|
+
const hasBrowserTool = session?.plugins?.includes('browser')
|
|
204
216
|
const checkBrowserStatus = useCallback(() => {
|
|
205
217
|
if (!sessionId || !hasBrowserTool) return
|
|
206
218
|
checkBrowser(sessionId).then((r) => setBrowserActive(r.active)).catch(() => {})
|
|
@@ -235,7 +247,7 @@ export function ChatArea() {
|
|
|
235
247
|
const handleDelete = useCallback(async () => {
|
|
236
248
|
setConfirmDelete(false)
|
|
237
249
|
if (!sessionId) return
|
|
238
|
-
await
|
|
250
|
+
await deleteChat(sessionId)
|
|
239
251
|
removeSessionFromStore(sessionId)
|
|
240
252
|
setCurrentSession(null)
|
|
241
253
|
}, [sessionId])
|
|
@@ -281,7 +293,6 @@ export function ChatArea() {
|
|
|
281
293
|
if (!session) return null
|
|
282
294
|
|
|
283
295
|
const streamingForThisSession = streaming && (!streamingSessionId || streamingSessionId === session.id)
|
|
284
|
-
const isMainChat = session.name === '__main__'
|
|
285
296
|
const isEmpty = !messages.length && !streamingForThisSession && !messagesLoading
|
|
286
297
|
|
|
287
298
|
return (
|
|
@@ -386,15 +397,19 @@ export function ChatArea() {
|
|
|
386
397
|
<h1 className="font-display text-[28px] md:text-[36px] font-800 leading-[1.1] tracking-[-0.04em] mb-3">
|
|
387
398
|
Hi{currentUser ? ', ' : ' '}<span className="text-accent-bright">{currentUser || 'there'}</span>
|
|
388
399
|
<br />
|
|
389
|
-
<span className="text-text-2">
|
|
400
|
+
<span className="text-text-2">
|
|
401
|
+
{currentAgent ? `Start with ${currentAgent.name}` : 'Start the conversation'}
|
|
402
|
+
</span>
|
|
390
403
|
</h1>
|
|
391
404
|
<p className="text-[13px] text-text-3 mt-2">
|
|
392
|
-
|
|
405
|
+
{currentAgent
|
|
406
|
+
? `Ask ${currentAgent.name} anything, hand over work, or start with one of these openers.`
|
|
407
|
+
: 'Pick a prompt or type your own below.'}
|
|
393
408
|
</p>
|
|
394
409
|
</div>
|
|
395
410
|
|
|
396
411
|
<div className="relative grid grid-cols-2 md:grid-cols-4 gap-3 max-w-[640px] w-full mb-6">
|
|
397
|
-
{
|
|
412
|
+
{promptSuggestions.map((prompt, i) => (
|
|
398
413
|
<button
|
|
399
414
|
key={prompt.text}
|
|
400
415
|
onClick={() => handlePrompt(prompt.text)}
|
|
@@ -438,11 +453,9 @@ export function ChatArea() {
|
|
|
438
453
|
<DropdownItem onClick={() => { setMenuOpen(false); setConfirmClear(true) }}>
|
|
439
454
|
Clear History
|
|
440
455
|
</DropdownItem>
|
|
441
|
-
{
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
</DropdownItem>
|
|
445
|
-
)}
|
|
456
|
+
<DropdownItem danger onClick={() => { setMenuOpen(false); setConfirmDelete(true) }}>
|
|
457
|
+
Delete Chat
|
|
458
|
+
</DropdownItem>
|
|
446
459
|
</Dropdown>
|
|
447
460
|
|
|
448
461
|
<ConfirmDialog
|
|
@@ -500,9 +513,8 @@ export function ChatArea() {
|
|
|
500
513
|
agent={currentAgent}
|
|
501
514
|
onEditAgent={() => { setEditingAgentId(session.agentId!); setAgentSheetOpen(true) }}
|
|
502
515
|
onClearHistory={() => setConfirmClear(true)}
|
|
503
|
-
onDeleteAgent={
|
|
504
|
-
onDeleteChat={
|
|
505
|
-
isMainChat={isMainChat}
|
|
516
|
+
onDeleteAgent={() => setConfirmDeleteAgent(true)}
|
|
517
|
+
onDeleteChat={() => setConfirmDelete(true)}
|
|
506
518
|
/>
|
|
507
519
|
)}
|
|
508
520
|
{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) {
|
|
@@ -66,6 +66,9 @@ export function SessionCard({ session, active, onClick }: Props) {
|
|
|
66
66
|
: 'No messages'
|
|
67
67
|
const providerLabel = PROVIDER_LABELS[session.provider] || session.provider
|
|
68
68
|
const agent = session.agentId ? agents[session.agentId] : null
|
|
69
|
+
const displayName = session.shortcutForAgentId && agent?.id === session.shortcutForAgentId
|
|
70
|
+
? agent.name
|
|
71
|
+
: session.name
|
|
69
72
|
const connector = getSessionConnector(session, connectors)
|
|
70
73
|
const loopIsOngoing = appSettings.loopMode === 'ongoing'
|
|
71
74
|
const explicitOptIn = session.heartbeatEnabled === true || agent?.heartbeatEnabled === true
|
|
@@ -74,7 +77,7 @@ export function SessionCard({ session, active, onClick }: Props) {
|
|
|
74
77
|
const intervalEnabled = Number.isFinite(intervalNum) ? intervalNum > 0 : true
|
|
75
78
|
const heartbeatEnabled =
|
|
76
79
|
(loopIsOngoing || explicitOptIn)
|
|
77
|
-
&& (session.
|
|
80
|
+
&& (session.plugins?.length ?? 0) > 0
|
|
78
81
|
&& intervalEnabled
|
|
79
82
|
&& session.heartbeatEnabled !== false
|
|
80
83
|
&& agent?.heartbeatEnabled !== false
|
|
@@ -109,26 +112,7 @@ export function SessionCard({ session, active, onClick }: Props) {
|
|
|
109
112
|
title={`${connector.name} (${connector.platform})`}
|
|
110
113
|
/>
|
|
111
114
|
)}
|
|
112
|
-
<span className="font-display text-[14px] font-600 truncate flex-1 tracking-[-0.01em]">{
|
|
113
|
-
{session.mainLoopState?.status && session.mainLoopState.status !== 'idle' && (
|
|
114
|
-
<span className={`shrink-0 flex items-center gap-1 text-[9px] font-600 uppercase tracking-wider px-1.5 py-0.5 rounded-[5px] ${
|
|
115
|
-
session.mainLoopState.status === 'progress' ? 'text-blue-400/90 bg-blue-400/[0.08]'
|
|
116
|
-
: session.mainLoopState.status === 'blocked' ? 'text-amber-400/90 bg-amber-400/[0.08]'
|
|
117
|
-
: 'text-emerald-400/90 bg-emerald-400/[0.08]'
|
|
118
|
-
}`}>
|
|
119
|
-
<span className={`w-[5px] h-[5px] rounded-full ${
|
|
120
|
-
session.mainLoopState.status === 'progress' ? 'bg-blue-400'
|
|
121
|
-
: session.mainLoopState.status === 'blocked' ? 'bg-amber-400'
|
|
122
|
-
: 'bg-emerald-400'
|
|
123
|
-
}`} />
|
|
124
|
-
{session.mainLoopState.status}
|
|
125
|
-
</span>
|
|
126
|
-
)}
|
|
127
|
-
{session.sessionType === 'orchestrated' && (
|
|
128
|
-
<span className="shrink-0 text-[10px] font-600 uppercase tracking-wider text-amber-400/80 bg-amber-400/[0.08] px-2 py-0.5 rounded-[6px]">
|
|
129
|
-
AI
|
|
130
|
-
</span>
|
|
131
|
-
)}
|
|
115
|
+
<span className="font-display text-[14px] font-600 truncate flex-1 tracking-[-0.01em]">{displayName}</span>
|
|
132
116
|
{providerLabel && (
|
|
133
117
|
<span className="shrink-0 text-[10px] font-600 uppercase tracking-wider text-text-3/70 bg-white/[0.03] px-2 py-0.5 rounded-[6px]">
|
|
134
118
|
{providerLabel}
|