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
@@ -0,0 +1,27 @@
1
+ """Model constants for supported CLI tools.
2
+
3
+ Matches packages/config/src/cli-registry.generated.ts.
4
+ """
5
+
6
+
7
+ class Models:
8
+ """Model identifiers organized by CLI tool."""
9
+
10
+ class Claude:
11
+ SONNET = "sonnet"
12
+ OPUS = "opus"
13
+ HAIKU = "haiku"
14
+
15
+ class Codex:
16
+ GPT_5_2_CODEX = "gpt-5.2-codex"
17
+ GPT_5_3_CODEX = "gpt-5.3-codex"
18
+ GPT_5_3_CODEX_SPARK = "gpt-5.3-codex-spark"
19
+ GPT_5_1_CODEX_MAX = "gpt-5.1-codex-max"
20
+ GPT_5_2 = "gpt-5.2"
21
+ GPT_5_1_CODEX_MINI = "gpt-5.1-codex-mini"
22
+
23
+ class Gemini:
24
+ GEMINI_3_PRO_PREVIEW = "gemini-3-pro-preview"
25
+ GEMINI_2_5_PRO = "gemini-2.5-pro"
26
+ GEMINI_2_5_FLASH = "gemini-2.5-flash"
27
+ GEMINI_2_5_FLASH_LITE = "gemini-2.5-flash-lite"
@@ -0,0 +1,114 @@
1
+ """Wire protocol types for the Agent Relay broker communication.
2
+
3
+ Matches the TypeScript definitions in packages/sdk/src/protocol.ts.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ from dataclasses import dataclass, field
9
+ from typing import Any, Literal, Optional
10
+
11
+ PROTOCOL_VERSION = 1
12
+
13
+ AgentRuntime = Literal["pty", "headless"]
14
+ HeadlessProvider = Literal["claude", "opencode"]
15
+
16
+
17
+ @dataclass
18
+ class RestartPolicy:
19
+ enabled: bool = False
20
+ max_restarts: int = 3
21
+ cooldown_ms: int = 1000
22
+ max_consecutive_failures: int = 3
23
+
24
+ def to_dict(self) -> dict[str, Any]:
25
+ return {
26
+ "enabled": self.enabled,
27
+ "max_restarts": self.max_restarts,
28
+ "cooldown_ms": self.cooldown_ms,
29
+ "max_consecutive_failures": self.max_consecutive_failures,
30
+ }
31
+
32
+
33
+ @dataclass
34
+ class AgentSpec:
35
+ """Specification for spawning an agent."""
36
+
37
+ name: str
38
+ runtime: AgentRuntime = "pty"
39
+ provider: Optional[HeadlessProvider] = None
40
+ cli: Optional[str] = None
41
+ args: list[str] = field(default_factory=list)
42
+ channels: list[str] = field(default_factory=list)
43
+ model: Optional[str] = None
44
+ cwd: Optional[str] = None
45
+ team: Optional[str] = None
46
+ shadow_of: Optional[str] = None
47
+ shadow_mode: Optional[str] = None
48
+ restart_policy: Optional[RestartPolicy] = None
49
+
50
+ def to_dict(self) -> dict[str, Any]:
51
+ d: dict[str, Any] = {
52
+ "name": self.name,
53
+ "runtime": self.runtime,
54
+ }
55
+ if self.provider is not None:
56
+ d["provider"] = self.provider
57
+ if self.cli is not None:
58
+ d["cli"] = self.cli
59
+ if self.args:
60
+ d["args"] = self.args
61
+ if self.channels:
62
+ d["channels"] = self.channels
63
+ if self.model is not None:
64
+ d["model"] = self.model
65
+ if self.cwd is not None:
66
+ d["cwd"] = self.cwd
67
+ if self.team is not None:
68
+ d["team"] = self.team
69
+ if self.shadow_of is not None:
70
+ d["shadow_of"] = self.shadow_of
71
+ if self.shadow_mode is not None:
72
+ d["shadow_mode"] = self.shadow_mode
73
+ if self.restart_policy is not None:
74
+ d["restart_policy"] = self.restart_policy.to_dict()
75
+ return d
76
+
77
+
78
+ @dataclass
79
+ class ProtocolEnvelope:
80
+ """JSON envelope for all broker communication."""
81
+
82
+ v: int
83
+ type: str
84
+ payload: dict[str, Any]
85
+ request_id: Optional[str] = None
86
+
87
+ def to_dict(self) -> dict[str, Any]:
88
+ d: dict[str, Any] = {
89
+ "v": self.v,
90
+ "type": self.type,
91
+ "payload": self.payload,
92
+ }
93
+ if self.request_id is not None:
94
+ d["request_id"] = self.request_id
95
+ return d
96
+
97
+ @classmethod
98
+ def from_dict(cls, data: dict[str, Any]) -> ProtocolEnvelope:
99
+ return cls(
100
+ v=data.get("v", 0),
101
+ type=data.get("type", ""),
102
+ payload=data.get("payload", {}),
103
+ request_id=data.get("request_id"),
104
+ )
105
+
106
+
107
+ # BrokerEvent is a dict with a 'kind' field discriminator.
108
+ # Event kinds: agent_spawned, agent_released, agent_exit, agent_exited,
109
+ # relay_inbound, worker_stream, worker_ready, worker_error,
110
+ # delivery_queued, delivery_injected, delivery_verified, delivery_failed,
111
+ # delivery_active, delivery_ack, delivery_retry, delivery_dropped,
112
+ # relaycast_published, relaycast_publish_failed, acl_denied,
113
+ # agent_idle, agent_restarting, agent_restarted, agent_permanently_dead
114
+ BrokerEvent = dict[str, Any]