- cove_importer.py: add _backfill_colorbar_runs() to reconstruct up to
27 days of history from the D09F08 28-day colorbar when a new run is
created; idempotent via external_id deduplication
- routes_cove.py: add GET /cove/run/<run_id>/detail endpoint returning
structured Cove account info and per-datasource objects for popups
- routes_run_checks.py: add cove_summary to run payload for cove_api runs
with readable datasource labels; hide mail section for Cove runs
- routes_jobs.py: add source_type to history_rows dict
- job_detail.html: Cove run rows clickable; JS routes to cove_run_detail;
Cove summary panel added, mail section hidden for Cove runs
- run_checks.html: Cove summary panel added; JS handles cove_summary
- technical-notes-codex.md: document new route, popup behaviour, and
historical backfill
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove per-row Link/Create Job button and inline modals
- Make unmatched rows clickable to open a single shared modal
- Create new job tab: customer via datalist (auto-complete),
job name and backup type shown read-only (derived from user/section)
- Route: derive job_name and backup_type server-side, not from form
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Redesign layout to fixed dark sidebar (220px) with IBM Plex Sans/Mono
fonts and CSS design tokens; full rewrite of layout.css and base.html
- Move missed-run generation and Autotask ticket polling to a daemon
background thread on Run Checks page load (throttled per job, 10 min)
- Cove manual import now logs and shows per-skip-reason breakdown
- Cove timestamp parser handles ms/us/ns epochs and .NET /Date(ms)/ strings
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- CoveAccount staging model: all Cove accounts upserted from API;
unmatched accounts visible on /cove/accounts before job linking
- cove_importer.py: always upserts accounts, creates JobRuns only for
accounts with a linked job (deduplication via external_id)
- routes_cove.py: GET /cove/accounts, POST link/unlink routes
- cove_accounts.html: inbox-style page with Bootstrap modals for
creating new jobs or linking to existing ones
- Nav bar: Cove Accounts link for admin/operator when cove_enabled
- DB migration: migrate_cove_accounts_table() for staging table
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- New route POST /settings/cove/run-now calls run_cove_import()
directly and shows result as flash message
- Settings > Integrations > Cove: "Run import now" button visible
when partner_id is known (connection confirmed)
- Status bar shows partner ID, last import timestamp or "No import yet"
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- New models: SystemSettings gets 8 cove_* fields, Job gets
cove_account_id, JobRun gets source_type and external_id
- Migration migrate_cove_integration() adds all new DB columns and
a deduplication index on job_runs.external_id
- cove_importer.py: Cove API login, paginated EnumerateAccountStatistics,
deduplication via external_id, JobRun creation, per-datasource
run_object_links persistence (Files&Folders, VssMsSql, M365, etc.)
- cove_importer_service.py: background thread, same pattern as
auto_importer_service, respects cove_import_interval_minutes
- __init__.py: starts cove_importer thread on app startup
- routes_settings.py: Cove form handling (POST), has_cove_password
variable, new AJAX route /settings/cove/test-connection
- routes_jobs.py: new route /jobs/<id>/set-cove-account,
cove_enabled passed to job_detail template
- settings.html: Cove card in Integrations tab with AJAX test button
- job_detail.html: Cove Integration card with Account ID input
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add standalone cove_api_test.py to verify new D9Fxx/D10Fxx/D11Fxx column codes
- D02/D03 confirmed as legacy by N-able support; D9/D10/D11 should work
- Document session status codes (F00) and timestamp fields (F09/F15/F18)
- Update TODO and knowledge docs with breakthrough status
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Added autocomplete="off" attribute to all checkboxes to prevent browser from
automatically restoring checkbox states after page reload.
Changes:
- Inbox page: Added autocomplete="off" to select-all and row checkboxes
- Run Checks page: Added autocomplete="off" to select-all and row checkboxes
This fixes the issue where after deleting items, the browser would automatically
re-select the same number of checkboxes that were previously selected, causing
unwanted selections on the reloaded page.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Added ticket linking to missed runs by calling link_open_internal_tickets_to_run
after creating missed JobRun records in _ensure_missed_runs_for_job function.
Changes:
- Added import for link_open_internal_tickets_to_run in routes_run_checks.py
- Added db.session.flush() and ticket linking call after creating weekly missed runs
- Added db.session.flush() and ticket linking call after creating monthly missed runs
- Ensures missed runs receive same ticket propagation as email-based runs
This fixes the issue where missed runs were not showing linked internal tickets
or Autotask tickets, while error/warning runs from emails were working correctly.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fixed issue where Autotask internal tickets were not being linked to new runs.
This resolves the problem identified on 2026-02-11.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>