agent-relay 3.1.19 → 3.1.20

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 (90) hide show
  1. package/README.md +13 -1
  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 +435 -190
  7. package/dist/src/cli/bootstrap.js +0 -15
  8. package/dist/src/cli/bootstrap.js.map +1 -1
  9. package/dist/src/cli/commands/agent-management.d.ts +1 -0
  10. package/dist/src/cli/commands/agent-management.d.ts.map +1 -1
  11. package/dist/src/cli/commands/agent-management.js +235 -16
  12. package/dist/src/cli/commands/agent-management.js.map +1 -1
  13. package/dist/src/cli/commands/core.js +1 -1
  14. package/dist/src/cli/commands/core.js.map +1 -1
  15. package/dist/src/cli/index.d.ts.map +1 -1
  16. package/dist/src/cli/index.js +13 -1
  17. package/dist/src/cli/index.js.map +1 -1
  18. package/dist/src/cli/lib/broker-lifecycle.d.ts.map +1 -1
  19. package/dist/src/cli/lib/broker-lifecycle.js +3 -5
  20. package/dist/src/cli/lib/broker-lifecycle.js.map +1 -1
  21. package/dist/src/cli/lib/connect-daytona.js +2 -2
  22. package/dist/src/cli/lib/connect-daytona.js.map +1 -1
  23. package/install.sh +9 -3
  24. package/package.json +13 -13
  25. package/packages/acp-bridge/package.json +2 -2
  26. package/packages/config/package.json +1 -1
  27. package/packages/hooks/package.json +4 -4
  28. package/packages/memory/package.json +2 -2
  29. package/packages/openclaw/dist/cli.js +79 -2
  30. package/packages/openclaw/dist/cli.js.map +1 -1
  31. package/packages/openclaw/dist/config.d.ts +28 -1
  32. package/packages/openclaw/dist/config.d.ts.map +1 -1
  33. package/packages/openclaw/dist/config.js +145 -0
  34. package/packages/openclaw/dist/config.js.map +1 -1
  35. package/packages/openclaw/dist/index.d.ts +2 -2
  36. package/packages/openclaw/dist/index.d.ts.map +1 -1
  37. package/packages/openclaw/dist/index.js +1 -1
  38. package/packages/openclaw/dist/index.js.map +1 -1
  39. package/packages/openclaw/dist/setup.d.ts.map +1 -1
  40. package/packages/openclaw/dist/setup.js +24 -1
  41. package/packages/openclaw/dist/setup.js.map +1 -1
  42. package/packages/openclaw/dist/types.d.ts +23 -0
  43. package/packages/openclaw/dist/types.d.ts.map +1 -1
  44. package/packages/openclaw/package.json +2 -2
  45. package/packages/openclaw/skill/SKILL.md +46 -0
  46. package/packages/openclaw/src/cli.ts +90 -2
  47. package/packages/openclaw/src/config.ts +165 -1
  48. package/packages/openclaw/src/index.ts +7 -1
  49. package/packages/openclaw/src/setup.ts +26 -1
  50. package/packages/openclaw/src/types.ts +25 -0
  51. package/packages/policy/package.json +2 -2
  52. package/packages/sdk/dist/__tests__/integration.test.js +35 -0
  53. package/packages/sdk/dist/__tests__/integration.test.js.map +1 -1
  54. package/packages/sdk/dist/client.d.ts +9 -0
  55. package/packages/sdk/dist/client.d.ts.map +1 -1
  56. package/packages/sdk/dist/client.js +33 -22
  57. package/packages/sdk/dist/client.js.map +1 -1
  58. package/packages/sdk/dist/protocol.d.ts +1 -0
  59. package/packages/sdk/dist/protocol.d.ts.map +1 -1
  60. package/packages/sdk/dist/relay.d.ts +8 -0
  61. package/packages/sdk/dist/relay.d.ts.map +1 -1
  62. package/packages/sdk/dist/relay.js +50 -5
  63. package/packages/sdk/dist/relay.js.map +1 -1
  64. package/packages/sdk/dist/workflows/cli.js +2 -0
  65. package/packages/sdk/dist/workflows/cli.js.map +1 -1
  66. package/packages/sdk/dist/workflows/runner.d.ts +11 -0
  67. package/packages/sdk/dist/workflows/runner.d.ts.map +1 -1
  68. package/packages/sdk/dist/workflows/runner.js +350 -167
  69. package/packages/sdk/dist/workflows/runner.js.map +1 -1
  70. package/packages/sdk/dist/workflows/trajectory.d.ts +6 -1
  71. package/packages/sdk/dist/workflows/trajectory.d.ts.map +1 -1
  72. package/packages/sdk/dist/workflows/trajectory.js +16 -2
  73. package/packages/sdk/dist/workflows/trajectory.js.map +1 -1
  74. package/packages/sdk/package.json +2 -2
  75. package/packages/sdk/src/__tests__/integration.test.ts +49 -0
  76. package/packages/sdk/src/__tests__/orchestration-upgrades.test.ts +50 -1
  77. package/packages/sdk/src/client.ts +44 -21
  78. package/packages/sdk/src/protocol.ts +1 -1
  79. package/packages/sdk/src/relay.ts +70 -5
  80. package/packages/sdk/src/workflows/cli.ts +2 -0
  81. package/packages/sdk/src/workflows/runner.ts +414 -185
  82. package/packages/sdk/src/workflows/trajectory.ts +22 -2
  83. package/packages/sdk-py/pyproject.toml +1 -1
  84. package/packages/sdk-py/src/agent_relay/client.py +18 -1
  85. package/packages/sdk-py/src/agent_relay/relay.py +4 -0
  86. package/packages/sdk-py/src/agent_relay/types.py +4 -0
  87. package/packages/telemetry/package.json +1 -1
  88. package/packages/trajectory/package.json +2 -2
  89. package/packages/user-directory/package.json +2 -2
  90. package/packages/utils/package.json +2 -2
@@ -182,7 +182,7 @@ export class WorkflowTrajectory {
182
182
  id,
183
183
  version: 1,
184
184
  task: {
185
- title: `${workflowName} run #${this.runId.slice(0, 8)}`,
185
+ title: workflowName,
186
186
  source: { system: 'workflow-runner', id: this.runId },
187
187
  },
188
188
  status: 'active',
@@ -251,6 +251,9 @@ export class WorkflowTrajectory {
251
251
  await this.registerAgent(participants.reviewer, 'reviewer');
252
252
  }
253
253
 
254
+ this.closeCurrentChapter();
255
+ this.openChapter(`Execution: ${step.name}`, agent);
256
+
254
257
  // Capture the step's purpose: first non-empty sentence of the task
255
258
  const intent = step.task
256
259
  ? step.task
@@ -479,12 +482,29 @@ export class WorkflowTrajectory {
479
482
  }
480
483
 
481
484
  /** Abandon the trajectory. */
482
- async abandon(reason: string): Promise<void> {
485
+ async abandon(
486
+ reason: string,
487
+ meta?: { summary?: string; confidence?: number; learnings?: string[]; challenges?: string[] }
488
+ ): Promise<void> {
483
489
  if (!this.enabled || !this.trajectory) return;
484
490
 
491
+ const elapsed = Date.now() - this.startTime;
492
+ const elapsedStr =
493
+ elapsed > 60_000 ? `${Math.round(elapsed / 60_000)} minutes` : `${Math.round(elapsed / 1_000)} seconds`;
494
+ const summary = meta?.summary ?? `Workflow abandoned: ${reason}`;
495
+
496
+ this.openRetrospective();
497
+ this.addEvent('reflection', `${summary} (abandoned after ${elapsedStr})`, 'high');
485
498
  this.addEvent('error', `Workflow abandoned: ${reason}`, 'high');
486
499
  this.trajectory.status = 'abandoned';
487
500
  this.trajectory.completedAt = new Date().toISOString();
501
+ this.trajectory.retrospective = {
502
+ summary,
503
+ approach: `${this.swarmPattern} workflow (${this.trajectory.agents.filter((a) => a.role !== 'workflow-runner').length} agents)`,
504
+ confidence: meta?.confidence ?? 0,
505
+ learnings: meta?.learnings,
506
+ challenges: meta?.challenges,
507
+ };
488
508
 
489
509
  this.closeCurrentChapter();
490
510
  await this.flush();
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "agent-relay-sdk"
7
- version = "3.1.19"
7
+ version = "3.1.20"
8
8
  description = "Python SDK for Agent Relay workflows"
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -167,8 +167,16 @@ def _install_broker_binary() -> str:
167
167
  target_path.stat().st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
168
168
  )
169
169
 
170
- # macOS: re-sign to avoid Gatekeeper issues
170
+ # macOS: strip quarantine and re-sign to avoid Gatekeeper issues
171
171
  if platform.system() == "Darwin":
172
+ try:
173
+ subprocess.run(
174
+ ["xattr", "-d", "com.apple.quarantine", str(target_path)],
175
+ capture_output=True,
176
+ timeout=10,
177
+ )
178
+ except Exception:
179
+ pass # Non-fatal — attribute may not exist
172
180
  try:
173
181
  subprocess.run(
174
182
  ["codesign", "--force", "--sign", "-", str(target_path)],
@@ -557,6 +565,7 @@ class AgentRelayClient:
557
565
  idle_threshold_secs: Optional[int] = None,
558
566
  restart_policy: Optional[dict[str, Any]] = None,
559
567
  continue_from: Optional[str] = None,
568
+ skip_relay_prompt: Optional[bool] = None,
560
569
  ) -> dict[str, Any]:
561
570
  await self.start_client()
562
571
  built_args = _build_pty_args_with_model(cli, args or [], model)
@@ -585,6 +594,8 @@ class AgentRelayClient:
585
594
  request_payload["idle_threshold_secs"] = idle_threshold_secs
586
595
  if continue_from is not None:
587
596
  request_payload["continue_from"] = continue_from
597
+ if skip_relay_prompt is not None:
598
+ request_payload["skip_relay_prompt"] = skip_relay_prompt
588
599
  return await self._request_ok("spawn_agent", request_payload)
589
600
 
590
601
  async def spawn_headless(
@@ -595,6 +606,7 @@ class AgentRelayClient:
595
606
  args: Optional[list[str]] = None,
596
607
  channels: Optional[list[str]] = None,
597
608
  task: Optional[str] = None,
609
+ skip_relay_prompt: Optional[bool] = None,
598
610
  ) -> dict[str, Any]:
599
611
  await self.start_client()
600
612
  agent = AgentSpec(
@@ -607,6 +619,8 @@ class AgentRelayClient:
607
619
  request_payload: dict[str, Any] = {"agent": agent.to_dict()}
608
620
  if task is not None:
609
621
  request_payload["initial_task"] = task
622
+ if skip_relay_prompt is not None:
623
+ request_payload["skip_relay_prompt"] = skip_relay_prompt
610
624
  return await self._request_ok("spawn_agent", request_payload)
611
625
 
612
626
  async def spawn_provider(
@@ -626,6 +640,7 @@ class AgentRelayClient:
626
640
  idle_threshold_secs: Optional[int] = None,
627
641
  restart_policy: Optional[dict[str, Any]] = None,
628
642
  continue_from: Optional[str] = None,
643
+ skip_relay_prompt: Optional[bool] = None,
629
644
  ) -> dict[str, Any]:
630
645
  resolved_transport: AgentTransport = transport or (
631
646
  "headless" if provider == "opencode" else "pty"
@@ -645,6 +660,7 @@ class AgentRelayClient:
645
660
  args=args,
646
661
  channels=channels,
647
662
  task=task,
663
+ skip_relay_prompt=skip_relay_prompt,
648
664
  )
649
665
 
650
666
  return await self.spawn_pty(
@@ -661,6 +677,7 @@ class AgentRelayClient:
661
677
  idle_threshold_secs=idle_threshold_secs,
662
678
  restart_policy=restart_policy,
663
679
  continue_from=continue_from,
680
+ skip_relay_prompt=skip_relay_prompt,
664
681
  )
665
682
 
666
683
  async def spawn_claude(self, **kwargs: Any) -> dict[str, Any]:
@@ -51,6 +51,7 @@ class SpawnOptions:
51
51
  shadow_mode: Optional[str] = None
52
52
  idle_threshold_secs: Optional[int] = None
53
53
  restart_policy: Optional[dict[str, Any]] = None
54
+ skip_relay_prompt: Optional[bool] = None
54
55
  on_start: LifecycleHook = None
55
56
  on_success: LifecycleHook = None
56
57
  on_error: LifecycleHook = None
@@ -304,6 +305,7 @@ class AgentSpawner:
304
305
  task: Optional[str] = None,
305
306
  model: Optional[str] = None,
306
307
  cwd: Optional[str] = None,
308
+ skip_relay_prompt: Optional[bool] = None,
307
309
  on_start: LifecycleHook = None,
308
310
  on_success: LifecycleHook = None,
309
311
  on_error: LifecycleHook = None,
@@ -332,6 +334,7 @@ class AgentSpawner:
332
334
  task=task,
333
335
  model=model,
334
336
  cwd=cwd,
337
+ skip_relay_prompt=skip_relay_prompt,
335
338
  )
336
339
  except Exception as error:
337
340
  await self._relay._invoke_lifecycle_hook(
@@ -512,6 +515,7 @@ class AgentRelay:
512
515
  shadow_mode=opts.shadow_mode,
513
516
  idle_threshold_secs=opts.idle_threshold_secs,
514
517
  restart_policy=opts.restart_policy,
518
+ skip_relay_prompt=opts.skip_relay_prompt,
515
519
  )
516
520
  except Exception as error:
517
521
  await self._invoke_lifecycle_hook(
@@ -491,6 +491,8 @@ class StepCompletedEvent:
491
491
  run_id: str = ""
492
492
  step_name: str = ""
493
493
  output: str | None = None
494
+ exit_code: int | None = None
495
+ exit_signal: str | None = None
494
496
 
495
497
 
496
498
  @dataclass(frozen=True)
@@ -499,6 +501,8 @@ class StepFailedEvent:
499
501
  run_id: str = ""
500
502
  step_name: str = ""
501
503
  error: str = ""
504
+ exit_code: int | None = None
505
+ exit_signal: str | None = None
502
506
 
503
507
 
504
508
  @dataclass(frozen=True)
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/telemetry",
3
- "version": "3.1.19",
3
+ "version": "3.1.20",
4
4
  "description": "Anonymous telemetry for Agent Relay usage analytics",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/trajectory",
3
- "version": "3.1.19",
3
+ "version": "3.1.20",
4
4
  "description": "Trajectory integration utilities (trail/PDERO) for Relay",
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.1.19"
25
+ "@agent-relay/config": "3.1.20"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/user-directory",
3
- "version": "3.1.19",
3
+ "version": "3.1.20",
4
4
  "description": "User directory service for agent-relay (per-user credential storage)",
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/utils": "3.1.19"
25
+ "@agent-relay/utils": "3.1.20"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/utils",
3
- "version": "3.1.19",
3
+ "version": "3.1.20",
4
4
  "description": "Shared utilities for agent-relay: logging, name generation, command resolution, update checking",
5
5
  "type": "module",
6
6
  "main": "dist/cjs/index.js",
@@ -112,7 +112,7 @@
112
112
  "vitest": "^3.2.4"
113
113
  },
114
114
  "dependencies": {
115
- "@agent-relay/config": "3.1.19",
115
+ "@agent-relay/config": "3.1.20",
116
116
  "compare-versions": "^6.1.1"
117
117
  },
118
118
  "publishConfig": {