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.
- package/README.md +91 -234
- package/dist/index.cjs +153 -25
- package/dist/src/cli/commands/doctor.d.ts.map +1 -1
- package/dist/src/cli/commands/doctor.js +32 -7
- package/dist/src/cli/commands/doctor.js.map +1 -1
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +260 -27
- package/dist/src/cli/index.js.map +1 -1
- package/install.sh +545 -34
- package/package.json +18 -18
- package/packages/api-types/package.json +1 -1
- package/packages/benchmark/package.json +4 -4
- package/packages/bridge/package.json +8 -8
- package/packages/cli-tester/package.json +1 -1
- package/packages/config/package.json +2 -2
- package/packages/continuity/package.json +2 -2
- package/packages/daemon/dist/server.d.ts +5 -0
- package/packages/daemon/dist/server.d.ts.map +1 -1
- package/packages/daemon/dist/server.js +76 -4
- package/packages/daemon/dist/server.js.map +1 -1
- package/packages/daemon/package.json +12 -12
- package/packages/daemon/src/server.ts +79 -4
- package/packages/hooks/package.json +4 -4
- package/packages/mcp/dist/bin.js +34 -3
- package/packages/mcp/dist/bin.js.map +1 -1
- package/packages/mcp/dist/cloud.d.ts +7 -114
- package/packages/mcp/dist/cloud.d.ts.map +1 -1
- package/packages/mcp/dist/cloud.js +21 -431
- package/packages/mcp/dist/cloud.js.map +1 -1
- package/packages/mcp/dist/errors.d.ts +4 -22
- package/packages/mcp/dist/errors.d.ts.map +1 -1
- package/packages/mcp/dist/errors.js +4 -43
- package/packages/mcp/dist/errors.js.map +1 -1
- package/packages/mcp/dist/hybrid-client.d.ts.map +1 -1
- package/packages/mcp/dist/hybrid-client.js +7 -1
- package/packages/mcp/dist/hybrid-client.js.map +1 -1
- package/packages/mcp/dist/install.d.ts.map +1 -1
- package/packages/mcp/dist/install.js +7 -8
- package/packages/mcp/dist/install.js.map +1 -1
- package/packages/mcp/package.json +4 -3
- package/packages/mcp/src/bin.ts +39 -3
- package/packages/mcp/src/cloud.ts +29 -511
- package/packages/mcp/src/errors.ts +12 -49
- package/packages/mcp/src/hybrid-client.ts +8 -1
- package/packages/mcp/src/install.ts +7 -8
- package/packages/mcp/tests/discover.test.ts +72 -11
- package/packages/memory/package.json +2 -2
- package/packages/policy/package.json +2 -2
- package/packages/protocol/dist/types.d.ts +17 -1
- package/packages/protocol/dist/types.d.ts.map +1 -1
- package/packages/protocol/package.json +1 -1
- package/packages/protocol/src/types.ts +23 -0
- package/packages/resiliency/package.json +1 -1
- package/packages/sdk/dist/browser-client.d.ts +212 -0
- package/packages/sdk/dist/browser-client.d.ts.map +1 -0
- package/packages/sdk/dist/browser-client.js +750 -0
- package/packages/sdk/dist/browser-client.js.map +1 -0
- package/packages/sdk/dist/browser-framing.d.ts +46 -0
- package/packages/sdk/dist/browser-framing.d.ts.map +1 -0
- package/packages/sdk/dist/browser-framing.js +122 -0
- package/packages/sdk/dist/browser-framing.js.map +1 -0
- package/packages/sdk/dist/client.d.ts +129 -2
- package/packages/sdk/dist/client.d.ts.map +1 -1
- package/packages/sdk/dist/client.js +312 -2
- package/packages/sdk/dist/client.js.map +1 -1
- package/packages/sdk/dist/discovery.d.ts +10 -0
- package/packages/sdk/dist/discovery.d.ts.map +1 -0
- package/packages/sdk/dist/discovery.js +22 -0
- package/packages/sdk/dist/discovery.js.map +1 -0
- package/packages/sdk/dist/errors.d.ts +9 -0
- package/packages/sdk/dist/errors.d.ts.map +1 -0
- package/packages/sdk/dist/errors.js +9 -0
- package/packages/sdk/dist/errors.js.map +1 -0
- package/packages/sdk/dist/index.d.ts +18 -2
- package/packages/sdk/dist/index.d.ts.map +1 -1
- package/packages/sdk/dist/index.js +27 -1
- package/packages/sdk/dist/index.js.map +1 -1
- package/packages/sdk/dist/transports/index.d.ts +92 -0
- package/packages/sdk/dist/transports/index.d.ts.map +1 -0
- package/packages/sdk/dist/transports/index.js +129 -0
- package/packages/sdk/dist/transports/index.js.map +1 -0
- package/packages/sdk/dist/transports/socket-transport.d.ts +30 -0
- package/packages/sdk/dist/transports/socket-transport.d.ts.map +1 -0
- package/packages/sdk/dist/transports/socket-transport.js +94 -0
- package/packages/sdk/dist/transports/socket-transport.js.map +1 -0
- package/packages/sdk/dist/transports/types.d.ts +69 -0
- package/packages/sdk/dist/transports/types.d.ts.map +1 -0
- package/packages/sdk/dist/transports/types.js +10 -0
- package/packages/sdk/dist/transports/types.js.map +1 -0
- package/packages/sdk/dist/transports/websocket-transport.d.ts +55 -0
- package/packages/sdk/dist/transports/websocket-transport.d.ts.map +1 -0
- package/packages/sdk/dist/transports/websocket-transport.js +180 -0
- package/packages/sdk/dist/transports/websocket-transport.js.map +1 -0
- package/packages/sdk/package.json +28 -4
- package/packages/sdk/src/browser-client.ts +985 -0
- package/packages/sdk/src/browser-framing.test.ts +115 -0
- package/packages/sdk/src/browser-framing.ts +150 -0
- package/packages/sdk/src/client.test.ts +425 -0
- package/packages/sdk/src/client.ts +397 -3
- package/packages/sdk/src/discovery.ts +38 -0
- package/packages/sdk/src/errors.ts +17 -0
- package/packages/sdk/src/index.ts +82 -1
- package/packages/sdk/src/transports/index.ts +197 -0
- package/packages/sdk/src/transports/socket-transport.ts +115 -0
- package/packages/sdk/src/transports/types.ts +77 -0
- package/packages/sdk/src/transports/websocket-transport.ts +245 -0
- package/packages/sdk/tsconfig.json +1 -1
- package/packages/spawner/package.json +1 -1
- package/packages/state/package.json +1 -1
- package/packages/storage/dist/sqlite-adapter.d.ts +1 -0
- package/packages/storage/dist/sqlite-adapter.d.ts.map +1 -1
- package/packages/storage/dist/sqlite-adapter.js +31 -3
- package/packages/storage/dist/sqlite-adapter.js.map +1 -1
- package/packages/storage/package.json +2 -2
- package/packages/storage/src/jsonl-adapter.test.ts +8 -3
- package/packages/storage/src/sqlite-adapter.ts +34 -6
- package/packages/telemetry/package.json +1 -1
- package/packages/trajectory/package.json +2 -2
- package/packages/user-directory/package.json +2 -2
- package/packages/utils/dist/cjs/discovery.js +328 -0
- package/packages/utils/dist/cjs/errors.js +81 -0
- package/packages/utils/dist/discovery.d.ts +123 -0
- package/packages/utils/dist/discovery.d.ts.map +1 -0
- package/packages/utils/dist/discovery.js +439 -0
- package/packages/utils/dist/discovery.js.map +1 -0
- package/packages/utils/dist/errors.d.ts +29 -0
- package/packages/utils/dist/errors.d.ts.map +1 -0
- package/packages/utils/dist/errors.js +50 -0
- package/packages/utils/dist/errors.js.map +1 -0
- package/packages/utils/package.json +15 -2
- package/packages/utils/src/consolidation.test.ts +125 -0
- package/packages/utils/src/discovery.test.ts +196 -0
- package/packages/utils/src/discovery.ts +524 -0
- package/packages/utils/src/errors.test.ts +83 -0
- package/packages/utils/src/errors.ts +56 -0
- package/packages/wrapper/dist/relay-pty-orchestrator.d.ts.map +1 -1
- package/packages/wrapper/dist/relay-pty-orchestrator.js +12 -0
- package/packages/wrapper/dist/relay-pty-orchestrator.js.map +1 -1
- package/packages/wrapper/package.json +6 -6
- 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/
|
|
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
|
-
|
|
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}[
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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" ]
|
|
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
|
-
|
|
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"
|
|
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
|
-
|
|
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
|
-
|
|
58
|
-
|
|
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
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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.
|
|
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.
|
|
134
|
-
"@agent-relay/config": "2.1.
|
|
135
|
-
"@agent-relay/continuity": "2.1.
|
|
136
|
-
"@agent-relay/daemon": "2.1.
|
|
137
|
-
"@agent-relay/hooks": "2.1.
|
|
138
|
-
"@agent-relay/mcp": "2.1.
|
|
139
|
-
"@agent-relay/protocol": "2.1.
|
|
140
|
-
"@agent-relay/resiliency": "2.1.
|
|
141
|
-
"@agent-relay/sdk": "2.1.
|
|
142
|
-
"@agent-relay/spawner": "2.1.
|
|
143
|
-
"@agent-relay/state": "2.1.
|
|
144
|
-
"@agent-relay/storage": "2.1.
|
|
145
|
-
"@agent-relay/telemetry": "2.1.
|
|
146
|
-
"@agent-relay/trajectory": "2.1.
|
|
147
|
-
"@agent-relay/user-directory": "2.1.
|
|
148
|
-
"@agent-relay/utils": "2.1.
|
|
149
|
-
"@agent-relay/wrapper": "2.1.
|
|
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",
|