From 2be1f5113e919ebac21eac75a2593c9d8026d2ae Mon Sep 17 00:00:00 2001 From: Felipe Gobbi Date: Fri, 27 Feb 2026 10:53:48 -0300 Subject: [PATCH 1/5] MAESTRO: feat: add unifiedInbox and tabDescription to EncoreFeatureFlags Extends the Encore Feature system with two new feature flags for upcoming Unified Inbox and Tab Description features. tabDescription defaults to true (enabled by default), unifiedInbox defaults to false. Co-Authored-By: Claude Opus 4.6 --- src/renderer/stores/settingsStore.ts | 2 ++ src/renderer/types/index.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/renderer/stores/settingsStore.ts b/src/renderer/stores/settingsStore.ts index c10e6071e..d2e9c21a1 100644 --- a/src/renderer/stores/settingsStore.ts +++ b/src/renderer/stores/settingsStore.ts @@ -109,6 +109,8 @@ export const DEFAULT_ONBOARDING_STATS: OnboardingStats = { export const DEFAULT_ENCORE_FEATURES: EncoreFeatureFlags = { directorNotes: false, + unifiedInbox: false, + tabDescription: true, }; export const DEFAULT_DIRECTOR_NOTES_SETTINGS: DirectorNotesSettings = { diff --git a/src/renderer/types/index.ts b/src/renderer/types/index.ts index 74fdb2b14..0039a74d2 100644 --- a/src/renderer/types/index.ts +++ b/src/renderer/types/index.ts @@ -905,6 +905,8 @@ export interface LeaderboardSubmitResponse { // Each key is a feature ID, value indicates whether it's enabled export interface EncoreFeatureFlags { directorNotes: boolean; + unifiedInbox: boolean; + tabDescription: boolean; } // Director's Notes settings for synopsis generation From 7dba842d7638388295becc5301021642ed68e173 Mon Sep 17 00:00:00 2001 From: Felipe Gobbi Date: Fri, 27 Feb 2026 10:59:23 -0300 Subject: [PATCH 2/5] MAESTRO: feat: add Unified Inbox and Tab Descriptions cards to Settings Encore tab - Import Inbox and FileText icons from lucide-react - Change Encore tab icon from FlaskConical to Sparkles per spec - Add Unified Inbox feature card with toggle, Beta badge, left-border accent - Add Tab Descriptions feature card with toggle, left-border accent - Both cards follow existing toggle pattern (spread-copy + flip flag) - All 113 SettingsModal tests pass, lint clean Co-Authored-By: Claude Opus 4.6 --- src/renderer/components/SettingsModal.tsx | 134 +++++++++++++++++++++- 1 file changed, 133 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/SettingsModal.tsx b/src/renderer/components/SettingsModal.tsx index e67f7b9ea..359b6e8c0 100644 --- a/src/renderer/components/SettingsModal.tsx +++ b/src/renderer/components/SettingsModal.tsx @@ -37,6 +37,8 @@ import { Clapperboard, HelpCircle, AppWindow, + Inbox, + FileText, } from 'lucide-react'; import { useSettings } from '../hooks'; import type { @@ -1234,7 +1236,7 @@ export const SettingsModal = memo(function SettingsModal(props: SettingsModalPro tabIndex={-1} title="Encore Features" > - + {activeTab === 'encore' && Encore Features}
@@ -3638,6 +3640,136 @@ export const SettingsModal = memo(function SettingsModal(props: SettingsModalPro ); })()}
+ + {/* Unified Inbox Feature Card */} +
+ +
+ + {/* Tab Descriptions Feature Card */} +
+ +
)} From 5d60333d2aede190c268b4f63c4efdcbb4ef76f7 Mon Sep 17 00:00:00 2001 From: Felipe Gobbi Date: Fri, 27 Feb 2026 11:09:23 -0300 Subject: [PATCH 3/5] MAESTRO: feat: gate keyboard shortcuts for agentInbox and directorNotes encore features Add agentInbox shortcut (Alt+I) with encoreFeatures.unifiedInbox guard. Director's Notes shortcut already had its guard. Register agentInbox modal in the modal store and wire through App.tsx keyboard handler context. Co-Authored-By: Claude Opus 4.6 --- src/renderer/App.tsx | 4 ++++ src/renderer/constants/shortcuts.ts | 1 + .../hooks/keyboard/useMainKeyboardHandler.ts | 4 ++++ src/renderer/stores/modalStore.ts | 12 +++++++++++- 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index 4f31351c3..ff486d0db 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -344,6 +344,9 @@ function MaestroConsoleInner() { // Director's Notes Modal directorNotesOpen, setDirectorNotesOpen, + // Agent Inbox Modal (Unified Inbox) + agentInboxOpen, + setAgentInboxOpen, } = useModalActions(); // --- MOBILE LANDSCAPE MODE (reading-only view) --- @@ -3009,6 +3012,7 @@ function MaestroConsoleInner() { setMarketplaceModalOpen, setSymphonyModalOpen, setDirectorNotesOpen, + setAgentInboxOpen, encoreFeatures, setShowNewGroupChatModal, deleteGroupChatWithConfirmation, diff --git a/src/renderer/constants/shortcuts.ts b/src/renderer/constants/shortcuts.ts index 37f530386..cdee93147 100644 --- a/src/renderer/constants/shortcuts.ts +++ b/src/renderer/constants/shortcuts.ts @@ -78,6 +78,7 @@ export const DEFAULT_SHORTCUTS: Record = { label: "Director's Notes", keys: ['Meta', 'Shift', 'o'], }, + agentInbox: { id: 'agentInbox', label: 'Unified Inbox', keys: ['Alt', 'i'] }, }; // Non-editable shortcuts (displayed in help but not configurable) diff --git a/src/renderer/hooks/keyboard/useMainKeyboardHandler.ts b/src/renderer/hooks/keyboard/useMainKeyboardHandler.ts index 93675698d..4873d7d35 100644 --- a/src/renderer/hooks/keyboard/useMainKeyboardHandler.ts +++ b/src/renderer/hooks/keyboard/useMainKeyboardHandler.ts @@ -420,6 +420,10 @@ export function useMainKeyboardHandler(): UseMainKeyboardHandlerReturn { e.preventDefault(); ctx.setDirectorNotesOpen?.(true); trackShortcut('directorNotes'); + } else if (ctx.isShortcut(e, 'agentInbox') && ctx.encoreFeatures?.unifiedInbox) { + e.preventDefault(); + ctx.setAgentInboxOpen?.(true); + trackShortcut('agentInbox'); } else if (ctx.isShortcut(e, 'jumpToBottom')) { e.preventDefault(); // Jump to the bottom of the current main panel output (AI logs or terminal output) diff --git a/src/renderer/stores/modalStore.ts b/src/renderer/stores/modalStore.ts index b385ea745..55301501c 100644 --- a/src/renderer/stores/modalStore.ts +++ b/src/renderer/stores/modalStore.ts @@ -218,7 +218,9 @@ export type ModalId = // Platform Warnings | 'windowsWarning' // Director's Notes - | 'directorNotes'; + | 'directorNotes' + // Agent Inbox (Unified Inbox) + | 'agentInbox'; /** * Type mapping from ModalId to its data type. @@ -757,6 +759,10 @@ export function getModalActions() { setDirectorNotesOpen: (open: boolean) => open ? openModal('directorNotes') : closeModal('directorNotes'), + // Agent Inbox Modal (Unified Inbox) + setAgentInboxOpen: (open: boolean) => + open ? openModal('agentInbox') : closeModal('agentInbox'), + // Lightbox refs replacement - use updateModalData instead setLightboxIsGroupChat: (isGroupChat: boolean) => updateModalData('lightbox', { isGroupChat }), setLightboxAllowDelete: (allowDelete: boolean) => updateModalData('lightbox', { allowDelete }), @@ -846,6 +852,7 @@ export function useModalActions() { const symphonyModalOpen = useModalStore(selectModalOpen('symphony')); const windowsWarningModalOpen = useModalStore(selectModalOpen('windowsWarning')); const directorNotesOpen = useModalStore(selectModalOpen('directorNotes')); + const agentInboxOpen = useModalStore(selectModalOpen('agentInbox')); // Get stable actions const actions = getModalActions(); @@ -1014,6 +1021,9 @@ export function useModalActions() { // Director's Notes Modal directorNotesOpen, + // Agent Inbox Modal (Unified Inbox) + agentInboxOpen, + // Lightbox ref replacements (now stored as data) lightboxIsGroupChat: lightboxData?.isGroupChat ?? false, lightboxAllowDelete: lightboxData?.allowDelete ?? false, From 3f2c297fb867ca54fe4b8af149526790c3ab2ce3 Mon Sep 17 00:00:00 2001 From: Felipe Gobbi Date: Fri, 27 Feb 2026 11:17:20 -0300 Subject: [PATCH 4/5] MAESTRO: feat: gate AgentInbox modal rendering and handler props behind unifiedInbox encore feature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add onOpenAgentInbox gated prop (App.tsx → AppModals → QuickActionsModal) - Add AgentInbox rendering placeholder in App.tsx (commented, component TBD) - Add Unified Inbox entry to QuickActionsModal command palette - DirectorNotesModal gating was already in place from prior work Co-Authored-By: Claude Opus 4.6 --- src/renderer/App.tsx | 12 ++++++++++++ src/renderer/components/AppModals.tsx | 11 +++++++++++ src/renderer/components/QuickActionsModal.tsx | 18 ++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index ff486d0db..bd790b367 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -3712,6 +3712,7 @@ function MaestroConsoleInner() { onOpenDirectorNotes={ encoreFeatures.directorNotes ? () => setDirectorNotesOpen(true) : undefined } + onOpenAgentInbox={encoreFeatures.unifiedInbox ? () => setAgentInboxOpen(true) : undefined} autoScrollAiMode={autoScrollAiMode} setAutoScrollAiMode={setAutoScrollAiMode} tabSwitcherOpen={tabSwitcherOpen} @@ -4107,6 +4108,17 @@ function MaestroConsoleInner() { )} + {/* --- AGENT INBOX MODAL (Encore Feature — component TBD) --- */} + {/* Gate: renders only when unifiedInbox encore feature is enabled */} + {/* {encoreFeatures.unifiedInbox && agentInboxOpen && ( + + setAgentInboxOpen(false)} + /> + + )} */} + {/* --- GIST PUBLISH MODAL --- */} {/* Supports both file preview tabs and tab context gist publishing */} {gistPublishModalOpen && (activeFileTab || tabGistContent) && ( diff --git a/src/renderer/components/AppModals.tsx b/src/renderer/components/AppModals.tsx index fb8de50c2..39f8ca335 100644 --- a/src/renderer/components/AppModals.tsx +++ b/src/renderer/components/AppModals.tsx @@ -859,6 +859,9 @@ export interface AppUtilityModalsProps { // Director's Notes onOpenDirectorNotes?: () => void; + // Agent Inbox (Unified Inbox) + onOpenAgentInbox?: () => void; + // Auto-scroll autoScrollAiMode?: boolean; setAutoScrollAiMode?: (value: boolean) => void; @@ -1060,6 +1063,8 @@ export const AppUtilityModals = memo(function AppUtilityModals({ onOpenSymphony, // Director's Notes onOpenDirectorNotes, + // Agent Inbox (Unified Inbox) + onOpenAgentInbox, // Auto-scroll autoScrollAiMode, setAutoScrollAiMode, @@ -1218,6 +1223,7 @@ export const AppUtilityModals = memo(function AppUtilityModals({ onOpenLastDocumentGraph={onOpenLastDocumentGraph} onOpenSymphony={onOpenSymphony} onOpenDirectorNotes={onOpenDirectorNotes} + onOpenAgentInbox={onOpenAgentInbox} autoScrollAiMode={autoScrollAiMode} setAutoScrollAiMode={setAutoScrollAiMode} /> @@ -2013,6 +2019,8 @@ export interface AppModalsProps { onOpenSymphony?: () => void; // Director's Notes onOpenDirectorNotes?: () => void; + // Agent Inbox (Unified Inbox) + onOpenAgentInbox?: () => void; // Auto-scroll autoScrollAiMode?: boolean; setAutoScrollAiMode?: (value: boolean) => void; @@ -2337,6 +2345,8 @@ export const AppModals = memo(function AppModals(props: AppModalsProps) { onOpenSymphony, // Director's Notes onOpenDirectorNotes, + // Agent Inbox (Unified Inbox) + onOpenAgentInbox, // Auto-scroll autoScrollAiMode, setAutoScrollAiMode, @@ -2651,6 +2661,7 @@ export const AppModals = memo(function AppModals(props: AppModalsProps) { onOpenMarketplace={onOpenMarketplace} onOpenSymphony={onOpenSymphony} onOpenDirectorNotes={onOpenDirectorNotes} + onOpenAgentInbox={onOpenAgentInbox} autoScrollAiMode={autoScrollAiMode} setAutoScrollAiMode={setAutoScrollAiMode} tabSwitcherOpen={tabSwitcherOpen} diff --git a/src/renderer/components/QuickActionsModal.tsx b/src/renderer/components/QuickActionsModal.tsx index 144c8e229..4d2137128 100644 --- a/src/renderer/components/QuickActionsModal.tsx +++ b/src/renderer/components/QuickActionsModal.tsx @@ -117,6 +117,8 @@ interface QuickActionsModalProps { onOpenSymphony?: () => void; // Director's Notes onOpenDirectorNotes?: () => void; + // Agent Inbox (Unified Inbox) + onOpenAgentInbox?: () => void; // Auto-scroll autoScrollAiMode?: boolean; setAutoScrollAiMode?: (value: boolean) => void; @@ -204,6 +206,7 @@ export const QuickActionsModal = memo(function QuickActionsModal(props: QuickAct onOpenLastDocumentGraph, onOpenSymphony, onOpenDirectorNotes, + onOpenAgentInbox, autoScrollAiMode, setAutoScrollAiMode, } = props; @@ -1034,6 +1037,21 @@ export const QuickActionsModal = memo(function QuickActionsModal(props: QuickAct }, ] : []), + // Agent Inbox (Unified Inbox) - cross-agent message hub + ...(onOpenAgentInbox + ? [ + { + id: 'agentInbox', + label: 'Unified Inbox', + shortcut: shortcuts.agentInbox, + subtext: 'Open the unified inbox for cross-agent messages', + action: () => { + onOpenAgentInbox(); + setQuickActionOpen(false); + }, + }, + ] + : []), // Auto-scroll toggle ...(setAutoScrollAiMode ? [ From 060ba44a3ed85d5859d1d001c2dec7d25c1d8a77 Mon Sep 17 00:00:00 2001 From: Felipe Gobbi Date: Fri, 27 Feb 2026 11:21:37 -0300 Subject: [PATCH 5/5] MAESTRO: fix: set tabDescription encore default to false for convention consistency The tabDescription encore feature was defaulting to true, inconsistent with the encore pattern (all features disabled by default). No handler or UI exists yet for tab descriptions, so this is purely a default fix. Co-Authored-By: Claude Opus 4.6 --- src/renderer/stores/settingsStore.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/stores/settingsStore.ts b/src/renderer/stores/settingsStore.ts index d2e9c21a1..945052a66 100644 --- a/src/renderer/stores/settingsStore.ts +++ b/src/renderer/stores/settingsStore.ts @@ -110,7 +110,7 @@ export const DEFAULT_ONBOARDING_STATS: OnboardingStats = { export const DEFAULT_ENCORE_FEATURES: EncoreFeatureFlags = { directorNotes: false, unifiedInbox: false, - tabDescription: true, + tabDescription: false, }; export const DEFAULT_DIRECTOR_NOTES_SETTINGS: DirectorNotesSettings = {