agent-relay 2.1.5 → 2.1.7

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 (140) hide show
  1. package/README.md +91 -234
  2. package/dist/index.cjs +153 -25
  3. package/dist/src/cli/commands/doctor.d.ts.map +1 -1
  4. package/dist/src/cli/commands/doctor.js +32 -7
  5. package/dist/src/cli/commands/doctor.js.map +1 -1
  6. package/dist/src/cli/index.d.ts.map +1 -1
  7. package/dist/src/cli/index.js +260 -27
  8. package/dist/src/cli/index.js.map +1 -1
  9. package/install.sh +545 -34
  10. package/package.json +18 -18
  11. package/packages/api-types/package.json +1 -1
  12. package/packages/benchmark/package.json +4 -4
  13. package/packages/bridge/package.json +8 -8
  14. package/packages/cli-tester/package.json +1 -1
  15. package/packages/config/package.json +2 -2
  16. package/packages/continuity/package.json +2 -2
  17. package/packages/daemon/dist/server.d.ts +5 -0
  18. package/packages/daemon/dist/server.d.ts.map +1 -1
  19. package/packages/daemon/dist/server.js +76 -4
  20. package/packages/daemon/dist/server.js.map +1 -1
  21. package/packages/daemon/package.json +12 -12
  22. package/packages/daemon/src/server.ts +79 -4
  23. package/packages/hooks/package.json +4 -4
  24. package/packages/mcp/dist/bin.js +34 -3
  25. package/packages/mcp/dist/bin.js.map +1 -1
  26. package/packages/mcp/dist/cloud.d.ts +7 -114
  27. package/packages/mcp/dist/cloud.d.ts.map +1 -1
  28. package/packages/mcp/dist/cloud.js +21 -431
  29. package/packages/mcp/dist/cloud.js.map +1 -1
  30. package/packages/mcp/dist/errors.d.ts +4 -22
  31. package/packages/mcp/dist/errors.d.ts.map +1 -1
  32. package/packages/mcp/dist/errors.js +4 -43
  33. package/packages/mcp/dist/errors.js.map +1 -1
  34. package/packages/mcp/dist/hybrid-client.d.ts.map +1 -1
  35. package/packages/mcp/dist/hybrid-client.js +7 -1
  36. package/packages/mcp/dist/hybrid-client.js.map +1 -1
  37. package/packages/mcp/dist/install.d.ts.map +1 -1
  38. package/packages/mcp/dist/install.js +7 -8
  39. package/packages/mcp/dist/install.js.map +1 -1
  40. package/packages/mcp/package.json +4 -3
  41. package/packages/mcp/src/bin.ts +39 -3
  42. package/packages/mcp/src/cloud.ts +29 -511
  43. package/packages/mcp/src/errors.ts +12 -49
  44. package/packages/mcp/src/hybrid-client.ts +8 -1
  45. package/packages/mcp/src/install.ts +7 -8
  46. package/packages/mcp/tests/discover.test.ts +72 -11
  47. package/packages/memory/package.json +2 -2
  48. package/packages/policy/package.json +2 -2
  49. package/packages/protocol/dist/types.d.ts +17 -1
  50. package/packages/protocol/dist/types.d.ts.map +1 -1
  51. package/packages/protocol/package.json +1 -1
  52. package/packages/protocol/src/types.ts +23 -0
  53. package/packages/resiliency/package.json +1 -1
  54. package/packages/sdk/dist/browser-client.d.ts +212 -0
  55. package/packages/sdk/dist/browser-client.d.ts.map +1 -0
  56. package/packages/sdk/dist/browser-client.js +750 -0
  57. package/packages/sdk/dist/browser-client.js.map +1 -0
  58. package/packages/sdk/dist/browser-framing.d.ts +46 -0
  59. package/packages/sdk/dist/browser-framing.d.ts.map +1 -0
  60. package/packages/sdk/dist/browser-framing.js +122 -0
  61. package/packages/sdk/dist/browser-framing.js.map +1 -0
  62. package/packages/sdk/dist/client.d.ts +129 -2
  63. package/packages/sdk/dist/client.d.ts.map +1 -1
  64. package/packages/sdk/dist/client.js +312 -2
  65. package/packages/sdk/dist/client.js.map +1 -1
  66. package/packages/sdk/dist/discovery.d.ts +10 -0
  67. package/packages/sdk/dist/discovery.d.ts.map +1 -0
  68. package/packages/sdk/dist/discovery.js +22 -0
  69. package/packages/sdk/dist/discovery.js.map +1 -0
  70. package/packages/sdk/dist/errors.d.ts +9 -0
  71. package/packages/sdk/dist/errors.d.ts.map +1 -0
  72. package/packages/sdk/dist/errors.js +9 -0
  73. package/packages/sdk/dist/errors.js.map +1 -0
  74. package/packages/sdk/dist/index.d.ts +18 -2
  75. package/packages/sdk/dist/index.d.ts.map +1 -1
  76. package/packages/sdk/dist/index.js +27 -1
  77. package/packages/sdk/dist/index.js.map +1 -1
  78. package/packages/sdk/dist/transports/index.d.ts +92 -0
  79. package/packages/sdk/dist/transports/index.d.ts.map +1 -0
  80. package/packages/sdk/dist/transports/index.js +129 -0
  81. package/packages/sdk/dist/transports/index.js.map +1 -0
  82. package/packages/sdk/dist/transports/socket-transport.d.ts +30 -0
  83. package/packages/sdk/dist/transports/socket-transport.d.ts.map +1 -0
  84. package/packages/sdk/dist/transports/socket-transport.js +94 -0
  85. package/packages/sdk/dist/transports/socket-transport.js.map +1 -0
  86. package/packages/sdk/dist/transports/types.d.ts +69 -0
  87. package/packages/sdk/dist/transports/types.d.ts.map +1 -0
  88. package/packages/sdk/dist/transports/types.js +10 -0
  89. package/packages/sdk/dist/transports/types.js.map +1 -0
  90. package/packages/sdk/dist/transports/websocket-transport.d.ts +55 -0
  91. package/packages/sdk/dist/transports/websocket-transport.d.ts.map +1 -0
  92. package/packages/sdk/dist/transports/websocket-transport.js +180 -0
  93. package/packages/sdk/dist/transports/websocket-transport.js.map +1 -0
  94. package/packages/sdk/package.json +28 -4
  95. package/packages/sdk/src/browser-client.ts +985 -0
  96. package/packages/sdk/src/browser-framing.test.ts +115 -0
  97. package/packages/sdk/src/browser-framing.ts +150 -0
  98. package/packages/sdk/src/client.test.ts +425 -0
  99. package/packages/sdk/src/client.ts +397 -3
  100. package/packages/sdk/src/discovery.ts +38 -0
  101. package/packages/sdk/src/errors.ts +17 -0
  102. package/packages/sdk/src/index.ts +82 -1
  103. package/packages/sdk/src/transports/index.ts +197 -0
  104. package/packages/sdk/src/transports/socket-transport.ts +115 -0
  105. package/packages/sdk/src/transports/types.ts +77 -0
  106. package/packages/sdk/src/transports/websocket-transport.ts +245 -0
  107. package/packages/sdk/tsconfig.json +1 -1
  108. package/packages/spawner/package.json +1 -1
  109. package/packages/state/package.json +1 -1
  110. package/packages/storage/dist/sqlite-adapter.d.ts +1 -0
  111. package/packages/storage/dist/sqlite-adapter.d.ts.map +1 -1
  112. package/packages/storage/dist/sqlite-adapter.js +31 -3
  113. package/packages/storage/dist/sqlite-adapter.js.map +1 -1
  114. package/packages/storage/package.json +2 -2
  115. package/packages/storage/src/jsonl-adapter.test.ts +8 -3
  116. package/packages/storage/src/sqlite-adapter.ts +34 -6
  117. package/packages/telemetry/package.json +1 -1
  118. package/packages/trajectory/package.json +2 -2
  119. package/packages/user-directory/package.json +2 -2
  120. package/packages/utils/dist/cjs/discovery.js +328 -0
  121. package/packages/utils/dist/cjs/errors.js +81 -0
  122. package/packages/utils/dist/discovery.d.ts +123 -0
  123. package/packages/utils/dist/discovery.d.ts.map +1 -0
  124. package/packages/utils/dist/discovery.js +439 -0
  125. package/packages/utils/dist/discovery.js.map +1 -0
  126. package/packages/utils/dist/errors.d.ts +29 -0
  127. package/packages/utils/dist/errors.d.ts.map +1 -0
  128. package/packages/utils/dist/errors.js +50 -0
  129. package/packages/utils/dist/errors.js.map +1 -0
  130. package/packages/utils/package.json +15 -2
  131. package/packages/utils/src/consolidation.test.ts +125 -0
  132. package/packages/utils/src/discovery.test.ts +196 -0
  133. package/packages/utils/src/discovery.ts +524 -0
  134. package/packages/utils/src/errors.test.ts +83 -0
  135. package/packages/utils/src/errors.ts +56 -0
  136. package/packages/wrapper/dist/relay-pty-orchestrator.d.ts.map +1 -1
  137. package/packages/wrapper/dist/relay-pty-orchestrator.js +12 -0
  138. package/packages/wrapper/dist/relay-pty-orchestrator.js.map +1 -1
  139. package/packages/wrapper/package.json +6 -6
  140. package/packages/wrapper/src/relay-pty-orchestrator.ts +12 -0
package/install.sh CHANGED
@@ -2,9 +2,17 @@
2
2
  set -e
3
3
 
4
4
  # Agent Relay Installer
5
- # Usage: curl -fsSL https://raw.githubusercontent.com/khaliqgant/agent-relay/main/install.sh | bash
5
+ # Usage: curl -fsSL https://raw.githubusercontent.com/AgentWorkforce/relay/main/install.sh | bash
6
+ #
7
+ # Options (set as environment variables):
8
+ # AGENT_RELAY_VERSION - Specific version to install (default: latest)
9
+ # AGENT_RELAY_INSTALL_DIR - Installation directory (default: ~/.agent-relay)
10
+ # AGENT_RELAY_BIN_DIR - Binary directory (default: ~/.local/bin)
11
+ # AGENT_RELAY_NO_DASHBOARD - Skip dashboard installation (default: false)
6
12
 
7
- REPO="khaliqgant/agent-relay"
13
+ REPO_RELAY="AgentWorkforce/relay"
14
+ REPO_DASHBOARD="AgentWorkforce/relay-dashboard"
15
+ VERSION="${AGENT_RELAY_VERSION:-latest}"
8
16
  INSTALL_DIR="${AGENT_RELAY_INSTALL_DIR:-$HOME/.agent-relay}"
9
17
  BIN_DIR="${AGENT_RELAY_BIN_DIR:-$HOME/.local/bin}"
10
18
 
@@ -13,65 +21,568 @@ RED='\033[0;31m'
13
21
  GREEN='\033[0;32m'
14
22
  YELLOW='\033[1;33m'
15
23
  BLUE='\033[0;34m'
24
+ CYAN='\033[0;36m'
25
+ BOLD='\033[1m'
16
26
  NC='\033[0m'
17
27
 
18
28
  info() { echo -e "${BLUE}[info]${NC} $1"; }
19
- success() { echo -e "${GREEN}[success]${NC} $1"; }
29
+ success() { echo -e "${GREEN}[]${NC} $1"; }
20
30
  warn() { echo -e "${YELLOW}[warn]${NC} $1"; }
21
31
  error() { echo -e "${RED}[error]${NC} $1"; exit 1; }
32
+ step() { echo -e "\n${CYAN}${BOLD}$1${NC}"; }
22
33
 
23
- check_requirements() {
24
- if ! command -v node &> /dev/null; then
25
- error "Node.js is required. Please install Node.js 20+ first."
34
+ # Detect OS and architecture
35
+ detect_platform() {
36
+ OS="$(uname -s)"
37
+ ARCH="$(uname -m)"
38
+
39
+ case "$OS" in
40
+ Linux*) OS="linux" ;;
41
+ Darwin*) OS="darwin" ;;
42
+ *) error "Unsupported OS: $OS" ;;
43
+ esac
44
+
45
+ case "$ARCH" in
46
+ x86_64|amd64) ARCH="x64" ;;
47
+ arm64|aarch64) ARCH="arm64" ;;
48
+ *) error "Unsupported architecture: $ARCH" ;;
49
+ esac
50
+
51
+ PLATFORM="${OS}-${ARCH}"
52
+ info "Detected platform: $PLATFORM"
53
+ }
54
+
55
+ # Get latest version from GitHub
56
+ get_latest_version() {
57
+ if [ "$VERSION" = "latest" ]; then
58
+ VERSION=$(curl -fsSL "https://api.github.com/repos/$REPO_RELAY/releases/latest" | grep '"tag_name"' | sed -E 's/.*"v?([^"]+)".*/\1/')
59
+ if [ -z "$VERSION" ]; then
60
+ error "Failed to fetch latest version"
61
+ fi
62
+ fi
63
+ # Remove 'v' prefix if present
64
+ VERSION="${VERSION#v}"
65
+ info "Installing version: $VERSION"
66
+ }
67
+
68
+ # Check if Node.js is available
69
+ check_node() {
70
+ if command -v node &> /dev/null; then
71
+ NODE_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1)
72
+ if [ "$NODE_VERSION" -ge 18 ]; then
73
+ HAS_NODE=true
74
+ info "Node.js $(node -v) detected"
75
+ return 0
76
+ fi
77
+ fi
78
+ HAS_NODE=false
79
+ return 1
80
+ }
81
+
82
+ # Download relay-pty binary
83
+ download_relay_pty() {
84
+ step "Downloading relay-pty binary..."
85
+
86
+ local binary_name="relay-pty-${PLATFORM}"
87
+ local download_url="https://github.com/$REPO_RELAY/releases/download/v${VERSION}/${binary_name}"
88
+ local target_path="$INSTALL_DIR/bin/relay-pty"
89
+
90
+ mkdir -p "$INSTALL_DIR/bin"
91
+
92
+ # Try to download - curl -f will fail on 404
93
+ if curl -fsSL "$download_url" -o "$target_path" 2>/dev/null; then
94
+ chmod +x "$target_path"
95
+ # Verify binary works
96
+ if "$target_path" --help &>/dev/null; then
97
+ success "Downloaded relay-pty binary"
98
+ return 0
99
+ else
100
+ warn "relay-pty binary failed verification"
101
+ rm -f "$target_path"
102
+ return 1
103
+ fi
104
+ else
105
+ warn "No prebuilt relay-pty binary for $PLATFORM"
106
+ return 1
107
+ fi
108
+ }
109
+
110
+ # Download standalone dashboard-server binary
111
+ download_dashboard_binary() {
112
+ if [ "${AGENT_RELAY_NO_DASHBOARD}" = "true" ]; then
113
+ info "Skipping dashboard installation (AGENT_RELAY_NO_DASHBOARD=true)"
114
+ return 0
115
+ fi
116
+
117
+ step "Downloading dashboard-server binary..."
118
+
119
+ local binary_name="relay-dashboard-server-${PLATFORM}"
120
+ local compressed_url="https://github.com/$REPO_DASHBOARD/releases/latest/download/${binary_name}.gz"
121
+ local uncompressed_url="https://github.com/$REPO_DASHBOARD/releases/latest/download/${binary_name}"
122
+ local target_path="$BIN_DIR/relay-dashboard-server"
123
+ local temp_file="/tmp/dashboard-download-$$"
124
+
125
+ mkdir -p "$BIN_DIR"
126
+
127
+ # Setup cleanup trap for temp files
128
+ trap 'rm -f "${temp_file}.gz" "${temp_file}"' EXIT
129
+
130
+ # Try compressed binary first (faster download)
131
+ if has_command gunzip; then
132
+ info "Trying compressed dashboard binary..."
133
+
134
+ if curl -fsSL "$compressed_url" -o "${temp_file}.gz" 2>/dev/null; then
135
+ # Check if we got a valid gzip file
136
+ local is_gzip=false
137
+ if has_command file; then
138
+ file "${temp_file}.gz" 2>/dev/null | grep -q "gzip" && is_gzip=true
139
+ else
140
+ head -c 2 "${temp_file}.gz" 2>/dev/null | od -An -tx1 | grep -q "1f 8b" && is_gzip=true
141
+ fi
142
+
143
+ if [ "$is_gzip" = true ]; then
144
+ if gunzip -c "${temp_file}.gz" > "$target_path" 2>/dev/null; then
145
+ rm -f "${temp_file}.gz"
146
+ chmod +x "$target_path"
147
+
148
+ if "$target_path" --version &>/dev/null; then
149
+ success "Downloaded standalone dashboard-server binary"
150
+ trap - EXIT
151
+ return 0
152
+ else
153
+ warn "Dashboard binary failed verification, trying uncompressed..."
154
+ rm -f "$target_path"
155
+ fi
156
+ else
157
+ rm -f "${temp_file}.gz" "$target_path"
158
+ fi
159
+ else
160
+ rm -f "${temp_file}.gz"
161
+ fi
162
+ fi
163
+ fi
164
+
165
+ # Fall back to uncompressed binary
166
+ info "Trying uncompressed dashboard binary..."
167
+
168
+ if curl -fsSL "$uncompressed_url" -o "$target_path" 2>/dev/null; then
169
+ local file_size
170
+ file_size=$(stat -f%z "$target_path" 2>/dev/null || stat -c%s "$target_path" 2>/dev/null || echo "0")
171
+
172
+ if [ "$file_size" -gt 1000000 ]; then
173
+ chmod +x "$target_path"
174
+
175
+ if "$target_path" --version &>/dev/null; then
176
+ success "Downloaded standalone dashboard-server binary"
177
+ trap - EXIT
178
+ return 0
179
+ else
180
+ warn "Dashboard binary failed verification"
181
+ rm -f "$target_path"
182
+ fi
183
+ else
184
+ rm -f "$target_path"
185
+ fi
186
+ fi
187
+
188
+ trap - EXIT
189
+ info "No standalone dashboard binary available for $PLATFORM"
190
+ return 1
191
+ }
192
+
193
+ # Check if a command exists
194
+ has_command() {
195
+ command -v "$1" &> /dev/null
196
+ }
197
+
198
+ # Download with progress indicator
199
+ download_with_progress() {
200
+ local url="$1"
201
+ local output="$2"
202
+
203
+ if [ -t 1 ]; then
204
+ # TTY available - show progress bar
205
+ curl -fSL --progress-bar "$url" -o "$output"
206
+ else
207
+ # No TTY - silent download
208
+ curl -fsSL "$url" -o "$output"
209
+ fi
210
+ }
211
+
212
+ # Download standalone agent-relay binary (no Node.js required)
213
+ download_standalone_binary() {
214
+ step "Checking for standalone binary..."
215
+
216
+ local binary_name="agent-relay-${PLATFORM}"
217
+ local compressed_url="https://github.com/$REPO_RELAY/releases/download/v${VERSION}/${binary_name}.gz"
218
+ local uncompressed_url="https://github.com/$REPO_RELAY/releases/download/v${VERSION}/${binary_name}"
219
+ local target_path="$BIN_DIR/agent-relay"
220
+ local temp_file="/tmp/agent-relay-download-$$"
221
+
222
+ mkdir -p "$BIN_DIR"
223
+
224
+ # Setup cleanup trap for temp files
225
+ trap 'rm -f "${temp_file}.gz" "${temp_file}"' EXIT
226
+
227
+ # Try compressed binary first (faster download, ~60-70% smaller)
228
+ # Only if gunzip is available
229
+ if has_command gunzip; then
230
+ info "Downloading compressed binary (~25MB instead of ~70MB)..."
231
+
232
+ if curl -fsSL "$compressed_url" -o "${temp_file}.gz" 2>/dev/null; then
233
+ # Check if we got a valid gzip file (not an error page)
234
+ # Use file command if available, otherwise check magic bytes
235
+ local is_gzip=false
236
+ if has_command file; then
237
+ file "${temp_file}.gz" 2>/dev/null | grep -q "gzip" && is_gzip=true
238
+ else
239
+ # Check gzip magic bytes (1f 8b)
240
+ head -c 2 "${temp_file}.gz" 2>/dev/null | od -An -tx1 | grep -q "1f 8b" && is_gzip=true
241
+ fi
242
+
243
+ if [ "$is_gzip" = true ]; then
244
+ # Decompress
245
+ if gunzip -c "${temp_file}.gz" > "$target_path" 2>/dev/null; then
246
+ rm -f "${temp_file}.gz"
247
+ chmod +x "$target_path"
248
+
249
+ # Verify the binary works
250
+ if "$target_path" --version &>/dev/null; then
251
+ success "Downloaded standalone agent-relay binary (no Node.js required!)"
252
+ trap - EXIT # Clear trap
253
+ return 0
254
+ else
255
+ warn "Downloaded binary failed verification, trying uncompressed..."
256
+ rm -f "$target_path"
257
+ fi
258
+ else
259
+ warn "Decompression failed, trying uncompressed binary..."
260
+ rm -f "${temp_file}.gz" "$target_path"
261
+ fi
262
+ else
263
+ info "Compressed binary not available, trying uncompressed..."
264
+ rm -f "${temp_file}.gz"
265
+ fi
266
+ else
267
+ info "Compressed binary not available, trying uncompressed..."
268
+ rm -f "${temp_file}.gz"
269
+ fi
270
+ else
271
+ info "gunzip not available, trying uncompressed binary..."
26
272
  fi
27
273
 
28
- NODE_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1)
29
- if [ "$NODE_VERSION" -lt 20 ]; then
30
- error "Node.js 20+ required. Found: $(node -v)"
274
+ # Fall back to uncompressed binary
275
+ info "Downloading standalone binary..."
276
+
277
+ if curl -fsSL "$uncompressed_url" -o "$target_path" 2>/dev/null; then
278
+ # Check file size - error pages are typically small (<1MB)
279
+ local file_size
280
+ file_size=$(stat -f%z "$target_path" 2>/dev/null || stat -c%s "$target_path" 2>/dev/null || echo "0")
281
+
282
+ if [ "$file_size" -gt 1000000 ]; then
283
+ chmod +x "$target_path"
284
+
285
+ # Verify the binary works
286
+ if "$target_path" --version &>/dev/null; then
287
+ success "Downloaded standalone agent-relay binary (no Node.js required!)"
288
+ trap - EXIT # Clear trap
289
+ return 0
290
+ else
291
+ warn "Downloaded binary failed verification"
292
+ rm -f "$target_path"
293
+ fi
294
+ else
295
+ info "Uncompressed binary not available (file too small: ${file_size} bytes)"
296
+ rm -f "$target_path"
297
+ fi
31
298
  fi
32
- info "Node.js $(node -v) detected"
299
+
300
+ trap - EXIT # Clear trap
301
+ info "No standalone binary available for $PLATFORM, falling back to npm"
302
+ return 1
33
303
  }
34
304
 
35
- install_source() {
36
- info "Installing from source..."
37
- mkdir -p "$INSTALL_DIR" "$BIN_DIR"
305
+ # Install via npm (fallback or primary method)
306
+ install_via_npm() {
307
+ step "Installing via npm..."
308
+
309
+ if ! check_node; then
310
+ error "Node.js 18+ is required for npm installation. Please install Node.js first:
311
+
312
+ macOS: brew install node
313
+ Linux: curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt-get install -y nodejs
314
+
315
+ Or use nvm: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash"
316
+ fi
317
+
318
+ # Install agent-relay globally
319
+ info "Installing agent-relay..."
320
+
321
+ # Try installation - capture output and exit code separately
322
+ local npm_log="/tmp/npm-install-$$.log"
323
+ local npm_exit=0
324
+
325
+ npm install -g agent-relay@"$VERSION" > "$npm_log" 2>&1 || npm_exit=$?
326
+
327
+ if [ $npm_exit -ne 0 ]; then
328
+ # First attempt failed, try without version
329
+ npm install -g agent-relay >> "$npm_log" 2>&1 || npm_exit=$?
330
+ fi
331
+
332
+ if [ $npm_exit -ne 0 ]; then
333
+ # Show the error output
334
+ cat "$npm_log"
335
+
336
+ # Check if it's a native module compilation failure
337
+ if grep -q "Unable to detect compiler type\|node-gyp\|prebuild-install\|gyp ERR" "$npm_log" 2>/dev/null; then
338
+ warn "Native module compilation failed. This is usually due to missing build tools."
339
+ echo ""
340
+ echo "Please install build tools and try again:"
341
+ echo ""
342
+ if [ "$OS" = "darwin" ]; then
343
+ echo " xcode-select --install"
344
+ elif command -v apt-get &> /dev/null; then
345
+ echo " sudo apt-get install build-essential python3"
346
+ elif command -v dnf &> /dev/null; then
347
+ echo " sudo dnf install gcc gcc-c++ make python3"
348
+ elif command -v apk &> /dev/null; then
349
+ echo " apk add build-base python3"
350
+ else
351
+ echo " Install gcc, g++, make, and python3"
352
+ fi
353
+ echo ""
354
+ echo "Retrying installation with optional native modules disabled..."
355
+ if npm install -g --ignore-scripts agent-relay@"$VERSION" 2>/dev/null || npm install -g --ignore-scripts agent-relay 2>/dev/null; then
356
+ warn "Installed with native module compilation skipped"
357
+ rm -f "$npm_log"
358
+ else
359
+ rm -f "$npm_log"
360
+ error "Installation failed. Please install build tools and try again."
361
+ fi
362
+ else
363
+ rm -f "$npm_log"
364
+ error "npm installation failed. Please check the error messages above."
365
+ fi
366
+ else
367
+ rm -f "$npm_log"
368
+ fi
369
+
370
+ # Install dashboard if not skipped
371
+ if [ "${AGENT_RELAY_NO_DASHBOARD}" != "true" ]; then
372
+ # Try binary first, fall back to npm
373
+ if ! download_dashboard_binary; then
374
+ info "Installing dashboard via npm..."
375
+ npm install -g @agent-relay/dashboard-server 2>/dev/null || true
376
+ fi
377
+ fi
378
+
379
+ success "Installed via npm"
380
+ }
381
+
382
+ # Install from source (for development or when npm fails)
383
+ install_from_source() {
384
+ step "Installing from source..."
385
+
386
+ if ! check_node; then
387
+ error "Node.js 18+ is required for source installation"
388
+ fi
389
+
390
+ mkdir -p "$INSTALL_DIR"
38
391
 
39
392
  if command -v git &> /dev/null; then
40
- [ -d "$INSTALL_DIR/.git" ] && cd "$INSTALL_DIR" && git pull || git clone "https://github.com/$REPO.git" "$INSTALL_DIR"
393
+ if [ -d "$INSTALL_DIR/.git" ]; then
394
+ info "Updating existing installation..."
395
+ cd "$INSTALL_DIR" && git fetch && git checkout "v$VERSION" 2>/dev/null || git pull
396
+ else
397
+ info "Cloning repository..."
398
+ rm -rf "$INSTALL_DIR"
399
+ git clone --depth 1 --branch "v$VERSION" "https://github.com/$REPO_RELAY.git" "$INSTALL_DIR" 2>/dev/null || \
400
+ git clone --depth 1 "https://github.com/$REPO_RELAY.git" "$INSTALL_DIR"
401
+ fi
41
402
  else
42
- curl -fsSL "https://github.com/$REPO/archive/main.tar.gz" | tar -xz -C "$INSTALL_DIR" --strip-components=1
403
+ info "Downloading source tarball..."
404
+ curl -fsSL "https://github.com/$REPO_RELAY/archive/v$VERSION.tar.gz" -o /tmp/relay.tar.gz 2>/dev/null || \
405
+ curl -fsSL "https://github.com/$REPO_RELAY/archive/main.tar.gz" -o /tmp/relay.tar.gz
406
+ rm -rf "$INSTALL_DIR"
407
+ mkdir -p "$INSTALL_DIR"
408
+ tar -xzf /tmp/relay.tar.gz -C "$INSTALL_DIR" --strip-components=1
409
+ rm /tmp/relay.tar.gz
43
410
  fi
44
411
 
45
- cd "$INSTALL_DIR" && npm ci && npm rebuild better-sqlite3 && npm run build
412
+ cd "$INSTALL_DIR"
413
+
414
+ # Install dependencies and build
415
+ info "Installing dependencies..."
416
+ if command -v pnpm &> /dev/null; then
417
+ pnpm install --frozen-lockfile 2>/dev/null || pnpm install
418
+ else
419
+ npm ci 2>/dev/null || npm install
420
+ fi
46
421
 
47
- # Remove any existing symlink or file (old installs used symlinks which cause issues)
422
+ info "Building..."
423
+ npm run build
424
+
425
+ # Create wrapper script
426
+ mkdir -p "$BIN_DIR"
48
427
  rm -f "$BIN_DIR/agent-relay"
49
428
 
50
- # Create wrapper script that runs from install dir (for node_modules resolution)
51
429
  cat > "$BIN_DIR/agent-relay" << WRAPPER
52
430
  #!/usr/bin/env bash
53
- cd "$INSTALL_DIR" && exec node dist/cli/index.js "\$@"
431
+ cd "$INSTALL_DIR" && exec node dist/src/cli/index.js "\$@"
54
432
  WRAPPER
55
433
  chmod +x "$BIN_DIR/agent-relay"
56
434
 
57
- [[ ":$PATH:" != *":$BIN_DIR:"* ]] && warn "Add to PATH: export PATH=\"\$PATH:$BIN_DIR\""
58
- success "Installed to $INSTALL_DIR"
435
+ success "Installed from source"
436
+ }
437
+
438
+ # Setup PATH
439
+ setup_path() {
440
+ if [[ ":$PATH:" != *":$BIN_DIR:"* ]]; then
441
+ warn "Add to your PATH by running:"
442
+ echo ""
443
+ echo " export PATH=\"\$PATH:$BIN_DIR\""
444
+ echo ""
445
+ echo " # Or add to your shell profile:"
446
+ echo " echo 'export PATH=\"\$PATH:$BIN_DIR\"' >> ~/.bashrc # for bash"
447
+ echo " echo 'export PATH=\"\$PATH:$BIN_DIR\"' >> ~/.zshrc # for zsh"
448
+ echo ""
449
+ fi
450
+ }
451
+
452
+ # Verify installation
453
+ verify_installation() {
454
+ step "Verifying installation..."
455
+
456
+ # Check if agent-relay is available
457
+ if command -v agent-relay &> /dev/null; then
458
+ local installed_version=$(agent-relay --version 2>/dev/null || echo "unknown")
459
+ success "agent-relay $installed_version installed successfully!"
460
+ elif [ -x "$BIN_DIR/agent-relay" ]; then
461
+ local installed_version=$("$BIN_DIR/agent-relay" --version 2>/dev/null || echo "unknown")
462
+ success "agent-relay $installed_version installed to $BIN_DIR"
463
+ setup_path
464
+ else
465
+ error "Installation verification failed"
466
+ fi
59
467
  }
60
468
 
469
+ # Print usage instructions
470
+ print_usage() {
471
+ echo ""
472
+ echo -e "${BOLD}Quick Start:${NC}"
473
+ echo ""
474
+ echo " # Start the daemon with dashboard"
475
+ echo " agent-relay up --dashboard"
476
+ echo ""
477
+ echo " # Check status"
478
+ echo " agent-relay status"
479
+ echo ""
480
+ echo " # Open dashboard"
481
+ echo " open http://localhost:3888"
482
+ echo ""
483
+ echo " # Stop daemon"
484
+ echo " agent-relay down"
485
+ echo ""
486
+ echo -e "${BOLD}Documentation:${NC} https://github.com/AgentWorkforce/relay"
487
+ echo ""
488
+ }
489
+
490
+ # Main installation flow
61
491
  main() {
62
- echo -e "\n${YELLOW}⚡ Agent Relay${NC} Installer\n"
63
- check_requirements
64
- install_source
65
- echo -e "\nQuick Start:"
66
- echo -e " # Start the daemon"
67
- echo -e " agent-relay start -f"
68
- echo -e ""
69
- echo -e " # Wrap an agent (tmux mode is default)"
70
- echo -e " agent-relay wrap -n MyAgent \"claude\""
71
- echo -e ""
72
- echo -e " # Open the dashboard"
73
- echo -e " agent-relay dashboard"
74
- echo -e ""
492
+ echo ""
493
+ echo -e "${YELLOW}${BOLD}⚡ Agent Relay${NC} Installer"
494
+ echo ""
495
+
496
+ detect_platform
497
+ get_latest_version
498
+
499
+ # Try installation methods in order of preference:
500
+ # 1. Standalone binary (no dependencies required!)
501
+ # 2. npm (if Node.js available)
502
+ # 3. source (fallback)
503
+
504
+ # Try standalone binary first - works without Node.js
505
+ if download_standalone_binary; then
506
+ # Also download relay-pty binary if available
507
+ download_relay_pty || true
508
+ # Download dashboard-server binary if available
509
+ download_dashboard_binary || true
510
+ verify_installation && print_usage && exit 0
511
+ fi
512
+
513
+ # Fall back to npm if Node.js is available
514
+ if check_node; then
515
+ install_via_npm && verify_installation && print_usage && exit 0
516
+ warn "npm installation failed, trying source..."
517
+ install_from_source && verify_installation && print_usage && exit 0
518
+ else
519
+ echo ""
520
+ warn "No standalone binary available and Node.js not found."
521
+ echo ""
522
+ echo -e "${BOLD}Options:${NC}"
523
+ echo ""
524
+ echo " 1. Wait for standalone binaries (coming soon for your platform)"
525
+ echo ""
526
+ echo " 2. Install Node.js 18+ using one of these methods:"
527
+ echo ""
528
+ echo " # Using nvm (recommended - works on macOS and Linux)"
529
+ echo " curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash"
530
+ echo " source ~/.bashrc # or ~/.zshrc"
531
+ echo " nvm install 20"
532
+ echo ""
533
+
534
+ if [ "$OS" = "darwin" ]; then
535
+ echo " # macOS - Official installer"
536
+ echo " https://nodejs.org/en/download"
537
+ echo ""
538
+ echo " # macOS - via Homebrew (if installed)"
539
+ echo " brew install node"
540
+ elif [ "$OS" = "linux" ]; then
541
+ # Detect package manager
542
+ if command -v apt-get &> /dev/null; then
543
+ echo " # Ubuntu/Debian"
544
+ echo " curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -"
545
+ echo " sudo apt-get install -y nodejs"
546
+ elif command -v dnf &> /dev/null; then
547
+ echo " # Fedora/RHEL"
548
+ echo " sudo dnf install nodejs npm"
549
+ elif command -v pacman &> /dev/null; then
550
+ echo " # Arch Linux"
551
+ echo " sudo pacman -S nodejs npm"
552
+ elif command -v apk &> /dev/null; then
553
+ echo " # Alpine Linux"
554
+ echo " apk add nodejs npm"
555
+ else
556
+ echo " # Download from nodejs.org"
557
+ echo " https://nodejs.org/en/download"
558
+ fi
559
+ fi
560
+
561
+ echo ""
562
+ echo "Then re-run this installer."
563
+ exit 1
564
+ fi
75
565
  }
76
566
 
567
+ # Handle command line arguments
568
+ case "${1:-}" in
569
+ --help|-h)
570
+ echo "Agent Relay Installer"
571
+ echo ""
572
+ echo "Usage: curl -fsSL https://raw.githubusercontent.com/AgentWorkforce/relay/main/install.sh | bash"
573
+ echo ""
574
+ echo "Environment variables:"
575
+ echo " AGENT_RELAY_VERSION Specific version to install (default: latest)"
576
+ echo " AGENT_RELAY_INSTALL_DIR Installation directory (default: ~/.agent-relay)"
577
+ echo " AGENT_RELAY_BIN_DIR Binary directory (default: ~/.local/bin)"
578
+ echo " AGENT_RELAY_NO_DASHBOARD Skip dashboard installation (default: false)"
579
+ exit 0
580
+ ;;
581
+ --version|-v)
582
+ echo "Installer for Agent Relay"
583
+ echo "Repository: https://github.com/AgentWorkforce/relay"
584
+ exit 0
585
+ ;;
586
+ esac
587
+
77
588
  main "$@"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-relay",
3
- "version": "2.1.5",
3
+ "version": "2.1.7",
4
4
  "description": "Real-time agent-to-agent communication system",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -130,23 +130,23 @@
130
130
  },
131
131
  "homepage": "https://github.com/AgentWorkforce/relay#readme",
132
132
  "dependencies": {
133
- "@agent-relay/bridge": "2.1.5",
134
- "@agent-relay/config": "2.1.5",
135
- "@agent-relay/continuity": "2.1.5",
136
- "@agent-relay/daemon": "2.1.5",
137
- "@agent-relay/hooks": "2.1.5",
138
- "@agent-relay/mcp": "2.1.5",
139
- "@agent-relay/protocol": "2.1.5",
140
- "@agent-relay/resiliency": "2.1.5",
141
- "@agent-relay/sdk": "2.1.5",
142
- "@agent-relay/spawner": "2.1.5",
143
- "@agent-relay/state": "2.1.5",
144
- "@agent-relay/storage": "2.1.5",
145
- "@agent-relay/telemetry": "2.1.5",
146
- "@agent-relay/trajectory": "2.1.5",
147
- "@agent-relay/user-directory": "2.1.5",
148
- "@agent-relay/utils": "2.1.5",
149
- "@agent-relay/wrapper": "2.1.5",
133
+ "@agent-relay/bridge": "2.1.7",
134
+ "@agent-relay/config": "2.1.7",
135
+ "@agent-relay/continuity": "2.1.7",
136
+ "@agent-relay/daemon": "2.1.7",
137
+ "@agent-relay/hooks": "2.1.7",
138
+ "@agent-relay/mcp": "2.1.7",
139
+ "@agent-relay/protocol": "2.1.7",
140
+ "@agent-relay/resiliency": "2.1.7",
141
+ "@agent-relay/sdk": "2.1.7",
142
+ "@agent-relay/spawner": "2.1.7",
143
+ "@agent-relay/state": "2.1.7",
144
+ "@agent-relay/storage": "2.1.7",
145
+ "@agent-relay/telemetry": "2.1.7",
146
+ "@agent-relay/trajectory": "2.1.7",
147
+ "@agent-relay/user-directory": "2.1.7",
148
+ "@agent-relay/utils": "2.1.7",
149
+ "@agent-relay/wrapper": "2.1.7",
150
150
  "@modelcontextprotocol/sdk": "^1.0.0",
151
151
  "agent-trajectories": "^0.3.0",
152
152
  "chokidar": "^5.0.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/api-types",
3
- "version": "2.1.5",
3
+ "version": "2.1.7",
4
4
  "description": "Shared API types and Zod schemas for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",