eb299666c2700e165c47ed70e42ca96f4daa1ea7
3167 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
eb299666c2 |
FN-214: add Cozy Cartoon dashboard theme
Add a Cozy Cartoon theme with synchronized dashboard and desktop styling, controls, documentation, and regression coverage. - Add the pastel light and cozy-night dark palettes with theme selector previews. - Apply rounded, oversized controls while preserving compact action-row sizing. - Document the theme and update theme types, metadata, and tests. Files changed: .changeset/fn-214-cozy-cartoon-theme.md | 6 + docs/dashboard-guide.md | 5 +- docs/settings-reference.md | 3 +- packages/core/src/types/ui/execution-and-ui.ts | 2 + .../app/__tests__/cozy-cartoon-theme.test.ts | 294 +++++++++++++++++++++ .../quick-entry-action-row-height-parity.test.tsx | 1 + .../quick-entry-workflow-trigger-height.test.tsx | 1 + .../dashboard/app/components/ThemeSelector.css | 16 ++ .../components/__tests__/ThemeDropdown.test.tsx | 2 +- .../components/__tests__/ThemeSelector.test.tsx | 2 +- .../__tests__/CommandCenterControls.test.tsx | 11 +- packages/dashboard/app/components/themeOptions.ts | 1 + packages/dashboard/app/index.html | 2 +- packages/dashboard/app/public/theme-data.css | 97 +++++++ packages/dashboard/app/styles.css | 9 + packages/desktop/src/renderer/index.html | 1 + 16 files changed, 446 insertions(+), 7 deletions(-) Fusion-Task-Id: FN-214 Fusion-Task-Lineage: f56cbadd-bbf0-4eb0-83b5-89d3fefd6f47 Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
532fabc1ac |
FN-212: restore Respecify and require plan approval per task
Restore plan revision from approval holds and add persistent per-task approval controls across the workflow. - Add task-level approval resolution, persistence, migration, and workflow gating. - Restore the Respecify action with plan-preserving revision behavior. - Add approval overlays, shared dialogs, localized copy, and regression coverage. Files changed: .changeset/fn-212-respecify-and-plan-approval.md | 7 + docs/architecture.md | 2 +- docs/dashboard-guide.md | 8 +- docs/settings-reference.md | 3 +- docs/task-management.md | 8 +- docs/workflow-steps.md | 4 +- packages/core/src/__tests__/plan-approval.test.ts | 30 +++ .../src/__tests__/postgres/schema-applier.test.ts | 40 +++- .../postgres/task-lifecycle-e2e.pg.test.ts | 10 + .../__tests__/task-require-plan-approval.test.ts | 51 +++++ packages/core/src/index.gate.ts | 2 +- packages/core/src/index.ts | 2 +- packages/core/src/planner/plan-approval.ts | 33 ++- .../0070_fn_212_task_require_plan_approval.sql | 3 + packages/core/src/postgres/postgres-health.ts | 2 + packages/core/src/postgres/schema-applier.ts | 26 ++- packages/core/src/postgres/schema/project.ts | 2 + packages/core/src/store.ts | 2 +- .../core/src/task-store/branch-and-pr-entities.ts | 2 +- packages/core/src/task-store/persistence.ts | 6 + packages/core/src/task-store/serialization.ts | 4 + packages/core/src/task-store/task-creation.ts | 4 + packages/core/src/task-store/task-update.ts | 9 + packages/core/src/types/task/task-core.ts | 12 ++ packages/core/src/types/workflow/workflow-steps.ts | 2 +- packages/dashboard/app/api/tasks/task-steer.ts | 9 +- packages/dashboard/app/components/ListView.tsx | 17 +- packages/dashboard/app/components/NewTaskModal.tsx | 11 +- .../dashboard/app/components/QuickEntryBox.tsx | 28 ++- .../app/components/RespecifyPlanDialog.css | 49 +++++ .../app/components/RespecifyPlanDialog.tsx | 120 +++++++++++ packages/dashboard/app/components/TaskCard.css | 57 ++++- packages/dashboard/app/components/TaskCard.tsx | 115 +++++++++- .../dashboard/app/components/TaskContextMenu.tsx | 12 ++ .../dashboard/app/components/TaskDetailModal.tsx | 16 ++ packages/dashboard/app/components/TaskForm.tsx | 21 +- .../ListView.plan-approval-overlay.test.tsx | 18 ++ .../NewTaskModal.plan-approval-toggle.test.tsx | 21 ++ .../app/components/__tests__/NewTaskModal.test.tsx | 27 +++ .../QuickEntryBox.plan-approval-toggle.test.tsx | 27 +++ .../components/__tests__/QuickEntryBox.test.tsx | 38 +++- .../__tests__/RespecifyPlanDialog.test.tsx | 105 +++++++++ .../TaskCard.plan-approval-host-inventory.test.tsx | 29 +++ .../TaskCard.plan-approval-overlay.test.tsx | 104 +++++++++ .../components/__tests__/TaskContextMenu.test.tsx | 14 ++ .../__tests__/TaskRetry.host-inventory.test.tsx | 12 +- .../dashboard/app/utils/planApprovalPreference.ts | 16 ++ packages/dashboard/app/utils/projectStorage.ts | 1 + .../routes-task-respecify-preserve-plan.test.ts | 226 +++++++++++++++++++ .../src/routes/register-task-workflow-routes.ts | 57 +++-- .../triage-per-task-plan-approval.test.ts | 240 +++++++++++++++++++++ packages/engine/src/triage.ts | 4 +- packages/i18n/locales/en/app.json | 21 ++ packages/i18n/locales/es/app.json | 23 +- packages/i18n/locales/fr/app.json | 23 +- packages/i18n/locales/ko/app.json | 23 +- packages/i18n/locales/pt-BR/app.json | 23 +- packages/i18n/locales/zh-CN/app.json | 23 +- packages/i18n/locales/zh-TW/app.json | 23 +- packages/i18n/src/resources.d.ts | 21 ++ 60 files changed, 1797 insertions(+), 51 deletions(-) Fusion-Task-Id: FN-212 Fusion-Task-Lineage: e2f46a8d-5724-4330-9fdb-dc33fd4b93bc Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
e24b10973e |
FN-213: preserve task branch provenance during reclaim
Keep task branches and worktrees safely attached when reclaim encounters non-conflict failures. - Preserve branch and checkout provenance during self-healing reclaim. - Narrow conflict escalation and rebind relocated worktrees from Git metadata. - Add regression coverage for merger and self-healing reclaim paths. - Document the branch-write provenance behavior. Files changed: .../fn-213-branch-write-provenance-reclaim.md | 7 + docs/architecture.md | 6 +- .../branch-write-provenance-store-stub.ts | 26 +++ packages/engine/src/__tests__/merger-ai.test.ts | 35 +++- .../merger-finalize-unproven.real-git.test.ts | 53 +++++- .../pr-conflict-reclaim.test.ts | 11 +- .../worktree-metadata-reconcile.test.ts | 55 +++++- .../self-healing-ghost-branch-recovery.test.ts | 107 ++++++++++- .../self-healing-pr-conflict.test.ts | 81 +++++++- .../self-healing-reclaim-live-zero-commits.test.ts | 88 ++++++++- .../self-healing-reclaim-paused-review.test.ts | 15 +- .../task-branch-write-origin-census.test.ts | 207 +++++++++++++++++---- packages/engine/src/merger.ts | 9 +- packages/engine/src/self-healing.ts | 55 ++++++ 14 files changed, 691 insertions(+), 64 deletions(-) Fusion-Task-Id: FN-213 Fusion-Task-Lineage: b9b86b75-4965-484d-b964-ef415568f0cc Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
38ed1d25e5 |
FN-209: add external block status and safe recovery
Add durable external-block state and safe resume handling across storage, engine, dashboard, and tests. - Persist external-block metadata and migration support for frozen tasks. - Freeze execution, scheduling, and self-healing resources while preserving exact resume state. - Add dashboard notices/actions, resume routes, localized copy, and regression coverage. - Preserve lifecycle containment and attributable automatic-move logging during the merge. Files changed: .changeset/fn-209-external-block-status.md | 7 + AGENTS.md | 1 + docs/architecture.md | 6 + docs/dashboard-guide.md | 4 + docs/run-audit.md | 4 + ...xternal-block-and-remaining-lifecycle-drifts.md | 29 +++ docs/storage.md | 4 + docs/task-management.md | 6 + .../core/src/__tests__/live-agent-count.test.ts | 19 ++ .../postgres/queued-episode-transition.pg.test.ts | 2 +- .../src/__tests__/postgres/schema-applier.test.ts | 6 +- .../core/src/__tests__/task-external-block.test.ts | 81 +++++++ packages/core/src/agents/live-agent-count.ts | 15 +- packages/core/src/index.gate.ts | 10 + packages/core/src/index.ts | 10 + .../migrations/0069_fn_209_task_external_block.sql | 3 + packages/core/src/postgres/schema-applier.ts | 27 ++- packages/core/src/postgres/schema/project.ts | 2 + packages/core/src/store.ts | 2 +- .../core/src/task-store/branch-and-pr-entities.ts | 2 +- packages/core/src/task-store/persistence.ts | 4 +- packages/core/src/task-store/reset-lifecycle.ts | 3 +- packages/core/src/task-store/serialization.ts | 1 + packages/core/src/task-store/task-mutation-ops.ts | 2 +- packages/core/src/task-store/task-row-mappers.ts | 2 +- packages/core/src/task-store/task-update.ts | 5 + packages/core/src/tasks/task-external-block.ts | 64 ++++++ packages/core/src/types.ts | 10 + packages/core/src/types/task/task-core.ts | 8 + packages/dashboard/app/App.tsx | 2 +- packages/dashboard/app/components/AppModals.tsx | 1 + packages/dashboard/app/components/Board.tsx | 6 +- packages/dashboard/app/components/Column.tsx | 5 +- packages/dashboard/app/components/DockTaskList.tsx | 3 + packages/dashboard/app/components/ListView.tsx | 7 + packages/dashboard/app/components/TaskCard.css | 76 +++++++ packages/dashboard/app/components/TaskCard.tsx | 86 +++++++- .../dashboard/app/components/TaskDetailModal.tsx | 4 + .../dashboard/app/components/WorktreeGroup.tsx | 4 + .../__tests__/ListView.external-block.test.tsx | 41 ++++ ...TaskCard.external-block-host-inventory.test.tsx | 37 ++++ .../__tests__/TaskCard.external-block.test.tsx | 90 ++++++++ .../TaskDetailModal.external-block.test.tsx | 39 ++++ .../app/components/dashboard/MainContent.tsx | 5 + .../app/components/overflowViewRegistry.tsx | 2 + .../app/components/useRightDockController.tsx | 4 + .../utils/__tests__/taskStatusBadgeLabel.test.ts | 6 + .../dashboard/app/utils/taskStatusBadgeLabel.ts | 4 + .../routes-task-external-block-resume.test.ts | 213 +++++++++++++++++++ .../src/__tests__/task-retry-stage-route.test.ts | 3 +- .../src/routes/register-task-workflow-routes.ts | 9 + .../src/routes/task-external-block-resume.ts | 112 ++++++++++ ...executor-external-block-session-failure.test.ts | 77 +++++++ .../__tests__/executor-task-done-blocked.test.ts | 54 +++++ .../external-block-freeze-contract.test.ts | 51 +++++ .../__tests__/pipeline-smoke/_pipeline-drivers.ts | 21 +- .../__tests__/pipeline-smoke/_pipeline-harness.ts | 126 ++++++++++- .../pipeline-smoke/_pipeline-scenarios.ts | 22 +- .../pipeline-smoke/_pipeline-terminal-state.ts | 3 + .../pipeline-nominal-and-review.pipeline.test.ts | 2 +- .../pipeline-resilience.pipeline.test.ts | 2 +- .../pipeline-terminal-state.pipeline.test.ts | 10 + .../scheduler-external-block-resources.test.ts | 57 +++++ .../__tests__/scheduler-overlap-starvation.test.ts | 8 +- .../self-healing-external-block-immunity.test.ts | 236 +++++++++++++++++++++ .../self-healing-leaked-slot-reaper.test.ts | 21 ++ packages/engine/src/execution-block-classifier.ts | 39 ++++ .../src/executor/clear-phantom-executor-binding.ts | 7 +- .../engine/src/executor/create-task-done-tool.ts | 69 +++++- packages/engine/src/executor/execution-prompt.ts | 1 + .../route-graph-failure-to-execution-resume.ts | 6 +- packages/engine/src/executor/run-implementation.ts | 93 ++++++-- .../src/executor/task-executor-session-facades.ts | 2 +- packages/engine/src/runtimes/in-process-runtime.ts | 2 +- packages/engine/src/scheduler.ts | 16 +- packages/engine/src/self-healing.ts | 22 +- packages/engine/src/util/run-audit.ts | 3 + packages/i18n/locales/en/app.json | 11 +- packages/i18n/locales/es/app.json | 11 +- packages/i18n/locales/fr/app.json | 11 +- packages/i18n/locales/ko/app.json | 11 +- packages/i18n/locales/pt-BR/app.json | 11 +- packages/i18n/locales/zh-CN/app.json | 11 +- packages/i18n/locales/zh-TW/app.json | 11 +- packages/i18n/src/resources.d.ts | 11 +- 85 files changed, 2067 insertions(+), 69 deletions(-) Fusion-Task-Id: FN-209 Fusion-Task-Lineage: cf7811bb-94f8-4f7a-8a2f-468f19074b9b Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
26f2a2080a |
FN-207: contain lifecycle moves within valid workflow paths
Contain task lifecycle movement within the workflow graph so cards cannot wander between columns. - Enforce directional transition and containment policies across task, recovery, merge, and workspace flows. - Centralize lifecycle move execution, provenance, reason logging, and live-column rebound handling. - Add regression, forbidden-path, remediation-placement, and workspace reuse coverage. Files changed: .changeset/fn-207-lifecycle-containment.md | 7 + AGENTS.md | 2 + docs/architecture.md | 1 + docs/workflow-steps.md | 2 + .../__tests__/lifecycle-direction-policy.test.ts | 88 ++++++ .../lifecycle-move-provenance-emit.test.ts | 107 +++++++ .../__tests__/remediation-step-placement.test.ts | 51 ++++ packages/core/src/index.gate.ts | 11 +- packages/core/src/index.ts | 21 +- packages/core/src/store.ts | 25 +- packages/core/src/task-store/lifecycle-ops.ts | 21 +- packages/core/src/task-store/moves.ts | 28 +- .../core/src/task-store/remediation-step-ops.ts | 19 +- .../core/src/tasks/remediation-step-placement.ts | 43 +++ .../src/workflows/workflow-lifecycle-direction.ts | 167 +++++++++++ .../src/workflows/workflow-lifecycle-traits.ts | 32 +++ .../src/workflows/workflow-transition-policy.ts | 56 +++- .../auto-recovery-branch-worktree.test.ts | 25 +- .../executor-browser-verification.test.ts | 6 +- ...ecutor-execution-policy-renamed-columns.test.ts | 19 +- .../__tests__/executor-graph-requeue-gate.test.ts | 16 +- .../src/__tests__/executor-step-session.test.ts | 20 +- .../__tests__/fix-steps-from-failed-gates.test.ts | 66 ++++- .../__tests__/lifecycle-containment-resume.test.ts | 142 +++++++++ .../__tests__/lifecycle-forbidden-paths.test.ts | 319 +++++++++++++++++++++ .../__tests__/lifecycle-move-legibility.test.ts | 157 ++++++++++ .../__tests__/lifecycle-move-reason-census.test.ts | 101 +++++++ .../__tests__/merger-ai-renamed-columns.test.ts | 28 +- packages/engine/src/__tests__/merger-ai.test.ts | 22 +- .../merger-finalize-unproven.real-git.test.ts | 26 +- .../auto-revive-and-watchdog.test.ts | 10 +- .../merge-node-paused-abort-retryable.test.ts | 14 +- .../worktree-incomplete-session-start.test.ts | 13 +- .../engine/src/__tests__/replan-target.test.ts | 48 +++- .../__tests__/restart-recovery-coordinator.test.ts | 9 +- .../__tests__/review-history-preservation.test.ts | 32 ++- .../src/__tests__/reviewer-workspace.test.ts | 6 +- .../src/__tests__/self-healing-trait-rekey.test.ts | 15 +- packages/engine/src/__tests__/self-healing.test.ts | 163 ++++++++++- .../verification-failure-named-remediation.test.ts | 54 ++-- .../workflow-graph-optional-step-fix.test.ts | 62 +++- .../workflow-merge-rebound-live-e2e.pg.test.ts | 2 +- .../engine/src/__tests__/workspace-merger.test.ts | 6 +- .../workspace-node-worktree-reuse.test.ts | 188 ++++++++++++ .../src/auto-recovery-handlers/branch-worktree.ts | 28 +- .../src/auto-recovery-handlers/contamination.ts | 30 +- .../engine/src/execution/lifecycle-move-log.ts | 77 +++++ packages/engine/src/execution/lifecycle-move.ts | 63 ++++ packages/engine/src/execution/replan-target.ts | 51 +++- .../executor/append-review-remediation-steps.ts | 72 ++++- ...block-outer-dispatch-when-ephemeral-disabled.ts | 1 + .../src/executor/bounce-verification-failure.ts | 53 ++-- .../engine/src/executor/completion-finalization.ts | 1 + .../engine/src/executor/create-task-done-tool.ts | 29 +- .../src/executor/dependency-dispatch-gate.ts | 1 + .../executor/ensure-graph-custom-node-worktree.ts | 19 +- .../engine/src/executor/handle-graph-failure.ts | 7 +- .../engine/src/executor/recover-completed-task.ts | 4 +- .../request-pre-merge-optional-step-fix.ts | 40 ++- .../src/executor/required-artifact-recovery.ts | 7 +- .../src/executor/review-convergence-ladder.ts | 5 +- .../route-graph-failure-to-execution-resume.ts | 28 +- .../engine/src/executor/run-graph-custom-node.ts | 30 +- packages/engine/src/executor/run-implementation.ts | 6 +- .../engine/src/executor/workflow-rerun-bounce.ts | 54 ++-- .../engine/src/executor/workflow-rerun-watchdog.ts | 6 +- .../src/healing/restart-recovery-coordinator.ts | 30 +- packages/engine/src/merge/merger-ai.ts | 66 +++-- packages/engine/src/merger.ts | 46 +-- .../__tests__/notification-service.test.ts | 13 +- packages/engine/src/project-engine.ts | 7 +- .../src/recovery/foreign-only-contamination.ts | 30 +- packages/engine/src/scheduler.ts | 4 +- packages/engine/src/self-healing.ts | 120 +++++--- .../self-healing/auto-recover-worktree-session.ts | 32 ++- .../engine/src/workflow-column-boundary-hooks.ts | 1 + .../workflow-node-runners/parse-steps-runner.ts | 10 +- scripts/lib/lifecycle-column-census-baseline.json | 3 +- 78 files changed, 2750 insertions(+), 474 deletions(-) Fusion-Task-Id: FN-207 Fusion-Task-Lineage: a64a49f7-e06b-4b33-94c6-d43a4b027610 Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
156919e8ae |
FN-211: route duplicates to a selected workflow
Let task duplication target an explicit workflow and make Planning Mode use the settings default workflow. - Add workflow selection through duplicate-task APIs, store operations, and dashboard actions. - Add workflow picker and confirmation UI across task cards, lists, detail views, and grouped worktrees. - Route Planning Mode task creation through the configured default workflow. - Add localized labels, documentation, changeset metadata, and focused tests. Files changed: .changeset/fn-211-duplicate-workflow-picker.md | 7 + docs/dashboard-guide.md | 2 + docs/task-management.md | 1 + .../__tests__/duplicate-workflow-selection.test.ts | 48 +++++++ .../postgres/refine-duplicate-task.pg.test.ts | 101 +++++++++++++++ packages/core/src/index.ts | 8 ++ packages/core/src/store.ts | 4 +- .../src/task-store/duplicate-workflow-selection.ts | 43 +++++++ packages/core/src/task-store/project-store-ops.ts | 70 ++++++++-- .../dashboard/app/api/tasks/tasks-lifecycle.ts | 14 +- packages/dashboard/app/components/AppModals.tsx | 2 +- packages/dashboard/app/components/Board.tsx | 2 +- packages/dashboard/app/components/Column.tsx | 2 +- .../dashboard/app/components/ConfirmDialog.css | 13 ++ .../dashboard/app/components/ConfirmDialog.tsx | 21 +++ packages/dashboard/app/components/ListView.tsx | 25 ++-- .../dashboard/app/components/PlanningModeModal.tsx | 23 +++- packages/dashboard/app/components/TaskCard.tsx | 27 ++-- .../dashboard/app/components/TaskDetailModal.tsx | 27 ++-- .../dashboard/app/components/WorktreeGroup.tsx | 2 +- .../components/__tests__/ConfirmDialog.test.tsx | 54 +++++++- .../app/components/__tests__/ListView.test.tsx | 39 +++++- .../PlanningModeModal.workflow-routing.test.tsx | 143 +++++++++++++++++++++ .../app/components/__tests__/TaskCard.test.tsx | 25 +++- .../TaskDetailModal.definition-actions.test.tsx | 65 ++++++++-- .../__tests__/TaskDetailModal.test-helpers.ts | 4 + .../dashboard/app/components/dashboard/types.ts | 2 +- .../app/components/useRightDockController.tsx | 2 +- .../app/hooks/__tests__/useConfirm.test.ts | 51 +++++++- packages/dashboard/app/hooks/useConfirm.ts | 50 ++++++- packages/dashboard/app/hooks/useTasks.ts | 4 +- .../utils/__tests__/duplicateTaskAction.test.ts | 83 ++++++++++++ .../__tests__/duplicateWorkflowChoices.test.ts | 96 ++++++++++++++ .../dashboard/app/utils/duplicateTaskAction.ts | 73 +++++++++++ .../app/utils/duplicateWorkflowChoices.ts | 34 +++++ .../src/__tests__/routes-planning.test.ts | 49 +++++++ .../routes-tasks-duplicate-workflow.test.ts | 85 ++++++++++++ .../src/routes/register-planning-subtask-routes.ts | 12 +- .../src/routes/register-task-workflow-routes.ts | 18 ++- packages/engine/src/agent-tools.ts | 2 +- packages/i18n/locales/en/app.json | 5 +- packages/i18n/locales/es/app.json | 3 +- packages/i18n/locales/fr/app.json | 3 +- packages/i18n/locales/ko/app.json | 3 +- packages/i18n/locales/pt-BR/app.json | 3 +- packages/i18n/locales/zh-CN/app.json | 3 +- packages/i18n/locales/zh-TW/app.json | 3 +- packages/i18n/src/resources.d.ts | 5 +- 48 files changed, 1250 insertions(+), 111 deletions(-) Fusion-Task-Id: FN-211 Fusion-Task-Lineage: 9dc84520-39ff-4c60-b4ac-b7be81574ff9 Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
1ffd20263e |
FN-210: show initiating prompt in Planning Mode history
Expose the prompt that started a Planning Mode session wherever its history is reviewed. - Add a reusable read-only PlanningSessionPrompt display for history, errors, and plan-review Q&A. - Integrate prompt rendering and responsive styling into PlanningModeModal. - Document the Planning Mode history behavior and add a minor release changeset. - Cover populated, missing, long, and responsive prompt states with dashboard tests. Files changed: .changeset/fn-210-planning-session-prompt.md | 7 + docs/dashboard-guide.md | 3 + .../dashboard/app/components/PlanningModeModal.css | 9 + .../dashboard/app/components/PlanningModeModal.tsx | 26 +- .../app/components/PlanningSessionPrompt.css | 29 +++ .../app/components/PlanningSessionPrompt.tsx | 37 +++ .../PlanningModeModal.session-prompt.test.tsx | 280 +++++++++++++++++++++ .../__tests__/PlanningSessionPrompt.test.tsx | 48 +++ 8 files changed, 435 insertions(+), 4 deletions(-) Fusion-Task-Id: FN-210 Fusion-Task-Lineage: 08201db3-7b1b-4567-95e0-1e97dc3a7ae6 Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
becaacccc4 |
FN-208: add task history reports to task details
Add a History tab that presents per-stage task reports and persists the underlying report data. - Add task-step report storage, migration, serialization, and execution summaries. - Render per-stage report accordions with localized labels in TaskDetailModal. - Add dashboard, core, engine, and schema regression coverage. Files changed: .changeset/fn-208-task-history-tab.md | 7 + docs/dashboard-guide.md | 1 + .../src/__tests__/postgres/schema-applier.test.ts | 5 +- .../core/src/__tests__/task-step-reports.test.ts | 161 +++++++++++++++++++ packages/core/src/index.gate.ts | 3 +- packages/core/src/index.ts | 3 +- .../migrations/0068_fn_208_task_step_reports.sql | 3 + packages/core/src/postgres/schema-applier.ts | 26 ++- packages/core/src/postgres/schema/project.ts | 1 + packages/core/src/store.ts | 2 +- packages/core/src/task-store/merge-queue-ops.ts | 18 ++- packages/core/src/task-store/persistence.ts | 4 +- packages/core/src/task-store/serialization.ts | 1 + packages/core/src/task-store/task-row-mappers.ts | 2 +- packages/core/src/types.ts | 2 + packages/core/src/types/task/task-core.ts | 3 + packages/core/src/types/task/task-log.ts | 14 ++ packages/core/src/workflows/task-step-reports.ts | 49 ++++++ .../dashboard/app/components/TaskDetailModal.tsx | 37 ++++- .../dashboard/app/components/TaskHistoryTab.css | 161 +++++++++++++++++++ .../dashboard/app/components/TaskHistoryTab.tsx | 119 ++++++++++++++ .../TaskDetailModal.attachments-and-tabs.test.tsx | 18 ++- ...skDetailModal.models-progress-workflow.test.tsx | 46 ++++++ .../components/__tests__/TaskHistoryTab.test.tsx | 84 ++++++++++ .../app/utils/__tests__/taskHistory.test.ts | 98 ++++++++++++ packages/dashboard/app/utils/taskHistory.ts | 174 +++++++++++++++++++++ .../src/__tests__/executor-step-summary.test.ts | 89 +++++++++++ packages/engine/src/agent-tools.ts | 10 +- .../engine/src/executor/create-task-update-tool.ts | 12 +- packages/engine/src/executor/execution-prompt.ts | 2 +- packages/i18n/locales/en/app.json | 46 ++++++ packages/i18n/locales/es/app.json | 48 +++++- packages/i18n/locales/fr/app.json | 48 +++++- packages/i18n/locales/ko/app.json | 48 +++++- packages/i18n/locales/pt-BR/app.json | 48 +++++- packages/i18n/locales/zh-CN/app.json | 48 +++++- packages/i18n/locales/zh-TW/app.json | 48 +++++- packages/i18n/src/resources.d.ts | 46 ++++++ 38 files changed, 1501 insertions(+), 34 deletions(-) Fusion-Task-Id: FN-208 Fusion-Task-Lineage: 62318171-9316-4369-8294-07b3b9dd283d Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
c0e99dff10 |
FN-206: collapse task recovery to retry, reset, and delete
Simplify task recovery into three predictable operator actions across the dashboard and lifecycle APIs. - Replace restart-stage recovery with Retry, Reset, and Delete actions. - Update task cards, lists, detail views, menus, translations, routes, and documentation. - Add focused retry behavior tests and remove obsolete restart-stage coverage. Files changed: .changeset/fn-206-removal.md | 7 ++ docs/dashboard-guide.md | 10 +- docs/task-management.md | 2 +- packages/core/src/tasks/task-column-restart.ts | 6 +- packages/dashboard/app/App.tsx | 9 +- packages/dashboard/app/api/legacy.ts | 1 - .../dashboard/app/api/tasks/tasks-lifecycle.ts | 8 -- packages/dashboard/app/components/AppModals.tsx | 3 +- packages/dashboard/app/components/Board.tsx | 6 +- packages/dashboard/app/components/Column.tsx | 5 +- packages/dashboard/app/components/ListView.tsx | 50 +++------ packages/dashboard/app/components/TaskCard.tsx | 82 ++++---------- .../dashboard/app/components/TaskContextMenu.tsx | 81 +++----------- .../dashboard/app/components/TaskDetailModal.tsx | 120 ++++++++------------- .../dashboard/app/components/WorktreeGroup.tsx | 6 +- .../__tests__/RestartStage.host-inventory.test.tsx | 20 ---- .../app/components/__tests__/TaskCard.test.tsx | 35 +++--- .../components/__tests__/TaskContextMenu.test.tsx | 64 ++++------- .../__tests__/TaskDetailModal.rendering.test.tsx | 17 +-- ...etailModal.responsive-and-dependencies.test.tsx | 11 +- .../components/__tests__/TaskDetailModal.test.tsx | 35 ++++-- .../__tests__/TaskRetry.host-inventory.test.tsx | 23 ++++ .../app/components/dashboard/MainContent.tsx | 7 +- .../dashboard/app/components/dashboard/types.ts | 1 - .../app/components/useRightDockController.tsx | 2 - packages/dashboard/app/hooks/useTasks.ts | 6 +- .../app/task-modal-touch-resize-e2e-fixture.tsx | 4 +- .../app/utils/__tests__/taskRetryCopy.test.ts | 27 +++++ packages/dashboard/app/utils/taskRecovery.ts | 5 + packages/dashboard/app/utils/taskRetryCopy.ts | 60 +++++++++++ .../routes-task-retry-stale-merge-status.test.ts | 4 +- ...oute.test.ts => task-retry-stage-route.test.ts} | 96 +++++++++++++---- .../src/routes/register-task-workflow-routes.ts | 63 +++++++---- .../dashboard/src/routes/task-restart-stage.ts | 37 ++++--- packages/i18n/locales/en/app.json | 27 ++--- packages/i18n/locales/es/app.json | 27 ++--- packages/i18n/locales/fr/app.json | 27 ++--- packages/i18n/locales/ko/app.json | 27 ++--- packages/i18n/locales/pt-BR/app.json | 27 ++--- packages/i18n/locales/zh-CN/app.json | 27 ++--- packages/i18n/locales/zh-TW/app.json | 27 ++--- packages/i18n/src/resources.d.ts | 25 +++-- 42 files changed, 589 insertions(+), 538 deletions(-) Fusion-Task-Id: FN-206 Fusion-Task-Lineage: 7ddc5f34-aaf3-4472-8663-6a5d12f40b6d Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
b802d4b3fb |
FN-205: keep the activity feed live and harden resume diagnostics
Keep task activity updates fresh while making resume diagnostics tolerate missing or invalid task identifiers. - Preserve live activity-feed freshness during task hydration and modal updates. - Centralize resume trigger handling and prevent malformed diagnostics requests from returning 400 errors. - Expand dashboard regression coverage and document the updated behavior. Files changed: .changeset/fn-205-feed-freshness.md | 7 + docs/dashboard-guide.md | 2 + docs/diagnostics.md | 6 +- .../dashboard/app/components/TaskDetailModal.tsx | 124 ++++++-- ...TaskDetailModal.feed-stripped-snapshot.test.tsx | 311 ++++++++++++++++++--- .../__tests__/TaskDetailModal.test-helpers.ts | 10 +- .../components/__tests__/TaskDetailModal.test.tsx | 38 +-- .../__tests__/useTasks-hydration-freshness.test.ts | 63 +++++ packages/dashboard/app/hooks/useTasks.ts | 20 +- .../utils/__tests__/resumeInstrumentation.test.ts | 34 ++- .../dashboard/app/utils/resumeInstrumentation.ts | 18 +- .../__tests__/register-diagnostics-routes.test.ts | 39 ++ .../src/routes/register-diagnostics-routes.ts | 15 +- packages/dashboard/src/shared/resume-triggers.ts | 28 ++ 14 files changed, 577 insertions(+), 138 deletions(-) Fusion-Task-Id: FN-205 Fusion-Task-Lineage: dc2e0fd3-741e-4560-91bc-14a31f688d5c Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
d16c8d650b |
FN-204: add task stage restart controls
Add an operator restart action that reruns a task from its current workflow stage. - Add core stage-restart planning and task lifecycle API support. - Expose restart controls across board, list, detail, and grouped task views. - Add localized labels, documentation, and route/core regression coverage. Files changed: .changeset/fn-204-restart-stage.md | 7 + docs/dashboard-guide.md | 8 +- .../core/src/__tests__/task-column-restart.test.ts | 112 +++++++ packages/core/src/index.gate.ts | 10 + packages/core/src/index.ts | 10 + packages/core/src/tasks/task-column-restart.ts | 176 +++++++++++ packages/dashboard/app/App.tsx | 7 +- packages/dashboard/app/api/legacy.ts | 1 + .../dashboard/app/api/tasks/tasks-lifecycle.ts | 8 + packages/dashboard/app/components/AppModals.tsx | 2 + packages/dashboard/app/components/Board.tsx | 10 +- packages/dashboard/app/components/Column.tsx | 5 +- packages/dashboard/app/components/ListView.tsx | 22 +- packages/dashboard/app/components/TaskCard.tsx | 24 ++ .../dashboard/app/components/TaskContextMenu.tsx | 13 + .../dashboard/app/components/TaskDetailModal.tsx | 25 ++ .../dashboard/app/components/WorktreeGroup.tsx | 8 +- .../__tests__/RestartStage.host-inventory.test.tsx | 20 ++ .../components/__tests__/TaskContextMenu.test.tsx | 11 + .../app/components/dashboard/MainContent.tsx | 11 +- .../dashboard/app/components/dashboard/types.ts | 1 + .../app/components/useRightDockController.tsx | 2 + packages/dashboard/app/hooks/useTasks.ts | 6 +- .../app/task-modal-touch-resize-e2e-fixture.tsx | 4 +- .../src/__tests__/task-restart-stage-route.test.ts | 322 +++++++++++++++++++++ .../src/routes/register-task-workflow-routes.ts | 21 ++ .../dashboard/src/routes/task-restart-stage.ts | 166 +++++++++++ packages/engine/src/index.ts | 1 + packages/i18n/locales/en/app.json | 6 + packages/i18n/locales/es/app.json | 6 + packages/i18n/locales/fr/app.json | 6 + packages/i18n/locales/ko/app.json | 6 + packages/i18n/locales/pt-BR/app.json | 6 + packages/i18n/locales/zh-CN/app.json | 6 + packages/i18n/locales/zh-TW/app.json | 6 + packages/i18n/src/resources.d.ts | 6 + 36 files changed, 1044 insertions(+), 17 deletions(-) Fusion-Task-Id: FN-204 Fusion-Task-Lineage: dd8a4493-0db8-41c3-8fe3-cf8ff30e59d5 Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
97fcc5a7ad |
FN-203: support safe workspace task reset
Enable reset to cancel and clean up workspace tasks without deleting the coordinator directory. - Plan per-repository reset targets using workspace layout and ownership checks - Reserve, cancel, and remove workspace worktrees safely while clearing leases and land intents - Document and test workspace reset behavior and publication cleanup Files changed: .changeset/fn-203-workspace-task-reset.md | 7 + docs/dashboard-guide.md | 6 +- docs/workspaces.md | 6 + .../postgres/task-reset-publication.pg.test.ts | 41 +++ .../core/src/__tests__/task-reset-targets.test.ts | 134 +++++++++ packages/core/src/index.gate.ts | 2 + packages/core/src/index.ts | 2 + packages/core/src/task-store/reset-lifecycle.ts | 16 ++ packages/core/src/tasks/task-reset-targets.ts | 103 +++++++ .../task-reset-workspace-lifecycle.test.ts | 306 +++++++++++++++++++++ .../src/routes/register-task-workflow-routes.ts | 200 +++++++++----- 11 files changed, 753 insertions(+), 70 deletions(-) Fusion-Task-Id: FN-203 Fusion-Task-Lineage: ac2406cb-6199-4c6b-82aa-d4790a677e6b Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
8fa9acbd6d |
FN-9216: add the Flexoki dashboard theme
Add the Flexoki palette as a fully persisted dashboard theme across web and desktop. - register Flexoki in shared theme types, selectors, startup validators, and preview swatches - define coordinated dark and light token palettes with regression coverage - document theme availability and add a minor release changeset Files changed: .changeset/fn-9216-flexoki-theme.md | 6 ++ docs/dashboard-guide.md | 5 +- docs/settings-reference.md | 3 +- packages/core/src/types/ui/execution-and-ui.ts | 2 + .../dashboard/app/__tests__/flexoki-theme.test.ts | 102 +++++++++++++++++++++ .../dashboard/app/components/ThemeSelector.css | 15 +++ .../components/__tests__/ThemeDropdown.test.tsx | 2 +- .../components/__tests__/ThemeSelector.test.tsx | 2 +- .../__tests__/CommandCenterControls.test.tsx | 2 +- packages/dashboard/app/components/themeOptions.ts | 2 + packages/dashboard/app/index.html | 3 +- packages/dashboard/app/public/theme-data.css | 85 +++++++++++++++++ packages/desktop/src/renderer/index.html | 2 + 13 files changed, 224 insertions(+), 7 deletions(-) Fusion-Task-Id: FN-9216 Fusion-Task-Lineage: cd89ff1a-6b08-4e3d-9103-993f04d583f3 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
0fd247b589 |
FN-9214: deliver secret values in model-visible tool content
Make policy-approved fn_secret_get reads visible to calling agents without weakening refusal paths. - Include revealed plaintext in tool content for automatic and redeemed approval reads while retaining details.value. - Keep denied, pending, missing, and ambiguous outcomes plaintext-free and audit metadata sanitized. - Add PostgreSQL-backed regression coverage, shared secret-store test setup, documentation, and a patch changeset. Files changed: .changeset/fn-9214-secret-get-value-delivery.md | 7 ++ docs/architecture.md | 2 +- docs/secrets.md | 11 ++- .../__tests__/extension-permission-gates.test.ts | 43 ++------- .../extension-secret-get-value-delivery.test.ts | 101 +++++++++++++++++++++ packages/cli/src/__tests__/pg-extension-harness.ts | 18 +++- packages/cli/src/extension.ts | 17 +++- 7 files changed, 156 insertions(+), 43 deletions(-) Fusion-Task-Id: FN-9214 Fusion-Task-Lineage: 2738aa00-9e67-4282-b950-01ed33431cfc Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
25f24c7439 |
FN-9215: scope skill discovery to selected projects
Resolve skill inventory and catalog installation state against the dashboard's selected project. - create project-rooted package managers for daemon, dashboard, and serve entry points - discover and deduplicate project-local Fusion, Pi, and agent skills with stable precedence - annotate catalog entries as installed and refresh catalog state after installation - document project-scoped behavior and add CLI, route, adapter, desktop, and mobile coverage Files changed: .changeset/fn-9215-project-scoped-skills.md | 7 + docs/dashboard-guide.md | 6 +- .../__tests__/skills-package-manager.test.ts | 50 +++++++ packages/cli/src/commands/daemon.ts | 2 + packages/cli/src/commands/dashboard.ts | 2 + packages/cli/src/commands/serve.ts | 2 + .../cli/src/commands/skills-package-manager.ts | 15 +++ packages/dashboard/app/components/SkillsView.tsx | 10 +- .../app/components/__tests__/SkillsView.test.tsx | 7 +- .../__tests__/skills-view-mobile.test.tsx | 23 ++++ .../__tests__/skills-adapter-project-scope.test.ts | 94 +++++++++++++ .../__tests__/register-agent-skills-routes.test.ts | 146 +++++++++++++++++++-- .../src/routes/register-agent-skills-routes.ts | 8 +- packages/dashboard/src/skills-adapter.ts | 109 ++++++++++++--- 14 files changed, 440 insertions(+), 41 deletions(-) Fusion-Task-Id: FN-9215 Fusion-Task-Lineage: 79da1b10-f317-4df9-af49-1d65b0825c55 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
906692006a |
FN-202: add workspace merge parity coverage
Verify workspace main-checkout completion handling and multi-repository merge parity through documentation and regression coverage. - Document workspace completion and merge parity expectations. - Cover main-checkout guard wedges, lifecycle parity, and workspace merger behavior. Files changed: docs/settings-reference.md | 1 + docs/workspaces.md | 2 + .../executor-workspace-main-checkout-guard.test.ts | 147 +++++++++++++- .../__tests__/workspace-lifecycle-parity.test.ts | 102 +++++++++- .../engine/src/__tests__/workspace-merger.test.ts | 219 ++++++++++++++++++++- 5 files changed, 464 insertions(+), 7 deletions(-) Fusion-Task-Id: FN-202 Fusion-Task-Lineage: 0e0eda72-40c8-45f8-a767-18c27a6ad6d1 Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
5c111be5f2 |
FN-198: remove task move affordances from dashboard
Remove manual task-movement controls throughout the dashboard while preserving task detail and workflow behavior. - Remove Move to controls and supporting handlers from board, list, card, context-menu, and task-detail surfaces. - Update localized strings, documentation, responsive styling, and affected tests. - Add regression coverage and a release changeset for the dashboard affordance removal. Files changed: .changeset/fn-198-removal.md | 7 + docs/dashboard-guide.md | 6 +- docs/task-management.md | 8 +- packages/dashboard/app/App.tsx | 3 +- .../task-detail-modal-tablet-width.test.ts | 10 +- packages/dashboard/app/components/AppModals.tsx | 1 - packages/dashboard/app/components/Board.tsx | 2 +- packages/dashboard/app/components/Column.tsx | 94 +--- packages/dashboard/app/components/Lane.tsx | 2 +- packages/dashboard/app/components/ListView.tsx | 103 +--- packages/dashboard/app/components/TaskCard.tsx | 125 +---- .../dashboard/app/components/TaskContextMenu.tsx | 222 +-------- .../dashboard/app/components/TaskDetailModal.css | 118 +---- .../dashboard/app/components/TaskDetailModal.tsx | 269 +---------- .../app/components/__tests__/Column.test.tsx | 57 +-- .../app/components/__tests__/ListView.test.tsx | 32 -- .../app/components/__tests__/TaskCard.test.tsx | 286 +---------- .../components/__tests__/TaskContextMenu.test.tsx | 181 ++----- .../TaskDetail.mobile-transition.test.tsx | 4 - .../TaskDetailModal.allow-resurrection.test.tsx | 4 - .../TaskDetailModal.attachments-and-tabs.test.tsx | 44 +- .../TaskDetailModal.create-pr-e2e.test.tsx | 2 - .../TaskDetailModal.create-pr-integration.test.tsx | 2 - .../__tests__/TaskDetailModal.create-pr.test.tsx | 8 - .../TaskDetailModal.custom-fields.test.tsx | 3 - .../TaskDetailModal.definition-actions.test.tsx | 69 +-- ...TaskDetailModal.feed-stripped-snapshot.test.tsx | 1 - ...TaskDetailModal.github-tracking-header.test.tsx | 1 - ...ailModal.github-tracking-renamed-lanes.test.tsx | 1 - .../TaskDetailModal.github-tracking-stale.test.tsx | 7 - .../TaskDetailModal.gitlab-tracking.test.tsx | 2 - ...lModal.inline-editing-and-integrations.test.tsx | 99 +--- ...skDetailModal.models-progress-workflow.test.tsx | 36 -- .../TaskDetailModal.oversight-controls.test.tsx | 40 +- .../TaskDetailModal.oversight-mobile.test.tsx | 18 - .../TaskDetailModal.plan-summary.test.tsx | 3 - .../TaskDetailModal.popup-hidden-gating.test.tsx | 1 - .../__tests__/TaskDetailModal.pr-tab.test.tsx | 3 - .../__tests__/TaskDetailModal.refine.test.tsx | 1 - .../__tests__/TaskDetailModal.rendering.test.tsx | 411 ++++------------ .../TaskDetailModal.resolved-columns.test.tsx | 1 - ...etailModal.responsive-and-dependencies.test.tsx | 88 +--- .../__tests__/TaskDetailModal.spec-lock.test.tsx | 3 - .../__tests__/TaskDetailModal.summary-tab.test.tsx | 15 - .../TaskDetailModal.tab-persistence.test.tsx | 1 - .../TaskDetailModal.tab-relocation.test.tsx | 1 - .../TaskDetailModal.task-activity-chat.test.tsx | 8 - .../components/__tests__/TaskDetailModal.test.tsx | 37 -- .../TaskDetailModal.worktree-terminal.test.tsx | 4 - .../__tests__/core-modals-mobile.test.tsx | 15 +- .../task-move-affordance-removed.test.tsx | 526 +++++++++++++++++++++ .../__tests__/workflow-resolved-columns.test.tsx | 169 +------ .../app/components/dashboard/MainContent.tsx | 1 - .../app/components/useRightDockController.tsx | 4 +- .../app/task-modal-touch-resize-e2e-fixture.tsx | 3 +- packages/i18n/locales/en/app.json | 44 +- packages/i18n/locales/es/app.json | 44 +- packages/i18n/locales/fr/app.json | 44 +- packages/i18n/locales/ko/app.json | 44 +- packages/i18n/locales/pt-BR/app.json | 44 +- packages/i18n/locales/zh-CN/app.json | 44 +- packages/i18n/locales/zh-TW/app.json | 44 +- packages/i18n/src/resources.d.ts | 42 +- 63 files changed, 884 insertions(+), 2628 deletions(-) Fusion-Task-Id: FN-198 Fusion-Task-Lineage: 21198580-6146-47e7-ae91-6a878e2edd3e Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
017ebd5059 |
FN-201: park workspace review revisions for human resolution
Preserve multi-repository review findings and route unresolved REVISE outcomes to human review. - Qualify workspace findings by repository for durable scope and remediation tracking. - Preserve findings through graph outcomes and stabilize remediation signatures. - Park multi-repository review revisions for human resolution with regression coverage. Files changed: .changeset/fn-201-workspace-review-findings.md | 7 + docs/workflow-steps.md | 2 +- .../__tests__/workspace-review-findings.test.ts | 198 +++++++++++++++++ .../workspace-review-remediation-routing.test.ts | 235 +++++++++++++++++++++ .../executor/append-review-remediation-steps.ts | 116 +++++++++- .../request-pre-merge-optional-step-fix.ts | 7 +- .../engine/src/executor/run-graph-custom-node.ts | 54 +++-- .../src/executor/workspace-review-per-repo.ts | 46 +++- .../src/executor/workspace-review-remediation.ts | 7 +- 9 files changed, 638 insertions(+), 34 deletions(-) Fusion-Task-Id: FN-201 Fusion-Task-Lineage: cb83c4cc-b6fc-4e4c-bd3d-5c855bf2093b Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
c4e775eb43 |
FN-200: reuse unified chat model and keep thinking popover open
Reuse the unified Direct Chat model and thinking-level popover behavior across Task Chat surfaces. - Share the unified model selector and thinking control with Task Chat. - Keep the thinking popover open while selecting a model and align responsive styling. - Update documentation and regression coverage for the shared behavior. Files changed: .../fn-200-unified-chat-model-thinking-popover.md | 7 + docs/dashboard-guide.md | 8 +- .../app/components/ChatThinkingLevelControl.tsx | 172 +++++++++++++++------ packages/dashboard/app/components/ChatView.tsx | 1 + .../app/components/TaskPlannerChatTab.css | 50 ++---- .../app/components/TaskPlannerChatTab.tsx | 47 +++--- .../ChatThinkingLevelControl.portal.test.tsx | 5 +- .../__tests__/ChatThinkingLevelControl.test.tsx | 168 ++++++++++++++++++-- .../__tests__/ChatView.thinking-level.test.tsx | 4 + ...etailModal.responsive-and-dependencies.test.tsx | 9 +- .../__tests__/TaskPlannerChatTab.test.tsx | 86 ++++++++++- 11 files changed, 420 insertions(+), 137 deletions(-) Fusion-Task-Id: FN-200 Fusion-Task-Lineage: 16e9fbc7-89bf-4492-bed3-c30cdbf85393 Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
54403ffae9 |
FN-197: split task detail tabs and report file-scope blockers
Move task attachments, dependencies, blocking, and specification content into focused task-detail tabs while exposing overlapping files as a merge blocker. - Relocate task-detail definition sections into dedicated tabs with updated responsive styling and localization. - Add file-scope overlap reporting through dashboard routes and engine scheduling integrations. - Update affected tests, documentation, and the published-package changeset. Files changed: .changeset/fn-197-task-detail-tab-split.md | 7 + docs/dashboard-guide.md | 4 +- packages/dashboard/app/api/legacy.ts | 3 + packages/dashboard/app/api/tasks/tasks.ts | 14 + packages/dashboard/app/components/TaskDetailModal.css | 41 + packages/dashboard/app/components/TaskDetailModal.tsx | 1192 +++++++++++--------- packages/dashboard/app/components/__tests__/TaskDetailModal.attachments-and-tabs.test.tsx | 45 +- packages/dashboard/app/components/__tests__/TaskDetailModal.definition-actions.test.tsx | 12 +- packages/dashboard/app/components/__tests__/TaskDetailModal.github-tracking-header.test.tsx | 4 +- packages/dashboard/app/components/__tests__/TaskDetailModal.github-tracking-renamed-lanes.test.tsx | 2 +- packages/dashboard/app/components/__tests__/TaskDetailModal.github-tracking-stale.test.tsx | 16 +- packages/dashboard/app/components/__tests__/TaskDetailModal.gitlab-tracking.test.tsx | 4 +- packages/dashboard/app/components/__tests__/TaskDetailModal.inline-editing-and-integrations.test.tsx | 87 +- packages/dashboard/app/components/__tests__/TaskDetailModal.rendering.test.tsx | 20 +- packages/dashboard/app/components/__tests__/TaskDetailModal.responsive-and-dependencies.test.tsx | 30 +- packages/dashboard/app/components/__tests__/TaskDetailModal.spec-lock.test.tsx | 18 +- packages/dashboard/app/components/__tests__/TaskDetailModal.tab-persistence.test.tsx | 2 +- packages/dashboard/app/components/__tests__/TaskDetailModal.tab-relocation.test.tsx | 198 +++ packages/dashboard/app/components/__tests__/TaskDetailModal.test-helpers.ts | 2 + packages/dashboard/app/components/__tests__/TaskDetailModal.test.tsx | 42 +- packages/dashboard/src/__tests__/routes-task-overlap-blocker-report.test.ts | 61 + packages/dashboard/src/routes/register-task-workflow-routes.ts | 17 + packages/engine/src/__tests__/file-scope-overlap-report.test.ts | 67 ++ packages/engine/src/execution/file-scope-overlap-report.ts | 79 ++ packages/engine/src/index.ts | 13 + packages/engine/src/scheduler.ts | 48 + packages/i18n/locales/en/app.json | 18 + packages/i18n/locales/es/app.json | 19 + packages/i18n/locales/fr/app.json | 19 + packages/i18n/locales/ko/app.json | 19 + packages/i18n/locales/pt-BR/app.json | 19 + packages/i18n/locales/zh-CN/app.json | 19 + packages/i18n/locales/zh-TW/app.json | 19 + packages/i18n/src/resources.d.ts | 48 + 34 files changed, 1463 insertions(+), 745 deletions(-) Fusion-Task-Id: FN-197 Fusion-Task-Lineage: b328ef8c-9445-4154-b401-464d777e1e6e Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
1d08fcb30d |
FN-196: restore the New Task modal Start button
Restore the New Task modal's discoverable Start action with validated workflow routing. - Keep Start visible but disabled until a description is entered. - Support atomic Coding (Ideas) creation and eligible manual-intake promotion. - Track Start submission state and expand regression coverage and documentation. Files changed: .changeset/fn-196-new-task-modal-start.md | 7 + docs/dashboard-guide.md | 3 + packages/dashboard/app/components/NewTaskModal.tsx | 29 ++- packages/dashboard/app/components/TaskForm.tsx | 5 + .../app/components/__tests__/NewTaskModal.test.tsx | 219 +++++++++++++++++++-- .../app/components/__tests__/TaskForm.test.tsx | 21 +- 6 files changed, 263 insertions(+), 21 deletions(-) Fusion-Task-Id: FN-196 Fusion-Task-Lineage: f3b7ff36-8a41-4189-b1c2-6dcf1f18287a Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
808f4c603b |
FN-199: request detailed reasoning summaries
Request detailed reasoning bodies for Responses-family model traces while preserving provider fallback behavior.\n\n- Shape supported Responses payloads to request detailed reasoning summaries.\n- Retry once with the prior payload when detailed summaries are rejected.\n- Preserve titled trace bodies across dashboard surfaces and document the setting.\n\nFiles changed:\n .changeset/fn-199-reasoning-summary.md | 7 + docs/dashboard-guide.md | 2 +- docs/settings-reference.md | 4 + .../__tests__/ThinkingTrace.surfaces.test.tsx | 19 +++ .../components/__tests__/ThinkingTrace.test.tsx | 4 + .../src/__tests__/pi-reasoning-summary.test.ts | 150 +++++++++++++++++++++ .../__tests__/reasoning-summary-payload.test.ts | 102 ++++++++++++++ .../src/execution/reasoning-summary-payload.ts | 72 ++++++++++ packages/engine/src/pi.ts | 48 +++++++ 9 files changed, 407 insertions(+), 1 deletion(-) Fusion-Task-Id: FN-199 Fusion-Task-Lineage: a3179f05-e709-4bae-9f4a-5507810717d8 Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
c31c15a8cd |
FN-195: add plain-language delivery summaries
Add a plain-language What This Delivers summary to task planning prompts and present task details summary-first. - Add policy and prompt guidance for concise delivery summaries. - Collapse the task Definition tab into a summary-first plan presentation. - Add summary extraction, responsive styling, documentation, changeset, and regression coverage. Files changed: .changeset/fn-195-what-this-delivers.md | 7 + AGENTS.md | 1 + docs/contributing.md | 4 + docs/dashboard-guide.md | 2 +- packages/core/src/__tests__/agent-prompts.test.ts | 40 +++- .../__tests__/original-description-policy.test.ts | 28 +++ packages/core/src/agents/agent-prompts.ts | 26 ++- .../core/src/tasks/original-description-policy.ts | 6 + .../dashboard/app/components/TaskDetailModal.css | 16 ++ .../dashboard/app/components/TaskDetailModal.tsx | 56 +++++- .../TaskDetailModal.plan-summary.test.tsx | 177 +++++++++++++++++++++ .../app/utils/__tests__/taskPlanSummary.test.ts | 114 +++++++++++++ packages/dashboard/app/utils/taskPlanSummary.ts | 118 ++++++++++++++ packages/engine/src/__tests__/triage.test.ts | 18 ++- 14 files changed, 598 insertions(+), 15 deletions(-) Fusion-Task-Id: FN-195 Fusion-Task-Lineage: a816797b-6f16-4613-9403-665fd19b73ed Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
1936c78774 |
FN-194: prevent involuntary Kanban scroll from text selection
Prevent native text-selection autoscroll from competing with intentional Board panning while preserving editable controls. - Suppress selection across Board surfaces and restore it for editable descendants. - Document the scrolling behavior and add CSS and component coverage for responsive and grouped columns. - Add a patch changeset for the dashboard behavior fix. Files changed: .changeset/fn-194-board-text-selection.md | 7 + docs/dashboard-guide.md | 5 +- .../app/__tests__/board-text-selection.test.ts | 86 ++++++++++++ packages/dashboard/app/components/Board.css | 20 ++- packages/dashboard/app/components/Board.tsx | 5 + .../__tests__/Board.text-selection.test.tsx | 144 +++++++++++++++++++++ 6 files changed, 264 insertions(+), 3 deletions(-) Fusion-Task-Id: FN-194 Fusion-Task-Lineage: 65f46bed-76f1-4e5f-9dce-7e6ce26b5fa5 Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
e213b94f25 |
FN-193: open pop-out chats on their originating thread
Ensure chat pop-out windows open on the requested conversation and remain visibly separated without corrupting shared geometry. - Initialize pop-out chat state from the originating session. - Preserve per-window cascade offsets and shrink presentation geometry only when necessary. - Document the behavior and add focused regression coverage. Files changed: .../fn-193-chat-window-thread-and-cascade.md | 7 + docs/dashboard-guide.md | 8 +- packages/dashboard/app/App.tsx | 8 +- packages/dashboard/app/components/ChatView.tsx | 3 + .../dashboard/app/components/FloatingWindow.tsx | 102 ++++++++-- .../__tests__/ChatView.core-contracts.test.tsx | 17 +- .../__tests__/ChatView.new-chat-default.test.tsx | 39 +++- .../ChatView.pop-out-host-inventory.test.tsx | 12 ++ .../FloatingWindow.cascade-separation.test.tsx | 102 ++++++++++ .../components/__tests__/FloatingWindow.test.tsx | 127 +++++++++--- .../PoppedOutChatWindows.cascade.test.tsx | 28 +++ .../PoppedOutChatWindows.opens-on-thread.test.tsx | 221 +++++++++++++++++++++ .../PoppedOutChatWindows.stacking.test.tsx | 3 +- .../__tests__/PoppedOutChatWindows.test.tsx | 4 +- .../__tests__/useChat.initial-session.test.ts | 194 ++++++++++++++++++ packages/dashboard/app/hooks/useChat.ts | 12 +- 16 files changed, 823 insertions(+), 64 deletions(-) Fusion-Task-Id: FN-193 Fusion-Task-Lineage: d5dc3ea4-1041-4e3a-b665-378bdf32d669 Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
286dd0a7ae |
fix(workspace): block completion only on main-checkout commits
Uncommitted edits in a sub-repo main checkout no longer refuse `fn_task_done`. They emit `worktree:workspace-main-checkout-edit` with `outcome:"warned"`, `reason:"uncommitted-only"`, and their evidence enum instead. Two measured reasons. The workspace land path is the same `landOneRepo` / `landSquash` mechanic as single-repo, with `projectRootDir` set to the sub-repo main checkout, so a dirty tree there is already stashed (untracked included) -> fast-forwarded -> restored under `merger.allowDirtyLocalCheckoutSync`; refusing completion for a state the very next stage is built to absorb stops the board for nothing. And an in-scope status entry carried no timing evidence at all, so an operator editing the same feature was indistinguishable from an agent that skipped `fn_acquire_repo_worktree` -- while the refusal named an operator-only remedy in a message addressed to the agent, so the card could only loop. The dangerous cases keep their refusals: a task-attributed commit still returns `main_checkout_edit` (it would reach the shared branch unreviewed), and work that exists only in a main checkout still fails the acquired-worktree `no_commits` invariant that actually proves delivery. |
||
|
|
5769d5cd61 |
Merge remote-tracking branch 'origin/main'
# Conflicts: # packages/dashboard/app/components/DockTaskList.tsx |
||
|
|
7e537989dc |
Merge remote-tracking branch 'origin/main'
# Conflicts: # packages/core/src/__tests__/settings-defaults.test.ts # packages/dashboard/app/components/ChatView.tsx |
||
|
|
922e93cf2b |
FN-9213: Display reverted tasks as in-column labels
Keep reverted work in its workflow lane while preserving visible resolution controls across dashboard surfaces. - remove separate reverted sections from the board, list, and right dock - label reverted tasks in normal list groups and retain Delete and Revise actions - deduplicate reverted rows during optimistic/refetch overlap and cover desktop and mobile behavior - document the updated workflow and add a patch changeset Files changed: .changeset/fn-9213-reverted-label-not-column.md | 7 +++ docs/dashboard-guide.md | 4 +- packages/dashboard/app/components/Board.tsx | 61 ++++++++------------ packages/dashboard/app/components/Column.tsx | 9 ++- packages/dashboard/app/components/DockTaskList.tsx | 34 +++++------ packages/dashboard/app/components/ListView.css | 5 ++ packages/dashboard/app/components/ListView.tsx | 41 ++++++++----- packages/dashboard/app/components/TaskCard.css | 1 - .../app/components/__tests__/Board.test.tsx | 47 ++++++++++++--- .../app/components/__tests__/DockTaskList.test.tsx | 9 ++- .../app/components/__tests__/ListView.test.tsx | 67 ++++++++++++++++++++++ .../app/components/__tests__/TaskCard.test.tsx | 13 +++++ 12 files changed, 216 insertions(+), 82 deletions(-) Fusion-Task-Id: FN-9213 Fusion-Task-Lineage: 3626da0d-185b-4f4a-b59f-72cfdcd1b60c Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
ea869ff38f |
fix(FN-186): give pipeline-smoke tasks process-unique ids and drain execution on teardown
S05 now covers builtin:coding-ideas-v2. 5/5 consecutive full lanes. Two harness defects, both of which made a CORRECT engine refusal look like a flake. 1. Task ids collided. The serial lived on the harness instance and reset with it, so every test's first task was `FN-182-S05-1`. The engine's process-wide state — `executingTaskLock`, `activeSessionRegistry.pathsForTask`, worktree registrations — is keyed by task id, so a straggler from the previous test answered for the NEXT test's identically-named task and handed it a worktree under the PREVIOUS fixture. The serial now lives on the module. 2. Teardown forgot in-flight work instead of waiting for it. `ProjectEngine.stop()` clears timers but does not await an execution already inside `execute()`, and the harness then called `activeSessionRegistry.clear()` — which hides a live session rather than ending it. `dispose()` now drains `executingTaskLock` and the registry for its own task ids, bounded, and THROWS on expiry: a straggler that outlives the budget is a real defect, and a silent continue would restore the leak. Throughout this, the product was right. The executor detected the foreign worktree, refused it (`outside_worktrees_dir`), retried, exhausted its budget and failed visibly. That refusal is the desired behaviour and was never the bug — the harness was manufacturing the condition. Budget re-baselined 150s -> 175s for attributable growth: a 7th file (the remediation drive) and S05 on V2, one of the longest scenarios. Five runs at 140.1-148.4s left under 2s of headroom against the old ceiling, which is a flake waiting to happen. The standing rule is unchanged and now has three precedents: growth must be nameable, or it is a regression to fix rather than a budget to raise. pnpm lint 0 errors, test:gate, verify:fast, engine-pipeline-smoke 90/90, and five consecutive full runs: 146.0s, 142.6s, 148.5s, 144.8s, 146.3s of the 175s budget. |
||
|
|
94f660e672 |
fix(FN-WF): stop a failed merge stranding review-column tasks, and widen V2 coverage
Two review-seal defects, both found by running builtin:coding-ideas-v2 through the whole scenario matrix rather than the nominal path alone. 1. A DETERMINISTIC verification gate was sealed as write-capable. It needs a worktree because it runs the project's test/build commands there, but it only reads the tree — `verification-gate.ts` has no mutation path. `workflowNodeRequiresWorktree` conflates "needs a worktree" with "writes", and its inline-fix branch matches on the node NAME (`/review|verification/i`), so a gate named "Verification" was refused after any approval. 2. A gate that already `passed` or was `skipped` was refused on replay. A post-approval requeue — a merge conflict, a transient merge failure — walks the graph back through gates whose output is already inside the approved tree. Refusing them converts a retryable merge into a terminal wedge; re-running them would rewrite the tree the review approved. "Already produced, already reviewed" now resolves as satisfied. A gate with no result still hits the refusal, which is the case the seal exists for. Measured by pipeline-smoke S13, where a conflicting merge left the card cycling on documentation-delivery with `workspace-review-seal-required` instead of retrying. Coverage: builtin:coding-ideas-v2 now runs 16 of the 19 declared scenarios plus the multi-repository workspace drive, up from 1. The duration budget is re-baselined 90s -> 150s, and the workload growth is itemised in docs/testing.md: 17 added scenario executions and a second project shape, 124.95s measured against 76.9s for the smaller matrix. Three consecutive full runs: 116.9s, 115.6s, 119.8s. NOT covered, deliberately and stated rather than hidden: S07 (unactionable review rejection), S13 (scripted merge-conflict resolution) and S17 (restart resilience) still run on the original workflows only. S07 and S13 do not converge on V2, and S17 produced one intermittent post-merge failure in four full-lane runs — a flake is not something to ship or to paper over, so those three stay uncovered until they are understood. |
||
|
|
68c466a6ab |
FN-9209: Gate chat focus behind an experimental flag
Make per-conversation chat memory focus opt-in while preserving stored focus values for compatibility. - Add the chatFocus experimental setting, exports, documentation, and release changeset. - Hide and disable focus controls and commands across chat and task-planner composers when the flag is off. - Apply persisted focus scopes to memory recall only when enabled, with regression coverage for both flag states. Files changed: .changeset/fn-9209-chat-focus-experimental-flag.md | 7 ++ docs/memory-backend-integration.md | 6 +- docs/settings-reference.md | 3 +- .../core/src/__tests__/settings-defaults.test.ts | 9 +- packages/core/src/config/experimental-features.ts | 7 ++ packages/core/src/index.gate.ts | 2 +- packages/core/src/index.ts | 2 +- packages/core/src/types.ts | 7 ++ packages/dashboard/app/components/ChatView.tsx | 37 ++++--- .../dashboard/app/components/SettingsModal.tsx | 1 + .../app/components/TaskPlannerChatTab.tsx | 62 ++++++++--- .../__tests__/ChatView.chat-focus-flag.test.tsx | 122 +++++++++++++++++++++ .../__tests__/ChatView.focus-chip.test.tsx | 2 +- .../TaskPlannerChatTab.chat-focus-flag.test.tsx | 108 ++++++++++++++++++ .../__tests__/TaskPlannerChatTab.test.tsx | 5 +- .../app/components/__tests__/chat-commands.test.ts | 7 +- .../app/components/__tests__/focus-command.test.ts | 13 ++- packages/dashboard/app/components/chat-commands.ts | 11 ++ .../chat-memory-focus-reachability.test.ts | 16 ++- packages/dashboard/src/chat.ts | 30 ++--- 20 files changed, 394 insertions(+), 63 deletions(-) Fusion-Task-Id: FN-9209 Fusion-Task-Lineage: d58296be-a5f9-4b8c-bf4a-03f7f9100efe Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
bde81ad4ff |
feat(FN-182): add deterministic AI-free pipeline smoke lane
Opt-in `pnpm smoke:pipeline` lane replaying 19 declared scenarios across
builtin:coding-ideas and the builtin:coding non-regression floor, driving the
real engine: disposable local Git repositories, throwaway PostgreSQL store,
production graph dispatch, ProjectEngine merge admission, real worktree
acquisition, and deterministic mock-provider scripts under testMode.
Each scenario declares one closed terminal state (merged-done, inert-intake,
parked, manual-hold, no-op-merge); an undeclared terminal fails the run, and
five wedge detectors (W1-W5) reject contradictory parks, finalization loops,
severed sessions, unreachable waits, and quiescence without progress.
Differential proof: on the pre-FN-180 tree (
|
||
|
|
8e8e3233c6 |
Merge remote-tracking branch 'origin/main'
# Conflicts: # docs/dashboard-guide.md # packages/core/src/__tests__/postgres/schema-applier.test.ts # packages/core/src/__tests__/task-merge.test.ts # packages/core/src/merge/task-merge.ts # packages/core/src/postgres/schema-applier.ts # packages/core/src/task-store/merge-queue-ops.ts # packages/dashboard/app/__tests__/App.keyboard-shortcuts.test.tsx # packages/dashboard/app/components/ChatView.css # packages/dashboard/app/components/ChatView.tsx # packages/dashboard/app/components/__tests__/ChatView.core-contracts.test.tsx # packages/dashboard/app/components/__tests__/ChatView.core-interactions.test.tsx # packages/dashboard/app/components/__tests__/ChatView.core.test.tsx # packages/dashboard/app/components/__tests__/ChatView.draft.test.tsx # packages/dashboard/app/components/__tests__/ChatView.message-edit.test.tsx # packages/dashboard/app/components/__tests__/ChatView.mobile-render.test.tsx # packages/dashboard/app/components/__tests__/ChatView.mobile.test.tsx # packages/dashboard/app/components/__tests__/ChatView.new-chat-default.test.tsx # packages/dashboard/app/components/__tests__/ChatView.rooms.test.tsx # packages/dashboard/app/components/__tests__/ChatView.scroll-to-top.test.tsx # packages/dashboard/app/components/__tests__/ChatView.sessions-rooms.test.tsx # packages/dashboard/app/components/__tests__/ChatView.thinking-level.test.tsx # packages/engine/src/__tests__/executor-step-session.test.ts # packages/engine/src/__tests__/merge-abort-clears-transient-status.test.ts # packages/engine/src/__tests__/merger-ai-cleanup.test.ts # packages/engine/src/__tests__/merger-merge-lifecycle.test.ts # packages/engine/src/__tests__/workspace-merger.test.ts # packages/engine/src/merge/auto-merge-finalization.ts # packages/engine/src/merge/merger-ai.ts # packages/engine/src/project-engine.ts # packages/engine/src/run-audit/run-audit-catalogue.ts # packages/engine/src/self-healing.ts # packages/engine/src/worktree/review-diff-fingerprint.ts # packages/i18n/locales/es/app.json # packages/i18n/locales/fr/app.json # packages/i18n/locales/ko/app.json # packages/i18n/locales/pt-BR/app.json # packages/i18n/locales/zh-CN/app.json # packages/i18n/locales/zh-TW/app.json |
||
|
|
456f7b370b |
docs(test-failures): retract the connection-exhaustion cause, record the failed reproduction
Measured 14 backend connections against max_connections=100, so the api-lane hook timeouts are not connection exhaustion; the PostgreSQL Failed query lines are a torn-down reconciler polling after the fact. Full 15-lane run at 23,584 tests reproduced nothing, and the DDL admission gate never degraded, so that mechanism is unsupported too. Records what a future attempt must capture. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
72f0bbb503 |
docs: record dashboard api-lane PostgreSQL contention as a suite-infrastructure flake pattern
Three consecutive full-lane runs on the same tree each failed a DIFFERENT file, every one passing in isolation, with hook timeouts arriving alongside PostgreSQL 'Failed query' warnings from two api lanes sharing one database. That is the same class FN-9131 investigated for core's loaded PostgreSQL directory. Deliberately not quarantined: quarantine is file-level and the failing file moves, so it would evict healthy coverage without touching the cause. Recorded with the evidence so the next person does not re-derive it, and so the rescue is aimed at the lane runner's connection/concurrency budget rather than at whichever test lost the race that run. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
cb16f418c7 |
FN-183: ensure local integration branch readiness
Guarantee projects have a usable local integration branch ref across creation, import, and merge workflows. - Add shared integration-branch readiness and repository initialization helpers. - Wire project registration, CLI commands, central storage, and merge execution to establish the ref. - Document the behavior and cover CLI, dashboard, core, and engine integration paths. Files changed: .changeset/fn-183-integration-branch-readiness.md | 7 + docs/architecture.md | 2 +- docs/cli-reference.md | 4 +- docs/getting-started.md | 2 +- docs/settings-reference.md | 2 +- .../auto-git-init-project-registration.md | 21 +++ docs/workspaces.md | 2 +- packages/cli/src/commands/__tests__/init.test.ts | 70 +++++-- .../cli/src/commands/__tests__/project.test.ts | 22 +++ packages/cli/src/commands/init.ts | 26 ++- packages/cli/src/commands/project.ts | 20 ++ packages/core/src/__tests__/git-repository.test.ts | 190 +++++++++++++++++++ .../__tests__/integration-branch-readiness.test.ts | 94 ++++++++++ packages/core/src/central/central-core.ts | 65 +++++-- packages/core/src/git/git-repository.ts | 112 ++++++++++-- .../core/src/git/integration-branch-readiness.ts | 201 +++++++++++++++++++++ packages/core/src/index.gate.ts | 14 ++ packages/core/src/index.ts | 14 ++ packages/core/src/merge/task-merge.ts | 2 +- .../register-project-git-readiness.test.ts | 132 +++++++++++++- .../src/routes/register-project-routes.ts | 31 +++- .../src/__tests__/integration-branch.test.ts | 135 ++++++++++++++ packages/engine/src/__tests__/merger-ai.test.ts | 21 +++ packages/engine/src/merge/integration-branch.ts | 127 ++++++++++++- packages/engine/src/merge/merger-ai.ts | 25 ++- 25 files changed, 1273 insertions(+), 68 deletions(-) Fusion-Task-Id: FN-183 Fusion-Task-Lineage: ee63d45a-3406-4064-b16f-a2fe6dc0ad86 Co-authored-by: Fusion <noreply@runfusion.ai> |
||
|
|
5378bca7f6 |
test: fix the dashboard quality runner's self-spawning tests
Running the dashboard's REAL test command (`run-quality-tests.mjs`, which shards into 15 lanes) surfaced two failures that a plain `vitest run` never shows — worth noting on its own, since measuring around a package's own command is how a suite gets called green on a number the project does not produce. `scripts/__tests__/run-quality-tests.test.ts` spawns the package's own `pnpm --filter @fusion/dashboard test` to prove the package-command wiring. Inside a full lane run that child inherited a Corepack environment that stopped to ask about downloading pnpm, so it never launched, the lane log came back empty, and the assertion read 0 launched projects. It passed in isolation only because that shell had already resolved pnpm. Both spawn sites now set COREPACK_ENABLE_DOWNLOAD_PROMPT=0; nothing about the assertions changed. Also records PlanningModeModal.planning-flow as a suite-only flake rather than forcing it green: it fails only in lane `app:backfill-3` under four concurrent 6GB shards, passes 83/83 in isolation, and picked a DIFFERENT case on each of two runs — a render-settle timing problem, not a product defect. Recorded as a first sighting; a repeat of the same case is an on-sight quarantine. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
64cb17c100 |
FN-9204: advertise a valid memory MCP server version
Make the built-in memory MCP server complete the SDK-validated initialize handshake. - Include a non-empty version in fusion-memory serverInfo responses. - Cover the real SDK handshake, malformed-response skip path, and JSON-RPC envelopes. - Document the protocol requirement and add a patch changeset. Files changed: .changeset/fn-9204-memory-mcp-handshake.md | 7 ++ docs/mcp.md | 2 + .../__tests__/mcp-memory-server-spawn.test.ts | 5 +- .../mcp/__tests__/memory-mcp-handler.test.ts | 7 +- packages/core/src/memory/mcp/memory-mcp-handler.ts | 8 +- .../src/__tests__/mcp-memory-handshake.test.ts | 120 +++++++++++++++++++++ 6 files changed, 146 insertions(+), 3 deletions(-) Fusion-Task-Id: FN-9204 Fusion-Task-Lineage: 0f68bdd5-56fe-4fdb-867f-2a5e0ea4de65 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
28a0ebc382 |
docs: index three Stash memory backend docs orphaned by #3494
Add memory-backend-integration.md to Architecture & Development (plus its
missing docs-index back-link) and performance/spawn-storm-attribution.md
and research/stash-vector-search-evaluation.md to Audit Reports. All three
were added by
|
||
|
|
c9f3f11a72 |
fix: allow worktree agents to read user skills (#3506)
## Summary - allow worktree sessions to read the standard user skill root at `~/.agents/skills` - keep sibling `~/.agents` files and all write/edit/Bash access outside the exception - canonicalize existing path components so symlinks cannot escape an allowed skill root - document the boundary and add a patch changeset This extends the same host-skill consistency fixed in #2384: Fusion should not tell an agent to load a skill and then block the skill body. ## Test plan - [x] 15 worktree-boundary tests - [x] `pnpm --filter @fusion/engine typecheck` - [x] scoped ESLint - [x] changeset and FNXC date checks - [x] `pnpm verify:fast` (20 steps, including build and boot smoke) - [x] CLI CI-shape test (72 tests) ## Local gate notes `pnpm test:gate` passed all static checks, 432 engine-core tests, and 184 core unit tests. Its PostgreSQL lane could not authenticate locally (`empty password returned by client`). The full `pi-create-fn-agent.test.ts` run also reaches an unrelated dashboard-chat principal assertion failure already present at the exact `origin/main` SHA; the 15 boundary tests pass. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Worktree agents can read and search skills installed in the standard `~/.agents/skills` directory. - **Bug Fixes** - Preserved worktree protections for writing, editing, and Bash operations. - Blocked access to unrelated files and prevented symlink-based boundary escapes across supported path operations. - Improved access validation for paths that do not yet exist. - **Documentation** - Updated worktree boundary documentation to describe skill access and its restrictions. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
8fcf4bdbaa |
feat: Stash memory backend — session capture, per-chat backfill, opt-in vector search (#3494)
## Summary Adds the **Stash memory backend** (`memory.backendType=stash`) that connects Fusion's agent memory to the [Stash](https://github.com/Fergana-Labs/stash) product — *knowledge bases for the agent era* ([product site: joinstash.ai](https://joinstash.ai)). Fusion becomes a first-class Stash client: complete chat sessions and finished tasks are captured into Stash, memory is recalled during chat, and Stash sessions are kept in sync with the dashboard (including deletes and archival). **Product:** <https://github.com/Fergana-Labs/stash> · [joinstash.ai](https://joinstash.ai) ## What's included ### 1. Stash memory backend (RUFU-068 / RUFU-121) - New `StashMemoryBackend` (`memory.backendType=stash`) with `stashUrl` / `stashApiKey` settings (global secrets-store `stash-api-key` + per-project override). - **Complete-chat-session capture** keyed by ChatSession id. - Sessions are classified into **per-project folders** (get-or-create, `external_key fusion-<projectId>`, 1h per-process cache) and **soft-deleted with their chat** via `DELETE /api/chat/sessions/:id`. - Per-conversation **memory-focus** read-time scoping (new `0066_chat_session_memory_focus.sql` migration — sequence renumbered 0059→0060→0061→0065→0066 as origin/main claimed the lower numbers); event metadata enriched with `project` / `project_name` / `chat_title`. - Recall queries normalized to single-keyword / explicit-OR ASCII (≤100 chars); shared normalizer export reused by per-turn recall. ### 2. Per-task executor transcript capture (RUFU-122) Finished or failed tasks upload their executor transcript (`agent-log.jsonl`) to Stash as a task session. ### 3. Bulk archive Stash sync (RUFU-125) Archived task-planner chats soft-delete their Stash sessions on bulk archival (paged). The snapshot of doomed session ids is taken *before* the local bulk delete, and the Stash sync runs fire-and-forget so a Stash stall can never delay local archival. ### 4. Per-chat "Preserve to Stash" backfill (RUFU-136) A per-chat action that backfills a chat's full history into Stash, with client-side idempotency and a pre-check that skips already-uploaded content (fail-closed, no duplicate upload on transport failure). - **Session-folder naming fix:** the first project folder is now named "Fusion — <project name>" instead of the bare "Fusion" fallback (the backfill now resolves the central-registry project name, best-effort, never blocking the upload). ### 5. Opt-in semantic (vector) recall (RUFU-126) `stashVectorSearch` setting (default `false` — **zero behavior change until enabled**). For multi-word queries the backend tries Stash's semantic-search endpoint first, then falls back byte-identically to the keyword path. Definitive 404/405/501/503 responses are negatively cached per process. Requires a patched Stash server (new endpoint + `sentence-transformers` + embedding backfill); unpatched servers are transparently bypassed after the first 404. ## Safety - **Opt-in / inert by default:** the default backend remains `qmd`; the Stash backend is inert until `memoryBackendType=stash` + `stashUrl` are set. - All Stash I/O is **best-effort, fail-closed, and non-blocking** — a Stash outage never blocks chat, task completion, or archival. No run-audit content is emitted. ## Testing - Backfill + delete-sync suites (20/20), Stash backend suite (68/68), executor memory / session capture suites, `memory-focus-recalling`, description-guard — all green. - `tsc` clean across core / engine / dashboard. - Live verification: bulk backfill of 21/24 chats completed; the "Preserve to Stash" action is idempotent on re-run. ## Changesets - `@runfusion/fusion` **minor** — Stash memory backend + capture (RUFU-068/121), per-task transcript (RUFU-122), bulk archive sync (RUFU-125), per-chat backfill (RUFU-136), opt-in vector search (RUFU-126) - `@runfusion/fusion` **patch** — backfill session-folder naming fix ## Rebase Note (2026-08-23) Rebased onto `origin/main` `3f448f7292` (v0.77.0-beta.7). Conflicts resolved additively: - `packages/core/src/postgres/schema-applier.ts` + test — upstream's 0062-0065 migrations (task/subtask splitting removal, AI merge review reconciliation, task repository scope, FN-149 review convergence) unioned with this PR's `chat_sessions.memory_focus` migration, which is **renumbered 0065 → 0066** (upstream's FN-149 shipped 0065 canonically on origin/main); `SCHEMA_BASELINE_VERSION` advances to `0066`. - `packages/dashboard/app/components/ChatView.tsx` — upstream's docked chat sidebar resize handlers unioned with the RUFU-136 "Preserve to Stash" backfill handler. - New commit: `settings.memory.*` stash-backend i18n keys added to all 6 secondary locales (RUFU-121/122 parity fix; `pnpm i18n:status` no longer reports any violation introduced by this PR). **Deploy note (operator environments that already ran a pre-rebase build of this PR):** the memory-focus SQL may already be in the schema under ledger row `0065`. Remap that row to `0066` (`UPDATE fusion_schema_migrations SET version = '0066' WHERE version = '0065';`) *before* first boot of a 0066-ceiling binary — otherwise the fresh upstream `0065_fn_149_review_convergence_stage.sql` would be skipped as "already applied". Clean databases (no prior memory-focus row) need no action. **CI note — Lint (lifecycle-column census) is red on the merge base:** `pnpm check:lifecycle-columns --strict` fails identically on pure `origin/main` `3f448f7292` with `packages/core/src/db/legacy-adoption.ts: 0 -> 3` (3 column guards in the U9b legacy-adoption table without a baseline entry or `DELIBERATE-LITERAL` marker). Verified by running the census on a clean origin/main checkout — inherited from the base, not introduced by this PR. Fix belongs upstream; tracked separately. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added Stash memory integration with project configuration and optional semantic search. * Added per-chat memory focus controls and a `/focus` command. * Added “Preserve to Stash” for uploading complete chat history. * Added automatic chat, task transcript, and completion-event capture. * Added project-specific Stash session folders and archive/delete synchronization. * **Bug Fixes** * Improved Stash folder naming and handling of missing branches during no-commit tasks. * **Documentation** * Added setup, configuration, integration, vector-search, and performance guidance. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Fusion <noreply@runfusion.ai> Co-authored-by: gsxdsm <gsxdsm@users.noreply.github.com> |
||
|
|
9d1bd393d8 |
FN-9202: Unify dashboard banner styling
Standardize dashboard notices on a shared, token-driven banner shell. - Add a reusable Banner primitive with consistent tones, layouts, actions, and dismissal behavior. - Migrate dashboard notification banners away from bespoke shells and left accent borders. - Document and test banner styling invariants, including token-only CSS lengths and colors. - Add a patch changeset for the published dashboard bundle. Files changed: .changeset/fn-9202-banner-style-unification.md | 7 ++ docs/dashboard-guide.md | 4 + .../app/__tests__/banner-style-consistency.test.ts | 25 ++++ .../app/components/ApprovalNotificationBanner.css | 10 -- .../app/components/ApprovalNotificationBanner.tsx | 5 +- packages/dashboard/app/components/Banner.css | 81 ++++++++++++ packages/dashboard/app/components/Banner.tsx | 78 ++++++++++++ .../app/components/CapacityRiskBanner.css | 50 +------- .../app/components/CapacityRiskBanner.tsx | 39 +++--- .../app/components/CliBinaryInstallBanner.css | 126 ++----------------- .../app/components/CliBinaryInstallBanner.tsx | 14 +-- .../app/components/DbCorruptionBanner.css | 18 +-- .../app/components/DbCorruptionBanner.tsx | 5 +- .../app/components/EngineStatusBanner.css | 94 ++------------ .../app/components/EngineStatusBanner.tsx | 48 +++---- .../app/components/EngineUnavailableBanner.css | 42 +------ .../app/components/EngineUnavailableBanner.tsx | 21 ++-- .../app/components/MergeAdvanceNotice.css | 129 +++---------------- .../app/components/MergeAdvanceNotice.tsx | 36 +++--- .../app/components/MigrationInProgressBanner.css | 25 ---- .../app/components/MigrationInProgressBanner.tsx | 19 +-- .../app/components/OAuthReloginBanner.css | 53 +------- .../app/components/OAuthReloginBanner.tsx | 26 +--- .../app/components/SessionNotificationBanner.css | 16 +-- .../app/components/SessionNotificationBanner.tsx | 5 +- .../app/components/SetupWarningBanner.css | 106 +--------------- .../app/components/SetupWarningBanner.tsx | 31 +---- .../app/components/SqliteMigrationBanner.css | 40 +----- .../app/components/SqliteMigrationBanner.tsx | 33 ++--- .../app/components/TaskIdIntegrityBanner.css | 18 +-- .../app/components/TaskIdIntegrityBanner.tsx | 5 +- .../dashboard/app/components/TestModeBanner.css | 18 --- .../dashboard/app/components/TestModeBanner.tsx | 12 +- .../app/components/UpdateAvailableBanner.css | 139 +++------------------ .../app/components/UpdateAvailableBanner.tsx | 22 ++-- .../app/components/__tests__/Banner.test.tsx | 48 +++++++ 36 files changed, 450 insertions(+), 998 deletions(-) Fusion-Task-Id: FN-9202 Fusion-Task-Lineage: 14762201-55e5-4124-a897-9667c3a1ab84 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
4475342145 |
docs: record a first-sighting PG setup-hook flake in the observed register
`handoff-to-review-atomicity.pg.test.ts` aborted its `beforeAll` at the 15s budget on the first `pnpm test:gate` of a session; not reproduced in 8 later runs across three shapes (gate x2, pg-gate x3, isolated x3). Same mode as entries 6 and 7, but narrower: it happened under the capped four-fork lane with two selected files, so fork oversubscription does not explain it. Recorded the cold-cluster correlation as a hypothesis rather than a finding — reproducing it means stopping the embedded cluster, and this host runs a live Fusion instance. Discloses that the failing run's full output was lost to a tail pipe, and that inline quarantine was unavailable regardless (quarantinedCoreTests must stay empty); eviction of a transactional-invariant gate file is owner-escalated. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
39812f4898 |
test: quarantine one suite-only flake, record another, fix the lockstep guard
Full engine suite at
|
||
|
|
3d37cfa7db |
FN-9201: Prevent mobile nav lift when the iOS keyboard opens
Keep mobile bottom chrome pinned or hidden during keyboard focus transitions, including landscape phone layouts. - track keyboard-focus intent before visual viewport metrics settle - clamp focused iOS viewport offsets so fixed bars remain behind the keyboard - cover runtime bootstrap, landscape integration, nav, focus, and offset behavior - document the mobile keyboard layout contract and add a patch changeset Files changed: .changeset/fn-9201-mobile-nav-keyboard-lift.md | 7 ++ docs/dashboard-guide.md | 4 +- packages/dashboard/app/App.tsx | 43 ++++++++-- ...ile-nav-keyboard-landscape.integration.test.tsx | 91 ++++++++++++++++++++ .../__tests__/icb-inline-script.runtime.test.ts | 74 ++++++++++++++++ .../mobile-bottom-bars-keyboard-layout.test.ts | 15 +++- .../viewport-compensation-keyboard.test.ts | 5 +- .../__tests__/MobileNavBar.keyboard-lift.test.tsx | 65 ++++++++++++++ .../__tests__/useKeyboardFocusPending.test.tsx | 99 ++++++++++++++++++++++ .../dashboard/app/hooks/useKeyboardFocusPending.ts | 43 ++++++++++ packages/dashboard/app/index.html | 12 ++- .../utils/__tests__/mobileBarKeyboardFlags.test.ts | 22 +++++ .../app/utils/__tests__/viewportOffset.test.ts | 32 +++++++ .../dashboard/app/utils/mobileBarKeyboardFlags.ts | 10 ++- packages/dashboard/app/utils/viewportOffset.ts | 8 ++ 15 files changed, 510 insertions(+), 20 deletions(-) Fusion-Task-Id: FN-9201 Fusion-Task-Lineage: 4b3b01d3-8968-432b-9537-a63ee6bbde31 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
324145c1e1 |
test: repair engine fixtures that predate shipped product guards
The engine suite's failures are not independent bugs; they are a handful of systemic drifts where a guard shipped and its fixtures were never updated. - Required pre-merge gates (FN-158): the door refuses a card whose enabled optional groups produced no result, and the built-in workflow enables Plan and Code Review by default. Merge-mechanics fixtures now declare an explicit empty list, stating the intent they always had. group-merge-coordinator's "post-Code-Review member" instead gets real PASSING workflowStepResults, because recording the pass is what that fixture actually means. - Branch-write provenance: the shared reliability fixture creates a task with a branch, which now requires an explicit origin. It stands in for an engine-created branch, so it says so. - updateTaskAtomic: a production write seam missing from several fake stores, copied from the faithful fake in merger-ai.test.ts. - Durable-write inventory: eight unclassified TaskStore surfaces classified, including the two batched reads this branch added. - workflow-graph-merge-region-collapse asserted completion-summary AFTER code-review; the IR wires it before, and production logs agree. merger-ai.test.ts alone goes 37 -> 0. Engine failures 288 -> ~200. Also records a first-sighting suite-only flake in the observed register per the standing rule, rather than quarantining a file with substantial coverage. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
52d124bde2 |
FN-9195: Keep the chat composer visible above iOS keyboards
Keep Chat input reachable across software-keyboard viewport changes. - Track visual viewport changes across phones, tablets, compact docks, and narrow floating Chat hosts. - Clamp thread height using the measured host offset while preserving iOS focus behavior. - Add regression coverage, shared viewport test helpers, operator documentation, and a patch changeset. Files changed: .changeset/fn-9195-chat-ios-keyboard-composer.md | 7 + docs/dashboard-guide.md | 2 +- packages/dashboard/app/components/ChatView.css | 44 +-- packages/dashboard/app/components/ChatView.tsx | 43 ++- .../__tests__/ChatView.ios-keyboard.test.tsx | 335 +++++++++++++++++++++ .../components/__tests__/ChatView.test-harness.tsx | 103 ++++++- 6 files changed, 506 insertions(+), 28 deletions(-) Fusion-Task-Id: FN-9195 Fusion-Task-Lineage: cdada0cc-af6c-4cf8-8ffd-0940d280b07a Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
3857e0dc14 |
FN-9198: Fix narrow chat switcher dropdown rendering
Anchor the direct-conversation switcher to the visible thread header across narrow Chat surfaces. - position narrow-host switcher menus relative to the thread header - cover mobile, compact dock, floating, desktop, and empty-menu states - add the shared 2px spacing token and document the corrected behavior - add a patch changeset for the published Fusion package Files changed: .../fn-9198-chat-title-switcher-menu-anchor.md | 7 + docs/dashboard-guide.md | 2 +- .../app/components/ChatThreadTitleSwitcher.css | 11 +- .../__tests__/ChatView.title-switcher.test.tsx | 144 ++++++++++++++++++++- packages/dashboard/app/styles.css | 2 + 5 files changed, 160 insertions(+), 6 deletions(-) Fusion-Task-Id: FN-9198 Fusion-Task-Lineage: 9a1132d2-9b1a-4150-918a-085b42b22e02 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
1e805ee872 |
FN-177: fix empty thinking trace sections
Make chat and transcript thinking traces readable when providers emit headings without body content. - Inline body-less headings instead of rendering empty accordion sections. - Add raw trace and section controls with localized labels across chat surfaces. - Update styling, documentation, locale resources, and regression coverage. Files changed: .changeset/fn-177-thinking-trace-empty-sections.md | 7 ++ docs/dashboard-guide.md | 2 +- .../app/components/StandardChatSurface.tsx | 2 +- packages/dashboard/app/components/TaskChatTab.tsx | 2 +- .../dashboard/app/components/ThinkingTrace.css | 5 +- .../dashboard/app/components/ThinkingTrace.tsx | 74 ++++++++--- .../app/components/WorkflowResultsTab.tsx | 2 +- .../MilestoneSliceInterviewModal.test.tsx | 22 +++ .../__tests__/MissionInterviewModal.test.tsx | 14 ++ .../PlanningModeModal.planning-flow.test.tsx | 26 +++ .../app/components/__tests__/TaskChatTab.test.tsx | 19 +++ .../__tests__/ThinkingTrace.host-inventory.test.ts | 42 +++++ .../__tests__/ThinkingTrace.surfaces.test.tsx | 96 +++++++++++++- .../components/__tests__/ThinkingTrace.test.tsx | 136 ++++++++++++++------- .../components/__tests__/WorkflowResultsTab.test.tsx | 9 ++ packages/dashboard/app/test/cssFixture.ts | 8 ++ packages/i18n/locales/en/app.json | 2 + packages/i18n/locales/es/app.json | 4 +- packages/i18n/locales/fr/app.json | 4 +- packages/i18n/locales/ko/app.json | 4 +- packages/i18n/locales/pt-BR/app.json | 4 +- packages/i18n/locales/zh-CN/app.json | 4 +- packages/i18n/locales/zh-TW/app.json | 4 +- packages/i18n/src/resources.d.ts | 2 + 24 files changed, 415 insertions(+), 79 deletions(-) Fusion-Task-Id: FN-177 Fusion-Task-Lineage: 5fa5a228-339c-4e7b-8b0e-f2eb4fdcacce Co-authored-by: Fusion <noreply@runfusion.ai> |