@swarmclawai/swarmclaw 1.2.8 → 1.2.9

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 (195) hide show
  1. package/README.md +30 -6
  2. package/package.json +2 -2
  3. package/src/app/agents/[id]/page.tsx +1 -18
  4. package/src/app/api/agents/thread-route.test.ts +0 -1
  5. package/src/app/api/approvals/route.test.ts +6 -22
  6. package/src/app/api/connectors/route.ts +2 -2
  7. package/src/app/api/portability/export/route.ts +8 -0
  8. package/src/app/api/portability/import/route.test.ts +80 -0
  9. package/src/app/api/portability/import/route.ts +28 -0
  10. package/src/app/api/settings/route.ts +0 -2
  11. package/src/app/api/wallets/[id]/route.ts +15 -157
  12. package/src/app/api/wallets/generate/route.ts +22 -0
  13. package/src/app/api/wallets/route.test.ts +147 -0
  14. package/src/app/api/wallets/route.ts +13 -95
  15. package/src/app/autonomy/page.tsx +2 -57
  16. package/src/app/protocols/page.tsx +2 -21
  17. package/src/app/settings/page.tsx +0 -9
  18. package/src/app/wallets/page.tsx +105 -5
  19. package/src/cli/index.js +21 -33
  20. package/src/cli/spec.js +19 -30
  21. package/src/components/agents/agent-sheet.tsx +2 -40
  22. package/src/components/agents/inspector-panel.tsx +0 -83
  23. package/src/components/chat/chat-card.tsx +0 -31
  24. package/src/components/chat/message-bubble.tsx +1 -108
  25. package/src/components/connectors/connector-sheet.tsx +25 -1
  26. package/src/components/layout/sidebar-rail.tsx +6 -10
  27. package/src/components/projects/project-detail.tsx +3 -35
  28. package/src/components/projects/tabs/overview-tab.tsx +3 -59
  29. package/src/components/projects/tabs/work-tab.tsx +7 -77
  30. package/src/components/protocols/structured-session-launcher.tsx +1 -22
  31. package/src/components/shared/connector-platform-icon.tsx +1 -0
  32. package/src/components/tasks/task-card.tsx +4 -34
  33. package/src/components/tasks/task-sheet.tsx +6 -36
  34. package/src/components/wallets/wallet-list.tsx +150 -0
  35. package/src/lib/app/navigation.test.ts +0 -13
  36. package/src/lib/app/navigation.ts +2 -7
  37. package/src/lib/app/view-constants.ts +14 -19
  38. package/src/lib/server/agents/agent-thread-session.ts +0 -1
  39. package/src/lib/server/agents/delegation-advisory.test.ts +0 -1
  40. package/src/lib/server/agents/delegation-jobs.test.ts +0 -69
  41. package/src/lib/server/agents/delegation-jobs.ts +0 -25
  42. package/src/lib/server/agents/main-agent-loop.ts +1 -49
  43. package/src/lib/server/agents/subagent-runtime.ts +0 -1
  44. package/src/lib/server/approval-match.ts +0 -85
  45. package/src/lib/server/approvals.test.ts +6 -6
  46. package/src/lib/server/approvals.ts +0 -6
  47. package/src/lib/server/autonomy/supervisor-reflection.test.ts +0 -1
  48. package/src/lib/server/builtin-extensions.ts +0 -2
  49. package/src/lib/server/capability-router.test.ts +0 -2
  50. package/src/lib/server/chat-execution/chat-execution-tool-events.test.ts +14 -14
  51. package/src/lib/server/chat-execution/chat-execution-types.ts +0 -2
  52. package/src/lib/server/chat-execution/chat-execution-utils.ts +0 -2
  53. package/src/lib/server/chat-execution/chat-streaming-utils.ts +2 -30
  54. package/src/lib/server/chat-execution/chat-turn-finalization.ts +1 -36
  55. package/src/lib/server/chat-execution/chat-turn-preparation.ts +2 -22
  56. package/src/lib/server/chat-execution/iteration-event-handler.ts +0 -24
  57. package/src/lib/server/chat-execution/message-classifier.test.ts +0 -45
  58. package/src/lib/server/chat-execution/message-classifier.ts +1 -16
  59. package/src/lib/server/chat-execution/prompt-builder.test.ts +0 -1
  60. package/src/lib/server/chat-execution/prompt-builder.ts +0 -30
  61. package/src/lib/server/chat-execution/prompt-sections.ts +0 -1
  62. package/src/lib/server/chat-execution/situational-awareness.test.ts +2 -73
  63. package/src/lib/server/chat-execution/situational-awareness.ts +4 -38
  64. package/src/lib/server/chat-execution/stream-agent-chat.test.ts +8 -123
  65. package/src/lib/server/chat-execution/stream-agent-chat.ts +1 -5
  66. package/src/lib/server/chat-execution/stream-continuation.test.ts +4 -52
  67. package/src/lib/server/chat-execution/stream-continuation.ts +6 -48
  68. package/src/lib/server/chatrooms/session-mailbox.ts +0 -10
  69. package/src/lib/server/chats/chat-session-service.ts +3 -5
  70. package/src/lib/server/connectors/connector-inbound.ts +0 -1
  71. package/src/lib/server/connectors/connector-lifecycle.ts +19 -3
  72. package/src/lib/server/connectors/connector-service.ts +39 -9
  73. package/src/lib/server/connectors/swarmdock-bidding.ts +74 -0
  74. package/src/lib/server/connectors/swarmdock-payloads.test.ts +85 -0
  75. package/src/lib/server/connectors/swarmdock-secret.test.ts +128 -0
  76. package/src/lib/server/connectors/swarmdock-secret.ts +152 -0
  77. package/src/lib/server/connectors/swarmdock-tasks.ts +119 -0
  78. package/src/lib/server/connectors/swarmdock.ts +255 -0
  79. package/src/lib/server/execution-brief.test.ts +2 -25
  80. package/src/lib/server/execution-brief.ts +12 -35
  81. package/src/lib/server/execution-engine/task-attempt.ts +0 -1
  82. package/src/lib/server/persistence/storage-context.ts +0 -5
  83. package/src/lib/server/portability/export.ts +109 -0
  84. package/src/lib/server/portability/import.ts +159 -0
  85. package/src/lib/server/protocols/protocol-normalization.ts +0 -4
  86. package/src/lib/server/protocols/protocol-queries.ts +0 -6
  87. package/src/lib/server/protocols/protocol-run-lifecycle.ts +4 -32
  88. package/src/lib/server/protocols/protocol-service.ts +0 -1
  89. package/src/lib/server/protocols/protocol-step-helpers.ts +0 -4
  90. package/src/lib/server/protocols/protocol-step-processors.ts +0 -6
  91. package/src/lib/server/protocols/protocol-swarm.ts +0 -2
  92. package/src/lib/server/protocols/protocol-types.ts +0 -2
  93. package/src/lib/server/provider-health.ts +0 -9
  94. package/src/lib/server/runtime/daemon-state/core.ts +0 -9
  95. package/src/lib/server/runtime/daemon-state.test.ts +0 -35
  96. package/src/lib/server/runtime/heartbeat-service.ts +3 -23
  97. package/src/lib/server/runtime/queue/core.ts +11 -33
  98. package/src/lib/server/runtime/runtime-storage-write-paths.test.ts +6 -6
  99. package/src/lib/server/runtime/scheduler.ts +0 -13
  100. package/src/lib/server/runtime/session-run-manager/drain.ts +0 -24
  101. package/src/lib/server/runtime/session-run-manager/enqueue.ts +0 -1
  102. package/src/lib/server/runtime/session-run-manager/queries.ts +0 -1
  103. package/src/lib/server/runtime/session-run-manager/recovery.ts +0 -1
  104. package/src/lib/server/runtime/session-run-manager.test.ts +0 -28
  105. package/src/lib/server/session-tools/crud.ts +0 -14
  106. package/src/lib/server/session-tools/delegate.ts +0 -4
  107. package/src/lib/server/session-tools/index.ts +0 -4
  108. package/src/lib/server/session-tools/team-context.ts +0 -3
  109. package/src/lib/server/storage-normalization.ts +8 -0
  110. package/src/lib/server/storage.ts +18 -45
  111. package/src/lib/server/tasks/task-checkout.ts +59 -0
  112. package/src/lib/server/tasks/task-lifecycle.ts +2 -0
  113. package/src/lib/server/tasks/task-route-service.ts +4 -26
  114. package/src/lib/server/tasks/task-service.ts +0 -7
  115. package/src/lib/server/tool-aliases.ts +0 -1
  116. package/src/lib/server/tool-capability-policy-advanced.test.ts +4 -4
  117. package/src/lib/server/tool-capability-policy.ts +0 -2
  118. package/src/lib/server/tool-planning.ts +0 -12
  119. package/src/lib/server/universal-tool-access.ts +0 -1
  120. package/src/lib/server/wallets/wallet-crypto.ts +33 -0
  121. package/src/lib/server/wallets/wallet-repository.ts +24 -0
  122. package/src/lib/server/wallets/wallet-service.ts +119 -0
  123. package/src/lib/server/working-state/extraction.ts +8 -42
  124. package/src/lib/server/working-state/normalization.ts +10 -103
  125. package/src/lib/server/working-state/service.ts +12 -21
  126. package/src/lib/strip-internal-metadata.test.ts +1 -1
  127. package/src/lib/strip-internal-metadata.ts +1 -1
  128. package/src/lib/tool-definitions.ts +0 -1
  129. package/src/lib/validation/schemas.ts +33 -2
  130. package/src/stores/slices/data-slice.ts +5 -1
  131. package/src/stores/slices/ui-slice.ts +0 -4
  132. package/src/types/agent.ts +0 -84
  133. package/src/types/app-settings.ts +0 -2
  134. package/src/types/approval.ts +0 -2
  135. package/src/types/connector.ts +1 -0
  136. package/src/types/index.ts +1 -1
  137. package/src/types/message.ts +0 -1
  138. package/src/types/misc.ts +0 -2
  139. package/src/types/protocol.ts +0 -2
  140. package/src/types/run.ts +0 -3
  141. package/src/types/session.ts +1 -51
  142. package/src/types/swarmdock.ts +29 -0
  143. package/src/types/task.ts +7 -3
  144. package/src/types/working-state.ts +2 -9
  145. package/src/views/settings/section-runtime-loop.tsx +0 -14
  146. package/src/app/api/canvas/[sessionId]/route.ts +0 -35
  147. package/src/app/api/missions/[id]/actions/route.ts +0 -31
  148. package/src/app/api/missions/[id]/events/route.ts +0 -14
  149. package/src/app/api/missions/[id]/route.ts +0 -10
  150. package/src/app/api/missions/route.test.ts +0 -244
  151. package/src/app/api/missions/route.ts +0 -57
  152. package/src/app/api/wallets/[id]/approve/route.ts +0 -79
  153. package/src/app/api/wallets/[id]/balance-history/route.ts +0 -18
  154. package/src/app/api/wallets/[id]/send/route.ts +0 -113
  155. package/src/app/api/wallets/[id]/transactions/route.ts +0 -18
  156. package/src/app/missions/[id]/page.tsx +0 -3
  157. package/src/app/missions/page.tsx +0 -685
  158. package/src/components/canvas/canvas-panel.tsx +0 -267
  159. package/src/components/wallets/wallet-approval-dialog.tsx +0 -107
  160. package/src/components/wallets/wallet-panel.tsx +0 -1010
  161. package/src/components/wallets/wallet-section.tsx +0 -260
  162. package/src/features/missions/queries.ts +0 -23
  163. package/src/lib/canvas-content.test.ts +0 -360
  164. package/src/lib/canvas-content.ts +0 -198
  165. package/src/lib/server/canvas-content.test.ts +0 -32
  166. package/src/lib/server/canvas-content.ts +0 -6
  167. package/src/lib/server/ethereum.ts +0 -591
  168. package/src/lib/server/evm-swap.ts +0 -476
  169. package/src/lib/server/missions/mission-intent.test.ts +0 -63
  170. package/src/lib/server/missions/mission-intent.ts +0 -569
  171. package/src/lib/server/missions/mission-repository.ts +0 -74
  172. package/src/lib/server/missions/mission-service/actions.ts +0 -6
  173. package/src/lib/server/missions/mission-service/bindings.ts +0 -9
  174. package/src/lib/server/missions/mission-service/context.ts +0 -4
  175. package/src/lib/server/missions/mission-service/core.ts +0 -2271
  176. package/src/lib/server/missions/mission-service/queries.ts +0 -12
  177. package/src/lib/server/missions/mission-service/recovery.ts +0 -5
  178. package/src/lib/server/missions/mission-service/ticks.ts +0 -9
  179. package/src/lib/server/missions/mission-service.test.ts +0 -888
  180. package/src/lib/server/missions/mission-service.ts +0 -6
  181. package/src/lib/server/session-tools/canvas.ts +0 -105
  182. package/src/lib/server/session-tools/wallet-tool.test.ts +0 -150
  183. package/src/lib/server/session-tools/wallet.ts +0 -1287
  184. package/src/lib/server/solana.ts +0 -327
  185. package/src/lib/server/wallet/wallet-execution.test.ts +0 -198
  186. package/src/lib/server/wallet/wallet-portfolio.test.ts +0 -98
  187. package/src/lib/server/wallet/wallet-portfolio.ts +0 -772
  188. package/src/lib/server/wallet/wallet-service.test.ts +0 -81
  189. package/src/lib/server/wallet/wallet-service.ts +0 -225
  190. package/src/lib/wallet/wallet-transactions.test.ts +0 -75
  191. package/src/lib/wallet/wallet-transactions.ts +0 -43
  192. package/src/lib/wallet/wallet.test.ts +0 -333
  193. package/src/lib/wallet/wallet.ts +0 -183
  194. package/src/types/mission.ts +0 -185
  195. package/src/views/settings/section-wallets.tsx +0 -35
@@ -1,6 +0,0 @@
1
- export * from './mission-service/queries'
2
- export * from './mission-service/recovery'
3
- export * from './mission-service/ticks'
4
- export * from './mission-service/bindings'
5
- export * from './mission-service/actions'
6
- export * from './mission-service/context'
@@ -1,105 +0,0 @@
1
- import { z } from 'zod'
2
- import { tool, type StructuredToolInterface } from '@langchain/core/tools'
3
- import { loadSessions, saveSessions } from '../storage'
4
- import { notify } from '../ws-hub'
5
- import type { ToolBuildContext } from './context'
6
- import type { Extension, ExtensionHooks } from '@/types'
7
- import { registerNativeCapability } from '../native-capabilities'
8
- import { normalizeToolInputArgs } from './normalize-tool-args'
9
- import { normalizeCanvasContent, summarizeCanvasContent } from '@/lib/canvas-content'
10
- import { errorMessage } from '@/lib/shared-utils'
11
-
12
- /**
13
- * Core Canvas Execution Logic
14
- */
15
- async function executeCanvasAction(args: Record<string, unknown>, context: { sessionId?: string }) {
16
- const normalized = normalizeToolInputArgs(args)
17
- const action = normalized.action as string
18
- const content = normalized.content as string | undefined
19
- const document = normalized.document
20
- try {
21
- const sessionId = context.sessionId
22
- if (!sessionId) return 'Error: no active session for canvas.'
23
-
24
- const sessions = loadSessions()
25
- const session = sessions[sessionId]
26
- if (!session) return 'Error: session not found.'
27
-
28
- if (action === 'present') {
29
- const nextContent = normalizeCanvasContent(document ?? content)
30
- if (!nextContent) return 'Error: content or document is required for present action.'
31
- ;(session as unknown as Record<string, unknown>).canvasContent = nextContent
32
- session.lastActiveAt = Date.now()
33
- sessions[sessionId] = session
34
- saveSessions(sessions)
35
- notify(`canvas:${sessionId}`)
36
- return JSON.stringify({
37
- ok: true,
38
- action: 'present',
39
- ...summarizeCanvasContent(nextContent),
40
- })
41
- }
42
-
43
- if (action === 'hide') {
44
- ;(session as unknown as Record<string, unknown>).canvasContent = null
45
- session.lastActiveAt = Date.now()
46
- sessions[sessionId] = session
47
- saveSessions(sessions)
48
- notify(`canvas:${sessionId}`)
49
- return JSON.stringify({ ok: true, action: 'hide' })
50
- }
51
-
52
- if (action === 'snapshot') {
53
- const current = normalizeCanvasContent((session as unknown as Record<string, unknown>).canvasContent)
54
- return JSON.stringify({ ok: true, action: 'snapshot', ...summarizeCanvasContent(current) })
55
- }
56
-
57
- return `Unknown canvas action "${action}".`
58
- } catch (err: unknown) {
59
- return `Error: ${errorMessage(err)}`
60
- }
61
- }
62
-
63
- /**
64
- * Register as a Built-in Extension
65
- */
66
- const CanvasExtension: Extension = {
67
- name: 'Core Canvas',
68
- description: 'Present live HTML/CSS/JS content to the user in an interactive canvas panel.',
69
- hooks: {} as ExtensionHooks,
70
- tools: [
71
- {
72
- name: 'canvas',
73
- description: 'Interact with the live canvas panel.',
74
- parameters: {
75
- type: 'object',
76
- properties: {
77
- action: { type: 'string', enum: ['present', 'hide', 'snapshot'] },
78
- content: { type: 'string' },
79
- document: { type: 'object', additionalProperties: true },
80
- },
81
- required: ['action']
82
- },
83
- execute: async (args, context) => executeCanvasAction(args, { sessionId: context.session.id })
84
- }
85
- ]
86
- }
87
-
88
- registerNativeCapability('canvas', CanvasExtension)
89
-
90
- /**
91
- * Legacy Bridge
92
- */
93
- export function buildCanvasTools(bctx: ToolBuildContext): StructuredToolInterface[] {
94
- if (!bctx.hasExtension('canvas')) return []
95
- return [
96
- tool(
97
- async (args) => executeCanvasAction(args, { sessionId: bctx.ctx?.sessionId || undefined }),
98
- {
99
- name: 'canvas',
100
- description: CanvasExtension.tools![0].description,
101
- schema: z.object({}).passthrough()
102
- }
103
- )
104
- ]
105
- }
@@ -1,150 +0,0 @@
1
- import assert from 'node:assert/strict'
2
- import fs from 'node:fs'
3
- import os from 'node:os'
4
- import path from 'node:path'
5
- import { after, before, describe, it } from 'node:test'
6
-
7
- import type { Agent, Session } from '@/types'
8
-
9
- const originalEnv = {
10
- DATA_DIR: process.env.DATA_DIR,
11
- WORKSPACE_DIR: process.env.WORKSPACE_DIR,
12
- SWARMCLAW_BUILD_MODE: process.env.SWARMCLAW_BUILD_MODE,
13
- CREDENTIAL_SECRET: process.env.CREDENTIAL_SECRET,
14
- }
15
-
16
- let tempDir = ''
17
- let workspaceDir = ''
18
- let buildWalletTools: typeof import('./wallet').buildWalletTools
19
- let createAgentWallet: typeof import('@/lib/server/wallet/wallet-service').createAgentWallet
20
- let storage: typeof import('../storage')
21
-
22
- function makeAgent(): Agent {
23
- const now = Date.now()
24
- return {
25
- id: 'agent_wallet',
26
- name: 'Wallet Agent',
27
- description: 'Tests wallet actions',
28
- systemPrompt: 'test',
29
- provider: 'ollama',
30
- model: 'qwen3.5',
31
- extensions: ['wallet'],
32
- createdAt: now,
33
- updatedAt: now,
34
- }
35
- }
36
-
37
- function makeSession(): Session {
38
- const now = Date.now()
39
- return {
40
- id: 'session_wallet',
41
- name: 'Wallet Session',
42
- cwd: workspaceDir,
43
- user: 'tester',
44
- provider: 'ollama',
45
- model: 'qwen3.5',
46
- claudeSessionId: null,
47
- messages: [],
48
- createdAt: now,
49
- lastActiveAt: now,
50
- extensions: ['wallet'],
51
- agentId: 'agent_wallet',
52
- }
53
- }
54
-
55
- function makeBuildContext(session: Session) {
56
- return {
57
- cwd: workspaceDir,
58
- ctx: {
59
- sessionId: session.id,
60
- agentId: session.agentId || null,
61
- },
62
- hasExtension: (extensionId: string) => extensionId === 'wallet',
63
- hasTool: () => true,
64
- cleanupFns: [],
65
- commandTimeoutMs: 5000,
66
- claudeTimeoutMs: 5000,
67
- cliProcessTimeoutMs: 5000,
68
- persistDelegateResumeId: () => {},
69
- readStoredDelegateResumeId: () => null,
70
- resolveCurrentSession: () => session,
71
- activeExtensions: ['wallet'],
72
- }
73
- }
74
-
75
- before(async () => {
76
- tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'swarmclaw-wallet-tool-'))
77
- workspaceDir = path.join(tempDir, 'workspace')
78
- process.env.DATA_DIR = path.join(tempDir, 'data')
79
- process.env.WORKSPACE_DIR = workspaceDir
80
- process.env.SWARMCLAW_BUILD_MODE = '1'
81
- process.env.CREDENTIAL_SECRET = '22'.repeat(32)
82
- fs.mkdirSync(process.env.DATA_DIR, { recursive: true })
83
- fs.mkdirSync(workspaceDir, { recursive: true })
84
-
85
- ;({ buildWalletTools } = await import('./wallet'))
86
- ;({ createAgentWallet } = await import('@/lib/server/wallet/wallet-service'))
87
- storage = await import('../storage')
88
- storage.saveAgents({ agent_wallet: makeAgent() })
89
- storage.saveSessions({ session_wallet: makeSession() })
90
- })
91
-
92
- after(() => {
93
- if (originalEnv.DATA_DIR === undefined) delete process.env.DATA_DIR
94
- else process.env.DATA_DIR = originalEnv.DATA_DIR
95
- if (originalEnv.WORKSPACE_DIR === undefined) delete process.env.WORKSPACE_DIR
96
- else process.env.WORKSPACE_DIR = originalEnv.WORKSPACE_DIR
97
- if (originalEnv.SWARMCLAW_BUILD_MODE === undefined) delete process.env.SWARMCLAW_BUILD_MODE
98
- else process.env.SWARMCLAW_BUILD_MODE = originalEnv.SWARMCLAW_BUILD_MODE
99
- if (originalEnv.CREDENTIAL_SECRET === undefined) delete process.env.CREDENTIAL_SECRET
100
- else process.env.CREDENTIAL_SECRET = originalEnv.CREDENTIAL_SECRET
101
- fs.rmSync(tempDir, { recursive: true, force: true })
102
- })
103
-
104
- describe('wallet tool generic execution', () => {
105
- it('signs messages directly without creating approval records', async () => {
106
- createAgentWallet({ agentId: 'agent_wallet', chain: 'ethereum' })
107
- const session = makeSession()
108
- const [walletTool] = buildWalletTools(makeBuildContext(session))
109
-
110
- const result = JSON.parse(String(await walletTool.invoke({
111
- action: 'sign_message',
112
- chain: 'ethereum',
113
- message: 'sign me',
114
- })))
115
-
116
- assert.equal(result.status, 'signed')
117
- assert.equal(result.chain, 'ethereum')
118
- assert.equal(typeof result.signature, 'string')
119
-
120
- const approvals = storage.loadApprovals()
121
- const walletApprovals = Object.values(approvals).filter((approval: any) => approval.category === 'wallet_action')
122
- assert.equal(walletApprovals.length, 0)
123
- })
124
-
125
- it('ignores legacy approval fields and still encodes contract calls', async () => {
126
- const session = makeSession()
127
- const [walletTool] = buildWalletTools(makeBuildContext(session))
128
-
129
- const signResult = JSON.parse(String(await walletTool.invoke({
130
- action: 'sign_message',
131
- chain: 'ethereum',
132
- message: 'signed',
133
- approved: true,
134
- approvalId: 'legacy-approval-id',
135
- })))
136
- assert.equal(signResult.status, 'signed')
137
- assert.equal(signResult.chain, 'ethereum')
138
- assert.equal(typeof signResult.signature, 'string')
139
-
140
- const encoded = JSON.parse(String(await walletTool.invoke({
141
- action: 'encode_contract_call',
142
- chain: 'ethereum',
143
- abi: JSON.stringify(['function approve(address spender,uint256 amount)']),
144
- functionName: 'approve',
145
- args: JSON.stringify(['0x000000000000000000000000000000000000dEaD', '5']),
146
- })))
147
- assert.equal(encoded.status, 'encoded')
148
- assert.equal(encoded.data.startsWith('0x095ea7b3'), true)
149
- })
150
- })