Commit Graph

2358 Commits

Author SHA1 Message Date
Fusion
1af2842cf5 feat(FN-3058): session-first quick chat with heartbeat prompt improvements
This merge completes the session-first quick chat FAB flow (Step 5), restores the quick chat hook after fixing a styling regression, and fixes heartbeat prompt composition for autonomous agents. It also adds the planning mode question display with new-session reset, introduces new Droid CLI settings

Fusion-Task-Id: FN-3058
2026-05-01 12:12:39 -07:00
Fusion
787d0734b4 feat(FN-2982): merge fusion/fn-2982
Merges FN-2982 Step 3: adds model filtering for the droid-cli settings API, fixes planning mode question display and new-session reset in the dashboard, and adds test coverage for droid-cli settings and model route registration.

Fusion-Task-Id: FN-2982
2026-05-01 11:55:56 -07:00
gsxdsm
f0d0f8ce29 fix(dashboard): planning mode question display + new-session reset
- Add 8s polling fallback while view is "loading" so a missed SSE
  question/summary event self-heals instead of leaving the panel stuck
  on "thinking" until close+reopen.
- Track dismissed resumeSessionIds in a ref and drop loadSession from
  the resume effect's deps so typing into the textarea no longer
  re-fires resume and yanks the user back to the previous session.
- Guard SSE onThinking/onQuestion/onSummary against late events from a
  torn-down connection by comparing the captured sessionId against
  currentSessionIdRef.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 11:40:48 -07:00
gsxdsm
d63aef925a chore(release): v0.13.0
Version bump via changesets.
2026-05-01 11:28:16 -07:00
gsxdsm
352d5d1046 chore(dashboard): demote planning archive toggle to footer link
Move the show/hide archived control out of the sidebar header (where it
competed visually with the New Session button) into a small muted link
in a new sidebar footer below the list.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 11:21:25 -07:00
gsxdsm
9b415e7169 fix(dashboard): return authoritative archived state and cover ai-session archive
Archive/unarchive routes were returning the row-update boolean rather than
the actual archived flag, so a no-op unarchive replied with `archived: true`.
Re-read the row and report its current state instead. Also adds tests for
archive (terminal-only), unarchive event emission, and listAll filtering.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 10:57:53 -07:00
gsxdsm
c6fbedbd75 chore(dashboard): widen NewChatDialog submit handler event type
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 10:39:18 -07:00
gsxdsm
56210e0712 feat(dashboard,core): show completed planning sessions and add archive
Planning sidebar's `/api/ai-sessions` listing filtered out `complete`
rows, so a session that finished while the modal was closed disappeared
on refresh even though the result was still in SQLite. Add
`?includeCompleted` / `?includeArchived` flags and a new `archived`
column (migration 57) so users can hide terminal sessions on demand
without deleting them; only `complete`/`error` rows are archivable so
live agents can't be orphaned.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 10:36:39 -07:00
gsxdsm
3b43630fa1 fix(pi-claude-cli,droid-cli,dashboard): stop ballooning resumed CLI sessions and thread per-chat session
In a multi-iteration tool loop, buildResumePrompt anchored on the last user
message and walked forward through preceding tool results. The only user
message stays at index 0, so each iteration re-sent the entire transcript over
stdin to the resumed CLI session, duplicating the original query plus a
growing stack of tool results into the on-disk session every turn. The agent
saw its own context bloating and called it "compaction." Anchor on the last
assistant message and slice forward instead — the genuine delta since the
last turn already on disk. Same bug+fix in droid-cli (copy of pi-claude-cli).

Quick chat also created a fresh pi/Claude CLI session per user message and
faked continuity by stuffing the last 50 chat_messages into the prompt as
"## Previous Conversation". Replace that with real session continuity:
chat_sessions gains a cliSessionFile column (migration 56); ChatManager
opens the existing pi SessionManager file when present and creates a fresh
one (persisting its path) on the first turn. The prompt now carries only
the new user content.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 09:21:15 -07:00
Fusion
8e0bf853dd feat(FN-2981): add droid-cli auth and status routes with experimental agent
This merge lands v0.12.0 with two major features: a droid-cli provider integration adding auth routes, status endpoints, and a settings toggle hook for controlling CLI-based authentication, plus a new experimental agent onboarding modal with a create-agent form. The release also stabilizes engine st

Fusion-Task-Id: FN-2981
2026-05-01 09:14:10 -07:00
Fusion
7011831423 feat(FN-3049): stabilize engine imports and add agent onboarding modal
Merges FN-3049 to replace all runtime dynamic imports of `@fusion/engine` with static imports that esbuild can inline into the CLI bundle, preventing the known regression where the published `npm i -g @runfusion/fusion` silently failed at the import site. Also ships FN-3024, adding an experimental a

Fusion-Task-Id: FN-3049
2026-05-01 09:00:31 -07:00
Fusion
f586ceca40 feat(FN-3024): add experimental agent onboarding modal with create form han
This merge delivers v0.12.0, which includes a new experimental agent onboarding modal (`ExperimentalAgentOnboardingModal`) that streamlines the handoff from onboarding to the create-agent form, along with backend lifecycle tests and documentation for the experimental flag. The release bumps all work

Fusion-Task-Id: FN-3024
2026-05-01 08:56:10 -07:00
gsxdsm
cb819698e2 chore(release): v0.12.0
Version bump via changesets.
2026-05-01 07:58:34 -07:00
gsxdsm
f0c2f7d049 fix(dashboard): translate chat thread to follow iOS visual viewport offset
After sending on mobile the iOS Safari focus retention shifts
visualViewport.offsetTop, leaving the composer near the top of the
screen. Translate the chat thread by that offset so it stays pinned
above the keyboard.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 07:53:46 -07:00
gsxdsm
bdf91f8fd6 fix(dashboard): keep mobile chat input anchored under iOS keyboard
Suppress iOS auto-scroll-into-view on the chat textarea and lock body
overflow while the keyboard is open so visualViewport.offsetTop stays
zero and the composer remains pinned above the keyboard.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 07:33:11 -07:00
gsxdsm
23134cf14d fix(FN-xxx): keep mobile chat keyboard open on send 2026-05-01 07:31:36 -07:00
gsxdsm
7f55dde353 fix(FN-xxx): preserve quick chat input focus on mobile send 2026-05-01 07:12:40 -07:00
gsxdsm
41e5458610 fix(FN-xxx): keep quick chat keyboard open after send on mobile 2026-05-01 06:51:24 -07:00
gsxdsm
72dffe4f33 fix(FN-xxx): send quick chat message on first mobile tap 2026-05-01 06:48:13 -07:00
gsxdsm
ecabab86ed feat(FN-xxx): show created-by agent link in task detail 2026-05-01 06:45:44 -07:00
Fusion
cf0ea341a1 feat(FN-2997): merge fusion/fn-2997-2
Merges the FN-2997 research CLI feature (275-line `research` command with routing, error handling, and docs), a droid CLI provider card for onboarding, a consolidated mock helpers module shared across CLI/dashboard/engine, the SSE architecture reference documentation, and the droid CLI probe module

Fusion-Task-Id: FN-2997
2026-05-01 06:20:07 -07:00
Fusion
bdf5e84981 feat(FN-2980): add droid cli provider card to onboarding
Adds a new Droid CLI provider card to the onboarding flow, including a dedicated provider icon, simplified card CSS, and token fallback fixes for droid provider authentication. The changes wire the card into the ModelOnboardingModal and add test coverage for the card component, icon, and onboarding

Fusion-Task-Id: FN-2980
2026-05-01 05:15:19 -07:00
Fusion
eaf9d6adf9 feat(FN-3053): consolidate mock helpers across CLI, dashboard, and engine p
The merge consolidates mock helpers across packages by creating a new shared `mockCoreEngine.ts` in the CLI package and strengthening the core/engine helpers, then migrating both CLI command tests and the dashboard's `AgentsView` tests to use the canonical helpers. It also publishes SSE architecture

Fusion-Task-Id: FN-3053
2026-05-01 05:04:05 -07:00
Fusion
2a766fe8d6 feat(FN-2979): add droid CLI probe module for node diagnostics
Added a new `droid-cli-probe` module to the dashboard package with test coverage, implementing a CLI probe capability for the droid system.

Fusion-Task-Id: FN-2979
2026-05-01 04:03:02 -07:00
Fusion
9f141800cd feat(FN-2978): add droid-cli package with provider registration and model d
This merge introduces a new `packages/droid-cli` package that bridges AI agent execution as a subprocess, including process management, event streaming, tool mapping, MCP configuration, and thinking-mode support. It also adds the `DroidCliProviderCard` dashboard UI component with onboarding flows an

Fusion-Task-Id: FN-2978
2026-05-01 03:47:10 -07:00
Fusion
8125149295 feat(FN-3047): add cancellable auth flow with recoverable pending login UX
This merge implements a recoverable pending-login auth flow (FN-3047) across three phases: cancellable in-progress auth routes in the API, an extended auth client contract, and updated ModelOnboardingModal/SettingsModal UI with proper cancel-button visibility during logout. It also adds `dashboard-r

Fusion-Task-Id: FN-3047
2026-05-01 01:14:22 -07:00
Fusion
8e09af95ea feat(FN-3044): add canonical mock helpers and migrate representative test s
This merge introduces canonical mock helper modules across the dashboard and engine packages, and migrates representative test suites to use them for consistency. The changes add four new mock helpers (`mockApi.ts`, `mockLucide.ts`, `mockCore.ts`, `mockCoreEngine.ts`) and harden the API mock proxy's

Fusion-Task-Id: FN-3044
2026-05-01 00:33:17 -07:00
Fusion
526fea3f13 feat(FN-3045): gate research settings sections behind feature flags
Research settings sections in the SettingsModal are now gated behind the feature flag, with docs updated to document the gating behavior. Tests cover both desktop and mobile settings views for the new gating logic.

Fusion-Task-Id: FN-3045
2026-04-30 23:58:25 -07:00
Fusion
c0ff899fbb feat(FN-3042): scale board typography and improve theme selector accessibil
Completes Step 2 of FN-3042 by scaling board typography styles across TaskCard and QuickEntryBox components, adding a new CustomModelDropdown stylesheet, and introducing keyboard focus-visible styles for theme selector controls. The merge includes new regression tests for board font scaling, resolve

Fusion-Task-Id: FN-3042
2026-04-30 23:24:29 -07:00
Fusion
d2848ca1d7 feat(FN-3043): formalize theme swatch sample contract
- Replace implicit theme swatch rendering with explicit sample definitions in the custom model dropdown styling
- Add ThemeSelectorSwatchContract regression tests to lock the swatch contract and prevent visual drift
- Restore workspace lint/typecheck gate behavior in onboarding-related settings flows
- Document the explicit swatch sample contract in dashboard README and related onboarding prompt/context updates

Fusion-Task-Id: FN-3043
2026-04-30 22:55:48 -07:00
gsxdsm
f21e7699d5 chore(release): v0.11.0
Version bump via changesets.
2026-04-30 21:44:17 -07:00
gsxdsm
13ed470f9f fix(dashboard): mobile quick-chat panel layout under iOS keyboard
The mobile QuickChat panel was unusable on iOS Safari: the input bar
rendered off-screen, the soft keyboard often did not open on FAB tap,
the panel slid up out of view on the second input focus, and the
header pill overflowed when the model name was long.

- The FAB JSX no longer emits inline right/bottom styles on mobile,
  and the mobile media query pins every edge with !important so the
  panel cannot be dragged off-screen by the desktop draggable hook.
- Body scroll is locked while the panel is open via overflow:hidden
  on <html> and <body>, and the document is reset to scroll 0 on
  open. This prevents iOS from leaking residual scroll into the
  fixed-positioned panel between opens.
- An always-mounted, offscreen stealth input claims the iOS soft
  keyboard inside the FAB click gesture (the real composer input is
  initially `disabled` waiting for the chat session, and iOS will
  not open the keyboard for a disabled input). Focus is transferred
  synchronously to the real input once it becomes enabled.
- The composer input intercepts touchstart on mobile and re-focuses
  with `preventScroll: true`, suppressing iOS's default focus-and-
  scroll behavior that was shifting visualViewport.offsetTop and
  sliding the panel up off-screen on a refocus.
- A useLayoutEffect mirrors visualViewport.height onto the panel as
  --vv-height directly via the DOM, bypassing React state to avoid
  the per-event reconciliation lag that read as visual jank during
  the keyboard slide-in. On blur, the variable is cleared and a
  short suppress window (~450ms) prevents iOS's mid-dismiss reports
  from clobbering the regrowth, so the panel snaps back to full
  height immediately while the keyboard finishes sliding down on
  top of it.
- The model-tag pill in the header collapses to the provider icon
  when the tag would otherwise exceed ~12 characters on mobile.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 21:27:10 -07:00
gsxdsm
40620a9a50 fix(dashboard): keep mobile terminal header on a single row
Previously the mobile terminal header used flex-wrap to stack tabs and
the action cluster on separate rows. The actions now stay pinned to the
right edge of the header row while the tab bar flexes to fill remaining
width and remains horizontally scrollable.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 21:26:54 -07:00
Fusion
2bbcadac6f feat(FN-3025): add agent onboarding flow with launch gating
- Add backend onboarding session service and legacy API routes for start, state, and import/export generation
- Introduce experimental AgentOnboardingModal UI with stream-state handling, model selector wiring, and onboarding launch flow in AgentsView
- Add onboarding gating via prompt overrides/store updates and include search behavior fix for partial-match filtering
- Expand dashboard/core tests for onboarding API, modal behavior, agents/settings integration, and prompt override handling

Fusion-Task-Id: FN-3025
2026-04-30 21:20:56 -07:00
gsxdsm
4887a113b9 fix: clear-search restores board and enable partial-match search
- useTasks debounced effect bailed when searchQuery transitioned back to
  undefined (App passes `searchQuery || undefined`), so clearing the
  input never refetched the unfiltered list. Track previous value via
  ref and only skip the initial mount.
- FTS5 search used bare tokens (exact term match), so "frob" did not
  match "frobnicator". Append `*` to each token (and to quoted tokens)
  for prefix matching. LIKE fallback already did substring matching.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 21:01:13 -07:00
Fusion
864f5bbb8c feat(FN-2996): add research agent tools with extension wiring, remote setti
This merge brings multiple substantial features: new research extension tools wired through the AI engine (with full test coverage and documentation), legacy routines agentId backward compatibility with migration paths, migration of experimental remote settings to the global scope, Nerd Font glyph a

Fusion-Task-Id: FN-2996
2026-04-30 20:39:42 -07:00
Fusion
97bb80e75c feat(FN-3034): add legacy routines agentId compatibility and migration back
Merges FN-3009 (remote settings migrated to global scope with updated schema and docs), FN-3034 (legacy routines compatibility layer: agentId backfill on load and schema validation for old format), and FN-3039 (Nerd Font glyph asset bundled into the terminal with CSS prioritization). Core settings s

Fusion-Task-Id: FN-3034
2026-04-30 20:35:15 -07:00
Fusion
d7fdff4c76 feat(FN-3009): migrate remote settings to global scope
This merge migrates Fusion's settings architecture to a unified global scope (FN-3009), consolidating settings types, defaults, merge semantics, updater logic, and routing into a centralized system that aligns dashboard remote settings with global configuration. Secondary changes include adding the

Fusion-Task-Id: FN-3009
2026-04-30 20:10:52 -07:00
Fusion
3443aed5cf feat(FN-3039): bundle nerd font glyph asset and prioritize it in terminal f
Merges two features: FN-3039 bundles a 2.5MB Nerd Font glyph asset into the dashboard and updates the terminal to prioritize the bundled font, improving icon rendering across environments; FN-3035 tightens insight tool type definitions and adds corresponding tests. The CLI extension gains new tools

Fusion-Task-Id: FN-3039
2026-04-30 20:06:43 -07:00
Fusion
e6d39bfab3 feat(FN-3041): add QuickChatFAB enhancements, AgentLogViewer, insight tools
This merge adds an AgentLogViewer component, improves the NewAgentDialog and QuickChatFAB with mobile keyboard awareness and custom model dropdowns, and introduces insight tools in the CLI extension with tightened typing and comprehensive test coverage. The theme system receives enhancements in `use

Fusion-Task-Id: FN-3041
2026-04-30 19:53:18 -07:00
Fusion
e3b320d494 feat(FN-3027): add AgentLogViewer, NewAgentDialog improvements, and AgentDe
This merge adds research settings to the settings modal and dashboard (FN-2839, FN-3029), implements a dashboard font scale setting with persistence and documentation (FN-3027), refactors AgentDetailView with a new AgentLogViewer CSS module (FN-2839), and improves NewAgentDialog with custom model dr

Fusion-Task-Id: FN-3027
2026-04-30 19:42:05 -07:00
Fusion
18fda0f744 feat(FN-3031): merge fusion/fn-3031
This merge adds a new **Research Settings** section to the settings modal and dashboard (ResearchView), including a new schema, types, and resolver exported for dashboard alias builds, along with comprehensive tests and documentation updates. It also makes task review step fields editable in the Tas

Fusion-Task-Id: FN-3031
2026-04-30 19:22:42 -07:00
Fusion
dac2597beb feat(FN-3037): add focus-visible styling to AgentLogViewer log action butto
Adds `focus-visible` styling to action buttons in the AgentLogViewer component, improving keyboard accessibility for interactive button elements.

Fusion-Task-Id: FN-3037
2026-04-30 19:18:56 -07:00
Fusion
28e681900d feat(FN-2995): export research settings resolver for dashboard alias builds
Exports the research settings resolver from `@fusion/core` types to fix dashboard alias builds, ensuring the resolver is available when imported through the dashboard's module alias configuration.

Fusion-Task-Id: FN-2995
2026-04-30 18:48:59 -07:00
Fusion
6334cd7ec3 feat(FN-3030): add heartbeat markdown viewer modal to AgentDetailView
Adds a heartbeat markdown viewer modal to the AgentDetailView (FN-3030) with styling, tests, and documentation for the feature, while also rendering multi-sample theme swatches in the ThemeSelector component (FN-3028).

Fusion-Task-Id: FN-3030
2026-04-30 18:28:01 -07:00
Fusion
9c49b5d6f0 feat(FN-3028): render multi-sample theme swatches in ThemeSelector
ThemeSelector now renders multi-sample theme swatches with richer styling; tests were updated to match and the swatch contract is documented in the dashboard README.

Fusion-Task-Id: FN-3028
2026-04-30 18:24:30 -07:00
gsxdsm
b1c0912320 chore(release): v0.10.0
Version bump via changesets.
2026-04-30 17:41:33 -07:00
gsxdsm
21402a3c1a fix(test-harness): restore promisify(exec) + unblock CLI introspection probes
The vitest child-process guard wrapped exec/execFile without preserving the
`[util.promisify.custom]` symbol, so awaited `execAsync` resolved to a raw
stdout string instead of `{stdout, stderr}`. That single regression cascaded
through ~60 "failing" tests across cli, core, engine, and dashboard whose
production code was actually correct. Also relax the AI-CLI blocklist for
cheap introspection (--version/--help/which …), give SIGTERM'd subprocesses a
brief grace period before being flagged as "left running", fix a few real
test-side bugs uncovered along the way (executor mock step transitions, iOS
last-resort keyboard path, mission SSE replay tests racing with the real AI
agent), and convert dashboard route tests' dynamic `await import("../server.js")`
to static imports so first-test timings drop from 2–5s to <200ms.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 17:40:14 -07:00
Fusion
491097cd66 feat(FN-3026): use Nerd Font terminal stack with font fallback migration
Adds Nerd Font as the terminal font stack default with a migration to update existing user settings, updates the terminal and settings modals to reflect the new font choice, and includes corresponding tests plus a patch changeset for `@runfusion/fusion`.

Fusion-Task-Id: FN-3026
2026-04-30 14:49:10 -07:00
gsxdsm
98c3c22344 fix(engine): preserve step progress + worktree across internal task bounces
Workflow-step REVISE retries, pause→todo handoffs, and the
context-overflow fresh-session requeue were all routing tasks back to
`todo` before returning to `in-progress`. The default reopen-to-todo
path reset every step to pending and rewrote PROMPT.md checkboxes, so
each retry restarted from step 0 even when earlier steps had already
been done — the symptom seen on FN-2978, where every workflow REVISE
or pause cycle wiped the task's progress.

- Add `preserveResumeState` to `TaskStore.moveTask`. When set, skip
  `resetAllStepsToPending` + `resetPromptCheckboxes` and keep
  `worktree` and `executionStartedAt` so the resumed run reattaches to
  the same checkout. `status`, `error`, and `blockedBy` still clear.
- Use it on the workflow-rerun bounce, the three pause-graceful
  handoffs, and the context-overflow requeue. The agent-terminated
  pause path still discards (it nukes worktree+branch by design).
- Context-overflow requeue clears `sessionFile` synchronously in the
  awaited `updateTask` immediately before `moveTask`, so the next
  dispatch cannot reopen the saturated session via a stale pointer.
- `fn_task_update` no longer silently regresses `done`/`skipped` steps
  to `in-progress`, no longer captures a stale rewind checkpoint when
  it does, and tells the agent honestly when a regression is ignored.
- Mobile chat keyboard: ChatView/QuickChatFAB gate layout on the new
  `keyboardOpen` flag so focused-input + viewport-shrink iOS cases
  still adjust when the computed overlap is zero.

Tests:
- New `preserveResumeState` coverage in store.test.ts; updated
  workflow-rerun + pause-graceful assertions in executor.test.ts.
- Restructured the previously-flaky "routes exhausted prompt-mode
  workflow hard failures" test to drive the bounce inline; passes in
  isolation and in the wider workflow/pause/context sweep (59/59).
- Added regression tests in ChatView.test.tsx and QuickChatFAB.test.tsx
  for the iOS last-resort `keyboardOpen=true, keyboardOverlap=0` case.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 14:12:03 -07:00