Commit Graph
187 Commits
Author SHA1 Message Date
aiongg aa65e498ce Merge #1948: CLI: preserve template composition names when rendering (@tylerjenningsw) 2026-10-24 02:09:49 +00:00
aiongg a6d8d23dfc Merge #2045: GPU: devices favour memory use, so Purge and Close give video memory back (@arnav-hiwarkar) 2026-10-24 01:21:39 +00:00
aiongg 86623ee062 Merge #1906: xtask bench: run on Windows (scenario commands from an args file, os error 206) (@ded-achtung) 2026-10-23 23:32:52 +00:00
aiongg eb89902c9c Batch fix: web: Match System skips languages the bundled fonts can't draw (#1842) 2026-10-23 21:49:37 +00:00
aiongg 8197568559 Merge #1842: i18n: tab titles, workspaces and Project/Timeline column headers reach the catalogs; web language follows ?lang= and the browser (@devius) 2026-10-23 21:42:49 +00:00
aiongg 295d104e19 Merge #1699: Preview: replaced browser media gets a new disk-cache key (#1253) (@vbasky) 2026-10-23 21:36:58 +00:00
aiongg 0173abde8c CI: dev-profile gate, one test binary per crate, nextest, line tables only (#2235)
* Dev profile: line tables only for workspace crates, no debug info for dependencies

* xtask ci: dev-profile gate, nextest, tests without examples, wasm --keep-going

* One integration-test binary per crate

* xtask ci: run effectcraft-gpu's shared-device tests in one cargo test process

* xtask ci: run every stage and report all failures

* xtask ci: name the stage type (clippy type_complexity)

* xtask ci: run every test pass and report all failures

* cargo fmt
2026-10-23 12:59:51 -04:00
Dylan M. Taylor 0871135a6b Merge pull request #2062 from storytold/sonar-fix/js-css-reliability
fix: JS reliability bugs (SonarCloud S1764/S9383/S4275)
2026-10-22 19:27:57 -04:00
Dylan M. Taylor ec0cc83a29 fix(web): fall back to network when caches.open fails in service worker 2026-10-22 19:19:20 -04:00
Dylan M. Taylor 6871aa2236 security: check crypto.randomUUID availability in canMove 2026-10-22 19:19:19 -04:00
Dylan M. Taylor 7983396692 fix: JS reliability bugs (SonarCloud S1764, S9383, S4275)
- scriptui.js: replace the self-comparison NaN check (o.max === o.max) with
  the explicit Number.isNaN(o.max) (S1764).
- sw.js: mark the fire-and-forget cache.put() with void and a .catch() so the
  promise rejection is handled (S9383).
- prelude.js: return __err(...) from the activeCamera getter so every path
  yields a value (S4275); __err always throws, so behavior is unchanged.
2026-10-21 17:20:35 -04:00
Dylan M. Taylor 887fe3a3a8 security: use crypto.randomUUID for temp file suffix (SonarCloud S2245)
Replace Math.random() with crypto.randomUUID() when generating the unique
suffix for the atomic write-then-move temp file. The value isn't security-
sensitive, but a CSPRNG gives a stronger uniqueness guarantee and resolves
SonarCloud javascript:S2245.
2026-10-21 17:14:27 -04:00
arnav-hiwarkarandClaude Opus 5.5 2b3732153b GPU: devices favour memory use, so Purge and Close give video memory back
Both devices EffectCraft creates now ask for `MemoryHints::MemoryUsage`:

- the window device (`apps/effectcraft/src/main.rs`, through a new `device_descriptor` helper);
- the headless compositor device (`crates/gpu/src/context.rs`).

The limits, labels, features and error paths are unchanged. The devices tests create stay as they were.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 21:45:28 +05:30
tylerjenningsw 5fb5666d78 Tests: template render outputs keep the template composition's name (#1937) 2026-10-20 09:56:25 -04:00
tylerjenningsw b24438f9bb CLI: template renders keep the template composition's name (#1937) 2026-10-20 09:40:59 -04:00
dedandClaude Opus 5.5 35691f8d19 G5: bench builds scenarios from an args file on Windows
xtask bench passed the whole layers scenario on one command line, longer
than Windows' 32 767-character limit (os error 206), so no scenario past
demo ran. effectcraft-cli run takes --args-file F (one argument per line)
and bench writes its commands there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 21:29:59 +03:00
Vikram Bhaskaran d3fd2c58d7 Key browser preview caches on a file generation, and hash bytes only when that key misses.
Replacing a virtual file bumps a counter the UI lookup reads. The content hash runs on that miss, from a callback, so the frame path does not stat every footage item or hash on every store write.
2026-10-19 13:04:16 +11:00
Davit MatchakhelidzeandClaude Opus 5.5 7d03c0a1f6 Merge main; context menus use upstream's context_item (#1308)
Upstream now translates the Timeline, Composition and Effect Controls context menus itself, so
command_label is left for the dock's tab titles and the workspace bar, on menu_catalog.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF
2026-10-19 02:58:04 +04:00
FredApps b0acbbe121 CLI: regression tests for render --progress (#1778) and template media values (#1787)
- render --progress with a piped stderr writes well-formed
  `progress <done> <total> <elapsed> <left|->` lines, one per change, and
  the same render without the flag writes none.
- A template's Media Replacement control takes {"path"|"file"|"media": …},
  is found by name ignoring case, and a path that cannot be imported fails
  with an error naming the control and the path.
2026-10-18 16:46:06 +02:00
Brandon Thomas 043eb5a157 Merge pull request #1787 2026-10-18 09:35:35 -04:00
Brandon Thomas 692feb7925 Merge pull request #1778 2026-10-18 09:35:35 -04:00
Brandon Thomas 869ce1db39 Merge pull request #1752 2026-10-18 09:35:35 -04:00
Brandon Thomas 436f826c3d Merge pull request #1712 2026-10-18 09:35:35 -04:00
Brandon Thomas fc3d228616 Merge pull request #1688 2026-10-18 09:35:34 -04:00
Brandon Thomas cb76329b72 Merge pull request #1648 2026-10-18 09:35:34 -04:00
Brandon Thomas 0728169fc9 Merge pull request #1384 2026-10-18 09:35:33 -04:00
MarekSpodBiedry c74e67ca32 Let render --template --values fill a media replacement control with a file path (#1780) 2026-10-18 13:53:15 +02:00
ArchersIntelandClaude Sonnet 5.5 c6b700fe83 feat(cli): render --progress reports frames on stderr when it is not a terminal
A terminal already gets a live `[1/1] frame 16/180 ... ~14.2s left` line while
`effectcraft-cli render` runs. A program that starts the CLI (FilmCraft runs it to
render a composition for a clip) reads stderr through a pipe, so it saw nothing
until the render ended.

`--progress` prints one line per update instead, at most four a second:

    progress <frames done> <frames total> <seconds elapsed> <seconds left, or - when unknown>

It has no effect on a terminal, which keeps its live line. Without the flag
nothing changes.

Documented in the usage text, the module header and docs/agents.md.

Tests: cargo fmt --check and cargo clippy --all-targets -D warnings pass; the
effectcraft-cli tests pass except render_out_is_relative_to_the_working_directory,
which already fails on Windows (it compares a canonicalize()d `\?\` path with the
path the CLI prints) and is unrelated to this change.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-18 02:17:33 -05:00
Madhav AgarwalandDeepSeek V4.1 Flash Free b113278a1c Fix #1275: open the commands' file dialogs without blocking the frame on Linux
rfd's Linux backend goes through the XDG desktop portal, and a blocking
`rfd::FileDialog` leaves the main thread waiting on the portal's answer
without pumping winit's events: while the Open dialog is up the window stops
answering the compositor, which offers to force-quit the app ("EffectCraft is
not responding"), until a file is picked.

The non-blocking host hook for the commands' dialogs (`rfd::AsyncFileDialog`
on a worker thread, run when the dialog closes) was macOS-only since #511.
Install it on Linux too. Windows keeps the blocking pickers (its dialog pumps
its own messages), and the panel buttons' pickers (Settings, effect file
pickers) are unchanged.

Checked headlessly against a mock XDG portal: with the hook the main thread
stays in the event loop while a worker blocks in the portal wait, `ui.inspect`
still answers 7.5 s after the dialog opened, and an answered dialog runs
File ▸ Import; without it the main thread itself blocks in the portal wait and
the app answers nothing until the dialog closes.

Co-Authored-By: DeepSeek V4.1 Flash Free <noreply@deepseek.com>
2026-10-18 00:48:08 +05:30
MarekSpodBiedry 351f2591fd Fall back to the page's thread when new Worker throws in a sandboxed iframe (#1586) 2026-10-17 07:47:33 +02:00
Matej Kozlovský f8bd967861 gpu: honour wgpu env overrides in headless/CLI (with_env, WGPU_ADAPTER_NAME, WGPU_POWER_PREF)
GpuContext::request() now applies InstanceDescriptor::with_env() (WGPU_BACKEND,
WGPU_DX12_COMPILER, WGPU_VALIDATION, WGPU_DEBUG, ...), the same variables the
desktop app honours via egui-wgpu, and requests PowerPreference::from_env(),
defaulting to HighPerformance (an unknown WGPU_POWER_PREF logs a warning).

WGPU_ADAPTER_NAME (CLI/headless only; the desktop ignores it) picks the first
adapter whose name contains the trimmed value, case-insensitively. Empty or
blank counts as unset. Only the name is matched (backend via WGPU_BACKEND). A non-matching name is an
error that says so and lists each distinct adapter once as 'name (backend)', instead of wgpu::util::initialize_adapter_from_env's panic;
no adapters at all gets its own message.
2026-10-16 20:12:35 +02:00
krinry f13429010f #1582, #1585: guard web serviceWorker against SecurityError in opaque contexts
In sandboxed iframes without allow-same-origin (or other opaque origin contexts), accessing `navigator.serviceWorker` throws a SecurityError synchronously.

- Guard `info().serviceWorker` evaluation with try/catch to return `false` on SecurityError (#1585)
- Guard PWA serviceWorker registration with try/catch to let the web app load rather than hanging (#1582)
- Add contributor credit entry for @krinry in `contributors/people.toml`
2026-10-16 18:09:38 +05:30
BFlat 901d54c55f Merge pull request #1594 from rahal/fix/script-host-files
fix(web): scripts can open files in browser storage; stored footage isn't reported missing (#1593)
2026-10-16 19:04:06 +07:00
BFlat 16c6180d91 Merge pull request #1391 from sanyamsingh001/fix/cli-render-empty-r49
Honor --empty when rendering from the CLI
2026-10-16 19:03:09 +07:00
BFlat 67f3a0513c Merge pull request #1313 from sanyamsingh001/fix/cli-input-preservation-r48
Preserve CLI template inputs when output is a hard link
2026-10-16 19:02:58 +07:00
BFlat c3cb658be1 Merge pull request #1432 from marcoarnulfo/fix/render-queue-failed-exit
CLI: a failed render under run/exec exits 1, like render --queue
2026-10-16 18:59:52 +07:00
bflatasticandClaude Opus 5.5 3725c321a6 CLI: drop a debug print from the --empty render test
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:39:06 +07:00
bflatasticandClaude Opus 5.5 ced1857637 Templates: the hard-link check covers every Unix, not only Linux
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:39:03 +07:00
BFlat a2c2a1078a Merge pull request #1357 from iannitram/upstream-pr/cli-args-os
CLI: an argument that is not Unicode is a usage error, not a panic
2026-10-16 18:09:16 +07:00
rahal 228ceb308e fix(web): scripts can open files in browser storage; stored footage isn't reported missing
In the browser editor a .jsx script couldn't open any file, even one the
page holds next to the project: File.open("r") returned false with "File
not found" and File.exists was false. The footage check after File > Open
also marked imported media as missing.

Both asked whether a file exists on the local disk (std::fs), which has no
files on wasm32:
- scripts read files through Session.services but checked existence with
  std::fs (File.open's access check, File.exists, Folder.exists); they now
  ask services.exists / services.is_dir, after the folder check;
- WebServices kept the default exists (std::fs); it now looks in the file
  table.

Desktop and CLI are unchanged (FsServices keeps the std::fs defaults).
Tests: script tests_services (a host with in-memory files), web smoke
step hostFiles (a script reads a stored file, footage check finds stored
media).
2026-10-15 17:08:01 +01:00
Davit Matchakhelidze 5539bb4a95 web: Match System follows ?lang= and the browser's languages
Match System (the default) stayed English in the browser build, which has
no system-locale probe (#229). The page now passes ?lang= from the address,
then navigator.languages, and Match System takes the first of them with a
catalog (an English tag counts), else English. A language chosen in
Settings still wins; native builds are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF
(cherry picked from commit 73c064e3858068ed19fbfafbdd0b3c8cc229a42e)
2026-10-14 22:50:03 +04:00
Marco Arnulfo e26dd21af7 CLI: a failed render under run/exec exits 1, like render --queue (part of #1426) 2026-10-14 13:47:08 +02:00
sanyamsingh001andCodex fc3643ad17 Honor --empty when rendering from the CLI
Keep ordinary --empty renders from loading the demo. Preserve explicit
project, template, and demo selection, and cover them with real GIF renders.
Sort the relative-footage test's expected paths consistently with its output.

Co-authored-by: Codex <codex@openai.com>
2026-10-14 12:43:53 +10:00
tylerjenningsw f61f8c9958 Web: remembering and forgetting Media Browser folders waits for the commit too (#1242) 2026-10-13 21:38:54 -04:00
tylerjenningsw fa6c9ffccd Web: IndexedDB puts and deletes resolve when their transaction commits (#1242) 2026-10-13 21:38:54 -04:00
iannitramandClaude Opus 5.5 7c1e839603 CLI: an argument that is not Unicode is a usage error, not a panic
effectcraft-cli read its command line with std::env::args, which panics
on an argument that is not valid Unicode (a Latin-1 file name on Linux,
for example). `effectcraft-cli $'\xff'` or
`effectcraft-cli render-frame --out $'caf\xe9.png'` printed a panic from
std's env.rs and exited 101.

It now reads std::env::args_os and refuses such an argument as a usage
error (exit 2) that names it, before anything runs, like an unknown
option. A lossy copy is not used: every argument is a string here, and
`caf\u{fffd}.png` would read or write another file than the one named.
FilmCraft moved its CLI to args_os too (storytold/filmcraft#850).

Tests: a unit test for the conversion and a process test that runs the
CLI with a non-Unicode `--out` path (both unix-only). Before the fix the
process test fails (exit 101, not 2).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 15:45:23 -06:00
sanyamsingh001andCodex e52ce29579 Preserve CLI template inputs when output is a hard link
Compare device and inode on Linux alongside existing path checks. Cover
template and values aliases with input-preservation and diagnostic checks.
Sort the existing footage test's expected paths for temporary-directory portability.

Co-authored-by: Codex <codex@openai.com>
2026-10-14 02:14:42 +10:00
vangel76andClaude Sonnet 5.5 89ae151c03 #1221: two path-format test failures on Windows
Problem: on Windows two tests failed on main although the app is fine; they assumed
macOS/Linux path formats.

Fix: the CLI test strips the verbatim path prefix that canonicalize adds on Windows (a
child's current_dir() never reports it); the host sink test uses a drive-letter path on
Windows (a path rooted without a drive is joined to the home drive by the engine, the test
expected the current drive). Test code only.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-13 14:25:42 +02:00
Brandon ThomasandClaude Opus 5.5 3ac283eee4 Review fixes for the landed batch
- Cryptomatte (#1183): planes shorter than the image read as empty instead of panicking.
- layer.addMarker (#1180): a comp marker no longer replaces one at the same time.
- Desktop (#1005): ignore macOS's -psn_ argument instead of refusing to launch.
- Doc comments put back on their own items (#1153, #1037).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 04:47:52 -04:00
Brandon Thomas f096470dec Merge pull request #1153 from fabian-co/fix/intel-metal-indirect-validation 2026-10-13 04:33:47 -04:00