Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: simstudioai/sim
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: main
Choose a base ref
...
head repository: simstudioai/sim
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: staging
Choose a head ref
Checking mergeability… Don’t worry, you can still create the pull request.
  • 12 commits
  • 71 files changed
  • 7 contributors

Commits on May 4, 2026

  1. fix(table): return 400 instead of 500 for malformed sort/filter input (

    …#4425)
    
    * fix(table): return 400 instead of 500 for malformed sort/filter input
    
    * fix(table): revert default-case throw to plain Error and update JSDoc @throws tags
    waleedlatif1 authored May 4, 2026
    Configuration menu
    Copy the full SHA
    4c86122 View commit details
    Browse the repository at this point in the history
  2. Configuration menu
    Copy the full SHA
    af8dfbd View commit details
    Browse the repository at this point in the history
  3. fix(executor): strip childTraceSpans from block state before LLM tool…

    … calls (#4428)
    
    * fix(executor): strip childTraceSpans from block state before LLM tool calls
    
    * fix(executor): return stripped output so orchestrator setBlockOutput stays clean
    waleedlatif1 authored May 4, 2026
    Configuration menu
    Copy the full SHA
    5d53847 View commit details
    Browse the repository at this point in the history
  4. feat(knowledge): expose Cohere reranker controls (#4429)

    * feat(knowledge): expose Cohere reranker controls on knowledge block
    
    Add a self-hosted Cohere API key field (mirroring the agent block's hosted-key
    pattern), a configurable reranker input pool size (1-100), and surface
    meta.warnings from Cohere rerank responses via logger.warn. All new contract
    fields are optional and nullable for full backwards compatibility.
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
    
    * fix(knowledge): address PR feedback on Cohere reranker controls
    
    - Drop required:true on apiKey field — server has BYOK→env→rotation fallback
      chain, so self-hosted users with COHERE_API_KEY env should not be blocked
    - Drop .min(1) on rerankerApiKey contract field so empty strings coerce to
      undefined via the transform (matches the existing query field pattern)
    - Log a warning when rerankerInputCount is clamped up to topK so users notice
      their setting was overridden
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
    
    * feat(knowledge): mirror agent block API key visibility for Cohere reranker
    
    Restore required:true on the Cohere API Key field and hide it server-side via
    a new NEXT_PUBLIC_COHERE_CONFIGURED public env flag — same pattern the Agent
    block uses for Azure (NEXT_PUBLIC_AZURE_CONFIGURED). Self-hosters who set
    COHERE_API_KEY in their environment also set NEXT_PUBLIC_COHERE_CONFIGURED=true,
    which removes the field from the UI; everyone else sees a required field.
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
    
    * fix(knowledge): treat empty rerankerInputCount as unset
    
    An empty string from the Documents Sent to Reranker input passed the
    undefined/null guard, so Number('') = 0 → clamped to 1, sending only 1
    document to the reranker instead of falling back to the 4× topK auto
    default. Add the empty-string check to the guard.
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
    
    ---------
    
    Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
    waleedlatif1 and claude authored May 4, 2026
    Configuration menu
    Copy the full SHA
    57dc745 View commit details
    Browse the repository at this point in the history
  5. fix(mothership): catch draft restore errors instead of crashing /home (

    …#4433)
    
    * fix(mothership): catch draft restore errors instead of crashing /home
    
    Wrap the mount-time draft restore in try/catch with clearDraft on
    throw, and coerce text to a string in the useState initializer.
    A corrupt entry in mothership-drafts:v1 localStorage previously took
    down the entire workspace via the error boundary.
    
    * fix(mothership): defer state writes and log restore failures
    
    Build the restored state in locals first and only apply on success
    so a partial throw can't leave stale contexts in the UI with the
    draft already cleared. Switch the empty catch to logger.error so
    corrupt-draft incidents surface in production logs.
    waleedlatif1 authored May 4, 2026
    Configuration menu
    Copy the full SHA
    3af6c25 View commit details
    Browse the repository at this point in the history
  6. fix(mothership): stop persisting log resources from get_workflow_logs…

    … and self-heal stale log panel entries (#4424)
    
    * fix(mothership): stop persisting log resources from get_workflow_logs and self-heal stale log panel entries
    
    * fix(mothership): skip retries on 404 in useLogDetail for instant self-heal
    
    * fix(mothership): simplify onNotFoundRef sync to inline assignment
    waleedlatif1 authored May 4, 2026
    Configuration menu
    Copy the full SHA
    578fc50 View commit details
    Browse the repository at this point in the history
  7. feat(mothership): restore attachment previews on draft and add video …

    …support (#4435)
    
    * feat(mothership): restore attachment previews on draft and add video support
    
    * fix(mothership): icon fallback behind video preview
    waleedlatif1 authored May 4, 2026
    Configuration menu
    Copy the full SHA
    2f90e41 View commit details
    Browse the repository at this point in the history
  8. fix(copilot): redact sim_key API keys from persisted Mothership chat …

    …messages (#4434)
    
    * fix(copilot): redact sim_key API keys from persisted Mothership chat messages
    
    * improvement(emcn): promote ApiKeyReveal to SecretReveal in emcn
    
    * fix(copilot): thread cursor across content blocks when restoring sim_key tags
    TheodoreSpeaks authored May 4, 2026
    Configuration menu
    Copy the full SHA
    ae20d1c View commit details
    Browse the repository at this point in the history
  9. feat(image-generator): add gpt-image-2 model support (#4437)

    * feat(image-generator): add gpt-image-2 model support
    
    * docs
    waleedlatif1 authored May 4, 2026
    Configuration menu
    Copy the full SHA
    6d044a9 View commit details
    Browse the repository at this point in the history
  10. fix(logs): split summary/detail contracts to make trace tab gate type…

    …-safe (#4431)
    
    * fix(logs): split summary/detail contracts to make trace tab gate type-safe
    
    The Trace tab was silently missing from the Log Details sidepanel because
    list and detail rows shared one WorkflowLog type with executionData:
    z.unknown(). The UI couldn't distinguish a summary row (no spans) from a
    detail row (with spans), so the tab gate read undefined and hid itself.
    
    Splits into WorkflowLogSummary (list) and WorkflowLogDetail (typed
    executionData with optional traceSpans). Detail and by-execution routes
    both write through to the same logKeys.detail(id) cache, eliminating the
    two-key fragmentation that caused the merge memo workaround. List route
    moves to cursor pagination on (sortValue, id) with proper NULLS LAST
    handling and SQL-side sort across workflow + job execution tables.
    Detail route now requires and asserts workspaceId. Deep-link path uses
    useLogByExecutionId instead of auto-paginating the entire workspace.
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
    
    * fix(logs): audit follow-ups — render side-effect, stats invalidation, enhanced spread order
    
    - Move onActiveTabChange call from render into useEffect to avoid
      side-effects during render (StrictMode safety).
    - Re-add logKeys.stats() invalidation to cancel/retry mutations so
      the dashboard reflects status flips immediately.
    - Reorder enhanced: true after ...execData spread in detail and
      by-execution routes so the literal discriminator is never
      overwritten by stale execData.
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
    
    * fix(logs): mirror SQL NULLS LAST in JS merge for cursor consistency
    
    The in-memory merge of workflow + job pages negated the comparator
    for DESC, which placed null sort values at the start. SQL orders
    both ASC and DESC with NULLS LAST, so DESC pages emitted a cursor
    {v: <last non-null>, id: ...} while null rows still satisfied the
    cursor predicate (OR sort_expr IS NULL) on the next page —
    producing duplicate null rows across pages on cost/duration sorts.
    
    Handle nulls explicitly in the JS comparator so they always sort
    last regardless of direction, matching the SQL ordering.
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
    
    * fix(logs): final-audit follow-ups — stable tab callback, byExecution invalidation, optimistic detail patch, trace loading state
    
    - Wrap LogDetails -> LogDetailsContent onActiveTabChange in useCallback
      so the child useEffect doesn't refire on every parent render.
    - Add logKeys.byExecutionAll() to cancel + retry invalidation so the
      table-embedded sidebar picks up status changes immediately.
    - Optimistic write-through to logKeys.detail in useCancelExecution so
      the open sidebar reflects 'cancelling' instantly; rolls back on error.
    - Distinguish trace loading from trace-empty: when log.executionData is
      not yet fetched, render "Loading trace…" instead of the empty state.
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
    
    * refactor(logs): migrate stores/components to contract types
    
    Replace the legacy `WorkflowLog` / `LogsResponse` / `WorkflowData` /
    `CostMetadata` / `ToolCallMetadata` shapes in
    `stores/logs/filters/types.ts` with direct use of the contract types
    `WorkflowLogSummary`, `WorkflowLogDetail`, and a new `WorkflowLogRow`
    alias for surfaces that render either form. Removes the
    `summaryToWorkflowLog` / `detailToWorkflowLog` bridge in the React
    Query layer along with their double-cast annotations.
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
    
    * refactor(logs): address PR review feedback
    
    - Whitelist sort columns against logSortBy enum to prevent client crash
      when non-sortable headers (workflow, trigger) reach the contract parser.
    - Extract fetchLogDetail helper shared by /api/logs/[id] and
      /api/logs/by-execution/[executionId] — collapses ~360 duplicated lines
      to a single source of truth keyed on lookup column.
    
    * fix(logs): exclude job logs when level filter is workflow-only
    
    When level=running or level=pending (workflow-only states involving
    endedAt/pausedExecutions semantics), jobLevelConditions stayed empty
    so no level constraint reached jobConditions — every job log in the
    workspace leaked into the result. Skip the job side entirely when the
    level filter has no job-applicable values (error/info).
    
    * chore(logs): drop dead utils — mapToExecutionLog and friends
    
    Remove ExecutionLog/RawLogResponse/ExecutionCost/LogWithExecutionData/
    TraceSpan/BlockExecution interfaces and the mapToExecutionLog,
    mapToExecutionLogAlt, extractOutput functions — all unreferenced after
    the contract split. -212 lines.
    
    * chore(logs): drop unused LOG_COLUMN_ORDER and LogColumnKey
    
    * fix(logs): hydrate filters from URL synchronously on mount
    
    The previous useEffect-based initializeFromURL caused useLogsList and
    useDashboardStats to fire once with default store filters, then refetch
    after the effect updated filters from the URL. Move the initial hydrate
    into a useState lazy initializer so the first render already reads
    URL-derived filters; the popstate handler keeps the existing effect for
    back/forward navigation.
    
    * chore(logs): trim verbose comments added during PR
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
    
    * fix(logs): guard navigation arrows when selected log is off-page
    
    Deep-linked logs resolved via useLogByExecutionId may not be in the
    current page list, leaving selectedLogIndex at -1. The hasNext prop
    was evaluating -1 < logs.length - 1 (true for any non-empty list),
    which enabled the next arrow and jumped to the first item on click.
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
    
    * fix(logs): sync active-tab callback before paint to keep keyboard guards aligned
    
    Run the resolvedTab → onActiveTabChange propagation in useLayoutEffect
    so the parent's activeTabRef updates synchronously before the next
    paint. This closes the brief window where window keydown handlers
    in the logs page would still see activeTabRef.current === 'trace'
    and short-circuit arrow-key navigation immediately after switching
    to a log without a Trace tab.
    
    Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
    
    ---------
    
    Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
    waleedlatif1 and claude authored May 4, 2026
    Configuration menu
    Copy the full SHA
    029ac9f View commit details
    Browse the repository at this point in the history
  11. fix: double wrap reponse of guest session handler (#4438)

    * v0.6.29: login improvements, posthog telemetry (#4026)
    
    * feat(posthog): Add tracking on mothership abort (#4023)
    
    Co-authored-by: Theodore Li <theo@sim.ai>
    
    * fix(login): fix captcha headers for manual login  (#4025)
    
    * fix(signup): fix turnstile key loading
    
    * fix(login): fix captcha header passing
    
    * Catch user already exists, remove login form captcha
    
    * fix double wrap reponse of guest session handler
    
    * remove dead code, and fix test
    
    ---------
    
    Co-authored-by: Waleed <walif6@gmail.com>
    Co-authored-by: Theodore Li <theodoreqili@gmail.com>
    Co-authored-by: Siddharth Ganesan <33737564+Sg312@users.noreply.github.com>
    Co-authored-by: Vikhyath Mondreti <vikhyathvikku@gmail.com>
    Co-authored-by: Theodore Li <theo@sim.ai>
    6 people authored May 4, 2026
    Configuration menu
    Copy the full SHA
    1dc6f7d View commit details
    Browse the repository at this point in the history
  12. improvement(mothership): streaming state transitions (#4439)

    * improvement(mothership): improve streaming state transitions
    
    * address comments
    icecrasher321 authored May 4, 2026
    Configuration menu
    Copy the full SHA
    9eeb1b2 View commit details
    Browse the repository at this point in the history
Loading