You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Direct chat with a friend's Bot: my own typed line is sent as Chief and held for my approval (regression of #179 in DMs) #227
Found by self-test on 38c00b40f0c3e6193c7a8abcfb7aad25673f40f7 (main after #217; core, plugins/social, plugins/tree) on @deepseek-ai/dsh@0.2.0-rc.2, Node 24. Two fresh installs on one Linux box: A :3080 (owner SelfA0333, @selfa0333.home, Bots Chief + Helper), B :3081 (owner SelfB0333, @selfb0333.home, Chief). Bot Social https://47-80-69-220.sslip.io. Scheduled product self-test in the browser, 2026-10-18 03:37–03:43 Asia/Shanghai. No model key in this run, so Bot replies were not tested. Screenshots were not saved; screens are described in text.
Repro
Same setup as the held-line issue: Helper (A's Bot) is granted to B. On B, open Helper and type Hello Helper, this is B testing. (B, the person, typed it; Chief was not asked to write anything).
Actual
B's approval box reads Chief → Helper, so B must approve a line B just typed, and it is labelled as written by Chief.
On A, the line shows as from "SelfB0333's Chief" with Chief's avatar, not from SelfB0333.
Expected (owner design)
A line the owner types is from the person (SelfB0333), on both sides, with the person's name and avatar.
Typing it is the approval: no card for the owner's own typed line. Approval cards are for Bot-written lines only.
The composer for a remote member calls social/send → flybot.bot.send({ from: <Chief>, via: 'composer' }) (plugins/social/src/social.js ~L1509). On Bot Social the message is sent from Chief's handle, so the server holds it as Chief's outbound and the receiver shows Chief as the author.
approvalView() (plugins/social/src/social.js ~L97) shows You only if the server item carries via: 'composer' or sender_kindowner/human. The list_approvals item evidently carries neither, so the card falls back to the Bot name.
PR #231 fixes part of this issue (the sender side):
A line you type in a friend Bot's chat goes out at once.
Typing it counts as the approval. The host approves only the hold id it recorded from its own send_as_member call, never based on the message text.
You no longer get a Chief → Helper card or a "waits for your approval" reply.
Still open: the receiver side. On A, the line still shows as from SelfB0333's Chief, not from SelfB0333.
I first tried marking the line with the FLYBOT-FACE-HUMAN envelope and attributing it on receipt, as face rooms do (#180). Review pointed out that the envelope text is not authenticated: any peer could send it and have a Bot's words render as its owner. That includes an older FlyBot whose Bot echoes the envelope, or a custom client. So #231 removed that, and an incoming envelope-looking direct line stays the Bot's line.
What would close this: Bot Social needs to carry a structured flag that the person typed the line, set by the sending host and not by the text. For example:
an optional typed_by_owner: true on send_as_member, honoured only for an owner/connector principal, never a Bot token;
surfaced on message.received as a stamped field, e.g. from.typed_by_owner alongside owner_display_name.
FlyBot would then set the flag only from sendChat and draw the person's bubble only when the flag is present.
Note: the face-room receive path (renderFaceEvent → parseFaceHuman) has the same text-only trust today. It could move to the same flag.
Activity
kunalRay21 commentedon Oct 17, 2026
Hey! I'd like to take this issue on. Could you assign it to me? I'll investigate the root cause and work on a fix. Thanks!
fix(social): drop receiver-side person attribution; typed lines stay …
Birfy commentedon Oct 17, 2026
PR #231 fixes part of this issue (the sender side):
send_as_membercall, never based on the message text.Chief → Helpercard or a "waits for your approval" reply.Still open: the receiver side. On A, the line still shows as from SelfB0333's Chief, not from SelfB0333.
I first tried marking the line with the
FLYBOT-FACE-HUMANenvelope and attributing it on receipt, as face rooms do (#180). Review pointed out that the envelope text is not authenticated: any peer could send it and have a Bot's words render as its owner. That includes an older FlyBot whose Bot echoes the envelope, or a custom client. So #231 removed that, and an incoming envelope-looking direct line stays the Bot's line.What would close this: Bot Social needs to carry a structured flag that the person typed the line, set by the sending host and not by the text. For example:
typed_by_owner: trueonsend_as_member, honoured only for an owner/connector principal, never a Bot token;message.receivedas a stamped field, e.g.from.typed_by_owneralongsideowner_display_name.FlyBot would then set the flag only from
sendChatand draw the person's bubble only when the flag is present.Note: the face-room receive path (
renderFaceEvent→parseFaceHuman) has the same text-only trust today. It could move to the same flag.docs(plugin-runtime): chats.deliver human/ownerName (#227)
Document the typedBy remote source for the DM person rendering (#233 …
Show a friend's attested typed line to my own Bot as the person (#233 …
Document the typedBy remote source for the DM person rendering (#233 …
Merge origin/main (#239) to clear the new conflicts in the typed-line…
Restore the bullet break lost in the #227 doc merge
ThinkFlowLab#737: Auto-send clears Bot Social's own hold, so the line…