mirror of
https://github.com/storytold/filmcraft.git
synced 2026-10-28 12:07:21 -06:00
- Engine autosave module: Preferences (autoSave.enabled/intervalMinutes=5/maxVersions=20/ saveCurrentProject/recoveryJournal/recoveryIntervalSeconds), persisted in the per-user data dir; prefs.get/set/reset commands. - Background worker (filmcraft-autosave thread): the UI thread only hands over the Arc<Project> snapshot; JSON encoding and atomic writes happen on the worker. Premiere-style auto-saves to <project dir>/Auto-Save/<name>-YYYY-MM-DD_HH-MM-SS.fcproj (local time), only when changed, rotated to Maximum Project Versions, optionally also saving the project. - Recovery journal: debounced snapshot of unsaved changes in <data>/Recovery/<session>/ guarded by an OS file lock; on launch, sessions whose lock is free and that left a snapshot are offered. Clean quit removes the journal (or keeps it, marked cleanExit, if changes were unsaved). - Commands: file.recover, file.discardRecovery, file.recoveryList, file.autoSaveNow, file.autoSaveStatus, file.listAutoSaves. - UI: Preferences ▸ Auto Save page (Edit ▸ Preferences, Cmd+,; FilmCraft ▸ Settings… on macOS), "Recover Unsaved Changes" dialog at startup, Revert confirmation; all with automation ids. - Desktop: --recover / --no-recover / --data-dir; local-time offset via chrono (clock). - Verified in the app: edits, kill -9, relaunch, dialog, Recover restores the edits (unsaved, original path). - docs/project-files.md: auto-save, recovery and measured costs (2,000 clips: 2.5 ms encode, 1.4 MB, ~30 ms atomic write+fsync, all off the UI thread). ROADMAP M11 updated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 lines
2.4 KiB
Markdown
44 lines
2.4 KiB
Markdown
# Control protocol & MCP
|
||
|
||
## Desktop control channel
|
||
`filmcraft --control 9876` (or `FILMCRAFT_CONTROL_PORT`) listens on `127.0.0.1:<port>` (loopback only).
|
||
One JSON request per line → one JSON reply per line:
|
||
|
||
```json
|
||
{"id": 1, "method": "engine.execute", "params": {"command": "sequence.addEdit", "params": {"seconds": 3}}}
|
||
{"id": 1, "ok": true, "result": {"cuts": 2}}
|
||
```
|
||
|
||
Methods (handlers in `crates/ui-egui/src/control.rs`):
|
||
|
||
| Method | Params | |
|
||
|---|---|---|
|
||
| `engine.execute` / `ui.menu.invoke` | `{command, params}` | any engine or UI command id |
|
||
| `engine.commands` / `ui.menu.list` | – | command registry / menu tree |
|
||
| `ui.inspect` | – | UI state (tool, workspace, dock, timeline view, playback, fps…) |
|
||
| `ui.elements` | `{prefix?}` | every on-screen interactive element: id, label, rect |
|
||
| `ui.set` | `{tool, workspace, mode, theme, focused, playbackRes, timeline:{pps,scroll,fit}}` | |
|
||
| `ui.panel.show` / `ui.panel.close` | `{panel}` | |
|
||
| `ui.click` / `ui.move` | `{id}` or `{x,y}`, `button`, `count`, `modifiers` | synthetic pointer input |
|
||
| `ui.drag` | `{from, to, steps, modifiers}` | press–move–release |
|
||
| `ui.scroll` | `{id|x,y, dx, dy, modifiers}` | wheel / trackpad |
|
||
| `ui.key` / `ui.type` | `{key}` (`Cmd+K`, `Space`…) / `{text}` | keyboard |
|
||
| `ui.timeline.hit` / `ui.timeline.locate` | `{x,y}` / `{clip, edge?}` | timeline hit-testing |
|
||
| `ui.playback` | `{action: play|stop|toggle, speed?}` | |
|
||
| `ui.screenshot` | `{path?, panel?}` | PNG of the window or one panel |
|
||
| `ui.resize`, `ui.focus`, `app.quit` | | |
|
||
|
||
Element ids are stable, e.g. `timeline.clip.<id>`, `timeline.track.V1.lock`, `tools.Razor`,
|
||
`project.item.<id>`, `effects.item.gaussian_blur`, `panel.tab.Timeline`, `program.transport.playback.toggle`.
|
||
|
||
Project files, auto-save, crash recovery and preferences commands (`file.recover`, `prefs.set`, …) and their
|
||
automation ids are listed in [project-files.md](project-files.md).
|
||
|
||
## MCP
|
||
`filmcraft-cli mcp` serves MCP on stdio: headless (in-process session; `--demo` / `--project p.fcproj`)
|
||
or `--bridge 127.0.0.1:9876` to drive the running app. Tools: `command_list`, `command_run`,
|
||
`project_inspect`, `sequence_inspect`, `media_import`, `render_frame`, `ui_inspect`, `ui_elements`,
|
||
`ui_click`, `ui_drag`, `ui_key`, `ui_type`, `ui_screenshot`, `ui_control`. `.mcp.json` registers both.
|
||
|
||
Time is in ticks (254 016 000 000 per second); commands also accept `seconds`, `frame` or `timecode`.
|