feat(board-agent): add tool steps overview in floating island#55
Merged
winlp4ever merged 11 commits intomainfrom Apr 24, 2026
Merged
feat(board-agent): add tool steps overview in floating island#55winlp4ever merged 11 commits intomainfrom
winlp4ever merged 11 commits intomainfrom
Conversation
Removes the client-only data.isNew marker and its 5s dashed-border overlay along with the graph-editor timers that expired it. The flag only lit up on mindmap integration and no longer reflects product needs. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Move the default icon set, verb list, and ThinkingIcon type into thinking-indicator-presets so the component file only exports components. Keeps react-refresh/only-export-components happy. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…tint Scope the island's streaming signal to the current chat via a new useCurrentAssistantMessage hook so switching boards or threads no longer carries over a stale spinner. Wrap the border in a 1px secondary-foreground tint, let the ring-2 handle focus and thinking cues instead, and add a continuous animate-ring-pulse-soft heartbeat during streaming alongside the existing animate-ring-blink attention flash on the answer card. Switch both ring animations to relative color syntax (oklch(from var() l c h / alpha)) because the previous color-mix(in oklab, ..., transparent) was resolving to a fully opaque color in some browsers, defeating the soft tint. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Switch the streaming markdown pipeline to LaTeX-style delimiters so a bare $ always renders as a literal dollar sign. Renderer disables singleDollarTextMath and normalizes \(...\) / \[...\] to $$...$$ before remark-math; prompts now instruct the model to emit \(...\) / \[...\] and drop the \$ escape convention. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…enderers Extend the new delimiter scheme to the TipTap editor and the lite renderers so editor-authored notes round-trip correctly and render in all surfaces: - TipTap: serialize math nodes to \(...\) / \[...\] and add markdown-it rules that accept both the new form and the legacy $ / $$ form (dual-read enables self-healing migration of existing notes). Inline rule registered before the escape rule so backslashes aren't stripped. - LiteMarkdown: recognize \(...\) / \[...\] alongside $$...$$ for board nodes, document cards, and edge labels. - Add sanitizeMathDelimiters util that strips C0 control characters (notably SUB / U+001A seen in some model outputs) and collapses over-escaped delimiters (\\(, \\), \\[, \\]) back to single-backslash form. Apply at the TipTap and MarkdownView boundaries as a defensive cleanup for corrupt content in streaming or storage. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The CONTROL_CHARS_RE regex in sanitize-math.ts deliberately matches C0 control characters to strip them from model output. Add the targeted eslint-disable so the linter stops flagging an intentional case. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…dient Paint the tool glyph and loading spinner with secondary-foreground so they share the sienna accent used on argument keys, and swap the flat muted header for a left-to-right from-secondary/30 gradient that mirrors the floating island treatment. The expanded body still sits on bg-sidebar so the two-part card split remains readable. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…soning Export ThinkingDots from the trailing animation module so both the sidebar reasoning step and the floating island progress strip can render the same font-mono "Thinking" label with three pulsing dots instead of each speaking a different visual dialect (shimmer vs shimmer). In the progress strip, when reasoning text is available during streaming, replace the Thinking fallback with the last non-empty line of that reasoning prefixed with an ellipsis, mirroring how the sidebar streams reasoning text into the thread. Strip common markdown syntax chars so inline display stays readable and keep the strip single-line + truncated to avoid vertical jitter. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace the 4s dwell on the progress strip with a persistent post-streaming summary ("✓ N steps · names…") and a trailing Steps button that opens a popover above the island showing every tool call in order. Each popover row collapses to a compact numbered header with the first-arg preview and expands inline to the same arg rows, stdout/stderr, note card, and source links the sidebar tool step renders.
Export ToolArgsRows, CodeInterpreterResult, and NoteToolResult from tool-step-row so the popover rows reuse them instead of duplicating layout. Background sits on bg-sidebar with a neutral border-border and a lighter two-layer shadow so the popover feels like a transient surface above the island rather than another anchored panel.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat(webui): restyle floating island with pill progress and cleaner surface
converts the progress strip into a content-hugging rounded pill, promotes the
sparkles tile to the open-full-chat affordance (removing the redundant chat
icon), flattens the island background, and softens the border/ring palette.
steps popover rounding and padding brought in line with the island.
* feat(webui): align chat input with island and swap send icon to arrow-up
mirrors the island's rounded-xl corners and secondary-foreground focus
border+ring on the full chat composer, and repoints SendIcon from paper-plane
to phosphor's arrow-up for a more modern send affordance. also tightens the
user message bubble radius to match.
* style(webui): refine floating island check icon, radius, and position
swaps the summary pill's stroke check for a filled check-circle so it reads
as a status badge, aligns the island and steps popover to rounded-2xl, and
nudges the island closer to the board edge now that the composer is taller.
* test(backend): loosen widget learn prompt assertion to single keyword
* feat(agents): add link_notes tool and post-turn auto-layout
link_notes lets the planner draw a directed arrow between two existing
notes with an optional short label. After the turn ends, rearrange_created_notes
flex-wraps the notes created this turn into rows of connected-component
tiles; tree-shaped components get a left-to-right tree layout, other DAGs
fall back to a single row. Only ids from this turn are moved, so anything
the user has touched keeps its position. Failure degrades silently to the
existing stacked-column behavior.
* fix(agents,webui): render agent-authored edges and tree-layout them on turn end
Frontend ingests new links via convertLinkToEdgeWithPoints and non-persisting
setters so they go through the board's point-anchor convention and appear
immediately instead of only after a refresh.
Backend rearrange_created_notes now accepts created_link_ids and fetches
them by id via get_links, which is a direct Qdrant lookup. The previous
path used graph.edges from a filter-based scroll that was eventually
consistent and missed just-written links, so connected-component detection
silently fell back to singleton rows.
Also registers link_notes in the board-scope allowlist in chats.py and the
frontend enabledTools defaults so the tool actually reaches the planner.
* feat(prompts): recast plan agent as canvas-native tutor
Replaces the generic tool-using framing with a tutor whose primary surface
is the board, and adds a format-decision rubric (chat vs mindmap vs sheet
vs widget) with three worked examples showing the oblique-reference voice.
Introduces the batch-then-link pattern: plan the structure silently, emit
all write_notes in parallel in one step, then link them in a second step.
Positions are arranged automatically after the turn, so the agent never
has to think about layout. Mindmaps soft-capped at 15 notes and hard-
capped at 25.
Adds explicit anti-narration rules: forbidden openings ("I've created",
"Let me break this down", "Great question", restating the question), and
good/bad examples contrasting oblique canvas references with process
captions. User-prompt reminders rewritten to reinforce the same rules at
the turn boundary so long conversations do not drift.
* feat(webui): fit viewport to all agent-created notes on multi-note turns
send-message now collects every newly-created note id from the turn and
emits center_around as a comma-separated list. use-center-around splits
on comma: a single id keeps the existing setCenter behavior with the
user's zoom preserved; two or more ids fit the viewport to the whole set
via useFitNodes with a smooth 300ms transition. Single-id deep links
(e.g. the "open on board" icon in the Steps popover) are unaffected.
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.
No description provided.