@swarmclawai/swarmclaw 0.4.0 → 0.5.0

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 (209) hide show
  1. package/README.md +21 -4
  2. package/bin/server-cmd.js +28 -19
  3. package/next.config.ts +13 -0
  4. package/package.json +3 -1
  5. package/src/app/api/agents/[id]/route.ts +39 -22
  6. package/src/app/api/agents/[id]/thread/route.ts +2 -2
  7. package/src/app/api/agents/route.ts +3 -2
  8. package/src/app/api/agents/trash/route.ts +44 -0
  9. package/src/app/api/clawhub/install/route.ts +2 -2
  10. package/src/app/api/connectors/[id]/route.ts +17 -7
  11. package/src/app/api/connectors/[id]/webhook/route.ts +103 -0
  12. package/src/app/api/connectors/route.ts +6 -3
  13. package/src/app/api/credentials/[id]/route.ts +2 -1
  14. package/src/app/api/credentials/route.ts +2 -2
  15. package/src/app/api/documents/route.ts +2 -2
  16. package/src/app/api/files/serve/route.ts +8 -0
  17. package/src/app/api/knowledge/[id]/route.ts +5 -4
  18. package/src/app/api/knowledge/upload/route.ts +2 -2
  19. package/src/app/api/mcp-servers/[id]/route.ts +11 -14
  20. package/src/app/api/mcp-servers/[id]/test/route.ts +2 -1
  21. package/src/app/api/mcp-servers/[id]/tools/route.ts +2 -1
  22. package/src/app/api/mcp-servers/route.ts +2 -2
  23. package/src/app/api/memory/[id]/route.ts +9 -8
  24. package/src/app/api/memory/route.ts +2 -2
  25. package/src/app/api/memory-images/[filename]/route.ts +2 -1
  26. package/src/app/api/openclaw/agent-files/route.ts +57 -0
  27. package/src/app/api/openclaw/approvals/route.ts +46 -0
  28. package/src/app/api/openclaw/config-sync/route.ts +33 -0
  29. package/src/app/api/openclaw/cron/route.ts +52 -0
  30. package/src/app/api/openclaw/directory/route.ts +27 -0
  31. package/src/app/api/openclaw/discover/route.ts +62 -0
  32. package/src/app/api/openclaw/dotenv-keys/route.ts +18 -0
  33. package/src/app/api/openclaw/exec-config/route.ts +41 -0
  34. package/src/app/api/openclaw/gateway/route.ts +72 -0
  35. package/src/app/api/openclaw/history/route.ts +109 -0
  36. package/src/app/api/openclaw/media/route.ts +53 -0
  37. package/src/app/api/openclaw/models/route.ts +12 -0
  38. package/src/app/api/openclaw/permissions/route.ts +39 -0
  39. package/src/app/api/openclaw/sandbox-env/route.ts +69 -0
  40. package/src/app/api/openclaw/skills/install/route.ts +32 -0
  41. package/src/app/api/openclaw/skills/remove/route.ts +24 -0
  42. package/src/app/api/openclaw/skills/route.ts +82 -0
  43. package/src/app/api/openclaw/sync/route.ts +31 -0
  44. package/src/app/api/orchestrator/run/route.ts +2 -2
  45. package/src/app/api/projects/[id]/route.ts +55 -0
  46. package/src/app/api/projects/route.ts +27 -0
  47. package/src/app/api/providers/[id]/models/route.ts +2 -1
  48. package/src/app/api/providers/[id]/route.ts +13 -15
  49. package/src/app/api/providers/route.ts +2 -2
  50. package/src/app/api/schedules/[id]/route.ts +16 -18
  51. package/src/app/api/schedules/[id]/run/route.ts +4 -3
  52. package/src/app/api/schedules/route.ts +2 -2
  53. package/src/app/api/secrets/[id]/route.ts +16 -17
  54. package/src/app/api/secrets/route.ts +2 -2
  55. package/src/app/api/sessions/[id]/clear/route.ts +2 -1
  56. package/src/app/api/sessions/[id]/deploy/route.ts +2 -1
  57. package/src/app/api/sessions/[id]/devserver/route.ts +2 -1
  58. package/src/app/api/sessions/[id]/edit-resend/route.ts +22 -0
  59. package/src/app/api/sessions/[id]/fork/route.ts +44 -0
  60. package/src/app/api/sessions/[id]/messages/route.ts +20 -2
  61. package/src/app/api/sessions/[id]/retry/route.ts +2 -1
  62. package/src/app/api/sessions/[id]/route.ts +14 -4
  63. package/src/app/api/sessions/route.ts +8 -4
  64. package/src/app/api/skills/[id]/route.ts +23 -21
  65. package/src/app/api/skills/import/route.ts +2 -2
  66. package/src/app/api/skills/route.ts +2 -2
  67. package/src/app/api/tasks/[id]/approve/route.ts +2 -1
  68. package/src/app/api/tasks/[id]/route.ts +6 -5
  69. package/src/app/api/tasks/route.ts +2 -2
  70. package/src/app/api/tts/stream/route.ts +48 -0
  71. package/src/app/api/upload/route.ts +2 -2
  72. package/src/app/api/uploads/[filename]/route.ts +4 -1
  73. package/src/app/api/webhooks/[id]/route.ts +29 -31
  74. package/src/app/api/webhooks/route.ts +2 -2
  75. package/src/app/globals.css +14 -0
  76. package/src/app/layout.tsx +5 -20
  77. package/src/app/page.tsx +3 -24
  78. package/src/cli/index.js +60 -0
  79. package/src/cli/index.ts +1 -1
  80. package/src/cli/spec.js +42 -0
  81. package/src/components/agents/agent-avatar.tsx +45 -0
  82. package/src/components/agents/agent-card.tsx +19 -5
  83. package/src/components/agents/agent-chat-list.tsx +31 -24
  84. package/src/components/agents/agent-files-editor.tsx +185 -0
  85. package/src/components/agents/agent-list.tsx +84 -3
  86. package/src/components/agents/agent-sheet.tsx +147 -14
  87. package/src/components/agents/cron-job-form.tsx +137 -0
  88. package/src/components/agents/exec-config-panel.tsx +147 -0
  89. package/src/components/agents/inspector-panel.tsx +310 -0
  90. package/src/components/agents/openclaw-skills-panel.tsx +230 -0
  91. package/src/components/agents/permission-preset-selector.tsx +79 -0
  92. package/src/components/agents/personality-builder.tsx +111 -0
  93. package/src/components/agents/sandbox-env-panel.tsx +72 -0
  94. package/src/components/agents/skill-install-dialog.tsx +102 -0
  95. package/src/components/agents/trash-list.tsx +109 -0
  96. package/src/components/chat/chat-area.tsx +41 -6
  97. package/src/components/chat/chat-header.tsx +305 -29
  98. package/src/components/chat/chat-preview-panel.tsx +113 -0
  99. package/src/components/chat/exec-approval-card.tsx +89 -0
  100. package/src/components/chat/message-bubble.tsx +218 -36
  101. package/src/components/chat/message-list.tsx +135 -31
  102. package/src/components/chat/streaming-bubble.tsx +59 -10
  103. package/src/components/chat/suggestions-bar.tsx +74 -0
  104. package/src/components/chat/thinking-indicator.tsx +20 -6
  105. package/src/components/chat/tool-call-bubble.tsx +98 -19
  106. package/src/components/chat/tool-request-banner.tsx +20 -2
  107. package/src/components/chat/trace-block.tsx +103 -0
  108. package/src/components/chat/voice-overlay.tsx +80 -0
  109. package/src/components/connectors/connector-list.tsx +6 -2
  110. package/src/components/connectors/connector-sheet.tsx +31 -7
  111. package/src/components/layout/app-layout.tsx +47 -25
  112. package/src/components/projects/project-list.tsx +123 -0
  113. package/src/components/projects/project-sheet.tsx +135 -0
  114. package/src/components/schedules/schedule-list.tsx +3 -1
  115. package/src/components/sessions/new-session-sheet.tsx +6 -6
  116. package/src/components/sessions/session-card.tsx +1 -1
  117. package/src/components/sessions/session-list.tsx +7 -7
  118. package/src/components/settings/gateway-connection-panel.tsx +278 -0
  119. package/src/components/shared/avatar.tsx +13 -2
  120. package/src/components/shared/connector-platform-icon.tsx +4 -0
  121. package/src/components/shared/settings/section-heartbeat.tsx +1 -1
  122. package/src/components/shared/settings/section-orchestrator.tsx +1 -2
  123. package/src/components/shared/settings/section-web-search.tsx +56 -0
  124. package/src/components/shared/settings/settings-page.tsx +74 -0
  125. package/src/components/skills/skill-list.tsx +2 -1
  126. package/src/components/tasks/task-board.tsx +1 -1
  127. package/src/components/tasks/task-list.tsx +5 -2
  128. package/src/components/tasks/task-sheet.tsx +12 -12
  129. package/src/hooks/use-continuous-speech.ts +181 -0
  130. package/src/hooks/use-openclaw-gateway.ts +63 -0
  131. package/src/hooks/use-view-router.ts +52 -0
  132. package/src/hooks/use-voice-conversation.ts +80 -0
  133. package/src/lib/id.ts +6 -0
  134. package/src/lib/notification-sounds.ts +58 -0
  135. package/src/lib/personality-parser.ts +97 -0
  136. package/src/lib/projects.ts +13 -0
  137. package/src/lib/provider-sets.ts +5 -0
  138. package/src/lib/providers/anthropic.ts +14 -1
  139. package/src/lib/providers/index.ts +6 -0
  140. package/src/lib/providers/ollama.ts +9 -1
  141. package/src/lib/providers/openai.ts +9 -1
  142. package/src/lib/providers/openclaw.ts +28 -2
  143. package/src/lib/runtime-loop.ts +2 -2
  144. package/src/lib/server/api-routes.test.ts +5 -6
  145. package/src/lib/server/build-llm.ts +17 -4
  146. package/src/lib/server/chat-execution.ts +82 -6
  147. package/src/lib/server/collection-helpers.ts +54 -0
  148. package/src/lib/server/connectors/bluebubbles.test.ts +217 -0
  149. package/src/lib/server/connectors/bluebubbles.ts +360 -0
  150. package/src/lib/server/connectors/connector-routing.test.ts +1 -1
  151. package/src/lib/server/connectors/googlechat.ts +51 -8
  152. package/src/lib/server/connectors/manager.ts +424 -13
  153. package/src/lib/server/connectors/media.ts +2 -2
  154. package/src/lib/server/connectors/openclaw.ts +65 -0
  155. package/src/lib/server/connectors/pairing.test.ts +99 -0
  156. package/src/lib/server/connectors/pairing.ts +256 -0
  157. package/src/lib/server/connectors/signal.ts +1 -0
  158. package/src/lib/server/connectors/teams.ts +5 -5
  159. package/src/lib/server/connectors/types.ts +10 -0
  160. package/src/lib/server/daemon-state.ts +11 -0
  161. package/src/lib/server/execution-log.ts +3 -3
  162. package/src/lib/server/heartbeat-service.ts +1 -1
  163. package/src/lib/server/knowledge-db.test.ts +2 -33
  164. package/src/lib/server/main-agent-loop.ts +8 -9
  165. package/src/lib/server/main-session.ts +21 -0
  166. package/src/lib/server/memory-db.ts +6 -6
  167. package/src/lib/server/openclaw-approvals.ts +105 -0
  168. package/src/lib/server/openclaw-config-sync.ts +107 -0
  169. package/src/lib/server/openclaw-exec-config.ts +52 -0
  170. package/src/lib/server/openclaw-gateway.ts +291 -0
  171. package/src/lib/server/openclaw-history-merge.ts +36 -0
  172. package/src/lib/server/openclaw-models.ts +56 -0
  173. package/src/lib/server/openclaw-permission-presets.ts +64 -0
  174. package/src/lib/server/openclaw-sync.ts +497 -0
  175. package/src/lib/server/orchestrator-lg.ts +30 -9
  176. package/src/lib/server/orchestrator.ts +4 -4
  177. package/src/lib/server/process-manager.ts +2 -2
  178. package/src/lib/server/queue.ts +24 -11
  179. package/src/lib/server/scheduler.ts +2 -2
  180. package/src/lib/server/session-mailbox.ts +2 -2
  181. package/src/lib/server/session-run-manager.ts +2 -2
  182. package/src/lib/server/session-tools/connector.ts +53 -6
  183. package/src/lib/server/session-tools/crud.ts +3 -3
  184. package/src/lib/server/session-tools/delegate.ts +22 -6
  185. package/src/lib/server/session-tools/file.ts +192 -19
  186. package/src/lib/server/session-tools/index.ts +4 -2
  187. package/src/lib/server/session-tools/memory.ts +2 -2
  188. package/src/lib/server/session-tools/openclaw-nodes.ts +112 -0
  189. package/src/lib/server/session-tools/sandbox.ts +33 -0
  190. package/src/lib/server/session-tools/search-providers.ts +277 -0
  191. package/src/lib/server/session-tools/session-info.ts +2 -2
  192. package/src/lib/server/session-tools/session-tools-wiring.test.ts +2 -2
  193. package/src/lib/server/session-tools/shell.ts +1 -1
  194. package/src/lib/server/session-tools/web.ts +53 -72
  195. package/src/lib/server/storage.ts +74 -11
  196. package/src/lib/server/stream-agent-chat.ts +53 -4
  197. package/src/lib/server/suggestions.ts +20 -0
  198. package/src/lib/server/task-result.test.ts +44 -0
  199. package/src/lib/server/task-result.ts +14 -0
  200. package/src/lib/server/ws-hub.ts +14 -0
  201. package/src/lib/tool-definitions.ts +5 -3
  202. package/src/lib/tts-stream.ts +130 -0
  203. package/src/lib/view-routes.ts +28 -0
  204. package/src/proxy.ts +3 -0
  205. package/src/stores/use-app-store.ts +80 -1
  206. package/src/stores/use-approval-store.ts +78 -0
  207. package/src/stores/use-chat-store.ts +162 -6
  208. package/src/types/index.ts +154 -3
  209. package/tsconfig.json +13 -4
@@ -0,0 +1,109 @@
1
+ 'use client'
2
+
3
+ import { useEffect, useState } from 'react'
4
+ import type { Agent } from '@/types'
5
+ import { useAppStore } from '@/stores/use-app-store'
6
+ import { api } from '@/lib/api-client'
7
+ import { ConfirmDialog } from '@/components/shared/confirm-dialog'
8
+
9
+ export function TrashList() {
10
+ const trashedAgents = useAppStore((s) => s.trashedAgents)
11
+ const loadTrashedAgents = useAppStore((s) => s.loadTrashedAgents)
12
+ const loadAgents = useAppStore((s) => s.loadAgents)
13
+ const [confirmPermanent, setConfirmPermanent] = useState<Agent | null>(null)
14
+
15
+ useEffect(() => { loadTrashedAgents() }, []) // eslint-disable-next-line react-hooks/exhaustive-deps
16
+
17
+ const handleRestore = async (id: string) => {
18
+ await api('POST', '/agents/trash', { id })
19
+ await Promise.all([loadTrashedAgents(), loadAgents()])
20
+ }
21
+
22
+ const handlePermanentDelete = async (id: string) => {
23
+ await api('DELETE', '/agents/trash', { id })
24
+ await loadTrashedAgents()
25
+ setConfirmPermanent(null)
26
+ }
27
+
28
+ const agents = Object.values(trashedAgents).sort(
29
+ (a, b) => (b.trashedAt ?? 0) - (a.trashedAt ?? 0),
30
+ )
31
+
32
+ if (!agents.length) {
33
+ return (
34
+ <div className="flex-1 flex flex-col items-center justify-center gap-3 text-text-3 p-8 text-center">
35
+ <div className="w-12 h-12 rounded-[14px] bg-white/[0.03] flex items-center justify-center">
36
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" className="text-text-3/50">
37
+ <polyline points="3 6 5 6 21 6" />
38
+ <path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" />
39
+ </svg>
40
+ </div>
41
+ <p className="text-[13px] text-text-3/50">Trash is empty</p>
42
+ </div>
43
+ )
44
+ }
45
+
46
+ return (
47
+ <div className="flex-1 overflow-y-auto">
48
+ <div className="flex flex-col gap-1 px-2 pb-4 pt-2">
49
+ {agents.map((agent) => (
50
+ <div
51
+ key={agent.id}
52
+ className="py-3 px-4 rounded-[14px] border border-white/[0.04] bg-white/[0.02]"
53
+ >
54
+ <div className="flex items-center gap-2.5">
55
+ <span className="font-display text-[14px] font-600 truncate flex-1 tracking-[-0.01em] text-text-2/70">
56
+ {agent.name}
57
+ </span>
58
+ </div>
59
+ <div className="text-[12px] text-text-3/50 mt-1 truncate">{agent.description}</div>
60
+ {agent.trashedAt && (
61
+ <div className="text-[11px] text-text-3/40 mt-1">
62
+ Trashed {formatRelative(agent.trashedAt)}
63
+ </div>
64
+ )}
65
+ <div className="flex items-center gap-2 mt-2.5">
66
+ <button
67
+ onClick={() => handleRestore(agent.id)}
68
+ className="px-3 py-1.5 rounded-[8px] border border-white/[0.08] bg-transparent text-[12px] font-600
69
+ text-accent-bright cursor-pointer hover:bg-accent-soft transition-all"
70
+ style={{ fontFamily: 'inherit' }}
71
+ >
72
+ Restore
73
+ </button>
74
+ <button
75
+ onClick={() => setConfirmPermanent(agent)}
76
+ className="px-3 py-1.5 rounded-[8px] border border-white/[0.08] bg-transparent text-[12px] font-600
77
+ text-red-400 cursor-pointer hover:bg-red-400/10 transition-all"
78
+ style={{ fontFamily: 'inherit' }}
79
+ >
80
+ Delete Forever
81
+ </button>
82
+ </div>
83
+ </div>
84
+ ))}
85
+ </div>
86
+
87
+ <ConfirmDialog
88
+ open={!!confirmPermanent}
89
+ title="Permanently Delete"
90
+ message={`Permanently delete "${confirmPermanent?.name}"? This cannot be undone.`}
91
+ confirmLabel="Delete Forever"
92
+ danger
93
+ onConfirm={() => confirmPermanent && handlePermanentDelete(confirmPermanent.id)}
94
+ onCancel={() => setConfirmPermanent(null)}
95
+ />
96
+ </div>
97
+ )
98
+ }
99
+
100
+ function formatRelative(ts: number): string {
101
+ const diff = Date.now() - ts
102
+ const mins = Math.floor(diff / 60_000)
103
+ if (mins < 1) return 'just now'
104
+ if (mins < 60) return `${mins}m ago`
105
+ const hours = Math.floor(mins / 60)
106
+ if (hours < 24) return `${hours}h ago`
107
+ const days = Math.floor(hours / 24)
108
+ return `${days}d ago`
109
+ }
@@ -12,13 +12,17 @@ import { ChatHeader } from './chat-header'
12
12
  import { DevServerBar } from './dev-server-bar'
13
13
  import { MessageList } from './message-list'
14
14
  import { SessionDebugPanel } from './session-debug-panel'
15
+ import { VoiceOverlay } from './voice-overlay'
16
+ import { useVoiceConversation } from '@/hooks/use-voice-conversation'
15
17
  import { ChatInput } from '@/components/input/chat-input'
18
+ import { ChatPreviewPanel } from './chat-preview-panel'
19
+ import { InspectorPanel } from '@/components/agents/inspector-panel'
16
20
  import { Dropdown, DropdownItem } from '@/components/shared/dropdown'
17
21
  import { ConfirmDialog } from '@/components/shared/confirm-dialog'
18
22
  import { speak } from '@/lib/tts'
19
23
 
20
24
  const PROMPT_SUGGESTIONS = [
21
- { text: 'List all my sessions and agents', icon: 'book', gradient: 'from-[#6366F1]/10 to-[#818CF8]/5' },
25
+ { text: 'What can you help me with?', icon: 'book', gradient: 'from-[#6366F1]/10 to-[#818CF8]/5' },
22
26
  { text: 'Help me set up a new connector', icon: 'link', gradient: 'from-[#EC4899]/10 to-[#F472B6]/5' },
23
27
  { text: 'Create a new agent for me', icon: 'bot', gradient: 'from-[#34D399]/10 to-[#6EE7B7]/5' },
24
28
  { text: 'Schedule a recurring task', icon: 'check', gradient: 'from-[#F59E0B]/10 to-[#FBBF24]/5' },
@@ -35,13 +39,21 @@ export function ChatArea() {
35
39
  const removeSessionFromStore = useAppStore((s) => s.removeSession)
36
40
  const loadSessions = useAppStore((s) => s.loadSessions)
37
41
  const appSettings = useAppStore((s) => s.appSettings)
38
- const { messages, setMessages, streaming, streamingSessionId, sendMessage, stopStreaming, devServer: devServerStatus, setDevServer, debugOpen, setDebugOpen, ttsEnabled } = useChatStore()
42
+ const { messages, setMessages, streaming, streamingSessionId, sendMessage, stopStreaming, devServer: devServerStatus, setDevServer, debugOpen, setDebugOpen, ttsEnabled, previewContent, setPreviewContent } = useChatStore()
39
43
  const isDesktop = useMediaQuery('(min-width: 768px)')
40
44
 
41
45
  const agents = useAppStore((s) => s.agents)
42
46
  const loadAgents = useAppStore((s) => s.loadAgents)
43
47
  const setEditingAgentId = useAppStore((s) => s.setEditingAgentId)
44
48
  const setAgentSheetOpen = useAppStore((s) => s.setAgentSheetOpen)
49
+ const inspectorOpen = useAppStore((s) => s.inspectorOpen)
50
+ const currentAgent = session?.agentId ? agents[session.agentId] ?? null : null
51
+
52
+ const voice = useVoiceConversation()
53
+ const handleVoiceToggle = useCallback(() => {
54
+ if (voice.active) voice.stop()
55
+ else voice.start()
56
+ }, [voice])
45
57
 
46
58
  const [menuOpen, setMenuOpen] = useState(false)
47
59
  const [confirmDelete, setConfirmDelete] = useState(false)
@@ -235,8 +247,9 @@ export function ChatArea() {
235
247
  const isEmpty = !messages.length && !streamingForThisSession
236
248
 
237
249
  return (
250
+ <div className="flex-1 flex h-full min-h-0 min-w-0">
238
251
  <div
239
- className="flex-1 flex flex-col h-full min-h-0 relative"
252
+ className="flex-1 flex flex-col h-full min-h-0 min-w-0 relative"
240
253
  onDragOver={handleDragOver}
241
254
  onDragEnter={handleDragEnter}
242
255
  onDragLeave={handleDragLeave}
@@ -251,6 +264,9 @@ export function ChatArea() {
251
264
  onBack={handleBack}
252
265
  browserActive={browserActive}
253
266
  onStopBrowser={handleStopBrowser}
267
+ voiceActive={voice.active}
268
+ voiceSupported={voice.supported}
269
+ onVoiceToggle={handleVoiceToggle}
254
270
  />
255
271
  )}
256
272
  {!isDesktop && (
@@ -262,6 +278,9 @@ export function ChatArea() {
262
278
  mobile
263
279
  browserActive={browserActive}
264
280
  onStopBrowser={handleStopBrowser}
281
+ voiceActive={voice.active}
282
+ voiceSupported={voice.supported}
283
+ onVoiceToggle={handleVoiceToggle}
265
284
  />
266
285
  )}
267
286
  <DevServerBar status={devServerStatus} onStop={handleStopDevServer} />
@@ -320,6 +339,15 @@ export function ChatArea() {
320
339
  <MessageList messages={messages} streaming={streamingForThisSession} />
321
340
  )}
322
341
 
342
+ {voice.active && (
343
+ <VoiceOverlay
344
+ state={voice.state}
345
+ interimText={voice.interimText}
346
+ transcript={voice.transcript}
347
+ onStop={voice.stop}
348
+ />
349
+ )}
350
+
323
351
  <SessionDebugPanel
324
352
  messages={messages}
325
353
  open={debugOpen}
@@ -348,7 +376,7 @@ export function ChatArea() {
348
376
  )}
349
377
  {!isMainChat && (
350
378
  <DropdownItem danger onClick={() => { setMenuOpen(false); setConfirmDelete(true) }}>
351
- Delete Session
379
+ Delete Chat
352
380
  </DropdownItem>
353
381
  )}
354
382
  </Dropdown>
@@ -356,7 +384,7 @@ export function ChatArea() {
356
384
  <ConfirmDialog
357
385
  open={confirmClear}
358
386
  title="Clear History"
359
- message="This will delete all messages in this session. This cannot be undone."
387
+ message="This will delete all messages in this chat. This cannot be undone."
360
388
  confirmLabel="Clear"
361
389
  danger
362
390
  onConfirm={handleClear}
@@ -364,7 +392,7 @@ export function ChatArea() {
364
392
  />
365
393
  <ConfirmDialog
366
394
  open={confirmDelete}
367
- title="Delete Session"
395
+ title="Delete Chat"
368
396
  message={`Delete "${session.name}"? This cannot be undone.`}
369
397
  confirmLabel="Delete"
370
398
  danger
@@ -400,6 +428,13 @@ export function ChatArea() {
400
428
  </div>
401
429
  )}
402
430
  </div>
431
+ {isDesktop && previewContent && (
432
+ <ChatPreviewPanel content={previewContent} onClose={() => setPreviewContent(null)} />
433
+ )}
434
+ {isDesktop && inspectorOpen && currentAgent && (
435
+ <InspectorPanel agent={currentAgent} />
436
+ )}
437
+ </div>
403
438
  )
404
439
  }
405
440