@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.
Files changed (211) hide show
  1. package/.github/workflows/publish-npm.yml +8 -6
  2. package/CHANGELOG.md +265 -0
  3. package/README.md +406 -53
  4. package/dist/core/websocket-client.d.ts +13 -0
  5. package/dist/core/websocket-client.d.ts.map +1 -1
  6. package/dist/core/websocket-client.js +34 -3
  7. package/dist/core/websocket-client.js.map +1 -1
  8. package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts +76 -0
  9. package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts.map +1 -0
  10. package/dist/handlers/message-handlers/agent-room-operation-response-handler.js +70 -0
  11. package/dist/handlers/message-handlers/agent-room-operation-response-handler.js.map +1 -0
  12. package/dist/handlers/message-handlers/agent-selected-handler.d.ts +92 -38
  13. package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
  14. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +904 -0
  15. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -0
  16. package/dist/handlers/message-handlers/agent-status-update-handler.js +51 -0
  17. package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -0
  18. package/dist/handlers/message-handlers/auth-error-handler.d.ts +45 -31
  19. package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
  20. package/dist/handlers/message-handlers/auth-message-handler.d.ts +6 -0
  21. package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
  22. package/dist/handlers/message-handlers/auth-message-handler.js +65 -5
  23. package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
  24. package/dist/handlers/message-handlers/auth-required-handler.d.ts +49 -31
  25. package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
  26. package/dist/handlers/message-handlers/auth-success-handler.d.ts +6 -0
  27. package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
  28. package/dist/handlers/message-handlers/auth-success-handler.js +46 -4
  29. package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
  30. package/dist/handlers/message-handlers/challenge-handler.d.ts +45 -31
  31. package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
  32. package/dist/handlers/message-handlers/error-message-handler.d.ts +49 -31
  33. package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
  34. package/dist/handlers/message-handlers/index.d.ts +5 -0
  35. package/dist/handlers/message-handlers/index.d.ts.map +1 -1
  36. package/dist/handlers/message-handlers/index.js +23 -1
  37. package/dist/handlers/message-handlers/index.js.map +1 -1
  38. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +877 -0
  39. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -0
  40. package/dist/handlers/message-handlers/list-available-agents-handler.js +38 -0
  41. package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -0
  42. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +886 -0
  43. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -0
  44. package/dist/handlers/message-handlers/list-room-agents-handler.js +51 -0
  45. package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -0
  46. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +178 -89
  47. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
  48. package/dist/handlers/message-handlers/ping-pong-handler.d.ts +62 -58
  49. package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
  50. package/dist/handlers/message-handlers/regular-message-handler.d.ts +31 -29
  51. package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
  52. package/dist/handlers/message-handlers/regular-message-handler.js +1 -0
  53. package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -1
  54. package/dist/handlers/message-handlers/room-operation-response-handler.d.ts +328 -0
  55. package/dist/handlers/message-handlers/room-operation-response-handler.d.ts.map +1 -0
  56. package/dist/handlers/message-handlers/room-operation-response-handler.js +92 -0
  57. package/dist/handlers/message-handlers/room-operation-response-handler.js.map +1 -0
  58. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +53 -31
  59. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
  60. package/dist/handlers/message-handlers/types.d.ts +2 -0
  61. package/dist/handlers/message-handlers/types.d.ts.map +1 -1
  62. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +53 -31
  63. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
  64. package/dist/managers/agent-room-manager.d.ts +222 -0
  65. package/dist/managers/agent-room-manager.d.ts.map +1 -0
  66. package/dist/managers/agent-room-manager.js +508 -0
  67. package/dist/managers/agent-room-manager.js.map +1 -0
  68. package/dist/managers/index.d.ts +2 -0
  69. package/dist/managers/index.d.ts.map +1 -1
  70. package/dist/managers/index.js +5 -1
  71. package/dist/managers/index.js.map +1 -1
  72. package/dist/managers/message-router.d.ts +1 -1
  73. package/dist/managers/message-router.d.ts.map +1 -1
  74. package/dist/managers/message-router.js +41 -4
  75. package/dist/managers/message-router.js.map +1 -1
  76. package/dist/managers/room-management-manager.d.ts +213 -0
  77. package/dist/managers/room-management-manager.d.ts.map +1 -0
  78. package/dist/managers/room-management-manager.js +440 -0
  79. package/dist/managers/room-management-manager.js.map +1 -0
  80. package/dist/managers/room-manager.d.ts +4 -4
  81. package/dist/managers/room-manager.d.ts.map +1 -1
  82. package/dist/managers/room-manager.js +1 -1
  83. package/dist/managers/room-manager.js.map +1 -1
  84. package/dist/teneo-sdk.d.ts +362 -14
  85. package/dist/teneo-sdk.d.ts.map +1 -1
  86. package/dist/teneo-sdk.js +497 -7
  87. package/dist/teneo-sdk.js.map +1 -1
  88. package/dist/types/config.d.ts +63 -54
  89. package/dist/types/config.d.ts.map +1 -1
  90. package/dist/types/config.js +9 -5
  91. package/dist/types/config.js.map +1 -1
  92. package/dist/types/error-codes.d.ts +2 -0
  93. package/dist/types/error-codes.d.ts.map +1 -1
  94. package/dist/types/error-codes.js +3 -0
  95. package/dist/types/error-codes.js.map +1 -1
  96. package/dist/types/events.d.ts +132 -68
  97. package/dist/types/events.d.ts.map +1 -1
  98. package/dist/types/events.js.map +1 -1
  99. package/dist/types/index.d.ts +1 -1
  100. package/dist/types/index.d.ts.map +1 -1
  101. package/dist/types/index.js +27 -2
  102. package/dist/types/index.js.map +1 -1
  103. package/dist/types/messages.d.ts +11396 -2559
  104. package/dist/types/messages.d.ts.map +1 -1
  105. package/dist/types/messages.js +294 -27
  106. package/dist/types/messages.js.map +1 -1
  107. package/dist/types/validation.d.ts.map +1 -1
  108. package/dist/types/validation.js +1 -1
  109. package/dist/types/validation.js.map +1 -1
  110. package/dist/utils/bounded-queue.d.ts +1 -1
  111. package/dist/utils/bounded-queue.js +6 -6
  112. package/dist/utils/circuit-breaker.d.ts.map +1 -1
  113. package/dist/utils/circuit-breaker.js.map +1 -1
  114. package/dist/utils/event-waiter.d.ts.map +1 -1
  115. package/dist/utils/event-waiter.js +2 -1
  116. package/dist/utils/event-waiter.js.map +1 -1
  117. package/dist/utils/rate-limiter.d.ts.map +1 -1
  118. package/dist/utils/rate-limiter.js +4 -6
  119. package/dist/utils/rate-limiter.js.map +1 -1
  120. package/dist/utils/secure-private-key.d.ts.map +1 -1
  121. package/dist/utils/secure-private-key.js +9 -15
  122. package/dist/utils/secure-private-key.js.map +1 -1
  123. package/dist/utils/signature-verifier.d.ts +2 -2
  124. package/dist/utils/signature-verifier.d.ts.map +1 -1
  125. package/dist/utils/signature-verifier.js +5 -5
  126. package/dist/utils/signature-verifier.js.map +1 -1
  127. package/examples/.env.example +1 -1
  128. package/examples/agent-room-management-example.ts +334 -0
  129. package/examples/claude-agent-x-follower/.env.example +117 -0
  130. package/examples/claude-agent-x-follower/QUICKSTART.md +243 -0
  131. package/examples/claude-agent-x-follower/README.md +540 -0
  132. package/examples/claude-agent-x-follower/index.ts +248 -0
  133. package/examples/claude-agent-x-follower/package.json +37 -0
  134. package/examples/claude-agent-x-follower/tsconfig.json +20 -0
  135. package/examples/n8n-teneo/.env.example +127 -0
  136. package/examples/n8n-teneo/Dockerfile +42 -0
  137. package/examples/n8n-teneo/README.md +564 -0
  138. package/examples/n8n-teneo/docker-compose.yml +71 -0
  139. package/examples/n8n-teneo/index.ts +177 -0
  140. package/examples/n8n-teneo/package.json +22 -0
  141. package/examples/n8n-teneo/tsconfig.json +12 -0
  142. package/examples/n8n-teneo/workflows/x-timeline.json +66 -0
  143. package/examples/openai-teneo/.env.example +130 -0
  144. package/examples/openai-teneo/README.md +635 -0
  145. package/examples/openai-teneo/index.ts +280 -0
  146. package/examples/openai-teneo/package.json +24 -0
  147. package/examples/openai-teneo/tsconfig.json +16 -0
  148. package/examples/production-dashboard/.env.example +5 -3
  149. package/examples/production-dashboard/README.md +839 -0
  150. package/examples/production-dashboard/pnpm-lock.yaml +92 -0
  151. package/examples/production-dashboard/public/dashboard.html +1150 -504
  152. package/examples/production-dashboard/server.ts +428 -12
  153. package/examples/room-management-example.ts +285 -0
  154. package/examples/usage/.env.example +17 -0
  155. package/examples/usage/01-connect.ts +116 -0
  156. package/examples/usage/02-list-agents.ts +153 -0
  157. package/examples/usage/03-pick-agent.ts +201 -0
  158. package/examples/usage/04-find-by-capability.ts +237 -0
  159. package/examples/usage/05-webhook-example.ts +319 -0
  160. package/examples/usage/06-simple-api-server.ts +396 -0
  161. package/examples/usage/07-event-listener.ts +402 -0
  162. package/examples/usage/README.md +383 -0
  163. package/examples/usage/package.json +42 -0
  164. package/package.json +13 -3
  165. package/src/core/websocket-client.ts +43 -9
  166. package/src/formatters/response-formatter.test.ts +8 -2
  167. package/src/handlers/message-handlers/agent-room-operation-response-handler.ts +83 -0
  168. package/src/handlers/message-handlers/agent-status-update-handler.ts +58 -0
  169. package/src/handlers/message-handlers/auth-message-handler.ts +73 -5
  170. package/src/handlers/message-handlers/auth-success-handler.ts +58 -6
  171. package/src/handlers/message-handlers/index.ts +19 -0
  172. package/src/handlers/message-handlers/list-available-agents-handler.ts +41 -0
  173. package/src/handlers/message-handlers/list-room-agents-handler.ts +61 -0
  174. package/src/handlers/message-handlers/regular-message-handler.ts +1 -0
  175. package/src/handlers/message-handlers/room-operation-response-handler.ts +105 -0
  176. package/src/handlers/message-handlers/types.ts +6 -0
  177. package/src/handlers/webhook-handler.test.ts +13 -10
  178. package/src/managers/agent-room-manager.ts +609 -0
  179. package/src/managers/index.ts +2 -0
  180. package/src/managers/message-router.ts +48 -6
  181. package/src/managers/room-management-manager.ts +523 -0
  182. package/src/managers/room-manager.ts +12 -6
  183. package/src/teneo-sdk.ts +543 -10
  184. package/src/types/config.ts +13 -6
  185. package/src/types/error-codes.ts +4 -0
  186. package/src/types/events.ts +24 -0
  187. package/src/types/index.ts +55 -0
  188. package/src/types/messages.ts +374 -41
  189. package/src/types/validation.ts +4 -1
  190. package/src/utils/bounded-queue.ts +9 -9
  191. package/src/utils/circuit-breaker.ts +4 -1
  192. package/src/utils/deduplication-cache.test.ts +2 -6
  193. package/src/utils/event-waiter.test.ts +4 -1
  194. package/src/utils/event-waiter.ts +5 -7
  195. package/src/utils/rate-limiter.test.ts +5 -17
  196. package/src/utils/rate-limiter.ts +6 -9
  197. package/src/utils/secure-private-key.test.ts +66 -59
  198. package/src/utils/secure-private-key.ts +10 -16
  199. package/src/utils/signature-verifier.test.ts +75 -70
  200. package/src/utils/signature-verifier.ts +7 -8
  201. package/src/utils/ssrf-validator.test.ts +3 -3
  202. package/tests/integration/room-management.test.ts +514 -0
  203. package/tests/integration/websocket.test.ts +1 -1
  204. package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +394 -0
  205. package/tests/unit/handlers/agent-status-update-handler.test.ts +407 -0
  206. package/tests/unit/handlers/auth-success-handler-rooms.test.ts +699 -0
  207. package/tests/unit/handlers/list-available-agents-handler.test.ts +256 -0
  208. package/tests/unit/handlers/list-room-agents-handler.test.ts +294 -0
  209. package/tests/unit/handlers/room-operation-response-handler.test.ts +527 -0
  210. package/tests/unit/managers/agent-room-manager.test.ts +534 -0
  211. 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('0x1234567890123456789012345678901234567890123456789012345678901234');
13
- const testAccount2 = privateKeyToAccount('0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd');
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: ['task_response', 'agent_selected'],
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(['task_response', 'agent_selected']);
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: 'message',
44
- content: 'Hello',
45
- from: 'agent1',
46
- signature: '0xsignature',
47
- publicKey: '0xpublickey',
48
- timestamp: '2024-01-01T00:00:00Z'
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('signature');
54
- expect(signable).not.toHaveProperty('publicKey');
55
- expect(signable).not.toHaveProperty('id');
56
- expect(signable).toHaveProperty('type');
57
- expect(signable).toHaveProperty('content');
58
- expect(signable).toHaveProperty('from');
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: 'message',
65
- content: 'Hello',
68
+ type: "message",
69
+ content: "Hello",
66
70
  from: undefined,
67
- room: 'general'
71
+ room: "general"
68
72
  };
69
73
 
70
74
  const signable = verifier.getSignableContent(message);
71
75
 
72
- expect(signable).not.toHaveProperty('from');
73
- expect(signable).toHaveProperty('type');
74
- expect(signable).toHaveProperty('content');
75
- expect(signable).toHaveProperty('room');
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: 'message', content: 'Hello' };
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: 'message', content: 'Hello' };
93
- const content2 = { type: 'message', content: 'World' };
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: 'message', content: 'Hello', from: 'agent' };
104
- const content2 = { from: 'agent', content: 'Hello', type: 'message' };
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: ['task_response']
120
+ requireSignaturesFor: ["task_response"]
117
121
  });
118
122
 
119
- expect(verifier.isSignatureRequired('message')).toBe(false);
120
- expect(verifier.isSignatureRequired('ping')).toBe(false);
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: ['task_response', 'agent_selected']
129
+ requireSignaturesFor: ["task_response", "agent_selected"]
126
130
  });
127
131
 
128
- expect(verifier.isSignatureRequired('task_response')).toBe(true);
129
- expect(verifier.isSignatureRequired('agent_selected')).toBe(true);
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('task_response')).toBe(false);
136
- expect(verifier.isSignatureRequired('message')).toBe(false);
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: 'ping'
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: ['task_response']
195
+ requireSignaturesFor: ["task_response"]
192
196
  });
193
197
 
194
198
  const message: BaseMessage = {
195
- type: 'task_response',
196
- content: 'Result'
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('required');
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: 'message',
213
- content: 'Hello'
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: 'message',
229
- content: 'Hello',
230
- from: 'agent1',
231
- timestamp: '2024-01-01T00:00:00Z',
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: 'message',
256
- content: 'Hello',
259
+ type: "message",
260
+ content: "Hello",
257
261
  publicKey: testAccount1.address,
258
- signature: '0xinvalidsignature1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012'
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('error');
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: 'message',
273
- content: 'Hello',
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('does not match');
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: 'message',
303
- content: 'Hello',
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: 'message',
329
- content: 'Hello',
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('not in trusted whitelist');
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: 'message',
356
- content: 'Hello',
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: 'message',
380
- content: 'Hello',
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: 'message',
404
- content: 'Hello',
405
- from: 'agent-name-not-address',
406
- signature: '0xsignature'
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('No address available');
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: ['task_response']
437
+ requireSignaturesFor: ["task_response"]
433
438
  });
434
439
 
435
- expect(verifier.isSignatureRequired('task_response')).toBe(true);
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 'viem';
7
- import { BaseMessage, MessageType } from '../types';
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
- : 'Signature missing but not required'
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: 'No address available for verification (missing publicKey and from fields)'
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: 'Signature verification failed - signature does not match message content'
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('0x') && message.from.length === 42) {
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(() => validateWebhookUrl("http://redis.default.svc.cluster.local:6379", true)).toThrow(
240
- /Kubernetes service/i
241
- );
239
+ expect(() =>
240
+ validateWebhookUrl("http://redis.default.svc.cluster.local:6379", true)
241
+ ).toThrow(/Kubernetes service/i);
242
242
  });
243
243
  });
244
244