agent-relay 3.2.3 → 3.2.4

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 (225) hide show
  1. package/dist/index.cjs +265 -108
  2. package/package.json +11 -10
  3. package/packages/acp-bridge/package.json +2 -2
  4. package/packages/config/package.json +1 -1
  5. package/packages/hooks/package.json +4 -4
  6. package/packages/memory/package.json +2 -2
  7. package/packages/openclaw/package.json +2 -2
  8. package/packages/policy/package.json +2 -2
  9. package/packages/sdk/ADAPTER_REVIEW.md +109 -0
  10. package/packages/sdk/dist/communicate/a2a-bridge.d.ts +25 -0
  11. package/packages/sdk/dist/communicate/a2a-bridge.d.ts.map +1 -0
  12. package/packages/sdk/dist/communicate/a2a-bridge.js +89 -0
  13. package/packages/sdk/dist/communicate/a2a-bridge.js.map +1 -0
  14. package/packages/sdk/dist/communicate/a2a-server.d.ts +31 -0
  15. package/packages/sdk/dist/communicate/a2a-server.d.ts.map +1 -0
  16. package/packages/sdk/dist/communicate/a2a-server.js +220 -0
  17. package/packages/sdk/dist/communicate/a2a-server.js.map +1 -0
  18. package/packages/sdk/dist/communicate/a2a-transport.d.ts +48 -0
  19. package/packages/sdk/dist/communicate/a2a-transport.d.ts.map +1 -0
  20. package/packages/sdk/dist/communicate/a2a-transport.js +302 -0
  21. package/packages/sdk/dist/communicate/a2a-transport.js.map +1 -0
  22. package/packages/sdk/dist/communicate/a2a-types.d.ts +107 -0
  23. package/packages/sdk/dist/communicate/a2a-types.d.ts.map +1 -0
  24. package/packages/sdk/dist/communicate/a2a-types.js +209 -0
  25. package/packages/sdk/dist/communicate/a2a-types.js.map +1 -0
  26. package/packages/sdk/dist/communicate/adapters/claude-sdk.d.ts +28 -0
  27. package/packages/sdk/dist/communicate/adapters/claude-sdk.d.ts.map +1 -0
  28. package/packages/sdk/dist/communicate/adapters/claude-sdk.js +47 -0
  29. package/packages/sdk/dist/communicate/adapters/claude-sdk.js.map +1 -0
  30. package/packages/sdk/dist/communicate/adapters/crewai.d.ts +42 -0
  31. package/packages/sdk/dist/communicate/adapters/crewai.d.ts.map +1 -0
  32. package/packages/sdk/dist/communicate/adapters/crewai.js +95 -0
  33. package/packages/sdk/dist/communicate/adapters/crewai.js.map +1 -0
  34. package/packages/sdk/dist/communicate/adapters/google-adk.d.ts +53 -0
  35. package/packages/sdk/dist/communicate/adapters/google-adk.d.ts.map +1 -0
  36. package/packages/sdk/dist/communicate/adapters/google-adk.js +77 -0
  37. package/packages/sdk/dist/communicate/adapters/google-adk.js.map +1 -0
  38. package/packages/sdk/dist/communicate/adapters/index.d.ts +7 -0
  39. package/packages/sdk/dist/communicate/adapters/index.d.ts.map +1 -0
  40. package/packages/sdk/dist/communicate/adapters/index.js +7 -0
  41. package/packages/sdk/dist/communicate/adapters/index.js.map +1 -0
  42. package/packages/sdk/dist/communicate/adapters/langgraph.d.ts +40 -0
  43. package/packages/sdk/dist/communicate/adapters/langgraph.d.ts.map +1 -0
  44. package/packages/sdk/dist/communicate/adapters/langgraph.js +77 -0
  45. package/packages/sdk/dist/communicate/adapters/langgraph.js.map +1 -0
  46. package/packages/sdk/dist/communicate/adapters/openai-agents.d.ts +25 -0
  47. package/packages/sdk/dist/communicate/adapters/openai-agents.d.ts.map +1 -0
  48. package/packages/sdk/dist/communicate/adapters/openai-agents.js +70 -0
  49. package/packages/sdk/dist/communicate/adapters/openai-agents.js.map +1 -0
  50. package/packages/sdk/dist/communicate/adapters/pi.d.ts +45 -0
  51. package/packages/sdk/dist/communicate/adapters/pi.d.ts.map +1 -0
  52. package/packages/sdk/dist/communicate/adapters/pi.js +59 -0
  53. package/packages/sdk/dist/communicate/adapters/pi.js.map +1 -0
  54. package/packages/sdk/dist/communicate/core.d.ts +58 -0
  55. package/packages/sdk/dist/communicate/core.d.ts.map +1 -0
  56. package/packages/sdk/dist/communicate/core.js +128 -0
  57. package/packages/sdk/dist/communicate/core.js.map +1 -0
  58. package/packages/sdk/dist/communicate/index.d.ts +4 -0
  59. package/packages/sdk/dist/communicate/index.d.ts.map +1 -0
  60. package/packages/sdk/dist/communicate/index.js +4 -0
  61. package/packages/sdk/dist/communicate/index.js.map +1 -0
  62. package/packages/sdk/dist/communicate/transport.d.ts +36 -0
  63. package/packages/sdk/dist/communicate/transport.d.ts.map +1 -0
  64. package/packages/sdk/dist/communicate/transport.js +371 -0
  65. package/packages/sdk/dist/communicate/transport.js.map +1 -0
  66. package/packages/sdk/dist/communicate/types.d.ts +58 -0
  67. package/packages/sdk/dist/communicate/types.d.ts.map +1 -0
  68. package/packages/sdk/dist/communicate/types.js +66 -0
  69. package/packages/sdk/dist/communicate/types.js.map +1 -0
  70. package/packages/sdk/dist/workflows/builder.d.ts +35 -5
  71. package/packages/sdk/dist/workflows/builder.d.ts.map +1 -1
  72. package/packages/sdk/dist/workflows/builder.js +81 -7
  73. package/packages/sdk/dist/workflows/builder.js.map +1 -1
  74. package/packages/sdk/dist/workflows/cli.js +14 -1
  75. package/packages/sdk/dist/workflows/cli.js.map +1 -1
  76. package/packages/sdk/dist/workflows/runner.d.ts +10 -2
  77. package/packages/sdk/dist/workflows/runner.d.ts.map +1 -1
  78. package/packages/sdk/dist/workflows/runner.js +95 -1
  79. package/packages/sdk/dist/workflows/runner.js.map +1 -1
  80. package/packages/sdk/dist/workflows/types.d.ts +11 -0
  81. package/packages/sdk/dist/workflows/types.d.ts.map +1 -1
  82. package/packages/sdk/examples/communicate/claude_sdk_example.ts +5 -0
  83. package/packages/sdk/examples/communicate/pi_example.ts +8 -0
  84. package/packages/sdk/package.json +48 -2
  85. package/packages/sdk/src/__tests__/builder-deterministic.test.ts +132 -0
  86. package/packages/sdk/src/__tests__/communicate/a2a-bridge.test.ts +211 -0
  87. package/packages/sdk/src/__tests__/communicate/a2a-server.test.ts +359 -0
  88. package/packages/sdk/src/__tests__/communicate/a2a-transport.test.ts +537 -0
  89. package/packages/sdk/src/__tests__/communicate/a2a-types.test.ts +297 -0
  90. package/packages/sdk/src/__tests__/communicate/adapters/claude-sdk.test.ts +163 -0
  91. package/packages/sdk/src/__tests__/communicate/adapters/crewai.test.ts +219 -0
  92. package/packages/sdk/src/__tests__/communicate/adapters/e2e-crewai.test.ts +101 -0
  93. package/packages/sdk/src/__tests__/communicate/adapters/e2e-google-adk.test.ts +166 -0
  94. package/packages/sdk/src/__tests__/communicate/adapters/e2e-langgraph.test.ts +181 -0
  95. package/packages/sdk/src/__tests__/communicate/adapters/e2e-openai-agents.test.ts +137 -0
  96. package/packages/sdk/src/__tests__/communicate/adapters/e2e-pi.test.ts +140 -0
  97. package/packages/sdk/src/__tests__/communicate/adapters/google-adk.test.ts +200 -0
  98. package/packages/sdk/src/__tests__/communicate/adapters/langgraph.test.ts +162 -0
  99. package/packages/sdk/src/__tests__/communicate/adapters/openai-agents.test.ts +166 -0
  100. package/packages/sdk/src/__tests__/communicate/adapters/pi.test.ts +140 -0
  101. package/packages/sdk/src/__tests__/communicate/core.test.ts +574 -0
  102. package/packages/sdk/src/__tests__/communicate/integration/cross-framework.test.ts +353 -0
  103. package/packages/sdk/src/__tests__/communicate/transport.test.ts +613 -0
  104. package/packages/sdk/src/__tests__/start-from.test.ts +346 -0
  105. package/packages/sdk/src/communicate/a2a-bridge.ts +111 -0
  106. package/packages/sdk/src/communicate/a2a-server.ts +277 -0
  107. package/packages/sdk/src/communicate/a2a-transport.ts +395 -0
  108. package/packages/sdk/src/communicate/a2a-types.ts +338 -0
  109. package/packages/sdk/src/communicate/adapters/claude-sdk.ts +85 -0
  110. package/packages/sdk/src/communicate/adapters/crewai.ts +141 -0
  111. package/packages/sdk/src/communicate/adapters/google-adk.ts +139 -0
  112. package/packages/sdk/src/communicate/adapters/index.ts +6 -0
  113. package/packages/sdk/src/communicate/adapters/langgraph.ts +112 -0
  114. package/packages/sdk/src/communicate/adapters/openai-agents.ts +113 -0
  115. package/packages/sdk/src/communicate/adapters/pi.ts +105 -0
  116. package/packages/sdk/src/communicate/core.ts +157 -0
  117. package/packages/sdk/src/communicate/index.ts +3 -0
  118. package/packages/sdk/src/communicate/transport.ts +489 -0
  119. package/packages/sdk/src/communicate/types.ts +106 -0
  120. package/packages/sdk/src/examples/workflows/fix-dashboard-user-registration.yaml +182 -0
  121. package/packages/sdk/src/workflows/builder.ts +97 -9
  122. package/packages/sdk/src/workflows/cli.ts +16 -1
  123. package/packages/sdk/src/workflows/runner.ts +110 -1
  124. package/packages/sdk/src/workflows/types.ts +14 -0
  125. package/packages/sdk/tsconfig.build.json +1 -7
  126. package/packages/sdk/tsconfig.json +1 -7
  127. package/packages/sdk-py/README.md +67 -25
  128. package/packages/sdk-py/examples/communicate/agno_example.py +8 -0
  129. package/packages/sdk-py/examples/communicate/claude_sdk_example.py +6 -0
  130. package/packages/sdk-py/examples/communicate/crewai_example.py +7 -0
  131. package/packages/sdk-py/examples/communicate/google_adk_example.py +7 -0
  132. package/packages/sdk-py/examples/communicate/openai_agents_example.py +8 -0
  133. package/packages/sdk-py/examples/communicate/swarms_example.py +7 -0
  134. package/packages/sdk-py/pyproject.toml +12 -1
  135. package/packages/sdk-py/src/agent_relay/__init__.py +8 -0
  136. package/packages/sdk-py/src/agent_relay/builder.py +65 -26
  137. package/packages/sdk-py/src/agent_relay/communicate/__init__.py +6 -0
  138. package/packages/sdk-py/src/agent_relay/communicate/a2a_bridge.py +138 -0
  139. package/packages/sdk-py/src/agent_relay/communicate/a2a_server.py +242 -0
  140. package/packages/sdk-py/src/agent_relay/communicate/a2a_transport.py +366 -0
  141. package/packages/sdk-py/src/agent_relay/communicate/a2a_types.py +294 -0
  142. package/packages/sdk-py/src/agent_relay/communicate/adapters/__init__.py +10 -0
  143. package/packages/sdk-py/src/agent_relay/communicate/adapters/agno.py +74 -0
  144. package/packages/sdk-py/src/agent_relay/communicate/adapters/claude_sdk.py +78 -0
  145. package/packages/sdk-py/src/agent_relay/communicate/adapters/crewai.py +143 -0
  146. package/packages/sdk-py/src/agent_relay/communicate/adapters/google_adk.py +69 -0
  147. package/packages/sdk-py/src/agent_relay/communicate/adapters/openai_agents.py +86 -0
  148. package/packages/sdk-py/src/agent_relay/communicate/adapters/pi.py +175 -0
  149. package/packages/sdk-py/src/agent_relay/communicate/adapters/swarms.py +44 -0
  150. package/packages/sdk-py/src/agent_relay/communicate/core.py +293 -0
  151. package/packages/sdk-py/src/agent_relay/communicate/transport.py +502 -0
  152. package/packages/sdk-py/src/agent_relay/communicate/types.py +89 -0
  153. package/packages/sdk-py/src/agent_relay/types.py +2 -1
  154. package/packages/sdk-py/tests/communicate/__init__.py +0 -0
  155. package/packages/sdk-py/tests/communicate/adapters/__init__.py +0 -0
  156. package/packages/sdk-py/tests/communicate/adapters/e2e_test_agno.py +154 -0
  157. package/packages/sdk-py/tests/communicate/adapters/e2e_test_claude_sdk.py +428 -0
  158. package/packages/sdk-py/tests/communicate/adapters/e2e_test_crewai.py +234 -0
  159. package/packages/sdk-py/tests/communicate/adapters/e2e_test_google_adk.py +182 -0
  160. package/packages/sdk-py/tests/communicate/adapters/e2e_test_langgraph.py +262 -0
  161. package/packages/sdk-py/tests/communicate/adapters/e2e_test_openai_agents.py +88 -0
  162. package/packages/sdk-py/tests/communicate/adapters/e2e_test_pi.py +156 -0
  163. package/packages/sdk-py/tests/communicate/adapters/e2e_test_swarms.py +239 -0
  164. package/packages/sdk-py/tests/communicate/adapters/test_agno.py +140 -0
  165. package/packages/sdk-py/tests/communicate/adapters/test_claude_sdk.py +147 -0
  166. package/packages/sdk-py/tests/communicate/adapters/test_crewai.py +136 -0
  167. package/packages/sdk-py/tests/communicate/adapters/test_google_adk.py +125 -0
  168. package/packages/sdk-py/tests/communicate/adapters/test_openai_agents.py +99 -0
  169. package/packages/sdk-py/tests/communicate/adapters/test_pi.py +270 -0
  170. package/packages/sdk-py/tests/communicate/adapters/test_swarms.py +113 -0
  171. package/packages/sdk-py/tests/communicate/conftest.py +555 -0
  172. package/packages/sdk-py/tests/communicate/integration/__init__.py +1 -0
  173. package/packages/sdk-py/tests/communicate/integration/test_cross_framework.py +331 -0
  174. package/packages/sdk-py/tests/communicate/integration/test_end_to_end.py +151 -0
  175. package/packages/sdk-py/tests/communicate/test_a2a_bridge.py +363 -0
  176. package/packages/sdk-py/tests/communicate/test_a2a_server.py +346 -0
  177. package/packages/sdk-py/tests/communicate/test_a2a_transport.py +561 -0
  178. package/packages/sdk-py/tests/communicate/test_a2a_types.py +342 -0
  179. package/packages/sdk-py/tests/communicate/test_auto_detect.py +67 -0
  180. package/packages/sdk-py/tests/communicate/test_core.py +331 -0
  181. package/packages/sdk-py/tests/communicate/test_transport.py +373 -0
  182. package/packages/sdk-py/tests/communicate/test_types.py +285 -0
  183. package/packages/sdk-py/tests/test_builder_deterministic.py +118 -0
  184. package/packages/telemetry/package.json +1 -1
  185. package/packages/trajectory/package.json +2 -2
  186. package/packages/user-directory/package.json +2 -2
  187. package/packages/utils/package.json +2 -2
  188. package/packages/sdk/dist/__tests__/completion-pipeline.test.d.ts +0 -14
  189. package/packages/sdk/dist/__tests__/completion-pipeline.test.d.ts.map +0 -1
  190. package/packages/sdk/dist/__tests__/completion-pipeline.test.js +0 -1476
  191. package/packages/sdk/dist/__tests__/completion-pipeline.test.js.map +0 -1
  192. package/packages/sdk/dist/__tests__/contract-fixtures.test.d.ts +0 -2
  193. package/packages/sdk/dist/__tests__/contract-fixtures.test.d.ts.map +0 -1
  194. package/packages/sdk/dist/__tests__/contract-fixtures.test.js +0 -152
  195. package/packages/sdk/dist/__tests__/contract-fixtures.test.js.map +0 -1
  196. package/packages/sdk/dist/__tests__/e2e-owner-review.test.d.ts +0 -16
  197. package/packages/sdk/dist/__tests__/e2e-owner-review.test.d.ts.map +0 -1
  198. package/packages/sdk/dist/__tests__/e2e-owner-review.test.js +0 -640
  199. package/packages/sdk/dist/__tests__/e2e-owner-review.test.js.map +0 -1
  200. package/packages/sdk/dist/__tests__/facade.test.d.ts +0 -2
  201. package/packages/sdk/dist/__tests__/facade.test.d.ts.map +0 -1
  202. package/packages/sdk/dist/__tests__/facade.test.js +0 -305
  203. package/packages/sdk/dist/__tests__/facade.test.js.map +0 -1
  204. package/packages/sdk/dist/__tests__/integration.test.d.ts +0 -2
  205. package/packages/sdk/dist/__tests__/integration.test.d.ts.map +0 -1
  206. package/packages/sdk/dist/__tests__/integration.test.js +0 -205
  207. package/packages/sdk/dist/__tests__/integration.test.js.map +0 -1
  208. package/packages/sdk/dist/__tests__/pty.test.d.ts +0 -2
  209. package/packages/sdk/dist/__tests__/pty.test.d.ts.map +0 -1
  210. package/packages/sdk/dist/__tests__/pty.test.js +0 -20
  211. package/packages/sdk/dist/__tests__/pty.test.js.map +0 -1
  212. package/packages/sdk/dist/__tests__/quickstart.test.d.ts +0 -2
  213. package/packages/sdk/dist/__tests__/quickstart.test.d.ts.map +0 -1
  214. package/packages/sdk/dist/__tests__/quickstart.test.js +0 -176
  215. package/packages/sdk/dist/__tests__/quickstart.test.js.map +0 -1
  216. package/packages/sdk/dist/__tests__/spawn-from-env.test.d.ts +0 -2
  217. package/packages/sdk/dist/__tests__/spawn-from-env.test.d.ts.map +0 -1
  218. package/packages/sdk/dist/__tests__/spawn-from-env.test.js +0 -222
  219. package/packages/sdk/dist/__tests__/spawn-from-env.test.js.map +0 -1
  220. package/packages/sdk/dist/__tests__/unit.test.d.ts +0 -2
  221. package/packages/sdk/dist/__tests__/unit.test.d.ts.map +0 -1
  222. package/packages/sdk/dist/__tests__/unit.test.js +0 -357
  223. package/packages/sdk/dist/__tests__/unit.test.js.map +0 -1
  224. package/packages/sdk-py/agent_relay/__init__.py +0 -21
  225. package/packages/sdk-py/agent_relay/models.py +0 -398
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-relay",
3
- "version": "3.2.3",
3
+ "version": "3.2.4",
4
4
  "description": "Real-time agent-to-agent communication system",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -176,16 +176,16 @@
176
176
  },
177
177
  "homepage": "https://github.com/AgentWorkforce/relay#readme",
178
178
  "dependencies": {
179
- "@agent-relay/config": "3.2.3",
180
- "@agent-relay/hooks": "3.2.3",
181
- "@agent-relay/sdk": "3.2.3",
182
- "@agent-relay/telemetry": "3.2.3",
183
- "@agent-relay/trajectory": "3.2.3",
184
- "@agent-relay/user-directory": "3.2.3",
185
- "@agent-relay/utils": "3.2.3",
179
+ "@agent-relay/config": "3.2.4",
180
+ "@agent-relay/hooks": "3.2.4",
181
+ "@agent-relay/sdk": "3.2.4",
182
+ "@agent-relay/telemetry": "3.2.4",
183
+ "@agent-relay/trajectory": "3.2.4",
184
+ "@agent-relay/user-directory": "3.2.4",
185
+ "@agent-relay/utils": "3.2.4",
186
186
  "@modelcontextprotocol/sdk": "^1.0.0",
187
- "@relaycast/mcp": "^0.5.1",
188
- "@relaycast/sdk": "^0.4.0",
187
+ "@relaycast/mcp": "0.5.2",
188
+ "@relaycast/sdk": "0.5.2",
189
189
  "chokidar": "^5.0.0",
190
190
  "commander": "^12.1.0",
191
191
  "compare-versions": "^6.1.1",
@@ -196,6 +196,7 @@
196
196
  "pg": "^8.16.3",
197
197
  "posthog-node": "^4.0.1",
198
198
  "smol-toml": "^1.6.0",
199
+ "@sinclair/typebox": "^0.34.14",
199
200
  "ssh2": "^1.17.0",
200
201
  "uuid": "^10.0.0",
201
202
  "ws": "^8.18.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/acp-bridge",
3
- "version": "3.2.3",
3
+ "version": "3.2.4",
4
4
  "description": "ACP (Agent Client Protocol) bridge for Agent Relay - expose relay agents to ACP-compatible editors like Zed",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -46,7 +46,7 @@
46
46
  "access": "public"
47
47
  },
48
48
  "dependencies": {
49
- "@agent-relay/sdk": "3.2.3",
49
+ "@agent-relay/sdk": "3.2.4",
50
50
  "@agentclientprotocol/sdk": "^0.12.0"
51
51
  },
52
52
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/config",
3
- "version": "3.2.3",
3
+ "version": "3.2.4",
4
4
  "description": "Shared configuration schemas and loaders for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/hooks",
3
- "version": "3.2.3",
3
+ "version": "3.2.4",
4
4
  "description": "Hook emitter, registry, and trajectory hooks for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -37,9 +37,9 @@
37
37
  "test:watch": "vitest"
38
38
  },
39
39
  "dependencies": {
40
- "@agent-relay/config": "3.2.3",
41
- "@agent-relay/trajectory": "3.2.3",
42
- "@agent-relay/sdk": "3.2.3"
40
+ "@agent-relay/config": "3.2.4",
41
+ "@agent-relay/trajectory": "3.2.4",
42
+ "@agent-relay/sdk": "3.2.4"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/memory",
3
- "version": "3.2.3",
3
+ "version": "3.2.4",
4
4
  "description": "Semantic memory storage and retrieval system for agent-relay with multiple backend support",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -22,7 +22,7 @@
22
22
  "test:watch": "vitest"
23
23
  },
24
24
  "dependencies": {
25
- "@agent-relay/hooks": "3.2.3"
25
+ "@agent-relay/hooks": "3.2.4"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/openclaw",
3
- "version": "3.2.3",
3
+ "version": "3.2.4",
4
4
  "description": "Relaycast bridge for OpenClaw — messaging, identity, runtime setup, and local spawning",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -29,7 +29,7 @@
29
29
  "postinstall": "node -e \"try{require('child_process').execSync('ldd --version 2>&1',{stdio:'pipe'})}catch{try{require('child_process').execSync('apk info gcompat 2>/dev/null',{stdio:'pipe'})}catch{console.warn('\\n\\u26a0\\ufe0f @agent-relay/openclaw: Alpine detected without gcompat. Spawning requires glibc.\\n Install with: apk add gcompat libstdc++\\n')}}\""
30
30
  },
31
31
  "dependencies": {
32
- "@agent-relay/sdk": "3.2.3",
32
+ "@agent-relay/sdk": "3.2.4",
33
33
  "@relaycast/sdk": "^0.4.0",
34
34
  "ws": "^8.0.0"
35
35
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/policy",
3
- "version": "3.2.3",
3
+ "version": "3.2.4",
4
4
  "description": "Agent policy management with multi-level fallback (repo, local PRPM, cloud workspace)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -22,7 +22,7 @@
22
22
  "test:watch": "vitest"
23
23
  },
24
24
  "dependencies": {
25
- "@agent-relay/config": "3.2.3"
25
+ "@agent-relay/config": "3.2.4"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^22.19.3",
@@ -0,0 +1,109 @@
1
+ # TypeScript Relay Communicate Adapter Review
2
+
3
+ **Date**: 2026-03-14
4
+ **Reviewer**: Review-Adapters agent
5
+ **Scope**: 6 adapters + index.ts + 6 test files (39 tests)
6
+
7
+ ## Summary
8
+
9
+ The adapters are well-structured and follow a consistent pattern overall. All 6 expose the same 4 relay tools (`relay_send`, `relay_inbox`, `relay_post`, `relay_agents`) with matching descriptions and behavior. Each adapter duck-types the target framework's interfaces rather than importing them at runtime, which is a good design choice for optional peer dependencies.
10
+
11
+ **All 39 tests pass after fixes.**
12
+
13
+ ---
14
+
15
+ ## Issues Found & Fixed
16
+
17
+ ### 1. Pi adapter: No cleanup exposed (FIXED)
18
+ **File**: `src/communicate/adapters/pi.ts`
19
+ **Severity**: Medium
20
+
21
+ The `unsubscribe` handle from `relay.onMessage()` was captured in a closure variable but never exposed to the caller. Every other adapter that subscribes to messages provides a cleanup/unsubscribe mechanism. Added a `cleanup()` method to the returned config object.
22
+
23
+ ### 2. CrewAI: Dead `messageBuffer` code (FIXED)
24
+ **File**: `src/communicate/adapters/crewai.ts`
25
+ **Severity**: Low
26
+
27
+ `messageBuffer` was populated in the `onMessage` callback but never read anywhere. Removed the dead accumulator — `step_callback` is the only routing mechanism needed.
28
+
29
+ ### 3. Missing `onCrewRelay` export (FIXED)
30
+ **File**: `src/communicate/adapters/index.ts`
31
+ **Severity**: Medium
32
+
33
+ `crewai.ts` exports both `onRelay` (single agent) and `onCrewRelay` (all agents in a crew), but `index.ts` only re-exported `onRelay`. Added `onCrewRelay` to the barrel export.
34
+
35
+ ### 4. LangGraph: Hardcoded agent name (FIXED)
36
+ **File**: `src/communicate/adapters/langgraph.ts`
37
+ **Severity**: Low
38
+
39
+ The default Relay name was hardcoded to `'langgraph'`, unlike all other adapters which derive it from the agent or accept it as a parameter. Updated the second parameter to accept either a `RelayLike` instance or a `string` name, preserving backward compatibility.
40
+
41
+ ---
42
+
43
+ ## Consistency Audit
44
+
45
+ | Aspect | Pi | Claude SDK | OpenAI Agents | LangGraph | Google ADK | CrewAI |
46
+ |--------|----|-----------:|---------------|-----------|------------|--------|
47
+ | Tool names | relay_send/inbox/post/agents | N/A (MCP) | relay_send/inbox/post/agents | relay_send/inbox/post/agents | relay_send/inbox/post/agents | relay_send/inbox/post/agents |
48
+ | Tool descriptions | Consistent | N/A | Consistent | Consistent | Consistent | Consistent |
49
+ | Message formatting | formatRelayMessage | formatRelayMessage | formatRelayMessage | formatRelayMessage | formatRelayMessage | formatRelayMessage |
50
+ | Inbox formatting | formatRelayInbox | drainInbox (wraps formatRelayMessage) | formatRelayInbox | formatRelayInbox | formatRelayInbox | formatRelayInbox |
51
+ | Cleanup mechanism | cleanup() (fixed) | N/A (stateless hooks) | cleanup() | unsubscribe() | unsubscribe() | unsubscribe() |
52
+ | Name source | param | param | agent.name | param or default | param | agent.role |
53
+
54
+ ### Notes on intentional differences
55
+
56
+ - **Claude SDK** uses MCP server + hooks pattern (no custom tools) — this is correct for how Claude Agent SDK works.
57
+ - **CrewAI** uses `tool_name` instead of `name` — matches CrewAI's tool interface.
58
+ - **Google ADK** tools return `{ result: string }` objects — matches ADK's FunctionTool contract.
59
+ - **OpenAI Agents** tools accept `input: string` (JSON) via `invoke()` — matches the OpenAI Agents SDK function tool interface.
60
+
61
+ ---
62
+
63
+ ## Type Safety
64
+
65
+ - **Good**: All adapters use duck-typed interfaces (`*Like` types) to avoid hard dependencies.
66
+ - **Acceptable**: CrewAI uses `any[]` for `tools` and `any` for `step_callback` step param — this mirrors CrewAI's own loose typing.
67
+ - **Good**: OpenAI Agents uses `as const` assertions for literal types (`'function'`, `false`, `true`).
68
+
69
+ ---
70
+
71
+ ## Error Handling
72
+
73
+ All adapters delegate errors to the Relay instance (which handles connection errors, auth, etc.). Tool execution functions propagate promise rejections naturally. No adapter swallows errors, which is correct — callers see failures via the tool return.
74
+
75
+ **Potential improvement** (not fixed — low priority): The OpenAI Agents adapter's `JSON.parse(input)` in `invoke()` could throw on malformed input. A try/catch with a descriptive error message would be more framework-friendly.
76
+
77
+ ---
78
+
79
+ ## Test Coverage
80
+
81
+ | Adapter | Tests | Tools | Message routing | Cleanup | Preserves existing |
82
+ |---------|------:|------:|----------------:|--------:|-------------------:|
83
+ | Pi | 3 | Yes | steer + followUp | No test | Yes (onSessionCreated) |
84
+ | Claude SDK | 4 | N/A | PostToolUse + Stop hooks | N/A | Yes (existing hooks) |
85
+ | OpenAI Agents | 7 | Yes + invoke | instructions injection | Yes | Yes (fn instructions) |
86
+ | LangGraph | 7 | Yes + invoke | graph.invoke() | Yes | N/A |
87
+ | Google ADK | 9 | Yes + execute | runner.runAsync() | Yes | N/A |
88
+ | CrewAI | 10 | Yes + execute | step_callback | Yes | Yes (onCrewRelay) |
89
+
90
+ **Gaps**:
91
+ - Pi: No test for the new `cleanup()` method (added by this review).
92
+ - Pi: No test for `relay_send` / `relay_post` tool execution (only tests tool presence).
93
+ - Claude SDK: No test for empty inbox returning `{}` (no systemMessage).
94
+
95
+ ---
96
+
97
+ ## Export Naming (index.ts)
98
+
99
+ ```typescript
100
+ onPiRelay // ✓ clear
101
+ onClaudeRelay // ✓ clear
102
+ onCrewAIRelay // ✓ clear
103
+ onCrewRelay // ✓ added (crew-level helper)
104
+ onOpenAIAgentsRelay // ✓ clear
105
+ onLangGraphRelay // ✓ clear
106
+ onGoogleAdkRelay // ✓ clear
107
+ ```
108
+
109
+ All exports follow `on<Framework>Relay` naming convention. Consistent and discoverable.
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Bridge that connects an external A2A agent into a Relay workspace.
3
+ *
4
+ * - Registers a proxy agent on the Relay workspace
5
+ * - When Relay messages arrive for the proxy, forwards them as A2A JSON-RPC
6
+ * message/send calls to the external agent
7
+ * - When A2A responses come back, forwards them as Relay DMs
8
+ */
9
+ import { Relay } from './core.js';
10
+ import { type A2AAgentCard } from './a2a-types.js';
11
+ import type { RelayConfig } from './types.js';
12
+ export declare class A2ABridge {
13
+ readonly relay: Relay;
14
+ readonly a2aAgentUrl: string;
15
+ readonly proxyName: string;
16
+ private _agentCard?;
17
+ private _started;
18
+ constructor(relayConfig: RelayConfig, a2aAgentUrl: string, proxyName: string);
19
+ start(): Promise<void>;
20
+ stop(): Promise<void>;
21
+ discoverAgent(): Promise<A2AAgentCard>;
22
+ sendA2AMessage(text: string): Promise<string | null>;
23
+ private _handleRelayMessage;
24
+ }
25
+ //# sourceMappingURL=a2a-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-bridge.d.ts","sourceRoot":"","sources":["../../src/communicate/a2a-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EACL,KAAK,YAAY,EAElB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAW,WAAW,EAAE,MAAM,YAAY,CAAC;AAEvD,qBAAa,SAAS;IACpB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,OAAO,CAAC,UAAU,CAAC,CAAe;IAClC,OAAO,CAAC,QAAQ,CAAS;gBAGvB,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM;IAOb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrB,aAAa,IAAI,OAAO,CAAC,YAAY,CAAC;IAQtC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YAkD5C,mBAAmB;CAMlC"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Bridge that connects an external A2A agent into a Relay workspace.
3
+ *
4
+ * - Registers a proxy agent on the Relay workspace
5
+ * - When Relay messages arrive for the proxy, forwards them as A2A JSON-RPC
6
+ * message/send calls to the external agent
7
+ * - When A2A responses come back, forwards them as Relay DMs
8
+ */
9
+ import { randomUUID } from 'node:crypto';
10
+ import { Relay } from './core.js';
11
+ import { a2aAgentCardFromDict, } from './a2a-types.js';
12
+ export class A2ABridge {
13
+ relay;
14
+ a2aAgentUrl;
15
+ proxyName;
16
+ _agentCard;
17
+ _started = false;
18
+ constructor(relayConfig, a2aAgentUrl, proxyName) {
19
+ this.relay = new Relay(proxyName, relayConfig);
20
+ this.a2aAgentUrl = a2aAgentUrl.replace(/\/+$/, '');
21
+ this.proxyName = proxyName;
22
+ }
23
+ async start() {
24
+ this.relay.onMessage((msg) => this._handleRelayMessage(msg));
25
+ this._started = true;
26
+ }
27
+ async stop() {
28
+ this._started = false;
29
+ await this.relay.close();
30
+ }
31
+ async discoverAgent() {
32
+ const url = `${this.a2aAgentUrl}/.well-known/agent.json`;
33
+ const response = await fetch(url);
34
+ const data = (await response.json());
35
+ this._agentCard = a2aAgentCardFromDict(data);
36
+ return this._agentCard;
37
+ }
38
+ async sendA2AMessage(text) {
39
+ const a2aMsg = {
40
+ role: 'user',
41
+ parts: [{ text }],
42
+ messageId: randomUUID(),
43
+ };
44
+ const jsonrpcRequest = {
45
+ jsonrpc: '2.0',
46
+ method: 'message/send',
47
+ params: { message: a2aMsg },
48
+ id: randomUUID(),
49
+ };
50
+ const targetUrl = this._agentCard?.url ?? this.a2aAgentUrl;
51
+ const response = await fetch(targetUrl, {
52
+ method: 'POST',
53
+ headers: { 'Content-Type': 'application/json' },
54
+ body: JSON.stringify(jsonrpcRequest),
55
+ });
56
+ const data = (await response.json());
57
+ const result = (data.result ?? {});
58
+ // Extract response text from task status message
59
+ const status = (result.status ?? {});
60
+ const statusMsg = (status.message ?? {});
61
+ const statusParts = (statusMsg.parts ?? []);
62
+ if (statusParts.length > 0) {
63
+ const t = statusParts[0].text;
64
+ if (t)
65
+ return t;
66
+ }
67
+ // Try from messages list
68
+ const messages = (result.messages ?? []);
69
+ for (let i = messages.length - 1; i >= 0; i--) {
70
+ const msg = messages[i];
71
+ if (msg.role === 'agent') {
72
+ const msgParts = (msg.parts ?? []);
73
+ if (msgParts.length > 0) {
74
+ const t = msgParts[0].text;
75
+ if (t)
76
+ return t;
77
+ }
78
+ }
79
+ }
80
+ return null;
81
+ }
82
+ async _handleRelayMessage(msg) {
83
+ const responseText = await this.sendA2AMessage(msg.text);
84
+ if (responseText) {
85
+ await this.relay.send(msg.sender, responseText);
86
+ }
87
+ }
88
+ }
89
+ //# sourceMappingURL=a2a-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-bridge.js","sourceRoot":"","sources":["../../src/communicate/a2a-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * A2A-compliant HTTP server that exposes a Relay agent as an A2A endpoint.
3
+ *
4
+ * Routes:
5
+ * GET /.well-known/agent.json -> Agent Card
6
+ * POST / -> JSON-RPC 2.0 dispatcher
7
+ */
8
+ import { type A2AAgentCard, type A2AMessage, type A2ASkill, type A2ATask } from './a2a-types.js';
9
+ export type A2AMessageHandler = (msg: A2AMessage) => A2AMessage | null | Promise<A2AMessage | null>;
10
+ export declare class A2AServer {
11
+ readonly agentName: string;
12
+ readonly port: number;
13
+ readonly host: string;
14
+ readonly skills: A2ASkill[];
15
+ readonly tasks: Map<string, A2ATask>;
16
+ private _onMessage?;
17
+ private _server?;
18
+ private _actualPort?;
19
+ constructor(agentName: string, port?: number, host?: string, skills?: A2ASkill[]);
20
+ get url(): string;
21
+ onMessage(callback: A2AMessageHandler): void;
22
+ getAgentCard(): A2AAgentCard;
23
+ handleMessageSend(params: Record<string, unknown>): Promise<Record<string, unknown>>;
24
+ handleTasksGet(taskId: string): Promise<Record<string, unknown>>;
25
+ handleTasksCancel(taskId: string): Promise<Record<string, unknown>>;
26
+ start(): Promise<void>;
27
+ stop(): Promise<void>;
28
+ private _handleRequest;
29
+ private _handleJsonRpc;
30
+ }
31
+ //# sourceMappingURL=a2a-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-server.d.ts","sourceRoot":"","sources":["../../src/communicate/a2a-server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,UAAU,EAEf,KAAK,QAAQ,EACb,KAAK,OAAO,EAMb,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,iBAAiB,GAAG,CAC9B,GAAG,EAAE,UAAU,KACZ,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;AAEpD,qBAAa,SAAS;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAa;IAEjD,OAAO,CAAC,UAAU,CAAC,CAAoB;IACvC,OAAO,CAAC,OAAO,CAAC,CAAc;IAC9B,OAAO,CAAC,WAAW,CAAC,CAAS;gBAG3B,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,MAAa,EACnB,IAAI,GAAE,MAAkB,EACxB,MAAM,GAAE,QAAQ,EAAO;IAQzB,IAAI,GAAG,IAAI,MAAM,CAGhB;IAED,SAAS,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAI5C,YAAY,IAAI,YAAY;IAStB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAkDpF,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAQhE,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IASnE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAYb,cAAc;YAiBd,cAAc;CAyD7B"}
@@ -0,0 +1,220 @@
1
+ /**
2
+ * A2A-compliant HTTP server that exposes a Relay agent as an A2A endpoint.
3
+ *
4
+ * Routes:
5
+ * GET /.well-known/agent.json -> Agent Card
6
+ * POST / -> JSON-RPC 2.0 dispatcher
7
+ */
8
+ import { randomUUID } from 'node:crypto';
9
+ import * as http from 'node:http';
10
+ import { a2aAgentCardToDict, a2aMessageToDict, createA2AAgentCard, createA2ATaskStatus, } from './a2a-types.js';
11
+ export class A2AServer {
12
+ agentName;
13
+ port;
14
+ host;
15
+ skills;
16
+ tasks = new Map();
17
+ _onMessage;
18
+ _server;
19
+ _actualPort;
20
+ constructor(agentName, port = 5000, host = '0.0.0.0', skills = []) {
21
+ this.agentName = agentName;
22
+ this.port = port;
23
+ this.host = host;
24
+ this.skills = skills;
25
+ }
26
+ get url() {
27
+ const p = this._actualPort ?? this.port;
28
+ return `http://${this.host}:${p}`;
29
+ }
30
+ onMessage(callback) {
31
+ this._onMessage = callback;
32
+ }
33
+ getAgentCard() {
34
+ return createA2AAgentCard(this.agentName, `Agent Relay agent: ${this.agentName}`, this.url, [...this.skills]);
35
+ }
36
+ async handleMessageSend(params) {
37
+ const messageData = (params.message ?? {});
38
+ const rawParts = (messageData.parts ?? []);
39
+ const parts = rawParts.map((p) => ({ text: p.text }));
40
+ const incoming = {
41
+ role: messageData.role ?? 'user',
42
+ parts,
43
+ messageId: messageData.messageId ?? randomUUID(),
44
+ contextId: messageData.contextId,
45
+ taskId: messageData.taskId,
46
+ };
47
+ // Create or find task
48
+ const taskId = incoming.taskId ?? randomUUID();
49
+ const contextId = incoming.contextId ?? randomUUID();
50
+ let task;
51
+ if (this.tasks.has(taskId)) {
52
+ task = this.tasks.get(taskId);
53
+ task.messages.push(incoming);
54
+ task.status = createA2ATaskStatus('working');
55
+ }
56
+ else {
57
+ task = {
58
+ id: taskId,
59
+ contextId,
60
+ status: createA2ATaskStatus('working'),
61
+ messages: [incoming],
62
+ artifacts: [],
63
+ };
64
+ this.tasks.set(taskId, task);
65
+ }
66
+ // Invoke callback
67
+ let responseMsg = null;
68
+ if (this._onMessage) {
69
+ const result = this._onMessage(incoming);
70
+ responseMsg = result instanceof Promise ? await result : result;
71
+ }
72
+ if (responseMsg) {
73
+ task.messages.push(responseMsg);
74
+ task.status = createA2ATaskStatus('completed', responseMsg);
75
+ }
76
+ else {
77
+ task.status = createA2ATaskStatus('completed');
78
+ }
79
+ return taskToDict(task);
80
+ }
81
+ async handleTasksGet(taskId) {
82
+ const task = this.tasks.get(taskId);
83
+ if (!task) {
84
+ throw new Error(`Task not found: ${taskId}`);
85
+ }
86
+ return taskToDict(task);
87
+ }
88
+ async handleTasksCancel(taskId) {
89
+ const task = this.tasks.get(taskId);
90
+ if (!task) {
91
+ throw new Error(`Task not found: ${taskId}`);
92
+ }
93
+ task.status = createA2ATaskStatus('canceled');
94
+ return taskToDict(task);
95
+ }
96
+ async start() {
97
+ return new Promise((resolve, reject) => {
98
+ const server = http.createServer((req, res) => {
99
+ void this._handleRequest(req, res);
100
+ });
101
+ server.on('error', reject);
102
+ server.listen(this.port, this.host, () => {
103
+ this._server = server;
104
+ const addr = server.address();
105
+ if (typeof addr === 'object' && addr) {
106
+ this._actualPort = addr.port;
107
+ }
108
+ resolve();
109
+ });
110
+ });
111
+ }
112
+ async stop() {
113
+ if (this._server) {
114
+ await new Promise((resolve, reject) => {
115
+ this._server.close((err) => (err ? reject(err) : resolve()));
116
+ });
117
+ this._server = undefined;
118
+ this._actualPort = undefined;
119
+ }
120
+ }
121
+ // --- HTTP handlers ---
122
+ async _handleRequest(req, res) {
123
+ if (req.method === 'GET' && req.url === '/.well-known/agent.json') {
124
+ const card = this.getAgentCard();
125
+ res.writeHead(200, { 'Content-Type': 'application/json' });
126
+ res.end(JSON.stringify(a2aAgentCardToDict(card)));
127
+ return;
128
+ }
129
+ if (req.method === 'POST' && (req.url === '/' || req.url === '')) {
130
+ await this._handleJsonRpc(req, res);
131
+ return;
132
+ }
133
+ res.writeHead(404, { 'Content-Type': 'application/json' });
134
+ res.end(JSON.stringify({ error: 'Not found' }));
135
+ }
136
+ async _handleJsonRpc(req, res) {
137
+ let body;
138
+ try {
139
+ const raw = await readBody(req);
140
+ body = JSON.parse(raw);
141
+ }
142
+ catch {
143
+ res.writeHead(400, { 'Content-Type': 'application/json' });
144
+ res.end(JSON.stringify({
145
+ jsonrpc: '2.0',
146
+ error: { code: -32700, message: 'Parse error' },
147
+ id: null,
148
+ }));
149
+ return;
150
+ }
151
+ const method = (body.method ?? '');
152
+ const params = (body.params ?? {});
153
+ const rpcId = body.id ?? null;
154
+ try {
155
+ let result;
156
+ if (method === 'message/send') {
157
+ result = await this.handleMessageSend(params);
158
+ }
159
+ else if (method === 'tasks/get') {
160
+ const id = (params.id ?? params.taskId ?? '');
161
+ result = await this.handleTasksGet(id);
162
+ }
163
+ else if (method === 'tasks/cancel') {
164
+ const id = (params.id ?? params.taskId ?? '');
165
+ result = await this.handleTasksCancel(id);
166
+ }
167
+ else {
168
+ res.writeHead(400, { 'Content-Type': 'application/json' });
169
+ res.end(JSON.stringify({
170
+ jsonrpc: '2.0',
171
+ error: { code: -32601, message: `Method not found: ${method}` },
172
+ id: rpcId,
173
+ }));
174
+ return;
175
+ }
176
+ res.writeHead(200, { 'Content-Type': 'application/json' });
177
+ res.end(JSON.stringify({ jsonrpc: '2.0', result, id: rpcId }));
178
+ }
179
+ catch (err) {
180
+ res.writeHead(404, { 'Content-Type': 'application/json' });
181
+ res.end(JSON.stringify({
182
+ jsonrpc: '2.0',
183
+ error: { code: -32602, message: String(err) },
184
+ id: rpcId,
185
+ }));
186
+ }
187
+ }
188
+ }
189
+ // --- Helpers ---
190
+ function readBody(req) {
191
+ return new Promise((resolve, reject) => {
192
+ const chunks = [];
193
+ req.on('data', (chunk) => chunks.push(chunk));
194
+ req.on('end', () => resolve(Buffer.concat(chunks).toString()));
195
+ req.on('error', reject);
196
+ });
197
+ }
198
+ function taskToDict(task) {
199
+ const statusDict = { state: task.status.state };
200
+ if (task.status.message) {
201
+ statusDict.message = a2aMessageToDict(task.status.message);
202
+ }
203
+ const messages = task.messages.map((m) => {
204
+ const md = {
205
+ role: m.role,
206
+ parts: m.parts.map((p) => ({ text: p.text })),
207
+ };
208
+ if (m.messageId)
209
+ md.messageId = m.messageId;
210
+ return md;
211
+ });
212
+ return {
213
+ id: task.id,
214
+ contextId: task.contextId,
215
+ status: statusDict,
216
+ messages,
217
+ artifacts: task.artifacts,
218
+ };
219
+ }
220
+ //# sourceMappingURL=a2a-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-server.js","sourceRoot":"","sources":["../../src/communicate/a2a-server.ts"],"names":[],"mappings":"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"}