Fusion Agent
b1893a63af
FN-043: add canonical thinking levels for custom providers
...
Custom-provider models now expose the full thinking-level selector and faithfully transmit the selected effort.
- Register all canonical thinking levels and preserve provider-specific API dialects.
- Remove the redundant reasoning toggle and update provider status and settings documentation.
- Add dashboard, engine, and provider registration coverage for thinking-level behavior.
- Add a minor changeset for the published CLI package.
Files changed:
.../fn-043-custom-provider-thinking-levels.md | 7 ++
docs/settings-reference.md | 2 +
.../dashboard/app/api/settings/provider-status.ts | 1 -
.../app/components/CustomProviderForm.css | 5 +-
.../app/components/CustomProviderForm.tsx | 18 ++---
.../__tests__/CustomProviderForm.test.tsx | 35 ++++++---
...r-model-routes-custom-provider-thinking.test.ts | 91 ++++++++++++++++++++++
.../custom-provider-thinking-levels.test.ts | 49 ++++++++++++
.../custom-providers-openai-completions.test.ts | 2 +-
.../custom-providers-openai-responses.test.ts | 3 +-
.../src/__tests__/pi-create-fn-agent.test.ts | 31 +++++++-
.../src/__tests__/provider-registration.test.ts | 20 ++++-
.../engine/src/auth/custom-provider-registry.ts | 14 +++-
packages/engine/src/pi.ts | 9 ++-
14 files changed, 251 insertions(+), 36 deletions(-)
Fusion-Task-Id: FN-043
Fusion-Task-Lineage: fdd3308a-d5bd-4f54-911a-226c2b46a927
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:57:23 +00:00
Fusion Agent
a81c9b80d9
FN-036: make task title summarization project-controlled
...
Make generated task titles project-controlled while preserving useful summaries at any length.
- Add project-level title summarization settings and UI controls.
- Make summarization length-independent across task creation, planning, GitHub, and agent flows.
- Update localization, documentation, and regression coverage.
Files changed:
.../fn-036-systematic-title-summarization.md | 7 +
docs/settings-reference.md | 2 +-
docs/storage.md | 2 +-
docs/task-management.md | 4 +-
packages/core/src/__tests__/ai-summarize.test.ts | 34 ++--
.../__tests__/store-create-intake-column.test.ts | 186 +++++++++++++++++++++
packages/core/src/ai/ai-summarize.ts | 32 ++--
packages/core/src/task-store/task-creation.ts | 83 +++++++--
packages/core/src/types/settings/settings-scope.ts | 9 +-
packages/core/src/types/task/task-core.ts | 2 +-
.../dashboard/app/__tests__/api-projects.test.ts | 4 +-
.../app/__tests__/settings-sections.test.tsx | 2 +-
.../dashboard/app/api/planning/ai-summarize.ts | 2 +-
.../__tests__/SettingsModal.search.test.ts | 5 +-
.../search/__tests__/settings-search-index.test.ts | 2 +-
.../sections/ProjectModelsSection.search.ts | 4 +-
.../settings/sections/ProjectModelsSection.tsx | 11 +-
.../src/__tests__/github-tracking.test.ts | 12 +-
.../src/__tests__/routes-planning.test.ts | 28 +++-
.../dashboard/src/__tests__/routes-tasks.test.ts | 19 +++
packages/dashboard/src/github-tracking.ts | 9 +-
.../routes/register-ai-text-assistant-routes.ts | 7 +-
.../src/__tests__/agent-tools-delegation.test.ts | 1 +
.../src/__tests__/heartbeat-executor.test.ts | 1 -
packages/engine/src/__tests__/triage.test.ts | 7 +-
packages/engine/src/agent-tools.ts | 7 +-
packages/engine/src/triage.ts | 12 +-
packages/i18n/locales/en/app.json | 6 +-
packages/i18n/locales/pt-BR/app.json | 8 +-
packages/i18n/src/resources.d.ts | 6 +-
30 files changed, 418 insertions(+), 96 deletions(-)
Fusion-Task-Id: FN-036
Fusion-Task-Lineage: df603386-e63e-4be8-a8e5-bae9aa1d4a80
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:57:23 +00:00
Fusion Agent
06649a0288
FN-041: add chat message layout to Settings search
...
Make the conversation layout setting discoverable across Settings search presentations.
- Add the project-scoped chat message layout entry to the Appearance search index.
- Cover desktop, mobile, and embedded Settings search with regression tests.
- Add a patch changeset for the published Fusion package.
Files changed:
.changeset/fn-041-settings-search-chat-layout.md | 7 +++
.../__tests__/SettingsModal.general.test.tsx | 51 ++++++++++++++++++++++
.../settings/sections/AppearanceSection.search.ts | 15 +++++++
3 files changed, 73 insertions(+)
Fusion-Task-Id: FN-041
Fusion-Task-Lineage: 614cded0-a97a-4343-96f7-22eeb483a54b
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:57:23 +00:00
Fusion Agent
e80fef3fe0
FN-040: fix chat source-link integrity and contrast
...
Harden chat source links across streaming providers while improving new-tab behavior and visual contrast.
- Preserve source-link metadata through streamed delta and event bridges.
- Open chat source links safely in new tabs across desktop and mobile surfaces.
- Improve source-link contrast and add regression coverage plus user-facing guidance.
Files changed:
.changeset/fn-040-chat-source-links.md | 7 +++
docs/dashboard-guide.md | 3 +
.../ui-bugs/chat-streamed-source-link-integrity.md | 53 ++++++++++++++++
packages/dashboard/app/components/ChatView.css | 24 ++++++++
.../app/components/StandardChatSurface.tsx | 8 ++-
.../components/__tests__/ChatView.core.test.tsx | 38 ++++++++++++
.../components/__tests__/ChatView.mobile.test.tsx | 70 ++++++++++++++++++++--
.../__tests__/ChatView.sessions-rooms.test.tsx | 49 +++++++++++++++
...andardChatSurface.nativeStructureEmbed.test.tsx | 52 +++++++++++++++-
.../__tests__/TaskPlannerChatTab.test.tsx | 48 +++++++++++++++
.../engine/src/__tests__/streaming-delta.test.ts | 36 +++++++++++
packages/engine/src/execution/streaming-delta.ts | 17 +++++-
.../src/__tests__/event-bridge.test.ts | 30 +++++++++-
packages/pi-claude-cli/src/event-bridge.ts | 14 +++--
.../src/__tests__/event-bridge.test.ts | 42 +++++++++++++
.../fusion-plugin-acp-runtime/src/event-bridge.ts | 8 ++-
.../src/__tests__/provider.test.ts | 34 +++++++++++
.../src/acp/event-bridge.ts | 8 ++-
.../src/__tests__/event-bridge.test.ts | 28 +++++++++
.../src/event-bridge.ts | 14 +++--
.../src/__tests__/provider.test.ts | 34 +++++++++++
.../src/acp/event-bridge.ts | 8 ++-
.../src/__tests__/runtime-adapter.test.ts | 34 +++++++++++
.../src/acp/event-bridge.ts | 8 ++-
24 files changed, 642 insertions(+), 25 deletions(-)
Fusion-Task-Id: FN-040
Fusion-Task-Lineage: 364ad678-df3e-4fb2-b19c-29eb44d8a429
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:57:23 +00:00
Fusion Agent
bcc77c9608
FN-035: require automatic task recommendations
...
Require task recommendations to be explicitly enabled and consistently surfaced across execution and settings.
- Add the automatic task recommendations setting, persistence, validation, and localized UI copy.
- Gate executor recommendation prompts and completion-tool behavior on the setting.
- Update dashboard/API coverage, documentation, and regression tests.
Files changed:
.changeset/fn-035-required-task-recommendations.md | 7 +++
docs/dashboard-guide.md | 3 +-
docs/settings-reference.md | 2 +
.../postgres/settings-persistence.pg.test.ts | 18 +++++++
.../core/src/__tests__/settings-parity.test.ts | 3 ++
packages/core/src/config/settings-schema.ts | 2 +
packages/core/src/task-store/settings-ops.ts | 16 ++++--
packages/core/src/types/settings/settings-scope.ts | 8 +++
.../app/__tests__/settings-save-split.test.ts | 16 ++++++
.../__tests__/SettingsModal.general.test.tsx | 36 +++++++++++++
.../app/components/settings/section-keys.ts | 1 +
.../settings/sections/GeneralSection.search.ts | 10 ++++
.../settings/sections/GeneralSection.tsx | 15 +++++-
.../settings-default-descriptions.test.tsx | 2 +
.../register-settings-memory-worktrunk.test.ts | 28 ++++++++++
.../src/routes/register-settings-memory-routes.ts | 5 ++
...cutor-prompt-completion-recommendations.test.ts | 31 +++++++++++
.../executor-task-recommendations.test.ts | 61 ++++++++++++++++++++--
.../engine/src/executor/create-task-done-tool.ts | 18 +++++--
packages/engine/src/executor/system-prompt.ts | 20 +++++--
packages/i18n/locales/en/app.json | 3 ++
packages/i18n/locales/es/app.json | 3 ++
packages/i18n/locales/fr/app.json | 3 ++
packages/i18n/locales/ko/app.json | 3 ++
packages/i18n/locales/pt-BR/app.json | 5 +-
packages/i18n/locales/zh-CN/app.json | 3 ++
packages/i18n/locales/zh-TW/app.json | 3 ++
packages/i18n/src/resources.d.ts | 3 ++
28 files changed, 307 insertions(+), 21 deletions(-)
Fusion-Task-Id: FN-035
Fusion-Task-Lineage: 336d4d99-3105-43df-b82c-ca413b9c5892
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:57:23 +00:00
Fusion Agent
29f4de39c4
FN-038: prepare projects for Git during onboarding
...
Make project initialization and registration produce Git-ready projects consistently.\n\n- Centralize repository readiness and initialization behavior.\n- Update CLI onboarding and dashboard registration flows to use the Git-ready setup.\n- Add regression coverage and document the new project preparation behavior.\n\nFiles changed:\n .changeset/fn-038-git-ready-projects.md | 7 +\n docs/cli-reference.md | 11 +-\n docs/getting-started.md | 17 +-\n docs/workspaces.md | 4 +-\n packages/cli/src/commands/__tests__/init.test.ts | 39 ++--\n packages/cli/src/commands/init.ts | 115 ++--------\n packages/core/src/__tests__/git-repository.test.ts | 125 +++++++++-\n packages/core/src/central/central-core.ts | 57 +++--\n packages/core/src/git/git-repository.ts | 254 +++++++++++++++++----\n packages/dashboard/app/api/projects/projects.ts | 2 -\n packages/dashboard/app/components/SetupWizardModal.tsx | 46 +---\n packages/dashboard/app/components/__tests__/SetupWizardModal.git-missing.test.tsx | 74 +++---\n packages/dashboard/src/routes/__tests__/register-project-git-readiness.test.ts | 165 +++++++++++++\n packages/dashboard/src/routes/register-project-routes.ts | 11 -\n 14 files changed, 647 insertions(+), 280 deletions(-)
Fusion-Task-Id: FN-038
Fusion-Task-Lineage: 83634184-569b-4190-a88f-4a09eb832e9d
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:57:23 +00:00
Fusion Agent
aad4b73a47
FN-033: use default chat model for task chat
...
Task chat now uses the resolved project default while matching general chat controls and session behavior.
- Resolve the effective task-chat model and expose model/thinking selectors in the task chat composer.
- Persist per-session model and thinking overrides through scoped task-chat routes.
- Refresh task-chat UI, documentation, tests, and release metadata for the new behavior.
Files changed:
.changeset/fn-033-task-chat-default-model.md | 7 +
docs/agents.md | 4 +-
docs/dashboard-guide.md | 26 +--
packages/dashboard/app/api/chat/chat.ts | 26 +--
.../dashboard/app/components/TaskDetailModal.tsx | 4 +-
.../app/components/TaskPlannerChatTab.css | 38 ++-
.../app/components/TaskPlannerChatTab.tsx | 211 +++++++++++++++++----
.../__tests__/TaskDetailModal.test-helpers.ts | 2 +
.../components/__tests__/TaskDetailModal.test.tsx | 4 +-
.../__tests__/TaskPlannerChatTab.test.tsx | 149 +++++++++------
.../__tests__/effective-model-resolution.test.ts | 32 +++
.../app/components/effective-model-resolution.ts | 30 ++-
.../dashboard/src/__tests__/chat-manager.test.ts | 14 +-
.../routes-task-planner-chat-session.test.ts | 210 +++++++++++++++++++
.../dashboard/src/routes/register-chat-routes.ts | 116 +++++++----
15 files changed, 700 insertions(+), 173 deletions(-)
Fusion-Task-Id: FN-033
Fusion-Task-Lineage: 10cffb5e-1a38-47e1-9b29-cd3cb0b99b81
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:56:41 +00:00
Fusion Agent
5a0117a362
FN-031: add task reset lifecycle handling
...
Add durable task reset lifecycle support across core, dashboard, and engine integrations.
- Add reset lifecycle publication and disposal primitives with coverage.
- Expose reset lifecycle behavior through task workflow routes and dashboard task details.
- Update workflow intake, engine exports, and worktree integration documentation.
Files changed:
docs/dashboard-guide.md | 8 +
.../postgres/task-reset-publication.pg.test.ts | 99 +++++++
.../core/src/__tests__/task-move-disposer.test.ts | 52 +++
packages/core/src/index.gate.ts | 6 +
packages/core/src/index.ts | 6 +
packages/core/src/store.ts | 6 +
packages/core/src/task-store/reset-lifecycle.ts | 193 ++++++++++++++
packages/core/src/tasks/task-move-disposer.ts | 25 ++
.../dashboard/app/components/TaskDetailModal.tsx | 8 +-
.../components/__tests__/TaskDetailModal.test.tsx | 28 +-
.../__tests__/plan-approval-intake-column.test.ts | 80 ++----
.../src/__tests__/task-reset-lifecycle.test.ts | 171 +++++++++++++
.../src/routes/register-task-workflow-routes.ts | 285 ++++++++++-----------
packages/engine/src/index.ts | 10 +-
packages/engine/src/worktree/worktree-backend.ts | 1 +
15 files changed, 766 insertions(+), 212 deletions(-)
Fusion-Task-Id: FN-031
Fusion-Task-Lineage: 183bb709-485e-4069-bd2a-98f787b2bd73
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:39 +00:00
Fusion Agent
21b3baa62d
FN-029: unify direct and planner chat queues
...
Standardize queued-message controls across Direct Chat and planner conversations while preserving force-send ordering during cancellation reconciliation.
- Add shared pending-message queue UI with edit, reorder, delete, and force-send actions.
- Coordinate durable cancellation reconciliation before dispatching selected queued messages.
- Disable the Direct composer and related controls until force-send reconciliation completes.
- Add localized queue copy, documentation, styling, and regression coverage.
Files changed:
docs/dashboard-guide.md | 8 +
packages/dashboard/app/components/ChatView.css | 63 ------
packages/dashboard/app/components/ChatView.tsx | 55 +++--
packages/dashboard/app/components/PendingChatMessageQueue.css | 94 +++++++++
packages/dashboard/app/components/PendingChatMessageQueue.tsx | 200 ++++++++++++++++++
packages/dashboard/app/components/TaskPlannerChatTab.css | 84 --------
packages/dashboard/app/components/TaskPlannerChatTab.tsx | 113 ++---------
packages/dashboard/app/components/__tests__/ChatView.core-interactions.test.tsx | 24 ++-
packages/dashboard/app/components/__tests__/PendingChatMessageQueue.test.tsx | 76 +++++++
packages/dashboard/app/hooks/__tests__/useChat.test.ts | 39 +++
packages/dashboard/app/hooks/useChat.ts | 224 ++++++++++++++++-----
packages/i18n/locales/en/app.json | 25 +--
packages/i18n/locales/es/app.json | 25 +--
packages/i18n/locales/fr/app.json | 25 +--
packages/i18n/locales/ko/app.json | 25 +--
packages/i18n/locales/pt-BR/app.json | 25 +--
packages/i18n/locales/zh-CN/app.json | 25 +--
packages/i18n/locales/zh-TW/app.json | 25 +--
packages/i18n/src/resources.d.ts | 25 +--
19 files changed, 746 insertions(+), 434 deletions(-)
Fusion-Task-Id: FN-029
Fusion-Task-Lineage: 3330d0e7-ba77-4392-98f7-69425070cfd1
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:39 +00:00
Fusion Agent
c3ff663c1c
FN-030: route refinement tasks directly to planning
...
Route refinement and duplicate-task handling through the planning path while preserving task metadata and API behavior.\n\n- Route CLI refinement commands directly into planning.\n- Harden dependency updates and duplicate-task refinement persistence.\n- Expand PostgreSQL, CLI, and dashboard authorization coverage.\n- Document the refined task lifecycle and add the published-package changeset.\n\nFiles changed:\n .changeset/fn-030-refinement-planning-route.md | 7 ++\n docs/architecture.md | 20 ++--\n docs/task-management.md | 11 +-\n packages/cli/src/commands/__tests__/task.test.ts | 9 +-\n packages/cli/src/commands/task.ts | 2 +-\n .../postgres/refine-duplicate-task.pg.test.ts | 130 +++++++++++++++++++++\n .../__tests__/postgres/store-comments.pg.test.ts | 32 +++++\n packages/core/src/task-store/update-task-deps.ts | 17 +--\n packages/dashboard/app/__tests__/api-auth.test.ts | 5 +-\n 9 files changed, 207 insertions(+), 26 deletions(-)
Fusion-Task-Id: FN-030
Fusion-Task-Lineage: 885c0a9f-d8bf-4abf-9ec9-dca5a01648e8
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:39 +00:00
Fusion Agent
9cff3d26ee
FN-028: preserve interrupted chat context
...
Preserve streamed chat prefixes and durable context when users stop generation.
- Persist interrupted assistant text in the reopened model session and chat history.
- Keep optimistic prefixes visible when cancellation persistence is incomplete.
- Add cancellation coverage, documentation, and a patch changeset.
Files changed:
.changeset/fn-028-chat-interrupted-context.md | 7 ++
docs/dashboard-guide.md | 2 +
.../app/components/TaskPlannerChatTab.tsx | 11 +-
.../dashboard/app/hooks/__tests__/useChat.test.ts | 28 +++++
packages/dashboard/app/hooks/chatTypes.ts | 5 +
packages/dashboard/app/hooks/useChat.ts | 14 ++-
.../__tests__/chat-manager-rewind-session.test.ts | 65 +++++++++++-
.../dashboard/src/__tests__/chat-manager.test.ts | 1 +
.../src/__tests__/routes-chat-cancellation.test.ts | 113 +++++++++++++++++++++
packages/dashboard/src/chat.ts | 72 +++++++++++--
10 files changed, 305 insertions(+), 13 deletions(-)
Fusion-Task-Id: FN-028
Fusion-Task-Lineage: d26c55a8-1b1f-42cc-89f8-cd39f3ff8ea5
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:39 +00:00
Fusion Agent
519180b9e2
FN-026: fix chat editing and conversation rewind
...
Make edited chat messages replace their prior turns while rewinding conversation state consistently across the dashboard and API.\n\n- Add message-edit and rewind-session server routes and persistence behavior.\n- Update chat hooks, planner UI, and legacy streaming compatibility for replacement edits.\n- Add regression coverage and document the editing and rewind behavior.\n\nFiles changed:\n .changeset/fn-026-chat-message-edit-replacement.md | 7 +\n docs/dashboard-guide.md | 8 +\n .../app/api/__tests__/legacy-chat-stream.test.ts | 23 +++\n packages/dashboard/app/api/chat/chat.ts | 42 ++---\n packages/dashboard/app/api/legacy.ts | 2 +-\n packages/dashboard/app/components/TaskPlannerChatTab.tsx | 101 +++++++----\n .../__tests__/TaskPlannerChatTab.test.tsx | 81 +++++----\n packages/dashboard/app/hooks/__tests__/useChat.resync.test.ts | 1 -\n packages/dashboard/app/hooks/__tests__/useChat.test.ts | 45 +++--\n packages/dashboard/app/hooks/useChat.ts | 108 ++++++------\n .../__tests__/chat-manager-rewind-session.test.ts | 49 ++++++\n .../src/__tests__/routes-chat-message-edit.test.ts | 195 +++++++++++++++++++++\n packages/dashboard/src/chat.ts | 106 ++++++++++-\n .../dashboard/src/routes/register-chat-routes.ts | 150 ++++++----------\n 14 files changed, 660 insertions(+), 258 deletions(-)
Fusion-Task-Id: FN-026
Fusion-Task-Lineage: ea69be74-def9-4c68-ac13-c1b51b8b5f69
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:39 +00:00
Fusion Agent
df5c580a50
FN-024: cap and resize chat composers
...
Keep chat drafts compact by default while allowing intentional desktop resizing.
- Autosize Chat, Rooms, Activity, and Planner Chat composers through five lines.
- Cap overflow with internal scrolling and provide desktop/tablet-only manual resize behavior.
- Reset transient composer sizing on draft and target lifecycle changes, with regression coverage and operator documentation.
- Preserve shared terminal session documentation, including detach, end, and reopen behavior.
Files changed:
.changeset/fn-024-chat-composer-height.md | 7 +
docs/dashboard-guide.md | 3 +
packages/dashboard/app/components/ChatView.css | 28 ++-
packages/dashboard/app/components/ChatView.tsx | 65 +++----
packages/dashboard/app/components/TaskChatTab.css | 9 +-
packages/dashboard/app/components/TaskChatTab.tsx | 32 ++--
packages/dashboard/app/components/TaskPlannerChatTab.css | 11 +-
packages/dashboard/app/components/TaskPlannerChatTab.tsx | 27 ++-
packages/dashboard/app/components/__tests__/ChatView.autosize.test.tsx | 64 +++++--
packages/dashboard/app/components/__tests__/ChatView.chat-input-autosize.test.tsx | 148 ++++++++++------
packages/dashboard/app/components/__tests__/TaskChatTab.test.tsx | 34 ++++
packages/dashboard/app/components/__tests__/TaskPlannerChatTab.test.tsx | 41 ++++-
packages/dashboard/app/utils/chatInputAutosize.ts | 192 +++++++++++++++++++--
13 files changed, 516 insertions(+), 145 deletions(-)
Fusion-Task-Id: FN-024
Fusion-Task-Lineage: 663b9f18-87ac-467b-b67c-6d2e27f34ba4
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:39 +00:00
Fusion Agent
5fe1c8e379
FN-025: preserve user-controlled chat disclosures
...
Keep thinking and tool disclosure state under operator control across chat surfaces.\n\n- Start new thinking and tool groups collapsed instead of auto-opening during streaming.\n- Preserve disclosure state across streaming updates and reattached planner sessions.\n- Allow non-interactive disclosure content to dismiss expanded blocks while preserving interactive descendants.\n- Add desktop and mobile regression coverage for chat, task activity, and planner views.\n\nFiles changed:\n .../app/components/StandardChatSurface.tsx | 33 +++++++++++--\n packages/dashboard/app/components/TaskChatTab.tsx | 19 ++++++--\n .../__tests__/ChatView.core-interactions.test.tsx | 23 +++++++--\n .../components/__tests__/ChatView.core.test.tsx | 55 +++++++++++++++++++++-\n .../app/components/__tests__/TaskChatTab.test.tsx | 36 +++++++++-----\n .../__tests__/TaskPlannerChatTab.test.tsx | 49 ++++++++++++++++++-\n 6 files changed, 186 insertions(+), 29 deletions(-)
Fusion-Task-Id: FN-025
Fusion-Task-Lineage: 294eadc8-d8fe-48da-8a1e-96aed559e54d
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
b88bb1d532
FN-023: respect disabled built-in workflows
...
Make disabled built-in workflows unavailable for new selections while preserving existing task resolution.
- Validate enabled built-in workflow settings atomically and require a valid available option.
- Resolve defaults and origin pins through the effective enabled workflow set.
- Filter dashboard selectors while retaining management and direct-resolution paths.
- Add core and dashboard regression coverage plus operator-facing documentation.
Files changed:
.changeset/fn-023-disabled-builtin-workflows.md | 7 +++
docs/dashboard-guide.md | 5 +-
docs/workflow-steps.md | 6 +-
packages/core/src/__tests__/builtin-workflows.test.ts | 35 +++++++++--
packages/core/src/index.ts | 6 ++
packages/core/src/task-store/moves.ts | 17 +++--
packages/core/src/task-store/settings-ops.ts | 22 +++++++
packages/core/src/task-store/task-store-helpers.ts | 33 +++++++++-
packages/core/src/workflows/builtin-workflows.ts | 70 +++++++++++++++++++--
packages/dashboard/app/__tests__/workflow-selection-cross-surface.test.tsx | 45 ++++++++++++++
packages/dashboard/app/api/projects/board-workflows.ts | 2 +
packages/dashboard/app/components/__tests__/Board.test.tsx | 22 +++++++
packages/dashboard/app/components/__tests__/ListView.test.tsx | 38 ++++++++++++
packages/dashboard/app/components/settings/sections/GeneralSection.tsx | 19 +++++-
packages/dashboard/app/components/settings/sections/__tests__/GeneralSection.builtin-workflows.test.tsx | 72 ++++++++++++++++++++++
packages/dashboard/app/hooks/__tests__/useBoardWorkflows.test.ts | 20 ++++++
packages/dashboard/app/hooks/useBoardWorkflows.ts | 18 ++++--
packages/dashboard/src/__tests__/board-workflows.test.ts | 35 +++++++++--
packages/dashboard/src/routes/__tests__/register-settings-memory-worktrunk.test.ts | 37 +++++++++++
packages/dashboard/src/routes/board-workflows.ts | 41 +++++++++---
packages/dashboard/src/routes/register-settings-memory-routes.ts | 46 +++++++++++++-
21 files changed, 553 insertions(+), 43 deletions(-)
Fusion-Task-Id: FN-023
Fusion-Task-Lineage: 1043fc42-2a02-49dd-b695-d9ae3af60e90
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
612195fde6
FN-022: add workflow selection and start action
...
Add workflow-aware task creation controls and a guarded Start action for quick task intake.
- Add workflow selection and resolved board metadata loading to New Task modal.
- Support starting eligible tasks in their workflow destination with clear success or partial-failure feedback.
- Wire move-task handling through modal callers and cover workflow/start behavior with tests and documentation.
Files changed:
.changeset/fn-022-new-task-workflow-start.md | 7 +
docs/dashboard-guide.md | 4 +-
packages/dashboard/app/components/AppModals.tsx | 1 +
packages/dashboard/app/components/NewTaskModal.tsx | 158 +++++++++++++++--
.../dashboard/app/components/QuickEntryBox.tsx | 5 +-
packages/dashboard/app/components/TaskForm.tsx | 28 ++-
.../app/components/__tests__/AppModals.test.tsx | 33 +++-
.../app/components/__tests__/NewTaskModal.test.tsx | 192 ++++++++++++++++++++-
.../app/utils/__tests__/quickAddStart.test.ts | 16 +-
packages/dashboard/app/utils/quickAddStart.ts | 15 ++
10 files changed, 441 insertions(+), 18 deletions(-)
Fusion-Task-Id: FN-022
Fusion-Task-Lineage: ce794b44-3c31-4bfc-a259-ecfd78531be1
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
4d7e7dba4c
FN-021: expose model-supported thinking levels, including max
...
Expose thinking-level options from model capabilities through API, workflows, and dashboard controls.
- Add model-supported thinking-level metadata, including max, across core and model routes.
- Propagate capability-aware levels through planning, agent creation, and chat/task UI.
- Update localized labels, documentation, tests, dependencies, and add a release changeset.
Files changed:
.changeset/fn-021-thinking-levels.md | 7 ++++
docs/settings-reference.md | 8 +++-
docs/workflow-steps.md | 8 ++--
packages/core/src/__tests__/openai-models.test.ts | 1 +
.../core/src/__tests__/thinking-levels.test.ts | 4 +-
packages/core/src/__tests__/workflow-ir.test.ts | 2 +-
packages/core/src/ai/openai-models.ts | 5 ++-
packages/core/src/types/board/board.ts | 8 ++--
.../app/api/agents/agent-import-generation.ts | 4 +-
.../dashboard/app/api/planning/models-usage.ts | 13 +++++++
packages/dashboard/app/api/planning/planning.ts | 5 ++-
.../dashboard/app/components/AgentDetailView.tsx | 2 +-
.../app/components/ChatThinkingLevelControl.tsx | 28 +++++++++++---
.../app/components/CustomModelDropdown.tsx | 29 ++++++++++----
packages/dashboard/app/components/NewTaskModal.tsx | 4 +-
.../dashboard/app/components/TaskDetailModal.tsx | 4 +-
.../__tests__/AgentDetailView.test-helpers.ts | 2 +-
.../__tests__/AgentOnboardingModal.test.tsx | 2 +-
.../__tests__/ChatThinkingLevelControl.test.tsx | 27 ++++++++++++-
.../__tests__/CustomModelDropdown.test.tsx | 33 +++++++++++++++-
.../__tests__/ModelSelectionModal.test.tsx | 3 +-
.../components/__tests__/NewAgentDialog.test.tsx | 2 +
.../components/__tests__/QuickEntryBox.test.tsx | 3 +-
.../components/agent-presets/agentCreatePayload.ts | 3 +-
.../settings/sections/GlobalModelsSection.tsx | 8 ++--
packages/dashboard/package.json | 2 +-
.../dashboard/src/__tests__/chat-manager.test.ts | 8 ++--
packages/dashboard/src/__tests__/chat.test.ts | 2 +-
...-model-routes-openai-codex-supplemental.test.ts | 44 +++++++++++++++++++++-
.../src/__tests__/routes-automation.test.ts | 4 +-
.../dashboard/src/__tests__/routes-tasks.test.ts | 8 ++--
packages/dashboard/src/agent-generation.ts | 9 +++--
packages/dashboard/src/agent-onboarding.ts | 8 ++--
packages/dashboard/src/routes.ts | 14 ++++++-
.../src/routes/register-chat-room-routes.ts | 2 +-
.../dashboard/src/routes/register-model-routes.ts | 43 ++++++++++++++++-----
packages/i18n/locales/en/app.json | 1 +
packages/i18n/locales/es/app.json | 1 +
packages/i18n/locales/fr/app.json | 1 +
packages/i18n/locales/ko/app.json | 1 +
packages/i18n/locales/pt-BR/app.json | 1 +
packages/i18n/locales/zh-CN/app.json | 1 +
packages/i18n/locales/zh-TW/app.json | 1 +
packages/i18n/src/resources.d.ts | 1 +
pnpm-lock.yaml | 6 +--
45 files changed, 289 insertions(+), 84 deletions(-)
Fusion-Task-Id: FN-021
Fusion-Task-Lineage: af1b0e09-6375-4f0c-9501-66a10c8b9168
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
2fe3382279
FN-020: add queued Planner Chat message management
...
Add browser-local queued follow-up management to Planner Chat while preserving ordered, session-scoped dispatch.
- Queue follow-up messages during active responses and dispatch them FIFO after completion or Stop reconciliation.
- Add editing, reordering, deletion, duplicate-safe force-send, persistence, responsive styling, documentation, translations, and regression coverage.
Files changed:
docs/dashboard-guide.md | 2 +
.../app/components/TaskPlannerChatTab.css | 84 ++++++
.../app/components/TaskPlannerChatTab.tsx | 301 ++++++++++++++++++---
.../__tests__/TaskPlannerChatTab.test.tsx | 216 +++++++++++++++
packages/i18n/locales/en/app.json | 13 +
packages/i18n/locales/es/app.json | 13 +
packages/i18n/locales/fr/app.json | 13 +
packages/i18n/locales/ko/app.json | 13 +
packages/i18n/locales/pt-BR/app.json | 13 +
packages/i18n/locales/zh-CN/app.json | 13 +
packages/i18n/locales/zh-TW/app.json | 13 +
packages/i18n/src/resources.d.ts | 13 +
12 files changed, 673 insertions(+), 34 deletions(-)
Fusion-Task-Id: FN-020
Fusion-Task-Lineage: 5627cdbd-00dd-4e17-a4bd-53d49efa836d
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
b17c6de32b
FN-019: recognize custom providers and refresh model catalogs
...
Add support for custom AI providers and refresh the built-in model catalog from settings.
- Recognize custom provider configuration in provider status and onboarding readiness.
- Add bounded model-catalog refresh endpoints and settings controls with localized copy.
- Cover provider discovery, cache refresh, routes, and authentication UI behavior with tests.
Files changed:
.changeset/fn-019-provider-catalog.md | 7 ++
docs/dashboard-guide.md | 6 ++
.../dashboard/app/__tests__/api-models.test.ts | 29 +++++++++
.../dashboard/app/api/settings/provider-status.ts | 15 +++++
...thenticationSection.modelsCacheRefresh.test.tsx | 46 +++++++++++++-
.../__tests__/AuthenticationSection.test.tsx | 10 +++
.../settings/sections/AuthenticationSection.css | 20 ++++++
.../settings/sections/AuthenticationSection.tsx | 37 ++++++++++-
.../app/hooks/__tests__/useAuthOnboarding.test.ts | 29 +++++++++
.../app/hooks/__tests__/useSetupReadiness.test.ts | 14 ++++
packages/dashboard/app/hooks/useAuthOnboarding.ts | 9 +--
packages/dashboard/app/hooks/useSetupReadiness.ts | 8 ++-
.../register-model-routes-refresh-bounding.test.ts | 74 ++++++++++++++++++++++
.../dashboard/src/__tests__/routes-auth.test.ts | 18 ++++++
.../dashboard/src/routes/register-auth-routes.ts | 17 ++++-
.../dashboard/src/routes/register-model-routes.ts | 22 ++++++-
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 ++
24 files changed, 397 insertions(+), 12 deletions(-)
Fusion-Task-Id: FN-019
Fusion-Task-Lineage: 1e9daf0e-8aa8-4205-9fc7-686fbdd5bd35
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
d80367fa30
FN-018: fix KnowledgeGraphPanel hop typing
...
Normalize absent path hop counts for the typed graph path interpolation while preserving zero-hop results.
- Use undefined for non-found path hop counts to satisfy the typed interpolation contract.
- Add regression coverage that renders a found zero-hop path.
Files changed:
packages/dashboard/app/components/KnowledgeGraphPanel.tsx | 3 ++-
.../dashboard/app/components/__tests__/KnowledgeGraphPanel.test.tsx | 5 ++++-
2 files changed, 6 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-018
Fusion-Task-Lineage: 28254bbd-967b-463e-87de-8dfa847ca42d
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
0899d49e5c
FN-016: preserve interrupted chat responses
...
Persist partial assistant output when chat streaming is stopped so users can resume from an honest interrupted transcript.
- Snapshot streamed text, thinking, and tool calls before cancellation.
- Persist and reconcile interrupted responses for main chat and planner chat surfaces.
- Add cancellation routes, manager handling, changeset metadata, and desktop/mobile regression coverage.
Files changed:
.changeset/fn-016-chat-cancel-partial.md | 7 +
packages/dashboard/app/api/chat/chat.ts | 13 +-
.../app/components/TaskPlannerChatTab.tsx | 91 ++++++++-
.../__tests__/ChatView.streaming-thread.test.tsx | 54 ++++++
.../__tests__/TaskPlannerChatTab.test.tsx | 53 +++++-
.../dashboard/app/hooks/__tests__/useChat.test.ts | 84 ++++++++
packages/dashboard/app/hooks/useChat.ts | 131 +++++++++++--
.../dashboard/src/__tests__/chat-manager.test.ts | 80 ++++++--
packages/dashboard/src/chat.ts | 208 ++++++++++++++-----
.../dashboard/src/routes/register-chat-routes.ts | 7 +-
10 files changed, 641 insertions(+), 87 deletions(-)
Fusion-Task-Id: FN-016
Fusion-Task-Lineage: 3e14b9b7-967b-4f80-b941-2216bfa9c69e
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
6a28811d1a
FN-012: sort tasks in every board column
...
Add independent task ordering controls across all board lanes and keep archive pagination aligned with the selected order.
- Add arrival and task-ID sorting to every board column, including archived tasks.
- Thread bounded, server-backed archive sorting through the API, store, hook, and UI.
- Preserve selected archive order for subsequent pages and add localized labels, typings, tests, and dashboard documentation.
Files changed:
.changeset/fn-012-column-task-sorting.md | 7 ++
docs/dashboard-guide.md | 17 +--
.../postgres/archive-pagination.pg.test.ts | 19 ++++
packages/core/src/__tests__/task-priority.test.ts | 13 +++
packages/core/src/async-stores/async-archive-db.ts | 18 ++--
packages/core/src/index.gate.ts | 2 +
packages/core/src/index.ts | 2 +
packages/core/src/store.ts | 2 +-
.../core/src/task-store/archive-lifecycle-2.ts | 13 ++-
packages/core/src/tasks/task-priority.ts | 41 +++++---
packages/core/src/types.ts | 2 +-
packages/dashboard/app/App.tsx | 4 +-
packages/dashboard/app/api/tasks/tasks.ts | 3 +
packages/dashboard/app/components/Board.tsx | 62 +++++++---
packages/dashboard/app/components/Column.tsx | 54 ++++++----
.../app/components/__tests__/Board.test.tsx | 74 +++++++------
.../app/components/__tests__/Column.test.tsx | 8 +-
.../app/components/dashboard/MainContent.tsx | 6 ++
.../dashboard/app/components/dashboard/types.ts | 5 +
.../dashboard/app/hooks/__tests__/useTasks.test.ts | 61 ++++++++++-
packages/dashboard/app/hooks/useTasks.ts | 116 ++++++++++++++++-----
...task-workflow-routes.archive-pagination.test.ts | 78 ++++++++++++++
.../src/routes/register-task-workflow-routes.ts | 20 ++--
packages/i18n/locales/en/app.json | 5 +
packages/i18n/locales/es/app.json | 7 +-
packages/i18n/locales/fr/app.json | 7 +-
packages/i18n/locales/ko/app.json | 7 +-
packages/i18n/locales/pt-BR/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 +
31 files changed, 537 insertions(+), 142 deletions(-)
Fusion-Task-Id: FN-012
Fusion-Task-Lineage: 18dff987-18d5-401d-9fe0-290a71f12e15
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
3ae22c23d1
FN-011: add project chat message width preference
...
Add a project-scoped conversation layout preference and apply full-width rendering consistently across dashboard chat surfaces.
- Add bubbles/full-width project settings with localized Appearance controls.
- Apply the preference to Chat, Activity, Planner Chat, Quick Chat, and docked hosts with responsive safeguards.
- Add regression coverage, documentation, and the published-package changeset.
Files changed:
.changeset/fn-011-chat-message-layout.md | 7 ++++
docs/dashboard-guide.md | 4 ++
.../core/src/__tests__/settings-defaults.test.ts | 14 ++++++-
.../core/src/__tests__/settings-parity.test.ts | 4 ++
packages/core/src/config/settings-schema.ts | 5 +++
packages/core/src/types/settings/settings-scope.ts | 5 +++
packages/dashboard/app/App.tsx | 7 +++-
packages/dashboard/app/components/AppModals.tsx | 5 +++
packages/dashboard/app/components/ChatView.css | 23 +++++++++++
packages/dashboard/app/components/ChatView.tsx | 4 +-
.../dashboard/app/components/SettingsModal.tsx | 14 +++++++
packages/dashboard/app/components/TaskChatTab.css | 42 +++++++++++++++++++++
packages/dashboard/app/components/TaskChatTab.tsx | 4 +-
.../app/components/TaskPlannerChatTab.css | 22 +++++++++++
.../app/components/TaskPlannerChatTab.tsx | 4 +-
.../components/__tests__/ChatView.core.test.tsx | 34 +++++++++++++++++
.../__tests__/SettingsModal.general.test.tsx | 42 +++++++++++++++++++++
.../app/components/__tests__/TaskChatTab.test.tsx | 31 +++++++++++++++
.../__tests__/TaskPlannerChatTab.test.tsx | 32 ++++++++++++++++
.../settings/sections/AppearanceSection.tsx | 24 +++++++++++-
.../sections/__tests__/AppearanceSection.test.tsx | 22 ++++++++++-
.../app/context/ChatMessageLayoutContext.tsx | 16 ++++++++
.../app/hooks/__tests__/useAppSettings.test.ts | 44 ++++++++++++++++++++++
packages/dashboard/app/hooks/useAppSettings.ts | 29 ++++++++++++++
.../app/task-modal-touch-resize-e2e-fixture.tsx | 2 +-
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 | 4 ++
33 files changed, 471 insertions(+), 15 deletions(-)
Fusion-Task-Id: FN-011
Fusion-Task-Lineage: d858d00f-e05b-4dc2-8ddb-cfc5b9973871
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
d295202768
FN-013: establish i18n lint baseline and localize dashboard copy
...
Add a production i18n lint baseline while replacing dashboard copy with translation keys.
- Localize task, board, mailbox, report, graph, settings, and shared dashboard surfaces.
- Regenerate locale catalogs and resource types for the migration keys.
- Add the i18n lint-baseline regression test and contributor guidance.
Files changed:
.changeset/fn-013-i18n-lint-baseline.md | 7 +
docs/i18n-contributing.md | 11 +
.../dashboard/app/components/ActiveAgentsPanel.tsx | 2 +-
.../dashboard/app/components/AgentDetailView.tsx | 2 +-
packages/dashboard/app/components/Board.tsx | 19 +-
packages/dashboard/app/components/ChatView.tsx | 2 +-
.../dashboard/app/components/ComposeChatPanel.tsx | 14 +-
packages/dashboard/app/components/DockTaskList.tsx | 16 +-
.../dashboard/app/components/FloatingWindow.tsx | 6 +-
.../dashboard/app/components/GitHubImportModal.tsx | 4 +-
.../dashboard/app/components/KnowledgeGraphPanel.tsx | 21 +-
packages/dashboard/app/components/ListView.tsx | 2 +-
.../app/components/MailboxArtifactAttachment.tsx | 16 +-
packages/dashboard/app/components/MailboxModal.tsx | 12 +-
.../app/components/MailboxStructuralItem.tsx | 13 +-
.../app/components/MailboxTaskProposal.tsx | 10 +-
.../app/components/MailboxTaskRecommendations.tsx | 12 +-
packages/dashboard/app/components/MailboxView.tsx | 14 +-
packages/dashboard/app/components/MermaidDiagram.tsx | 4 +-
packages/dashboard/app/components/MeshTopology.tsx | 6 +-
.../dashboard/app/components/MessageComposer.tsx | 24 +-
.../app/components/NativeStructurePreview.tsx | 14 +-
packages/dashboard/app/components/ProviderLoginDialog.tsx | 24 +-
packages/dashboard/app/components/ReportActionMenu.tsx | 6 +-
packages/dashboard/app/components/ReportModal.tsx | 26 +-
packages/dashboard/app/components/TaskChatTab.tsx | 10 +-
packages/dashboard/app/components/TaskDetailModal.tsx | 28 +-
.../app/components/TaskVerificationStatus.tsx | 10 +-
.../dashboard/app/components/WhatsAppChatPairingPanel.tsx | 38 +-
.../components/command-center/CommandCenter.tsx | 4 +-
.../components/command-center/IdeationPanel.tsx | 12 +-
.../components/settings/sections/McpServersCard.tsx | 2 +-
.../components/settings/sections/MemorySection.tsx | 4 +-
.../app/task-modal-touch-resize-e2e-fixture.tsx | 28 +-
packages/i18n/locales/en/app.json | 247 +++++++-
packages/i18n/locales/es/app.json | 256 +++++++-
packages/i18n/locales/fr/app.json | 256 +++++++-
packages/i18n/locales/ko/app.json | 256 +++++++-
packages/i18n/locales/pt-BR/app.json | 705 ++++++++++++++++++++
packages/i18n/locales/zh-CN/app.json | 256 +++++++-
packages/i18n/locales/zh-TW/app.json | 256 +++++++-
.../i18n/src/__tests__/i18n-lint-baseline.test.ts | 31 +
packages/i18n/src/resources.d.ts | 229 ++++++-
43 files changed, 2627 insertions(+), 288 deletions(-)
Fusion-Task-Id: FN-013
Fusion-Task-Lineage: 846ac221-c7c3-4ff0-a30d-69479b614765
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
561e0f4cd8
FN-015: remove legacy lane-columns CSS
...
Remove the retired lane compatibility selector while preserving live Board scrolling and overscroll behavior.
- Remove legacy .lane-columns styling from Lane.css.
- Update mobile Board regression fixtures and solution documentation for current workflow-column paths.
- Add a patch changeset documenting the internal cleanup.
Files changed:
.changeset/fn-015-removal.md | 7 ++++
...-board-ios-horizontal-overscroll-containment.md | 32 +++++++++--------
.../__tests__/board-mobile-column-swipe.test.ts | 11 +++---
.../__tests__/board-mobile-overscroll-containment.test.ts | 28 ++++++++-------
packages/dashboard/app/components/Lane.css | 41 +++-------------------
5 files changed, 51 insertions(+), 68 deletions(-)
Fusion-Task-Id: FN-015
Fusion-Task-Lineage: 78128638-a319-4589-8cdd-a6497efe226f
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
c0966fb3c2
FN-010: animate mobile board column releases
...
Smooth mobile Board releases now settle continuously on the existing reachable column target.
- Animate directional and nearest-column corrections with safe immediate fallbacks.
- Cancel in-flight settling and restore styles on unmount while preserving snap wiring.
- Update regression coverage, mobile board documentation, and the published fix changeset.
Files changed:
.changeset/fn-010-smooth-mobile-board-release.md | 7 ++
docs/dashboard-guide.md | 5 +-
.../app/components/__tests__/board-mobile.test.tsx | 3 +-
.../hooks/__tests__/useColumnScrollSnap.test.ts | 109 +++++++++++++++++++--
.../dashboard/app/hooks/useColumnScrollSnap.ts | 46 ++++++---
5 files changed, 146 insertions(+), 24 deletions(-)
Fusion-Task-Id: FN-010
Fusion-Task-Lineage: 16d3810b-8498-4436-8c41-12676778408a
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
c380e680a8
FN-014: scope session diffs to task-owned files
...
Scope rebase session diffs to files proven to belong to the task.
- Attribute rebase-range files to task commits before falling back to execution snapshots.
- Return empty diffs when ownership cannot be proven instead of exposing unrelated files.
- Add parity and route coverage plus a patch changeset.
Files changed:
.changeset/fn-014-task-diff-attribution.md | 7 ++
.../TaskCard-TaskChangesTab-parity.test.tsx | 42 ++++++++++
.../dashboard/src/__tests__/routes-github.test.ts | 90 +++++++++++++++++++++
.../src/routes/register-session-diff-routes.ts | 66 ++++++++++++----
4 files changed, 188 insertions(+), 17 deletions(-)
Fusion-Task-Id: FN-014
Fusion-Task-Lineage: e5aebee9-4190-4f56-b386-9448b2ab7ffd
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
e0ffd31e83
FN-009: add desktop Board mouse-drag navigation
...
Add safe desktop click-drag panning to the Board while preserving existing card and touch interactions.
- Add the mouse-pan hook with pointer capture, intent threshold, and click suppression.
- Wire panning and cursor states into Board surfaces with regression coverage.
- Document the interaction and publish the feature changeset.
Files changed:
.changeset/fn-009-board-mouse-pan.md | 7 +
docs/dashboard-guide.md | 2 +
packages/dashboard/app/components/Board.css | 11 ++
packages/dashboard/app/components/Board.tsx | 19 ++-
.../app/components/__tests__/Board.test.tsx | 78 +++++++++-
.../app/hooks/__tests__/useBoardMousePan.test.tsx | 164 +++++++++++++++++++++
packages/dashboard/app/hooks/useBoardMousePan.ts | 151 +++++++++++++++++++
7 files changed, 429 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-009
Fusion-Task-Lineage: 0f0bee56-cbb8-4e8d-b866-51d439ab9655
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
c30d65080e
FN-008: add Activity Feed log copying
...
Add a localized copy action for task Activity Feed logs with clipboard feedback and coverage.
- Add the Activity Feed copy control and styling to task details.
- Localize copy, success, and failure messages across supported locales.
- Cover clipboard states and regenerate translation resource types.
Files changed:
.changeset/fn-008-copy-task-activity-logs.md | 7 +
.../dashboard/app/components/TaskDetailModal.css | 52 ++++++
.../dashboard/app/components/TaskDetailModal.tsx | 70 +++++--
.../__tests__/TaskDetailModal.test-helpers.ts | 1 +
.../components/__tests__/TaskDetailModal.test.tsx | 202 ++++++++++++++++++++
packages/i18n/locales/en/app.json | 4 +
packages/i18n/locales/es/app.json | 9 +
packages/i18n/locales/fr/app.json | 9 +
packages/i18n/locales/ko/app.json | 9 +
packages/i18n/locales/pt-BR/app.json | 9 +
packages/i18n/locales/zh-CN/app.json | 9 +
packages/i18n/locales/zh-TW/app.json | 9 +
packages/i18n/src/resources.d.ts | 11 +-
13 files changed, 385 insertions(+), 16 deletions(-)
Fusion-Task-Id: FN-008
Fusion-Task-Lineage: 41574c1e-528e-499b-bec0-9cccfdf068de
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
6f91764f2e
FN-005: remove duplicate planning move target
...
Prevent duplicate Planning menu entries for in-review task cards.
- Filter supplemental legacy move targets against declared visible workflow columns.
- Preserve legacy targets when workflow metadata is unavailable and cover default, legacy, hidden, and non-review menus.
- Add a patch changeset for the dashboard fix.
Files changed:
.changeset/fn-005-duplicate-move-to-planning.md | 7 ++
packages/dashboard/app/components/TaskCard.tsx | 33 +++-----
.../app/components/__tests__/TaskCard.test.tsx | 95 ++++++++++++++++++++++
3 files changed, 112 insertions(+), 23 deletions(-)
Fusion-Task-Id: FN-005
Fusion-Task-Lineage: 6964d445-446c-449b-a606-a8fc3d87e34d
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
200b31089e
FN-004: fix remote access token handoff
...
Ensure freshly generated Remote Access links authenticate against current global settings.
- Synchronize global-settings caches across token writers and readers
- Resolve remote-login tokens from canonical global settings
- Cover token handoff behavior and document persistent-token semantics
Files changed:
.changeset/fn-004-remote-token-auth.md | 7 +
docs/remote-access.md | 6 +-
.../core/src/__tests__/global-settings.test.ts | 41 +++-
.../postgres/settings-persistence.pg.test.ts | 37 ++++
packages/core/src/config/global-settings.ts | 46 ++++-
.../app/__tests__/auth-token-capture.test.ts | 32 ++++
.../app/__tests__/settings-save-split.test.ts | 4 +
.../src/__tests__/remote-login-handoff.test.ts | 213 +++++++++++++++++++++
.../src/__tests__/routes-remote-access.test.ts | 4 +
.../src/routes/register-settings-memory-routes.ts | 9 +
packages/dashboard/src/server.ts | 10 +-
11 files changed, 400 insertions(+), 9 deletions(-)
Fusion-Task-Id: FN-004
Fusion-Task-Lineage: 1a64c345-a590-474e-afbf-af5e5d6df979
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
d45c80d7f3
FN-006: label Cloudflare tunnel URLs accurately
...
Label remote access URLs with terminology that matches the active tunnel provider.
- derive share URL labels from the running remote provider
- add Cloudflare and neutral tunnel label translations and generated i18n types
- cover Cloudflare, Tailscale, and unknown-provider URL labels
- add a patch changeset for the corrected remote-access terminology
Files changed:
.changeset/fn-006-remote-url-label.md | 7 ++++++
.../SettingsModal.remote-notifications.test.tsx | 28 ++++++++++++++++++++--
.../components/settings/sections/RemoteSection.tsx | 21 +++++++++++-----
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 | 21 +++++++++++++---
11 files changed, 86 insertions(+), 17 deletions(-)
Fusion-Task-Id: FN-006
Fusion-Task-Lineage: a34a3c77-11ab-4f73-a264-9776e75edfae
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
cc6f389e71
FN-003: consolidate model overrides and Docker tooling
...
Consolidate model override settings while adding supported operator tools to the Docker image.
- Group project and workflow model overrides in the Settings interface with updated search metadata, translations, tests, and documentation.
- Install gh, tailscale, and cloudflared from signed vendor repositories and cover the Docker configuration.
- Add release changesets for the settings and container capabilities.
Files changed:
.changeset/docker-operator-tooling.md | 7 +
.changeset/fn-003-model-override-organization.md | 7 +
Dockerfile | 36 ++++-
docs/dashboard-guide.md | 6 +-
docs/settings-reference.md | 9 +-
.../app/__tests__/settings-sections.test.tsx | 10 ++
.../__tests__/SettingsModal.models-auth.test.tsx | 2 +-
.../settings/sections/GlobalModelsSection.tsx | 16 +-
.../settings/sections/ProjectModelsSection.tsx | 171 +++++++++++----------
packages/dashboard/src/shared/settings-sections.ts | 6 +-
packages/i18n/locales/en/app.json | 5 +
.../dockerfile-workspace-manifests.test.mjs | 22 +++
12 files changed, 200 insertions(+), 97 deletions(-)
Fusion-Task-Id: FN-003
Fusion-Task-Lineage: 4df75b7f-f8dd-472c-b343-d06800d6c615
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
2758d84958
FN-002: expose Remote Access in basic settings
...
Make Remote Access available in Basic Settings and equip container agents with ripgrep.
- Classify Remote Access as basic-visible in shared Settings metadata and cover desktop, mobile, search, and API surfaces.
- Install ripgrep in the Docker runner and add a patch changeset plus image assertion.
Files changed:
.changeset/docker-ship-ripgrep.md | 7 +++++++
Dockerfile | 5 ++++ -
packages/dashboard/app/components/__tests__/SettingsModal.general.test.tsx | 21 +++++++++++++++++++++
packages/dashboard/app/components/__tests__/settings-mobile.test.tsx | 18 ++++++++++++++++++
packages/dashboard/app/components/__tests__/ui-metadata-sync.test.ts | 18 ++++++++++++++++++
packages/dashboard/src/routes/__tests__/register-ui-metadata-routes.test.ts | 1 +
packages/dashboard/src/shared/settings-sections.ts | 4 +++-
scripts/__tests__/dockerfile-workspace-manifests.test.mjs | 5 +++++
8 files changed, 77 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-002
Fusion-Task-Lineage: 750827fb-4fa2-4a57-9368-cb81e2ac0936
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
Fusion Agent
643a4098ab
FN-001: add Velvet dashboard color theme
...
Add the Velvet plum/burgundy theme across dashboard and desktop startup.
- Register Velvet in persisted theme options and pre-hydration validators
- Define dark/light palette tokens, selector swatch, and regression coverage
- Document the theme and add a minor CLI changeset
Files changed:
.changeset/fn-001-velvet-theme.md | 6 ++
docs/dashboard-guide.md | 5 +-
docs/settings-reference.md | 2 +-
packages/core/src/types/ui/execution-and-ui.ts | 2 +
.../dashboard/app/__tests__/velvet-theme.test.ts | 101 +++++++++++++++++++++
.../dashboard/app/components/ThemeSelector.css | 14 +++
packages/dashboard/app/components/themeOptions.ts | 1 +
packages/dashboard/app/index.html | 2 +-
packages/dashboard/app/public/theme-data.css | 86 +++++++++++++++++-
packages/desktop/src/renderer/index.html | 1 +
10 files changed, 215 insertions(+), 5 deletions(-)
Fusion-Task-Id: FN-001
Fusion-Task-Lineage: a57d7458-b598-48e3-b4ed-cc082f32197d
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-20 03:55:38 +00:00
gsxdsm
2a31505823
FN-9163: Add repositories to existing workspace tasks
...
Enable validated workspace membership additions and make active tasks discover new repositories safely.
- add idempotent direct-child Git repository validation and workspace configuration updates
- expose repository discovery and addition through Settings and dashboard API routes
- refresh workspace membership during acquisition while blocking additions after review or landing begins
- document the workflow and cover core, dashboard, and engine behavior with focused tests
Files changed:
.changeset/fn-9163-workspace-add-repo.md | 7 ++
docs/dashboard-guide.md | 2 +
docs/settings-reference.md | 2 +-
docs/workspaces.md | 12 +-
.../core/src/__tests__/workspace-add-repo.test.ts | 12 ++
packages/core/src/git/git-repository.ts | 68 ++++++++++-
packages/core/src/index.gate.ts | 3 +
packages/core/src/index.ts | 3 +
packages/dashboard/app/api/agents/agents.ts | 11 +-
.../settings/sections/GeneralSection.tsx | 3 +
.../settings/sections/WorkspaceReposCard.css | 6 +
.../settings/sections/WorkspaceReposCard.tsx | 46 ++++++++
.../__tests__/workspace-repos-card.test.tsx | 49 ++++++++
.../src/__tests__/workspace-add-repo-route.test.ts | 65 ++++++++++
.../dashboard/src/routes/register-git-github.ts | 35 +++++-
.../__tests__/workspace-add-repo-midflight.test.ts | 131 +++++++++++++++++++++
packages/engine/src/agent-tools.ts | 27 ++++-
packages/engine/src/executor/deps-bags.ts | 44 ++++++-
packages/engine/src/executor/run-implementation.ts | 2 +
19 files changed, 512 insertions(+), 16 deletions(-)
Fusion-Task-Id: FN-9163
Fusion-Task-Lineage: 7456f55f-b7c8-4076-994f-42994d8babb0
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 19:59:04 -07:00
gsxdsm
3b0a6b795f
FN-9162: Group workspace worktrees under configurable roots
...
Configure collision-safe workspace and repository subfolders beneath custom worktree roots.
- add shared workspace layout helpers and export them through runtime and gate barrels
- route acquisition, pinning, cleanup, archive, and extension discovery through grouped paths
- allow absolute worktree roots in settings and document the workspace layout
- protect shared-root containers from destructive sweeps and cover multi-repository behavior
Files changed:
.changeset/fn-9162-workspace-worktree-root.md | 7 ++
docs/settings-reference.md | 2 +-
docs/workspaces.md | 6 ++
.../extension-workspace-worktree-root.test.ts | 81 +++++++++++++++++
packages/cli/src/extension.ts | 53 ++++++++++-
packages/core/src/__tests__/pi-extensions.test.ts | 46 +++++++++-
.../core/src/__tests__/worktree-layout.test.ts | 49 ++++++++++
packages/core/src/index.gate.ts | 13 +++
packages/core/src/index.ts | 9 ++
packages/core/src/plugins/pi-extensions.ts | 12 ++-
packages/core/src/task-store/archive-lifecycle.ts | 11 +--
packages/core/src/tasks/worktree-layout.ts | 77 ++++++++++++++++
.../dashboard/app/components/SettingsModal.tsx | 4 +-
.../settings/sections/WorktreesSection.tsx | 2 +-
.../worktree-acquisition-workspace.test.ts | 55 ++++++++++-
.../engine/src/__tests__/worktree-paths.test.ts | 19 +++-
.../engine/src/__tests__/worktree-pinning.test.ts | 17 ++++
.../engine/src/__tests__/worktree-pool.test.ts | 19 +++-
.../src/executor/workspace-main-checkout-guard.ts | 2 +-
packages/engine/src/self-healing.ts | 20 +++-
.../engine/src/worktree/worktree-acquisition.ts | 101 +++++++++++++++------
packages/engine/src/worktree/worktree-names.ts | 14 +--
packages/engine/src/worktree/worktree-paths.ts | 75 ++++++++++++---
packages/engine/src/worktree/worktree-pinning.ts | 10 +-
packages/engine/src/worktree/worktree-pool.ts | 44 ++++++---
25 files changed, 656 insertions(+), 92 deletions(-)
Fusion-Task-Id: FN-9162
Fusion-Task-Lineage: b5f5e247-577c-4357-9ffe-97e2447b4fd4
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 19:46:35 -07:00
gsxdsm
ef35fb8e5a
FN-9164: select per-repository workspace base branches
...
Workspace worktrees now honor and persist the appropriate base branch for each sub-repository throughout their lifecycle.
- Resolve requested bases per repository, normalize remote-only refs, and fall back safely to repository integration branches.
- Reuse recorded bases for landing, recovery, and revert flows with privacy-safe audit breadcrumbs.
- Surface base and fallback details in task UI, documentation, tests, and release notes.
Files changed:
.changeset/fn-9164-workspace-base-branch.md | 7 +
AGENTS.md | 1 +
docs/task-management.md | 2 +-
docs/workspaces.md | 8 +-
packages/core/src/types/task/task-core.ts | 12 ++
.../dashboard/app/components/TaskDetailModal.css | 14 ++
.../app/components/WorkspaceWorktreesSummary.tsx | 2 +
.../__tests__/WorkspaceWorktreesSummary.test.tsx | 13 ++
.../src/routes/register-task-workflow-routes.ts | 2 +
.../task-revert.workspace.real-git.test.ts | 25 +++
.../src/__tests__/workspace-base-branch.test.ts | 93 +++++++++++
.../worktree-acquisition-workspace.test.ts | 27 ++++
packages/engine/src/execution/task-revert.ts | 58 +++++--
packages/engine/src/merge/merger-ai.ts | 30 +++-
packages/engine/src/self-healing.ts | 50 +++++-
packages/engine/src/util/run-audit.ts | 6 +
.../engine/src/worktree/workspace-base-branch.ts | 180 +++++++++++++++++++++
.../engine/src/worktree/worktree-acquisition.ts | 62 ++++---
18 files changed, 548 insertions(+), 44 deletions(-)
Fusion-Task-Id: FN-9164
Fusion-Task-Lineage: 487a1c77-32cb-47dd-bf43-297a146951ba
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 18:57:33 -07:00
gsxdsm
7dfce1cc16
FN-9160: Prevent draft storage quota exhaustion
...
Make browser draft restoration best-effort so oversized or quota-blocked writes never interrupt task creation.
- cap free-text draft persistence at 64,000 bytes and warn once when restoration is unavailable
- make scoped storage operations throw-safe with bounded retries and stale volatile-state reclamation
- extend quota, composer, modal persistence, and chat draft coverage and document the storage policy
- add a patch changeset for the operator-facing fix
Files changed:
.changeset/fn-9160-quick-entry-quota.md | 7 ++
docs/storage.md | 31 +++---
.../dashboard/app/components/InlineCreateCard.tsx | 25 ++++-
.../dashboard/app/components/QuickEntryBox.tsx | 25 ++++-
.../components/__tests__/ChatView.draft.test.tsx | 36 +++++-
.../components/__tests__/InlineCreateCard.test.tsx | 20 ++++
.../components/__tests__/QuickEntryBox.test.tsx | 36 +++++-
.../app/hooks/__tests__/modalPersistence.test.ts | 28 +++--
packages/dashboard/app/hooks/modalPersistence.ts | 29 ++---
.../app/utils/__tests__/projectStorage.test.ts | 88 ++++++++++++++-
packages/dashboard/app/utils/projectStorage.ts | 122 +++++++++++++++++++--
11 files changed, 384 insertions(+), 63 deletions(-)
Fusion-Task-Id: FN-9160
Fusion-Task-Lineage: 63481936-91f1-4e7a-b27c-c3c5f49014dd
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 18:08:55 -07:00
gsxdsm
f57661a013
chore(release): v0.77.0-beta.3
...
Version bump via changesets.
2026-08-18 22:16:44 -07:00
ischindl
f195ff5b3d
feat(RUFU-081): add Prometheus-format /metrics system observability endpoint ( #3475 )
...
**Problem:** Fusion had no Prometheus-scrapeable metrics surface, so
production CPU/health/DB/fleet observability had to be inferred from
logs and ad-hoc monitoring.
**Fix:** Expose a Prometheus-text `/metrics` HTTP endpoint on the
dashboard with runtime + domain samplers: request latency quantiles
(p50/p95/max), last-request-age freeze indicator, CPU user/system,
RSS/heap, child-process spawn rates by kind, git children count, PG tps,
active/idle/total projects, running agents, and board task counts.
Scraped at 5s by the existing Prometheus/Grafana stack
(fusion-observability).
**Includes:** full test coverage for the Prometheus text parser and each
sampler.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Added a public, unauthenticated `/metrics` endpoint with
Prometheus-formatted dashboard, runtime, process, database, and domain
metrics.
* Added request latency, resource usage, child-process, project
activity, agent, and task metrics.
* Metrics remain available in headless mode and provide stable snapshots
without triggering additional data writes or on-demand I/O.
* **Documentation**
* Documented metric families, sampling behavior, and degraded-operation
handling.
* **Tests**
* Added comprehensive coverage for collection, formatting, parsing,
endpoint behavior, and sampler lifecycle.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
---------
Co-authored-by: Fusion <noreply@runfusion.ai >
2026-08-18 22:11:22 -07:00
Phil Larson
86656db91a
test: align terminal scrollback callback assertions ( #3488 )
...
## Summary
- updates `useTerminal` callback assertions for the new `(data, reset)`
scrollback contract
- covers both an explicit reset frame and the default non-reset path
## Test plan
- `FUSION_DASHBOARD_DEEP=1 pnpm --filter @fusion/dashboard exec vitest
run --project dashboard-app --silent=passed-only --reporter=default
app/hooks/__tests__/useTerminal.test.ts`
- `pnpm --filter @fusion/dashboard typecheck`
- `pnpm check:changesets`
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Tests**
* Updated terminal scrollback coverage to validate the new reset-state
information for live updates and buffered replay.
* Expanded checks across message delivery, buffering, initial rendering,
duplicate output, and reconnection scenarios.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-08-18 22:10:05 -07:00
gsxdsm
16e63462cc
fix: audit fallout — tunnel port, orphaned dev processes, scrollback clear
...
Auditing for repeats of the `pnpm dev --tunnel` bugs turned up the same
mistakes elsewhere.
Remote tunnels assumed 4040. ProjectEngine's Cloudflare quick tunnel
hardcoded http://localhost:4040 , so a dashboard on an explicit --port, a PORT
override, or runDashboard's EADDRINUSE rebind published a PUBLIC tunnel to
whatever else held 4040. The dashboard now records its bound port
(setLocalDashboardPort, from both runDashboard and headless serve) and the
tunnel reads it, keeping 4040 only as the pre-report default.
register-discovery-routes already derived its port from req.socket.localPort
and is untouched.
Stopping the dev wrapper orphaned everything it started. It installed no
signal handlers, so teardown only ran from the child's close handler:
signalling the wrapper left the dev server AND its cloudflared alive —
observed twice, four surviving processes each time, including a public
trycloudflare URL still serving a dev server believed to be down. Ctrl-C hid
it by signalling the whole process group.
SessionTerminal appended scrollback instead of clearing first, though the
server sends it as a separate frame precisely so the client can clear. Latent
today because every reattach builds a fresh xterm; a duplicated-history bug
the moment an in-place reconnect appears.
And BackupManager's centralDbPath is gone: written, never read, and a
leftover of the removed SQLite backup — the same class of stale artifact that
onboarding was using as evidence about a Postgres install.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-18 21:09:03 -07:00
gsxdsm
e4a53b6f47
fix: stop terminal history duplicating on reconnect, agree one size across viewers
...
Driving a shared PTY with two real WebSocket viewers against a live instance
surfaced two defects.
Duplicated history: the server replayed the entire scrollback on every
attach, and the client appended it into an xterm that still displayed that
history. Every reconnect — backgrounded tab, laptop sleep, heartbeat timeout
— therefore added a second copy, seen as the last prompt appearing twice.
TerminalService now tracks cumulative output and serves a resume: a client
reports the offset it has rendered and receives only the gap, or a full
replay flagged reset so it clears first.
Wrong size: resize was last-writer-wins. Measured — viewer A at 80x24 had
its shell report 200x50 the moment viewer B attached on a bigger screen,
while A still drew 80 columns, so wrapped lines and full-screen programs
broke for A. TerminalViewportRegistry sizes the PTY to the per-dimension
minimum across attached viewers, the rule terminal multiplexers settled on,
and gives room back when a viewer leaves. Viewers that have not yet measured
themselves do not constrain the size.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-18 19:52:36 -07:00
gsxdsm
9f10767254
feat: share terminal sessions across browsers
...
Terminal PTYs already lived in a server-side registry whose WebSocket attach
supports several viewers, but the tab list is per-browser localStorage and a
browser with no stored tabs skipped the session listing entirely (FN-7686's
cold-open optimization) and spawned its own PTY. Two people on one Fusion —
or one person in a second browser — therefore never saw each other's
terminals and quietly accumulated parallel sessions.
- A zero-tab client adopts the server's sessions, oldest first, so every
client converges on the same set. A client with stored tabs still only
validates them; adopting there would resurrect tabs the user closed here.
- FN-7686's guarantee weakens from "never waits" to "waits at most
ADOPT_LIST_TIMEOUT_MS (1.5s), then behaves exactly as before": auto-create
fires on a 0ms timer, so a background list can never win that race. Its
regression test and comment now state the bounded contract.
- Closing a tab asks which close was meant — detach here (PTY keeps running
for other viewers) or end the session for everyone. alwaysAsk is set: this
gates an informed choice and both wrong answers are destructive. Desktop
and mobile close controls both route through it.
- A footer Reopen control lists sessions the server still runs that this
browser is not showing and reattaches to them, so detaching is not a
one-way door.
Also fixes a multi-viewer data bug: the attach called
getScrollbackAndClearPending(), discarding queued output and deleting a slice
of every already-attached viewer's live stream. It now flushes pending output
to existing viewers first, then reads scrollback for the newcomer, so each
viewer receives it exactly once.
Drive-by: closeTab's dependency array was empty while its body reads
projectId, freezing it at the first render's project.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-18 19:13:53 -07:00
gsxdsm
4c545676b8
fix(security): persistent remote links keep working, short-lived ones still expire
...
The remote-login session fix capped EVERY session at shortLived.ttlMs, so opening
a persistent link gave a 15-minute session. That is wrong for the link type an
operator uses for their own devices — persistent means the link keeps working.
Session lifetime now follows the token type:
short-lived -> never outlives the token that authorised it (falls back to the
configured TTL when there is no usable expiry, and an already
expired token does not fall through to the long one)
persistent -> a long session (30 days), because the link itself never expires
It is still a SESSION rather than the daemon token — opaque, revocable, and gone
on restart — so the leak this all started from stays fixed: a recipient never
receives the dashboard's permanent credential.
Moved the rule out of server.ts into remote-session.ts so it is unit-tested
rather than living inline in a request handler. 15 tests pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-18 18:05:15 -07:00
gsxdsm
0e7c353f2b
fix(security): remote login no longer hands over the dashboard token
...
Sharing a remote link gave the recipient the dashboard's real credential.
`/remote-login?rt=…` validated the remote token and then redirected to
`/?token=<daemonToken>` — so the daemon token landed in their URL bar, their
history, and anything that logs URLs. It also made the separate remote token
pointless: revoking it left the recipient permanently authenticated, because
they were holding the daemon token itself, not the remote one.
A validated remote token now mints an opaque, expiring, revocable session
(createRemoteSessionStore) returned as an HttpOnly, SameSite=Lax cookie (Secure
over https, which a quick tunnel always is), and the redirect carries nothing
sensitive. The auth middleware gains a third credential source, checked only
after the daemon token and only when a validator is installed, so the existing
header and fn_token paths and their constant-time comparison are untouched.
Session TTL is capped by the remote token's own remaining life when it is
short-lived — a 15-minute share link must not buy a longer stay through the back
door — and otherwise uses the configured shortLived.ttlMs (default 15m). Sessions
are in-memory on purpose: a restart invalidating them fails in the safe
direction, and persisting would write a credential to disk for no benefit.
A source-level ratchet asserts the handler never puts the daemon token in a
redirect again; verified it fails when the old line is reinstated, since the leak
was one line and far easier to reintroduce than to notice.
Also: POST /api/remote/tunnel/start answered {state:"starting"} when no engine
was attached, so the UI showed a tunnel coming up that never would, settling to
stopped with lastError:null and no way to tell it from a broken one (hit live in
a container whose launch dir is not the registered project — unscoped requests
fall back to a store with no engine). It stays 200 and idempotent, because a
dashboard legitimately runs --no-engine, but now reports the truth: stopped, with
REMOTE_TUNNEL_ENGINE_UNAVAILABLE naming the ?projectId= fix.
63 dashboard remote/auth tests pass, including 11 new ones.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-18 17:55:31 -07:00
gsxdsm
86950400c9
chore(release): v0.77.0-beta.2
...
Version bump via changesets.
2026-08-18 00:22:21 -07:00
Phil Larson
95466b7811
fix(dashboard): remove stale taskStuck aliases ( #3483 )
...
## Summary
- removes the deleted taskStuck helper from dashboard package exports
and local build/test aliases
- removes the dependency-graph plugin TypeScript path for the deleted
dashboard module
- adds a script regression so the removed module cannot be reintroduced
as a stale alias
## Test Plan
- pnpm test:scripts --
scripts/__tests__/dashboard-stuck-task-removal.test.mjs
- pnpm check:changesets
- pnpm exec eslint
scripts/__tests__/dashboard-stuck-task-removal.test.mjs
packages/dashboard/vite.config.ts packages/dashboard/vitest.config.ts
- pnpm --filter @fusion/dashboard typecheck
- pnpm --filter @fusion-plugin-examples/dependency-graph build
- pnpm --filter @fusion/dashboard build
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Removed stale stuck-task references from dashboard package and build
configurations.
* Prevented unavailable task-stuck utilities from being exposed or
resolved.
* **Tests**
* Added validation to ensure removed task-stuck references do not
reappear in dashboard or plugin configuration.
* **Documentation**
* Recorded the cleanup in the project’s release notes.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-08-18 00:09:53 -07:00
gsxdsm
889728bd20
fix(onboarding): offer a default model as soon as a provider connects
...
Operator on a fresh install was never prompted to pick a default model, and the
dashboard later advertised "Continue Setup" at the AI Setup step even though
they had finished the flow.
availableModels was loaded once at mount and re-fetched only when a CUSTOM
provider was added. On a fresh install nothing is connected at mount, so the
list starts empty and the Default Model section renders its empty state — and
after an OAuth login or an API-key save it was never refreshed, so it kept
saying "No models available yet. Connect a provider above to see model options."
while a provider sat connected right above it.
Both connect paths now refresh the catalogue. Once a provider is connected and
no model is chosen, the section retitles from "Default Model (Optional)" to
"Choose your default model" and scrolls itself into view once — the moment it
becomes actionable is exactly the moment it is off screen, below every provider
card. It stays skippable.
scrollIntoView is called only when it exists: JSDOM does not implement it, and a
cosmetic nudge must never throw out of an effect and take the modal down (it did
— 24 suites failed until guarded).
Completion is additionally marked in a `finally`, so a failed default-model
settings write cannot leave onboarding recorded as unfinished. That part is
hardening, NOT a proven repro: a test written against it passed with and without
the change, so it was removed rather than kept as false coverage, and the reason
is recorded in the suite.
Also folds in the container's default git identity, which the merge investigation
needed (see the follow-up commit for the per-agent identity work).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-17 23:45:40 -07:00