* fix(chat): dispatch table rows through component, not children
MarkdownTableComponent template used <chat-md-children [parent]="row">
which walked the row's children (cells) directly under <thead>/<tbody>,
skipping the <chat-md-table-row> wrapper entirely. Result: bare cells
appeared under thead/tbody and the row component (with its IS_HEADER_ROW
DI plumbing) was never instantiated, so cells couldn't tell whether to
render <th> or <td>.
Caught by live browser smoke testing in ~/tmp/ngaf — Chrome inspection
showed the parser produced 3 row nodes but the rendered DOM had zero
<chat-md-table-row> elements. Fixed by importing MarkdownTableRowComponent
and dispatching each row through it directly.
Synchronized version bump to 0.0.24 across all 16 @ngaf libs.
* fix(chat): citation marker without URL renders span, not broken anchor
Live Chrome smoke caught: when a Pandoc citation def has a bare URL (no
<autolink> brackets), mdDefToCitation returns Citation { url: undefined }.
Prior template used [href]="r.citation.url ?? null" which Angular
serialized as href="" — a broken anchor that renders as a clickable link
that goes nowhere.
Fix: split the resolved branch into "with URL" (renders <a>) and
"without URL" (renders <span class="chat-citation-marker--no-url">).
The span shows the bracket marker but is non-interactive, matching the
unresolved fallback's contract.
Also switched from [href] property binding to [attr.href] for explicit
attribute removal when null.
Regression test pins both branches.
* fix(chat): chat-citations panel surfaces markdown-sidecar citations too
Live Chrome smoke caught: when citations come from Pandoc-formatted
[^id]: defs in message content (no provider metadata in
additional_kwargs.citations), inline markers resolved correctly via the
markdown sidecar but the sources panel under the message never rendered
— defeating the click-to-source affordance.
Fix: ChatCitationsComponent now optionally injects CitationsResolverService
and merges markdown-sidecar defs (via mdDefToCitation) into its citations
list, with Message.citations taking precedence by id. Behavior matches
the same precedence as inline-marker resolution.
Two new regression tests pin both behaviors: markdown-only citations
appear in the panel; Message.citations wins on id overlap.
* fix(chat): task-list checkbox aligns inline with first-paragraph text
Live Chrome smoke caught: checkbox rendered on a separate line above the
task text because <chat-md-paragraph> > <p> is block-level, pushing the
content below the input. Now uses flexbox on the .chat-md-list-item--task
container to align checkbox + content baseline, and collapses the inner
<p> margin so tight tasks read as a single line.
Multi-paragraph task items (sub-lists, additional paragraphs) still flow
correctly because flex-wrap is enabled and only direct children flex.
* fix(chat): only collapse first-paragraph margin in task items
Live Chrome smoke caught: prior fix collapsed margin on ALL paragraphs
inside task items, so multi-paragraph content ran together with no
visible break (e.g. "write reportCoral reefs are diverse..." running
into the next block when the model emitted prose immediately after a
task item without a blank line).
Refined: only the FIRST paragraph of a task item collapses its margin
(so it aligns inline with the checkbox). Subsequent blocks keep normal
vertical spacing.