Commit Graph

8939 Commits

Author SHA1 Message Date
gsxdsm
aa71ace101 fix(auth): refresh expired Claude OAuth tokens
Refresh stored Claude OAuth credentials before reporting dashboard auth status or resolving model auth so users do not need to repeatedly re-login after access-token expiry.

Coalesce concurrent refresh attempts, prevent stale refreshes from overwriting newer logins, and route CLI dashboard/serve/daemon/onboard auth wiring through the shared refresh-capable storage.
2026-06-13 23:20:06 -07:00
gsxdsm
52a0f9dfd8 Fix changeset frontmatter delimiters
Add missing --- fences around the YAML frontmatter in
fix-database-recovery-preserve-corrupt.md so the changeset parses.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 22:45:48 -07:00
gsxdsm
be2773b412 FN-6423: fix scheduler capacity accounting
Correct scheduler dispatch diagnostics so capacity decisions use consistent non-negative slot counts.

- Clamp excess semaphore releases at zero and warn once when a slot is returned without an active holder.
- Recompute dispatch capacity at each queue decision, including tasks started earlier in the same scheduler tick.
- Update scheduler and semaphore tests for true binding gates, non-negative diagnostics, and workflow-step env stability.
- Add a patch changeset for the scheduler capacity fix.

Files changed:
 .changeset/fn-6423-scheduler-capacity.md           |   5 +
 packages/engine/src/__tests__/concurrency.test.ts  |  32 ++++++
 .../src/__tests__/executor-step-session.test.ts    |  10 +-
 packages/engine/src/__tests__/scheduler.test.ts    | 122 ++++++++++++++++++++-
 packages/engine/src/concurrency.ts                 |  29 ++++-
 packages/engine/src/scheduler.ts                   | 117 ++++++++++----------
 6 files changed, 248 insertions(+), 67 deletions(-)

Fusion-Task-Id: FN-6423

Fusion-Task-Lineage: a6b2e668-a822-46e9-9cd8-ac267fbde804
2026-06-13 21:23:39 -07:00
gsxdsm
b1ba87e599 FN-6414: preserve built-in Z.ai models after extensions
Keep GLM-5.2 visible when user Z.ai extensions replace the provider registration.

- Add shared helpers to clone and register the built-in Z.ai provider safely.
- Re-merge missing built-in Z.ai models after extension provider registration in daemon, serve, dashboard, and pi flows.
- Cover provider replacement behavior in core and dashboard model route tests, and document the extension-preserving behavior.

Files changed:
 .changeset/FN-6414-glm-5-2-visible.md              |  5 ++
 docs/settings-reference.md                         |  2 +-
 packages/cli/src/commands/daemon.ts                | 12 +--
 packages/cli/src/commands/dashboard.ts             | 12 +--
 packages/cli/src/commands/serve.ts                 | 12 +--
 packages/core/src/__tests__/zai-provider.test.ts   | 33 +++++++-
 packages/core/src/index.ts                         |  7 +-
 packages/core/src/zai-provider.ts                  | 93 +++++++++++++++++++++
 ...register-model-routes-zai-real-registry.test.ts | 97 ++++++++++++++++++++++
 packages/engine/src/pi.ts                          | 12 +--
 10 files changed, 250 insertions(+), 35 deletions(-)

Fusion-Task-Id: FN-6414

Fusion-Task-Lineage: f0990da2-968d-4782-8c00-fbc350d6954f
2026-06-13 21:17:20 -07:00
gsxdsm
7b839069b5 FN-6420: run dependency sync in AI merge worktrees
Run configured or inferred dependency installs before AI merge verification uses the clean-room worktree.

- Add shared dependency-sync helpers with install marker caching for inferred lockfile installs.
- Run dependency sync during AI clean-room merges and audit/log the command, skip reason, and duration.
- Reuse the helper from merger paths while documenting the new behavior and covering install success/failure cases.

Files changed:
 .changeset/fn-6420-ai-merge-dependency-sync.md     |   5 +
 docs/architecture.md                               |   2 +-
 docs/settings-reference.md                         |   2 +-
 .../src/__tests__/executor-step-session.test.ts    |   5 +-
 .../merger-ai-dependency-install.slow.test.ts      | 269 +++++++++++++++++++++
 packages/engine/src/merge-dependency-sync.ts       | 144 +++++++++++
 packages/engine/src/merger-ai.ts                   |  31 +++
 packages/engine/src/merger.ts                      | 120 +++------
 packages/engine/src/run-audit.ts                   |   1 +
 9 files changed, 484 insertions(+), 95 deletions(-)

Fusion-Task-Id: FN-6420

Fusion-Task-Lineage: 49353cb6-4953-4670-b620-a90331f048dc
2026-06-13 21:09:12 -07:00
gsxdsm
3d5c22c075 FN-6425: pin task chat expand control
Keep the task chat expand action visible as an icon-only overlay inside the chat view.

- Move the expand/collapse button out of the scrolling transcript and onto the task chat container.
- Style the control as a centered icon-only button with stable overlay positioning.
- Extend TaskChatTab coverage for empty, loading, populated, expanded, and scrolled transcript states.

Files changed:
 packages/dashboard/app/components/TaskChatTab.css  | 10 +++-
 packages/dashboard/app/components/TaskChatTab.tsx  | 26 +++++-----
 .../app/components/__tests__/TaskChatTab.test.tsx  | 58 +++++++++++++++++-----
 3 files changed, 68 insertions(+), 26 deletions(-)

Fusion-Task-Id: FN-6425

Fusion-Task-Lineage: 6526eb4a-4be9-472b-9595-c7fcea6971b1
2026-06-13 20:54:32 -07:00
gsxdsm
6bb120525d FN-6424: scope terminal symbols font glyph ranges
Prevent the terminal symbols font from corrupting ASCII cell measurement on mobile.\n\n- Add unicode-range scoping to the Fusion terminal Nerd Font symbols face.\n- Cover the CSS contract so symbols ranges include Nerd Font blocks and exclude printable ASCII.\n- Document the xterm font-loading regression and required verification path.\n\nFiles changed:\n .../xterm-symbols-nerd-font-unicode-range.md       | 63 ++++++++++++++++++++++\n .../dashboard/app/__tests__/terminal-input.test.ts | 49 +++++++++++++++++\n .../dashboard/app/components/TerminalModal.css     |  5 ++\n 3 files changed, 117 insertions(+)

Fusion-Task-Id: FN-6424

Fusion-Task-Lineage: 7350c926-1d51-474b-bfc3-a17f922b9322
2026-06-13 20:46:54 -07:00
gsxdsm
b898c3d1db FN-6419: keep task metadata inline
Keep task detail metadata in a compact wrapping row across viewport sizes.

- Make the detail metadata container a wrapping flex row with aligned controls, provenance, PR context, and timestamps.
- Document the one-row metadata behavior in the dashboard guide.
- Add rendering and responsive CSS regression coverage for direct inline metadata children and mobile row behavior.

Files changed:
 docs/dashboard-guide.md                            |  2 +-
 .../dashboard/app/components/TaskDetailModal.css   | 21 +++++++--
 .../__tests__/TaskDetailModal.rendering.test.tsx   | 53 ++++++++++++++++++++++
 ...etailModal.responsive-and-dependencies.test.tsx | 10 ++++
 4 files changed, 81 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-6419

Fusion-Task-Lineage: 925c2f0d-8665-430f-8e4e-a00d80704e8d
2026-06-13 20:33:44 -07:00
gsxdsm
b8dbe69b21 FN-6418: tighten task chat composer spacing
Tightens the task detail chat layout so the composer sits closer to the transcript without affecting other detail tabs.

- Reduce the chat tab stack gap and composer vertical padding on desktop and mobile.
- Remove the chat section's inherited top margin while keeping shared tab padding intact.
- Document the spacing requirement with FNXC comments near the affected chat styles.

Files changed:
 packages/dashboard/app/components/TaskChatTab.css     | 10 ++++++----
 packages/dashboard/app/components/TaskDetailModal.css |  7 ++++++-
 2 files changed, 12 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-6418

Fusion-Task-Lineage: 4b484de5-9d6f-403b-902d-5df9f0591811
2026-06-13 20:22:03 -07:00
gsxdsm
ffaef67549 FN-6421: quarantine flaky CLI integration tests
Quarantine load-sensitive CLI vitest suites instead of widening default test timeouts.

- Add extension agent provisioning and serve suites to the CLI vitest quarantine list.
- Record quarantine ledger entries with standalone pass evidence and deletion-clock dates.
- Keep FNXC rationale next to the excluded CLI tests for future cleanup.

Files changed:
 packages/cli/vitest.config.ts    |  6 ++++++
 scripts/lib/test-quarantine.json | 10 ++++++++++
 2 files changed, 16 insertions(+)

Fusion-Task-Id: FN-6421

Fusion-Task-Lineage: de6db6a5-aad7-4e25-9bf4-7734dc6d8d05
2026-06-13 20:15:54 -07:00
gsxdsm
8ff7a934b0 fix(FN-6424): pan mobile board from whole task card 2026-06-13 19:58:14 -07:00
gsxdsm
85a25b3598 FN-6416: document heap test quarantine context
Clarify why the heap-wrapper timeout test remains quarantined under the deletion ratchet.

- Update the dashboard vitest quarantine comment to reference the heap wrapper exclusion requirement.
- Expand the quarantine ledger reason with the FN-6416 context and leaked temp-worker cleanup observation.

Files changed:
 packages/dashboard/vitest.config.ts | 4 ++--
 scripts/lib/test-quarantine.json    | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-6416

Fusion-Task-Lineage: 627c1fd9-60d8-415d-88b5-a4e946de0110
2026-06-13 19:53:51 -07:00
gsxdsm
0d75725a28 fix: reliable mobile board horizontal swipe over task cards
Swiping across the board to scroll horizontally was intermittent when the
gesture started on a task card. Cards render with native HTML5 `draggable`
for desktop drag-to-move, but native DnD does not function via touch — the
attribute only arms the browser's touch-drag heuristic, which non-
deterministically hijacks horizontal swipes meant to pan the board.

Disable native drag on touch-primary devices (`(hover: none) and
(pointer: coarse)`) via a new `useCoarsePointer` hook, folded into the
card's `isDraggable`. Mouse/desktop and hybrid laptops keep drag-to-move;
touch loses nothing (DnD never worked there) and panning is now reliable.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 19:40:15 -07:00
gsxdsm
417183da9f FN-6415: send task chat on Enter
Enable the task-detail Chat composer to submit messages with standard Enter behavior.

- Submit non-empty task chat drafts on plain Enter while preserving Shift+Enter newline entry and IME composition safety.
- Keep Cmd/Ctrl+Enter as a supported send path through the same handler.
- Document the composer keyboard shortcuts and add dashboard tests for steering, refinement, newline, shortcut, and composition behavior.
- Add a patch changeset for the published Fusion package.

Files changed:
 .changeset/tiny-tasks-chat-enter.md                |   5 +
 docs/dashboard-guide.md                            |   2 +-
 packages/dashboard/app/components/TaskChatTab.tsx  |  13 ++-
 .../app/components/__tests__/TaskChatTab.test.tsx  | 120 +++++++++++++++++++++
 4 files changed, 136 insertions(+), 4 deletions(-)

Fusion-Task-Id: FN-6415

Fusion-Task-Lineage: 7d200bf6-5130-4fb8-b59c-66bccffe4265
2026-06-13 19:32:27 -07:00
gsxdsm
066c919ace test: quarantine slow and flaky test lanes
Move observed load-sensitive and slow tests out of the default lanes per the deletion-ratchet policy, keep the quarantine ledger in sync, and preserve corrupt databases when recovery fails during verification.
2026-06-13 19:22:00 -07:00
gsxdsm
67d4d51aeb FN-6413: move task-card timer to footer cluster
Move the task timing badge out of the header/meta row and into the footer's bottom-right badge cluster.

- Render the time indicator with footer chips so it aligns with retry and GitHub badges.
- Reuse footer badge sizing for the timer across desktop, wrapping, and mobile layouts.
- Update TaskCard layout tests to assert footer placement and add a patch changeset.

Files changed:
 .changeset/fn-6413-task-card-timing-footer.md      |   5 +
 packages/dashboard/app/components/TaskCard.css     |   8 +-
 packages/dashboard/app/components/TaskCard.tsx     |  31 ++---
 .../__tests__/TaskCard.footer-alignment.test.tsx   |  13 +-
 .../__tests__/TaskCard.footer-wrap.test.tsx        |   1 +
 .../app/components/__tests__/TaskCard.test.tsx     | 138 ++++++++++++++-------
 .../app/components/__tests__/board-mobile.test.tsx |   5 +-
 7 files changed, 130 insertions(+), 71 deletions(-)

Fusion-Task-Id: FN-6413

Fusion-Task-Lineage: a82da5ab-20c6-4dfa-92a3-150306011fd6
2026-06-13 19:17:36 -07:00
gsxdsm
6a5d7ab48f FN-6405: overlay task chat expand control
Moves the task chat expand control into the transcript as an overlay while preserving accessible labels and state coverage.

- Render the expand/collapse button inside the transcript container instead of a separate toolbar.
- Add tokenized overlay positioning and mobile sizing styles for the transcript expand control.
- Extend TaskChatTab tests across loading, empty, populated, and CSS states to prevent toolbar regressions.

Files changed:
 packages/dashboard/app/components/TaskChatTab.css  | 34 +++++++++---------
 packages/dashboard/app/components/TaskChatTab.tsx  | 22 ++++++------
 .../app/components/__tests__/TaskChatTab.test.tsx  | 42 ++++++++++++++++++++--
 3 files changed, 67 insertions(+), 31 deletions(-)

Fusion-Task-Id: FN-6405

Fusion-Task-Lineage: 344d3ad0-bd57-4df2-86dc-deb8cddb76bc
2026-06-13 18:38:57 -07:00
gsxdsm
740c7127e5 FN-6409: inline core types in plugin SDK declarations
Make the published plugin SDK declaration bundle self-contained for external plugins.

- Resolve private @fusion/core specifiers while emitting plugin-sdk declarations.
- Add a regression test covering built plugin-sdk .d.ts artifacts when present.
- Record a patch changeset for the published @runfusion/fusion package.

Files changed:
 .changeset/FN-6409-plugin-sdk-dts-inline.md          |  5 +++++
 packages/cli/src/__tests__/plugin-sdk-export.test.ts |  9 +++++++++
 packages/cli/tsup.config.ts                          | 11 ++++++++++-
 3 files changed, 24 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-6409

Fusion-Task-Lineage: b7590e39-763d-48ca-9301-5131d0a94b89
2026-06-13 18:27:39 -07:00
gsxdsm
df01ab71dd FN-6402: detect PR preflight conflicts by exit code
Use merge-tree exit status and empty-commit handling so PR conflict remediation reports clean states correctly.

- Treat git merge-tree exit code 1, not stdout, as the PR preflight conflict signal.
- Skip conflict-resolution commits when the branch already contains the selected base or the AI pass leaves no staged changes.
- Cover the preflight and resolver no-op paths with dashboard route and conflict resolver tests.
- Document the no-empty-commit conflict remediation behavior and add a published package changeset.

Files changed:
 .changeset/fn-6402-pr-conflict-detection.md        |   5 +
 docs/dashboard-guide.md                            |   2 +-
 .../src/__tests__/pr-conflict-resolver.test.ts     | 130 +++++++++++++++++++++
 ...it-github.pr-options-preflight-metadata.test.ts |  22 +++-
 .../register-git-github.pr-push-branch.test.ts     |   2 +-
 ...egister-git-github.pr-resolve-conflicts.test.ts |   2 +-
 packages/dashboard/src/pr-conflict-resolver.ts     |  57 +++++++--
 .../dashboard/src/routes/register-git-github.ts    |   8 +-
 8 files changed, 212 insertions(+), 16 deletions(-)

Fusion-Task-Id: FN-6402
Fusion-Task-Lineage: 9e709fb8-204a-4d88-8351-260a356c7520
2026-06-13 17:46:11 -07:00
gsxdsm
7040cd3511 docs: capture mobile .visually-hidden scrollWidth bug in solutions
Document the root cause (offset-less position:absolute sr-only utility
escaping the kanban board's overflow clip and inflating
documentElement.scrollWidth → iOS shrink-to-fit zoom), the top/left:0 fix,
and the CSS-fixture regression guard. Cross-links the sibling mobile
viewport-containment learnings.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 17:26:12 -07:00
gsxdsm
3cc82bdc4c fix: lock mobile board to viewport by pinning .visually-hidden
Screen-reader-only spans were position:absolute with no offsets, so inside
the horizontally-scrolled kanban columns they rendered off-screen-right and
ballooned documentElement.scrollWidth to ~1388px on a 390px viewport. That
triggered iOS Safari shrink-to-fit zoom-out (the "cut off, zoomed out" view,
which persisted into list view) and let the whole page pan, dragging columns
off-screen. Pinning the utility to its containing block origin (top/left: 0)
keeps the document locked to the viewport; the span stays 1px and clipped.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 17:17:25 -07:00
gsxdsm
96773dda0c FN-6410: fix standalone pi runtime deps
Keep published CLI standalone installs from omitting the pi runtime packages.\n\n- Remove pi runtime packages from optional peer declarations so npm and pnpm install them as required dependencies.\n- Add a package manifest regression test for source and prepack-transformed publish manifests.\n- Add a patch changeset for the published CLI package.\n\nFiles changed:\n .changeset/fn-6410-standalone-pi-dependency.md    |  5 +++\n packages/cli/package.json                         |  8 ----\n packages/cli/src/__tests__/package-config.test.ts | 47 +++++++++++++++++++++++\n 3 files changed, 52 insertions(+), 8 deletions(-)

Fusion-Task-Id: FN-6410

Fusion-Task-Lineage: 579c8a91-a021-4b36-94d7-e4651ce241cb
2026-06-13 17:17:25 -07:00
gsxdsm
91e7da2906 FN-6404: group task card meta badges
Group task card metadata into a single header badge row.

- Move priority, fast mode, agent-created provenance, and time chips into a shared wrapping meta badge group.
- Keep GitHub and retry chips in the footer without rendering empty footer shells for timer-only cards.
- Update dashboard docs and TaskCard coverage for grouped metadata layout and responsive styling.

Files changed:
 docs/dashboard-guide.md                            |   4 +-
 packages/dashboard/app/components/TaskCard.css     |  16 +-
 packages/dashboard/app/components/TaskCard.tsx     |  82 +++++-----
 .../__tests__/TaskCard.footer-alignment.test.tsx   |   9 +-
 .../app/components/__tests__/TaskCard.test.tsx     | 169 ++++++++++++++++++---
 5 files changed, 213 insertions(+), 67 deletions(-)

Fusion-Task-Id: FN-6404

Fusion-Task-Lineage: 29c2c700-d4f3-430d-baaa-bf8d7d0d0011
2026-06-13 17:17:25 -07:00
gsxdsm
821a8fb936 Merge pull request #1672 from Runfusion/feature/ce-workflow-integration
feat: make the compound-engineering workflow run the CE way end-to-end
2026-06-13 16:36:57 -07:00
gsxdsm
e89a9aa5a7 Update Agents 2026-06-13 16:30:29 -07:00
gsxdsm
9149121bb6 FN-6401: add built-in Z.ai GLM-5.2 support
Add Z.ai's built-in provider registration so GLM-5.2 is selectable across Fusion model settings.

- Define and export a shared Z.ai provider registration with existing GLM models plus GLM-5.2.
- Register the built-in provider for CLI server and engine pi model registries.
- Cover provider availability and CLI auth-provider wrapping with focused tests.
- Document Z.ai model selection and add a minor changeset.

Files changed:
 .changeset/FN-6401-glm-5-2.md                      |   5 +
 docs/settings-reference.md                         |   2 +
 packages/cli/src/commands/__tests__/daemon.test.ts |  11 ++
 .../cli/src/commands/__tests__/dashboard.test.ts   |  13 +++
 packages/cli/src/commands/__tests__/serve.test.ts  |  11 ++
 packages/cli/src/commands/daemon.ts                |   8 ++
 packages/cli/src/commands/dashboard.ts             |   8 ++
 packages/cli/src/commands/serve.ts                 |   8 ++
 packages/core/src/__tests__/zai-provider.test.ts   |  48 ++++++++
 packages/core/src/index.ts                         |   2 +
 packages/core/src/zai-provider.ts                  | 125 +++++++++++++++++++++
 .../src/__tests__/pi-create-fn-agent.test.ts       |   5 +-
 packages/engine/src/pi.ts                          |  20 +++-
 13 files changed, 264 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-6401

Fusion-Task-Lineage: e1f7a90d-0614-4d9f-826f-015605a08baa
2026-06-13 16:30:29 -07:00
gsxdsm
3387a9b298 FN-6403: fix GitHub import pane resizing
Restores reliable GitHub import left-pane resizing while keeping it scoped to the two-pane layout.

- Unify resize availability with the side-by-side breakpoint so the handle and fixed pane width only render when dragging is supported.
- Enlarge the divider hit area without changing the visible divider treatment.
- Cover pointer dragging, clamping, responsive hiding, and list/PR tab resize surfaces.

Files changed:
 .../dashboard/app/components/GitHubImportModal.css | 20 ++++-
 .../dashboard/app/components/GitHubImportModal.tsx | 35 +++++----
 .../__tests__/GitHubImportModal.test.tsx           | 91 +++++++++++++++++++++-
 3 files changed, 127 insertions(+), 19 deletions(-)

Fusion-Task-Id: FN-6403

Fusion-Task-Lineage: 974903f5-63dd-4852-9edf-6b0ade7ca912
2026-06-13 16:30:28 -07:00
gsxdsm
1db4835d1d FN-6390: fix terminal font remeasure and paste handling
Fix terminal rendering and input delivery at the xterm font and paste seams.

- Remeasure TerminalModal xterm instances after the terminal web font finishes loading.
- Let xterm native paste handle Cmd/Ctrl+V so clipboard input is delivered once.
- Add regression coverage for modal and session terminal paste/font behavior.
- Document the xterm async font and native paste solution.

Files changed:
 .../xterm-async-font-remeasure-paste-dedupe.md     |  59 +++++++++
 .../dashboard/app/components/TerminalModal.tsx     |  60 +++++++--
 .../components/__tests__/SessionTerminal.test.tsx  |  31 +++++
 .../components/__tests__/TerminalModal.test.tsx    | 140 ++++++++++++++++++---
 4 files changed, 264 insertions(+), 26 deletions(-)

Fusion-Task-Id: FN-6390

Fusion-Task-Lineage: f041a058-73c5-40fc-b390-c20bdb3bad69
2026-06-13 16:30:28 -07:00
gsxdsm
fcb7444e0e FN-6400: theme workflow column controls
Theme the workflow editor column panel with tokenized controls and coverage.

- Add tokenized button, empty-state, trait, agent selector, badge, and mode styles for workflow columns.
- Preserve disabled, hover, focus, stale, and mobile touch target states across column controls.
- Add WorkflowColumnPanel tests for themed classes, read-only states, empty states, and CSS token usage.

Files changed:
 .../app/components/WorkflowNodeEditor.css          | 192 ++++++++++++++++++++-
 .../__tests__/WorkflowColumnPanel.test.tsx         | 142 +++++++++++++++
 2 files changed, 333 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-6400

Fusion-Task-Lineage: 278f0db8-ef41-4278-8db6-8b17e27d5d71
2026-06-13 16:30:28 -07:00
gsxdsm
80fbcdd5a3 FN-6396: harden test worker temp cleanup
Prevent stale Fusion test worker roots from leaking across merge-gate runs.

- Add per-run tokens to worker-root owner markers and pruning checks.
- Remove self-minted fallback worker roots during Vitest exit cleanup.
- Cover stale pid reuse, markerless redir roots, and SIGKILL-style orphan pruning with regression tests.

Files changed:
 packages/core/src/__test-utils__/vitest-setup.ts   | 83 +++++++++++++++++++---
 .../core/src/__test-utils__/vitest-teardown.ts     |  8 ++-
 .../vitest-teardown-worker-root-cleanup.test.ts    | 19 ++++-
 scripts/__tests__/test-changed.test.mjs            | 74 ++++++++++++++++++-
 scripts/test-changed.mjs                           | 76 ++++++++++++++++----
 5 files changed, 233 insertions(+), 27 deletions(-)

Fusion-Task-Id: FN-6396

Fusion-Task-Lineage: 711d966d-c70e-4cd7-81cd-accd18f17202
2026-06-13 16:30:28 -07:00
gsxdsm
7fa8c4e5f4 FN-6397: fix mobile workflow board fill chain
Ensure workflow-mode boards fill the mobile viewport while preserving internal column scrolling.

- Reassert the mobile flex fill chain for project content, workflow board wrappers, and workflow columns.
- Extend mobile board regression coverage across empty/populated workflow states with and without the toolbar.
- Document the workflow board collapse root cause and add a transient temp-dir isolation guard test.

Files changed:
 docs/dashboard-guide.md                            |   1 +
 .../ui-bugs/mobile-workflow-board-fill-chain.md    |  61 +++++++++++++
 .../__tests__/board-mobile-initial-render.test.tsx | 101 +++++++++++++++++++++
 packages/dashboard/app/styles.css                  |  52 +++++++++++
 scripts/__tests__/check-test-isolation.test.mjs    |  23 +++++
 scripts/check-test-isolation.mjs                   |  12 ++-
 6 files changed, 249 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-6397
Fusion-Task-Lineage: ddee773d-6d3a-46d1-b1c7-f601a961365e
2026-06-13 16:30:28 -07:00
gsxdsm
e8c2d516af FN-6386: add one-click update installation
Add a dashboard update action that installs available Fusion releases directly from the UI.

- Add an install-update API route backed by npm global install with bin-collision retry handling.
- Add Update now controls, loading/error/success states, and responsive styling to the update banner and settings modal.
- Extend localization, documentation, changeset coverage, and update-check tests for the new install flow.

Files changed:
 .changeset/fn-6386-update-now-button.md            |   5 +
 docs/dashboard-guide.md                            |   4 +
 docs/settings-reference.md                         |   2 +
 packages/dashboard/app/api/legacy.ts               |  13 ++
 .../dashboard/app/components/SettingsModal.css     |  38 +++++-
 .../dashboard/app/components/SettingsModal.tsx     |  96 ++++++++++++--
 .../app/components/UpdateAvailableBanner.css       |  46 +++++++
 .../app/components/UpdateAvailableBanner.tsx       | 103 ++++++++++++---
 .../components/__tests__/SettingsModal.test.tsx    |  79 +++++++++++
 .../__tests__/UpdateAvailableBanner.test.tsx       |  57 +++++++-
 .../components/__tests__/settings-mobile.test.tsx  |  19 +++
 .../src/__tests__/update-check-route.test.ts       |  78 ++++++++++-
 .../dashboard/src/__tests__/update-check.test.ts   |  45 +++++++
 .../src/routes/register-update-check-routes.ts     |  25 +++-
 packages/dashboard/src/update-check.ts             |  93 +++++++++++++
 packages/i18n/locales/en/app.json                  |  14 +-
 packages/i18n/src/resources.d.ts                   | 146 ++++++++++++++++++++-
 17 files changed, 819 insertions(+), 44 deletions(-)

Fusion-Task-Id: FN-6386

Fusion-Task-Lineage: bcccf253-c0f1-493e-b849-b189a65d1479
2026-06-13 16:30:28 -07:00
gsxdsm
338e7286c0 FN-6395: align viewport hook mocks in dashboard tests
Update dashboard test doubles so mobile viewport helpers match the hook module API.

- Add getViewportMode and isMobileViewport exports to affected useViewportMode mocks.
- Keep mocked mobile detection tied to each test's configurable viewport mode.
- Normalize inline viewport mocks across dashboard component test suites.

Files changed:
 .../components/__tests__/AgentsView.orgchart.test.tsx   |  6 +++++-
 .../app/components/__tests__/AgentsView.test.tsx        |  2 ++
 .../app/components/__tests__/ChatView.rooms.test.tsx    |  1 +
 .../app/components/__tests__/GitManagerModal.test.tsx   |  2 ++
 .../app/components/__tests__/MailboxView.test.tsx       | 13 +++++++++----
 .../__tests__/MilestoneSliceInterviewModal.test.tsx     |  2 ++
 .../__tests__/MissionManager.swipe-back.test.tsx        |  2 ++
 .../__tests__/NewTaskModal.shared-cache.test.tsx        | 17 ++++++++++++++---
 .../app/components/__tests__/NewTaskModal.test.tsx      |  2 ++
 .../__tests__/PlanningModeModal.favorites.test.tsx      |  2 ++
 .../__tests__/PlanningModeModal.questions.test.tsx      |  2 ++
 .../__tests__/PlanningModeModal.swipe-back.test.tsx     |  2 ++
 .../PlanningModeModal.ui-interactions.test.tsx          |  4 ++++
 .../components/__tests__/QuickChatFAB.autosize.test.tsx | 13 +++++++++----
 .../__tests__/QuickChatFAB.shared-cache.test.tsx        | 11 +++++++++--
 .../app/components/__tests__/QuickChatFAB.test.tsx      | 11 +++++++++--
 .../__tests__/SettingsModal.testMode.test.tsx           |  6 +++++-
 .../components/__tests__/SubtaskBreakdownModal.test.tsx |  2 ++
 .../app/components/__tests__/TodoModal.test.tsx         |  2 ++
 .../components/__tests__/navigation-history.test.tsx    |  3 ++-
 20 files changed, 87 insertions(+), 18 deletions(-)

Fusion-Task-Id: FN-6395
Fusion-Task-Lineage: d830938b-4d60-4e17-852d-a2d311b6d71c
2026-06-13 16:30:28 -07:00
gsxdsm
b4541a97f3 FN-6391: restore routes settings test coverage
Restore the rescued dashboard routes settings test to the active suite.

- Remove routes-settings from the dashboard Vitest quarantine excludes.
- Delete its quarantine ledger entry now that the test is no longer quarantined.

Files changed:
 packages/dashboard/vitest.config.ts | 1 -
 scripts/lib/test-quarantine.json    | 5 -----
 2 files changed, 6 deletions(-)

Fusion-Task-Id: FN-6391

Fusion-Task-Lineage: 41068faa-f1e7-4f7b-a8cd-fc123611ba42
2026-06-13 16:30:28 -07:00
gsxdsm
bb810d6f33 FN-6394: relax non-progress userPaused assertion
Update the non-progress churn reliability test to match the Move-Task contract for never-user-paused tasks.

- Treat undefined userPaused as not user-paused instead of requiring false.
- Document why engine rebounds should not write userPaused for never-user-paused tasks.

Files changed:
 .../src/__tests__/reliability-interactions/non-progress-churn.test.ts | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-6394

Fusion-Task-Lineage: 59554c89-4e32-490f-88eb-d22ee7fdca31
2026-06-13 16:30:28 -07:00
gsxdsm
8a53871de2 FN-6388: enable quick-entry GitHub tracking overrides
Allow quick entry to override GitHub tracking regardless of the project default.

- Send explicit githubTracking overrides whenever the quick-entry toggle is changed.
- Keep the GitHub toggle usable when settings are loading or default tracking is off.
- Cover off-default opt-in, opt-out, label, and reset behavior in QuickEntryBox tests.
- Document the quick-entry GitHub icon as a per-task tracking override.

Files changed:
 docs/dashboard-guide.md                            |   1 +
 .../dashboard/app/components/QuickEntryBox.tsx     |  27 ++---
 .../components/__tests__/QuickEntryBox.test.tsx    | 118 ++++++++++++++++++---
 3 files changed, 110 insertions(+), 36 deletions(-)

Fusion-Task-Id: FN-6388

Fusion-Task-Lineage: f46ef738-ccd6-48cc-8919-9c2de7ecb4e3
2026-06-13 16:30:28 -07:00
gsxdsm
14ed177d89 FN-6389: restore mobile board column swiping
Restore horizontal touch panning for mobile board columns while keeping document-level drift containment.

- Opt board columns, column headers, and column bodies back into combined horizontal and vertical panning on mobile.
- Apply the same touch-action allowance to workflow and multi-lane column scrollers.
- Add CSS regression coverage for mobile board swipe targets, overscroll containment, and proximity snap behavior.
- Add a patch changeset for the published Fusion package.

Files changed:
 .changeset/fn-6389-mobile-board-column-swipe.md    |   5 +
 .../__tests__/board-mobile-column-swipe.test.ts    | 123 +++++++++++++++++++++
 packages/dashboard/app/components/Lane.css         |   4 +
 packages/dashboard/app/styles.css                  |   7 ++
 4 files changed, 139 insertions(+)

Fusion-Task-Id: FN-6389

Fusion-Task-Lineage: 0d337b43-34b1-4ccd-a9d9-d25cc9326945
2026-06-13 16:30:28 -07:00
gsxdsm
537cc2ab7f FN-6387: clamp long task detail titles
Clamp long task-detail headings to two lines with an explicit expand control.

- Replace character-count title truncation with measured two-line CSS clamping.
- Add overflow detection so the Show more/Show less toggle only appears when the heading actually wraps past two lines.
- Update task detail rendering tests for triage, non-triage, editing, summarize, chat-expanded, desktop, and mobile title surfaces.

Files changed:
 .../dashboard/app/components/TaskDetailModal.css   |  10 +
 .../dashboard/app/components/TaskDetailModal.tsx   | 111 ++++-
 .../__tests__/TaskDetailModal.rendering.test.tsx   | 441 +++++++++------------
 3 files changed, 261 insertions(+), 301 deletions(-)

Fusion-Task-Id: FN-6387

Fusion-Task-Lineage: 8c1b860c-8fe7-4f91-89e1-b387dbd7320e
2026-06-13 16:30:28 -07:00
gsxdsm
df4939a656 FN-6385: add dashboard overflow regression coverage
Add a shared mobile and tablet overflow-containment safety net for dashboard surfaces.\n\n- Add viewport overflow regression coverage for board, task detail, workflow editor, simple workflow editor, and Activity Log surfaces.\n- Cover mobile, tablet, and landscape-phone breakpoints across empty and populated states.\n- Stabilize related dashboard tests with viewport and DOM cleanup helpers.\n- Document the targeted overflow-containment test command.\n\nFiles changed:\n docs/testing.md                                    |   6 +\n .../dashboard-overflow-containment.test.tsx        | 435 +++++++++++++++++++++\n .../app/components/__tests__/App.test.tsx          |   4 +-\n .../components/__tests__/FileBrowserModal.test.tsx |   9 +\n .../components/__tests__/GitManagerModal.test.tsx  |   2 +\n .../__tests__/MobileWorkflowGraphView.css.test.ts  |   9 +-\n .../__tests__/PlanningModeModal.autosize.test.tsx  |   2 +\n .../__tests__/PlanningModeModal.initial.test.tsx   |   2 +\n .../PlanningModeModal.planning-flow.test.tsx       |   2 +\n .../components/__tests__/SettingsModal.test.tsx    |   2 +\n .../__tests__/SettingsModal.testMode.test.tsx      |   6 +-\n .../__tests__/SettingsModal.worktrunk.test.tsx     |   6 +-\n .../__tests__/WorkflowNodeEditor.css.test.ts       |   4 +-\n 13 files changed, 479 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-6385

Fusion-Task-Lineage: 8335a9c6-279a-4962-b855-ea459ba9eb0a
2026-06-13 16:30:28 -07:00
gsxdsm
ee6d7acec8 FN-6375: include attachment paths in recovery prompts
Workflow context-limit recovery prompts now direct agents to read task attachments from the project root.

- Pass the project root into reduced workflow step prompts so attachment directories can be absolute when available.
- Replace the autonomous-agent "ask for context" wording with direct file-reading guidance for attachments.
- Cover root-aware, fallback, placement, and context-limit recovery attachment prompt behavior.
- Add a patch changeset for the published Fusion package.

Files changed:
 .../fn-6375-workflow-attachment-recovery-prompt.md |  5 ++
 .../src/__tests__/step-session-executor.test.ts    | 70 +++++++++++++++++++---
 packages/engine/src/step-session-executor.ts       |  8 ++-
 3 files changed, 72 insertions(+), 11 deletions(-)

Fusion-Task-Id: FN-6375
Fusion-Task-Lineage: ed9a5367-1623-49cb-9c7f-116c59ce5117
2026-06-13 16:30:28 -07:00
gsxdsm
9159b62b1b fix(dashboard): widen Column onOpenDetailWithTab tab union to include "workflow"
App.tsx and TaskCard.tsx already type the handler's initialTab as
"changes" | "retries" | "workflow", but Column.tsx — the intermediary that
forwards the prop — still declared the narrower "changes" | "retries", so the
forward failed to typecheck (TS2322).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 16:16:34 -07:00
gsxdsm
d1bea16f3a Merge pull request #1578 from Runfusion/feature/workflow-owned-merge-s05-runtime-work-item-driver
refactor(workflow): S05 runtime work-item driver
2026-06-13 16:15:11 -07:00
gsxdsm
dd0ceec7dd Merge main: keep ce-* agent install alongside stale-session recovery; address PR review
Resolves the onLoad conflict in the compound-engineering plugin by keeping both
the bundled ce-* persona-def install (this branch) and main's
recoverStaleSessionsForContext call.

Also addresses PR #1672 review feedback:
- executor: sentinel resume now guards on !live.paused (mirrors
  runAwaitInputNode) so a still-paused task can't consume a reply and re-enter
  the skill early.
- TaskCard: make the Answer-questions button text/title/aria-label fallbacks
  consistent ("Answer questions") for label-in-name a11y; update test.
- ce-work: replace the unshipped `skill: ce-worktree` reference with the real
  git worktree commands so Option B can't dead-end.
- ce-resolve-pr-feedback: invoke bundled scripts by absolute path via the new
  FUSION_CE_SKILLS_DIR env (sessions run with cwd=projectRoot); add the Fusion
  await-input sentinel path instead of AskUserQuestion for workflow steps;
  normalize whitespace-only review bodies like PR comments.
- plugin: expose FUSION_CE_SKILLS_DIR (installed skills root) to step sessions.
- plan doc: add language to fenced block (markdownlint MD040).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 16:08:51 -07:00
gsxdsm
3098478d9e Merge origin/main: align merge-region visited nodes with collapse refactor
main's workflow-graph-executor now collapses the merge-policy region
(merge-gate, branch-group-*, merge-attempt) into a single synthetic
`merge` node. Reconcile the S05 work-item-driver test's visitedNodeIds
assertion to match, and union the `observed` recording-primitive fields
from both branches (executedTasks + merge attempt/run/workflow ids).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 15:47:01 -07:00
gsxdsm
6626fe2598 Merge pull request #1673 from Runfusion/fix/appimage-local-runtime-root
fix: root local runtime at home dir, not process.cwd()
2026-06-13 15:38:20 -07:00
gsxdsm
69ddee0d92 Merge pull request #1671 from plarson/fix/ce-recover-stale-active-sessions
fix(ce): recover stale active sessions
2026-06-13 14:52:27 -07:00
gsxdsm
43c54290a9 chore(release): v0.42.0
Version bump via changesets.
2026-06-13 12:11:05 -07:00
gsxdsm
59411c7054 FN-6381: expose simple workflow editor controls at every width
Styles the simple workflow editor so its mobile-style controls are available and documented across desktop and narrow layouts.

- Move simple editor tab, add, action, and touch-target styling out of the mobile-only media query.
- Cover desktop simple editor affordances for custom and built-in workflows with regression tests.
- Document desktop simple editor tabs and the surfaced workflow action buttons.

Files changed:
 docs/dashboard-guide.md                            |   6 +-
 .../app/components/WorkflowNodeEditor.css          | 286 +++++++++++----------
 .../__tests__/WorkflowNodeEditor.test.tsx          |  53 ++++
 3 files changed, 201 insertions(+), 144 deletions(-)

Fusion-Task-Id: FN-6381

Fusion-Task-Lineage: fd7f1ada-6e50-4d92-b455-7f38fb46c1e2
2026-06-13 12:00:58 -07:00
gsxdsm
eea33639ee FN-6378: contain mobile board overscroll
Contain horizontal overscroll on mobile kanban board scrollers so iOS edge drags do not rubber-band columns off screen.

- Add horizontal overscroll containment to board, workflow column, and lane column scrollers while preserving proximity snap scrolling.
- Add CSS fixture regression coverage for mobile/base board and lane overscroll containment.
- Document the iOS horizontal overscroll containment root cause and fix.

Files changed:
 ...-board-ios-horizontal-overscroll-containment.md | 64 +++++++++++++++++++++
 .../board-mobile-overscroll-containment.test.ts    | 65 ++++++++++++++++++++++
 packages/dashboard/app/components/Lane.css         |  2 +
 packages/dashboard/app/styles.css                  |  1 +
 4 files changed, 132 insertions(+)

Fusion-Task-Id: FN-6378

Fusion-Task-Lineage: 70b4852b-feb0-42b5-81ba-13bfd143e0bc
2026-06-13 11:53:44 -07:00
gsxdsm
eb607c6ffd FN-6377: make tablet modals touch-resizable
Enable shared resize handles for modals on tablet and desktop while keeping mobile sheets full-screen.

- Add a pointer-driven resize grip to useModalResizePersist with debounced persistence and mobile cleanup.
- Widen the task-detail modal tablet default to 96vw / 1024px.
- Cover resize behavior and tablet width expectations with dashboard tests.
- Document the shared modal resize pattern and add the published package changeset.

Files changed:
 .changeset/FN-6377-tablet-resizable-modals.md      |   5 +
 docs/dashboard-guide.md                            |   2 +-
 .../task-detail-modal-tablet-width.test.ts         |   4 +-
 .../dashboard/app/components/TaskDetailModal.css   |   4 +-
 .../hooks/__tests__/useModalResizePersist.test.tsx | 218 +++++++++++++++++++++
 .../dashboard/app/hooks/useModalResizePersist.ts   | 140 ++++++++++---
 packages/dashboard/app/styles.css                  |  36 ++++
 7 files changed, 382 insertions(+), 27 deletions(-)

Fusion-Task-Id: FN-6377

Fusion-Task-Lineage: ecc12aa4-f881-4476-a69b-13d34a73e263
2026-06-13 11:46:53 -07:00