Repository navigation
v0.9.48: fal.ai video start frames, security fixes for OTP attempts, OAuth launches, ZIP parsing and sandbox timers, Trust Center redirects, leaner Search MCP results - #9784
Merged
Conversation
…9766) Co-authored-by: Sim Pi Agent <pi@sim.ai>
* fix(oauth): reject cross-site workspace OAuth launches * fix(oauth): keep workspace launches out of the signed-in login exception
…eout (#9776) * fix(sandbox): cap task timer bridges and dispose isolates on host timeout * improvement(sandbox): share timer admission and worker cancel helpers * improvement(sandbox): cover interval reuse in the timer cap e2e check
…ted servers (#9777) * fix(desktop): explain macOS Local Network blocks for private self-hosted servers * fix(desktop): only show Local Network guidance on macOS 15+
…the code (#9774) * fix(otp): reserve a verification attempt atomically before comparing the code Chat and public file OTP verify read the attempt count, compared the guess, and only then incremented, so concurrent submissions all passed the limit check on the same stale count and every one was compared. Reserve the attempt first (Redis Lua script / one conditional Postgres UPDATE) and compare only against the reserved value, so at most MAX_OTP_ATTEMPTS guesses are ever checked against one code. Chat verify now uses safeCompare like the file path. * improvement(otp): centralize compare-and-consume in verifyOTP, tighten tests Move the constant-time compare and consume-on-match into verifyOTP so both OTP callers share it; drop getOTP and the decodeOTPValue export now that nothing reads a code without reserving an attempt; remove the unreachable Lua branch; keep the lockout log free of the email address. Tests: assert the Redis TTL is preserved rather than reset, drop the non-null assertion, and use createMockRequest. * fix(otp): keep sub-second code lifetimes and drop unused deleteOTP export TTL rounds a key with under a second left to 0, so the reservation script rewrote it without an expiry and the code never expired. Read PTTL and rewrite with PX, deleting a code with no remaining lifetime. deleteOTP is now only used inside the module. * test(otp): prove rejected verify requests never spend the code against real storage Replace the mock-asserting authorization unit tests with integration cases: with email auth disabled or the address removed from the allow list, five requests carrying the correct code are refused without a cookie, and the code still works once the chat is restored.
* feat(video): accept a start frame image for fal.ai video models Fal models with an image-to-video sibling endpoint now take an optional start frame. When one is attached, requests go to the image-to-video endpoint with the image as a data URI in the model's image field, and the block's settings dropdowns follow that endpoint's options. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(video): keep fal settings enabled without a start frame - Drop the optional start frame fields from `dependsOn`: an array there disables the field until every entry is filled, which greyed out the settings for text-only runs. Options and conditions already re-read all block values. - Pass the run's abort signal through to the start frame download. - The fal tool now offers `visualReference` to agents for models with an image-to-video endpoint; update the provider selection test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(video): send the model default for fal settings a frame change invalidates Attaching or removing a start frame switches a fal model between its text-to-video and image-to-video endpoints, and the settings picked for one can be invalid on the other (Seedance 2.5 takes 16:9 from a prompt but only auto from a frame). The V3 block now drops any stored setting the selected endpoint does not accept, so the run uses the model default instead of failing validation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(video): drop only settings a start frame change made stale Runway models also switch endpoints when a start frame is attached, and their stored settings can be valid on one and not the other (Kling 4 takes 1920:1080 from a prompt but only auto ratios from a frame). Both fal and direct providers now drop a setting only when the selected endpoint rejects it and the model's other endpoint accepts it. Values neither endpoint lists still reach the request builder, which maps legacy Runway ratios such as 16:9 and rejects anything else. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(video): check fal start frame provenance before sending it to the model A fal start frame now passes the same opaque model-input provenance check as a Runway reference before its bytes reach the model. * fix(video): pick fal settings from the active start frame input The Reference Image is a basic upload / advanced reference pair, and the serializer sends only the active member. The fal settings fields counted a file left in the inactive member too, so switching to an empty advanced input kept showing the start frame endpoint's settings while the run called the prompt endpoint. Resolve the active member with `resolveActiveCanonicalValue`, and pass `__canonicalModes` to dropdown option functions as the editor already does for conditions, so a field's visibility and its options agree. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(video): reject a reference file that is not an image before submitting An agent can pass any file as the start frame or Runway reference, and nothing checked its type before the paid request. Validation now returns a 400 for a non-image `visualReference` before the file is downloaded. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Waleed Latif <walif6@gmail.com>
Co-authored-by: Sim Pi Agent <pi@sim.ai>
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
Contributor
[High impact] The PR changes shared security checks and runtime limits alongside bounded product and documentation workflows. Fix the login-callback bypass and lost video settings before merging. FindingsSummaryAdds fal.ai start-frame support and updates security checks, desktop guidance, Search MCP results, and library content.
|
…26 (#9785) Co-authored-by: Sim Pi Agent <pi@sim.ai>
…settings (#9787) Sub-block conditions in the serializer and on the canvas card did not get the block's canonical mode overrides, so the Video Generator guessed the active start frame input from which member held a value. A frame left in the inactive input hid prompt-only settings (fal aspect ratio, Runway ratio) and dropped them from the request. A shared withCanonicalModes helper now feeds the same condition values to the serializer, canvas card, editor layout, autolayout and dropdown options.
…le (#9791) On macOS 15+ every ERR_ADDRESS_UNREACHABLE load failure was explained as a Local Network privacy block, including failures to reach Sim Cloud, which is public and never gated by that permission. classifyLoadError now takes the failed URL and keeps the hint for self-hosted servers only, including ones reached through a DNS name that resolves to a private address.
* fix(docs): keep search responsive and contain sidebar scrolling * fix(docs): strengthen search cancellation and IPv6 checks
…hout expiry (#9789) * fix(otp): make a correct code single-use and never compare a code without expiry A correct verification deleted the code unconditionally after an atomic reservation, so concurrent correct submissions each got a session and a slow success could delete a newer code issued meanwhile. Success now requires a conditional consume (delete only while the stored code is still the one compared), so exactly one request wins and newer codes survive. Reservations no longer delete; a code with every attempt spent just stops reserving, and the final wrong guess consumes it. The Redis reservation checks the remaining lifetime before anything else, so a key left without an expiry is never compared. * test(otp): prove a newer code survives an in-flight older correct submission Store a replacement code between the old submission's reservation and its consume on both backends; the old submission must fail and the newer code must still verify. An unconditional delete that reports removal fails it.
* ci(npm): publish every npm package through trusted publishing The four publish workflows authenticate to npm with the runner's OIDC token instead of the long-lived NPM_TOKEN secret, so no npm credential is stored anywhere and every release carries a provenance attestation. - Publish jobs request id-token: write and run Node 24, whose npm 11 is required for trusted publishing. - sim and sim-setup pack once with bun, which rewrites workspace: ranges, smoke-test that tarball, then npm publish the same tarball, so what was tested is what ships. The smoke tests now also assert the bumped version. - sim-setup republishes when its own workflow changes, as sim already does. - simstudio gets the repository field provenance requires. - The setup action drops its registry-url input, which existed only to feed NODE_AUTH_TOKEN. * ci(npm): publish from a GitHub-hosted job that alone can mint the OIDC token npm trusted publishing accepts OIDC tokens only from GitHub-hosted runners, and the publish jobs ran on Blacksmith by default. Each workflow now builds, tests, packs and smoke-tests on its usual runner with read-only permissions, then hands the tarball to a GitHub-hosted publish job, the only one granted id-token: write. That job runs no repository code, so no test or dependency can mint an npm credential. The TypeScript SDK's GitHub release moves to its own job with contents: write.
…ction (#9792) * fix(oauth): confirm workspace connect links before starting the connection * fix(oauth): send an expired session back through sign-in from the connect page
…me budget passes (#9793) * fix(sandbox): drop in-flight fetches once the pool gives up or the time budget passes * fix(sandbox): use manual resolvers in the stalled-server e2e helper * fix(sandbox): drop in-flight fetches when the isolate reports a timeout * test(sandbox): pin that a fire-and-forget fetch survives a normal return
* improvement(search): shorter live document IDs Live search now mints live2: IDs: readable, ~-separated, percent-escaped provider fields with no reader or scope, about a quarter the length and tokens of the base64 JSON form. Reads derive the reader and scope from the request; account resolution and provider verification remain the authorization. Earlier live: IDs still read with their reader and scope checks. Document ID filters, Assistant scope intersection, and citation IDs compare by the decoded document identity, so both forms of one document match. * fix(search): refuse another reader's live ID as not found in this scope * fix(search): bind live IDs to their reader through the checksum, not a visible field
This branch was previously deployed
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.
Uh oh!
There was an error while loading. Please reload this page.