Skip to content

feat(desktop): Mission Inbox — Cần bạn / Đang bay / Xong with in-place open - #96

Merged
oscarlehuu merged 1 commit into
mainfrom
feat/issue-81
Aug 7, 2026
Merged

feat(desktop): Mission Inbox — Cần bạn / Đang bay / Xong with in-place open#96
oscarlehuu merged 1 commit into
mainfrom
feat/issue-81

Conversation

@oscarlehuu

Copy link
Copy Markdown

Summary

Mission-control series (#81, spike decision: Inbox 3 sections, thread opens in place):

  • Cần bạn: pending approvals (46010) + user-input requests (46040) from the unified needsYouStore
  • Đang bay: active agent turns (summaries now carry channel ids)
  • Xong: recent conversation outcomes
    Pure derivation (missionInbox.ts) over a new reference-stable getNeedsYouForAll snapshot (generation-invalidated, cleared on every prune path), mapped to existing InboxItems by conversation id. No rival store; community-reset wired.

In-place open & navigation discipline

Row click → Home's existing detail surface (Buzz's Inbox thread surface with composer — reviewer-accepted as the in-place surface for the locked decision). No feed item → fall back to channel thread context using the request's real 64-hex root event id; no real id → plain channel open. Never a conversation UUID posing as an event id, never a silent no-op.

Live 46040 on Home

Per-channel live subscriptions (same buildChannelUserInputFilter as useChannelUserInput) through useLiveHomeFeedActions; resolve on 46041 ANSWER + 46042 RESOLVED — Cần bạn clears without visiting the channel. Subscription effect keys on a joined id string (immune to caller array-identity churn — protects the pre-existing 46010 subscriptions too).

Store unification note

This branch originally extended needsYouStore by routing 46040 through the approval lifecycle; that variant was dropped for #80's canonical separate-family store when #94 merged. Only branch store delta: getNeedsYouForAll + its cache discipline.

Tests & verify

22 unit tests (sections from unified store, identity mapping, allCache, store lifecycle) · e2e: production-shaped live 46040 → Cần bạn row → in-place detail (URL unchanged) + real 46041 answer resolution + channel fallback navigation, ×2 green, hash-distinct screenshots · pnpm run check + tsc clean (AppShell held at the 1000-line ratchet).

Built by gpt-5.6-luna max (build + three fix rounds); reviewed by grok-4.5 across three rounds — r1 store conflation + identity gaps; r2 production-impossible feed shapes, silent clicks, UUID-as-event-id; r3 verified live ingest/resolve + click table ('fix A then approvable' — the subscription-stability fix A applied by the orchestrator).

Fixes #81

…e open

Home's inbox now leads with three mission sections derived from the
stores that already know the answer: Cần bạn (pending approvals and
user-input requests from needsYouStore — both 46010 and 46040
families), Đang bay (active agent turns, now carrying channel ids),
and Xong (recent conversation outcomes). Sections are pure derivation
(missionInbox.ts) over a new reference-stable getNeedsYouForAll
snapshot (generation-invalidated, cleared on every prune path), mapped
to existing InboxItems by conversation id — no rival store, reset on
community switch.

Clicking a row opens the conversation in place through Home's existing
detail surface; rows without a feed item fall back to the channel
thread context using the request's real 64-hex root event id — never a
conversation UUID posing as an event id, and never a silent no-op. The
'→ channel' affordance uses the same id discipline.

Home now ingests 46040 user-input requests live (per-channel
subscriptions using the same filter as useChannelUserInput, wired
through useLiveHomeFeedActions) and resolves them on 46041 answers and
46042 resolutions, so Cần bạn clears without visiting the channel. The
subscription effect keys on a joined channel-id string, immune to
array-identity churn from callers.

Store note: this branch originally carried its own 46040 extension
routing user input through the approval lifecycle; it was dropped in
favor of #80's canonical separate-family store when that merged.

Three grok-4.5 review rounds: r1 flagged the store conflation and
identity gaps; r2 (post-unification) found production-impossible feed
shapes, silent clicks, and UUID-as-event-id navigation; r3 verified
the live ingest/resolve path and click table, with the final
subscription-stability fix applied by the orchestrator.

Fixes #81

Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
@oscarlehuu
oscarlehuu merged commit 2526312 into main Aug 7, 2026
10 of 12 checks passed
@oscarlehuu
oscarlehuu deleted the feat/issue-81 branch August 7, 2026 07:12
oscarlehuu added a commit that referenced this pull request Aug 7, 2026
* fix(desktop): translate Mission Inbox section labels to English

PR #96 shipped the Mission Inbox with Vietnamese section labels
(Cần bạn / Xong / Đang bay) left over from the design prototype,
while every other string in the product is English — the empty
states right under those headers already say "Nothing needs you"
and "Nothing ready to review". Rename to Needs you / Ready to
review / In flight and update the e2e assertions.

Verified: biome + tsc clean, mission-inbox.spec.ts smoke 1/1.
Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>

* fix(desktop): biome import-type + format fixes blocking Desktop Fast

Two pre-existing lint/style/useImportType errors on main (merged while
main CI runs were cancelled) fail Desktop Fast on any new branch:
MessageComposer.tsx and useMentionSendFlow.ts. Auto-fixed with biome,
plus formatting of the widened label object literal.

Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>

---------

Signed-off-by: oscarlehuu <oscar.lehuu@gmail.com>
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.

Mission control: Inbox sections (Need you / Ready / Working) with in-place thread panel

1 participant