agent-relay 2.1.3 → 2.1.4

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 (47) hide show
  1. package/bin/relay-pty-darwin-arm64 +0 -0
  2. package/bin/relay-pty-darwin-x64 +0 -0
  3. package/bin/relay-pty-linux-arm64 +0 -0
  4. package/bin/relay-pty-linux-x64 +0 -0
  5. package/dist/index.cjs +214 -172
  6. package/package.json +18 -18
  7. package/packages/api-types/package.json +1 -1
  8. package/packages/benchmark/package.json +4 -4
  9. package/packages/bridge/dist/cli-resolution.d.ts +32 -0
  10. package/packages/bridge/dist/cli-resolution.d.ts.map +1 -0
  11. package/packages/bridge/dist/cli-resolution.js +88 -0
  12. package/packages/bridge/dist/cli-resolution.js.map +1 -0
  13. package/packages/bridge/dist/index.d.ts +1 -0
  14. package/packages/bridge/dist/index.d.ts.map +1 -1
  15. package/packages/bridge/dist/index.js +2 -0
  16. package/packages/bridge/dist/index.js.map +1 -1
  17. package/packages/bridge/dist/spawner.d.ts.map +1 -1
  18. package/packages/bridge/dist/spawner.js +4 -12
  19. package/packages/bridge/dist/spawner.js.map +1 -1
  20. package/packages/bridge/package.json +8 -8
  21. package/packages/bridge/src/cli-resolution.test.ts +225 -0
  22. package/packages/bridge/src/cli-resolution.ts +100 -0
  23. package/packages/bridge/src/index.ts +9 -0
  24. package/packages/bridge/src/spawner.ts +4 -13
  25. package/packages/cli-tester/package.json +1 -1
  26. package/packages/config/package.json +2 -2
  27. package/packages/continuity/package.json +2 -2
  28. package/packages/daemon/package.json +12 -12
  29. package/packages/hooks/package.json +4 -4
  30. package/packages/mcp/package.json +3 -3
  31. package/packages/memory/package.json +2 -2
  32. package/packages/policy/package.json +2 -2
  33. package/packages/protocol/package.json +1 -1
  34. package/packages/resiliency/package.json +1 -1
  35. package/packages/sdk/package.json +2 -2
  36. package/packages/spawner/package.json +1 -1
  37. package/packages/state/package.json +1 -1
  38. package/packages/storage/package.json +2 -2
  39. package/packages/telemetry/package.json +1 -1
  40. package/packages/trajectory/package.json +2 -2
  41. package/packages/user-directory/package.json +2 -2
  42. package/packages/utils/package.json +2 -2
  43. package/packages/wrapper/dist/shared.d.ts.map +1 -1
  44. package/packages/wrapper/dist/shared.js +5 -0
  45. package/packages/wrapper/dist/shared.js.map +1 -1
  46. package/packages/wrapper/package.json +6 -6
  47. package/packages/wrapper/src/shared.ts +5 -0
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Unit tests for CLI Resolution Utilities
3
+ *
4
+ * Tests the detection and resolution of CLI commands for different providers,
5
+ * particularly the Cursor CLI which has two names: 'agent' (newer) and 'cursor-agent' (older).
6
+ */
7
+
8
+ import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
9
+ import { execSync } from 'node:child_process';
10
+ import {
11
+ commandExists,
12
+ detectCursorCli,
13
+ resolveCli,
14
+ resetCursorCliCache,
15
+ CLI_COMMAND_MAP,
16
+ } from './cli-resolution.js';
17
+
18
+ // Mock child_process module
19
+ vi.mock('node:child_process', () => ({
20
+ execSync: vi.fn(),
21
+ }));
22
+
23
+ const mockedExecSync = vi.mocked(execSync);
24
+
25
+ describe('CLI Resolution', () => {
26
+ beforeEach(() => {
27
+ vi.clearAllMocks();
28
+ resetCursorCliCache();
29
+ });
30
+
31
+ afterEach(() => {
32
+ vi.restoreAllMocks();
33
+ });
34
+
35
+ describe('commandExists', () => {
36
+ it('returns true when command exists', () => {
37
+ mockedExecSync.mockReturnValue(Buffer.from('/usr/bin/agent'));
38
+ expect(commandExists('agent')).toBe(true);
39
+ expect(mockedExecSync).toHaveBeenCalledWith('which agent', { stdio: 'ignore' });
40
+ });
41
+
42
+ it('returns false when command does not exist', () => {
43
+ mockedExecSync.mockImplementation(() => {
44
+ throw new Error('Command not found');
45
+ });
46
+ expect(commandExists('nonexistent-cmd')).toBe(false);
47
+ });
48
+
49
+ it('uses "where" on Windows', () => {
50
+ const originalPlatform = process.platform;
51
+ Object.defineProperty(process, 'platform', { value: 'win32' });
52
+
53
+ mockedExecSync.mockReturnValue(Buffer.from('C:\\Path\\agent.exe'));
54
+ commandExists('agent');
55
+ expect(mockedExecSync).toHaveBeenCalledWith('where agent', { stdio: 'ignore' });
56
+
57
+ Object.defineProperty(process, 'platform', { value: originalPlatform });
58
+ });
59
+ });
60
+
61
+ describe('detectCursorCli', () => {
62
+ it('returns "agent" when agent command exists', () => {
63
+ mockedExecSync.mockReturnValue(Buffer.from('/usr/bin/agent'));
64
+ expect(detectCursorCli()).toBe('agent');
65
+ });
66
+
67
+ it('returns "cursor-agent" when only cursor-agent exists', () => {
68
+ mockedExecSync.mockImplementation((cmd: string) => {
69
+ if (cmd === 'which agent') {
70
+ throw new Error('not found');
71
+ }
72
+ return Buffer.from('/usr/bin/cursor-agent');
73
+ });
74
+ expect(detectCursorCli()).toBe('cursor-agent');
75
+ });
76
+
77
+ it('returns null when neither command exists', () => {
78
+ mockedExecSync.mockImplementation(() => {
79
+ throw new Error('not found');
80
+ });
81
+ expect(detectCursorCli()).toBeNull();
82
+ });
83
+
84
+ it('caches the detected CLI', () => {
85
+ mockedExecSync.mockReturnValue(Buffer.from('/usr/bin/agent'));
86
+
87
+ // First call detects
88
+ expect(detectCursorCli()).toBe('agent');
89
+ expect(mockedExecSync).toHaveBeenCalledTimes(1);
90
+
91
+ // Second call uses cache
92
+ expect(detectCursorCli()).toBe('agent');
93
+ expect(mockedExecSync).toHaveBeenCalledTimes(1); // Still 1
94
+ });
95
+
96
+ it('cache can be reset', () => {
97
+ mockedExecSync.mockReturnValue(Buffer.from('/usr/bin/agent'));
98
+
99
+ detectCursorCli();
100
+ expect(mockedExecSync).toHaveBeenCalledTimes(1);
101
+
102
+ resetCursorCliCache();
103
+
104
+ detectCursorCli();
105
+ expect(mockedExecSync).toHaveBeenCalledTimes(2);
106
+ });
107
+ });
108
+
109
+ describe('resolveCli', () => {
110
+ it('resolves "cursor" to detected CLI (agent)', () => {
111
+ mockedExecSync.mockReturnValue(Buffer.from('/usr/bin/agent'));
112
+ expect(resolveCli('cursor')).toBe('agent');
113
+ });
114
+
115
+ it('resolves "cursor" to detected CLI (cursor-agent)', () => {
116
+ mockedExecSync.mockImplementation((cmd: string) => {
117
+ if (cmd === 'which agent') {
118
+ throw new Error('not found');
119
+ }
120
+ return Buffer.from('/usr/bin/cursor-agent');
121
+ });
122
+ expect(resolveCli('cursor')).toBe('cursor-agent');
123
+ });
124
+
125
+ it('resolves "cursor-agent" input to detected CLI', () => {
126
+ mockedExecSync.mockReturnValue(Buffer.from('/usr/bin/agent'));
127
+ expect(resolveCli('cursor-agent')).toBe('agent');
128
+ });
129
+
130
+ it('falls back to "agent" when cursor CLI not detected', () => {
131
+ mockedExecSync.mockImplementation(() => {
132
+ throw new Error('not found');
133
+ });
134
+ expect(resolveCli('cursor')).toBe('agent');
135
+ });
136
+
137
+ it('is case insensitive for cursor', () => {
138
+ mockedExecSync.mockReturnValue(Buffer.from('/usr/bin/agent'));
139
+ expect(resolveCli('CURSOR')).toBe('agent');
140
+ expect(resolveCli('Cursor')).toBe('agent');
141
+ });
142
+
143
+ it('resolves "google" to "gemini"', () => {
144
+ expect(resolveCli('google')).toBe('gemini');
145
+ expect(resolveCli('Google')).toBe('gemini');
146
+ });
147
+
148
+ it('returns other commands unchanged', () => {
149
+ expect(resolveCli('claude')).toBe('claude');
150
+ expect(resolveCli('codex')).toBe('codex');
151
+ expect(resolveCli('gemini')).toBe('gemini');
152
+ expect(resolveCli('opencode')).toBe('opencode');
153
+ });
154
+
155
+ it('preserves case for unknown commands', () => {
156
+ expect(resolveCli('MyCustomCli')).toBe('MyCustomCli');
157
+ });
158
+ });
159
+
160
+ describe('CLI_COMMAND_MAP', () => {
161
+ it('maps cursor to agent', () => {
162
+ expect(CLI_COMMAND_MAP['cursor']).toBe('agent');
163
+ });
164
+
165
+ it('maps cursor-agent to agent', () => {
166
+ expect(CLI_COMMAND_MAP['cursor-agent']).toBe('agent');
167
+ });
168
+
169
+ it('maps google to gemini', () => {
170
+ expect(CLI_COMMAND_MAP['google']).toBe('gemini');
171
+ });
172
+ });
173
+ });
174
+
175
+ describe('CLI Resolution Integration', () => {
176
+ describe('Cursor CLI scenarios', () => {
177
+ beforeEach(() => {
178
+ vi.clearAllMocks();
179
+ resetCursorCliCache();
180
+ });
181
+
182
+ it('handles user with newer Cursor (agent available)', () => {
183
+ // User has Cursor v0.50+ with "agent" CLI
184
+ mockedExecSync.mockReturnValue(Buffer.from('/usr/bin/agent'));
185
+
186
+ const resolved = resolveCli('cursor');
187
+ expect(resolved).toBe('agent');
188
+ });
189
+
190
+ it('handles user with older Cursor (cursor-agent available)', () => {
191
+ // User has older Cursor with "cursor-agent" CLI
192
+ mockedExecSync.mockImplementation((cmd: string) => {
193
+ if (cmd === 'which agent') {
194
+ throw new Error('not found');
195
+ }
196
+ return Buffer.from('/usr/bin/cursor-agent');
197
+ });
198
+
199
+ const resolved = resolveCli('cursor');
200
+ expect(resolved).toBe('cursor-agent');
201
+ });
202
+
203
+ it('handles team spawn request with cursor CLI', () => {
204
+ // Lead agent spawns worker with "cursor" - should resolve to available CLI
205
+ mockedExecSync.mockReturnValue(Buffer.from('/usr/bin/agent'));
206
+
207
+ // Simulate spawn request parsing
208
+ const cli = 'cursor';
209
+ const cliParts = cli.split(' ');
210
+ const rawCommand = cliParts[0];
211
+ const resolved = resolveCli(rawCommand);
212
+
213
+ expect(resolved).toBe('agent');
214
+ });
215
+
216
+ it('handles explicit cursor-agent in spawn request', () => {
217
+ // User explicitly requests cursor-agent - should still check availability
218
+ mockedExecSync.mockReturnValue(Buffer.from('/usr/bin/agent'));
219
+
220
+ const resolved = resolveCli('cursor-agent');
221
+ // Even when asking for cursor-agent, if agent is available, use agent
222
+ expect(resolved).toBe('agent');
223
+ });
224
+ });
225
+ });
@@ -0,0 +1,100 @@
1
+ /**
2
+ * CLI Resolution Utilities
3
+ *
4
+ * Handles mapping and detection of CLI commands for different providers.
5
+ * Cursor has two CLI names: 'agent' (newer) and 'cursor-agent' (older).
6
+ */
7
+
8
+ import { execSync } from 'node:child_process';
9
+ import { createLogger } from '@agent-relay/utils/logger';
10
+
11
+ const log = createLogger('cli-resolution');
12
+
13
+ /**
14
+ * Check if a command exists in PATH
15
+ */
16
+ export function commandExists(cmd: string): boolean {
17
+ try {
18
+ const whichCmd = process.platform === 'win32' ? 'where' : 'which';
19
+ execSync(`${whichCmd} ${cmd}`, { stdio: 'ignore' });
20
+ return true;
21
+ } catch {
22
+ return false;
23
+ }
24
+ }
25
+
26
+ // Cache for detected Cursor CLI command
27
+ let detectedCursorCli: string | null = null;
28
+
29
+ /**
30
+ * Reset the Cursor CLI detection cache.
31
+ * Useful for testing.
32
+ */
33
+ export function resetCursorCliCache(): void {
34
+ detectedCursorCli = null;
35
+ }
36
+
37
+ /**
38
+ * Detect which Cursor CLI command is available.
39
+ * Newer versions use 'agent', older versions use 'cursor-agent'.
40
+ * Returns null if neither is found.
41
+ */
42
+ export function detectCursorCli(): string | null {
43
+ if (detectedCursorCli !== null) {
44
+ return detectedCursorCli;
45
+ }
46
+
47
+ // Try newer 'agent' command first
48
+ if (commandExists('agent')) {
49
+ detectedCursorCli = 'agent';
50
+ log.debug('Detected Cursor CLI: agent (newer version)');
51
+ return 'agent';
52
+ }
53
+
54
+ // Fall back to older 'cursor-agent' command
55
+ if (commandExists('cursor-agent')) {
56
+ detectedCursorCli = 'cursor-agent';
57
+ log.debug('Detected Cursor CLI: cursor-agent (older version)');
58
+ return 'cursor-agent';
59
+ }
60
+
61
+ log.debug('Cursor CLI not found (neither agent nor cursor-agent)');
62
+ return null;
63
+ }
64
+
65
+ /**
66
+ * Resolve CLI command for a provider.
67
+ * For cursor, detects whether 'agent' or 'cursor-agent' is available.
68
+ */
69
+ export function resolveCli(rawCommand: string): string {
70
+ const cmdLower = rawCommand.toLowerCase();
71
+
72
+ // Handle cursor specially - detect which CLI is installed
73
+ if (cmdLower === 'cursor' || cmdLower === 'cursor-agent') {
74
+ const cursorCli = detectCursorCli();
75
+ if (cursorCli) {
76
+ return cursorCli;
77
+ }
78
+ // Fall back to 'agent' if detection fails (let it fail at spawn time)
79
+ return 'agent';
80
+ }
81
+
82
+ // Handle other mappings
83
+ if (cmdLower === 'google') {
84
+ return 'gemini';
85
+ }
86
+
87
+ // Return as-is for other commands
88
+ return rawCommand;
89
+ }
90
+
91
+ /**
92
+ * CLI command mapping for providers (kept for reference, resolveCli handles logic)
93
+ * Maps provider names to actual CLI command names
94
+ */
95
+ export const CLI_COMMAND_MAP: Record<string, string> = {
96
+ cursor: 'agent', // Cursor CLI installs as 'agent' (newer versions)
97
+ 'cursor-agent': 'agent', // Cursor CLI older name, also maps to 'agent'
98
+ google: 'gemini', // Google provider uses 'gemini' CLI
99
+ // Other providers use their name as the command (claude, codex, etc.)
100
+ };
@@ -13,6 +13,15 @@ export {
13
13
  type ShadowCliSelection,
14
14
  } from './shadow-cli.js';
15
15
 
16
+ // CLI resolution utilities
17
+ export {
18
+ commandExists,
19
+ detectCursorCli,
20
+ resolveCli,
21
+ resetCursorCliCache,
22
+ CLI_COMMAND_MAP,
23
+ } from './cli-resolution.js';
24
+
16
25
  // Agent spawner
17
26
  export {
18
27
  AgentSpawner,
@@ -9,6 +9,7 @@ import { execFile } from 'node:child_process';
9
9
  import path from 'node:path';
10
10
  import { fileURLToPath } from 'node:url';
11
11
  import { sleep } from './utils.js';
12
+ import { resolveCli } from './cli-resolution.js';
12
13
  import { getProjectPaths, getAgentOutboxTemplate } from '@agent-relay/config';
13
14
  import { resolveCommand } from '@agent-relay/utils/command-resolver';
14
15
  import { createTraceableError } from '@agent-relay/utils/error-tracking';
@@ -40,16 +41,6 @@ import type {
40
41
  // Logger instance for spawner (uses daemon log system instead of console)
41
42
  const log = createLogger('spawner');
42
43
 
43
- /**
44
- * CLI command mapping for providers
45
- * Maps provider names to actual CLI command names
46
- */
47
- const CLI_COMMAND_MAP: Record<string, string> = {
48
- cursor: 'agent', // Cursor CLI installs as 'agent'
49
- google: 'gemini', // Google provider uses 'gemini' CLI
50
- // Other providers use their name as the command (claude, codex, etc.)
51
- };
52
-
53
44
  function extractGhTokenFromHosts(content: string): string | null {
54
45
  const lines = content.split(/\r?\n/);
55
46
  let inGithubSection = false;
@@ -796,10 +787,10 @@ export class AgentSpawner {
796
787
  }
797
788
 
798
789
  try {
799
- // Parse CLI command and apply mapping (e.g., cursor -> agent)
790
+ // Parse CLI command and resolve actual command (e.g., cursor -> agent or cursor-agent)
800
791
  const cliParts = cli.split(' ');
801
792
  const rawCommandName = cliParts[0];
802
- const commandName = CLI_COMMAND_MAP[rawCommandName] || rawCommandName;
793
+ const commandName = resolveCli(rawCommandName);
803
794
  const args = cliParts.slice(1);
804
795
 
805
796
  if (commandName !== rawCommandName && debug) {
@@ -821,7 +812,7 @@ export class AgentSpawner {
821
812
  // Add auto-accept flags for non-interactive agents (normal spawns, not setup terminals)
822
813
  // When interactive=true (setup flows), we SKIP these flags so users can respond to prompts
823
814
  const isClaudeCli = commandName.startsWith('claude');
824
- const isCursorCli = commandName === 'agent' || rawCommandName === 'cursor';
815
+ const isCursorCli = commandName === 'agent' || rawCommandName === 'cursor' || rawCommandName === 'cursor-agent';
825
816
 
826
817
  if (!interactive) {
827
818
  // Add --dangerously-skip-permissions for Claude agents
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/cli-tester",
3
- "version": "2.1.3",
3
+ "version": "2.1.4",
4
4
  "description": "Manual interactive testing for CLI authentication flows",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/config",
3
- "version": "2.1.3",
3
+ "version": "2.1.4",
4
4
  "description": "Shared configuration schemas and loaders for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -83,7 +83,7 @@
83
83
  "test:watch": "vitest"
84
84
  },
85
85
  "dependencies": {
86
- "@agent-relay/protocol": "2.1.3",
86
+ "@agent-relay/protocol": "2.1.4",
87
87
  "zod": "^3.23.8",
88
88
  "zod-to-json-schema": "^3.23.1"
89
89
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/continuity",
3
- "version": "2.1.3",
3
+ "version": "2.1.4",
4
4
  "description": "Session continuity manager for Relay (ledgers, handoffs, resume)",
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/memory": "2.1.3"
25
+ "@agent-relay/memory": "2.1.4"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/daemon",
3
- "version": "2.1.3",
3
+ "version": "2.1.4",
4
4
  "description": "Relay daemon server - agent coordination and message routing",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -22,17 +22,17 @@
22
22
  "test:watch": "vitest"
23
23
  },
24
24
  "dependencies": {
25
- "@agent-relay/protocol": "2.1.3",
26
- "@agent-relay/config": "2.1.3",
27
- "@agent-relay/storage": "2.1.3",
28
- "@agent-relay/bridge": "2.1.3",
29
- "@agent-relay/utils": "2.1.3",
30
- "@agent-relay/policy": "2.1.3",
31
- "@agent-relay/memory": "2.1.3",
32
- "@agent-relay/resiliency": "2.1.3",
33
- "@agent-relay/user-directory": "2.1.3",
34
- "@agent-relay/wrapper": "2.1.3",
35
- "@agent-relay/telemetry": "2.1.3",
25
+ "@agent-relay/protocol": "2.1.4",
26
+ "@agent-relay/config": "2.1.4",
27
+ "@agent-relay/storage": "2.1.4",
28
+ "@agent-relay/bridge": "2.1.4",
29
+ "@agent-relay/utils": "2.1.4",
30
+ "@agent-relay/policy": "2.1.4",
31
+ "@agent-relay/memory": "2.1.4",
32
+ "@agent-relay/resiliency": "2.1.4",
33
+ "@agent-relay/user-directory": "2.1.4",
34
+ "@agent-relay/wrapper": "2.1.4",
35
+ "@agent-relay/telemetry": "2.1.4",
36
36
  "ws": "^8.18.3",
37
37
  "pg": "^8.16.3",
38
38
  "uuid": "^10.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/hooks",
3
- "version": "2.1.3",
3
+ "version": "2.1.4",
4
4
  "description": "Hook emitter, registry, and trajectory hooks for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -37,9 +37,9 @@
37
37
  "test:watch": "vitest"
38
38
  },
39
39
  "dependencies": {
40
- "@agent-relay/protocol": "2.1.3",
41
- "@agent-relay/config": "2.1.3",
42
- "@agent-relay/trajectory": "2.1.3"
40
+ "@agent-relay/protocol": "2.1.4",
41
+ "@agent-relay/config": "2.1.4",
42
+ "@agent-relay/trajectory": "2.1.4"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/mcp",
3
- "version": "2.1.3",
3
+ "version": "2.1.4",
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,8 +47,8 @@
47
47
  "prepublishOnly": "npm run clean && npm run build && npm test"
48
48
  },
49
49
  "dependencies": {
50
- "@agent-relay/config": "2.1.3",
51
- "@agent-relay/protocol": "2.1.3",
50
+ "@agent-relay/config": "2.1.4",
51
+ "@agent-relay/protocol": "2.1.4",
52
52
  "@modelcontextprotocol/sdk": "^1.0.0",
53
53
  "smol-toml": "^1.6.0",
54
54
  "zod": "^3.23.8"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/memory",
3
- "version": "2.1.3",
3
+ "version": "2.1.4",
4
4
  "description": "Semantic memory storage and retrieval system for agent-relay with multiple backend support",
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/hooks": "2.1.3"
25
+ "@agent-relay/hooks": "2.1.4"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/policy",
3
- "version": "2.1.3",
3
+ "version": "2.1.4",
4
4
  "description": "Agent policy management with multi-level fallback (repo, local PRPM, cloud workspace)",
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": "2.1.3"
25
+ "@agent-relay/config": "2.1.4"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/protocol",
3
- "version": "2.1.3",
3
+ "version": "2.1.4",
4
4
  "description": "Wire protocol types and framing for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/resiliency",
3
- "version": "2.1.3",
3
+ "version": "2.1.4",
4
4
  "description": "Health monitoring, logging, metrics, and crash resilience utilities for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/sdk",
3
- "version": "2.1.3",
3
+ "version": "2.1.4",
4
4
  "description": "Lightweight SDK for agent-to-agent communication via Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -55,7 +55,7 @@
55
55
  "access": "public"
56
56
  },
57
57
  "dependencies": {
58
- "@agent-relay/protocol": "2.1.3"
58
+ "@agent-relay/protocol": "2.1.4"
59
59
  },
60
60
  "engines": {
61
61
  "node": ">=18.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/spawner",
3
- "version": "2.1.3",
3
+ "version": "2.1.4",
4
4
  "description": "Agent spawning types and utilities for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/state",
3
- "version": "2.1.3",
3
+ "version": "2.1.4",
4
4
  "description": "Agent state persistence for non-hook CLIs (Codex, Gemini, etc.)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/storage",
3
- "version": "2.1.3",
3
+ "version": "2.1.4",
4
4
  "description": "Storage adapters and interfaces for Relay message/session persistence",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -56,7 +56,7 @@
56
56
  }
57
57
  },
58
58
  "dependencies": {
59
- "@agent-relay/protocol": "2.1.3"
59
+ "@agent-relay/protocol": "2.1.4"
60
60
  },
61
61
  "devDependencies": {
62
62
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/telemetry",
3
- "version": "2.1.3",
3
+ "version": "2.1.4",
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": "2.1.3",
3
+ "version": "2.1.4",
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": "2.1.3"
25
+ "@agent-relay/config": "2.1.4"
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": "2.1.3",
3
+ "version": "2.1.4",
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/resiliency": "2.1.3"
25
+ "@agent-relay/resiliency": "2.1.4"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^22.19.3",