.PHONY: infra infra-down devnats demo e2e test test-go test-web test-py gateway dispatcher mcp-go mcp-py mcp-py-setup web admin desktop desktop-build tidy

infra:        ## 启动基础设施 (NATS / Postgres / Redis / Milvus / Neo4j)
	docker compose up -d

infra-down:
	docker compose down

devnats:      ## 启动内嵌 JetStream NATS（无 Docker 本地联调）
	cd sundynix-shared && go run ./cmd/devnats

demo:         ## 一键演示 Gateway→NATS→Dispatcher 任务流（无需 Docker）
	bash scripts/demo.sh

e2e:          ## 跑共享 bus 的端到端测试（内嵌 NATS）：任务流 / 工具调用 / Token 流
	cd sundynix-shared && go test ./bus/ -run 'TestTaskRoundTrip|TestToolCallRoundTrip|TestTokenStreamRoundTrip' -v

test: test-go test-web ## 跑全部测试（后端各模块 go test + 前端类型检查）

test-go:      ## 各 Go 模块单测（DB 集成测试无 MEMORY_TEST_DSN 自动跳过）
	cd sundynix-shared     && go test ./...
	cd sundynix-gateway    && go test ./...
	cd sundynix-dispatcher && go test ./...
	cd sundynix-mcp-go     && go test ./...

test-web:     ## 前端 TypeScript 类型检查
	cd sundynix-desktop/frontend && npx tsc --noEmit

test-py:      ## mcp-py 沙箱守卫测试（需 venv；缺 pytest 用内置 harness 兜底）
	cd sundynix-mcp-py && ( PYTHONPATH=src:tests .venv/bin/python -m pytest tests/ -q 2>/dev/null \
		|| PYTHONPATH=src:tests .venv/bin/python -c "import test_sandbox as t; \
fns=[getattr(t,n) for n in dir(t) if n.startswith('test_')]; \
[ (f(),print('PASS',f.__name__)) for f in fns ]; print(f'{len(fns)} passed')" )

gateway:
	cd sundynix-gateway && go run ./cmd/server

dispatcher:
	cd sundynix-dispatcher && go run ./cmd/dispatcher

mcp-go:
	cd sundynix-mcp-go && go run ./cmd/server

mcp-py-setup: ## 创建 venv 并安装 mcp-py 依赖（首次运行 mcp-py 前执行）
	cd sundynix-mcp-py && python3 -m venv .venv && .venv/bin/pip install -q -e .

mcp-py:       ## 运行 Python 算法型 MCP 工具服务（缺 venv 则自动 setup）
	cd sundynix-mcp-py && [ -x .venv/bin/python ] || $(MAKE) mcp-py-setup
	cd sundynix-mcp-py && .venv/bin/python -m sundynix_mcp_py.main

web:          ## 桌面端前端 dev（Vite :5173，连本地 Gateway:8080）
	cd sundynix-desktop/frontend && npm install && npm run dev

admin:        ## 运维控制台 dev（Vite :5174，配置 LLM 模型等控制面）
	cd sundynix-admin && npm install && npm run dev

desktop:       ## 真实桌面端开发模式（Wails 原生窗口 + 热重载；需先 make infra + 后端 + 配模型）
	cd sundynix-desktop && GOWORK=off wails dev

desktop-build: ## 打包桌面端为原生应用（产物在 sundynix-desktop/build/bin/）
	cd sundynix-desktop && GOWORK=off wails build

tidy:
	cd sundynix-gateway    && go mod tidy
	cd sundynix-dispatcher && go mod tidy
	cd sundynix-mcp-go     && go mod tidy
