@@ -5,10 +5,15 @@ import ChatList from './components/ChatList'
55import ChatView from './components/ChatView'
66import ActivityList from './components/ActivityList'
77import TitleBar from './components/TitleBar'
8+ import PrototypeGallery from './components/PrototypeGallery'
89import { FreModal } from './components/common'
910import './App.css'
1011
12+ // Map prototype id → initial chat id
13+ const PROTOTYPE_CHAT = { p1 : 23 , p2 : 34 , p3 : 35 }
14+
1115export default function App ( ) {
16+ const [ selectedPrototype , setSelectedPrototype ] = useState ( null ) // null = gallery
1217 const [ activeView , setActiveView ] = useState ( 'chat' ) // 'chat' | 'activity'
1318 const [ activeChatId , setActiveChatId ] = useState ( 35 )
1419 const [ readChatIds , setReadChatIds ] = useState ( ( ) => new Set ( [ 35 ] ) )
@@ -28,6 +33,21 @@ export default function App() {
2833
2934 const dismissFre = useCallback ( ( ) => setShowFre ( false ) , [ ] )
3035
36+ const launchPrototype = useCallback ( ( id ) => {
37+ const chatId = PROTOTYPE_CHAT [ id ]
38+ setSelectedPrototype ( id )
39+ setActiveChatId ( chatId )
40+ setReadChatIds ( new Set ( [ chatId ] ) )
41+ setActiveView ( 'chat' )
42+ setNavIntent ( null )
43+ setShowFre ( true )
44+ } , [ ] )
45+
46+ const backToGallery = useCallback ( ( ) => {
47+ setSelectedPrototype ( null )
48+ setShowFre ( false )
49+ } , [ ] )
50+
3151 const selectChat = useCallback ( ( chatId ) => {
3252 setActiveChatId ( chatId )
3353 setReadChatIds ( prev => ( prev . has ( chatId ) ? prev : new Set ( prev ) . add ( chatId ) ) )
@@ -79,9 +99,20 @@ export default function App() {
7999
80100 const activityUnreadCount = activityEvents . reduce ( ( n , e ) => n + ( e . unread ? 1 : 0 ) , 0 )
81101
102+ if ( ! selectedPrototype ) {
103+ return (
104+ < div className = "app" >
105+ < TitleBar />
106+ < div className = "app-body" >
107+ < PrototypeGallery onLaunch = { launchPrototype } />
108+ </ div >
109+ </ div >
110+ )
111+ }
112+
82113 return (
83114 < div className = "app" >
84- < TitleBar onShowFre = { ( ) => setShowFre ( true ) } />
115+ < TitleBar onBack = { backToGallery } onShowFre = { ( ) => setShowFre ( true ) } />
85116 < div className = "app-body" >
86117 < NavRail
87118 activeView = { activeView }
@@ -113,7 +144,69 @@ export default function App() {
113144 clearNavIntent = { clearNavIntent }
114145 />
115146 </ div >
116- { showFre && (
147+ { showFre && selectedPrototype === 'p1' && (
148+ < FreModal
149+ title = "Day-one agent onboarding"
150+ subtitle = "Agent joins a group chat and instantly knows who's in the room — no user grounding required."
151+ onDismiss = { dismissFre }
152+ >
153+ < h3 className = "fre-section-title" > The problem</ h3 >
154+ < p >
155+ Every time an agent is added to a group chat, someone has to spend
156+ time briefing it: who the stakeholders are, what tools the group
157+ uses, what files exist, what decisions are in flight. That onboarding
158+ tax falls on the user — and it has to happen again for every new chat.
159+ </ p >
160+
161+ < h3 className = "fre-section-title" > The idea</ h3 >
162+ < p >
163+ At the moment an agent is added, it reads the existing thread —
164+ messages, file shares, @mentions, link cards — and synthesizes a
165+ structured brief automatically. The welcome message isn't a generic
166+ greeting; it's proof the agent already knows the room.
167+ </ p >
168+
169+ < h3 className = "fre-section-title" > What to look for</ h3 >
170+ < p >
171+ Open the < strong > Northwind launch</ strong > chat and scroll to the
172+ bottom. Claude's welcome card surfaces: the core team with roles,
173+ tools already in use (Figma, Jira, GitHub), files shared in the
174+ thread, and open items with urgency levels — all derived from the
175+ conversation history above.
176+ </ p >
177+ </ FreModal >
178+ ) }
179+ { showFre && selectedPrototype === 'p2' && (
180+ < FreModal
181+ title = "Context brief as a pinned tab"
182+ subtitle = "Agent synthesizes the chat into a living document and pins it where the team can always find it."
183+ onDismiss = { dismissFre }
184+ >
185+ < h3 className = "fre-section-title" > The problem</ h3 >
186+ < p >
187+ A welcome card in the thread is useful once, then it gets buried.
188+ New members joining later have no way to get up to speed without
189+ scrolling through hundreds of messages.
190+ </ p >
191+
192+ < h3 className = "fre-section-title" > The idea</ h3 >
193+ < p >
194+ Instead of posting a card, the agent writes a{ ' ' }
195+ < strong > context-brief.md</ strong > and pins it as a tab to the chat
196+ header. The brief is always one click away — a persistent,
197+ skimmable source of truth for anyone in the chat.
198+ </ p >
199+
200+ < h3 className = "fre-section-title" > What to look for</ h3 >
201+ < p >
202+ Open the < strong > Northwind launch</ strong > chat. Notice the pin icon
203+ tab next to "Chat" in the header. Click it to open the context brief:
204+ team roster, open items with status badges, tools, shared files, and
205+ key decisions — all in a document-style panel.
206+ </ p >
207+ </ FreModal >
208+ ) }
209+ { showFre && selectedPrototype === 'p3' && (
117210 < FreModal
118211 title = "Group intelligence for Teams agents"
119212 subtitle = "Agents monitor group conversations and decide when to engage — without waiting to be @mentioned."
0 commit comments