gsxdsm
c468c161c2
FN-7141: add chat context token budget indicator
...
Add a desktop Direct-chat header indicator for estimated tokens used against the active model context window.
- Estimate chat token usage client-side, including streaming text, and format compact counts.
- Render the context-window badge only for non-mobile Direct-chat threads with known model context windows.
- Cover desktop, mobile, floating-narrow, rooms, unknown-context, and streaming surfaces with tests.
- Document the dashboard behavior and add a release changeset.
Files changed:
.changeset/fn-7141-chat-context-window.md | 7 +
docs/dashboard-guide.md | 2 +
packages/dashboard/app/components/ChatView.css | 22 +++
packages/dashboard/app/components/ChatView.tsx | 35 +++-
.../__tests__/ChatView.context-window.test.tsx | 193 +++++++++++++++++++++
.../app/utils/__tests__/estimateChatTokens.test.ts | 34 ++++
packages/dashboard/app/utils/estimateChatTokens.ts | 29 ++++
packages/i18n/locales/en/app.json | 1 +
8 files changed, 322 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-7141
Fusion-Task-Lineage: 3ede9af4-b8d6-4da6-996f-cd9277ef49ac
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-06-27 17:22:12 -07:00
gsxdsm
819c626466
fix(mobile-chat): hide executor footer and remove gap above keyboard ( #1789 )
...
## Problem
On mobile, when the soft keyboard is up in Chat, the executor footer
(task counts / **Running** indicator) stayed visible and there was a
dead band of empty space between the composer and the keyboard.
Root cause: `computeMobileBarKeyboardFlags` gated the footer-hide +
padding-strip to **iOS only**. On Android `footerHidden` stayed `false`,
so `ExecutorStatusBar` kept rendering **and** `.project-content` kept
reserving `footer-height + nav-height` (~80px) of `padding-bottom`. The
mobile nav bar is slid off-screen (`translateY(100%)`) when the keyboard
is up, so that reserved space rendered as the empty gap.
## Fix
Drop the `&& isIOS` gate on `footerHidden` so Android matches iOS. When
the keyboard is open on mobile:
- `ExecutorStatusBar` is hidden (no task-count/Running footer), and
- `.project-content` reserves no footer/nav padding, so the composer
sits flush above the keyboard.
`footerKeyboardOpen` (the iOS `bottom: 0` footer-collapse class) stays
iOS-only — it only matters when the footer is still rendered over a
modal. Modal / Quick-Chat-overlay keyboard cases are unchanged
(`boardLayoutSuppressed`).
## Before / After
| Before | After |
| --- | --- |
| Footer shown + empty gap above keyboard | Footer hidden, composer
flush above keyboard |
_(Rendered with the real component CSS at a mobile viewport with the
keyboard-open classes applied.)_
## Notes / verification
- File-scoped tests pass: `mobileBarKeyboardFlags`,
`mobile-bottom-bars-keyboard-layout`, App keyboard-layout cases,
`footer-safe-layout`, `dashboard-footer-mobile-layout`,
`ChatView.mobile-render` (46 tests).
- FN-5707 originally gated this to iOS over a concern that stripping nav
padding mid-focus could make Android Chrome dismiss the keyboard. The
strip is keyed off `keyboardOpen`, which only flips `true` after the
visual viewport settles into its keyboard-open size — but **please
confirm on a real Android device** that the keyboard stays up when
tapping the composer. If it dismisses, the fallback is a transform-based
hide that avoids the reflow.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
<!-- stage-review-badge-begin -->
---
<a href="https://stagereview.app/Runfusion/Fusion/pull/1789 ">
<picture>
<source media="(prefers-color-scheme: dark)"
srcset="https://stagereview.app/assets/gh-open-in-stage-dark.svg ">
<img src="https://stagereview.app/assets/gh-open-in-stage-light.svg "
alt="Open in Stage">
</picture>
</a>
<!-- stage-review-badge-end -->
2026-06-26 10:17:37 -07:00
gsxdsm
e48c75ccc5
fix(mobile-chat): hide executor footer and remove gap above keyboard
...
On Android the keyboard-open footer (executor status bar) stayed visible
and the off-screen mobile nav bar's reserved padding rendered as an empty
band between the composer and the keyboard. computeMobileBarKeyboardFlags
no longer iOS-gates footerHidden, so both platforms now hide the footer
and drop the reserved footer+nav padding-bottom when the soft keyboard is
up, letting the composer sit flush above the keyboard. footerKeyboardOpen
(the iOS bottom:0 collapse class) stays iOS-only.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 09:32:53 -07:00
gsxdsm
fca2ff6efb
fix(FN-7039): render workflow steps with proper casing in the progress UI
...
An enabled-but-not-yet-run workflow step has no recorded result, so the progress bar
previously showed the raw graph node id (e.g. 'code-review'). Humanize the id fallback to
Title Case ('Code Review', 'Browser Verification', 'Frontend UX Design'). Once the step
runs, the graph-recorded config.name still wins; humanization is only the pre-run fallback.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 08:53:26 -07:00
gsxdsm
3ee47dec86
merge: integrate origin/main into feature/workflow-steps (FN-7039)
...
Resolve conflicts from 56 upstream commits:
- db.ts: renumber my migrations around main's new migration 130 (columnDwellMs) —
enable-id normalization 130→131, drop-table 131→132, SCHEMA_VERSION→132.
- index.ts / routes.ts: take main's new MCP exports/imports; keep WORKFLOW_STEP_TEMPLATES
array removed (kept the WorkflowStepTemplate type).
- merger.ts: keep the legacy post-merge execution path removed (U7c) over main's version.
- ci-workflow.test.ts (from main): add port-4040/process-supervisor allowlist markers to
the gate-script assertions that reference the checker filenames (pre-existing self-match).
Gate green (engine-core 299, ci-shape 62); boot smoke PASS; migration tests + typecheck clean.
2026-06-26 08:50:22 -07:00
gsxdsm
005322eeaa
fix(review): address PR #1788 review feedback
...
- workflow-graph-executor: wrap each post-merge walk() in try/catch so a malformed
post-merge IR / traversal error is logged and skipped, never flipping an already-
merged task to failed (non-blocking post-merge contract) [T9, real bug].
- Refresh stale FNXC comments now that graphNativePostMerge is default-ON and the
legacy merger post-merge path was removed (experimental-features, workflow-graph-
executor, workflow-graph-post-merge.test) [T6/T7/T8].
- Normalize FNXC timestamps to yyyy-MM-dd-hh:mm (TaskCard.test, taskProgress.test) [T2/T3].
- Changeset: category fix → feature to match the minor bump [T0].
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-26 08:40:59 -07:00
gsxdsm
4dab2b6986
FN-7011: Exclude engine downtime from task timing
...
Exclude proven engine-process downtime from active task duration stats and badges.
- Persist a throttled engineLastActiveAt heartbeat while the scheduler is running and unpaused.
- Reconcile in-progress execution segment anchors on startup when downtime exceeds the poll threshold.
- Emit run-audit events for shifted and no-action downtime reconciliation outcomes.
- Cover core timing, dashboard badge behavior, scheduler heartbeat throttling, and self-healing audit metadata.
- Add a patch changeset for the published CLI package.
Files changed:
.changeset/fn-7011-engine-downtime-timing.md | 7 +++
AGENTS.md | 1 +
.../src/__tests__/store-execution-timing.test.ts | 51 ++++++++++++++++++++++
packages/core/src/settings-schema.ts | 1 +
packages/core/src/store.ts | 28 ++++++++++++
packages/core/src/types.ts | 5 +++
.../app/utils/__tests__/taskTiming.test.ts | 16 +++++++
.../__tests__/scheduler-workflow-cutover.test.ts | 29 +++++++++++-
packages/engine/src/__tests__/self-healing.test.ts | 23 ++++++++++
packages/engine/src/run-audit.ts | 4 ++
packages/engine/src/scheduler.ts | 11 +++++
packages/engine/src/self-healing.ts | 21 +++++++++
12 files changed, 196 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-7011
Fusion-Task-Lineage: 44225b0a-0fa1-40be-812d-33fd5e446944
2026-06-25 23:35:31 -07:00
gsxdsm
9a2709dde9
FN-6969: show provider icons beside Command Center models
...
Show inferred provider icons beside model names across Command Center bar and table surfaces.
- Add dashboard-side provider-icon inference for model/provider strings.
- Render provider icons on Command Center model bar rows and token table rows while keeping pie chart labels text-only.
- Cover overview, token, and ecosystem model-icon surfaces with tests and add a changeset.
Files changed:
.changeset/fn-6969-provider-icons.md | 7 ++
.../components/command-center/CommandCenter.tsx | 15 ++-
.../__tests__/CommandCenter.test.tsx | 33 ++++++-
.../command-center/areas/EcosystemArea.tsx | 15 ++-
.../components/command-center/areas/TokensArea.tsx | 37 +++++++-
.../areas/__tests__/TokensArea.test.tsx | 105 +++++++++++++++++++++
.../command-center/areas/__tests__/areas.test.tsx | 42 ++++++++-
.../app/components/command-center/charts/Bar.tsx | 25 ++++-
.../components/command-center/charts/charts.css | 42 +++++++++
.../app/utils/__tests__/providerIconKey.test.ts | 32 +++++++
packages/dashboard/app/utils/providerIconKey.ts | 45 +++++++++
11 files changed, 377 insertions(+), 21 deletions(-)
Fusion-Task-Id: FN-6969
Fusion-Task-Lineage: 6caf8864-1ecc-46e3-b7fa-bfa8e9a70aaa
2026-06-25 23:34:07 -07:00
gsxdsm
7b358b74b5
feat(FN-7039): drive progress bar + Workflow tab from graph-written results
...
getUnifiedTaskProgress reads task.workflowStepResults (graph-written in U2) and
no longer needs workflowStepNameLookup — names come from result.workflowStepName.
Removed the lookup prop + fetchWorkflowSteps-name plumbing end-to-end (App,
MainContent, RightDock, Board, Column, Lane, WorktreeGroup, TaskCard). Added the
running state (pending + startedAt) and a distinct advisory_failure (amber, non-
blocking) vs failed (red) treatment; advisory_failure counts as complete.
Plan U3.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-25 22:48:50 -07:00
gsxdsm
4cc9c2f3f1
FN-6972: add browser-native file previews
...
Files modal now renders common media and PDF files with browser-native previews while preserving editor flows for text and unknown binaries.
- Add shared extension-based preview classification for images, videos, audio, and PDFs.
- Render preview-only files from workspace-safe download URLs and skip binary editor loading/saving actions for those selections.
- Update preview styling, localized labels, documentation, tests, and release notes.
Files changed:
.changeset/fn-6972-browser-file-previews.md | 7 +
docs/dashboard-guide.md | 1 +
packages/dashboard/app/components/FileBrowser.css | 39 ++-
.../dashboard/app/components/FileBrowserModal.tsx | 107 +++++---
.../components/__tests__/FileBrowserModal.test.tsx | 302 ++++++++++-----------
.../app/utils/__tests__/file-preview-kind.test.ts | 40 +++
packages/dashboard/app/utils/file-preview-kind.ts | 70 +++++
packages/i18n/locales/en/app.json | 4 +-
packages/i18n/locales/es/app.json | 4 +-
packages/i18n/locales/fr/app.json | 4 +-
packages/i18n/locales/ko/app.json | 4 +-
packages/i18n/locales/zh-CN/app.json | 4 +-
packages/i18n/locales/zh-TW/app.json | 4 +-
13 files changed, 381 insertions(+), 209 deletions(-)
Fusion-Task-Id: FN-6972
Fusion-Task-Lineage: 04b07def-e490-43f7-8b92-39ca704b20b6
2026-06-25 12:25:13 -07:00
gsxdsm
4fd8d444fb
fix(dashboard): polish app chrome and workflow defaults
2026-06-22 18:21:06 -07:00
gsxdsm
03aeed291f
feat(dashboard): Import Tasks list pane small + freely resizable, preview fills remainder
...
Default list width 256px (min 160, max min(480px,50%)), driven by an inline width var with flex:0 0 so the drag actually wins (the embedded wide layout previously forced a clamp via !important, so the handle did nothing). Preview pane is flex:1 1 auto;min-width:0 so freed space flows to it. Persisted per-project via kb-dashboard-github-import-list-width. Shared workspace covers both Issues and Pull Requests tabs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-22 10:09:32 -07:00
gsxdsm
a6f49b847c
feat(dashboard): integrate stashed workflow-selection refactor; Dashboard rename; resolve CC conflicts
...
- Resolve the stash-pop conflicts in command-center CSS/test by keeping the current branch's newer FN-6784 responsive clamps, Team heartbeat docs, and recharts assertions (the stashed snapshot was older).
- Land the stashed workflow-selection refactor (Board/NewTaskModal/WorkflowSwitcher; remove lastSelectedWorkflow util).
- Rename Command Center -> Dashboard (i18n source) and move it to the top of the left sidebar; workflow switcher chevron sized to match the project selector.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-22 03:34:15 -07:00
gsxdsm
c0ab7f43b8
FN-6923: default new tasks to the selected workflow lane
...
New Task now inherits the project's current or last valid workflow lane.
- Persist explicit Board and List workflow switcher selections per project.
- Seed the New Task workflow selector from the cached valid lane without marking the pristine dialog dirty.
- Preserve default-workflow inheritance when no remembered lane exists or the remembered lane was deleted.
- Cover quick-add parity, workflow defaulting, stale-lane fallback, and storage helper behavior in tests.
- Document New Task workflow selector defaulting in the dashboard guide.
Files changed:
docs/dashboard-guide.md | 2 +
packages/dashboard/app/components/Board.tsx | 12 +-
packages/dashboard/app/components/ListView.tsx | 12 +-
packages/dashboard/app/components/NewTaskModal.tsx | 21 ++-
.../app/components/__tests__/NewTaskModal.test.tsx | 142 ++++++++++++++++++++-
.../utils/__tests__/lastSelectedWorkflow.test.ts | 67 ++++++++++
.../dashboard/app/utils/lastSelectedWorkflow.ts | 31 +++++
7 files changed, 279 insertions(+), 8 deletions(-)
Fusion-Task-Id: FN-6923
Fusion-Task-Lineage: 6e3c8efd-3865-4975-a754-2f0d5ff89ab0
2026-06-22 03:34:15 -07:00
gsxdsm
c808177979
FN-6776: prevent workflow board legacy flash
...
Prevent workflow-enabled board surfaces from flashing the legacy layout during first paint.
- Hydrate Board and ListView workflow metadata from a per-project session cache before async revalidation.
- Gate legacy board/list rendering behind settings and workflow-lane metadata readiness, with neutral skeleton states for cold or empty workflow loads.
- Add regression coverage for no-legacy-flash behavior and cache validation, plus docs and changeset notes.
Files changed:
.changeset/fn-6776-board-flash.md | 5 +
docs/dashboard-guide.md | 1 +
packages/dashboard/app/App.tsx | 4 +
packages/dashboard/app/components/Board.css | 69 +++++
packages/dashboard/app/components/Board.tsx | 53 +++-
packages/dashboard/app/components/ListView.css | 53 ++++
packages/dashboard/app/components/ListView.tsx | 52 +++-
.../__tests__/board-no-legacy-flash.test.tsx | 326 +++++++++++++++++++++
.../utils/__tests__/boardWorkflowsCache.test.ts | 71 +++++
.../dashboard/app/utils/boardWorkflowsCache.ts | 49 ++++
10 files changed, 676 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-6776
Fusion-Task-Lineage: caa8e53f-9b6d-49a6-94ca-b694550b43ef
2026-06-20 15:42:16 -07:00
gsxdsm
c4f34ceed1
FN-6767: make agents sidebar resizable
...
Make the Agents split view wider by default and persist user-adjusted sidebar widths.
- Add a desktop/tablet resize handle with pointer and keyboard controls, clamped accessible values, and per-project storage.\n- Update split-layout CSS so mobile remains stacked while non-mobile views reserve a resize affordance column.\n- Cover default, stored, clamped, pointer, keyboard, mobile, and org-chart sidebar behaviors in tests.\n- Add a patch changeset for the published Fusion package.\n\nFiles changed:\n .changeset/fn-6767-agents-sidebar.md | 5 +\n packages/dashboard/app/components/AgentsView.css | 47 ++++++--\n packages/dashboard/app/components/AgentsView.tsx | 101 +++++++++++++++-\n .../app/components/__tests__/AgentsView.test.tsx | 132 +++++++++++++++++++++\n .../app/utils/__tests__/projectStorage.test.ts | 3 +-\n packages/dashboard/app/utils/projectStorage.ts | 1 +\n 6 files changed, 280 insertions(+), 9 deletions(-)
Fusion-Task-Id: FN-6767
Fusion-Task-Lineage: 93605e16-7524-4577-bbcd-666c105a867b
2026-06-20 02:25:11 -07:00
gsxdsm
11c4120705
FN-6659: keep xterm font metrics symbols-free
...
Keep terminal wide-glyph fallback out of xterm's measured font path while preserving Nerd Font symbols in DOM rendering.
- Split terminal font resolution into symbols-free xterm font families and scoped glyph fallback families.
- Apply the glyph fallback CSS variable to both TerminalModal and SessionTerminal surfaces.
- Update regression coverage and the documented mobile xterm wide-glyph recurrence analysis.
Files changed:
.changeset/fn-6659-terminal-render.md | 5 +++
.../xterm-symbols-nerd-font-unicode-range.md | 22 +++++++-----
.../dashboard/app/__tests__/terminal-input.test.ts | 42 +++++++++++++---------
.../dashboard/app/components/SessionTerminal.css | 8 +++++
.../dashboard/app/components/SessionTerminal.tsx | 21 +++++++++--
.../dashboard/app/components/TerminalModal.css | 8 +++++
.../dashboard/app/components/TerminalModal.tsx | 13 ++++++-
.../__tests__/SessionTerminal.mobile.test.tsx | 6 ++--
.../components/__tests__/SessionTerminal.test.tsx | 14 ++++----
.../components/__tests__/TerminalModal.test.tsx | 9 +++--
.../utils/__tests__/terminalPreferences.test.ts | 2 +-
.../dashboard/app/utils/terminalPreferences.ts | 16 +++++----
12 files changed, 117 insertions(+), 49 deletions(-)
Fusion-Task-Id: FN-6659
Fusion-Task-Lineage: e29a709d-9d9d-4a90-9616-8f08c41b126d
2026-06-18 15:59:34 -07:00
gsxdsm
16b6e5decb
FN-6638: stabilize mobile terminal font metrics
...
Stabilize terminal font metric remeasurement across mobile and attach surfaces.
- Add a shared terminal font metric wait helper that falls back from full font stacks to concrete individual font families before remeasurement.
- Reapply font options, refit, resize, and refresh SessionTerminal after font metrics settle to cover attached CLI terminals.
- Pin text-size adjustment on xterm measurement subtrees so mobile WebKit cannot inflate ASCII cell metrics.
- Extend terminal preference and rendering tests, documentation, and changeset coverage for the recurrence.
Files changed:
.changeset/fn-6638-terminal-render.md | 5 +
.../xterm-async-font-remeasure-paste-dedupe.md | 20 +++-
.../dashboard/app/__tests__/terminal-input.test.ts | 26 +++++
.../dashboard/app/components/SessionTerminal.css | 10 ++
.../dashboard/app/components/SessionTerminal.tsx | 29 ++++++
.../dashboard/app/components/TerminalModal.css | 10 ++
.../dashboard/app/components/TerminalModal.tsx | 24 ++---
.../components/__tests__/SessionTerminal.test.tsx | 41 +++++++-
.../components/__tests__/TerminalModal.test.tsx | 38 ++++++++
.../utils/__tests__/terminalPreferences.test.ts | 29 +++++-
.../dashboard/app/utils/terminalPreferences.ts | 107 +++++++++++++++++++++
11 files changed, 319 insertions(+), 20 deletions(-)
Fusion-Task-Id: FN-6638
Fusion-Task-Lineage: edbf071d-a0c1-4955-95ff-83e6996f4674
2026-06-18 13:19:43 -07:00
gsxdsm
ca14a12b94
FN-6601: consolidate relative-time bucket formatting
...
Consolidate dashboard relative-time calculations behind a shared bucket helper while preserving each surface's display behavior.
- Add getRelativeTimeBucket to centralize parsing, boundary math, and bucket metadata.
- Route ActivityFeed, AgentLogViewer, MissionManager, and PlanningModeModal timestamp labels through the shared helper.
- Extend unit coverage for bucket boundaries plus surface-specific just-now and future timestamp behavior.
Files changed:
packages/dashboard/app/components/ActivityFeed.tsx | 36 ++++++----
.../dashboard/app/components/AgentLogViewer.tsx | 36 ++++++----
.../dashboard/app/components/MissionManager.tsx | 32 +++++----
.../dashboard/app/components/PlanningModeModal.tsx | 35 ++++++----
.../app/components/__tests__/ActivityFeed.test.tsx | 8 +++
.../components/__tests__/AgentLogViewer.test.tsx | 8 +++
.../app/utils/__tests__/relativeTimeAgo.test.ts | 77 +++++++++++++++++++++-
packages/dashboard/app/utils/relativeTimeAgo.ts | 66 +++++++++++++++----
8 files changed, 236 insertions(+), 62 deletions(-)
Fusion-Task-Id: FN-6601
Fusion-Task-Lineage: 3521afa0-f3ce-49a4-8861-efd4f64f9a69
2026-06-17 17:57:19 -07:00
gsxdsm
01b80db603
FN-6589: add structured ask-question chat tool
...
Add a native chat-agent tool for presenting structured questions to dashboard users.
- Register `fn_ask_question` for dashboard chat sessions with prompt guidance to wait for user replies.
- Reuse the existing structured question card parser by recognizing the new tool name.
- Validate ask-question parameters in engine tooling and cover chat/parser behavior with tests.
- Document the dashboard chat question flow and add a patch changeset.
Files changed:
.changeset/fn-6589-chat-ask-question.md | 5 ++
docs/dashboard-guide.md | 3 +-
.../utils/__tests__/parseQuestionToolCall.test.ts | 19 +++++
.../dashboard/app/utils/parseQuestionToolCall.ts | 3 +-
.../dashboard/src/__tests__/chat-manager.test.ts | 10 ++-
packages/dashboard/src/chat.ts | 10 ++-
.../src/__tests__/agent-tools-ask-question.test.ts | 51 ++++++++++++
packages/engine/src/agent-tools.ts | 94 ++++++++++++++++++++++
packages/engine/src/index.ts | 2 +
9 files changed, 190 insertions(+), 7 deletions(-)
Fusion-Task-Id: FN-6589
Fusion-Task-Lineage: 3f416010-ed2f-40b3-a899-7a9f4a6ed265
2026-06-17 16:53:29 -07:00
gsxdsm
c261217ac1
FN-6597: add task chat timestamps
...
Show compact relative timestamps in task chat without adding live polling.
- Add a shared relative-time formatter for chat timestamps.
- Render muted timestamps on user message headers and agent group metadata.
- Cover timestamp formatting and chat header rendering with dashboard tests.
- Document task chat timestamp behavior in the dashboard guide.
Files changed:
docs/dashboard-guide.md | 2 +-
packages/dashboard/app/components/TaskChatTab.css | 19 +++++
packages/dashboard/app/components/TaskChatTab.tsx | 23 ++++-
.../app/components/__tests__/TaskChatTab.test.tsx | 97 +++++++++++++++++++++-
.../app/utils/__tests__/relativeTimeAgo.test.ts | 32 +++++++
packages/dashboard/app/utils/relativeTimeAgo.ts | 23 +++++
6 files changed, 192 insertions(+), 4 deletions(-)
Fusion-Task-Id: FN-6597
Fusion-Task-Lineage: 52c54a9e-6d00-4df1-a454-2218a935ebda
2026-06-17 16:21:54 -07:00
gsxdsm
e923b5e84d
FN-6527: add terminal shortcuts and preferences
...
Adds persistent terminal customization and keyboard-less navigation controls to the dashboard terminal.
- Add arrow shortcut buttons that send ANSI cursor sequences alongside existing Ctrl/Alt helpers.
- Add localStorage-backed terminal preferences for font family, size, cursor style, blink, and renderer with legacy font-size migration.
- Apply font and cursor preferences live, document renderer behavior, and cover preference parsing and modal controls with tests.
Files changed:
docs/dashboard-guide.md | 3 +
.../dashboard/app/components/TerminalModal.css | 57 ++++-
.../dashboard/app/components/TerminalModal.tsx | 271 ++++++++++++++++-----
.../components/__tests__/TerminalModal.test.tsx | 135 +++++++++-
.../utils/__tests__/terminalPreferences.test.ts | 90 +++++++
.../dashboard/app/utils/terminalPreferences.ts | 197 +++++++++++++++
6 files changed, 690 insertions(+), 63 deletions(-)
Fusion-Task-Id: FN-6527
Fusion-Task-Lineage: bc863486-9d2c-41d5-84a4-7b697e81a298
2026-06-17 00:06:24 -07:00
gsxdsm
a4537167ab
FN-6501: render chat question response controls
...
Render structured assistant question prompts directly in chat surfaces.
- Add parser and formatter support for question tool calls.
- Add reusable question response UI for select, multi-select, text, and confirm prompts.
- Wire regular chat and quick chat to show live and answered question states.
- Cover parsing and chat response behavior with dashboard tests and localized labels.
Files changed:
.changeset/fn-6501-chat-question-response.md | 5 +
docs/dashboard-guide.md | 2 +
.../app/components/ChatQuestionResponse.css | 194 ++++++++++++++++
.../app/components/ChatQuestionResponse.tsx | 247 +++++++++++++++++++++
packages/dashboard/app/components/ChatView.tsx | 85 ++++++-
packages/dashboard/app/components/QuickChatFAB.tsx | 84 ++++++-
.../__tests__/ChatQuestionResponse.test.tsx | 52 +++++
.../app/components/__tests__/ChatView.test.tsx | 51 +++++
.../app/components/__tests__/QuickChatFAB.test.tsx | 64 ++++++
.../utils/__tests__/parseQuestionToolCall.test.ts | 82 +++++++
.../dashboard/app/utils/parseQuestionToolCall.ts | 240 ++++++++++++++++++++
packages/i18n/locales/en/app.json | 10 +
12 files changed, 1105 insertions(+), 11 deletions(-)
Fusion-Task-Id: FN-6501
Fusion-Task-Lineage: 1fd4a3aa-b2d7-4157-a196-852fdeda680d
2026-06-16 20:13:13 -07:00
gsxdsm
869a4f77da
FN-6329: prevent Quick Chat keyboard board shift
...
Keep the mobile board layout stable while Quick Chat owns the keyboard viewport.
- Treat fullscreen mobile overlays as suppressors for App-level footer hiding.
- Pass Quick Chat mobile open state into the shared keyboard flag helper.
- Cover iOS, Android, modal, and non-mobile keyboard flag behavior.
- Document the Quick Chat mobile keyboard board-shift root cause and fix.
Files changed:
.../quick-chat-mobile-keyboard-board-shift.md | 58 ++++++++++++++++++++++
packages/dashboard/app/App.tsx | 4 +-
.../utils/__tests__/mobileBarKeyboardFlags.test.ts | 57 ++++++++++++++++++++-
.../dashboard/app/utils/mobileBarKeyboardFlags.ts | 10 +++-
4 files changed, 126 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-6329
Fusion-Task-Lineage: f7c37252-c0ea-44f0-b4e3-5aa2022cf7bc
2026-06-12 19:22:11 -07:00
gsxdsm
d67f61d03e
FN-6135: remove workflow toolbar collapse toggle
...
Simplify the workflow board toolbar by removing its collapse state and persistence.
- remove the workflow toolbar collapse toggle, handlers, and scoped localStorage persistence from Board
- drop collapse-specific workflow toolbar styling and mobile collapsed-layout rules
- replace collapse-focused board tests with assertions that the toolbar renders without a collapse affordance
- remove the unused workflow toolbar storage key and update project storage expectations
Files changed:
packages/dashboard/app/components/Board.tsx | 129 +++++---------
packages/dashboard/app/components/Lane.css | 36 ----
.../app/components/__tests__/Board.test.tsx | 187 +++------------------
.../app/utils/__tests__/projectStorage.test.ts | 3 +-
packages/dashboard/app/utils/projectStorage.ts | 1 -
5 files changed, 60 insertions(+), 296 deletions(-)
Fusion-Task-Id: FN-6135
Fusion-Task-Lineage: 11c17edf-bbed-4ec5-a06e-00a2537ffac1
2026-06-09 16:02:08 -07:00
gsxdsm
320b153c45
FN-6113: fail fast on terminal provider errors
...
Fail fast on non-retryable provider failures in the in-review stall recovery flow.
- classify failed-task provider errors as non-retryable, retryable, or unknown in core stall detection
- surface terminal provider errors with dedicated dashboard copy and exported stall signal metadata
- pause in-review tasks immediately on non-retryable provider failures and record a dedicated run-audit mutation
- add regression coverage for provider error classification, self-healing disposition, and dashboard badge behavior
Files changed:
.../core/src/__tests__/in-review-stall.test.ts | 70 ++++++++++
packages/core/src/in-review-stall.ts | 53 ++++++-
packages/core/src/index.ts | 4 +-
.../app/utils/__tests__/inReviewStallCopy.test.ts | 5 +-
packages/dashboard/app/utils/inReviewStallCopy.ts | 8 ++
.../in-review-stall-deadlock-disposition.test.ts | 153 +++++++++++++++++++++
packages/engine/src/run-audit.ts | 1 +
packages/engine/src/self-healing.ts | 30 +++-
8 files changed, 320 insertions(+), 4 deletions(-)
Fusion-Task-Id: FN-6113
Fusion-Task-Lineage: 5e89adb4-6b59-4deb-8811-5c75d6fa19cc
2026-06-09 12:51:20 -07:00
gsxdsm
a2f4bb14c0
FN-6080: remove workflow selector collapse controls
...
Always render the workflow selector expanded across the dashboard.
- remove collapsible workflow selector props, state, icons, and toggle styles
- stop InlineCreateCard from passing collapse persistence options
- delete project storage support and tests for collapsed workflow selector state
- add a patch changeset for the published CLI package
Files changed:
.changeset/fn-6080-removal.md | 5 ++
.../dashboard/app/components/InlineCreateCard.tsx | 3 -
.../dashboard/app/components/WorkflowSelector.css | 14 +----
.../dashboard/app/components/WorkflowSelector.tsx | 65 +--------------------
.../components/__tests__/InlineCreateCard.test.tsx | 50 ----------------
.../components/__tests__/WorkflowSelector.test.tsx | 68 ----------------------
.../app/utils/__tests__/projectStorage.test.ts | 3 +-
packages/dashboard/app/utils/projectStorage.ts | 1 -
8 files changed, 8 insertions(+), 201 deletions(-)
Fusion-Task-Id: FN-6080
Fusion-Task-Lineage: cca26111-9e20-47d0-8473-d18a3b488ae1
2026-06-09 08:14:16 -07:00
gsxdsm
4366a933da
FN-6046: add collapsible workflow selectors
...
Add collapsible workflow selectors for board workflow controls and inline task creation.
- add a collapsible board workflow toolbar with persisted per-project state
- make the inline create workflow selector collapsible and store its expanded state per project
- update workflow selector styling, storage key allowlist, and regression coverage for collapse behavior
Files changed:
packages/dashboard/app/components/Board.tsx | 104 +++++++++++++--------
.../dashboard/app/components/InlineCreateCard.css | 9 ++
.../dashboard/app/components/InlineCreateCard.tsx | 3 +
packages/dashboard/app/components/Lane.css | 23 +++++
.../dashboard/app/components/WorkflowSelector.css | 20 +++-
.../dashboard/app/components/WorkflowSelector.tsx | 81 ++++++++++++++--
.../app/components/__tests__/Board.test.tsx | 101 ++++++++++++++++++--
.../components/__tests__/InlineCreateCard.test.tsx | 57 ++++++++++-
.../components/__tests__/WorkflowSelector.test.tsx | 73 ++++++++++++++-
.../app/utils/__tests__/projectStorage.test.ts | 4 +-
packages/dashboard/app/utils/projectStorage.ts | 2 +
11 files changed, 420 insertions(+), 57 deletions(-)
Fusion-Task-Id: FN-6046
Fusion-Task-Lineage: 07cbe7a8-5740-479d-94a3-b178c72a5273
2026-06-09 02:09:31 -07:00
gsxdsm
b95e7f7575
FN-5894: share project data-boundary and status helpers
...
Centralize project loading and status-state handling across dashboard surfaces.
- add a reusable DataBoundary component for loading, empty, error, and loaded states
- extract shared project status config helpers for labels, colors, icons, and initializing detection
- update project overview, cards, badges, and selector UI to use the shared helpers
- add regression coverage for data-boundary behavior, project overview empty/loading transitions, and status config fallbacks
Files changed:
packages/dashboard/app/components/DataBoundary.tsx | 64 ++++++++++++++++++++++
packages/dashboard/app/components/ProjectCard.tsx | 48 ++--------------
.../app/components/ProjectHealthBadge.tsx | 45 +--------------
.../dashboard/app/components/ProjectOverview.tsx | 4 +-
.../dashboard/app/components/ProjectSelector.tsx | 27 +--------
.../app/components/__tests__/DataBoundary.test.tsx | 62 +++++++++++++++++++++
.../components/__tests__/ProjectOverview.test.tsx | 25 +++++++++
.../__tests__/ProjectThemeTokens.test.tsx | 37 ++++---------
.../utils/__tests__/projectStatusConfig.test.ts | 53 ++++++++++++++++++
.../dashboard/app/utils/projectStatusConfig.ts | 50 +++++++++++++++++
packages/dashboard/vitest.config.ts | 2 +
11 files changed, 282 insertions(+), 135 deletions(-)
Fusion-Task-Id: FN-5894
Fusion-Task-Lineage: 3626a4af-b62b-456d-82d7-cf47bbf55c21
2026-06-02 14:14:24 -07:00
gsxdsm
9b54f52b39
FN-5707: fix Android executor footer overlap after keyboard dismiss
...
Adjust mobile keyboard bar flags so Android keeps the executor footer stacked above the nav bar while iOS retains collapse behavior.
- extract mobile bar keyboard flag computation into a dedicated utility
- keep nav keyboard pinning cross-platform while limiting footer keyboard-collapse to iOS
- add focused unit tests for Android/iOS/modal/desktop keyboard flag scenarios
- update ExecutorStatusBar keyboard-open test assertion and dashboard guide keyboard behavior notes
Files changed:
docs/dashboard-guide.md | 2 +-
packages/dashboard/app/App.tsx | 23 ++++---
.../__tests__/ExecutorStatusBar.test.tsx | 6 +-
.../utils/__tests__/mobileBarKeyboardFlags.test.ts | 73 ++++++++++++++++++++++
.../dashboard/app/utils/mobileBarKeyboardFlags.ts | 36 +++++++++++
5 files changed, 129 insertions(+), 11 deletions(-)
Fusion-Task-Id: FN-5707
Fusion-Task-Lineage: ed01fcb0-d814-4595-9479-5baf97326ae7
2026-05-29 21:03:12 -07:00
gsxdsm
129e17d16c
FN-5702: keep mobile footer and nav pinned when keyboard opens
...
Add viewport-offset handling so mobile bottom bars stay anchored while virtual keyboards resize the visual viewport.
- add a shared viewportOffset utility to compute keyboard-related visual viewport compensation
- update dashboard app bootstrap/index logic to apply compensation variables for pinned footer/nav layout
- extend mobile keyboard layout coverage with dedicated viewport compensation and bottom-bar tests
- document the keyboard/pinned-bar behavior update in dashboard guide
Files changed:
docs/dashboard-guide.md | 2 +-
.../mobile-bottom-bars-keyboard-layout.test.ts | 12 ++-
.../viewport-compensation-keyboard.test.ts | 24 ++++++
packages/dashboard/app/index.html | 39 +++++++++-
.../app/utils/__tests__/viewportOffset.test.ts | 86 ++++++++++++++++++++++
packages/dashboard/app/utils/viewportOffset.ts | 64 ++++++++++++++++
6 files changed, 223 insertions(+), 4 deletions(-)
Fusion-Task-Id: FN-5702
Fusion-Task-Lineage: be47ad0c-82df-4c38-9577-94c2eee49a0e
2026-05-29 20:05:14 -07:00
Fusion (runfusion.ai)
e96cb09982
feat(FN-5388): add warm room cache hydration with open diagnostics
...
Add room open performance diagnostics and warm cache hydration for room switches (FN-5388). The implementation adds a timing instrumentation utility, SWR cache constants, warm-room handoff logic in `useChatRooms`, and a documentation file covering the performance model, accompanied by regression tes
Fusion-Task-Id: FN-5388
2026-05-20 20:27:11 -07:00
Fusion (runfusion.ai)
1913cb59fe
feat(FN-5389): add resume event instrumentation with SSE, hooks, and diagno
...
FN-5389 adds dashboard resume event instrumentation: a `resumeInstrumentation` utility captures SSE resume signals, wired through `useChat`, `useChatRooms`, and `useTasks` hooks, with remount markers in `Board` and `ChatView`; diagnostics routes expose resume events for observability, documented in
Fusion-Task-Id: FN-5389
2026-05-20 19:58:49 -07:00
Fusion (runfusion.ai)
cfc70b21bd
feat(FN-5202): add SWR caching for chat agents, skills, and models
...
This merge introduces SWR-style caching across the dashboard to eliminate redundant fetches for models, agents, and skills, significantly refactoring ChatView.tsx (reduced by ~140 lines) by offloading cache coordination to three new dedicated hooks (`useAgentsMapCache`, `useDiscoveredSkillsCache`, `
Fusion-Task-Id: FN-5202
2026-05-20 03:19:44 -07:00
Fusion (runfusion.ai)
e6c7dcdd64
feat(FN-5139): wire lineage unlink delete and archive flows
...
Fusion-Task-Id: FN-5139
Fusion-Task-Lineage: c16f4245-bfda-4b9a-bd98-ffc44b45f5a0
2026-05-19 18:56:24 -07:00
Fusion (runfusion.ai)
ad35a1ccfc
test(FN-5134): complete Step 2 — cover no-worktree badge suppression
...
Fusion-Task-Id: FN-5134
Fusion-Task-Lineage: 1d7fd2a5-de42-4977-a4b9-583c04124c5d
2026-05-19 07:36:11 -07:00
Fusion (runfusion.ai)
bca388af84
feat(FN-4963): complete Step 2 — add chat sessions cache key
...
Fusion-Task-Id: FN-4963
Fusion-Task-Lineage: 791f5e46-c630-4883-89de-942cc85c329b
2026-05-18 03:34:54 -07:00
gsxdsm
1842a69e6c
test(FN-4951): stabilize clipboard fallback coverage
...
Fusion-Task-Id: FN-4951
Fusion-Task-Lineage: 25de66db-c8cf-463b-86f2-efff1bc22683
2026-05-18 03:10:52 -07:00
gsxdsm
3986c09154
test(FN-4951): complete Step 2 — add clipboard utility tests
...
Fusion-Task-Id: FN-4951
Fusion-Task-Lineage: 25de66db-c8cf-463b-86f2-efff1bc22683
2026-05-18 03:10:52 -07:00
gsxdsm
f9cf3f1bde
feat(FN-4921): merge fusion/fn-4921
2026-05-17 19:11:59 -07:00
Fusion (runfusion.ai)
13bcb8ed85
feat(FN-4924): complete Step 1 — add tasks TTL constant
...
Fusion-Task-Id: FN-4924
Fusion-Task-Lineage: a5f882e1-8348-4f9d-89be-15994adc148c
2026-05-17 12:41:21 -07:00
Fusion (runfusion.ai)
7ad3449c8f
feat(FN-4924): complete Step 1 — add swr cache envelope ttl
...
Fusion-Task-Id: FN-4924
Fusion-Task-Lineage: a5f882e1-8348-4f9d-89be-15994adc148c
2026-05-17 11:33:56 -07:00
Fusion (runfusion.ai)
5793c4bcd7
feat(FN-4885): complete Step 6 — add deadlock disposition dashboard copy
...
Fusion-Task-Id: FN-4885
Fusion-Task-Lineage: 31110eed-5ca3-4d67-8f11-581185056dc6
2026-05-17 09:31:07 -07:00
Fusion (runfusion.ai)
672339619a
feat(FN-4859): complete Step 1 — extend swr cache keys
...
Fusion-Task-Id: FN-4859
Fusion-Task-Lineage: 9254ee9f-5600-4895-8ac4-41c9d89fce4d
2026-05-17 03:34:55 -07:00
Fusion (runfusion.ai)
167b2cf0c9
feat(FN-4780): complete Step 1 — add swr cache utility
...
Fusion-Task-Id: FN-4780
Fusion-Task-Lineage: 7f052539-9d15-4997-8135-21434f065d4a
2026-05-16 13:24:50 -07:00
Fusion
3648d1e1df
feat(FN-4595): implement cumulative execution timing semantics
...
Fusion-Task-Id: FN-4595
Fusion-Task-Lineage: 73a3d0ad-5c10-4560-aec5-f9d138deeefd
2026-05-15 07:50:34 -07:00
Fusion
03a4522118
test(FN-4570): complete Step 3 — cover merge-active stall suppression
...
Fusion-Task-Id: FN-4570
Fusion-Task-Lineage: 08deec6d-a54a-4296-9443-3101662314f2
2026-05-15 01:02:56 -07:00
Fusion
3573573a39
feat(FN-4462): complete Step 1 — per-code stall copy and counter
...
Fusion-Task-Id: FN-4462
Fusion-Task-Lineage: 15fc09f5-1363-429e-b131-9c9fdabee532
2026-05-14 22:57:47 -07:00
Fusion
273fc7018a
feat(FN-4452): complete Step 4 — surface stale paused review in dashboard
...
Fusion-Task-Id: FN-4452
Fusion-Task-Lineage: 7d8b1c13-883b-4815-94ee-fdf18ad24e5f
2026-05-14 18:35:30 -07:00
Fusion
927a32182d
feat(FN-4465): complete Step 4 — dashboard stale signal surfacing
...
Fusion-Task-Id: FN-4465
Fusion-Task-Lineage: 4365d4cb-ab93-4ed5-add9-3e14b26237ad
2026-05-14 05:55:16 -07:00