Skip to content
Closed
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
4c9f951
fix: re-enable batch state debouncing to resolve Auto Run performance…
Feb 26, 2026
48b8de3
MAESTRO: port agent-inbox shared types from feature/inbox-focus-polish
Feb 26, 2026
efe7dfc
MAESTRO: add unifiedInbox flag to EncoreFeatureFlags
Feb 26, 2026
9268995
MAESTRO: add Unified Inbox toggle card in Settings Encore tab
Feb 26, 2026
e29b425
MAESTRO: port useAgentInbox hook and AgentInbox components from featu…
Feb 26, 2026
615ff25
MAESTRO: integrate Unified Inbox modal into App.tsx with Encore Featu…
Feb 26, 2026
7eff634
MAESTRO: register Option+I keyboard shortcut for Unified Inbox with E…
Feb 26, 2026
d6842b1
MAESTRO: add Unified Inbox menu item to hamburger menu in SessionList
Feb 26, 2026
4403705
MAESTRO: add Unified Inbox action to command palette (QuickActionsModal)
Feb 26, 2026
2a05348
MAESTRO: fix unused-var eslint warning in FocusModeView
Feb 26, 2026
cd0734c
MAESTRO: fix Focus Mode auto-scroll bug with proximity-based approach
Feb 26, 2026
cf06151
MAESTRO: fix CodeRabbit bugs — group header a11y, scoped collapse, se…
Feb 26, 2026
1b65706
MAESTRO: align Inbox + Focus Mode headers with Director's Notes tokens
Feb 26, 2026
c47fca2
MAESTRO: align Focus Mode content spacing + reply input with Director…
Feb 26, 2026
d9698cb
MAESTRO: mark test verification gate as passed — 3 pre-existing Codex…
Feb 26, 2026
26d100b
MAESTRO: mark final verification gate as passed — ESLint clean + all …
Feb 26, 2026
3c388c7
MAESTRO: remove redundant star icons from Inbox + Focus Mode
Feb 26, 2026
b9252ef
MAESTRO: add description field to AITab and tabDescription flag to En…
Feb 26, 2026
d4829ed
MAESTRO: add Tab Description Settings toggle and handleUpdateTabDescr…
Feb 26, 2026
3cf3ccd
MAESTRO: wire tab description handler through prop chain and build in…
Feb 26, 2026
ed2e54b
MAESTRO: constrain tab description to 3-line max with ellipsis overflow
Feb 26, 2026
f494fad
fix: enable fuzzy matching for session filter in Left Bar
Feb 26, 2026
ad846a8
fix: enable fuzzy matching for slash command autocomplete in input area
Feb 26, 2026
f779e9a
fix: update fuzzy autocomplete test, remove duplicate log entry, cons…
Feb 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# ENCORE-INBOX-02: Add `unifiedInbox` flag to EncoreFeatureFlags

## Objective
Register the Unified Inbox as an Encore Feature with a type flag and default value.

## Context
- `EncoreFeatureFlags` interface is at `src/renderer/types/index.ts:906` — currently only has `directorNotes: boolean`
- `DEFAULT_ENCORE_FEATURES` is at `src/renderer/stores/settingsStore.ts:110` — currently `{ directorNotes: false }`
- The settings store hydration merges saved values with defaults at `settingsStore.ts:1669-1673` using spread: `{ ...DEFAULT_ENCORE_FEATURES, ...(saved) }` — so new fields with defaults are safe
- Both type AND default MUST be updated in the same task to avoid runtime `undefined`

## Tasks

- [x] In `src/renderer/types/index.ts`, find the `EncoreFeatureFlags` interface at line 906. Add `unifiedInbox: boolean` below `directorNotes`. Also in `src/renderer/stores/settingsStore.ts`, find `DEFAULT_ENCORE_FEATURES` at line 110. Add `unifiedInbox: false` to the object. Both changes must happen together:
```typescript
// types/index.ts:906
export interface EncoreFeatureFlags {
directorNotes: boolean;
unifiedInbox: boolean;
}

// stores/settingsStore.ts:110
export const DEFAULT_ENCORE_FEATURES: EncoreFeatureFlags = {
directorNotes: false,
unifiedInbox: false,
};
```

- [x] Run `npm run lint` to verify the new field doesn't cause type errors. Existing code spreading `encoreFeatures` will pick up the new field automatically via the default merge at line 1669-1673.

## Gate
- `npm run lint` passes
- `EncoreFeatureFlags` has both `directorNotes` and `unifiedInbox` fields
- `DEFAULT_ENCORE_FEATURES` has `unifiedInbox: false`
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# ENCORE-INBOX-04: Port useAgentInbox hook and AgentInbox components

## Objective
Port the data hook and all 3 component files from `feature/inbox-focus-polish` into the current codebase, adapting imports to the new architecture.

## Context
- Source branch: `feature/inbox-focus-polish`
- Files to port:
- `src/renderer/hooks/useAgentInbox.ts` — data aggregation hook
- `src/renderer/components/AgentInbox/index.tsx` — modal shell + view switching
- `src/renderer/components/AgentInbox/InboxListView.tsx` — virtualized list view
- `src/renderer/components/AgentInbox/FocusModeView.tsx` — focus mode detail view
- The new codebase uses `settingsStore.ts` (Zustand) instead of prop-drilling settings
- `useModalLayer` hook and `MODAL_PRIORITIES` still exist in the same locations
- `modalStore` still exists at `src/renderer/stores/modalStore.ts`
- `formatRelativeTime` is at `src/renderer/utils/formatters.ts`

## Tasks

- [x] Create `src/renderer/hooks/useAgentInbox.ts` by extracting from old branch: `git show feature/inbox-focus-polish:src/renderer/hooks/useAgentInbox.ts`. Copy the full content. Verify imports: `Session`, `Group` from `../types`, `InboxItem`, `InboxFilterMode`, `InboxSortMode` from `../types/agent-inbox`. These should resolve since Phase 01 created the types file. Run `npm run lint` to check.

- [x] Create the directory `src/renderer/components/AgentInbox/` and port all 3 component files. For each, extract from old branch and copy:
1. `git show feature/inbox-focus-polish:src/renderer/components/AgentInbox/index.tsx` → `src/renderer/components/AgentInbox/index.tsx`
2. `git show feature/inbox-focus-polish:src/renderer/components/AgentInbox/InboxListView.tsx` → `src/renderer/components/AgentInbox/InboxListView.tsx`
3. `git show feature/inbox-focus-polish:src/renderer/components/AgentInbox/FocusModeView.tsx` → `src/renderer/components/AgentInbox/FocusModeView.tsx`
After copying, verify all imports resolve. Key imports to check:
- `../../types` should export `Theme`, `Session`, `Group`, `ThinkingMode`, `LogEntry`
- `../../types/agent-inbox` should export all inbox types (from Phase 01)
- `../../hooks/useAgentInbox` should resolve (created above)
- `../../hooks/ui/useModalLayer` — verify this exists: `ls src/renderer/hooks/ui/useModalLayer*`
- `../../constants/modalPriorities` — verify: `grep -n "AGENT_INBOX" src/renderer/constants/modalPriorities.ts`. If `AGENT_INBOX` doesn't exist in priorities, add it (use priority 555, same as old branch)
- `../../stores/modalStore` — verify `selectModalData` is exported
- `../../utils/formatters` — verify `formatRelativeTime` is exported
- The ported `InboxListView.tsx` uses `react-window` for virtualization, but this dependency does NOT exist in the project. The codebase already uses `@tanstack/react-virtual` (used by Director's Notes `UnifiedHistoryTab.tsx`). After copying the files, replace ALL `react-window` imports with `@tanstack/react-virtual` equivalents. Specifically: replace `import { FixedSizeList } from 'react-window'` (or similar) with `import { useVirtualizer } from '@tanstack/react-virtual'` and refactor the list rendering to use the `useVirtualizer` hook pattern (see `src/renderer/components/DirectorNotes/UnifiedHistoryTab.tsx` lines 201-221 for reference). This avoids adding an unnecessary dependency.
- `../../utils/markdownConfig` — verify `generateTerminalProseStyles` exists
- `../../components/MarkdownRenderer` — verify exists
**Notes:** react-window → @tanstack/react-virtual migration completed. Added `agentInbox` to ModalId type, AgentInboxModalData interface, ModalDataMap, and getModalActions() in modalStore.ts. AGENT_INBOX priority added at 555 in modalPriorities.ts.

- [x] Run `npm run lint` and fix any import resolution errors. Common issues: renamed types, moved hooks, missing re-exports. Fix each error by finding the new location of the imported symbol.
**Notes:** Fixed 2 type narrowing issues in index.tsx (filterMode/sortMode from ModalData needed explicit casts to InboxFilterMode/InboxSortMode). Lint passes clean.

## Gate
- `src/renderer/hooks/useAgentInbox.ts` exists
- `src/renderer/components/AgentInbox/` directory has 3 files: `index.tsx`, `InboxListView.tsx`, `FocusModeView.tsx`
- `npm run lint` passes (zero errors)
- `AGENT_INBOX` priority registered in `modalPriorities.ts`
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# ENCORE-INBOX-05: Integrate Unified Inbox into App.tsx (modal + state + Encore gating)

## Objective
Wire the Unified Inbox modal into App.tsx with Encore Feature gating, following the Director's Notes pattern exactly.

## Context
- App.tsx is at `src/renderer/App.tsx` (6,563 lines post-refactor)
- Director's Notes pattern to mirror:
- Line 46-47: lazy import `const DirectorNotesModal = lazy(() => import('./components/DirectorNotes')...)`
- Line 356-357: modal state from `useModalActions()` — `directorNotesOpen, setDirectorNotesOpen`
- Line 508: `encoreFeatures` destructured from settings
- Line 5220: conditional setter for SessionList: `setDirectorNotesOpen: encoreFeatures.directorNotes ? setDirectorNotesOpen : undefined`
- Line 5634: conditional handler for QuickActions: `encoreFeatures.directorNotes ? () => setDirectorNotesOpen(true) : undefined`
- Line 6017: gated modal render: `{encoreFeatures.directorNotes && directorNotesOpen && (<Suspense>...</Suspense>)}`
- `useModalActions()` comes from `src/renderer/stores/modalStore.ts` — need to add `agentInboxOpen`/`setAgentInboxOpen` there first
- `modalStore.ts` has `agentInbox` in valid modal IDs (check with `grep "agentInbox" src/renderer/stores/modalStore.ts`) — if not, add it

## Tasks

- [x] In `src/renderer/stores/modalStore.ts`, verify that `agentInbox` is registered as a valid modal ID. Search for `type ModalId` or the array/union of valid modal IDs. If `agentInbox` is NOT present, add it following the pattern used by `directorNotes` or other modals. Also verify `useModalActions()` returns `agentInboxOpen` and `setAgentInboxOpen` — if not, add them following the `directorNotesOpen`/`setDirectorNotesOpen` pattern.
> `agentInbox` was already registered as ModalId (line 230) with `AgentInboxModalData` and `setAgentInboxOpen` action. Added `agentInboxOpen` reactive selector to `useModalActions()` return object.

- [x] In `src/renderer/App.tsx`, add the lazy import for AgentInbox near line 46 (next to Director's Notes import):
```typescript
const AgentInbox = lazy(() => import('./components/AgentInbox'));
```
Then destructure `agentInboxOpen` and `setAgentInboxOpen` from `useModalActions()` (find where `directorNotesOpen` is destructured, around line 356).
> Added lazy import at line 49. Destructured `agentInboxOpen` and `setAgentInboxOpen` from `useModalActions()` at lines 360-361.

- [x] In `src/renderer/App.tsx`, add the gated modal render. Find the Director's Notes modal block (line 6017: `{encoreFeatures.directorNotes && directorNotesOpen && (`). AFTER that block, add:
```tsx
{encoreFeatures.unifiedInbox && agentInboxOpen && (
<Suspense fallback={null}>
<AgentInbox
theme={theme}
sessions={sessions}
groups={groups}
onClose={() => setAgentInboxOpen(false)}
onNavigateToSession={handleNavigateToSession}
/>
</Suspense>
)}
```
Verify `handleNavigateToSession` or equivalent callback exists (search for the function used by Director's Notes `onResumeSession`). If the exact callback doesn't exist, create a minimal one or use `handleDirectorNotesResumeSession` pattern as reference.
> Created `handleAgentInboxNavigateToSession` callback (closes inbox, switches to session). Gated modal render at line 6051 with full props including `enterToSendAI`.

- [x] Wire conditional setters for child components. Find the props assembly area (around line 5220 where Director's Notes does it):
- For SessionList: `setAgentInboxOpen: encoreFeatures.unifiedInbox ? setAgentInboxOpen : undefined`
- For QuickActionsModal (around line 5634): `onOpenUnifiedInbox: encoreFeatures.unifiedInbox ? () => setAgentInboxOpen(true) : undefined`
> Both wired. Also added `setAgentInboxOpen` to keyboard handler ref object for future keybinding support.

- [x] Run `npm run lint` — expect type errors for SessionList/QuickActionsModal props not accepting optional. Note errors for next phases.
> 2 expected type errors:
> 1. `TS2353`: `setAgentInboxOpen` not in `UseSessionListPropsDeps` type (line 5236)
> 2. `TS2322`: `onOpenUnifiedInbox` not in `AppModalsProps` type (line 5652)
> Both will be resolved in phases 06-08 when those component prop interfaces are updated.

## Gate
- `npm run lint` may have type errors (resolved in phases 06-08)
- `grep -n "agentInboxOpen" src/renderer/App.tsx` returns lazy import, state, gated render, and conditional setters
- Modal is gated: `encoreFeatures.unifiedInbox && agentInboxOpen`
40 changes: 38 additions & 2 deletions src/renderer/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ const DocumentGraphView = lazy(() =>
const DirectorNotesModal = lazy(() =>
import('./components/DirectorNotes').then((m) => ({ default: m.DirectorNotesModal }))
);
const AgentInbox = lazy(() => import('./components/AgentInbox'));

// Re-import the type for SymphonyContributionData (types don't need lazy loading)
import type { SymphonyContributionData } from './components/SymphonyModal';
Expand Down Expand Up @@ -355,6 +356,9 @@ function MaestroConsoleInner() {
// Director's Notes Modal
directorNotesOpen,
setDirectorNotesOpen,
// Agent Inbox Modal
agentInboxOpen,
setAgentInboxOpen,
} = useModalActions();

// --- MOBILE LANDSCAPE MODE (reading-only view) ---
Expand Down Expand Up @@ -628,8 +632,11 @@ function MaestroConsoleInner() {
setSelectedSidebarIndex,
} = useUIStore.getState();

const { setSelectedFileIndex: _setSelectedFileIndex, setFileTreeFilter: _setFileTreeFilter, setFileTreeFilterOpen } =
useFileExplorerStore.getState();
const {
setSelectedFileIndex: _setSelectedFileIndex,
setFileTreeFilter: _setFileTreeFilter,
setFileTreeFilterOpen,
} = useFileExplorerStore.getState();

// --- GROUP CHAT STATE (now in groupChatStore) ---

Expand Down Expand Up @@ -1509,6 +1516,16 @@ function MaestroConsoleInner() {
}
}, [activeSession?.id, handleResumeSession]);

// --- AGENT INBOX SESSION NAVIGATION ---
// Close inbox modal and switch to the target agent session
const handleAgentInboxNavigateToSession = useCallback(
(sessionId: string) => {
setAgentInboxOpen(false);
setActiveSessionId(sessionId);
},
[setAgentInboxOpen, setActiveSessionId]
);

// --- BATCH HANDLERS (Auto Run processing, quit confirmation, error handling) ---
const {
startBatchRun,
Expand Down Expand Up @@ -4710,6 +4727,7 @@ function MaestroConsoleInner() {
setMarketplaceModalOpen,
setSymphonyModalOpen,
setDirectorNotesOpen,
setAgentInboxOpen,
encoreFeatures,
setShowNewGroupChatModal,
deleteGroupChatWithConfirmation,
Expand Down Expand Up @@ -5218,6 +5236,7 @@ function MaestroConsoleInner() {
setUsageDashboardOpen,
setSymphonyModalOpen,
setDirectorNotesOpen: encoreFeatures.directorNotes ? setDirectorNotesOpen : undefined,
setAgentInboxOpen: encoreFeatures.unifiedInbox ? setAgentInboxOpen : undefined,
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify that new App.tsx props are present in dependent type surfaces.

# SessionList props/deps side
rg -n -C3 "UseSessionListPropsDeps|setAgentInboxOpen" src -g "*.{ts,tsx}"

# AppModals props side
rg -n -C3 "AppModalsProps|onOpenUnifiedInbox" src -g "*.{ts,tsx}"

# App.tsx call sites for quick comparison
rg -n -C2 "setAgentInboxOpen: encoreFeatures\\.unifiedInbox|onOpenUnifiedInbox" src/renderer/App.tsx

Repository: RunMaestro/Maestro

Length of output: 6922


🏁 Script executed:

#!/bin/bash
# Check UseSessionListPropsDeps full definition
sed -n '29,100p' src/renderer/hooks/props/useSessionListProps.ts

# Check the component being called at line 5655
sed -n '5645,5660p' src/renderer/App.tsx

# Check SessionList component props definition
rg -n "interface.*SessionListProps|type.*SessionListProps" src -g "*.{ts,tsx}" -A 30

Repository: RunMaestro/Maestro

Length of output: 8245


🏁 Script executed:

#!/bin/bash
# Search for setAgentInboxOpen in the full UseSessionListPropsDeps
rg -n "setAgentInboxOpen" src/renderer/hooks/props/useSessionListProps.ts

# Search for onOpenUnifiedInbox in SessionListProps
rg -n "onOpenUnifiedInbox" src/renderer/components/SessionList.tsx

# Check AppModalsProps for these props
rg -n "onOpenUnifiedInbox|setAgentInboxOpen" src/renderer/components/AppModals.tsx

# Get the component name at line 5655 in App.tsx
sed -n '5640,5665p' src/renderer/App.tsx | head -30

Repository: RunMaestro/Maestro

Length of output: 1234


🏁 Script executed:

#!/bin/bash
# Find what component is being rendered around line 5655
sed -n '5620,5670p' src/renderer/App.tsx | grep -B 30 "onOpenUnifiedInbox" | head -40

# Explicitly check for setAgentInboxOpen in UseSessionListPropsDeps
grep -n "setAgentInboxOpen" src/renderer/hooks/props/useSessionListProps.ts

# Check full AppModalsProps interface definition
sed -n '1765,1850p' src/renderer/components/AppModals.tsx

Repository: RunMaestro/Maestro

Length of output: 4235


🏁 Script executed:

#!/bin/bash
# Find the component name before the onOpenUnifiedInbox prop
sed -n '5600,5680p' src/renderer/App.tsx | grep -A 2 -B 50 "onOpenUnifiedInbox" | tail -60

# Check what component expects onOpenUnifiedInbox
rg -n "onOpenUnifiedInbox" src/renderer/components -g "*.{ts,tsx}" -B 5

Repository: RunMaestro/Maestro

Length of output: 2517


🏁 Script executed:

#!/bin/bash
# Find the opening tag for this component
sed -n '5500,5680p' src/renderer/App.tsx | grep -E "^[[:space:]]*<[A-Z]" | tail -5

# More comprehensive search - find the component opening tag
sed -n '5620,5700p' src/renderer/App.tsx | head -100

Repository: RunMaestro/Maestro

Length of output: 3636


🏁 Script executed:

#!/bin/bash
# Find opening tag - look backwards from line 5655
sed -n '5500,5655p' src/renderer/App.tsx | grep -n "^[[:space:]]*<[A-Z]" | tail -3

# Or search directly in a smaller window
sed -n '5600,5620p' src/renderer/App.tsx

Repository: RunMaestro/Maestro

Length of output: 1051


🏁 Script executed:

#!/bin/bash
# Search from line 5400 to find the component opening tag
sed -n '5400,5620p' src/renderer/App.tsx | grep -n "^[[:space:]]*<[A-Z]" | tail -5

# Alternative: look for closing tags to identify what component has all these props
sed -n '5500,5620p' src/renderer/App.tsx | head -20

Repository: RunMaestro/Maestro

Length of output: 1014


🏁 Script executed:

#!/bin/bash
# Check full AppModalsProps interface for onOpenUnifiedInbox
sed -n '1765,2100p' src/renderer/components/AppModals.tsx | grep -n "onOpenUnifiedInbox\|onOpenDirectorNotes"

# Check complete UseSessionListPropsDeps for setAgentInboxOpen
sed -n '29,150p' src/renderer/hooks/props/useSessionListProps.ts | grep -n "setAgentInboxOpen\|setDirectorNotesOpen"

Repository: RunMaestro/Maestro

Length of output: 152


🏁 Script executed:

#!/bin/bash
# Get complete AppModalsProps - search for onOpenUnifiedInbox explicitly
rg -n "onOpenUnifiedInbox" src/renderer/components/AppModals.tsx

# Get complete UseSessionListPropsDeps - search for setAgentInboxOpen explicitly
rg -n "setAgentInboxOpen" src/renderer/hooks/props/useSessionListProps.ts

# Check the line numbers where these interfaces end
sed -n '1765,1900p' src/renderer/components/AppModals.tsx | grep -n "^}" | head -1

sed -n '29,150p' src/renderer/hooks/props/useSessionListProps.ts | grep -n "^}" | head -1

Repository: RunMaestro/Maestro

Length of output: 67


🏁 Script executed:

#!/bin/bash
# Confirm onOpenUnifiedInbox is NOT in AppModalsProps
grep -c "onOpenUnifiedInbox" src/renderer/components/AppModals.tsx

# Confirm setAgentInboxOpen is NOT in UseSessionListPropsDeps  
grep -c "setAgentInboxOpen" src/renderer/hooks/props/useSessionListProps.ts

# Show the context around onOpenDirectorNotes in AppModalsProps to see the pattern
sed -n '2000,2030p' src/renderer/components/AppModals.tsx

# Show the context around setDirectorNotesOpen in UseSessionListPropsDeps to see the pattern
sed -n '90,110p' src/renderer/hooks/props/useSessionListProps.ts

Repository: RunMaestro/Maestro

Length of output: 1977


🏁 Script executed:

#!/bin/bash
# Show where onOpenDirectorNotes appears in AppModalsProps context
sed -n '2010,2020p' src/renderer/components/AppModals.tsx

# Show where setDirectorNotesOpen appears in UseSessionListPropsDeps
sed -n '97,107p' src/renderer/hooks/props/useSessionListProps.ts

Repository: RunMaestro/Maestro

Length of output: 869


🏁 Script executed:

#!/bin/bash
# Check what component is rendered around line 5239
sed -n '5200,5250p' src/renderer/App.tsx | grep -B 50 "setAgentInboxOpen: encoreFeatures" | head -60

Repository: RunMaestro/Maestro

Length of output: 1084


🏁 Script executed:

#!/bin/bash
# Find what this object is being passed to
sed -n '5150,5200p' src/renderer/App.tsx

Repository: RunMaestro/Maestro

Length of output: 1202


🏁 Script executed:

#!/bin/bash
# Confirm AppModalsProps location and structure
sed -n '1765,1770p' src/renderer/components/AppModals.tsx

# Verify the component at line 5655 is AppModals
sed -n '5454,5460p' src/renderer/App.tsx

Repository: RunMaestro/Maestro

Length of output: 429


Add setAgentInboxOpen to UseSessionListPropsDeps and onOpenUnifiedInbox to AppModalsProps.

The code at lines 5239 and 5655–5657 passes these Unified Inbox props to dependent components, but the corresponding prop interfaces do not include them. This will cause TypeScript errors (TS2353/TS2322).

Add setAgentInboxOpen?: (open: boolean) => void; to UseSessionListPropsDeps (following the setDirectorNotesOpen pattern) and onOpenUnifiedInbox?: () => void; to AppModalsProps (following the onOpenDirectorNotes pattern).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/renderer/App.tsx` at line 5239, Add the missing unified inbox props to
the appropriate TypeScript interfaces: extend UseSessionListPropsDeps with an
optional setAgentInboxOpen?: (open: boolean) => void; following the existing
setDirectorNotesOpen pattern, and add onOpenUnifiedInbox?: () => void; to
AppModalsProps following the onOpenDirectorNotes pattern so the props passed at
setAgentInboxOpen: encoreFeatures.unifiedInbox ? setAgentInboxOpen : undefined
and the modal-open handler align with the declared interfaces.

setGroups,
setSessions,
setRenameInstanceModalOpen,
Expand Down Expand Up @@ -5633,6 +5652,9 @@ function MaestroConsoleInner() {
onOpenDirectorNotes={
encoreFeatures.directorNotes ? () => setDirectorNotesOpen(true) : undefined
}
onOpenUnifiedInbox={
encoreFeatures.unifiedInbox ? () => setAgentInboxOpen(true) : undefined
}
autoScrollAiMode={autoScrollAiMode}
setAutoScrollAiMode={setAutoScrollAiMode}
tabSwitcherOpen={tabSwitcherOpen}
Expand Down Expand Up @@ -6028,6 +6050,20 @@ function MaestroConsoleInner() {
</Suspense>
)}

{/* --- AGENT INBOX MODAL (lazy-loaded, Encore Feature) --- */}
{encoreFeatures.unifiedInbox && agentInboxOpen && (
<Suspense fallback={null}>
<AgentInbox
theme={theme}
sessions={sessions}
groups={groups}
enterToSendAI={enterToSendAI}
onClose={() => setAgentInboxOpen(false)}
onNavigateToSession={handleAgentInboxNavigateToSession}
/>
</Suspense>
)}

{/* --- GIST PUBLISH MODAL --- */}
{/* Supports both file preview tabs and tab context gist publishing */}
{gistPublishModalOpen && (activeFileTab || tabGistContent) && (
Expand Down
Loading