Commit Graph

82 Commits

Author SHA1 Message Date
gsxdsm
a6885b73f2 FN-8606: migrate core workflow modals to shared floating windows
Migrate dashboard dialogs to the shared movable and resizable FloatingWindow contract.

- Move core, workflow, Git, planning, and automation modal surfaces to stable floating-window identities with persisted geometry.
- Suspend geometry and floating controls for phone and short-viewport sheets, including Quick Chat.
- Add accessibility wiring, tablet touch targets, migration tests, and operator documentation.

Files changed:
 .changeset/fn-8606-floating-window-core-modals.md  |   7 +
 docs/dashboard-guide.md                            |   4 +
 packages/dashboard/app/App.tsx                     |   8 +-
 .../dashboard/app/components/ActivityLogModal.tsx  |  30 ++--
 packages/dashboard/app/components/AddNodeModal.tsx |   8 +-
 .../dashboard/app/components/ChangesDiffModal.tsx  |  35 +++--
 .../dashboard/app/components/ConnectNodeModal.tsx  |   9 +-
 .../dashboard/app/components/FloatingWindow.css    |  71 ++++++++-
 .../dashboard/app/components/FloatingWindow.tsx    |  27 +++-
 .../dashboard/app/components/GitManagerModal.tsx   |  30 +++-
 .../dashboard/app/components/GroupTaskModal.tsx    |   8 +-
 .../app/components/ModelOnboardingModal.tsx        |  28 ++--
 .../dashboard/app/components/NodeDetailModal.tsx   |   9 +-
 .../dashboard/app/components/PlanningModeModal.css |   1 -
 .../dashboard/app/components/PlanningModeModal.tsx |  57 +++----
 .../app/components/ScheduledTasksModal.tsx         |   9 +-
 packages/dashboard/app/components/ScriptsModal.css |   1 -
 packages/dashboard/app/components/ScriptsModal.tsx |  32 ++--
 .../dashboard/app/components/SettingsModal.css     |   1 -
 .../dashboard/app/components/SettingsModal.tsx     |  58 ++++---
 .../app/components/WorkflowAddStepModal.css        |  15 --
 .../app/components/WorkflowAddStepModal.tsx        |  46 +++---
 .../components/__tests__/ActivityLogModal.test.tsx |  33 ++--
 .../app/components/__tests__/AddNodeModal.test.tsx |  12 +-
 .../components/__tests__/ChangesDiffModal.test.tsx |  78 +++++-----
 .../components/__tests__/ConnectNodeModal.test.tsx |   7 +
 .../components/__tests__/FloatingWindow.test.tsx   | 173 ++++++++++++++++++++-
 .../components/__tests__/GitManagerModal.test.tsx  |  30 ++--
 .../components/__tests__/GroupTaskModal.test.tsx   |   9 ++
 .../__tests__/ModelOnboardingModal.test.tsx        |  18 ++-
 .../components/__tests__/NodeDetailModal.test.tsx  |   9 ++
 .../__tests__/PlanningModeModal.autosize.test.tsx  |  30 ++--
 .../__tests__/ScheduledTasksModal.test.tsx         |  21 ++-
 .../app/components/__tests__/ScriptsModal.test.tsx |  15 +-
 .../__tests__/SettingsModal.mobileClose.test.tsx   |  25 ++-
 .../__tests__/WorkflowAddStepModal.test.tsx        |   7 +
 .../floatingWindowMigration.test-helpers.ts        | 126 +++++++++++++++
 37 files changed, 828 insertions(+), 259 deletions(-)

Fusion-Task-Id: FN-8606
Fusion-Task-Lineage: dab0df2d-73f4-4b0f-bec3-a45016310c91
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-26 14:37:35 -07:00
gsxdsm
e4fb3f994e fix(dashboard): one Planning add-comment trigger, shown when the selection is done
The plan review pane rendered both the document-adjacent and the action-rail
"Add comment to selection" triggers, so operators saw duplicate buttons. Delete
the document variant and its --document/--mobile CSS pair; the rail button is
now the single control at every breakpoint.

Selection capture also ran on every mid-drag selectionchange, which mounted and
unmounted the trigger as the user dragged. Gate quote writes between pointerdown
and pointerup inside the plan document so the control appears once, on release.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-25 10:02:02 -07:00
gsxdsm
ca4639bb67 feat(dashboard): allow multiple tasks from one plan via epoch-scoped claims
One planning session can now create multiple tasks. Task-creation claims
are epoch-scoped: proposalClaimId stays planning-session:{id} for epoch 0
and becomes planning-session:{id}#N after the plan is edited past a
created task (rotateTaskCreationEpochOnReopen archives createdTaskId into
createdTaskIds and resets claim state). Unedited Proceed replays stay
idempotent within an epoch; crash-after-insert dedup still reconciles via
the epoch-keyed task row. Complete sessions resume to an editable plan
review with a linked-task banner; the task-created handoff gains a
Continue planning action.

Hardening from the multi-agent code review (9 reviewers):
- Reopen + rotation run only AFTER turn admission, so a rejected request
  never burns a phantom rotation (P1, 3 reviewers).
- Claim-lifecycle CAS writes are surgical jsonb merges and reconcile takes
  an expected-epoch guard, so a concurrent rotation can never be reverted
  or an archived task re-linked to a new epoch.
- create-task 409s while the session is still generating (turn-completion
  persist could tear the fresh linkage).
- Durable-read fallback in create-task now logs before trusting the
  in-memory epoch.
- linkedTaskId no longer leaks across session switches; the banner
  resolves the just-created Task before the tasks prop refreshes and
  falls back to the newest archived task after rotation; Continue
  planning re-registers the active session.
- Shared applyCompletePlanningResume helper replaces triplicated resume
  view-transitions; stale one-task-per-session comment corrected.

Tests: post-rotation replay idempotency and epoch-keyed crash reconcile
(e2e), rewind rotation + rejected-rewind non-rotation + payload
normalization round-trip (unit), Continue planning + banner-leak (UI),
create-task 409 (routes), and a new PG integration suite pinning the
surgical CAS merge and reconcile epoch guard.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 19:37:49 -07:00
gsxdsm
ddea2876c4 fix(dashboard): let the planning workspace loader scroll on short viewports
Code-review follow-up to e2ee8ba27: the loader overlay now hosts the
streamed-thinking pane, and on short viewports (landscape phones are in
the mobile breakpoint) the centered column could exceed the overlay and
clip the Stop button and thinking output. The overlay scrolls instead.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-23 18:52:19 -07:00
gsxdsm
2bebed18b2 fix(dashboard): pin mobile comment composer to visualViewport above keyboard
Phone fixed bottom:overlap left the panel under the soft keyboard (layout vs
visual viewport). While open on mobile, remeasure visualViewport and pin with
top/max-height so the entry box stays visible when the keyboard opens.
2026-07-23 18:16:28 -07:00
gsxdsm
45da5f71d3 fix(dashboard): keep planning comment composer above the keyboard
Pin the selection comment editor as a fixed panel on tablet and phone, and
lift it with visualViewport keyboard metrics so the first focus no longer
hides the form under the OS keyboard (or off-screen on tablet).
2026-07-23 17:56:05 -07:00
gsxdsm
f8e6fd5e2b fix(dashboard): stack tablet Add comment above actions with mobile icon
Tablet plan-actions no longer use flex nowrap (which put Add comment beside
Refine/Proceed). Keep the two-column grid so the selection control is a
full-width first row, and pin MessageSquarePlus to the same 16px/token size
as mobile.
2026-07-23 17:49:53 -07:00
gsxdsm
b15fd2b498 fix(dashboard): stack mobile Add comment above Refine/Proceed
Phone no longer pins Add comment under the action rail as a fixed bar. It
uses the same full-width in-flow footer row as tablet, above Refine and
Proceed. The composer stays fixed when open.
2026-07-23 17:43:27 -07:00
gsxdsm
28e2cd587c fix(dashboard): put plan-review Add comment above actions on tablet
Tablet (≤1024px) now uses the action-rail Add-comment control as a full-width
row above Refine/Proceed instead of the document-end trigger. Phone keeps the
fixed bar above the mobile nav; desktop keeps the in-document control.
2026-07-23 17:36:10 -07:00
gsxdsm
62c52972fc fix(dashboard): keep mobile plan-review selection comments on-screen
Plan review Add-comment controls now track document-level selectionchange so
they appear as soon as text is selected and dismiss when the selection ends.
On mobile the trigger and composer are fixed above the nav (with width auto)
so operators no longer need to scroll to reach them.
2026-07-23 17:19:26 -07:00
gsxdsm
d6d8a5e919 FN-8537: keep planning actions visible on mobile
Keep Planning Refine and Proceed controls visible across mobile plan-review hosts.

- Make the plan document pane the responsive scroll owner while preserving its action rail.
- Cover portrait and short-landscape embedded and modal layouts with CSS and browser tests.
- Add a patch changeset for the mobile planning action fix.

Files changed:
 .changeset/fn-8537-mobile-planning-actions.md      |  7 ++++++
 .../dashboard/app/components/PlanningModeModal.css | 25 ++++++++++++++++++++++
 .../__tests__/PlanningModeModal.css.test.ts        | 17 +++++++++++++++
 .../src/__tests__/planning-browser-e2e.test.ts     | 20 +++++++++++++++--
 4 files changed, 67 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-8537

Fusion-Task-Lineage: 7a53aa74-859d-4c76-bf26-ab6ea72873dd

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-23 11:03:33 -07:00
gsxdsm
42fe154abe FN-8533: add mobile planning comment actions
Make contextual plan comments reachable from the mobile action rail and restore focus after editing.

- Add responsive desktop and mobile comment triggers with contextual styling and documentation.
- Preserve the selected quote and restore the remounted trigger after canceling or adding a comment.
- Cover action placement, focus restoration, and browser interaction behavior.

Files changed:
 .changeset/fn-8533-mobile-planning-comments.md     |   7 ++
 docs/dashboard-guide.md                            |   2 +-
 .../dashboard/app/components/PlanningModeModal.css |  20 ++++
 .../dashboard/app/components/PlanningModeModal.tsx |  44 ++++++-
 .../__tests__/PlanningModeModal.css.test.ts        |  10 ++
 .../PlanningModeModal.planning-flow.test.tsx       |  40 +++++--
 .../PlanningModeModal.ui-interactions.test.tsx     |   5 +
 .../dashboard/app/planning-browser-e2e-fixture.tsx |   3 +-
 .../src/__tests__/planning-browser-e2e.test.ts     | 133 +++++++++++++++++++--
 packages/dashboard/vitest.config.ts                |  11 +-
 scripts/lib/test-quarantine.json                   |   5 -
 11 files changed, 242 insertions(+), 38 deletions(-)

Fusion-Task-Id: FN-8533
Fusion-Task-Lineage: e0d561be-ecc8-456e-807e-a1dc677b5d9c
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-23 09:33:25 -07:00
gsxdsm
ebbb5948ab FN-8529: add contextual plan review comments
Enable operators to submit selected-plan suggestions through the existing Planning Mode revision flow.

- Capture text selections, batch suggestions, and retain retryable comment submissions in the Planning Mode UI.
- Validate bounded comment payloads and format them for the existing planning session update path.
- Document the workflow and add coverage for ordering, retry behavior, and selection boundaries.

Files changed:
 .changeset/fn-8529-planning-comments.md            |   7 +
 docs/dashboard-guide.md                            |   4 +
 packages/dashboard/app/api/legacy.ts               |   1 +
 packages/dashboard/app/api/planning.ts             |   9 +-
 .../dashboard/app/components/PlanningModeModal.css |  86 ++++++++++++
 .../dashboard/app/components/PlanningModeModal.tsx | 144 ++++++++++++++++++++-
 .../PlanningModeModal.planning-flow.test.tsx       |  39 ++++++
 .../PlanningModeModal.ui-interactions.test.tsx     |  10 ++
 .../__tests__/planning-infinite-interview.test.ts  |  62 +++++++++
 packages/dashboard/src/planning.ts                 |  76 ++++++++++-
 .../src/routes/register-planning-subtask-routes.ts |  27 +++-
 11 files changed, 455 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-8529

Fusion-Task-Lineage: c7064d76-effd-4597-a2b4-03f344dd59b9

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-23 00:56:47 -07:00
gsxdsm
483c33a323 fix(planning): remove extra mobile and tablet pane padding
Flush question and plan-review surfaces on phone and tablet so workspace gutters, scroll padding, and nested card chrome no longer stack as dead space.
2026-07-21 18:44:48 -07:00
gsxdsm
515d77cea8 fix(planning): remove extra padding around interview panes
Make the question/plan workspace flush edge-to-edge on desktop with a single column divider, while keeping a compact card inset on mobile.
2026-07-21 17:14:30 -07:00
gsxdsm
3b9d508def fix(planning): use back-only session navigation 2026-07-21 13:02:48 -07:00
gsxdsm
634295c72f fix(planning): keep questions out of mailbox
Keep planning questions in their dedicated surface while preserving ntfy alerts, and tighten the desktop planning panes without changing compact or shared layouts.
2026-07-21 10:04:19 -07:00
gsxdsm
7b444edc86 fix(planning): complete task creation handoff
Treat active creation claims as transient coordination, keep the created-task handoff visible, and provide direct task and session navigation across desktop and mobile.
2026-07-20 23:35:32 -07:00
gsxdsm
1861a33534 fix(planning): stabilize refinement and restored sessions
Make refinement freeform-only, tighten responsive Planning controls, and keep restored idle sessions synchronized without reconnecting the stream that caused reopen errors.
2026-07-20 21:57:00 -07:00
gsxdsm
f221d2bc4d fix(planning): complete interactive planning workspace
Keep plan and questions usable across desktop and mobile, add answer and reasoning history, and create tasks directly from validated plans.
2026-07-20 21:20:10 -07:00
gsxdsm
34074e9d04 fix(planning): keep plan visible through sequential questions
Regenerate the Markdown plan after every answer while preserving the
responsive plan-and-question workspace and focused refinement flow.
2026-07-20 20:20:55 -07:00
gsxdsm
beae2c673e fix(planning): make refinement session-driven
Open refinement areas on demand with multi-select and custom focus support, then consume synchronous AI responses so restored sessions can continue reliably. Rename the primary review action to Proceed with plan and preserve the responsive Markdown review layout.
2026-07-20 18:40:03 -07:00
gsxdsm
0a01cb164d fix(planning): polish markdown plan review
Render the canonical plan as sanitized Markdown and keep responsive review actions reachable outside the scroll owner. Require Markdown-oriented planning output and preserve stable plan.md list round-trips.
2026-07-20 17:35:06 -07:00
gsxdsm
606c320c52 fix(FN-8442): make planning generation durable and detailed
Generate a reviewable initial plan before clarification, persist generation purpose across refreshes, and surface concrete changes and acceptance criteria with focused refinement choices.
2026-07-20 16:00:11 -07:00
gsxdsm
36b3180962 FN-8442: redesign planning mode as sequential Q&A
Guide planning through sequential question-and-answer turns before task creation.

- Add plan review, refinement, validation, creation retry, and idempotent task handoff states
- Atomically claim planning-session task creation and reconcile persisted task links
- Replace retired multi-pane planning UI and consolidate focused flow coverage
- Document the sequential planning workflow and mobile behavior

Files changed:
 .changeset/fn-8442-planning-sequential-qa.md       |    7 +
 MOBILE.md                                          |    2 +-
 docs/dashboard-guide.md                            |    9 +-
 packages/core/src/async-ai-session-store.ts        |   82 +-
 packages/core/src/index.ts                         |    4 +
 packages/core/src/types.ts                         |    5 +
 packages/dashboard/app/api/legacy.ts               |    4 +-
 .../dashboard/app/components/PlanningModeModal.css |  178 +-
 .../dashboard/app/components/PlanningModeModal.tsx |  317 +-
 .../__tests__/PlanningModeModal.initial.test.tsx   |  993 +----
 .../PlanningModeModal.planning-flow.test.tsx       | 4377 +-------------------
 .../PlanningModeModal.ui-interactions.test.tsx     | 1276 +-----
 .../__tests__/planning-e2e-plan-creation.test.ts   |   25 +-
 .../dashboard/src/__tests__/planning-infinite-interview.test.ts  |   44 +-
 .../src/__tests__/routes-planning.test.ts          |  119 +-
 packages/dashboard/src/ai-session-store.ts         |   33 +
 packages/dashboard/src/planning.ts                 |  140 +-
 .../src/routes/register-planning-subtask-routes.ts |  132 +-
 18 files changed, 649 insertions(+), 7098 deletions(-)

Fusion-Task-Id: FN-8442

Fusion-Task-Lineage: da2f335f-b1c9-411a-8575-31db20a2b8d5

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-20 14:59:22 -07:00
gsxdsm
22db40cba5 FN-8445: pin compact planning switcher above history
Keep compact Planning Mode interview tabs above the answered-question history across responsive layouts.

- Pin the shared compact pane switcher ahead of history in short-shell and tablet flex layouts.
- Cover the visual-order contract and mounted controls across tablet, mobile, and short-landscape panes.
- Add a patch changeset for the Planning Mode fix.

Files changed:
 .changeset/fn-8445-planning-compact-switcher-top.md |  7 +++++++
 .../dashboard/app/components/PlanningModeModal.css  | 19 +++++++++++++++++++
 .../__tests__/PlanningModeModal.css.test.ts         |  9 ++++++++-
 .../PlanningModeModal.planning-flow.test.tsx        | 21 ++++++++++++++-------
 4 files changed, 48 insertions(+), 8 deletions(-)

Fusion-Task-Id: FN-8445

Fusion-Task-Lineage: 7aa99bc7-1ad6-46ff-8ff9-4628ccefd705

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-20 14:09:26 -07:00
gsxdsm
bd558462ed FN-8427: restore mobile planning session navigation
Restore a full-pane saved-session destination for compact Planning Mode.

- Unmount the running-plan pane while mobile and tablet session lists are open.
- Keep Back and Sessions available from active, completed, and new planning surfaces.
- Cover compact navigation behavior and document the mobile interaction.

Files changed:
 .../fn-8427-planning-mobile-session-list-nav.md    |  7 ++
 MOBILE.md                                          |  2 +-
 docs/dashboard-guide.md                            |  2 +-
 .../dashboard/app/components/PlanningModeModal.css | 56 +++++++++++++++-
 .../dashboard/app/components/PlanningModeModal.tsx | 33 ++++++---
 .../__tests__/PlanningModeModal.css.test.ts        |  5 ++
 .../PlanningModeModal.ui-interactions.test.tsx     | 78 ++++++++++++++++++++++
 7 files changed, 167 insertions(+), 16 deletions(-)

Fusion-Task-Id: FN-8427
Fusion-Task-Lineage: 6664d075-0614-4b5a-ba36-34a0ec6a20a3
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-20 09:51:26 -07:00
gsxdsm
8993e912d2 FN-8426: adapt Planning Mode for compact layouts
Make Planning Mode usable on mobile, tablet, and short-height layouts.

- Collapse compact Planning interviews into selectable question, plan, and history surfaces.
- Keep Sessions navigation synchronized so returning from the session list restores a visible interview pane.
- Document and test mobile, tablet, and short-landscape behavior.

Files changed:
 .../fn-8426-planning-mobile-tablet-layout.md       |  7 ++
 MOBILE.md                                          |  2 +-
 docs/dashboard-guide.md                            |  2 +-
 .../dashboard/app/components/PlanningModeModal.css | 94 ++++++++++++++++++++--
 .../dashboard/app/components/PlanningModeModal.tsx | 51 +++++++++++-
 .../__tests__/PlanningModeModal.css.test.ts        | 17 ++++
 .../PlanningModeModal.planning-flow.test.tsx       | 36 +++++++++
 .../__tests__/PlanningModeModal.test-helpers.ts    | 23 ++++++
 8 files changed, 220 insertions(+), 12 deletions(-)

Fusion-Task-Id: FN-8426

Fusion-Task-Lineage: 489d6f92-326c-4780-bc85-d28967c7ab35

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-20 09:16:12 -07:00
gsxdsm
2fe1b996bf FN-8400: rework Planning Mode into a guided three-pane flow
Make planning interviews easier to navigate while keeping the evolving plan and validation actions accessible.

- Show answered questions in an editable navigation pane and keep one clear next-question action.
- Keep the generated plan and validation controls visible throughout planning and recovery.
- Add server validation and localized copy for session title updates.

Files changed:
 .changeset/fn-8400-planning-mode-ui.md             |   7 +
 MOBILE.md                                          |   2 +-
 docs/dashboard-guide.md                            |   6 +-
 packages/dashboard/app/api/legacy.ts               |  12 +-
 .../dashboard/app/components/PlanningModeModal.css | 112 +++--
 .../dashboard/app/components/PlanningModeModal.tsx | 408 +++++++++++--------
 .../PlanningModeModal.planning-flow.test.tsx       | 453 ++++++++-------------
 .../PlanningModeModal.ui-interactions.test.tsx     |   4 +-
 .../src/__tests__/routes-planning.test.ts          |  50 +++
 packages/dashboard/src/planning.ts                 |  21 +-
 .../src/routes/register-planning-subtask-routes.ts |  26 ++
 packages/i18n/locales/en/app.json                  |   7 +-
 packages/i18n/locales/es/app.json                  |   7 +-
 packages/i18n/locales/fr/app.json                  |   7 +-
 packages/i18n/locales/ko/app.json                  |   7 +-
 packages/i18n/locales/zh-CN/app.json               |   7 +-
 packages/i18n/locales/zh-TW/app.json               |   7 +-
 packages/i18n/src/resources.d.ts                   |   5 +
 18 files changed, 620 insertions(+), 528 deletions(-)

Fusion-Task-Id: FN-8400
Fusion-Task-Lineage: 032cf0ad-134d-4680-878f-b870eea23cc9
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-19 23:01:44 -07:00
gsxdsm
f3b68c9fff FN-8065: preview plans before refinement questions
Show a read-only plan preview at the Planning Mode deepening checkpoint.

- Persist pending plan details on the checkpoint question for fresh and restored sessions.
- Render formatted plan content and deliverables above refinement choices.
- Cover preview behavior and document the checkpoint flow.

Files changed:
 .../fn-8065-planning-checkpoint-plan-preview.md    |  7 +++
 docs/dashboard-guide.md                            |  3 +-
 packages/core/src/types.ts                         | 11 ++++
 .../dashboard/app/components/PlanningModeModal.css | 60 ++++++++++++++++++++++
 .../dashboard/app/components/PlanningModeModal.tsx | 44 ++++++++++++++++
 .../PlanningModeModal.planning-flow.test.tsx       | 24 ++++++++-
 .../planning-interview-formatters.test.ts          | 19 +++++++
 packages/dashboard/src/planning.ts                 | 10 ++++
 8 files changed, 175 insertions(+), 3 deletions(-)

Fusion-Task-Id: FN-8065

Fusion-Task-Lineage: 13cd52c3-af82-4723-a6b1-3366775213e1

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 02:54:33 -07:00
gsxdsm
e40f76fef9 FN-8057: render planning questions as sanitized Markdown
Render AI-authored planning and interview questions with readable, sanitized Markdown.

- Reuse MailboxMessageContent for active and historical planning questions.
- Preserve question typography while spacing Markdown blocks and lists consistently.
- Cover Markdown formatting across planning, mission, milestone, and slice interviews.

Files changed:
 .changeset/fn-8057-planning-question-markdown.md   |  7 ++++
 .../app/components/ConversationHistory.css         | 18 ++++++++++
 .../app/components/ConversationHistory.tsx         |  6 +++-
 .../components/MilestoneSliceInterviewModal.tsx    | 12 +++++--
 .../app/components/MissionInterviewModal.tsx       | 12 +++++--
 .../dashboard/app/components/PlanningModeModal.css | 27 +++++++++++--
 .../dashboard/app/components/PlanningModeModal.tsx | 18 +++++++--
 .../__tests__/ConversationHistory.test.tsx         | 20 +++++++++++
 .../MilestoneSliceInterviewModal.test.tsx          | 39 ++++++++++++++++++++
 .../MissionInterviewModal.test.tsx                 | 31 ++++++++++++++++
 .../PlanningModeModal.ui-interactions.test.tsx     | 41 +++++++++++++++++++++-
 11 files changed, 221 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-8057

Fusion-Task-Lineage: cf04fc77-c15c-4ca5-a99a-80a9631a1c8c

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-16 02:07:43 -07:00
gsxdsm
728eb1adaf FN-8003: add planning prompt recovery copy action
Preserve original planning prompts for recovery from stalled or off-track interviews.

- Add Copy prompt actions to active interview and error recovery surfaces.
- Restore original prompts for resumable sessions and provide clipboard feedback.
- Cover prompt copying across active, error, resumed, and absent-prompt states.

Files changed:
 docs/dashboard-guide.md                            |   3 +
 .../dashboard/app/components/PlanningModeModal.css |  33 +++++
 .../dashboard/app/components/PlanningModeModal.tsx | 116 +++++++++++++----
 .../PlanningModeModal.planning-flow.test.tsx       | 139 +++++++++++++++++++++
 4 files changed, 266 insertions(+), 25 deletions(-)

Fusion-Task-Id: FN-8003

Fusion-Task-Lineage: 11c0ec9d-290b-4793-9571-002d4b429c5e

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-15 20:32:19 -07:00
gsxdsm
80f202831d FN-7994: keep planning session sidebar populated during load
Speed up Planning mode session-list load so the sidebar never blanks while history refreshes.

- Seed the planning sidebar from already-loaded active sessions via initialSessions
- Filter GET /ai-sessions and store listAll by optional type=planning to skip non-planning payloads
- Show skeleton rows while the first authoritative session refresh is in flight
- Wire type through client fetchAiSessions, dashboard AiSessionStore, and core listAllAiSessions
- Add UI and route coverage for seeded/skeleton load and type-filtered listing
- Ship patch changeset for the operator-facing performance fix

Files changed:
 .changeset/FN-7994-planning-sidebar-fast-load.md   |  7 +++
 packages/core/src/async-ai-session-store.ts        |  7 ++-
 packages/dashboard/app/App.tsx                     |  1 +
 packages/dashboard/app/api/legacy.ts               |  3 +-
 .../dashboard/app/components/PlanningModeModal.css | 48 ++++++++++++----
 .../dashboard/app/components/PlanningModeModal.tsx | 27 ++++++++-
 .../PlanningModeModal.planning-flow.test.tsx       | 65 ++++++++++++++++++++++
 .../app/components/dashboard/MainContent.tsx       |  2 +
 .../dashboard/app/components/dashboard/types.ts    |  2 +
 .../src/__tests__/routes-planning.test.ts          | 29 ++++++++++
 packages/dashboard/src/ai-session-store.ts         |  2 +-
 packages/dashboard/src/routes.ts                   | 16 +++++-
 12 files changed, 201 insertions(+), 8 deletions(-)

Fusion-Task-Id: FN-7994

Fusion-Task-Lineage: 7c4cf98d-6dfe-4b9b-bc88-62257ed39507

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-15 15:49:18 -07:00
gsxdsm
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>
2026-07-14 18:47:53 -07:00
gsxdsm
4805182d0c FN-7369: add custom answers to Planning Mode confirms
Planning Mode confirm prompts can now preserve a user-authored Other answer instead of forcing Yes or No.

- Add an Other option with a textarea to confirm-style Planning Mode questions.
- Submit confirm Other answers with the shared `_other` payload and render them in agent/history formatting.
- Cover confirm Other behavior in modal flow and formatter tests.
- Add a patch changeset for the published CLI package.

Files changed:
 .changeset/fn-7369-confirm-other.md                |   7 ++
 .../dashboard/app/components/PlanningModeModal.css |  10 ++
 .../dashboard/app/components/PlanningModeModal.tsx |  74 +++++++++---
 .../PlanningModeModal.planning-flow.test.tsx       | 125 +++++++++++++++++++++
 .../planning-interview-formatters.test.ts          |  27 +++++
 packages/dashboard/src/planning.ts                 |  10 +-
 6 files changed, 234 insertions(+), 19 deletions(-)

Fusion-Task-Id: FN-7369

Fusion-Task-Lineage: 67b4d943-8ff3-4502-bca1-7e74eb95ac06

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-01 09:24:50 -07:00
gsxdsm
058a041714 FN-7348: pin mobile planning New session footer
Keep the mobile Planning Mode New session CTA reachable while saved sessions scroll independently.

- Bound the mobile planning list shell so only the session list scrolls.
- Preserve the sidebar footer as a non-shrinking bottom action in list view.
- Add CSS contract coverage and a changeset for the published CLI package.

Files changed:
 .changeset/fn-7348-mobile-planning-new-session.md  |  7 ++++++
 .../dashboard/app/components/PlanningModeModal.css | 23 +++++++++++++++++
 .../__tests__/PlanningModeModal.css.test.ts        | 29 ++++++++++++++++++++++
 3 files changed, 59 insertions(+)

Fusion-Task-Id: FN-7348

Fusion-Task-Lineage: 0142e539-3e4c-4ac5-9a44-d02bce2c139b

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-01 00:20:56 -07:00
gsxdsm
9f7215851b FN-7317: fix mobile planning summary controls
Fix mobile Planning Mode summary controls so description actions stay tappable and accessible.

- Move Markdown and Expand/Collapse controls outside the Description label to avoid mobile tap retargeting.\n- Add accessible labels and shared header/action styling for summary description controls.\n- Cover mobile expand/collapse behavior alongside the markdown preview toggle.\n- Add a patch changeset for the published CLI package.\n\nFiles changed:\n .changeset/fn-7317-mobile-planning-summary.md      |  7 +++\n .../dashboard/app/components/PlanningModeModal.css | 26 ++++++++-\n .../dashboard/app/components/PlanningModeModal.tsx | 58 +++++++++++--------\n .../PlanningModeModal.ui-interactions.test.tsx     | 65 ++++++++++++++++++++--\n 4 files changed, 128 insertions(+), 28 deletions(-)

Fusion-Task-Id: FN-7317

Fusion-Task-Lineage: f13bc27a-ea4e-46cd-aebb-2fe0a3251496

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-06-30 14:53:14 -07:00
gsxdsm
ae0679b004 FN-7089: add other answers to interview prompts
Adds free-text Other answers across planning and mission interview prompts.

- Add synthetic Other options for single-select and multi-select planning, mission, milestone, and slice interviews.
- Thread reserved `_other` responses through agent-facing and history formatters.
- Cover Other-only and Other-plus-selection behavior with dashboard component and formatter tests.
- Document the behavior and add a minor changeset for the published CLI package.

Files changed:
 .changeset/fn-7089-interview-other-option.md       |   7 +
 docs/dashboard-guide.md                            |   2 +
 .../components/MilestoneSliceInterviewModal.tsx    | 112 +++++++-
 .../app/components/MissionInterviewModal.tsx       | 112 +++++++-
 .../dashboard/app/components/PlanningModeModal.css |  11 +-
 .../dashboard/app/components/PlanningModeModal.tsx | 110 +++++++-
 .../MilestoneSliceInterviewModal.test.tsx          | 313 +++++++++++++++++++++
 .../__tests__/MissionInterviewModal.test.tsx       | 244 ++++++++++++++++
 .../PlanningModeModal.planning-flow.test.tsx       | 200 +++++++++++++
 .../__tests__/milestone-slice-interview.test.ts    |  49 +++-
 .../src/__tests__/mission-interview.test.ts        |  47 ++++
 .../planning-interview-formatters.test.ts          |  47 ++++
 .../dashboard/src/milestone-slice-interview.ts     |  63 ++++-
 packages/dashboard/src/mission-interview.ts        |  63 ++++-
 packages/dashboard/src/planning.ts                 |  55 ++--
 15 files changed, 1381 insertions(+), 54 deletions(-)

Fusion-Task-Id: FN-7089

Fusion-Task-Lineage: 1c629492-13e4-4ee7-aa37-1d7d067548b7

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-06-26 21:31:42 -07:00
gsxdsm
c202053725 fix(dashboard): make embedded Planning view scroll on mobile
The global mobile fullscreen modal rule (`.modal-lg`, `.modal:not(.confirm-dialog)`)
forced the embedded Planning shell to 100dvh, overflowing its bounded `.planning-view`
pane. `overflow:hidden` then clipped the footer action buttons and blocked scrolling.
Qualify the mobile embedded override as `.planning-view.open .planning-modal--embedded`
so it outranks the global rule, and re-pin `max-height:100%` so the inner flex scroll
chain works. Adds a CSS regression test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-25 13:27:37 -07:00
gsxdsm
419d58f65c FN-6974: fix tablet planning summary action wrapping
Prevent Planning Mode summary footer buttons from overlapping in tablet-width panes.

- Add tablet-specific wrapping rules for Planning Mode summary actions.
- Keep the action groups width-constrained so buttons wrap within the details pane.
- Add a CSS regression test and patch changeset for the published CLI bundle.

Files changed:
 .changeset/fn-6974-planning-tablet-actions.md      |  7 +++
 .../dashboard/app/components/PlanningModeModal.css | 29 ++++++++++++
 .../__tests__/PlanningModeModal.css.test.ts        | 52 ++++++++++++++++++++++
 3 files changed, 88 insertions(+)

Fusion-Task-Id: FN-6974

Fusion-Task-Lineage: 25d63165-38a2-47fd-8d81-9eec24b3fb6f
2026-06-25 12:25:14 -07:00
gsxdsm
f9043d733e fix(dashboard): polish workflow and chrome defaults 2026-06-22 19:48:50 -07:00
gsxdsm
f7599cb720 fix(dashboard): Planning panes fill to bottom; Goals card layout; Automations/Goals header margin
- Planning: .modal max-height:80vh capped the embedded panel ~49px short; .planning-view .planning-modal--embedded { max-height:none } (higher specificity) lets sidebar + detail fill to the view bottom.
- Goals: .goals-card-main had no flex so a long description grew to content width and starved the equal-weight Linked Missions column to ~13px; flex:1 + min-width:0 rebalances them.
- Small margin below the Automations + Goals headers so content clears the divider.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 12:05:44 -07:00
gsxdsm
2517b3a096 feat(dashboard): equal header heights (--view-header-min-height) across all left-sidebar views + missed views
Add --view-header-min-height (~61px = space-lg*2 + 28px btn-sm row + 1px divider) and apply via ViewHeader + the bespoke Mission/Planning headers so action-bearing and title-only headers are the same height. Bring the views the sweep missed to canonical: Automations (.automations-embedded-header), Import Tasks (.github-import-modal__embedded-header), Goals (header via ViewHeader + fix main-pane inset so cards align under the title + fill height). Compound Engineering + Research inherit the token automatically.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 11:52:32 -07:00
gsxdsm
94c4a78615 fix(dashboard): lighter Planning footer (no border band); tighter List toolbar-to-quick-add gap
- .planning-view-footer drops its border-top divider + trims padding so the Start-Planning action flows with the content instead of reading as a large bottom footer band.
- List controls bottom padding + quick-add top padding reduced (space-md -> space-xs) so the toolbar sits close to the quick-add box.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 11:38:21 -07:00
gsxdsm
b4e4013869 fix(dashboard): collapse empty Planning footer; Planning header matches Mission (icon/gap/title/divider)
- .planning-view-footer:empty -> display:none (no reserved space / divider band when empty); legitimate composer + start-planning footers untouched.
- Planning embedded header icon -> var(--todo), title-row gap -> space-sm, h3 -> 1.125rem/600/var(--text), border-bottom divider -> matches mission-manager__header exactly. Mission already had a single divider (no doubled line); documented the invariant.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 11:14:23 -07:00
gsxdsm
8c905876a9 feat(dashboard): Planning embedded view matches Missions (resizable sidebar, footer, button, header spacing)
Remove the New Session button's inset-ring outline (now identical to the Missions sidebar CTA); match the Missions sidebar footer padding/border; add a resizable sidebar mirroring MissionManager (drag handle, persisted width, clamp, keyboard); match the header + content padding (space-lg/space-xl, surface bg) so Planning and Missions read as siblings.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 10:44:23 -07:00
gsxdsm
d3da3cc301 feat(dashboard): Planning embedded view is a real two-pane like Missions
Left becomes a full-height .planning-sidebar (Missions-matched surface/border/width) with a scrolling list and a bottom-pinned footer; New Session moves to that footer using btn btn-primary (same CTA tokens as the Missions create button — size/color match). Right .planning-detail fills remaining width + full height, so it reads as a true two-pane view. Non-embedded modal presentation unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 10:19:12 -07:00
gsxdsm
dc0064bd15 feat(dashboard): right-dock inline tools, left-sidebar views, embedded-view polish
- Right dock: Files first/default; usage/activity-log/git-manager render inline; embedded Git Manager uses a container query (compact horizontal tab strip in the dock, full two-pane in the wide pop-out); Files inline viewer + pop-out.
- Import Tasks layout fits its container (stacked when narrow, two-pane when wide); Import Tasks uses the GitHub mark.
- Planning embeds full-area and works on mobile; planning shows the board WorkflowSwitcher.
- Automations screen uses theme color tokens.
- Workflow selector matches the project selector height/font.
- Left sidebar: uniform spacing across the primary/secondary boundary.

Adds a changeset for @runfusion/fusion (minor).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 03:34:15 -07:00
gsxdsm
cdee83c3ec fix(dashboard): list narrowing, planning blend, insights header, graph out of dock
- List view split sidebar min-width 120->64 so it can be dragged much narrower; titles wrap to two lines in the split sidebar.
- Embedded planning blends like Command Center: no panel shadow/border/outline, transparent background, matching --space-lg padding.
- Insights view header wraps so action buttons drop to a new line instead of overlapping the title.
- Dependency graph no longer appears in the right dock (left-sidebar destination only).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 03:34:15 -07:00
gsxdsm
108d9f6dca feat(dashboard): embedded planning + sidebar/dev-server styling
- Planning mode embedded view drops the modal header/close and uses a plain common title like Command Center.
- Remove the divider before the secondary section (Goals/Evals) in the left sidebar.
- Flatten the Dev Server view header to match embedded-view styling (no card chrome).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 03:34:15 -07:00