Repository navigation
One thread composer (shared mention model + speech), un-shadowed type-node URLs, colorful SVG on native - #2140
Merged
Merged
Conversation
…complete, RN parity, app bar retired WIP checkpoint of the composer consolidation (branch continues): - @meshweaver/client-web: Mesh.autocomplete — THE one AutocompleteRequest implementation (portal + portal-next each hand-rolled the same observe; the #1497 drift shape), targeted at the viewer's home hub; [] on any failure. Fake-transport responder + tests. - @meshweaver/react core: useMentionModel — the platform-free @-mention half of the composer (token tracking, debounced generation-guarded fetch, highlight, splice-on-pick). The web ThreadChat leaf now consumes it (same behavior, no duplicate logic); exported via core. - RN: ComposerBar — the native skin over the same model (dropdown, mic with tap-dictate + hold-PTT via the existing PushToTalkController, glyph send), mounted by the ThreadChat leaf; buildMeshOps wires autocomplete (partition thunk: a remote's identity resolves via whoami AFTER connect) and userId became a getter for the same reason. The app-level "Message the mesh…" bar is REMOVED — the composer is the mesh-rendered ThreadChatControl, same as Blazor. - Clickable STACKS post the ClickedEvent in BOTH JS packs (web DefaultStackSkin + RN stack skin) — Blazor's LayoutStack behavior; the Store's category tiles were inert cards in every JS shell without it. (The server answers with a NavigationRequest the JS clients don't consume yet — next commit.) - i18n: chat.recording / chat.transcribing in both server catalogs + the react mirror (drift guard green). grpc-web 81 ✓, react 293 ✓, RN 164 ✓; typechecks + react build green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…lients; colorful SVG on native Completes the composer/navigation change set (first half in the previous commit): - RESOLVER (the root cause behind dead Store categories, REPRODUCED ON PROD BLAZOR): a NodeType DEFINITION node shadows same-named AREA URLs — Store/Catalog (the type node) stole /Store/Catalog/Catalog?category=… from the Store node's Catalog area, so the framework type-catalog answered "Collection ?category=… is not mapped" on every client. Navigation-only RewriteTypeNodeShadow (same scope rule as RewriteLegacyUserHome: routing + reads literal, exact navigation TO the type node untouched), pinned by TypeNodeShadowResolutionTest ×3; adjacent nav regressions (legacy user home, redirects) re-run green ×15. Predicate deliberately narrow (NodeType=="NodeType"); the comment names the #2137 widening path (ExcludeFromContext / registration set) per coordination with that branch. - NavigationRequest lands on JS clients: MeshWebConnection.onMessage (unsolicited typed deliveries — the client twin of the Blazor portal hub's WithHandler), and the RN app resolves the uri server-side (POST /api/mesh/resolve, portal-next's fetchAreaTarget twin) into a NavTarget with area/id — the query rides in the Id, prefixed by the area name (the LayoutAreaReference.GetParameterValue contract; a bare "?…" id reads as a data-collection id and fails). - Colorful SVG on native: ONE IconGlyph (classifyIcon → SvgXml / SvgUri / Image / emoji, instance-resolved URLs) used by the Icon leaf and the left-menu rows (which had inlined "/static/….svg" into the LABEL); doc pages interleave standalone inline <svg> diagrams through SvgXml (they were in ignoredDomTags — every diagram silently dropped on a device). - i18n: chat.recording / chat.transcribing (en+de, server + react mirror); LocalizationTest 56 ✓, drift guard ✓. grpc-web 82 ✓, react 293 ✓, RN 164 ✓; Hosting + Messaging.Hub Release -warnaserror clean; verified live: Store category click end-to-end vs prod (web) and the home/composer on the iOS simulator vs the sidecar. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Contributor
Contributor
Contributor
Contributor
Contributor
Test Results (shard 2)3 287 tests - 18 3 287 ✅ - 18 7m 54s ⏱️ +9s Results for commit 6eee647. ± Comparison against base commit 3cdcad4. This pull request removes 38 and adds 20 tests. Note that renamed tests count towards both.♻️ This comment has been updated with latest results. |
Contributor
Test Results (shard 1)1 769 tests +21 1 769 ✅ +21 9m 8s ⏱️ +18s Results for commit 6eee647. ± Comparison against base commit 3cdcad4. This pull request removes 17 and adds 38 tests. Note that renamed tests count towards both.♻️ This comment has been updated with latest results. |
Contributor
Copilot stopped reviewing on behalf of
rbuergi due to an error
August 24, 2026 11:57
rbuergi
added a commit
that referenced
this pull request
Aug 24, 2026
…d globalThis.expo at import Conflict resolutions (per the cross-session analysis + verified by running): - package.json: the 57 line wholesale, KEEPING main's newer non-Expo pins (marked ^18.0.10, react-native-svg 15.15.5, vitest ^4.1.11); lockfile regenerated, never hand-merged. - App.tsx: main's side — the app-level chat bar was deleted (#2140); the composer lives in the ThreadChat leaf. rnComposer adopts the recorder's 57-era name (ExpoAudioRecorder). - vitest.config.ts: the branch's premise — "expo-constants and friends must keep resolving to the real packages" — is EMPIRICALLY WRONG once code under test imports them (post-#2140 the connection/composer paths do): SDK 57's entries still read `globalThis.expo.EventEmitter` (expo-modules-core) at import, which only a real Expo runtime provides. Main's per-package mocks return (minus expo-av, which is gone on 57) plus a new expo-audio mock for the composer's recorder. Verified on the merged tree: typecheck ✓, RN 168 ✓, web-export Playwright e2e 5 ✓. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Follow-up to #2129, built live with the maintainer driving the app. Three strands:
1. ONE thread composer — the core model, everywhere
useMentionModelin@meshweaver/reactcore: the platform-free @-mention half of the composer (caret token tracking, debounced generation-guardedMeshOps.autocompletefetch, highlight, splice-on-pick). The web ThreadChat leaf consumes it (no behavior change); the new RNComposerBaris the native skin — dropdown, mic (tap-dictate + hold-PTT via the existingPushToTalkController), glyph send.Mesh.autocompletein@meshweaver/client-web: THE oneAutocompleteRequestimplementation (portal + portal-next each hand-rolled the same observe — the Three shells hand-roll the same four /api/mesh fetches — the drift generator behind #1474 (token, error semantics and basePath already differ) #1497 drift shape), targeted at the viewer's home hub. RN wires it through a partition thunk (a signed-in remote's identity resolves via whoami after connect).ThreadChatControl, same as Blazor. Verified live: typing@Docagainst prod opens real mesh suggestions.2. Store categories were dead on EVERY client — including prod Blazor
Clickable stacks now post
ClickedEventin both JS packs (the tiles areisClickablestacks — inert before),MeshWebConnection.onMessagedelivers the server's unsolicitedNavigationRequest(the client twin of the Blazor portal hub'sWithHandler), and the RN app resolves the uri viaPOST /api/mesh/resolveinto address/area/id (query rides in the Id, area-prefixed — theLayoutAreaReference.GetParameterValuecontract).That exposed the real root cause, reproduced on prod Blazor (
/Store/Catalog/Catalog?category=Games→ "Collection ?category=Games is not mapped in Address Store/Catalog"): a NodeType DEFINITION node shadows same-named AREA URLs inResolveNavigationPath—Store/Catalog(the type node) steals the prefix of the Store node'sCatalogarea. Fixed with a navigation-onlyRewriteTypeNodeShadow(routing/reads stay literal; exact navigation TO the type node untouched), pinned byTypeNodeShadowResolutionTest×3; adjacent nav regressions re-run green ×15. Coordinated with #2137 (content-visibility): predicate stays the narrowNodeType=="NodeType"for now; the comment names the agreed widening path.3. Colorful SVG on native
One
IconGlyph(sharedclassifyIcon→SvgXml/SvgUri/Image/emoji, instance-resolved URLs) for the Icon leaf and the left-menu rows (which inlined/static/….svginto the label); doc pages interleave standalone inline<svg>diagrams throughSvgXml(previously inignoredDomTags— every diagram silently dropped on a device).i18n:
chat.recording/chat.transcribingin en+de, server catalogs + react mirror (drift guard ✓,LocalizationTest56 ✓).Verification: grpc-web 82 ✓ · react 293 ✓ · RN 164 ✓ · RN Playwright e2e ✓ · Hosting + Messaging.Hub Release
-warnaserrorclean · Store category click verified end-to-end against prod (web) · home/composer/mic verified on the iOS simulator against the sidecar.What's New entry included (Category: Fix).
🤖 Generated with Claude Code