@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.
Files changed (237) hide show
  1. package/README.md +155 -150
  2. package/package.json +1 -1
  3. package/src/app/api/agents/[id]/route.ts +26 -0
  4. package/src/app/api/agents/[id]/thread/route.ts +37 -9
  5. package/src/app/api/agents/route.ts +13 -2
  6. package/src/app/api/auth/route.ts +76 -7
  7. package/src/app/api/chatrooms/[id]/chat/route.ts +7 -2
  8. package/src/app/api/{sessions → chats}/[id]/browser/route.ts +5 -1
  9. package/src/app/api/{sessions → chats}/[id]/chat/route.ts +7 -3
  10. package/src/app/api/{sessions → chats}/[id]/checkpoints/route.ts +1 -1
  11. package/src/app/api/chats/[id]/main-loop/route.ts +13 -0
  12. package/src/app/api/{sessions → chats}/[id]/messages/route.ts +19 -13
  13. package/src/app/api/{sessions → chats}/[id]/restore/route.ts +1 -1
  14. package/src/app/api/{sessions → chats}/[id]/route.ts +22 -52
  15. package/src/app/api/{sessions → chats}/[id]/stop/route.ts +6 -1
  16. package/src/app/api/{sessions → chats}/route.ts +21 -7
  17. package/src/app/api/connectors/[id]/doctor/route.ts +26 -0
  18. package/src/app/api/connectors/doctor/route.ts +13 -0
  19. package/src/app/api/files/open/route.ts +16 -14
  20. package/src/app/api/memory/maintenance/route.ts +11 -1
  21. package/src/app/api/openclaw/agent-files/route.ts +27 -4
  22. package/src/app/api/openclaw/skills/route.ts +11 -3
  23. package/src/app/api/plugins/dependencies/route.ts +24 -0
  24. package/src/app/api/plugins/install/route.ts +15 -92
  25. package/src/app/api/plugins/route.ts +6 -26
  26. package/src/app/api/plugins/settings/route.ts +40 -0
  27. package/src/app/api/plugins/ui/route.ts +1 -0
  28. package/src/app/api/settings/route.ts +49 -7
  29. package/src/app/api/tasks/[id]/route.ts +15 -6
  30. package/src/app/api/tasks/bulk/route.ts +2 -2
  31. package/src/app/api/tasks/route.ts +9 -4
  32. package/src/app/api/usage/route.ts +30 -0
  33. package/src/app/api/webhooks/[id]/route.ts +8 -1
  34. package/src/app/page.tsx +9 -2
  35. package/src/cli/index.js +39 -33
  36. package/src/cli/index.ts +43 -49
  37. package/src/cli/spec.js +29 -27
  38. package/src/components/agents/agent-card.tsx +16 -13
  39. package/src/components/agents/agent-chat-list.tsx +104 -4
  40. package/src/components/agents/agent-list.tsx +54 -22
  41. package/src/components/agents/agent-sheet.tsx +209 -18
  42. package/src/components/agents/cron-job-form.tsx +3 -3
  43. package/src/components/agents/inspector-panel.tsx +110 -50
  44. package/src/components/auth/access-key-gate.tsx +36 -97
  45. package/src/components/auth/setup-wizard.tsx +5 -38
  46. package/src/components/chat/chat-area.tsx +39 -27
  47. package/src/components/{sessions/session-card.tsx → chat/chat-card.tsx} +7 -23
  48. package/src/components/chat/chat-header.tsx +299 -314
  49. package/src/components/{sessions/session-list.tsx → chat/chat-list.tsx} +11 -14
  50. package/src/components/chat/chat-tool-toggles.tsx +26 -17
  51. package/src/components/chat/checkpoint-timeline.tsx +4 -4
  52. package/src/components/chat/message-bubble.tsx +4 -1
  53. package/src/components/chat/message-list.tsx +5 -3
  54. package/src/components/chat/session-debug-panel.tsx +1 -1
  55. package/src/components/chat/tool-request-banner.tsx +3 -3
  56. package/src/components/chatrooms/agent-hover-card.tsx +3 -3
  57. package/src/components/chatrooms/chatroom-tool-request-banner.tsx +2 -2
  58. package/src/components/chatrooms/chatroom-view.tsx +347 -205
  59. package/src/components/connectors/connector-list.tsx +265 -127
  60. package/src/components/connectors/connector-sheet.tsx +218 -1
  61. package/src/components/home/home-view.tsx +129 -5
  62. package/src/components/layout/app-layout.tsx +392 -182
  63. package/src/components/layout/mobile-header.tsx +26 -8
  64. package/src/components/plugins/plugin-list.tsx +487 -254
  65. package/src/components/plugins/plugin-sheet.tsx +236 -13
  66. package/src/components/projects/project-detail.tsx +183 -0
  67. package/src/components/settings/gateway-connection-panel.tsx +1 -1
  68. package/src/components/shared/agent-picker-list.tsx +2 -2
  69. package/src/components/shared/command-palette.tsx +111 -25
  70. package/src/components/shared/settings/plugin-manager.tsx +20 -4
  71. package/src/components/shared/settings/section-capability-policy.tsx +105 -0
  72. package/src/components/shared/settings/section-heartbeat.tsx +78 -1
  73. package/src/components/shared/settings/section-orchestrator.tsx +3 -3
  74. package/src/components/shared/settings/section-providers.tsx +1 -1
  75. package/src/components/shared/settings/section-runtime-loop.tsx +5 -5
  76. package/src/components/shared/settings/section-secrets.tsx +6 -6
  77. package/src/components/shared/settings/section-user-preferences.tsx +1 -1
  78. package/src/components/shared/settings/section-voice.tsx +5 -1
  79. package/src/components/shared/settings/section-web-search.tsx +10 -2
  80. package/src/components/shared/settings/settings-page.tsx +244 -56
  81. package/src/components/tasks/approvals-panel.tsx +205 -18
  82. package/src/components/tasks/task-board.tsx +242 -46
  83. package/src/components/usage/metrics-dashboard.tsx +147 -1
  84. package/src/components/wallets/wallet-panel.tsx +17 -5
  85. package/src/components/webhooks/webhook-sheet.tsx +8 -8
  86. package/src/lib/auth.ts +17 -0
  87. package/src/lib/chat-streaming-state.test.ts +108 -0
  88. package/src/lib/chat-streaming-state.ts +108 -0
  89. package/src/lib/chat.ts +1 -1
  90. package/src/lib/{sessions.ts → chats.ts} +28 -18
  91. package/src/lib/openclaw-agent-id.test.ts +14 -0
  92. package/src/lib/openclaw-agent-id.ts +31 -0
  93. package/src/lib/providers/claude-cli.ts +1 -1
  94. package/src/lib/server/agent-assignment.test.ts +112 -0
  95. package/src/lib/server/agent-assignment.ts +169 -0
  96. package/src/lib/server/approval-connector-notify.test.ts +253 -0
  97. package/src/lib/server/approvals-auto-approve.test.ts +205 -0
  98. package/src/lib/server/approvals.ts +483 -75
  99. package/src/lib/server/autonomy-runtime.test.ts +341 -0
  100. package/src/lib/server/browser-state.test.ts +118 -0
  101. package/src/lib/server/browser-state.ts +123 -0
  102. package/src/lib/server/build-llm.test.ts +36 -0
  103. package/src/lib/server/build-llm.ts +11 -4
  104. package/src/lib/server/builtin-plugins.ts +34 -0
  105. package/src/lib/server/capability-router.ts +10 -8
  106. package/src/lib/server/chat-execution-heartbeat.test.ts +40 -0
  107. package/src/lib/server/chat-execution-tool-events.test.ts +134 -0
  108. package/src/lib/server/chat-execution.ts +285 -165
  109. package/src/lib/server/chatroom-health.test.ts +26 -0
  110. package/src/lib/server/chatroom-health.ts +2 -3
  111. package/src/lib/server/chatroom-helpers.test.ts +67 -2
  112. package/src/lib/server/chatroom-helpers.ts +48 -8
  113. package/src/lib/server/connectors/discord.ts +175 -11
  114. package/src/lib/server/connectors/doctor.test.ts +80 -0
  115. package/src/lib/server/connectors/doctor.ts +116 -0
  116. package/src/lib/server/connectors/manager.ts +948 -112
  117. package/src/lib/server/connectors/policy.test.ts +222 -0
  118. package/src/lib/server/connectors/policy.ts +452 -0
  119. package/src/lib/server/connectors/slack.ts +188 -9
  120. package/src/lib/server/connectors/telegram.ts +65 -15
  121. package/src/lib/server/connectors/thread-context.test.ts +44 -0
  122. package/src/lib/server/connectors/thread-context.ts +72 -0
  123. package/src/lib/server/connectors/types.ts +41 -11
  124. package/src/lib/server/cost.ts +34 -1
  125. package/src/lib/server/daemon-state.ts +61 -3
  126. package/src/lib/server/data-dir.ts +13 -0
  127. package/src/lib/server/delegation-jobs.test.ts +140 -0
  128. package/src/lib/server/delegation-jobs.ts +248 -0
  129. package/src/lib/server/document-utils.test.ts +47 -0
  130. package/src/lib/server/document-utils.ts +397 -0
  131. package/src/lib/server/heartbeat-service.ts +14 -40
  132. package/src/lib/server/heartbeat-source.test.ts +22 -0
  133. package/src/lib/server/heartbeat-source.ts +7 -0
  134. package/src/lib/server/identity-continuity.test.ts +77 -0
  135. package/src/lib/server/identity-continuity.ts +127 -0
  136. package/src/lib/server/mailbox-utils.ts +347 -0
  137. package/src/lib/server/main-agent-loop.ts +28 -1103
  138. package/src/lib/server/memory-db.ts +4 -6
  139. package/src/lib/server/memory-tiers.ts +40 -0
  140. package/src/lib/server/openclaw-agent-resolver.test.ts +70 -0
  141. package/src/lib/server/openclaw-agent-resolver.ts +128 -0
  142. package/src/lib/server/openclaw-exec-config.ts +5 -6
  143. package/src/lib/server/openclaw-skills-normalize.test.ts +56 -0
  144. package/src/lib/server/openclaw-skills-normalize.ts +136 -0
  145. package/src/lib/server/openclaw-sync.ts +3 -2
  146. package/src/lib/server/orchestrator-lg.ts +20 -9
  147. package/src/lib/server/orchestrator.ts +7 -7
  148. package/src/lib/server/playwright-proxy.mjs +27 -3
  149. package/src/lib/server/plugins.test.ts +207 -0
  150. package/src/lib/server/plugins.ts +927 -66
  151. package/src/lib/server/provider-health.ts +38 -6
  152. package/src/lib/server/queue.ts +13 -28
  153. package/src/lib/server/scheduler.ts +2 -0
  154. package/src/lib/server/session-archive-memory.test.ts +85 -0
  155. package/src/lib/server/session-archive-memory.ts +230 -0
  156. package/src/lib/server/session-mailbox.ts +8 -18
  157. package/src/lib/server/session-reset-policy.test.ts +99 -0
  158. package/src/lib/server/session-reset-policy.ts +311 -0
  159. package/src/lib/server/session-run-manager.ts +33 -82
  160. package/src/lib/server/session-tools/autonomy-tools.test.ts +105 -0
  161. package/src/lib/server/session-tools/calendar.ts +366 -0
  162. package/src/lib/server/session-tools/canvas.ts +1 -1
  163. package/src/lib/server/session-tools/chatroom.ts +4 -2
  164. package/src/lib/server/session-tools/connector.ts +114 -10
  165. package/src/lib/server/session-tools/context.ts +21 -5
  166. package/src/lib/server/session-tools/crawl.ts +447 -0
  167. package/src/lib/server/session-tools/crud.ts +74 -28
  168. package/src/lib/server/session-tools/delegate-fallback.test.ts +219 -0
  169. package/src/lib/server/session-tools/delegate.ts +497 -24
  170. package/src/lib/server/session-tools/discovery.ts +24 -6
  171. package/src/lib/server/session-tools/document.ts +283 -0
  172. package/src/lib/server/session-tools/edit_file.ts +4 -2
  173. package/src/lib/server/session-tools/email.ts +320 -0
  174. package/src/lib/server/session-tools/extract.ts +137 -0
  175. package/src/lib/server/session-tools/file-normalize.test.ts +93 -0
  176. package/src/lib/server/session-tools/file-send.test.ts +84 -1
  177. package/src/lib/server/session-tools/file.ts +241 -25
  178. package/src/lib/server/session-tools/git.ts +1 -1
  179. package/src/lib/server/session-tools/http.ts +1 -1
  180. package/src/lib/server/session-tools/human-loop.ts +227 -0
  181. package/src/lib/server/session-tools/image-gen.ts +380 -0
  182. package/src/lib/server/session-tools/index.ts +130 -50
  183. package/src/lib/server/session-tools/mailbox.ts +276 -0
  184. package/src/lib/server/session-tools/memory.ts +172 -3
  185. package/src/lib/server/session-tools/monitor.ts +151 -8
  186. package/src/lib/server/session-tools/normalize-tool-args.ts +17 -14
  187. package/src/lib/server/session-tools/openclaw-nodes.ts +1 -1
  188. package/src/lib/server/session-tools/openclaw-workspace.ts +1 -1
  189. package/src/lib/server/session-tools/platform-normalize.test.ts +142 -0
  190. package/src/lib/server/session-tools/platform.ts +148 -7
  191. package/src/lib/server/session-tools/plugin-creator.ts +89 -26
  192. package/src/lib/server/session-tools/primitive-tools.test.ts +257 -0
  193. package/src/lib/server/session-tools/replicate.ts +301 -0
  194. package/src/lib/server/session-tools/sample-ui.ts +1 -1
  195. package/src/lib/server/session-tools/sandbox.ts +4 -2
  196. package/src/lib/server/session-tools/schedule.ts +24 -12
  197. package/src/lib/server/session-tools/session-info.ts +43 -7
  198. package/src/lib/server/session-tools/session-tools-wiring.test.ts +31 -17
  199. package/src/lib/server/session-tools/shell.ts +5 -2
  200. package/src/lib/server/session-tools/subagent.ts +194 -28
  201. package/src/lib/server/session-tools/table.ts +587 -0
  202. package/src/lib/server/session-tools/wallet.ts +42 -12
  203. package/src/lib/server/session-tools/web-browser-config.test.ts +39 -0
  204. package/src/lib/server/session-tools/web.ts +926 -91
  205. package/src/lib/server/storage.ts +255 -16
  206. package/src/lib/server/stream-agent-chat.ts +116 -268
  207. package/src/lib/server/structured-extract.test.ts +72 -0
  208. package/src/lib/server/structured-extract.ts +373 -0
  209. package/src/lib/server/task-mention.test.ts +16 -2
  210. package/src/lib/server/task-mention.ts +61 -10
  211. package/src/lib/server/tool-aliases.ts +66 -18
  212. package/src/lib/server/tool-capability-policy.test.ts +9 -9
  213. package/src/lib/server/tool-capability-policy.ts +38 -27
  214. package/src/lib/server/tool-retry.ts +2 -0
  215. package/src/lib/server/watch-jobs.test.ts +173 -0
  216. package/src/lib/server/watch-jobs.ts +532 -0
  217. package/src/lib/server/ws-hub.ts +5 -3
  218. package/src/lib/tool-definitions.ts +4 -0
  219. package/src/lib/validation/schemas.test.ts +26 -0
  220. package/src/lib/validation/schemas.ts +10 -1
  221. package/src/lib/ws-client.ts +14 -12
  222. package/src/proxy.ts +5 -5
  223. package/src/stores/use-app-store.ts +5 -11
  224. package/src/stores/use-chat-store.ts +38 -9
  225. package/src/types/index.ts +352 -47
  226. package/src/app/api/sessions/[id]/main-loop/route.ts +0 -94
  227. package/src/components/sessions/new-session-sheet.tsx +0 -253
  228. package/src/lib/server/main-session.ts +0 -24
  229. package/src/lib/server/session-run-manager.test.ts +0 -23
  230. /package/src/app/api/{sessions → chats}/[id]/clear/route.ts +0 -0
  231. /package/src/app/api/{sessions → chats}/[id]/deploy/route.ts +0 -0
  232. /package/src/app/api/{sessions → chats}/[id]/devserver/route.ts +0 -0
  233. /package/src/app/api/{sessions → chats}/[id]/edit-resend/route.ts +0 -0
  234. /package/src/app/api/{sessions → chats}/[id]/fork/route.ts +0 -0
  235. /package/src/app/api/{sessions → chats}/[id]/mailbox/route.ts +0 -0
  236. /package/src/app/api/{sessions → chats}/[id]/retry/route.ts +0 -0
  237. /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, deleteSession, devServer, checkBrowser, stopBrowser } from '@/lib/sessions'
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 PROMPT_SUGGESTIONS = [
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: 'Create a new agent for me', icon: 'bot', gradient: 'from-[#34D399]/10 to-[#6EE7B7]/5' },
30
- { text: 'Schedule a recurring task', icon: 'check', gradient: 'from-[#F59E0B]/10 to-[#FBBF24]/5' },
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?.tools?.includes('browser')) {
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 orchestrated or server-active sessions
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?.tools?.length
147
- const shouldPollMessages = !!sessionId && (isOrchestrated || isServerActive || isOngoingMonitored)
148
- const messagesLenRef = useRef(messages.length)
149
- messagesLenRef.current = messages.length
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
- if (msgs.length !== messagesLenRef.current) {
160
- const newMsgs = msgs.length > messagesLenRef.current ? msgs.slice(messagesLenRef.current) : []
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?.tools?.includes('browser')
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 deleteSession(sessionId)
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">How can I help?</span>
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
- Pick a prompt or type your own below
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
- {PROMPT_SUGGESTIONS.map((prompt, i) => (
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
- {!isMainChat && (
442
- <DropdownItem danger onClick={() => { setMenuOpen(false); setConfirmDelete(true) }}>
443
- Delete Chat
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={!isMainChat ? () => setConfirmDeleteAgent(true) : undefined}
504
- onDeleteChat={!isMainChat ? () => setConfirmDelete(true) : undefined}
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 SessionCard({ session, active, onClick }: Props) {
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', `/sessions/${session.id}`)
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.tools?.length ?? 0) > 0
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]">{session.name}</span>
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}