@teneo-protocol/sdk 1.0.0 → 2.0.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.
- package/.github/workflows/publish-npm.yml +8 -6
- package/CHANGELOG.md +265 -0
- package/README.md +406 -53
- package/dist/core/websocket-client.d.ts +13 -0
- package/dist/core/websocket-client.d.ts.map +1 -1
- package/dist/core/websocket-client.js +34 -3
- package/dist/core/websocket-client.js.map +1 -1
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts +76 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.js +70 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts +92 -38
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +904 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.js +51 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-error-handler.d.ts +45 -31
- package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-message-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-message-handler.js +65 -5
- package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
- package/dist/handlers/message-handlers/auth-required-handler.d.ts +49 -31
- package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-success-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-success-handler.js +46 -4
- package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
- package/dist/handlers/message-handlers/challenge-handler.d.ts +45 -31
- package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/error-message-handler.d.ts +49 -31
- package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/index.d.ts +5 -0
- package/dist/handlers/message-handlers/index.d.ts.map +1 -1
- package/dist/handlers/message-handlers/index.js +23 -1
- package/dist/handlers/message-handlers/index.js.map +1 -1
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +877 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.js +38 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +886 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.js +51 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +178 -89
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts +62 -58
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/regular-message-handler.d.ts +31 -29
- package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/regular-message-handler.js +1 -0
- package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -1
- package/dist/handlers/message-handlers/room-operation-response-handler.d.ts +328 -0
- package/dist/handlers/message-handlers/room-operation-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/room-operation-response-handler.js +92 -0
- package/dist/handlers/message-handlers/room-operation-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +53 -31
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/types.d.ts +2 -0
- package/dist/handlers/message-handlers/types.d.ts.map +1 -1
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +53 -31
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
- package/dist/managers/agent-room-manager.d.ts +222 -0
- package/dist/managers/agent-room-manager.d.ts.map +1 -0
- package/dist/managers/agent-room-manager.js +508 -0
- package/dist/managers/agent-room-manager.js.map +1 -0
- package/dist/managers/index.d.ts +2 -0
- package/dist/managers/index.d.ts.map +1 -1
- package/dist/managers/index.js +5 -1
- package/dist/managers/index.js.map +1 -1
- package/dist/managers/message-router.d.ts +1 -1
- package/dist/managers/message-router.d.ts.map +1 -1
- package/dist/managers/message-router.js +41 -4
- package/dist/managers/message-router.js.map +1 -1
- package/dist/managers/room-management-manager.d.ts +213 -0
- package/dist/managers/room-management-manager.d.ts.map +1 -0
- package/dist/managers/room-management-manager.js +440 -0
- package/dist/managers/room-management-manager.js.map +1 -0
- package/dist/managers/room-manager.d.ts +4 -4
- package/dist/managers/room-manager.d.ts.map +1 -1
- package/dist/managers/room-manager.js +1 -1
- package/dist/managers/room-manager.js.map +1 -1
- package/dist/teneo-sdk.d.ts +362 -14
- package/dist/teneo-sdk.d.ts.map +1 -1
- package/dist/teneo-sdk.js +497 -7
- package/dist/teneo-sdk.js.map +1 -1
- package/dist/types/config.d.ts +63 -54
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +9 -5
- package/dist/types/config.js.map +1 -1
- package/dist/types/error-codes.d.ts +2 -0
- package/dist/types/error-codes.d.ts.map +1 -1
- package/dist/types/error-codes.js +3 -0
- package/dist/types/error-codes.js.map +1 -1
- package/dist/types/events.d.ts +132 -68
- package/dist/types/events.d.ts.map +1 -1
- package/dist/types/events.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +27 -2
- package/dist/types/index.js.map +1 -1
- package/dist/types/messages.d.ts +11396 -2559
- package/dist/types/messages.d.ts.map +1 -1
- package/dist/types/messages.js +294 -27
- package/dist/types/messages.js.map +1 -1
- package/dist/types/validation.d.ts.map +1 -1
- package/dist/types/validation.js +1 -1
- package/dist/types/validation.js.map +1 -1
- package/dist/utils/bounded-queue.d.ts +1 -1
- package/dist/utils/bounded-queue.js +6 -6
- package/dist/utils/circuit-breaker.d.ts.map +1 -1
- package/dist/utils/circuit-breaker.js.map +1 -1
- package/dist/utils/event-waiter.d.ts.map +1 -1
- package/dist/utils/event-waiter.js +2 -1
- package/dist/utils/event-waiter.js.map +1 -1
- package/dist/utils/rate-limiter.d.ts.map +1 -1
- package/dist/utils/rate-limiter.js +4 -6
- package/dist/utils/rate-limiter.js.map +1 -1
- package/dist/utils/secure-private-key.d.ts.map +1 -1
- package/dist/utils/secure-private-key.js +9 -15
- package/dist/utils/secure-private-key.js.map +1 -1
- package/dist/utils/signature-verifier.d.ts +2 -2
- package/dist/utils/signature-verifier.d.ts.map +1 -1
- package/dist/utils/signature-verifier.js +5 -5
- package/dist/utils/signature-verifier.js.map +1 -1
- package/examples/.env.example +1 -1
- package/examples/agent-room-management-example.ts +334 -0
- package/examples/claude-agent-x-follower/.env.example +117 -0
- package/examples/claude-agent-x-follower/QUICKSTART.md +243 -0
- package/examples/claude-agent-x-follower/README.md +540 -0
- package/examples/claude-agent-x-follower/index.ts +248 -0
- package/examples/claude-agent-x-follower/package.json +37 -0
- package/examples/claude-agent-x-follower/tsconfig.json +20 -0
- package/examples/n8n-teneo/.env.example +127 -0
- package/examples/n8n-teneo/Dockerfile +42 -0
- package/examples/n8n-teneo/README.md +564 -0
- package/examples/n8n-teneo/docker-compose.yml +71 -0
- package/examples/n8n-teneo/index.ts +177 -0
- package/examples/n8n-teneo/package.json +22 -0
- package/examples/n8n-teneo/tsconfig.json +12 -0
- package/examples/n8n-teneo/workflows/x-timeline.json +66 -0
- package/examples/openai-teneo/.env.example +130 -0
- package/examples/openai-teneo/README.md +635 -0
- package/examples/openai-teneo/index.ts +280 -0
- package/examples/openai-teneo/package.json +24 -0
- package/examples/openai-teneo/tsconfig.json +16 -0
- package/examples/production-dashboard/.env.example +5 -3
- package/examples/production-dashboard/README.md +839 -0
- package/examples/production-dashboard/pnpm-lock.yaml +92 -0
- package/examples/production-dashboard/public/dashboard.html +1150 -504
- package/examples/production-dashboard/server.ts +428 -12
- package/examples/room-management-example.ts +285 -0
- package/examples/usage/.env.example +17 -0
- package/examples/usage/01-connect.ts +116 -0
- package/examples/usage/02-list-agents.ts +153 -0
- package/examples/usage/03-pick-agent.ts +201 -0
- package/examples/usage/04-find-by-capability.ts +237 -0
- package/examples/usage/05-webhook-example.ts +319 -0
- package/examples/usage/06-simple-api-server.ts +396 -0
- package/examples/usage/07-event-listener.ts +402 -0
- package/examples/usage/README.md +383 -0
- package/examples/usage/package.json +42 -0
- package/package.json +13 -3
- package/src/core/websocket-client.ts +43 -9
- package/src/formatters/response-formatter.test.ts +8 -2
- package/src/handlers/message-handlers/agent-room-operation-response-handler.ts +83 -0
- package/src/handlers/message-handlers/agent-status-update-handler.ts +58 -0
- package/src/handlers/message-handlers/auth-message-handler.ts +73 -5
- package/src/handlers/message-handlers/auth-success-handler.ts +58 -6
- package/src/handlers/message-handlers/index.ts +19 -0
- package/src/handlers/message-handlers/list-available-agents-handler.ts +41 -0
- package/src/handlers/message-handlers/list-room-agents-handler.ts +61 -0
- package/src/handlers/message-handlers/regular-message-handler.ts +1 -0
- package/src/handlers/message-handlers/room-operation-response-handler.ts +105 -0
- package/src/handlers/message-handlers/types.ts +6 -0
- package/src/handlers/webhook-handler.test.ts +13 -10
- package/src/managers/agent-room-manager.ts +609 -0
- package/src/managers/index.ts +2 -0
- package/src/managers/message-router.ts +48 -6
- package/src/managers/room-management-manager.ts +523 -0
- package/src/managers/room-manager.ts +12 -6
- package/src/teneo-sdk.ts +543 -10
- package/src/types/config.ts +13 -6
- package/src/types/error-codes.ts +4 -0
- package/src/types/events.ts +24 -0
- package/src/types/index.ts +55 -0
- package/src/types/messages.ts +374 -41
- package/src/types/validation.ts +4 -1
- package/src/utils/bounded-queue.ts +9 -9
- package/src/utils/circuit-breaker.ts +4 -1
- package/src/utils/deduplication-cache.test.ts +2 -6
- package/src/utils/event-waiter.test.ts +4 -1
- package/src/utils/event-waiter.ts +5 -7
- package/src/utils/rate-limiter.test.ts +5 -17
- package/src/utils/rate-limiter.ts +6 -9
- package/src/utils/secure-private-key.test.ts +66 -59
- package/src/utils/secure-private-key.ts +10 -16
- package/src/utils/signature-verifier.test.ts +75 -70
- package/src/utils/signature-verifier.ts +7 -8
- package/src/utils/ssrf-validator.test.ts +3 -3
- package/tests/integration/room-management.test.ts +514 -0
- package/tests/integration/websocket.test.ts +1 -1
- package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +394 -0
- package/tests/unit/handlers/agent-status-update-handler.test.ts +407 -0
- package/tests/unit/handlers/auth-success-handler-rooms.test.ts +699 -0
- package/tests/unit/handlers/list-available-agents-handler.test.ts +256 -0
- package/tests/unit/handlers/list-room-agents-handler.test.ts +294 -0
- package/tests/unit/handlers/room-operation-response-handler.test.ts +527 -0
- package/tests/unit/managers/agent-room-manager.test.ts +534 -0
- package/tests/unit/managers/room-management-manager.test.ts +438 -0
|
@@ -9,8 +9,12 @@ import { BaseMessage, createUserMessage } from "../types";
|
|
|
9
9
|
|
|
10
10
|
describe("SignatureVerifier", () => {
|
|
11
11
|
// Test accounts
|
|
12
|
-
const testAccount1 = privateKeyToAccount(
|
|
13
|
-
|
|
12
|
+
const testAccount1 = privateKeyToAccount(
|
|
13
|
+
"0x1234567890123456789012345678901234567890123456789012345678901234"
|
|
14
|
+
);
|
|
15
|
+
const testAccount2 = privateKeyToAccount(
|
|
16
|
+
"0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd"
|
|
17
|
+
);
|
|
14
18
|
|
|
15
19
|
describe("constructor", () => {
|
|
16
20
|
it("should create verifier with default options", () => {
|
|
@@ -25,13 +29,13 @@ describe("SignatureVerifier", () => {
|
|
|
25
29
|
it("should create verifier with custom options", () => {
|
|
26
30
|
const verifier = new SignatureVerifier({
|
|
27
31
|
trustedAddresses: [testAccount1.address],
|
|
28
|
-
requireSignaturesFor: [
|
|
32
|
+
requireSignaturesFor: ["task_response", "agent_selected"],
|
|
29
33
|
strictMode: true
|
|
30
34
|
});
|
|
31
35
|
|
|
32
36
|
const options = verifier.getOptions();
|
|
33
37
|
expect(options.trustedAddresses).toEqual([testAccount1.address]);
|
|
34
|
-
expect(options.requireSignaturesFor).toEqual([
|
|
38
|
+
expect(options.requireSignaturesFor).toEqual(["task_response", "agent_selected"]);
|
|
35
39
|
expect(options.strictMode).toBe(true);
|
|
36
40
|
});
|
|
37
41
|
});
|
|
@@ -40,46 +44,46 @@ describe("SignatureVerifier", () => {
|
|
|
40
44
|
it("should exclude signature and publicKey fields", () => {
|
|
41
45
|
const verifier = new SignatureVerifier();
|
|
42
46
|
const message: BaseMessage = {
|
|
43
|
-
type:
|
|
44
|
-
content:
|
|
45
|
-
from:
|
|
46
|
-
signature:
|
|
47
|
-
publicKey:
|
|
48
|
-
timestamp:
|
|
47
|
+
type: "message",
|
|
48
|
+
content: "Hello",
|
|
49
|
+
from: "agent1",
|
|
50
|
+
signature: "0xsignature",
|
|
51
|
+
publicKey: "0xpublickey",
|
|
52
|
+
timestamp: "2024-01-01T00:00:00Z"
|
|
49
53
|
};
|
|
50
54
|
|
|
51
55
|
const signable = verifier.getSignableContent(message);
|
|
52
56
|
|
|
53
|
-
expect(signable).not.toHaveProperty(
|
|
54
|
-
expect(signable).not.toHaveProperty(
|
|
55
|
-
expect(signable).not.toHaveProperty(
|
|
56
|
-
expect(signable).toHaveProperty(
|
|
57
|
-
expect(signable).toHaveProperty(
|
|
58
|
-
expect(signable).toHaveProperty(
|
|
57
|
+
expect(signable).not.toHaveProperty("signature");
|
|
58
|
+
expect(signable).not.toHaveProperty("publicKey");
|
|
59
|
+
expect(signable).not.toHaveProperty("id");
|
|
60
|
+
expect(signable).toHaveProperty("type");
|
|
61
|
+
expect(signable).toHaveProperty("content");
|
|
62
|
+
expect(signable).toHaveProperty("from");
|
|
59
63
|
});
|
|
60
64
|
|
|
61
65
|
it("should exclude undefined fields", () => {
|
|
62
66
|
const verifier = new SignatureVerifier();
|
|
63
67
|
const message: BaseMessage = {
|
|
64
|
-
type:
|
|
65
|
-
content:
|
|
68
|
+
type: "message",
|
|
69
|
+
content: "Hello",
|
|
66
70
|
from: undefined,
|
|
67
|
-
room:
|
|
71
|
+
room: "general"
|
|
68
72
|
};
|
|
69
73
|
|
|
70
74
|
const signable = verifier.getSignableContent(message);
|
|
71
75
|
|
|
72
|
-
expect(signable).not.toHaveProperty(
|
|
73
|
-
expect(signable).toHaveProperty(
|
|
74
|
-
expect(signable).toHaveProperty(
|
|
75
|
-
expect(signable).toHaveProperty(
|
|
76
|
+
expect(signable).not.toHaveProperty("from");
|
|
77
|
+
expect(signable).toHaveProperty("type");
|
|
78
|
+
expect(signable).toHaveProperty("content");
|
|
79
|
+
expect(signable).toHaveProperty("room");
|
|
76
80
|
});
|
|
77
81
|
});
|
|
78
82
|
|
|
79
83
|
describe("createMessageHash", () => {
|
|
80
84
|
it("should create consistent hashes for same content", () => {
|
|
81
85
|
const verifier = new SignatureVerifier();
|
|
82
|
-
const content = { type:
|
|
86
|
+
const content = { type: "message", content: "Hello" };
|
|
83
87
|
|
|
84
88
|
const hash1 = verifier.createMessageHash(content);
|
|
85
89
|
const hash2 = verifier.createMessageHash(content);
|
|
@@ -89,8 +93,8 @@ describe("SignatureVerifier", () => {
|
|
|
89
93
|
|
|
90
94
|
it("should create different hashes for different content", () => {
|
|
91
95
|
const verifier = new SignatureVerifier();
|
|
92
|
-
const content1 = { type:
|
|
93
|
-
const content2 = { type:
|
|
96
|
+
const content1 = { type: "message", content: "Hello" };
|
|
97
|
+
const content2 = { type: "message", content: "World" };
|
|
94
98
|
|
|
95
99
|
const hash1 = verifier.createMessageHash(content1);
|
|
96
100
|
const hash2 = verifier.createMessageHash(content2);
|
|
@@ -100,8 +104,8 @@ describe("SignatureVerifier", () => {
|
|
|
100
104
|
|
|
101
105
|
it("should create same hash regardless of key order", () => {
|
|
102
106
|
const verifier = new SignatureVerifier();
|
|
103
|
-
const content1 = { type:
|
|
104
|
-
const content2 = { from:
|
|
107
|
+
const content1 = { type: "message", content: "Hello", from: "agent" };
|
|
108
|
+
const content2 = { from: "agent", content: "Hello", type: "message" };
|
|
105
109
|
|
|
106
110
|
const hash1 = verifier.createMessageHash(content1);
|
|
107
111
|
const hash2 = verifier.createMessageHash(content2);
|
|
@@ -113,27 +117,27 @@ describe("SignatureVerifier", () => {
|
|
|
113
117
|
describe("isSignatureRequired", () => {
|
|
114
118
|
it("should return false when message type not in required list", () => {
|
|
115
119
|
const verifier = new SignatureVerifier({
|
|
116
|
-
requireSignaturesFor: [
|
|
120
|
+
requireSignaturesFor: ["task_response"]
|
|
117
121
|
});
|
|
118
122
|
|
|
119
|
-
expect(verifier.isSignatureRequired(
|
|
120
|
-
expect(verifier.isSignatureRequired(
|
|
123
|
+
expect(verifier.isSignatureRequired("message")).toBe(false);
|
|
124
|
+
expect(verifier.isSignatureRequired("ping")).toBe(false);
|
|
121
125
|
});
|
|
122
126
|
|
|
123
127
|
it("should return true when message type is in required list", () => {
|
|
124
128
|
const verifier = new SignatureVerifier({
|
|
125
|
-
requireSignaturesFor: [
|
|
129
|
+
requireSignaturesFor: ["task_response", "agent_selected"]
|
|
126
130
|
});
|
|
127
131
|
|
|
128
|
-
expect(verifier.isSignatureRequired(
|
|
129
|
-
expect(verifier.isSignatureRequired(
|
|
132
|
+
expect(verifier.isSignatureRequired("task_response")).toBe(true);
|
|
133
|
+
expect(verifier.isSignatureRequired("agent_selected")).toBe(true);
|
|
130
134
|
});
|
|
131
135
|
|
|
132
136
|
it("should return false when no required types configured", () => {
|
|
133
137
|
const verifier = new SignatureVerifier();
|
|
134
138
|
|
|
135
|
-
expect(verifier.isSignatureRequired(
|
|
136
|
-
expect(verifier.isSignatureRequired(
|
|
139
|
+
expect(verifier.isSignatureRequired("task_response")).toBe(false);
|
|
140
|
+
expect(verifier.isSignatureRequired("message")).toBe(false);
|
|
137
141
|
});
|
|
138
142
|
});
|
|
139
143
|
|
|
@@ -177,7 +181,7 @@ describe("SignatureVerifier", () => {
|
|
|
177
181
|
});
|
|
178
182
|
|
|
179
183
|
const message: BaseMessage = {
|
|
180
|
-
type:
|
|
184
|
+
type: "ping"
|
|
181
185
|
};
|
|
182
186
|
|
|
183
187
|
const result = await verifier.verify(message);
|
|
@@ -188,19 +192,19 @@ describe("SignatureVerifier", () => {
|
|
|
188
192
|
|
|
189
193
|
it("should fail when signature missing but required for message type", async () => {
|
|
190
194
|
const verifier = new SignatureVerifier({
|
|
191
|
-
requireSignaturesFor: [
|
|
195
|
+
requireSignaturesFor: ["task_response"]
|
|
192
196
|
});
|
|
193
197
|
|
|
194
198
|
const message: BaseMessage = {
|
|
195
|
-
type:
|
|
196
|
-
content:
|
|
199
|
+
type: "task_response",
|
|
200
|
+
content: "Result"
|
|
197
201
|
};
|
|
198
202
|
|
|
199
203
|
const result = await verifier.verify(message);
|
|
200
204
|
|
|
201
205
|
expect(result.valid).toBe(false);
|
|
202
206
|
expect(result.signatureMissing).toBe(true);
|
|
203
|
-
expect(result.reason).toContain(
|
|
207
|
+
expect(result.reason).toContain("required");
|
|
204
208
|
});
|
|
205
209
|
|
|
206
210
|
it("should fail when signature missing and strictMode enabled", async () => {
|
|
@@ -209,8 +213,8 @@ describe("SignatureVerifier", () => {
|
|
|
209
213
|
});
|
|
210
214
|
|
|
211
215
|
const message: BaseMessage = {
|
|
212
|
-
type:
|
|
213
|
-
content:
|
|
216
|
+
type: "message",
|
|
217
|
+
content: "Hello"
|
|
214
218
|
};
|
|
215
219
|
|
|
216
220
|
const result = await verifier.verify(message);
|
|
@@ -225,10 +229,10 @@ describe("SignatureVerifier", () => {
|
|
|
225
229
|
const verifier = new SignatureVerifier();
|
|
226
230
|
|
|
227
231
|
const message: BaseMessage = {
|
|
228
|
-
type:
|
|
229
|
-
content:
|
|
230
|
-
from:
|
|
231
|
-
timestamp:
|
|
232
|
+
type: "message",
|
|
233
|
+
content: "Hello",
|
|
234
|
+
from: "agent1",
|
|
235
|
+
timestamp: "2024-01-01T00:00:00Z",
|
|
232
236
|
publicKey: testAccount1.address
|
|
233
237
|
};
|
|
234
238
|
|
|
@@ -252,25 +256,26 @@ describe("SignatureVerifier", () => {
|
|
|
252
256
|
const verifier = new SignatureVerifier();
|
|
253
257
|
|
|
254
258
|
const message: BaseMessage = {
|
|
255
|
-
type:
|
|
256
|
-
content:
|
|
259
|
+
type: "message",
|
|
260
|
+
content: "Hello",
|
|
257
261
|
publicKey: testAccount1.address,
|
|
258
|
-
signature:
|
|
262
|
+
signature:
|
|
263
|
+
"0xinvalidsignature1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012"
|
|
259
264
|
};
|
|
260
265
|
|
|
261
266
|
const result = await verifier.verify(message);
|
|
262
267
|
|
|
263
268
|
expect(result.valid).toBe(false);
|
|
264
269
|
expect(result.signatureMissing).toBe(false);
|
|
265
|
-
expect(result.reason).toContain(
|
|
270
|
+
expect(result.reason).toContain("error");
|
|
266
271
|
});
|
|
267
272
|
|
|
268
273
|
it("should reject signature from wrong account", async () => {
|
|
269
274
|
const verifier = new SignatureVerifier();
|
|
270
275
|
|
|
271
276
|
const message: BaseMessage = {
|
|
272
|
-
type:
|
|
273
|
-
content:
|
|
277
|
+
type: "message",
|
|
278
|
+
content: "Hello",
|
|
274
279
|
publicKey: testAccount1.address
|
|
275
280
|
};
|
|
276
281
|
|
|
@@ -288,7 +293,7 @@ describe("SignatureVerifier", () => {
|
|
|
288
293
|
const result = await verifier.verify(messageWithSignature);
|
|
289
294
|
|
|
290
295
|
expect(result.valid).toBe(false);
|
|
291
|
-
expect(result.reason).toContain(
|
|
296
|
+
expect(result.reason).toContain("does not match");
|
|
292
297
|
});
|
|
293
298
|
});
|
|
294
299
|
|
|
@@ -299,8 +304,8 @@ describe("SignatureVerifier", () => {
|
|
|
299
304
|
});
|
|
300
305
|
|
|
301
306
|
const message: BaseMessage = {
|
|
302
|
-
type:
|
|
303
|
-
content:
|
|
307
|
+
type: "message",
|
|
308
|
+
content: "Hello",
|
|
304
309
|
publicKey: testAccount1.address
|
|
305
310
|
};
|
|
306
311
|
|
|
@@ -325,8 +330,8 @@ describe("SignatureVerifier", () => {
|
|
|
325
330
|
});
|
|
326
331
|
|
|
327
332
|
const message: BaseMessage = {
|
|
328
|
-
type:
|
|
329
|
-
content:
|
|
333
|
+
type: "message",
|
|
334
|
+
content: "Hello",
|
|
330
335
|
publicKey: testAccount2.address
|
|
331
336
|
};
|
|
332
337
|
|
|
@@ -343,7 +348,7 @@ describe("SignatureVerifier", () => {
|
|
|
343
348
|
|
|
344
349
|
expect(result.valid).toBe(false);
|
|
345
350
|
expect(result.isTrusted).toBe(false);
|
|
346
|
-
expect(result.reason).toContain(
|
|
351
|
+
expect(result.reason).toContain("not in trusted whitelist");
|
|
347
352
|
});
|
|
348
353
|
});
|
|
349
354
|
|
|
@@ -352,8 +357,8 @@ describe("SignatureVerifier", () => {
|
|
|
352
357
|
const verifier = new SignatureVerifier();
|
|
353
358
|
|
|
354
359
|
const message: BaseMessage = {
|
|
355
|
-
type:
|
|
356
|
-
content:
|
|
360
|
+
type: "message",
|
|
361
|
+
content: "Hello",
|
|
357
362
|
publicKey: testAccount1.address
|
|
358
363
|
};
|
|
359
364
|
|
|
@@ -376,8 +381,8 @@ describe("SignatureVerifier", () => {
|
|
|
376
381
|
const verifier = new SignatureVerifier();
|
|
377
382
|
|
|
378
383
|
const message: BaseMessage = {
|
|
379
|
-
type:
|
|
380
|
-
content:
|
|
384
|
+
type: "message",
|
|
385
|
+
content: "Hello",
|
|
381
386
|
from: testAccount1.address
|
|
382
387
|
};
|
|
383
388
|
|
|
@@ -400,16 +405,16 @@ describe("SignatureVerifier", () => {
|
|
|
400
405
|
const verifier = new SignatureVerifier();
|
|
401
406
|
|
|
402
407
|
const message: BaseMessage = {
|
|
403
|
-
type:
|
|
404
|
-
content:
|
|
405
|
-
from:
|
|
406
|
-
signature:
|
|
408
|
+
type: "message",
|
|
409
|
+
content: "Hello",
|
|
410
|
+
from: "agent-name-not-address",
|
|
411
|
+
signature: "0xsignature"
|
|
407
412
|
};
|
|
408
413
|
|
|
409
414
|
const result = await verifier.verify(message);
|
|
410
415
|
|
|
411
416
|
expect(result.valid).toBe(false);
|
|
412
|
-
expect(result.reason).toContain(
|
|
417
|
+
expect(result.reason).toContain("No address available");
|
|
413
418
|
});
|
|
414
419
|
});
|
|
415
420
|
|
|
@@ -429,10 +434,10 @@ describe("SignatureVerifier", () => {
|
|
|
429
434
|
const verifier = new SignatureVerifier();
|
|
430
435
|
|
|
431
436
|
verifier.updateOptions({
|
|
432
|
-
requireSignaturesFor: [
|
|
437
|
+
requireSignaturesFor: ["task_response"]
|
|
433
438
|
});
|
|
434
439
|
|
|
435
|
-
expect(verifier.isSignatureRequired(
|
|
440
|
+
expect(verifier.isSignatureRequired("task_response")).toBe(true);
|
|
436
441
|
});
|
|
437
442
|
|
|
438
443
|
it("should update strict mode", () => {
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* Provides cryptographic verification of message signatures using Ethereum ECDSA
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { verifyMessage, hashMessage, type Address } from
|
|
7
|
-
import { BaseMessage, MessageType } from
|
|
6
|
+
import { verifyMessage, hashMessage, type Address } from "viem";
|
|
7
|
+
import { BaseMessage, MessageType } from "../types";
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Options for signature verification
|
|
@@ -109,7 +109,7 @@ export class SignatureVerifier {
|
|
|
109
109
|
signatureMissing: true,
|
|
110
110
|
reason: isRequired
|
|
111
111
|
? `Signature required for message type '${message.type}'`
|
|
112
|
-
:
|
|
112
|
+
: "Signature missing but not required"
|
|
113
113
|
};
|
|
114
114
|
}
|
|
115
115
|
|
|
@@ -127,7 +127,7 @@ export class SignatureVerifier {
|
|
|
127
127
|
return {
|
|
128
128
|
valid: false,
|
|
129
129
|
signatureMissing: false,
|
|
130
|
-
reason:
|
|
130
|
+
reason: "No address available for verification (missing publicKey and from fields)"
|
|
131
131
|
};
|
|
132
132
|
}
|
|
133
133
|
|
|
@@ -143,7 +143,7 @@ export class SignatureVerifier {
|
|
|
143
143
|
valid: false,
|
|
144
144
|
recoveredAddress: addressToVerify,
|
|
145
145
|
signatureMissing: false,
|
|
146
|
-
reason:
|
|
146
|
+
reason: "Signature verification failed - signature does not match message content"
|
|
147
147
|
};
|
|
148
148
|
}
|
|
149
149
|
|
|
@@ -167,7 +167,6 @@ export class SignatureVerifier {
|
|
|
167
167
|
signatureMissing: false,
|
|
168
168
|
isTrusted
|
|
169
169
|
};
|
|
170
|
-
|
|
171
170
|
} catch (error) {
|
|
172
171
|
return {
|
|
173
172
|
valid: false,
|
|
@@ -234,7 +233,7 @@ export class SignatureVerifier {
|
|
|
234
233
|
}
|
|
235
234
|
|
|
236
235
|
return this.options.trustedAddresses.some(
|
|
237
|
-
trusted => trusted.toLowerCase() === address.toLowerCase()
|
|
236
|
+
(trusted) => trusted.toLowerCase() === address.toLowerCase()
|
|
238
237
|
);
|
|
239
238
|
}
|
|
240
239
|
|
|
@@ -255,7 +254,7 @@ export class SignatureVerifier {
|
|
|
255
254
|
}
|
|
256
255
|
|
|
257
256
|
// Fall back to 'from' field if it looks like an address
|
|
258
|
-
if (message.from && message.from.startsWith(
|
|
257
|
+
if (message.from && message.from.startsWith("0x") && message.from.length === 42) {
|
|
259
258
|
return message.from as Address;
|
|
260
259
|
}
|
|
261
260
|
|
|
@@ -236,9 +236,9 @@ describe("SSRF Validator", () => {
|
|
|
236
236
|
});
|
|
237
237
|
|
|
238
238
|
// Other k8s services should be blocked by isKubernetesService check
|
|
239
|
-
expect(() =>
|
|
240
|
-
|
|
241
|
-
);
|
|
239
|
+
expect(() =>
|
|
240
|
+
validateWebhookUrl("http://redis.default.svc.cluster.local:6379", true)
|
|
241
|
+
).toThrow(/Kubernetes service/i);
|
|
242
242
|
});
|
|
243
243
|
});
|
|
244
244
|
|