Repository navigation
·
23 commits
to main
since this release
日本語のリリースノートはこちらです。
What's Changed
- Windows (x64)
- Windows (ARM64)
- macOS
- Linux (x64)
- Linux (ARM64)
New Features
- Editing workflows
- Added a command palette with interactive commands, tab switching and tool creation shortcuts
- Refreshed the palette's available commands as the playhead and selection move
- Added keyframe selection commands to the graph editor
- Added a property editor for easing curves
- Opened an empty tab from the dock add button so a tool can be chosen
- Added a status popup next to the title bar's feedback button
- Let tool tabs stay pinned to the object they show (breaking change)
- Audio
- Added a pitch-preserving time stretch audio effect
- Added a noise reduction audio effect
- Effects, text and 3D
- Added a GLSL radial blur with zoom and spin modes
- Added diagonal clipping controlled by a signed width
- Added text line alignment
- Added clip boundary transitions between adjacent elements
- Added font fallback and Noto Color Emoji
- Made fonts easier to find in the font picker
- Media and files
- Added a missing media repair tool
- Added file pickers for custom file sources
- Added file drag and drop in editors and AI tools
- Added Media Foundation encoding on Windows
- Added a second FFmpeg worker for file browser, proxy and AI reads
- Extensions and packages
- Let extensions add tools to the live MCP endpoint
- Rendered extension descriptions and release notes as Markdown
- Listed the types, methods and fields a package references that the host lacks
- Saved packages that passed the API check
- Refused packages that use APIs this Beutl lacks at load, install and update (breaking change)
- Generated the library lists from project marks and packed Beutl.Controls
- Agent and AI
- Unified the headless and live MCP servers into one beutl-agent server (breaking change)
- Let agents generate with Beutl's AI through MCP
- Followed live MCP edits in the editor (experimental)
- Dropped the agent workspace root and required absolute tool paths (breaking change)
- Used PKCE and DPoP for desktop sign-in
- Project editing and data
- Merged Exclude into an undoable Delete bound to Delete and Ctrl+Delete (breaking change)
- Kept multi-selection in the editor selection API and let menu Delete remove it with its groups (breaking change)
- Saved edits of objects whose type is missing
- Counted duplicate IDs, resolved references within their scene and regenerated IDs in one pass
- Added MediaTime, an exact flick-based time (breaking change)
- Exposed property units to schemas and editors
- Added target pickers for reference properties (breaking change)
- Gave history one edit session at a time and queued other writers behind it (breaking change)
- Gave context commands IDs and handlers and keyed the keymap by ID (breaking change)
- Ended pointer drags through a drag session that confirms on capture loss (breaking change)
- Rendered playback one frame per render-thread job and showed edits on the next frame
- Exported from a snapshot of the scene and kept the editor enabled while it runs
- Warned when code compares two property objects with equality or Equals
- Reported EngineObject constructors that skip ScanProperties
- Platforms
- Added Linux ARM64 builds
Improvements & Refactoring
- Property system
- Held engine, node graph, core object, project system and settings values in value-only properties (breaking change)
- Exposed value-only properties as property objects and generated every CoreObject's scan (breaking change)
- Made keyframes the bottom of each property's expression chain (breaking change)
- Moved IProperty and the expression interfaces to Beutl.Core and the property adapter interfaces to Beutl.Engine (breaking change)
- Made reference property values non-owning (breaking change)
- Replaced property editor extension methods with typed registrations (breaking change)
- Project format and compatibility
- Replaced TimeSpan with MediaTime across the model, engine and UI (breaking change)
- Stored frame rates as exact rationals and wrote flick counts (breaking change)
- Replaced migration propagation with a per-build format floor and one load gate (breaking change)
- Kept unknown members and types so 2.x builds keep each other's data
- Loaded renamed types and members under their former persisted names
- Rendering and audio
- Reworked renderer, node renderer and proxy cleanup for reliability (breaking change)
- Unified audio effect latency reporting (breaking change)
- Made frame providers and sample providers sequential (breaking change)
- Replaced Pcm with AudioBuffer and updated audio decoding (breaking change)
- Sampled Vulkan render targets in place instead of copying them
- Bounded playback and export read-ahead by memory
- Applied the FFmpeg encoding thread count setting
- Shipped Beutl's libSkiaSharp for macOS
- Editor and version control
- Simplified Git operations, snapshots, pull, restore and branch switching (breaking change)
- Kept the version-control coordinator on the UI thread behind one gate
- Made the editor clock and selection read-only with Seek and Select (breaking change)
- Moved the AI workspace, history, dock layout, transition, missing media, output and version-control tabs into Beutl.Editor.Components (breaking change)
- Trimmed unnecessary public API across the libraries (breaking change)
- Stabilized default fonts and shared API subscriptions (breaking change)
- Let BEUTL_API_BASE_URL choose the API server (breaking change)
- Agent and MCP
- Targeted live MCP scenes per request (breaking change)
- Renamed Resource.Update and its helpers to Reconcile (breaking change)
- Required synchronous C# render scripts (breaking change)
- Removed the AI job and caption extension kinds and their leases (breaking change)
- Removed the unused proxy generation admission (breaking change)
- Distribution
- Shipped self-contained builds only and removed the Windows and unsigned macOS zips
- Included license files in release artifacts
Bug Fixes
- Playback and media
- Prevented black frames at the end of video exports and kept the last frame
- Started playback at the playhead frame and played the last frame
- Kept preview frames during delayed binding updates
- Prevented preview input from freezing the UI during playback
- Updated the playhead and preview on the UI thread during playback
- Resampled audio to the encoder's format when the format is Auto
- Counted FFmpeg, AVFoundation and Media Foundation frames and samples from the container start
- Reopened FFmpeg readers after a decode worker exit and bounded worker memory
- Fixed audio seeks past EOF and aligned them with the video time origin
- Preserved the audio resampler state across unchanged rebuilds
- Played GIFs and WebPs that repeat a set number of times for every pass
- Handled video sources without a video stream
- Wrote AVFoundation exports in the container their extension names
- Rendering, effects and 3D
- Corrected 3D LUT interpolation grid spacing
- Snapped Mosaic samples in the source's own texel grid so tiles match across GPUs
- Fixed shadow and wave rendering and zero-direction lights
- Fixed the color wheel and triangle gradients
- Prevented large LUTs from exceeding GPU texture limits
- Preferred an integrated GPU over SwiftShader and released the color space name
- Released Vulkan resources on the command pool's thread and waited for Skia before releasing non-shared textures
- Stopped the HDR presenter on a failed Vulkan call and fell back to CPU when Vulkan is unavailable
- Corrected sRGB encoding for UNORM swapchain formats
- Aligned drawable brush fills with text bounds
- Applied brush opacity to bare shaders
- Kept the path editor's geometry overlay out of hit testing after playback
- Mapped 3D presses into moved or scaled Scene3D objects and groups
- Rotated 3D transforms about their center when the center sums to zero
- Dollied the camera with the wheel in camera mode
- Kept the 3D gizmo out of exports, saved scenes and history
- Kept the files of 1.x elements drawn by a node tree and warned on open
- Kept portal resizing independent of imported media
- Timeline and editing
- Returned an element to its layer when undoing Exclude or Cut
- Kept layer headers in sync with their layers after undoing a move
- Stopped a ripple at a locked clip a follower would pass over
- Advanced split offsets by the speed integral
- Snapped timeline moves to clip start
- Placed single pasted clips in a free slot
- Included all selected groups in timeline operations
- Kept the editor's maximum time at the remaining elements after bulk removals
- Made locked clips read-only in property editors, the graph editor and the path editor
- Refused agent edits to locked clips and layers
- Let paste, media length matching and inline animation work with the timeline closed
- Project data, saving and recovery
- Played embedded scene references from the referenced scene's window
- Preserved project references in export snapshots, cross-drive media and escaped paths
- Gave copied clips their own file-backed objects
- Wrote a newly added element's file at the next save
- Kept the requested length when media cannot be read
- Kept unknown settings.json sections and copied an unreadable file aside
- Kept starting when settings.json holds a value of the wrong type
- Saved GPU and proxy store settings as soon as they change
- Treated elements that could not be fully loaded as read-only
- Repaired a value that loading dropped only by an edit that replaces it
- Migrated a 1.x decorator or group operator that was turned off as turned off
- Restored the nested view state of geometry, path figure and effect groups
- Saved a new AI image with the default file mode
- Created tutorial projects in the Beutl home
- Version control
- Showed Git's error in remote failures instead of calling SSH failures offline
- Let git status and LFS pointer checks run past the 30-second limit
- Let Git remove its index lock when a close cancels a snapshot
- Kept tracking a project whose repository cannot be watched
- Enabled version control from a floating version control tab
- Hid the stale-lock banner once the lock file is removed
- Accepted drops for MIME- and UTI-only file filters
- File browser, packages and updates
- Prevented file browser freezes when opening large directories
- Stopped the file browser from reading collapsed folders as files
- Copied and moved dropped files off the UI thread
- Asked before copying into an existing folder and stopped following folder links
- Rejected linked ancestors in folder copy destinations
- Compared file browser move paths per file system
- Kept media named with escaped characters through copies and file URI conversions
- Preserved package registrations when the registry is unreadable
- Resolved extension dependencies from the installed packages
- Ignored the source generator dependency of older extensions
- Kept the installed package until its update is in place
- Verified and contained app update downloads
- Listed only creatable types in the library picker and updated the Library tab as items arrived
- Agent tools
- Preserved unchanged nested objects and transitions during agent edits
- Preserved escaped media paths in agent edits
- Exposed DrawableObject3D and GateEffect to the Agent Editing Toolkit schema
- Let agent edits through node graphs whose ports hold values or bind properties
- Rejected agent edits that leave an element that could not be loaded unrepaired
- Let duplicate_object wrapInGroup keep the copy's media
- Stopped rewriting commented MCP configs and kept the Codex MCP config's file mode
- Registered the built-in media decoders in the stdio MCP server
- Allowed live MCP access to multiple Beutl instances and persisted its tokens outside settings
- Retried excluded ports for the live MCP endpoint
- Interface and localization
- Completed missing localized resources and fixed English text that showed Japanese or garbled characters
- Translated the extensions window's tabs, three tool tabs and the graph editor's tab name and loop tooltip
- Kept the tab context menu text readable and removed empty space after closing tool tabs
- Resized picker popups when their contents change
- Synced opacity when switching to a gradient brush
- Showed Aqua and Fuchsia once in the color palette
- Showed the color and read-only state in the settings color editors
- Put the boolean editor's menu after its keyframe buttons
- Kept dragging the same curve point after it passes a neighbor
- Preserved partial input in bounded numeric editors
- Fixed the new scene dialog's location text clear of its folder button
- Opened the notifications flyout only when there are notifications
Changelog
- ci: publish NuGet packages when a release is published by @yuto-trd in #2589
- fix: install local packages from the local source by @yuto-trd in #2593
- feat: show progress while opening recent projects by @yuto-trd in #2597
- fix: accept credentials in remote URLs by @yuto-trd in #2595
- feat: add keyboard tab switching and tool creation by @yuto-trd in #2596
- feat: add interactive command palette APIs by @yuto-trd in #2598
- Bump Microsoft.Windows.CsWin32 from 0.3.335 to 0.3.346 by @dependabot[bot] in #2590
- Bump ReactiveUI.Avalonia.Reactive from 12.1.5 to 12.1.6 by @dependabot[bot] in #2591
- Bump Roslynator.Analyzers from 5.0.0 to 5.0.1 by @dependabot[bot] in #2592
- fix: select Noto Sans UI fonts by language by @yuto-trd in #2600
- fix(i18n): complete missing localized resources by @yuto-trd in #2599
- fix: skip logs for missing FFmpeg libraries by @yuto-trd in #2601
- fix: reject invalid FFmpeg output formats before muxer creation by @yuto-trd in #2602
- fix: deserialize polymorphic easing values in projects by @yuto-trd in #2607
- fix(mediafoundation): release native resources on failure by @yuto-trd in #2608
- Bump Dock.Avalonia and Dock.Avalonia.Themes.Fluent by @dependabot[bot] in #2604
- Bump Microsoft.Windows.CsWin32 from 0.3.346 to 0.3.347 by @dependabot[bot] in #2606
- fix(avfoundation): report actual decoded audio frame counts by @yuto-trd in #2632
- refactor(version-control): split and simplify the Git service by @yuto-trd in #2636
- refactor(version-control): split the coordinator and tab view model by @yuto-trd in #2637
- refactor(app): simplify AI, tutorial and package services by @yuto-trd in #2638
- refactor(app): split AI dialog and tool view models by @yuto-trd in #2639
- refactor(core): decompose scene recovery and serialization by @yuto-trd in #2651
- Bump Dock.Model.Inpc from 12.1.0.6 to 12.1.0.7 by @dependabot[bot] in #2605
- refactor(editor): split the history manager and editor services by @yuto-trd in #2652
- fix: make locked clips read-only in property editors by @yuto-trd in #2635
- fix(proxy): preserve pinned readers during regeneration by @yuto-trd in #2633
- refactor(rendering): split render request execution and targets by @yuto-trd in #2644
- refactor(api): split API services and package management by @yuto-trd in #2649
- fix(mediafoundation): avoid audio seeks past EOF by @yuto-trd in #2650
- fix(mediafoundation): enable FFmpeg fallback for unsupported formats by @yuto-trd in #2655
- fix(editor): cancel timeline drags on pointer capture loss by @yuto-trd in #2634
- refactor(controls): share property editor and picker logic by @yuto-trd in #2643
- refactor(graphics): split the Vulkan context and share texture creation by @yuto-trd in #2645
- refactor(agent): split the reconciler and tool implementations by @yuto-trd in #2648
- refactor(graphics): deduplicate effects, shapes and particle code by @yuto-trd in #2646
- fix: exclude engine time ranges from usage telemetry by @yuto-trd in #2656
- fix(ffmpeg): keep archive extraction inside the install directory by @yuto-trd in #2654
- refactor(engine): simplify audio nodes, proxies and properties by @yuto-trd in #2647
- refactor(editor): share color-scope and tool component helpers by @yuto-trd in #2642
- refactor(app): split the player, edit and main view models and views by @yuto-trd in #2640
- refactor(ffmpeg): simplify FFmpeg integration, IPC and generators by @yuto-trd in #2653
- fix: skip probing hidden export files by @yuto-trd in #2658
- refactor(editor): split timeline, element and path editor components by @yuto-trd in #2641
- fix(mediafoundation): propagate stream enumeration failures by @yuto-trd in #2659
- fix(engine): prevent SwiftShader crashes on Linux shutdown by @yuto-trd in #2661
- fix(mediafoundation): align audio seeks with video time origin by @yuto-trd in #2660
- fix: validate FFmpeg worker deployments and report startup errors by @yuto-trd in #2663
- Bump Microsoft.Windows.CsWin32 from 0.3.347 to 0.3.355 by @dependabot[bot] in #2664
- fix(graphics): stop Rect.TryParse's UTF-8 overload from recursing by @yuto-trd in #2667
- fix(nodegraph): release the subscriptions of every removed group port by @yuto-trd in #2668
- fix(core): pass options through CoreSerializer.SerializeToJsonString by @yuto-trd in #2669
- fix(editor): keep graph editor scene bars at least one frame apart by @yuto-trd in #2671
- fix(api): name LibraryService.Acquire's activity after the method by @yuto-trd in #2673
- fix(editor): keep only the current color scope view model subscribed by @yuto-trd in #2674
- fix(editor): ignore a non-string file browser RootPath on restore by @yuto-trd in #2675
- fix(controls): register the grading editor's RgbProperty on itself by @yuto-trd in #2677
- fix(app): dispose the audio effect editor's child editors by @yuto-trd in #2670
- fix(ffmpeg): bound worker memory to stop decode ENOMEM failures by @yuto-trd in #2662
- fix(crash-report): open the report when no log folder exists yet by @yuto-trd in #2680
- docs: remove docs/notes by @yuto-trd in #2694
- fix(controls): confirm Vector4Editor header drags with four values by @yuto-trd in #2676
- fix(controls): color added gradient stops between their neighbours by @yuto-trd in #2678
- fix(controls): drop old template subscriptions in vector editors by @yuto-trd in #2679
- fix(configuration): read memory_pressure output before waiting by @yuto-trd in #2682
- fix(ffmpeg): probe the Linux multiarch directory of the process by @yuto-trd in #2683
- fix(ffmpeg): build the audio channel layout from the channel count by @yuto-trd in #2684
- fix(graphics): stop the HDR presenter on a failed Vulkan call by @yuto-trd in #2686
- fix(graphics): keep Metal texture export info off the native heap by @yuto-trd in #2687
- fix(agent): publish render job results after releasing the lease by @yuto-trd in #2688
- fix(ffmpeg): give exported video packets a frame's duration by @yuto-trd in #2689
- fix(editor): compare file browser move paths per file system by @yuto-trd in #2690
- fix(engine): log render failures masked by the primary failure by @yuto-trd in #2691
- fix(extensions): load the next page from the Discover page's Show more tile by @yuto-trd in #2692
- fix(build): build Debug unoptimized when no configuration is given by @yuto-trd in #2672
- fix(controls): stop ProgressRing.Maximum from overwriting angles by @yuto-trd in #2681
- refactor: remove unused code across the app and internal library members by @yuto-trd in #2695
- fix(graphics): give every UNORM swapchain format sRGB encoding by @yuto-trd in #2685
- feat(ffmpeg): add metadata-driven encoder option editors by @yuto-trd in #2665
- test: tolerate an updater that exits before reading stdin by @yuto-trd in #2698
- fix: prevent large LUTs from exceeding GPU texture limits by @yuto-trd in #2699
- test: avoid duplicate HWND registrations in headless window tests by @yuto-trd in #2700
- fix: preserve controller Flow inputs and safe trim bounds by @yuto-trd in #2701
- feat: add interactive and tab-less command palette commands by @yuto-trd in #2702
- Bump Microsoft.Diagnostics.Runtime from 4.1.745802 to 4.2.750101 by @dependabot[bot] in #2706
- Bump Microsoft.Windows.CsWin32 from 0.3.355 to 0.3.358 by @dependabot[bot] in #2707
- fix: refresh palette availability as the editor's playhead and selection change by @yuto-trd in #2708
- fix: rebuild group port mirrors on reset by @yuto-trd in #2711
- feat: support file pickers for custom file sources by @yuto-trd in #2710
- feat: support file drag and drop in editors and AI tools by @yuto-trd in #2703
- feat: add missing media repair tool by @yuto-trd in #2666
- feat: add graph editor keyframe selection commands by @yuto-trd in #2712
- fix: render text without hinting so scaling text stops flickering by @yuto-trd in #2715
- build: ship Beutl's libSkiaSharp for macOS by @yuto-trd in #2714
- fix: display graph editor shortcuts separately from labels by @yuto-trd in #2716
- refactor: migrate context menus to FluentAvalonia flyouts by @yuto-trd in #2719
- fix: draw Windows text with FreeType so scaling text stops flickering by @yuto-trd in #2718
- perf: sample Vulkan render targets in place instead of copying them by @yuto-trd in #2725
- fix: snap Mosaic samples to pixel centres so tiles match across GPUs by @yuto-trd in #2722
- feat: add pitch-preserving time stretch audio effect by @yuto-trd in #2717
- fix(sdk): keep the source generator out of extension packages by @yuto-trd in #2727
- fix: generate accent colors for elements added through MCP by @yuto-trd in #2735
- feat: add text font fallback and Noto Color Emoji by @yuto-trd in #2720
- refactor!: unify audio effect latency reporting by @yuto-trd in #2740
- feat: render extension descriptions and release notes as Markdown by @yuto-trd in #2738
- fix: unblock version control for GUI Git LFS and converted values by @yuto-trd in #2737
- fix: ignore the source generator dependency of older extensions by @yuto-trd in #2741
- fix: retain preview frames during delayed binding updates by @yuto-trd in #2744
- fix: accept drops for MIME- and UTI-only file filters by @yuto-trd in #2743
- fix: default image saves to PNG and group media formats by @yuto-trd in #2746
- fix: expose DrawableObject3D in the Agent Toolkit schema by @yuto-trd in #2750
- fix: register GateEffect in the Agent Editing Toolkit schema by @yuto-trd in #2747
- fix: render macOS shortcut symbols with a monochrome font by @yuto-trd in #2748
- feat: Bookmark the current page from the browser tab menu by @yuto-trd in #2754
- feat: add a property editor for Easing properties by @yuto-trd in #2751
- fix: prevent preview input from freezing UI during playback by @yuto-trd in #2753
- feat: add noise reduction audio effect by @yuto-trd in #2749
- fix: address follow-up review findings on the easing editor by @yuto-trd in #2756
- feat: open an empty tab from the dock add button to pick a tool by @yuto-trd in #2755
- fix: allow live MCP access to multiple Beutl instances by @yuto-trd in #2771
- fix: store WebView2 user data under the Beutl home directory by @yuto-trd in #2773
- fix: handle timeline range selection outside bounds by @yuto-trd in #2772
- refactor!: stop discovering project file references for version control by @yuto-trd in #2768
- fix: stop async commands from overwriting the state they are gated on by @yuto-trd in #2767
- fix: skip the stale-lock removal prompt where Beutl cannot remove the lock by @yuto-trd in #2765
- fix: show why a pull failed instead of reporting a changed project by @yuto-trd in #2761
- refactor: run Git through System.Diagnostics.Process by @yuto-trd in #2763
- fix: tell the user why version control refused an action by @yuto-trd in #2774
- fix: persist live MCP tokens outside settings by @yuto-trd in #2776
- Bump Microsoft.Windows.CsWin32 from 0.3.358 to 0.3.360 by @dependabot[bot] in #2739
- feat: add clip boundary transitions between adjacent elements by @yuto-trd in #2759
- feat: let extensions add tools to the live MCP endpoint by @yuto-trd in #2780
- refactor!: target live MCP scenes per request by @yuto-trd in #2783
- refactor!: rename Resource.Update and its helpers to Reconcile by @yuto-trd in #2784
- fix: report version-control command failures instead of crashing by @yuto-trd in #2764
- refactor: record snapshots with git commit instead of reimplementing it by @yuto-trd in #2769
- refactor: drop version-control handling for cases that do not occur in practice by @yuto-trd in #2786
- refactor!: run pull, restore and branch switch as plain Git commands by @yuto-trd in #2779
- refactor: keep the version-control coordinator on the UI thread behind one gate by @yuto-trd in #2787
- feat: let agents generate with Beutl's AI through MCP by @yuto-trd in #2775
- fix: resolve CS0108 on the AI video nodes' Duration ports by @yuto-trd in #2788
- test: await NUnit 5's ThrowsAsync so its result belongs to its own test by @yuto-trd in #2789
- fix: increase default text size to 72 by @yuto-trd in #2790
- fix: keep unchanged nested objects when apply_edit writes the document by @yuto-trd in #2793
- feat: follow live MCP edits in the editor (experimental) by @yuto-trd in #2792
- feat: add a status popup next to the title bar's feedback button by @yuto-trd in #2791
- fix: keep the Linux terminal tab's text on its cell grid by @yuto-trd in #2794
- feat!: let tool tabs be pinned to the object they show by @yuto-trd in #2797
- fix: write and read collection values with their own JSON converter by @yuto-trd in #2800
- ci: parallelize full tests with a shared build by @yuto-trd in #2795
- docs: remove historical specs and fix docs that drifted from code by @yuto-trd in #2802
- fix: drop pending edits that return to their starting value by @yuto-trd in #2801
- feat: make fonts easier to find in the font picker by @yuto-trd in #2804
- feat: support Linux ARM64 (linux-arm64) builds by @yuto-trd in #2803
- fix: restore pinned Path Editor tabs with the figure they edit by @yuto-trd in #2806
- fix: let the timeline add items from AddDrawable and AddSound by @yuto-trd in #2809
- feat!: unify headless and live MCP into one beutl-agent server by @yuto-trd in #2805
- fix: refuse a named AI model that an empty catalog cannot confirm by @yuto-trd in #2810
- fix: fit the preview's transform box to what the object draws by @yuto-trd in #2799
- fix: keep the last frame of an export by @yuto-trd in #2850
- fix: end a header scrub when the pointer capture is lost by @yuto-trd in #2851
- fix: bring a restored window back onto a screen after the display layout changes by @yuto-trd in #2848
- feat!: drop the agent workspace root and require absolute tool paths by @yuto-trd in #2852
- fix: keep group port mirrors in sync through history replay by @yuto-trd in #2890
- fix: draw the color wheel and triangle gradients again by @yuto-trd in #2811
- fix: undoing Exclude or Cut puts the element back on its layer by @yuto-trd in #2872
- fix: save the GPU and proxy store settings as soon as they change by @yuto-trd in #2891
- fix: make Ctrl+N and File > New > Scene create a scene by @yuto-trd in #2893
- fix: pause playback before undoing from the graph editor by @yuto-trd in #2895
- fix: refresh particle checkpoints after simultaneous property edits by @yuto-trd in #2897
- fix: resample audio to the encoder's format when the format is Auto by @yuto-trd in #2899
- fix: keep starting when settings.json holds a value of the wrong type by @yuto-trd in #2896
- fix!: use project rates for new exports and preview audio by @yuto-trd in #2902
- fix: contain property expression failures by @yuto-trd in #2900
- fix: keep decorator transform origins stable across frames by @yuto-trd in #2903
- fix: preserve history and recover editing after failed replay by @yuto-trd in #2894
- fix: respect row strides when encoding FFmpeg frames by @yuto-trd in #2904
- fix: show items registered after the Library tab opens by @yuto-trd in #2849
- fix: handle video sources without a video stream by @yuto-trd in #2906
- fix: preserve restored clips when reopening scenes by @yuto-trd in #2892
- fix: keep a property's expression when a node port connects to it by @yuto-trd in #2901
- fix: enforce forced updates and respect "No" in the upgrade dialog by @yuto-trd in #2913
- fix: follow Beutl home when resolving local packages by @yuto-trd in #2908
- fix: record package management traces under the subscribed source name by @yuto-trd in #2911
- fix: make the .deb depend on the libraries Beutl loads, not OpenCvSharp's by @yuto-trd in #2919
- ci: install FFmpeg 8 so the FFmpeg tests run instead of skipping by @yuto-trd in #2923
- fix: bound playback and export read-ahead by memory by @yuto-trd in #2921
- ci: check that submodule pins are on their declared branches by @yuto-trd in #2927
- fix: keep the installed package until its update is in place by @yuto-trd in #2928
- fix: keep the 3D gizmo out of exports, saved scenes and history by @yuto-trd in #2925
- fix: let Git remove its index lock when a close cancels a snapshot by @yuto-trd in #2915
- fix: render through Metal on Intel and AMD Macs by @yuto-trd in #2914
- refactor!: require synchronous C# render scripts by @yuto-trd in #2912
- fix: reopen FFmpeg readers after the decode worker exits by @yuto-trd in #2916
- ci: merge coverage upload into the build check by @yuto-trd in #2933
- fix: preserve unchanged transitions during agent edits by @yuto-trd in #2905
- fix: find render nodes of drawables drawn inside groups and transitions by @yuto-trd in #2932
- fix: defer the save snapshot instead of holding the project files during a push by @yuto-trd in #2918
- fix: keep layer headers in sync with their layers after undoing a move by @yuto-trd in #2934
- fix: re-resolve extension dependencies from the installed packages by @yuto-trd in #2922
- fix: apply platform preset sizes and rates, and letterbox mismatched aspect ratios by @yuto-trd in #2920
- fix: let the self-update handoff work across volumes and without gnome-terminal by @yuto-trd in #2917
- ci: cancel superseded main branch checks by @yuto-trd in #2948
- fix: copy and move dropped files off the UI thread in the File Browser by @yuto-trd in #2924
- fix: let a reopened AI tab resume or abandon a request already sent by @yuto-trd in #2931
- fix: update the playhead and preview on the UI thread during playback by @yuto-trd in #2930
- refactor!: stabilize default fonts and shared API subscriptions by @yuto-trd in #2910
- fix: add the AI menu to the macOS menu bar by @yuto-trd in #2949
- fix: start playback at the playhead frame and play the last frame by @yuto-trd in #2951
- fix: change node cache settings during playback without freezing the UI by @yuto-trd in #2953
- fix: stop publishing the Windows and unsigned macOS zips and remove their update paths by @yuto-trd in #2954
- fix: let paste, media length matching and inline animation work with the timeline closed by @yuto-trd in #2952
- fix: keep copies and undo from reusing an AI node's request key by @yuto-trd in #2955
- fix: save live AI results for the scene the call names by sceneId by @yuto-trd in #2958
- fix: refuse agent edits to locked clips and layers by @yuto-trd in #2950
- fix: stop the toolkit install from rewriting commented MCP configs by @yuto-trd in #2960
- fix: register the built-in media decoders in the stdio MCP server by @yuto-trd in #2961
- fix: stop rewriting media fingerprints when only file timestamps change by @yuto-trd in #2963
- Bump Markdig from 1.1.2 to 1.4.0 by @dependabot[bot] in #2946
- fix: answer FFmpeg worker reads that race a close as for an unknown reader by @yuto-trd in #2964
- build(deps): update artifact actions and refresh lockfile by @yuto-trd in #2966
- build: update Avalonia UI packages to stable releases by @yuto-trd in #2967
- fix: keep the files of 1.x elements drawn by a node tree and warn on open by @yuto-trd in #2965
- fix: treat elements that could not be fully loaded as read-only by @yuto-trd in #2959
- refactor: store media fingerprints in their own file next to the scene by @yuto-trd in #2972
- fix: keep unknown settings.json sections and copy an unreadable file aside by @yuto-trd in #2976
- fix: read a node without $type as its concrete declared type by @yuto-trd in #2977
- test: open a project saved by Beutl 1.1.0 and pin the result by @yuto-trd in #2978
- test: add a format manifest of persisted type names and keys by @yuto-trd in #2979
- refactor!: replace migration propagation with a per-build format floor and one load gate by @yuto-trd in #2981
- test: drop the root version fields from Project in the format manifest by @yuto-trd in #2983
- fix: keep file text out of the refused-version error that agents read by @yuto-trd in #2984
- feat: load renamed types and members under their former persisted names by @yuto-trd in #2982
- feat: keep unknown members and types so 2.x builds keep each other's data by @yuto-trd in #2985
- refactor: stop migrating operators that no release wrote by @yuto-trd in #2986
- ci: group Dependabot updates and leave SkiaSharp to the fork by @yuto-trd in #2988
- test: delete Rgba16fGoldenStore, which no test uses by @yuto-trd in #2989
- ci: ship self-contained builds only by @yuto-trd in #2990
- ci: smoke-test the FFmpeg worker and the MCP host of the linux_x64 output by @yuto-trd in #2991
- ci: report daily build failures in a tracking issue by @yuto-trd in #2992
- ci: count skipped tests by reason and fail GPU skips where CI provides SwiftShader by @yuto-trd in #2993
- ci: run the AVFoundation tests in the macOS job by @yuto-trd in #2994
- Bump the nuget-minor-and-patch group with 1 update by @dependabot[bot] in #2995
- fix: stop node ports from keeping their property name and type as unknown data by @yuto-trd in #3001
- refactor: remove unnecessary code in audio and media by @yuto-trd in #3002
- refactor: remove unnecessary code in the graphics backend and 3D by @yuto-trd in #3003
- refactor: remove unnecessary code in version control and editor tests by @yuto-trd in #3004
- Bump the nuget-minor-and-patch group with 5 updates by @dependabot[bot] in #3008
- refactor: remove unnecessary code in the agent toolkit, AI services and API client by @yuto-trd in #3005
- refactor: remove unnecessary code in the project system and editor services by @yuto-trd in #3007
- refactor: remove unnecessary code in app views and editor components by @yuto-trd in #3006
- refactor: remove unnecessary code in the FFmpeg extension, the node graph and the source generators by @yuto-trd in #3012
- refactor: remove unnecessary code in the filter effects and the renderer by @yuto-trd in #3014
- refactor: remove unnecessary code in the small projects, the build and the test infrastructure by @yuto-trd in #3015
- refactor: remove unnecessary code in the timeline, graph editor and controls by @yuto-trd in #3016
- refactor: remove unnecessary code in the engine and rendering tests by @yuto-trd in #3018
- refactor: remove unnecessary code in the app's view models and services by @yuto-trd in #3019
- feat: add GLSL radial blur with zoom and spin modes by @yuto-trd in #3023
- feat: add diagonal clipping controlled by signed width by @yuto-trd in #3020
- feat: add text line alignment by @yuto-trd in #3021
- feat: add Media Foundation encoding by @yuto-trd in #3022
- refactor: remove the remaining unnecessary code in the FFmpeg extension, the node graph and the source generators by @yuto-trd in #3026
- refactor: remove the remaining unnecessary code in the small projects, the build and the test infrastructure by @yuto-trd in #3027
- refactor: remove the remaining unnecessary code in the app's view models and services by @yuto-trd in #3028
- refactor: remove the remaining unnecessary code in the filter effects and the renderer by @yuto-trd in #3029
- refactor: remove the remaining unnecessary code in the project system and editor services by @yuto-trd in #3030
- refactor: remove the remaining unnecessary code in version control and editor tests by @yuto-trd in #3031
- refactor: remove the remaining unnecessary code in the engine and rendering tests by @yuto-trd in #3032
- refactor: remove the remaining unnecessary code in the graphics backend and 3D by @yuto-trd in #3033
- refactor: remove the remaining unnecessary code in audio and media by @yuto-trd in #3034
- refactor: remove the remaining unnecessary code in app views and editor components by @yuto-trd in #3035
- refactor: remove the last unnecessary code that waited on other branches by @yuto-trd in #3037
- refactor!: remove unnecessary public API in Beutl.Core by @yuto-trd in #3039
- refactor!: remove unnecessary public API in Beutl.ProjectSystem by @yuto-trd in #3040
- refactor!: remove unnecessary public API in Beutl.Api by @yuto-trd in #3041
- refactor!: remove unnecessary public API in Beutl.Editor.Components by @yuto-trd in #3042
- refactor!: remove unnecessary public API in Beutl.Editor by @yuto-trd in #3043
- refactor!: remove unnecessary public API in Beutl by @yuto-trd in #3044
- refactor!: remove unnecessary public API in Beutl.Threading by @yuto-trd in #3045
- refactor!: remove unnecessary public API in Beutl.Controls by @yuto-trd in #3046
- refactor!: remove unnecessary public API in Beutl.NodeGraph by @yuto-trd in #3047
- refactor!: remove unnecessary public API in Beutl.Utilities by @yuto-trd in #3048
- refactor: remove unnecessary public API in Beutl.AgentToolkit by @yuto-trd in #3049
- refactor!: remove unnecessary public API in Beutl.Configuration by @yuto-trd in #3050
- refactor: remove unnecessary public API in Beutl.Extensions.FFmpeg.Core by @yuto-trd in #3051
- refactor!: remove unnecessary public API in Beutl.Extensibility by @yuto-trd in #3052
- refactor: remove unnecessary public API in Beutl.Extensions.FFmpeg by @yuto-trd in #3053
- refactor!: remove unnecessary public API in Beutl.Language by @yuto-trd in #3054
- refactor: remove unnecessary public API in Beutl.Extensions.AVFoundation by @yuto-trd in #3055
- refactor: remove unnecessary public API in Beutl.Extensions.MediaFoundation by @yuto-trd in #3056
- refactor!: remove ContextCommandAttribute from Beutl.Extensibility by @yuto-trd in #3058
- refactor!: merge the AI registration modes into AiJobBehaviorRegistrationMode by @yuto-trd in #3060
- refactor!: remove CoreListMarshal from Beutl.Core by @yuto-trd in #3057
- refactor!: remove ProxiesTabViewModel.JobSummary and StatusMessage by @yuto-trd in #3067
- refactor!: remove HistoryManager.Root and EnumerateMediaFileSources from Beutl.Editor by @yuto-trd in #3068
- fix: write Vector3 and Quaternion JSON values with the invariant culture by @yuto-trd in #3073
- refactor: read Rational JSON values only from their string form by @yuto-trd in #3071
- refactor: stop symbolic-link cycles at the hop limit only by @yuto-trd in #3074
- refactor: cache the model catalog with the schema revision it was mapped with by @yuto-trd in #3075
- fix: report an invalid AI content extension as AiException by @yuto-trd in #3077
- fix: report a non-string schemaVersion as a schema version mismatch by @yuto-trd in #3078
- refactor: show an internal error's parameter name as it is by @yuto-trd in #3080
- refactor: give the renderScale hint in thousandths instead of to 1 ulp by @yuto-trd in #3083
- refactor: stop re-announcing the tools of an editor that did not answer by @yuto-trd in #3085
- fix: attach a list item's editor handlers once by @yuto-trd in #3084
- refactor: prune a stale agent host entry by reading and deleting it by @yuto-trd in #3086
- refactor!: let FindHierarchicalParent pass on HierarchicalParent exceptions by @yuto-trd in #3082
- refactor: drop the version-1 reader of the AI retry key store by @yuto-trd in #3069
- refactor: drop the generator test input for the removed list-like type rule by @yuto-trd in #3128
- refactor: limit AI image previews by count only by @yuto-trd in #3081
- refactor: rebuild nested-scene children in place by @yuto-trd in #3087
- refactor!: drop the view settings page's "some settings have been moved" item by @yuto-trd in #3120
- refactor: drop the FFmpeg loader's no-op dependency fix by @yuto-trd in #3119
- refactor: register the main view model's exit handlers without re-registration support by @yuto-trd in #3116
- refactor: drop the video DataLength left from the reader without a ring by @yuto-trd in #3115
- refactor: compile the SKSL recipes without the missing-Skia skip by @yuto-trd in #3111
- refactor!: drop the unused Backup settings section and ShowTutorialsOnStartup by @yuto-trd in #3109
- refactor: drop the video recovery's check for job-based attempts by @yuto-trd in #3108
- refactor: stop looking up the never-written legacy descendant identity keys by @yuto-trd in #3107
- refactor: drop the handwritten orbital radar starter example by @yuto-trd in #3106
- refactor!: read the memory size for the frame cache default from the GC by @yuto-trd in #3102
- refactor: report a control-character project path like any failed discovery by @yuto-trd in #3100
- refactor: remove the broken devcontainer and the stale Nuke solution parameter by @yuto-trd in #3098
- refactor: drop the information page's stale CS0436 pragmas by @yuto-trd in #3094
- refactor: drop the library item counts kept only as a capacity hint by @yuto-trd in #3093
- refactor: test SceneNode's anchored time with a plain save and load by @yuto-trd in #3090
- fix: keep the editor's maximum time at the remaining elements after a bulk removal by @yuto-trd in #3088
- fix: return the right sign from Rational.IsPositive by @yuto-trd in #3070
- fix: create tutorial projects in the Beutl home by @yuto-trd in #3095
- fix: keep the agent schema's own types out of the library by @yuto-trd in #3101
- refactor!: drop IReferenceRewritable and the collection rebuilding in reference migration by @yuto-trd in #3103
- refactor: remove the empty CommandsHost from the exception handler window by @yuto-trd in #3105
- fix: rotate a 3D transform about its center when the center sums to zero by @yuto-trd in #3113
- fix: duplicate_object wrapInGroup keeps the copy's media and is followed once by @yuto-trd in #3076
- refactor: require the frame color type in the encoding IPC by @yuto-trd in #3117
- refactor: drop the define symbols no source of those projects tests by @yuto-trd in #3118
- refactor: classify FFmpeg failures by their code only by @yuto-trd in #3121
- fix: translate the extensions window's Home and Library tabs by @yuto-trd in #3122
- fix: apply the FFmpeg encoding ThreadCount setting by @yuto-trd in #3123
- fix: show the signed-in account's current display name in the account settings by @yuto-trd in #3124
- refactor: drop the benchmarks that only measure BCL APIs by @yuto-trd in #3126
- refactor: stop expanding a path segment's editor when its point is pressed by @yuto-trd in #3127
- refactor: drop the benchmarks' package references their code does not use by @yuto-trd in #3129
- refactor: format the proxy sizes with the file browser's size formatter by @yuto-trd in #3131
- refactor: keep only the dropped-key check of the development-build fingerprints test by @yuto-trd in #3099
- refactor: replace an unusable editor layout file instead of setting it aside by @yuto-trd in #3130
- refactor: drop the dark-teal avoidance from the template palettes by @yuto-trd in #3110
- fix: write AVFoundation exports in the container their extension names by @yuto-trd in #3125
- refactor: let an environment variable choose the telemetry collector by @yuto-trd in #3091
- refactor: restore IPropertyPathProvider for the planned change-set work by @yuto-trd in #3132
- refactor: let the Codex MCP config keep its file mode by @yuto-trd in #3089
- fix: label the history entry of an applied effect template "Apply template" by @yuto-trd in #3114
- fix: price a clip's transcription by the audio it sends by @yuto-trd in #3112
- refactor: stop looking for the MCP server in an AgentToolkitMcp folder by @yuto-trd in #3092
- test: check the duplicate's slot as a pair and name the per-owner count by @yuto-trd in #3145
- fix: show English text where the English UI showed Japanese or garbled characters by @yuto-trd in #3140
- fix: dispose a node member observer's child observers with it by @yuto-trd in #3141
- refactor: read the changed property's name with PropertyPathHelper by @yuto-trd in #3143
- fix: log NuGet's minimal-verbosity messages at Information by @yuto-trd in #3144
- fix: register Beutl for .bep files instead of the sample .myp by @yuto-trd in #3142
- test: fix tests whose names or checks did not match what they test by @yuto-trd in #3146
- test: drop the logger factory each of seven editor fixtures set up by @yuto-trd in #3149
- refactor!: let BEUTL_API_BASE_URL choose the API server by @yuto-trd in #3133
- Bump the nuget-minor-and-patch group with 21 updates by @dependabot[bot] in #3151
- test: build every version control service test with the isolated runner by @yuto-trd in #3152
- test: put the license texts next to the Noto Sans JP and Roboto test fonts by @yuto-trd in #3148
- refactor: drop the prompt library's migration of the single ai-prompts.json by @yuto-trd in #3159
- test: delete the folders and files two editor tests create by @yuto-trd in #3147
- fix: keep the path editor tab's geometry overlay out of hit testing after playback by @yuto-trd in #3154
- refactor: drop the WKDownload check older than every supported macOS by @yuto-trd in #3157
- refactor: refuse an unignored nested repository only at the first snapshot by @yuto-trd in #3161
- refactor: let the ad-block refresh check a superseded load once by @yuto-trd in #3160
- refactor: append new version fields instead of placing them after Id and Name by @yuto-trd in #3097
- test: drop version control tests whose checks are gone by @yuto-trd in #3150
- fix: stop the file browser from reading collapsed folders as files by @yuto-trd in #3166
- refactor: let a caller's cancellation end only its wait for Git discovery by @yuto-trd in #3169
- refactor: mirror the opposite path handle with one vector formula by @yuto-trd in #3156
- refactor: export captions and save frame images only to local files by @yuto-trd in #3167
- refactor: leave the suggestion checks to the suggestion provider by @yuto-trd in #3164
- refactor: commit the pending entry once before an isolated transaction by @yuto-trd in #3165
- refactor: stop sweeping files directly under an AI temporary category by @yuto-trd in #3176
- refactor: drop the single-view lifetime branches of the app by @yuto-trd in #3171
- refactor: drop the recovery store test of a job-based source identifier by @yuto-trd in #3170
- fix: show Aqua and Fuchsia once in the color palette by @yuto-trd in #3179
- refactor: search fonts to bundle only where Beutl loads them from by @yuto-trd in #3153
- refactor: drop the FFmpeg variables of the WSL launch profile by @yuto-trd in #3174
- refactor: show remote results without re-posting to the UI thread by @yuto-trd in #3172
- refactor: detect Git LFS pointers with a looser check by @yuto-trd in #3173
- refactor: link the branch refresh cancellation without a disposed-source wrapper by @yuto-trd in #3177
- refactor: route version-control view events through the command boundary by @yuto-trd in #3181
- fix: log scope render failures and update the scopes without a dispatcher hop by @yuto-trd in #3182
- refactor: read only the caption draft version that releases write by @yuto-trd in #3155
- refactor: stop rewriting the browser profile when it is loaded by @yuto-trd in #3162
- refactor: drop the node member view model's finalizer by @yuto-trd in #3175
- refactor!: drop the default implementations of IElementAttributeService by @yuto-trd in #3183
- refactor: refuse case variants of branch names on every ref storage by @yuto-trd in #3178
- refactor: load the prompt library without rewriting it or reading version 1 by @yuto-trd in #3163
- fix: offer the AI video nodes and agents the models the video dialog offers by @yuto-trd in #3185
- fix: keep each node graph breadcrumb on its own graph by @yuto-trd in #3184
- refactor: scan project documents for conflict markers line by line by @yuto-trd in #3180
- refactor!: move AddNodeAndConnect onto INodeGraphMutationService by @yuto-trd in #3186
- refactor: publish brush thumbnails without rolling back for listeners by @yuto-trd in #3168
- fix: report failed template saves from property editor menus by @yuto-trd in #3191
- refactor: write .gitignore and .gitattributes through a temporary file by @yuto-trd in #3189
- fix: start a library drag from a search result's text by @yuto-trd in #3187
- refactor: create recent-file menu items instead of pooling four of them by @yuto-trd in #3190
- fix: open the notifications flyout only when there are notifications by @yuto-trd in #3195
- refactor: look for stale Git locks only on the index, HEAD, config and branch by @yuto-trd in #3194
- fix: log a failed release after a failed versioned-resource update by @yuto-trd in #3197
- fix: keep the new scene dialog's location text clear of its folder button by @yuto-trd in #3198
- fix: translate the names of pending AI requests by @yuto-trd in #3188
- refactor: merge the player view's duplicate catches and drop click logs by @yuto-trd in #3192
- refactor: write the Git identity and remote with git config by @yuto-trd in #3193
- fix: show the JSON of fallback drawables and sounds in the element property tab by @yuto-trd in #3196
- refactor: read the timeline size resources only as doubles by @yuto-trd in #3199
- refactor: drop the single-view lifetime branch of AppHelper.GetTopLevel by @yuto-trd in #3200
- fix: wait for the pause before applying scene settings from the tab by @yuto-trd in #3202
- fix: read the zoom menu levels with the invariant culture by @yuto-trd in #3207
- fix: dolly the camera with the wheel in camera mode by @yuto-trd in #3201
- fix: show what each key types in the key monitor by @yuto-trd in #3203
- refactor: drop the 1.x layer header migration from the timeline view state by @yuto-trd in #3204
- fix: stop a closed timeline tab from following the layer count by @yuto-trd in #3205
- refactor: drop the hand-written model extension list by @yuto-trd in #3206
- fix: stop reporting a closed type picker as an error in list editors by @yuto-trd in #3208
- fix: translate the graph editor tab name and the loop tooltip by @yuto-trd in #3209
- fix: name only the inline changes the layer header refuses by @yuto-trd in #3210
- refactor: give each transform editor its own add menu by @yuto-trd in #3211
- fix: unhook the old hex box and draw the spectrum border with its brush by @yuto-trd in #3213
- fix: keep the brush flyout's drawable name in step with the brush by @yuto-trd in #3214
- refactor: share the gradient slider's drag and release handling by @yuto-trd in #3217
- fix: keep dragging the same curve point after it passes a neighbor by @yuto-trd in #3218
- fix: put the boolean editor's menu after its keyframe buttons by @yuto-trd in #3221
- fix: name the list-item X header of the vector 3 editor as the code looks it up by @yuto-trd in #3222
- fix: reorder object presenter items by their handle and open one target picker by @yuto-trd in #3223
- fix: write nested, generic and nullable types as C# in copied property code by @yuto-trd in #3220
- fix: make seven tests check what their names say by @yuto-trd in #3225
- refactor: drop test checks that only guard removed designs or repeat others by @yuto-trd in #3227
- refactor: drop the progress ring's track opacity animation by @yuto-trd in #3229
- refactor: remove AtomicFileExchange and the file hooks nothing calls by @yuto-trd in #3230
- refactor: clean up after the palette and AI context tests and describe the shell reset by @yuto-trd in #3231
- refactor: drop the System.Management version no project references by @yuto-trd in #3233
- refactor: mark the element adder's two hooks as test seams by @yuto-trd in #3234
- refactor: base the compact toggle switch theme on FluentAvalonia's by @yuto-trd in #3236
- Bump the nuget-minor-and-patch group with 1 update by @dependabot[bot] in #3235
- refactor: say "legacy" again where the effect-item rename replaced another meaning by @yuto-trd in #3237
- fix: confirm grading colors with the right old value, sharing the color editors' wiring by @yuto-trd in #3240
- fix: measure frame differences in sRGB brightness, as render_still does by @yuto-trd in #3238
- refactor: drop the hand-written motion and split-screen starter examples by @yuto-trd in #3241
- refactor!: move the property adapter interfaces to Beutl.Engine by @yuto-trd in #3242
- refactor: build the version-control path rules from EditorConstants by @yuto-trd in #3245
- fix: report exceptions that escape UI-thread callbacks instead of exiting by @yuto-trd in #3243
- test: fail when a menu bar command has no subscriber by @yuto-trd in #3252
- fix: let git status and the LFS pointer grep run past the 30-second limit by @yuto-trd in #3253
- fix: show Git's error in remote failures and stop calling SSH failures offline by @yuto-trd in #3255
- feat: decode File Browser, proxy and AI reads in a second FFmpeg worker by @yuto-trd in #3254
- feat: list the types a package references that the host lacks by @yuto-trd in #3248
- feat: fail in DEBUG builds when a confirm event's type does not match its view model by @yuto-trd in #3257
- test: resolve the scene and history that the extension docs name by @yuto-trd in #3259
- fix: list ignored project files once per open when none are found by @yuto-trd in #3261
- feat: save the packages that passed the API check by @yuto-trd in #3256
- fix: add only the missing lines to the managed LFS block by @yuto-trd in #3258
- refactor!: make IFrameProvider sequential by @yuto-trd in #3260
- fix: keep tracking a project whose repository cannot be watched, and warn by @yuto-trd in #3264
- ci: build an extension against the packed SDK and check its package by @yuto-trd in #3268
- feat: list the methods and fields a package references that the host lacks by @yuto-trd in #3269
- refactor!: make ISampleProvider sequential by @yuto-trd in #3263
- feat!: keep the multi-selection in IEditorSelection, and let menu Delete remove it with its groups by @yuto-trd in #3265
- refactor: convert playback audio at the device edge by @yuto-trd in #3271
- refactor: show the manual stale-lock steps on every OS instead of deleting the lock on Windows by @yuto-trd in #3272
- test: check that the file walkers find a file in each place a document can hold one by @yuto-trd in #3279
- feat!: refuse a package that uses APIs this Beutl lacks, at load, install and update by @yuto-trd in #3278
- feat: generate Beutl's library lists from project marks, never download them, and pack Beutl.Controls by @yuto-trd in #3276
- refactor!: replace Pcm with AudioBuffer by @yuto-trd in #3281
- refactor: apply Git path and LFS changes with one flagged routine instead of a request queue by @yuto-trd in #3275
- refactor!: keep this machine's media hashes in the scene folder's .beutl/ and drop the time from MediaFileFingerprint by @yuto-trd in #3282
- refactor: build both menu bars from one C# menu model by @yuto-trd in #3262
- refactor: throw on fragment kinds the planners have no rule for by @yuto-trd in #3290
- refactor: share one shader program and argument binder between both executors by @yuto-trd in #3293
- fix: render on the CPU when Skia has no Vulkan context for the device by @yuto-trd in #3294
- fix: load extensions in a fixed order and hand out registry copies by @yuto-trd in #3296
- fix: keep nudges, replayed collection items and derived ranges out of the wrong undo entries by @yuto-trd in #3298
- refactor!: delete the AI job and caption extension kinds and their leases by @yuto-trd in #3299
- test: check no-op apply_edit over every registered type and scene routing of session tools by @yuto-trd in #3301
- feat: export from a snapshot of the scene and keep the editor enabled while it runs by @yuto-trd in #3303
- fix: preserve partial input in bounded numeric editors by @yuto-trd in #3009
- refactor: write the files of duplicated, pasted and split elements when the scene is next saved by @yuto-trd in #3284
- feat!: give context commands ids and handlers, and key the keymap by id by @yuto-trd in #3267
- feat: guard the calls into extension factories and commands by @yuto-trd in #3291
- test: wait for the editor's start-up fingerprint write in the File Browser admission tests by @yuto-trd in #3318
- test: clear the MainView DataContext when the dock-tab and tab-switcher tests close it by @yuto-trd in #3321
- refactor: remove node-level replay of unchanged render nodes by @yuto-trd in #3320
- test: keep the throwing cancellation callback registered until the lifetime is disposed by @yuto-trd in #3322
- refactor: move LibraryRegistrar to Beutl.Editor and list its types in every agent host by @yuto-trd in #3323
- refactor: remove the live-unload marker so every package tries live unload by @yuto-trd in #3319
- feat: check in DEBUG that only the UI thread writes the open project, and bound the UI's waits on the render thread by @yuto-trd in #3302
- refactor!: make the editor clock and selection read-only, with Seek and Select by @yuto-trd in #3325
- refactor: let the property editor view models use IFrameCacheInvalidator instead of EditViewModel by @yuto-trd in #3327
- refactor: move the outpaint size and transcription segment rules out of the AI dialogs by @yuto-trd in #3324
- feat: persist the package changes queue for PackageTools.UI by @yuto-trd in #3326
- feat!: merge Exclude into one undoable Delete bound to the Delete key and Ctrl+Delete by @yuto-trd in https://github.com/b-editor/beutl/pull/3328
- test: write the selection through Select in the player input tests by @yuto-trd in https://github.com/b-editor/beutl/pull/3331
- ci: give each test job 20 minutes by @yuto-trd in https://github.com/b-editor/beutl/pull/3329
- test: check that get_schema lists every library type in both agent hosts by @yuto-trd in https://github.com/b-editor/beutl/pull/3330
- refactor!: move the MCP tool and element source extension kinds into Beutl.Extensibility by @yuto-trd in https://github.com/b-editor/beutl/pull/3332
- refactor: keep one outpaint instruction next to GetOutpaintDimensions by @yuto-trd in https://github.com/b-editor/beutl/pull/3333
- feat!: read promptRequired and qualities from the AI catalog by @yuto-trd in https://github.com/b-editor/beutl/pull/3334
- refactor: replace EditViewModel's GetService chain with an editor service registry by @yuto-trd in https://github.com/b-editor/beutl/pull/3338
- test: compare each pass with its declined target in the GLSL allocation test by @yuto-trd in https://github.com/b-editor/beutl/pull/3339
- feat!: give history one edit session at a time and queue other writers behind it by @yuto-trd in https://github.com/b-editor/beutl/pull/3336
- refactor!: recover AI requests through the server's job lookup and retry jobs on the server by @yuto-trd in https://github.com/b-editor/beutl/pull/3340
- test: check that a layout saved under a tool tab's former type name still opens it by @yuto-trd in https://github.com/b-editor/beutl/pull/3341
- refactor: share the app's process-wide registrations with the UI test app by @yuto-trd in https://github.com/b-editor/beutl/pull/3342
- refactor!: move the version control tab extension to Beutl.Editor.Components by @yuto-trd in https://github.com/b-editor/beutl/pull/3343
- feat!: end pointer drags through a DragSession that confirms on capture loss by @yuto-trd in https://github.com/b-editor/beutl/pull/3345
- refactor!: replace the public RecordingSuppression with an internal replay flag by @yuto-trd in https://github.com/b-editor/beutl/pull/3346
- refactor!: move the history tab to Beutl.Editor.Components by @yuto-trd in https://github.com/b-editor/beutl/pull/3347
- feat: render playback one frame per render-thread job and show edits on the next frame by @yuto-trd in https://github.com/b-editor/beutl/pull/3344
- refactor!: move the dock layout tab to Beutl.Editor.Components by @yuto-trd in https://github.com/b-editor/beutl/pull/3349
- refactor!: move the transition tab and the type picker to Beutl.Editor.Components by @yuto-trd in https://github.com/b-editor/beutl/pull/3350
- fix: let only the latest query change update the Library search by @yuto-trd in https://github.com/b-editor/beutl/pull/3352
- refactor!: move the missing media tab to Beutl.Editor.Components by @yuto-trd in https://github.com/b-editor/beutl/pull/3353
- refactor!: move the output tab to Beutl.Editor.Components by @yuto-trd in https://github.com/b-editor/beutl/pull/3354
- Bump the nuget-minor-and-patch group with 12 updates by @dependabot[bot] in https://github.com/b-editor/beutl/pull/3355
- docs: say where new editor code goes by @yuto-trd in https://github.com/b-editor/beutl/pull/3357
- refactor!: delete IAnimationRange by @yuto-trd in https://github.com/b-editor/beutl/pull/3358
- feat: report EngineObject constructors that skip ScanProperties() by @yuto-trd in https://github.com/b-editor/beutl/pull/3359
- refactor: move the property editors to Beutl.Editor.Components by @yuto-trd in https://github.com/b-editor/beutl/pull/3360
- feat: save edits of objects whose type is missing by @yuto-trd in https://github.com/b-editor/beutl/pull/3361
- refactor!: move the AI workspace tab and its pages to Beutl.Editor.Components by @yuto-trd in https://github.com/b-editor/beutl/pull/3362
- test: check every resx family, update script key and activity source name by @yuto-trd in https://github.com/b-editor/beutl/pull/3363
- build: ban DrawVideoSource(TimeSpan) and Project.Variables in src by @yuto-trd in https://github.com/b-editor/beutl/pull/3365
- feat: add MediaTime, an exact flick-based time by @yuto-trd in https://github.com/b-editor/beutl/pull/3364
- refactor!: make keyframes the bottom of each property's expression chain by @yuto-trd in https://github.com/b-editor/beutl/pull/3366
- refactor: count playback and export frames through MediaTime by @yuto-trd in https://github.com/b-editor/beutl/pull/3367
- refactor: walk below objects one way and parse history paths in one place by @yuto-trd in https://github.com/b-editor/beutl/pull/3368
- refactor!: move IProperty and the expression interfaces to Beutl.Core by @yuto-trd in https://github.com/b-editor/beutl/pull/3369
- refactor!: give value-only properties their own type and declare references by @yuto-trd in https://github.com/b-editor/beutl/pull/3374
- refactor!: rename the property members and factories by @yuto-trd in https://github.com/b-editor/beutl/pull/3375
- refactor!: hold EngineObject and node graph values in value-only properties by @yuto-trd in https://github.com/b-editor/beutl/pull/3376
- refactor!: hold CoreObject and project system values in value-only properties by @yuto-trd in https://github.com/b-editor/beutl/pull/3377
- refactor!: hold the settings in value-only properties and delete CoreProperty by @yuto-trd in https://github.com/b-editor/beutl/pull/3378
- Bump the nuget-minor-and-patch group with 2 updates by @dependabot[bot] in https://github.com/b-editor/beutl/pull/3381
- feat: count duplicate ids, resolve references within their scene and regenerate ids in one pass by @yuto-trd in https://github.com/b-editor/beutl/pull/3383
- feat!: replace the property editor extension methods with typed registrations by @yuto-trd in https://github.com/b-editor/beutl/pull/3384
- build: pin System.Security.Cryptography.Pkcs to a patched version by @yuto-trd in https://github.com/b-editor/beutl/pull/3385
- fix: parse RelativePoint with a provider without calling itself by @yuto-trd in https://github.com/b-editor/beutl/pull/3386
- fix: treat a zero numerator as zero and not negative in Rational by @yuto-trd in https://github.com/b-editor/beutl/pull/3387
- fix: enable version control from a floating version control tab by @yuto-trd in https://github.com/b-editor/beutl/pull/3388
- fix: show the color and the read-only state in the settings color editors by @yuto-trd in https://github.com/b-editor/beutl/pull/3390
- fix: reject adding an object to a hierarchical list inside it by @yuto-trd in https://github.com/b-editor/beutl/pull/3391
- fix: give a copied clip its own file-backed objects by @yuto-trd in https://github.com/b-editor/beutl/pull/3392
- fix: hide the stale-lock banner once the lock file is removed by @yuto-trd in https://github.com/b-editor/beutl/pull/3389
- fix: post evaluated connection statuses to the UI thread by @yuto-trd in https://github.com/b-editor/beutl/pull/3393
- fix: show a missing-type object's message above its property rows by @yuto-trd in https://github.com/b-editor/beutl/pull/3395
- fix: follow the derived text-on-accent color in the light theme by @yuto-trd in https://github.com/b-editor/beutl/pull/3396
- fix: key the spline easing and binding path caches weakly by @yuto-trd in https://github.com/b-editor/beutl/pull/3397
- fix: translate the display names of three tool tabs by @yuto-trd in https://github.com/b-editor/beutl/pull/3398
- fix: list only creatable types in the library picker's Show all by @yuto-trd in https://github.com/b-editor/beutl/pull/3400
- fix!: write a newly added element's file at the next save by @yuto-trd in https://github.com/b-editor/beutl/pull/3401
- fix: guard the output tab's control factory by @yuto-trd in https://github.com/b-editor/beutl/pull/3399
- fix: restore the nested view state of geometry, path figure and effect groups by @yuto-trd in https://github.com/b-editor/beutl/pull/3402
- fix: save a new AI image with the default file mode, as a saved video by @yuto-trd in https://github.com/b-editor/beutl/pull/3403
- fix: keep the library picker's height when its search box opens by @yuto-trd in https://github.com/b-editor/beutl/pull/3404
- fix: export fonts from the folders the editor loaded, and say a folder change needs a restart by @yuto-trd in https://github.com/b-editor/beutl/pull/3405
- fix: keep media named with #, ? or %XX through copies and file: bases by @yuto-trd in https://github.com/b-editor/beutl/pull/3406
- fix: match saved platform presets by name only once by @yuto-trd in https://github.com/b-editor/beutl/pull/3408
- fix: let the serialized graph walker read node-port values by @yuto-trd in https://github.com/b-editor/beutl/pull/3410
- test: build the macOS path expectations from canonical temp roots by @yuto-trd in https://github.com/b-editor/beutl/pull/3411
- test: shorten the FFmpeg handshake gate pipe names by @yuto-trd in https://github.com/b-editor/beutl/pull/3412
- test: compare a cropped radial blur within one half-float step by @yuto-trd in https://github.com/b-editor/beutl/pull/3413
- fix: load the later faces of font collections on macOS by @yuto-trd in https://github.com/b-editor/beutl/pull/3418
- fix: let the AVFoundation reader decode earlier frames after a read past the end by @yuto-trd in https://github.com/b-editor/beutl/pull/3419
- fix: return false from the Media Foundation reader for a frame past the end by @yuto-trd in https://github.com/b-editor/beutl/pull/3420
- test: block the AI error-body read on the request token by @yuto-trd in https://github.com/b-editor/beutl/pull/3421
- fix: log model textures that cannot be found by @yuto-trd in https://github.com/b-editor/beutl/pull/3414
- fix!: decode FFmpeg media in the stdio MCP server by @yuto-trd in https://github.com/b-editor/beutl/pull/3426
- fix: do not register an FFmpeg option query that already finished by @yuto-trd in https://github.com/b-editor/beutl/pull/3427
- fix: keep a dragged 3D object under the pointer in a scaled or turned Scene3D by @yuto-trd in https://github.com/b-editor/beutl/pull/3430
- fix: register every face of an installed font collection by @yuto-trd in https://github.com/b-editor/beutl/pull/3433
- fix: skip the H.264 default options for other video encoders by @yuto-trd in https://github.com/b-editor/beutl/pull/3435
- fix!: look up camera mode's 3D scene on the render thread by @yuto-trd in https://github.com/b-editor/beutl/pull/3432
- fix: return no reader when a file lacks the requested streams by @yuto-trd in https://github.com/b-editor/beutl/pull/3415
- fix: count FFmpeg video frames from the container start by @yuto-trd in https://github.com/b-editor/beutl/pull/3437
- fix: draw a shape whose filter effect type did not load without that effect by @yuto-trd in https://github.com/b-editor/beutl/pull/3438
- fix: hand Vulkan releases from other threads to the command pool's thread by @yuto-trd in https://github.com/b-editor/beutl/pull/3441
- fix: reject agent edits that leave an element that could not be loaded unrepaired by @yuto-trd in https://github.com/b-editor/beutl/pull/3444
- fix: count FFmpeg audio samples from the container start by @yuto-trd in https://github.com/b-editor/beutl/pull/3445
- refactor!: replace TimeSpan with MediaTime in the model, engine and UI by @yuto-trd in https://github.com/b-editor/beutl/pull/3409
- fix: leave frames and audio as they are for other types that did not load by @yuto-trd in https://github.com/b-editor/beutl/pull/3442
- fix: copy the FFmpeg worker next to the stdio MCP server built from source by @yuto-trd in https://github.com/b-editor/beutl/pull/3447
- ci: run required checks for the merge queue by @yuto-trd in https://github.com/b-editor/beutl/pull/3449
- fix: apply an agent edit of a nested value in place so it keeps its unknown members by @yuto-trd in https://github.com/b-editor/beutl/pull/3448
- fix: wait for Skia before releasing a texture of a non-shared context by @yuto-trd in https://github.com/b-editor/beutl/pull/3443
- fix: count Media Foundation frames and samples from the container start by @yuto-trd in https://github.com/b-editor/beutl/pull/3446
- fix: copy objects for duplicate_object as the editor does, with their own files and request keys by @yuto-trd in https://github.com/b-editor/beutl/pull/3453
- fix: map 3D presses into a moved or scaled Scene3D by @yuto-trd in https://github.com/b-editor/beutl/pull/3452
- test: name a stopped producer or render failure in the exit transition playback test by @yuto-trd in https://github.com/b-editor/beutl/pull/3455
- fix: stop a ripple at a locked clip a follower would pass over by @yuto-trd in https://github.com/b-editor/beutl/pull/3454
- fix: let agent edits through node graphs whose ports hold values or bind properties by @yuto-trd in https://github.com/b-editor/beutl/pull/3451
- fix: make the node graph tab read-only on a locked or protected clip by @yuto-trd in https://github.com/b-editor/beutl/pull/3456
- ci: require all .NET jobs to pass before merging by @yuto-trd in https://github.com/b-editor/beutl/pull/3457
- test: evaluate the same-URI relink test on the render thread after the preview redraw by @yuto-trd in https://github.com/b-editor/beutl/pull/3460
- fix: keep %XX in file names when a path becomes a file URI by @yuto-trd in https://github.com/b-editor/beutl/pull/3461
- fix: migrate a 1.x decorator or group operator turned off as turned off by @yuto-trd in https://github.com/b-editor/beutl/pull/3462
- fix: repair a value that loading dropped only by an edit that replaces it by @yuto-trd in https://github.com/b-editor/beutl/pull/3464
- fix: keep agent edits from changing a locked clip through its neighbours by @yuto-trd in https://github.com/b-editor/beutl/pull/3465
- refactor!: write flick counts and store the frame rate as a rational by @yuto-trd in https://github.com/b-editor/beutl/pull/3458
- fix: make the Graph Editor and Path Editor read-only on a locked clip by @yuto-trd in https://github.com/b-editor/beutl/pull/3463
- fix: map 3D presses into a Scene3D that a group draws by @yuto-trd in https://github.com/b-editor/beutl/pull/3467
- fix: pass the H.264 default options only to H.264 encoders that parse them by @yuto-trd in https://github.com/b-editor/beutl/pull/3471
- fix: write an unreduced whole Rational as its value by @yuto-trd in https://github.com/b-editor/beutl/pull/3468
- fix: carry why a render target was not made in the allocation error by @yuto-trd in https://github.com/b-editor/beutl/pull/3470
- fix: ask before copying into an existing folder and stop following folder links by @yuto-trd in https://github.com/b-editor/beutl/pull/3472
- test: add the regression test for the lost FFmpeg option results of #2909 by @yuto-trd in https://github.com/b-editor/beutl/pull/3473
- fix: clamp the buffer a typed fallback stage allocates, not a proxy of it by @yuto-trd in https://github.com/b-editor/beutl/pull/3475
- fix: snap Mosaic samples in the source's own texel grid by @yuto-trd in https://github.com/b-editor/beutl/pull/3476
- fix: price the AI subtitle estimate again after the clip's speed keyframes change by @yuto-trd in https://github.com/b-editor/beutl/pull/3474
- fix: leave path segments whose type did not load out of path editing by @yuto-trd in https://github.com/b-editor/beutl/pull/3469
- Bump the nuget-minor-and-patch group with 1 update by @dependabot[bot] in https://github.com/b-editor/beutl/pull/3481
- refactor!: expose value-only properties as property objects by @yuto-trd in https://github.com/b-editor/beutl/pull/3479
- refactor!: generate every CoreObject's scan and move Property to Core by @yuto-trd in https://github.com/b-editor/beutl/pull/3480
- feat: warn when code compares two property objects with == or Equals by @yuto-trd in https://github.com/b-editor/beutl/pull/3483
- fix: keep the alpha when converting a gray HSV color to RGB by @yuto-trd in https://github.com/b-editor/beutl/pull/3484
- refactor: drop the never-stored proxy thumbnail key and the thumbnail shutdown registration by @yuto-trd in https://github.com/b-editor/beutl/pull/3487
- fix: play a GIF or WebP that repeats a set number of times for every pass by @yuto-trd in https://github.com/b-editor/beutl/pull/3486
- refactor: remove the FFmpeg direct-versus-IPC benchmark by @yuto-trd in https://github.com/b-editor/beutl/pull/3488
- fix: keep the clear node when GraphicsContext2D.Clear records the same color by @yuto-trd in https://github.com/b-editor/beutl/pull/3491
- fix: check the preview presenter's allocations and stop redrawing a shown frame by @yuto-trd in https://github.com/b-editor/beutl/pull/3492
- refactor!: drop the render node and node cache finalizers by @yuto-trd in https://github.com/b-editor/beutl/pull/3485
- fix: return no color space for an ICC profile Skia cannot use as one by @yuto-trd in https://github.com/b-editor/beutl/pull/3489
- refactor!: drop the audio graph's topology transaction and hook rollback by @yuto-trd in https://github.com/b-editor/beutl/pull/3494
- test: fix rendering tests whose names or checks did not match what they test by @yuto-trd in https://github.com/b-editor/beutl/pull/3493
- refactor: drop the scaled text cache's commit rollback and its test hooks by @yuto-trd in https://github.com/b-editor/beutl/pull/3496
- refactor: stop keeping shader program failures for later by @yuto-trd in https://github.com/b-editor/beutl/pull/3497
- test: dispose the drawable resources and nodes the rendering tests create by @yuto-trd in https://github.com/b-editor/beutl/pull/3500
- refactor: share waveform chunk duration calculation by @yuto-trd in https://github.com/b-editor/beutl/pull/3502
- refactor: stop attaching drawable-brush cleanup failures to the primary exception by @yuto-trd in https://github.com/b-editor/beutl/pull/3503
- fix: preserve graph editor trackpad scroll axes by @yuto-trd in https://github.com/b-editor/beutl/pull/3504
- refactor!: count render node changes on the recording thread only by @yuto-trd in https://github.com/b-editor/beutl/pull/3506
- fix: shade zero-direction lights consistently with their shadows by @yuto-trd in https://github.com/b-editor/beutl/pull/3507
- refactor: stop recovering queued resource releases after dispatcher shutdown by @yuto-trd in https://github.com/b-editor/beutl/pull/3509
- refactor!: use declared defaults for non-finite dynamics parameters by @yuto-trd in https://github.com/b-editor/beutl/pull/3510
- refactor: reject still PNGs in the animated PNG reader by @yuto-trd in https://github.com/b-editor/beutl/pull/3508
- refactor!: snapshot each LUT once and apply its declared input domain by @yuto-trd in https://github.com/b-editor/beutl/pull/3512
- refactor: dispose execution state once when rejecting unpublished captures by @yuto-trd in https://github.com/b-editor/beutl/pull/3513
- fix: prefer an integrated GPU over SwiftShader and release the color space name by @yuto-trd in https://github.com/b-editor/beutl/pull/3499
- fix: apply brush opacity to bare shaders and release the Perlin shader by @yuto-trd in https://github.com/b-editor/beutl/pull/3505
- refactor!: simplify easing constructor failure recovery by @yuto-trd in https://github.com/b-editor/beutl/pull/3514
- refactor: remove the retired FFmpeg friend assembly by @yuto-trd in https://github.com/b-editor/beutl/pull/3516
- refactor: drop unused rendering measurement harnesses by @yuto-trd in https://github.com/b-editor/beutl/pull/3518
- refactor: wrap executor-owned session inputs without copying by @yuto-trd in https://github.com/b-editor/beutl/pull/3521
- refactor: simplify graphics shutdown and rollback failures by @yuto-trd in https://github.com/b-editor/beutl/pull/3519
- refactor: surface expression logging failures by @yuto-trd in https://github.com/b-editor/beutl/pull/3520
- refactor: use one lookup for Vulkan descriptor bindings by @yuto-trd in https://github.com/b-editor/beutl/pull/3522
- fix: share one 2D shadow pass and stop filling the unread shadow cube by @yuto-trd in https://github.com/b-editor/beutl/pull/3495
- refactor: stop resetting an entry's caches right before disposing it by @yuto-trd in https://github.com/b-editor/beutl/pull/3498
- refactor: drop the limiter's out-of-memory cleanup and empty-chunk log by @yuto-trd in https://github.com/b-editor/beutl/pull/3501
- refactor: remove the unused KHR image binding proxy by @yuto-trd in https://github.com/b-editor/beutl/pull/3523
- refactor: drop the unreleased blend color migration by @yuto-trd in https://github.com/b-editor/beutl/pull/3525
- refactor: simplify Linux default font process handling by @yuto-trd in https://github.com/b-editor/beutl/pull/3526
- refactor: simplify hit tests for sampling effects by @yuto-trd in https://github.com/b-editor/beutl/pull/3527
- refactor: retire render-pipeline source censuses by @yuto-trd in https://github.com/b-editor/beutl/pull/3528
- refactor!: stop supporting Skia factory reentry by @yuto-trd in https://github.com/b-editor/beutl/pull/3529
- refactor!: read native geometry paths after construction by @yuto-trd in https://github.com/b-editor/beutl/pull/3531
- refactor!: remove KeySpline writer serialization by @yuto-trd in https://github.com/b-editor/beutl/pull/3532
- refactor: drop the unreleased bare proxy sidecar format by @yuto-trd in https://github.com/b-editor/beutl/pull/3534
- refactor: propagate effect resource rollback failures by @yuto-trd in https://github.com/b-editor/beutl/pull/3535
- fix: reuse sound group child nodes across edits by @yuto-trd in https://github.com/b-editor/beutl/pull/3536
- refactor!: snapshot formatted text on first enumeration by @yuto-trd in https://github.com/b-editor/beutl/pull/3537
- fix: list signed 24-bit PCM once in the wave decoder name by @yuto-trd in https://github.com/b-editor/beutl/pull/3538
- refactor!: use prepared targets for drawable textures by @yuto-trd in https://github.com/b-editor/beutl/pull/3539
- refactor: remove completed migration comparison tests by @yuto-trd in https://github.com/b-editor/beutl/pull/3540
- fix: verify native decoder output contracts by @yuto-trd in https://github.com/b-editor/beutl/pull/3542
- refactor: compare pixel sort with a CPU ordering reference by @yuto-trd in https://github.com/b-editor/beutl/pull/3547
- refactor: test current public contracts instead of retired names by @yuto-trd in https://github.com/b-editor/beutl/pull/3548
- fix: use the composer rate in visualizer test expectations by @yuto-trd in https://github.com/b-editor/beutl/pull/3549
- refactor: avoid saving settings from the test typeface helper by @yuto-trd in https://github.com/b-editor/beutl/pull/3550
- refactor: replace copied geometry builders with fixed snapshots by @yuto-trd in https://github.com/b-editor/beutl/pull/3551
- refactor!: remove unused proxy generation admission by @yuto-trd in https://github.com/b-editor/beutl/pull/3552
- refactor: let invalid render-target lease releases fail directly by @yuto-trd in https://github.com/b-editor/beutl/pull/3517
- refactor: remove unreachable rendering recovery paths by @yuto-trd in https://github.com/b-editor/beutl/pull/3524
- fix: release test-owned audio and text resources by @yuto-trd in https://github.com/b-editor/beutl/pull/3544
- refactor: simplify Vulkan lifetime source tests by @yuto-trd in https://github.com/b-editor/beutl/pull/3545
- refactor: drop the unreleased proxy fingerprint fixture by @yuto-trd in https://github.com/b-editor/beutl/pull/3553
- refactor!: stop renderer cleanup at the first disposal failure by @yuto-trd in https://github.com/b-editor/beutl/pull/3530
- refactor!: simplify node renderer and cache cleanup by @yuto-trd in https://github.com/b-editor/beutl/pull/3533
- refactor!: normalize offline proxy keys without link resolution by @yuto-trd in https://github.com/b-editor/beutl/pull/3546
- ci: optimize Actions concurrency for GitHub Team by @yuto-trd in https://github.com/b-editor/beutl/pull/3555
- ci: focus ARM64 checks on native dependencies by @yuto-trd in https://github.com/b-editor/beutl/pull/3556
- refactor!: persist proxy snapshots without cross-process merging by @yuto-trd in https://github.com/b-editor/beutl/pull/3543
- test(engine): pin shadow and wave fixes and normalize snapshots by @yuto-trd in https://github.com/b-editor/beutl/pull/3557
- fix!: correct 3D LUT interpolation grid spacing by @yuto-trd in https://github.com/b-editor/beutl/pull/3562
- fix(audio): preserve resampler state across unchanged rebuilds by @yuto-trd in https://github.com/b-editor/beutl/pull/3561
- fix(engine): retire proxy jobs canceled during generator requeue by @yuto-trd in https://github.com/b-editor/beutl/pull/3563
- fix: reject linked ancestors in folder copy destinations by @yuto-trd in https://github.com/b-editor/beutl/pull/3560
- feat: use PKCE and DPoP for desktop sign-in by @yuto-trd in https://github.com/b-editor/beutl/pull/3559
- refactor!: make reference property values non-owning by @yuto-trd in https://github.com/b-editor/beutl/pull/3566
- refactor: share the player viewport transform by @yuto-trd in https://github.com/b-editor/beutl/pull/3568
- refactor!: unify persisted-data walkers on serializer visitor by @yuto-trd in https://github.com/b-editor/beutl/pull/3571
- feat!: move time mappings to their model owners by @yuto-trd in https://github.com/b-editor/beutl/pull/3567
- feat: expose property units to schemas and editors by @yuto-trd in https://github.com/b-editor/beutl/pull/3573
- feat!: add target pickers for reference properties by @yuto-trd in https://github.com/b-editor/beutl/pull/3569
- fix: preserve literal paths in all file URI conversions by @yuto-trd in https://github.com/b-editor/beutl/pull/3576
- fix: remove empty space after closing tool tabs by @yuto-trd in https://github.com/b-editor/beutl/pull/3577
- fix: align drawable brush fills with text bounds by @yuto-trd in https://github.com/b-editor/beutl/pull/3578
- fix: keep tab context menu text readable by @yuto-trd in https://github.com/b-editor/beutl/pull/3580
- fix: resize picker popups when their contents change by @yuto-trd in https://github.com/b-editor/beutl/pull/3581
- fix: sync opacity when switching to a gradient brush by @yuto-trd in https://github.com/b-editor/beutl/pull/3579
- ci: reduce test artifact downloads by suite by @yuto-trd in https://github.com/b-editor/beutl/pull/3586
- fix: preserve project references in export snapshots by @yuto-trd in https://github.com/b-editor/beutl/pull/3584
- fix: preserve cross-drive media references by @yuto-trd in https://github.com/b-editor/beutl/pull/3585
- fix: preserve escaped media paths in agent edits by @yuto-trd in https://github.com/b-editor/beutl/pull/3588
- fix: retry excluded ports for the live MCP endpoint by @yuto-trd in https://github.com/b-editor/beutl/pull/3590
- docs: fix broken documentation links by @yuto-trd in https://github.com/b-editor/beutl/pull/3592
- fix: Place single pasted clips in a free slot by @yuto-trd in https://github.com/b-editor/beutl/pull/3632
- fix: play embedded scene references from the referenced scene's window by @yuto-trd in https://github.com/b-editor/beutl/pull/3633
- fix: Keep the requested length when media cannot be read by @yuto-trd in https://github.com/b-editor/beutl/pull/3635
- fix: verify and contain app update downloads by @yuto-trd in https://github.com/b-editor/beutl/pull/3636
- fix: Preserve package registrations when the registry is unreadable by @yuto-trd in https://github.com/b-editor/beutl/pull/3637
- fix: advance split offsets by the speed integral by @yuto-trd in https://github.com/b-editor/beutl/pull/3640
- fix: keep portal resizing independent of imported media by @yuto-trd in https://github.com/b-editor/beutl/pull/3643
- fix: prevent black frames at the end of video exports by @yuto-trd in https://github.com/b-editor/beutl/pull/3644
- fix: prevent file browser freezes when opening large directories by @yuto-trd in https://github.com/b-editor/beutl/pull/3645
- fix: snap timeline moves to clip start by @yuto-trd in https://github.com/b-editor/beutl/pull/3646
- fix: include all selected groups in timeline operations by @yuto-trd in https://github.com/b-editor/beutl/pull/3647
Full Changelog: v2.0.0-preview.8...v2.0.0-preview.9