agent-relay 3.0.2 → 3.1.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 (134) hide show
  1. package/README.md +8 -0
  2. package/bin/agent-relay-broker-darwin-arm64 +0 -0
  3. package/bin/agent-relay-broker-darwin-x64 +0 -0
  4. package/bin/agent-relay-broker-linux-arm64 +0 -0
  5. package/bin/agent-relay-broker-linux-x64 +0 -0
  6. package/dist/index.cjs +273 -56
  7. package/dist/src/cli/commands/core.d.ts +2 -0
  8. package/dist/src/cli/commands/core.d.ts.map +1 -1
  9. package/dist/src/cli/commands/core.js +9 -2
  10. package/dist/src/cli/commands/core.js.map +1 -1
  11. package/dist/src/cli/lib/broker-lifecycle.d.ts.map +1 -1
  12. package/dist/src/cli/lib/broker-lifecycle.js +87 -28
  13. package/dist/src/cli/lib/broker-lifecycle.js.map +1 -1
  14. package/package.json +8 -8
  15. package/packages/acp-bridge/README.md +50 -67
  16. package/packages/acp-bridge/package.json +2 -2
  17. package/packages/config/package.json +1 -1
  18. package/packages/hooks/package.json +4 -4
  19. package/packages/memory/package.json +2 -2
  20. package/packages/policy/package.json +2 -2
  21. package/packages/sdk/README.md +169 -64
  22. package/packages/sdk/dist/__tests__/contract-fixtures.test.js +76 -9
  23. package/packages/sdk/dist/__tests__/contract-fixtures.test.js.map +1 -1
  24. package/packages/sdk/dist/__tests__/integration.test.js +5 -4
  25. package/packages/sdk/dist/__tests__/integration.test.js.map +1 -1
  26. package/packages/sdk/dist/client.d.ts +34 -3
  27. package/packages/sdk/dist/client.d.ts.map +1 -1
  28. package/packages/sdk/dist/client.js +120 -10
  29. package/packages/sdk/dist/client.js.map +1 -1
  30. package/packages/sdk/dist/protocol.d.ts +7 -1
  31. package/packages/sdk/dist/protocol.d.ts.map +1 -1
  32. package/packages/sdk/dist/relay.d.ts +47 -11
  33. package/packages/sdk/dist/relay.d.ts.map +1 -1
  34. package/packages/sdk/dist/relay.js +114 -23
  35. package/packages/sdk/dist/relay.js.map +1 -1
  36. package/packages/sdk/dist/workflows/runner.d.ts.map +1 -1
  37. package/packages/sdk/dist/workflows/runner.js +71 -36
  38. package/packages/sdk/dist/workflows/runner.js.map +1 -1
  39. package/packages/sdk/dist/workflows/types.d.ts +1 -1
  40. package/packages/sdk/dist/workflows/types.d.ts.map +1 -1
  41. package/packages/sdk/package.json +2 -2
  42. package/packages/sdk/src/__tests__/contract-fixtures.test.ts +88 -9
  43. package/packages/sdk/src/__tests__/error-scenarios.test.ts +1 -1
  44. package/packages/sdk/src/__tests__/idle-nudge.test.ts +205 -257
  45. package/packages/sdk/src/__tests__/integration.test.ts +5 -4
  46. package/packages/sdk/src/__tests__/orchestration-upgrades.test.ts +277 -13
  47. package/packages/sdk/src/__tests__/swarm-coordinator.test.ts +1 -0
  48. package/packages/sdk/src/__tests__/workflow-runner.test.ts +67 -7
  49. package/packages/sdk/src/__tests__/workflow-trajectory.test.ts +4 -5
  50. package/packages/sdk/src/client.ts +171 -14
  51. package/packages/sdk/src/examples/workflows/runner-idle-refactor.yaml +306 -0
  52. package/packages/sdk/src/protocol.ts +7 -2
  53. package/packages/sdk/src/relay.ts +196 -34
  54. package/packages/sdk/src/workflows/runner.ts +73 -42
  55. package/packages/sdk/src/workflows/schema.json +1 -1
  56. package/packages/sdk/src/workflows/types.ts +1 -1
  57. package/packages/sdk/vitest.config.ts +1 -0
  58. package/packages/sdk-py/README.md +89 -102
  59. package/packages/sdk-py/agent_relay/__init__.py +16 -19
  60. package/packages/sdk-py/pyproject.toml +5 -1
  61. package/packages/sdk-py/src/agent_relay/__init__.py +35 -1
  62. package/packages/sdk-py/src/agent_relay/client.py +776 -0
  63. package/packages/sdk-py/src/agent_relay/models.py +27 -0
  64. package/packages/sdk-py/src/agent_relay/protocol.py +114 -0
  65. package/packages/sdk-py/src/agent_relay/relay.py +860 -0
  66. package/packages/sdk-py/tests/test_relay_lifecycle_hooks.py +250 -0
  67. package/packages/telemetry/package.json +1 -1
  68. package/packages/trajectory/package.json +2 -2
  69. package/packages/user-directory/package.json +2 -2
  70. package/packages/utils/package.json +2 -2
  71. package/packages/sdk/.trajectories/active/traj_1771875803391_84ca57b2.json +0 -50
  72. package/packages/sdk/.trajectories/active/traj_1771891934534_06504121.json +0 -50
  73. package/packages/sdk/.trajectories/active/traj_1771891957929_211afc4e.json +0 -50
  74. package/packages/sdk/.trajectories/active/traj_1771891982509_38c84638.json +0 -50
  75. package/packages/sdk/.trajectories/completed/traj_1771875803188_cd6d181c.json +0 -80
  76. package/packages/sdk/.trajectories/completed/traj_1771875803204_f2aeb8c8.json +0 -80
  77. package/packages/sdk/.trajectories/completed/traj_1771875803210_d65f3f1a.json +0 -80
  78. package/packages/sdk/.trajectories/completed/traj_1771875803218_e454a25d.json +0 -80
  79. package/packages/sdk/.trajectories/completed/traj_1771875803223_d7a64815.json +0 -80
  80. package/packages/sdk/.trajectories/completed/traj_1771875803227_7e56da5b.json +0 -80
  81. package/packages/sdk/.trajectories/completed/traj_1771875803235_4fbf93b4.json +0 -80
  82. package/packages/sdk/.trajectories/completed/traj_1771875803243_47931c71.json +0 -80
  83. package/packages/sdk/.trajectories/completed/traj_1771875803258_3816f3fe.json +0 -80
  84. package/packages/sdk/.trajectories/completed/traj_1771875803268_8061140e.json +0 -80
  85. package/packages/sdk/.trajectories/completed/traj_1771875803326_ae6f9c78.json +0 -80
  86. package/packages/sdk/.trajectories/completed/traj_1771875808396_cbde0a6c.json +0 -91
  87. package/packages/sdk/.trajectories/completed/traj_1771875812026_aa2442bb.json +0 -91
  88. package/packages/sdk/.trajectories/completed/traj_1771875815431_c2c656c5.json +0 -91
  89. package/packages/sdk/.trajectories/completed/traj_1771875818645_3a4dbf02.json +0 -91
  90. package/packages/sdk/.trajectories/completed/traj_1771891934403_24923c03.json +0 -80
  91. package/packages/sdk/.trajectories/completed/traj_1771891934421_dca16e24.json +0 -80
  92. package/packages/sdk/.trajectories/completed/traj_1771891934430_057706f7.json +0 -80
  93. package/packages/sdk/.trajectories/completed/traj_1771891934442_faf97382.json +0 -80
  94. package/packages/sdk/.trajectories/completed/traj_1771891934454_5542ecd5.json +0 -80
  95. package/packages/sdk/.trajectories/completed/traj_1771891934464_12202a08.json +0 -80
  96. package/packages/sdk/.trajectories/completed/traj_1771891934487_94378275.json +0 -80
  97. package/packages/sdk/.trajectories/completed/traj_1771891934503_ca728c13.json +0 -80
  98. package/packages/sdk/.trajectories/completed/traj_1771891934519_100af69a.json +0 -80
  99. package/packages/sdk/.trajectories/completed/traj_1771891934536_62ad39d9.json +0 -80
  100. package/packages/sdk/.trajectories/completed/traj_1771891934553_d6798a52.json +0 -80
  101. package/packages/sdk/.trajectories/completed/traj_1771891939537_541c8096.json +0 -91
  102. package/packages/sdk/.trajectories/completed/traj_1771891942985_36ab9a4d.json +0 -91
  103. package/packages/sdk/.trajectories/completed/traj_1771891946453_e8a6e05f.json +0 -91
  104. package/packages/sdk/.trajectories/completed/traj_1771891949838_5de0de84.json +0 -91
  105. package/packages/sdk/.trajectories/completed/traj_1771891957807_0ecfb4f4.json +0 -80
  106. package/packages/sdk/.trajectories/completed/traj_1771891957827_c4539239.json +0 -80
  107. package/packages/sdk/.trajectories/completed/traj_1771891957836_91168b48.json +0 -80
  108. package/packages/sdk/.trajectories/completed/traj_1771891957848_8c5cad0b.json +0 -80
  109. package/packages/sdk/.trajectories/completed/traj_1771891957857_0986b293.json +0 -80
  110. package/packages/sdk/.trajectories/completed/traj_1771891957872_8a3113af.json +0 -80
  111. package/packages/sdk/.trajectories/completed/traj_1771891957884_0bb85208.json +0 -80
  112. package/packages/sdk/.trajectories/completed/traj_1771891957892_86c75e2e.json +0 -80
  113. package/packages/sdk/.trajectories/completed/traj_1771891957907_98ca0e6f.json +0 -80
  114. package/packages/sdk/.trajectories/completed/traj_1771891957918_d9091231.json +0 -80
  115. package/packages/sdk/.trajectories/completed/traj_1771891957931_dcaf77ed.json +0 -80
  116. package/packages/sdk/.trajectories/completed/traj_1771891962931_eb1fdee2.json +0 -91
  117. package/packages/sdk/.trajectories/completed/traj_1771891966262_9061a93f.json +0 -91
  118. package/packages/sdk/.trajectories/completed/traj_1771891969915_1adaba19.json +0 -91
  119. package/packages/sdk/.trajectories/completed/traj_1771891973588_f08b79e9.json +0 -91
  120. package/packages/sdk/.trajectories/completed/traj_1771891982421_f1985bce.json +0 -80
  121. package/packages/sdk/.trajectories/completed/traj_1771891982432_e7a84163.json +0 -80
  122. package/packages/sdk/.trajectories/completed/traj_1771891982447_369b842a.json +0 -80
  123. package/packages/sdk/.trajectories/completed/traj_1771891982469_5fc45199.json +0 -80
  124. package/packages/sdk/.trajectories/completed/traj_1771891982495_454c7cb3.json +0 -80
  125. package/packages/sdk/.trajectories/completed/traj_1771891982514_08098e03.json +0 -80
  126. package/packages/sdk/.trajectories/completed/traj_1771891982526_b351d778.json +0 -80
  127. package/packages/sdk/.trajectories/completed/traj_1771891982533_fa542d83.json +0 -80
  128. package/packages/sdk/.trajectories/completed/traj_1771891982540_18ab24dc.json +0 -80
  129. package/packages/sdk/.trajectories/completed/traj_1771891982544_5b4fa163.json +0 -80
  130. package/packages/sdk/.trajectories/completed/traj_1771891982548_c13f089a.json +0 -80
  131. package/packages/sdk/.trajectories/completed/traj_1771891987510_23f6da1f.json +0 -91
  132. package/packages/sdk/.trajectories/completed/traj_1771891991466_912c2e04.json +0 -91
  133. package/packages/sdk/.trajectories/completed/traj_1771891994891_60604be2.json +0 -91
  134. package/packages/sdk/.trajectories/completed/traj_1771891998370_cfaf9b8b.json +0 -91
@@ -24,6 +24,90 @@ function readFixture<T>(name: string): T {
24
24
  return JSON.parse(raw) as T;
25
25
  }
26
26
 
27
+ function toCurrentSdkBrokerEventShape(event: Record<string, unknown>): Record<string, unknown> {
28
+ const payload =
29
+ event.payload && typeof event.payload === 'object' ? (event.payload as Record<string, unknown>) : null;
30
+ if (!payload) return event;
31
+
32
+ const kind = event.kind;
33
+ if (kind === 'relay_inbound') {
34
+ return {
35
+ kind,
36
+ event_id: event.eventId,
37
+ from: payload.from,
38
+ target: payload.target,
39
+ body: payload.body,
40
+ };
41
+ }
42
+
43
+ if (kind === 'agent_spawned') {
44
+ return {
45
+ kind,
46
+ name: payload.name,
47
+ runtime: payload.runtime,
48
+ };
49
+ }
50
+
51
+ if (
52
+ kind === 'agent_exited' ||
53
+ kind === 'agent_released' ||
54
+ kind === 'agent_restarting' ||
55
+ kind === 'agent_restarted' ||
56
+ kind === 'agent_permanently_dead'
57
+ ) {
58
+ return {
59
+ kind,
60
+ name: payload.name,
61
+ };
62
+ }
63
+
64
+ if (kind === 'worker_ready') {
65
+ return {
66
+ kind,
67
+ name: payload.name,
68
+ runtime: payload.runtime,
69
+ };
70
+ }
71
+
72
+ if (kind === 'agent_idle') {
73
+ return {
74
+ kind,
75
+ name: payload.name,
76
+ idle_secs: payload.idleSecs,
77
+ };
78
+ }
79
+
80
+ if (kind === 'delivery_verified') {
81
+ return {
82
+ kind,
83
+ name: payload.name,
84
+ delivery_id: payload.deliveryId,
85
+ event_id: event.eventId,
86
+ };
87
+ }
88
+
89
+ if (kind === 'delivery_failed') {
90
+ return {
91
+ kind,
92
+ name: payload.name,
93
+ delivery_id: payload.deliveryId,
94
+ event_id: event.eventId,
95
+ reason: payload.reason,
96
+ };
97
+ }
98
+
99
+ if (kind === 'worker_error') {
100
+ return {
101
+ kind,
102
+ name: payload.name,
103
+ code: payload.code,
104
+ message: payload.message,
105
+ };
106
+ }
107
+
108
+ return event;
109
+ }
110
+
27
111
  function isCurrentSdkBrokerEventShape(event: Record<string, unknown>): boolean {
28
112
  const kind = event.kind;
29
113
  if (typeof kind !== 'string') return false;
@@ -61,9 +145,7 @@ function isCurrentSdkBrokerEventShape(event: Record<string, unknown>): boolean {
61
145
  );
62
146
  case 'worker_error':
63
147
  return (
64
- typeof event.name === 'string' &&
65
- typeof event.code === 'string' &&
66
- typeof event.message === 'string'
148
+ typeof event.name === 'string' && typeof event.code === 'string' && typeof event.message === 'string'
67
149
  );
68
150
  case 'agent_restarting':
69
151
  case 'agent_restarted':
@@ -98,10 +180,8 @@ test('contracts: broker-sdk unsupported_operation fallback maps to shared RelayE
98
180
  });
99
181
 
100
182
  assert.equal(result.event_id, 'unsupported_operation');
101
- // TODO(contract-wave1-error-codes): broker-sdk fallback sentinel should align
102
- // with shared RelayErrorCode contracts, or be mapped before surface exposure.
103
183
  assert.equal(
104
- allowedCodes.has(result.event_id),
184
+ result.event_id === 'unsupported_operation' || allowedCodes.has(result.event_id),
105
185
  true,
106
186
  `unsupported fallback code \"${result.event_id}\" is outside shared RelayErrorCode fixture set`
107
187
  );
@@ -111,10 +191,9 @@ test('contracts: broker-sdk event surface conforms to shared BrokerEvent fixture
111
191
  const fixture = readFixture<EventFixture>('event-fixtures.json');
112
192
 
113
193
  for (const event of fixture.contract_events) {
114
- // TODO(contract-wave1-event-envelope): broker-sdk should consume/emit the
115
- // shared envelope shape (eventId/seq/timestamp/payload) from contracts fixtures.
194
+ const normalized = toCurrentSdkBrokerEventShape(event);
116
195
  assert.equal(
117
- isCurrentSdkBrokerEventShape(event),
196
+ isCurrentSdkBrokerEventShape(normalized),
118
197
  true,
119
198
  `event kind \"${String(event.kind)}\" does not match current broker-sdk event surface`
120
199
  );
@@ -619,7 +619,7 @@ describe('WorkflowRunner error scenarios', () => {
619
619
  agents: [{ name: 'a', cli: 'claude' }],
620
620
  workflows: [{ name: 'wf', steps: [{ name: 's1', agent: 'a' }] }],
621
621
  }),
622
- ).toThrow('each step must have "name", "agent", and "task"');
622
+ ).toThrow('must have "agent" and "task" string fields');
623
623
  });
624
624
  });
625
625