ab228551e9e0fa2e576e65fdca509062c9610629
393 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
329fc1f664 |
fix(dashboard): authenticate artifact media URLs (#2144)
## Summary - append the existing same-origin daemon token fallback to artifact media URLs used by image, video, and link navigation - preserve project scoping and artifact ID encoding - add a focused regression test and patch changeset ## Root cause Artifact metadata loads through authenticated `fetch`, but previews and links use raw browser navigation (`<img src>`, `<video src>`, and anchors), which cannot attach the dashboard bearer header. The media endpoint therefore returned `401 Valid bearer token required` even though the dashboard itself was authenticated. ## Verification - `pnpm --filter @fusion/dashboard exec vitest run --project dashboard-app-quality-foundation-api app/__tests__/api-artifacts.test.ts --reporter=dot` - `pnpm lint` - `pnpm --filter @fusion/dashboard typecheck` - `pnpm check:changesets --strict` - `pnpm build` - `FUSION_PG_TEST_URL_BASE=postgresql://plarson@127.0.0.1:55432 VITEST_MAX_WORKERS=1 nix shell nixpkgs#postgresql --command pnpm test:gate` The broader dashboard foundation API shard was also attempted but aborted in Node after repeated unmanaged-file-descriptor warnings; the focused regression and canonical merge gate both pass. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Fixed protected artifact images and links so they load correctly in authenticated dashboards. * Added authentication tokens to generated artifact media URLs for reliable previews and navigation. * **Tests** * Added coverage verifying authenticated artifact media URLs include the expected token and parameters. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
7261083781 |
fix(dashboard): isolate MCP settings scopes (#2116)
## Summary - bind Global and Project MCP editors to their raw values from `/api/settings/scopes` - keep edits isolated in the owning scope instead of mutating the merged project-effective form - persist changed MCP scopes independently of which Settings section is visible when Save is pressed - add unit and SettingsModal regressions for opposite scope values and edit → navigate → save ## Root cause `SettingsModal` passed the merged project-effective `form.mcpServers` to both MCP sections. A project override could therefore appear as the Global MCP value. Saving the apparent global change could then be dropped as a no-op when compared with the actual global-scoped value. The first fix still tied save routing to the active section. The follow-up carries both raw scoped MCP values through `splitSettingsSave`, where changed-only comparisons persist each owning scope even after navigation. ## Testing - `pnpm exec vitest run --project dashboard-app app/__tests__/settings-save-split.test.ts` (32 passed on PR branch) - `pnpm exec vitest run --project dashboard-app-quality-settings app/components/__tests__/SettingsModal.general.test.tsx` (84 passed) - `pnpm run typecheck` - `pnpm exec eslint app/components/SettingsModal.tsx app/components/settings/save-split.ts app/__tests__/settings-save-split.test.ts app/components/__tests__/SettingsModal.general.test.tsx` - `pnpm run build` <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Fixed MCP settings so global and project configurations remain correctly separated. * Prevented inherited global settings from appearing as project overrides. * Preserved MCP edits when navigating between Settings sections. * Ensured unchanged settings are not unnecessarily saved. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
cdf67c1d98 |
fix(dashboard): stop Planning Mode retry loop, make AI sessions multi-tab (#2101)
## Problem Reported: planning gets stuck in a cycle of retrying and regenerating after a response was already supplied. After the user answers a planning question, `submitResponse` pushed the answer to history but left `session.currentQuestion` pointing at the just-answered question for the whole next generation. The planning SSE route's catch-up path re-emits `currentQuestion` to every fresh connection — and each FN-7946 auto-retry (#2073) opens a fresh connection. So after any generation error: 1. Auto-retry connects a fresh stream → the server re-emits the **already-answered** question. 2. The client treats any question event as progress: it **resets the 3-attempt auto-retry budget** and re-shows the answered question. 3. The retry regenerates; if it errors again the cycle repeats with a fresh budget — an unbounded retry/regenerate loop. Re-answering the stale question also 409-collided with the in-flight generation, feeding the same loop. ## Fix Invariant: `currentQuestion` is only set while the session is genuinely awaiting user input. - `submitResponse` clears it the moment an answer is accepted (normal turns and the deepening checkpoint), while preserving the legacy 200 respond contract on generation failure (the modal ignores the body and lets the SSE error drive recovery). - `retrySession` scrubs stale questions persisted by pre-fix builds before regenerating. - `buildSessionFromRow` only restores a question when the persisted row is `awaiting_input`. - `didSubmitSameAnswer` now compares against the last history entry so the duplicate-submit 409 message survives. - Agent onboarding gets the same fix (its SSE route also re-emits `currentQuestion` on connect); retry now asks the next question instead of re-asking the answered one. Surface enumeration: mission and milestone interviews keep questions the same way but their SSE routes never re-emit on connect, and the auto-retry budget machinery is Planning-Mode-only — planning + onboarding were the two affected surfaces. ## Symptom Verification - **Original symptom:** after answering a question, Planning Mode loops between "Retrying…" and regenerating, re-showing the already-answered question, with the auto-retry budget never exhausting. - **Exact reproduction:** answer a question, have the next generation fail (stuck watchdog/provider error), let the client auto-retry open a fresh SSE connection. - **Assertion it is gone:** new regression suite `planning-answered-question-reemit.test.ts` asserts `currentQuestion` is cleared mid-generation, on generation failure, on retry, and on restore from non-`awaiting_input` rows — so the SSE catch-up path has nothing stale to re-emit. All 5 tests fail against pre-fix code and pass with the fix; an onboarding regression test covers the sibling surface. ## Verification - New regression tests: 5/5 fail on pre-fix code, pass with the fix (plus 1 onboarding test). - Existing suites: 137 planning server tests pass (3 failures in `routes-planning.test.ts` fail identically without this change — pre-existing on the branch); all 69 `PlanningModeModal.planning-flow` client tests pass; `tsc --noEmit` clean; `pnpm check:changesets` passes. 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Made Planning Mode (and related planning controls) lock-free and multi-tab—no more take-over/active-in-another-tab lock overlays. * **Bug Fixes** * Fixed Planning Mode retry/generation flows where already-answered questions could reappear. * Ensured answered questions clear immediately and aren’t re-emitted during session recovery/SSE catch-up. * Improved session restoration and preserved legacy recovery behavior when generation fails after an answer. * **Tests** * Added regression coverage for the answered-question invariant and updated existing tests to reflect lock-free behavior. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --- ## Follow-up: Planning Mode is now multi-tab via DB state (lock-free) Second commit removes all cross-tab coordination from planning — the persisted session row is the single source of truth and multiple tabs can read and interact with the same session: - **Server:** `/planning/*` routes no longer run `checkSessionLock` or parse `tabId`; a stale `tabId` from an older client is ignored instead of 409'd. Subtask/mission interview routes keep their existing lock behavior. - **Client:** `PlanningModeModal` drops `useSessionLock`, the `useAiSessionSync` BroadcastChannel broadcasts, `sessionTabId`/`lockSessionId` state, and the "Take Control" overlay. Tabs stay current via the per-session SSE stream plus the global `ai_session:updated` events `useBackgroundSessions` already consumes; concurrent writes resolve via the server's generation-in-progress guard (409). - **API client:** planning functions lose their `tabId` params. - **Fix uncovered by the refactor:** the 8s stuck-poll now resolves the session id inside each tick — the removed lock state was what previously re-armed the poll after Start Planning resolved the session id. - Also fixes a pre-existing PG-cutover break in `planning-generation-cancellation.test.ts` (`getSession` is async). Verification: 144 client planning tests and 137 server planning tests pass (the 3 remaining `routes-planning.test.ts` failures are pre-existing on the branch and fail identically without these changes); `tsc --noEmit` and eslint clean on changed files; `pnpm check:changesets` passes. Lock-conflict route tests were rewritten to assert lock-free semantics, plus a new modal test proving a session stays fully interactive with no lock acquisition even when another tab is active. --- ## Follow-up 2: the per-tab session lock is gone entirely Third commit extends the multi-tab model from planning to **every** AI interview surface (planning, subtask breakdown, mission interview, milestone/slice interview) and deletes the lock machinery root and branch. **Server** - Deleted the `/ai-sessions/:id/lock`, `/lock/force`, and `/lock/beacon` routes. - Dropped `checkSessionLock` from every planning/subtask/mission/milestone route (both copies — `routes.ts` and `mission-routes.ts`). A `tabId` from an older client is ignored, never 409'd; all `tabId` body parsing is gone. - Dropped `acquireLock` / `releaseLock` / `forceAcquireLock` / `getLockHolder` / `releaseStaleLocks` from `AiSessionStore`, plus the `@fusion/core` async helpers (`acquireAiSessionLock` et al) and core's re-exports. - Removed `lockedByTab`/`lockedAt` from `AiSessionRow`/`AiSessionSummary`, the upsert SQL, and all four session producers. **Client** - Deleted `useSessionLock` and the now-orphaned `getSessionTabId` util. - Removed the Take Control overlay, the "active in another tab" banners, and `BackgroundTasksIndicator`'s active-elsewhere gate (the confirm prompt and lock badge — sessions now just open). - Reduced `useAiSessionSync` to what its own comments already called it — a low-latency *status* supplement to SSE: no `activeTabMap`, `broadcastLock/Unlock/Heartbeat`, `owningTabId`, `tab:*` messages, or stale-heartbeat sweep. - Dropped `tabId` from every session API client function; removed the lock CSS. **Deliberately kept: the two DB columns.** `ai_sessions.locked_by_tab` / `locked_at` remain as dead, always-NULL columns with a deprecation note. Dropping them is an irreversible migration, and released binaries still name those columns explicitly in their upsert — an older install pointed at the same database would fail every session write. They can be dropped once no such binary can reach it. No code reads or writes them. **Verification**: 397 client tests and 137 server planning tests pass (the same 3 `routes-planning.test.ts` failures are pre-existing — verified identical on a clean stash); `tsc --noEmit` clean for `@fusion/core` and `@fusion/dashboard`; eslint clean on all changed files; the 30 PG `schema-applier` tests pass (they exercise the retained columns); `pnpm check:changesets` passes. The lock-conflict route tests and both modal lock tests were rewritten to assert the inverse: routes and modals stay fully interactive while another tab "holds" a lock, and the lock API is never called. --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
d7e072a03c |
fix: add psql binary guard + delete expired quarantine tests (ratchet) (#2090)
## Summary Follow-up to PR #2086 addressing two Greptile review findings. ## P2 — Missing `psql` binary guard (Greptile P2) `hasPg` in `_helpers.ts` previously checked only TCP connectivity to PostgreSQL. But `adminExecAsync()` shells out to the `psql` CLI for DDL (`CREATE/DROP DATABASE`). On a runner where Postgres is reachable but `psql` isn't installed, tests would fail with `spawn psql ENOENT` instead of skipping cleanly. **Fix**: Added `hasPsql = spawnSync("psql", ["--version"]).status === 0` to the `hasPg` guard, so tests skip when either Postgres is unreachable OR `psql` is missing. ## P1 — Expired quarantine entries (Greptile P1) The 16 dashboard test files quarantined on 2026-06-25 were past the 14-day deletion ratchet (AGENTS.md: "DELETED after 14 days unless rescued"). Per the ratchet, the test files were deleted and all references removed: - **Deleted 16 test files** (CSS drift, mock drift, mobile-render regressions) - **Removed 16 entries** from `scripts/lib/test-quarantine.json` (only the CLI entry remains) - **Emptied `quarantinedDashboardTests` array** in `packages/dashboard/vitest.config.ts` ## Verification | Check | Result | |---|---| | Merge gate (`pnpm test:gate`) | ✅ 294 + 99 + 63 = 456 passed | | Dashboard curated-gate | ✅ passes (891 files, 892 executed, 1 skip-listed, 1 quarantined) | | Typecheck (engine) | ✅ clean | | Lint | ✅ exit 0 | <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Tests** * Removed multiple outdated dashboard UI, CSS/token, theme contrast, and API/route test suites. * Updated dashboard test configuration to stop excluding quarantined tests and to prune the quality shard to the current set. * Updated the Vitest split/config guard to match the new test fixture set. * Improved PostgreSQL test detection by requiring the `psql` CLI before running database checks. * Adjusted quarantine tracking by adding a new CLI extension distribution ledger entry and removing obsolete dashboard quarantine entries. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
7246df22f6 |
FN-7944: add setting to keep task popups attached to their Board/List view
Adds an opt-in project setting so open task-detail popups stay attached to the Board or List view where they were opened, instead of floating over every main-content view. - New project setting taskPopupsBoardListOnly (default: off) in settings-schema.ts and ProjectSettings type, with default preserved via settings-defaults tests. - usePoppedOutTasks now stores each popup's originating TaskView alongside its task snapshot (PoppedOutTaskEntry), keeping legacy tasks output for existing callers. - App.tsx adds isTaskPopupVisibleForView() gating helper and filters popped-out entries to the current view for rendering/keyboard-close handling, while hidden popups remain mounted in hook state (not cleared) so switching back to the originating view restores them with shared persisted geometry. - Settings -> Appearance gets a new "Keep task popups on their Board/List view" checkbox (AppearanceSection.tsx) with i18n strings and updated settings search text in SettingsModal. - Documentation updated in docs/dashboard-guide.md and docs/settings-reference.md to describe the render-only hide/restore behavior. - New/updated tests: App.taskPopupViewGating.test.tsx, usePoppedOutTasks.test.ts, AppearanceSection.test.tsx, settings-default-descriptions.test.tsx, settings-defaults.test.ts. Files changed: docs/dashboard-guide.md | 5 +- docs/settings-reference.md | 1 + .../core/src/__tests__/settings-defaults.test.ts | 13 +++ packages/core/src/settings-schema.ts | 5 + packages/core/src/types.ts | 7 ++ packages/dashboard/app/App.tsx | 49 +++++++-- .../app/__tests__/App.taskPopupViewGating.test.tsx | 113 +++++++++++++++++++++ .../dashboard/app/components/SettingsModal.tsx | 3 +- .../settings/sections/AppearanceSection.tsx | 8 ++ .../sections/__tests__/AppearanceSection.test.tsx | 21 ++++ .../settings-default-descriptions.test.tsx | 1 + .../app/hooks/__tests__/usePoppedOutTasks.test.ts | 14 +++ packages/dashboard/app/hooks/useAppSettings.ts | 4 + packages/dashboard/app/hooks/usePoppedOutTasks.ts | 27 +++-- packages/i18n/locales/en/app.json | 2 + 15 files changed, 255 insertions(+), 18 deletions(-) Fusion-Task-Id: FN-7944 Fusion-Task-Lineage: 4b8ced0e-1853-429f-8482-163821a35ae6 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
a81486559e |
fix: dashboard lucide/CSS/SettingsModal/mcp-helper fixes + expand mock-completeness guard to dashboard (round 11) (#2049)
## Summary Fixes all remaining full-suite failures from run 29231108919 (FN-7923–7931 drift) + expands the structural mock-completeness guard to cover dashboard tests. ## Fixes ### Dashboard (shard 4) — 4 files - **`TaskCard.cli-states.test.tsx`** — Proxy lucide-react mock needed `has`/`getOwnPropertyDescriptor` traps; TaskCard now imports `priorityIndicator.tsx` which reads `ArrowDown` at module-init. Vitest validates ESM named exports via `in`/descriptor, not `get`. Also added `useToast` mock. - **`SettingsModalNodeRouting.test.tsx`** — Pass `initialSection="node-routing"` (it's in `ADVANCED_SETTINGS_SECTION_IDS`, nav hidden by default). - **`styles-css-rgba-tokenization.test.ts`** — Removed stale `.settings-sidebar` color-mix expectation (FN-7825 made it structural-only). - **`mcp-helper-forwarding.test.ts`** — Added `resolvePlanningThinkingLevel` to `@fusion/engine` mock (insight extraction calls it before MCP forwarding). ### Structural guard expansion - **`.tsx` blind spot fixed** — `collectTs` and test file filter now include `.tsx` files - **Shorthand property extraction** — key extractor now matches both `key: value` and `key,` (shorthand) - **Convention mapping** — `.test.tsx → .tsx` source resolution added - **Dashboard test coverage** — `@fusion/engine` barrel check now scans `packages/dashboard/src/__tests__/` - **7 latent mock gaps completed** — `pr-conflict-resolver`, `project-pause-resume-routes`, `routes-approval-sandbox-provisioning`, `routes-approval`, `routes-worktrunk`, `session-reconnect`, `setup-routes` ### Engine (shards 1+2) — zero real failures All 3 failing files are local-only (`@agentclientprotocol/sdk` + pi-ai staleness). CI resolves them from lockfile. ## Verification - Gate (with expanded guard): exit 0 ✅ - Dashboard (5 non-local files): 36/36 passed ✅ - 3 files skipped locally (`@agentclientprotocol/sdk`) — CI will verify <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Tests** * Improved test reliability by completing module mocks across dashboard and routing scenarios. * Updated settings and task card test coverage to reflect current UI behavior. * Enhanced mock validation to cover additional test files, TypeScript React files, and shorthand exports. * Prevented failures related to missing providers, engine helpers, and planning configuration. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
7a51f95b38 |
FN-7901: persist thinkingLevel for insight model selection
Adds a persisted Thinking Level (reasoning-effort) selector to manual insight generation, threading the selection through the dashboard API, insight run metadata, and retries. - Add inline Thinking Level selector to the InsightsView model-config popover, persisted to localStorage (fusion-insight-thinking) - Thread thinkingLevel through triggerInsightRun (legacy API client) and useInsights.runInsights - Validate and store thinkingLevel in insight run inputMetadata.metadata on the POST /insights/run route; resolve it via resolvePlanningThinkingLevel for the actual generation call - Recover and reapply the original run's thinkingLevel on retry (retryInsightRunLifecycle) so retries reuse the same reasoning-effort setting - Export resolvePlanningThinkingLevel from @fusion/engine - Document the new Thinking Level selector in docs/dashboard-guide.md - Add a minor changeset for @runfusion/fusion Files changed: .changeset/fn-7901-insight-thinking-level.md | 7 ++ docs/dashboard-guide.md | 1 + .../app/__tests__/insight-model-selector.test.tsx | 41 ++++++++++- packages/dashboard/app/api/legacy.ts | 2 + packages/dashboard/app/components/InsightsView.tsx | 24 +++++- .../app/hooks/__tests__/useInsights.test.ts | 36 ++++++++- packages/dashboard/app/hooks/useInsights.ts | 6 +- .../src/__tests__/insights-routes.test.ts | 86 ++++++++++++++++++++++ packages/dashboard/src/insights-routes.ts | 36 ++++++++- packages/engine/src/index.ts | 1 + 10 files changed, 227 insertions(+), 13 deletions(-) Fusion-Task-Id: FN-7901 Fusion-Task-Lineage: a6249526-e97d-403e-b853-e497d16f425b Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
be1950b79c |
FN-7843: keep task-detail per-model token tables horizontally scrollable on mobile
Removes the mobile stacked-card override for the Summary tab's per-model token/cost table so it stays a real, horizontally-scrollable table matching the Command Center pattern, and updates the covering tests/changeset accordingly. - Drop the @media (max-width: 768px) block in TaskDetailModal.css that converted .task-summary-token-table rows into stacked cards (display:block, thead hidden, td::before labels), so the wrapper's overflow-x: auto and table min-width now govern mobile layout. - Update FNXC:TaskDetailSummaryTokenCost comments to document the new horizontal-scroll contract instead of the removed stacked-card behavior, and refresh the TaskCostTab.css FNXC comment to match. - Add a new regression test (token-table-mobile-scroll.test.ts) asserting the task-detail token table wrapper keeps overflow-x: auto, the mobile media block no longer stacks rows into cards, and the Command Center .cc-table-wrap stays scrollable. - Update the existing TaskDetailModal summary-tab test to assert the stacked-card CSS is absent from the mobile block instead of asserting its presence. - Add a patch changeset describing the fix for end users. Files changed: .changeset/mobile-token-table-scroll.md | 7 +++ .../__tests__/token-table-mobile-scroll.test.ts | 70 +++++++++++++++++++++ packages/dashboard/app/components/TaskCostTab.css | 2 +- .../dashboard/app/components/TaskDetailModal.css | 73 ++-------------------- .../__tests__/TaskDetailModal.summary-tab.test.tsx | 13 ++-- 5 files changed, 90 insertions(+), 75 deletions(-) Fusion-Task-Id: FN-7843 Fusion-Task-Lineage: bb6dde7c-f205-45f3-984a-0fc52be5d547 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
41998a6c75 |
FN-7828: fix cramped padding on notifications failure-mode settings card
Wraps the failure-notification mode fields in the shared .notification-provider-body wrapper so the card's padding/gutters match sibling provider cards on desktop and mobile. - Wrap failure-notification mode select and delay input in .notification-provider-body within NotificationsSection.tsx - Add FNXC:SettingsLayout comment documenting why .notification-provider-body is needed (parent .notification-provider-card has no own padding) - Add regression test asserting the failure-notification mode field nests inside .notification-provider-body, itself inside .notification-provider-card - Add changeset (patch) documenting the fix Files changed: .changeset/fuzzy-notification-padding.md | 7 +++ .../app/__tests__/settings-sections.test.tsx | 18 ++++++++ .../settings/sections/NotificationsSection.tsx | 50 ++++++++++++---------- 3 files changed, 53 insertions(+), 22 deletions(-) Fusion-Task-Id: FN-7828 Fusion-Task-Lineage: 734c652d-400e-4cb1-b6a9-3a001f0b10b7 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
bcbd97cc1c |
feat: simplified workflow editor view with Simple/Advanced/List modes
Adds a simplified graphical node editor as the workflow editor's default view: a modern vertical auto-laid-out React Flow canvas with insert-on-edge "+" affordances and a searchable, categorized add-step dialog (node kinds + fragments + step templates). A segmented Simple/Advanced/List switch (persisted in localStorage) keeps the full advanced canvas untouched and retains the old compact row editor as the List fallback. Mobile's graph tab gains the touch-friendly simplified canvas with the row list as fallback. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|
|
6317fcddb5 |
FN-7813: add embedded worktree-rooted multi-tab Terminal to Task Detail
Add an interactive, worktree-rooted, multi-tab Terminal tab to the Task Detail view, distinct from the pre-existing CLI-agent Session tab. - TaskDetailModal gains a new embedded Terminal tab (single non-workspace task with one recorded worktree) that mounts TerminalModal in a new `embedded` render mode, rooted at the task's worktree - Rename the existing agent-session tab label to "Session" to disambiguate it from the new Terminal tab - useTerminalSessions gains task-scoped session storage and a `defaultCwd` option so embedded terminal tabs persist separately from footer/global project terminal tabs and start in the task worktree - TerminalModal/CSS updated to support the embedded layout mode - Update lazy-loaded-views docs test and AGENTS.md exclusion list to cover the new `LazyTerminalModal` task-detail-internal surface - Document the new Session/Terminal tab split in docs/dashboard-guide.md - Add i18n strings for the new Terminal tab across all locales - Add a changeset (minor) for @runfusion/fusion Files changed: .changeset/FN-7813-worktree-terminal-tab.md | 7 + AGENTS.md | 2 +- docs/dashboard-guide.md | 3 + .../app/__tests__/lazy-loaded-views-docs.test.ts | 4 +- .../dashboard/app/components/TaskDetailModal.css | 17 +++ .../dashboard/app/components/TaskDetailModal.tsx | 41 +++++- .../dashboard/app/components/TerminalModal.css | 51 +++++++ .../dashboard/app/components/TerminalModal.tsx | 71 +++++++--- .../__tests__/TaskDetailModal.test-helpers.ts | 3 + .../TaskDetailModal.worktree-terminal.test.tsx | 139 ++++++++++++++++++ .../components/__tests__/TerminalModal.test.tsx | 29 ++++ .../hooks/__tests__/useTerminalSessions.test.ts | 157 +++++++++++++++++++++ .../dashboard/app/hooks/useTerminalSessions.ts | 63 ++++++--- packages/i18n/locales/en/app.json | 3 +- packages/i18n/locales/es/app.json | 3 +- packages/i18n/locales/fr/app.json | 3 +- packages/i18n/locales/ko/app.json | 3 +- packages/i18n/locales/zh-CN/app.json | 3 +- packages/i18n/locales/zh-TW/app.json | 3 +- 19 files changed, 550 insertions(+), 55 deletions(-) Fusion-Task-Id: FN-7813 Fusion-Task-Lineage: 4ef86a15-347a-4862-b01c-5063d8004cb8 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
60b8b4e4c5 |
FN-7805: redesign quick-add priority indicators as icon-only controls
Redesigns the Quick Add composer's priority selector to icon-only glyph buttons and relocates GitHub tracking beside attach, backed by a new shared priorityIndicator helper. - Add packages/dashboard/app/utils/priorityIndicator.tsx as the single source of ArrowUp/ArrowDown/Flag/TriangleAlert priority glyphs, shared by QuickEntryBox and TaskForm - Rework QuickEntryBox.tsx to render icon-only priority/Fast controls and move GitHub tracking + Priority into the .quick-entry-primary-group, with matching QuickEntryBox.css layout updates - Update TaskForm.tsx to reuse the new priorityIndicator helper instead of duplicating icon/label logic - Update quick-entry height-parity/trigger-height tests and QuickEntryBox/TaskForm/NewTaskModal tests for the new icon-only layout - Add priorityIndicator.test.tsx covering the shared helper - Update docs/dashboard-guide.md and add changeset fn-7805-quick-add-priority-indicators.md (patch, feature) Files changed: .../fn-7805-quick-add-priority-indicators.md | 7 + docs/dashboard-guide.md | 3 +- .../quick-entry-action-row-height-parity.test.tsx | 13 +- .../quick-entry-workflow-trigger-height.test.tsx | 10 +- .../dashboard/app/components/QuickEntryBox.css | 19 +- .../dashboard/app/components/QuickEntryBox.tsx | 197 +++++++++++---------- packages/dashboard/app/components/TaskForm.tsx | 33 ++-- .../app/components/__tests__/NewTaskModal.test.tsx | 3 + .../components/__tests__/QuickEntryBox.test.tsx | 113 ++++++++---- .../app/components/__tests__/TaskForm.test.tsx | 3 + .../app/utils/__tests__/priorityIndicator.test.tsx | 21 +++ packages/dashboard/app/utils/priorityIndicator.tsx | 30 ++++ 12 files changed, 300 insertions(+), 152 deletions(-) Fusion-Task-Id: FN-7805 Fusion-Task-Lineage: 404fe8d6-0851-44cb-b31d-f47896aaaaba Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
3d5cc0ada4 |
FN-7795: add thinking-level selectors to fallback model pickers
Adds a per-lane thinking-level selector to every fallback model picker across global, project, and workflow Settings surfaces, wiring them into the existing null-as-delete save paths. - Add inline thinking-level dropdowns to the global Fallback Model, workflow-declared planning/validator fallback lanes, and the project-scoped Title Summarizer fallback picker via CustomModelDropdown's `showThinkingLevel`. - Route `planningFallbackThinkingLevel`/`validatorFallbackThinkingLevel` through workflow settings PATCH and `titleSummarizerFallbackThinkingLevel` through project settings save-split, both with null-as-delete semantics on reset. - Move Title Summarizer fallback out of the workflow-declared model pairs into a dedicated project-scoped lane in ProjectModelsSection so its thinking companion isn't tied to workflow settings. - Update WorkflowSettingsPanel to surface the new fallback thinking companion keys. - Extend/adjust tests (settings-save-split, settings-sections, SettingsModal.models-auth, WorkflowSettingsPanel, core settings-migration) to cover the new selectors and save routing. - Document the fallback thinking-level runtime behavior in docs/settings-reference.md and docs/dashboard-guide.md. - Add a minor changeset describing the new fallback thinking-level selectors. Files changed: .changeset/fn-7795-fallback-thinking-selectors.md | 7 + docs/dashboard-guide.md | 4 +- docs/settings-reference.md | 10 +- packages/core/src/__tests__/settings-migration.test.ts | 14 +- packages/dashboard/app/__tests__/settings-save-split.test.ts | 35 +++++ packages/dashboard/app/__tests__/settings-sections.test.tsx | 163 ++++++++++++++++++++- packages/dashboard/app/components/WorkflowSettingsPanel.tsx | 6 +- packages/dashboard/app/components/__tests__/SettingsModal.models-auth.test.tsx | 11 +- packages/dashboard/app/components/__tests__/WorkflowSettingsPanel.test.tsx | 38 +++++ packages/dashboard/app/components/settings/save-split.ts | 9 +- packages/dashboard/app/components/settings/sections/GlobalModelsSection.tsx | 8 +- packages/dashboard/app/components/settings/sections/ProjectModelsSection.tsx | 58 ++++++-- 12 files changed, 328 insertions(+), 35 deletions(-) Fusion-Task-Id: FN-7795 Fusion-Task-Lineage: ec990d47-defe-4717-993a-56988afe8d7d Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
5f14a58d3b |
FN-7770: add per-lane thinking-level overrides for project & global model settings
Adds an optional thinking-effort/reasoning override per model lane in Settings (project and global), resolved with precedence task > lane > global default, and reconciles this work with the already-landed FN-7768 inline thinking-level control on CustomModelDropdown (kept the shared shouldShowThinking/thinkingBadgeLabel implementation to avoid duplicating the selector/badge UI). - Add lane thinking-level settings schema fields and runtime precedence (task > lane > global default) in @fusion/core - Wire per-lane thinking selectors into GlobalModelsSection and ProjectModelsSection via CustomModelDropdown's existing showThinkingLevel/thinkingLevel/onThinkingLevelChange/defaultThinkingLevel props - Resolve merger thinking level from the default lane rather than the title-summarizer lane in engine session helpers/executor/merger/triage - Update settings-reference docs and add a minor changeset for the new lane thinking overrides - Add/expand test coverage: settings-parity, store-settings, settings-sections, agent-session-helpers - Add new i18n key models.options.defaultWithLevel across locales Files changed: .changeset/fn-7770-lane-thinking.md | 7 ++ docs/settings-reference.md | 8 ++ .../core/src/__tests__/settings-parity.test.ts | 17 ++++ packages/core/src/__tests__/store-settings.test.ts | 42 +++++++++ packages/core/src/settings-schema.ts | 14 +++ packages/core/src/types.ts | 16 ++++ .../app/__tests__/settings-sections.test.tsx | 100 ++++++++++++++++++--- .../app/components/CustomModelDropdown.css | 1 + .../dashboard/app/components/SettingsModal.tsx | 37 ++++++++ .../settings/sections/GlobalModelsSection.tsx | 9 +- .../settings/sections/ProjectModelsSection.tsx | 12 ++- .../app/components/settings/sections/context.ts | 2 + .../src/__tests__/agent-session-helpers.test.ts | 36 ++++++++ packages/engine/src/agent-session-helpers.ts | 60 +++++++++++++ packages/engine/src/executor.ts | 14 +-- packages/engine/src/merger-ai.ts | 12 ++- packages/engine/src/merger.ts | 12 +-- packages/engine/src/pr-response-run-ops.ts | 4 +- packages/engine/src/step-session-executor.ts | 3 +- packages/engine/src/triage.ts | 5 +- packages/i18n/locales/en/app.json | 3 +- packages/i18n/locales/es/app.json | 3 +- packages/i18n/locales/fr/app.json | 3 +- packages/i18n/locales/ko/app.json | 3 +- packages/i18n/locales/zh-CN/app.json | 3 +- packages/i18n/locales/zh-TW/app.json | 3 +- packages/i18n/src/resources.d.ts | 3 + 27 files changed, 390 insertions(+), 42 deletions(-) Fusion-Task-Id: FN-7770 Fusion-Task-Lineage: 3418c621-ac99-4cd4-a435-9348da03972f Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
9a5a8d2b5f |
FN-7683: fix Quick Add mobile Save button height overshoot with fixed action-row box height
Upgrades Quick Add action-row height parity from a bare min-height floor to a true fixed box height, then adds a mobile-only Save correction per operator feedback so Save matches its siblings at the <=768px breakpoint without touching desktop/tablet sizing. - Pair min-height with an equal max-height (plus tokenized line-height and centered alignment) on `.quick-entry-actions .btn, .quick-entry-actions .wf-optional-steps-dropdown-trigger` at both the desktop base rule and the <=768px touch-target media block (FN-5751: never a breakpoint-only fix) - Add a mobile-only override scoped to `[data-testid="quick-entry-save"]` inside the <=768px media query (zero vertical padding, line-height:1) so Save's text+icon content fits the same fixed box as its siblings, leaving desktop/tablet Save sizing untouched - Add regression coverage asserting the fixed min-height==max-height contract at both breakpoints, that shared .btn-sm/.btn-icon/.dep-trigger rules are untouched, and that the Save-only override exists only inside the mobile media query - Add a patch changeset documenting the fix and follow-up for @runfusion/fusion Files changed: .changeset/FN-7683-quick-add-height-parity.md | 7 + .../quick-entry-workflow-trigger-height.test.tsx | 181 ++++++++++++++++++++- .../dashboard/app/components/QuickEntryBox.css | 53 ++++++ 3 files changed, 234 insertions(+), 7 deletions(-) Fusion-Task-Id: FN-7683 Fusion-Task-Lineage: d3df638a-812e-4fc2-aada-cfee58d29f2b Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
5c0ed62001 |
FN-7681: Fix undefined --space-2xs token references in dashboard component CSS
Replaces undefined --space-2xs CSS custom property references with the smallest defined spacing token, --space-xs, across several dashboard component stylesheets, and hardens the regression test that guards against reintroducing --space-2xs by scanning components recursively. - Replace var(--space-2xs) with var(--space-xs) in NewTaskModal.css, QuickEntryBox.css, TaskReviewTab.css, and McpServersCard.css - Update QuickEntryBox.test.tsx assertion to expect --space-xs instead of --space-2xs - Make space-token-defined.test.ts recursively walk components directory (previously only scanned the top level, missing nested files like settings/sections/McpServersCard.css) - Add FNXC:DashboardTokens comments documenting the --space-2xs is-intentionally-undefined decision (FN-5934) and the recursive-scan fix rationale (FN-7681) Files changed: .../app/__tests__/space-token-defined.test.ts | 33 ++++++++++++++++++---- packages/dashboard/app/components/NewTaskModal.css | 2 +- .../dashboard/app/components/QuickEntryBox.css | 18 ++++++++---- .../dashboard/app/components/TaskReviewTab.css | 2 +- .../components/__tests__/QuickEntryBox.test.tsx | 2 +- .../settings/sections/McpServersCard.css | 4 +-- 6 files changed, 44 insertions(+), 17 deletions(-) Fusion-Task-Id: FN-7681 Fusion-Task-Lineage: 59850d5c-09cc-4178-ac45-9792fa9aca59 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
13570e86aa |
FN-7680: fix Quick Add action row button height parity
Normalizes Quick Add action-row button heights (Save, Attach, Fast, workflow trigger) at desktop and mobile widths so all controls share one box height regardless of icon-only vs text content or .dep-trigger padding. - Add scoped min-height rule for .quick-entry-actions .btn and .wf-optional-steps-dropdown-trigger in QuickEntryBox.css (desktop base rule, mirrors existing mobile touch-target block) - Add regression test covering desktop + mobile action-row height parity across button variants - Add changeset (patch) documenting the fix Files changed: .changeset/FN-7680-quick-add-height-parity.md | 7 + .../quick-entry-action-row-height-parity.test.tsx | 256 +++++++++++++++++++++ .../dashboard/app/components/QuickEntryBox.css | 31 +++ 3 files changed, 294 insertions(+) Fusion-Task-Id: FN-7680 Fusion-Task-Lineage: 73024883-08f3-41d0-a601-48e223eea57f Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
a4fce60b18 |
FN-7677: fix quick-add workflow dropdown button height mismatch
Aligns the quick-entry workflow-trigger dropdown button height with the neighboring Save/Fast/Subtask buttons and adds a regression test plus changeset. - QuickEntryBox.css: .quick-entry-workflow-trigger re-asserts .btn-sm's padding: 4px 10px locally so the shared global .dep-trigger padding: 3px 8px no longer shortens it by ~2px - Add regression test packages/dashboard/app/__tests__/quick-entry-workflow-trigger-height.test.tsx covering the height parity - Add changeset fn-7677-quick-add-workflow-trigger-height.md (patch, fix) - Minor doc updates in cli skill fusion references (extension-tools.md, fusion-capabilities.md) Files changed: .changeset/fn-7677-quick-add-workflow-trigger-height.md | 7 + packages/cli/skill/fusion/references/extension-tools.md | 6 +- packages/cli/skill/fusion/references/fusion-capabilities.md | 4 +- packages/dashboard/app/__tests__/quick-entry-workflow-trigger-height.test.tsx | 248 +++++++++++++++++++++ packages/dashboard/app/components/QuickEntryBox.css | 5 + 5 files changed, 266 insertions(+), 4 deletions(-) Fusion-Task-Id: FN-7677 Fusion-Task-Lineage: c8cc1b0d-f9c1-4691-a5b4-14ec8ac7e98e Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
7e089e188e |
test(dashboard): align app tests with recent product changes (FN-7057/7340/7156/7342/6825/7265)
Update five dashboard app test files whose assertions drifted from intentional product changes that landed on main without updating them: - graph-workflow-header: FN-7057 treats stale/missing workflow ids as the default workflow, so FN-unknown now shows under the default selection. - EngineControlMenu.css: FN-7340 added a 768px range-thumb touch-target block; narrow the popover-breakpoint assertion to that selector. - MissionManager.delete-confirm: FN-7156 removed first-mission auto-select; explicitly select the mission before the detail-delete flow. - board-mobile-initial-render: FN-7342 preserves board column scroll during stabilization; FN-6825 renders the workflow toolbar on options, not callbacks. - workflow-auto-layout: FN-7265 removed the stepwise review node (per-step review lives in the foreach); the connected run ends at completion-summary. No assertion was loosened or deleted to force a pass; each change cites the breaking commit via an FNXC comment. packages/dashboard is private (no changeset). |
||
|
|
da36094d74 |
FN-7586: add iOS edge-swipe-back gesture parity via AppDelegate patch
Enables the WKWebView interactive-pop (edge-swipe-back) gesture on iOS, matching the Android predictive-back parity already in place, by patching the generated AppDelegate.swift during cap sync. - Add packages/mobile/scripts/patch-ios-webview.ts: patches AppDelegate.swift to cast the root view controller to CAPBridgeViewController and set webView?.allowsBackForwardNavigationGestures = true before the didFinishLaunchingWithOptions return, is idempotent, and no-ops safely when no ios/ project exists yet - Wire capacitor:sync:after to run both patch-android-manifest.ts and patch-ios-webview.ts so cap sync keeps both native back-gesture opt-ins in sync; add patch:ios-webview script - Add unit tests covering patch, idempotency, already-patched, missing-project, and source-preservation cases for the new iOS webview patch, alongside the existing Android manifest patch tests - Add TaskDetail.swipe-back.test.tsx coverage proving the shared popstate-driven nav-history dismissal stack (no iOS-specific native-back emitter needed) already satisfies the gesture's dismissal contract - Add mobile-scripts.test.ts dashboard coverage and update MOBILE.md / packages/mobile/README.md documenting the new iOS gesture opt-in Files changed: MOBILE.md | 12 ++ .../dashboard/app/__tests__/mobile-scripts.test.ts | 31 +++++ .../__tests__/TaskDetail.swipe-back.test.tsx | 131 +++++++++++++++++++++ packages/mobile/README.md | 36 ++++++ packages/mobile/package.json | 3 +- packages/mobile/scripts/patch-ios-webview.ts | 119 +++++++++++++++++++ packages/mobile/src/__tests__/native-shell.test.ts | 122 +++++++++++++++++++ 7 files changed, 453 insertions(+), 1 deletion(-) Fusion-Task-Id: FN-7586 Fusion-Task-Lineage: 248092a1-de1b-49b6-94ef-70675a7b93a1 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
e7cb2f1fed |
FN-7525: add Revert/Undo affordance to Done and Archived task cards
Adds a Revert action so operators can undo landed changes for Done/Archived tasks directly from the board. - Adds onRevertTask wiring through Board, Column, Lane, ListView, TaskDetailModal, and WorktreeGroup surfaces - Adds a Revert affordance to TaskCard (Done/Archived states) with confirm UX and CSS - Adds POST /tasks/:id/revert legacy API route supporting "auto" mode with an AI-undo fallback (mode: "ai") on conflict - Wires useTasks hook and dashboard MainContent/types to support the new revert action - Adds new i18n strings for the revert affordance - Adds a minor changeset for @runfusion/fusion documenting the feature - Adds/updates tests: TaskCard.test.tsx, board-mobile.test.tsx, api-git.test.ts - Updates docs/dashboard-guide.md and docs/task-management.md Files changed: .changeset/fn-7525-revert-card-affordance.md | 7 + docs/dashboard-guide.md | 2 +- docs/task-management.md | 10 ++ packages/dashboard/app/App.tsx | 7 +- packages/dashboard/app/__tests__/api-git.test.ts | 51 +++++++ packages/dashboard/app/api/legacy.ts | 51 +++++++ packages/dashboard/app/components/AppModals.tsx | 5 +- packages/dashboard/app/components/Board.tsx | 10 +- packages/dashboard/app/components/Column.tsx | 8 +- packages/dashboard/app/components/Lane.tsx | 5 +- packages/dashboard/app/components/ListView.tsx | 80 ++++++++++- packages/dashboard/app/components/TaskCard.css | 24 +++- packages/dashboard/app/components/TaskCard.tsx | 127 ++++++++++++++++- packages/dashboard/app/components/TaskDetailModal.tsx | 85 ++++++++++++ packages/dashboard/app/components/WorktreeGroup.tsx | 6 + packages/dashboard/app/components/__tests__/TaskCard.test.tsx | 151 +++++++++++++++++++++ packages/dashboard/app/components/__tests__/board-mobile.test.tsx | 63 +++++++++ packages/dashboard/app/components/dashboard/MainContent.tsx | 4 + packages/dashboard/app/components/dashboard/types.ts | 8 ++ packages/dashboard/app/components/useRightDockController.tsx | 4 + packages/dashboard/app/hooks/useTasks.ts | 21 ++- packages/i18n/locales/en/app.json | 11 ++ 22 files changed, 718 insertions(+), 22 deletions(-) Fusion-Task-Id: FN-7525 Fusion-Task-Lineage: b9e2ca94-4ec6-4443-8e41-cf4828018856 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
6d364fc407 |
FN-7560: move mobile terminal controls to footer with scrollable shortcuts
Relocates the mobile (<=768px) terminal action cluster from the header into a new bottom footer bar and ensures the shortcut key row can scroll horizontally without clipping. - Add terminal-footer-actions bar for mobile viewports, keeping desktop/floating/pinned-below header layout (FN-7502) unchanged - Apply min-width:0 and overflow-x:auto to the footer actions cluster so it no longer crowds the header - Preserve the FN-7550 shortcut-panel horizontal scroll fix - Update TerminalModal and mobile header-row tests to cover the new footer layout - Add changeset documenting the fix Files changed: .changeset/fn-7560-mobile-terminal-footer.md | 7 + .../__tests__/terminal-mobile-header-row.test.ts | 17 +- .../dashboard/app/components/TerminalModal.css | 46 ++-- .../dashboard/app/components/TerminalModal.tsx | 233 +++++++++++++-------- .../components/__tests__/TerminalModal.test.tsx | 142 ++++++++++++- 5 files changed, 331 insertions(+), 114 deletions(-) Fusion-Task-Id: FN-7560 Fusion-Task-Lineage: 98ffeb22-ec33-419e-987a-18ec98af7aa3 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
f992e6aefa |
FN-7553: add dedicated keyboard shortcuts settings section
Adds a standalone Keyboard Shortcuts settings section with an easier-to-use capture input and support for more shortcut actions. - Introduce a new KeyboardShortcutsSection with a dedicated ShortcutCaptureInput component for recording key combos - Split keyboard-shortcut settings out of the general settings section into their own settings tab - Extend the shortcut schema/types and useDashboardKeyboardShortcuts hook to support additional actions - Update settings save-split, section-keys, and defaults/parity tests to cover the new section - Update dashboard docs and add a changeset for the new settings section Files changed: .changeset/fn-7553-keyboard-shortcuts-section.md | 7 + docs/dashboard-guide.md | 22 ++- packages/core/src/__tests__/global-settings.test.ts | 9 +- packages/core/src/__tests__/settings-defaults.test.ts | 4 + packages/core/src/__tests__/settings-parity.test.ts | 2 +- packages/core/src/settings-schema.ts | 6 +- packages/core/src/types.ts | 12 ++ packages/dashboard/app/App.tsx | 26 +++- packages/dashboard/app/__tests__/App.keyboard-shortcuts.test.tsx | 47 ++++++- packages/dashboard/app/components/SettingsModal.css | 56 ++++++-- packages/dashboard/app/components/SettingsModal.tsx | 30 +++- packages/dashboard/app/components/__tests__/SettingsModal.general.test.tsx | 63 --------- packages/dashboard/app/components/__tests__/SettingsModal.keyboardShortcuts.test.tsx | 156 +++++++++++++++++++++ packages/dashboard/app/components/settings/__tests__/section-keys.test.ts | 1 + packages/dashboard/app/components/settings/save-split.ts | 6 +- packages/dashboard/app/components/settings/sections/GlobalGeneralSection.tsx | 38 ----- packages/dashboard/app/components/settings/sections/KeyboardShortcutsSection.tsx | 78 +++++++++++ packages/dashboard/app/components/settings/sections/ShortcutCaptureInput.tsx | 118 ++++++++++++++++ packages/dashboard/app/components/settings/sections/__tests__/KeyboardShortcutsSection.test.tsx | 113 +++++++++++++++ packages/dashboard/app/hooks/__tests__/useDashboardKeyboardShortcuts.test.tsx | 73 +++++++++- packages/dashboard/app/hooks/useDashboardKeyboardShortcuts.ts | 38 ++++- packages/dashboard/app/utils/__tests__/keyboardShortcuts.test.ts | 37 ++++- packages/dashboard/app/utils/keyboardShortcuts.ts | 54 ++++++- 23 files changed, 854 insertions(+), 142 deletions(-) Fusion-Task-Id: FN-7553 Fusion-Task-Lineage: 51c1ad69-fbd3-45ce-8d2d-45d9962d7b76 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
ec9ac61c19 |
FN-7535: fix global GitLab settings not persisting on save
Fixes splitSettingsSave so the five global GitLab keys are diffed only against the scoped global initial values, not the project-merged effective values, so a real global edit is no longer dropped when it happens to match a project override. - Add GLOBAL_GITLAB_SCOPED_ONLY_KEYS (gitlabEnabled, gitlabInstanceUrl, gitlabApiBaseUrl, gitlabAuthToken, gitlabAuthTokenType) that never fall back to merged initialValues when computing the save diff - Update splitSettingsSave to treat these keys as scoped-global-only, treating a missing scoped-global initial as undefined rather than falling back to the merged value - Add regression tests in settings-save-split.test.ts covering the scoped-vs-merged diff behavior - Add regression tests in SettingsModal.general.test.tsx covering the save flow end-to-end - Add changeset fn-7535-global-gitlab-setting-save.md (patch, fix) Files changed: .changeset/fn-7535-global-gitlab-setting-save.md | 7 +++ .../app/__tests__/settings-save-split.test.ts | 62 ++++++++++++++++++++++ .../__tests__/SettingsModal.general.test.tsx | 36 +++++++++++++ .../app/components/settings/save-split.ts | 26 ++++++++- 4 files changed, 129 insertions(+), 2 deletions(-) Fusion-Task-Id: FN-7535 Fusion-Task-Lineage: f9cd212e-a691-4cd9-8946-48c59537d583 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
9f24b507fc |
FN-7507: prioritize topmost dashboard shortcut dismissal
Refine dashboard keyboard shortcut behavior and coverage for configurable popup handling. - Factor App Escape dismissal into a pure helper that closes one topmost surface at a time. - Prioritize popped-out tasks ahead of Quick Chat, Terminal, and fixed dashboard modals. - Add regression coverage for configurable shortcut bindings, editable focus guards, default-prevented events, and Escape ordering. - Update dashboard shortcut documentation and release-note wording. Files changed: .changeset/fn-7494-keyboard-shortcuts.md | 4 +- docs/dashboard-guide.md | 2 +- packages/dashboard/app/App.tsx | 110 +++++++++----- .../app/__tests__/App.keyboard-shortcuts.test.tsx | 158 +++++++++++++++++++++ .../app/utils/__tests__/keyboardShortcuts.test.ts | 1 + 5 files changed, 236 insertions(+), 39 deletions(-) Fusion-Task-Id: FN-7507 Fusion-Task-Lineage: 804986ef-ec6c-4404-a168-6d154f75b118 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
b42be87ad1 |
FN-7493: keep task popups on board layer
Keep task-detail popups below global utility windows while preserving Activity menu visibility. - Route ordinary task-detail FloatingWindow instances through a lower task-detail z-index band. - Emit and consume popup geometry-change signals so root-portaled Activity menus stay attached during drag and resize. - Extend dashboard tests and docs for popup layering and Activity dropdown behavior. Files changed: .changeset/fn-7493-task-popup-layer.md | 7 +++ docs/dashboard-guide.md | 8 ++- docs/settings-reference.md | 2 +- packages/dashboard/app/App.tsx | 4 ++ .../App.taskDetailFloatingGeometry.test.tsx | 45 +++++++++++++- .../dashboard/app/components/FloatingWindow.tsx | 31 ++++++++-- .../dashboard/app/components/TaskDetailModal.css | 3 + .../dashboard/app/components/TaskDetailModal.tsx | 27 ++++++++- .../components/__tests__/FloatingWindow.test.tsx | 32 +++++++++- .../FloatingWindowStack.cross-type.test.tsx | 48 ++++++++++++--- .../TaskDetailModal.task-activity-chat.test.tsx | 68 ++++++++++++++++++++++ .../app/components/floatingWindowStack.ts | 22 +++++-- 12 files changed, 272 insertions(+), 25 deletions(-) Fusion-Task-Id: FN-7493 Fusion-Task-Lineage: 5f1ec72c-f8dc-44ee-b303-319e0faac0f9 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
00afb22bcb |
FN-7458: default startup theme mode to system
Default fresh dashboard startup and appearance reset to System mode while keeping Shadcn Ember as the color theme. - Set global themeMode defaults and Settings fallback props to system. - Resolve pre-hydration web and desktop startup from prefers-color-scheme, including invalid cache and fallback paths. - Update Appearance reset behavior, focused theme tests, docs, and the release changeset. Files changed: .changeset/fn-7458-system-theme-default.md | 7 ++ docs/dashboard-guide.md | 3 +- docs/settings-reference.md | 4 +- .../core/src/__tests__/global-settings.test.ts | 17 +++- packages/core/src/__tests__/store-settings.test.ts | 6 +- packages/core/src/settings-schema.ts | 6 +- .../app/__tests__/index-html-theme-link.test.ts | 18 ++++ .../dashboard/app/components/SettingsModal.tsx | 8 +- .../dashboard/app/components/ThemeSelector.tsx | 6 +- .../components/__tests__/ThemeDropdown.test.tsx | 9 +- .../components/__tests__/ThemeSelector.test.tsx | 2 +- .../dashboard/app/hooks/__tests__/useTheme.test.ts | 111 ++++++++++++++++++++- packages/dashboard/app/hooks/useTheme.ts | 21 +++- packages/dashboard/app/index.html | 13 ++- packages/desktop/src/renderer/index.html | 13 ++- 15 files changed, 211 insertions(+), 33 deletions(-) Fusion-Task-Id: FN-7458 Fusion-Task-Lineage: fb6184b4-9a6a-4131-9f97-f8cd12ef904c Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
7300bf54ce |
FN-7460: disable WebKit text scaling in terminals
Disable WebKit terminal text scaling so iPhone Safari preserves exact xterm cell metrics. - Set terminal xterm host subtrees to disable text-size adjustment instead of pinning it at 100%. - Update terminal CSS contract coverage for modal and session terminal surfaces. - Document the real-iPhone recurrence and add a patch changeset for the published CLI package. Files changed: .changeset/fn-7460-ios-terminal-spacing.md | 7 +++++++ .../ui-bugs/xterm-async-font-remeasure-paste-dedupe.md | 7 ++++--- packages/dashboard/app/__tests__/terminal-input.test.ts | 14 +++++++------- packages/dashboard/app/components/SessionTerminal.css | 7 +++++-- packages/dashboard/app/components/TerminalModal.css | 9 ++++++--- .../app/components/__tests__/TerminalModal.test.tsx | 7 +++++++ 6 files changed, 36 insertions(+), 15 deletions(-) Fusion-Task-Id: FN-7460 Fusion-Task-Lineage: 00542017-457b-40b8-9139-084218bc3533 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
95325201a6 |
FN-7459: remember task popup geometry
Remember task-detail popup geometry so operators can reuse one positioned window across tasks. - Share a stable persisted geometry key for task-detail FloatingWindow instances while keeping per-task window identity. - Add regression coverage for shared task popup geometry, malformed persisted data fallback, and isolated non-task windows. - Document desktop/tablet popup geometry persistence and add a release changeset. Files changed: .changeset/fn-7459-task-popup-geometry.md | 7 ++ docs/dashboard-guide.md | 5 +- docs/settings-reference.md | 2 +- packages/dashboard/app/App.tsx | 5 + .../App.taskDetailFloatingGeometry.test.tsx | 111 +++++++++++++++++++++ .../dashboard/app/components/FloatingWindow.tsx | 2 +- .../components/__tests__/FloatingWindow.test.tsx | 83 ++++++++++++++- 7 files changed, 210 insertions(+), 5 deletions(-) Fusion-Task-Id: FN-7459 Fusion-Task-Lineage: 84674283-024f-4ed5-b7a0-6dade1b77f8b Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
f9733341b5 |
FN-7453: add GitLab enablement controls
Add a settings-controlled GitLab enablement path while preserving saved GitLab configuration. - Add project and global GitLab enable settings with collapsible Settings UI for URL and token controls. - Gate GitLab auth, import loading, and import actions when GitLab integration is disabled. - Preserve global GitLab values separately during global settings saves and document the new behavior. - Cover enablement resolution, settings save behavior, disabled import UI, and GitLab route/auth gating with tests. Files changed: .changeset/fn-7453-gitlab-enable-disclosure.md | 7 ++ docs/dashboard-guide.md | 7 ++ docs/gitlab-parity-inventory.md | 1 + docs/settings-reference.md | 4 ++ docs/task-management.md | 6 +- packages/core/src/__tests__/gitlab-config.test.ts | 17 ++++- .../core/src/__tests__/settings-parity.test.ts | 18 +++-- packages/core/src/gitlab-config.ts | 15 ++++- packages/core/src/index.ts | 2 +- packages/core/src/settings-schema.ts | 2 + packages/core/src/types.ts | 5 ++ .../app/__tests__/settings-save-split.test.ts | 20 +++--- .../dashboard/app/components/GitHubImportModal.tsx | 43 +++++++++--- .../dashboard/app/components/SettingsModal.css | 77 +++++++++++++++++++++ .../dashboard/app/components/SettingsModal.tsx | 34 ++++++++- .../__tests__/GitHubImportModal.test.tsx | 19 ++++++ .../__tests__/SettingsModal.general.test.tsx | 78 ++++++++++++++++++++++ .../SettingsModal.scheduling-merge.test.tsx | 7 +- .../app/components/settings/save-split.ts | 5 +- .../settings/sections/GeneralSection.tsx | 36 ++++++---- .../settings/sections/GlobalGeneralSection.tsx | 71 ++++++++++++-------- .../components/settings/sections/MergeSection.tsx | 44 +++++++----- .../dashboard/src/__tests__/gitlab-auth.test.ts | 20 ++++++ .../dashboard/src/__tests__/routes-gitlab.test.ts | 11 +++ packages/dashboard/src/gitlab-auth.ts | 11 ++- 25 files changed, 458 insertions(+), 102 deletions(-) Fusion-Task-Id: FN-7453 Fusion-Task-Lineage: 81fbd39d-675f-49d6-8d13-b7fcb4d25658 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
2050323d16 |
FN-7451: preserve workflow setting edits during saves
Workflow settings now keep newer pending edits when earlier save requests finish.\n\n- Snapshot pending workflow values before saving so the request cannot mutate under the save.\n- Clear only keys whose pending value still matches the completed request in Workflow Settings and Project Models.\n- Cover same-key, clear-to-default, and model-lane edits made while saves are in flight.\n- Add a patch changeset for the published Fusion package.\n\nFiles changed:\n .changeset/fn-7451-workflow-settings-save-race.md | 7 ++\n .../app/__tests__/settings-sections.test.tsx | 109 ++++++++++++++++++-\n .../app/components/WorkflowSettingsPanel.tsx | 21 +++-\n .../__tests__/WorkflowSettingsPanel.test.tsx | 121 ++++++++++++++++++++-\n .../settings/sections/ProjectModelsSection.tsx | 25 ++++-\n 5 files changed, 272 insertions(+), 11 deletions(-) Fusion-Task-Id: FN-7451 Fusion-Task-Lineage: 82f5e1cf-fabb-4fc6-936c-f42dcd9337ac Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
fafe4c9d9f |
FN-7423: add GitLab access token settings
Add GitLab access-token configuration and auth resolution for future HTTP API integrations. - Add personal, project, and group GitLab token settings at project and global scope. - Resolve configured tokens with GITLAB_TOKEN fallback and PRIVATE-TOKEN metadata without requiring glab. - Document required GitLab scopes and update parity handoff notes. - Cover settings save splitting, parity, modal rendering, and auth resolution with tests. Files changed: .changeset/fn-7423-gitlab-access-tokens.md | 7 ++ docs/gitlab-parity-inventory.md | 10 +- docs/settings-reference.md | 6 +- docs/task-management.md | 2 +- .../core/src/__tests__/settings-parity.test.ts | 28 +++-- packages/core/src/index.ts | 2 +- packages/core/src/settings-schema.ts | 4 + packages/core/src/types.ts | 17 ++- .../app/__tests__/settings-save-split.test.ts | 69 ++++++++++++ .../dashboard/app/components/SettingsModal.tsx | 2 + .../SettingsModal.scheduling-merge.test.tsx | 57 ++++++++++ .../app/components/settings/save-split.ts | 6 +- .../settings/sections/GlobalGeneralSection.tsx | 18 ++- .../components/settings/sections/MergeSection.tsx | 22 ++++ .../dashboard/src/__tests__/gitlab-auth.test.ts | 99 +++++++++++++++++ packages/dashboard/src/gitlab-auth.ts | 123 +++++++++++++++++++++ 16 files changed, 449 insertions(+), 23 deletions(-) Fusion-Task-Id: FN-7423 Fusion-Task-Lineage: f14ae52b-b730-44b0-8bad-54945c61d009 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
573876603f |
FN-7422: add GitLab URL configuration
Add typed GitLab instance and API URL settings for GitLab.com and self-managed instances. - Add core GitLab URL defaults, validation, normalization, and project/global inheritance. - Expose project and global GitLab instance/API URL fields in settings with save-split handling. - Cover configuration resolution, settings parity, and settings UI save behavior with tests. - Document the new settings and add a changeset for the published CLI package. Files changed: .changeset/fn-7422-gitlab-configuration.md | 7 ++ docs/settings-reference.md | 6 +- docs/task-management.md | 2 +- packages/core/src/__tests__/gitlab-config.test.ts | 74 +++++++++++++++++++ .../core/src/__tests__/settings-parity.test.ts | 22 +++++- packages/core/src/gitlab-config.ts | 79 +++++++++++++++++++++ packages/core/src/index.ts | 4 +- packages/core/src/settings-schema.ts | 4 ++ packages/core/src/types.ts | 20 ++++++ .../app/__tests__/settings-save-split.test.ts | 53 ++++++++++++++ .../dashboard/app/components/SettingsModal.tsx | 20 ++++++ .../__tests__/SettingsModal.general.test.tsx | 82 ++++++++++++++++++++++ .../app/components/settings/save-split.ts | 6 ++ .../settings/sections/GeneralSection.tsx | 15 ++++ .../settings/sections/GlobalGeneralSection.tsx | 14 ++++ 15 files changed, 402 insertions(+), 6 deletions(-) Fusion-Task-Id: FN-7422 Fusion-Task-Lineage: 0110b4b6-71b0-4a62-afaf-61af65ebef03 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
a4049971e5 |
FN-7401: add Glass Silver dashboard theme
Adds a frosted silver/gray dashboard color theme across app, desktop, and release metadata. - Register glass-silver in shared theme types, selector options, and startup validation hooks. - Add Glass Silver CSS tokens, swatch styling, and dashboard/desktop stylesheet preload coverage. - Cover theme registration, dropdown/selector rendering, theme persistence, and CSS token invariants with tests. - Document the new dashboard theme and publish a minor changeset for @runfusion/fusion. Files changed: .changeset/fn-7401-glass-silver-theme.md | 7 + docs/dashboard-guide.md | 3 +- packages/core/src/types.ts | 2 + .../app/__tests__/glass-silver-theme.test.ts | 155 ++++++++++++++++++++ .../dashboard/app/components/ThemeSelector.css | 14 ++ .../components/__tests__/ThemeDropdown.test.tsx | 13 ++ .../components/__tests__/ThemeSelector.test.tsx | 16 +++ packages/dashboard/app/components/themeOptions.ts | 1 + .../dashboard/app/hooks/__tests__/useTheme.test.ts | 15 ++ packages/dashboard/app/index.html | 2 +- packages/dashboard/app/public/theme-data.css | 156 +++++++++++++++++++++ packages/desktop/src/renderer/index.html | 1 + 12 files changed, 383 insertions(+), 2 deletions(-) Fusion-Task-Id: FN-7401 Fusion-Task-Lineage: e64f14cc-590e-458b-adf6-7c9baa488157 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
38841695c8 |
fix: stop triage loop at completion-summary node and i18n object-key crashes (#1863)
Two distinct v0.52.0 regressions reported in issue #1863. 1. Triage loop (engine): the best-effort completion-summary graph node is wired into every built-in workflow with a success-only edge. A thrown handler exception or a failed summary projection write bypassed the advisory `!blocking -> success` coercion, terminated the graph at 'completion-summary', and routeGraphFailureToExecutionResume bounced the in-review task back to todo forever (token usage 0, execution NOT STARTED). The graph executor now degrades a completion-summary node failure to success (ensureWorkflowCompletionSummary still backfills task.summary), with a routeGraphFailureToExecutionResume backstop. Shared isCompletionSummaryNode predicate exported from @fusion/core. 2. i18n object-key crashes (dashboard): three views called t() with keys that resolve to nested objects (taskDetail.executionMode, routing.source, nodes.dockerHost), so i18next returned "returned an object instead of string" and crashed the render. Added leaf label keys across all locales and switched the callers. Tests: engine non-fatal completion-summary regression (fails without the fix), dashboard invariant guard scanning t("literal") callers against real en/app.json, and a Stats-panel reproduction against the real bundle. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
07aa1a0085 |
FN-7399: widen Project Models model menus
Make Project Models dropdown menus easier to scan without changing shared selector defaults. - Add an opt-in readable menu width mode to the shared custom model dropdown. - Apply the wider menu only to Project Models lane, workflow, and preset model selectors. - Cover readable sizing, viewport clamping, and default trigger-width behavior with dashboard tests. - Add a patch changeset for the published Fusion package. Files changed: .changeset/wide-project-model-dropdowns.md | 7 + .../app/__tests__/settings-sections.test.tsx | 66 ++++++- .../app/components/CustomModelDropdown.tsx | 17 +- .../__tests__/CustomModelDropdown.test.tsx | 210 +++++++++++++++++++++ .../settings/sections/ProjectModelsSection.tsx | 8 +- 5 files changed, 301 insertions(+), 7 deletions(-) Fusion-Task-Id: FN-7399 Fusion-Task-Lineage: 40aae990-37bc-4ed8-8e2a-7e78a543053b Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
869974cd5a |
FN-7383: refresh workflows after chat authoring
Chat-authored workflow changes now propagate immediately to workflow selectors and editors. - Emit workflow lifecycle SSE events when chat, planner, or room workflow tools create, update, select, configure, or delete workflows. - Force-refresh board workflow caches and the workflow editor list when workflow lifecycle events arrive. - Add cross-surface tests for chat workflow creation visibility and room/chat workflow tool event behavior. - Add a patch changeset for the published Fusion package. Files changed: .changeset/fn-7383-chat-workflow-authoring.md | 7 +++ .../workflow-selection-cross-surface.test.tsx | 23 +++++++++ packages/dashboard/app/api/legacy.ts | 9 ++-- .../app/components/WorkflowNodeEditor.tsx | 23 ++++++++- .../app/hooks/__tests__/useBoardWorkflows.test.ts | 27 +++++++--- packages/dashboard/app/hooks/useBoardWorkflows.ts | 22 +++++--- .../utils/__tests__/boardWorkflowsCache.test.ts | 12 ++++- .../dashboard/app/utils/boardWorkflowsCache.ts | 14 +++++ .../dashboard/src/__tests__/chat-manager.test.ts | 44 ++++++++++++++-- .../dashboard/src/__tests__/chat.rooms.test.ts | 44 ++++++++++++++++ packages/dashboard/src/chat.ts | 59 +++++++++++++++++++--- 11 files changed, 255 insertions(+), 29 deletions(-) Fusion-Task-Id: FN-7383 Fusion-Task-Lineage: ebe4c982-214b-402f-b829-a58ace19ffe0 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
a9e2baa9f8 |
FN-7367: link imported GitHub issues to tracking
Imported GitHub issues can now adopt their source issue as the tracking issue without changing ordinary task defaults. - Add the project-scoped githubLinkImportedIssuesToTracking setting with docs, Settings UI, and defaults. - Honor the import-only setting across dashboard, CLI, and extension GitHub issue import paths. - Cover saved settings and import tracking behavior with CLI, dashboard, and parity tests. - Add a minor changeset for the published CLI package. Files changed: .changeset/fn-7367-github-import-tracking.md | 7 +++ docs/settings-reference.md | 3 +- packages/cli/src/__tests__/extension.test.ts | 73 ++++++++++++++++++++++ .../task-command-github-import-tracking.test.ts | 16 +++++ packages/cli/src/commands/__tests__/task.test.ts | 28 +++++++++ packages/cli/src/commands/task.ts | 45 +++++++------ packages/cli/src/extension.ts | 45 +++++++------ .../core/src/__tests__/settings-parity.test.ts | 4 ++ packages/core/src/settings-schema.ts | 1 + packages/core/src/types.ts | 6 ++ .../app/__tests__/settings-save-split.test.ts | 19 ++++++ .../dashboard/app/components/SettingsModal.tsx | 6 ++ .../__tests__/SettingsModal.general.test.tsx | 59 +++++++++++++++++ .../__tests__/SettingsModal.test-harness.tsx | 1 + .../settings/sections/GeneralSection.tsx | 9 +++ .../dashboard/src/__tests__/routes-github.test.ts | 45 +++++++++++++ .../dashboard/src/routes/register-git-github.ts | 7 +++ 17 files changed, 325 insertions(+), 49 deletions(-) Fusion-Task-Id: FN-7367 Fusion-Task-Lineage: 43671cdf-7e0d-4b7a-9ba2-54c9a367dfec Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
d93fac0cc0 |
FN-7365: allow task popups on every viewport
Broaden board task popup routing so the existing popup setting works outside mobile. - Route ordinary board-card opens to the task popup on desktop, tablet, and mobile when the popup setting is enabled. - Rename the Appearance setting copy while preserving the stored openMobileTasksInPopup key for compatibility. - Update tests, documentation, settings schema comments, and the published package changeset for the all-viewport behavior. Files changed: .changeset/fn-7365-task-popups-all-viewports.md | 7 ++++ docs/dashboard-guide.md | 6 ++-- docs/settings-reference.md | 2 +- packages/core/src/settings-schema.ts | 4 +-- packages/core/src/types.ts | 6 ++-- packages/dashboard/app/App.tsx | 6 ++-- .../__tests__/App.openTasksInRightSidebar.test.ts | 42 +++++++++++++++++----- .../settings/sections/AppearanceSection.tsx | 5 +-- .../sections/__tests__/AppearanceSection.test.tsx | 10 +++--- 9 files changed, 62 insertions(+), 26 deletions(-) Fusion-Task-Id: FN-7365 Fusion-Task-Lineage: 58713922-3ff8-4cc9-8f81-26c1e982819e Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
b3b01bc25d |
FN-7357: add all workflows to top-level selectors
Extend the dashboard aggregate workflow view across top-level workflow selectors without leaking its sentinel into task creation. - Add All workflows as an aggregate option for List, Header, Planning/Missions, and Graph selectors.\n- Preserve real workflow handoffs for quick create, planning, missions, and workflow editor entry points.\n- Include aggregate workflow counts and cross-surface regression coverage, plus docs and a changeset.\n\nFiles changed:\n .changeset/fn-7357-all-workflows-selectors.md | 7 +++\n docs/dashboard-guide.md | 9 ++--\n .../workflow-selection-cross-surface.test.tsx | 20 ++++---\n .../app/components/GraphWorkflowSwitcherSlot.tsx | 12 +++--\n .../app/components/HeaderWorkflowSwitcherSlot.tsx | 10 ++--\n packages/dashboard/app/components/ListView.tsx | 63 +++++++++++++++++-----\n .../components/PlanningWorkflowSwitcherSlot.tsx | 5 +-\n .../__tests__/GraphWorkflowSwitcherSlot.test.tsx | 34 ++++++++++++\n .../__tests__/HeaderWorkflowSwitcherSlot.test.tsx | 27 ++++++++++\n .../app/components/__tests__/ListView.test.tsx | 41 +++++++++++++-\n .../app/components/dashboard/MainContent.tsx | 17 ++++--\n .../app/components/workflowStatusCounts.ts | 5 ++\n packages/dashboard/app/hooks/useBoardWorkflows.ts | 20 +++++--\n .../dashboard/app/utils/boardWorkflowSelection.ts | 5 +-\n 14 files changed, 233 insertions(+), 42 deletions(-) Fusion-Task-Id: FN-7357 Fusion-Task-Lineage: b8658cad-7b12-4a06-b627-e2bde7de6951 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
03160ebac0 |
FN-7354: add mobile terminal tab selector
Add a compact mobile terminal tab selector while preserving desktop tab behavior. - Replace the mobile terminal tab strip with a native dropdown, new-tab action, and current-tab close action. - Update mobile terminal header styles so tab, workspace, and session controls wrap cleanly on narrow screens. - Cover mobile selector behavior with dashboard tests and document the mobile terminal tab workflow. - Add a release changeset for the published Fusion package. Files changed: .changeset/mobile-terminal-tabs-dropdown.md | 7 ++ docs/dashboard-guide.md | 8 +- .../__tests__/terminal-mobile-header-row.test.ts | 22 ++-- .../dashboard/app/components/TerminalModal.css | 69 +++++++++++- .../dashboard/app/components/TerminalModal.tsx | 119 +++++++++++++++------ .../components/__tests__/TerminalModal.test.tsx | 107 ++++++++++++++++++ 6 files changed, 282 insertions(+), 50 deletions(-) Fusion-Task-Id: FN-7354 Fusion-Task-Lineage: 20b5b7d5-5795-4cc6-9975-c363954adb97 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
519f158400 |
FN-7345: Persist remote access settings saves
Remote Access settings now save from the main Settings dialog without requiring tunnel startup. - Map flattened Remote Access form fields into the canonical global remoteAccess payload during section saves. - Preserve provider, token, and lifecycle branches while saving Tailscale accept-routes and remember-running options. - Cover the UI save flow, split helper, API route contract, docs, and release note. Files changed: .changeset/fn-7345-remote-settings-windows.md | 7 + docs/dashboard-guide.md | 1 + .../app/__tests__/settings-save-split.test.ts | 56 ++++++++ .../SettingsModal.remote-notifications.test.tsx | 144 +++++++++++++++++++++ .../app/components/settings/save-split.ts | 103 +++++++++++++++ .../src/__tests__/routes-remote-access.test.ts | 54 ++++++++ 6 files changed, 365 insertions(+) Fusion-Task-Id: FN-7345 Fusion-Task-Lineage: 9d1eb7f7-7e13-4070-af7d-eb6c6a41fe44 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
ae1ca5cf16 |
FN-7339: align Shadcn Ember colors with Ember
Align Shadcn Ember theme tokens with the Ember palette while preserving shadcn structure. - Match Shadcn Ember accent text tokens to Ember values in dark and light modes. - Strengthen regression coverage to compare every Ember-owned color token across both modes. - Add a patch changeset for the published Fusion package. Files changed: .changeset/fn-7339-shadcn-ember-colors.md | 7 +++ .../app/__tests__/shadcn-ember-theme.test.ts | 69 +++++++++++++++------- packages/dashboard/app/public/theme-data.css | 7 ++- 3 files changed, 60 insertions(+), 23 deletions(-) Fusion-Task-Id: FN-7339 Fusion-Task-Lineage: d0c2f0cf-938f-46a4-8da4-9acafc5cc4cf Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
aa4c2c1b26 |
FN-7331: remove Quick Add AI refine control
Remove the Quick Add refine affordance while preserving richer task refinement elsewhere. - Drop QuickEntryBox refine state, menu positioning, API calls, and action rendering. - Update Quick Add tests to assert the refine controls and refine-text path are absent. - Add a patch changeset for the published CLI bundle. Files changed: .changeset/fn-7331-remove-quick-add-refine.md | 7 + .../__tests__/quick-entry-expanded-height.test.tsx | 3 +- .../dashboard/app/components/QuickEntryBox.tsx | 198 +------------- .../components/__tests__/QuickEntryBox.test.tsx | 286 ++++----------------- 4 files changed, 71 insertions(+), 423 deletions(-) Fusion-Task-Id: FN-7331 Fusion-Task-Lineage: ed30e9da-1c1c-4e94-9fbe-e44ad5ae7133 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
211b18b073 |
FN-7299: make Shadcn Ember the default dashboard theme
Set Shadcn Ember as the default dashboard theme while keeping Shadcn Gray available as an alternate. - Add Shadcn Ember theme metadata, CSS variables, and boot-time defaults for dashboard and desktop shells. - Update persisted settings types, schema defaults, and theme selection UI to prefer Ember. - Cover Ember defaults and theme-option ordering with core, hook, and dashboard component tests. - Add a published package changeset for the operator-facing default theme change. Files changed: .changeset/fn-7299-shadcn-ember-default.md | 7 ++ .../core/src/__tests__/global-settings.test.ts | 23 +++- packages/core/src/__tests__/store-settings.test.ts | 10 +- packages/core/src/settings-schema.ts | 6 +- packages/core/src/types.ts | 4 +- .../app/__tests__/shadcn-ember-theme.test.ts | 107 ++++++++++++++++ .../app/__tests__/shadcn-gray-theme.test.ts | 2 +- .../dashboard/app/components/ThemeSelector.css | 15 +++ .../dashboard/app/components/ThemeSelector.tsx | 6 +- .../components/__tests__/ThemeDropdown.test.tsx | 20 ++- .../components/__tests__/ThemeSelector.test.tsx | 24 +++- packages/dashboard/app/components/themeOptions.ts | 7 +- .../dashboard/app/hooks/__tests__/useTheme.test.ts | 18 ++- packages/dashboard/app/hooks/useTheme.ts | 8 +- packages/dashboard/app/index.html | 10 +- packages/dashboard/app/public/theme-data.css | 137 +++++++++++++++++++++ packages/desktop/src/renderer/index.html | 42 ++++++- 17 files changed, 409 insertions(+), 37 deletions(-) Fusion-Task-Id: FN-7299 Fusion-Task-Lineage: 7e175752-b8fc-4ba9-8534-cb485f6eb18a Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
082dd55967 |
FN-7280: persist all-workflows board view
Persist the Board aggregate workflow view so refreshes restore the operator's last board selection. - Store the All workflows sentinel in project-scoped board view preferences while filtering it out for real workflow consumers. - Restore all-workflows selection on remount/project changes and clear it when workflow mode is unavailable. - Cover refresh persistence, project scoping, hooks, utilities, and cross-surface behavior with tests. - Document the refresh-persistent All workflows behavior and add a patch changeset. Files changed: .changeset/fn-7280-all-workflows-board-view.md | 7 +++ docs/dashboard-guide.md | 7 +-- .../workflow-selection-cross-surface.test.tsx | 15 ++++++ packages/dashboard/app/components/Board.tsx | 31 +++++++++--- .../app/components/__tests__/Board.test.tsx | 58 ++++++++++++++++++++-- .../app/hooks/__tests__/useBoardWorkflows.test.ts | 11 ++++ .../utils/__tests__/boardWorkflowSelection.test.ts | 13 +++++ .../dashboard/app/utils/boardWorkflowSelection.ts | 13 ++++- 8 files changed, 137 insertions(+), 18 deletions(-) Fusion-Task-Id: FN-7280 Fusion-Task-Lineage: 12d83b05-5b2b-4435-9383-30b35c07c087 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
b5da5d310a |
FN-7263: refresh custom provider model lists
Refresh persisted custom-provider model lists from saved endpoints and expose manual refresh controls. - Add dashboard API helpers and routes to refresh one or all custom-provider model lists while preserving concurrent settings edits. - Start background model refresh from serve, dashboard, and daemon startup paths after the server begins listening. - Add Settings UI refresh actions, row-level status messaging, styles, docs, and regression coverage for refresh behavior. Files changed: .changeset/fn-7263-custom-provider-model-refresh.md | 7 + docs/dashboard-guide.md | 6 +- docs/settings-reference.md | 2 +- packages/cli/src/commands/__tests__/daemon.test.ts | 59 +++++ .../cli/src/commands/__tests__/dashboard.test.ts | 51 ++++ packages/cli/src/commands/__tests__/serve.test.ts | 59 ++++- packages/cli/src/commands/daemon.ts | 39 +++- packages/cli/src/commands/dashboard.ts | 10 + packages/cli/src/commands/serve.ts | 11 +- .../app/__tests__/api-custom-providers.test.ts | 43 ++++ packages/dashboard/app/api/legacy.ts | 11 + .../app/components/CustomProvidersSection.css | 41 +++- .../app/components/CustomProvidersSection.tsx | 68 +++++- .../__tests__/CustomProvidersSection.test.tsx | 227 ++++++++++++++++++ packages/dashboard/src/index.ts | 6 + .../__tests__/custom-provider-routes.test.ts | 255 ++++++++++++++++++++ .../src/routes/__tests__/custom-providers.test.ts | 12 + .../src/routes/register-custom-provider-routes.ts | 259 ++++++++++++++++----- 18 files changed, 1101 insertions(+), 65 deletions(-) Fusion-Task-Id: FN-7263 Fusion-Task-Lineage: 60ee0637-ac85-409f-a376-c01f4bc8e8c5 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
ea0707c573 |
FN-7264: add opt-in absolute file-browser paths
Add an opt-in project setting that lets the workspace file browser use slash-prefixed absolute paths while preserving existing confined defaults. - Add the allowAbsoluteFileBrowserPaths project setting, docs, and changeset release note. - Thread absolute-path validation through workspace file-browser listing, editing, file operations, and downloads without widening other path APIs. - Add Settings UI controls and keep settings-specific file pickers project-relative. - Cover absolute-path browsing, percent-literal paths, root navigation, and settings picker behavior with tests. Files changed: .changeset/fn-7264-absolute-file-browser-paths.md | 7 + docs/settings-reference.md | 3 + .../core/src/__tests__/settings-parity.test.ts | 8 + packages/core/src/settings-schema.ts | 5 + packages/core/src/types.ts | 5 + .../app/__tests__/settings-sections.test.tsx | 41 +++++ packages/dashboard/app/components/FileBrowser.tsx | 26 ++- .../dashboard/app/components/FileBrowserModal.tsx | 7 + .../dashboard/app/components/SettingsModal.tsx | 34 +++- .../components/__tests__/FileBrowserModal.test.tsx | 18 ++ .../__tests__/SettingsModal.general.test.tsx | 17 ++ .../settings/sections/GeneralSection.tsx | 9 + .../__tests__/useWorkspaceFileBrowser.test.ts | 18 ++ .../dashboard/app/hooks/useWorkspaceFileBrowser.ts | 20 ++- .../dashboard/src/__tests__/file-service.test.ts | 199 ++++++++++++++++++++- packages/dashboard/src/file-service.ts | 129 ++++++++----- 16 files changed, 489 insertions(+), 57 deletions(-) Fusion-Task-Id: FN-7264 Fusion-Task-Lineage: ec71facd-0345-4490-a3df-244b98e24c2d Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
17fce43205 |
FN-7259: add mobile task popup setting
Add an opt-in mobile board-card route that opens task details in the existing popup. - Add the openMobileTasksInPopup project setting, defaults, types, docs, and changeset. - Expose the Appearance setting and include it in dashboard settings persistence. - Route mobile board-card clicks without deep tabs into the task FloatingWindow while preserving dock and main-panel behavior. - Add coverage for settings defaults, Appearance controls, mobile routing, and task popup sizing. Files changed: .changeset/fn-7259-mobile-task-popups.md | 7 ++++ docs/dashboard-guide.md | 5 ++- docs/settings-reference.md | 1 + .../core/src/__tests__/settings-defaults.test.ts | 13 ++++++ packages/core/src/settings-schema.ts | 5 +++ packages/core/src/types.ts | 7 ++++ packages/dashboard/app/App.tsx | 45 ++++++++++++++++++-- .../__tests__/App.openTasksInRightSidebar.test.ts | 48 +++++++++++++++++++++- .../dashboard/app/components/FloatingWindow.css | 28 +++++++++++++ .../dashboard/app/components/SettingsModal.tsx | 1 + .../components/__tests__/FloatingWindow.test.tsx | 22 ++++++++++ .../settings/sections/AppearanceSection.tsx | 7 ++++ .../sections/__tests__/AppearanceSection.test.tsx | 19 +++++++++ packages/dashboard/app/hooks/useAppSettings.ts | 5 +++ 14 files changed, 206 insertions(+), 7 deletions(-) Fusion-Task-Id: FN-7259 Fusion-Task-Lineage: 05f22978-ede7-4d13-940c-5108390959f7 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
2a5a108123 |
FN-7265: preserve workflow on refinements
Preserve workflow context when creating refinement tasks from completed or reviewed work. - Inherit explicit source workflow selections when creating refinement tasks and seed the new card into the workflow entry column. - Write task rows and workflow-selection rows atomically so refinements cannot be stranded outside their intended board. - Clear successful done-task chat refinement composer bubbles and document the dashboard behavior. - Add core and dashboard regression coverage for refinement workflow preservation. Files changed: .changeset/fuzzy-refinements-dance.md | 7 + .changeset/preserve-refinement-workflow.md | 7 + docs/dashboard-guide.md | 3 +- .../src/__tests__/workflow-selection-store.test.ts | 159 +++++++++++++++++++-- packages/core/src/store.ts | 55 ++++++- .../workflow-selection-cross-surface.test.tsx | 41 +++++- packages/dashboard/app/components/TaskChatTab.tsx | 5 + .../app/components/__tests__/TaskChatTab.test.tsx | 27 +++- .../TaskDetailModal.definition-actions.test.tsx | 52 +++++++ 9 files changed, 335 insertions(+), 21 deletions(-) Fusion-Task-Id: FN-7265 Fusion-Task-Lineage: 48700e3e-9f3a-474e-806c-47db0b75fca1 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |