fix(server): return version details in health and shutdown endpoints
This commit is contained in:
1 parent
4cb76725fe
commit
cb39f94584
4 files changed
+35
-11
No files matched your search
@@ -35,7 +35,7 @@ deploy-win: deploy-server deploy-stub-win deploy-nvim-win deploy-rules-win
|
|||||||
# Stop the background server
|
# Stop the background server
|
||||||
stop port="3000":
|
stop port="3000":
|
||||||
@Write-Host "Shutting down MCP server gracefully on port {{port}}..." -ForegroundColor Cyan
|
@Write-Host "Shutting down MCP server gracefully on port {{port}}..." -ForegroundColor Cyan
|
||||||
-& { $token = Get-Content "$env:USERPROFILE\.gemini\mcp_memory\admin.token" -ErrorAction SilentlyContinue; if ($token) { $hdr = @{ Authorization = "Bearer $($token.Trim())" }; Invoke-RestMethod -Uri "http://127.0.0.1:{{port}}/shutdown" -Method Post -Headers $hdr -ErrorAction SilentlyContinue } else { Invoke-RestMethod -Uri "http://127.0.0.1:{{port}}/shutdown" -Method Post -ErrorAction SilentlyContinue }; $stopped = $false; for ($i = 1; $i -le 10; $i++) { $conn = Get-NetTCPConnection -LocalPort {{port}} -State Listen -ErrorAction SilentlyContinue; $proc = Get-Process mcp-memory-server -ErrorAction SilentlyContinue; if (-not $conn -and -not $proc) { $stopped = $true; Write-Host '✅ Server process and port {{port}} fully terminated.' -ForegroundColor Green; break }; Start-Sleep -Seconds 1 }; if (-not $stopped) { Write-Host '⚠️ Server process did not exit within 10s. Force killing process...' -ForegroundColor Yellow; Get-Process mcp-memory-server -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue; Get-NetTCPConnection -LocalPort {{port}} -State Listen -ErrorAction SilentlyContinue | Select-Object -ExpandProperty OwningProcess | ForEach-Object { Stop-Process -Id $_ -Force -ErrorAction SilentlyContinue }; Start-Sleep -Seconds 2 } }
|
-& { $token = Get-Content "$env:USERPROFILE\.gemini\mcp_memory\admin.token" -ErrorAction SilentlyContinue; if ($token) { $hdr = @{ Authorization = "Bearer $($token.Trim())" }; $res = Invoke-RestMethod -Uri "http://127.0.0.1:{{port}}/shutdown" -Method Post -Headers $hdr -ErrorAction SilentlyContinue } else { $res = Invoke-RestMethod -Uri "http://127.0.0.1:{{port}}/shutdown" -Method Post -ErrorAction SilentlyContinue }; if ($res) { Write-Host "✅ Shutdown acknowledged with version details:" -ForegroundColor Green; $res | ConvertTo-Json -Depth 5 }; $stopped = $false; for ($i = 1; $i -le 10; $i++) { $conn = Get-NetTCPConnection -LocalPort {{port}} -State Listen -ErrorAction SilentlyContinue; $proc = Get-Process mcp-memory-server -ErrorAction SilentlyContinue; if (-not $conn -and -not $proc) { $stopped = $true; Write-Host '✅ Server process and port {{port}} fully terminated.' -ForegroundColor Green; break }; Start-Sleep -Seconds 1 }; if (-not $stopped) { Write-Host '⚠️ Server process did not exit within 10s. Force killing process...' -ForegroundColor Yellow; Get-Process mcp-memory-server -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue; Get-NetTCPConnection -LocalPort {{port}} -State Listen -ErrorAction SilentlyContinue | Select-Object -ExpandProperty OwningProcess | ForEach-Object { Stop-Process -Id $_ -Force -ErrorAction SilentlyContinue }; Start-Sleep -Seconds 2 } }
|
||||||
@Write-Host "✅ Shutdown complete. Port {{port}} and process are free." -ForegroundColor Green
|
@Write-Host "✅ Shutdown complete. Port {{port}} and process are free." -ForegroundColor Green
|
||||||
|
|
||||||
# Start the server in the background (nohup equivalent)
|
# Start the server in the background (nohup equivalent)
|
||||||
|
|||||||
+10
-2
@@ -104,8 +104,16 @@ pub async fn gate_set_handler(
|
|||||||
Ok((axum::http::StatusCode::OK, "Gate state updated."))
|
Ok((axum::http::StatusCode::OK, "Gate state updated."))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn health_handler() -> &'static str {
|
pub async fn health_handler() -> impl IntoResponse {
|
||||||
"OK"
|
axum::Json(serde_json::json!({
|
||||||
|
"status": "ok",
|
||||||
|
"version": {
|
||||||
|
"app_version": env!("APP_VERSION"),
|
||||||
|
"cargo_pkg_version": env!("CARGO_PKG_VERSION"),
|
||||||
|
"target_os": std::env::consts::OS,
|
||||||
|
"target_arch": std::env::consts::ARCH,
|
||||||
|
}
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|||||||
+11
-1
@@ -143,7 +143,17 @@ pub fn create_router(app_state: Arc<AppState>) -> Router {
|
|||||||
std::process::exit(0);
|
std::process::exit(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
(axum::http::StatusCode::OK, "Shutting down...").into_response()
|
axum::Json(serde_json::json!({
|
||||||
|
"status": "shutting_down",
|
||||||
|
"message": "MCP Memory Server gracefully shutting down.",
|
||||||
|
"version_details": {
|
||||||
|
"app_version": env!("APP_VERSION"),
|
||||||
|
"cargo_pkg_version": env!("CARGO_PKG_VERSION"),
|
||||||
|
"target_os": std::env::consts::OS,
|
||||||
|
"target_arch": std::env::consts::ARCH,
|
||||||
|
"shutdown_checkpoint": format!("chk_shutdown_{}", now)
|
||||||
|
}
|
||||||
|
})).into_response()
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1142,12 +1142,18 @@
|
|||||||
if (!feed) return;
|
if (!feed) return;
|
||||||
feed.innerHTML = '';
|
feed.innerHTML = '';
|
||||||
|
|
||||||
// Sort history by timestamp descending so newest entries are at top
|
// Helper to normalize timestamp to epoch milliseconds
|
||||||
const sorted = [...history].sort((a, b) => {
|
const getMillis = (item) => {
|
||||||
const tA = (typeof a === 'object' && a) ? (a.timestamp || a.time || 0) : 0;
|
if (!item || typeof item !== 'object') return 0;
|
||||||
const tB = (typeof b === 'object' && b) ? (b.timestamp || b.time || 0) : 0;
|
let val = item.timestamp || item.time || item.updated_at || 0;
|
||||||
return tB - tA;
|
if (typeof val === 'number' && val < 10000000000) {
|
||||||
});
|
val = val * 1000;
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Sort history by normalized timestamp descending so newest entries are always at top
|
||||||
|
const sorted = [...history].sort((a, b) => getMillis(b) - getMillis(a));
|
||||||
|
|
||||||
sorted.forEach(item => {
|
sorted.forEach(item => {
|
||||||
const div = document.createElement('div');
|
const div = document.createElement('div');
|
||||||
@@ -1396,7 +1402,7 @@
|
|||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
const verEl = document.getElementById('app-version');
|
const verEl = document.getElementById('app-version');
|
||||||
if (verEl) {
|
if (verEl) {
|
||||||
verEl.textContent = `v${data.version}`;
|
verEl.innerHTML = `<span style="background:var(--card-bg); border:1px solid var(--border-color); color:var(--text-secondary); padding:3px 10px; border-radius:12px; font-size:0.85em; font-weight:600; font-family:monospace;">v${data.version}</span>`;
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error("Failed to load version", err);
|
console.error("Failed to load version", err);
|
||||||
|
|||||||
Reference in new issue
Block a user