#!/usr/bin/env bash # 无 Docker 的最小任务流演示:devnats(内嵌NATS) + gateway + dispatcher。 # 提交一个 DSL 任务,验证 Gateway → NATS → Dispatcher 全链路。 set -euo pipefail cd "$(dirname "$0")/.." mkdir -p .bin echo "== 编译 ==" ( cd sundynix-shared && go build -o ../.bin/devnats ./cmd/devnats ) ( cd sundynix-gateway && go build -o ../.bin/gateway ./cmd/server ) ( cd sundynix-dispatcher && go build -o ../.bin/dispatcher ./cmd/dispatcher ) cleanup() { kill "${GW_PID:-}" "${DISP_PID:-}" "${NATS_PID:-}" 2>/dev/null || true; } trap cleanup EXIT # 若 :4222 已有 NATS(docker compose 的容器),直接复用;否则起内嵌 devnats。 if nc -z 127.0.0.1 4222 2>/dev/null; then echo "== 检测到已运行的 NATS(:4222),复用之 ==" else echo "== 启动内嵌 devnats ==" .bin/devnats > .bin/devnats.log 2>&1 & NATS_PID=$! for _ in $(seq 1 30); do nc -z 127.0.0.1 4222 2>/dev/null && break || sleep 0.2; done fi echo "== 启动 dispatcher / gateway ==" .bin/dispatcher > .bin/dispatcher.log 2>&1 & DISP_PID=$! .bin/gateway > .bin/gateway.log 2>&1 & GW_PID=$! for _ in $(seq 1 30); do curl -s -o /dev/null http://127.0.0.1:8080/api/v1/billing && break || sleep 0.3 done echo "== 提交 DSL 任务 ==" RESP=$(curl -s -X POST http://127.0.0.1:8080/api/v1/tasks \ -H 'Content-Type: application/json' \ -d '{"nodes":[{"id":"n1","type":"agent","data":{"prompt":"hello"}}],"edges":[]}') echo "$RESP" TASK_ID=$(echo "$RESP" | sed -n 's/.*"task_id":"\([^"]*\)".*/\1/p') echo "== 订阅 SSE Token 流 (Gateway ← NATS ← Dispatcher) ==" # 客户端在 TTFT(700ms) 内连上即可收全部 token;--max-time 超时(exit 28) 属正常,不让 set -e 中断 curl -sN --max-time 10 "http://127.0.0.1:8080/api/v1/tasks/$TASK_ID/stream" || true echo echo "== dispatcher 日志 ==" cat .bin/dispatcher.log