@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.
- package/README.md +21 -4
- package/bin/server-cmd.js +28 -19
- package/next.config.ts +13 -0
- package/package.json +3 -1
- package/src/app/api/agents/[id]/route.ts +39 -22
- package/src/app/api/agents/[id]/thread/route.ts +2 -2
- package/src/app/api/agents/route.ts +3 -2
- package/src/app/api/agents/trash/route.ts +44 -0
- package/src/app/api/clawhub/install/route.ts +2 -2
- package/src/app/api/connectors/[id]/route.ts +17 -7
- package/src/app/api/connectors/[id]/webhook/route.ts +103 -0
- package/src/app/api/connectors/route.ts +6 -3
- package/src/app/api/credentials/[id]/route.ts +2 -1
- package/src/app/api/credentials/route.ts +2 -2
- package/src/app/api/documents/route.ts +2 -2
- package/src/app/api/files/serve/route.ts +8 -0
- package/src/app/api/knowledge/[id]/route.ts +5 -4
- package/src/app/api/knowledge/upload/route.ts +2 -2
- package/src/app/api/mcp-servers/[id]/route.ts +11 -14
- package/src/app/api/mcp-servers/[id]/test/route.ts +2 -1
- package/src/app/api/mcp-servers/[id]/tools/route.ts +2 -1
- package/src/app/api/mcp-servers/route.ts +2 -2
- package/src/app/api/memory/[id]/route.ts +9 -8
- package/src/app/api/memory/route.ts +2 -2
- package/src/app/api/memory-images/[filename]/route.ts +2 -1
- package/src/app/api/openclaw/agent-files/route.ts +57 -0
- package/src/app/api/openclaw/approvals/route.ts +46 -0
- package/src/app/api/openclaw/config-sync/route.ts +33 -0
- package/src/app/api/openclaw/cron/route.ts +52 -0
- package/src/app/api/openclaw/directory/route.ts +27 -0
- package/src/app/api/openclaw/discover/route.ts +62 -0
- package/src/app/api/openclaw/dotenv-keys/route.ts +18 -0
- package/src/app/api/openclaw/exec-config/route.ts +41 -0
- package/src/app/api/openclaw/gateway/route.ts +72 -0
- package/src/app/api/openclaw/history/route.ts +109 -0
- package/src/app/api/openclaw/media/route.ts +53 -0
- package/src/app/api/openclaw/models/route.ts +12 -0
- package/src/app/api/openclaw/permissions/route.ts +39 -0
- package/src/app/api/openclaw/sandbox-env/route.ts +69 -0
- package/src/app/api/openclaw/skills/install/route.ts +32 -0
- package/src/app/api/openclaw/skills/remove/route.ts +24 -0
- package/src/app/api/openclaw/skills/route.ts +82 -0
- package/src/app/api/openclaw/sync/route.ts +31 -0
- package/src/app/api/orchestrator/run/route.ts +2 -2
- package/src/app/api/projects/[id]/route.ts +55 -0
- package/src/app/api/projects/route.ts +27 -0
- package/src/app/api/providers/[id]/models/route.ts +2 -1
- package/src/app/api/providers/[id]/route.ts +13 -15
- package/src/app/api/providers/route.ts +2 -2
- package/src/app/api/schedules/[id]/route.ts +16 -18
- package/src/app/api/schedules/[id]/run/route.ts +4 -3
- package/src/app/api/schedules/route.ts +2 -2
- package/src/app/api/secrets/[id]/route.ts +16 -17
- package/src/app/api/secrets/route.ts +2 -2
- package/src/app/api/sessions/[id]/clear/route.ts +2 -1
- package/src/app/api/sessions/[id]/deploy/route.ts +2 -1
- package/src/app/api/sessions/[id]/devserver/route.ts +2 -1
- package/src/app/api/sessions/[id]/edit-resend/route.ts +22 -0
- package/src/app/api/sessions/[id]/fork/route.ts +44 -0
- package/src/app/api/sessions/[id]/messages/route.ts +20 -2
- package/src/app/api/sessions/[id]/retry/route.ts +2 -1
- package/src/app/api/sessions/[id]/route.ts +14 -4
- package/src/app/api/sessions/route.ts +8 -4
- package/src/app/api/skills/[id]/route.ts +23 -21
- package/src/app/api/skills/import/route.ts +2 -2
- package/src/app/api/skills/route.ts +2 -2
- package/src/app/api/tasks/[id]/approve/route.ts +2 -1
- package/src/app/api/tasks/[id]/route.ts +6 -5
- package/src/app/api/tasks/route.ts +2 -2
- package/src/app/api/tts/stream/route.ts +48 -0
- package/src/app/api/upload/route.ts +2 -2
- package/src/app/api/uploads/[filename]/route.ts +4 -1
- package/src/app/api/webhooks/[id]/route.ts +29 -31
- package/src/app/api/webhooks/route.ts +2 -2
- package/src/app/globals.css +14 -0
- package/src/app/layout.tsx +5 -20
- package/src/app/page.tsx +3 -24
- package/src/cli/index.js +60 -0
- package/src/cli/index.ts +1 -1
- package/src/cli/spec.js +42 -0
- package/src/components/agents/agent-avatar.tsx +45 -0
- package/src/components/agents/agent-card.tsx +19 -5
- package/src/components/agents/agent-chat-list.tsx +31 -24
- package/src/components/agents/agent-files-editor.tsx +185 -0
- package/src/components/agents/agent-list.tsx +84 -3
- package/src/components/agents/agent-sheet.tsx +147 -14
- package/src/components/agents/cron-job-form.tsx +137 -0
- package/src/components/agents/exec-config-panel.tsx +147 -0
- package/src/components/agents/inspector-panel.tsx +310 -0
- package/src/components/agents/openclaw-skills-panel.tsx +230 -0
- package/src/components/agents/permission-preset-selector.tsx +79 -0
- package/src/components/agents/personality-builder.tsx +111 -0
- package/src/components/agents/sandbox-env-panel.tsx +72 -0
- package/src/components/agents/skill-install-dialog.tsx +102 -0
- package/src/components/agents/trash-list.tsx +109 -0
- package/src/components/chat/chat-area.tsx +41 -6
- package/src/components/chat/chat-header.tsx +305 -29
- package/src/components/chat/chat-preview-panel.tsx +113 -0
- package/src/components/chat/exec-approval-card.tsx +89 -0
- package/src/components/chat/message-bubble.tsx +218 -36
- package/src/components/chat/message-list.tsx +135 -31
- package/src/components/chat/streaming-bubble.tsx +59 -10
- package/src/components/chat/suggestions-bar.tsx +74 -0
- package/src/components/chat/thinking-indicator.tsx +20 -6
- package/src/components/chat/tool-call-bubble.tsx +98 -19
- package/src/components/chat/tool-request-banner.tsx +20 -2
- package/src/components/chat/trace-block.tsx +103 -0
- package/src/components/chat/voice-overlay.tsx +80 -0
- package/src/components/connectors/connector-list.tsx +6 -2
- package/src/components/connectors/connector-sheet.tsx +31 -7
- package/src/components/layout/app-layout.tsx +47 -25
- package/src/components/projects/project-list.tsx +123 -0
- package/src/components/projects/project-sheet.tsx +135 -0
- package/src/components/schedules/schedule-list.tsx +3 -1
- package/src/components/sessions/new-session-sheet.tsx +6 -6
- package/src/components/sessions/session-card.tsx +1 -1
- package/src/components/sessions/session-list.tsx +7 -7
- package/src/components/settings/gateway-connection-panel.tsx +278 -0
- package/src/components/shared/avatar.tsx +13 -2
- package/src/components/shared/connector-platform-icon.tsx +4 -0
- package/src/components/shared/settings/section-heartbeat.tsx +1 -1
- package/src/components/shared/settings/section-orchestrator.tsx +1 -2
- package/src/components/shared/settings/section-web-search.tsx +56 -0
- package/src/components/shared/settings/settings-page.tsx +74 -0
- package/src/components/skills/skill-list.tsx +2 -1
- package/src/components/tasks/task-board.tsx +1 -1
- package/src/components/tasks/task-list.tsx +5 -2
- package/src/components/tasks/task-sheet.tsx +12 -12
- package/src/hooks/use-continuous-speech.ts +181 -0
- package/src/hooks/use-openclaw-gateway.ts +63 -0
- package/src/hooks/use-view-router.ts +52 -0
- package/src/hooks/use-voice-conversation.ts +80 -0
- package/src/lib/id.ts +6 -0
- package/src/lib/notification-sounds.ts +58 -0
- package/src/lib/personality-parser.ts +97 -0
- package/src/lib/projects.ts +13 -0
- package/src/lib/provider-sets.ts +5 -0
- package/src/lib/providers/anthropic.ts +14 -1
- package/src/lib/providers/index.ts +6 -0
- package/src/lib/providers/ollama.ts +9 -1
- package/src/lib/providers/openai.ts +9 -1
- package/src/lib/providers/openclaw.ts +28 -2
- package/src/lib/runtime-loop.ts +2 -2
- package/src/lib/server/api-routes.test.ts +5 -6
- package/src/lib/server/build-llm.ts +17 -4
- package/src/lib/server/chat-execution.ts +82 -6
- package/src/lib/server/collection-helpers.ts +54 -0
- package/src/lib/server/connectors/bluebubbles.test.ts +217 -0
- package/src/lib/server/connectors/bluebubbles.ts +360 -0
- package/src/lib/server/connectors/connector-routing.test.ts +1 -1
- package/src/lib/server/connectors/googlechat.ts +51 -8
- package/src/lib/server/connectors/manager.ts +424 -13
- package/src/lib/server/connectors/media.ts +2 -2
- package/src/lib/server/connectors/openclaw.ts +65 -0
- package/src/lib/server/connectors/pairing.test.ts +99 -0
- package/src/lib/server/connectors/pairing.ts +256 -0
- package/src/lib/server/connectors/signal.ts +1 -0
- package/src/lib/server/connectors/teams.ts +5 -5
- package/src/lib/server/connectors/types.ts +10 -0
- package/src/lib/server/daemon-state.ts +11 -0
- package/src/lib/server/execution-log.ts +3 -3
- package/src/lib/server/heartbeat-service.ts +1 -1
- package/src/lib/server/knowledge-db.test.ts +2 -33
- package/src/lib/server/main-agent-loop.ts +8 -9
- package/src/lib/server/main-session.ts +21 -0
- package/src/lib/server/memory-db.ts +6 -6
- package/src/lib/server/openclaw-approvals.ts +105 -0
- package/src/lib/server/openclaw-config-sync.ts +107 -0
- package/src/lib/server/openclaw-exec-config.ts +52 -0
- package/src/lib/server/openclaw-gateway.ts +291 -0
- package/src/lib/server/openclaw-history-merge.ts +36 -0
- package/src/lib/server/openclaw-models.ts +56 -0
- package/src/lib/server/openclaw-permission-presets.ts +64 -0
- package/src/lib/server/openclaw-sync.ts +497 -0
- package/src/lib/server/orchestrator-lg.ts +30 -9
- package/src/lib/server/orchestrator.ts +4 -4
- package/src/lib/server/process-manager.ts +2 -2
- package/src/lib/server/queue.ts +24 -11
- package/src/lib/server/scheduler.ts +2 -2
- package/src/lib/server/session-mailbox.ts +2 -2
- package/src/lib/server/session-run-manager.ts +2 -2
- package/src/lib/server/session-tools/connector.ts +53 -6
- package/src/lib/server/session-tools/crud.ts +3 -3
- package/src/lib/server/session-tools/delegate.ts +22 -6
- package/src/lib/server/session-tools/file.ts +192 -19
- package/src/lib/server/session-tools/index.ts +4 -2
- package/src/lib/server/session-tools/memory.ts +2 -2
- package/src/lib/server/session-tools/openclaw-nodes.ts +112 -0
- package/src/lib/server/session-tools/sandbox.ts +33 -0
- package/src/lib/server/session-tools/search-providers.ts +277 -0
- package/src/lib/server/session-tools/session-info.ts +2 -2
- package/src/lib/server/session-tools/session-tools-wiring.test.ts +2 -2
- package/src/lib/server/session-tools/shell.ts +1 -1
- package/src/lib/server/session-tools/web.ts +53 -72
- package/src/lib/server/storage.ts +74 -11
- package/src/lib/server/stream-agent-chat.ts +53 -4
- package/src/lib/server/suggestions.ts +20 -0
- package/src/lib/server/task-result.test.ts +44 -0
- package/src/lib/server/task-result.ts +14 -0
- package/src/lib/server/ws-hub.ts +14 -0
- package/src/lib/tool-definitions.ts +5 -3
- package/src/lib/tts-stream.ts +130 -0
- package/src/lib/view-routes.ts +28 -0
- package/src/proxy.ts +3 -0
- package/src/stores/use-app-store.ts +80 -1
- package/src/stores/use-approval-store.ts +78 -0
- package/src/stores/use-chat-store.ts +162 -6
- package/src/types/index.ts +154 -3
- 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: '
|
|
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
|
|
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
|
|
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
|
|
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
|
|