fix: CI pipeline Node.js 20 deprecation, Codecov input, img lint errors

Agent-Logs-Url: https://github.com/christianlouis/InboxConverge/sessions/6bbc5b0e-ece1-4bed-8bf7-20e1e7027948

Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2026-03-28 20:39:15 +00:00
parent 15f1108732
commit 40c23c43fe
4 changed files with 20 additions and 7 deletions
+2 -1
View File
@@ -15,6 +15,7 @@ env:
GHCR_REGISTRY: ghcr.io
PRIVATE_REGISTRY: registry.cklnet.com
K8S_STATE_REPO: christianlouis/k8s-cluster-state
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
jobs:
# ── Phase 1: Lint ──────────────────────────────────────────────────────
@@ -125,7 +126,7 @@ jobs:
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v5
with:
file: ./backend/coverage.xml
files: ./backend/coverage.xml
flags: unittests
name: codecov-umbrella
fail_ci_if_error: false
+4
View File
@@ -19,6 +19,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
- CI: add `FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true` env to `ci.yml` to fix Node.js 20 deprecation warnings for `actions/checkout` and `actions/github-script`.
- CI: fix Codecov upload step — change invalid `file:` input to `files:` for `codecov/codecov-action@v5`.
- Frontend: replace `<img>` with `<Image />` from `next/image` in `ProviderWizard.tsx` to fix `no-img-element` ESLint errors.
- Fix timezone display in Mailbox Activity / Admin Logs pages: timestamps from the server were parsed as local time when no timezone indicator was present, causing relative times ("1h ago") and absolute dates to be shifted by the client's UTC offset.
- Worker tasks: use a fresh DB session for `send_user_notification` calls and move notifications after `db.commit()` to prevent the post-rollback `greenlet_spawn` SQLAlchemy error.
- Worker tasks: ensure `last_check_at` and error status are always committed before notifications, fixing accounts being endlessly re-queued after IMAP auth failures.
+1
View File
@@ -4,6 +4,7 @@ Comprehensive task breakdown for repository improvements and production readines
## ✅ Recently Completed
- [x] **CI pipeline fixes**: Added `FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true` to `ci.yml` (Node.js 20 deprecation), fixed Codecov `file:``files:` invalid input, replaced `<img>` with `<Image />` from `next/image` in `ProviderWizard.tsx` (ESLint no-img-element).
- [x] **IMAP reliability: switched to UID-based commands**`_fetch_imap_emails` now uses `UID SEARCH`, `UID FETCH`, and `UID STORE` throughout. Sequence numbers are volatile (they shift on expunge), causing "Too many invalid IMAP commands" on strict servers (e.g. T-Online). UIDs are stable. The per-message `STORE +FLAGS \Seen` (redundant — RFC822 sets it implicitly) and per-message `STORE +FLAGS \Deleted` are replaced with single batch commands. Stale already-seen UIDs are re-marked `\Seen` in one command. Logout is now in a `finally` block so a mid-session `BYE` is handled gracefully.
- [x] Fixed timezone display bug in Mailbox Activity and Admin Logs pages: ISO timestamps without a `Z` suffix were parsed as local time by JavaScript, shifting "Xm ago" / "Xh ago" displays and absolute dates by the client's UTC offset.
- [x] Fixed worker `send_user_notification` using rolled-back DB session causing `greenlet_spawn has not been called` errors; status/`last_check_at` now always committed before sending notifications via a fresh session.
+13 -6
View File
@@ -1,6 +1,7 @@
'use client';
import { useState } from 'react';
import Image from 'next/image';
import { Mail, ArrowLeft } from 'lucide-react';
interface ProviderPreset {
@@ -183,11 +184,14 @@ export function ProviderWizard({ onSelect, onManual }: ProviderWizardProps) {
<div className="bg-blue-50 border border-blue-200 rounded-lg p-4">
<h4 className="font-semibold text-blue-900 mb-2 flex items-center gap-2">
<div className="h-6 flex items-center flex-shrink-0">
<img
<div className="relative h-6 w-20 flex-shrink-0">
<Image
src={selectedProvider.logo}
alt={selectedProvider.name}
style={{ maxHeight: '100%', maxWidth: '80px', objectFit: 'contain' }}
fill
unoptimized
sizes="80px"
style={{ objectFit: 'contain' }}
/>
</div>
{selectedProvider.name}
@@ -266,11 +270,14 @@ export function ProviderWizard({ onSelect, onManual }: ProviderWizardProps) {
className="flex flex-col items-center gap-2 p-3 rounded-lg border border-gray-200 hover:border-blue-300 hover:bg-blue-50 transition-colors text-center"
>
{/* Fixed-height logo container logo scales to its natural aspect ratio */}
<div className="h-8 w-full flex items-center justify-center">
<img
<div className="relative h-8 w-full">
<Image
src={provider.logo}
alt={provider.name}
style={{ maxHeight: '100%', maxWidth: '100%', objectFit: 'contain' }}
fill
unoptimized
sizes="100px"
style={{ objectFit: 'contain' }}
/>
</div>
<div className="text-xs font-medium text-gray-900 truncate w-full">{provider.name}</div>