Skip to content

Commit b991228

Browse files
lambasuclaude
andcommitted
Add day-one agent onboarding prototype
- Seed Northwind launch group (contact 23) with rich 6-week thread: file shares (Excel checklist, Figma link, Word brief), Jira ticket refs, CDN/architecture decisions, clear go/no-go ownership - System message divider when Claude is added to the group - Claude's welcome card: stakeholder people grid, tool chips, files shared, and three actionable open items — all grounded in the thread - New card section types: `people` (avatar chip grid) and `chips` (tool/tag pill row) in MessageRow - CSS for system messages, card-people, card-chips in ChatView.css - FRE modal updated with feature narrative - Default open chat set to Northwind launch group Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 15ce986 commit b991228

5 files changed

Lines changed: 320 additions & 59 deletions

File tree

src/App.jsx

Lines changed: 28 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import './App.css'
1010

1111
export default function App() {
1212
const [activeView, setActiveView] = useState('chat') // 'chat' | 'activity'
13-
const [activeChatId, setActiveChatId] = useState(1)
14-
const [readChatIds, setReadChatIds] = useState(() => new Set([1]))
13+
const [activeChatId, setActiveChatId] = useState(23)
14+
const [readChatIds, setReadChatIds] = useState(() => new Set([23]))
1515
const [sessions, setSessions] = useState(initialSessions)
1616
const [dynamicSessionMessages, setDynamicSessionMessages] = useState({})
1717
// Activity feed: persist which events the user has opened so unread decorations clear.
@@ -115,56 +115,49 @@ export default function App() {
115115
</div>
116116
{showFre && (
117117
<FreModal
118-
title="Feature name"
119-
subtitle="One-sentence pitch for what this feature is and why it matters to the audience watching the demo."
118+
title="Day-one agent onboarding"
119+
subtitle="An agent added to a group chat already knows who's in the room, what they're working on, and what it can do — before anyone says a word."
120120
onDismiss={dismissFre}
121121
>
122122
<h3 className="fre-section-title">Today</h3>
123123
<p>
124-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Describe
125-
the current experience the demo audience is familiar with — the
126-
workflow, the surfaces, the people involved. Sed do eiusmod tempor
127-
incididunt ut labore et dolore magna aliqua, ut enim ad minim
128-
veniam, quis nostrud exercitation.
124+
When you add an agent to a group chat, the first thing you have to
125+
do is brief it. Who's on the team. What the project is. What tools
126+
you use. What decisions have already been made. It's a tax the team
127+
pays every time — and it scales badly as chats get longer and
128+
teams get larger.
129129
</p>
130130

131131
<h3 className="fre-section-title">Problem</h3>
132132
<p>
133-
Duis aute irure dolor in reprehenderit in voluptate velit esse
134-
cillum dolore. Name the friction sharply: what breaks down today,
135-
who feels it, and how often. Excepteur sint occaecat cupidatat non
136-
proident, sunt in culpa qui officia deserunt mollit anim id est
137-
laborum, consectetur adipiscing elit sed do eiusmod.
133+
Agents are context-blind on arrival. They can be capable once
134+
grounded, but grounding them is manual, inconsistent, and
135+
invisible to everyone else in the chat. The agent that arrives
136+
asking "how can I help?" puts the burden on the team to narrate
137+
work that's already been done.
138138
</p>
139139

140140
<h3 className="fre-section-title">Solution</h3>
141141
<p>
142-
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
143-
nisi ut aliquip ex ea commodo consequat. Walk through the new
144-
feature you're showing — the surface, the interaction, the moment
145-
of delight. Duis aute irure dolor in reprehenderit in voluptate
146-
velit esse cillum dolore eu fugiat nulla pariatur.
142+
When an agent joins a group chat, it reads the thread first. It
143+
surfaces what it learned — stakeholders and their roles, tools
144+
already in use, files shared, open decisions — in a single
145+
structured welcome message. Every action it proposes is grounded
146+
in the actual work happening in the chat, not a generic prompt.
147147
</p>
148148
<p>
149-
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
150-
officia deserunt mollit anim id est laborum. If the feature is
151-
best understood through a sequence, list the key beats here so the
152-
audience knows what to look for as the demo plays.
149+
Open the <strong>Northwind launch</strong> chat in the left panel.
150+
Scroll to the bottom: Claude was just added and sent its first
151+
message — already knowing the team, the tools, and the one
152+
launch-blocking ticket that needs attention right now.
153153
</p>
154154

155-
<h3 className="fre-section-title">What this Unlocks</h3>
155+
<h3 className="fre-section-title">What this unlocks</h3>
156156
<p>
157-
Sed ut perspiciatis unde omnis iste natus error sit voluptatem
158-
accusantium doloremque laudantium. Spell out the downstream wins —
159-
what gets faster, easier, or newly possible because of this
160-
feature. Totam rem aperiam, eaque ipsa quae ab illo inventore
161-
veritatis et quasi architecto beatae vitae dicta sunt explicabo.
162-
</p>
163-
<p>
164-
Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit
165-
aut fugit, sed quia consequuntur magni dolores eos qui ratione
166-
voluptatem sequi nesciunt. Close with the audience-specific
167-
takeaway — what the viewer should remember after the demo ends.
157+
Zero-briefing agent adoption. The team doesn't stop their work to
158+
onboard a new tool — the tool onboards itself. And because the
159+
agent's first message shows its reasoning, the team can verify
160+
what it knows before trusting what it does.
168161
</p>
169162
</FreModal>
170163
)}

src/components/ChatView.css

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -722,3 +722,98 @@
722722
.session-source-banner-link:hover {
723723
text-decoration: underline;
724724
}
725+
726+
/* ── System messages (e.g. "Claude was added to the conversation") ──────
727+
Centered full-width row with a horizontal rule on each side. */
728+
.system-message {
729+
display: flex;
730+
align-items: center;
731+
gap: 10px;
732+
padding: 10px 0 6px;
733+
margin: 4px 0;
734+
}
735+
736+
.system-message::before,
737+
.system-message::after {
738+
content: '';
739+
flex: 1;
740+
height: 1px;
741+
background: #E8E8E8;
742+
}
743+
744+
.system-message-text {
745+
flex-shrink: 0;
746+
font-size: 11.5px;
747+
color: #888;
748+
white-space: nowrap;
749+
}
750+
751+
/* ── Stakeholder people grid (card section type: people) ────────────── */
752+
.card-people {
753+
display: grid;
754+
grid-template-columns: 1fr 1fr;
755+
gap: 6px 10px;
756+
margin-top: 2px;
757+
}
758+
759+
.card-person {
760+
display: flex;
761+
align-items: center;
762+
gap: 7px;
763+
min-width: 0;
764+
}
765+
766+
.card-person-avatar {
767+
flex-shrink: 0;
768+
width: 26px;
769+
height: 26px;
770+
border-radius: 50%;
771+
display: flex;
772+
align-items: center;
773+
justify-content: center;
774+
font-size: 9.5px;
775+
font-weight: 600;
776+
color: #fff;
777+
letter-spacing: 0.02em;
778+
}
779+
780+
.card-person-text {
781+
min-width: 0;
782+
}
783+
784+
.card-person-name {
785+
font-size: 12px;
786+
font-weight: 500;
787+
color: #242424;
788+
white-space: nowrap;
789+
overflow: hidden;
790+
text-overflow: ellipsis;
791+
}
792+
793+
.card-person-role {
794+
font-size: 11px;
795+
color: #707070;
796+
white-space: nowrap;
797+
overflow: hidden;
798+
text-overflow: ellipsis;
799+
}
800+
801+
/* ── Tool / tag chips (card section type: chips) ─────────────────────── */
802+
.card-chips {
803+
display: flex;
804+
flex-wrap: wrap;
805+
gap: 5px;
806+
margin-top: 2px;
807+
}
808+
809+
.card-chip {
810+
display: inline-flex;
811+
align-items: center;
812+
padding: 2px 8px;
813+
border-radius: 10px;
814+
border: 1px solid #D0D0D0;
815+
background: #F5F5F5;
816+
font-size: 11.5px;
817+
color: #424242;
818+
font-weight: 500;
819+
}

src/components/MessageRow.jsx

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,39 @@ function CardMetrics({ metrics }) {
100100
)
101101
}
102102

103+
// People grid — stakeholder chips with initials avatar + name + role.
104+
function CardPeople({ people }) {
105+
return (
106+
<div className="card-people">
107+
{people.map((person, i) => (
108+
<div key={i} className="card-person">
109+
<div
110+
className="card-person-avatar"
111+
style={{ background: person.color || '#6264A7' }}
112+
>
113+
{person.initials}
114+
</div>
115+
<div className="card-person-text">
116+
<div className="card-person-name">{person.name}</div>
117+
<div className="card-person-role">{person.role}</div>
118+
</div>
119+
</div>
120+
))}
121+
</div>
122+
)
123+
}
124+
125+
// Tool / tag chips — a flex-wrap row of pill labels.
126+
function CardChips({ chips }) {
127+
return (
128+
<div className="card-chips">
129+
{chips.map((chip, i) => (
130+
<span key={i} className="card-chip">{chip}</span>
131+
))}
132+
</div>
133+
)
134+
}
135+
103136
function CardBars({ bars }) {
104137
const max = bars.reduce((acc, b) => Math.max(acc, b.value), 0) || 1
105138
return (
@@ -170,6 +203,14 @@ function ThreadReplyBadge({ reply, onClick }) {
170203
}
171204

172205
export default function MessageRow({ message, activeContact, onOpenThread }) {
206+
if (message.isSystem) {
207+
return (
208+
<div className="system-message">
209+
<span className="system-message-text">{message.text}</span>
210+
</div>
211+
)
212+
}
213+
173214
const isMe = message.senderId === 'me'
174215
const isMultiParty = activeContact.isGroup || activeContact.isChannel
175216
const sender = isMe
@@ -255,6 +296,8 @@ export default function MessageRow({ message, activeContact, onOpenThread }) {
255296
{section.heading && <div className="card-section-heading">{section.heading}</div>}
256297
{section.text && <div className="card-section-text">{section.text}</div>}
257298
{section.facts && <CardFacts facts={section.facts} />}
299+
{section.people && <CardPeople people={section.people} />}
300+
{section.chips && <CardChips chips={section.chips} />}
258301
{section.bullets && (
259302
<ul className="card-bullets">
260303
{section.bullets.map((b, k) => <li key={k}>{b}</li>)}

src/data/contacts.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ export const projectNorthwind = [
9797
{ contactId: 21, bold: true },
9898
{ contactId: 25, bold: true },
9999
{ contactId: 22 },
100-
{ contactId: 23 },
100+
{ contactId: 23, bold: true },
101101
{ contactId: 24 },
102102
]
103103

0 commit comments

Comments
 (0)