Comparing main...feat/credit-usage-log · simstudioai/sim · GitHub
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: feat/credit-usage-log
Choose a head ref
Checking mergeability… Don’t worry, you can still create the pull request.
  • 13 commits
  • 100 files changed
  • 3 contributors

Commits on Jul 3, 2026

  1. improvement(academy): set 2, pages for the new video wave (workflow e…

    …mbeds, 2K players, full sequencing) (#5382)
    
    * academy: Chat section (intro, building) + Agents tool-calling and skills pages, sequenced in meta.json — pages for the four approved videos, blob src pattern, chapters offset by each recorded intro
    
    * academy pages: Related documentation links point at real docs routes (mothership/agents/logs-debugging/deployment), not other academy videos
    
    * academy: Tables — Workflow Columns page (combined-cut chapters, receipts pedagogy), sequenced after tables/intro
    
    * academy set 2: five new pages (agents/block, agents/memory, knowledge-bases/connectors, tables/operations, files/object) + retimed chapters on the redone tables/files intros (recomposed/working-day cuts) + full meta.json sequencing — Chat · Agents(5) · Tables(3) · Files(2) · KB(2)
    
    * academy pages: every page shows the VIDEO's workflow (new academy-video-workflows.ts registry — invoice intake, Qualify, memory, table ops, tools/skills agents, support-desk, content-agent) + plain pedagogical headings throughout (no poetry: 'The warm and cold split' → 'The same agent, with and without memory', 'From one pass to a loop' → 'What tools change', etc.); files/intro's embed swapped to the video's machine
    
    * academy: all video players point at the 2K blob set (academy/<slug>.mp4) — 20 pages rewritten from academy-preview/*-light-with-intro, files/intro plays the new files-intro cut, workflows/logs gains its src (video now exists); use-case placeholders stay src-less (no videos yet)
    
    * biome: format academy-video-workflows.ts
    
    * fix (cursor/greptile): support-desk condition block uses branches + rows:[] (the renderer's real fields — conditions: was never read, so Urgent? rendered without if/else handles and branch edges dangled); bgColor aligned to the product condition example
    
    * biome: format meta.json (CI lint:check)
    
    * fix (cursor): Start exposes <start.input>, not <start.ticket>/<start.idea> — support-desk Triage and content-agent Writer message rows now match the product's Start output (same pattern as the file's other workflows)
    
    * academy lesson material (CTO ask): FAQ on every lesson page + the index (grounded in the audited codebase facts: memory modes, the ten table ops, coerce/refuse, deploy surfaces + draft-vs-deployed, file parser formats; the FAQ component emits FAQPage JSON-LD for SEO); em-dashes 202 → 0 with hand-fixed splices; added copy where sparse (agent block placement, when-to-use-memory); SEO phrasing sprinkled naturally into FAQ answers ('visual platform for building AI workflows and agents', 'no-code', model names), not over-indexed
    
    * fix: quote frontmatter descriptions that gained colons in the em-dash pass (unquoted YAML scalars with a second colon broke every page)
    ouiliame authored Jul 3, 2026
    Configuration menu
    Copy the full SHA
    3e71084 View commit details
    Browse the repository at this point in the history
  2. feat(comparison): add Sim vs Competitor comparison pages (#5383)

    * feat(comparison): add Sim vs Competitor comparison pages
    
    - New /comparison hub + /comparison/[provider] detail pages for Sim vs
      16 competitors (n8n, Zapier, Make, Gumloop, Workato, Retool,
      Pipedream, OpenAI AgentKit, Tines, StackAI, Power Automate, Vellum,
      Claude Cowork, Langflow, Flowise), each with ~60 sourced, dated facts
      across platform, AI capabilities, integrations, pricing, security,
      observability, and support
    - Data layer at lib/compare/data (types, per-competitor profiles) is
      UI-free and independently auditable
    - BreadcrumbList, ItemList, and FAQPage JSON-LD per page; sitemap picks
      up all pages automatically via ALL_COMPETITORS
    - Two new fact categories (parallel execution, Agent2Agent protocol)
      researched and sourced against every competitor's own docs
    
    * improvement(comparison): neutralize tone across competitor and Sim fact copy
    
    - Remove promotional/superlative adjectives applied to competitors
      (Zapier "one of the largest catalogs", Workato "notably wide",
      Retool "seamless"/"trusted solution", OpenAI "cutting-edge",
      Flowise "deep"/"mature"/"most widely adopted", Make "robust")
    - Reword the few places Sim's own accurate limitations read as
      unflattering rather than neutral fact (dynamic tool use, model
      fallback, durability, async execution, support channels, tracing)
      without changing the underlying facts
    - Restore the "Yes:"/"No:" value prefix on two Sim facts where it was
      accidentally dropped during rewording, since FactValue depends on
      that prefix to render the check/X status icon
    
    * fix(comparison): address review findings from Greptile and Cursor Bugbot
    
    - Fix parseFactValue regex to require a word boundary after Yes/No, so
      values like "Not documented"/"Not publicly documented" no longer get
      misread as a boolean "No" and render as neutral text again (Cursor)
    - Reword the self-hosting FAQ question to drop the false presupposition
      that the competitor doesn't self-host, which was wrong for n8n,
      Langflow, and Flowise (Greptile)
    - Rename isLastRow -> isNotLastRow in comparison-table.tsx to match
      what the variable actually computes (Greptile)
    - Move critters to devDependencies; it's a next build -time-only CSS
      inliner, not needed at runtime (Greptile)
    - Sitemap lastModified for comparison pages now matches the max(Sim,
      competitor) verified-date logic each page's own JSON-LD dateModified
      already uses, so the two never disagree (Cursor)
    
    * fix(comparison): fix doubled Yes prefix and missing period in hub FAQ
    
    - Two hub FAQ answers prepended "Yes." to fact values that already
      start with "Yes:", producing "Yes. Yes: ..." in visible copy and
      FAQPage JSON-LD. Export and reuse ensurePeriod instead of a hardcoded
      prefix.
    - The integrations-count FAQ answer ran two sentences together with no
      period before "Combined with...". Fixed with the same ensurePeriod
      helper.
    
    * improvement(comparison): remove redundant Key differences at a glance section
    
    The 5 facts it previewed (self-hosting, environment promotion,
    human-in-the-loop, pricing model, data residency) are the exact same
    rows shown again immediately below in the full comparison table, so
    the section read as pure repetition for a human scrolling past it.
    
    * fix(comparison): strip Yes/No prefix before lowercasing in summarizeFact
    
    summarizeFact fed the raw fact value through lowercaseFirst even when
    it started with "Yes: "/"No: ", producing broken mid-sentence FAQ text
    like "n8n: yes: many providers via dedicated Chat Model nodes." Strip
    the boolean prefix first, matching Greptile's suggested fix.
    waleedlatif1 authored Jul 3, 2026
    Configuration menu
    Copy the full SHA
    4086750 View commit details
    Browse the repository at this point in the history
  3. improvement(tables): harden pagination for short pages and surface na…

    …me-validation errors (#5351)
    
    * improvement(tables): harden pagination for short pages and surface name-validation errors
    
    * fix(tables): align getNextPageParam tests with count-based termination
    
    * improvement(tables): lift the 10K-char per-string-cell limit
    TheodoreSpeaks authored Jul 3, 2026
    Configuration menu
    Copy the full SHA
    de110e0 View commit details
    Browse the repository at this point in the history
  4. feat(comparison): add Microsoft Copilot Studio, OpenClaw, Dust, CrewA…

    …I, and LangChain (#5384)
    
    * feat(comparison): add Microsoft Copilot Studio, OpenClaw, Dust, CrewAI, and LangChain
    
    - 5 new "Sim vs Competitor" profiles (now 20 total), each with ~58
      independently sourced facts, standout features, and limitations,
      researched against each vendor's own docs/pricing/GitHub
    - New brand icons: MicrosoftCopilotIcon, OpenClawIcon, DustIcon,
      LangChainIcon, CrewAIIcon
    - isWorkflowBuilder: false for OpenClaw, CrewAI, and LangChain since
      they're a personal agent runtime and code-first frameworks rather
      than visual workflow builders, so their FAQ asks a
      category-clarifying question instead of a peer feature-gap one
    - Independent tone audit (no over-praising competitors, no unflattering
      Sim framing) and a fresh accuracy re-verification pass (50 highest-
      stakes facts across all 5 profiles, all confirmed against live
      sources) both came back clean
    
    * fix(comparison): fix two more FAQ text-mangling bugs found during final audit
    
    - lowercaseFirst only guarded against 2+ CONSECUTIVE leading capitals
      (acronyms like "AI"/"SSO"), so CamelCase brand names with a single
      leading capital (LangChain, OpenClaw, CrewAI) got their first letter
      wrongly lowercased ("langChain provides..."). Now checks for 2+
      uppercase letters anywhere in the leading word, which covers both
      acronyms and CamelCase brand names.
    - parseFactValue and summarizeFact's boolean-prefix stripping only
      recognized "Yes:"/"No:" (colon), but "Yes, ..."/"No, ..." (comma) is
      an equally common phrasing already used across ~15 existing facts
      (stackai, pipedream, workato, zapier, etc.), so those facts kept
      their leading comma when stitched into an FAQ answer (e.g. "StackAI:
      , broad support..."). Both now accept either separator.
    
    Found by systematically sweeping every "Sim vs X" FAQ answer across
    all 20 competitor pages for garbled/mis-cased text, not just the 5
    newly added ones.
    
    * feat(comparison): add sub-workflow composition and loop-block facts
    
    - Two new universal comparison facts across all 20 profiles:
      subWorkflows (calling a saved workflow as a reusable step inside
      another) and loopIteration (a dedicated sequential for-each/while
      loop container, distinct from concurrent Parallel execution)
    - Both are real Sim capabilities (Workflow block, Loop block) verified
      directly against the codebase and docs.sim.ai
    - Findings are genuinely mixed, not uniformly favorable: n8n, Zapier,
      Make, Workato, Retool, Power Automate, Gumloop, Vellum, Stack AI,
      Tines, Langflow, Flowise, Microsoft Copilot Studio, and LangChain all
      have some form of sub-workflow calling; Zapier and Gumloop's loop
      primitives run concurrently rather than sequentially (marked
      "Partial", not "No"); Pipedream, OpenAI AgentKit, Claude Cowork,
      CrewAI, Dust, and OpenClaw genuinely lack one or both
    
    * feat(comparison): add third-party integration vetting fact
    
    New universal comparison fact across all 20 profiles: thirdPartyVetting,
    whether a platform's integrations/tools/skills come from a vetted
    first-party catalog vs. an open marketplace where any third party can
    publish executable code with lighter or no vendor security review.
    
    Directly relevant given OpenClaw's ClawHub marketplace has documented
    incidents (283 skills, ~7.1% of the registry, found leaking credentials;
    24 accounts distributing 600+ malicious skills before scanning existed).
    
    Findings are honest and mixed, not uniformly favorable: Gumloop, Retool,
    and Tines are first-party-only like Sim (marked "Yes"); n8n, Zapier,
    Make, Workato, and OpenAI AgentKit have partial vetting on an open or
    semi-open ecosystem; Pipedream and OpenClaw are open marketplaces with
    documented security incidents.
    
    * fix(comparison): correct n8n supply-chain attack download count
    
    Independently re-verified the cited Hacker News article: the primary
    malicious package had 4,241 downloads listed (not "3,400 weekly" as
    previously written, a number not actually supported by the source).
    
    * fix(comparison): fix duplicated competitor name in first FAQ answer
    
    Every competitor's oneLiner is already a complete "{Name} is ..."
    sentence, so prepending "${name} is " before it was always redundant.
    Before this session's lowercaseFirst fix, the duplication rendered in
    mixed case ("Zapier is zapier is a cloud-based...") and was easy to
    miss; the CamelCase-name fix made it fully literal and obvious
    ("CrewAI is CrewAI is..."), which is what Cursor Bugbot caught.
    
    Fixed by using the oneLiner directly (via ensurePeriod) instead of
    re-prepending the name. Verified fixed across all 20 pages via live
    curl, not just the CrewAI case Cursor flagged.
    
    * improvement(comparison): cite Sim's own docs alongside code for 4 facts
    
    Added docs.sim.ai citations (Roles and Permissions, BYOK, Debugging
    retrieval, Function block) as primary sources for rbac, byok,
    kbChunkVisibility, and customCodeSteps, which previously cited only
    GitHub source code with no user-facing documentation reference.
    Verified all 4 doc URLs resolve (200).
    waleedlatif1 authored Jul 3, 2026
    Configuration menu
    Copy the full SHA
    0cc290e View commit details
    Browse the repository at this point in the history
  5. fix(billing): stop showing "View all" when there are no more invoices (

    …#5387)
    
    * fix(billing): stop showing "View all" when there are no more invoices
    
    Show fewer invoices (10) and derive hasMore from the finalized-invoice
    count instead of Stripe's raw has_more, which counted drafts we filter
    out client-side and could report more invoices than actually exist.
    
    * chore(billing): move invoice pagination explanation into TSDoc
    
    Extract collectFinalizedInvoices with a TSDoc comment explaining the
    Stripe has_more/draft-filtering rationale, instead of an inline
    comment block.
    
    * fix(billing): don't hide View all when the page-cap is hit inconclusively
    
    Greptile P1: if MAX_STRIPE_PAGES is exhausted while the finalized count
    sits exactly at MAX_INVOICES and Stripe still has_more, hasMore was
    silently returned as false. collectFinalizedInvoices now also returns
    whether Stripe's cursor was still open at exit, and the route ORs that
    into hasMore so the safety cap can never suppress "View all".
    
    Also asserts starting_after cursor propagation across pages and adds a
    test for the safety-cap-hit case.
    waleedlatif1 authored Jul 3, 2026
    Configuration menu
    Copy the full SHA
    331875b View commit details
    Browse the repository at this point in the history
  6. fix(sso): support skipping the OIDC UserInfo endpoint at registration (

    …#5386)
    
    * fix(sso): support skipping the OIDC UserInfo endpoint at registration
    
    * fix(sso): cap OIDC discovery fetch at 10s to avoid stalling registration
    
    * test(sso): default-mock discovery fetch so intent is explicit
    
    * fix(sso): prefer client_secret_post and surface discovery failure reasons
    
    * fix(sso): always resolve token auth method and skip SSRF-checking a discarded userInfoEndpoint
    waleedlatif1 authored Jul 3, 2026
    Configuration menu
    Copy the full SHA
    e1b8200 View commit details
    Browse the repository at this point in the history
  7. feat(billing): expose credit usage log in Billing settings

    Add a "Credit usage" section under Billing, below Invoices, showing a
    paginated, period-filterable list of individual credit-consuming
    events (model, tool, and fixed charges) for every plan except
    Enterprise. Wires the existing (previously unused) usage-logs backend
    to a proper contract, React Query hook, and emcn-styled UI:
    
    - getUsageLogsContract in contracts/user.ts, broadened the source enum
      to match the real usage_log schema
    - Rewrote the route to use parseRequest per the API boundary rules
    - useUsageLogs infinite-query hook, keyset-paginated
    - CreditUsageSection: period dropdown, total-credits summary, row
      list with source badges, "Load more"
    - Extracted formatCreditsLabel in conversion.ts as the shared
      formatter for already-converted integer credits
    waleedlatif1 committed Jul 3, 2026
    Configuration menu
    Copy the full SHA
    a9b649d View commit details
    Browse the repository at this point in the history
  8. fix(billing): move usage-log key factory out of the 'use client' boun…

    …dary
    
    Greptile P2: usageLogKeys lived in the 'use client' usage-logs.ts hook
    file — importing it from a server component (e.g. a future prefetch)
    would resolve to a client-reference stub and crash at build/SSR, the
    same class of bug that hit tables' key factory before. Extracted to
    hooks/queries/utils/usage-log-keys.ts, matching table-keys.ts and
    folder-keys.ts.
    
    Also renamed a shadowed `source` map param in the route to `sourceKey`
    for clarity.
    waleedlatif1 committed Jul 3, 2026
    Configuration menu
    Copy the full SHA
    89fe7e7 View commit details
    Browse the repository at this point in the history
  9. chore(billing): dedupe the usage-log period literal type

    The '1d' | '7d' | '30d' | 'all' union was hand-typed in three places
    across usage-logs.ts and credit-usage-section.tsx. Extracted
    usageLogPeriodSchema in the contract and derived UsageLogPeriod from
    it, so the hook, the component, and the key factory all share one
    definition instead of risking drift.
    waleedlatif1 committed Jul 3, 2026
    Configuration menu
    Copy the full SHA
    9d6dd83 View commit details
    Browse the repository at this point in the history
  10. improvement(billing): move credit usage period filter into the URL

    /cleanup pass (nuqs rule, react-query-best-practices, emcn review):
    - period was a plain useState, but it's exactly the kind of shareable
      list filter sim-url-state.md calls out for nuqs — migrated to
      billingParsers/useQueryStates so the selection deep-links, survives
      reload, and matches every sibling settings section (recently-deleted,
      inbox, teammates). Derives its literal values from
      usageLogPeriodSchema instead of a fourth copy of the same union.
    - Removed an unjustified showSelectedCheck={false} on the period
      ChipDropdown — the one other usage in the codebase is a one-shot
      action menu with no persistent selection; this is a real filter and
      should show the check like the default intends.
    - Added placeholderData: keepPreviousData to useUsageLogs — period is
      a variable query key, so without it switching periods flashed the
      loading empty-state instead of smoothly transitioning.
    
    Verified live: deep-link with ?period=7d pre-selects and loads
    correctly, switching periods updates the URL, and the selection
    survives a hard reload.
    waleedlatif1 committed Jul 3, 2026
    Configuration menu
    Copy the full SHA
    73679b1 View commit details
    Browse the repository at this point in the history
  11. fix(billing): apportion per-row credit costs so they sum to the page …

    …total
    
    Cursor Bugbot (medium): each row rounded its own dollar cost to
    credits independently while the header total rounded the summed
    dollars once — over enough rows those two roundings can visibly
    disagree, the exact "line items don't add up to the total" class of
    bug apportionCredits was already built to prevent (used by the trace
    view / cost breakdown). Route now apportions each page's row credits
    against that page's dollar sum instead of rounding rows independently.
    
    Added a test with three sub-cent rows that would each independently
    round to 0 credits (but sum to 1) to prove the reconciliation holds.
    waleedlatif1 committed Jul 3, 2026
    Configuration menu
    Copy the full SHA
    10648f1 View commit details
    Browse the repository at this point in the history
  12. fix(billing): dim stale credit usage rows while a new period loads

    Cursor Bugbot (medium): keepPreviousData kept the prior period's rows
    and total on screen while a newly selected period fetched, but the
    dropdown label updated immediately — so during the transition the
    displayed numbers were labeled under a period they didn't belong to.
    Now reads isPlaceholderData (the standard TanStack Query signal for
    "this data is a stale placeholder, not a fresh fetch for the current
    key") and dims the list while it's true, matching the same flag
    already used for this exact purpose in integration-skills-section.tsx.
    waleedlatif1 committed Jul 3, 2026
    Configuration menu
    Copy the full SHA
    a59fd7d View commit details
    Browse the repository at this point in the history
  13. fix(billing): show "<1 credit" for rows apportioned to 0

    Cursor Bugbot (low): with apportioned per-row credits, a row with a
    real but sub-credit dollarCost can legitimately apportion to 0 credits
    once a sibling row absorbs the shared rounding remainder — rendering a
    flat "0 credits" reads as if nothing was charged, inconsistent with
    formatCreditCost's "<1 credit" wording used elsewhere in billing.
    
    Added dollarCost to the wire response (needed to distinguish a
    genuinely free row from a rounded-to-zero one) and a small
    formatRowCredits helper that only changes the label, not the
    underlying creditCost number, so the page-total reconciliation from
    the prior fix is unaffected.
    waleedlatif1 committed Jul 3, 2026
    Configuration menu
    Copy the full SHA
    40a319d View commit details
    Browse the repository at this point in the history
Loading