Adds a shared, persisted auto-save preference for workspace text-file editing, defaulted to on, surfaced as a toolbar toggle in both the Files modal and right-dock Files view.
- Add useAutoSavePreference hook: persists the fn-file-editor-auto-save localStorage preference, broadcasts same-window changes via a custom event (storage events only reach other documents), and defaults to true.
- Extend useWorkspaceFileEditor with an autoSave flag that debounces (800ms) and triggers save() for a loaded, editable file with real pending changes, keyed by workspace+file+content to avoid re-firing on failed writes.
- Add an Auto-save toggle button to FileEditor's toolbar (autoSaveEnabled/onToggleAutoSave/canToggleAutoSave props), hidden for read-only/preview/binary files.
- Wire the shared preference into FileBrowserModal and DockFilesView, disabling auto-save for binary files in the modal.
- Add fileEditor.autoSave / fileEditor.toggleAutoSave i18n strings and document the new default behavior in docs/dashboard-guide.md.
- Add/extend tests covering the new hook, debounced auto-save behavior, and toolbar toggle wiring across FileEditor, FileBrowserModal, and DockFilesView.
Files changed:
docs/dashboard-guide.md | 3 +
.../dashboard/app/components/DockFilesView.tsx | 6 +-
.../dashboard/app/components/FileBrowserModal.tsx | 20 ++--
packages/dashboard/app/components/FileEditor.tsx | 17 +++-
.../components/__tests__/DockFilesView.test.tsx | 37 ++++++-
.../components/__tests__/FileBrowserModal.test.tsx | 86 +++++++++++++---
.../app/components/__tests__/FileEditor.test.tsx | 56 +++++++++++
.../hooks/__tests__/useAutoSavePreference.test.ts | 66 +++++++++++++
.../hooks/__tests__/useWorkspaceFileEditor.test.ts | 108 +++++++++++++++++++++
.../dashboard/app/hooks/useAutoSavePreference.ts | 79 +++++++++++++++
.../dashboard/app/hooks/useWorkspaceFileEditor.ts | 47 ++++++++-
packages/i18n/locales/en/app.json | 2 +
12 files changed, 500 insertions(+), 27 deletions(-)
Fusion-Task-Id: FN-7866
Fusion-Task-Lineage: 0604de18-666d-4872-abce-2a3886c9ea55
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Replace the FileEditor's bounded self-echo Set with monotonic edit versions so trailing-newline edits (e.g. after a markdown header or at end-of-file) are never dropped when an older content prop races the live CodeMirror document.
- Track a monotonic localEditVersionRef and a contentEditVersionsRef map (content -> version) instead of a size-capped Set of echoed strings, avoiding eviction of stale values during long editing sessions.
- Compare a stale prop's known edit version against the live document's version and the last accepted prop version to decide if it is a stale self-echo, at any session length.
- Update FNXC:FileViewer comment to document the FN-7810 rationale for switching from bounded-Set self-echo detection to edit-version comparison.
- Add regression tests covering trailing markdown-header and plain-text newline edits across markdown/non-markdown file paths, and a long-session (20+ edit) case that previously could evict the self-echo tracking.
Files changed:
packages/dashboard/app/components/FileEditor.tsx | 32 +++++++----
.../app/components/__tests__/FileEditor.test.tsx | 64 +++++++++++++++++++++-
2 files changed, 83 insertions(+), 13 deletions(-)
Fusion-Task-Id: FN-7810
Fusion-Task-Lineage: 9dd68746-e772-4fa3-b648-6f3138d1e36e
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Prevent the controlled FileEditor from clobbering fast local typing (including newlines) with a stale content prop echoed back from an async parent update loop.
- Track the last emitted content and a small rolling set of recently emitted self-echoes in FileEditor.
- Skip re-syncing the CodeMirror document when the incoming content prop matches a known self-echo instead of a genuinely external change.
- Clamp the previous selection into the new document length when an external content change is applied, so the caret stays valid.
- Add regression tests covering stale self-echo renders (markdown and non-markdown files) and external content changes with clamped caret preservation.
Files changed:
packages/dashboard/app/components/FileEditor.tsx | 34 +++++++++++++--
.../app/components/__tests__/FileEditor.test.tsx | 49 ++++++++++++++++++++++
2 files changed, 80 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-7808
Fusion-Task-Lineage: 08d4f826-f637-428c-8b67-dacdb878bf4a
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Migration (multi-agent sweep over 216 files, 60 batches):
- Every user-visible dashboard + TUI string moved to t() with the exact
English inline default (en rendering byte-identical)
- Catalogs merged from per-batch fragments: en/zh-CN/zh-TW/fr/es now
carry ~5,930 keys each across common/app/errors/cli namespaces;
CLI bundles regenerated (6 locales incl. ko)
Integration fixes:
- 18 type errors: reserved {{count}} interpolations renamed, malformed
plural call, hand-rolled t-param types replaced with TFunction<"app">
- 23 lint errors: superseded label constants/helpers removed
- ExecutorStatusBar hook-order violation (keyboard-open early return
moved below hooks)
- TUI tests wrapped in I18nextProvider (uninitialized fallback renders
literal {{placeholders}}); dashboard vitest.setup boots a minimal en
i18next instance for the same reason
Known WIP (next commits): ~457 residual strings across 50 batches,
Korean drafts for swept keys, and a dashboard test-suite pass that is
still being stabilized (~283 failures under investigation — fake-timer
waitFor interaction, likely stale node_modules vs merged lockfile).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Keep the memory/file editor stable while controlled content updates flow through CodeMirror.
- stop recreating the editor view when content and editor options change
- reconfigure line numbers, word wrap, read-only state, and language in place via compartments
- add regression tests for editor instance preservation and caret stability during controlled edits
Files changed:
packages/dashboard/app/components/FileEditor.tsx | 34 +++++++++++++++-
packages/dashboard/app/components/__tests__/FileEditor.test.tsx | 47 +++++++++++++++++++++-
2 files changed, 79 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-5861
Fusion-Task-Lineage: a8c5c4b0-ff5f-4f25-9e65-ed3f31c2b893
Completes the FileEditor mobile toolbar refactor (FN-4125) by wiring up the line-number toggle with mobile-responsive styling and adding tests for both the toggle and the FileBrowserModal changes.
Fusion-Task-Id: FN-4125
This merge adds a line-number toggle to the Files modal with persisted preference, introduces an AgentAvatar component with server-side avatar storage routes, and adds documentation for both the toggle and avatar storage. It also includes a regression test for runtime plugin alias behavior and updat
Fusion-Task-Id: FN-3528
- Add word wrap toggle button with WrapText icon to FileEditor
- Fix markdown preview scrolling with height: 100% CSS
- Add comprehensive tests for word wrap toggle and scrollability
- Add server-side file service with list, read, and write operations
- Add REST API endpoints for file operations with tests
- Add client-side API functions and React hooks for file browsing
- Create FileBrowser, FileEditor, and FileBrowserModal components
- Add CodeMirror 6 for syntax-highlighted file editing
- Integrate Files tab into TaskDetailModal
- Add comprehensive file browser styles and responsive design