38d883d83eecfa7217d0ea71a65979c53d7da5a3
2174 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
aa534c19af |
FN-7672: recover durable agents stuck in error state despite active manager
Root-causes 4 correlated CTO-report agent failures where durable non-ephemeral agents got stuck in `error` state indefinitely because the heartbeat scheduler stops ticking error-state agents entirely, and self-healing's recovery sweep previously only considered them when their manager row was missing. - SelfHealingManager: scope the `managerMissing` gate to the "running" orphan-detection path only, so "error"-state durable agents with a present/active manager now fall through to the existing transient/operator-actionable/active-execution/cooldown/retry-budget recovery guards instead of being skipped outright - Add FNXC:AgentHeartbeat comment documenting the FN-7672 incident and rationale for the scoping change - Extend self-healing.test.ts with coverage for manager-present durable agents in error state - Add changeset (patch) describing the fix for release notes - Update docs/agents.md accordingly Files changed: .changeset/fn-7672-durable-agent-recovery.md | 7 ++ docs/agents.md | 2 + packages/engine/src/__tests__/self-healing.test.ts | 129 ++++++++++++++++++++- packages/engine/src/self-healing.ts | 24 +++- 4 files changed, 160 insertions(+), 2 deletions(-) Fusion-Task-Id: FN-7672 Fusion-Task-Lineage: 6676dc9e-66e7-4f70-804a-cccf77e8d337 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
ad9a72176c |
FN-7669: pre-bundle @fusion/core gate-safe barrel to cut engine-core gate import-phase cost
Prototype and land a rebuilt-every-run esbuild bundle of the @fusion/core gate-safe barrel closure, collapsing the engine-core gate's per-fork Vite SSR import-phase cost (18 forks x ~430-file closure re-resolved from scratch) into a single file load per fork. - Add scripts/build-engine-core-gate-bundle.mjs: esbuild-bundles packages/core/src/index.gate.ts (220 first-party files, packages:"external" so third-party/node: imports stay external, treeShaking:false to preserve side effects) into packages/core/.gate-bundle/core.mjs + core.meta.json - Wire the builder into packages/engine/vitest.config.ts's engine-core project globalSetup (alongside the existing vitest-teardown hook) so the bundle is rebuilt fresh before every gate invocation, and repoint the @fusion/core resolve.alias at the bundled output instead of index.gate.ts source - Place the bundle output at packages/core/.gate-bundle/ as a sibling of packages/core/node_modules/ (not nested inside it) to avoid Vite SSR's external-dep heuristic, which would otherwise silently defeat vi.mock interception for imports nested in the bundle - Gitignore packages/core/.gate-bundle/ and add a matching ESLint ignore entry so the generated bundle text is never linted or committed - Add esbuild ^0.25.12 as a root devDependency (pnpm-lock.yaml updated accordingly) - Document the pre-bundling rationale, placement constraints, and measured A/B wall-time results in docs/testing.md Verified: pnpm test:gate passes (335/335 engine-core tests, 63/63 CLI ci-shape tests), engine package typecheck clean, eslint clean on touched files. Files changed: .gitignore | 11 ++ docs/testing.md | 3 + eslint.config.mjs | 10 ++ package.json | 1 + packages/engine/vitest.config.ts | 50 ++++++++- pnpm-lock.yaml | 3 + scripts/build-engine-core-gate-bundle.mjs | 174 ++++++++++++++++++++++++++++++ 7 files changed, 247 insertions(+), 5 deletions(-) Fusion-Task-Id: FN-7669 Fusion-Task-Lineage: 62b06b2a-4ac6-45ae-ac79-9771132bc303 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
6902077972 |
FN-7667: add gate-scoped @fusion/core barrel to decouple engine-core gate from full barrel growth
Introduces a project-scoped @fusion/core barrel used only by the engine-core gate project, so new feature modules added to the full barrel don't silently inflate the gate's transform/import cost. - Add packages/core/src/index.gate.ts, a copy of the full @fusion/core barrel minus export statements for modules added since the last re-audit baseline (i.e. it still re-exports everything the full barrel does except newly added, gate-irrelevant feature modules). - Update packages/engine/vitest.config.ts to add a project-scoped resolve.alias mapping @fusion/core -> packages/core/src/index.gate.ts for the engine-core project only; engine-default/engine-reliability/engine-slow and @fusion/engine continue to resolve the full barrel. - Document the gate-safe barrel and its audit procedure in docs/testing.md. Files changed: docs/testing.md | 3 + packages/core/src/index.gate.ts | 2102 ++++++++++++++++++++++++++++++++++++++ packages/engine/vitest.config.ts | 17 + 3 files changed, 2122 insertions(+) Fusion-Task-Id: FN-7667 Fusion-Task-Lineage: 054ec89a-d973-44dd-b9ac-ad266f553f01 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
845fad2aa4 |
FN-7666: record weekly test-velocity regression finding (gate 7.7s -> 36.3s)
Narrative: update the 2026-W28 test-velocity baseline report with the newly measured merge-gate/changed-test wall-time regression and document root-cause attribution. - Bump baseline cycle to 2026-W28 (captured 2026-07-08T09:30:50.606Z) - Update headline metrics table: gate 7.7s -> 36.3s (+28.6s), boot smoke 17.4s -> 25.3s (+7.9s), pnpm test 9.3s -> 43.4s (+34.0s), quarantine count unchanged at 1 - Add FN-7666 finding note attributing the regression to ~4,305 new re-exported source lines across 14 modules pulled through the @fusion/core / @fusion/engine barrels, inflating per-fork import/transform cost across the 18 curated engine-core gate files; confirms it is a genuine regression (not cache/env noise) via cold-vs-warm reruns; files follow-up FN-7667 for the barrel-decoupling fix - Update weekly history table (previous/latest/delta rows) and the #leads post text block - Append new row capturing this week's measurements to scripts/test-velocity-history.json Files changed: docs/test-velocity-baseline.md | 23 ++++---- scripts/test-velocity-history.json | 112 +++++++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+), 12 deletions(-) Fusion-Task-Id: FN-7666 Fusion-Task-Lineage: 73ec627c-2fc6-4289-8e6e-3e839ed5c675 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
03161adfb9 |
FN-7659: paginate and sort the Archived column newest-first
Adds server-side pagination for the Archived task column, sorted by most-recently-archived first, with a Show more control on the dashboard.
- Add ArchiveDatabase.listPage and TaskStore.listArchivedTasks for a bounded SQL LIMIT/OFFSET read ordered by archivedAt DESC
- Add GET /tasks/archived route for paged archive fetches, leaving the legacy merged listTasks({includeArchived}) path unchanged
- Wire useTasks.loadArchivedTasks to fetch page 1 on first Archived-column expand and loadMoreArchivedTasks for subsequent pages
- Add a "Show more" affordance in Column.tsx/Board.tsx/MainContent.tsx to trigger loading additional archived pages
- Extend taskSorting.ts to keep archived task ordering stable with the new paged data
- Add core and dashboard tests covering archive pagination and store/route behavior
- Add changeset for @runfusion/fusion (minor) and update docs/storage.md and docs/dashboard-guide.md
Files changed:
.changeset/FN-7659-archived-pagination.md | 7 +
docs/dashboard-guide.md | 4 +-
docs/storage.md | 7 +
packages/core/src/__tests__/archive-db-pagination.test.ts | 94 ++++++++
packages/core/src/__tests__/store-archive-search.test.ts | 63 ++++++
packages/core/src/archive-db.ts | 18 ++
packages/core/src/store.ts | 32 +++
packages/dashboard/app/App.tsx | 5 +-
packages/dashboard/app/api/legacy.ts | 19 ++
packages/dashboard/app/components/Board.tsx | 19 +-
packages/dashboard/app/components/Column.tsx | 48 ++++-
packages/dashboard/app/components/__tests__/Column.test.tsx | 41 ++++
packages/dashboard/app/components/__tests__/taskSorting.test.ts | 27 +++
packages/dashboard/app/components/dashboard/MainContent.tsx | 9 +
packages/dashboard/app/components/dashboard/types.ts | 6 +
packages/dashboard/app/components/taskSorting.ts | 16 ++
packages/dashboard/app/hooks/__tests__/useTasks.test.ts | 236 ++++++++++++++++++++-
packages/dashboard/app/hooks/useTasks.ts | 173 ++++++++++++++-
packages/dashboard/app/test/mockApi.ts | 3 +
packages/dashboard/src/routes/__tests__/tasks-archived-pagination.test.ts | 94 ++++++++
packages/dashboard/src/routes/register-task-workflow-routes.ts | 32 +++
21 files changed, 930 insertions(+), 23 deletions(-)
Fusion-Task-Id: FN-7659
Fusion-Task-Lineage: 7a5a1f62-277c-4f29-883c-62e75b269bc5
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
|
||
|
|
dd9fa2d3cb |
FN-7661: expose removeLineageReferences on fn_task_archive/fn_task_delete
Fixes fn_task_archive and fn_task_delete rejecting tasks still referenced as a lineage parent, with no tool-exposed way to clear that reference. - Add optional removeLineageReferences boolean param to fn_task_archive and fn_task_delete tool schemas, forwarded to store.archiveTask/store.deleteTask - Update tool descriptions and prompt guidelines to advertise the recovery path (removeLineageReferences:true) when a lineage-parent block occurs - Add task-lineage-unlink.test.ts covering the new parameter behavior - Document the change in docs/storage.md - Add changeset (@runfusion/fusion minor, category: fix) Files changed: .changeset/fn-7661-lineage-unlink-tools.md | 7 + docs/storage.md | 1 + packages/cli/src/__tests__/task-lineage-unlink.test.ts | 199 +++++++++++++++++++++ packages/cli/src/extension.ts | 28 ++- 4 files changed, 232 insertions(+), 3 deletions(-) Fusion-Task-Id: FN-7661 Fusion-Task-Lineage: 414c046c-43df-4995-85a5-ff00b345de50 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
97e46674f4 |
FN-7660: rename remaining board-column "Triage" labels to "Planning"
Rename remaining "Triage" board-column label references to "Planning" across dashboard editors, locale strings, and docs. - Fixed BUILTIN_WORKFLOW_COLUMN_LABELS.triage in board-workflows.ts (was still "Triage", clobbering FN-7599's IR rename); column id "triage" stays unchanged - Updated dashboard components (AgentDetailView, RoutineEditor, ScheduleForm, ScheduleStepsEditor) to use the "Planning" label - Updated en/app.json locale strings (board.triage, schedule.columnTriage/taskColumnTriage/triageColumn) to "Planning" - Updated board-workflows tests to assert the new label - Updated docs/dashboard-guide.md Triage/Planning column references to "Planning", preserving the FN-7653 intake-only gating correction - Added a patch changeset documenting the label-consistency fix Files changed: .changeset/fn-7660-planning-label-consistency.md | 7 +++++++ docs/dashboard-guide.md | 9 +++++---- packages/dashboard/app/components/AgentDetailView.tsx | 2 +- packages/dashboard/app/components/RoutineEditor.tsx | 2 +- packages/dashboard/app/components/ScheduleForm.tsx | 2 +- packages/dashboard/app/components/ScheduleStepsEditor.tsx | 2 +- .../dashboard/src/routes/__tests__/board-workflows.test.ts | 7 ++++++- packages/dashboard/src/routes/board-workflows.ts | 10 +++++++++- packages/i18n/locales/en/app.json | 8 ++++---- 9 files changed, 35 insertions(+), 14 deletions(-) Fusion-Task-Id: FN-7660 Fusion-Task-Lineage: fc6c94d6-9876-4c0e-80b1-a5518903952e Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
f7d9509294 |
FN-7658: gate same-agent duplicate auto-archiving behind opt-in setting
Duplicate tasks created by the same agent are no longer auto-archived by default; they are flagged for review instead, controlled by a new opt-in project setting. - Add project setting `autoArchiveDuplicateTasksEnabled` (default false) gating the FN-4892 same-agent duplicate intake path - Add `flagSameAgentDuplicate` path and `nearDuplicateOf` metadata used when auto-archive is disabled; tombstone-resurrection blocking is unchanged - Wire the setting through core settings schema/types/store, dashboard SchedulingSection UI, and i18n strings - Update docs (settings-reference.md, task-management.md) to describe the new default-off behavior - Add a changeset for the @runfusion/fusion minor release - Extend duplicate-intake, tombstone-window, store-parent-task-dedup, and reliability-interaction tests to cover both flag states Files changed: $(cat /tmp/fn7658_stat.txt) Fusion-Task-Id: FN-7658 Fusion-Task-Lineage: 7d0d1074-1020-48a8-b96f-186154c2c408 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
511bcaf56d |
FN-7657: persist GitHub issue import modal state across close/reopen
Retains the GitHub Import Tasks modal's provider/tab/filter/selection state so returning to Import Tasks doesn't reset the user's in-progress import setup. - GitHubImportModal now persists provider, active tab, label filter, remote, and issue selection per project via a new modalPersistence hook, restoring them on remount instead of always defaulting. - Added packages/dashboard/app/hooks/modalPersistence.ts to encapsulate the persisted-state read/write logic backed by projectStorage. - projectStorage.ts gains the `kb-dashboard-github-import-state` storage key. - Falls back to the existing default-remote auto-detect behavior when no persisted state exists. - Added extensive test coverage in GitHubImportModal.test.tsx for the new persistence behavior. - Updated docs/dashboard-guide.md to describe the retained state. - Added a patch changeset for @runfusion/fusion. Files changed: .changeset/fn-7657-github-import-state-retained.md | 7 + docs/dashboard-guide.md | 2 + .../dashboard/app/components/GitHubImportModal.tsx | 204 +++++++++++++-- .../__tests__/GitHubImportModal.test.tsx | 282 +++++++++++++++++++++ packages/dashboard/app/hooks/modalPersistence.ts | 72 ++++++ packages/dashboard/app/utils/projectStorage.ts | 1 + 6 files changed, 547 insertions(+), 21 deletions(-) Fusion-Task-Id: FN-7657 Fusion-Task-Lineage: c8086340-368c-4efd-a12a-4cddeeb0aa26 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
ebe9b9fa67 |
FN-7653: restrict plan auto-approve toggle to the intake/planning column
Fix the Board Auto-approve plan shortcut leaking onto hold (Todo-like) columns; it must render only on the intake/planning column. - Board.tsx: gate the planAutoApproveEnabled/onTogglePlanAutoApprove prop pair on columnDef.flags.intake only (dropped the || columnDef.flags.hold clause) for both the aggregate and single-workflow column renders - Column.tsx: update the FNXC comment to document that Board.tsx is the single source of truth for this intake-only gating; Column.tsx just renders whatever prop it receives - docs/dashboard-guide.md: correct the Board guide to describe the toggle as intake/planning-column-only, not hold columns - Board.test.tsx: fix the existing intake/hold test expectation to assert the hold column does NOT get the toggle, and add a regression test reproducing the built-in Coding workflow's Todo (hold) column symptom - add a patch changeset documenting the fix Files changed: .changeset/FN-7653-plan-auto-approve-intake-only.md | 7 +++++++ docs/dashboard-guide.md | 5 +++-- packages/dashboard/app/components/Board.tsx | 6 ++++-- packages/dashboard/app/components/Column.tsx | 5 ++++- .../app/components/__tests__/Board.test.tsx | 20 +++++++++++++++++--- 5 files changed, 35 insertions(+), 8 deletions(-) Fusion-Task-Id: FN-7653 Fusion-Task-Lineage: 10c5f01a-b00c-4039-9b83-a8a8965fc56c Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
efabdd6f04 |
FN-7651: remove chat "Search in title only" toggle
Simplifies chat search UX by always matching both title and message content, removing the now-unneeded title-only toggle button and state. - Removed the "Search in title only" toggle button and its CSS from ChatView - Dropped searchInTitleOnly/setSearchInTitleOnly state and logic from useChat; content-search query params are now always-on - Updated ChatView tests to drop title-only toggle interactions and assertions - Removed the title-only-search i18n string across all locales - Updated dashboard-guide.md docs to reflect the simplified search behavior - Added a patch changeset documenting the removal Files changed: .../fn-7651-remove-chat-title-only-toggle.md | 7 +++ docs/dashboard-guide.md | 4 +- packages/dashboard/app/components/ChatView.css | 18 -------- packages/dashboard/app/components/ChatView.tsx | 26 +++-------- .../__tests__/ChatView.autosize.test.tsx | 2 - .../__tests__/ChatView.content-search.test.tsx | 51 ++++++---------------- .../components/__tests__/ChatView.draft.test.tsx | 2 - .../__tests__/ChatView.hash-mention.test.tsx | 2 - .../__tests__/ChatView.mobile-render.test.tsx | 2 - .../components/__tests__/ChatView.rooms.test.tsx | 2 - .../__tests__/ChatView.scroll-to-top.test.tsx | 2 - .../components/__tests__/ChatView.test-harness.tsx | 2 - packages/dashboard/app/hooks/useChat.ts | 39 ++++++++--------- packages/i18n/locales/en/app.json | 1 - packages/i18n/locales/es/app.json | 1 - packages/i18n/locales/zh-CN/app.json | 1 - packages/i18n/locales/zh-TW/app.json | 1 - packages/i18n/locales/ko/app.json | 1 - packages/i18n/locales/fr/app.json | 1 - 19 files changed, 47 insertions(+), 118 deletions(-) Fusion-Task-Id: FN-7651 Fusion-Task-Lineage: 5a31825c-8e6e-441f-800d-6053f5f844ba Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
bec8987ce9 |
FN-7648: gate hold-release on trait-based unplanned-card check, not literal todo column
Blocks planning/intake column cards from entering processing columns regardless of literal column id, so renamed custom intake/planning columns are covered by the same guard as the legacy todo column. - Add isUnplannedForExecution() in hold-release.ts: true when task.status==="planning", or when the card sits in the legacy todo column or a column carrying the intake trait AND its PROMPT.md still equals the bootstrap stub. - Route issueRelease() (used by the sweep, promoteHeldTask, and releaseHeldTaskByEvent) through this guard before releasing into any countsTowardWip processing column. - Update scheduler.ts's reserveSlot guard to use the same trait-based predicate instead of a hardcoded "todo" column id check. - Add regression tests in hold-release.test.ts and scheduler-workflow-cutover.test.ts covering renamed intake/planning columns. - Document the invariant in docs/architecture.md and docs/workflow-steps.md. - Add changeset (patch) describing the fix. Files changed: .changeset/fn-7648-unplanned-intake-cards-never-execute.md | 7 + docs/architecture.md | 2 + docs/workflow-steps.md | 2 + packages/engine/src/__tests__/hold-release.test.ts | 238 +++++++++++++++++++++ packages/engine/src/__tests__/scheduler-workflow-cutover.test.ts | 60 +++++- packages/engine/src/hold-release.ts | 60 ++++++ packages/engine/src/scheduler.ts | 26 +-- 7 files changed, 378 insertions(+), 17 deletions(-) Fusion-Task-Id: FN-7648 Fusion-Task-Lineage: a4b54d30-f86d-4eb9-9cf2-6ac55b6dbe58 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
4e8c621e9c |
FN-7641: fix cards stranded after out-of-band/workspace merges by allowing proven-merge rehome
Fixes a state-machine bug family where cards got stranded after out-of-band or workspace merges landed: store.moveTask now allows a proven-merge recoveryRehome to cross legacy columns (e.g. todo→done), and nodeId='end' finalize no longer silently no-ops — it finalizes on durable merge proof or returns an explicit error, consistently across the dashboard route, the CLI task-update tool, and store.updateTask. - packages/core/src/store.ts: allow proven-merge recoveryRehome moves across legacy columns (e.g. todo→done) instead of rejecting them - packages/core/src/node-override-guard.ts: nodeId='end' finalize now checks for durable merge proof and returns an explicit error instead of silently no-op'ing - packages/dashboard/src/routes/register-task-workflow-routes.ts: dashboard workflow route surfaces the new explicit finalize error/behavior - packages/cli/src/extension.ts: CLI task-update tool surfaces the same explicit finalize error/behavior - docs/task-management.md: documented the updated finalize/rehome behavior - Added regression tests across core (node-override-guard, store-movement, task-node-override), dashboard (register-task-workflow-routes.nodeid-finalize), engine (merger-merge-lifecycle), and CLI (extension) covering the stranded-card invariant - Added changeset for @runfusion/fusion (patch) Files changed: .changeset/fn-7641-stranded-cards-after-merge.md | 7 ++ docs/task-management.md | 2 + packages/cli/src/__tests__/extension.test.ts | 59 ++++++++++++++ packages/cli/src/extension.ts | 10 +++ .../core/src/__tests__/node-override-guard.test.ts | 93 +++++++++++++++++++++ packages/core/src/__tests__/store-movement.test.ts | 94 ++++++++++++++++++++++ .../core/src/__tests__/task-node-override.test.ts | 73 +++++++++++++++++ packages/core/src/node-override-guard.ts | 69 +++++++++++++++- packages/core/src/store.ts | 69 +++++++++++++++- ...er-task-workflow-routes.nodeid-finalize.test.ts | 90 +++++++++++++++++++++ .../src/routes/register-task-workflow-routes.ts | 10 +++ .../src/__tests__/merger-merge-lifecycle.test.ts | 58 +++++++++++++ 12 files changed, 631 insertions(+), 3 deletions(-) Fusion-Task-Id: FN-7641 Fusion-Task-Lineage: 48ea7851-ee68-48f1-92f9-302d0da5acff Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
923bba7082 |
FN-7645: force re-arm zombie heartbeat timers detected as stale during audit
Fixes the heartbeat timer audit so it repairs not just missing timer registrations but also 'zombie' ones — timer entries that remain present in memory after their underlying interval silently stopped firing. Long-interval (~1h) agents were most affected since a single lost tick compounded into hours of staleness before self-healing noticed. - HeartbeatTriggerScheduler audit now computes staleness (elapsed vs repair-stale threshold) up front for every timer-eligible agent, not only for agents missing a timer entry - Present-but-stale timer entries are now treated as non-advancing and force cleared/re-registered via registerAgent() (which already clears any existing timer before re-arming) - Fresh (non-stale) present timers are left alone so healthy short-interval agents are never force-re-armed or double-ticked - Repair reason/log messages now distinguish zombie-timer-rearmed repairs from missing-registration repairs, and the summary log reports counts for each - Added heartbeat-scheduler tests covering the zombie-timer repair path - Added changeset and a docs/architecture.md note Files changed: .changeset/fn-7645-heartbeat-rearm.md | 7 + docs/architecture.md | 1 + .../src/__tests__/heartbeat-scheduler.test.ts | 223 +++++++++++++++++++++ packages/engine/src/agent-heartbeat.ts | 42 +++- 4 files changed, 266 insertions(+), 7 deletions(-) Fusion-Task-Id: FN-7645 Fusion-Task-Lineage: 652bc2eb-a660-4306-9f85-d2d5f9ca7e38 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
6777eea5d2 |
FN-7631: add content search to Chat sidebar with title-only toggle
Chat sidebar search now matches message content by default, not just the conversation title/agent, with an opt-out toggle to restore title-only filtering. - Add ChatStore.searchSessionsByMessageContent (parameterized LIKE ... ESCAPE) for server-side content search across sessions - GET /chat/sessions route (register-chat-routes.ts, legacy.ts) gains q/titleOnly query params, debounced server-side content lookup merged with local title/agent matches - useChat hook exposes searchInTitleOnly state and wires debounced content search into session list results - ChatView renders a "Search in title only" toggle beside the search box (desktop + mobile) and shows a "Matched: ..." preview snippet on content-matched rows - Task-planner sessions remain excluded from content matches via the same common-feed visibility guard used for the normal session list - Add unit/integration tests: chat-store content-search, chat-routes API test, ChatView content-search test - Update docs/dashboard-guide.md to document the new content search behavior and toggle - Add changeset fn-7631-chat-content-search.md (@runfusion/fusion minor) Files changed: .changeset/fn-7631-chat-content-search.md | 7 + docs/dashboard-guide.md | 2 + .../__tests__/chat-store.content-search.test.ts | 157 +++++++++++++++++++++ packages/core/src/chat-store.ts | 64 +++++++++ packages/core/src/chat-types.ts | 8 ++ packages/dashboard/app/api/legacy.ts | 23 ++- packages/dashboard/app/components/ChatView.css | 30 ++++ packages/dashboard/app/components/ChatView.tsx | 26 ++++ .../__tests__/ChatView.autosize.test.tsx | 2 + .../__tests__/ChatView.content-search.test.tsx | 114 +++++++++++++++ .../components/__tests__/ChatView.draft.test.tsx | 2 + .../__tests__/ChatView.hash-mention.test.tsx | 2 + .../__tests__/ChatView.mobile-render.test.tsx | 2 + .../components/__tests__/ChatView.rooms.test.tsx | 2 + .../__tests__/ChatView.scroll-to-top.test.tsx | 2 + .../components/__tests__/ChatView.test-harness.tsx | 2 + packages/dashboard/app/hooks/useChat.ts | 105 ++++++++++++-- .../dashboard/src/__tests__/chat-routes.test.ts | 78 ++++++++++ .../dashboard/src/routes/register-chat-routes.ts | 39 ++++- packages/i18n/locales/en/app.json | 2 + packages/i18n/locales/es/app.json | 2 + packages/i18n/locales/fr/app.json | 2 + packages/i18n/locales/ko/app.json | 2 + packages/i18n/locales/zh-CN/app.json | 2 + packages/i18n/locales/zh-TW/app.json | 2 + 25 files changed, 667 insertions(+), 12 deletions(-) Fusion-Task-Id: FN-7631 Fusion-Task-Lineage: bc68b489-26a7-453e-901b-bda816af364e Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
1b7bb1fe18 |
FN-7639: wire message editing into Planner Chat
Adds the ability to edit and resend a prior user message in task-detail Planner Chat, discarding subsequent turns without reverting already-applied steering/refinement side effects. - Wire FN-7628's editChatMessage + rewindSessionForEdit into TaskPlannerChatTab for synthetic task-planner:<id> sessions - Add edit affordance/UI flow and message resend handling in TaskPlannerChatTab - Ensure already-applied steering comments and refinement tasks are not reverted when a turn is discarded - Expand TaskPlannerChatTab test coverage for edit/resend flows - Update dashboard guide docs to describe the new Planner Chat edit behavior - Add changeset for @runfusion/fusion (minor) Files changed: .changeset/fn-7639-planner-chat-edit.md | 7 + docs/dashboard-guide.md | 4 +- .../app/components/TaskPlannerChatTab.tsx | 90 +++++++- .../__tests__/TaskPlannerChatTab.test.tsx | 242 ++++++++++++++++++++- 4 files changed, 328 insertions(+), 15 deletions(-) Fusion-Task-Id: FN-7639 Fusion-Task-Lineage: ed568a81-12fa-42a8-9ecf-29e6c9a2a884 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
26f22861fa |
FN-7637: port bundled-plugin auto-install into @fusion/core for the desktop runtime
Move the host-agnostic bundled-plugin auto-install logic (manifest loading, entry-path resolution, install/update/enable flow) out of the CLI package into @fusion/core so the desktop embedded runtime can auto-install bundled runtime plugins without depending on the CLI package; the CLI module becomes a thin adapter that supplies its own bundle-dir resolution to the shared helper. - Add packages/core/src/plugins/bundled-plugin-install.ts with the shared, host-agnostic ensureBundledPluginInstalled / ensureBundledDependencyGraphPluginInstalled / ensureBundledCursorRuntimePluginInstalled implementation and BUNDLED_PLUGIN_IDS/ isBundledPluginId/resolvePluginEntryPath, exported from @fusion/core's index. - Slim packages/cli/src/plugins/bundled-plugin-install.ts to a CLI-specific candidate-bundle-dir resolver that delegates to @fusion/core and re-exports the same public surface dashboard.ts/serve.ts/daemon.ts already depend on. - Remove the now-redundant packages/cli/src/plugins/__tests__/resolve-plugin-entry-path-sync.test.ts (coverage moved with the implementation to @fusion/core). - Add packages/desktop/src/bundled-plugin-dirs.ts to resolve each bundled plugin's staged package directory via import.meta.resolve, mirroring the CLI's dist/plugins/<id> resolver. - Wire local-runtime.ts and local-server.ts to call ensureBundledPluginInstalled before loadAllPlugins() and expose a lazy-install callback for PUT /api/plugins/:id/settings, mirroring the CLI dashboard command's startup auto-install pass. - Update docs/PLUGIN_AUTHORING.md to describe the shared bundled-plugin-install location. Files changed: docs/PLUGIN_AUTHORING.md | 11 + .../__tests__/bundled-plugin-install.test.ts | 619 ++------------------- .../resolve-plugin-entry-path-sync.test.ts | 97 ---- packages/cli/src/plugins/bundled-plugin-install.ts | 250 +-------- packages/core/src/index.ts | 8 + .../__tests__/bundled-plugin-install.test.ts | 391 +++++++++++++ .../core/src/plugins/bundled-plugin-install.ts | 186 +++++++ .../src/__tests__/bundled-plugin-dirs.test.ts | 59 ++ .../desktop/src/__tests__/local-runtime.test.ts | 183 +++++- .../desktop/src/__tests__/local-server.test.ts | 96 +++- packages/desktop/src/bundled-plugin-dirs.ts | 61 ++ packages/desktop/src/local-runtime.ts | 66 ++- packages/desktop/src/local-server.ts | 36 +- 13 files changed, 1171 insertions(+), 892 deletions(-) Fusion-Task-Id: FN-7637 Fusion-Task-Lineage: 953c5b82-a079-4600-b3af-45c974cd5014 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
42009cfdb9 |
FN-7628: allow editing sent chat messages and rewinding agent responses
Adds the ability to edit a previously sent message in an agent chat, which rewinds the session/task room and regenerates the response from the edited message. - Add chat-store support for locating/replacing a message and truncating subsequent history for a rewind - Add a chat-manager rewind-session flow and a new register-chat-routes endpoint to rewind a room to an edited message - Add legacy API route wiring and useChat hook support for issuing an edit request - Add ChatView/StandardChatSurface/TaskPlannerChatTab UI affordances (edit control, styling) to trigger message edits - Add a changeset documenting the new chat message-edit capability - Add unit/integration tests covering chat-store rewind logic, chat-manager rewind-session behavior, chat routes, useChat, and ChatView edit UI Files changed: .changeset/fn-7628-chat-message-edit.md | 7 + docs/dashboard-guide.md | 4 + packages/core/src/__tests__/chat-store.test.ts | 171 ++++++++++++++ packages/core/src/chat-store.ts | 95 ++++++++ packages/dashboard/app/api/legacy.ts | 22 ++ packages/dashboard/app/components/ChatView.css | 78 ++++++ packages/dashboard/app/components/ChatView.tsx | 14 ++ .../app/components/StandardChatSurface.tsx | 87 ++++++- .../app/components/TaskPlannerChatTab.tsx | 8 + .../__tests__/ChatView.autosize.test.tsx | 1 + .../__tests__/ChatView.default-model-icon.test.tsx | 1 + .../components/__tests__/ChatView.draft.test.tsx | 1 + .../__tests__/ChatView.hash-mention.test.tsx | 1 + .../__tests__/ChatView.message-edit.test.tsx | 262 +++++++++++++++++++++ .../__tests__/ChatView.mobile-render.test.tsx | 1 + .../components/__tests__/ChatView.rooms.test.tsx | 1 + .../__tests__/ChatView.scroll-to-top.test.tsx | 1 + .../components/__tests__/ChatView.test-harness.tsx | 1 + .../dashboard/app/hooks/__tests__/useChat.test.ts | 98 ++++++++ packages/dashboard/app/hooks/useChat.ts | 60 +++++ .../__tests__/chat-manager-rewind-session.test.ts | 185 +++++++++++++++ .../dashboard/src/__tests__/chat-manager.test.ts | 12 + .../dashboard/src/__tests__/chat-routes.test.ts | 124 ++++++++++ packages/dashboard/src/chat.ts | 147 +++++++++++- .../dashboard/src/routes/register-chat-routes.ts | 52 ++++ 25 files changed, 1429 insertions(+), 5 deletions(-) Fusion-Task-Id: FN-7628 Fusion-Task-Lineage: 36d98989-1b75-428c-baf1-b2c7e8e78013 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
5b243f1223 |
FN-7636: surface Hermes runtime models in /api/models picker
Adds a short-TTL, single-flight Hermes model cache and merges Hermes profile-list models additively into the dashboard's /api/models endpoint under the hermes provider, without displacing existing entries. - Add packages/dashboard/src/hermes-model-cache.ts: single-flight, short-TTL cache wrapping `hermes profile list` CLI output (no per-request spawn) - Merge Hermes-provided models into register-model-routes.ts's /api/models response, deduped by provider/id, additive-only - Add unit tests for the Hermes model cache and the /api/models route's Hermes merge behavior - Document the new behavior in docs/settings-reference.md - Add changeset (@runfusion/fusion: minor) describing the feature for release notes Files changed: .changeset/fn-7636-hermes-picker-models.md | 7 + docs/settings-reference.md | 2 + packages/dashboard/src/__tests__/hermes-model-cache.test.ts | 158 +++++++++++++++++ packages/dashboard/src/__tests__/register-model-routes-hermes.test.ts | 186 +++++++++++++++++++++ packages/dashboard/src/hermes-model-cache.ts | 168 +++++++++++++++++++ packages/dashboard/src/routes/register-model-routes.ts | 33 ++++ 6 files changed, 554 insertions(+) Fusion-Task-Id: FN-7636 Fusion-Task-Lineage: c5ab3bba-37e4-416b-9325-667a8ef321dc Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
0f2bfa546c |
FN-7629: add enable/disable control for built-in runtime plugins
Adds a durable Plugin Manager toggle to enable/disable built-in runtime plugins (Hermes, Paperclip, OpenClaw, Droid) that persists across restarts, replacing the dead-end "Built-in metadata only" CTA. - renderBuiltinPluginSection now renders an enable/disable toggle for runtime built-ins regardless of installed status - Disabling a not-yet-installed built-in first installs it (mirroring CLI's ensureBundledPluginInstalled) then immediately disables it, so a plugin_installs row + disabled project state exists with no new persistence primitive needed - HermesRuntimeCard/OpenClawRuntimeCard/PaperclipRuntimeCard now show "Disabled in Plugin Manager" instead of a stale detected/connected status when disabled - Added i18n strings across all locales and updated docs - Added changeset for @runfusion/fusion (minor) - Expanded plugin-loader and PluginManager test coverage for the new disable/enable flows Files changed: .changeset/fn-7629-builtin-runtime-disable.md | 7 + docs/dashboard-guide.md | 1 + docs/plugin-management.md | 4 + packages/core/src/__tests__/plugin-loader.test.ts | 46 ++++++ .../dashboard/app/components/HermesRuntimeCard.tsx | 40 ++++- .../app/components/OpenClawRuntimeCard.tsx | 32 +++- .../app/components/PaperclipRuntimeCard.tsx | 32 +++- .../dashboard/app/components/PluginManager.css | 34 +++++ .../dashboard/app/components/PluginManager.tsx | 167 +++++++++++++++------ .../components/__tests__/PluginManager.test.tsx | 12 +- .../__tests__/PluginManager.toggle.test.tsx | 104 ++++++++++++- packages/i18n/locales/en/app.json | 4 + packages/i18n/locales/es/app.json | 4 + packages/i18n/locales/fr/app.json | 4 + packages/i18n/locales/ko/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 | 4 + 18 files changed, 440 insertions(+), 67 deletions(-) Fusion-Task-Id: FN-7629 Fusion-Task-Lineage: 2a25bb1f-3f73-4273-8769-af05c61778f9 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
ca7c987ab5 |
FN-7621: fix mobile terminal shortcut bar horizontal scroll defeated by ancestor touch-action lock
Root-caused and fixed the third recurrence of the mobile terminal shortcut bar not scrolling horizontally: styles.css's mobile lockdown resets touch-action to pan-y across ancestors, and touch-action's used value is the intersection of the touched element's and every ancestor's value, so the leaf .terminal-shortcut-panel's pan-x was silently defeated even though it was already correct. - Opt the terminal overlay and modal ancestors (.modal-overlay.terminal-modal-overlay, .modal.terminal-modal--mobile, plain-media-query mobile modal, and the shortcut/status footer) into touch-action: pan-x pan-y so descendant leaf touch-action values can take effect - Add FNXC:Terminal comments documenting the ancestor-intersection root cause and recurrence history (FN-7550/FN-7560) - Add a documented solution note under docs/solutions/ui-bugs/ for the ancestor-intersection touch-action pattern - Add regression tests asserting the modal/overlay/footer ancestors carry the pan-x pan-y opt-in - Add a changeset for the fix Files changed: .../fn-7621-mobile-terminal-shortcut-scroll.md | 7 ++ ...on-ancestor-intersection-defeats-leaf-scroll.md | 57 +++++++++++ .../dashboard/app/components/TerminalModal.css | 38 ++++++++ .../components/__tests__/TerminalModal.test.tsx | 106 +++++++++++++++++++++ 4 files changed, 208 insertions(+) Fusion-Task-Id: FN-7621 Fusion-Task-Lineage: 771fd79e-e193-43b0-908b-0e8fe2fc2c70 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
8d73b18c35 |
FN-7620: fix mobile terminal rendering blank via ResizeObserver recovery
Fixes the mobile dashboard terminal sometimes rendering completely blank on open by having TerminalModal recover from a zero/collapsed container box. - TerminalModal now attaches a persistent ResizeObserver directly on the xterm container, mirroring SessionTerminal's existing pattern - When the container reports a zero/collapsed box on the first post-open fit, it now re-fits once the real box settles instead of staying stuck at FitAddon's degenerate 2x1-cell floor - Added regression tests covering TerminalModal and SessionTerminal zero-geometry recovery - Documented the root cause and fix in docs/solutions/ui-bugs/mobile-terminal-blank-render-zero-geometry-container.md - Added a patch changeset for @runfusion/fusion Files changed: .changeset/fn-7620-mobile-terminal-blank-render.md | 7 + docs/solutions/ui-bugs/mobile-terminal-blank-render-zero-geometry-container.md | 112 +++++++ packages/dashboard/app/components/TerminalModal.tsx | 49 +++ packages/dashboard/app/components/__tests__/SessionTerminal.test.tsx | 66 ++++ packages/dashboard/app/components/__tests__/TerminalModal.test.tsx | 358 +++++++++++++++++++++ 5 files changed, 592 insertions(+) Fusion-Task-Id: FN-7620 Fusion-Task-Lineage: 103f5b17-9a6e-4e9a-ab61-65ccb2203a8d Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
f3c50de7e7 |
test(engine): stub reconcileSupersededGeneratedFixFeatures on mission-validation-trigger-gap mocks
recoverActiveMissions (mission-execution-loop.ts:263) calls missionStore.reconcileSupersededGeneratedFixFeatures per slice; the 5 MissionExecutionLoop-backed mocks here omitted it, so recovery threw (TypeError) at the slice loop and aborted before processTaskOutcome / ensureFeatureAssertionLinked / startValidatorRun ran — 4 tests failed. Add a no-op stub (matches mission-execution-loop.test.ts reference) with an FNXC:MissionReconcile note. No-op is correct: supersession is not exercised by these tests. |
||
|
|
9e5c025113 |
FN-7608: block executors on pending approvals instead of allowing workarounds
Executors could previously treat a pending approval as a normal turn end and go hunt for ungated workarounds instead of stopping. This change makes wait-for-approval a hard suspend point. - wait-for-approval now suspends the in-flight executor session via awaitAbortInFlightTaskWork - Dedupe identical pending approvals so repeated waits don't pile up - Executor prompts now carve out awaiting-approval as a legitimate turn end (agent-prompts.ts) - Extend provisioning-gate and agent-action-gate coverage for the new suspend/carveout behavior - Add changeset (patch) documenting the fix for release notes - Update docs/agents.md and docs/architecture.md to describe the new blocking behavior Files changed: .changeset/fn-7608-awaiting-approval-blocking.md | 7 ++ docs/agents.md | 1 + docs/architecture.md | 1 + packages/core/src/agent-prompts.ts | 5 + .../engine/src/__tests__/agent-action-gate.test.ts | 82 +++++++++++++ .../executor-approval-gate-suspend.test.ts | 128 +++++++++++++++++++++ .../executor-approval-prompt-carveout.test.ts | 61 ++++++++++ packages/engine/src/agent-heartbeat.ts | 13 +++ packages/engine/src/executor.ts | 28 +++++ packages/engine/src/pi.ts | 22 +++- .../sandbox/__tests__/provisioning-gate.test.ts | 29 +++++ packages/engine/src/sandbox/provisioning-gate.ts | 11 ++ 12 files changed, 384 insertions(+), 4 deletions(-) Fusion-Task-Id: FN-7608 Fusion-Task-Lineage: 9e42d8ee-bda7-4ef1-b159-46c2100bbc48 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
e44458119c |
FN-7616: make the Planning Mode deepening prompt plan-specific
Replace the fixed generic "Would you like to go deeper?" theme buckets with AI-proposed, plan-specific topics, falling back to the existing regex-derived themes when the AI supplies none. - Add optional PlanningSummary.deepeningThemes (id/label/description) to the completion payload contract in @fusion/core. - Instruct the planning AI prompt to propose 2-5 concrete, plan-aligned deepening themes tied to the plan's actual title/description/deliverables. - Add normalizeDeepeningThemes to validate/sanitize untrusted AI-supplied theme data (dedupe, cap at 6, trim, drop malformed entries) and omit the field entirely when nothing valid remains. - Update buildDeepeningCheckpointOptions to prefer AI-supplied deepeningThemes over the generic CHECKPOINT_THEME_CANDIDATES regex fallback, keeping the reserved 'Proceed to final plan' option first and deterministic in both branches. - Update docs/dashboard-guide.md to describe the new plan-specific deepening behavior and its generic fallback. - Add unit test coverage for the new normalization and checkpoint-option-building logic. - Add a minor changeset for @runfusion/fusion. Files changed: .changeset/fn-7616-planning-deepening-themes.md | 7 + docs/dashboard-guide.md | 3 +- packages/core/src/types.ts | 11 ++ .../planning-interview-formatters.test.ts | 176 +++++++++++++++++++++ .../src/__tests__/routes-planning.test.ts | 61 +++++++ packages/dashboard/src/planning.ts | 86 +++++++++- 6 files changed, 341 insertions(+), 3 deletions(-) Fusion-Task-Id: FN-7616 Fusion-Task-Lineage: f6c1d0d7-f0ca-45c9-85cd-d57958ad94c7 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
5631c88d54 |
FN-7614: replace planning-mode banner with yellow nav badge for needs-input state
Planning Mode's "waiting for input" indicator moves from a top banner (whose button did not redirect correctly) to a yellow status-dot badge on the Planning nav destination, matching the existing chat unread-badge pattern. - Add a `planningNeedsInput` flag in app lifecycle utils to detect awaiting_input planning sessions - Exclude planning awaiting_input sessions from SessionNotificationBanner so the banner no longer shows for this case - Add a status-dot--pending badge to the Planning entry in LeftSidebarNav and to the Planning item/tab in MobileNavBar - Add/extend tests covering appLifecycle, LeftSidebarNav, MobileNavBar, and SessionNotificationBanner behavior - Add changeset (patch) documenting the fix - Update dashboard-guide.md docs Files changed: .changeset/fn-7614-planning-badge.md | 7 +++ docs/dashboard-guide.md | 4 ++ packages/dashboard/app/App.tsx | 13 +++- .../dashboard/app/components/LeftSidebarNav.tsx | 10 +++ packages/dashboard/app/components/MobileNavBar.css | 20 ++++++ packages/dashboard/app/components/MobileNavBar.tsx | 19 +++++- .../components/__tests__/LeftSidebarNav.test.tsx | 28 +++++++++ .../app/components/__tests__/MobileNavBar.test.tsx | 41 ++++++++++++ .../__tests__/SessionNotificationBanner.test.tsx | 44 +++++++++++++ .../app/utils/__tests__/appLifecycle.test.ts | 73 +++++++++++++++++++++- packages/dashboard/app/utils/appLifecycle.ts | 12 ++++ 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/zh-CN/app.json | 1 + packages/i18n/locales/zh-TW/app.json | 1 + packages/i18n/src/resources.d.ts | 1 + 18 files changed, 275 insertions(+), 3 deletions(-) Fusion-Task-Id: FN-7614 Fusion-Task-Lineage: 249e6ee8-149c-4d51-85b6-561dfc30c769 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
44442622c5 |
FN-7609: show gated action payload details on approval requests
Approval cards previously showed only a generic gating message with no visibility into the underlying command/arguments being approved, and repeated pending requests for the same action could pile up as duplicates. - Add GatedActionApprovalDetails component to render the gated command/arguments payload on agent-gating approval cards in MailboxView - Persist approvalDedupeKey in targetAction.context and a payload-bearing summary via buildAgentGatedActionSummary in permanent-agent-gating - Wire agent-heartbeat, executor, and pi to pass through the richer gated-action context/summary - Add changeset (patch) documenting the fix - Update docs/dashboard-guide.md - Add/extend tests: GatedActionApprovalDetails, MailboxView, permanent-agent-gating, pi-create-fn-agent Files changed: .changeset/FN-7609-gated-action-approval-payload.md | 7 ++ docs/dashboard-guide.md | 1 + packages/core/src/types.ts | 8 +++ .../app/components/GatedActionApprovalDetails.css | 50 ++++++++++++++ .../app/components/GatedActionApprovalDetails.tsx | 72 +++++++++++++++++++ packages/dashboard/app/components/MailboxView.tsx | 12 ++++ .../__tests__/GatedActionApprovalDetails.test.tsx | 66 ++++++++++++++++++ .../app/components/__tests__/MailboxView.test.tsx | 41 +++++++++++ .../src/__tests__/permanent-agent-gating.test.ts | 31 +++++++++ .../src/__tests__/pi-create-fn-agent.test.ts | 80 ++++++++++++++++++++++ packages/engine/src/agent-heartbeat.ts | 19 ++++- packages/engine/src/executor.ts | 19 ++++- packages/engine/src/permanent-agent-gating.ts | 53 ++++++++++++++ packages/engine/src/pi.ts | 6 ++ 14 files changed, 461 insertions(+), 4 deletions(-) Fusion-Task-Id: FN-7609 Fusion-Task-Lineage: 80a6bb5b-79f7-4b78-9204-402c2dea6171 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
e347062e1f |
FN-7603: force xterm DOM-based char measurement to fix mobile terminal spacing
Fixes recurrence #5 of mobile terminal inter-character spacing by unifying xterm's cell-width measurement pipeline with WidthCache's DOM-based glyph measurement, validated against real xterm instead of the jsdom mock. - Add withDomBasedTerminalCharacterMeasurement() in terminalPreferences.ts: transiently hides window.OffscreenCanvas during terminal.open() so CharSizeService's constructor throws and self-selects its own DOM-based fallback strategy, unifying dimensions.css.cell.width with WidthCache.get('W') measurement - Wire withDomBasedTerminalCharacterMeasurement() around terminal.open() calls in SessionTerminal.tsx and TerminalModal.tsx - Add FNXC:Terminal comments documenting the Canvas-vs-DOM measurement divergence root cause, grounded in the installed @xterm/xterm@5.5.0 source - Add docs/solutions/ui-bugs/xterm-options-noop-remeasure-after-font-settle.md recurrence #5 section - Expand TerminalModal.test.tsx coverage for the new measurement-forcing behavior - Add changeset fn-7603-mobile-terminal-spacing.md (patch, fix) Files changed: .changeset/fn-7603-mobile-terminal-spacing.md | 7 + docs/solutions/ui-bugs/xterm-options-noop-remeasure-after-font-settle.md | 101 ++++++ packages/dashboard/app/components/SessionTerminal.tsx | 16 +- packages/dashboard/app/components/TerminalModal.tsx | 16 +- packages/dashboard/app/components/__tests__/TerminalModal.test.tsx | 363 ++++++++++++++++++++- packages/dashboard/app/utils/terminalPreferences.ts | 63 ++++ 6 files changed, 554 insertions(+), 12 deletions(-) Fusion-Task-Id: FN-7603 Fusion-Task-Lineage: 6c7d980f-953e-4fa9-908e-b24125904cbe Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
f7dfcb3b09 |
FN-7604: collapse overseer/oversight controls into a single dropdown across surfaces
Unifies the previously mobile-only Oversight overflow menu into a single, always-present dropdown that replaces the scattered desktop oversight buttons and the separate mobile affordance. - Replace discrete desktop oversight action buttons in TaskDetailModal's footer with one universal "Oversight actions" dropdown trigger, reusing the menu across desktop and mobile breakpoints. - Simplify TaskDetailModal.tsx footer rendering logic, removing now-redundant responsive branching for oversight controls. - Update TaskDetailModal.css to drop the old mobile-only oversight-overflow styles and support the unified dropdown across breakpoints. - Update definition-actions, oversight-controls, oversight-mobile, rendering, and responsive-and-dependencies tests to assert the single dropdown behavior and disambiguate the exact "Actions" button query from the new "Oversight actions" aria-label. - Refresh docs/dashboard-guide.md to describe the unified oversight dropdown UX. Files changed: docs/dashboard-guide.md | 14 +- packages/dashboard/app/components/TaskDetailModal.css | 89 +++++------ packages/dashboard/app/components/TaskDetailModal.tsx | 177 +++------------------ packages/dashboard/app/components/__tests__/TaskDetailModal.definition-actions.test.tsx | 70 ++++---- packages/dashboard/app/components/__tests__/TaskDetailModal.oversight-controls.test.tsx | 130 ++++++++++----- packages/dashboard/app/components/__tests__/TaskDetailModal.oversight-mobile.test.tsx | 42 +++-- packages/dashboard/app/components/__tests__/TaskDetailModal.rendering.test.tsx | 27 ++-- packages/dashboard/app/components/__tests__/TaskDetailModal.responsive-and-dependencies.test.tsx | 57 ++++--- 8 files changed, 278 insertions(+), 328 deletions(-) Fusion-Task-Id: FN-7604 Fusion-Task-Lineage: afbb7573-d654-48db-a9ac-aecbd8e22e46 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
c0abca90d8 |
FN-7598: add planner-oversight discovery pointers to README and docs hub
Docs-only change adding front-door discovery for the already-shipped planner-oversight feature (FN-7508 → FN-7583), which previously had no entry point outside internal reference docs. - Add a README.md feature table row and a new "Planner oversight" section describing oversight levels (off/observe/steer/autonomous) and the always-on human-confirmation gate for merge/PR and destructive actions, linking to Settings Reference and Dashboard Guide - Add a README.md capabilities bullet cross-linking the new section - Add a docs/README.md hub row pointing to Settings Reference, Dashboard Guide, and Architecture for planner oversight, and extend the 'power user' reading path - Add a one-line pointer in docs/getting-started.md workflow section noting per-task/workflow oversight controls Files changed: README.md | 11 +++++++++++ docs/README.md | 9 ++++++--- docs/getting-started.md | 3 +++ 3 files changed, 20 insertions(+), 3 deletions(-) Fusion-Task-Id: FN-7598 Fusion-Task-Lineage: 8141b44c-f007-45c0-a057-f4eeb34ae8d4 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
09a1c9d843 |
FN-7596: regression-test the Coding (Ideas) manual-intake lifecycle end-to-end
Adds cross-layer regression coverage for the manual-intake parking lifecycle (create -> parked -> operator Start promotion -> poll-time todo-discovery), and clarifies the workflow-steps doc to describe the tested lifecycle. - packages/core: covers store create -> moveTask promotion out of the parked intake column - packages/engine: covers triage poll ordering/discovery of the still-unplanned bootstrap-stub card - packages/dashboard: covers TaskCard's Start affordance for parked cards - docs: documents the full regression-tested lifecycle for manual-intake column parking (FN-7596) Files changed: docs/workflow-steps.md | 2 +- .../__tests__/store-create-intake-column.test.ts | 26 ++++ .../app/components/__tests__/TaskCard.test.tsx | 153 +++++++++++++++++++++ packages/engine/src/__tests__/triage.test.ts | 119 +++++++++++++++- 4 files changed, 298 insertions(+), 2 deletions(-) Fusion-Task-Id: FN-7596 Fusion-Task-Lineage: 267c3d9a-6181-4ca5-b871-7009c0204372 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
f30d55fae7 |
FN-7593: move Before/After Transformation section to top of task definitions
Reorders task-definition prompt templates so the Before -> After Transformation section appears before other sections, making the expected change visible first. - Move the Before -> After Transformation section ahead of other sections in agent-prompts.ts task-definition templates - Update docs/task-management.md to reflect the new section order - Add/extend tests in agent-prompts.test.ts and triage.test.ts covering the new ordering - Add changeset fn-7593-before-after-top.md documenting the change Files changed: .changeset/fn-7593-before-after-top.md | 7 +++++++ docs/task-management.md | 2 +- packages/core/src/__tests__/agent-prompts.test.ts | 20 ++++++++++++++++++++ packages/core/src/agent-prompts.ts | 20 +++++++++++++------- packages/engine/src/__tests__/triage.test.ts | 17 +++++++++++++++++ 5 files changed, 58 insertions(+), 8 deletions(-) Fusion-Task-Id: FN-7593 Fusion-Task-Lineage: d0d5eb4d-2fe0-456c-b061-5c078b78911b Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
cf3fe8b485 |
FN-7591: make dashboard create surfaces resolve intake column from workflow instead of hard-coding triage
Fixes dashboard task creation so new cards land in the selected/default workflow's intake column instead of always forcing legacy triage, letting workflows like Coding (Ideas) park new cards in 'ideas' until an operator promotes them. - InlineCreateCard, QuickEntryBox, and NewTaskModal no longer hard-code column:"triage"; InlineCreateCard now forwards workflowId at create time instead of applying it post-create. - Fixed a glue-layer regression in useTaskHandlers.ts (handleBoardQuickCreate/handleModalCreate) that re-forced column:"triage" even after UI surfaces stopped sending it. - Added/updated tests covering the store's intake-column resolution and the dashboard create surfaces/hooks. - Documented the new manual-intake-column parking behavior in dashboard-guide.md and workflow-steps.md. - Added a patch changeset for @runfusion/fusion. Files changed: .changeset/fn-7591-coding-ideas-intake.md | 7 +++ docs/dashboard-guide.md | 4 ++ docs/workflow-steps.md | 1 + packages/core/src/__tests__/store-create-intake-column.test.ts | 20 ++++++++ packages/dashboard/app/App.tsx | 5 +- packages/dashboard/app/components/InlineCreateCard.tsx | 28 ++++------ packages/dashboard/app/components/NewTaskModal.tsx | 5 +- packages/dashboard/app/components/QuickEntryBox.tsx | 5 +- packages/dashboard/app/components/TodoView.tsx | 7 ++- packages/dashboard/app/components/__tests__/InlineCreateCard.test.tsx | 59 +++++++++++++++++++++- packages/dashboard/app/components/__tests__/QuickEntryBox.test.tsx | 14 +++-- packages/dashboard/app/components/__tests__/TodoView.test.tsx | 10 ++-- packages/dashboard/app/components/__tests__/board-quickcreate-workflow-lane-visibility.test.tsx | 45 ++++++++++++++++- packages/dashboard/app/hooks/__tests__/useTaskHandlers.test.ts | 27 ++++++++-- packages/dashboard/app/hooks/useTaskHandlers.ts | 8 ++- 15 files changed, 207 insertions(+), 38 deletions(-) Fusion-Task-Id: FN-7591 Fusion-Task-Lineage: 510f0e6a-89e7-468f-a6df-ad6aebd5c33a Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
53fe0d71b9 |
FN-7584: register builtin:brainstorming workflow with ask-user/exit-gate loop
Adds a discoverable built-in Brainstorming workflow composing the ask-user + exit-gate reach-out loop ahead of the standard coding plan/execute/review/merge spine, plus a WorkflowNodeEditor fix so clearing the ask-user question textarea deletes the config key instead of persisting an empty string. - Add packages/core/src/builtin-brainstorming-workflow-ir.ts registering builtin:brainstorming (non-default, default-enabled): ask-user -> refine prompt -> exit-gate-on-approval ahead of the unmodified Coding plan/execute/review/merge spine - Wire the new builtin into packages/core/src/builtin-workflows.ts and extend the builtin-workflows parity test suite - Add builtin-brainstorming-workflow-ir.test.ts covering the new workflow's IR shape and validation - Fix WorkflowNodeEditor.tsx ask-user question textarea onChange to delete the config.question key when cleared to empty (validateAskUserAndExitGateNodes rejects present-but-empty question; only an absent key falls back to the engine default) - Update docs/workflow-steps.md to document builtin:brainstorming as a selectable built-in composition - Add .changeset/fn-7584-brainstorming-builtin.md (minor, feature) Files changed: .changeset/fn-7584-brainstorming-builtin.md | 7 ++ docs/workflow-steps.md | 2 +- .../builtin-brainstorming-workflow-ir.test.ts | 79 ++++++++++++++++ .../core/src/__tests__/builtin-workflows.test.ts | 66 +++++++++++++ .../core/src/builtin-brainstorming-workflow-ir.ts | 103 +++++++++++++++++++++ packages/core/src/builtin-workflows.ts | 46 +++++++++ .../app/components/WorkflowNodeEditor.tsx | 18 +++- 7 files changed, 319 insertions(+), 2 deletions(-) Fusion-Task-Id: FN-7584 Fusion-Task-Lineage: 2c0258c2-9a35-403a-8688-ee49393a7231 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
42bbe58c03 |
FN-7579: add ask-user and exit-gate workflow nodes
Add workflow nodes for mid-flow user reach-out and early exit from a workflow run. - Add `ask-user` IR node kind that reuses the await-input park/resume mechanism and surfaces the question in the task chat for brainstorming/clarification. - Add `exit-gate` IR node kind that terminates the workflow early, with an optional condition. - Wire both node kinds through the engine executor and workflow-node-handlers, including a new exit-gate-runner. - Update the WorkflowNodeEditor palette, node summaries, and node help text for the two new node types. - Extend workflow-flow-mapping to support the new node kinds. - Keep `prompt`+`awaitInput` as a back-compat alias. - Add core/engine/dashboard tests covering the new node kinds. - Document the new nodes in docs/workflow-steps.md. - Add changeset for the new minor feature. Files changed: .changeset/fn-7579-ask-user-exit-gate-nodes.md | 7 + docs/workflow-steps.md | 28 ++++ packages/core/src/__tests__/workflow-ir.test.ts | 120 ++++++++++++++ packages/core/src/workflow-ir-types.ts | 12 +- packages/core/src/workflow-ir.ts | 47 ++++++ .../app/components/WorkflowNodeEditor.tsx | 181 ++++++++++++++++++++- .../app/components/__tests__/node-summary.test.ts | 43 +++++ .../__tests__/workflow-flow-mapping.test.ts | 49 ++++++ .../app/components/nodes/WorkflowNodeTypes.tsx | 14 +- .../dashboard/app/components/nodes/node-help.ts | 24 +++ .../dashboard/app/components/nodes/node-summary.ts | 28 ++++ .../app/components/workflow-flow-mapping.ts | 4 + .../workflow-graph-executor-handlers.test.ts | 115 +++++++++++++ .../src/__tests__/workflow-node-handlers.test.ts | 66 ++++++++ packages/engine/src/executor.ts | 23 ++- packages/engine/src/workflow-node-handlers.ts | 18 +- .../src/workflow-node-runners/exit-gate-runner.ts | 81 +++++++++ 17 files changed, 849 insertions(+), 11 deletions(-) Fusion-Task-Id: FN-7579 Fusion-Task-Lineage: 9a89ff49-200d-4a6c-b97c-15d219349ee5 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
74358494a7 |
FN-7577: extend PR-based revert to workspace tasks under autoMerge:false
Extends FN-7554's single-repo PR revert path to workspace (multi-repo) tasks: when autoMerge is disabled, the revert route now opens one dedicated fusion/revert-<id> PR per sub-repo instead of refusing workspace tasks outright.
- Add prepareWorkspaceRevertPrBranches (packages/engine/src/task-revert.ts): classifies every sub-repo first and only prepares a per-sub-repo fusion/revert-<id> branch when all sub-repos are clean/already-reverted (all-or-nothing at branch-prep phase); never force-writes any sub-repo integration branch.
- Export the new helper from packages/engine/src/index.ts.
- Extend POST /api/tasks/:id/revert (register-task-workflow-routes.ts) to resolve owner/repo and check the GitHub rate limiter for every sub-repo before pushing/creating any PR, opening one PR per sub-repo and returning an additive { mode: "pr", clean: true, workspace: { repos: [...] } } result; degrades the whole task to needsHuman if GitHub is unconfigured or any sub-repo is rate-limited, rather than opening a partial subset of PRs.
- Leave existing { mode: "git" | "ai" | "pr" } shapes, the autoMerge:true workspace path, and FN-7554's single-repo PR path unchanged.
- Add engine real-git coverage (task-revert-workspace-pr.real-git.test.ts) and extend dashboard route tests (task-revert-route.test.ts) for the new workspace PR path.
- Add changeset (.changeset/fn-7577-workspace-pr-revert.md, minor) and update docs/task-management.md.
Files changed:
.changeset/fn-7577-workspace-pr-revert.md | 7 +
docs/task-management.md | 3 +-
.../src/__tests__/task-revert-route.test.ts | 313 ++++++++++++++++-
.../src/routes/register-task-workflow-routes.ts | 181 +++++++++-
.../task-revert-workspace-pr.real-git.test.ts | 371 +++++++++++++++++++++
packages/engine/src/index.ts | 4 +
packages/engine/src/task-revert.ts | 295 ++++++++++++++++
7 files changed, 1166 insertions(+), 8 deletions(-)
Fusion-Task-Id: FN-7577
Fusion-Task-Lineage: bedbfab7-5804-485f-9b40-64531edfc64a
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
|
||
|
|
78d4db94d8 |
FN-7575: add release version lines to Fusion self-repo done comments
Extends GitHubIssueCommentService so task-close comments on issues in the runfusion/fusion repo itself append both a current-version and target-next-minor-release line, while comments on all other linked repos stay byte-for-byte unchanged.
- Add isFusionSelfRepo() and computeNextMinorVersion() helpers to github-issue-comment.ts
- Append "Current version: v{current}" and "Target release: v{next-minor}" lines only when the linked source issue's repo is runfusion/fusion (case-insensitive)
- Fall back silently (no version lines) when the resolved version is unparseable or the unresolved 0.0.0 sentinel
- Add changeset (minor) documenting the new behavior
- Update docs/settings-reference.md and docs/gitlab-parity-inventory.md
- Expand github-issue-comment.test.ts coverage for self-repo vs other-repo behavior and version edge cases
Files changed:
.changeset/fn-7575-release-version-comment.md | 7 +
docs/gitlab-parity-inventory.md | 2 +-
docs/settings-reference.md | 2 +-
packages/dashboard/src/__tests__/github-issue-comment.test.ts | 142 ++++++++++++++++++++-
packages/dashboard/src/github-issue-comment.ts | 69 +++++++++-
5 files changed, 212 insertions(+), 10 deletions(-)
Fusion-Task-Id: FN-7575
Fusion-Task-Lineage: b7cf7e6f-8d96-4442-8595-5d54ea911481
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
|
||
|
|
73b38babf0 |
FN-7578: surface aiUndoTaskWorkflowId picker in Settings General
Adds a Settings → General picker so operators can choose which workflow governs AI-undo (revert) board tasks, instead of it being fixed. - Add aiUndoTaskWorkflowId select to GeneralSection, defaulting to builtin:review-heavy, with an "Inherit project default workflow" empty-string option matching the revert route's blank-is-inherit behavior (FN-7556) - Load full workflow list (including custom workflows, excluding fragments) separately from the builtin-only workflow list used for enable/disable checkboxes - Add FNXC:TaskRevert comment documenting the default/inherit semantics - Add tests for the new picker and update settings-default-descriptions test - Add changeset (minor) and update settings-reference/task-management docs - Add i18n strings across en/es/fr/ko/zh-CN/zh-TW locales Files changed: .changeset/fn-7578-ai-undo-workflow-setting-ui.md | 7 ++ docs/settings-reference.md | 2 +- docs/task-management.md | 2 +- .../settings/sections/GeneralSection.tsx | 42 +++++++ .../GeneralSection.aiUndoWorkflow.test.tsx | 129 +++++++++++++++++++++ .../settings-default-descriptions.test.tsx | 3 +- packages/i18n/locales/en/app.json | 5 +- packages/i18n/locales/es/app.json | 5 +- packages/i18n/locales/fr/app.json | 5 +- packages/i18n/locales/ko/app.json | 5 +- packages/i18n/locales/zh-CN/app.json | 5 +- packages/i18n/locales/zh-TW/app.json | 5 +- 12 files changed, 205 insertions(+), 10 deletions(-) Fusion-Task-Id: FN-7578 Fusion-Task-Lineage: 1d1701ab-ecc7-4bbe-a003-2ce45ac15a25 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
e7cb2f1fed |
FN-7525: add Revert/Undo affordance to Done and Archived task cards
Adds a Revert action so operators can undo landed changes for Done/Archived tasks directly from the board. - Adds onRevertTask wiring through Board, Column, Lane, ListView, TaskDetailModal, and WorktreeGroup surfaces - Adds a Revert affordance to TaskCard (Done/Archived states) with confirm UX and CSS - Adds POST /tasks/:id/revert legacy API route supporting "auto" mode with an AI-undo fallback (mode: "ai") on conflict - Wires useTasks hook and dashboard MainContent/types to support the new revert action - Adds new i18n strings for the revert affordance - Adds a minor changeset for @runfusion/fusion documenting the feature - Adds/updates tests: TaskCard.test.tsx, board-mobile.test.tsx, api-git.test.ts - Updates docs/dashboard-guide.md and docs/task-management.md Files changed: .changeset/fn-7525-revert-card-affordance.md | 7 + docs/dashboard-guide.md | 2 +- docs/task-management.md | 10 ++ packages/dashboard/app/App.tsx | 7 +- packages/dashboard/app/__tests__/api-git.test.ts | 51 +++++++ packages/dashboard/app/api/legacy.ts | 51 +++++++ packages/dashboard/app/components/AppModals.tsx | 5 +- packages/dashboard/app/components/Board.tsx | 10 +- packages/dashboard/app/components/Column.tsx | 8 +- packages/dashboard/app/components/Lane.tsx | 5 +- packages/dashboard/app/components/ListView.tsx | 80 ++++++++++- packages/dashboard/app/components/TaskCard.css | 24 +++- packages/dashboard/app/components/TaskCard.tsx | 127 ++++++++++++++++- packages/dashboard/app/components/TaskDetailModal.tsx | 85 ++++++++++++ packages/dashboard/app/components/WorktreeGroup.tsx | 6 + packages/dashboard/app/components/__tests__/TaskCard.test.tsx | 151 +++++++++++++++++++++ packages/dashboard/app/components/__tests__/board-mobile.test.tsx | 63 +++++++++ packages/dashboard/app/components/dashboard/MainContent.tsx | 4 + packages/dashboard/app/components/dashboard/types.ts | 8 ++ packages/dashboard/app/components/useRightDockController.tsx | 4 + packages/dashboard/app/hooks/useTasks.ts | 21 ++- packages/i18n/locales/en/app.json | 11 ++ 22 files changed, 718 insertions(+), 22 deletions(-) Fusion-Task-Id: FN-7525 Fusion-Task-Lineage: b9e2ca94-4ec6-4443-8e41-cf4828018856 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
94e9d15e38 |
FN-7556: auto-select review-heavy workflow for AI-undo tasks
AI-undo tasks now default to a configurable, stricter review workflow instead of always inheriting the project default. - Add project setting `aiUndoTaskWorkflowId` (default `builtin:review-heavy`) to ProjectSettings type and DEFAULT_PROJECT_SETTINGS - `POST /api/tasks/:id/revert` resolves and validates the configured workflow id (via `isBuiltinWorkflowId`/`getWorkflowDefinition`), falling back to inherit-with-warning on a blank/unknown value - `createAiUndoTask` engine helper gains an optional `workflowId` param, forwarded verbatim to `createTask` only when non-blank, staying pure (no settings/store access itself) - Add regression tests for the route resolution logic and the engine helper's workflow forwarding - Update docs (`settings-reference.md`, `task-management.md`) and add changeset Files changed: .changeset/fn-7556-ai-undo-workflow.md | 7 +++ docs/settings-reference.md | 1 + docs/task-management.md | 1 + packages/core/src/settings-schema.ts | 4 ++ packages/core/src/types.ts | 14 +++++ .../settings-default-descriptions.test.tsx | 2 + .../src/__tests__/task-revert-route.test.ts | 52 ++++++++++++++++- .../src/routes/register-task-workflow-routes.ts | 31 +++++++++- .../src/__tests__/task-revert-ai-undo.test.ts | 67 ++++++++++++++++++++++ packages/engine/src/task-revert.ts | 16 ++++++ 10 files changed, 192 insertions(+), 3 deletions(-) Fusion-Task-Id: FN-7556 Fusion-Task-Lineage: dec5603c-10a8-4780-a1b8-8a836a0de4c1 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
2df6c356fc |
FN-7554: add PR-based revert path for autoMerge:false projects
Adds a PR-based revert path for done/archived tasks in autoMerge:false projects instead of refusing outright.
- New engine export `prepareRevertPrBranch` (packages/engine/src/task-revert.ts) prepares a dedicated `fusion/revert-<id>` branch off the base branch's HEAD and applies the revert commit(s) there, never mutating the base branch itself.
- `POST /api/tasks/:id/revert` route gains an additive `{ mode: "pr", clean: true, prUrl, prNumber, revertBranch, existingPr? }` result for clean single-repo reverts under autoMerge:false, reusing GitHubClient.createPr, findPrForBranch idempotency, and the manual:true PR handoff.
- Existing `{ mode: "git" | "ai", ... }` result shapes and the autoMerge:true path are unchanged.
- Workspace (multi-repo) tasks are explicitly refused for PR-based revert (out of scope; single PR cannot represent a multi-repo revert).
- Adds real-git integration tests for the new branch-prep/apply/commit flow and expands the dashboard route test coverage.
- Adds a changeset for @runfusion/fusion (minor) and a small task-management doc update.
Files changed:
.changeset/fn-7554-pr-based-revert.md | 7 +
docs/task-management.md | 2 +-
.../src/__tests__/task-revert-route.test.ts | 196 +++++++++++++++++++-
.../src/routes/register-task-workflow-routes.ts | 182 ++++++++++++++++++
.../src/__tests__/task-revert-pr.real-git.test.ts | 206 +++++++++++++++++++++
packages/engine/src/index.ts | 3 +
packages/engine/src/task-revert.ts | 154 +++++++++++++++
7 files changed, 747 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-7554
Fusion-Task-Lineage: 9b1bfd82-2428-4cf7-9b36-77afe3517a14
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
|
||
|
|
ce9df297eb |
FN-7574: fix OAuth token expiry detection and add proactive auto-refresh
Unifies OAuth expiry detection so expired Claude subscription logins correctly show as disconnected with a re-login prompt, and adds a proactive engine-side scheduler that refreshes tokens before they expire. - Share expiry-detection logic between OAuthExpiryMonitor and the /api/auth/status route so both agree on when a token is expired. - Add engine-side oauth-refresh-scheduler that proactively refreshes OAuth tokens ahead of expiry, wired into project-engine (guarded by skipNotifier). - Extend auth-storage with the helpers needed for expiry checks/refresh. - Add tests covering routes-auth status detection, auth-storage expiry helpers, and the new refresh scheduler. - Document the new behavior in dashboard-guide.md and settings-reference.md. - Add changeset for the user-facing fix. Files changed: .../fn-7574-oauth-expiry-detection-refresh.md | 7 + docs/dashboard-guide.md | 4 + docs/settings-reference.md | 4 + .../dashboard/src/__tests__/routes-auth.test.ts | 76 +++++++++++ .../dashboard/src/routes/register-auth-routes.ts | 25 +++- packages/engine/src/__tests__/auth-storage.test.ts | 60 +++++++++ packages/engine/src/auth-storage.ts | 14 +- .../__tests__/oauth-refresh-scheduler.test.ts | 141 ++++++++++++++++++++ packages/engine/src/notification/index.ts | 3 + .../src/notification/oauth-refresh-scheduler.ts | 143 +++++++++++++++++++++ packages/engine/src/project-engine.ts | 14 +- 11 files changed, 488 insertions(+), 3 deletions(-) Fusion-Task-Id: FN-7574 Fusion-Task-Lineage: 59996eac-c070-4992-9727-d066c6934b69 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
986e249bc1 |
FN-7555: surface bidirectional undo/source task links in dashboard UI
Adds a client-side helper and UI affordances so AI-undo tasks and their source tasks link to each other in the dashboard, without any new API or backend changes. - Add packages/dashboard/app/utils/taskRevert.ts with getRevertOfId() (resolves the revertOf marker written by createAiUndoTask, with a defensive sourceType==="recovery" fallback to sourceParentTaskId) and findOpenUndoTaskForSource() (reverse lookup for the most recent open undo task pointing at a source task) - TaskCard and TaskDetailModal now render "Undo of <id>" / "Undo task: <id>" provenance links using the shared helper, keeping forward and reverse affordances consistent - Add TaskCard.css styling for the new undo-link affordance - Add/extend tests: TaskCard.test.tsx and TaskDetailModal.rendering.test.tsx cover the new undo/source link rendering - Update docs/task-management.md and packages/i18n/locales/en/app.json for the new UI copy Files changed: docs/task-management.md | 2 +- packages/dashboard/app/components/TaskCard.css | 37 +++++ packages/dashboard/app/components/TaskCard.tsx | 29 +++- .../dashboard/app/components/TaskDetailModal.tsx | 46 ++++++ .../app/components/__tests__/TaskCard.test.tsx | 46 ++++++ .../__tests__/TaskDetailModal.rendering.test.tsx | 160 +++++++++++++++++++++ packages/dashboard/app/utils/taskRevert.ts | 80 +++++++++++ packages/i18n/locales/en/app.json | 7 +- 8 files changed, 403 insertions(+), 4 deletions(-) Fusion-Task-Id: FN-7555 Fusion-Task-Lineage: c3d2dbd2-4d86-40b5-afce-0ca7a6dfc73d Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
7c0be5311a |
FN-7567: re-bake xterm letter-spacing after fit() to fix mobile terminal spacing recurrence
Fixes recurrence #4 of the mobile terminal excess character-spacing bug: SessionTerminal and TerminalModal now force a second genuine xterm font remeasure AFTER fitAddon.fit() settles the post-fit column count, since handleResize() never re-bakes DomRenderer's letter-spacing compensation itself. - SessionTerminal.tsx: call forceTerminalFontRemeasure() again after fit()/sendResizeMessage() in the resize handler, re-baking spacing against the settled (post-fit) column count instead of the stale pre-fit one. - TerminalModal.tsx: same second forceTerminalFontRemeasure() call after fitAddon.fit()/sendResize() in its resize handling path. - Expanded SessionTerminal.test.tsx and TerminalModal.test.tsx coverage to assert the post-fit remeasure occurs. - Added docs/solutions/ui-bugs/xterm-options-noop-remeasure-after-font-settle.md documenting recurrence #4 root cause (DomRenderer._setDefaultSpacing() never recomputes from handleResize()). - Added changeset fn-7567-mobile-terminal-spacing.md (patch, category fix). Files changed: .changeset/fn-7567-mobile-terminal-spacing.md | 7 + docs/solutions/ui-bugs/xterm-options-noop-remeasure-after-font-settle.md | 89 ++++++ packages/dashboard/app/components/SessionTerminal.tsx | 23 ++ packages/dashboard/app/components/TerminalModal.tsx | 43 ++- packages/dashboard/app/components/__tests__/SessionTerminal.test.tsx | 127 +++++++- packages/dashboard/app/components/__tests__/TerminalModal.test.tsx | 334 ++++++++++++++++++++- 6 files changed, 619 insertions(+), 4 deletions(-) Fusion-Task-Id: FN-7567 Fusion-Task-Lineage: 5da20522-82d3-4c4d-9008-db71bc5b4d75 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
9592e3ac5c |
FN-7569: skip re-asking manual plan approval for unchanged re-specified plans
Manual plan approval now skips re-asking for approval when a re-specification produces an identical plan to one already approved. - Add nullable Task.approvedPlanFingerprint field with DB migration 139 to track the approved PROMPT.md fingerprint - Skip re-parking at awaiting-approval when replan/plan-review-retry/self-healing rebound yields the same plan fingerprint as before - Require fresh approval when the plan content changes or when a plan is rejected - Leave Release Authorization, Workflow Plan Review, and auto-approve-all behavior unchanged - Add/extend tests across core (db, plan-approval, store-persistence), engine (triage), and dashboard (routes-github) to cover fingerprint comparison and idempotent re-approval - Update docs (settings-reference.md, workflow-steps.md) to describe the idempotent approval behavior - Add changeset for @runfusion/fusion (patch) Files changed: .changeset/fn-7569-plan-approval-idempotent.md | 7 + docs/settings-reference.md | 2 +- docs/workflow-steps.md | 2 + packages/core/src/__tests__/db.test.ts | 54 +++++++ packages/core/src/__tests__/plan-approval.test.ts | 31 +++- .../core/src/__tests__/store-persistence.test.ts | 39 +++++ packages/core/src/db.ts | 22 ++- packages/core/src/index.ts | 2 +- packages/core/src/plan-approval.ts | 23 +++ packages/core/src/store.ts | 20 ++- packages/core/src/types.ts | 13 ++ .../dashboard/src/__tests__/routes-github.test.ts | 69 +++++++- .../src/routes/register-task-workflow-routes.ts | 37 ++++- packages/engine/src/__tests__/triage.test.ts | 178 ++++++++++++++++++++- packages/engine/src/triage.ts | 58 +++++-- 15 files changed, 527 insertions(+), 30 deletions(-) Fusion-Task-Id: FN-7569 Fusion-Task-Lineage: 7d3855ae-6f45-4571-90db-cf1ae3b541dd Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
c31f9ef4d4 |
FN-7571: move planner intervention timeline into Activity dropdown
Relocates the FN-7519 Intervention Timeline out of the inline oversight cluster and into the task Activity view as a fourth selectable segment. - Add `interventions` to the `ActivitySegment` union and gate its dropdown option on the same oversight-active expression previously used by the inline mount - Render `PlannerInterventionTimeline` in a new Activity segment panel instead of inline next to the oversight controls - Fall back to the Live segment automatically if oversight turns off (or was never resolved) while Interventions is selected, avoiding an orphaned selection - Update oversight-controls and task-activity-chat tests to cover the new dropdown segment and removed inline mount - Add changeset and update dashboard guide docs Files changed: ...7571-intervention-timeline-activity-dropdown.md | 7 + docs/dashboard-guide.md | 4 +- .../dashboard/app/components/TaskDetailModal.tsx | 49 ++++--- .../TaskDetailModal.oversight-controls.test.tsx | 148 +++++++++++++++++++++ .../TaskDetailModal.task-activity-chat.test.tsx | 7 +- 5 files changed, 195 insertions(+), 20 deletions(-) Fusion-Task-Id: FN-7571 Fusion-Task-Lineage: 331a1b32-5712-4583-9777-e36ff5cc3ffc Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
2ed06f9f14 |
FN-7547: support reverting multi-repo workspace tasks via git
Adds all-or-nothing git-revert support for multi-repo workspace tasks and wires it into the existing revert route/AI-undo/per-sha machinery. - Add `resolveWorkspaceTaskRevertCommits` and `revertWorkspaceTask` to `packages/engine/src/task-revert.ts`, dry-run classifying every sub-repo first and only committing per-repo revert commits when every sub-repo is clean/already-reverted; any conflicting sub-repo rolls back every already-committed sub-repo. - Extract shared `applyAndCommitRevert" apply/commit machinery (built on the existing `applyRevertNoCommit` primitive) so the workspace path reuses the same commit-message/trailer contract as the single-repo path. - Add a defensive `isWorkspaceTask` guard to `performTaskRevert` so workspace tasks can never be silently reverted through the single-repo path. - Wire `POST /api/tasks/:id/revert` (register-task-workflow-routes.ts) to dispatch workspace tasks to `revertWorkspaceTask`, preserving the existing `mode` (git/ai/auto) and AI-undo-fallback contract for workspace conflicts. - Export the new workspace revert types/functions from `packages/engine/src/index.ts`. - Add route-dispatch and real-git workspace revert test coverage; update docs and add a changeset. Files changed: .changeset/fn-7547-workspace-task-revert.md | 7 + docs/task-management.md | 8 +- packages/dashboard/src/__tests__/task-revert-route.test.ts | 102 +++++ packages/dashboard/src/routes/register-task-workflow-routes.ts | 76 +++- packages/engine/src/__tests__/task-revert.workspace.real-git.test.ts | 272 +++++++++++++ packages/engine/src/index.ts | 6 + packages/engine/src/task-revert.ts | 448 ++++++++++++++++++++- 7 files changed, 897 insertions(+), 22 deletions(-) Fusion-Task-Id: FN-7547 Fusion-Task-Lineage: b1b5eeda-06fd-43c1-8163-74b62c77b000 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
9d4a45b0f9 |
FN-7561: fix mobile terminal excess inter-character spacing after font settle
Root-cause fix for xterm text rendering with wide inter-character gaps on mobile after fonts settle post-load. - Added forceTerminalFontRemeasure() in terminalPreferences.ts to work around xterm's OptionsService setter being a no-op when reassigning an already-current fontFamily/fontSize - Applied the remeasure helper at every post-waitForTerminalFontMetrics() settle site in TerminalModal.tsx and SessionTerminal.tsx - Added regression tests covering the remeasure invariant across SessionTerminal, TerminalModal, and terminalPreferences - Documented root cause and fix in docs/solutions/ui-bugs/xterm-options-noop-remeasure-after-font-settle.md - Added changeset for @runfusion/fusion (patch) Files changed: .changeset/fn-7561-mobile-terminal-spacing.md | 7 + docs/solutions/ui-bugs/xterm-options-noop-remeasure-after-font-settle.md | 120 ++++++++++ packages/dashboard/app/components/SessionTerminal.tsx | 11 +- packages/dashboard/app/components/TerminalModal.tsx | 11 +- packages/dashboard/app/components/__tests__/SessionTerminal.test.tsx | 108 ++++++++- packages/dashboard/app/components/__tests__/TerminalModal.test.tsx | 257 ++++++++++++++++++++- packages/dashboard/app/utils/__tests__/terminalPreferences.test.ts | 55 +++++ packages/dashboard/app/utils/terminalPreferences.ts | 38 +++ 8 files changed, 601 insertions(+), 6 deletions(-) Fusion-Task-Id: FN-7561 Fusion-Task-Lineage: ad9da396-abf4-46ea-8c60-f2ed40fa4b01 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
1d69dec087 |
FN-7562: fix mobile oversight menu auto-focus opening a second native select popup
Fixes the mobile oversight overflow menu rendering two overlapping menus by narrowing auto-focus to actionable button menuitems. - Change the menu-open auto-focus effect to query `button.detail-oversight-menu-item` instead of matching any `.detail-oversight-menu-item` element, since the native level `<select>` also carried that class and was matched first. - Programmatically focusing the native `<select>` triggered its OS option picker, which rendered as a second overlapping menu on top of the custom `role="menu"` popover. - Add regression tests covering: auto-focus landing on the first button menuitem when nudge/stop/explain are available, no fallback focus on the select when oversight is off (level-only state), and confirming the desktop inline select is unaffected. - Update dashboard-guide.md docs to describe the fixed auto-focus behavior. Files changed: docs/dashboard-guide.md | 2 +- packages/dashboard/app/components/TaskDetailModal.tsx | 3 +- .../app/components/__tests__/TaskDetailModal.oversight-mobile.test.tsx | 96 ++++++++++++++++++++++ 3 files changed, 99 insertions(+), 2 deletions(-) Fusion-Task-Id: FN-7562 Fusion-Task-Lineage: f39068f1-811f-4663-ade1-ff020a389ae5 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |
||
|
|
6e4c207a7f |
FN-7559: disambiguate release-authorization holds from manual plan-approval holds
Disambiguate release-authorization approval holds from manual plan-approval holds so auto-approve no longer appears broken. - Add `Task.awaitingApprovalReason` (`"release-authorization" | null`) to distinguish the release-authorization gate from the independent manual plan-approval gate, both of which set `status: "awaiting-approval"`. - Stamp `awaitingApprovalReason: "release-authorization"` when the release gate blocks a task, and explicitly clear it (`null`) when the manual plan-approval gate parks the task, so a stale reason never survives a replan. - Add DB migration/persistence support for the new column in `db.ts`/`store.ts`/`types.ts`. - TaskCard/TaskDetailModal now render a distinct status for release-authorization holds and suppress the generic manual Approve/Reject affordance for them. - Add i18n string and docs updates (`settings-reference.md`, `workflow-steps.md`) plus a changeset. - Extend regression tests in db, triage, TaskCard, and TaskDetailModal to cover the new reason field and disambiguated UI. Files changed: $(git diff --cached --stat) Fusion-Task-Id: FN-7559 Fusion-Task-Lineage: 0b37cbf0-40a4-4165-8088-482ed365ba19 Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai> |