Skip to content

feat: release AI agent integration and filesystem media tools - #132

Merged
MemerGamer merged 15 commits into
mainfrom
staging
Oct 6, 2026
Merged

MemerGamer merged 15 commits into
mainfrom
staging

Conversation

@MemerGamer

Copy link
Copy Markdown
Member

Release the built-in HTTP MCP server and its media-import/video-export follow-ups from staging. Agents can inspect and edit scenes, import local image/video/audio files, and render directly to a requested WebM/MP4 path. Export deadlines account for real-time recording; populated state replies are IPC-cloneable.

Includes exact Babel/Webpack security pins while holding Nextron at 9.5.0 and preserving runtime MCP externals. Dependabot #128 was closed with an explanation after its safe fixes landed in #131.

Validated locally: 361 unit tests, 111 real Chromium browser tests, renderer typecheck, full production build/Linux packaging, and live Electron imports plus playable WebM/MP4 exports. A 32-second recording completed in 32.05 seconds. #130 and #131 are merged into staging, and #131's push/PR CI runs passed.

Merge with a merge commit so release-please sees the feature commits. The generated release PR must be reviewed and merged separately before a tag or release artifacts are produced. Website/docs and issue #129 will be updated after uploaded assets are verified.

MemerGamer and others added 15 commits September 7, 2026 23:43
Written from the v1.7.0/v1.7.1 release, where most of these steps went
wrong at least once: a squash merge would have stalled release-please
entirely, dependabot twice bundled a deferred build-tool major into a
security PR, packaging broke twice in ways CI cannot catch because
nothing runs a build before a tag exists, and the flagship feature nearly
shipped undocumented.

Covers the three repos involved, the two-merge release flow, verifying
artifacts actually uploaded rather than trusting a green workflow, and
the Electron screenshot approach (including that the canvas looks empty
unless you press Play first).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M2LqRn1nNtBXhuVpJHbLjt
Pinned exact to match the rest of the manifest, and placed in
dependencies rather than devDependencies because the server runs in the
Electron main process at runtime and electron-builder only packages
production deps.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M2LqRn1nNtBXhuVpJHbLjt
Adds an MCP server hosted in the Electron main process so agents can drive
the editor while the user watches changes land on the canvas, in the style
of Blender's MCP integration.

The design follows from two constraints. All project state lives in the
renderer's RootStore, and Electron only offers fire-and-forget main ->
renderer messaging, so every tool call is a round trip paired by id, with a
per-call deadline (a reloading renderer would otherwise hang a call
forever). And the app holds a single-instance lock, so an agent cannot spawn
a second copy as a stdio server -- hence HTTP into the already-running app.

RootStore's flat forwarding API already is the editor's public surface, so
the dispatcher is largely a whitelist over it, and because everything routes
through MobX the UI updates on its own.

Off by default, loopback-only and bearer-token gated: enabling it lets a
connected agent read and modify the open project and write files.

Eleven tools in this pass. add_media and export_video are deliberately
excluded -- media needs a mount-then-probe sequence because dimensions are
read off a mounted DOM node, and export records in real time and currently
delivers through a browser download rather than to a requested path.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M2LqRn1nNtBXhuVpJHbLjt
Webpack inlined the SDK and the @hono/node-server adapter its Node HTTP
transport wraps. That adapter does its own environment detection and
resolves pieces dynamically, so bundling it produced a server that
answered every request with an empty 500 while the identical code worked
when required normally. Externalising both, the way electron-store and
electron-serve already are, fixes it -- verified with a 200 from an
initialize request against the running app.

Also adds error logging on the server and transport, and a smoke-test
client for driving the endpoint by hand.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M2LqRn1nNtBXhuVpJHbLjt
A stateless StreamableHTTPServerTransport serves exactly one request. The
shared instance meant the first call after launch succeeded and every one
after it answered 500 with nothing logged, because the transport swallows
the failure internally -- which is why an initialize that returned 200
right after a restart turned into a 500 on the next run.

Each request now gets its own server and transport, closed when the
response ends.

Verified end to end against the running app: an MCP client lists all 11
tools, get_project_state returns live editor state, tools correctly refuse
with "no project open", and add_text plus add_math put a text element and
a KaTeX-rendered E = mc^2 onto the canvas, the media pool and the timeline
while the app is open.

Also adds the dispatcher and tool-schema tests (277 -> 307 passing) and
fixes the smoke client's auth header.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M2LqRn1nNtBXhuVpJHbLjt
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M2LqRn1nNtBXhuVpJHbLjt
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M2LqRn1nNtBXhuVpJHbLjt
feat: expose AniMathIO to AI agents over MCP (closes #129)
Co-Authored-By: Codex <noreply@openai.com>
Wait for resource mount and decoded metadata before adding timeline elements. Extend export deadlines from project duration and await byte delivery through IPC, preserving the existing failure latches and UI downloads.

Add regression tests for dispatcher, file handlers, SDK dispatch, export timing and failures, and runtime SDK externalization.

Co-Authored-By: Codex <noreply@openai.com>
Include an apply-checked patch for the external docs repository, which is read-only in the task sandbox.

Co-Authored-By: Codex <noreply@openai.com>
Live media import exposed MobX placement and timing proxies in get_project_state responses. Copy those values to plain objects and check a populated snapshot with structuredClone.

Co-Authored-By: Codex <noreply@openai.com>
The guide update is now applied in AniMathIODocs alongside the release blog post.

Co-Authored-By: Codex <noreply@openai.com>
feat: add media import and video export over MCP
@MemerGamer
MemerGamer merged commit 4b490e2 into main Oct 6, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant