Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
175 commits
Select commit Hold shift + click to select a range
d11fa83
feat: add reviewable talking-head cleanup
Jul 29, 2026
067f1be
fix: validate real talking-head cleanup
Jul 30, 2026
aa26a20
Merge branch 'agent/generation-finalization' into agent/advanced-ai-w…
Jul 30, 2026
3d24686
test: verify real subtitle exports
Jul 30, 2026
5a684e6
test: verify titlebar control contracts
Jul 30, 2026
dbbd9a3
fix: harden interchange export verification
Jul 30, 2026
537dcda
test: verify view menu controls
Jul 30, 2026
8d3bc54
Merge generation finalization fixes
Jul 30, 2026
128631a
fix: make recent projects keyboard accessible
Jul 30, 2026
f1c3837
test: verify home secondary controls
Jul 30, 2026
e622d0d
fix: make project opening recoverable
Jul 30, 2026
7651e51
fix: create new projects atomically
Jul 30, 2026
55d8c8f
feat: complete native application menu contract
Jul 30, 2026
67eef44
feat: version editor UI persistence schema
Jul 31, 2026
276e2c8
fix: release project publication lock before return
Jul 31, 2026
2e48e62
feat: verify five-panel editor layout
Jul 31, 2026
a777183
fix: restore audit evidence continuity
Jul 31, 2026
5001dcd
feat: add atomic offline sample projects
Jul 31, 2026
4645d22
feat: add safe recent project lifecycle
Jul 31, 2026
195370b
feat: persist autosave project metadata
Jul 31, 2026
bd91665
feat: complete shell component mapping slice
Jul 31, 2026
b352166
feat: close home shell composite acceptance
Jul 31, 2026
c7e33b2
docs: verify legacy data safety matrix
Jul 31, 2026
c280620
docs: verify MCP transport safety
Jul 31, 2026
157b35d
test: close MCP import safety contract
Jul 31, 2026
7852581
docs: verify MCP error redaction
Jul 31, 2026
9ad887b
docs: verify generation log seeding
Jul 31, 2026
6932532
docs: verify cache identity parity
Jul 31, 2026
eafb8de
docs: verify shared core command path
Jul 31, 2026
50140c9
docs: verify project open composite
Jul 31, 2026
6a211a1
docs: verify manifest corruption recovery
Jul 31, 2026
75f62b9
fix: harden packaged webview asset scope
Jul 31, 2026
21f7e9e
fix: bundle verified ffmpeg sidecars
Jul 31, 2026
3bb8dee
fix: make Windows bundle gates self-contained
Jul 31, 2026
9eeeb6f
test: normalize CI workflow line endings
Jul 31, 2026
fcaef30
feat(project): complete Windows retained filesystem mutations
Jul 31, 2026
43cd856
feat(project): enforce Windows owner-only creation
Jul 31, 2026
25dbcff
test(project): harden Windows owner DACL verification
Jul 31, 2026
907cc26
docs: record Windows installed package verification
Jul 31, 2026
65326fc
test(project): align retained delete rebound contract
Jul 31, 2026
fc1cbdd
test(media): bind resolver completion contract
Jul 31, 2026
a1e9fd0
docs: close media resolver implementation slice
Jul 31, 2026
0d8cd69
test(project): isolate retained delete race hook
Jul 31, 2026
7f1c0f9
docs: record native Windows safe filesystem receipt
Jul 31, 2026
ad7cfc0
fix(web): truncate seconds-to-frame conversions
Jul 31, 2026
23b62f7
test(project): accept both safe retained rename outcomes
Jul 31, 2026
77c7f0c
feat(web): reconcile first video project settings
Jul 31, 2026
d0b1890
test(agent): verify automation command routing
Jul 31, 2026
eeccb04
feat(agent): apply beat alignment atomically
Jul 31, 2026
2cc6d87
test(shell): close core event forwarding contract
Jul 31, 2026
054c4a7
test(web): prove every edit gesture route
Jul 31, 2026
feb753d
fix(web): enforce monotonic frozen timeline mirror
Jul 31, 2026
f2805fc
fix(contracts): enforce typed tauri command parity
Jul 31, 2026
8da75f9
fix(web): isolate authoritative and persisted state
Jul 31, 2026
99661b7
fix(web): make toolbar undo recoverable
Jul 31, 2026
436a30e
fix(web): make toolbar redo recoverable
Jul 31, 2026
186f377
test(web): verify toolbar tool and zoom controls
Jul 31, 2026
be4f186
fix(web): guard toolbar split command
Jul 31, 2026
56f8da1
fix(web): guard toolbar trim-start command
Jul 31, 2026
d84009e
fix(web): guard toolbar trim-end command
Jul 31, 2026
8bea548
fix(web): guard toolbar text command
Jul 31, 2026
eefd81a
feat: add editable nested timelines
Jul 31, 2026
8881ebe
fix: complete nested timeline packaged validation
Jul 31, 2026
19f9812
feat: add deterministic optical-flow interpolation
Jul 31, 2026
4e4737b
fix: validate local optical-flow interpolation
Jul 31, 2026
4dcb96b
feat: complete polygon mask rendering
Jul 31, 2026
d435b70
feat: add editable video stabilization
Jul 31, 2026
f2d5796
feat: add validated generic effect chain
Jul 31, 2026
d887958
feat: complete editable cross dissolve transition
Jul 31, 2026
d44d336
fix: verify lift gamma gain pipeline
Jul 31, 2026
b8bea88
feat: add HSL secondary color grading
Jul 31, 2026
4ebbb7f
feat: add project-managed 3D LUT grading
Jul 31, 2026
b0f4177
feat: add loudness normalization
Jul 31, 2026
bee47a5
feat: add audio denoise
Jul 31, 2026
6feb360
feat: add local stem separation
Jul 31, 2026
8cd591f
docs: verify silent video placement
Jul 31, 2026
3bbbb30
feat: add HDR proxy and account acceptance
Jul 31, 2026
9e6b51e
feat: stream bounded timeline audio
Jul 31, 2026
baa5dd1
docs: reconcile playback route lifecycle
Jul 31, 2026
b3b5980
test: close generation job serde compatibility
Jul 31, 2026
98ba51e
test: enforce cli sidecar resolution boundary
Jul 31, 2026
bf5fb5f
docs: verify motion decoder injection
Jul 31, 2026
718a016
feat: add sandboxed chromium motion rendering
Jul 31, 2026
29ceb21
test: close missing motion frame behavior
Jul 31, 2026
71430cb
test: close motion document size sandbox
Jul 31, 2026
92d1c5b
test: close deterministic motion png encoding
Jul 31, 2026
88fb5a4
test: close project serde compatibility
Jul 31, 2026
d1bd605
test: close mask and effect composite record
Jul 31, 2026
b80c04e
fix: close text raster fallback parity
Jul 31, 2026
b3a774a
docs: bind media principles to executable evidence
Jul 31, 2026
a3dbb2a
feat: add bounded inference scheduler
Jul 31, 2026
25acf4b
docs: reconcile packaged ffmpeg acceptance
Aug 1, 2026
72b068e
docs: reconcile ffmpeg contract acceptance
Aug 1, 2026
d89a37b
feat: complete media engine facade
Aug 1, 2026
e496d14
feat: materialize lottie textures
Aug 1, 2026
578c80b
docs: reconcile interchange export acceptance
Aug 1, 2026
2e46971
test: verify export dialog controls
Aug 1, 2026
9d21eb4
fix: surface export cancellation failures
Aug 1, 2026
1346c29
test: verify video export transaction
Aug 1, 2026
c1f90e6
test: verify save-as cancellation control
Aug 1, 2026
4eacc99
docs: reconcile tauri command contracts
Aug 1, 2026
e8cae3c
docs: reconcile frontend authority contract
Aug 1, 2026
a49f8c3
docs: reconcile undo control acceptance
Aug 1, 2026
d405bf8
docs: reconcile redo control acceptance
Aug 1, 2026
61409cf
docs: reconcile toolbar mode controls
Aug 1, 2026
c18ffeb
docs: reconcile split control acceptance
Aug 1, 2026
908cce4
docs: reconcile remaining toolbar controls
Aug 1, 2026
aa8fe98
feat: attach version metadata to feedback
Aug 1, 2026
57ac53e
feat(web): complete design token contract
Aug 1, 2026
600a9ee
feat: gate telemetry behind explicit dsn
Aug 1, 2026
65d2cef
feat(web): add release accessibility gate
Aug 1, 2026
fe2b5c1
fix(web): complete shortcut resolution matrix
Aug 1, 2026
2808016
fix(web): complete interaction state matrix
Aug 1, 2026
ed46ed1
fix(web): harden i18n runtime contract
Aug 1, 2026
faf7026
test(web): lock placeholder background token
Aug 1, 2026
81aea5d
docs: record five-panel code verification
Aug 1, 2026
4e79085
feat(web): make keyframe lane seek accessible
Aug 1, 2026
4df87f1
feat(web): verify keyframe diamond interactions
Aug 1, 2026
4075b61
feat(web): make keyframe menu dismissal accessible
Aug 1, 2026
fd87de5
feat(web): verify keyframe deletion control
Aug 1, 2026
f9e3942
feat(web): verify keyframe interpolation controls
Aug 1, 2026
f2d8cae
feat(web): complete scrubbable number interactions
Aug 1, 2026
7c182eb
fix(web): complete preview scrub lifecycle
Aug 1, 2026
8fb1979
fix(web): complete split pane drag lifecycle
Aug 1, 2026
493d06a
feat(web): make track toggles accessible
Aug 1, 2026
101331d
fix(web): complete track height resize lifecycle
Aug 1, 2026
9a285ef
fix(web): complete track menu dismissal lifecycle
Aug 1, 2026
003a9dd
fix(web): complete dropdown dismissal lifecycle
Aug 1, 2026
29165ef
test(web): verify editor panel focus contract
Aug 1, 2026
29fef8b
fix(release): replace nonfree apple silicon sidecars
Aug 1, 2026
8030f1d
feat(motion): ship native fallback workflow
Aug 1, 2026
3ff510e
feat(motion): ship Motion Canvas beta vertical
Aug 1, 2026
b1b9b4e
feat(agent): inspect Lottie media through native renderer
Aug 1, 2026
783d749
feat(agent): gate advanced workflow contracts
Aug 1, 2026
57bb652
feat(agent): ship motion tracking backend
Aug 1, 2026
f7303f1
feat(agent): ship on-device AI matting vertical
Aug 1, 2026
3a6549d
feat(agent): ship on-device object removal vertical
Aug 1, 2026
78c1ece
feat(agent): ship editable reference color match
Aug 1, 2026
653a6ec
feat(agent): complete stem separation workflow
Aug 1, 2026
0515598
feat(agent): ship reviewable caption translation
Aug 1, 2026
e47b29b
feat(agent): ship reviewable script assembly
Aug 1, 2026
bb40621
feat(agent): ship consented avatar and voice workflows
Aug 1, 2026
73a245c
feat(agent): complete visual motion tracking workflow
Aug 1, 2026
8d66424
chore(release): prepare 1.0.0-beta.1 candidate
Aug 1, 2026
b290cfc
feat(agent): support official Codex ChatGPT login
Aug 1, 2026
b8d3de2
fix(identity): support legacy voice clone projects
Aug 1, 2026
83016de
fix(ci): harden cross-platform release gates
Aug 1, 2026
b0d9494
fix: complete cross-platform beta gates
Aug 1, 2026
4089f88
fix: stage Windows ONNX runtime for builds
Aug 1, 2026
cdda7ad
fix(ci): order Windows ONNX runtime staging
Aug 1, 2026
9a0aba8
fix: package static Windows ONNX runtime correctly
Aug 1, 2026
1d083bf
fix: ship pinned DirectML provider on Windows
Aug 1, 2026
b93dd65
fix: use portable Windows ONNX backend
Aug 1, 2026
8f305b9
ci: capture Windows loader imports
Aug 1, 2026
5833bd8
fix: statically link Windows whisper runtime
Aug 1, 2026
65071d1
fix: statically link Windows CRT
Aug 1, 2026
2d6d282
fix: embed Windows test activation manifest
Aug 1, 2026
797dc38
fix: embed Common Controls in Windows tests
Aug 1, 2026
3d37220
ci: diagnose Windows loader exports
Aug 1, 2026
34eb995
fix: activate Common Controls for all Windows targets
Aug 1, 2026
b753b4b
fix: preserve Windows manifest link argument
Aug 1, 2026
0cc7364
fix: embed Windows activation manifest
Aug 1, 2026
935ab56
ci: bound Windows import parsing
Aug 1, 2026
116324d
fix: scope Windows activation manifest to tests
Aug 1, 2026
ccbbafb
fix: unify Windows activation manifest
Aug 1, 2026
d3462b5
test: normalize Windows evidence line endings
Aug 1, 2026
ddcfeb4
fix: resume virtual time during motion seek
Aug 1, 2026
7bf1f52
ci: trace cross-platform motion timeout
Aug 1, 2026
27f93eb
fix: scale motion template to render canvas
Aug 1, 2026
4adac8b
fix: resume Chromium compositor for capture
Aug 1, 2026
512e25e
fix: keep Chromium render target in foreground
Aug 1, 2026
c6042e7
ci: gate Windows Chromium motion early
Aug 1, 2026
431465e
fix: map beta version for Windows MSI
Aug 1, 2026
9f66c35
fix: stabilize Windows Chromium surface capture
Aug 2, 2026
c73c192
ci: use pinned FFmpeg for Windows safety tests
Aug 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
15 changes: 15 additions & 0 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,18 @@
# tauri.conf.json. Keep the two in sync.
[env]
MACOSX_DEPLOYMENT_TARGET = { value = "11.0", force = true }

# whisper.cpp is compiled as a static library, but CMake otherwise selects the
# dynamic MSVC C/C++ runtime on Windows. That leaves the installed application
# dependent on whichever MSVCP140/VCRUNTIME140 version happens to be present on
# the machine and can fail before Rust's main() with STATUS_ENTRYPOINT_NOT_FOUND.
# CMP0091 makes CMAKE_MSVC_RUNTIME_LIBRARY authoritative for the older
# whisper.cpp CMake project; non-MSVC generators ignore both values.
CMAKE_POLICY_DEFAULT_CMP0091 = { value = "NEW", force = false }
CMAKE_MSVC_RUNTIME_LIBRARY = { value = "MultiThreaded", force = false }

# Rust's MSVC target otherwise links VCRUNTIME/UCRT dynamically even when the
# C++ libraries above use /MT. Keep the Windows executable self-contained and
# make every cc-rs consumer observe the same crt-static target feature.
[target.x86_64-pc-windows-msvc]
rustflags = ["-C", "target-feature=+crt-static"]
211 changes: 202 additions & 9 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,33 @@ concurrency:
cancel-in-progress: true

jobs:
motion-canvas:
name: Motion Canvas (locked build / audit / license)
if: github.event_name != 'workflow_dispatch' || inputs.red_task == 'none'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
cache-dependency-path: plugins/motion-canvas-studio/package-lock.json

- name: Install locked Motion Canvas dependencies
run: npm --prefix plugins/motion-canvas-studio ci --ignore-scripts

- name: Audit dependencies and licenses
run: |
npm --prefix plugins/motion-canvas-studio audit --audit-level=moderate
npm --prefix plugins/motion-canvas-studio run licenses

- name: Test and reproduce embedded runner
run: |
npm --prefix plugins/motion-canvas-studio test
npm --prefix plugins/motion-canvas-studio run build
git diff --exit-code -- plugins/motion-canvas-studio/bundle/runner.html plugins/motion-canvas-studio/package-lock.json

rust:
name: Rust (fmt / clippy / test)
if: github.event_name != 'workflow_dispatch' || inputs.red_task == 'none'
Expand Down Expand Up @@ -78,7 +105,7 @@ jobs:
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml') }}
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.toml', 'Cargo.lock') }}
restore-keys: ${{ runner.os }}-cargo-

- name: Validate Windows product gate contract
Expand All @@ -98,6 +125,8 @@ jobs:
run: cargo clippy --workspace --all-targets -- -D warnings

- name: cargo test
env:
OPENTAKE_MOTION_TRACE: '1'
run: cargo test --workspace

- name: live playback transport integration (fail closed)
Expand Down Expand Up @@ -160,8 +189,16 @@ jobs:
cache: pnpm
cache-dependency-path: web/pnpm-lock.yaml

- name: Install FFmpeg
run: choco install ffmpeg --no-progress -y
- uses: ruby/setup-ruby@v1
with:
ruby-version: '3.3'

- name: Provision checksum-pinned packaged FFmpeg sidecars
run: python scripts/provision_ffmpeg_sidecars.py --target x86_64-pc-windows-msvc

- name: Verify sidecar supply and probe/decode/encode boundary without PATH
shell: bash
run: ruby scripts/tests/packaged-sidecars-test.rb --name packaged_macos_windows_sidecars_resolve_and_execute

- name: Cache cargo
uses: actions/cache@v4
Expand All @@ -181,10 +218,27 @@ jobs:
- name: Rust workspace clippy
run: cargo clippy --workspace --all-targets -- -D warnings

- name: Windows Chromium motion capture regression
shell: bash
env:
OPENTAKE_MOTION_TRACE: '1'
run: |
cargo test -p opentake-motion --features chromium --lib \
renderer::tests::chromium_skeleton_reports_unavailable_not_panic \
-- --exact --nocapture --test-threads=1
cargo test -p opentake-motion --features chromium --test chromium \
virtual_time_network_csp_timeout_cleanup_and_frame_identity \
-- --exact --nocapture --test-threads=1
cargo test -p opentake-tauri --test motion_command \
sandbox_progress_cancel_validated_mp4_result \
-- --exact --nocapture --test-threads=1

- name: Web editor behavior suite
run: pnpm -C web test

- name: Rust workspace tests
env:
OPENTAKE_MOTION_TRACE: '1'
run: cargo test --workspace -- --test-threads=1

- name: Minimal-feature Tauri clippy
Expand All @@ -200,6 +254,40 @@ jobs:
Remove-Item 'target/release/bundle/nsis' -Recurse -Force -ErrorAction SilentlyContinue
& .\web\node_modules\.bin\tauri.cmd build --ci --bundles msi,nsis

- name: Install NSIS package and execute installed product without PATH
shell: pwsh
run: |
$installer = @(Get-ChildItem 'target/release/bundle/nsis/*.exe' -File)
if ($installer.Count -ne 1) { throw 'expected exactly one NSIS installer' }
$process = Start-Process -FilePath $installer[0].FullName -ArgumentList '/S' -Wait -PassThru
if ($process.ExitCode -ne 0) { throw "silent NSIS install failed: $($process.ExitCode)" }
$candidates = @(
(Join-Path $env:LOCALAPPDATA 'OpenTake/opentake.exe'),
(Join-Path $env:LOCALAPPDATA 'Programs/OpenTake/opentake.exe'),
(Join-Path $env:ProgramFiles 'OpenTake/opentake.exe')
)
$application = $candidates | Where-Object { Test-Path $_ } | Select-Object -First 1
if (-not $application) {
$uninstall = Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*' `
-ErrorAction SilentlyContinue | Where-Object { $_.DisplayName -eq 'OpenTake' } | Select-Object -First 1
if ($uninstall.InstallLocation) {
$application = Get-ChildItem $uninstall.InstallLocation -Filter 'opentake.exe' -File `
-ErrorAction SilentlyContinue | Select-Object -ExpandProperty FullName -First 1
}
}
if (-not $application) { throw "installed OpenTake executable not found: $($candidates -join ', ')" }
$installDirectory = Split-Path -Parent $application
ruby scripts/tests/packaged-sidecars-test.rb `
--name packaged_macos_windows_sidecars_resolve_and_execute `
--package $installDirectory
$app = Start-Process -FilePath $application -PassThru
Start-Sleep -Seconds 5
if ($app.HasExited) {
throw "installed OpenTake exited during launch smoke test: $($app.ExitCode)"
}
Stop-Process -Id $app.Id -Force
Wait-Process -Id $app.Id -ErrorAction SilentlyContinue

- name: Bind installers to the exact source SHA
shell: pwsh
env:
Expand Down Expand Up @@ -249,32 +337,135 @@ jobs:
- name: Install Rust toolchain
run: rustup component add rustfmt

- name: Install FFmpeg
run: choco install ffmpeg --no-progress -y
- name: Provision checksum-pinned packaged FFmpeg sidecars
run: python scripts/provision_ffmpeg_sidecars.py --target x86_64-pc-windows-msvc

- name: Cache cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-security-cargo-${{ hashFiles('**/Cargo.toml') }}
key: ${{ runner.os }}-security-cargo-${{ hashFiles('**/Cargo.toml', 'Cargo.lock') }}
restore-keys: ${{ runner.os }}-security-cargo-

- name: Portable FFmpeg cancellation lifecycle
shell: pwsh
env:
OPENTAKE_FFMPEG: ${{ github.workspace }}\src-tauri\binaries\ffmpeg-x86_64-pc-windows-msvc.exe
run: |
& $env:OPENTAKE_FFMPEG -version
if ($LASTEXITCODE -ne 0) { throw 'checksum-pinned packaged FFmpeg is not runnable' }
cargo test -p opentake-media --lib windows_cancelling_running_pcm_child_reaps_both_pipe_readers
cargo test -p opentake-media --lib windows_cancelling_mux_wait_reaps_child

- name: Verify portable Tauri test image imports
shell: pwsh
run: |
cargo test -p opentake-tauri --lib --no-run
$testImage = Get-ChildItem 'target/debug/deps/opentake_tauri_lib-*.exe' -File |
Sort-Object LastWriteTime -Descending |
Select-Object -First 1
if (-not $testImage) { throw 'compiled Tauri test image not found' }
$vswhere = Join-Path ${env:ProgramFiles(x86)} 'Microsoft Visual Studio/Installer/vswhere.exe'
$dumpbin = & $vswhere -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 `
-find 'VC/Tools/MSVC/**/bin/Hostx64/x64/dumpbin.exe' |
Select-Object -First 1
if (-not $dumpbin) { throw 'dumpbin.exe not found' }
& $dumpbin /DEPENDENTS $testImage.FullName | Set-Content windows-tauri-test-imports.txt
& $dumpbin /IMPORTS $testImage.FullName | Add-Content windows-tauri-test-imports.txt
$imports = Get-Content windows-tauri-test-imports.txt -Raw
if ($imports -match '(?im)^\s*(MSVCP140|VCRUNTIME140(?:_1)?|api-ms-win-crt-[^\s]+|onnxruntime|DirectML)\.dll\s*$') {
throw 'Tauri test image retains a non-portable native runtime dependency'
}

$mt = Get-ChildItem (Join-Path ${env:ProgramFiles(x86)} 'Windows Kits/10/bin') `
-Filter mt.exe -File -Recurse |
Where-Object { $_.FullName -match '\\x64\\mt\.exe$' } |
Sort-Object FullName -Descending |
Select-Object -First 1
if (-not $mt) { throw 'mt.exe not found' }
$manifestLog = & $mt.FullName "-inputresource:$($testImage.FullName);#1" `
'-out:windows-tauri-test.manifest' 2>&1
$manifestLog | Set-Content windows-tauri-test-manifest.txt
if ($LASTEXITCODE -ne 0) { throw 'Tauri test image has no readable RT_MANIFEST resource #1' }
Get-Content windows-tauri-test.manifest | Add-Content windows-tauri-test-manifest.txt
if ((Get-Content windows-tauri-test.manifest -Raw) -notmatch 'Microsoft\.Windows\.Common-Controls') {
throw 'Tauri test image manifest does not activate Common Controls v6'
}

Add-Type @'
using System;
using System.Runtime.InteropServices;
public static class OpenTakeNativeExportProbe {
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern IntPtr LoadLibraryExW(string path, IntPtr file, uint flags);
[DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern IntPtr GetProcAddress(IntPtr module, string name);
}
'@
$modules = @{}
$currentDll = $null
$inImportSection = $false
$missingExports = @()
foreach ($line in (Get-Content windows-tauri-test-imports.txt)) {
if ($line -match '^\s*Section contains the following imports:\s*$') {
$inImportSection = $true
$currentDll = $null
continue
}
if ($line -match '^\s*Summary\s*$') {
$inImportSection = $false
$currentDll = $null
continue
}
if (-not $inImportSection) { continue }
if ($line -match '^\s{4}([A-Za-z0-9_.-]+\.dll)\s*$') {
$currentDll = $Matches[1]
if (-not $modules.ContainsKey($currentDll)) {
$modules[$currentDll] = [OpenTakeNativeExportProbe]::LoadLibraryExW(
$currentDll, [IntPtr]::Zero, 0x00000800
)
}
} elseif ($currentDll -and $line -match '^\s+[0-9A-F]+\s+(\S+)\s*$') {
$name = $Matches[1]
$module = $modules[$currentDll]
$activationContextExport =
$currentDll -ieq 'comctl32.dll' -and $name -eq 'TaskDialogIndirect'
if (-not $activationContextExport -and ($module -eq [IntPtr]::Zero -or
[OpenTakeNativeExportProbe]::GetProcAddress($module, $name) -eq [IntPtr]::Zero)) {
$missingExports += "$currentDll!$name"
}
}
}
$modules.GetEnumerator() | Sort-Object Name | ForEach-Object {
"LOAD $($_.Name)=$($_.Value)"
} | Set-Content windows-tauri-export-probe.txt
$missingExports | ForEach-Object { "MISSING $_" } | Add-Content windows-tauri-export-probe.txt
if ($missingExports.Count -ne 0) {
throw "Tauri test image imports unavailable system exports: $($missingExports -join ', ')"
}

- name: Reserved output identity and reparse safety
shell: pwsh
run: |
cargo test -p opentake-tauri --lib windows_project_media_junction_is_rejected_without_writing_target
cargo test -p opentake-tauri --lib windows_directory_handoff_blocks_junction_replacement_before_child_create
cargo test -p opentake-tauri --lib windows_retained_output_handle_blocks_final_name_replacement

- name: Upload Tauri test image imports
if: always()
uses: actions/upload-artifact@v4
with:
name: windows-tauri-test-imports-${{ github.sha }}
path: |
windows-tauri-test-imports.txt
windows-tauri-test-manifest.txt
windows-tauri-test.manifest
windows-tauri-export-probe.txt
if-no-files-found: error
retention-days: 7

web:
name: Web (install / build)
if: github.event_name != 'workflow_dispatch' || inputs.red_task == 'none'
Expand Down Expand Up @@ -311,14 +502,16 @@ jobs:
- name: Install Rust toolchain
run: rustup component add rustfmt clippy

- name: Provision checksum-pinned packaged FFmpeg sidecars
run: python scripts/provision_ffmpeg_sidecars.py --target x86_64-pc-windows-msvc

- name: Cache cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-library-security-${{ hashFiles('**/Cargo.toml') }}
key: ${{ runner.os }}-library-security-${{ hashFiles('**/Cargo.toml', 'Cargo.lock') }}
restore-keys: ${{ runner.os }}-library-security-

- name: Test retained-handle and junction defenses
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ dist/
# Tauri
src-tauri/target/
src-tauri/gen/
src-tauri/binaries/ffmpeg-*
src-tauri/binaries/ffprobe-*

# Env / secrets (never commit API keys)
.env
Expand Down
34 changes: 34 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,40 @@

本文件记录 OpenTake 的重要改动。格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/)。

## [1.0.0-beta.1] — 2026-08-01

OpenTake 的第一个可安装 Beta。核心闭环为:创建/打开工程 → 导入与管理素材 →
多轨剪辑、字幕、关键帧、特效/蒙版/调色/转场 → 本地 AI 与生成式 AI 审阅工作流 →
预览、保存重开、H.264/H.265/ProRes 与字幕/交换格式导出。

### 新增(Added)

- 可恢复的工程持久化、全局素材库、缩略图/波形/代理媒体、缺失素材重链接。
- Rust/WGPU 预览与导出共享合成路径,支持文本、调色、绿幕、蒙版、LUT、HSL、
Lift/Gamma/Gain、通用特效、交叉溶解、嵌套时间线、补帧与防抖。
- Agent/MCP 编辑、内置聊天、官方 Codex CLI / ChatGPT 登录、BYOK 生成作业、Motion Canvas
动效与原生 Chromium fallback。Codex 登录态完全由官方 CLI 管理,OpenTake 不读取或保存令牌。
- 本地口播清理、响度统一、降噪、声部分离、RVM 抠像、智能擦除、参考色彩匹配和
可视化运动追踪;字幕翻译、图文成片、数字人与音色克隆提供审阅/同意/成本边界。
- 完整键盘、焦点、菜单、拖拽、撤销/重做与辅助功能回归门禁。

### 安全与可靠性(Security / Reliability)

- 生产 CSP、最小 asset scope、凭据 keychain 边界、URL/重定向/大小限制、下载校验与
项目修订原子提交。
- macOS/Linux/Windows 安全文件系统契约、打包 FFmpeg sidecar 供应链校验、取消与失败
清理、生成/导出恢复与防陈旧结果提交。

### Beta 已知边界

- 本地 macOS Beta 包未使用 Developer ID 签名或 Apple 公证;首次打开需要用户明确允许。
- 数字人、音色克隆和通用云生成需要用户自己的 provider key,并可能产生第三方费用;
Agent 可选择 provider key,也可复用官方 Codex CLI 的 ChatGPT 登录。无可用登录或 key 时
功能会显式不可用或拒绝,不会静默调用。
- Windows 安装包由精确 SHA CI 构建和验证;原生 Windows WebView 的最终人工交互烟测仍是
平台发布门槛,不影响本次 Apple Silicon macOS 本地 Beta。
- 任意 Motion Canvas TSX、透明动效、神经语义级任意人声分离等属于后续 Beta 范围。

## [未发布] — 2026-06-23 第三轮(自动 PR 审核:全局素材库 + 文本工具 + 字幕/视频导出 + list_models)

本轮为**自动 PR 审核流程**:逐 PR 专家审核 + 对抗验证 + 对照开发文档,审核通过且 CI 双绿的纯新增项合并,其余 @作者 rebase/修改。
Expand Down
Loading
Loading