fixes: timeAgo utc parse, reload clears unread, sync-event debug

- detail banner timeAgo: SQLite timestamps are UTC without tz marker,
  JS was parsing them as local. Fixed by appending Z when absent —
  same pattern chat uses. "2h ago" for a 30s-old update is gone.
- banner Reload button now re-fires detail.opened so the collab-buckets
  plugin clears the red dot on the board card and calls mark-card-seen.
  Dismiss (×) still leaves the dot — that's the acknowledgement that
  nothing was actually read.
- instrument /api/relay/poll with a sync_debug field so the JS can
  console.debug what happened on the sync-events sub-request (status,
  count, error body). Helps diagnose "no toast" reports.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
thandClaude Opus 4.6 committed 2026-04-14 23:16:48 +02:00
1 parent 1966f8f4c0
commit 4a668b7fc4
5 files changed
+26 -4

No files matched your search

+8 -1
View File
@@ -961,6 +961,7 @@ if (str_starts_with($route, '/api/')) {
// them. GET /api/sync-events on the relay auto-marks fetched events.
// Best-effort — older relays won't have the endpoint.
$syncEvents = [];
$syncDebug = ['requested' => true];
$sch = curl_init(rtrim($relayUrl, '/') . '/api/sync-events');
curl_setopt_array($sch, [
CURLOPT_RETURNTRANSFER => true,
@@ -970,14 +971,20 @@ if (str_starts_with($route, '/api/')) {
$sResp = curl_exec($sch);
$sStatus = curl_getinfo($sch, CURLINFO_HTTP_CODE);
curl_close($sch);
$syncDebug['status'] = $sStatus;
if ($sStatus === 200) {
$decoded = json_decode($sResp, true);
if (is_array($decoded) && isset($decoded['events'])) {
$syncEvents = $decoded['events'];
$syncDebug['count'] = count($syncEvents);
} else {
$syncDebug['parse_error'] = substr((string)$sResp, 0, 200);
}
} else {
$syncDebug['body'] = substr((string)$sResp, 0, 200);
}
echo json_encode(['ok' => true, 'pulled' => $pulled, 'sync_events' => $syncEvents]); exit;
echo json_encode(['ok' => true, 'pulled' => $pulled, 'sync_events' => $syncEvents, 'sync_debug' => $syncDebug]); exit;
}
// List relay tenants (for the recipient picker)