Update project files and clean up temp_verif directory

This commit is contained in:
toki 2026-05-28 14:42:55 +09:00
parent 63d69f2957
commit 86311b2d54
11 changed files with 112 additions and 342 deletions

5
.gitignore vendored
View file

@ -7,8 +7,13 @@ agent-ops/rules/private/
/*.log
/dist/
/.env
/temp_verif/
/bin/control-plane
/bin/edge
/bin/iop-control-plane
/bin/iop-edge
/bin/iop-node
/bin/iop-worker
/bin/node
/bin/worker

View file

@ -1,14 +1,19 @@
.PHONY: all build tidy test test-e2e test-openai-ollama proto proto-dart portal-test portal-build-web clean
.PHONY: all build build-edge build-node tidy test test-e2e test-openai-ollama proto proto-dart portal-test portal-build-web clean
GOFLAGS ?= -trimpath
BUILD_APPS ?= edge node
LOCAL_BIN_DIR ?= bin
all: build
build:
go build $(GOFLAGS) -o bin/node ./apps/node/cmd/node
go build $(GOFLAGS) -o bin/edge ./apps/edge/cmd/edge
go build $(GOFLAGS) -o bin/control-plane ./apps/control-plane/cmd/control-plane
go build $(GOFLAGS) -o bin/worker ./apps/worker/cmd/worker
APPS="$(BUILD_APPS)" LOCAL_BIN_DIR="$(LOCAL_BIN_DIR)" GOFLAGS="$(GOFLAGS)" bin/build/field-binaries.sh
build-edge:
$(MAKE) build BUILD_APPS=edge
build-node:
$(MAKE) build BUILD_APPS=node
tidy:
go mod tidy
@ -71,4 +76,7 @@ portal-build-web:
--dart-define=IOP_CONTROL_PLANE_WIRE_URL=ws://localhost:19080/portal
clean:
rm -f bin/iop-edge bin/iop-node bin/iop-control-plane bin/iop-worker
rm -f bin/node bin/edge bin/control-plane bin/worker
rm -rf dist
rm -f iop.db

View file

@ -30,10 +30,10 @@ Edge가 제시한 bootstrap 명령 한 줄을 실행하면 Node binary 다운로
```bash
# 빌드
go build -o bin/node ./apps/node/cmd/node
make build-node
# 버전 확인
./bin/node version
./bin/iop-node version
# 저수준 직접 실행은 내부 진단에서만 사용한다.
```

View file

@ -5,6 +5,7 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
DIST_DIR="${DIST_DIR:-"$ROOT_DIR/dist/field"}"
TARGETS="${TARGETS:-}"
APPS="${APPS:-"edge node"}"
LOCAL_BIN_DIR="${LOCAL_BIN_DIR:-}"
CGO_ENABLED="${CGO_ENABLED:-0}"
GOFLAGS="${GOFLAGS:-"-trimpath"}"
@ -13,18 +14,23 @@ if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
Build field-deployable IOP edge/node binaries.
Usage:
bin/build/field-binaries.sh
make build
make build-edge
make build-node
This script is the build engine behind the Makefile targets.
Environment:
APPS="edge node" apps to build
TARGETS="linux/amd64 linux/arm64" GOOS/GOARCH target list
DIST_DIR=dist/field output directory
LOCAL_BIN_DIR=bin copy host-target binaries for local use
VERSION=<value> release version label
COMMIT=<value> commit label
BUILD_DATE=<value> build date label
ARTIFACT_BASE_URL=<url> default bootstrap artifact base URL
BOOTSTRAP_EDGE_ADDR=<host:port> default Edge address written to node.yaml
BOOTSTRAP_NODE_TOKEN=<token> optional fallback token baked into bootstrap script
ARTIFACT_BASE_URL=<url> default bootstrap artifact base URL
BOOTSTRAP_EDGE_ADDR=<host:port> default Edge address written to node.yaml
BOOTSTRAP_NODE_TOKEN=<token> optional fallback token baked into bootstrap script
CGO_ENABLED=0 Go CGO setting
GOFLAGS="-trimpath" extra go build flags
LDFLAGS="-s -w" linker flags
@ -40,6 +46,11 @@ LDFLAGS="${LDFLAGS:-"-s -w"}"
if [[ -z "$TARGETS" ]]; then
TARGETS="$(go env GOOS)/$(go env GOARCH)"
fi
HOST_TARGET="$(go env GOOS)/$(go env GOARCH)"
if [[ -n "$LOCAL_BIN_DIR" && "$LOCAL_BIN_DIR" != /* ]]; then
LOCAL_BIN_DIR="$ROOT_DIR/$LOCAL_BIN_DIR"
fi
checksum() {
if command -v sha256sum >/dev/null 2>&1; then
@ -163,6 +174,21 @@ EOF
chmod +x "$script"
}
sync_local_bin() {
local app="$1"
local goos="$2"
local goarch="$3"
local output_dir="$DIST_DIR/$VERSION/$goos-$goarch"
if [[ -z "$LOCAL_BIN_DIR" || "$goos/$goarch" != "$HOST_TARGET" ]]; then
return
fi
mkdir -p "$LOCAL_BIN_DIR"
cp "$output_dir/iop-$app" "$LOCAL_BIN_DIR/iop-$app"
chmod +x "$LOCAL_BIN_DIR/iop-$app"
}
for target in $TARGETS; do
IFS=/ read -r goos goarch extra <<< "$target"
if [[ -z "${goos:-}" || -z "${goarch:-}" || -n "${extra:-}" ]]; then
@ -172,7 +198,10 @@ for target in $TARGETS; do
for app in $APPS; do
case "$app" in
edge|node) build_one "$app" "$goos" "$goarch" ;;
edge|node)
build_one "$app" "$goos" "$goarch"
sync_local_bin "$app" "$goos" "$goarch"
;;
*)
echo "unsupported app '$app'; expected edge or node" >&2
exit 1
@ -181,12 +210,19 @@ for target in $TARGETS; do
done
output_dir="$DIST_DIR/$VERSION/$goos-$goarch"
present_apps=()
for app in edge node; do
if [[ -f "$output_dir/iop-$app" ]]; then
present_apps+=("$app")
fi
done
{
echo "version=$VERSION"
echo "commit=$COMMIT"
echo "build_date=$BUILD_DATE"
echo "target=$goos/$goarch"
echo "apps=$APPS"
echo "apps=${present_apps[*]:-}"
echo "updated_apps=$APPS"
} > "$output_dir/manifest.env"
(
cd "$output_dir"
@ -198,3 +234,6 @@ for target in $TARGETS; do
done
echo "field binaries written to $DIST_DIR/$VERSION"
if [[ -n "$LOCAL_BIN_DIR" ]]; then
echo "local host binaries synced to $LOCAL_BIN_DIR"
fi

View file

@ -8,9 +8,34 @@
- `node.yaml` 생성, 편집, 확인
- `edge.yaml``nodes[]` 수동 작성
- `iop-node serve --config ...` 직접 실행
- `bin/*` helper나 별도 dev deploy 바이너리를 공식 경로로 사용
- `bin/*.sh` helper나 별도 dev deploy 바이너리를 공식 경로로 사용
## 1. Bundle 디렉터리 준비
## 1. 빌드
공식 빌드 진입점은 `make build` 하나로 둔다.
이 명령은 Edge와 Node를 함께 빌드하고, 현재 host에서 바로 쓸 수 있는 바이너리를 `bin/`에 맞춰 둔다.
```bash
make build
```
Edge 또는 Node만 갱신할 때도 같은 빌드 통로를 사용한다.
```bash
make build-edge
make build-node
```
산출물:
```text
bin/iop-edge
bin/iop-node
dist/field/<version>/<goos>-<goarch>/iop-edge
dist/field/<version>/<goos>-<goarch>/iop-node
```
## 2. Bundle 디렉터리 준비
하나의 디렉터리에 `iop-edge``iop-node` 바이너리가 함께 있다고 가정한다.
@ -20,13 +45,21 @@
iop-node
```
이후 명령은 해당 디렉터리에서 실행한다.
repo-local 테스트는 `bin/`을 그대로 bundle 디렉터리로 사용할 수 있다.
```bash
cd bin
```
별도 디렉터리에서 테스트할 때는 repo root에서 빌드된 바이너리만 옮긴 뒤 그 디렉터리에서 실행한다.
```bash
mkdir -p /opt/iop-dev
cp bin/iop-edge bin/iop-node /opt/iop-dev/
cd /opt/iop-dev
```
## 2. Edge config 생성
## 3. Edge config 생성
```bash
./iop-edge config init
@ -35,13 +68,13 @@ cd /opt/iop-dev
기대 결과:
```text
/opt/iop-dev/edge.yaml
<bundle-dir>/edge.yaml
```
`edge.yaml`은 Control Plane이 없는 동안 테스트용 source of truth다.
처음부터 직접 작성하지 않고 `iop-edge`가 생성한 템플릿에서 시작한다.
## 3. 현재 환경 확인
## 4. 현재 환경 확인
```bash
./iop-edge env
@ -67,10 +100,10 @@ connected nodes
로그 기본 위치는 바이너리 디렉터리 아래다.
```text
/opt/iop-dev/logs/
<bundle-dir>/logs/
```
## 4. Node 등록과 bootstrap 출력
## 5. Node 등록과 bootstrap 출력
Node 정의는 `edge.yaml`을 직접 편집하지 않고 `iop-edge node register`로 만든다.
@ -99,7 +132,7 @@ curl -fsSL <bootstrap-url> | bash -s <generated-token>
사용자는 이 한 줄만 Node host에서 실행한다.
전달받은 명령에 `IOP_ARTIFACT_BASE_URL=`, `IOP_EDGE_ADDR=`, `IOP_NODE_TOKEN=` 같은 named parameter가 있으면 기본 경로가 아니다.
## 5. Config 검증
## 6. Config 검증
```bash
./iop-edge config check
@ -107,7 +140,7 @@ curl -fsSL <bootstrap-url> | bash -s <generated-token>
이 단계에서 `nodes[]` token/id/alias 충돌, adapter/runtime 설정 오류가 잡혀야 한다.
## 6. Edge 실행
## 7. Edge 실행
개발 중 foreground 실행:
@ -127,7 +160,7 @@ sudo ./iop-edge setup --enable --start
tail -f logs/edge.log
```
## 7. Node host에서 bootstrap 실행
## 8. Node host에서 bootstrap 실행
`iop-edge node register ...`가 출력한 한 줄을 Node host에서 그대로 실행한다.
@ -138,7 +171,7 @@ curl -fsSL <bootstrap-url> | bash -s <generated-token>
Node host 사용자는 `node.yaml`을 만들거나 편집하지 않는다.
Node 프로세스 실행 방식은 bootstrap 내부 구현 세부다.
## 8. 연결 확인
## 9. 연결 확인
Edge host에서 확인한다.
@ -152,7 +185,7 @@ OpenAI-compatible smoke:
./iop-edge smoke openai --model gemma4:26b
```
## 9. Cline 접속 정보 확인
## 10. Cline 접속 정보 확인
```bash
./iop-edge env
@ -168,7 +201,7 @@ API Key: ASCII 값
API Key에는 한글이나 non-ASCII 문자를 넣지 않는다.
## 10. 문제 발생 시 공유할 것
## 11. 문제 발생 시 공유할 것
```bash
./iop-edge env

View file

@ -1,45 +0,0 @@
edge:
id: "edge-verif"
name: "Verification Edge"
server:
listen: "127.0.0.1:39090"
tls:
enabled: false
logging:
level: "info"
pretty: true
metrics:
port: 39092
console:
adapter: "cli"
target: "antigravity"
session_id: "default"
background: false
timeout_sec: 300
nodes:
- id: "node-verif"
alias: "verif-node"
token: "changeme"
adapters:
cli:
enabled: true
profiles:
antigravity:
command: "agy"
args:
- "--dangerously-skip-permissions"
- "--print-timeout"
- "10m"
- "--print"
env: []
persistent: false
terminal: false
runtime:
concurrency: 4
workspace_root: "./temp_verif/workspace"

View file

@ -1,77 +0,0 @@
[edge] config=temp_verif/edge.yaml
{
"level": "info",
"ts": 1779366535.3162963,
"caller": "transport/server.go:83",
"msg": "edge listening for nodes",
"addr": "127.0.0.1:39090"
}
IOP Edge console listening on 127.0.0.1:39090
Console target node= adapter=cli target=antigravity session=default background=false
Start node.sh on another host, then type a message here.
Commands: /nodes, /node <id|alias>, /session <id>, /background on|off, /terminate-session, /status, /capabilities, /sessions, /transport, /exit
edge> {
"level": "info",
"ts": 1779366536.616124,
"caller": "transport/server.go:117",
"msg": "node connection established"
}
{
"level": "info",
"ts": 1779366537.118941,
"caller": "transport/server.go:117",
"msg": "node connection established"
}
{
"level": "info",
"ts": 1779366537.1195345,
"caller": "transport/server.go:192",
"msg": "node registered",
"node_id": "node-verif",
"alias": "verif-node"
}
[node0-evt] connected reason="registered"
node0 = node-verif (verif-node)
edge> [edge] sent run_id=manual-1779366543589159719 node=node0 adapter=cli target=antigravity session=default background=false
[node0-evt] start run_id=manual-1779366543589159719
[node0-msg] Authentication required. Please visit the URL to log in:
[node0-msg] https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com&code_challenge=C8VcdSBSP64hQeGimRuJ-VH34YdAP7mMZlKiQ5-TrBg&code_challenge_method=S256&prompt=consent&redirect_uri=https%3A%2F%2Fantigravity.google%2Foauth-callback&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcclog+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fexperimentsandconfigs+openid&state=ZTE7OrbNMGVnaPXAzzOcJQ
[node0-msg]
[node0-msg] Waiting for authentication (timeout 30s)...
[node0-msg] Or, paste the authorization code here and press Enter:
[node0-msg] Error: authentication timed out.
[node0-evt] complete run_id=manual-1779366543589159719 detail="cli execution complete"
edge> [edge] sent run_id=manual-1779366578590797138 node=node0 adapter=cli target=antigravity session=default background=false
[node0-evt] start run_id=manual-1779366578590797138
[node0-msg] Authentication required. Please visit the URL to log in:
[node0-msg] https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com&code_challenge=0hmWMghcYF6wt8MhvqSHjUO0gadA8BHNjhbN9rQtZ-E&code_challenge_method=S256&prompt=consent&redirect_uri=https%3A%2F%2Fantigravity.google%2Foauth-callback&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcclog+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fexperimentsandconfigs+openid&state=XFuTWUDeErVPLFR1pWaO5g
[node0-msg]
[node0-msg] Waiting for authentication (timeout 30s)...
[node0-msg] Or, paste the authorization code here and press Enter:
[node0-msg] Error: authentication timed out.
[node0-evt] complete run_id=manual-1779366578590797138 detail="cli execution complete"
edge> [node0-capabilities] target=antigravity session=default
adapter = cli
max_concurrency = 4
targets = antigravity
edge> [node0-transport] target=antigravity session=default
adapter = cli
connected = true
node_id = node-verif
session_id = default
target = antigravity
edge> [node0-sessions] target=antigravity session=default
count = 0
sessions =
edge> [edge] sent command=status node=node0 adapter=cli target=antigravity session=default
error: node reported error: antigravity startup failed: timeout waiting for for shortcuts|Type your message
edge> bye
{
"level": "info",
"ts": 1779366639.6197438,
"caller": "transport/server.go:176",
"msg": "node unregistered",
"node_id": "node-verif",
"transport_close_reason": "local_close",
"transport_close_error": "read tcp 127.0.0.1:39090->127.0.0.1:57026: use of closed network connection"
}

View file

@ -1,14 +0,0 @@
transport:
edge_addr: "127.0.0.1:39090"
token: "changeme"
logging:
level: "info"
pretty: true
metrics:
port: 39091
node:
id: "node-verif"
alias: "verif-node"

View file

@ -1,115 +0,0 @@
[node] config=temp_verif/node.yaml
[node] waiting for edge at 127.0.0.1:39090 timeout=30s
[node] edge is reachable
[Fx] PROVIDE fx.Lifecycle <= go.uber.org/fx.New.func1()
[Fx] PROVIDE fx.Shutdowner <= go.uber.org/fx.(*App).shutdowner-fm()
[Fx] PROVIDE fx.DotGraph <= go.uber.org/fx.(*App).dotGraph-fm()
[Fx] PROVIDE *config.NodeConfig <= iop/apps/node/internal/bootstrap.Module.func1()
[Fx] PROVIDE *zap.Logger <= iop/apps/node/internal/bootstrap.Module.func2()
[Fx] INVOKE iop/apps/node/internal/bootstrap.Module.func3()
[Fx] RUN provide: go.uber.org/fx.New.func1()
[Fx] RUN provide: iop/apps/node/internal/bootstrap.Module.func1()
[Fx] RUN provide: iop/apps/node/internal/bootstrap.Module.func2()
[Fx] HOOK OnStart iop/apps/node/internal/bootstrap.Module.func3.1() executing (caller: iop/apps/node/internal/bootstrap.Module.func3)
{
"level": "info",
"ts": 1779366537.1199644,
"caller": "transport/client.go:67",
"msg": "registered with edge",
"node_id": "node-verif",
"alias": "verif-node"
}
{
"level": "info",
"ts": 1779366537.1240954,
"caller": "store/store.go:62",
"msg": "store ready",
"dsn": "file:temp_verif/workspace/iop.db?cache=shared&mode=rwc"
}
[Fx] HOOK OnStart iop/apps/node/internal/bootstrap.Module.func3.1() called by iop/apps/node/internal/bootstrap.Module.func3 ran successfully in 5.607916ms
[Fx] RUNNING
{
"level": "info",
"ts": 1779366543.5897276,
"caller": "node/node.go:61",
"msg": "run request received",
"run_id": "manual-1779366543589159719",
"adapter": "cli",
"target": "antigravity"
}
[edge-message] Convert this token to uppercase and reply with only the converted token: iop_antigravity_one
[node-event] start run_id=manual-1779366543589159719
[node-message] Authentication required. Please visit the URL to log in:
https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com&code_challenge=C8VcdSBSP64hQeGimRuJ-VH34YdAP7mMZlKiQ5-TrBg&code_challenge_method=S256&prompt=consent&redirect_uri=https%3A%2F%2Fantigravity.google%2Foauth-callback&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcclog+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fexperimentsandconfigs+openid&state=ZTE7OrbNMGVnaPXAzzOcJQ
Waiting for authentication (timeout 30s)...
Or, paste the authorization code here and press Enter:
Error: authentication timed out.
[node-event] complete run_id=manual-1779366543589159719 detail="cli execution complete"
{
"level": "info",
"ts": 1779366578.5910747,
"caller": "node/node.go:61",
"msg": "run request received",
"run_id": "manual-1779366578590797138",
"adapter": "cli",
"target": "antigravity"
}
[edge-message] Convert this token to uppercase and reply with only the converted token: iop_antigravity_two
[node-event] start run_id=manual-1779366578590797138
[node-message] Authentication required. Please visit the URL to log in:
https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com&code_challenge=0hmWMghcYF6wt8MhvqSHjUO0gadA8BHNjhbN9rQtZ-E&code_challenge_method=S256&prompt=consent&redirect_uri=https%3A%2F%2Fantigravity.google%2Foauth-callback&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcclog+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fexperimentsandconfigs+openid&state=XFuTWUDeErVPLFR1pWaO5g
Waiting for authentication (timeout 30s)...
Or, paste the authorization code here and press Enter:
Error: authentication timed out.
[node-event] complete run_id=manual-1779366578590797138 detail="cli execution complete"
{
"level": "info",
"ts": 1779366613.5935256,
"caller": "node/node.go:179",
"msg": "command request",
"request_id": "caps-1779366613593188043",
"type": "NODE_COMMAND_TYPE_CAPABILITIES",
"adapter": "cli",
"target": "antigravity"
}
{
"level": "info",
"ts": 1779366615.6012824,
"caller": "node/node.go:179",
"msg": "command request",
"request_id": "transport-1779366615598773752",
"type": "NODE_COMMAND_TYPE_TRANSPORT_STATUS",
"adapter": "cli",
"target": "antigravity"
}
{
"level": "info",
"ts": 1779366617.6029432,
"caller": "node/node.go:179",
"msg": "command request",
"request_id": "sessions-1779366617602482794",
"type": "NODE_COMMAND_TYPE_SESSION_LIST",
"adapter": "cli",
"target": "antigravity"
}
{
"level": "info",
"ts": 1779366619.6050475,
"caller": "node/node.go:179",
"msg": "command request",
"request_id": "status-1779366619604799045",
"type": "NODE_COMMAND_TYPE_USAGE_STATUS",
"adapter": "cli",
"target": "antigravity"
}
{
"level": "info",
"ts": 1779366639.61984,
"caller": "transport/session.go:89",
"msg": "disconnected from edge",
"transport_close_reason": "remote_closed",
"transport_close_error": "EOF"
}
[edge-event] disconnected reason="transport_closed" transport_close_reason="remote_closed" transport_close_error="EOF"

View file

@ -1,64 +0,0 @@
#!/usr/bin/env bash
set -x
mkdir -p temp_verif/workspace
rm -f temp_verif/edge_fifo
mkfifo temp_verif/edge_fifo
EDGE_OUT="temp_verif/edge_out"
NODE_OUT="temp_verif/node_out"
# Start edge with FIFO input
IOP_EDGE_CONFIG=temp_verif/edge.yaml ./bin/edge.sh < temp_verif/edge_fifo > "$EDGE_OUT" 2>&1 &
EDGE_PID=$!
exec 3> temp_verif/edge_fifo
sleep 2
# Start node
IOP_NODE_CONFIG=temp_verif/node.yaml ./bin/node.sh > "$NODE_OUT" 2>&1 &
NODE_PID=$!
sleep 5
# Send /nodes command
echo "/nodes" >&3
sleep 2
# Send first message
echo "Convert this token to uppercase and reply with only the converted token: iop_antigravity_one" >&3
# Wait for the authentication/login timeout (which is 30s) plus safety margin
sleep 35
# Send second message
echo "Convert this token to uppercase and reply with only the converted token: iop_antigravity_two" >&3
# Wait for the authentication/login timeout
sleep 35
# Send edge commands
echo "/capabilities" >&3
sleep 2
echo "/transport" >&3
sleep 2
echo "/sessions" >&3
sleep 2
echo "/status" >&3
sleep 2
# Exit
echo "/exit" >&3
sleep 2
exec 3>&-
wait $EDGE_PID || true
kill $NODE_PID 2>/dev/null || true
echo "=== EDGE OUTPUT ==="
cat "$EDGE_OUT"
echo "=== NODE OUTPUT ==="
cat "$NODE_OUT"

Binary file not shown.