@swarmclawai/swarmclaw 0.7.7 → 0.8.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 (281) hide show
  1. package/README.md +12 -14
  2. package/next.config.ts +13 -2
  3. package/package.json +4 -2
  4. package/src/app/api/agents/[id]/thread/route.ts +9 -0
  5. package/src/app/api/agents/route.ts +4 -0
  6. package/src/app/api/agents/thread-route.test.ts +133 -0
  7. package/src/app/api/approvals/route.test.ts +148 -0
  8. package/src/app/api/canvas/[sessionId]/route.ts +3 -1
  9. package/src/app/api/chatrooms/[id]/chat/route.ts +4 -2
  10. package/src/app/api/chats/[id]/devserver/route.ts +48 -7
  11. package/src/app/api/chats/[id]/messages/route.ts +42 -18
  12. package/src/app/api/chats/[id]/route.ts +1 -1
  13. package/src/app/api/chats/[id]/stop/route.ts +5 -4
  14. package/src/app/api/chats/route.ts +23 -2
  15. package/src/app/api/clawhub/install/route.ts +28 -8
  16. package/src/app/api/connectors/[id]/route.ts +46 -3
  17. package/src/app/api/connectors/route.ts +12 -8
  18. package/src/app/api/external-agents/route.test.ts +165 -0
  19. package/src/app/api/gateways/[id]/health/route.ts +27 -12
  20. package/src/app/api/gateways/[id]/route.ts +2 -0
  21. package/src/app/api/gateways/health-route.test.ts +135 -0
  22. package/src/app/api/gateways/route.ts +2 -0
  23. package/src/app/api/mcp-servers/route.test.ts +130 -0
  24. package/src/app/api/openclaw/deploy/route.ts +38 -5
  25. package/src/app/api/plugins/install/route.ts +46 -6
  26. package/src/app/api/plugins/marketplace/route.ts +48 -15
  27. package/src/app/api/preview-server/route.ts +26 -11
  28. package/src/app/api/projects/[id]/route.ts +6 -2
  29. package/src/app/api/projects/route.ts +4 -3
  30. package/src/app/api/schedules/[id]/run/route.ts +4 -0
  31. package/src/app/api/schedules/route.test.ts +86 -0
  32. package/src/app/api/schedules/route.ts +6 -1
  33. package/src/app/api/secrets/[id]/route.ts +1 -0
  34. package/src/app/api/secrets/route.ts +2 -1
  35. package/src/app/api/settings/route.ts +2 -0
  36. package/src/app/api/setup/check-provider/route.test.ts +19 -0
  37. package/src/app/api/setup/check-provider/route.ts +40 -10
  38. package/src/app/api/skills/[id]/route.ts +12 -0
  39. package/src/app/api/skills/import/route.ts +14 -12
  40. package/src/app/api/skills/route.ts +13 -1
  41. package/src/app/api/tasks/[id]/route.ts +10 -1
  42. package/src/app/api/tasks/import/github/route.test.ts +65 -0
  43. package/src/app/api/tasks/import/github/route.ts +337 -0
  44. package/src/app/api/wallets/[id]/approve/route.ts +17 -3
  45. package/src/app/api/wallets/[id]/route.ts +79 -33
  46. package/src/app/api/wallets/[id]/send/route.ts +19 -33
  47. package/src/app/api/wallets/route.ts +78 -61
  48. package/src/app/api/webhooks/[id]/route.ts +33 -6
  49. package/src/app/api/webhooks/route.test.ts +272 -0
  50. package/src/cli/index.js +1 -0
  51. package/src/cli/spec.js +1 -0
  52. package/src/components/agents/agent-card.tsx +9 -2
  53. package/src/components/agents/agent-chat-list.tsx +18 -2
  54. package/src/components/agents/agent-list.tsx +1 -0
  55. package/src/components/agents/agent-sheet.tsx +257 -38
  56. package/src/components/agents/inspector-panel.tsx +41 -0
  57. package/src/components/canvas/canvas-panel.tsx +236 -65
  58. package/src/components/chat/chat-area.tsx +36 -19
  59. package/src/components/chat/chat-card.tsx +36 -13
  60. package/src/components/chat/chat-header.tsx +48 -16
  61. package/src/components/chat/chat-list.tsx +28 -4
  62. package/src/components/chat/checkpoint-timeline.tsx +50 -34
  63. package/src/components/chat/delegation-banner.test.ts +14 -1
  64. package/src/components/chat/delegation-banner.tsx +1 -1
  65. package/src/components/chat/message-bubble.tsx +208 -145
  66. package/src/components/chat/message-list.tsx +48 -19
  67. package/src/components/chatrooms/chatroom-message.tsx +2 -2
  68. package/src/components/chatrooms/chatroom-sheet.tsx +16 -2
  69. package/src/components/connectors/connector-health.tsx +1 -1
  70. package/src/components/connectors/connector-list.tsx +7 -2
  71. package/src/components/connectors/connector-sheet.tsx +337 -148
  72. package/src/components/gateways/gateway-sheet.tsx +2 -2
  73. package/src/components/layout/app-layout.tsx +40 -23
  74. package/src/components/mcp-servers/mcp-server-list.tsx +26 -5
  75. package/src/components/mcp-servers/mcp-server-sheet.tsx +19 -2
  76. package/src/components/openclaw/openclaw-deploy-panel.tsx +269 -21
  77. package/src/components/plugins/plugin-list.tsx +45 -9
  78. package/src/components/plugins/plugin-sheet.tsx +55 -7
  79. package/src/components/projects/project-detail.tsx +217 -0
  80. package/src/components/projects/project-sheet.tsx +176 -4
  81. package/src/components/providers/provider-list.tsx +2 -1
  82. package/src/components/providers/provider-sheet.tsx +21 -2
  83. package/src/components/schedules/schedule-card.tsx +25 -1
  84. package/src/components/schedules/schedule-sheet.tsx +44 -2
  85. package/src/components/secrets/secret-sheet.tsx +21 -2
  86. package/src/components/shared/agent-switch-dialog.tsx +12 -1
  87. package/src/components/shared/bottom-sheet.tsx +13 -3
  88. package/src/components/shared/command-palette.tsx +8 -1
  89. package/src/components/shared/confirm-dialog.tsx +19 -4
  90. package/src/components/shared/connector-platform-icon.test.ts +28 -0
  91. package/src/components/shared/connector-platform-icon.tsx +39 -6
  92. package/src/components/shared/settings/plugin-manager.tsx +29 -6
  93. package/src/components/shared/settings/section-capability-policy.tsx +45 -3
  94. package/src/components/shared/settings/section-voice.tsx +11 -3
  95. package/src/components/skills/skill-list.tsx +25 -0
  96. package/src/components/skills/skill-sheet.tsx +84 -12
  97. package/src/components/tasks/approvals-panel.tsx +289 -34
  98. package/src/components/tasks/task-board.tsx +410 -25
  99. package/src/components/tasks/task-card.tsx +66 -8
  100. package/src/components/tasks/task-sheet.tsx +16 -4
  101. package/src/components/ui/dialog.tsx +2 -2
  102. package/src/components/wallets/wallet-approval-dialog.tsx +4 -2
  103. package/src/components/wallets/wallet-panel.tsx +435 -90
  104. package/src/components/wallets/wallet-section.tsx +198 -48
  105. package/src/components/webhooks/webhook-sheet.tsx +22 -2
  106. package/src/lib/approval-display.ts +20 -0
  107. package/src/lib/canvas-content.ts +198 -0
  108. package/src/lib/chat-artifact-summary.ts +165 -0
  109. package/src/lib/chat-display.test.ts +91 -0
  110. package/src/lib/chat-display.ts +58 -0
  111. package/src/lib/chat-streaming-state.test.ts +47 -1
  112. package/src/lib/chat-streaming-state.ts +42 -0
  113. package/src/lib/ollama-model.ts +10 -0
  114. package/src/lib/openclaw-endpoint.test.ts +8 -0
  115. package/src/lib/openclaw-endpoint.ts +6 -1
  116. package/src/lib/plugin-install-cors.ts +46 -0
  117. package/src/lib/plugin-sources.test.ts +43 -0
  118. package/src/lib/plugin-sources.ts +77 -0
  119. package/src/lib/providers/ollama.ts +16 -6
  120. package/src/lib/providers/openclaw.test.ts +54 -0
  121. package/src/lib/providers/openclaw.ts +127 -11
  122. package/src/lib/schedule-dedupe-advanced.test.ts +1335 -0
  123. package/src/lib/schedule-dedupe.test.ts +66 -1
  124. package/src/lib/schedule-dedupe.ts +169 -12
  125. package/src/lib/schedule-origin.test.ts +20 -0
  126. package/src/lib/schedule-origin.ts +15 -0
  127. package/src/lib/server/__fixtures__/fake-mcp-stdio-server.mjs +27 -0
  128. package/src/lib/server/agent-availability.ts +16 -0
  129. package/src/lib/server/agent-runtime-config.ts +12 -4
  130. package/src/lib/server/agent-thread-session.test.ts +51 -0
  131. package/src/lib/server/agent-thread-session.ts +7 -0
  132. package/src/lib/server/approval-match.ts +205 -0
  133. package/src/lib/server/approvals-auto-approve.test.ts +538 -1
  134. package/src/lib/server/approvals.ts +214 -1
  135. package/src/lib/server/assistant-control.test.ts +29 -0
  136. package/src/lib/server/assistant-control.ts +23 -0
  137. package/src/lib/server/build-llm.test.ts +79 -0
  138. package/src/lib/server/build-llm.ts +14 -4
  139. package/src/lib/server/canvas-content.test.ts +32 -0
  140. package/src/lib/server/canvas-content.ts +6 -0
  141. package/src/lib/server/capability-router.test.ts +33 -0
  142. package/src/lib/server/capability-router.ts +80 -19
  143. package/src/lib/server/chat-execution-advanced.test.ts +651 -0
  144. package/src/lib/server/chat-execution-disabled.test.ts +94 -0
  145. package/src/lib/server/chat-execution-tool-events.test.ts +157 -0
  146. package/src/lib/server/chat-execution.ts +378 -73
  147. package/src/lib/server/clawhub-client.test.ts +14 -8
  148. package/src/lib/server/connectors/manager-reconnect.test.ts +47 -0
  149. package/src/lib/server/connectors/manager.test.ts +1147 -0
  150. package/src/lib/server/connectors/manager.ts +461 -137
  151. package/src/lib/server/connectors/pairing.ts +26 -5
  152. package/src/lib/server/connectors/types.ts +2 -0
  153. package/src/lib/server/connectors/whatsapp.test.ts +134 -0
  154. package/src/lib/server/connectors/whatsapp.ts +271 -47
  155. package/src/lib/server/context-manager.ts +6 -1
  156. package/src/lib/server/daemon-state.ts +84 -47
  157. package/src/lib/server/data-dir.test.ts +37 -0
  158. package/src/lib/server/data-dir.ts +20 -1
  159. package/src/lib/server/delegation-jobs-advanced.test.ts +513 -0
  160. package/src/lib/server/devserver-launch.test.ts +60 -0
  161. package/src/lib/server/devserver-launch.ts +85 -0
  162. package/src/lib/server/elevenlabs.test.ts +247 -1
  163. package/src/lib/server/elevenlabs.ts +147 -43
  164. package/src/lib/server/ethereum.ts +590 -0
  165. package/src/lib/server/eval/agent-regression-advanced.test.ts +302 -0
  166. package/src/lib/server/eval/agent-regression.test.ts +18 -1
  167. package/src/lib/server/eval/agent-regression.ts +383 -11
  168. package/src/lib/server/evm-swap.ts +475 -0
  169. package/src/lib/server/execution-log.ts +1 -0
  170. package/src/lib/server/heartbeat-service-timer.test.ts +173 -0
  171. package/src/lib/server/heartbeat-service.ts +20 -11
  172. package/src/lib/server/heartbeat-wake.test.ts +112 -0
  173. package/src/lib/server/heartbeat-wake.ts +338 -57
  174. package/src/lib/server/main-agent-loop-advanced.test.ts +538 -0
  175. package/src/lib/server/main-agent-loop.test.ts +260 -0
  176. package/src/lib/server/main-agent-loop.ts +559 -14
  177. package/src/lib/server/mcp-client.test.ts +16 -0
  178. package/src/lib/server/mcp-client.ts +25 -0
  179. package/src/lib/server/memory-integration.test.ts +719 -0
  180. package/src/lib/server/memory-policy.test.ts +43 -0
  181. package/src/lib/server/memory-policy.ts +132 -0
  182. package/src/lib/server/memory-tiers.test.ts +60 -0
  183. package/src/lib/server/memory-tiers.ts +16 -0
  184. package/src/lib/server/ollama-runtime.ts +58 -0
  185. package/src/lib/server/openclaw-deploy.test.ts +109 -1
  186. package/src/lib/server/openclaw-deploy.ts +557 -81
  187. package/src/lib/server/openclaw-gateway.test.ts +131 -0
  188. package/src/lib/server/openclaw-gateway.ts +10 -4
  189. package/src/lib/server/openclaw-health.test.ts +35 -0
  190. package/src/lib/server/openclaw-health.ts +215 -47
  191. package/src/lib/server/orchestrator-lg.ts +3 -2
  192. package/src/lib/server/orchestrator.ts +2 -0
  193. package/src/lib/server/plugins-advanced.test.ts +351 -0
  194. package/src/lib/server/plugins.ts +211 -6
  195. package/src/lib/server/project-context.ts +162 -0
  196. package/src/lib/server/project-utils.ts +150 -0
  197. package/src/lib/server/queue-advanced.test.ts +528 -0
  198. package/src/lib/server/queue-followups.test.ts +409 -2
  199. package/src/lib/server/queue-reconcile.test.ts +128 -0
  200. package/src/lib/server/queue.ts +527 -68
  201. package/src/lib/server/scheduler.ts +29 -1
  202. package/src/lib/server/session-note.test.ts +36 -0
  203. package/src/lib/server/session-note.ts +42 -0
  204. package/src/lib/server/session-run-manager.ts +83 -4
  205. package/src/lib/server/session-tools/canvas.ts +14 -12
  206. package/src/lib/server/session-tools/connector-inputs.test.ts +37 -0
  207. package/src/lib/server/session-tools/connector.test.ts +138 -0
  208. package/src/lib/server/session-tools/connector.ts +366 -54
  209. package/src/lib/server/session-tools/context.ts +17 -3
  210. package/src/lib/server/session-tools/crud.ts +484 -84
  211. package/src/lib/server/session-tools/delegate-fallback.test.ts +103 -0
  212. package/src/lib/server/session-tools/delegate-resume.test.ts +50 -0
  213. package/src/lib/server/session-tools/delegate.ts +102 -10
  214. package/src/lib/server/session-tools/discovery-approvals.test.ts +142 -0
  215. package/src/lib/server/session-tools/discovery.ts +80 -12
  216. package/src/lib/server/session-tools/file-normalize.test.ts +36 -0
  217. package/src/lib/server/session-tools/file.ts +43 -4
  218. package/src/lib/server/session-tools/human-loop.ts +35 -5
  219. package/src/lib/server/session-tools/index.ts +44 -9
  220. package/src/lib/server/session-tools/manage-connectors.test.ts +139 -0
  221. package/src/lib/server/session-tools/manage-schedules-advanced.test.ts +564 -0
  222. package/src/lib/server/session-tools/manage-schedules.test.ts +283 -0
  223. package/src/lib/server/session-tools/manage-tasks-advanced.test.ts +852 -0
  224. package/src/lib/server/session-tools/manage-tasks.test.ts +114 -0
  225. package/src/lib/server/session-tools/memory.test.ts +93 -0
  226. package/src/lib/server/session-tools/memory.ts +554 -75
  227. package/src/lib/server/session-tools/normalize-tool-args.ts +1 -1
  228. package/src/lib/server/session-tools/platform-access.test.ts +58 -0
  229. package/src/lib/server/session-tools/platform.ts +60 -19
  230. package/src/lib/server/session-tools/plugin-creator.ts +57 -1
  231. package/src/lib/server/session-tools/primitive-tools.test.ts +6 -0
  232. package/src/lib/server/session-tools/schedule.ts +6 -1
  233. package/src/lib/server/session-tools/shell-normalize.test.ts +25 -1
  234. package/src/lib/server/session-tools/shell.ts +22 -3
  235. package/src/lib/server/session-tools/wallet-tool.test.ts +254 -0
  236. package/src/lib/server/session-tools/wallet.ts +1374 -139
  237. package/src/lib/server/session-tools/web-inputs.test.ts +178 -0
  238. package/src/lib/server/session-tools/web.ts +621 -70
  239. package/src/lib/server/skill-discovery.ts +128 -0
  240. package/src/lib/server/skill-eligibility.test.ts +84 -0
  241. package/src/lib/server/skill-eligibility.ts +95 -0
  242. package/src/lib/server/skill-prompt-budget.test.ts +102 -0
  243. package/src/lib/server/skill-prompt-budget.ts +125 -0
  244. package/src/lib/server/skills-normalize.test.ts +54 -0
  245. package/src/lib/server/skills-normalize.ts +372 -26
  246. package/src/lib/server/solana.ts +214 -29
  247. package/src/lib/server/storage.ts +65 -36
  248. package/src/lib/server/stream-agent-chat.test.ts +437 -2
  249. package/src/lib/server/stream-agent-chat.ts +957 -79
  250. package/src/lib/server/system-events.ts +1 -1
  251. package/src/lib/server/tool-aliases.ts +2 -0
  252. package/src/lib/server/tool-capability-policy-advanced.test.ts +502 -0
  253. package/src/lib/server/tool-capability-policy.test.ts +24 -0
  254. package/src/lib/server/tool-capability-policy.ts +29 -1
  255. package/src/lib/server/tool-loop-detection.test.ts +105 -0
  256. package/src/lib/server/tool-loop-detection.ts +260 -0
  257. package/src/lib/server/tool-planning.test.ts +44 -0
  258. package/src/lib/server/tool-planning.ts +271 -0
  259. package/src/lib/server/wallet-execution.test.ts +198 -0
  260. package/src/lib/server/wallet-portfolio.test.ts +98 -0
  261. package/src/lib/server/wallet-portfolio.ts +724 -0
  262. package/src/lib/server/wallet-service.test.ts +57 -0
  263. package/src/lib/server/wallet-service.ts +213 -0
  264. package/src/lib/server/watch-jobs-advanced.test.ts +594 -0
  265. package/src/lib/server/watch-jobs.ts +17 -2
  266. package/src/lib/server/workspace-context.ts +111 -0
  267. package/src/lib/skill-save-payload.test.ts +39 -0
  268. package/src/lib/skill-save-payload.ts +37 -0
  269. package/src/lib/tasks.ts +28 -0
  270. package/src/lib/tool-definitions.ts +2 -1
  271. package/src/lib/tool-event-summary.test.ts +30 -0
  272. package/src/lib/tool-event-summary.ts +37 -0
  273. package/src/lib/validation/schemas.ts +1 -0
  274. package/src/lib/wallet-transactions.test.ts +75 -0
  275. package/src/lib/wallet-transactions.ts +43 -0
  276. package/src/lib/wallet.test.ts +17 -0
  277. package/src/lib/wallet.ts +183 -0
  278. package/src/proxy.test.ts +31 -0
  279. package/src/proxy.ts +34 -2
  280. package/src/stores/use-chat-store.ts +15 -1
  281. package/src/types/index.ts +249 -14
package/src/proxy.ts CHANGED
@@ -1,6 +1,11 @@
1
1
  import { NextResponse } from 'next/server'
2
2
  import type { NextRequest } from 'next/server'
3
3
  import { AUTH_COOKIE_NAME } from '@/lib/auth'
4
+ import {
5
+ buildPluginInstallCorsHeaders,
6
+ isPluginInstallCorsPath,
7
+ resolvePluginInstallCorsOrigin,
8
+ } from '@/lib/plugin-install-cors'
4
9
 
5
10
  /* ------------------------------------------------------------------ */
6
11
  /* Rate-limit state — HMR-safe via globalThis */
@@ -40,6 +45,16 @@ function getClientIp(request: NextRequest): string {
40
45
  return (request as unknown as { ip?: string }).ip ?? 'unknown'
41
46
  }
42
47
 
48
+ function withPluginInstallCorsHeaders(pathname: string, origin: string | null, headers?: HeadersInit): Headers {
49
+ const merged = new Headers(headers)
50
+ if (!isPluginInstallCorsPath(pathname)) return merged
51
+ const corsHeaders = buildPluginInstallCorsHeaders(origin)
52
+ new Headers(corsHeaders).forEach((value, key) => {
53
+ merged.set(key, value)
54
+ })
55
+ return merged
56
+ }
57
+
43
58
  /* ------------------------------------------------------------------ */
44
59
  /* Proxy */
45
60
  /* ------------------------------------------------------------------ */
@@ -51,11 +66,22 @@ function getClientIp(request: NextRequest): string {
51
66
  */
52
67
  export function proxy(request: NextRequest) {
53
68
  const { pathname } = request.nextUrl
69
+ const corsOrigin = resolvePluginInstallCorsOrigin(request.headers.get('origin'))
54
70
  const isWebhookTrigger = request.method === 'POST'
55
71
  && /^\/api\/webhooks\/[^/]+\/?$/.test(pathname)
56
72
  const isConnectorWebhook = request.method === 'POST'
57
73
  && /^\/api\/connectors\/[^/]+\/webhook\/?$/.test(pathname)
58
74
 
75
+ if (request.method === 'OPTIONS' && isPluginInstallCorsPath(pathname)) {
76
+ if (!corsOrigin) {
77
+ return NextResponse.json({ error: 'Origin not allowed' }, { status: 403 })
78
+ }
79
+ return new NextResponse(null, {
80
+ status: 204,
81
+ headers: buildPluginInstallCorsHeaders(corsOrigin),
82
+ })
83
+ }
84
+
59
85
  // Only protect API routes (not auth or inbound webhooks)
60
86
  if (
61
87
  !pathname.startsWith('/api/')
@@ -83,7 +109,10 @@ export function proxy(request: NextRequest) {
83
109
  const retryAfter = Math.ceil((entry.lockedUntil - Date.now()) / 1000)
84
110
  return NextResponse.json(
85
111
  { error: 'Too many failed attempts. Try again later.', retryAfter },
86
- { status: 429, headers: { 'Retry-After': String(retryAfter) } },
112
+ {
113
+ status: 429,
114
+ headers: withPluginInstallCorsHeaders(pathname, corsOrigin, { 'Retry-After': String(retryAfter) }),
115
+ },
87
116
  )
88
117
  }
89
118
 
@@ -106,7 +135,10 @@ export function proxy(request: NextRequest) {
106
135
  const remaining = Math.max(0, MAX_ATTEMPTS - current.count)
107
136
  return NextResponse.json(
108
137
  { error: 'Unauthorized' },
109
- { status: 401, headers: { 'X-RateLimit-Remaining': String(remaining) } },
138
+ {
139
+ status: 401,
140
+ headers: withPluginInstallCorsHeaders(pathname, corsOrigin, { 'X-RateLimit-Remaining': String(remaining) }),
141
+ },
110
142
  )
111
143
  }
112
144
 
@@ -36,7 +36,7 @@ interface ChatState {
36
36
  streamText: string
37
37
 
38
38
  // Task 1: Rich status indicator
39
- streamPhase: 'thinking' | 'tool' | 'responding'
39
+ streamPhase: 'thinking' | 'tool' | 'responding' | 'connecting'
40
40
  streamToolName: string
41
41
 
42
42
  // Task 2: Typing cadence simulation
@@ -359,6 +359,16 @@ export const useChatStore = create<ChatState>((set, get) => ({
359
359
  }
360
360
  return { toolEvents: events }
361
361
  })
362
+ } else if (event.t === 'reset') {
363
+ // Server rolled back state after a transient error — clear accumulated
364
+ // text and tool events so the retry starts with a clean slate.
365
+ fullText = event.text || ''
366
+ toolCallCounter = 0
367
+ soundFiredStart = false
368
+ if (_cadenceInterval) clearCadence()
369
+ _cadencePos = 0
370
+ _cadenceBuffer = ''
371
+ set({ streamText: fullText, displayText: fullText, toolEvents: [], streamPhase: 'connecting' })
362
372
  } else if (event.t === 'err') {
363
373
  const errText = event.text || 'Unknown'
364
374
  if (!shouldIgnoreTransientError(errText)) {
@@ -510,6 +520,10 @@ export const useChatStore = create<ChatState>((set, get) => ({
510
520
  (event: SSEEvent) => {
511
521
  if (event.t === 'd' || event.t === 'r') {
512
522
  fullText += event.text || ''
523
+ } else if (event.t === 'reset') {
524
+ fullText = event.text || ''
525
+ heartbeatToolEvents.length = 0
526
+ toolCallCounter = 0
513
527
  } else if (event.t === 'md') {
514
528
  // metadata only
515
529
  } else if (event.t === 'tool_call') {
@@ -3,6 +3,8 @@ export interface MessageToolEvent {
3
3
  input: string
4
4
  output?: string
5
5
  error?: boolean
6
+ /** Internal correlation token for matching streaming tool calls/results. */
7
+ toolCallId?: string
6
8
  }
7
9
 
8
10
  export interface Message {
@@ -20,6 +22,8 @@ export interface Message {
20
22
  suggestions?: string[]
21
23
  replyToId?: string
22
24
  source?: MessageSource
25
+ /** Persist in the UI transcript, but exclude from normal model history. */
26
+ historyExcluded?: boolean
23
27
  /** True while the message is still being streamed — cleared on final persist. */
24
28
  streaming?: boolean
25
29
  }
@@ -45,6 +49,52 @@ export interface SessionArchiveState {
45
49
  exportPath?: string | null
46
50
  }
47
51
 
52
+ export interface CanvasMetricItem {
53
+ label: string
54
+ value: string
55
+ detail?: string
56
+ tone?: 'default' | 'positive' | 'negative' | 'warning'
57
+ }
58
+
59
+ export interface CanvasCardItem {
60
+ title: string
61
+ body?: string
62
+ meta?: string
63
+ tone?: 'default' | 'positive' | 'negative' | 'warning'
64
+ }
65
+
66
+ export interface CanvasActionItem {
67
+ label: string
68
+ href?: string
69
+ note?: string
70
+ intent?: 'primary' | 'secondary' | 'success' | 'danger'
71
+ }
72
+
73
+ export interface CanvasTableData {
74
+ columns: string[]
75
+ rows: Array<Array<string | number | boolean | null>>
76
+ caption?: string
77
+ }
78
+
79
+ export type CanvasBlock =
80
+ | { type: 'markdown'; title?: string; markdown: string }
81
+ | { type: 'metrics'; title?: string; items: CanvasMetricItem[] }
82
+ | { type: 'cards'; title?: string; items: CanvasCardItem[] }
83
+ | { type: 'table'; title?: string; table: CanvasTableData }
84
+ | { type: 'code'; title?: string; code: string; language?: string }
85
+ | { type: 'actions'; title?: string; items: CanvasActionItem[] }
86
+
87
+ export interface CanvasDocument {
88
+ kind: 'structured'
89
+ title?: string
90
+ subtitle?: string
91
+ theme?: 'slate' | 'sky' | 'emerald' | 'amber' | 'rose'
92
+ blocks: CanvasBlock[]
93
+ updatedAt?: number | null
94
+ }
95
+
96
+ export type CanvasContent = string | CanvasDocument | null
97
+
48
98
  export type ProviderType = 'claude-cli' | 'codex-cli' | 'opencode-cli' | 'openai' | 'ollama' | 'anthropic' | 'openclaw' | 'google' | 'deepseek' | 'groq' | 'together' | 'mistral' | 'xai' | 'fireworks'
49
99
 
50
100
  export interface ProviderInfo {
@@ -106,6 +156,7 @@ export interface Session {
106
156
  }
107
157
  messages: Message[]
108
158
  createdAt: number
159
+ updatedAt?: number | null
109
160
  lastActiveAt: number
110
161
  active?: boolean
111
162
  sessionType?: SessionType
@@ -117,6 +168,9 @@ export interface Session {
117
168
  heartbeatEnabled?: boolean | null
118
169
  heartbeatIntervalSec?: number | null
119
170
  heartbeatTarget?: 'last' | 'none' | string | null
171
+ memoryScopeMode?: 'auto' | 'all' | 'global' | 'agent' | 'session' | 'project' | null
172
+ memoryTierPreference?: 'working' | 'durable' | 'archive' | 'blended' | null
173
+ projectId?: string | null
120
174
  sessionResetMode?: SessionResetMode | null
121
175
  sessionIdleTimeoutSec?: number | null
122
176
  sessionMaxAgeSec?: number | null
@@ -176,7 +230,7 @@ export interface Session {
176
230
  vibe?: string
177
231
  theme?: string
178
232
  avatar?: string
179
- canvasContent?: string | null
233
+ canvasContent?: CanvasContent
180
234
  }
181
235
 
182
236
  export type Sessions = Record<string, Session>
@@ -204,7 +258,15 @@ export type SessionTool =
204
258
 
205
259
  // --- Approvals ---
206
260
 
207
- export type ApprovalCategory = 'tool_access' | 'wallet_transfer' | 'plugin_scaffold' | 'plugin_install' | 'task_tool' | 'human_loop'
261
+ export type ApprovalCategory =
262
+ | 'tool_access'
263
+ | 'wallet_transfer'
264
+ | 'wallet_action'
265
+ | 'plugin_scaffold'
266
+ | 'plugin_install'
267
+ | 'task_tool'
268
+ | 'human_loop'
269
+ | 'connector_sender'
208
270
 
209
271
  export interface ApprovalRequest {
210
272
  id: string
@@ -285,7 +347,14 @@ export interface PluginHooks {
285
347
  onMessage?: (ctx: { session: Session; message: Message }) => Promise<void> | void
286
348
 
287
349
  // Post-turn hook — fires after a full chat exchange (user message → agent response)
288
- afterChatTurn?: (ctx: { session: Session; message: string; response: string; source: string; internal: boolean }) => Promise<void> | void
350
+ afterChatTurn?: (ctx: {
351
+ session: Session
352
+ message: string
353
+ response: string
354
+ source: string
355
+ internal: boolean
356
+ toolEvents?: MessageToolEvent[]
357
+ }) => Promise<void> | void
289
358
 
290
359
  // Orchestration & Swarm Hooks
291
360
  onTaskComplete?: (ctx: { taskId: string; result: unknown }) => Promise<void> | void
@@ -303,12 +372,45 @@ export interface PluginHooks {
303
372
 
304
373
  // Operating guidance — returns operational hints for the agent when this plugin is active
305
374
  getOperatingGuidance?: () => string | string[] | null | undefined
375
+
376
+ // Approval guidance — returns approval-scoped instructions when this plugin is active
377
+ getApprovalGuidance?: (ctx: {
378
+ approval: ApprovalRequest
379
+ phase: 'request' | 'resume' | 'connector_reminder'
380
+ approved?: boolean
381
+ }) => string | string[] | null | undefined
382
+ }
383
+
384
+ export interface PluginToolPlanning {
385
+ /**
386
+ * Capability tags that the harness can use for prompt guidance and tool routing.
387
+ * Examples: research.search, research.fetch, browser.capture, artifact.pdf,
388
+ * delivery.media, delivery.voice_note.
389
+ */
390
+ capabilities?: string[]
391
+ /**
392
+ * Concrete usage guidance that should be injected into the system prompt when
393
+ * this tool is enabled.
394
+ */
395
+ disciplineGuidance?: string[]
396
+ /**
397
+ * Optional natural-language cues that indicate when this tool should be
398
+ * preferred or explicitly invoked. These are declarative hints so the harness
399
+ * does not need to hard-code every plugin-specific workflow centrally.
400
+ */
401
+ requestMatchers?: Array<{
402
+ capability?: string
403
+ patterns?: string[]
404
+ requireLiteralUrl?: boolean
405
+ forbidLiteralUrl?: boolean
406
+ }>
306
407
  }
307
408
 
308
409
  export interface PluginToolDef {
309
410
  name: string
310
411
  description: string
311
412
  parameters: Record<string, unknown>
413
+ planning?: PluginToolPlanning
312
414
  execute: (args: Record<string, unknown>, ctx: { session: Session; message: string }) => Promise<string | object> | string | object
313
415
  }
314
416
 
@@ -404,7 +506,10 @@ export interface PluginMeta {
404
506
  isBuiltin?: boolean
405
507
  author?: string
406
508
  version?: string
407
- source?: 'local' | 'marketplace'
509
+ source?: 'local' | 'manual' | 'marketplace'
510
+ sourceLabel?: PluginPublisherSource
511
+ installSource?: PluginInstallSource
512
+ sourceUrl?: string
408
513
  openclaw?: boolean
409
514
  failureCount?: number
410
515
  lastFailureAt?: number
@@ -427,6 +532,26 @@ export interface PluginMeta {
427
532
  dependencyInstalledAt?: number
428
533
  }
429
534
 
535
+ export type PluginPublisherSource =
536
+ | 'builtin'
537
+ | 'local'
538
+ | 'manual'
539
+ | 'swarmclaw'
540
+ | 'swarmforge'
541
+ | 'clawhub'
542
+
543
+ export type PluginCatalogSource =
544
+ | 'swarmclaw'
545
+ | 'swarmclaw-site'
546
+ | 'swarmforge'
547
+ | 'clawhub'
548
+
549
+ export type PluginInstallSource =
550
+ | 'builtin'
551
+ | 'local'
552
+ | 'manual'
553
+ | PluginCatalogSource
554
+
430
555
  export type PluginPackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun'
431
556
  export type PluginDependencyInstallStatus = 'none' | 'ready' | 'installing' | 'installed' | 'error'
432
557
 
@@ -437,18 +562,20 @@ export interface MarketplacePlugin {
437
562
  author: string
438
563
  version: string
439
564
  url: string
440
- source?: 'swarmclaw' | 'clawhub'
565
+ source?: PluginPublisherSource
566
+ catalogSource?: PluginCatalogSource
441
567
  tags?: string[]
442
568
  openclaw?: boolean
443
569
  downloads?: number
444
570
  }
445
571
 
446
572
  export interface SSEEvent {
447
- t: 'd' | 'md' | 'r' | 'done' | 'err' | 'tool_call' | 'tool_result' | 'status' | 'thinking' | 'cr_agent_start' | 'cr_agent_done'
573
+ t: 'd' | 'md' | 'r' | 'done' | 'err' | 'tool_call' | 'tool_result' | 'status' | 'thinking' | 'reset' | 'cr_agent_start' | 'cr_agent_done'
448
574
  text?: string
449
575
  toolName?: string
450
576
  toolInput?: string
451
577
  toolOutput?: string
578
+ toolCallId?: string
452
579
  agentId?: string
453
580
  agentName?: string
454
581
  }
@@ -542,10 +669,16 @@ export interface Agent {
542
669
  pinned?: boolean
543
670
  lastUsedAt?: number
544
671
  totalCost?: number
672
+ disabled?: boolean
545
673
  trashedAt?: number
546
674
  openclawSkillMode?: SkillAllowlistMode
547
675
  openclawAllowedSkills?: string[]
676
+ walletIds?: string[]
677
+ activeWalletId?: string | null
678
+ /** @deprecated Use walletIds + activeWalletId */
548
679
  walletId?: string | null
680
+ responseStyle?: 'concise' | 'normal' | 'detailed' | null
681
+ responseMaxChars?: number | null
549
682
  monthlyBudget?: number | null
550
683
  dailyBudget?: number | null
551
684
  hourlyBudget?: number | null
@@ -565,7 +698,7 @@ export interface Agent {
565
698
 
566
699
  // --- Agent Wallets ---
567
700
 
568
- export type WalletChain = 'solana'
701
+ export type WalletChain = 'solana' | 'ethereum'
569
702
 
570
703
  export interface AgentWallet {
571
704
  id: string
@@ -574,13 +707,41 @@ export interface AgentWallet {
574
707
  publicKey: string
575
708
  encryptedPrivateKey: string // AES-256-GCM via encryptKey()
576
709
  label?: string
577
- spendingLimitLamports?: number // per-tx cap (default 0.1 SOL = 100_000_000)
578
- dailyLimitLamports?: number // 24h rolling cap (default 1 SOL = 1_000_000_000)
710
+ spendingLimitAtomic?: string
711
+ dailyLimitAtomic?: string
712
+ /** @deprecated Use spendingLimitAtomic */
713
+ spendingLimitLamports?: number
714
+ /** @deprecated Use dailyLimitAtomic */
715
+ dailyLimitLamports?: number
579
716
  requireApproval: boolean // default true
580
717
  createdAt: number
581
718
  updatedAt: number
582
719
  }
583
720
 
721
+ export interface WalletAssetBalance {
722
+ id: string
723
+ chain: WalletChain
724
+ networkId: string
725
+ networkLabel: string
726
+ symbol: string
727
+ name?: string
728
+ decimals: number
729
+ balanceAtomic: string
730
+ balanceFormatted?: string
731
+ balanceDisplay?: string
732
+ isNative: boolean
733
+ contractAddress?: string
734
+ tokenMint?: string
735
+ explorerUrl?: string
736
+ }
737
+
738
+ export interface WalletPortfolioSummary {
739
+ totalAssets: number
740
+ nonZeroAssets: number
741
+ tokenAssets: number
742
+ networkCount: number
743
+ }
744
+
584
745
  export type WalletTransactionType = 'send' | 'receive' | 'swap'
585
746
  export type WalletTransactionStatus = 'pending_approval' | 'pending' | 'confirmed' | 'failed' | 'denied'
586
747
 
@@ -593,19 +754,25 @@ export interface WalletTransaction {
593
754
  signature: string
594
755
  fromAddress: string
595
756
  toAddress: string
596
- amountLamports: number
757
+ amountAtomic?: string
758
+ feeAtomic?: string
759
+ /** @deprecated Use amountAtomic */
760
+ amountLamports?: number
761
+ /** @deprecated Use feeAtomic */
597
762
  feeLamports?: number
598
763
  status: WalletTransactionStatus
599
764
  memo?: string // agent's reason for tx
600
765
  approvedBy?: 'user' | 'auto'
601
- tokenMint?: string // null = native SOL
766
+ tokenMint?: string // null = native chain asset
602
767
  timestamp: number
603
768
  }
604
769
 
605
770
  export interface WalletBalanceSnapshot {
606
771
  id: string
607
772
  walletId: string
608
- balanceLamports: number
773
+ balanceAtomic?: string
774
+ /** @deprecated Use balanceAtomic */
775
+ balanceLamports?: number
609
776
  timestamp: number
610
777
  }
611
778
 
@@ -642,6 +809,11 @@ export interface Schedule {
642
809
  runNumber?: number
643
810
  createdByAgentId?: string | null
644
811
  createdInSessionId?: string | null
812
+ followupConnectorId?: string | null
813
+ followupChannelId?: string | null
814
+ followupThreadId?: string | null
815
+ followupSenderId?: string | null
816
+ followupSenderName?: string | null
645
817
  createdAt: number
646
818
  updatedAt?: number
647
819
  }
@@ -934,6 +1106,15 @@ export interface Project {
934
1106
  name: string
935
1107
  description: string
936
1108
  color?: string
1109
+ objective?: string
1110
+ audience?: string
1111
+ priorities?: string[]
1112
+ openObjectives?: string[]
1113
+ capabilityHints?: string[]
1114
+ credentialRequirements?: string[]
1115
+ successMetrics?: string[]
1116
+ heartbeatPrompt?: string
1117
+ heartbeatIntervalSec?: number
937
1118
  createdAt: number
938
1119
  updatedAt: number
939
1120
  }
@@ -1065,6 +1246,8 @@ export interface AppSettings {
1065
1246
  capabilityBlockedTools?: string[]
1066
1247
  capabilityBlockedCategories?: string[]
1067
1248
  capabilityAllowedTools?: string[]
1249
+ taskManagementEnabled?: boolean
1250
+ projectManagementEnabled?: boolean
1068
1251
  // Memory governance
1069
1252
  memoryWorkingTtlHours?: number
1070
1253
  memoryDefaultConfidence?: number
@@ -1128,6 +1311,7 @@ export interface OrchestratorSecret {
1128
1311
  encryptedValue: string
1129
1312
  scope: 'global' | 'agent'
1130
1313
  agentIds: string[] // if scope === 'agent', which agents can use it
1314
+ projectId?: string
1131
1315
  createdAt: number
1132
1316
  updatedAt: number
1133
1317
  }
@@ -1207,6 +1391,8 @@ export interface OpenClawDeploymentConfig {
1207
1391
  useCase?: OpenClawUseCaseTemplate | null
1208
1392
  exposure?: OpenClawExposurePreset | null
1209
1393
  managedBy?: 'swarmclaw' | 'manual' | null
1394
+ localInstanceId?: string | null
1395
+ localPort?: number | null
1210
1396
  targetHost?: string | null
1211
1397
  sshHost?: string | null
1212
1398
  sshUser?: string | null
@@ -1334,6 +1520,7 @@ export interface AgentPackEntry {
1334
1520
  tools?: string[]
1335
1521
  plugins?: string[]
1336
1522
  capabilities?: string[]
1523
+ elevenLabsVoiceId?: string | null
1337
1524
  soul?: string
1338
1525
  systemPrompt?: string
1339
1526
  }
@@ -1395,12 +1582,32 @@ export interface Skill {
1395
1582
  description?: string
1396
1583
  sourceUrl?: string
1397
1584
  sourceFormat?: 'openclaw' | 'plain'
1585
+ author?: string
1586
+ tags?: string[]
1587
+ version?: string
1588
+ homepage?: string
1589
+ primaryEnv?: string | null
1590
+ skillKey?: string | null
1591
+ always?: boolean
1592
+ installOptions?: SkillInstallOption[]
1593
+ skillRequirements?: SkillRequirements
1594
+ detectedEnvVars?: string[]
1595
+ security?: SkillSecuritySummary | null
1596
+ frontmatter?: Record<string, unknown> | null
1398
1597
  scope?: 'global' | 'agent'
1399
1598
  agentIds?: string[]
1400
1599
  createdAt: number
1401
1600
  updatedAt: number
1402
1601
  }
1403
1602
 
1603
+ export interface SkillSecuritySummary {
1604
+ level: 'low' | 'medium' | 'high'
1605
+ notes: string[]
1606
+ detectedEnvVars?: string[]
1607
+ missingDeclarations?: string[]
1608
+ installCommands?: string[]
1609
+ }
1610
+
1404
1611
  // --- Connector Health Events ---
1405
1612
 
1406
1613
  export type ConnectorHealthEventType = 'started' | 'stopped' | 'error' | 'reconnected' | 'disconnected'
@@ -1415,7 +1622,20 @@ export interface ConnectorHealthEvent {
1415
1622
 
1416
1623
  // --- Connectors (Chat Platform Bridges) ---
1417
1624
 
1418
- export type ConnectorPlatform = 'discord' | 'telegram' | 'slack' | 'whatsapp' | 'openclaw' | 'bluebubbles' | 'signal' | 'teams' | 'googlechat' | 'matrix' | 'email'
1625
+ export type ConnectorPlatform =
1626
+ | 'discord'
1627
+ | 'telegram'
1628
+ | 'slack'
1629
+ | 'whatsapp'
1630
+ | 'openclaw'
1631
+ | 'bluebubbles'
1632
+ | 'signal'
1633
+ | 'teams'
1634
+ | 'googlechat'
1635
+ | 'matrix'
1636
+ | 'email'
1637
+ | 'webchat'
1638
+ | 'mockmail'
1419
1639
  export type ConnectorStatus = 'stopped' | 'running' | 'error'
1420
1640
 
1421
1641
  export interface MessageSource {
@@ -1502,6 +1722,11 @@ export interface BoardTask {
1502
1722
  images?: string[]
1503
1723
  createdByAgentId?: string | null
1504
1724
  createdInSessionId?: string | null
1725
+ followupConnectorId?: string | null
1726
+ followupChannelId?: string | null
1727
+ followupThreadId?: string | null
1728
+ followupSenderId?: string | null
1729
+ followupSenderName?: string | null
1505
1730
  delegatedByAgentId?: string | null
1506
1731
  delegatedFromTaskId?: string | null
1507
1732
  delegationDepth?: number | null
@@ -1519,10 +1744,20 @@ export interface BoardTask {
1519
1744
  totalRuns?: number
1520
1745
  totalCompleted?: number
1521
1746
  totalFailed?: number
1522
- sourceType?: 'schedule' | 'delegation' | 'manual'
1747
+ sourceType?: 'schedule' | 'delegation' | 'manual' | 'import'
1523
1748
  sourceScheduleId?: string | null
1524
1749
  sourceScheduleName?: string | null
1525
1750
  sourceScheduleKey?: string | null
1751
+ externalSource?: {
1752
+ source: string
1753
+ id?: string | null
1754
+ repo?: string | null
1755
+ number?: number | null
1756
+ state?: string | null
1757
+ labels?: string[]
1758
+ assignee?: string | null
1759
+ url?: string | null
1760
+ } | null
1526
1761
  deadLetteredAt?: number | null
1527
1762
  cliResumeId?: string | null
1528
1763
  cliProvider?: string | null