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
3dea1bb851
FN-9172: isolate executor run-audit emissions
...
Keep executor lifecycle transitions moving when run-audit sinks fail or stall.
- Add a shared bounded, best-effort executor audit emission seam.
- Route executor lifecycle audit writes through sink isolation.
- Cover absent, throwing, rejecting, hanging, and late-settling sinks.
- Document the emitter policy and publish a patch changeset.
Files changed:
.changeset/fn-9172-executor-run-audit-isolation.md | 7 +
AGENTS.md | 7 +
docs/run-audit.md | 6 +-
.../src/__tests__/emit-bounded-run-audit.test.ts | 58 +++++
.../executor-run-audit-emitter-isolation.test.ts | 252 +++++++++++++++++++++
.../src/executor/acquire-session-registry-path.ts | 5 +-
.../engine/src/executor/completion-finalization.ts | 3 +-
.../engine/src/executor/create-task-done-tool.ts | 3 +-
.../engine/src/executor/emit-bounded-run-audit.ts | 48 ++++
.../executor/emit-merge-boundary-unproven-audit.ts | 68 ++----
.../engine/src/executor/execute-workflow-graph.ts | 5 +-
.../engine/src/executor/handle-graph-failure.ts | 18 +-
...dle-stale-in-review-parse-pause-abort-replay.ts | 7 +-
...ndle-stale-in-review-plan-pause-abort-replay.ts | 7 +-
.../maybe-dispatch-workflow-work-engine.ts | 7 +-
.../src/executor/no-merge-complete-column.ts | 3 +-
.../reenter-paused-aborted-workflow-node.ts | 7 +-
.../src/executor/required-artifact-recovery.ts | 3 +-
packages/engine/src/executor/run-implementation.ts | 5 +-
19 files changed, 433 insertions(+), 86 deletions(-)
Fusion-Task-Id: FN-9172
Fusion-Task-Lineage: 80c67c36-3bbb-4274-ac4c-9808c4cda3ce
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 20:35:19 -07:00
gsxdsm
84d9a59e7e
FN-9169: retry Windows worktree cleanup failures
...
Make clean-room removal resilient to transient Windows filesystem locks without weakening worktree ownership safeguards.
- add bounded errno-based directory removal retries with Windows read-only recovery
- reuse cleanup retries across AI merge teardown, self-healing sweeps, and native backend fallback
- preserve residual registrations and expose retry outcomes through cleanup audit metadata
- cover retry, idempotency, residual, and ownership-aware cleanup behavior
Files changed:
.../fn-9169-windows-ai-merge-worktree-cleanup.md | 7 +
docs/architecture.md | 4 +-
.../engine/src/__tests__/merger-ai-cleanup.test.ts | 195 ++++++++++++++++++++-
.../__tests__/self-healing-tempdir-sweep.test.ts | 109 ++++++++++--
.../engine/src/__tests__/worktree-backend.test.ts | 39 ++++-
.../src/__tests__/worktree-removal-retry.test.ts | 64 +++++++
packages/engine/src/merge/merger-ai-worktree.ts | 103 ++++++-----
packages/engine/src/self-healing.ts | 26 ++-
packages/engine/src/worktree/worktree-backend.ts | 15 +-
.../engine/src/worktree/worktree-removal-retry.ts | 110 ++++++++++++
10 files changed, 592 insertions(+), 80 deletions(-)
Fusion-Task-Id: FN-9169
Fusion-Task-Lineage: 4719bd4f-27bf-4a2b-8f31-350658523127
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 20:25:18 -07:00
gsxdsm
7ded57e550
FN-9167: clear interrupted manual merge status
...
Prevent interrupted manual merges from leaving tasks stranded in a transient merging state.
- track locally owned merge stamps and clear them through fenced abort cleanup
- handle SIGINT, SIGTERM, and SIGHUP for foreground task merges with documented exit behavior
- reconcile only age-proven orphan stamps before manual CLI and UI-only dashboard merges
- cover merge stamp authorization, signal cleanup, and mock completeness with regression tests
- add a patch changeset and operator documentation
Files changed:
.../fn-9167-interrupted-manual-merge-stamp.md | 7 +
docs/cli-reference.md | 1 +
docs/task-management.md | 2 +-
.../task-command-github-import-tracking.test.ts | 3 +
packages/cli/src/commands/__tests__/task.test.ts | 179 +++++-
packages/cli/src/commands/dashboard.ts | 3 +
packages/cli/src/commands/task.ts | 138 +++--
.../merge-orphan-durable-write-inventory.json | 608 +++++++++++----------
.../src/__tests__/merge-active-status.test.ts | 49 ++
packages/engine/src/index.ts | 2 +
.../engine/src/merge/clear-orphaned-merge-stamp.ts | 80 +++
packages/engine/src/merge/merger-ai.ts | 12 +
packages/engine/src/project-engine.ts | 20 +-
13 files changed, 735 insertions(+), 369 deletions(-)
Fusion-Task-Id: FN-9167
Fusion-Task-Lineage: 554380e2-ce55-4e7a-89fd-f5c24341937b
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 20:17:42 -07:00
gsxdsm
416c6a0215
FN-9170: Preserve structured merge failure sentinels
...
Keep merge-unavailable intact across workflow merge dispatch so graph routing receives the engine's structured result.
- preserve merge-unavailable alongside implementation-incomplete during primitive classification
- cover direct and legacy merge paths, audit context, normalization, and non-terminal retry behavior
- document the structured sentinel invariant and add a patch changeset
Files changed:
.changeset/fn-9170-merge-unavailable.md | 7 ++
docs/architecture.md | 2 +
.../merge-unavailable-classification.test.ts | 113 +++++++++++++++++++++
.../src/__tests__/workflow-merge-nodes.test.ts | 47 ++++++++-
.../engine/src/workflows/workflow-merge-nodes.ts | 13 ++-
5 files changed, 176 insertions(+), 6 deletions(-)
Fusion-Task-Id: FN-9170
Fusion-Task-Lineage: 99cc501f-8a25-49f5-b81a-74dd2e6e872b
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 20:08:05 -07: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
5ba0b0cffc
FN-9168: Record terminal merge-boundary parks in run audit
...
Add failure-isolated audit visibility for merge-boundary proof failures without changing terminal park behavior.
- Emit a redacted event from retry-boundary and graph-terminal park paths.
- Bound audit sink latency and isolate absent, throwing, rejecting, or hung sinks.
- Add reason-code coverage, catalogue documentation, and a patch changeset.
Files changed:
.changeset/fn-9168-merge-boundary-audit.md | 7 ++
AGENTS.md | 1 +
docs/run-audit.md | 1 +
.../src/__tests__/executor-graph-boundary.test.ts | 33 ++++++---
.../__tests__/merge-boundary-unproven-park.test.ts | 78 +++++++++++++++++++-
.../executor/emit-merge-boundary-unproven-audit.ts | 82 ++++++++++++++++++++++
.../engine/src/executor/handle-graph-failure.ts | 23 +++++-
.../executor/route-graph-merge-failure-to-retry.ts | 36 +++++++++-
.../engine/src/executor/workflow-merge-boundary.ts | 38 ++++++++--
.../engine/src/run-audit/run-audit-catalogue.ts | 5 +-
packages/engine/src/util/run-audit.ts | 10 +++
11 files changed, 293 insertions(+), 21 deletions(-)
Fusion-Task-Id: FN-9168
Fusion-Task-Lineage: cdeb5c1f-4b22-4531-878e-b18955e6ea5a
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 19:34:53 -07:00
gsxdsm
d280fa6f54
FN-9166: preserve implementation-incomplete merge failures
...
Keep structured incomplete-implementation failures intact so graph recovery can resume or fail closed without retrying a no-op merge.
- Preserve normalized implementation-incomplete reasons during direct merge-attempt classification.
- Cover primitive, legacy seam, resumable, fail-closed, and cancellation paths.
- Document the merge-boundary invariant and add a patch changeset.
Files changed:
.../fn-9166-preserve-implementation-incomplete.md | 7 ++
docs/architecture.md | 2 +-
.../merge-node-paused-abort-retryable.test.ts | 76 ++++++++++++++++++++++
.../__tests__/workflow-merge-cancellation.test.ts | 15 ++++-
.../src/__tests__/workflow-merge-nodes.test.ts | 46 +++++++++++++
.../engine/src/workflows/workflow-merge-nodes.ts | 13 +++-
6 files changed, 155 insertions(+), 4 deletions(-)
Fusion-Task-Id: FN-9166
Fusion-Task-Lineage: 1b7946bf-62e3-42f0-8c8c-09230fef22bb
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 19:12:28 -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
179f08c2d4
FN-9158: recover Windows antivirus-blocked PostgreSQL payloads
...
Recover quarantined or truncated embedded PostgreSQL runtime files and explain Windows Defender remediation.
- Validate materialized payload inventory with v3 markers and repair mismatches atomically.
- Surface actionable error 4551 diagnostics through startup failures.
- Add regression coverage, operator documentation, and a patch changeset.
Files changed:
...-9158-windows-av-blocked-embedded-pg-payload.md | 7 +
...ndows-antivirus-blocks-embedded-postgres-dll.md | 27 +++
docs/storage.md | 4 +
.../__tests__/postgres/embedded-lifecycle.test.ts | 139 +++++++++++++-
.../src/__tests__/postgres/startup-factory.test.ts | 19 ++
packages/core/src/postgres/embedded-lifecycle.ts | 208 ++++++++++++++++++++-
packages/core/src/postgres/startup-factory.ts | 30 +--
7 files changed, 414 insertions(+), 20 deletions(-)
Fusion-Task-Id: FN-9158
Fusion-Task-Lineage: ec2c97d7-0797-49c1-b875-6b147ff26917
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 18:50:27 -07:00
gsxdsm
7b55a02e51
FN-9157: fix workflow merge boundary proof and retry routing
...
Make workflow merge admission accept valid foreach completion and terminate retries when proof is unavailable.
- Treat fully terminal live foreach steps as implementation proof for Review Level 0 workflows.
- Preserve merge-boundary-unproven as a terminal graph failure and park blocked retries visibly.
- Add unit, graph-boundary, and PostgreSQL regression coverage plus operator documentation and a patch changeset.
Files changed:
.changeset/fn-9157-merge-boundary.md | 7 +++
docs/architecture.md | 4 ++
docs/workflow-steps.md | 6 ++
.../src/__tests__/workflow-merge-proof.test.ts | 11 +++-
packages/core/src/workflow-merge-proof.ts | 20 +++++--
.../src/__tests__/executor-graph-boundary.test.ts | 64 +++++++++++++++++++++-
...xecutor-merge-boundary-foreach-proof.pg.test.ts | 10 ++++
.../__tests__/merge-boundary-unproven-park.test.ts | 48 ++++++++++++++++
.../create-authoritative-workflow-primitives.ts | 13 ++++-
.../create-authoritative-workflow-seams.ts | 6 +-
.../executor/evaluate-workflow-merge-boundary.ts | 18 +++++-
.../executor/route-graph-merge-failure-to-retry.ts | 26 ++++++++-
packages/engine/src/executor/task-predicates.ts | 2 +
.../engine/src/executor/workflow-merge-boundary.ts | 29 +++++++---
.../engine/src/workflows/workflow-merge-nodes.ts | 13 +++++
15 files changed, 253 insertions(+), 24 deletions(-)
Fusion-Task-Id: FN-9157
Fusion-Task-Lineage: 7c68dfe2-28fb-4353-9ae6-df0ddbaf799a
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 18:16:49 -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
fb77eef7a9
FN-9150: Capture abandoned PostgreSQL timeout boundaries
...
Capture elapsed and join evidence for PostgreSQL test boundaries that Vitest abandons before settlement.
- emit unique boundary join keys, progress ladders, terminal records, and payload-free watchdog breaches
- classify ladder-only, breach, and unobservable lifecycle evidence in the loaded-failure census
- cover abandoned and superseded body windows and document the corrective campaign findings
Files changed:
...res-loaded-lane-unrelated-failure-population.md | 33 ++++++-
docs/testing.md | 14 ++-
.../__test-utils__/pg-timeout-boundary-observer.ts | 108 ++++++++++++++++++---
.../__tests__/pg-timeout-boundary-observer.test.ts | 98 ++++++++++++++++++-
.../__tests__/pg-loaded-failure-census.test.mjs | 30 ++++++
scripts/pg-loaded-failure-census.mjs | 71 ++++++++++++--
6 files changed, 327 insertions(+), 27 deletions(-)
Fusion-Task-Id: FN-9150
Fusion-Task-Lineage: fc2e9f99-7739-4d86-99f4-713a78f53e57
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 10:10:39 -07:00
gsxdsm
a1977e052b
FN-9149: Add PostgreSQL timeout-boundary diagnostics
...
Instrument the opt-in PostgreSQL test harness to attribute loaded-lane timeout failures without changing default behavior.
- Add bounded setup, body, and teardown watchdog probes with host, cluster, and template evidence.
- Wire observer records into the harness and loaded-failure census with explicit suppression and attribution handling.
- Cover observer inertness, boundary behavior, and census joins while documenting the 27-worker campaign findings.
Files changed:
...res-loaded-lane-unrelated-failure-population.md | 31 +-
docs/testing.md | 27 ++
.../core/src/__test-utils__/pg-test-harness.ts | 113 +++++-
.../__test-utils__/pg-timeout-boundary-observer.ts | 451 +++++++++++++++++++++
.../pg-test-harness-observer-inertness.test.ts | 31 ++
.../__tests__/pg-timeout-boundary-observer.test.ts | 177 ++++++++
.../__tests__/pg-loaded-failure-census.test.mjs | 31 ++
scripts/pg-loaded-failure-census.mjs | 101 ++++-
8 files changed, 934 insertions(+), 28 deletions(-)
Fusion-Task-Id: FN-9149
Fusion-Task-Lineage: 4df4ee28-5369-41ae-bb0c-e7e9ae78d873
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai >
2026-08-19 08:41:14 -07:00
gsxdsm
f57661a013
chore(release): v0.77.0-beta.3
...
Version bump via changesets.
2026-08-18 22:16:44 -07:00
dependabot[bot]
8b0b88ae95
Bump tar from 7.5.13 to 7.5.22 ( #3464 )
...
Bumps [tar](https://github.com/isaacs/node-tar ) from 7.5.13 to 7.5.22.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="2a22bfc5d3 "><code>2a22bfc</code></a>
7.5.22</li>
<li><a
href="df1cd8dc09 "><code>df1cd8d</code></a>
Allow transform to be falsey</li>
<li><a
href="0cd9cc3c58 "><code>0cd9cc3</code></a>
7.5.21</li>
<li><a
href="631ae59121 "><code>631ae59</code></a>
list: prevent unbounded recursion</li>
<li><a
href="ebbb720941 "><code>ebbb720</code></a>
7.5.20</li>
<li><a
href="2f271963a7 "><code>2f27196</code></a>
fix: fully disable and dispose of unzip when aborting parser</li>
<li><a
href="be440da64e "><code>be440da</code></a>
7.5.19</li>
<li><a
href="2812e93386 "><code>2812e93</code></a>
add maxDecompressionRatio guard against explosive decompression</li>
<li><a
href="9ecd4d2956 "><code>9ecd4d2</code></a>
7.5.18</li>
<li><a
href="9e78bf058b "><code>9e78bf0</code></a>
refuse to let header size be less than 0</li>
<li>Additional commits viewable in <a
href="https://github.com/isaacs/node-tar/compare/v7.5.13...v7.5.22 ">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores )
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-18 22:12:17 -07:00
dependabot[bot]
392b780979
Bump @capacitor/push-notifications from 7.0.6 to 8.1.2 ( #3465 )
...
Bumps
[@capacitor/push-notifications](https://github.com/ionic-team/capacitor-plugins )
from 7.0.6 to 8.1.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/ionic-team/capacitor-plugins/releases ">@capacitor/push-notifications's
releases</a>.</em></p>
<blockquote>
<h2><code>@capacitor/push-notifications</code><a
href="https://github.com/8 "><code>@8</code></a>.1.2</h2>
<h2><a
href="https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/push-notifications@8.1.1...@capacitor/push-notifications@8.1.2 ">8.1.2</a>
(2026-07-15)</h2>
<p><strong>Note:</strong> Version bump only for package
<code>@capacitor/push-notifications</code></p>
<h2><code>@capacitor/push-notifications</code><a
href="https://github.com/8 "><code>@8</code></a>.1.1</h2>
<h2><a
href="https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/push-notifications@8.1.0...@capacitor/push-notifications@8.1.1 ">8.1.1</a>
(2026-05-15)</h2>
<p><strong>Note:</strong> Version bump only for package
<code>@capacitor/push-notifications</code></p>
<h2><code>@capacitor/push-notifications</code><a
href="https://github.com/8 "><code>@8</code></a>.1.0</h2>
<h1><a
href="https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/push-notifications@8.0.4...@capacitor/push-notifications@8.1.0 ">8.1.0</a>
(2026-05-15)</h1>
<h3>Features</h3>
<ul>
<li><strong>push-notifications:</strong> add banner and list
presentation options for iOS (<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/2529 ">#2529</a>)
(<a
href="f266d2e86b ">f266d2e</a>)</li>
</ul>
<h2><code>@capacitor/push-notifications</code><a
href="https://github.com/8 "><code>@8</code></a>.0.4</h2>
<h2><a
href="https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/push-notifications@8.0.3...@capacitor/push-notifications@8.0.4 ">8.0.4</a>
(2026-05-07)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>add Importance 0 for notification channels (<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/2507 ">#2507</a>)
(<a
href="b98c4f9ee3 ">b98c4f9</a>)</li>
</ul>
<h2><code>@capacitor/push-notifications</code><a
href="https://github.com/8 "><code>@8</code></a>.0.3</h2>
<h2><a
href="https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/push-notifications@8.0.2...@capacitor/push-notifications@8.0.3 ">8.0.3</a>
(2026-03-25)</h2>
<p><strong>Note:</strong> Version bump only for package
<code>@capacitor/push-notifications</code></p>
<h2><code>@capacitor/push-notifications</code><a
href="https://github.com/8 "><code>@8</code></a>.0.2</h2>
<h2><a
href="https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/push-notifications@8.0.1...@capacitor/push-notifications@8.0.2 ">8.0.2</a>
(2026-03-06)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>android:</strong> notification Bundles with non-string
values (<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/2445 ">#2445</a>)
(<a
href="2788f81d5d ">2788f81</a>)</li>
</ul>
<h2><code>@capacitor/push-notifications</code><a
href="https://github.com/8 "><code>@8</code></a>.0.1</h2>
<h2><a
href="https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/push-notifications@8.0.0...@capacitor/push-notifications@8.0.1 ">8.0.1</a>
(2026-02-12)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>AGP 9.0 no longer supporting <code>proguard-android.txt</code> (<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/2468 ">#2468</a>)
(<a
href="a8760a989f ">a8760a9</a>)</li>
</ul>
<h2><code>@capacitor/push-notifications</code><a
href="https://github.com/7 "><code>@7</code></a>.0.7</h2>
<h2><a
href="https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/push-notifications@7.0.6...@capacitor/push-notifications@7.0.7 ">7.0.7</a>
(2026-07-03)</h2>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="0bfde98313 "><code>0bfde98</code></a>
chore(release): publish [skip ci]</li>
<li><a
href="2be8127d58 "><code>2be8127</code></a>
docs(motion): add orientation listener example to README (<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/2558 ">#2558</a>)</li>
<li><a
href="060e41c5fb "><code>060e41c</code></a>
chore: add dist to root gitignore (<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/2560 ">#2560</a>)</li>
<li><a
href="5b652926fe "><code>5b65292</code></a>
docs(browser): remove Web/iOS specific warning for close() (<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/2519 ">#2519</a>)</li>
<li><a
href="ee3475836b "><code>ee34758</code></a>
chore(android): format code for latest prettier (<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/2553 ">#2553</a>)</li>
<li><a
href="e84bf954b3 "><code>e84bf95</code></a>
chore(status-bar): format Package.swift (<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/2547 ">#2547</a>)</li>
<li><a
href="0b4e735cfd "><code>0b4e735</code></a>
docs(README): remove watch plugin and add local-llm (<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/2544 ">#2544</a>)</li>
<li><a
href="d32b1c6608 "><code>d32b1c6</code></a>
chore: format java code (<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/2536 ">#2536</a>)</li>
<li><a
href="265ca0b1b5 "><code>265ca0b</code></a>
chore: format java code (<a
href="https://redirect.github.com/ionic-team/capacitor-plugins/issues/2535 ">#2535</a>)</li>
<li><a
href="63c874c253 "><code>63c874c</code></a>
chore(release): publish [skip ci]</li>
<li>Additional commits viewable in <a
href="https://github.com/ionic-team/capacitor-plugins/compare/@capacitor/push-notifications@7.0.6...@capacitor/push-notifications@8.1.2 ">compare
view</a></li>
</ul>
</details>
<br />
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores )
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
</details>
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-18 22:12:05 -07:00
ischindl
72877c8cf9
fix(RUFU-074): idle backoff + jitter for the task-deleted outbox consumer ( #3471 )
...
**Problem:** Each dashboard/engine project consumer polled
`task_deleted` outbox on a fixed 5s setInterval, so ~44 per-project
consumers thundered together on the same cadence — an idle DB query
storm and CPU hot-spot even when projects were paused/idle.
**Fix:** The outbox consumer reschedules itself from each poll outcome:
an idle poll (zero events) grows the next delay by
`TASK_DELETED_OUTBOX_BACKOFF_STEP_MS` toward `MAX_POLL_MS`, with ±20%
jitter so the consumers de-synchronize; a poll that delivered events
resets to the fast base. A paused/idle project drains its outbox and
backoff alone drops the DB load.
**Includes:** regression test (bounded jitter + idle growth),
performance changeset, solution doc, deploy handoff script.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **Performance**
- Reduced unnecessary idle polling by gradually increasing the polling
interval, up to 60 seconds, with bounded timing variation.
- Restored the faster 5-second polling cadence when new events, waits,
or transient errors occur.
- Preserved event ordering, delivery guarantees, acknowledgements, and
independent behavior across concurrent consumers.
- **Documentation**
- Added guidance on polling behavior, deployment verification, and
monitoring targets.
- **Tests**
- Added coverage for backoff growth, jitter limits, event bursts,
concurrent consumers, error handling, retries, and clean shutdown.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-08-18 22:11:47 -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
4d54cfea77
test(engine): repair extracted orphan-resume fixture ( #3487 )
...
## Summary
- observe the injected executor dispatch seam in the orphan-resume lane
test
- make the lane guard non-vacuous and cover every renamed non-WIP lane
## Test plan
- `corepack pnpm --filter @fusion/engine exec vitest run
src/__tests__/executor-resume-lanes-resolved.test.ts
--silent=passed-only --reporter=dot` (12 passed)
- `corepack pnpm --filter @fusion/engine typecheck`
2026-08-18 22:10:31 -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
ad24d9a0eb
fix: TUI Enter crash, and show any running tunnel in the System panel
...
Enter on the System panel killed the TUI. It opens the dashboard URL with a
detached spawn, and a MISSING opener — xdg-open on any slim Linux container,
exactly where Fusion runs headless — is reported asynchronously as an 'error'
event rather than a synchronous throw. The try/catch around spawn never saw
it, so Node re-threw an 'error' with no listener and took the dashboard down.
The tunnel row now covers any tunnel, not just `pnpm dev --tunnel`:
SystemInfo.devTunnelUrl becomes tunnelUrl, fed by the dev wrapper's IPC
hand-off AND by the engine's TunnelProcessManager status subscription. An
operator's remote tunnel URL previously lived only in the Settings UI and
/remote/status, so a headless terminal could not read the address its own
Fusion was reachable at. A dev tunnel wins when both exist, and a stopped
tunnel clears the row rather than stranding a dead URL.
And the panel measures the row it draws. estimateSystemContentRows accounted
for URL and Token but not Tunnel, so a wrapping trycloudflare hostname was
squeezed out of the panel it had just been added to.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-18 21:57:57 -07:00
gsxdsm
5422063fb9
test: pin the dev tunnel row in the TUI system panel
...
Covers the render both ways: the Tunnel row appears with its URL when a
tunnel is published, and is absent for an ordinary `fn dashboard` run.
Verified by mutation — deleting the row from app.tsx fails the first test.
Driving this through a real TTY proved impractical from a non-interactive
shell (isTTYAvailable needs stdin AND stdout to be TTYs, which neither
`docker exec -t` nor a detached `script` provides), so the render is pinned
here instead of by observation.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-18 21:30:47 -07:00
gsxdsm
204772bcc3
fix: show the dev tunnel URL in the TUI instead of painting over it
...
`pnpm dev --tunnel` printed its banner to stdout, and a TTY run then handed
the screen to DashboardTUI, which repainted over it. The public URL — the
entire output of the flag — was unreadable.
The wrapper forwards the URL to the dev child over the IPC channel it already
uses for the listening report, and the dashboard renders a Tunnel row in the
system panel beside URL and Token.
Capture is order-independent. cloudflared can publish before or after the TUI
is constructed, and an IPC message that arrives with no listener attached is
lost, so the URL is stored at run scope on arrival and applied by whichever
half completes second.
Watch-mode restarts reuse the tunnel (a fresh quick tunnel would hand out a
new hostname on every reload), but the new child knows nothing about it, so
the wrapper re-announces on each listening report.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-18 21:20:34 -07:00
gsxdsm
2556083b68
test: restore the four workspace-merge tests broken by a stale mock
...
project-engine.test.ts hand-writes a factory for ../merge/merger-ai.js, and
it had drifted from the module: WorkspaceMergeDispatchSupersededError was
missing. Production imports that class, so the merge-queue drain threw "No
<export> is defined on the mock" before the code under test ran — the four
Phase C hardening cases then failed on a resolved promise and an absent
updateTask call, for a reason unrelated to what they assert.
No product change. All 114 tests in the file pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-18 21:14:26 -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
b67e3aa8bc
fix: stop onboarding ambushing a working install with questions
...
Two defects, both visible as "why is it asking me about AI provider setup
when I just started a dev server?".
The auto-launch gate probed ~/.fusion/fusion-central.db to decide whether the
install was initialized. SQLite central was removed, so a Postgres install
never creates that file and the probe was permanently false: onboarding
auto-launched on every interactive start of a completely working Fusion,
until something happened to stamp the completion marker. The probe now also
accepts the embedded Postgres data directory.
And auto-launched onboarding ran the full interactive flow. It fires while
the operator is starting something else, so its questions interrupt work
nobody asked to interrupt — and a dev server stopped on a prompt never
listens, which is why `pnpm dev --tunnel` produced no dev server and so no
tunnel link. Auto-launch is now non-interactive: create the central database,
stamp the marker, point at the dashboard, ask nothing. `fn onboard` still
runs every step.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-18 20:55:18 -07:00
gsxdsm
ce69558c7a
fix: always create the central DB during onboarding, never ask
...
The step was a skippable prompt, but declining left an install Fusion cannot
run on — reported by a line that described the breakage without fixing it.
There is no useful negative answer.
It also blocked non-interactive startup: `pnpm dev --tunnel` sat on "Run
central db now? (Y/n)", never reached listening, and so served nothing at all
while the tunnel had no dev server to point at.
The database is now created unconditionally when absent; the already-exists
path is untouched. Scripted onboarding tests lose their leading central-DB
answer, and the skip-every-step case now asserts the database is still
created.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-18 20:40:34 -07:00
gsxdsm
6f461a4744
fix: take the dev tunnel's token from the dev server, not a guessed file
...
The banner re-derived the token from ~/.fusion/settings.json. That is simply
the wrong source: on a real run the file contained no daemonToken while the
dashboard's own banner, two lines above, printed a working one — so the
tunnel claimed no token existed next to a token that plainly did.
The dashboard already holds the resolved token at the point where it reports
its bound port, so it now reports both over the same IPC message and the
wrapper prefers that over anything it could derive. The env/settings lookup
survives only for targets that report nothing, such as an explicit
--tunnel=PORT aimed at a server the dev child knows nothing about. The token
crosses the existing parent/child channel only; it is never logged or sent
onward.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-18 20:16:44 -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