fix(journal): restore weather + events panels; hide daily-prep system msg in chat

The journal UI was over-stripped earlier — weather panel, current-conditions
poll, and the upcoming-events sidebar were all dropped. Restored those (calls
the new /api/journal/weather, /api/journal/weather/current,
/api/journal/weather/refresh, /api/journal/weather/geocode endpoints).

Also: the daily-prep system message was rendering as flat text inside
ChatPanel because there's no .role-system bubble styling. Added a hideMessage
guard in ChatMessage so daily-prep system messages don't render in the chat
stream — they're already shown above as a structured prep card.

News / RSS reactions / article-discuss are intentionally NOT in the journal
(scoped out per user direction). The broader RSS infrastructure cleanup is
a separate, larger task.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-04-26 12:22:51 -04:00
parent 873e70c7ea
commit cacfcac86a
5 changed files with 405 additions and 149 deletions
+14 -1
View File
@@ -303,6 +303,13 @@ export function apiSSEStream(
// Journal
// ---------------------------------------------------------------------------
export interface JournalLocation {
label: string;
address: string;
lat?: number;
lon?: number;
}
export interface JournalConfig {
prep_enabled: boolean;
prep_hour: number;
@@ -310,9 +317,15 @@ export interface JournalConfig {
day_rollover_hour: number;
morning_end_hour?: number;
midday_end_hour?: number;
// Ambient-context fields (carried forward from the briefing config schema)
locations?: { home?: JournalLocation; work?: JournalLocation };
temp_unit?: 'C' | 'F';
use_caldav_event_locations?: boolean;
enabled?: boolean;
[key: string]: unknown;
}
export interface JournalConversation {
id: number;
title: string;
@@ -410,7 +423,7 @@ export async function openArticleInChat(
export async function geocodeAddress(address: string): Promise<{ lat: number; lon: number; display_name: string } | null> {
try {
const r = await apiPost<{ lat: number; lon: number; label: string }>('/api/geocode', { query: address });
const r = await apiPost<{ lat: number; lon: number; label: string }>('/api/journal/weather/geocode', { query: address });
return { lat: r.lat, lon: r.lon, display_name: r.label };
} catch {
return null;