agent-relay 4.0.3 → 4.0.5

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 (65) hide show
  1. package/README.md +19 -19
  2. package/dist/index.cjs +8 -7
  3. package/dist/src/cli/commands/auth.js +1 -1
  4. package/dist/src/cli/commands/auth.js.map +1 -1
  5. package/dist/src/cli/commands/on/start.d.ts +2 -0
  6. package/dist/src/cli/commands/on/start.d.ts.map +1 -1
  7. package/dist/src/cli/commands/on/start.js +13 -4
  8. package/dist/src/cli/commands/on/start.js.map +1 -1
  9. package/dist/src/cli/commands/on.js +2 -2
  10. package/dist/src/cli/commands/setup.js +1 -1
  11. package/dist/src/cli/lib/auth-ssh.d.ts.map +1 -1
  12. package/dist/src/cli/lib/auth-ssh.js +19 -10
  13. package/dist/src/cli/lib/auth-ssh.js.map +1 -1
  14. package/dist/src/cli/lib/connect-daytona.d.ts.map +1 -1
  15. package/dist/src/cli/lib/connect-daytona.js +4 -2
  16. package/dist/src/cli/lib/connect-daytona.js.map +1 -1
  17. package/package.json +12 -13
  18. package/packages/acp-bridge/package.json +2 -2
  19. package/packages/brand/package.json +1 -1
  20. package/packages/cloud/dist/types.d.ts +2 -2
  21. package/packages/cloud/dist/types.d.ts.map +1 -1
  22. package/packages/cloud/dist/types.js +5 -12
  23. package/packages/cloud/dist/types.js.map +1 -1
  24. package/packages/cloud/dist/workflows.d.ts +1 -1
  25. package/packages/cloud/dist/workflows.d.ts.map +1 -1
  26. package/packages/cloud/dist/workflows.js +113 -113
  27. package/packages/cloud/dist/workflows.js.map +1 -1
  28. package/packages/cloud/package.json +2 -2
  29. package/packages/cloud/src/types.ts +7 -14
  30. package/packages/cloud/src/workflows.ts +146 -148
  31. package/packages/config/dist/cloud-config.d.ts.map +1 -1
  32. package/packages/config/dist/cloud-config.js +1 -3
  33. package/packages/config/dist/cloud-config.js.map +1 -1
  34. package/packages/config/package.json +1 -1
  35. package/packages/config/src/cloud-config.ts +10 -11
  36. package/packages/hooks/package.json +4 -4
  37. package/packages/memory/package.json +2 -2
  38. package/packages/openclaw/package.json +2 -2
  39. package/packages/openclaw/skill/SKILL.md +12 -12
  40. package/packages/policy/package.json +2 -2
  41. package/packages/sdk/dist/relay.js +1 -1
  42. package/packages/sdk/dist/workflows/__tests__/permissions-integration.test.js +42 -0
  43. package/packages/sdk/dist/workflows/__tests__/permissions-integration.test.js.map +1 -1
  44. package/packages/sdk/dist/workflows/cli.js +4 -2
  45. package/packages/sdk/dist/workflows/cli.js.map +1 -1
  46. package/packages/sdk/dist/workflows/listr-renderer.d.ts.map +1 -1
  47. package/packages/sdk/dist/workflows/listr-renderer.js +2 -4
  48. package/packages/sdk/dist/workflows/listr-renderer.js.map +1 -1
  49. package/packages/sdk/dist/workflows/runner.d.ts.map +1 -1
  50. package/packages/sdk/dist/workflows/runner.js +6 -5
  51. package/packages/sdk/dist/workflows/runner.js.map +1 -1
  52. package/packages/sdk/package.json +2 -2
  53. package/packages/sdk/src/__tests__/unit.test.ts +1 -1
  54. package/packages/sdk/src/relay.ts +1 -1
  55. package/packages/sdk/src/workflows/__tests__/permissions-integration.test.ts +44 -0
  56. package/packages/sdk/src/workflows/cli.ts +6 -4
  57. package/packages/sdk/src/workflows/listr-renderer.ts +5 -7
  58. package/packages/sdk/src/workflows/runner.ts +6 -5
  59. package/packages/sdk-py/pyproject.toml +1 -1
  60. package/packages/telemetry/dist/client.js +1 -1
  61. package/packages/telemetry/package.json +1 -1
  62. package/packages/telemetry/src/client.ts +1 -1
  63. package/packages/trajectory/package.json +2 -2
  64. package/packages/user-directory/package.json +2 -2
  65. package/packages/utils/package.json +2 -2
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/sdk",
3
- "version": "4.0.3",
3
+ "version": "4.0.5",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -113,7 +113,7 @@
113
113
  "typescript": "^5.7.3"
114
114
  },
115
115
  "dependencies": {
116
- "@agent-relay/config": "4.0.3",
116
+ "@agent-relay/config": "4.0.5",
117
117
  "@relaycast/sdk": "^1.1.0",
118
118
  "@relayfile/sdk": "^0.1.2",
119
119
  "@sinclair/typebox": "^0.34.48",
@@ -405,7 +405,7 @@ test('observerUrl: returns correct URL format when workspaceKey is set', () => {
405
405
  const url = relay.observerUrl;
406
406
  assert.ok(url, 'observerUrl should be defined after key is set');
407
407
  assert.ok(
408
- url!.startsWith('https://agentrelay.dev/observer?key='),
408
+ url!.startsWith('https://agentrelay.com/observer?key='),
409
409
  `observerUrl should start with observer base URL, got: ${url}`
410
410
  );
411
411
  assert.ok(url!.includes('rk_live_test123'), 'observerUrl should include the workspace key');
@@ -373,7 +373,7 @@ export class AgentRelay {
373
373
  /** Observer URL for the auto-created workspace (available after first spawn). */
374
374
  get observerUrl(): string | undefined {
375
375
  if (!this.relayApiKey) return undefined;
376
- return `https://agentrelay.dev/observer?key=${this.relayApiKey}`;
376
+ return `https://agentrelay.com/observer?key=${this.relayApiKey}`;
377
377
  }
378
378
 
379
379
  // Shorthand spawners
@@ -506,6 +506,50 @@ describe('WorkflowRunner permission lifecycle integration', () => {
506
506
  expect(spawnOptions?.env?.RELAYFILE_TOKEN).toBe('token:headless-agent');
507
507
  });
508
508
 
509
+ it('merges relay.env with inherited process env for non-interactive agents', async () => {
510
+ const projectDir = createBaseProject();
511
+ const inheritedEnvKey = 'WORKFLOW_RUNNER_RELAY_ENV_MERGE_TEST';
512
+ const originalInheritedValue = process.env[inheritedEnvKey];
513
+ process.env[inheritedEnvKey] = 'inherited-value';
514
+
515
+ try {
516
+ const runner = new WorkflowRunner({
517
+ cwd: projectDir,
518
+ db: makeDb(),
519
+ workspaceId: 'ws-test',
520
+ relay: {
521
+ env: {
522
+ AGENT_RELAY_WORKFLOW_DISABLE_RELAYCAST: '1',
523
+ RELAYFILE_BASE_URL: 'https://relay.example.test',
524
+ },
525
+ },
526
+ });
527
+ const config = makeConfig([
528
+ {
529
+ name: 'env-merge-agent',
530
+ cli: 'claude',
531
+ interactive: false,
532
+ permissions: { access: 'readwrite' },
533
+ },
534
+ ]);
535
+
536
+ const run = await runner.execute(config, 'default');
537
+ const spawnOptions = mockSubprocessSpawn.mock.calls[0]?.[2] as { env?: NodeJS.ProcessEnv } | undefined;
538
+
539
+ expect(run.status).toBe('completed');
540
+ expect(mockSubprocessSpawn).toHaveBeenCalledTimes(1);
541
+ expect(spawnOptions?.env?.[inheritedEnvKey]).toBe('inherited-value');
542
+ expect(spawnOptions?.env?.RELAYFILE_BASE_URL).toBe('https://relay.example.test');
543
+ expect(spawnOptions?.env?.AGENT_RELAY_WORKFLOW_DISABLE_RELAYCAST).toBe('1');
544
+ } finally {
545
+ if (originalInheritedValue === undefined) {
546
+ delete process.env[inheritedEnvKey];
547
+ } else {
548
+ process.env[inheritedEnvKey] = originalInheritedValue;
549
+ }
550
+ }
551
+ });
552
+
509
553
  it('clears workflow-scoped tokens after successful completion', async () => {
510
554
  const projectDir = createBaseProject();
511
555
  const runner = makeRunner(projectDir);
@@ -85,21 +85,23 @@ function installOutputFilter(): () => void {
85
85
  const orig = console.log.bind(console);
86
86
  console.log = (...args: unknown[]) => {
87
87
  const str = String(args[0] ?? '');
88
- if (str.includes('Observer:') || str.includes('agentrelay.dev') || str.includes('Channel: wf-')) {
88
+ if (str.includes('Observer:') || str.includes('agentrelay.com') || str.includes('Channel: wf-')) {
89
89
  orig(...args);
90
90
  return;
91
91
  }
92
92
  if (/\[broker\]/.test(str) || /\[workflow\s+\d{2}:\d{2}\]/.test(str)) return;
93
93
  orig(...args);
94
94
  };
95
- return () => { console.log = orig; };
95
+ return () => {
96
+ console.log = orig;
97
+ };
96
98
  }
97
99
 
98
100
  async function runWithListr(
99
101
  runner: WorkflowRunner,
100
102
  config: RunnerConfig,
101
103
  workflowName: string | undefined,
102
- executeOptions: ExecuteOptions | undefined,
104
+ executeOptions: ExecuteOptions | undefined
103
105
  ): Promise<RunnerResult> {
104
106
  const stepHandles = new Map<string, StepHandle>();
105
107
  const restoreConsole = installOutputFilter();
@@ -135,7 +137,7 @@ async function runWithListr(
135
137
  collapseErrors: false,
136
138
  showErrorMessage: true,
137
139
  },
138
- },
140
+ }
139
141
  );
140
142
 
141
143
  runner.on((event: WorkflowEvent) => {
@@ -10,7 +10,7 @@ function installOutputFilter(): () => void {
10
10
  console.log = (...args: unknown[]) => {
11
11
  const str = String(args[0] ?? '');
12
12
  // Always show the observer URL and channel so users can follow the run
13
- if (str.includes('Observer:') || str.includes('agentrelay.dev') || str.includes('Channel: wf-')) {
13
+ if (str.includes('Observer:') || str.includes('agentrelay.com') || str.includes('Channel: wf-')) {
14
14
  orig(...args);
15
15
  return;
16
16
  }
@@ -98,8 +98,8 @@ export function createWorkflowRenderer(): WorkflowRenderer {
98
98
  rendererOptions: {
99
99
  collapseErrors: false,
100
100
  showErrorMessage: true,
101
- },
102
- },
101
+ },
102
+ }
103
103
  );
104
104
  for (const task of pendingAdds) listr.add(task);
105
105
  pendingAdds.length = 0;
@@ -161,7 +161,7 @@ export function createWorkflowRenderer(): WorkflowRenderer {
161
161
  if (handle) {
162
162
  handle.setOutput(
163
163
  chalk.dim(`> Owner: ${event.ownerName}`) +
164
- (event.specialistName ? chalk.dim(` · specialist: ${event.specialistName}`) : ''),
164
+ (event.specialistName ? chalk.dim(` · specialist: ${event.specialistName}`) : '')
165
165
  );
166
166
  }
167
167
  break;
@@ -190,9 +190,7 @@ export function createWorkflowRenderer(): WorkflowRenderer {
190
190
  }
191
191
 
192
192
  case 'step:owner-timeout': {
193
- stepHandles
194
- .get(event.stepName)
195
- ?.setOutput(chalk.red(`> Owner ${event.ownerName} timed out`));
193
+ stepHandles.get(event.stepName)?.setOutput(chalk.red(`> Owner ${event.ownerName} timed out`));
196
194
  break;
197
195
  }
198
196
 
@@ -1517,13 +1517,14 @@ export class WorkflowRunner {
1517
1517
  }
1518
1518
 
1519
1519
  private getRelayEnv(): NodeJS.ProcessEnv | undefined {
1520
- if (!this.relayApiKey) {
1521
- return this.relayOptions.env;
1520
+ if (!this.relayApiKey && !this.relayOptions.env) {
1521
+ return undefined;
1522
1522
  }
1523
1523
 
1524
1524
  return {
1525
- ...(this.relayOptions.env ?? filteredEnv()),
1526
- RELAY_API_KEY: this.relayApiKey,
1525
+ ...process.env,
1526
+ ...(this.relayOptions.env ?? {}),
1527
+ ...(this.relayApiKey ? { RELAY_API_KEY: this.relayApiKey } : {}),
1527
1528
  };
1528
1529
  }
1529
1530
 
@@ -2699,7 +2700,7 @@ export class WorkflowRunner {
2699
2700
  this.log('API key resolved');
2700
2701
  if (this.relayApiKeyAutoCreated && this.relayApiKey) {
2701
2702
  this.log(`Workspace created — follow this run in Relaycast:`);
2702
- this.log(` Observer: https://agentrelay.dev/observer?key=${this.relayApiKey}`);
2703
+ this.log(` Observer: https://agentrelay.com/observer?key=${this.relayApiKey}`);
2703
2704
  this.log(` Channel: ${channel}`);
2704
2705
  }
2705
2706
  }
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "agent-relay-sdk"
7
- version = "4.0.3"
7
+ version = "4.0.5"
8
8
  description = "Python SDK for Agent Relay workflows"
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -57,7 +57,7 @@ function showFirstRunNotice() {
57
57
  console.log('');
58
58
  console.log('Agent Relay collects anonymous usage data to improve the product.');
59
59
  console.log('Run `agent-relay telemetry disable` to opt out.');
60
- console.log('Learn more: https://agentrelay.dev/telemetry');
60
+ console.log('Learn more: https://agentrelay.com/telemetry');
61
61
  console.log('');
62
62
  markNotified();
63
63
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/telemetry",
3
- "version": "4.0.3",
3
+ "version": "4.0.5",
4
4
  "description": "Anonymous telemetry for Agent Relay usage analytics",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -71,7 +71,7 @@ function showFirstRunNotice(): void {
71
71
  console.log('');
72
72
  console.log('Agent Relay collects anonymous usage data to improve the product.');
73
73
  console.log('Run `agent-relay telemetry disable` to opt out.');
74
- console.log('Learn more: https://agentrelay.dev/telemetry');
74
+ console.log('Learn more: https://agentrelay.com/telemetry');
75
75
  console.log('');
76
76
 
77
77
  markNotified();
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/trajectory",
3
- "version": "4.0.3",
3
+ "version": "4.0.5",
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": "4.0.3"
25
+ "@agent-relay/config": "4.0.5"
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": "4.0.3",
3
+ "version": "4.0.5",
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": "4.0.3"
25
+ "@agent-relay/utils": "4.0.5"
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": "4.0.3",
3
+ "version": "4.0.5",
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": "4.0.3",
115
+ "@agent-relay/config": "4.0.5",
116
116
  "compare-versions": "^6.1.1"
117
117
  },
118
118
  "publishConfig": {