Skip to content

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
waleedlatif1 merged 29 commits into
mainfrom
staging
Nov 8, 2026

Conversation

@waleedlatif1

@waleedlatif1 waleedlatif1 commented Nov 7, 2026 •

Copy link
Copy Markdown
Collaborator

waleedlatif1 and others added 17 commits November 7, 2026 11:24
…9767)

* feat(library): How to Connect an MCP Server to an AI Agent Workflow

* Pi Babysit: address PR #9767 feedback

---------

Co-authored-by: Sim Pi Agent <pi@sim.ai>
…on: Mixpanel, Segment, Amplitude, and PostHog (#9768)

* feat(library): Best AI Agent Platforms for Product Analytics Automation: Mixpanel, Segment, Amplitude, and PostHog

* Pi Babysit: address PR #9768 feedback

---------

Co-authored-by: Sim Pi Agent <pi@sim.ai>
…terprise Operations in 2026 (#9769)

* feat(library): 8 Best AI Business Process Automation Platforms for Enterprise Operations in 2026

* Pi Babysit: address PR #9769 feedback

---------

Co-authored-by: Sim Pi Agent <pi@sim.ai>
…latforms Compared (#9770)

* feat(library): How to Standardize MCP Servers Across an Enterprise: Platforms Compared

* Pi Babysit: address PR #9770 feedback

---------

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>
@vercel

vercel Bot commented Nov 7, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
docs Skipped Skipped Nov 8, 2026 2:32am UTC

Request Review

@greptile-apps

greptile-apps Bot commented Nov 7, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 2/5

[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.

Findings

  1. P1 Security Login bypasses the launch guard ▶
  2. P1 Selected video settings disappear ▶

Summary

Adds fal.ai start-frame support and updates security checks, desktop guidance, Search MCP results, and library content.

  • Supported fal.ai video models can start from an image.
  • Chat and file-share OTP checks reserve attempts before comparing codes.
  • Workspace OAuth launches reject cross-site requests before starting a connection.
  • Workflow runs choose the credential actor from the authenticated caller.
  • Sandbox tasks cap timers and dispose of isolates after host timeouts.
  • ZIP checks reject archives when JSZip reads a different region than the guard checks.
  • Search MCP results send each source fact once while keeping useful differences.
  • The desktop app explains when macOS blocks private-network connections.
  • The /security and /trust pages redirect visitors to the Trust Center.
  • Zoom guides explain which account to connect and how each connection is used.
  • The library adds four guides and expands two existing articles.

Diagram

sequenceDiagram
  participant U as User
  participant L as Login page
  participant A as OAuth authorize route
  participant C as Connection creation
  U->>L: Open attacker-supplied workspace callback
  U->>L: Sign in
  L->>A: Navigate to preserved callback
  Note over L,A: Request now comes from the app origin
  A->>A: Cross-site header check passes
  A->>C: Create draft using user's session
Loading

Reviews (1) · Last reviewed commit: "docs(library): update how-to-build-ai-sl..." · Reviewed by Greptile

…on-2026 (#9783)

* docs(library): update best-hubspot-alternatives-ai-marketing-automation-2026

* Pi Babysit: address PR #9783 feedback

---------

Co-authored-by: Sim Pi Agent <pi@sim.ai>

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed

Turn on auto-fix | Re-trigger cubic

Comment thread apps/sim/lib/execution/isolated-vm.ts Resolved
Comment thread apps/sim/lib/core/security/otp.ts Resolved
Comment thread apps/sim/lib/core/security/otp.ts Resolved
Comment thread apps/desktop/src/main/load-health.ts Resolved
…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
@waleedlatif1
waleedlatif1 merged commit 360c86a into main Nov 8, 2026
171 checks passed

This branch was previously deployed

1 inactive deployment
Preview — e6a9dbec Deployed Nov 8, 2026 by vercel[bot]
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.

2 participants