Port the mai-ios block parser into LumaCore; render headings,
lists, tables, task lists, blockquotes, code blocks and
footnotes across the SwiftUI and GTK frontends.
Parse inline spans and rewrite LaTeX to Unicode in LumaCore so
both frontends share one parser. Highlight code through
StyledText. Drop the inline-only AttributedString path.
Co-authored-by: trufae <[email protected]>
Approving a tool call popped the global action-queue popover,
which evicted the Notes & AI chat. Show approve/reject inline in
the address-note chat, with the tool's code preview, and skip the
global auto-present for ambient note-reply actions.
On GTK host the chat in an Adw.Dialog; a GtkPopover dismisses
itself during layout passes, so it can't stay open while the
reply streams. Render the code preview with a native monospace
view rather than the embedded web editor.
Track the in-flight reply text on the engine so it survives the
chat closing and restores on reopen.
Append new threads to the end and pre-select notes.last when
opening or after deletion. Show a check next to the active
thread in the switcher (SwiftUI Label icon, GTK
object-select-symbolic).
Add a pencil button to the popover header that opens a rename
UI (SwiftUI alert / GTK inline popover) seeded with the current
title. Save via engine.updateAddressNote so the existing
noteUpsert collab op broadcasts the change.
Mirror the GTK thread UI: stacked save/ask buttons, edit and
delete on user messages with confirmation, auto-focus and
auto-scroll on open, right-side anchor, chat-style bottom
anchor when content is short.
Move the gutter indicator out of an offset overlay into a real
sibling so it receives clicks. Gate the disassembly key
shortcuts while the popover is open so Enter inserts a newline
in the editor.
requestAIReply now accepts an onDelta callback and forwards
provider textDelta events to it. Both frontends append a
placeholder assistant message that grows token-by-token, then
swap it for the persisted message on completion.
While here:
- GTK send button hides its icon when the spinner is showing
(was awkwardly flush against it).
- Stack the Save and Ask AI buttons vertically so the text
entry can be wider.
- Sticky-bottom scroll: stay pinned to the latest message as
long as the user hasn't scrolled away.
- Show "Assistant" instead of "default" when the model id is
unset / the provider's default.
Extracts the avatar stack used by notebook entries into a shared
view; reuses it on the mission list/detail and in the address-
note popover header and message rows.
Disasm-row context menu opens a popover with the address's note
threads, lets the user write notes or ask the LLM, and offers
"Go to function start" as a non-LLM nav helper. Gutter shows a
chat-bubble breadcrumb when a row has threads.