Repository navigation
feat: release AI agent integration and filesystem media tools - #132
Merged
Merged
Conversation
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.