@swarmclawai/swarmclaw 1.2.8 → 1.3.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 (214) hide show
  1. package/README.md +39 -6
  2. package/package.json +2 -2
  3. package/src/app/agents/[id]/page.tsx +1 -18
  4. package/src/app/api/activity/route.ts +9 -23
  5. package/src/app/api/agents/route.ts +17 -1
  6. package/src/app/api/agents/thread-route.test.ts +0 -1
  7. package/src/app/api/approvals/route.test.ts +6 -22
  8. package/src/app/api/approvals/route.ts +13 -5
  9. package/src/app/api/connectors/route.ts +2 -2
  10. package/src/app/api/credentials/[id]/route.ts +2 -0
  11. package/src/app/api/credentials/route.ts +4 -1
  12. package/src/app/api/goals/[id]/route.ts +28 -0
  13. package/src/app/api/goals/route.ts +33 -0
  14. package/src/app/api/portability/export/route.ts +8 -0
  15. package/src/app/api/portability/import/route.test.ts +80 -0
  16. package/src/app/api/portability/import/route.ts +28 -0
  17. package/src/app/api/protocols/templates/[id]/route.ts +2 -1
  18. package/src/app/api/protocols/templates/route.ts +2 -1
  19. package/src/app/api/settings/route.ts +13 -2
  20. package/src/app/api/wallets/[id]/route.ts +15 -157
  21. package/src/app/api/wallets/generate/route.ts +22 -0
  22. package/src/app/api/wallets/route.test.ts +147 -0
  23. package/src/app/api/wallets/route.ts +13 -95
  24. package/src/app/autonomy/page.tsx +2 -57
  25. package/src/app/home/page.tsx +3 -0
  26. package/src/app/protocols/page.tsx +2 -21
  27. package/src/app/settings/page.tsx +0 -9
  28. package/src/app/wallets/page.tsx +105 -5
  29. package/src/cli/index.js +32 -33
  30. package/src/cli/spec.js +26 -27
  31. package/src/components/agents/agent-sheet.tsx +2 -40
  32. package/src/components/agents/inspector-panel.tsx +0 -83
  33. package/src/components/chat/chat-card.tsx +0 -31
  34. package/src/components/chat/message-bubble.tsx +1 -108
  35. package/src/components/connectors/connector-sheet.tsx +25 -1
  36. package/src/components/layout/sidebar-rail.tsx +6 -10
  37. package/src/components/projects/project-detail.tsx +3 -35
  38. package/src/components/projects/tabs/overview-tab.tsx +3 -59
  39. package/src/components/projects/tabs/work-tab.tsx +7 -77
  40. package/src/components/protocols/structured-session-launcher.tsx +1 -22
  41. package/src/components/shared/connector-platform-icon.tsx +1 -0
  42. package/src/components/tasks/task-card.tsx +4 -34
  43. package/src/components/tasks/task-sheet.tsx +6 -36
  44. package/src/components/wallets/wallet-list.tsx +150 -0
  45. package/src/lib/app/navigation.test.ts +0 -13
  46. package/src/lib/app/navigation.ts +2 -7
  47. package/src/lib/app/view-constants.ts +14 -19
  48. package/src/lib/server/activity/activity-log.ts +16 -1
  49. package/src/lib/server/agents/agent-service.ts +24 -11
  50. package/src/lib/server/agents/agent-thread-session.ts +0 -1
  51. package/src/lib/server/agents/delegation-advisory.test.ts +0 -1
  52. package/src/lib/server/agents/delegation-jobs.test.ts +0 -69
  53. package/src/lib/server/agents/delegation-jobs.ts +0 -25
  54. package/src/lib/server/agents/main-agent-loop.ts +1 -49
  55. package/src/lib/server/agents/subagent-runtime.ts +0 -1
  56. package/src/lib/server/approval-match.ts +14 -85
  57. package/src/lib/server/approvals/approval-hooks.ts +81 -0
  58. package/src/lib/server/approvals.test.ts +6 -6
  59. package/src/lib/server/approvals.ts +11 -6
  60. package/src/lib/server/autonomy/supervisor-reflection.test.ts +0 -1
  61. package/src/lib/server/builtin-extensions.ts +0 -2
  62. package/src/lib/server/capability-router.test.ts +0 -2
  63. package/src/lib/server/chat-execution/chat-execution-tool-events.test.ts +14 -14
  64. package/src/lib/server/chat-execution/chat-execution-types.ts +0 -2
  65. package/src/lib/server/chat-execution/chat-execution-utils.ts +0 -2
  66. package/src/lib/server/chat-execution/chat-streaming-utils.ts +2 -30
  67. package/src/lib/server/chat-execution/chat-turn-finalization.ts +1 -36
  68. package/src/lib/server/chat-execution/chat-turn-preparation.ts +2 -22
  69. package/src/lib/server/chat-execution/iteration-event-handler.ts +0 -24
  70. package/src/lib/server/chat-execution/message-classifier.test.ts +0 -45
  71. package/src/lib/server/chat-execution/message-classifier.ts +1 -16
  72. package/src/lib/server/chat-execution/prompt-builder.test.ts +0 -1
  73. package/src/lib/server/chat-execution/prompt-builder.ts +0 -30
  74. package/src/lib/server/chat-execution/prompt-sections.ts +0 -1
  75. package/src/lib/server/chat-execution/situational-awareness.test.ts +2 -73
  76. package/src/lib/server/chat-execution/situational-awareness.ts +4 -38
  77. package/src/lib/server/chat-execution/stream-agent-chat.test.ts +8 -123
  78. package/src/lib/server/chat-execution/stream-agent-chat.ts +1 -5
  79. package/src/lib/server/chat-execution/stream-continuation.test.ts +4 -52
  80. package/src/lib/server/chat-execution/stream-continuation.ts +6 -48
  81. package/src/lib/server/chatrooms/session-mailbox.ts +0 -10
  82. package/src/lib/server/chats/chat-session-service.ts +3 -5
  83. package/src/lib/server/connectors/connector-inbound.ts +0 -1
  84. package/src/lib/server/connectors/connector-lifecycle.ts +19 -3
  85. package/src/lib/server/connectors/connector-service.ts +39 -9
  86. package/src/lib/server/connectors/swarmdock-bidding.ts +74 -0
  87. package/src/lib/server/connectors/swarmdock-payloads.test.ts +85 -0
  88. package/src/lib/server/connectors/swarmdock-secret.test.ts +128 -0
  89. package/src/lib/server/connectors/swarmdock-secret.ts +152 -0
  90. package/src/lib/server/connectors/swarmdock-tasks.ts +127 -0
  91. package/src/lib/server/connectors/swarmdock.ts +285 -0
  92. package/src/lib/server/execution-brief.test.ts +2 -25
  93. package/src/lib/server/execution-brief.ts +30 -35
  94. package/src/lib/server/execution-engine/task-attempt.ts +0 -1
  95. package/src/lib/server/goals/goal-repository.ts +19 -0
  96. package/src/lib/server/goals/goal-service.ts +143 -0
  97. package/src/lib/server/persistence/storage-context.ts +0 -5
  98. package/src/lib/server/portability/export.ts +109 -0
  99. package/src/lib/server/portability/import.ts +159 -0
  100. package/src/lib/server/protocols/protocol-normalization.ts +0 -4
  101. package/src/lib/server/protocols/protocol-queries.ts +0 -6
  102. package/src/lib/server/protocols/protocol-run-lifecycle.ts +4 -32
  103. package/src/lib/server/protocols/protocol-service.ts +0 -1
  104. package/src/lib/server/protocols/protocol-step-helpers.ts +0 -4
  105. package/src/lib/server/protocols/protocol-step-processors.ts +0 -6
  106. package/src/lib/server/protocols/protocol-swarm.ts +0 -2
  107. package/src/lib/server/protocols/protocol-types.ts +0 -2
  108. package/src/lib/server/provider-health.ts +0 -9
  109. package/src/lib/server/runtime/daemon-state/core.ts +0 -9
  110. package/src/lib/server/runtime/daemon-state.test.ts +0 -35
  111. package/src/lib/server/runtime/heartbeat-service.ts +3 -23
  112. package/src/lib/server/runtime/queue/core.ts +11 -33
  113. package/src/lib/server/runtime/runtime-storage-write-paths.test.ts +6 -6
  114. package/src/lib/server/runtime/scheduler.ts +0 -13
  115. package/src/lib/server/runtime/session-run-manager/drain.ts +0 -24
  116. package/src/lib/server/runtime/session-run-manager/enqueue.ts +0 -1
  117. package/src/lib/server/runtime/session-run-manager/queries.ts +0 -1
  118. package/src/lib/server/runtime/session-run-manager/recovery.ts +0 -1
  119. package/src/lib/server/runtime/session-run-manager.test.ts +0 -28
  120. package/src/lib/server/session-tools/crud.ts +0 -14
  121. package/src/lib/server/session-tools/delegate.ts +0 -4
  122. package/src/lib/server/session-tools/index.ts +0 -4
  123. package/src/lib/server/session-tools/team-context.ts +0 -3
  124. package/src/lib/server/storage-normalization.ts +13 -0
  125. package/src/lib/server/storage.ts +75 -45
  126. package/src/lib/server/tasks/task-checkout.ts +59 -0
  127. package/src/lib/server/tasks/task-lifecycle.ts +2 -0
  128. package/src/lib/server/tasks/task-route-service.ts +4 -26
  129. package/src/lib/server/tasks/task-service.ts +0 -7
  130. package/src/lib/server/tool-aliases.ts +0 -1
  131. package/src/lib/server/tool-capability-policy-advanced.test.ts +4 -4
  132. package/src/lib/server/tool-capability-policy.ts +0 -2
  133. package/src/lib/server/tool-planning.ts +0 -12
  134. package/src/lib/server/universal-tool-access.ts +0 -1
  135. package/src/lib/server/usage/cost-rollup.ts +124 -0
  136. package/src/lib/server/usage/usage-repository.ts +6 -0
  137. package/src/lib/server/wallets/wallet-crypto.ts +33 -0
  138. package/src/lib/server/wallets/wallet-repository.ts +24 -0
  139. package/src/lib/server/wallets/wallet-service.ts +119 -0
  140. package/src/lib/server/working-state/extraction.ts +8 -42
  141. package/src/lib/server/working-state/normalization.ts +10 -103
  142. package/src/lib/server/working-state/service.ts +12 -21
  143. package/src/lib/strip-internal-metadata.test.ts +1 -1
  144. package/src/lib/strip-internal-metadata.ts +1 -1
  145. package/src/lib/tool-definitions.ts +0 -1
  146. package/src/lib/validation/schemas.ts +36 -32
  147. package/src/lib/validation/server-schemas.ts +35 -0
  148. package/src/stores/slices/data-slice.ts +5 -1
  149. package/src/stores/slices/ui-slice.ts +0 -4
  150. package/src/types/agent.ts +10 -84
  151. package/src/types/app-settings.ts +6 -2
  152. package/src/types/approval.ts +3 -2
  153. package/src/types/connector.ts +1 -0
  154. package/src/types/goal.ts +30 -0
  155. package/src/types/index.ts +2 -1
  156. package/src/types/message.ts +0 -1
  157. package/src/types/misc.ts +2 -4
  158. package/src/types/protocol.ts +0 -2
  159. package/src/types/run.ts +0 -3
  160. package/src/types/session.ts +1 -51
  161. package/src/types/swarmdock.ts +29 -0
  162. package/src/types/task.ts +9 -3
  163. package/src/types/working-state.ts +2 -9
  164. package/src/views/settings/section-runtime-loop.tsx +0 -14
  165. package/src/app/api/canvas/[sessionId]/route.ts +0 -35
  166. package/src/app/api/missions/[id]/actions/route.ts +0 -31
  167. package/src/app/api/missions/[id]/events/route.ts +0 -14
  168. package/src/app/api/missions/[id]/route.ts +0 -10
  169. package/src/app/api/missions/route.test.ts +0 -244
  170. package/src/app/api/missions/route.ts +0 -57
  171. package/src/app/api/wallets/[id]/approve/route.ts +0 -79
  172. package/src/app/api/wallets/[id]/balance-history/route.ts +0 -18
  173. package/src/app/api/wallets/[id]/send/route.ts +0 -113
  174. package/src/app/api/wallets/[id]/transactions/route.ts +0 -18
  175. package/src/app/missions/[id]/page.tsx +0 -3
  176. package/src/app/missions/page.tsx +0 -685
  177. package/src/components/canvas/canvas-panel.tsx +0 -267
  178. package/src/components/wallets/wallet-approval-dialog.tsx +0 -107
  179. package/src/components/wallets/wallet-panel.tsx +0 -1010
  180. package/src/components/wallets/wallet-section.tsx +0 -260
  181. package/src/features/missions/queries.ts +0 -23
  182. package/src/lib/canvas-content.test.ts +0 -360
  183. package/src/lib/canvas-content.ts +0 -198
  184. package/src/lib/server/canvas-content.test.ts +0 -32
  185. package/src/lib/server/canvas-content.ts +0 -6
  186. package/src/lib/server/ethereum.ts +0 -591
  187. package/src/lib/server/evm-swap.ts +0 -476
  188. package/src/lib/server/missions/mission-intent.test.ts +0 -63
  189. package/src/lib/server/missions/mission-intent.ts +0 -569
  190. package/src/lib/server/missions/mission-repository.ts +0 -74
  191. package/src/lib/server/missions/mission-service/actions.ts +0 -6
  192. package/src/lib/server/missions/mission-service/bindings.ts +0 -9
  193. package/src/lib/server/missions/mission-service/context.ts +0 -4
  194. package/src/lib/server/missions/mission-service/core.ts +0 -2271
  195. package/src/lib/server/missions/mission-service/queries.ts +0 -12
  196. package/src/lib/server/missions/mission-service/recovery.ts +0 -5
  197. package/src/lib/server/missions/mission-service/ticks.ts +0 -9
  198. package/src/lib/server/missions/mission-service.test.ts +0 -888
  199. package/src/lib/server/missions/mission-service.ts +0 -6
  200. package/src/lib/server/session-tools/canvas.ts +0 -105
  201. package/src/lib/server/session-tools/wallet-tool.test.ts +0 -150
  202. package/src/lib/server/session-tools/wallet.ts +0 -1287
  203. package/src/lib/server/solana.ts +0 -327
  204. package/src/lib/server/wallet/wallet-execution.test.ts +0 -198
  205. package/src/lib/server/wallet/wallet-portfolio.test.ts +0 -98
  206. package/src/lib/server/wallet/wallet-portfolio.ts +0 -772
  207. package/src/lib/server/wallet/wallet-service.test.ts +0 -81
  208. package/src/lib/server/wallet/wallet-service.ts +0 -225
  209. package/src/lib/wallet/wallet-transactions.test.ts +0 -75
  210. package/src/lib/wallet/wallet-transactions.ts +0 -43
  211. package/src/lib/wallet/wallet.test.ts +0 -333
  212. package/src/lib/wallet/wallet.ts +0 -183
  213. package/src/types/mission.ts +0 -185
  214. 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
- })