@swarmclawai/swarmclaw 1.4.3 → 1.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -211,6 +211,15 @@ SwarmClaw agents can join [SwarmFeed](https://swarmfeed.ai) — a social network
|
|
|
211
211
|
|
|
212
212
|
Read the docs at [swarmclaw.ai/docs/swarmfeed](https://swarmclaw.ai/docs/swarmfeed) and visit [swarmfeed.ai](https://swarmfeed.ai) for the platform itself.
|
|
213
213
|
|
|
214
|
+
### v1.4.5 Highlights
|
|
215
|
+
|
|
216
|
+
- **OpenClaw 2026.4.x compatibility**: Fixed WebSocket protocol errors when connecting to OpenClaw 2026.4.2+ gateways (`profileId` was incorrectly included in RPC params)
|
|
217
|
+
- **OpenClaw dependency bump**: Updated minimum OpenClaw from `2026.2.26` to `2026.4.2`
|
|
218
|
+
|
|
219
|
+
### v1.4.4 Highlights
|
|
220
|
+
|
|
221
|
+
- **SwarmDock SDK bump**: Updated `@swarmdock/sdk` from `0.4.1` to `0.5.2`, picking up new error types, skill templates, and agent primitives
|
|
222
|
+
|
|
214
223
|
### v1.4.3 Highlights
|
|
215
224
|
|
|
216
225
|
- **SwarmDock agent opt-in**: Agents can now opt into the SwarmDock marketplace directly from their settings sheet with description, skills, wallet, and auto-bid configuration
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@swarmclawai/swarmclaw",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.5",
|
|
4
4
|
"description": "Self-hosted AI runtime for OpenClaw, delegation, autonomy, runtime skills, crypto wallets, and chat platform connectors.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
"@multiavatar/multiavatar": "^1.0.7",
|
|
92
92
|
"@playwright/mcp": "^0.0.68",
|
|
93
93
|
"@slack/bolt": "^4.6.0",
|
|
94
|
-
"@swarmdock/sdk": "^0.
|
|
94
|
+
"@swarmdock/sdk": "^0.5.2",
|
|
95
95
|
"@tailwindcss/postcss": "^4",
|
|
96
96
|
"@tanstack/react-query": "^5.91.0",
|
|
97
97
|
"@types/better-sqlite3": "^7.6.13",
|
|
@@ -128,7 +128,7 @@
|
|
|
128
128
|
"next": "16.1.7",
|
|
129
129
|
"next-themes": "^0.4.6",
|
|
130
130
|
"nodemailer": "^8.0.1",
|
|
131
|
-
"openclaw": "^2026.2
|
|
131
|
+
"openclaw": "^2026.4.2",
|
|
132
132
|
"pdf-parse": "^2.4.5",
|
|
133
133
|
"qrcode": "^1.5.4",
|
|
134
134
|
"radix-ui": "^1.4.3",
|
|
@@ -61,7 +61,9 @@ export async function POST(req: Request) {
|
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
try {
|
|
64
|
-
const
|
|
64
|
+
const rpcParams = { ...params }
|
|
65
|
+
delete rpcParams.profileId
|
|
66
|
+
const result = await gw.rpc(method, rpcParams)
|
|
65
67
|
return NextResponse.json({ ok: true, result })
|
|
66
68
|
} catch (err: unknown) {
|
|
67
69
|
const message = errorMessage(err)
|
|
@@ -29,7 +29,7 @@ test('executeNodesAction lists nodes against the selected gateway profile', asyn
|
|
|
29
29
|
const result = JSON.parse(raw)
|
|
30
30
|
assert.equal(result.status, 'ok')
|
|
31
31
|
assert.equal(calls[0]?.method, 'node.list')
|
|
32
|
-
assert.deepEqual(calls[0]?.params, {
|
|
32
|
+
assert.deepEqual(calls[0]?.params, {})
|
|
33
33
|
assert.equal(result.result.nodes[0].nodeId, 'node-1')
|
|
34
34
|
})
|
|
35
35
|
|
|
@@ -71,7 +71,7 @@ test('executeNodesAction routes device pairing approvals to the device RPC surfa
|
|
|
71
71
|
const result = JSON.parse(raw)
|
|
72
72
|
assert.equal(result.status, 'ok')
|
|
73
73
|
assert.equal(calls[0]?.method, 'device.pair.approve')
|
|
74
|
-
assert.deepEqual(calls[0]?.params, { requestId: 'req-1'
|
|
74
|
+
assert.deepEqual(calls[0]?.params, { requestId: 'req-1' })
|
|
75
75
|
})
|
|
76
76
|
|
|
77
77
|
test('executeNodesAction forwards notify payloads through node.invoke with a generated idempotency key', async () => {
|
|
@@ -106,6 +106,5 @@ test('executeNodesAction forwards notify payloads through node.invoke with a gen
|
|
|
106
106
|
params: { urgency: 'high', message: 'hello from test' },
|
|
107
107
|
timeoutMs: 5000,
|
|
108
108
|
idempotencyKey: 'fixed-id',
|
|
109
|
-
profileId: 'gateway-1',
|
|
110
109
|
})
|
|
111
110
|
})
|
|
@@ -44,18 +44,18 @@ export async function executeNodesAction(args: any, deps: OpenClawNodesDeps = {}
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
if (action === 'list') {
|
|
47
|
-
const result = await gateway.rpc('node.list', {
|
|
47
|
+
const result = await gateway.rpc('node.list', {})
|
|
48
48
|
return JSON.stringify({ status: 'ok', action, result })
|
|
49
49
|
}
|
|
50
50
|
if (action === 'describe') {
|
|
51
51
|
if (!nodeId) return JSON.stringify({ status: 'error', error: 'nodeId is required for describe.' })
|
|
52
|
-
const result = await gateway.rpc('node.describe', { nodeId
|
|
52
|
+
const result = await gateway.rpc('node.describe', { nodeId })
|
|
53
53
|
return JSON.stringify({ status: 'ok', action, nodeId, result })
|
|
54
54
|
}
|
|
55
55
|
if (action === 'pairings') {
|
|
56
56
|
const [nodePairings, devicePairings] = await Promise.all([
|
|
57
|
-
gateway.rpc('node.pair.list', {
|
|
58
|
-
gateway.rpc('device.pair.list', {
|
|
57
|
+
gateway.rpc('node.pair.list', {}),
|
|
58
|
+
gateway.rpc('device.pair.list', {}),
|
|
59
59
|
])
|
|
60
60
|
return JSON.stringify({
|
|
61
61
|
status: 'ok',
|
|
@@ -69,18 +69,18 @@ export async function executeNodesAction(args: any, deps: OpenClawNodesDeps = {}
|
|
|
69
69
|
if (action === 'approve_pairing') {
|
|
70
70
|
if (!requestId) return JSON.stringify({ status: 'error', error: 'requestId is required for approve_pairing.' })
|
|
71
71
|
const method = pairingType === 'device' ? 'device.pair.approve' : 'node.pair.approve'
|
|
72
|
-
const result = await gateway.rpc(method, { requestId
|
|
72
|
+
const result = await gateway.rpc(method, { requestId })
|
|
73
73
|
return JSON.stringify({ status: 'ok', action, pairingType, requestId, result })
|
|
74
74
|
}
|
|
75
75
|
if (action === 'reject_pairing') {
|
|
76
76
|
if (!requestId) return JSON.stringify({ status: 'error', error: 'requestId is required for reject_pairing.' })
|
|
77
77
|
const method = pairingType === 'device' ? 'device.pair.reject' : 'node.pair.reject'
|
|
78
|
-
const result = await gateway.rpc(method, { requestId
|
|
78
|
+
const result = await gateway.rpc(method, { requestId })
|
|
79
79
|
return JSON.stringify({ status: 'ok', action, pairingType, requestId, result })
|
|
80
80
|
}
|
|
81
81
|
if (action === 'remove_device') {
|
|
82
82
|
if (!deviceId) return JSON.stringify({ status: 'error', error: 'deviceId is required for remove_device.' })
|
|
83
|
-
const result = await gateway.rpc('device.pair.remove', { deviceId
|
|
83
|
+
const result = await gateway.rpc('device.pair.remove', { deviceId })
|
|
84
84
|
return JSON.stringify({ status: 'ok', action, deviceId, result })
|
|
85
85
|
}
|
|
86
86
|
if (action === 'notify' || action === 'invoke') {
|
|
@@ -98,7 +98,6 @@ export async function executeNodesAction(args: any, deps: OpenClawNodesDeps = {}
|
|
|
98
98
|
params: invokeParams,
|
|
99
99
|
timeoutMs,
|
|
100
100
|
idempotencyKey: generateId(),
|
|
101
|
-
profileId,
|
|
102
101
|
})
|
|
103
102
|
return JSON.stringify({ status: 'ok', action, nodeId, command: invokeCommand, result })
|
|
104
103
|
}
|