agent-relay 2.1.13 → 2.1.14

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 (164) hide show
  1. package/dist/index.cjs +37571 -50918
  2. package/dist/src/cli/index.js +1 -1
  3. package/dist/src/cli/index.js.map +1 -1
  4. package/package.json +18 -18
  5. package/packages/acp-bridge/package.json +2 -2
  6. package/packages/api-types/package.json +1 -1
  7. package/packages/benchmark/datasets/quick-test.yaml +20 -0
  8. package/packages/benchmark/dist/runners/base.d.ts.map +1 -1
  9. package/packages/benchmark/dist/runners/base.js +1 -0
  10. package/packages/benchmark/dist/runners/base.js.map +1 -1
  11. package/packages/benchmark/package.json +4 -4
  12. package/packages/benchmark/src/runners/base.ts +1 -0
  13. package/packages/bridge/dist/spawner.d.ts.map +1 -1
  14. package/packages/bridge/dist/spawner.js +2 -30
  15. package/packages/bridge/dist/spawner.js.map +1 -1
  16. package/packages/bridge/package.json +7 -8
  17. package/packages/bridge/src/spawner.ts +2 -29
  18. package/packages/cli-tester/package.json +1 -1
  19. package/packages/config/dist/teams-config.d.ts +7 -1
  20. package/packages/config/dist/teams-config.d.ts.map +1 -1
  21. package/packages/config/dist/teams-config.js +88 -34
  22. package/packages/config/dist/teams-config.js.map +1 -1
  23. package/packages/config/package.json +2 -2
  24. package/packages/config/src/teams-config.ts +106 -39
  25. package/packages/continuity/package.json +2 -2
  26. package/packages/daemon/dist/server.d.ts.map +1 -1
  27. package/packages/daemon/dist/server.js +18 -0
  28. package/packages/daemon/dist/server.js.map +1 -1
  29. package/packages/daemon/dist/spawn-manager.d.ts +8 -0
  30. package/packages/daemon/dist/spawn-manager.d.ts.map +1 -1
  31. package/packages/daemon/dist/spawn-manager.js +14 -3
  32. package/packages/daemon/dist/spawn-manager.js.map +1 -1
  33. package/packages/daemon/package.json +12 -12
  34. package/packages/daemon/src/server.ts +17 -0
  35. package/packages/daemon/src/spawn-manager.ts +21 -3
  36. package/packages/hooks/package.json +4 -4
  37. package/packages/mcp/CHANGELOG.md +28 -0
  38. package/packages/mcp/README.md +31 -0
  39. package/packages/mcp/dist/bin.js +18 -5
  40. package/packages/mcp/dist/bin.js.map +1 -1
  41. package/packages/mcp/dist/{client.d.ts → client-adapter.d.ts} +22 -36
  42. package/packages/mcp/dist/client-adapter.d.ts.map +1 -0
  43. package/packages/mcp/dist/client-adapter.js +230 -0
  44. package/packages/mcp/dist/client-adapter.js.map +1 -0
  45. package/packages/mcp/dist/hybrid-client.d.ts +1 -31
  46. package/packages/mcp/dist/hybrid-client.d.ts.map +1 -1
  47. package/packages/mcp/dist/hybrid-client.js +3 -153
  48. package/packages/mcp/dist/hybrid-client.js.map +1 -1
  49. package/packages/mcp/dist/index.d.ts +2 -3
  50. package/packages/mcp/dist/index.d.ts.map +1 -1
  51. package/packages/mcp/dist/index.js +4 -3
  52. package/packages/mcp/dist/index.js.map +1 -1
  53. package/packages/mcp/dist/resources/agents.d.ts +1 -1
  54. package/packages/mcp/dist/resources/agents.d.ts.map +1 -1
  55. package/packages/mcp/dist/resources/inbox.d.ts +1 -1
  56. package/packages/mcp/dist/resources/inbox.d.ts.map +1 -1
  57. package/packages/mcp/dist/resources/project.d.ts +1 -1
  58. package/packages/mcp/dist/resources/project.d.ts.map +1 -1
  59. package/packages/mcp/dist/server.d.ts +5 -1
  60. package/packages/mcp/dist/server.d.ts.map +1 -1
  61. package/packages/mcp/dist/server.js.map +1 -1
  62. package/packages/mcp/dist/simple.d.ts +1 -1
  63. package/packages/mcp/dist/simple.d.ts.map +1 -1
  64. package/packages/mcp/dist/simple.js +1 -1
  65. package/packages/mcp/dist/simple.js.map +1 -1
  66. package/packages/mcp/dist/tools/relay-broadcast.d.ts +1 -1
  67. package/packages/mcp/dist/tools/relay-broadcast.d.ts.map +1 -1
  68. package/packages/mcp/dist/tools/relay-channel.d.ts +1 -1
  69. package/packages/mcp/dist/tools/relay-channel.d.ts.map +1 -1
  70. package/packages/mcp/dist/tools/relay-connected.d.ts +1 -1
  71. package/packages/mcp/dist/tools/relay-connected.d.ts.map +1 -1
  72. package/packages/mcp/dist/tools/relay-consensus.d.ts +7 -7
  73. package/packages/mcp/dist/tools/relay-consensus.d.ts.map +1 -1
  74. package/packages/mcp/dist/tools/relay-continuity.d.ts +1 -1
  75. package/packages/mcp/dist/tools/relay-continuity.d.ts.map +1 -1
  76. package/packages/mcp/dist/tools/relay-health.d.ts +1 -1
  77. package/packages/mcp/dist/tools/relay-health.d.ts.map +1 -1
  78. package/packages/mcp/dist/tools/relay-inbox.d.ts +2 -2
  79. package/packages/mcp/dist/tools/relay-inbox.d.ts.map +1 -1
  80. package/packages/mcp/dist/tools/relay-logs.d.ts +1 -1
  81. package/packages/mcp/dist/tools/relay-logs.d.ts.map +1 -1
  82. package/packages/mcp/dist/tools/relay-messages.d.ts +7 -7
  83. package/packages/mcp/dist/tools/relay-messages.d.ts.map +1 -1
  84. package/packages/mcp/dist/tools/relay-metrics.d.ts +1 -1
  85. package/packages/mcp/dist/tools/relay-metrics.d.ts.map +1 -1
  86. package/packages/mcp/dist/tools/relay-metrics.js +4 -4
  87. package/packages/mcp/dist/tools/relay-metrics.js.map +1 -1
  88. package/packages/mcp/dist/tools/relay-release.d.ts +1 -1
  89. package/packages/mcp/dist/tools/relay-release.d.ts.map +1 -1
  90. package/packages/mcp/dist/tools/relay-remove-agent.d.ts +1 -1
  91. package/packages/mcp/dist/tools/relay-remove-agent.d.ts.map +1 -1
  92. package/packages/mcp/dist/tools/relay-send.d.ts +3 -3
  93. package/packages/mcp/dist/tools/relay-send.d.ts.map +1 -1
  94. package/packages/mcp/dist/tools/relay-shadow.d.ts +1 -1
  95. package/packages/mcp/dist/tools/relay-shadow.d.ts.map +1 -1
  96. package/packages/mcp/dist/tools/relay-spawn.d.ts +3 -3
  97. package/packages/mcp/dist/tools/relay-spawn.d.ts.map +1 -1
  98. package/packages/mcp/dist/tools/relay-status.d.ts +1 -1
  99. package/packages/mcp/dist/tools/relay-status.d.ts.map +1 -1
  100. package/packages/mcp/dist/tools/relay-subscribe.d.ts +1 -1
  101. package/packages/mcp/dist/tools/relay-subscribe.d.ts.map +1 -1
  102. package/packages/mcp/dist/tools/relay-who.d.ts +1 -1
  103. package/packages/mcp/dist/tools/relay-who.d.ts.map +1 -1
  104. package/packages/mcp/package.json +13 -4
  105. package/packages/mcp/src/bin.ts +21 -6
  106. package/packages/mcp/src/client-adapter.ts +349 -0
  107. package/packages/mcp/src/hybrid-client.ts +3 -202
  108. package/packages/mcp/src/index.ts +12 -5
  109. package/packages/mcp/src/resources/agents.ts +1 -1
  110. package/packages/mcp/src/resources/inbox.ts +1 -1
  111. package/packages/mcp/src/resources/project.ts +1 -1
  112. package/packages/mcp/src/server.ts +5 -1
  113. package/packages/mcp/src/simple.ts +1 -1
  114. package/packages/mcp/src/tools/relay-broadcast.ts +1 -1
  115. package/packages/mcp/src/tools/relay-channel.ts +1 -1
  116. package/packages/mcp/src/tools/relay-connected.ts +1 -1
  117. package/packages/mcp/src/tools/relay-consensus.ts +1 -1
  118. package/packages/mcp/src/tools/relay-continuity.ts +1 -1
  119. package/packages/mcp/src/tools/relay-health.ts +1 -1
  120. package/packages/mcp/src/tools/relay-inbox.ts +1 -1
  121. package/packages/mcp/src/tools/relay-logs.ts +1 -1
  122. package/packages/mcp/src/tools/relay-messages.ts +1 -1
  123. package/packages/mcp/src/tools/relay-metrics.ts +7 -5
  124. package/packages/mcp/src/tools/relay-release.ts +1 -1
  125. package/packages/mcp/src/tools/relay-remove-agent.ts +1 -1
  126. package/packages/mcp/src/tools/relay-send.ts +1 -1
  127. package/packages/mcp/src/tools/relay-shadow.ts +1 -1
  128. package/packages/mcp/src/tools/relay-spawn.ts +1 -1
  129. package/packages/mcp/src/tools/relay-status.ts +1 -1
  130. package/packages/mcp/src/tools/relay-subscribe.ts +1 -1
  131. package/packages/mcp/src/tools/relay-who.ts +1 -1
  132. package/packages/mcp/tests/client.test.ts +332 -432
  133. package/packages/memory/package.json +2 -2
  134. package/packages/policy/package.json +2 -2
  135. package/packages/protocol/package.json +1 -1
  136. package/packages/resiliency/package.json +1 -1
  137. package/packages/sdk/README.md +185 -0
  138. package/packages/sdk/dist/client.d.ts +1 -1
  139. package/packages/sdk/dist/client.d.ts.map +1 -1
  140. package/packages/sdk/dist/client.js +2 -1
  141. package/packages/sdk/dist/client.js.map +1 -1
  142. package/packages/sdk/dist/standalone.d.ts +2 -0
  143. package/packages/sdk/dist/standalone.d.ts.map +1 -1
  144. package/packages/sdk/dist/standalone.js +6 -1
  145. package/packages/sdk/dist/standalone.js.map +1 -1
  146. package/packages/sdk/package.json +3 -4
  147. package/packages/sdk/src/client.ts +2 -2
  148. package/packages/sdk/src/standalone.ts +8 -1
  149. package/packages/spawner/package.json +1 -1
  150. package/packages/state/package.json +1 -1
  151. package/packages/storage/package.json +2 -2
  152. package/packages/telemetry/package.json +1 -1
  153. package/packages/trajectory/package.json +2 -2
  154. package/packages/user-directory/package.json +2 -2
  155. package/packages/utils/package.json +3 -3
  156. package/packages/wrapper/dist/relay-pty-orchestrator.d.ts.map +1 -1
  157. package/packages/wrapper/dist/relay-pty-orchestrator.js +13 -0
  158. package/packages/wrapper/dist/relay-pty-orchestrator.js.map +1 -1
  159. package/packages/wrapper/package.json +6 -6
  160. package/packages/wrapper/src/relay-pty-orchestrator.ts +14 -0
  161. package/packages/mcp/dist/client.d.ts.map +0 -1
  162. package/packages/mcp/dist/client.js +0 -320
  163. package/packages/mcp/dist/client.js.map +0 -1
  164. package/packages/mcp/src/client.ts +0 -485
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import type { Tool } from '@modelcontextprotocol/sdk/types.js';
3
- import type { RelayClient } from '../client.js';
3
+ import type { RelayClient } from '../client-adapter.js';
4
4
  /**
5
5
  * Supported CLI tools for spawning workers.
6
6
  * This list should be kept in sync with CliType in packages/wrapper/src/shared.ts
@@ -18,14 +18,14 @@ export declare const relaySpawnSchema: z.ZodObject<{
18
18
  name: string;
19
19
  cli: "claude" | "gemini" | "opencode" | "droid" | "codex";
20
20
  task: string;
21
- cwd?: string | undefined;
22
21
  model?: string | undefined;
22
+ cwd?: string | undefined;
23
23
  }, {
24
24
  name: string;
25
25
  cli: "claude" | "gemini" | "opencode" | "droid" | "codex";
26
26
  task: string;
27
- cwd?: string | undefined;
28
27
  model?: string | undefined;
28
+ cwd?: string | undefined;
29
29
  }>;
30
30
  export type RelaySpawnInput = z.infer<typeof relaySpawnSchema>;
31
31
  export declare const relaySpawnTool: Tool;
@@ -1 +1 @@
1
- {"version":3,"file":"relay-spawn.d.ts","sourceRoot":"","sources":["../../src/tools/relay-spawn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD;;;;GAIG;AACH,eAAO,MAAM,cAAc,6DAA8D,CAAC;AAC1F,MAAM,MAAM,YAAY,GAAG,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAEzD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;EAQ3B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE/D,eAAO,MAAM,cAAc,EAAE,IAsC5B,CAAC;AAEF;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,MAAM,CAAC,CAgBjB"}
1
+ {"version":3,"file":"relay-spawn.d.ts","sourceRoot":"","sources":["../../src/tools/relay-spawn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;;GAIG;AACH,eAAO,MAAM,cAAc,6DAA8D,CAAC;AAC1F,MAAM,MAAM,YAAY,GAAG,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAEzD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;EAQ3B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE/D,eAAO,MAAM,cAAc,EAAE,IAsC5B,CAAC;AAEF;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,MAAM,CAAC,CAgBjB"}
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import type { Tool } from '@modelcontextprotocol/sdk/types.js';
3
- import type { RelayClient } from '../client.js';
3
+ import type { RelayClient } from '../client-adapter.js';
4
4
  export declare const relayStatusSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
5
5
  export type RelayStatusInput = z.infer<typeof relayStatusSchema>;
6
6
  export declare const relayStatusTool: Tool;
@@ -1 +1 @@
1
- {"version":3,"file":"relay-status.d.ts","sourceRoot":"","sources":["../../src/tools/relay-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,eAAO,MAAM,iBAAiB,gDAAe,CAAC;AAE9C,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE,eAAO,MAAM,eAAe,EAAE,IAQ7B,CAAC;AAEF;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,MAAM,CAAC,CAgCjB"}
1
+ {"version":3,"file":"relay-status.d.ts","sourceRoot":"","sources":["../../src/tools/relay-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,eAAO,MAAM,iBAAiB,gDAAe,CAAC;AAE9C,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE,eAAO,MAAM,eAAe,EAAE,IAQ7B,CAAC;AAEF;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,MAAM,CAAC,CAgCjB"}
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { z } from 'zod';
5
5
  import type { Tool } from '@modelcontextprotocol/sdk/types.js';
6
- import type { RelayClient } from '../client.js';
6
+ import type { RelayClient } from '../client-adapter.js';
7
7
  export declare const relaySubscribeSchema: z.ZodObject<{
8
8
  topic: z.ZodString;
9
9
  }, "strip", z.ZodTypeAny, {
@@ -1 +1 @@
1
- {"version":3,"file":"relay-subscribe.d.ts","sourceRoot":"","sources":["../../src/tools/relay-subscribe.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,eAAO,MAAM,oBAAoB;;;;;;EAE/B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEvE,eAAO,MAAM,kBAAkB,EAAE,IAUhC,CAAC;AAEF,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAM3G;AAGD,eAAO,MAAM,sBAAsB;;;;;;EAEjC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE3E,eAAO,MAAM,oBAAoB,EAAE,IAUlC,CAAC;AAEF,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAM/G"}
1
+ {"version":3,"file":"relay-subscribe.d.ts","sourceRoot":"","sources":["../../src/tools/relay-subscribe.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD,eAAO,MAAM,oBAAoB;;;;;;EAE/B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEvE,eAAO,MAAM,kBAAkB,EAAE,IAUhC,CAAC;AAEF,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAM3G;AAGD,eAAO,MAAM,sBAAsB;;;;;;EAEjC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE3E,eAAO,MAAM,oBAAoB,EAAE,IAUlC,CAAC;AAEF,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAM/G"}
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import type { Tool } from '@modelcontextprotocol/sdk/types.js';
3
- import type { RelayClient } from '../client.js';
3
+ import type { RelayClient } from '../client-adapter.js';
4
4
  export declare const relayWhoSchema: z.ZodObject<{
5
5
  include_idle: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
6
6
  project: z.ZodOptional<z.ZodString>;
@@ -1 +1 @@
1
- {"version":3,"file":"relay-who.d.ts","sourceRoot":"","sources":["../../src/tools/relay-who.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,eAAO,MAAM,cAAc;;;;;;;;;EAGzB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE3D,eAAO,MAAM,YAAY,EAAE,IAyB1B,CAAC;AAEF;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,MAAM,CAAC,CA8BjB"}
1
+ {"version":3,"file":"relay-who.d.ts","sourceRoot":"","sources":["../../src/tools/relay-who.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,eAAO,MAAM,cAAc;;;;;;;;;EAGzB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE3D,eAAO,MAAM,YAAY,EAAE,IAyB1B,CAAC;AAEF;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,MAAM,CAAC,CA8BjB"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/mcp",
3
- "version": "2.1.13",
3
+ "version": "2.1.14",
4
4
  "description": "MCP server for Agent Relay - native messaging tools for AI agents in Claude, Cursor, and VS Code",
5
5
  "author": "Agent Workforce Inc.",
6
6
  "license": "Apache-2.0",
@@ -47,18 +47,27 @@
47
47
  "prepublishOnly": "npm run clean && npm run build && npm test"
48
48
  },
49
49
  "dependencies": {
50
- "@agent-relay/config": "2.1.13",
51
- "@agent-relay/protocol": "2.1.13",
52
- "@agent-relay/utils": "2.1.13",
50
+ "@agent-relay/config": "2.1.14",
51
+ "@agent-relay/protocol": "2.1.14",
52
+ "@agent-relay/utils": "2.1.14",
53
53
  "@modelcontextprotocol/sdk": "^1.0.0",
54
54
  "smol-toml": "^1.6.0",
55
55
  "zod": "^3.23.8"
56
56
  },
57
57
  "devDependencies": {
58
+ "@agent-relay/sdk": "2.1.13",
58
59
  "@types/node": "^22.19.3",
59
60
  "typescript": "^5.9.3",
60
61
  "vitest": "^2.1.9"
61
62
  },
63
+ "peerDependencies": {
64
+ "@agent-relay/sdk": ">=2.0.0"
65
+ },
66
+ "peerDependenciesMeta": {
67
+ "@agent-relay/sdk": {
68
+ "optional": true
69
+ }
70
+ },
62
71
  "keywords": [
63
72
  "mcp",
64
73
  "agent-relay",
@@ -11,6 +11,8 @@
11
11
 
12
12
  import { parseArgs } from 'node:util';
13
13
  import { runInstall, validateEditor, getValidEditors } from './install-cli.js';
14
+ import { RelayClient } from '@agent-relay/sdk';
15
+ import { createRelayClientAdapter } from './client-adapter.js';
14
16
 
15
17
  const { values, positionals } = parseArgs({
16
18
  allowPositionals: true,
@@ -114,7 +116,7 @@ switch (command) {
114
116
  (async () => {
115
117
  try {
116
118
  const { runMCPServer, discoverSocket, discoverAgentName } = await import('./index.js');
117
- const { createHybridClient, discoverProjectRoot } = await import('./hybrid-client.js');
119
+ const { discoverProjectRoot } = await import('./hybrid-client.js');
118
120
  const { join } = await import('node:path');
119
121
  const { existsSync } = await import('node:fs');
120
122
 
@@ -138,7 +140,7 @@ switch (command) {
138
140
  const discovery = discoverSocket();
139
141
  const agentName = discoverAgentName(discovery) || `mcp-${process.pid}`;
140
142
 
141
- // Discover project root for file-based transport
143
+ // Discover project root
142
144
  if (!projectRoot) {
143
145
  projectRoot = discoverProjectRoot() ?? undefined;
144
146
  }
@@ -157,15 +159,28 @@ switch (command) {
157
159
  process.exit(1);
158
160
  }
159
161
 
160
- // Create hybrid client (file-based writes, socket queries)
161
- const client = createHybridClient({
162
+ const client = new RelayClient({
162
163
  agentName,
163
- projectRoot,
164
164
  socketPath: socketPath || discovery?.socketPath,
165
+ quiet: values.quiet,
166
+ reconnect: true,
167
+ });
168
+
169
+ await client.connect();
170
+
171
+ const mcpClient = createRelayClientAdapter(client, {
172
+ agentName,
165
173
  project: discovery?.project,
174
+ projectRoot,
175
+ socketPath: socketPath || discovery?.socketPath,
166
176
  });
167
177
 
168
- await runMCPServer(client);
178
+ await runMCPServer(mcpClient, {
179
+ projectRoot,
180
+ project: discovery?.project,
181
+ socketPath: socketPath || discovery?.socketPath,
182
+ agentName,
183
+ });
169
184
  } catch (err) {
170
185
  const message = err instanceof Error ? err.message : String(err);
171
186
  console.error('Failed to start MCP server:', message);
@@ -0,0 +1,349 @@
1
+ import { RelayClient as SdkRelayClient, type AckPayload, type AgentInfo, type HealthResponsePayload, type InboxMessage, type MetricsResponsePayload, type MessagesResponsePayload, type SpawnResult, type ReleaseResultPayload } from '@agent-relay/sdk';
2
+ import { PROTOCOL_VERSION, type Envelope } from '@agent-relay/protocol';
3
+ import { randomUUID } from 'node:crypto';
4
+
5
+ export type QueryMessage = MessagesResponsePayload['messages'][number];
6
+ export type HealthResponse = HealthResponsePayload;
7
+ export type MetricsResponse = MetricsResponsePayload;
8
+ export type MessagesResponse = MessagesResponsePayload;
9
+
10
+ export interface RelayClient {
11
+ send(to: string, message: string, options?: { thread?: string; kind?: string; data?: Record<string, unknown> }): Promise<void>;
12
+ sendAndWait(
13
+ to: string,
14
+ message: string,
15
+ options?: { thread?: string; timeoutMs?: number; kind?: string; data?: Record<string, unknown> }
16
+ ): Promise<AckPayload>;
17
+ broadcast(message: string, options?: { kind?: string; data?: Record<string, unknown> }): Promise<void>;
18
+
19
+ spawn(options: { name: string; cli: string; task?: string; model?: string; cwd?: string }): Promise<SpawnResult>;
20
+ release(name: string, reason?: string): Promise<ReleaseResultPayload>;
21
+
22
+ subscribe(topic: string): Promise<{ success: boolean; error?: string }>;
23
+ unsubscribe(topic: string): Promise<{ success: boolean; error?: string }>;
24
+
25
+ joinChannel(channel: string, displayName?: string): Promise<{ success: boolean; error?: string }>;
26
+ leaveChannel(channel: string, reason?: string): Promise<{ success: boolean; error?: string }>;
27
+ sendChannelMessage(channel: string, message: string, options?: { thread?: string }): Promise<void>;
28
+ adminJoinChannel(channel: string, member: string): Promise<{ success: boolean; error?: string }>;
29
+ adminRemoveMember(channel: string, member: string): Promise<{ success: boolean; error?: string }>;
30
+
31
+ bindAsShadow(primaryAgent: string, options?: { speakOn?: string[] }): Promise<{ success: boolean; error?: string }>;
32
+ unbindAsShadow(primaryAgent: string): Promise<{ success: boolean; error?: string }>;
33
+
34
+ createProposal(options: {
35
+ id: string;
36
+ description: string;
37
+ options: string[];
38
+ votingMethod?: string;
39
+ deadline?: number;
40
+ }): Promise<{ success: boolean; error?: string }>;
41
+
42
+ vote(options: { proposalId: string; vote: string; reason?: string }): Promise<{ success: boolean; error?: string }>;
43
+
44
+ getStatus(): Promise<{
45
+ connected: boolean;
46
+ agentName: string;
47
+ project: string;
48
+ socketPath: string;
49
+ daemonVersion?: string;
50
+ uptime?: string;
51
+ }>;
52
+
53
+ getInbox(options?: { limit?: number; unread_only?: boolean; from?: string; channel?: string }): Promise<
54
+ Array<{
55
+ id: string;
56
+ from: string;
57
+ content: string;
58
+ channel?: string;
59
+ thread?: string;
60
+ }>
61
+ >;
62
+
63
+ listAgents(options?: { include_idle?: boolean; project?: string }): Promise<AgentInfo[]>;
64
+ listConnectedAgents(options?: { project?: string }): Promise<AgentInfo[]>;
65
+ removeAgent(name: string, options?: { removeMessages?: boolean }): Promise<{ success: boolean; removed: boolean; message?: string }>;
66
+ getHealth(options?: { include_crashes?: boolean; include_alerts?: boolean }): Promise<HealthResponsePayload>;
67
+ getMetrics(options?: { agent?: string }): Promise<MetricsResponsePayload>;
68
+
69
+ queryMessages(options?: {
70
+ limit?: number;
71
+ sinceTs?: number;
72
+ since_ts?: number;
73
+ from?: string;
74
+ to?: string;
75
+ thread?: string;
76
+ order?: 'asc' | 'desc';
77
+ }): Promise<QueryMessage[]>;
78
+
79
+ sendLog(data: string): Promise<void>;
80
+ }
81
+
82
+ export interface RelayClientAdapterOptions {
83
+ agentName: string;
84
+ project?: string;
85
+ projectRoot?: string;
86
+ socketPath?: string;
87
+ }
88
+
89
+ async function ensureReady(client: SdkRelayClient): Promise<void> {
90
+ if ((client as any).state !== 'READY') {
91
+ await client.connect();
92
+ }
93
+ }
94
+
95
+ function boolResult(ok: boolean, action: string): { success: boolean; error?: string } {
96
+ return ok ? { success: true } : { success: false, error: `Failed to ${action}` };
97
+ }
98
+
99
+ export function createRelayClientAdapter(client: SdkRelayClient, ctx: RelayClientAdapterOptions): RelayClient {
100
+ const project = ctx.projectRoot ?? ctx.project ?? 'default';
101
+ const socketPath = ctx.socketPath ?? '';
102
+
103
+ return {
104
+ async send(to, message, opts = {}) {
105
+ await ensureReady(client);
106
+ const ok = client.sendMessage(to, message, (opts.kind as any) ?? 'message', opts.data, opts.thread);
107
+ if (!ok) throw new Error('Failed to send message');
108
+ },
109
+
110
+ async sendAndWait(to, message, opts = {}) {
111
+ await ensureReady(client);
112
+ return client.sendAndWait(to, message, {
113
+ thread: opts.thread,
114
+ timeoutMs: opts.timeoutMs,
115
+ kind: opts.kind as any,
116
+ data: opts.data,
117
+ });
118
+ },
119
+
120
+ async broadcast(message, opts = {}) {
121
+ await ensureReady(client);
122
+ const ok = client.broadcast(message, (opts.kind as any) ?? 'message', opts.data);
123
+ if (!ok) throw new Error('Failed to broadcast message');
124
+ },
125
+
126
+ async subscribe(topic) {
127
+ await ensureReady(client);
128
+ const ok = client.subscribe(topic);
129
+ return boolResult(ok, 'subscribe');
130
+ },
131
+
132
+ async unsubscribe(topic) {
133
+ await ensureReady(client);
134
+ const ok = client.unsubscribe(topic);
135
+ return boolResult(ok, 'unsubscribe');
136
+ },
137
+
138
+ async joinChannel(channel, displayName) {
139
+ await ensureReady(client);
140
+ const ok = client.joinChannel(channel, displayName);
141
+ return boolResult(ok, 'join channel');
142
+ },
143
+
144
+ async leaveChannel(channel, reason) {
145
+ await ensureReady(client);
146
+ const ok = client.leaveChannel(channel, reason);
147
+ return boolResult(ok, 'leave channel');
148
+ },
149
+
150
+ async sendChannelMessage(channel, message, options = {}) {
151
+ await ensureReady(client);
152
+ const ok = client.sendChannelMessage(channel, message, { thread: options.thread });
153
+ if (!ok) throw new Error('Failed to send channel message');
154
+ },
155
+
156
+ async adminJoinChannel(channel, member) {
157
+ await ensureReady(client);
158
+ const ok = client.adminJoinChannel(channel, member);
159
+ return boolResult(ok, 'add member to channel');
160
+ },
161
+
162
+ async adminRemoveMember(channel, member) {
163
+ await ensureReady(client);
164
+ const ok = client.adminRemoveMember(channel, member);
165
+ return boolResult(ok, 'remove member from channel');
166
+ },
167
+
168
+ async bindAsShadow(primaryAgent, opts = {}) {
169
+ await ensureReady(client);
170
+ const ok = client.bindAsShadow(primaryAgent, { speakOn: opts.speakOn as any });
171
+ return boolResult(ok, 'bind as shadow');
172
+ },
173
+
174
+ async unbindAsShadow(primaryAgent) {
175
+ await ensureReady(client);
176
+ const ok = client.unbindAsShadow(primaryAgent);
177
+ return boolResult(ok, 'unbind shadow');
178
+ },
179
+
180
+ async createProposal(opts) {
181
+ await ensureReady(client);
182
+ const envelope: Envelope = {
183
+ v: PROTOCOL_VERSION,
184
+ type: 'PROPOSAL_CREATE',
185
+ id: randomUUID(),
186
+ ts: Date.now(),
187
+ payload: {
188
+ id: opts.id,
189
+ description: opts.description,
190
+ options: opts.options,
191
+ votingMethod: opts.votingMethod ?? 'majority',
192
+ deadline: opts.deadline,
193
+ },
194
+ };
195
+
196
+ const ok = (client as any).send?.(envelope) ?? false;
197
+ return boolResult(ok, 'create proposal');
198
+ },
199
+
200
+ async vote(opts) {
201
+ await ensureReady(client);
202
+ const envelope: Envelope = {
203
+ v: PROTOCOL_VERSION,
204
+ type: 'VOTE',
205
+ id: randomUUID(),
206
+ ts: Date.now(),
207
+ payload: {
208
+ proposalId: opts.proposalId,
209
+ vote: opts.vote,
210
+ reason: opts.reason,
211
+ },
212
+ };
213
+
214
+ const ok = (client as any).send?.(envelope) ?? false;
215
+ return boolResult(ok, 'vote');
216
+ },
217
+
218
+ async spawn(options) {
219
+ await ensureReady(client);
220
+ return client.spawn(options);
221
+ },
222
+
223
+ async release(name, reason) {
224
+ await ensureReady(client);
225
+ // Type assertion needed until SDK is published with reason parameter
226
+ // SDK 2.1.13 has: release(name, timeoutMs?)
227
+ // SDK 2.1.14+ has: release(name, reason?, timeoutMs?)
228
+ return (client as any).release(name, reason);
229
+ },
230
+
231
+ async getStatus() {
232
+ try {
233
+ await ensureReady(client);
234
+ const status = await client.getStatus();
235
+ return {
236
+ connected: true,
237
+ agentName: ctx.agentName,
238
+ project,
239
+ socketPath,
240
+ daemonVersion: status.version,
241
+ uptime: status.uptime ? `${Math.floor(status.uptime / 1000)}s` : undefined,
242
+ };
243
+ } catch {
244
+ return {
245
+ connected: false,
246
+ agentName: ctx.agentName,
247
+ project,
248
+ socketPath,
249
+ };
250
+ }
251
+ },
252
+
253
+ async getInbox(options = {}) {
254
+ await ensureReady(client);
255
+ const messages: InboxMessage[] = await client.getInbox({
256
+ limit: options.limit,
257
+ unreadOnly: options.unread_only,
258
+ from: options.from,
259
+ channel: options.channel,
260
+ });
261
+
262
+ return messages.map((m) => ({
263
+ id: m.id,
264
+ from: m.from,
265
+ content: m.body,
266
+ channel: m.channel,
267
+ thread: m.thread,
268
+ }));
269
+ },
270
+
271
+ async listAgents(options = {}) {
272
+ await ensureReady(client);
273
+ return client.listAgents({
274
+ includeIdle: options.include_idle,
275
+ project: options.project,
276
+ });
277
+ },
278
+
279
+ async listConnectedAgents(options = {}) {
280
+ await ensureReady(client);
281
+ return client.listConnectedAgents({
282
+ project: options.project,
283
+ });
284
+ },
285
+
286
+ async removeAgent(name, options = {}) {
287
+ await ensureReady(client);
288
+ return client.removeAgent(name, { removeMessages: options.removeMessages });
289
+ },
290
+
291
+ async getHealth(options = {}) {
292
+ await ensureReady(client);
293
+ return client.getHealth({
294
+ includeCrashes: options.include_crashes,
295
+ includeAlerts: options.include_alerts,
296
+ });
297
+ },
298
+
299
+ async getMetrics(options = {}) {
300
+ await ensureReady(client);
301
+ return client.getMetrics({ agent: options.agent });
302
+ },
303
+
304
+ async queryMessages(options = {}) {
305
+ await ensureReady(client);
306
+ const response = await client.queryMessages({
307
+ limit: options.limit,
308
+ sinceTs: options.sinceTs ?? options.since_ts,
309
+ from: options.from,
310
+ to: options.to,
311
+ thread: options.thread,
312
+ order: options.order,
313
+ });
314
+ return response || [];
315
+ },
316
+
317
+ async sendLog(data: string) {
318
+ await ensureReady(client);
319
+ const ok = client.sendLog(data);
320
+ if (!ok) throw new Error('Failed to send log');
321
+ },
322
+ };
323
+ }
324
+
325
+ export interface RelayClientOptions {
326
+ agentName: string;
327
+ socketPath?: string;
328
+ project?: string;
329
+ quiet?: boolean;
330
+ timeout?: number;
331
+ }
332
+
333
+ /**
334
+ * Factory that creates an SDK RelayClient and wraps it with the MCP adapter.
335
+ */
336
+ export function createRelayClient(options: RelayClientOptions): RelayClient {
337
+ const sdkClient = new SdkRelayClient({
338
+ agentName: options.agentName,
339
+ socketPath: options.socketPath,
340
+ quiet: options.quiet,
341
+ reconnect: true,
342
+ });
343
+
344
+ return createRelayClientAdapter(sdkClient, {
345
+ agentName: options.agentName,
346
+ project: options.project,
347
+ socketPath: options.socketPath,
348
+ });
349
+ }