Commit Graph

13694 Commits

Author SHA1 Message Date
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
944ca642ee FN-9154: add fail-closed PostgreSQL hygiene reporting
Add an offline PostgreSQL cluster-hygiene report that records trustworthy campaign admission evidence.

- Parse provenance envelopes and fail closed on missing, malformed, cross-cluster, or stale-marker evidence.
- Classify campaign databases and owner liveness without authorizing destructive cleanup.
- Document the capture workflow and cover measured, malformed, liveness, marker, and unrelated-name cases.

Files changed:
 docs/testing.md                                    |  27 +++
 .../pg-cluster-hygiene-report/count-mismatch.txt   |   9 +
 .../fixtures/pg-cluster-hygiene-report/empty.txt   |   0
 .../pg-cluster-hygiene-report/liveness-absent.txt  |   7 +
 .../pg-cluster-hygiene-report/liveness-alive.txt   |   8 +
 .../pg-cluster-hygiene-report/liveness-dead.txt    |   8 +
 .../pg-cluster-hygiene-report/malformed.txt        |  11 ++
 .../pg-cluster-hygiene-report/markers-stale.txt    |   8 +
 .../fixtures/pg-cluster-hygiene-report/mixed.txt   |  17 ++
 .../pg-cluster-hygiene-report/no-banner.txt        |   1 +
 .../pg-cluster-hygiene-report/post-state.txt       |   7 +
 .../pg-cluster-hygiene-report/pre-state.txt        |   8 +
 .../pg-cluster-hygiene-report/truncated.txt        |   7 +
 .../__tests__/pg-cluster-hygiene-report.test.mjs   | 171 +++++++++++++++++
 scripts/pg-cluster-hygiene-report.mjs              | 212 +++++++++++++++++++++
 15 files changed, 501 insertions(+)

Fusion-Task-Id: FN-9154

Fusion-Task-Lineage: fca5a025-9460-4850-8ac9-891d563b3d04

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-19 18:44:29 -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
161edaa694 FN-9148: add PostgreSQL loaded-failure census
Add retained-log census tooling and evidence for PostgreSQL loaded-lane timeout investigations.

- Parse complete Vitest logs and optional diagnostics without opening PostgreSQL or running tests.
- Classify failing files, lifecycle positions, failure shapes, backend headroom, waits, and watchdog data.
- Cover high-failure, healthy, malformed-diagnostics, and truncated-log cases with fixtures.
- Document the reproduced population, unsupported remedies, and successor measurement requirements.

Files changed:
 ...res-loaded-lane-unrelated-failure-population.md |  80 ++++++++++
 docs/testing.md                                    |   8 +
 .../fixtures/pg-loaded-failure-census/high-run.txt |  77 +++++++++
 .../fixtures/pg-loaded-failure-census/high.jsonl   |   4 +
 .../fixtures/pg-loaded-failure-census/low-run.txt  |   4 +
 .../pg-loaded-failure-census/truncated-run.txt     |   2 +
 .../__tests__/pg-loaded-failure-census.test.mjs    |  65 ++++++++
 scripts/pg-loaded-failure-census.mjs               | 172 +++++++++++++++++++++
 8 files changed, 412 insertions(+)

Fusion-Task-Id: FN-9148

Fusion-Task-Lineage: c632a9d0-b823-4416-ab46-0d834e850007

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-19 06:24:01 -07:00
gsxdsm
687990c0a6 FN-9146: document PostgreSQL flake campaign evidence
Document the bounded investigation results for active core PostgreSQL suite-only flakes.

- Record per-lane outcomes and sampled cluster-capacity evidence for entries 1, 2, and 7.
- Clarify reproduced, unreproduced, and unattributed statuses without changing quarantine policy.
- Ratchet campaign completeness, ownership, and documentation-link coverage in the register tests.

Files changed:
 .../suite-only-flakes-observed-register.md         | 71 +++++++++++++++++-
 docs/testing.md                                    |  4 +
 scripts/__tests__/observed-flake-register.test.mjs | 85 ++++++++++++++++++++--
 3 files changed, 148 insertions(+), 12 deletions(-)

Fusion-Task-Id: FN-9146

Fusion-Task-Lineage: d5de3fac-48d6-4ee7-ae09-173007d234e5

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-19 05:38:54 -07:00
gsxdsm
91daa37162 FN-9147: synchronize script test baselines
Align script-test expectations and documentation with the current validator and dashboard test inventory.

- Add the pre-JSON anchor validator to the verify-fast baseline.
- Ratchet documented pretest validators against canonical order and membership.
- Remove deleted dashboard tests from timing data.

Files changed:
 docs/testing.md                        | 22 +++++++++-
 scripts/__tests__/verify-fast.test.mjs | 76 +++++++++++++++++++++++++++++++++-
 scripts/test-timings.json              |  2 -
 3 files changed, 95 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-9147

Fusion-Task-Lineage: fdb33c60-e019-402b-b91b-ba0f0f971350

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-19 05:23:41 -07:00
gsxdsm
ed2cbd08a1 FN-9145: clarify active flake register states
Reorganize the suite-only flake register around its current decision state.

- Separate active observations, gate evictions, and archived closed records while preserving entry anchors.
- Mark entry 1 as an escalated second sighting and restore FN-9126/FN-9131, FN-9128, and FN-9127 ownership.
- Add regression checks for active counts, exact states and owners, and testing-guide anchors.

Files changed:
 .../suite-only-flakes-observed-register.md         | 189 +++++++++++++--------
 scripts/__tests__/observed-flake-register.test.mjs |  65 +++++++
 2 files changed, 181 insertions(+), 73 deletions(-)

Fusion-Task-Id: FN-9145

Fusion-Task-Lineage: 39b3292a-db48-4be4-878c-7d2b026abae3

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-08-19 04:16:48 -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 />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tar&package-manager=npm_and_yarn&previous-version=7.5.13&new-version=7.5.22)](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 />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@capacitor/push-notifications&package-manager=npm_and_yarn&previous-version=7.0.6&new-version=8.1.2)](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
gsxdsm
027faaa09f ci(release): fail PRs that regress the beta cycle in .changeset/pre.json (#3486)
## Problem

PR #3472 resolved a `.changeset/pre.json` rebase conflict against a copy
predating the v0.76.0 stable:

| | at `v0.77.0-beta.1` | after #3472 |
|---|---|---|
| `initialVersions["@runfusion/fusion"]` | `0.76.0` | `0.75.1` |
| consumed ledger | 67 entries | 158 (the pre-0.76.0 cycle's) |

Nothing failed at PR time. Days later `pnpm release` saw the cycle
anchored below the shipped `v0.76.0`, fired its stale-cycle re-anchor
(`pre exit` → rewrite all 36 `package.json` → `pre enter`), and proposed
**`0.77.0-beta.0`** — below the already-published `0.77.0-beta.1`. The
re-anchor guard exists to stop a beta numbering under a stable; fed a
stale anchor it caused exactly that.

`pre.json` is generated by changesets, hand-edited by nobody, and
conflicts in nearly every long-lived branch — so a wrong resolution is
invisible until release day. This moves the failure to the PR that
causes it.

## The check

`scripts/check-pre-json-anchor.mjs`, three invariants:

- **`anchor-below-stable`** — `initialVersions` must not sit below the
newest `v*` stable tag. This is the exact predicate
`evaluateBetaCycleAnchor` keys on in `release.mjs`, so green here means
the release will *not* re-anchor.
- **`ledger-regression`** — the consumed ledger must stay a **superset**
of the last `chore(release):` commit's. Deliberately not a count test:
#3472's ledger *grew* 67 → 158 while dropping all 67 real entries, so a
size comparison would have passed it.
- **`dangling-ledger-entry`** — every consumed entry keeps its
`.changeset/*.md`, which pre-mode needs to aggregate notes into the
eventual stable release.

Skips cleanly outside pre-mode (the stable track deletes `pre.json`).

## Wiring

Added to the **Lint** job and `pretest`. Job names are unchanged, so no
branch-protection update is needed. The Lint checkout takes
`fetch-depth: 200` + `fetch-tags` rather than a full 486MB clone —
releases land every few days, so that always reaches a baseline; out of
range the ledger rule reports `SKIPPED` rather than passing vacuously,
and the two local rules still run.

## Verification

- Reproducing #3472's exact `pre.json` in the tree → **exit 1** on all
three rules, with the 67 dropped entries named.
- Clean `main` → exit 0.
- 11 unit tests (`scripts/__tests__/check-pre-json-anchor.test.mjs`),
including an explicit assertion that the ledger *grew* in the regression
case.
- `eslint` clean; workflow YAML parses; job names still `Lint,
Typecheck, Build, Gate`.

No changeset: CI config only, no `@runfusion/fusion` behavior change.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
  * Added automated validation for beta release-cycle metadata.
* Checks anchor versions, consumed changeset records, and corresponding
changeset files.
* Provides clear success or error messages and skips checks when release
history is unavailable or not applicable.

* **Chores**
  * Pull request checks now run the beta-cycle validation automatically.
* Added comprehensive coverage for valid, invalid, and skipped
validation scenarios.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 22:10:59 -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