Skip to content

Commit 9959e5e

Browse files
samxu01claude
andcommitted
fix: agent-room DMs route to agent + member-list spacing
Backend: agent-room pods (1:1 user↔agent rooms created by Talk to) now auto-route every human message to the agent, same as agent-admin. The old code bailed at the type guard, leaving agent-rooms silent because the human's message lacked an explicit @mention. v1's DM flow used agent-admin pods so this regression only surfaced after v2 introduced agent-room. Frontend: restore "AI Agent" / role labels in the inspector member list (dropping them was overcorrection) and bump row padding to 10px + 2px between rows so two members no longer feel crammed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent e58a214 commit 9959e5e

4 files changed

Lines changed: 19 additions & 9 deletions

File tree

backend/controllers/messageController.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,10 @@ exports.createMessage = async (req: AuthRequest, res: Response): Promise<void> =
215215
}
216216

217217
const username = req.user?.username;
218-
if (pod.type === 'agent-admin') {
218+
// agent-admin (legacy 1:1 admin DM) and agent-room (1:1 user↔agent DM)
219+
// both auto-route every human message to the agent — no @mention needed.
220+
// Other pod types only fire on explicit @mentions.
221+
if (pod.type === 'agent-admin' || pod.type === 'agent-room') {
219222
await AgentMentionService.enqueueDmEvent({ podId, message, userId, username });
220223
} else {
221224
await AgentMentionService.enqueueMentions({ podId, message, userId, username });

backend/services/agentMentionService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ const enqueueDmEvent = async ({
386386
podId, message, userId, username,
387387
}: EnqueueDmOptions): Promise<EnqueueDmResult> => {
388388
const pod = await Pod.findById(podId).lean() as Record<string, unknown> | null;
389-
if (!pod || pod.type !== 'agent-admin') {
389+
if (!pod || (pod.type !== 'agent-admin' && pod.type !== 'agent-room')) {
390390
return { enqueued: false, reason: 'not_dm_pod' };
391391
}
392392

frontend/src/v2/components/V2PodInspector.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,6 @@ const V2PodInspector: React.FC<V2PodInspectorProps> = ({
366366
const key = agentKeyOf(agent);
367367
const isOnline = !!agent.lastHeartbeatAt
368368
&& Date.now() - new Date(agent.lastHeartbeatAt).getTime() < 10 * 60 * 1000;
369-
const purpose = agent.profile?.purpose || '';
370369
return (
371370
<button
372371
key={`agent-${key}`}
@@ -382,21 +381,20 @@ const V2PodInspector: React.FC<V2PodInspectorProps> = ({
382381
/>
383382
<span className="v2-inspector__member-meta">
384383
<span className="v2-inspector__member-name">{name}</span>
385-
{purpose && <span className="v2-inspector__member-role">{purpose}</span>}
384+
<span className="v2-inspector__member-role">AI Agent</span>
386385
</span>
387386
{isOnline && <span className="v2-online-dot" style={{ background: 'var(--v2-success)' }} />}
388387
</button>
389388
);
390389
})}
391390
{humanMembers.map((member) => {
392391
const role = memberRoleLabel(member, ownerId, false);
393-
const showRole = role === 'Owner';
394392
return (
395393
<div key={`human-${member._id}`} className="v2-inspector__member-row v2-inspector__member-row--static">
396394
<V2Avatar name={member.username || 'Unknown'} src={member.profilePicture || undefined} size="md" />
397395
<span className="v2-inspector__member-meta">
398396
<span className="v2-inspector__member-name">{member.username}</span>
399-
{showRole && <span className="v2-inspector__member-role">{role}</span>}
397+
<span className="v2-inspector__member-role">{role}</span>
400398
</span>
401399
</div>
402400
);

frontend/src/v2/v2.css

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2169,10 +2169,10 @@
21692169
.v2-inspector__member-row {
21702170
width: 100%;
21712171
display: grid;
2172-
grid-template-columns: 28px minmax(0, 1fr) auto;
2172+
grid-template-columns: 32px minmax(0, 1fr) auto;
21732173
align-items: center;
2174-
gap: 10px;
2175-
padding: 6px 8px;
2174+
gap: 12px;
2175+
padding: 10px 8px;
21762176
margin: 0 -8px;
21772177
background: transparent;
21782178
border: none;
@@ -2182,6 +2182,15 @@
21822182
transition: background 80ms ease;
21832183
}
21842184

2185+
.v2-inspector__member-row + .v2-inspector__member-row,
2186+
.v2-inspector__member-row + .v2-inspector__member-row--static {
2187+
margin-top: 2px;
2188+
}
2189+
2190+
.v2-inspector__member-meta {
2191+
gap: 3px;
2192+
}
2193+
21852194
.v2-inspector__member-row:hover {
21862195
background: var(--v2-surface-hover);
21872196
}

0 commit comments

Comments
 (0)