Skip to content

fix(social): plain face-room lines do not start Bot turns; UI polish (#167, #166) - #168

Merged
Birfy merged 1 commit into
ThinkFlowLab:mainfrom
Birfy:cursor/face-ui-167-166-dae8
Oct 17, 2026
Merged

Birfy merged 1 commit into
ThinkFlowLab:mainfrom
Birfy:cursor/face-ui-167-166-dae8

Conversation

@Birfy

@Birfy Birfy commented Oct 17, 2026

Copy link
Copy Markdown
Collaborator

Fixes #167 and part of #166 from the box UI polish pass.

#167: A plain human line in an open face-to-face room is logged and fanned out, but no Chief/Bot model turn starts unless @Name or @all. Regression in core/test/rounds.test.js.

#166 (partial):

  • Held own bubbles look pending (dashed), not like a finished sent bubble.
  • Approval preview strips To face room: / To the room: and wraps on word boundaries; Show more kept.
  • Face-room holds badge that room, not an unrelated friend row; the social-strip “N to approve” under the last sidebar row is gone.
  • Duplicate joined system lines are skipped.
  • Friend Bot details overview is Auto-send plus a muted Remove link.

Deferred (still on #166): full DSH settings-shell chrome, composer a11y name, chat-header tok jargon, no visible settings control on the friend row.

ARCH_DOCS_BASE=upstream/main npm run verify passes.

Fixes #167

A DSH composer prompt still relays a face-to-face human line, but
openingSpeakers starts no Bot unless @name / @ALL (ThinkFlowLab#167).

Held outgoing lines look pending, approval previews wrap on words
without a To face room: prefix, wait badges sit on the owning room,
join notices are not duplicated, and a friend's Bot details overview is
Auto-send plus a muted Remove. DSH settings-shell chrome, composer a11y
name, and chat-header tok jargon are unchanged.

ARCH_DOCS_BASE=upstream/main npm run verify passes.

Fixes ThinkFlowLab#167

Co-authored-by: Danyang Chen <birfychen@gmail.com>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 17, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-17T05:34:51.412771Z e22095b PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@Birfy
Birfy added this pull request to the merge queue Oct 17, 2026
Merged via the queue into ThinkFlowLab:main with commit cbbf047 Oct 17, 2026
6 checks passed

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e22095b947

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread core/src/host/groups.js
if (opener.late) return found.length > 0 ? found : members.filter(bot => bot.id === opener.askedBy)
if (found.length > 0 && !all) return found
// Face-to-face: a plain human line stays in the room. Only @Name / @all starts a Bot turn (#167).
if (isFaceRoom(room) && !all) return []

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Preserve scheduled turns in face rooms

When a scheduled task targets a face-to-face room, turns.js queues it as { text } and the schedule UI offers every roster.rooms entry, so a normal prompt such as “Where are we?” reaches this branch with neither all nor a named Bot. Returning no speakers makes the due automation silently perform no local model turn; limit the new suppression to actual human-authored lines (or preserve the opener source) rather than every plain opener.

Useful? React with 👍 / 👎.

Comment thread core/src/host/groups.js
import { GROUP_REF, output } from './tools.js'
import { failureLine } from './turns.js'
import { currentParticipants } from './room-membership.js'
import { currentParticipants, isFaceRoom } from './room-membership.js'

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Record the required host smoke result

This changes core/src/host/groups.js, but the commit's verification record mentions only ARCH_DOCS_BASE=upstream/main npm run verify; it does not report the required host smoke check as run or not run. Run the prescribed smoke command at this tip (and stop its bench), or explicitly record why it was not run, before treating the host behavior as verified.

AGENTS.md reference: AGENTS.md:L92-L92

Useful? React with 👍 / 👎.

const room = roster.roomsById?.[sessionId]
const multiHuman = (room?.participants ?? []).filter(p => p.kind === 'human' && p.leftSeq === undefined).length > 1
const incoming = author && !author.mine
const held = Boolean(room && room.origin === 'face-to-face' && !incoming && (room.pendingCount ?? 0) > 0)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Mark only the held message as pending

When a face room has any pending approval, pendingCount > 0 is room-wide, so this condition becomes true for every non-incoming user-message cell on every render. A single newly held line—or even a Bot-generated face-room draft—therefore restyles all older owner messages as unsent until the approval clears; attach the held state to the specific message/approval rather than the room count.

Useful? React with 👍 / 👎.

return pendingCache.items.filter(item => handles.has(norm(item.from)) || handles.has(norm(item.to)) || (faceId && item.roomId === faceId))
return pendingCache.items.filter((item) => {
if (item.kind === 'face_room_message') {
return Boolean(faceId) && (!item.roomId || item.roomId === faceId || item.roomId === room.id)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Keep roomless holds from attaching to every face room

When two face-to-face rooms are live and Bot Social returns a roomless face_room_message shape (which approvalView and approvalsForOpenChat explicitly accept), !item.roomId makes this provider include the same hold in every face room. Each room then gets a pending badge/card and pendingCount, so unrelated rooms appear to own the draft; keep an unscoped hold in a global queue or resolve a single room instead of matching every face ID.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Face-to-face: a human message that does not @ the Bot still starts a Chief model turn

2 participants