Returns a version-update warning if a newer release is available. Results are cached for `VERSION_CHECK_INTERVAL` (15 minutes).
(&self)
| 1563 | /// Returns a version-update warning if a newer release is available. |
| 1564 | /// Results are cached for `VERSION_CHECK_INTERVAL` (15 minutes). |
| 1565 | async fn check_version_update(&self) -> Option<String> { |
| 1566 | let current = env!("CARGO_PKG_VERSION"); |
| 1567 | |
| 1568 | // Fast path: serve from cache if still fresh. |
| 1569 | { |
| 1570 | let cache = self.version_cache.lock().ok()?; |
| 1571 | if let Some(checked_at) = cache.checked_at { |
| 1572 | if checked_at.elapsed() < VERSION_CHECK_INTERVAL { |
| 1573 | let latest = cache.latest.as_deref()?; |
| 1574 | return if crate::cloud::is_newer_minor_version(current, latest) { |
| 1575 | Some(format!( |
| 1576 | "⚠️ tracedecay v{current} is installed, but v{latest} is available. \ |
| 1577 | Run `tracedecay upgrade` to update." |
| 1578 | )) |
| 1579 | } else { |
| 1580 | None |
| 1581 | }; |
| 1582 | } |
| 1583 | } |
| 1584 | } |
| 1585 | |
| 1586 | // Cache miss or expired – fetch from GitHub (best-effort, 1 s timeout). |
| 1587 | let latest = tokio::task::spawn_blocking(crate::cloud::fetch_latest_version) |
| 1588 | .await |
| 1589 | .ok() |
| 1590 | .flatten(); |
| 1591 | |
| 1592 | // Update cache regardless of fetch outcome so we don't retry immediately. |
| 1593 | if let Ok(mut cache) = self.version_cache.lock() { |
| 1594 | cache.latest.clone_from(&latest); |
| 1595 | cache.checked_at = Some(Instant::now()); |
| 1596 | } |
| 1597 | |
| 1598 | let latest = latest?; |
| 1599 | if crate::cloud::is_newer_minor_version(current, &latest) { |
| 1600 | Some(format!( |
| 1601 | "⚠️ tracedecay v{current} is installed, but v{latest} is available. \ |
| 1602 | Run `tracedecay upgrade` to update." |
| 1603 | )) |
| 1604 | } else { |
| 1605 | None |
| 1606 | } |
| 1607 | } |
| 1608 | |
| 1609 | /// Process a single raw JSON-RPC line and write the response. |
| 1610 | /// Used to replay a peeked `initialize` message that was consumed before |
no test coverage detected