diff --git a/ai-hub/app/api/routes/nodes.py b/ai-hub/app/api/routes/nodes.py index dddf326..1f85d57 100644 --- a/ai-hub/app/api/routes/nodes.py +++ b/ai-hub/app/api/routes/nodes.py @@ -421,7 +421,7 @@ """ _require_admin(admin_id, db) node = _get_node_or_404(node_id, db) - config_yaml = _generate_node_config_yaml(node) + config_yaml = _generate_node_config_yaml(node, None, db) return schemas.NodeConfigYamlResponse(node_id=node_id, config_yaml=config_yaml) @router.get("/provision/{node_id}", summary="Headless Provisioning Script (Python)") def provision_node(node_id: str, token: str, request: Request, db: Session = Depends(get_db)): @@ -436,7 +436,7 @@ if not node or node.invite_token != token: raise HTTPException(status_code=403, detail="Invalid node or token.") - config_yaml = _generate_node_config_yaml(node) + config_yaml = _generate_node_config_yaml(node, None, db) base_url = f"{request.url.scheme}://{request.url.netloc}" script = services.mesh_service.generate_provisioning_script(node, config_yaml, base_url) @@ -454,7 +454,7 @@ if not node or node.invite_token != token: raise HTTPException(status_code=403, detail="Invalid node or token.") - config_yaml = _generate_node_config_yaml(node) + config_yaml = _generate_node_config_yaml(node, None, db) base_url = f"{request.url.scheme}://{request.url.netloc}" script = services.mesh_service.generate_provisioning_sh(node, config_yaml, base_url) @@ -482,7 +482,7 @@ raise HTTPException(status_code=404, detail=f"Binary for {arch} is not compiled on hub.") # 2. Generate config - config_yaml = _generate_node_config_yaml(node) + config_yaml = _generate_node_config_yaml(node, None, db) # 3. Create ZIP in memory zip_buffer = io.BytesIO() @@ -540,7 +540,7 @@ _require_admin(admin_id, db) node = _get_node_or_404(node_id, db) - config_yaml = _generate_node_config_yaml(node) + config_yaml = _generate_node_config_yaml(node, None, db) # Create ZIP in memory zip_buffer = io.BytesIO() @@ -1124,11 +1124,22 @@ # Helpers # =========================================================================== -def _generate_node_config_yaml(node: models.AgentNode, skill_overrides: dict = None) -> str: +def _generate_node_config_yaml(node: models.AgentNode, skill_overrides: dict = None, db: Session = None) -> str: """Helper to generate the agent_config.yaml content.""" + + # Defaults hub_url = os.getenv("HUB_PUBLIC_URL", "http://127.0.0.1:8000") - # Preserve the gRPC endpoint as-is from environment hub_grpc = os.getenv("HUB_GRPC_ENDPOINT", "127.0.0.1:50051") + + # Overlay with dynamically configured Swarm Admin settings if available + if db: + swarm_setting = db.query(models.SystemSettings).filter_by(key="swarm").first() + if swarm_setting and isinstance(swarm_setting.value, dict): + if swarm_setting.value.get("external_endpoint"): + hub_url = swarm_setting.value.get("external_endpoint") + if swarm_setting.value.get("grpc_endpoint"): + hub_grpc = swarm_setting.value.get("grpc_endpoint") + secret_key = os.getenv("SECRET_KEY", "dev-secret-key-1337") diff --git a/ai-hub/app/core/templates/provisioning/provision.sh.j2 b/ai-hub/app/core/templates/provisioning/provision.sh.j2 index d7165b4..0cdff6c 100644 --- a/ai-hub/app/core/templates/provisioning/provision.sh.j2 +++ b/ai-hub/app/core/templates/provisioning/provision.sh.j2 @@ -32,7 +32,8 @@ # 2. Write agent_config.yaml echo "[*] Writing configuration..." -cat > agent_config.yaml << 'EOF' +mkdir -p "$HOME/.cortex" +cat > "$HOME/.cortex/agent.yaml" << 'EOF' {{ config_yaml }} EOF diff --git a/ai-hub/app/core/templates/provisioning/start_daemon.sh.j2 b/ai-hub/app/core/templates/provisioning/start_daemon.sh.j2 index 4335a72..b36d14d 100644 --- a/ai-hub/app/core/templates/provisioning/start_daemon.sh.j2 +++ b/ai-hub/app/core/templates/provisioning/start_daemon.sh.j2 @@ -12,7 +12,7 @@ # 2. Copy binary and config into installation directory cp cortex-agent "$INSTALL_DIR/cortex-agent" -cp agent_config.yaml "$INSTALL_DIR/agent_config.yaml" +cp agent_config.yaml "$HOME/.cortex/agent.yaml" chmod +x "$INSTALL_DIR/cortex-agent" if [ "$OS" = "darwin" ]; then diff --git a/frontend/src/features/settings/components/cards/NetworkIdentityCard.js b/frontend/src/features/settings/components/cards/NetworkIdentityCard.js index ec88dd8..db373a9 100644 --- a/frontend/src/features/settings/components/cards/NetworkIdentityCard.js +++ b/frontend/src/features/settings/components/cards/NetworkIdentityCard.js @@ -240,8 +240,8 @@
Protocol (http/https) implicitly determines TLS mode.
+ +Auto-detected provisioning discovery endpoint.
setAdminConfig({...adminConfig, swarm: {...adminConfig.swarm, external_endpoint: e.target.value}})} className={inputClass} - placeholder="https://swarm.example.com:443" + placeholder="https://ai.jerxie.com" + autoComplete="off" + /> +The precise Domain:Port agents use for high-throughput streaming over HTTP/2.
+ setAdminConfig({...adminConfig, swarm: {...adminConfig.swarm, grpc_endpoint: e.target.value}})} + className={inputClass} + placeholder="ai.jerxie.com:443" autoComplete="off" />