Why now
Two hunks in patches/@astryxdesign+core+0.4.5.patch are now upstream. The blank userAgentData.platform fix we carry in dist/Kbd/Kbd.js and dist/hooks/useHotkeys.js landed as facebook/astryx#5325 and ships in 0.5.0, so we can drop them.
patch-package keys the patch file to the exact version, so the file has to be regenerated as +0.5.0.patch either way.
Patch state against 0.5.0
Dry-ran the current patch against the 0.5.0 tarball with git apply --check. Exactly two hunks fail, and they are the two that are now redundant:
error: dist/Kbd/Kbd.js:111: patch does not apply
error: dist/hooks/useHotkeys.js:54: patch does not apply
Everything else still applies. Four files need an offset:
| file |
offset |
dist/SideNav/SideNavItem.js |
+1 |
src/Chat/ChatToolCalls.tsx |
+9 |
src/DropdownMenu/DropdownMenuItem.tsx |
+3 (×3) |
src/SideNav/SideNavItem.tsx |
+7, +7, +8 |
The Markdown and useStreamingText hunks, which are the largest ones we carry, apply clean. So the rebuild is mechanical: delete two hunks, re-record the rest.
0.5.0 breaking changes, checked against our tree
Banner drops defaultIsExpanded. We are not affected. The only defaultIsExpanded in our source is our own prop in packages/ui/src/astryx-chat-reasoning.tsx, unrelated to Banner, and no <Banner> call site passes it. If we run the banner-collapsible-content codemod, confirm it leaves that file alone.
Overlays now share one dismissal stack. A window keydown listener now sees an Escape that a focus-trapped layer used to swallow, arriving with defaultPrevented already true. Three listeners in our tree:
apps/desktop/src/renderer/app-shell-overlays.tsx:144 already bails on event.defaultPrevented, so it should be unaffected.
apps/desktop/src/renderer/features/workbar/controller/use-workbar-controller.ts:623 is capture-phase but only handles modifier combos, no Escape.
packages/ui/src/composer.tsx:743 handles both Escape and IME composition on its own root. 0.5.0 changes how a composition-cancelling Escape is claimed, so this one needs manual verification, ideally with a CJK IME.
Not blocking
facebook/astryx#5394 folds both platform checks into one shared util and also treats Unknown as no answer. Merged, but only on canary. No behavioural difference for us, so nothing to wait for.
Steps
- Bump
@astryxdesign/core to 0.5.0 in package.json, packages/ui/package.json, and apps/desktop/package.json.
- Delete the
Kbd.js and useHotkeys.js hunks, re-record with patch-package, land it as patches/@astryxdesign+core+0.5.0.patch.
- Verify composer Escape and IME behaviour by hand.
- Re-check the Banner codemod against
astryx-chat-reasoning.tsx if we run it.
Investigation and draft prepared with Claude Code; verified by the reporter before filing.
Why now
Two hunks in
patches/@astryxdesign+core+0.4.5.patchare now upstream. The blankuserAgentData.platformfix we carry indist/Kbd/Kbd.jsanddist/hooks/useHotkeys.jslanded as facebook/astryx#5325 and ships in 0.5.0, so we can drop them.patch-packagekeys the patch file to the exact version, so the file has to be regenerated as+0.5.0.patcheither way.Patch state against 0.5.0
Dry-ran the current patch against the 0.5.0 tarball with
git apply --check. Exactly two hunks fail, and they are the two that are now redundant:Everything else still applies. Four files need an offset:
dist/SideNav/SideNavItem.jssrc/Chat/ChatToolCalls.tsxsrc/DropdownMenu/DropdownMenuItem.tsxsrc/SideNav/SideNavItem.tsxThe Markdown and
useStreamingTexthunks, which are the largest ones we carry, apply clean. So the rebuild is mechanical: delete two hunks, re-record the rest.0.5.0 breaking changes, checked against our tree
Banner drops
defaultIsExpanded. We are not affected. The onlydefaultIsExpandedin our source is our own prop inpackages/ui/src/astryx-chat-reasoning.tsx, unrelated to Banner, and no<Banner>call site passes it. If we run thebanner-collapsible-contentcodemod, confirm it leaves that file alone.Overlays now share one dismissal stack. A
windowkeydown listener now sees an Escape that a focus-trapped layer used to swallow, arriving withdefaultPreventedalready true. Three listeners in our tree:apps/desktop/src/renderer/app-shell-overlays.tsx:144already bails onevent.defaultPrevented, so it should be unaffected.apps/desktop/src/renderer/features/workbar/controller/use-workbar-controller.ts:623is capture-phase but only handles modifier combos, no Escape.packages/ui/src/composer.tsx:743handles both Escape and IME composition on its own root. 0.5.0 changes how a composition-cancelling Escape is claimed, so this one needs manual verification, ideally with a CJK IME.Not blocking
facebook/astryx#5394 folds both platform checks into one shared util and also treats
Unknownas no answer. Merged, but only on canary. No behavioural difference for us, so nothing to wait for.Steps
@astryxdesign/coreto0.5.0inpackage.json,packages/ui/package.json, andapps/desktop/package.json.Kbd.jsanduseHotkeys.jshunks, re-record withpatch-package, land it aspatches/@astryxdesign+core+0.5.0.patch.astryx-chat-reasoning.tsxif we run it.Investigation and draft prepared with Claude Code; verified by the reporter before filing.